git.iko.soy/purestack-dev/purescript-plum
on master help sign in
10 files changed+361−4536
since splitsnapshots
unifiedsplit
.gitignore+1 plum/index.js−3476 plum/spago.dhall+5 plum/src/Main.purs+42−11 plum/src/Maquette.js−953 plum/src/Maquette.purs−33 plum/src/Plum.purs+58−29 plum/src/Plum/View.purs+209−34 plum/src/Snabbdom.js+1 plum/src/Snabbdom.purs+45
.gitignore+1
@@ -8,3 +8,4 @@
88/.purs*
99/.psa*
1010/.spago
11+plum/index.js
plum/index.jsdeleted−3476
@@ -1,3476 +0,0 @@
1−(() => {
2− // output/Control.Semigroupoid/index.js
3− var semigroupoidFn = {
4− compose: function(f) {
5− return function(g) {
6− return function(x) {
7− return f(g(x));
8− };
9− };
10− }
11− };
12−
13− // output/Control.Category/index.js
14− var identity = function(dict) {
15− return dict.identity;
16− };
17− var categoryFn = {
18− identity: function(x) {
19− return x;
20− },
21− Semigroupoid0: function() {
22− return semigroupoidFn;
23− }
24− };
25−
26− // output/Data.Boolean/index.js
27− var otherwise = true;
28−
29− // output/Data.Function/index.js
30− var flip = function(f) {
31− return function(b) {
32− return function(a) {
33− return f(a)(b);
34− };
35− };
36− };
37− var $$const = function(a) {
38− return function(v) {
39− return a;
40− };
41− };
42− var applyFlipped = function(x) {
43− return function(f) {
44− return f(x);
45− };
46− };
47−
48− // output/Data.Functor/foreign.js
49− var arrayMap = function(f) {
50− return function(arr) {
51− var l = arr.length;
52− var result = new Array(l);
53− for (var i = 0; i < l; i++) {
54− result[i] = f(arr[i]);
55− }
56− return result;
57− };
58− };
59−
60− // output/Data.Unit/foreign.js
61− var unit = void 0;
62−
63− // output/Type.Proxy/index.js
64− var $$Proxy = /* @__PURE__ */ function() {
65− function $$Proxy2() {
66− }
67− ;
68− $$Proxy2.value = new $$Proxy2();
69− return $$Proxy2;
70− }();
71−
72− // output/Data.Functor/index.js
73− var map = function(dict) {
74− return dict.map;
75− };
76− var functorArray = {
77− map: arrayMap
78− };
79−
80− // output/Control.Apply/index.js
81− var apply = function(dict) {
82− return dict.apply;
83− };
84− var lift2 = function(dictApply) {
85− var apply1 = apply(dictApply);
86− var map4 = map(dictApply.Functor0());
87− return function(f) {
88− return function(a) {
89− return function(b) {
90− return apply1(map4(f)(a))(b);
91− };
92− };
93− };
94− };
95−
96− // output/Control.Applicative/index.js
97− var pure = function(dict) {
98− return dict.pure;
99− };
100− var liftA1 = function(dictApplicative) {
101− var apply2 = apply(dictApplicative.Apply0());
102− var pure1 = pure(dictApplicative);
103− return function(f) {
104− return function(a) {
105− return apply2(pure1(f))(a);
106− };
107− };
108− };
109−
110− // output/Control.Bind/foreign.js
111− var arrayBind = typeof Array.prototype.flatMap === "function" ? function(arr) {
112− return function(f) {
113− return arr.flatMap(f);
114− };
115− } : function(arr) {
116− return function(f) {
117− var result = [];
118− var l = arr.length;
119− for (var i = 0; i < l; i++) {
120− var xs = f(arr[i]);
121− var k = xs.length;
122− for (var j = 0; j < k; j++) {
123− result.push(xs[j]);
124− }
125− }
126− return result;
127− };
128− };
129−
130− // output/Control.Bind/index.js
131− var discard = function(dict) {
132− return dict.discard;
133− };
134− var bind = function(dict) {
135− return dict.bind;
136− };
137− var bindFlipped = function(dictBind) {
138− return flip(bind(dictBind));
139− };
140− var discardUnit = {
141− discard: function(dictBind) {
142− return bind(dictBind);
143− }
144− };
145−
146− // output/Data.Symbol/index.js
147− var reflectSymbol = function(dict) {
148− return dict.reflectSymbol;
149− };
150−
151− // output/Record.Unsafe/foreign.js
152− var unsafeGet = function(label4) {
153− return function(rec) {
154− return rec[label4];
155− };
156− };
157− var unsafeSet = function(label4) {
158− return function(value12) {
159− return function(rec) {
160− var copy = {};
161− for (var key in rec) {
162− if ({}.hasOwnProperty.call(rec, key)) {
163− copy[key] = rec[key];
164− }
165− }
166− copy[label4] = value12;
167− return copy;
168− };
169− };
170− };
171−
172− // output/Data.Eq/foreign.js
173− var refEq = function(r1) {
174− return function(r2) {
175− return r1 === r2;
176− };
177− };
178− var eqIntImpl = refEq;
179−
180− // output/Data.Eq/index.js
181− var eqInt = {
182− eq: eqIntImpl
183− };
184−
185− // output/Data.Ordering/index.js
186− var LT = /* @__PURE__ */ function() {
187− function LT2() {
188− }
189− ;
190− LT2.value = new LT2();
191− return LT2;
192− }();
193− var GT = /* @__PURE__ */ function() {
194− function GT2() {
195− }
196− ;
197− GT2.value = new GT2();
198− return GT2;
199− }();
200− var EQ = /* @__PURE__ */ function() {
201− function EQ2() {
202− }
203− ;
204− EQ2.value = new EQ2();
205− return EQ2;
206− }();
207−
208− // output/Data.Semigroup/foreign.js
209− var concatString = function(s1) {
210− return function(s2) {
211− return s1 + s2;
212− };
213− };
214− var concatArray = function(xs) {
215− return function(ys) {
216− if (xs.length === 0) return ys;
217− if (ys.length === 0) return xs;
218− return xs.concat(ys);
219− };
220− };
221−
222− // output/Data.Semigroup/index.js
223− var semigroupUnit = {
224− append: function(v) {
225− return function(v1) {
226− return unit;
227− };
228− }
229− };
230− var semigroupString = {
231− append: concatString
232− };
233− var semigroupRecordNil = {
234− appendRecord: function(v) {
235− return function(v1) {
236− return function(v2) {
237− return {};
238− };
239− };
240− }
241− };
242− var semigroupArray = {
243− append: concatArray
244− };
245− var appendRecord = function(dict) {
246− return dict.appendRecord;
247− };
248− var semigroupRecord = function() {
249− return function(dictSemigroupRecord) {
250− return {
251− append: appendRecord(dictSemigroupRecord)($$Proxy.value)
252− };
253− };
254− };
255− var append = function(dict) {
256− return dict.append;
257− };
258− var semigroupRecordCons = function(dictIsSymbol) {
259− var reflectSymbol2 = reflectSymbol(dictIsSymbol);
260− return function() {
261− return function(dictSemigroupRecord) {
262− var appendRecord1 = appendRecord(dictSemigroupRecord);
263− return function(dictSemigroup) {
264− var append1 = append(dictSemigroup);
265− return {
266− appendRecord: function(v) {
267− return function(ra) {
268− return function(rb) {
269− var tail = appendRecord1($$Proxy.value)(ra)(rb);
270− var key = reflectSymbol2($$Proxy.value);
271− var insert2 = unsafeSet(key);
272− var get = unsafeGet(key);
273− return insert2(append1(get(ra))(get(rb)))(tail);
274− };
275− };
276− }
277− };
278− };
279− };
280− };
281− };
282−
283− // output/Data.Monoid/index.js
284− var semigroupRecord2 = /* @__PURE__ */ semigroupRecord();
285− var monoidUnit = {
286− mempty: unit,
287− Semigroup0: function() {
288− return semigroupUnit;
289− }
290− };
291− var monoidString = {
292− mempty: "",
293− Semigroup0: function() {
294− return semigroupString;
295− }
296− };
297− var monoidRecordNil = {
298− memptyRecord: function(v) {
299− return {};
300− },
301− SemigroupRecord0: function() {
302− return semigroupRecordNil;
303− }
304− };
305− var monoidArray = {
306− mempty: [],
307− Semigroup0: function() {
308− return semigroupArray;
309− }
310− };
311− var memptyRecord = function(dict) {
312− return dict.memptyRecord;
313− };
314− var monoidRecord = function() {
315− return function(dictMonoidRecord) {
316− var semigroupRecord1 = semigroupRecord2(dictMonoidRecord.SemigroupRecord0());
317− return {
318− mempty: memptyRecord(dictMonoidRecord)($$Proxy.value),
319− Semigroup0: function() {
320− return semigroupRecord1;
321− }
322− };
323− };
324− };
325− var mempty = function(dict) {
326− return dict.mempty;
327− };
328− var monoidRecordCons = function(dictIsSymbol) {
329− var reflectSymbol2 = reflectSymbol(dictIsSymbol);
330− var semigroupRecordCons3 = semigroupRecordCons(dictIsSymbol)();
331− return function(dictMonoid) {
332− var mempty12 = mempty(dictMonoid);
333− var Semigroup0 = dictMonoid.Semigroup0();
334− return function() {
335− return function(dictMonoidRecord) {
336− var memptyRecord1 = memptyRecord(dictMonoidRecord);
337− var semigroupRecordCons1 = semigroupRecordCons3(dictMonoidRecord.SemigroupRecord0())(Semigroup0);
338− return {
339− memptyRecord: function(v) {
340− var tail = memptyRecord1($$Proxy.value);
341− var key = reflectSymbol2($$Proxy.value);
342− var insert2 = unsafeSet(key);
343− return insert2(mempty12)(tail);
344− },
345− SemigroupRecord0: function() {
346− return semigroupRecordCons1;
347− }
348− };
349− };
350− };
351− };
352− };
353−
354− // output/Effect/foreign.js
355− var pureE = function(a) {
356− return function() {
357− return a;
358− };
359− };
360− var bindE = function(a) {
361− return function(f) {
362− return function() {
363− return f(a())();
364− };
365− };
366− };
367−
368− // output/Control.Monad/index.js
369− var ap = function(dictMonad) {
370− var bind4 = bind(dictMonad.Bind1());
371− var pure4 = pure(dictMonad.Applicative0());
372− return function(f) {
373− return function(a) {
374− return bind4(f)(function(f$prime) {
375− return bind4(a)(function(a$prime) {
376− return pure4(f$prime(a$prime));
377− });
378− });
379− };
380− };
381− };
382−
383− // output/Effect/index.js
384− var $runtime_lazy = function(name15, moduleName, init) {
385− var state3 = 0;
386− var val;
387− return function(lineNumber) {
388− if (state3 === 2) return val;
389− if (state3 === 1) throw new ReferenceError(name15 + " was needed before it finished initializing (module " + moduleName + ", line " + lineNumber + ")", moduleName, lineNumber);
390− state3 = 1;
391− val = init();
392− state3 = 2;
393− return val;
394− };
395− };
396− var monadEffect = {
397− Applicative0: function() {
398− return applicativeEffect;
399− },
400− Bind1: function() {
401− return bindEffect;
402− }
403− };
404− var bindEffect = {
405− bind: bindE,
406− Apply0: function() {
407− return $lazy_applyEffect(0);
408− }
409− };
410− var applicativeEffect = {
411− pure: pureE,
412− Apply0: function() {
413− return $lazy_applyEffect(0);
414− }
415− };
416− var $lazy_functorEffect = /* @__PURE__ */ $runtime_lazy("functorEffect", "Effect", function() {
417− return {
418− map: liftA1(applicativeEffect)
419− };
420− });
421− var $lazy_applyEffect = /* @__PURE__ */ $runtime_lazy("applyEffect", "Effect", function() {
422− return {
423− apply: ap(monadEffect),
424− Functor0: function() {
425− return $lazy_functorEffect(0);
426− }
427− };
428− });
429− var functorEffect = /* @__PURE__ */ $lazy_functorEffect(20);
430−
431− // output/Data.Array/foreign.js
432− var replicateFill = function(count, value12) {
433− if (count < 1) {
434− return [];
435− }
436− var result = new Array(count);
437− return result.fill(value12);
438− };
439− var replicatePolyfill = function(count, value12) {
440− var result = [];
441− var n = 0;
442− for (var i = 0; i < count; i++) {
443− result[n++] = value12;
444− }
445− return result;
446− };
447− var replicateImpl = typeof Array.prototype.fill === "function" ? replicateFill : replicatePolyfill;
448− var indexImpl = function(just, nothing, xs, i) {
449− return i < 0 || i >= xs.length ? nothing : just(xs[i]);
450− };
451− var concat = function(xss) {
452− if (xss.length <= 1e4) {
453− return Array.prototype.concat.apply([], xss);
454− }
455− var result = [];
456− for (var i = 0, l = xss.length; i < l; i++) {
457− var xs = xss[i];
458− for (var j = 0, m2 = xs.length; j < m2; j++) {
459− result.push(xs[j]);
460− }
461− }
462− return result;
463− };
464−
465− // output/Data.Bounded/foreign.js
466− var topInt = 2147483647;
467− var bottomInt = -2147483648;
468− var topChar = String.fromCharCode(65535);
469− var bottomChar = String.fromCharCode(0);
470− var topNumber = Number.POSITIVE_INFINITY;
471− var bottomNumber = Number.NEGATIVE_INFINITY;
472−
473− // output/Data.Ord/foreign.js
474− var unsafeCompareImpl = function(lt) {
475− return function(eq2) {
476− return function(gt) {
477− return function(x) {
478− return function(y) {
479− return x < y ? lt : x === y ? eq2 : gt;
480− };
481− };
482− };
483− };
484− };
485− var ordIntImpl = unsafeCompareImpl;
486−
487− // output/Data.Ord/index.js
488− var ordInt = /* @__PURE__ */ function() {
489− return {
490− compare: ordIntImpl(LT.value)(EQ.value)(GT.value),
491− Eq0: function() {
492− return eqInt;
493− }
494− };
495− }();
496−
497− // output/Data.Bounded/index.js
498− var top = function(dict) {
499− return dict.top;
500− };
501− var boundedInt = {
502− top: topInt,
503− bottom: bottomInt,
504− Ord0: function() {
505− return ordInt;
506− }
507− };
508− var bottom = function(dict) {
509− return dict.bottom;
510− };
511−
512− // output/Data.Show/foreign.js
513− var showIntImpl = function(n) {
514− return n.toString();
515− };
516− var showNumberImpl = function(n) {
517− var str = n.toString();
518− return isNaN(str + ".0") ? str : str + ".0";
519− };
520−
521− // output/Data.Show/index.js
522− var showNumber = {
523− show: showNumberImpl
524− };
525− var showInt = {
526− show: showIntImpl
527− };
528− var show = function(dict) {
529− return dict.show;
530− };
531−
532− // output/Data.Maybe/index.js
533− var identity2 = /* @__PURE__ */ identity(categoryFn);
534− var Nothing = /* @__PURE__ */ function() {
535− function Nothing2() {
536− }
537− ;
538− Nothing2.value = new Nothing2();
539− return Nothing2;
540− }();
541− var Just = /* @__PURE__ */ function() {
542− function Just2(value0) {
543− this.value0 = value0;
544− }
545− ;
546− Just2.create = function(value0) {
547− return new Just2(value0);
548− };
549− return Just2;
550− }();
551− var maybe = function(v) {
552− return function(v1) {
553− return function(v2) {
554− if (v2 instanceof Nothing) {
555− return v;
556− }
557− ;
558− if (v2 instanceof Just) {
559− return v1(v2.value0);
560− }
561− ;
562− throw new Error("Failed pattern match at Data.Maybe (line 237, column 1 - line 237, column 51): " + [v.constructor.name, v1.constructor.name, v2.constructor.name]);
563− };
564− };
565− };
566− var fromMaybe = function(a) {
567− return maybe(a)(identity2);
568− };
569−
570− // output/Data.Identity/index.js
571− var Identity = function(x) {
572− return x;
573− };
574− var functorIdentity = {
575− map: function(f) {
576− return function(m2) {
577− return f(m2);
578− };
579− }
580− };
581− var applyIdentity = {
582− apply: function(v) {
583− return function(v1) {
584− return v(v1);
585− };
586− },
587− Functor0: function() {
588− return functorIdentity;
589− }
590− };
591− var bindIdentity = {
592− bind: function(v) {
593− return function(f) {
594− return f(v);
595− };
596− },
597− Apply0: function() {
598− return applyIdentity;
599− }
600− };
601− var applicativeIdentity = {
602− pure: Identity,
603− Apply0: function() {
604− return applyIdentity;
605− }
606− };
607− var monadIdentity = {
608− Applicative0: function() {
609− return applicativeIdentity;
610− },
611− Bind1: function() {
612− return bindIdentity;
613− }
614− };
615−
616− // output/Effect.Ref/foreign.js
617− var _new = function(val) {
618− return function() {
619− return { value: val };
620− };
621− };
622− var read = function(ref) {
623− return function() {
624− return ref.value;
625− };
626− };
627− var write = function(val) {
628− return function(ref) {
629− return function() {
630− ref.value = val;
631− };
632− };
633− };
634−
635− // output/Effect.Ref/index.js
636− var $$new = _new;
637−
638− // output/Control.Monad.ST.Internal/foreign.js
639− var map_ = function(f) {
640− return function(a) {
641− return function() {
642− return f(a());
643− };
644− };
645− };
646− var pure_ = function(a) {
647− return function() {
648− return a;
649− };
650− };
651− var bind_ = function(a) {
652− return function(f) {
653− return function() {
654− return f(a())();
655− };
656− };
657− };
658−
659− // output/Control.Monad.ST.Internal/index.js
660− var $runtime_lazy2 = function(name15, moduleName, init) {
661− var state3 = 0;
662− var val;
663− return function(lineNumber) {
664− if (state3 === 2) return val;
665− if (state3 === 1) throw new ReferenceError(name15 + " was needed before it finished initializing (module " + moduleName + ", line " + lineNumber + ")", moduleName, lineNumber);
666− state3 = 1;
667− val = init();
668− state3 = 2;
669− return val;
670− };
671− };
672− var functorST = {
673− map: map_
674− };
675− var monadST = {
676− Applicative0: function() {
677− return applicativeST;
678− },
679− Bind1: function() {
680− return bindST;
681− }
682− };
683− var bindST = {
684− bind: bind_,
685− Apply0: function() {
686− return $lazy_applyST(0);
687− }
688− };
689− var applicativeST = {
690− pure: pure_,
691− Apply0: function() {
692− return $lazy_applyST(0);
693− }
694− };
695− var $lazy_applyST = /* @__PURE__ */ $runtime_lazy2("applyST", "Control.Monad.ST.Internal", function() {
696− return {
697− apply: ap(monadST),
698− Functor0: function() {
699− return functorST;
700− }
701− };
702− });
703−
704− // output/Data.Foldable/foreign.js
705− var foldrArray = function(f) {
706− return function(init) {
707− return function(xs) {
708− var acc = init;
709− var len = xs.length;
710− for (var i = len - 1; i >= 0; i--) {
711− acc = f(xs[i])(acc);
712− }
713− return acc;
714− };
715− };
716− };
717− var foldlArray = function(f) {
718− return function(init) {
719− return function(xs) {
720− var acc = init;
721− var len = xs.length;
722− for (var i = 0; i < len; i++) {
723− acc = f(acc)(xs[i]);
724− }
725− return acc;
726− };
727− };
728− };
729−
730− // output/Data.Tuple/index.js
731− var Tuple = /* @__PURE__ */ function() {
732− function Tuple2(value0, value1) {
733− this.value0 = value0;
734− this.value1 = value1;
735− }
736− ;
737− Tuple2.create = function(value0) {
738− return function(value1) {
739− return new Tuple2(value0, value1);
740− };
741− };
742− return Tuple2;
743− }();
744− var uncurry = function(f) {
745− return function(v) {
746− return f(v.value0)(v.value1);
747− };
748− };
749−
750− // output/Unsafe.Coerce/foreign.js
751− var unsafeCoerce2 = function(x) {
752− return x;
753− };
754−
755− // output/Safe.Coerce/index.js
756− var coerce = function() {
757− return unsafeCoerce2;
758− };
759−
760− // output/Data.Newtype/index.js
761− var coerce2 = /* @__PURE__ */ coerce();
762− var unwrap = function() {
763− return coerce2;
764− };
765−
766− // output/Data.Foldable/index.js
767− var foldr = function(dict) {
768− return dict.foldr;
769− };
770− var foldl = function(dict) {
771− return dict.foldl;
772− };
773− var intercalate = function(dictFoldable) {
774− var foldl2 = foldl(dictFoldable);
775− return function(dictMonoid) {
776− var append3 = append(dictMonoid.Semigroup0());
777− var mempty6 = mempty(dictMonoid);
778− return function(sep) {
779− return function(xs) {
780− var go2 = function(v) {
781− return function(v1) {
782− if (v.init) {
783− return {
784− init: false,
785− acc: v1
786− };
787− }
788− ;
789− return {
790− init: false,
791− acc: append3(v.acc)(append3(sep)(v1))
792− };
793− };
794− };
795− return foldl2(go2)({
796− init: true,
797− acc: mempty6
798− })(xs).acc;
799− };
800− };
801− };
802− };
803− var foldMapDefaultR = function(dictFoldable) {
804− var foldr22 = foldr(dictFoldable);
805− return function(dictMonoid) {
806− var append3 = append(dictMonoid.Semigroup0());
807− var mempty6 = mempty(dictMonoid);
808− return function(f) {
809− return foldr22(function(x) {
810− return function(acc) {
811− return append3(f(x))(acc);
812− };
813− })(mempty6);
814− };
815− };
816− };
817− var foldableArray = {
818− foldr: foldrArray,
819− foldl: foldlArray,
820− foldMap: function(dictMonoid) {
821− return foldMapDefaultR(foldableArray)(dictMonoid);
822− }
823− };
824−
825− // output/Data.Function.Uncurried/foreign.js
826− var runFn2 = function(fn) {
827− return function(a) {
828− return function(b) {
829− return fn(a, b);
830− };
831− };
832− };
833− var runFn4 = function(fn) {
834− return function(a) {
835− return function(b) {
836− return function(c) {
837− return function(d) {
838− return fn(a, b, c, d);
839− };
840− };
841− };
842− };
843− };
844−
845− // output/Data.Traversable/foreign.js
846− var traverseArrayImpl = /* @__PURE__ */ function() {
847− function array1(a) {
848− return [a];
849− }
850− function array2(a) {
851− return function(b) {
852− return [a, b];
853− };
854− }
855− function array3(a) {
856− return function(b) {
857− return function(c) {
858− return [a, b, c];
859− };
860− };
861− }
862− function concat2(xs) {
863− return function(ys) {
864− return xs.concat(ys);
865− };
866− }
867− return function(apply2) {
868− return function(map4) {
869− return function(pure4) {
870− return function(f) {
871− return function(array) {
872− function go2(bot, top3) {
873− switch (top3 - bot) {
874− case 0:
875− return pure4([]);
876− case 1:
877− return map4(array1)(f(array[bot]));
878− case 2:
879− return apply2(map4(array2)(f(array[bot])))(f(array[bot + 1]));
880− case 3:
881− return apply2(apply2(map4(array3)(f(array[bot])))(f(array[bot + 1])))(f(array[bot + 2]));
882− default:
883− var pivot = bot + Math.floor((top3 - bot) / 4) * 2;
884− return apply2(map4(concat2)(go2(bot, pivot)))(go2(pivot, top3));
885− }
886− }
887− return go2(0, array.length);
888− };
889− };
890− };
891− };
892− };
893− }();
894−
895− // output/Data.Traversable/index.js
896− var identity3 = /* @__PURE__ */ identity(categoryFn);
897− var traverse = function(dict) {
898− return dict.traverse;
899− };
900− var sequenceDefault = function(dictTraversable) {
901− var traverse22 = traverse(dictTraversable);
902− return function(dictApplicative) {
903− return traverse22(dictApplicative)(identity3);
904− };
905− };
906− var traversableArray = {
907− traverse: function(dictApplicative) {
908− var Apply0 = dictApplicative.Apply0();
909− return traverseArrayImpl(apply(Apply0))(map(Apply0.Functor0()))(pure(dictApplicative));
910− },
911− sequence: function(dictApplicative) {
912− return sequenceDefault(traversableArray)(dictApplicative);
913− },
914− Functor0: function() {
915− return functorArray;
916− },
917− Foldable1: function() {
918− return foldableArray;
919− }
920− };
921−
922− // output/Data.Array/index.js
923− var intercalate1 = /* @__PURE__ */ intercalate(foldableArray);
924− var intercalate2 = function(dictMonoid) {
925− return intercalate1(dictMonoid);
926− };
927− var index = /* @__PURE__ */ function() {
928− return runFn4(indexImpl)(Just.create)(Nothing.value);
929− }();
930− var head = function(xs) {
931− return index(xs)(0);
932− };
933−
934− // output/Maquette/foreign.js
935− var NAMESPACE_W3 = "http://www.w3.org/";
936− var NAMESPACE_SVG = NAMESPACE_W3 + "2000/svg";
937− var NAMESPACE_XLINK = NAMESPACE_W3 + "1999/xlink";
938− var emptyArray = [];
939− var extend2 = function(base, overrides) {
940− var result = {};
941− Object.keys(base).forEach(function(key) {
942− result[key] = base[key];
943− });
944− if (overrides) {
945− Object.keys(overrides).forEach(function(key) {
946− result[key] = overrides[key];
947− });
948− }
949− return result;
950− };
951− var same = function(vnode1, vnode2) {
952− if (vnode1.vnodeSelector !== vnode2.vnodeSelector) {
953− return false;
954− }
955− if (vnode1.properties && vnode2.properties) {
956− if (vnode1.properties.key !== vnode2.properties.key) {
957− return false;
958− }
959− return vnode1.properties.bind === vnode2.properties.bind;
960− }
961− return !vnode1.properties && !vnode2.properties;
962− };
963− var checkStyleValue = function(styleValue) {
964− if (typeof styleValue !== "string") {
965− throw new Error("Style values must be strings");
966− }
967− };
968− var findIndexOfChild = function(children, sameAs, start2) {
969− if (sameAs.vnodeSelector !== "") {
970− for (var i = start2; i < children.length; i++) {
971− if (same(children[i], sameAs)) {
972− return i;
973− }
974− }
975− }
976− return -1;
977− };
978− var checkDistinguishable = function(childNodes, indexToCheck, parentVNode, operation) {
979− var childNode = childNodes[indexToCheck];
980− if (childNode.vnodeSelector === "") {
981− return;
982− }
983− var properties = childNode.properties;
984− var key = properties ? properties.key === void 0 ? properties.bind : properties.key : void 0;
985− if (!key) {
986− for (var i = 0; i < childNodes.length; i++) {
987− if (i !== indexToCheck) {
988− var node = childNodes[i];
989− if (same(node, childNode)) {
990− throw {
991− error: new Error(parentVNode.vnodeSelector + " had a " + childNode.vnodeSelector + " child " + (operation === "added" ? operation : "removed") + ", but there is now more than one. You must add unique key properties to make them distinguishable."),
992− parentNode: parentVNode,
993− childNode
994− };
995− }
996− }
997− }
998− }
999− };
1000− var nodeAdded = function(vNode) {
1001− if (vNode.properties) {
1002− var enterAnimation = vNode.properties.enterAnimation;
1003− if (enterAnimation) {
1004− enterAnimation(vNode.domNode, vNode.properties);
1005− }
1006− }
1007− };
1008− var removedNodes = [];
1009− var requestedIdleCallback = false;
1010− var visitRemovedNode = function(node) {
1011− (node.children || []).forEach(visitRemovedNode);
1012− if (node.properties && node.properties.afterRemoved) {
1013− node.properties.afterRemoved.apply(node.properties.bind || node.properties, [
1014− node.domNode
1015− ]);
1016− }
1017− };
1018− var processPendingNodeRemovals = function() {
1019− requestedIdleCallback = false;
1020− removedNodes.forEach(visitRemovedNode);
1021− removedNodes.length = 0;
1022− };
1023− var scheduleNodeRemoval = function(vNode) {
1024− removedNodes.push(vNode);
1025− if (!requestedIdleCallback) {
1026− requestedIdleCallback = true;
1027− if (typeof window !== "undefined" && "requestIdleCallback" in window) {
1028− window.requestIdleCallback(processPendingNodeRemovals, { timeout: 16 });
1029− } else {
1030− setTimeout(processPendingNodeRemovals, 16);
1031− }
1032− }
1033− };
1034− var nodeToRemove = function(vNode) {
1035− var domNode = vNode.domNode;
1036− if (vNode.properties) {
1037− var exitAnimation = vNode.properties.exitAnimation;
1038− if (exitAnimation) {
1039− domNode.style.pointerEvents = "none";
1040− var removeDomNode = function() {
1041− if (domNode.parentNode) {
1042− domNode.parentNode.removeChild(domNode);
1043− scheduleNodeRemoval(vNode);
1044− }
1045− };
1046− exitAnimation(domNode, removeDomNode, vNode.properties);
1047− return;
1048− }
1049− }
1050− if (domNode.parentNode) {
1051− domNode.parentNode.removeChild(domNode);
1052− scheduleNodeRemoval(vNode);
1053− }
1054− };
1055− var vnodeOnlyProps = [
1056− "afterCreate",
1057− "afterUpdate",
1058− "afterRemoved",
1059− "enterAnimation",
1060− "exitAnimation",
1061− "updateAnimation"
1062− ];
1063− function filterVNodeOnlyProps(name15) {
1064− return !vnodeOnlyProps.includes(name15);
1065− }
1066− var setProperties = function(domNode, properties, projectionOptions) {
1067− if (!properties) {
1068− return;
1069− }
1070− var eventHandlerInterceptor = projectionOptions.eventHandlerInterceptor;
1071− var propNames = Object.keys(properties).filter(filterVNodeOnlyProps);
1072− var propCount = propNames.length;
1073− for (var i = 0; i < propCount; i++) {
1074− var propName = propNames[i];
1075− var propValue = properties[propName];
1076− if (propName === "className") {
1077− throw new Error('Property "className" is not supported, use "class".');
1078− } else if (propName === "class") {
1079− toggleClasses(domNode, propValue, true);
1080− } else if (propName === "classes") {
1081− var classNames = Object.keys(propValue);
1082− var classNameCount = classNames.length;
1083− for (var j = 0; j < classNameCount; j++) {
1084− var className = classNames[j];
1085− if (propValue[className]) {
1086− domNode.classList.add(className);
1087− }
1088− }
1089− } else if (propName === "styles") {
1090− var styleNames = Object.keys(propValue);
1091− var styleCount = styleNames.length;
1092− for (var j = 0; j < styleCount; j++) {
1093− var styleName = styleNames[j];
1094− var styleValue = propValue[styleName];
1095− if (styleValue) {
1096− checkStyleValue(styleValue);
1097− projectionOptions.styleApplyer(domNode, styleName, styleValue);
1098− }
1099− }
1100− } else if (propName === "on" && propValue) {
1101− for (var _i = 0, _a = Object.entries(properties.on); _i < _a.length; _i++) {
1102− var _b = _a[_i], key = _b[0], handler = _b[1];
1103− var listener = typeof handler === "function" ? handler : handler.listener;
1104− if (eventHandlerInterceptor) {
1105− listener = eventHandlerInterceptor(key, listener, domNode, properties);
1106− }
1107− if (listener) {
1108− domNode.addEventListener(key, listener, typeof handler === "function" ? void 0 : handler.options);
1109− }
1110− }
1111− } else if (propName !== "key" && propValue !== null && propValue !== void 0) {
1112− var type = typeof propValue;
1113− if (type === "function") {
1114− if (propName.lastIndexOf("on", 0) === 0) {
1115− if (eventHandlerInterceptor) {
1116− propValue = eventHandlerInterceptor(propName, propValue, domNode, properties);
1117− }
1118− }
1119− domNode[propName] = propValue;
1120− } else if (projectionOptions.namespace === NAMESPACE_SVG) {
1121− if (propName === "href") {
1122− domNode.setAttributeNS(NAMESPACE_XLINK, propName, propValue);
1123− } else {
1124− domNode.setAttribute(propName, propValue);
1125− }
1126− } else if (type === "string" && propName !== "value" && propName !== "innerHTML") {
1127− domNode.setAttribute(propName, propValue);
1128− } else {
1129− domNode[propName] = propValue;
1130− }
1131− }
1132− }
1133− };
1134− var addChildren = function(domNode, children, projectionOptions) {
1135− if (!children) {
1136− return;
1137− }
1138− for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {
1139− var child = children_1[_i];
1140− createDom(child, domNode, void 0, projectionOptions);
1141− }
1142− };
1143− var initPropertiesAndChildren = function(domNode, vnode, projectionOptions) {
1144− addChildren(domNode, vnode.children, projectionOptions);
1145− if (vnode.text) {
1146− domNode.textContent = vnode.text;
1147− }
1148− setProperties(domNode, vnode.properties, projectionOptions);
1149− if (vnode.properties && vnode.properties.afterCreate) {
1150− vnode.properties.afterCreate.apply(vnode.properties.bind || vnode.properties, [
1151− domNode,
1152− projectionOptions,
1153− vnode.vnodeSelector,
1154− vnode.properties,
1155− vnode.children
1156− ]);
1157− }
1158− };
1159− var createDom = function(vnode, parentNode, insertBefore, projectionOptions) {
1160− var _a;
1161− var domNode;
1162− var start2 = 0;
1163− var vnodeSelector = vnode.vnodeSelector;
1164− var doc = parentNode.ownerDocument;
1165− if (vnodeSelector === "") {
1166− if (vnode.domNode) {
1167− vnode.domNode.nodeValue = vnode.text;
1168− } else {
1169− domNode = vnode.domNode = doc.createTextNode(vnode.text);
1170− if (insertBefore !== void 0) {
1171− parentNode.insertBefore(domNode, insertBefore);
1172− } else {
1173− parentNode.appendChild(domNode);
1174− }
1175− }
1176− } else {
1177− for (var i = 0; i <= vnodeSelector.length; ++i) {
1178− var c = vnodeSelector.charAt(i);
1179− if (i === vnodeSelector.length || c === "." || c === "#") {
1180− var type = vnodeSelector.charAt(start2 - 1);
1181− var found = vnodeSelector.slice(start2, i);
1182− if (type === ".") {
1183− domNode.classList.add(found);
1184− } else if (type === "#") {
1185− domNode.id = found;
1186− } else {
1187− if (found === "svg") {
1188− projectionOptions = extend2(projectionOptions, {
1189− namespace: NAMESPACE_SVG
1190− });
1191− }
1192− if (projectionOptions.namespace !== void 0) {
1193− domNode = vnode.domNode = doc.createElementNS(projectionOptions.namespace, found);
1194− } else {
1195− domNode = vnode.domNode = vnode.domNode || (((_a = vnode.properties) === null || _a === void 0 ? void 0 : _a.is) ? doc.createElement(found, { is: vnode.properties.is }) : doc.createElement(found));
1196− if (found === "input" && vnode.properties && vnode.properties.type !== void 0) {
1197− domNode.setAttribute("type", vnode.properties.type);
1198− }
1199− }
1200− if (insertBefore !== void 0) {
1201− parentNode.insertBefore(domNode, insertBefore);
1202− } else if (domNode.parentNode !== parentNode) {
1203− parentNode.appendChild(domNode);
1204− }
1205− }
1206− start2 = i + 1;
1207− }
1208− }
1209− initPropertiesAndChildren(domNode, vnode, projectionOptions);
1210− }
1211− };
1212− var updateDom;
1213− var toggleClasses = function(domNode, classes, on2) {
1214− if (!classes) {
1215− return;
1216− }
1217− classes.split(" ").forEach(function(classToToggle) {
1218− if (classToToggle) {
1219− domNode.classList.toggle(classToToggle, on2);
1220− }
1221− });
1222− };
1223− var updateProperties = function(domNode, previousProperties, properties, projectionOptions) {
1224− if (!properties) {
1225− return;
1226− }
1227− var propertiesUpdated = false;
1228− var propNames = Object.keys(properties).filter(filterVNodeOnlyProps);
1229− var propCount = propNames.length;
1230− for (var i = 0; i < propCount; i++) {
1231− var propName = propNames[i];
1232− var propValue = properties[propName];
1233− var previousValue = previousProperties[propName];
1234− if (propName === "class") {
1235− if (previousValue !== propValue) {
1236− toggleClasses(domNode, previousValue, false);
1237− toggleClasses(domNode, propValue, true);
1238− }
1239− } else if (propName === "classes") {
1240− var classList = domNode.classList;
1241− var classNames = Object.keys(propValue);
1242− var classNameCount = classNames.length;
1243− for (var j = 0; j < classNameCount; j++) {
1244− var className = classNames[j];
1245− var on2 = !!propValue[className];
1246− var previousOn = !!previousValue[className];
1247− if (on2 === previousOn) {
1248− continue;
1249− }
1250− propertiesUpdated = true;
1251− if (on2) {
1252− classList.add(className);
1253− } else {
1254− classList.remove(className);
1255− }
1256− }
1257− } else if (propName === "styles") {
1258− var styleNames = Object.keys(propValue);
1259− var styleCount = styleNames.length;
1260− for (var j = 0; j < styleCount; j++) {
1261− var styleName = styleNames[j];
1262− var newStyleValue = propValue[styleName];
1263− var oldStyleValue = previousValue[styleName];
1264− if (newStyleValue === oldStyleValue) {
1265− continue;
1266− }
1267− propertiesUpdated = true;
1268− if (newStyleValue) {
1269− checkStyleValue(newStyleValue);
1270− projectionOptions.styleApplyer(domNode, styleName, newStyleValue);
1271− } else {
1272− projectionOptions.styleApplyer(domNode, styleName, "");
1273− }
1274− }
1275− } else {
1276− if (!propValue && typeof previousValue === "string") {
1277− propValue = "";
1278− }
1279− if (propName === "value") {
1280− var domValue = domNode[propName];
1281− if (domValue !== propValue && // The 'value' in the DOM tree !== newValue
1282− propValue !== previousValue) {
1283− domNode[propName] = propValue;
1284− }
1285− if (propValue !== previousValue) {
1286− propertiesUpdated = true;
1287− }
1288− } else if (propValue !== previousValue) {
1289− var type = typeof propValue;
1290− if (type !== "function" || !projectionOptions.eventHandlerInterceptor) {
1291− if (projectionOptions.namespace === NAMESPACE_SVG) {
1292− if (propName === "href") {
1293− domNode.setAttributeNS(NAMESPACE_XLINK, propName, propValue);
1294− } else {
1295− domNode.setAttribute(propName, propValue);
1296− }
1297− } else if (type === "string" && propName !== "innerHTML") {
1298− if (propName === "role" && propValue === "") {
1299− domNode.removeAttribute(propName);
1300− } else {
1301− domNode.setAttribute(propName, propValue);
1302− }
1303− } else if (domNode[propName] !== propValue) {
1304− domNode[propName] = propValue;
1305− }
1306− propertiesUpdated = true;
1307− }
1308− }
1309− }
1310− }
1311− return propertiesUpdated;
1312− };
1313− var updateChildren = function(vnode, domNode, oldChildren, newChildren, projectionOptions) {
1314− if (oldChildren === newChildren) {
1315− return false;
1316− }
1317− oldChildren = oldChildren || emptyArray;
1318− newChildren = newChildren || emptyArray;
1319− var oldChildrenLength = oldChildren.length;
1320− var newChildrenLength = newChildren.length;
1321− var oldIndex = 0;
1322− var newIndex = 0;
1323− var i;
1324− var textUpdated = false;
1325− while (newIndex < newChildrenLength) {
1326− var oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : void 0;
1327− var newChild = newChildren[newIndex];
1328− if (oldChild !== void 0 && same(oldChild, newChild)) {
1329− textUpdated = updateDom(oldChild, newChild, projectionOptions, domNode, oldChildren) || textUpdated;
1330− oldIndex++;
1331− } else {
1332− var findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);
1333− if (findOldIndex >= 0) {
1334− for (i = oldIndex; i < findOldIndex; i++) {
1335− nodeToRemove(oldChildren[i]);
1336− checkDistinguishable(oldChildren, i, vnode, "removed");
1337− }
1338− textUpdated = updateDom(oldChildren[findOldIndex], newChild, projectionOptions, domNode, oldChildren) || textUpdated;
1339− oldIndex = findOldIndex + 1;
1340− } else {
1341− createDom(newChild, domNode, oldIndex < oldChildrenLength ? oldChildren[oldIndex].domNode : void 0, projectionOptions);
1342− nodeAdded(newChild);
1343− checkDistinguishable(newChildren, newIndex, vnode, "added");
1344− }
1345− }
1346− newIndex++;
1347− }
1348− if (oldChildrenLength > oldIndex) {
1349− for (i = oldIndex; i < oldChildrenLength; i++) {
1350− nodeToRemove(oldChildren[i]);
1351− checkDistinguishable(oldChildren, i, vnode, "removed");
1352− }
1353− }
1354− return textUpdated;
1355− };
1356− updateDom = function(previous, vnode, projectionOptions, parentNode, oldChildren) {
1357− var domNode = previous.domNode;
1358− var textUpdated = false;
1359− if (previous === vnode) {
1360− return false;
1361− }
1362− var updated = false;
1363− if (vnode.vnodeSelector === "") {
1364− if (vnode.text !== previous.text) {
1365− var newTextNode = domNode.ownerDocument.createTextNode(vnode.text);
1366− try {
1367− parentNode.replaceChild(newTextNode, domNode);
1368− } catch (e) {
1369− parentNode.replaceChild(newTextNode, parentNode.childNodes[oldChildren.indexOf(previous)]);
1370− }
1371− vnode.domNode = newTextNode;
1372− textUpdated = true;
1373− return textUpdated;
1374− }
1375− vnode.domNode = domNode;
1376− } else {
1377− if (vnode.vnodeSelector.lastIndexOf("svg", 0) === 0) {
1378− projectionOptions = extend2(projectionOptions, {
1379− namespace: NAMESPACE_SVG
1380− });
1381− }
1382− if (previous.text !== vnode.text) {
1383− updated = true;
1384− if (vnode.text === void 0) {
1385− domNode.removeChild(domNode.firstChild);
1386− } else {
1387− domNode.textContent = vnode.text;
1388− }
1389− }
1390− vnode.domNode = domNode;
1391− updated = updateChildren(vnode, domNode, previous.children, vnode.children, projectionOptions) || updated;
1392− updated = updateProperties(domNode, previous.properties, vnode.properties, projectionOptions) || updated;
1393− if (vnode.properties && vnode.properties.afterUpdate) {
1394− vnode.properties.afterUpdate.apply(vnode.properties.bind || vnode.properties, [
1395− domNode,
1396− projectionOptions,
1397− vnode.vnodeSelector,
1398− vnode.properties,
1399− vnode.children
1400− ]);
1401− }
1402− }
1403− if (updated && vnode.properties && vnode.properties.updateAnimation) {
1404− vnode.properties.updateAnimation(domNode, vnode.properties, previous.properties);
1405− }
1406− return textUpdated;
1407− };
1408− var createProjection = function(vnode, projectionOptions) {
1409− return {
1410− getLastRender: function() {
1411− return vnode;
1412− },
1413− update: function(updatedVnode) {
1414− if (vnode.vnodeSelector !== updatedVnode.vnodeSelector) {
1415− throw new Error("The selector for the root VNode may not be changed. (consider using dom.merge and add one extra level to the virtual DOM)");
1416− }
1417− var previousVNode = vnode;
1418− vnode = updatedVnode;
1419− updateDom(previousVNode, updatedVnode, projectionOptions, previousVNode.domNode.parentNode, [previousVNode]);
1420− },
1421− domNode: vnode.domNode
1422− };
1423− };
1424− var DEFAULT_PROJECTION_OPTIONS = {
1425− namespace: void 0,
1426− performanceLogger: function() {
1427− return void 0;
1428− },
1429− eventHandlerInterceptor: void 0,
1430− styleApplyer: function(domNode, styleName, value12) {
1431− if (styleName.charAt(0) === "-") {
1432− domNode.style.setProperty(styleName, value12);
1433− } else {
1434− domNode.style[styleName] = value12;
1435− }
1436− }
1437− };
1438− var applyDefaultProjectionOptions = function(projectorOptions) {
1439− return extend2(DEFAULT_PROJECTION_OPTIONS, projectorOptions);
1440− };
1441− var dom = {
1442− /**
1443− * Creates a real DOM tree from `vnode`. The [[Projection]] object returned will contain the resulting DOM Node in
1444− * its [[Projection.domNode|domNode]] property.
1445− * This is a low-level method. Users will typically use a [[Projector]] instead.
1446− * @param vnode - The root of the virtual DOM tree that was created using the [[h]] function. NOTE: [[VNode]]
1447− * objects may only be rendered once.
1448− * @param projectionOptions - Options to be used to create and update the projection.
1449− * @returns The [[Projection]] which also contains the DOM Node that was created.
1450− */
1451− create: function(vnode, projectionOptions) {
1452− projectionOptions = applyDefaultProjectionOptions(projectionOptions);
1453− createDom(vnode, document.createElement("div"), void 0, projectionOptions);
1454− return createProjection(vnode, projectionOptions);
1455− },
1456− /**
1457− * Appends a new child node to the DOM which is generated from a [[VNode]].
1458− * This is a low-level method. Users will typically use a [[Projector]] instead.
1459− * @param parentNode - The parent node for the new child node.
1460− * @param vnode - The root of the virtual DOM tree that was created using the [[h]] function. NOTE: [[VNode]]
1461− * objects may only be rendered once.
1462− * @param projectionOptions - Options to be used to create and update the [[Projection]].
1463− * @returns The [[Projection]] that was created.
1464− */
1465− append: function(parentNode, vnode, projectionOptions) {
1466− projectionOptions = applyDefaultProjectionOptions(projectionOptions);
1467− createDom(vnode, parentNode, void 0, projectionOptions);
1468− return createProjection(vnode, projectionOptions);
1469− },
1470− /**
1471− * Inserts a new DOM node which is generated from a [[VNode]].
1472− * This is a low-level method. Users wil typically use a [[Projector]] instead.
1473− * @param beforeNode - The node that the DOM Node is inserted before.
1474− * @param vnode - The root of the virtual DOM tree that was created using the [[h]] function.
1475− * NOTE: [[VNode]] objects may only be rendered once.
1476− * @param projectionOptions - Options to be used to create and update the projection, see [[createProjector]].
1477− * @returns The [[Projection]] that was created.
1478− */
1479− insertBefore: function(beforeNode, vnode, projectionOptions) {
1480− projectionOptions = applyDefaultProjectionOptions(projectionOptions);
1481− createDom(vnode, beforeNode.parentNode, beforeNode, projectionOptions);
1482− return createProjection(vnode, projectionOptions);
1483− },
1484− /**
1485− * Merges a new DOM node which is generated from a [[VNode]] with an existing DOM Node.
1486− * This means that the virtual DOM and the real DOM will have one overlapping element.
1487− * Therefore the selector for the root [[VNode]] will be ignored, but its properties and children will be applied to the Element provided.
1488− * This is a low-level method. Users wil typically use a [[Projector]] instead.
1489− * @param element - The existing element to adopt as the root of the new virtual DOM. Existing attributes and child nodes are preserved.
1490− * @param vnode - The root of the virtual DOM tree that was created using the [[h]] function. NOTE: [[VNode]] objects
1491− * may only be rendered once.
1492− * @param projectionOptions - Options to be used to create and update the projection, see [[createProjector]].
1493− * @returns The [[Projection]] that was created.
1494− */
1495− merge: function(element, vnode, projectionOptions) {
1496− projectionOptions = applyDefaultProjectionOptions(projectionOptions);
1497− vnode.domNode = element;
1498− initPropertiesAndChildren(element, vnode, projectionOptions);
1499− return createProjection(vnode, projectionOptions);
1500− },
1501− /**
1502− * Replaces an existing DOM node with a node generated from a [[VNode]].
1503− * This is a low-level method. Users will typically use a [[Projector]] instead.
1504− * @param element - The node for the [[VNode]] to replace.
1505− * @param vnode - The root of the virtual DOM tree that was created using the [[h]] function. NOTE: [[VNode]]
1506− * objects may only be rendered once.
1507− * @param projectionOptions - Options to be used to create and update the [[Projection]].
1508− * @returns The [[Projection]] that was created.
1509− */
1510− replace: function(element, vnode, projectionOptions) {
1511− projectionOptions = applyDefaultProjectionOptions(projectionOptions);
1512− createDom(vnode, element.parentNode, element, projectionOptions);
1513− element.parentNode.removeChild(element);
1514− return createProjection(vnode, projectionOptions);
1515− }
1516− };
1517− var toTextVNode = function(data) {
1518− return {
1519− vnodeSelector: "",
1520− properties: void 0,
1521− children: void 0,
1522− text: data.toString(),
1523− domNode: null
1524− };
1525− };
1526− var appendChildren = function(parentSelector, insertions, main2) {
1527− for (var i = 0, length_1 = insertions.length; i < length_1; i++) {
1528− var item = insertions[i];
1529− if (Array.isArray(item)) {
1530− appendChildren(parentSelector, item, main2);
1531− } else {
1532− if (item !== null && item !== void 0 && item !== false) {
1533− if (typeof item === "string") {
1534− item = toTextVNode(item);
1535− }
1536− main2.push(item);
1537− }
1538− }
1539− }
1540− };
1541− function h(selector, properties, children) {
1542− if (Array.isArray(properties)) {
1543− children = properties;
1544− properties = void 0;
1545− } else if (properties && (typeof properties === "string" || properties.vnodeSelector) || children && (typeof children === "string" || children.vnodeSelector)) {
1546− throw new Error("h called with invalid arguments");
1547− }
1548− var text6;
1549− var flattenedChildren;
1550− if (children && children.length === 1 && typeof children[0] === "string") {
1551− text6 = children[0];
1552− } else if (children) {
1553− flattenedChildren = [];
1554− appendChildren(selector, children, flattenedChildren);
1555− if (flattenedChildren.length === 0) {
1556− flattenedChildren = void 0;
1557− }
1558− }
1559− return {
1560− vnodeSelector: selector,
1561− properties,
1562− children: flattenedChildren,
1563− text: text6 === "" ? void 0 : text6,
1564− domNode: null
1565− };
1566− }
1567− var createParentNodePath = function(node, rootNode) {
1568− var parentNodePath = [];
1569− while (node && node !== rootNode) {
1570− parentNodePath.push(node);
1571− node = node.parentNode;
1572− }
1573− return parentNodePath;
1574− };
1575− var find2;
1576− if (Array.prototype.find) {
1577− find2 = function(items, predicate) {
1578− return items.find(predicate);
1579− };
1580− } else {
1581− find2 = function(items, predicate) {
1582− return items.filter(predicate)[0];
1583− };
1584− }
1585− var findVNodeByParentNodePath = function(vnode, parentNodePath) {
1586− var result = vnode;
1587− parentNodePath.forEach(function(node) {
1588− result = result && result.children ? find2(result.children, function(child) {
1589− return child.domNode === node;
1590− }) : void 0;
1591− });
1592− return result;
1593− };
1594− var createEventHandlerInterceptor = function(projector, getProjection, performanceLogger) {
1595− return function(propertyName, eventHandler, domNode, properties) {
1596− return modifiedEventHandler;
1597− };
1598− function modifiedEventHandler(evt) {
1599− var _a, _b;
1600− performanceLogger("domEvent", evt);
1601− var projection = getProjection();
1602− var parentNodePath = createParentNodePath(evt.currentTarget, projection.domNode);
1603− parentNodePath.reverse();
1604− var matchingVNode = findVNodeByParentNodePath(projection.getLastRender(), parentNodePath);
1605− projector.scheduleRender();
1606− var result;
1607− if (matchingVNode) {
1608− var listener = (_b = (_a = matchingVNode.properties["on" + evt.type]) !== null && _a !== void 0 ? _a : matchingVNode.properties.on[evt.type].listener) !== null && _b !== void 0 ? _b : matchingVNode.properties.on[evt.type];
1609− result = listener.apply(matchingVNode.properties.bind || this, arguments);
1610− }
1611− performanceLogger("domEventProcessed", evt);
1612− return result;
1613− }
1614− };
1615− var createProjector = function(projectorOptions) {
1616− var projector;
1617− var projectionOptions = applyDefaultProjectionOptions(projectorOptions);
1618− var performanceLogger = projectionOptions.performanceLogger;
1619− var renderCompleted = true;
1620− var scheduled;
1621− var stopped = false;
1622− var projections = [];
1623− var renderFunctions = [];
1624− var addProjection = function(domFunction, node, renderFunction) {
1625− var projection;
1626− var getProjection = function() {
1627− return projection;
1628− };
1629− projectionOptions.eventHandlerInterceptor = createEventHandlerInterceptor(projector, getProjection, performanceLogger);
1630− projection = domFunction(node, renderFunction(), projectionOptions);
1631− projections.push(projection);
1632− renderFunctions.push(renderFunction);
1633− };
1634− var doRender = function() {
1635− scheduled = void 0;
1636− if (!renderCompleted) {
1637− return;
1638− }
1639− renderCompleted = false;
1640− performanceLogger("renderStart", void 0);
1641− for (var i = 0; i < projections.length; i++) {
1642− var updatedVnode = renderFunctions[i]();
1643− performanceLogger("rendered", void 0);
1644− projections[i].update(updatedVnode);
1645− performanceLogger("patched", void 0);
1646− }
1647− performanceLogger("renderDone", void 0);
1648− renderCompleted = true;
1649− };
1650− projector = {
1651− renderNow: doRender,
1652− scheduleRender: function() {
1653− if (!scheduled && !stopped) {
1654− scheduled = requestAnimationFrame(doRender);
1655− }
1656− },
1657− stop: function() {
1658− if (scheduled) {
1659− cancelAnimationFrame(scheduled);
1660− scheduled = void 0;
1661− }
1662− stopped = true;
1663− },
1664− resume: function() {
1665− stopped = false;
1666− renderCompleted = true;
1667− projector.scheduleRender();
1668− },
1669− append: function(parentNode, renderFunction) {
1670− addProjection(dom.append, parentNode, renderFunction);
1671− },
1672− insertBefore: function(beforeNode, renderFunction) {
1673− addProjection(dom.insertBefore, beforeNode, renderFunction);
1674− },
1675− merge: function(domNode, renderFunction) {
1676− addProjection(dom.merge, domNode, renderFunction);
1677− },
1678− replace: function(domNode, renderFunction) {
1679− addProjection(dom.replace, domNode, renderFunction);
1680− },
1681− detach: function(renderFunction) {
1682− for (var i = 0; i < renderFunctions.length; i++) {
1683− if (renderFunctions[i] === renderFunction) {
1684− renderFunctions.splice(i, 1);
1685− return projections.splice(i, 1)[0];
1686− }
1687− }
1688− throw new Error("renderFunction was not found");
1689− }
1690− };
1691− return projector;
1692− };
1693− function _h(selector) {
1694− return function(properties) {
1695− return function(children) {
1696− return h(selector, properties, children);
1697− };
1698− };
1699− }
1700− function scheduleRender(projector) {
1701− return function() {
1702− projector.scheduleRender();
1703− };
1704− }
1705− function replace(projector) {
1706− return function(el) {
1707− return function(render4) {
1708− return function() {
1709− projector.replace(el, render4);
1710− };
1711− };
1712− };
1713− }
1714−
1715− // output/Maquette/index.js
1716− var string = unsafeCoerce2;
1717− var h2 = _h;
1718−
1719− // output/Control.Monad.Writer.Class/index.js
1720− var tell = function(dict) {
1721− return dict.tell;
1722− };
1723−
1724− // output/Control.Monad.Writer.Trans/index.js
1725− var WriterT = function(x) {
1726− return x;
1727− };
1728− var runWriterT = function(v) {
1729− return v;
1730− };
1731− var mapWriterT = function(f) {
1732− return function(v) {
1733− return f(v);
1734− };
1735− };
1736− var functorWriterT = function(dictFunctor) {
1737− var map4 = map(dictFunctor);
1738− return {
1739− map: function(f) {
1740− return mapWriterT(map4(function(v) {
1741− return new Tuple(f(v.value0), v.value1);
1742− }));
1743− }
1744− };
1745− };
1746− var applyWriterT = function(dictSemigroup) {
1747− var append3 = append(dictSemigroup);
1748− return function(dictApply) {
1749− var apply2 = apply(dictApply);
1750− var Functor0 = dictApply.Functor0();
1751− var map4 = map(Functor0);
1752− var functorWriterT1 = functorWriterT(Functor0);
1753− return {
1754− apply: function(v) {
1755− return function(v1) {
1756− var k = function(v3) {
1757− return function(v4) {
1758− return new Tuple(v3.value0(v4.value0), append3(v3.value1)(v4.value1));
1759− };
1760− };
1761− return apply2(map4(k)(v))(v1);
1762− };
1763− },
1764− Functor0: function() {
1765− return functorWriterT1;
1766− }
1767− };
1768− };
1769− };
1770− var bindWriterT = function(dictSemigroup) {
1771− var append3 = append(dictSemigroup);
1772− var applyWriterT1 = applyWriterT(dictSemigroup);
1773− return function(dictBind) {
1774− var bind4 = bind(dictBind);
1775− var Apply0 = dictBind.Apply0();
1776− var map4 = map(Apply0.Functor0());
1777− var applyWriterT2 = applyWriterT1(Apply0);
1778− return {
1779− bind: function(v) {
1780− return function(k) {
1781− return bind4(v)(function(v1) {
1782− var v2 = k(v1.value0);
1783− return map4(function(v3) {
1784− return new Tuple(v3.value0, append3(v1.value1)(v3.value1));
1785− })(v2);
1786− });
1787− };
1788− },
1789− Apply0: function() {
1790− return applyWriterT2;
1791− }
1792− };
1793− };
1794− };
1795− var semigroupWriterT = function(dictApply) {
1796− return function(dictSemigroup) {
1797− var lift22 = lift2(applyWriterT(dictSemigroup)(dictApply));
1798− return function(dictSemigroup1) {
1799− return {
1800− append: lift22(append(dictSemigroup1))
1801− };
1802− };
1803− };
1804− };
1805− var applicativeWriterT = function(dictMonoid) {
1806− var mempty6 = mempty(dictMonoid);
1807− var applyWriterT1 = applyWriterT(dictMonoid.Semigroup0());
1808− return function(dictApplicative) {
1809− var pure4 = pure(dictApplicative);
1810− var applyWriterT2 = applyWriterT1(dictApplicative.Apply0());
1811− return {
1812− pure: function(a) {
1813− return pure4(new Tuple(a, mempty6));
1814− },
1815− Apply0: function() {
1816− return applyWriterT2;
1817− }
1818− };
1819− };
1820− };
1821− var monadWriterT = function(dictMonoid) {
1822− var applicativeWriterT1 = applicativeWriterT(dictMonoid);
1823− var bindWriterT1 = bindWriterT(dictMonoid.Semigroup0());
1824− return function(dictMonad) {
1825− var applicativeWriterT22 = applicativeWriterT1(dictMonad.Applicative0());
1826− var bindWriterT22 = bindWriterT1(dictMonad.Bind1());
1827− return {
1828− Applicative0: function() {
1829− return applicativeWriterT22;
1830− },
1831− Bind1: function() {
1832− return bindWriterT22;
1833− }
1834− };
1835− };
1836− };
1837− var monadTellWriterT = function(dictMonoid) {
1838− var Semigroup0 = dictMonoid.Semigroup0();
1839− var monadWriterT1 = monadWriterT(dictMonoid);
1840− return function(dictMonad) {
1841− var monadWriterT2 = monadWriterT1(dictMonad);
1842− return {
1843− tell: function() {
1844− var $262 = pure(dictMonad.Applicative0());
1845− var $263 = Tuple.create(unit);
1846− return function($264) {
1847− return WriterT($262($263($264)));
1848− };
1849− }(),
1850− Semigroup0: function() {
1851− return Semigroup0;
1852− },
1853− Monad1: function() {
1854− return monadWriterT2;
1855− }
1856− };
1857− };
1858− };
1859− var monoidWriterT = function(dictApplicative) {
1860− var semigroupWriterT1 = semigroupWriterT(dictApplicative.Apply0());
1861− return function(dictMonoid) {
1862− var pure4 = pure(applicativeWriterT(dictMonoid)(dictApplicative));
1863− var semigroupWriterT2 = semigroupWriterT1(dictMonoid.Semigroup0());
1864− return function(dictMonoid1) {
1865− var semigroupWriterT3 = semigroupWriterT2(dictMonoid1.Semigroup0());
1866− return {
1867− mempty: pure4(mempty(dictMonoid1)),
1868− Semigroup0: function() {
1869− return semigroupWriterT3;
1870− }
1871− };
1872− };
1873− };
1874− };
1875−
1876− // output/Control.Monad.Writer/index.js
1877− var unwrap2 = /* @__PURE__ */ unwrap();
1878− var runWriter = function($5) {
1879− return unwrap2(runWriterT($5));
1880− };
1881−
1882− // output/Data.Int/foreign.js
1883− var fromNumberImpl = function(just) {
1884− return function(nothing) {
1885− return function(n) {
1886− return (n | 0) === n ? just(n) : nothing;
1887− };
1888− };
1889− };
1890− var toNumber = function(n) {
1891− return n;
1892− };
1893−
1894− // output/Data.Number/foreign.js
1895− var isFiniteImpl = isFinite;
1896− var round = Math.round;
1897−
1898− // output/Data.Int/index.js
1899− var top2 = /* @__PURE__ */ top(boundedInt);
1900− var bottom2 = /* @__PURE__ */ bottom(boundedInt);
1901− var fromNumber = /* @__PURE__ */ function() {
1902− return fromNumberImpl(Just.create)(Nothing.value);
1903− }();
1904− var unsafeClamp = function(x) {
1905− if (!isFiniteImpl(x)) {
1906− return 0;
1907− }
1908− ;
1909− if (x >= toNumber(top2)) {
1910− return top2;
1911− }
1912− ;
1913− if (x <= toNumber(bottom2)) {
1914− return bottom2;
1915− }
1916− ;
1917− if (otherwise) {
1918− return fromMaybe(0)(fromNumber(x));
1919− }
1920− ;
1921− throw new Error("Failed pattern match at Data.Int (line 72, column 1 - line 72, column 29): " + [x.constructor.name]);
1922− };
1923− var round2 = function($37) {
1924− return unsafeClamp(round($37));
1925− };
1926−
1927− // output/Data.TraversableWithIndex/index.js
1928− var traverseWithIndex = function(dict) {
1929− return dict.traverseWithIndex;
1930− };
1931−
1932− // output/Foreign.Object/foreign.js
1933− function _copyST(m2) {
1934− return function() {
1935− var r = {};
1936− for (var k in m2) {
1937− if (hasOwnProperty.call(m2, k)) {
1938− r[k] = m2[k];
1939− }
1940− }
1941− return r;
1942− };
1943− }
1944− var empty2 = {};
1945− function runST(f) {
1946− return f();
1947− }
1948− function _fmapObject(m0, f) {
1949− var m2 = {};
1950− for (var k in m0) {
1951− if (hasOwnProperty.call(m0, k)) {
1952− m2[k] = f(m0[k]);
1953− }
1954− }
1955− return m2;
1956− }
1957− function _mapWithKey(m0, f) {
1958− var m2 = {};
1959− for (var k in m0) {
1960− if (hasOwnProperty.call(m0, k)) {
1961− m2[k] = f(k)(m0[k]);
1962− }
1963− }
1964− return m2;
1965− }
1966− function _foldM(bind4) {
1967− return function(f) {
1968− return function(mz) {
1969− return function(m2) {
1970− var acc = mz;
1971− function g(k2) {
1972− return function(z) {
1973− return f(z)(k2)(m2[k2]);
1974− };
1975− }
1976− for (var k in m2) {
1977− if (hasOwnProperty.call(m2, k)) {
1978− acc = bind4(acc)(g(k));
1979− }
1980− }
1981− return acc;
1982− };
1983− };
1984− };
1985− }
1986− function _lookup(no, yes, k, m2) {
1987− return k in m2 ? yes(m2[k]) : no;
1988− }
1989− function toArrayWithKey(f) {
1990− return function(m2) {
1991− var r = [];
1992− for (var k in m2) {
1993− if (hasOwnProperty.call(m2, k)) {
1994− r.push(f(k)(m2[k]));
1995− }
1996− }
1997− return r;
1998− };
1999− }
2000− var keys = Object.keys || toArrayWithKey(function(k) {
2001− return function() {
2002− return k;
2003− };
2004− });
2005−
2006− // output/Foreign.Object.ST/foreign.js
2007− var newImpl = function() {
2008− return {};
2009− };
2010− function poke2(k) {
2011− return function(v) {
2012− return function(m2) {
2013− return function() {
2014− m2[k] = v;
2015− return m2;
2016− };
2017− };
2018− };
2019− }
2020−
2021− // output/Foreign.Object/index.js
2022− var bindFlipped2 = /* @__PURE__ */ bindFlipped(bindST);
2023− var foldr2 = /* @__PURE__ */ foldr(foldableArray);
2024− var identity4 = /* @__PURE__ */ identity(categoryFn);
2025− var values = /* @__PURE__ */ toArrayWithKey(function(v) {
2026− return function(v1) {
2027− return v1;
2028− };
2029− });
2030− var thawST = _copyST;
2031− var singleton2 = function(k) {
2032− return function(v) {
2033− return runST(bindFlipped2(poke2(k)(v))(newImpl));
2034− };
2035− };
2036− var mutate = function(f) {
2037− return function(m2) {
2038− return runST(function __do() {
2039− var s = thawST(m2)();
2040− f(s)();
2041− return s;
2042− });
2043− };
2044− };
2045− var mapWithKey = function(f) {
2046− return function(m2) {
2047− return _mapWithKey(m2, f);
2048− };
2049− };
2050− var insert = function(k) {
2051− return function(v) {
2052− return mutate(poke2(k)(v));
2053− };
2054− };
2055− var functorObject = {
2056− map: function(f) {
2057− return function(m2) {
2058− return _fmapObject(m2, f);
2059− };
2060− }
2061− };
2062− var functorWithIndexObject = {
2063− mapWithIndex: mapWithKey,
2064− Functor0: function() {
2065− return functorObject;
2066− }
2067− };
2068− var foldM = function(dictMonad) {
2069− var bind1 = bind(dictMonad.Bind1());
2070− var pure1 = pure(dictMonad.Applicative0());
2071− return function(f) {
2072− return function(z) {
2073− return _foldM(bind1)(f)(pure1(z));
2074− };
2075− };
2076− };
2077− var foldM1 = /* @__PURE__ */ foldM(monadST);
2078− var union = function(m2) {
2079− return mutate(function(s) {
2080− return foldM1(function(s$prime) {
2081− return function(k) {
2082− return function(v) {
2083− return poke2(k)(v)(s$prime);
2084− };
2085− };
2086− })(s)(m2);
2087− });
2088− };
2089− var unionWith = function(f) {
2090− return function(m1) {
2091− return function(m2) {
2092− return mutate(function(s1) {
2093− return foldM1(function(s2) {
2094− return function(k) {
2095− return function(v1) {
2096− return poke2(k)(_lookup(v1, function(v2) {
2097− return f(v1)(v2);
2098− }, k, m2))(s2);
2099− };
2100− };
2101− })(s1)(m1);
2102− })(m2);
2103− };
2104− };
2105− };
2106− var semigroupObject = function(dictSemigroup) {
2107− return {
2108− append: unionWith(append(dictSemigroup))
2109− };
2110− };
2111− var monoidObject = function(dictSemigroup) {
2112− var semigroupObject1 = semigroupObject(dictSemigroup);
2113− return {
2114− mempty: empty2,
2115− Semigroup0: function() {
2116− return semigroupObject1;
2117− }
2118− };
2119− };
2120− var fold2 = /* @__PURE__ */ _foldM(applyFlipped);
2121− var foldMap2 = function(dictMonoid) {
2122− var append1 = append(dictMonoid.Semigroup0());
2123− var mempty6 = mempty(dictMonoid);
2124− return function(f) {
2125− return fold2(function(acc) {
2126− return function(k) {
2127− return function(v) {
2128− return append1(acc)(f(k)(v));
2129− };
2130− };
2131− })(mempty6);
2132− };
2133− };
2134− var foldableObject = {
2135− foldl: function(f) {
2136− return fold2(function(z) {
2137− return function(v) {
2138− return f(z);
2139− };
2140− });
2141− },
2142− foldr: function(f) {
2143− return function(z) {
2144− return function(m2) {
2145− return foldr2(f)(z)(values(m2));
2146− };
2147− };
2148− },
2149− foldMap: function(dictMonoid) {
2150− var foldMap1 = foldMap2(dictMonoid);
2151− return function(f) {
2152− return foldMap1($$const(f));
2153− };
2154− }
2155− };
2156− var foldableWithIndexObject = {
2157− foldlWithIndex: function(f) {
2158− return fold2(flip(f));
2159− },
2160− foldrWithIndex: function(f) {
2161− return function(z) {
2162− return function(m2) {
2163− return foldr2(uncurry(f))(z)(toArrayWithKey(Tuple.create)(m2));
2164− };
2165− };
2166− },
2167− foldMapWithIndex: function(dictMonoid) {
2168− return foldMap2(dictMonoid);
2169− },
2170− Foldable0: function() {
2171− return foldableObject;
2172− }
2173− };
2174− var traversableWithIndexObject = {
2175− traverseWithIndex: function(dictApplicative) {
2176− var Apply0 = dictApplicative.Apply0();
2177− var apply2 = apply(Apply0);
2178− var map4 = map(Apply0.Functor0());
2179− var pure1 = pure(dictApplicative);
2180− return function(f) {
2181− return function(ms) {
2182− return fold2(function(acc) {
2183− return function(k) {
2184− return function(v) {
2185− return apply2(map4(flip(insert(k)))(acc))(f(k)(v));
2186− };
2187− };
2188− })(pure1(empty2))(ms);
2189− };
2190− };
2191− },
2192− FunctorWithIndex0: function() {
2193− return functorWithIndexObject;
2194− },
2195− FoldableWithIndex1: function() {
2196− return foldableWithIndexObject;
2197− },
2198− Traversable2: function() {
2199− return traversableObject;
2200− }
2201− };
2202− var traversableObject = {
2203− traverse: function(dictApplicative) {
2204− var $96 = traverseWithIndex(traversableWithIndexObject)(dictApplicative);
2205− return function($97) {
2206− return $96($$const($97));
2207− };
2208− },
2209− sequence: function(dictApplicative) {
2210− return traverse(traversableObject)(dictApplicative)(identity4);
2211− },
2212− Functor0: function() {
2213− return functorObject;
2214− },
2215− Foldable1: function() {
2216− return foldableObject;
2217− }
2218− };
2219−
2220− // output/Record.Unsafe.Union/foreign.js
2221− function unsafeUnionFn(r1, r2) {
2222− var copy = {};
2223− for (var k1 in r2) {
2224− if ({}.hasOwnProperty.call(r2, k1)) {
2225− copy[k1] = r2[k1];
2226− }
2227− }
2228− for (var k2 in r1) {
2229− if ({}.hasOwnProperty.call(r1, k2)) {
2230− copy[k2] = r1[k2];
2231− }
2232− }
2233− return copy;
2234− }
2235−
2236− // output/Record.Unsafe.Union/index.js
2237− var unsafeUnion = /* @__PURE__ */ runFn2(unsafeUnionFn);
2238−
2239− // output/Plum.View/index.js
2240− var append2 = /* @__PURE__ */ append(semigroupArray);
2241− var semigroupRecord3 = /* @__PURE__ */ semigroupRecord();
2242− var childrenIsSymbol = {
2243− reflectSymbol: function() {
2244− return "children";
2245− }
2246− };
2247− var downIsSymbol = {
2248− reflectSymbol: function() {
2249− return "down";
2250− }
2251− };
2252− var hoverIsSymbol = {
2253− reflectSymbol: function() {
2254− return "hover";
2255− }
2256− };
2257− var meatIsSymbol = {
2258− reflectSymbol: function() {
2259− return "meat";
2260− }
2261− };
2262− var nervesIsSymbol = {
2263− reflectSymbol: function() {
2264− return "nerves";
2265− }
2266− };
2267− var semigroupRecordCons2 = /* @__PURE__ */ semigroupRecordCons(childrenIsSymbol)()(/* @__PURE__ */ semigroupRecordCons(downIsSymbol)()(/* @__PURE__ */ semigroupRecordCons(hoverIsSymbol)()(/* @__PURE__ */ semigroupRecordCons(meatIsSymbol)()(/* @__PURE__ */ semigroupRecordCons(nervesIsSymbol)()(semigroupRecordNil)(semigroupArray))(semigroupArray))(semigroupArray))(semigroupArray));
2268− var show2 = /* @__PURE__ */ show(showInt);
2269− var monoidRecord2 = /* @__PURE__ */ monoidRecord();
2270− var monoidRecordCons2 = /* @__PURE__ */ monoidRecordCons(downIsSymbol);
2271− var monoidObject2 = /* @__PURE__ */ monoidObject(/* @__PURE__ */ semigroupRecord3(/* @__PURE__ */ semigroupRecordCons({
2272− reflectSymbol: function() {
2273− return "key";
2274− }
2275− })()(/* @__PURE__ */ semigroupRecordCons({
2276− reflectSymbol: function() {
2277− return "value";
2278− }
2279− })()(semigroupRecordNil)(semigroupString))(semigroupString)));
2280− var monoidRecordCons1 = /* @__PURE__ */ monoidRecordCons(hoverIsSymbol);
2281− var monoidRecordCons22 = /* @__PURE__ */ monoidRecordCons(meatIsSymbol);
2282− var mempty2 = /* @__PURE__ */ mempty(monoidArray);
2283− var monoidRecordCons3 = /* @__PURE__ */ monoidRecordCons(childrenIsSymbol);
2284− var monoidRecordCons4 = /* @__PURE__ */ monoidRecordCons2(monoidArray)()(/* @__PURE__ */ monoidRecordCons1(monoidArray)()(/* @__PURE__ */ monoidRecordCons22(monoidArray)()(/* @__PURE__ */ monoidRecordCons(nervesIsSymbol)(monoidArray)()(monoidRecordNil))));
2285− var mempty1 = /* @__PURE__ */ mempty(/* @__PURE__ */ monoidRecord2(/* @__PURE__ */ monoidRecordCons3(monoidArray)()(monoidRecordCons4)));
2286− var foldMap3 = /* @__PURE__ */ foldMap2(monoidString);
2287− var show1 = /* @__PURE__ */ show(showNumber);
2288− var mempty22 = /* @__PURE__ */ mempty(monoidUnit);
2289− var intercalate3 = /* @__PURE__ */ intercalate2(monoidString);
2290− var map2 = /* @__PURE__ */ map(/* @__PURE__ */ functorWriterT(functorIdentity));
2291− var map1 = /* @__PURE__ */ map(functorArray);
2292− var Top = /* @__PURE__ */ function() {
2293− function Top2() {
2294− }
2295− ;
2296− Top2.value = new Top2();
2297− return Top2;
2298− }();
2299− var Right2 = /* @__PURE__ */ function() {
2300− function Right3() {
2301− }
2302− ;
2303− Right3.value = new Right3();
2304− return Right3;
2305− }();
2306− var Bottom = /* @__PURE__ */ function() {
2307− function Bottom2() {
2308− }
2309− ;
2310− Bottom2.value = new Bottom2();
2311− return Bottom2;
2312− }();
2313− var Left2 = /* @__PURE__ */ function() {
2314− function Left3() {
2315− }
2316− ;
2317− Left3.value = new Left3();
2318− return Left3;
2319− }();
2320− var Px = /* @__PURE__ */ function() {
2321− function Px2(value0) {
2322− this.value0 = value0;
2323− }
2324− ;
2325− Px2.create = function(value0) {
2326− return new Px2(value0);
2327− };
2328− return Px2;
2329− }();
2330− var Fill = /* @__PURE__ */ function() {
2331− function Fill2() {
2332− }
2333− ;
2334− Fill2.value = new Fill2();
2335− return Fill2;
2336− }();
2337− var Fit = /* @__PURE__ */ function() {
2338− function Fit2() {
2339− }
2340− ;
2341− Fit2.value = new Fit2();
2342− return Fit2;
2343− }();
2344− var Max2 = /* @__PURE__ */ function() {
2345− function Max3(value0, value1) {
2346− this.value0 = value0;
2347− this.value1 = value1;
2348− }
2349− ;
2350− Max3.create = function(value0) {
2351− return function(value1) {
2352− return new Max3(value0, value1);
2353− };
2354− };
2355− return Max3;
2356− }();
2357− var Min2 = /* @__PURE__ */ function() {
2358− function Min3(value0, value1) {
2359− this.value0 = value0;
2360− this.value1 = value1;
2361− }
2362− ;
2363− Min3.create = function(value0) {
2364− return function(value1) {
2365− return new Min3(value0, value1);
2366− };
2367− };
2368− return Min3;
2369− }();
2370− var X = /* @__PURE__ */ function() {
2371− function X2() {
2372− }
2373− ;
2374− X2.value = new X2();
2375− return X2;
2376− }();
2377− var Y = /* @__PURE__ */ function() {
2378− function Y2() {
2379− }
2380− ;
2381− Y2.value = new Y2();
2382− return Y2;
2383− }();
2384− var Grid = /* @__PURE__ */ function() {
2385− function Grid2() {
2386− }
2387− ;
2388− Grid2.value = new Grid2();
2389− return Grid2;
2390− }();
2391− var Flexbox = /* @__PURE__ */ function() {
2392− function Flexbox2(value0) {
2393− this.value0 = value0;
2394− }
2395− ;
2396− Flexbox2.create = function(value0) {
2397− return new Flexbox2(value0);
2398− };
2399− return Flexbox2;
2400− }();
2401− var Generic = /* @__PURE__ */ function() {
2402− function Generic2() {
2403− }
2404− ;
2405− Generic2.value = new Generic2();
2406− return Generic2;
2407− }();
2408− var Span = /* @__PURE__ */ function() {
2409− function Span2() {
2410− }
2411− ;
2412− Span2.value = new Span2();
2413− return Span2;
2414− }();
2415− var Start = /* @__PURE__ */ function() {
2416− function Start2() {
2417− }
2418− ;
2419− Start2.value = new Start2();
2420− return Start2;
2421− }();
2422− var Center = /* @__PURE__ */ function() {
2423− function Center2() {
2424− }
2425− ;
2426− Center2.value = new Center2();
2427− return Center2;
2428− }();
2429− var End = /* @__PURE__ */ function() {
2430− function End2() {
2431− }
2432− ;
2433− End2.value = new End2();
2434− return End2;
2435− }();
2436− var Spacing = /* @__PURE__ */ function() {
2437− function Spacing2(value0, value1) {
2438− this.value0 = value0;
2439− this.value1 = value1;
2440− }
2441− ;
2442− Spacing2.create = function(value0) {
2443− return function(value1) {
2444− return new Spacing2(value0, value1);
2445− };
2446− };
2447− return Spacing2;
2448− }();
2449− var Explain = /* @__PURE__ */ function() {
2450− function Explain2() {
2451− }
2452− ;
2453− Explain2.value = new Explain2();
2454− return Explain2;
2455− }();
2456− var Align = /* @__PURE__ */ function() {
2457− function Align2(value0, value1) {
2458− this.value0 = value0;
2459− this.value1 = value1;
2460− }
2461− ;
2462− Align2.create = function(value0) {
2463− return function(value1) {
2464− return new Align2(value0, value1);
2465− };
2466− };
2467− return Align2;
2468− }();
2469− var Width = /* @__PURE__ */ function() {
2470− function Width2(value0) {
2471− this.value0 = value0;
2472− }
2473− ;
2474− Width2.create = function(value0) {
2475− return new Width2(value0);
2476− };
2477− return Width2;
2478− }();
2479− var Height = /* @__PURE__ */ function() {
2480− function Height2(value0) {
2481− this.value0 = value0;
2482− }
2483− ;
2484− Height2.create = function(value0) {
2485− return new Height2(value0);
2486− };
2487− return Height2;
2488− }();
2489− var Wrapped = /* @__PURE__ */ function() {
2490− function Wrapped2() {
2491− }
2492− ;
2493− Wrapped2.value = new Wrapped2();
2494− return Wrapped2;
2495− }();
2496− var BackgroundColor = /* @__PURE__ */ function() {
2497− function BackgroundColor2(value0) {
2498− this.value0 = value0;
2499− }
2500− ;
2501− BackgroundColor2.create = function(value0) {
2502− return new BackgroundColor2(value0);
2503− };
2504− return BackgroundColor2;
2505− }();
2506− var Padding = /* @__PURE__ */ function() {
2507− function Padding2(value0, value1) {
2508− this.value0 = value0;
2509− this.value1 = value1;
2510− }
2511− ;
2512− Padding2.create = function(value0) {
2513− return function(value1) {
2514− return new Padding2(value0, value1);
2515− };
2516− };
2517− return Padding2;
2518− }();
2519− var Spread = /* @__PURE__ */ function() {
2520− function Spread2() {
2521− }
2522− ;
2523− Spread2.value = new Spread2();
2524− return Spread2;
2525− }();
2526− var Opacity = /* @__PURE__ */ function() {
2527− function Opacity2(value0) {
2528− this.value0 = value0;
2529− }
2530− ;
2531− Opacity2.create = function(value0) {
2532− return new Opacity2(value0);
2533− };
2534− return Opacity2;
2535− }();
2536− var Pointer = /* @__PURE__ */ function() {
2537− function Pointer2() {
2538− }
2539− ;
2540− Pointer2.value = new Pointer2();
2541− return Pointer2;
2542− }();
2543− var Move = /* @__PURE__ */ function() {
2544− function Move2(value0) {
2545− this.value0 = value0;
2546− }
2547− ;
2548− Move2.create = function(value0) {
2549− return new Move2(value0);
2550− };
2551− return Move2;
2552− }();
2553− var Clip = /* @__PURE__ */ function() {
2554− function Clip2(value0) {
2555− this.value0 = value0;
2556− }
2557− ;
2558− Clip2.create = function(value0) {
2559− return new Clip2(value0);
2560− };
2561− return Clip2;
2562− }();
2563− var UI = /* @__PURE__ */ function() {
2564− function UI2(value0, value1) {
2565− this.value0 = value0;
2566− this.value1 = value1;
2567− }
2568− ;
2569− UI2.create = function(value0) {
2570− return function(value1) {
2571− return new UI2(value0, value1);
2572− };
2573− };
2574− return UI2;
2575− }();
2576− var Column = /* @__PURE__ */ function() {
2577− function Column2(value0) {
2578− this.value0 = value0;
2579− }
2580− ;
2581− Column2.create = function(value0) {
2582− return new Column2(value0);
2583− };
2584− return Column2;
2585− }();
2586− var Row = /* @__PURE__ */ function() {
2587− function Row2(value0) {
2588− this.value0 = value0;
2589− }
2590− ;
2591− Row2.create = function(value0) {
2592− return new Row2(value0);
2593− };
2594− return Row2;
2595− }();
2596− var Stack = /* @__PURE__ */ function() {
2597− function Stack2(value0) {
2598− this.value0 = value0;
2599− }
2600− ;
2601− Stack2.create = function(value0) {
2602− return new Stack2(value0);
2603− };
2604− return Stack2;
2605− }();
2606− var Wrapper = /* @__PURE__ */ function() {
2607− function Wrapper2(value0) {
2608− this.value0 = value0;
2609− }
2610− ;
2611− Wrapper2.create = function(value0) {
2612− return new Wrapper2(value0);
2613− };
2614− return Wrapper2;
2615− }();
2616− var Text = /* @__PURE__ */ function() {
2617− function Text2(value0) {
2618− this.value0 = value0;
2619− }
2620− ;
2621− Text2.create = function(value0) {
2622− return new Text2(value0);
2623− };
2624− return Text2;
2625− }();
2626− var Link = /* @__PURE__ */ function() {
2627− function Link2(value0, value1, value22) {
2628− this.value0 = value0;
2629− this.value1 = value1;
2630− this.value2 = value22;
2631− }
2632− ;
2633− Link2.create = function(value0) {
2634− return function(value1) {
2635− return function(value22) {
2636− return new Link2(value0, value1, value22);
2637− };
2638− };
2639− };
2640− return Link2;
2641− }();
2642− var Download = /* @__PURE__ */ function() {
2643− function Download2(value0, value1, value22) {
2644− this.value0 = value0;
2645− this.value1 = value1;
2646− this.value2 = value22;
2647− }
2648− ;
2649− Download2.create = function(value0) {
2650− return function(value1) {
2651− return function(value22) {
2652− return new Download2(value0, value1, value22);
2653− };
2654− };
2655− };
2656− return Download2;
2657− }();
2658− var Image2 = /* @__PURE__ */ function() {
2659− function Image3(value0, value1) {
2660− this.value0 = value0;
2661− this.value1 = value1;
2662− }
2663− ;
2664− Image3.create = function(value0) {
2665− return function(value1) {
2666− return new Image3(value0, value1);
2667− };
2668− };
2669− return Image3;
2670− }();
2671− var None = /* @__PURE__ */ function() {
2672− function None3() {
2673− }
2674− ;
2675− None3.value = new None3();
2676− return None3;
2677− }();
2678− var semigroupSkinGrowth = {
2679− append: function(v) {
2680− return function(v1) {
2681− return {
2682− meat: union(v.meat)(v1.meat),
2683− hover: union(v.hover)(v1.hover),
2684− down: union(v.down)(v1.down)
2685− };
2686− };
2687− }
2688− };
2689− var bindWriterT2 = /* @__PURE__ */ bindWriterT(semigroupSkinGrowth)(bindIdentity);
2690− var discard2 = /* @__PURE__ */ discard(discardUnit)(bindWriterT2);
2691− var bind2 = /* @__PURE__ */ bind(bindWriterT2);
2692− var append22 = /* @__PURE__ */ append(/* @__PURE__ */ semigroupWriterT(applyIdentity)(semigroupSkinGrowth)(semigroupArray));
2693− var semigroupMutation = {
2694− append: function(v) {
2695− return function(v1) {
2696− return {
2697− extraSkin: append2(v.extraSkin)(v1.extraSkin)
2698− };
2699− };
2700− }
2701− };
2702− var semigroupGenericUI = function(dictSemigroup) {
2703− var append3 = append(semigroupRecord3(semigroupRecordCons2(dictSemigroup)));
2704− return function(dictSemigroup1) {
2705− var append4 = append(dictSemigroup1);
2706− return {
2707− append: function(v) {
2708− return function(v1) {
2709− return new UI(append3(v.value0)(v1.value0), append4(v.value1)(v1.value1));
2710− };
2711− }
2712− };
2713− };
2714− };
2715− var renderableSide = {
2716− render: function(v) {
2717− if (v instanceof Top) {
2718− return "top";
2719− }
2720− ;
2721− if (v instanceof Right2) {
2722− return "right";
2723− }
2724− ;
2725− if (v instanceof Bottom) {
2726− return "bottom";
2727− }
2728− ;
2729− if (v instanceof Left2) {
2730− return "left";
2731− }
2732− ;
2733− throw new Error("Failed pattern match at Plum.View (line 263, column 12 - line 267, column 19): " + [v.constructor.name]);
2734− },
2735− renderKey: function(v) {
2736− if (v instanceof Top) {
2737− return "top";
2738− }
2739− ;
2740− if (v instanceof Right2) {
2741− return "right";
2742− }
2743− ;
2744− if (v instanceof Bottom) {
2745− return "bottom";
2746− }
2747− ;
2748− if (v instanceof Left2) {
2749− return "left";
2750− }
2751− ;
2752− throw new Error("Failed pattern match at Plum.View (line 268, column 15 - line 272, column 19): " + [v.constructor.name]);
2753− }
2754− };
2755− var renderableColor = {
2756− render: function(v) {
2757− return "rgb(" + (show2(v.r) + ("," + (show2(v.g) + ("," + (show2(v.b) + ("," + (show2(v.a) + "%)")))))));
2758− },
2759− renderKey: function(v) {
2760− return show2(v.r) + ("-" + (show2(v.g) + ("-" + (show2(v.b) + ("-" + show2(v.a))))));
2761− }
2762− };
2763− var monoidSkinGrowth = {
2764− mempty: /* @__PURE__ */ mempty(/* @__PURE__ */ monoidRecord2(/* @__PURE__ */ monoidRecordCons2(monoidObject2)()(/* @__PURE__ */ monoidRecordCons1(monoidObject2)()(/* @__PURE__ */ monoidRecordCons22(monoidObject2)()(monoidRecordNil))))),
2765− Semigroup0: function() {
2766− return semigroupSkinGrowth;
2767− }
2768− };
2769− var tell2 = /* @__PURE__ */ tell(/* @__PURE__ */ monadTellWriterT(monoidSkinGrowth)(monadIdentity));
2770− var applicativeWriterT2 = /* @__PURE__ */ applicativeWriterT(monoidSkinGrowth)(applicativeIdentity);
2771− var pure2 = /* @__PURE__ */ pure(applicativeWriterT2);
2772− var mempty3 = /* @__PURE__ */ mempty(/* @__PURE__ */ monoidWriterT(applicativeIdentity)(monoidSkinGrowth)(monoidArray));
2773− var traverse2 = /* @__PURE__ */ traverse(traversableArray)(applicativeWriterT2);
2774− var traverseWithIndex2 = /* @__PURE__ */ traverseWithIndex(traversableWithIndexObject)(applicativeWriterT2);
2775− var monoidMutation = {
2776− mempty: {
2777− extraSkin: mempty2
2778− },
2779− Semigroup0: function() {
2780− return semigroupMutation;
2781− }
2782− };
2783− var mempty4 = /* @__PURE__ */ mempty(monoidMutation);
2784− var monoidGenericUI = function(dictMonoid) {
2785− var mempty52 = mempty(monoidRecord2(monoidRecordCons3(dictMonoid)()(monoidRecordCons4)));
2786− var semigroupGenericUI1 = semigroupGenericUI(dictMonoid.Semigroup0());
2787− return function(dictMonoid1) {
2788− var semigroupGenericUI2 = semigroupGenericUI1(dictMonoid1.Semigroup0());
2789− return {
2790− mempty: new UI(mempty52, mempty(dictMonoid1)),
2791− Semigroup0: function() {
2792− return semigroupGenericUI2;
2793− }
2794− };
2795− };
2796− };
2797− var functorGenericUI = {
2798− map: function(f) {
2799− return function(v) {
2800− return new UI(v.value0, f(v.value1));
2801− };
2802− }
2803− };
2804− var applyGenericUI = function(dictMonoid) {
2805− var append3 = append(semigroupRecord3(semigroupRecordCons2(dictMonoid.Semigroup0())));
2806− return {
2807− apply: function(v) {
2808− return function(v1) {
2809− return new UI(append3(v.value0)(v1.value0), v.value1(v1.value1));
2810− };
2811− },
2812− Functor0: function() {
2813− return functorGenericUI;
2814− }
2815− };
2816− };
2817− var bindGenericUI = function(dictMonoid) {
2818− var append3 = append(semigroupRecord3(semigroupRecordCons2(dictMonoid.Semigroup0())));
2819− var applyGenericUI1 = applyGenericUI(dictMonoid);
2820− return {
2821− bind: function(v) {
2822− return function(f) {
2823− var v1 = f(v.value1);
2824− return new UI(append3(v.value0)(v1.value0), v1.value1);
2825− };
2826− },
2827− Apply0: function() {
2828− return applyGenericUI1;
2829− }
2830− };
2831− };
2832− var text = function(s) {
2833− return function(v) {
2834− return new UI({
2835− nerves: mempty1.nerves,
2836− meat: mempty1.meat,
2837− hover: mempty1.hover,
2838− down: mempty1.down,
2839− children: [new Tuple({
2840− meat: v.value0.meat,
2841− nerves: v.value0.nerves,
2842− hover: v.value0.hover,
2843− down: v.value0.down
2844− }, new Text(s))]
2845− }, v.value1);
2846− };
2847− };
2848− var styleSkinGrowth = function(v) {
2849− return foldMap3(function(className) {
2850− return function(v1) {
2851− return "." + (className + ("{" + (v1.key + (":" + (v1.value + ";}")))));
2852− };
2853− })(v.meat) + (foldMap3(function(className) {
2854− return function(v1) {
2855− return "." + (className + ("{" + (v1.key + (":" + (v1.value + ";}")))));
2856− };
2857− })(v.hover) + foldMap3(function(className) {
2858− return function(v1) {
2859− return "." + (className + ("{" + (v1.key + (":" + (v1.value + ";}")))));
2860− };
2861− })(v.down));
2862− };
2863− var sk = function(cName) {
2864− return function(key) {
2865− return function(value12) {
2866− return discard2(tell2({
2867− meat: singleton2(cName)({
2868− key,
2869− value: value12
2870− }),
2871− hover: empty2,
2872− down: empty2
2873− }))(function() {
2874− return pure2([cName]);
2875− });
2876− };
2877− };
2878− };
2879− var rgb = function(r) {
2880− return function(g) {
2881− return function(b) {
2882− return {
2883− r: round2(r * 255),
2884− g: round2(g * 255),
2885− b: round2(b * 255),
2886− a: 100
2887− };
2888− };
2889− };
2890− };
2891− var renderKey = function(dict) {
2892− return dict.renderKey;
2893− };
2894− var renderKey1 = /* @__PURE__ */ renderKey(renderableColor);
2895− var renderKey2 = /* @__PURE__ */ renderKey(renderableSide);
2896− var render = function(dict) {
2897− return dict.render;
2898− };
2899− var render1 = /* @__PURE__ */ render(renderableColor);
2900− var render2 = /* @__PURE__ */ render(renderableSide);
2901− var renderableLength = {
2902− render: function(v) {
2903− if (v instanceof Px) {
2904− return show2(v.value0) + "px";
2905− }
2906− ;
2907− if (v instanceof Fit) {
2908− return "fit-content";
2909− }
2910− ;
2911− if (v instanceof Fill) {
2912− return "100%";
2913− }
2914− ;
2915− if (v instanceof Max2) {
2916− return "max(" + (show2(v.value0) + ("px," + (render(renderableLength)(v.value1) + ")")));
2917− }
2918− ;
2919− if (v instanceof Min2) {
2920− return "min(" + (show2(v.value0) + ("px," + (render(renderableLength)(v.value1) + ")")));
2921− }
2922− ;
2923− throw new Error("Failed pattern match at Plum.View (line 362, column 12 - line 367, column 62): " + [v.constructor.name]);
2924− },
2925− renderKey: function(v) {
2926− if (v instanceof Px) {
2927− return show2(v.value0);
2928− }
2929− ;
2930− if (v instanceof Fit) {
2931− return "fit-content";
2932− }
2933− ;
2934− if (v instanceof Fill) {
2935− return "fill";
2936− }
2937− ;
2938− if (v instanceof Max2) {
2939− return "max-" + (show2(v.value0) + ("-" + renderKey(renderableLength)(v.value1)));
2940− }
2941− ;
2942− if (v instanceof Min2) {
2943− return "min-" + (show2(v.value0) + ("-" + renderKey(renderableLength)(v.value1)));
2944− }
2945− ;
2946− throw new Error("Failed pattern match at Plum.View (line 368, column 15 - line 373, column 56): " + [v.constructor.name]);
2947− }
2948− };
2949− var renderKey3 = /* @__PURE__ */ renderKey(renderableLength);
2950− var render3 = /* @__PURE__ */ render(renderableLength);
2951− var skin = function(ctx) {
2952− return function(v) {
2953− if (v instanceof Spacing) {
2954− return sk("spacing-" + (show2(v.value0) + ("-" + show2(v.value1))))("gap")(show2(v.value0) + ("px " + (show2(v.value1) + "px")));
2955− }
2956− ;
2957− if (v instanceof Explain) {
2958− return sk("explain")("border")("dashed magenta");
2959− }
2960− ;
2961− if (v instanceof Align) {
2962− if (ctx instanceof Generic) {
2963− return mempty3;
2964− }
2965− ;
2966− if (ctx instanceof Span) {
2967− return mempty3;
2968− }
2969− ;
2970− if (ctx instanceof Grid) {
2971− var v1 = function() {
2972− if (v.value1 instanceof Start) {
2973− return "start";
2974− }
2975− ;
2976− if (v.value1 instanceof Center) {
2977− return "center";
2978− }
2979− ;
2980− if (v.value1 instanceof End) {
2981− return "end";
2982− }
2983− ;
2984− throw new Error("Failed pattern match at Plum.View (line 311, column 13 - line 314, column 27): " + [v.value1.constructor.name]);
2985− }();
2986− var k = function() {
2987− if (v.value0 instanceof X) {
2988− return "justify-items";
2989− }
2990− ;
2991− if (v.value0 instanceof Y) {
2992− return "align-items";
2993− }
2994− ;
2995− throw new Error("Failed pattern match at Plum.View (line 306, column 13 - line 308, column 33): " + [v.value0.constructor.name]);
2996− }();
2997− return sk("align-grid-" + (k + ("-" + v1)))(k)(v1);
2998− }
2999− ;
3000− if (ctx instanceof Flexbox) {
3001− var v1 = function() {
3002− if (v.value1 instanceof Start) {
3003− return "flex-start";
3004− }
3005− ;
3006− if (v.value1 instanceof Center) {
3007− return "center";
3008− }
3009− ;
3010− if (v.value1 instanceof End) {
3011− return "flex-end";
3012− }
3013− ;
3014− throw new Error("Failed pattern match at Plum.View (line 330, column 13 - line 333, column 32): " + [v.value1.constructor.name]);
3015− }();
3016− var k = function() {
3017− var v2 = new Tuple(ctx.value0, v.value0);
3018− if (v2.value0 instanceof X && v2.value1 instanceof X) {
3019− return "justify-content";
3020− }
3021− ;
3022− if (v2.value0 instanceof X && v2.value1 instanceof Y) {
3023− return "align-items";
3024− }
3025− ;
3026− if (v2.value0 instanceof Y && v2.value1 instanceof X) {
3027− return "align-items";
3028− }
3029− ;
3030− if (v2.value0 instanceof Y && v2.value1 instanceof Y) {
3031− return "justify-content";
3032− }
3033− ;
3034− throw new Error("Failed pattern match at Plum.View (line 322, column 13 - line 326, column 42): " + [v2.constructor.name]);
3035− }();
3036− return sk("align-flexbox-" + (k + ("-" + v1)))(k)(v1);
3037− }
3038− ;
3039− throw new Error("Failed pattern match at Plum.View (line 300, column 26 - line 336, column 51): " + [ctx.constructor.name]);
3040− }
3041− ;
3042− if (v instanceof Width) {
3043− return sk("width-" + renderKey3(v.value0))("width")(render3(v.value0));
3044− }
3045− ;
3046− if (v instanceof Height) {
3047− return sk("height-" + renderKey3(v.value0))("height")(render3(v.value0));
3048− }
3049− ;
3050− if (v instanceof Wrapped) {
3051− if (ctx instanceof Flexbox) {
3052− return sk("wrapped")("flex-wrap")("wrap");
3053− }
3054− ;
3055− return pure2([]);
3056− }
3057− ;
3058− if (v instanceof BackgroundColor) {
3059− return sk("bg-color-" + renderKey1(v.value0))("background-color")(render1(v.value0));
3060− }
3061− ;
3062− if (v instanceof Padding) {
3063− return sk("padding-" + (renderKey2(v.value0) + ("-" + show2(v.value1))))("padding-" + render2(v.value0))(show2(v.value1) + "px");
3064− }
3065− ;
3066− if (v instanceof Spread) {
3067− if (ctx instanceof Flexbox) {
3068− return sk("spread")("justify-content")("space-between");
3069− }
3070− ;
3071− return pure2([]);
3072− }
3073− ;
3074− if (v instanceof Opacity) {
3075− return sk("opacity-" + show1(v.value0))("opacity")(show1(v.value0));
3076− }
3077− ;
3078− if (v instanceof Pointer) {
3079− return sk("pointer")("cursor")("pointer");
3080− }
3081− ;
3082− if (v instanceof Move) {
3083− return sk("move-" + (show2(v.value0.x) + ("-" + show2(v.value0.y))))("transform")("translate(" + (show2(v.value0.x) + ("px, " + (show2(v.value0.y) + "px)"))));
3084− }
3085− ;
3086− if (v instanceof Clip && v.value0 instanceof X) {
3087− return sk("clip-x")("overflow-x")("hidden");
3088− }
3089− ;
3090− if (v instanceof Clip && v.value0 instanceof Y) {
3091− return sk("clip-y")("overflow-y")("hidden");
3092− }
3093− ;
3094− throw new Error("Failed pattern match at Plum.View (line 297, column 12 - line 355, column 46): " + [v.constructor.name]);
3095− };
3096− };
3097− var onMouseDown = function(dictMonoid) {
3098− var mempty52 = mempty(monoidRecord2(monoidRecordCons3(dictMonoid)()(monoidRecordCons4)));
3099− return function(v) {
3100− return new UI({
3101− nerves: mempty52.nerves,
3102− meat: mempty52.meat,
3103− hover: mempty52.hover,
3104− children: mempty52.children,
3105− down: v.value0.meat
3106− }, v.value1);
3107− };
3108− };
3109− var onHover = function(dictMonoid) {
3110− var mempty52 = mempty(monoidRecord2(monoidRecordCons3(dictMonoid)()(monoidRecordCons4)));
3111− return function(v) {
3112− return new UI({
3113− nerves: mempty52.nerves,
3114− meat: mempty52.meat,
3115− down: mempty52.down,
3116− children: mempty52.children,
3117− hover: v.value0.meat
3118− }, v.value1);
3119− };
3120− };
3121− var m = function(dictMonoid) {
3122− var mempty52 = mempty(monoidRecord2(monoidRecordCons3(dictMonoid)()(monoidRecordCons4)));
3123− return function(meat) {
3124− return new UI({
3125− nerves: mempty52.nerves,
3126− hover: mempty52.hover,
3127− down: mempty52.down,
3128− children: mempty52.children,
3129− meat: [meat]
3130− }, mempty22);
3131− };
3132− };
3133− var hWith = function(elem2) {
3134− return function(props) {
3135− return function(classes) {
3136− return function(children) {
3137− return h2(elem2)(unsafeUnion(props)({
3138− "class": intercalate3(" ")(classes)
3139− }))(children);
3140− };
3141− };
3142− };
3143− };
3144− var h3 = function(elem2) {
3145− return function(classes) {
3146− return function(children) {
3147− return h2(elem2)({
3148− "class": intercalate3(" ")(classes)
3149− })(children);
3150− };
3151− };
3152− };
3153− var growSkin = function(fire) {
3154− return function(v) {
3155− return function(v1) {
3156− var widthFill = [new Width(Fill.value), new Height(Fill.value)];
3157− var alignCenter = [new Align(X.value, Center.value), new Align(Y.value, Center.value)];
3158− var skn = function(ctx) {
3159− return bind2(map2(function($513) {
3160− return function(v2) {
3161− return append2(v2)(v.extraSkin);
3162− }(concat($513));
3163− })(traverse2(skin(ctx))(append2(v1.value0.meat)(append2(function() {
3164− if (ctx instanceof Span) {
3165− return mempty2;
3166− }
3167− ;
3168− if (ctx instanceof Grid) {
3169− return widthFill;
3170− }
3171− ;
3172− if (ctx instanceof Flexbox) {
3173− return widthFill;
3174− }
3175− ;
3176− if (ctx instanceof Generic) {
3177− return widthFill;
3178− }
3179− ;
3180− throw new Error("Failed pattern match at Plum.View (line 445, column 16 - line 449, column 35): " + [ctx.constructor.name]);
3181− }())(function() {
3182− if (ctx instanceof Grid) {
3183− return alignCenter;
3184− }
3185− ;
3186− if (ctx instanceof Flexbox) {
3187− return alignCenter;
3188− }
3189− ;
3190− if (ctx instanceof Span) {
3191− return mempty2;
3192− }
3193− ;
3194− if (ctx instanceof Generic) {
3195− return alignCenter;
3196− }
3197− ;
3198− throw new Error("Failed pattern match at Plum.View (line 450, column 16 - line 454, column 37): " + [ctx.constructor.name]);
3199− }())))))(function(meatClasses) {
3200− var v2 = runWriter(traverse2(skin(ctx))(v1.value0.hover));
3201− return bind2(traverseWithIndex2(function(key) {
3202− return function(val) {
3203− return tell2({
3204− meat: empty2,
3205− hover: singleton2(key + "-hover:hover")(val),
3206− down: empty2
3207− });
3208− };
3209− })(v2.value1.meat))(function() {
3210− var v3 = runWriter(traverse2(skin(ctx))(v1.value0.down));
3211− return bind2(traverseWithIndex2(function(key) {
3212− return function(val) {
3213− return tell2({
3214− meat: empty2,
3215− hover: empty2,
3216− down: singleton2(key + "-down:active")(val)
3217− });
3218− };
3219− })(v3.value1.meat))(function() {
3220− return pure2(append2(meatClasses)(append2(map1(function(v4) {
3221− return v4 + "-hover";
3222− })(concat(v2.value0)))(map1(function(v4) {
3223− return v4 + "-down";
3224− })(concat(v3.value0)))));
3225− });
3226− });
3227− });
3228− };
3229− if (v1.value1 instanceof Text) {
3230− return map2(function(c) {
3231− return h3("span")(c)([string(v1.value1.value0)]);
3232− })(skn(Span.value));
3233− }
3234− ;
3235− if (v1.value1 instanceof Wrapper) {
3236− return bind2(append22(skn(new Flexbox(X.value)))(append22(sk("display-flex")("display")("flex"))(sk("flex-direction-row")("flex-direction")("row"))))(function(classes) {
3237− return bind2(growSkin(fire)(mempty4)(v1.value1.value0))(function(x$prime) {
3238− return pure2(h3("div")(classes)([x$prime]));
3239− });
3240− });
3241− }
3242− ;
3243− if (v1.value1 instanceof Stack) {
3244− return bind2(append22(skn(Grid.value))(sk("display-grid")("display")("grid")))(function(classes) {
3245− return bind2(append22(sk("grid-row-1")("grid-row")("1"))(sk("grid-column-1")("grid-column")("1")))(function(extraSkin) {
3246− return bind2(traverse2(growSkin(fire)({
3247− extraSkin
3248− }))(v1.value1.value0))(function(children$prime) {
3249− return pure2(h3("div")(classes)(children$prime));
3250− });
3251− });
3252− });
3253− }
3254− ;
3255− if (v1.value1 instanceof Row) {
3256− return bind2(append22(skn(new Flexbox(X.value)))(append22(sk("display-flex")("display")("flex"))(sk("flex-direction-row")("flex-direction")("row"))))(function(classes) {
3257− return bind2(traverse2(growSkin(fire)(mempty4))(v1.value1.value0))(function(children$prime) {
3258− return pure2(h3("div")(classes)(children$prime));
3259− });
3260− });
3261− }
3262− ;
3263− if (v1.value1 instanceof Column) {
3264− return bind2(append22(skn(new Flexbox(Y.value)))(append22(sk("display-flex")("display")("flex"))(sk("flex-direction-column")("flex-direction")("column"))))(function(classes) {
3265− return bind2(traverse2(growSkin(fire)(mempty4))(v1.value1.value0))(function(children$prime) {
3266− return pure2(h3("div")(classes)(children$prime));
3267− });
3268− });
3269− }
3270− ;
3271− if (v1.value1 instanceof Link) {
3272− return bind2(append22(skn(new Flexbox(X.value)))(append22(sk("display-flex")("display")("flex"))(sk("flex-direction-row")("flex-direction")("row"))))(function(classes) {
3273− return bind2(growSkin(fire)(mempty4)(v1.value1.value2))(function(child$prime) {
3274− return pure2(hWith("a")({
3275− href: v1.value1.value0,
3276− rel: "noopener noreferrer",
3277− target: function() {
3278− if (v1.value1.value1.newTab) {
3279− return "_blank";
3280− }
3281− ;
3282− return "_self";
3283− }()
3284− })(classes)([child$prime]));
3285− });
3286− });
3287− }
3288− ;
3289− if (v1.value1 instanceof Download) {
3290− return bind2(append22(skn(new Flexbox(X.value)))(append22(sk("display-flex")("display")("flex"))(sk("flex-direction-row")("flex-direction")("row"))))(function(classes) {
3291− return bind2(growSkin(fire)(mempty4)(v1.value1.value2))(function(child$prime) {
3292− return pure2(hWith("a")({
3293− href: v1.value1.value0,
3294− download: fromMaybe("")(v1.value1.value1.filename)
3295− })(classes)([child$prime]));
3296− });
3297− });
3298− }
3299− ;
3300− if (v1.value1 instanceof Image2) {
3301− return map2(function(c) {
3302− return hWith("img")({
3303− src: v1.value1.value0,
3304− alt: v1.value1.value1.description
3305− })(c)([]);
3306− })(skn(Generic.value));
3307− }
3308− ;
3309− if (v1.value1 instanceof None) {
3310− return pure2(h3("div")(mempty2)([]));
3311− }
3312− ;
3313− throw new Error("Failed pattern match at Plum.View (line 477, column 3 - line 518, column 37): " + [v1.value1.constructor.name]);
3314− };
3315− };
3316− };
3317− var grow = function(fire) {
3318− return function(v) {
3319− var v1 = runWriter(growSkin(fire)(mempty4)(v));
3320− return {
3321− node: v1.value0,
3322− style: styleSkinGrowth(v1.value1)
3323− };
3324− };
3325− };
3326− var column = function(v) {
3327− return new UI({
3328− nerves: mempty1.nerves,
3329− meat: mempty1.meat,
3330− hover: mempty1.hover,
3331− down: mempty1.down,
3332− children: [new Tuple({
3333− meat: v.value0.meat,
3334− nerves: v.value0.nerves,
3335− hover: v.value0.hover,
3336− down: v.value0.down
3337− }, new Column(v.value0.children))]
3338− }, v.value1);
3339− };
3340− var bgColor = function(dictMonoid) {
3341− var m1 = m(dictMonoid);
3342− return function(c) {
3343− return m1(new BackgroundColor(c));
3344− };
3345− };
3346−
3347− // output/Web.DOM.NonElementParentNode/foreign.js
3348− function _getElementById(id) {
3349− return function(node) {
3350− return function() {
3351− return node.getElementById(id);
3352− };
3353− };
3354− }
3355−
3356− // output/Data.Nullable/foreign.js
3357− function nullable(a, r, f) {
3358− return a == null ? r : f(a);
3359− }
3360−
3361− // output/Data.Nullable/index.js
3362− var toMaybe = function(n) {
3363− return nullable(n, Nothing.value, Just.create);
3364− };
3365−
3366− // output/Web.DOM.NonElementParentNode/index.js
3367− var map3 = /* @__PURE__ */ map(functorEffect);
3368− var getElementById = function(eid) {
3369− var $2 = map3(toMaybe);
3370− var $3 = _getElementById(eid);
3371− return function($4) {
3372− return $2($3($4));
3373− };
3374− };
3375−
3376− // output/Web.HTML/foreign.js
3377− var windowImpl = function() {
3378− return window;
3379− };
3380−
3381− // output/Web.HTML.HTMLDocument/index.js
3382− var toNonElementParentNode = unsafeCoerce2;
3383−
3384− // output/Web.HTML.Window/foreign.js
3385− function document2(window2) {
3386− return function() {
3387− return window2.document;
3388− };
3389− }
3390−
3391− // output/Plum/index.js
3392− var bind3 = /* @__PURE__ */ bind(bindEffect);
3393− var outerStyle = "html,body{height:100%;padding:0;margin:0;}";
3394− var run3 = function(id) {
3395− return function(plum2) {
3396− return function __do() {
3397− var modelRef = bind3(plum2.init)($$new)();
3398− var v = bind3(bind3(windowImpl)(document2))(function() {
3399− var $21 = getElementById(id);
3400− return function($22) {
3401− return $21(toNonElementParentNode($22));
3402− };
3403− }())();
3404− if (v instanceof Just) {
3405− var projector = createProjector();
3406− return replace(projector)(v.value0)(function __do2() {
3407− var model = read(modelRef)();
3408− var v1 = plum2.view(model);
3409− var v2 = head(v1.value0.children);
3410− if (v2 instanceof Nothing) {
3411− return h2("div")({})([]);
3412− }
3413− ;
3414− if (v2 instanceof Just) {
3415− var v3 = grow(function(msg) {
3416− return function __do3() {
3417− var m2 = read(modelRef)();
3418− var m_ = plum2.update(msg)(m2)();
3419− write(m_)(modelRef)();
3420− return scheduleRender(projector)();
3421− };
3422− })(v2.value0);
3423− return h2("div")({
3424− styles: {
3425− height: "100%",
3426− width: "100%"
3427− }
3428− })([h2("style")({})([string(outerStyle + v3.style)]), v3.node]);
3429− }
3430− ;
3431− throw new Error("Failed pattern match at Plum (line 35, column 20 - line 52, column 94): " + [v2.constructor.name]);
3432− })();
3433− }
3434− ;
3435− if (v instanceof Nothing) {
3436− return unit;
3437− }
3438− ;
3439− throw new Error("Failed pattern match at Plum (line 26, column 92 - line 54, column 25): " + [v.constructor.name]);
3440− };
3441− };
3442− };
3443−
3444− // output/Main/index.js
3445− var pure3 = /* @__PURE__ */ pure(applicativeEffect);
3446− var discard3 = /* @__PURE__ */ discard(discardUnit);
3447− var discard1 = /* @__PURE__ */ discard3(/* @__PURE__ */ bindGenericUI(monoidArray));
3448− var discard22 = /* @__PURE__ */ discard3(/* @__PURE__ */ bindGenericUI(monoidUnit));
3449− var onHover2 = /* @__PURE__ */ onHover(monoidUnit);
3450− var bgColor2 = /* @__PURE__ */ bgColor(monoidUnit);
3451− var onMouseDown2 = /* @__PURE__ */ onMouseDown(monoidUnit);
3452− var mempty5 = /* @__PURE__ */ mempty(/* @__PURE__ */ monoidGenericUI(monoidUnit)(monoidUnit));
3453− var plum = {
3454− init: /* @__PURE__ */ pure3({
3455− text: "Test"
3456− }),
3457− view: function(model) {
3458− return column(discard1(text("hi")(discard22(onHover2(bgColor2(rgb(1)(0)(0))))(function() {
3459− return onMouseDown2(bgColor2(rgb(0)(1)(0)));
3460− })))(function() {
3461− return text("hello")(mempty5);
3462− }));
3463− },
3464− update: function(msg) {
3465− return function(model) {
3466− return pure3({
3467− text: "Button pressed"
3468− });
3469− };
3470− }
3471− };
3472− var main = /* @__PURE__ */ run3("plum")(plum);
3473−
3474− // <stdin>
3475− main();
3476−})();
plum/spago.dhall+5
@@ -6,12 +6,15 @@
66 , "effect"
77 , "foldable-traversable"
88 , "foreign-object"
9+ , "functions"
910 , "integers"
11+ , "literals"
1012 , "maybe"
1113 , "numbers"
1214 , "prelude"
1315 , "record"
1416 , "refs"
17+ , "strings"
1518 , "strings-extra"
1619 , "transformers"
1720 , "tuples"
@@ -19,7 +22,9 @@
1922 , "unsafe-coerce"
2023 , "untagged-union"
2124 , "web-dom"
25+ , "web-events"
2226 , "web-html"
27+ , "web-uievents"
2328 ]
2429, packages = ../packages.dhall
2530, sources = [ "src/**/*.purs", "test/**/*.purs" ]
plum/src/Main.purs+42−11
@@ -1,28 +1,59 @@
11module Main where
22
3+import Plum.View
34import Prelude
45
56import Effect (Effect)
67import Plum as Plum
7−import Plum.View
88
99main :: Effect Unit
1010main = do
1111 Plum.run "plum" plum
1212
13−type Model = { text :: String }
13+type Model = { text :: String, numberOfClicks :: Int }
14+
15+data Msg = Clicked | UpdateText String
1416
15−plum :: Plum.Plum Unit Model
17+plum :: Plum.Plum Msg Model
1618plum =
17− { init: pure { text: "Test" }
19+ { init: pure { text: "Test", numberOfClicks: 0 }
1820 , view: \model -> do
1921 column do
20− text "hi" do
21− onHover do
22− bgColor $ rgb 1.0 0.0 0.0
23− onMouseDown $ do
24− bgColor $ rgb 0.0 1.0 0.0
25− text "hello" mempty
22+ stack do
23+ align Y End
24+ height Fit
25+ row do
26+ align Y End
27+ column do
28+ bgColor $ rgb 0.0 0.0 0.0
29+ height (Px 10)
30+ column mempty
31+ pure unit
32+ column do
33+ font "sans-serif"
34+ column do
35+ height (Px 100)
36+ width Fit
37+ align Y Start
38+ width Fill
39+ column $ do
40+ width Fill
41+ width Fit
42+ height Fit
43+ text "PureStack" do
44+ fontSize 72
45+ fontWeight 1000
46+ column do
47+ bgColor $ rgb 0.0 0.0 0.0
48+ height (Px 10)
49+ width Fill
50+ column do
51+ width Fill
52+ row do
53+ text (model.text <> ": " <> show model.numberOfClicks) mempty
54+ onClick Clicked
55+ textInput { onChange: UpdateText, value: model.text } mempty
2656 , update: \msg model -> case msg of
27− _ -> pure { text: "Button pressed" }
57+ Clicked -> pure model { text = "Button pressed", numberOfClicks = model.numberOfClicks + 1 }
58+ UpdateText text -> pure model { text = text }
2859 }
plum/src/Maquette.jsdeleted−953
@@ -1,953 +0,0 @@
1−'use strict';
2−
3−var NAMESPACE_W3 = "http://www.w3.org/";
4−var NAMESPACE_SVG = NAMESPACE_W3 + "2000/svg";
5−var NAMESPACE_XLINK = NAMESPACE_W3 + "1999/xlink";
6−var emptyArray = [];
7−var extend = function (base, overrides) {
8− var result = {};
9− Object.keys(base).forEach(function (key) {
10− result[key] = base[key];
11− });
12− if (overrides) {
13− Object.keys(overrides).forEach(function (key) {
14− result[key] = overrides[key];
15− });
16− }
17− return result;
18−};
19−var same = function (vnode1, vnode2) {
20− if (vnode1.vnodeSelector !== vnode2.vnodeSelector) {
21− return false;
22− }
23− if (vnode1.properties && vnode2.properties) {
24− if (vnode1.properties.key !== vnode2.properties.key) {
25− return false;
26− }
27− return vnode1.properties.bind === vnode2.properties.bind;
28− }
29− return !vnode1.properties && !vnode2.properties;
30−};
31−var checkStyleValue = function (styleValue) {
32− if (typeof styleValue !== "string") {
33− throw new Error("Style values must be strings");
34− }
35−};
36−var findIndexOfChild = function (children, sameAs, start) {
37− if (sameAs.vnodeSelector !== "") {
38− // Never scan for text-nodes
39− for (var i = start; i < children.length; i++) {
40− if (same(children[i], sameAs)) {
41− return i;
42− }
43− }
44− }
45− return -1;
46−};
47−var checkDistinguishable = function (childNodes, indexToCheck, parentVNode, operation) {
48− var childNode = childNodes[indexToCheck];
49− if (childNode.vnodeSelector === "") {
50− return; // Text nodes need not be distinguishable
51− }
52− var properties = childNode.properties;
53− var key = properties
54− ? properties.key === undefined
55− ? properties.bind
56− : properties.key
57− : undefined;
58− if (!key) {
59− // A key is just assumed to be unique
60− for (var i = 0; i < childNodes.length; i++) {
61− if (i !== indexToCheck) {
62− var node = childNodes[i];
63− if (same(node, childNode)) {
64− throw {
65− error: new Error(parentVNode.vnodeSelector + " had a " + childNode.vnodeSelector + " child " + (operation === "added" ? operation : "removed") + ", but there is now more than one. You must add unique key properties to make them distinguishable."),
66− parentNode: parentVNode,
67− childNode: childNode,
68− };
69− }
70− }
71− }
72− }
73−};
74−var nodeAdded = function (vNode) {
75− if (vNode.properties) {
76− var enterAnimation = vNode.properties.enterAnimation;
77− if (enterAnimation) {
78− enterAnimation(vNode.domNode, vNode.properties);
79− }
80− }
81−};
82−var removedNodes = [];
83−var requestedIdleCallback = false;
84−var visitRemovedNode = function (node) {
85− (node.children || []).forEach(visitRemovedNode);
86− if (node.properties && node.properties.afterRemoved) {
87− node.properties.afterRemoved.apply(node.properties.bind || node.properties, [
88− node.domNode,
89− ]);
90− }
91−};
92−var processPendingNodeRemovals = function () {
93− requestedIdleCallback = false;
94− removedNodes.forEach(visitRemovedNode);
95− removedNodes.length = 0;
96−};
97−var scheduleNodeRemoval = function (vNode) {
98− removedNodes.push(vNode);
99− if (!requestedIdleCallback) {
100− requestedIdleCallback = true;
101− if (typeof window !== "undefined" && "requestIdleCallback" in window) {
102− window.requestIdleCallback(processPendingNodeRemovals, { timeout: 16 });
103− }
104− else {
105− setTimeout(processPendingNodeRemovals, 16);
106− }
107− }
108−};
109−var nodeToRemove = function (vNode) {
110− var domNode = vNode.domNode;
111− if (vNode.properties) {
112− var exitAnimation = vNode.properties.exitAnimation;
113− if (exitAnimation) {
114− domNode.style.pointerEvents = "none";
115− var removeDomNode = function () {
116− if (domNode.parentNode) {
117− domNode.parentNode.removeChild(domNode);
118− scheduleNodeRemoval(vNode);
119− }
120− };
121− exitAnimation(domNode, removeDomNode, vNode.properties);
122− return;
123− }
124− }
125− if (domNode.parentNode) {
126− domNode.parentNode.removeChild(domNode);
127− scheduleNodeRemoval(vNode);
128− }
129−};
130−var vnodeOnlyProps = [
131− "afterCreate",
132− "afterUpdate",
133− "afterRemoved",
134− "enterAnimation",
135− "exitAnimation",
136− "updateAnimation",
137−];
138−function filterVNodeOnlyProps(name) {
139− return !vnodeOnlyProps.includes(name);
140−}
141−var setProperties = function (domNode, properties, projectionOptions) {
142− if (!properties) {
143− return;
144− }
145− var eventHandlerInterceptor = projectionOptions.eventHandlerInterceptor;
146− var propNames = Object.keys(properties).filter(filterVNodeOnlyProps);
147− var propCount = propNames.length;
148− for (var i = 0; i < propCount; i++) {
149− var propName = propNames[i];
150− var propValue = properties[propName];
151− if (propName === "className") {
152− throw new Error('Property "className" is not supported, use "class".');
153− }
154− else if (propName === "class") {
155− toggleClasses(domNode, propValue, true);
156− }
157− else if (propName === "classes") {
158− // object with string keys and boolean values
159− var classNames = Object.keys(propValue);
160− var classNameCount = classNames.length;
161− for (var j = 0; j < classNameCount; j++) {
162− var className = classNames[j];
163− if (propValue[className]) {
164− domNode.classList.add(className);
165− }
166− }
167− }
168− else if (propName === "styles") {
169− // object with string keys and string (!) values
170− var styleNames = Object.keys(propValue);
171− var styleCount = styleNames.length;
172− for (var j = 0; j < styleCount; j++) {
173− var styleName = styleNames[j];
174− var styleValue = propValue[styleName];
175− if (styleValue) {
176− checkStyleValue(styleValue);
177− projectionOptions.styleApplyer(domNode, styleName, styleValue);
178− }
179− }
180− }
181− else if (propName === "on" && propValue) {
182− // object with string keys and function values
183− for (var _i = 0, _a = Object.entries(properties.on); _i < _a.length; _i++) {
184− var _b = _a[_i], key = _b[0], handler = _b[1];
185− var listener = typeof handler === "function" ? handler : handler.listener;
186− if (eventHandlerInterceptor) {
187− listener = eventHandlerInterceptor(key, listener, domNode, properties);
188− }
189− if (listener) {
190− domNode.addEventListener(key, listener, typeof handler === "function" ? undefined : handler.options);
191− }
192− }
193− }
194− else if (propName !== "key" && propValue !== null && propValue !== undefined) {
195− var type = typeof propValue;
196− if (type === "function") {
197− if (propName.lastIndexOf("on", 0) === 0) {
198− // lastIndexOf(,0)===0 -> startsWith
199− if (eventHandlerInterceptor) {
200− propValue = eventHandlerInterceptor(propName, propValue, domNode, properties); // intercept eventhandlers
201− }
202− }
203− domNode[propName] = propValue;
204− }
205− else if (projectionOptions.namespace === NAMESPACE_SVG) {
206− if (propName === "href") {
207− domNode.setAttributeNS(NAMESPACE_XLINK, propName, propValue);
208− }
209− else {
210− // all SVG attributes are read-only in DOM, so...
211− domNode.setAttribute(propName, propValue);
212− }
213− }
214− else if (type === "string" && propName !== "value" && propName !== "innerHTML") {
215− domNode.setAttribute(propName, propValue);
216− }
217− else {
218− domNode[propName] = propValue;
219− }
220− }
221− }
222−};
223−var addChildren = function (domNode, children, projectionOptions) {
224− if (!children) {
225− return;
226− }
227− for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {
228− var child = children_1[_i];
229− createDom(child, domNode, undefined, projectionOptions);
230− }
231−};
232−var initPropertiesAndChildren = function (domNode, vnode, projectionOptions) {
233− addChildren(domNode, vnode.children, projectionOptions); // children before properties, needed for value property of <select>.
234− if (vnode.text) {
235− domNode.textContent = vnode.text;
236− }
237− setProperties(domNode, vnode.properties, projectionOptions);
238− if (vnode.properties && vnode.properties.afterCreate) {
239− vnode.properties.afterCreate.apply(vnode.properties.bind || vnode.properties, [
240− domNode,
241− projectionOptions,
242− vnode.vnodeSelector,
243− vnode.properties,
244− vnode.children,
245− ]);
246− }
247−};
248−var createDom = function (vnode, parentNode, insertBefore, projectionOptions) {
249− var _a;
250− var domNode;
251− var start = 0;
252− var vnodeSelector = vnode.vnodeSelector;
253− var doc = parentNode.ownerDocument;
254− if (vnodeSelector === "") {
255− if (vnode.domNode) {
256− vnode.domNode.nodeValue = vnode.text;
257− }
258− else {
259− domNode = vnode.domNode = doc.createTextNode(vnode.text);
260− if (insertBefore !== undefined) {
261− parentNode.insertBefore(domNode, insertBefore);
262− }
263− else {
264− parentNode.appendChild(domNode);
265− }
266− }
267− }
268− else {
269− for (var i = 0; i <= vnodeSelector.length; ++i) {
270− var c = vnodeSelector.charAt(i);
271− if (i === vnodeSelector.length || c === "." || c === "#") {
272− var type = vnodeSelector.charAt(start - 1);
273− var found = vnodeSelector.slice(start, i);
274− if (type === ".") {
275− domNode.classList.add(found);
276− }
277− else if (type === "#") {
278− domNode.id = found;
279− }
280− else {
281− if (found === "svg") {
282− projectionOptions = extend(projectionOptions, {
283− namespace: NAMESPACE_SVG,
284− });
285− }
286− if (projectionOptions.namespace !== undefined) {
287− domNode = vnode.domNode = doc.createElementNS(projectionOptions.namespace, found);
288− }
289− else {
290− domNode = vnode.domNode =
291− vnode.domNode ||
292− (((_a = vnode.properties) === null || _a === void 0 ? void 0 : _a.is) ? doc.createElement(found, { is: vnode.properties.is })
293− : doc.createElement(found));
294− if (found === "input" && vnode.properties && vnode.properties.type !== undefined) {
295− // IE8 and older don't support setting input type after the DOM Node has been added to the document
296− domNode.setAttribute("type", vnode.properties.type);
297− }
298− }
299− if (insertBefore !== undefined) {
300− parentNode.insertBefore(domNode, insertBefore);
301− }
302− else if (domNode.parentNode !== parentNode) {
303− parentNode.appendChild(domNode);
304− }
305− }
306− start = i + 1;
307− }
308− }
309− initPropertiesAndChildren(domNode, vnode, projectionOptions);
310− }
311−};
312−var updateDom;
313−/**
314− * Adds or removes classes from an Element
315− * @param domNode the element
316− * @param classes a string separated list of classes
317− * @param on true means add classes, false means remove
318− */
319−var toggleClasses = function (domNode, classes, on) {
320− if (!classes) {
321− return;
322− }
323− classes.split(" ").forEach(function (classToToggle) {
324− if (classToToggle) {
325− domNode.classList.toggle(classToToggle, on);
326− }
327− });
328−};
329−var updateProperties = function (domNode, previousProperties, properties, projectionOptions) {
330− if (!properties) {
331− return;
332− }
333− var propertiesUpdated = false;
334− var propNames = Object.keys(properties).filter(filterVNodeOnlyProps);
335− var propCount = propNames.length;
336− for (var i = 0; i < propCount; i++) {
337− var propName = propNames[i];
338− // assuming that properties will be nullified instead of missing is by design
339− var propValue = properties[propName];
340− var previousValue = previousProperties[propName];
341− if (propName === "class") {
342− if (previousValue !== propValue) {
343− toggleClasses(domNode, previousValue, false);
344− toggleClasses(domNode, propValue, true);
345− }
346− }
347− else if (propName === "classes") {
348− var classList = domNode.classList;
349− var classNames = Object.keys(propValue);
350− var classNameCount = classNames.length;
351− for (var j = 0; j < classNameCount; j++) {
352− var className = classNames[j];
353− var on = !!propValue[className];
354− var previousOn = !!previousValue[className];
355− if (on === previousOn) {
356− continue;
357− }
358− propertiesUpdated = true;
359− if (on) {
360− classList.add(className);
361− }
362− else {
363− classList.remove(className);
364− }
365− }
366− }
367− else if (propName === "styles") {
368− var styleNames = Object.keys(propValue);
369− var styleCount = styleNames.length;
370− for (var j = 0; j < styleCount; j++) {
371− var styleName = styleNames[j];
372− var newStyleValue = propValue[styleName];
373− var oldStyleValue = previousValue[styleName];
374− if (newStyleValue === oldStyleValue) {
375− continue;
376− }
377− propertiesUpdated = true;
378− if (newStyleValue) {
379− checkStyleValue(newStyleValue);
380− projectionOptions.styleApplyer(domNode, styleName, newStyleValue);
381− }
382− else {
383− projectionOptions.styleApplyer(domNode, styleName, "");
384− }
385− }
386− }
387− else {
388− if (!propValue && typeof previousValue === "string") {
389− propValue = "";
390− }
391− if (propName === "value") {
392− // value can be manipulated by the user directly and using event.preventDefault() is not an option
393− var domValue = domNode[propName];
394− if (domValue !== propValue && // The 'value' in the DOM tree !== newValue
395− propValue !== previousValue // Only update the value if the vdom changed
396− ) {
397− // The edge cases are described in the tests
398− domNode[propName] = propValue; // Reset the value, even if the virtual DOM did not change
399− } // else do not update the domNode, otherwise the cursor position would be changed
400− if (propValue !== previousValue) {
401− propertiesUpdated = true;
402− }
403− }
404− else if (propValue !== previousValue) {
405− var type = typeof propValue;
406− if (type !== "function" || !projectionOptions.eventHandlerInterceptor) {
407− // Function updates are expected to be handled by the EventHandlerInterceptor
408− if (projectionOptions.namespace === NAMESPACE_SVG) {
409− if (propName === "href") {
410− domNode.setAttributeNS(NAMESPACE_XLINK, propName, propValue);
411− }
412− else {
413− // all SVG attributes are read-only in DOM, so...
414− domNode.setAttribute(propName, propValue);
415− }
416− }
417− else if (type === "string" && propName !== "innerHTML") {
418− if (propName === "role" && propValue === "") {
419− domNode.removeAttribute(propName);
420− }
421− else {
422− domNode.setAttribute(propName, propValue);
423− }
424− }
425− else if (domNode[propName] !== propValue) {
426− // Comparison is here for side-effects in Edge with scrollLeft and scrollTop
427− domNode[propName] = propValue;
428− }
429− propertiesUpdated = true;
430− }
431− }
432− }
433− }
434− return propertiesUpdated;
435−};
436−var updateChildren = function (vnode, domNode, oldChildren, newChildren, projectionOptions) {
437− if (oldChildren === newChildren) {
438− return false;
439− }
440− oldChildren = oldChildren || emptyArray;
441− newChildren = newChildren || emptyArray;
442− var oldChildrenLength = oldChildren.length;
443− var newChildrenLength = newChildren.length;
444− var oldIndex = 0;
445− var newIndex = 0;
446− var i;
447− var textUpdated = false;
448− while (newIndex < newChildrenLength) {
449− var oldChild = oldIndex < oldChildrenLength ? oldChildren[oldIndex] : undefined;
450− var newChild = newChildren[newIndex];
451− if (oldChild !== undefined && same(oldChild, newChild)) {
452− textUpdated =
453− updateDom(oldChild, newChild, projectionOptions, domNode, oldChildren) || textUpdated;
454− oldIndex++;
455− }
456− else {
457− var findOldIndex = findIndexOfChild(oldChildren, newChild, oldIndex + 1);
458− if (findOldIndex >= 0) {
459− // Remove preceding missing children
460− for (i = oldIndex; i < findOldIndex; i++) {
461− nodeToRemove(oldChildren[i]);
462− checkDistinguishable(oldChildren, i, vnode, "removed");
463− }
464− textUpdated =
465− updateDom(oldChildren[findOldIndex], newChild, projectionOptions, domNode, oldChildren) ||
466− textUpdated;
467− oldIndex = findOldIndex + 1;
468− }
469− else {
470− // New child
471− createDom(newChild, domNode, oldIndex < oldChildrenLength ? oldChildren[oldIndex].domNode : undefined, projectionOptions);
472− nodeAdded(newChild);
473− checkDistinguishable(newChildren, newIndex, vnode, "added");
474− }
475− }
476− newIndex++;
477− }
478− if (oldChildrenLength > oldIndex) {
479− // Remove child fragments
480− for (i = oldIndex; i < oldChildrenLength; i++) {
481− nodeToRemove(oldChildren[i]);
482− checkDistinguishable(oldChildren, i, vnode, "removed");
483− }
484− }
485− return textUpdated;
486−};
487−updateDom = function (previous, vnode, projectionOptions, parentNode, oldChildren) {
488− var domNode = previous.domNode;
489− var textUpdated = false;
490− if (previous === vnode) {
491− return false; // By contract, VNode objects may not be modified anymore after passing them to maquette
492− }
493− var updated = false;
494− if (vnode.vnodeSelector === "") {
495− if (vnode.text !== previous.text) {
496− var newTextNode = domNode.ownerDocument.createTextNode(vnode.text);
497− try {
498− parentNode.replaceChild(newTextNode, domNode);
499− }
500− catch (e) {
501− // Text nodes can be substituted by google translate
502− parentNode.replaceChild(newTextNode, parentNode.childNodes[oldChildren.indexOf(previous)]);
503− }
504− vnode.domNode = newTextNode;
505− textUpdated = true;
506− return textUpdated;
507− }
508− vnode.domNode = domNode;
509− }
510− else {
511− if (vnode.vnodeSelector.lastIndexOf("svg", 0) === 0) {
512− // lastIndexOf(needle,0)===0 means StartsWith
513− projectionOptions = extend(projectionOptions, {
514− namespace: NAMESPACE_SVG,
515− });
516− }
517− if (previous.text !== vnode.text) {
518− updated = true;
519− if (vnode.text === undefined) {
520− domNode.removeChild(domNode.firstChild); // the only textnode presumably
521− }
522− else {
523− domNode.textContent = vnode.text;
524− }
525− }
526− vnode.domNode = domNode;
527− updated =
528− updateChildren(vnode, domNode, previous.children, vnode.children, projectionOptions) ||
529− updated;
530− updated =
531− updateProperties(domNode, previous.properties, vnode.properties, projectionOptions) ||
532− updated;
533− if (vnode.properties && vnode.properties.afterUpdate) {
534− vnode.properties.afterUpdate.apply(vnode.properties.bind || vnode.properties, [
535− domNode,
536− projectionOptions,
537− vnode.vnodeSelector,
538− vnode.properties,
539− vnode.children,
540− ]);
541− }
542− }
543− if (updated && vnode.properties && vnode.properties.updateAnimation) {
544− vnode.properties.updateAnimation(domNode, vnode.properties, previous.properties);
545− }
546− return textUpdated;
547−};
548−var createProjection = function (vnode, projectionOptions) {
549− return {
550− getLastRender: function () { return vnode; },
551− update: function (updatedVnode) {
552− if (vnode.vnodeSelector !== updatedVnode.vnodeSelector) {
553− throw new Error("The selector for the root VNode may not be changed. (consider using dom.merge and add one extra level to the virtual DOM)");
554− }
555− var previousVNode = vnode;
556− vnode = updatedVnode;
557− updateDom(previousVNode, updatedVnode, projectionOptions, previousVNode.domNode.parentNode, [previousVNode]);
558− },
559− domNode: vnode.domNode,
560− };
561−};
562−
563−var DEFAULT_PROJECTION_OPTIONS = {
564− namespace: undefined,
565− performanceLogger: function () { return undefined; },
566− eventHandlerInterceptor: undefined,
567− styleApplyer: function (domNode, styleName, value) {
568− if (styleName.charAt(0) === "-") {
569− // CSS variables must be set using setProperty
570− domNode.style.setProperty(styleName, value);
571− }
572− else {
573− // properties like 'backgroundColor' must be set as a js-property
574− domNode.style[styleName] = value;
575− }
576− },
577−};
578−var applyDefaultProjectionOptions = function (projectorOptions) {
579− return extend(DEFAULT_PROJECTION_OPTIONS, projectorOptions);
580−};
581−export var dom = {
582− /**
583− * Creates a real DOM tree from `vnode`. The [[Projection]] object returned will contain the resulting DOM Node in
584− * its [[Projection.domNode|domNode]] property.
585− * This is a low-level method. Users will typically use a [[Projector]] instead.
586− * @param vnode - The root of the virtual DOM tree that was created using the [[h]] function. NOTE: [[VNode]]
587− * objects may only be rendered once.
588− * @param projectionOptions - Options to be used to create and update the projection.
589− * @returns The [[Projection]] which also contains the DOM Node that was created.
590− */
591− create: function (vnode, projectionOptions) {
592− projectionOptions = applyDefaultProjectionOptions(projectionOptions);
593− createDom(vnode, document.createElement("div"), undefined, projectionOptions);
594− return createProjection(vnode, projectionOptions);
595− },
596− /**
597− * Appends a new child node to the DOM which is generated from a [[VNode]].
598− * This is a low-level method. Users will typically use a [[Projector]] instead.
599− * @param parentNode - The parent node for the new child node.
600− * @param vnode - The root of the virtual DOM tree that was created using the [[h]] function. NOTE: [[VNode]]
601− * objects may only be rendered once.
602− * @param projectionOptions - Options to be used to create and update the [[Projection]].
603− * @returns The [[Projection]] that was created.
604− */
605− append: function (parentNode, vnode, projectionOptions) {
606− projectionOptions = applyDefaultProjectionOptions(projectionOptions);
607− createDom(vnode, parentNode, undefined, projectionOptions);
608− return createProjection(vnode, projectionOptions);
609− },
610− /**
611− * Inserts a new DOM node which is generated from a [[VNode]].
612− * This is a low-level method. Users wil typically use a [[Projector]] instead.
613− * @param beforeNode - The node that the DOM Node is inserted before.
614− * @param vnode - The root of the virtual DOM tree that was created using the [[h]] function.
615− * NOTE: [[VNode]] objects may only be rendered once.
616− * @param projectionOptions - Options to be used to create and update the projection, see [[createProjector]].
617− * @returns The [[Projection]] that was created.
618− */
619− insertBefore: function (beforeNode, vnode, projectionOptions) {
620− projectionOptions = applyDefaultProjectionOptions(projectionOptions);
621− createDom(vnode, beforeNode.parentNode, beforeNode, projectionOptions);
622− return createProjection(vnode, projectionOptions);
623− },
624− /**
625− * Merges a new DOM node which is generated from a [[VNode]] with an existing DOM Node.
626− * This means that the virtual DOM and the real DOM will have one overlapping element.
627− * Therefore the selector for the root [[VNode]] will be ignored, but its properties and children will be applied to the Element provided.
628− * This is a low-level method. Users wil typically use a [[Projector]] instead.
629− * @param element - The existing element to adopt as the root of the new virtual DOM. Existing attributes and child nodes are preserved.
630− * @param vnode - The root of the virtual DOM tree that was created using the [[h]] function. NOTE: [[VNode]] objects
631− * may only be rendered once.
632− * @param projectionOptions - Options to be used to create and update the projection, see [[createProjector]].
633− * @returns The [[Projection]] that was created.
634− */
635− merge: function (element, vnode, projectionOptions) {
636− projectionOptions = applyDefaultProjectionOptions(projectionOptions);
637− vnode.domNode = element;
638− initPropertiesAndChildren(element, vnode, projectionOptions);
639− return createProjection(vnode, projectionOptions);
640− },
641− /**
642− * Replaces an existing DOM node with a node generated from a [[VNode]].
643− * This is a low-level method. Users will typically use a [[Projector]] instead.
644− * @param element - The node for the [[VNode]] to replace.
645− * @param vnode - The root of the virtual DOM tree that was created using the [[h]] function. NOTE: [[VNode]]
646− * objects may only be rendered once.
647− * @param projectionOptions - Options to be used to create and update the [[Projection]].
648− * @returns The [[Projection]] that was created.
649− */
650− replace: function (element, vnode, projectionOptions) {
651− projectionOptions = applyDefaultProjectionOptions(projectionOptions);
652− createDom(vnode, element.parentNode, element, projectionOptions);
653− element.parentNode.removeChild(element);
654− return createProjection(vnode, projectionOptions);
655− },
656−};
657−
658−var toTextVNode = function (data) {
659− return {
660− vnodeSelector: "",
661− properties: undefined,
662− children: undefined,
663− text: data.toString(),
664− domNode: null,
665− };
666−};
667−var appendChildren = function (parentSelector, insertions, main) {
668− for (var i = 0, length_1 = insertions.length; i < length_1; i++) {
669− var item = insertions[i];
670− if (Array.isArray(item)) {
671− appendChildren(parentSelector, item, main);
672− }
673− else {
674− if (item !== null && item !== undefined && item !== false) {
675− if (typeof item === "string") {
676− item = toTextVNode(item);
677− }
678− main.push(item);
679− }
680− }
681− }
682−};
683−function h(selector, properties, children) {
684− if (Array.isArray(properties)) {
685− children = properties;
686− properties = undefined;
687− }
688− else if ((properties && (typeof properties === "string" || properties.vnodeSelector)) ||
689− (children && (typeof children === "string" || children.vnodeSelector))) {
690− throw new Error("h called with invalid arguments");
691− }
692− var text;
693− var flattenedChildren;
694− // Recognize a common special case where there is only a single text node
695− if (children && children.length === 1 && typeof children[0] === "string") {
696− text = children[0];
697− }
698− else if (children) {
699− flattenedChildren = [];
700− appendChildren(selector, children, flattenedChildren);
701− if (flattenedChildren.length === 0) {
702− flattenedChildren = undefined;
703− }
704− }
705− return {
706− vnodeSelector: selector,
707− properties: properties,
708− children: flattenedChildren,
709− text: text === "" ? undefined : text,
710− domNode: null,
711− };
712−}
713−
714−var createParentNodePath = function (node, rootNode) {
715− var parentNodePath = [];
716− while (node && node !== rootNode) {
717− parentNodePath.push(node);
718− node = node.parentNode;
719− }
720− return parentNodePath;
721−};
722−var find;
723−if (Array.prototype.find) {
724− find = function (items, predicate) { return items.find(predicate); };
725−}
726−else {
727− find = function (items, predicate) { return items.filter(predicate)[0]; };
728−}
729−var findVNodeByParentNodePath = function (vnode, parentNodePath) {
730− var result = vnode;
731− parentNodePath.forEach(function (node) {
732− result =
733− result && result.children
734− ? find(result.children, function (child) { return child.domNode === node; })
735− : undefined;
736− });
737− return result;
738−};
739−var createEventHandlerInterceptor = function (projector, getProjection, performanceLogger) {
740− return function (propertyName, eventHandler, domNode, properties) { return modifiedEventHandler; };
741− function modifiedEventHandler(evt) {
742− var _a, _b;
743− performanceLogger("domEvent", evt);
744− var projection = getProjection();
745− var parentNodePath = createParentNodePath(evt.currentTarget, projection.domNode);
746− parentNodePath.reverse();
747− var matchingVNode = findVNodeByParentNodePath(projection.getLastRender(), parentNodePath);
748− projector.scheduleRender();
749− var result;
750− if (matchingVNode) {
751− /* eslint-disable prefer-rest-params */
752− var listener = (_b = (_a = matchingVNode.properties["on" + evt.type]) !== null && _a !== void 0 ? _a : matchingVNode.properties.on[evt.type].listener) !== null && _b !== void 0 ? _b : matchingVNode.properties.on[evt.type];
753− result = listener.apply(matchingVNode.properties.bind || this, arguments);
754− /* eslint-enable prefer-rest-params */
755− }
756− performanceLogger("domEventProcessed", evt);
757− return result;
758− }
759−};
760−/**
761− * Creates a [[Projector]] instance using the provided projectionOptions.
762− *
763− * For more information, see [[Projector]].
764− *
765− * @param projectorOptions Options that influence how the DOM is rendered and updated.
766− */
767−export var createProjector = function (projectorOptions) {
768− var projector;
769− var projectionOptions = applyDefaultProjectionOptions(projectorOptions);
770− var performanceLogger = projectionOptions.performanceLogger;
771− var renderCompleted = true;
772− var scheduled;
773− var stopped = false;
774− var projections = [];
775− var renderFunctions = []; // matches the projections array
776− var addProjection = function (
777− /* one of: dom.append, dom.insertBefore, dom.replace, dom.merge */
778− domFunction,
779− /* the parameter of the domFunction */
780− node, renderFunction) {
781− var projection;
782− var getProjection = function () { return projection; };
783− projectionOptions.eventHandlerInterceptor = createEventHandlerInterceptor(projector, getProjection, performanceLogger);
784− projection = domFunction(node, renderFunction(), projectionOptions);
785− projections.push(projection);
786− renderFunctions.push(renderFunction);
787− };
788− var doRender = function () {
789− scheduled = undefined;
790− if (!renderCompleted) {
791− return; // The last render threw an error, it should have been logged in the browser console.
792− }
793− renderCompleted = false;
794− performanceLogger("renderStart", undefined);
795− for (var i = 0; i < projections.length; i++) {
796− var updatedVnode = renderFunctions[i]();
797− performanceLogger("rendered", undefined);
798− projections[i].update(updatedVnode);
799− performanceLogger("patched", undefined);
800− }
801− performanceLogger("renderDone", undefined);
802− renderCompleted = true;
803− };
804− projector = {
805− renderNow: doRender,
806− scheduleRender: function () {
807− if (!scheduled && !stopped) {
808− scheduled = requestAnimationFrame(doRender);
809− }
810− },
811− stop: function () {
812− if (scheduled) {
813− cancelAnimationFrame(scheduled);
814− scheduled = undefined;
815− }
816− stopped = true;
817− },
818− resume: function () {
819− stopped = false;
820− renderCompleted = true;
821− projector.scheduleRender();
822− },
823− append: function (parentNode, renderFunction) {
824− addProjection(dom.append, parentNode, renderFunction);
825− },
826− insertBefore: function (beforeNode, renderFunction) {
827− addProjection(dom.insertBefore, beforeNode, renderFunction);
828− },
829− merge: function (domNode, renderFunction) {
830− addProjection(dom.merge, domNode, renderFunction);
831− },
832− replace: function (domNode, renderFunction) {
833− addProjection(dom.replace, domNode, renderFunction);
834− },
835− detach: function (renderFunction) {
836− for (var i = 0; i < renderFunctions.length; i++) {
837− if (renderFunctions[i] === renderFunction) {
838− renderFunctions.splice(i, 1);
839− return projections.splice(i, 1)[0];
840− }
841− }
842− throw new Error("renderFunction was not found");
843− },
844− };
845− return projector;
846−};
847−
848−/**
849− * Creates a [[CalculationCache]] object, useful for caching [[VNode]] trees.
850− * In practice, caching of [[VNode]] trees is not needed, because achieving 60 frames per second is almost never a problem.
851− * For more information, see [[CalculationCache]].
852− *
853− * @param <Result> The type of the value that is cached.
854− */
855−export var createCache = function () {
856− var cachedInputs;
857− var cachedOutcome;
858− return {
859− invalidate: function () {
860− cachedOutcome = undefined;
861− cachedInputs = undefined;
862− },
863− result: function (inputs, calculation) {
864− if (cachedInputs) {
865− for (var i = 0; i < inputs.length; i++) {
866− if (cachedInputs[i] !== inputs[i]) {
867− cachedOutcome = undefined;
868− }
869− }
870− }
871− if (!cachedOutcome) {
872− cachedOutcome = calculation();
873− cachedInputs = inputs;
874− }
875− return cachedOutcome;
876− },
877− };
878−};
879−
880−/**
881− * Creates a {@link Mapping} instance that keeps an array of result objects synchronized with an array of source objects.
882− * See {@link http://maquettejs.org/docs/arrays.html Working with arrays}.
883− *
884− * @param <Source> The type of source items. A database-record for instance.
885− * @param <Target> The type of target items. A [[MaquetteComponent]] for instance.
886− * @param getSourceKey `function(source)` that must return a key to identify each source object. The result must either be a string or a number.
887− * @param createResult `function(source, index)` that must create a new result object from a given source. This function is identical
888− * to the `callback` argument in `Array.map(callback)`.
889− * @param updateResult `function(source, target, index)` that updates a result to an updated source.
890− */
891−export var createMapping = function (getSourceKey, createResult, updateResult) {
892− var keys = [];
893− var results = [];
894− return {
895− results: results,
896− map: function (newSources) {
897− var newKeys = newSources.map(getSourceKey);
898− var oldTargets = results.slice();
899− var oldIndex = 0;
900− for (var i = 0; i < newSources.length; i++) {
901− var source = newSources[i];
902− var sourceKey = newKeys[i];
903− if (sourceKey === keys[oldIndex]) {
904− results[i] = oldTargets[oldIndex];
905− updateResult(source, oldTargets[oldIndex], i);
906− oldIndex++;
907− }
908− else {
909− var found = false;
910− for (var j = 1; j < keys.length + 1; j++) {
911− var searchIndex = (oldIndex + j) % keys.length;
912− if (keys[searchIndex] === sourceKey) {
913− results[i] = oldTargets[searchIndex];
914− updateResult(newSources[i], oldTargets[searchIndex], i);
915− oldIndex = searchIndex + 1;
916− found = true;
917− break;
918− }
919− }
920− if (!found) {
921− results[i] = createResult(source, i);
922− }
923− }
924− }
925− results.length = newSources.length;
926− keys = newKeys;
927− },
928− };
929−};
930−
931−export function _h(selector) {
932− return function (properties) {
933− return function (children) {
934− return h(selector, properties, children)
935− }
936− }
937−}
938−
939−export function scheduleRender(projector) {
940− return function () {
941− projector.scheduleRender()
942− }
943−}
944−
945−export function replace(projector) {
946− return function (el) {
947− return function (render) {
948− return function () {
949− projector.replace(el, render)
950− }
951− }
952− }
953−}
plum/src/Maquette.pursdeleted−33
@@ -1,33 +0,0 @@
1−module Maquette
2− ( Projector
3− , createProjector
4− , string
5− , VNode
6− , h
7− , replace
8− , scheduleRender
9− ) where
10−
11−import Prelude
12−
13−import Effect (Effect)
14−import Unsafe.Coerce (unsafeCoerce)
15−import Web.DOM (Element)
16−
17−foreign import data Projector :: Type
18−
19−foreign import createProjector :: Effect Projector
20−
21−foreign import data VNode :: Type
22−
23−foreign import _h :: forall props. String -> { | props } -> Array VNode -> VNode
24−
25−h :: forall props. String -> Record props -> Array VNode -> VNode
26−h = _h
27−
28−string :: String -> VNode
29−string = unsafeCoerce
30−
31−foreign import scheduleRender :: Projector -> Effect Unit
32−
33−foreign import replace :: Projector -> Element -> Effect VNode -> Effect Unit
plum/src/Plum.purs+58−29
@@ -2,13 +2,16 @@ module Plum (Plum, run) where
22
33import Prelude
44
5−import Data.Array ((:))
65import Data.Array as Array
76import Data.Maybe (Maybe(..))
87import Effect (Effect)
8+import Effect.Console (log)
99import Effect.Ref as Ref
10−import Maquette as Maquette
10+import Foreign.Object as Object
11+import Literals.Undefined (undefined)
1112import Plum.View (GenericUI(..), UI, grow)
13+import Snabbdom as Snabbdom
14+import Untagged.Union (asOneOf)
1215import Web.DOM.NonElementParentNode (getElementById) as Web
1316import Web.HTML (window) as Web
1417import Web.HTML.HTMLDocument (toNonElementParentNode) as Web
@@ -22,35 +25,61 @@ type Plum msg model =
2225
2326run :: forall msg model. String -> Plum msg model -> Effect Unit
2427run id plum = do
25− modelRef <- plum.init >>= Ref.new
2628 Web.window >>= Web.document >>= Web.getElementById id <<< Web.toNonElementParentNode >>= case _ of
2729 Just element -> do
28− projector <- Maquette.createProjector
29− Maquette.replace projector element do
30− model <- Ref.read modelRef
31−
32− ( let
33− UI { children } _ = plum.view model
34− in
35− pure $ case Array.head children of
36− Nothing -> Maquette.h "div" {} []
37− Just child ->
38− let
39− { node, style } =
40− ( grow
41− ( \msg -> do
42− m <- Ref.read modelRef
43− m_ <- plum.update msg m
44− Ref.write m_ modelRef
45− Maquette.scheduleRender projector
46− )
47− ) child
48− in
49− Maquette.h
50− "div"
51− { styles: { height: "100%", width: "100%" } }
52− [ Maquette.h "style" {} [ Maquette.string (outerStyle <> style) ], node ]
53− )
30+ let node = Snabbdom.toVNode element
31+ patch <- Snabbdom.init
32+ initModel <- plum.init
33+ modelRef <- Ref.new { model: initModel, lastNode: node }
34+ let
35+ view model = do
36+ let UI { children } _ = plum.view model
37+ case Array.uncons children of
38+ Just { head: child } -> do
39+ let
40+ { node, style } = grow
41+ ( \msg -> do
42+ log "in"
43+ { model: m, lastNode } <- Ref.read modelRef
44+ m_ <- plum.update msg m
45+ node <- view m_
46+ newNode <- patch lastNode node
47+ Ref.write { model: m_, lastNode: newNode } modelRef
48+ pure unit
49+ )
50+ child
51+ pure $
52+ Snabbdom.h "div"
53+ { attrs: Object.empty
54+ , on: Object.empty
55+ , style: Object.empty
56+ , props: Object.empty
57+ }
58+ [ Snabbdom.h "style"
59+ { attrs: Object.empty
60+ , on: Object.empty
61+ , style: Object.empty
62+ , props: Object.empty
63+ }
64+ []
65+ (asOneOf $ outerStyle <> style)
66+ , node
67+ ]
68+ (asOneOf undefined)
69+ Nothing -> pure $
70+ Snabbdom.h "div"
71+ { attrs: Object.empty
72+ , on: Object.empty
73+ , style: Object.empty
74+ , props: Object.empty
75+ }
76+ []
77+ (asOneOf undefined)
78+ newNode <- view initModel
79+ newNode_ <- patch node newNode
80+ log "patched"
81+ Ref.write { model: initModel, lastNode: newNode_ } modelRef
82+ pure unit
5483 Nothing -> pure unit
5584
5685outerStyle :: String
plum/src/Plum/View.purs+209−34
@@ -2,6 +2,11 @@ module Plum.View
22 ( View
33 , Nerve(..)
44 , Meat(..)
5+ , Font
6+ , BorderStyle(..)
7+ , Corner(..)
8+ , Shadow(..)
9+ , ShadowCfg
510 , Side(..)
611 , Bones(..)
712 , grow
@@ -22,10 +27,10 @@ module Plum.View
2227 , text
2328 , link
2429 , newTabLink
25− , el
2630 , download
2731 , downloadAs
2832 , image
33+ , textInput
2934 , spacing
3035 , explain
3136 , align
@@ -39,26 +44,52 @@ module Plum.View
3944 , pointer
4045 , move
4146 , clip
47+ , borders
48+ , border
49+ , borderStyle
50+ , roundAll
51+ , round
52+ , shadow
53+ , innerShadow
4254 , onHover
4355 , onMouseDown
56+ , font
57+ , fontSize
58+ , fontWeight
59+ , onClick
4460 ) where
4561
4662import Prelude
4763
4864import Control.Monad.Writer (Writer, runWriter, tell)
65+import Control.Monad.Writer.Trans (mapWriterT)
66+import Data.Array (foldMap)
4967import Data.Array as Array
68+import Data.Array.NonEmpty (concatMap)
5069import Data.Int as Int
5170import Data.Maybe (Maybe(..))
5271import Data.Maybe as Maybe
72+import Data.String as String
5373import Data.Traversable (traverse)
5474import Data.TraversableWithIndex (traverseWithIndex)
5575import Data.Tuple.Nested (type (/\), (/\))
5676import Effect (Effect)
5777import Foreign.Object (Object)
5878import Foreign.Object as Object
59−import Maquette (VNode, string)
60−import Maquette as Maquette
61−import Record.Unsafe.Union as Record
79+import Literals.Undefined (undefined)
80+import Prim.TypeError (class Warn)
81+import Prim.TypeError as TypeError
82+import Snabbdom (VNode)
83+import Snabbdom as Snabbdom
84+import Type.Row.Homogeneous (class Homogeneous)
85+import Unsafe.Coerce (unsafeCoerce)
86+import Untagged.Union (asOneOf)
87+import Web.DOM.Element as Element
88+import Web.DOM.ParentNode (firstElementChild)
89+import Web.Event.Event (Event)
90+import Web.Event.Event as Event
91+import Web.UIEvent.InputEvent as InputEvent
92+import Web.HTML.HTMLInputElement as HTMLInputElement
6293
6394type GenericUIView children msg =
6495 { nerves :: Array (Nerve msg)
@@ -98,9 +129,9 @@ instance Monoid children => Bind (GenericUI children msg) where
98129
99130instance Monoid children => Monad (GenericUI children msg)
100131
101−column :: forall msg a. UI msg a -> UI msg a
102−column (UI { nerves, meat, hover, down, children } a) =
103− UI (mempty :: UIView msg) { children = [ { meat, nerves, hover, down } /\ Column children ] } a
132+column :: forall msg. UI msg Unit -> UI msg Unit
133+column (UI { nerves, meat, hover, down, children } _) =
134+ UI (mempty :: UIView msg) { children = [ { meat, nerves, hover, down } /\ Column children ] } unit
104135
105136row :: forall msg a. UI msg a -> UI msg a
106137row (UI { nerves, meat, hover, down, children } a) =
@@ -126,19 +157,6 @@ link url (UI { nerves, meat, hover, down, children } a) = UI
126157 }
127158 a
128159
129−el :: forall msg a. UI msg a -> UI msg a
130−el (UI { nerves, meat, down, hover, children } a) = UI
131− (mempty :: UIView msg)
132− { children =
133− [ { meat
134− , nerves
135− , hover
136− , down
137− } /\ Wrapper (Maybe.fromMaybe none $ Array.head children)
138− ]
139− }
140− a
141−
142160newTabLink :: forall msg a. String -> UI msg a -> UI msg a
143161newTabLink url (UI { nerves, meat, hover, down, children } a) = UI
144162 (mempty :: UIView msg)
@@ -182,11 +200,42 @@ image :: forall msg a. String -> { description :: String } -> GenericUI Unit msg
182200image url description (UI { nerves, meat, hover, down } a) =
183201 UI (mempty :: UIView msg) { children = [ { meat, nerves, hover, down } /\ Image url description ] } a
184202
185−h :: String -> Classes -> Array VNode -> VNode
186−h elem classes children = Maquette.h elem { class: Array.intercalate " " classes } children
187−
188−hWith :: forall props. String -> Record props -> Classes -> Array VNode -> VNode
189−hWith elem props classes children = Maquette.h elem (Record.unsafeUnion props { class: Array.intercalate " " classes }) children
203+textInput :: forall msg a. { value :: String, onChange :: String -> msg } -> GenericUI Unit msg a -> UI msg a
204+textInput props (UI { nerves, meat, hover, down } a) =
205+ UI (mempty :: UIView msg) { children = [ { meat, nerves, hover, down } /\ TextInput props ] } a
206+
207+string :: String -> Classes -> WiredNerves -> String -> VNode
208+string elem classes (WiredNerves on) s =
209+ Snabbdom.h elem
210+ { attrs: Object.singleton "class" (Array.intercalate " " classes)
211+ , on
212+ , style: Object.empty
213+ , props: Object.empty
214+ }
215+ []
216+ (asOneOf s)
217+
218+h :: String -> Classes -> WiredNerves -> Array VNode -> VNode
219+h elem classes (WiredNerves on) children =
220+ Snabbdom.h elem
221+ { attrs: Object.singleton "class" (Array.intercalate " " classes)
222+ , on
223+ , props: Object.empty
224+ , style: Object.empty
225+ }
226+ children
227+ (asOneOf undefined)
228+
229+hWith :: forall props. Homogeneous props String => String -> Record props -> Classes -> WiredNerves -> Array VNode -> VNode
230+hWith elem props classes (WiredNerves on) children =
231+ Snabbdom.h elem
232+ { attrs: Object.singleton "class" (Array.intercalate " " classes)
233+ , on
234+ , props: Object.fromHomogeneous props
235+ , style: Object.empty
236+ }
237+ children
238+ (asOneOf undefined)
190239
191240data Length = Px Int | Fill | Fit | Max Int Length | Min Int Length
192241
@@ -194,13 +243,19 @@ data Alignment = Start | Center | End
194243
195244data Direction = X | Y
196245
246+n :: forall ch msg. Monoid ch => Nerve msg -> GenericUI ch msg Unit
247+n nerve = UI (mempty :: GenericUIView ch msg) { nerves = [ nerve ] } mempty
248+
249+onClick :: forall ch msg. Monoid ch => msg -> GenericUI ch msg Unit
250+onClick msg = n $ OnClick msg
251+
197252m :: forall ch msg. Monoid ch => Meat -> GenericUI ch msg Unit
198253m meat = UI (mempty :: GenericUIView ch msg) { meat = [ meat ] } mempty
199254
200255spacing :: forall ch msg. Monoid ch => { x :: Int, y :: Int } -> GenericUI ch msg Unit
201256spacing { x, y } = m $ Spacing x y
202257
203−explain :: forall ch msg. Monoid ch => GenericUI ch msg Unit
258+explain :: forall ch msg. Monoid ch => Warn (TypeError.Text "Debug explain present") => GenericUI ch msg Unit
204259explain = m Explain
205260
206261align :: forall ch msg. Monoid ch => Direction -> Alignment -> GenericUI ch msg Unit
@@ -242,6 +297,36 @@ onHover (UI { meat } a) = UI (mempty :: GenericUIView ch msg) { hover = meat } a
242297onMouseDown :: forall ch msg. Monoid ch => GenericUI Unit msg Unit -> GenericUI ch msg Unit
243298onMouseDown (UI { meat } a) = UI (mempty :: GenericUIView ch msg) { down = meat } a
244299
300+borders :: forall ch msg. Monoid ch => Int -> GenericUI ch msg Unit
301+borders l = Array.foldMap (\s -> m $ BorderWidth s l) [ Top, Right, Bottom, Left ]
302+
303+border :: forall ch msg. Monoid ch => Side -> Int -> GenericUI ch msg Unit
304+border s l = m $ BorderWidth s l
305+
306+borderStyle :: forall ch msg. Monoid ch => BorderStyle -> GenericUI ch msg Unit
307+borderStyle s = m $ BorderStyle s
308+
309+roundAll :: forall ch msg. Monoid ch => Int -> GenericUI ch msg Unit
310+roundAll l = Array.foldMap (\c -> m $ Round c l) [ TopLeft, TopRight, BottomRight, BottomLeft ]
311+
312+round :: forall ch msg. Monoid ch => Corner -> Int -> GenericUI ch msg Unit
313+round c l = m $ Round c l
314+
315+shadow :: forall ch msg. Monoid ch => ShadowCfg -> GenericUI ch msg Unit
316+shadow cfg = m $ Shadow $ ShadowCfg cfg
317+
318+innerShadow :: forall ch msg. Monoid ch => ShadowCfg -> GenericUI ch msg Unit
319+innerShadow cfg = m $ InnerShadow $ ShadowCfg cfg
320+
321+font :: forall ch msg. Monoid ch => String -> GenericUI ch msg Unit
322+font f = m $ Font f
323+
324+fontSize :: forall ch msg. Monoid ch => Int -> GenericUI ch msg Unit
325+fontSize f = m $ FontSize f
326+
327+fontWeight :: forall ch msg. Monoid ch => Int -> GenericUI ch msg Unit
328+fontWeight f = m $ FontWeight f
329+
245330data Meat
246331 = Spacing Int Int
247332 | Explain
@@ -256,6 +341,51 @@ data Meat
256341 | Pointer
257342 | Move { x :: Int, y :: Int }
258343 | Clip Direction
344+ | BorderWidth Side Int
345+ | BorderStyle BorderStyle
346+ | Round Corner Int
347+ | Shadow Shadow
348+ | InnerShadow Shadow
349+ | FontColor Color
350+ | FontWeight Int
351+ | FontSize Int
352+ | Font Font
353+
354+type Font = String
355+
356+type ShadowCfg = { offset :: { x :: Int, y :: Int }, size :: Number, blur :: Number, color :: Color }
357+
358+newtype Shadow = ShadowCfg ShadowCfg
359+
360+instance Renderable Shadow where
361+ render (ShadowCfg s) = show s.offset.x <> "px " <> show s.offset.y <> "px " <> show s.blur <> "px " <> show s.size <> "px " <> render s.color
362+ renderKey (ShadowCfg s) = show s.offset.x <> "-" <> show s.offset.y <> "-" <> show s.blur <> "-" <> show s.size <> "-" <> renderKey s.color
363+
364+data Corner = TopLeft | TopRight | BottomRight | BottomLeft
365+
366+instance Renderable Corner where
367+ render = case _ of
368+ TopLeft -> "top-left"
369+ TopRight -> "top-right"
370+ BottomRight -> "bottom-right"
371+ BottomLeft -> "bottom-left"
372+ renderKey = case _ of
373+ TopLeft -> "top-left"
374+ TopRight -> "top-right"
375+ BottomRight -> "bottom-right"
376+ BottomLeft -> "bottom-left"
377+
378+data BorderStyle = Solid | Dashed | Dotted
379+
380+instance Renderable BorderStyle where
381+ render = case _ of
382+ Solid -> "solid"
383+ Dashed -> "dashed"
384+ Dotted -> "dotted"
385+ renderKey = case _ of
386+ Solid -> "solid"
387+ Dashed -> "dashed"
388+ Dotted -> "dotted"
259389
260390data Side = Top | Right | Bottom | Left
261391
@@ -273,7 +403,25 @@ instance Renderable Side where
273403
274404data Nerve msg = OnClick msg
275405
276−type View msg = { nerves :: Array (Nerve msg), meat :: Array Meat, hover :: Array Meat, down :: Array Meat } /\ Bones msg
406+newtype WiredNerves = WiredNerves (Object (Event -> Effect Unit))
407+
408+instance Semigroup WiredNerves where
409+ append (WiredNerves x) (WiredNerves y) =
410+ WiredNerves $ Object.unionWith (\f g ev -> f ev *> g ev) x y
411+
412+instance Monoid WiredNerves where
413+ mempty = WiredNerves Object.empty
414+
415+wireNerve :: forall msg. (msg -> Effect Unit) -> Nerve msg -> WiredNerves
416+wireNerve fire nerve = WiredNerves $ case nerve of
417+ OnClick msg -> Object.singleton "click" $ \_ev -> fire msg
418+
419+type View msg =
420+ { nerves :: Array (Nerve msg)
421+ , meat :: Array Meat
422+ , hover :: Array Meat
423+ , down :: Array Meat
424+ } /\ Bones msg
277425
278426none :: forall msg. View msg
279427none = mempty /\ None
@@ -353,6 +501,18 @@ skin ctx = case _ of
353501 Move { x, y } -> sk ("move-" <> show x <> "-" <> show y) "transform" ("translate(" <> show x <> "px, " <> show y <> "px)")
354502 Clip X -> sk "clip-x" "overflow-x" "hidden"
355503 Clip Y -> sk "clip-y" "overflow-y" "hidden"
504+ BorderWidth side l -> sk ("border-width-" <> renderKey side <> "-" <> show l) ("border-" <> render side <> "-width") (show l <> "px")
505+ BorderStyle s -> sk ("border-style-" <> renderKey s) "border-style" (render s)
506+ Round corner l -> sk ("round-" <> renderKey corner <> "-" <> show l) ("border-" <> render corner <> "-radius") (show l <> "px")
507+ Shadow s -> sk ("shadow-" <> renderKey s) "box-shadow" (render s)
508+ InnerShadow s -> sk ("inner-shadow-" <> renderKey s) "box-shadow" (render s <> " inset")
509+ FontColor c -> sk ("font-color-" <> renderKey c) "color" (render c)
510+ FontSize l -> sk ("font-size-" <> show l) "font-size" (show l <> "px")
511+ Font f -> sk ("font-" <> removeSpaces f) "font-family" f
512+ FontWeight w -> sk ("font-weight-" <> show w) "font-weight" (show w)
513+
514+removeSpaces :: String -> String
515+removeSpaces = String.replaceAll (String.Pattern " ") (String.Replacement "-")
356516
357517class Renderable x where
358518 render :: x -> String
@@ -400,6 +560,7 @@ data Bones msg
400560 | Link String { newTab :: Boolean } (View msg)
401561 | Download String { filename :: Maybe String } (View msg)
402562 | Image String { description :: String }
563+ | TextInput { value :: String, onChange :: String -> msg }
403564 | None
404565
405566type Classes = Array String
@@ -437,6 +598,7 @@ instance Monoid SkinGrowth where
437598growSkin :: forall msg. (msg -> Effect Unit) -> Mutation -> View msg -> Writer SkinGrowth VNode
438599growSkin fire (Mutation mutation) ({ meat, hover, down, nerves } /\ bones) = do
439600 let
601+ wiredNerves = Array.foldMap (wireNerve fire) nerves
440602 alignCenter = [ Align X Center, Align Y Center ]
441603 widthFill = [ Width Fill, Height Fill ]
442604 skn ctx = do
@@ -475,25 +637,25 @@ growSkin fire (Mutation mutation) ({ meat, hover, down, nerves } /\ bones) = do
475637 pure $ meatClasses <> map (_ <> "-hover") (Array.concat hoverClasses) <> map (_ <> "-down") (Array.concat downClasses)
476638
477639 case bones of
478− Text t -> (\c -> h "span" c [ string t ]) <$> (skn Span)
640+ Text t -> (\c -> string "span" c wiredNerves t) <$> (skn Span)
479641 Wrapper x -> do
480642 classes <- (skn (Flexbox X) <> sk "display-flex" "display" "flex" <> sk "flex-direction-row" "flex-direction" "row")
481643 x' <- growSkin fire mempty x
482− pure $ h "div" classes [ x' ]
644+ pure $ h "div" classes wiredNerves [ x' ]
483645 Stack children -> do
484646 classes <- (skn Grid <> sk "display-grid" "display" "grid")
485647 extraSkin <- sk "grid-row-1" "grid-row" "1" <> sk "grid-column-1" "grid-column" "1"
486648 children' <- (traverse (growSkin fire $ Mutation { extraSkin }) children)
487− pure $ h "div" classes children'
649+ pure $ h "div" classes wiredNerves children'
488650
489651 Row children -> do
490652 classes <- (skn (Flexbox X) <> sk "display-flex" "display" "flex" <> sk "flex-direction-row" "flex-direction" "row")
491653 children' <- traverse (growSkin fire mempty) children
492− pure $ h "div" classes children'
654+ pure $ h "div" classes wiredNerves children'
493655 Column children -> do
494656 classes <- (skn (Flexbox Y) <> sk "display-flex" "display" "flex" <> sk "flex-direction-column" "flex-direction" "column")
495657 children' <- traverse (growSkin fire mempty) children
496− pure $ h "div" classes children'
658+ pure $ h "div" classes wiredNerves children'
497659 Link href { newTab } child -> do
498660 classes <- (skn (Flexbox X) <> sk "display-flex" "display" "flex" <> sk "flex-direction-row" "flex-direction" "row")
499661 child' <- growSkin fire mempty child
@@ -503,6 +665,7 @@ growSkin fire (Mutation mutation) ({ meat, hover, down, nerves } /\ bones) = do
503665 , target: if newTab then "_blank" else "_self"
504666 }
505667 classes
668+ wiredNerves
506669 [ child' ]
507670
508671 Download href { filename } child -> do
@@ -513,9 +676,20 @@ growSkin fire (Mutation mutation) ({ meat, hover, down, nerves } /\ bones) = do
513676 , download: Maybe.fromMaybe "" filename
514677 }
515678 classes
679+ wiredNerves
516680 [ child' ]
517− Image src { description } -> (\c -> hWith "img" { src, alt: description } c []) <$> (skn Generic)
518− None -> pure $ h "div" mempty []
681+ Image src { description } -> (\c -> hWith "img" { src, alt: description } c wiredNerves []) <$> (skn Generic)
682+ TextInput { value, onChange } -> do
683+ classes <- skn Generic
684+ let
685+ onInputNerve = WiredNerves $ Object.singleton "input" $ \ev ->
686+ case Event.currentTarget ev >>= HTMLInputElement.fromEventTarget of
687+ Nothing -> pure unit
688+ Just inputEl -> do
689+ val <- HTMLInputElement.value inputEl
690+ fire $ onChange val
691+ pure $ hWith "input" { value } classes (wiredNerves <> onInputNerve) []
692+ None -> pure $ h "div" mempty wiredNerves []
519693
520694grow :: forall msg. (msg -> Effect Unit) -> View msg -> { node :: VNode, style :: String }
521695grow fire v =
@@ -523,3 +697,4 @@ grow fire v =
523697 node /\ skinGrowth = runWriter (growSkin fire mempty v)
524698 in
525699 { node, style: styleSkinGrowth skinGrowth }
700+
plum/src/Snabbdom.jsnew file+1
@@ -0,0 +1 @@
1+function m(f,G){let z,W=G.elm,X=f.data.attrs,Z=G.data.attrs;if(!X&&!Z)return;if(X===Z)return;X=X||{},Z=Z||{};for(z in Z){let K=Z[z];if(X[z]!==K)if(K===!0)W.setAttribute(z,"");else if(K===!1)W.removeAttribute(z);else if(z.charCodeAt(0)!==120)W.setAttribute(z,K);else if(z.charCodeAt(3)===58)W.setAttributeNS("http://www.w3.org/XML/1998/namespace",z,K);else if(z.charCodeAt(5)===58)z.charCodeAt(1)===109?W.setAttributeNS("http://www.w3.org/2000/xmlns/",z,K):W.setAttributeNS("http://www.w3.org/1999/xlink",z,K);else W.setAttribute(z,K)}for(z in X)if(!(z in Z))W.removeAttribute(z)}var s={create:m,update:m};function r(f,G,z){if(typeof f==="function")f.call(G,z,G);else if(typeof f==="object")for(let W=0;W<f.length;W++)r(f[W],G,z)}function G0(f,G){let z=f.type,W=G.data.on;if(W&&W[z])r(W[z],G,f)}function J0(){return function f(G){G0(G,f.vnode)}}function x(f,G){let z=f.data.on,W=f.listener,X=f.elm,Z=G&&G.data.on,K=G&&G.elm,U;if(z===Z)return;if(z&&W){if(!Z)for(U in z)X.removeEventListener(U,W,!1);else for(U in z)if(!Z[U])X.removeEventListener(U,W,!1)}if(Z){let D=G.listener=f.listener||J0();if(D.vnode=G,!z)for(U in Z)K.addEventListener(U,D,!1);else for(U in Z)if(!z[U])K.addEventListener(U,D,!1)}}var l={create:x,update:x,destroy:x};function N(f,G,z,W,X){let Z=G===void 0?void 0:G.key;return{sel:f,data:G,children:z,text:W,elm:X,key:Z}}var u=Array.isArray;function a(f){return typeof f==="string"||typeof f==="number"||f instanceof String||f instanceof Number}function Y0(f,G){return document.createElement(f,G)}function Z0(f,G,z){return document.createElementNS(f,G,z)}function $0(){return I(document.createDocumentFragment())}function B0(f){return document.createTextNode(f)}function q0(f){return document.createComment(f)}function K0(f,G,z){if(S(f)){let W=f;while(W&&S(W))W=I(W).parent;f=W!==null&&W!==void 0?W:f}if(S(G))G=I(G,f);if(z&&S(z))z=I(z).firstChildNode;f.insertBefore(G,z)}function P0(f,G){f.removeChild(G)}function H0(f,G){if(S(G))G=I(G,f);f.appendChild(G)}function t(f){if(S(f)){while(f&&S(f))f=I(f).parent;return f!==null&&f!==void 0?f:null}return f.parentNode}function O0(f){var G;if(S(f)){let z=I(f),W=t(z);if(W&&z.lastChildNode){let X=Array.from(W.childNodes),Z=X.indexOf(z.lastChildNode);return(G=X[Z+1])!==null&&G!==void 0?G:null}return null}return f.nextSibling}function U0(f){return f.tagName}function R0(f,G){f.textContent=G}function T0(f){return f.textContent}function L0(f){return f.nodeType===1}function M0(f){return f.nodeType===3}function D0(f){return f.nodeType===8}function S(f){return f.nodeType===11}function I(f,G){var z,W,X;let Z=f;return(z=Z.parent)!==null&&z!==void 0||(Z.parent=G!==null&&G!==void 0?G:null),(W=Z.firstChildNode)!==null&&W!==void 0||(Z.firstChildNode=f.firstChild),(X=Z.lastChildNode)!==null&&X!==void 0||(Z.lastChildNode=f.lastChild),Z}var E={createElement:Y0,createElementNS:Z0,createTextNode:B0,createDocumentFragment:$0,createComment:q0,insertBefore:K0,removeChild:P0,appendChild:H0,parentNode:t,nextSibling:O0,tagName:U0,setTextContent:R0,getTextContent:T0,isElement:L0,isText:M0,isComment:D0,isDocumentFragment:S};var V=N("",{},[],void 0,void 0);function w(f,G){var z,W;let X=f.key===G.key,Z=((z=f.data)===null||z===void 0?void 0:z.is)===((W=G.data)===null||W===void 0?void 0:W.is),K=f.sel===G.sel,U=!f.sel&&f.sel===G.sel?typeof f.text===typeof G.text:!0;return K&&X&&Z&&U}function A0(){throw new Error("The document fragment is not supported on this platform.")}function j0(f,G){return f.isElement(G)}function F0(f,G){return f.isDocumentFragment(G)}function Q0(f,G,z){var W;let X={};for(let Z=G;Z<=z;++Z){let K=(W=f[Z])===null||W===void 0?void 0:W.key;if(K!==void 0)X[K]=Z}return X}var g0=["create","update","remove","destroy","pre","post"];function n(f,G,z){let W={create:[],update:[],remove:[],destroy:[],pre:[],post:[]},X=G!==void 0?G:E;for(let J of g0)for(let Y of f){let $=Y[J];if($!==void 0)W[J].push($)}function Z(J){let Y=J.id?"#"+J.id:"",$=J.getAttribute("class"),B=$?"."+$.split(" ").join("."):"";return N(X.tagName(J).toLowerCase()+Y+B,{},[],void 0,J)}function K(J){return N(void 0,{},[],void 0,J)}function U(J,Y){return function $(){if(--Y===0){let B=X.parentNode(J);if(B!==null)X.removeChild(B,J)}}}function D(J,Y){var $,B,P,O,L;let q,R=J.data,M=R===null||R===void 0?void 0:R.hook;($=M===null||M===void 0?void 0:M.init)===null||$===void 0||$.call(M,J);let{children:T,sel:H}=J;if(H==="!")(B=J.text)!==null&&B!==void 0||(J.text=""),J.elm=X.createComment(J.text);else if(H==="")J.elm=X.createTextNode(J.text);else if(H!==void 0){let A=H.indexOf("#"),j=H.indexOf(".",A),F=A>0?A:H.length,b=j>0?j:H.length,i=A!==-1||j!==-1?H.slice(0,Math.min(F,b)):H,p=R===null||R===void 0?void 0:R.ns,_=p===void 0?X.createElement(i,R):X.createElementNS(p,i,R);if(J.elm=_,F<b)_.setAttribute("id",H.slice(F+1,b));if(j>0)_.setAttribute("class",H.slice(b+1).replace(/\./g," "));for(q=0;q<W.create.length;++q)W.create[q](V,J);if(a(J.text)&&(!u(T)||T.length===0))X.appendChild(_,X.createTextNode(J.text));if(u(T))for(q=0;q<T.length;++q){let v=T[q];if(v!=null)X.appendChild(_,D(v,Y))}if(M!==void 0){if((P=M.create)===null||P===void 0||P.call(M,V,J),M.insert!==void 0)Y.push(J)}}else if(((O=z===null||z===void 0?void 0:z.experimental)===null||O===void 0?void 0:O.fragments)&&J.children){J.elm=((L=X.createDocumentFragment)!==null&&L!==void 0?L:A0)();for(q=0;q<W.create.length;++q)W.create[q](V,J);for(q=0;q<J.children.length;++q){let A=J.children[q];if(A!=null)X.appendChild(J.elm,D(A,Y))}}else J.elm=X.createTextNode(J.text);return J.elm}function y(J,Y,$,B,P,O){for(;B<=P;++B){let L=$[B];if(L!=null)X.insertBefore(J,D(L,O),Y)}}function k(J){var Y,$;let B=J.data;if(B!==void 0){($=(Y=B===null||B===void 0?void 0:B.hook)===null||Y===void 0?void 0:Y.destroy)===null||$===void 0||$.call(Y,J);for(let P=0;P<W.destroy.length;++P)W.destroy[P](J);if(J.children!==void 0)for(let P=0;P<J.children.length;++P){let O=J.children[P];if(O!=null&&typeof O!=="string")k(O)}}}function g(J,Y,$,B){var P,O;for(;$<=B;++$){let L,q=Y[$];if(q!=null)if(q.sel!==void 0){k(q),L=W.remove.length+1;let R=U(q.elm,L);for(let T=0;T<W.remove.length;++T)W.remove[T](q,R);let M=(O=(P=q===null||q===void 0?void 0:q.data)===null||P===void 0?void 0:P.hook)===null||O===void 0?void 0:O.remove;if(M!==void 0)M(q,R);else R()}else if(q.children)k(q),g(J,q.children,0,q.children.length-1);else X.removeChild(J,q.elm)}}function C(J,Y,$,B){let P=0,O=0,L=Y.length-1,q=Y[0],R=Y[L],M=$.length-1,T=$[0],H=$[M],A,j,F,b;while(P<=L&&O<=M)if(q==null)q=Y[++P];else if(R==null)R=Y[--L];else if(T==null)T=$[++O];else if(H==null)H=$[--M];else if(w(q,T))Q(q,T,B),q=Y[++P],T=$[++O];else if(w(R,H))Q(R,H,B),R=Y[--L],H=$[--M];else if(w(q,H))Q(q,H,B),X.insertBefore(J,q.elm,X.nextSibling(R.elm)),q=Y[++P],H=$[--M];else if(w(R,T))Q(R,T,B),X.insertBefore(J,R.elm,q.elm),R=Y[--L],T=$[++O];else{if(A===void 0)A=Q0(Y,P,L);if(j=A[T.key],j===void 0)X.insertBefore(J,D(T,B),q.elm),T=$[++O];else if(A[H.key]===void 0)X.insertBefore(J,D(H,B),X.nextSibling(R.elm)),H=$[--M];else{if(F=Y[j],F.sel!==T.sel)X.insertBefore(J,D(T,B),q.elm);else Q(F,T,B),Y[j]=void 0,X.insertBefore(J,F.elm,q.elm);T=$[++O]}}if(O<=M)b=$[M+1]==null?null:$[M+1].elm,y(J,b,$,O,M,B);if(P<=L)g(J,Y,P,L)}function Q(J,Y,$){var B,P,O,L,q,R,M,T;let H=(B=Y.data)===null||B===void 0?void 0:B.hook;(P=H===null||H===void 0?void 0:H.prepatch)===null||P===void 0||P.call(H,J,Y);let A=Y.elm=J.elm;if(J===Y)return;if(Y.data!==void 0||Y.text!==void 0&&Y.text!==J.text){(O=Y.data)!==null&&O!==void 0||(Y.data={}),(L=J.data)!==null&&L!==void 0||(J.data={});for(let b=0;b<W.update.length;++b)W.update[b](J,Y);(M=(R=(q=Y.data)===null||q===void 0?void 0:q.hook)===null||R===void 0?void 0:R.update)===null||M===void 0||M.call(R,J,Y)}let j=J.children,F=Y.children;if(Y.text===void 0){if(j!==void 0&&F!==void 0){if(j!==F)C(A,j,F,$)}else if(F!==void 0){if(J.text!==void 0)X.setTextContent(A,"");y(A,null,F,0,F.length-1,$)}else if(j!==void 0)g(A,j,0,j.length-1);else if(J.text!==void 0)X.setTextContent(A,"")}else if(J.text!==Y.text){if(j!==void 0)g(A,j,0,j.length-1);X.setTextContent(A,Y.text)}(T=H===null||H===void 0?void 0:H.postpatch)===null||T===void 0||T.call(H,J,Y)}return function J(Y,$){let B,P,O,L=[];for(B=0;B<W.pre.length;++B)W.pre[B]();if(j0(X,Y))Y=Z(Y);else if(F0(X,Y))Y=K(Y);if(w(Y,$))Q(Y,$,L);else if(P=Y.elm,O=X.parentNode(P),D($,L),O!==null)X.insertBefore(O,$.elm,X.nextSibling(P)),g(O,[Y],0,0);for(B=0;B<L.length;++B)L[B].data.hook.insert(L[B]);for(B=0;B<W.post.length;++B)W.post[B]();return $}}var o=typeof(window===null||window===void 0?void 0:window.requestAnimationFrame)==="function"?window.requestAnimationFrame.bind(window):setTimeout,b0=(f)=>{o(()=>{o(f)})},c=!1;function k0(f,G,z){b0(()=>{f[G]=z})}function d(f,G){let z,W,X=G.elm,Z=f.data.style,K=G.data.style;if(!Z&&!K)return;if(Z===K)return;Z=Z||{},K=K||{};let U="delayed"in Z;for(W in Z)if(!(W in K))if(W[0]==="-"&&W[1]==="-")X.style.removeProperty(W);else X.style[W]="";for(W in K)if(z=K[W],W==="delayed"&&K.delayed){for(let D in K.delayed)if(z=K.delayed[D],!U||z!==Z.delayed[D])k0(X.style,D,z)}else if(W!=="remove"&&z!==Z[W])if(W[0]==="-"&&W[1]==="-")X.style.setProperty(W,z);else X.style[W]=z}function N0(f){let G,z,W=f.elm,X=f.data.style;if(!X||!(G=X.destroy))return;for(z in G)W.style[z]=G[z]}function S0(f,G){let z=f.data.style;if(!z||!z.remove){G();return}if(!c)f.elm.offsetLeft,c=!0;let W,X=f.elm,Z=0,K=z.remove,U=0,D=[];for(W in K)D.push(W),X.style[W]=K[W];let k=getComputedStyle(X)["transition-property"].split(", ");for(;Z<k.length;++Z)if(D.indexOf(k[Z])!==-1)U++;X.addEventListener("transitionend",(g)=>{if(g.target===X)--U;if(U===0)G()})}function y0(){c=!1}var e={pre:y0,create:d,update:d,destroy:N0,remove:S0};function f0(f,G){let z,W,X,Z=G.elm,K=f.data.props,U=G.data.props;if(!K&&!U)return;if(K===U)return;K=K||{},U=U||{};for(z in U)if(W=U[z],X=K[z],X!==W&&(z!=="value"||Z[z]!==W))Z[z]=W}var W0={create:f0,update:f0};function h(f,G,z){if(f.ns="http://www.w3.org/2000/svg",z!=="foreignObject"&&G!==void 0)for(let W=0;W<G.length;++W){let X=G[W];if(typeof X==="string")continue;let Z=X.data;if(Z!==void 0)h(Z,X.children,X.sel)}}function I0(f){return f.slice(5).replace(/-([a-z])/g,(G,z)=>z.toUpperCase())}function z0(f,G){var z;let W=G!==void 0?G:E,X;if(W.isElement(f)){let Z=f.id?"#"+f.id:"",K=(z=f.getAttribute("class"))===null||z===void 0?void 0:z.match(/[^\t\r\n\f ]+/g),U=K?"."+K.join("."):"",D=W.tagName(f).toLowerCase()+Z+U,y={},k={},g={},C=[],Q,J,Y,$=f.attributes,B=f.childNodes;for(J=0,Y=$.length;J<Y;J++)if(Q=$[J].nodeName,Q.startsWith("data-"))k[I0(Q)]=$[J].nodeValue||"";else if(Q!=="id"&&Q!=="class")y[Q]=$[J].nodeValue;for(J=0,Y=B.length;J<Y;J++)C.push(z0(B[J],G));if(Object.keys(y).length>0)g.attrs=y;if(Object.keys(k).length>0)g.dataset=k;if(D.startsWith("svg")&&(D.length===3||D[3]==="."||D[3]==="#"))h(g,C,D);return N(D,g,C,void 0,f)}else if(W.isText(f))return X=W.getTextContent(f),N(void 0,void 0,void 0,X,f);else if(W.isComment(f))return X=W.getTextContent(f),N("!",{},[],X,f);else return N("",{},[],void 0,f)}function o0(){return n([s,l,e,W0])}export{N as vnode,z0 as toVNode,o0 as initWithModules};
plum/src/Snabbdom.pursnew file+45
@@ -0,0 +1,45 @@
1+module Snabbdom (h, VNode, init, toVNode) where
2+
3+import Prelude
4+
5+import Data.Function.Uncurried (Fn4, runFn4)
6+import Effect (Effect)
7+import Effect.Uncurried (EffectFn1, EffectFn2, mkEffectFn1, runEffectFn2)
8+import Foreign.Object (Object)
9+import Literals.Undefined (Undefined)
10+import Untagged.Union (type (|+|))
11+import Web.DOM (Element)
12+import Web.Event.Event (Event)
13+
14+foreign import data VNode :: Type
15+
16+foreign import initWithModules :: Effect (EffectFn2 VNode VNode VNode)
17+
18+init :: Effect (VNode -> VNode -> Effect VNode)
19+init = initWithModules <#> runEffectFn2
20+
21+foreign import vnode :: forall props. Fn4 String (Record props) (Array VNode) (String |+| Undefined) VNode
22+
23+h
24+ :: String
25+ -> { attrs :: Object String
26+ , on :: Object (Event -> Effect Unit)
27+ , style :: Object String
28+ , props :: Object String
29+ }
30+ -> Array VNode
31+ -> (String |+| Undefined)
32+ -> VNode
33+h tag props children text = runFn4 vnode
34+ tag
35+ ( props { on = mkEffectFn1 <$> props.on }
36+ :: { attrs :: Object String
37+ , on :: Object (EffectFn1 Event Unit)
38+ , style :: Object String
39+ , props :: Object String
40+ }
41+ )
42+ children
43+ text
44+
45+foreign import toVNode :: Element -> VNode