git.iko.soy/purestack-dev/purescript-plum
on master help sign in
.gitignore+1
since splitsnapshots
unifiedsplit
@@ -8,3 +8,4 @@
8/.purs*
8/.purs*
9/.psa*
9/.psa*
10/.spago
10/.spago
11+plum/index.js
plum/index.jsdeleted−3406
@@ -1,3406 +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 toArrayWithKey(f) {
1987− return function(m2) {
1988− var r = [];
1989− for (var k in m2) {
1990− if (hasOwnProperty.call(m2, k)) {
1991− r.push(f(k)(m2[k]));
1992− }
1993− }
1994− return r;
1995− };
1996− }
1997− var keys = Object.keys || toArrayWithKey(function(k) {
1998− return function() {
1999− return k;
2000− };
2001− });
2002−
2003− // output/Foreign.Object.ST/foreign.js
2004− var newImpl = function() {
2005− return {};
2006− };
2007− function poke2(k) {
2008− return function(v) {
2009− return function(m2) {
2010− return function() {
2011− m2[k] = v;
2012− return m2;
2013− };
2014− };
2015− };
2016− }
2017−
2018− // output/Foreign.Object/index.js
2019− var bindFlipped2 = /* @__PURE__ */ bindFlipped(bindST);
2020− var foldr2 = /* @__PURE__ */ foldr(foldableArray);
2021− var identity4 = /* @__PURE__ */ identity(categoryFn);
2022− var values = /* @__PURE__ */ toArrayWithKey(function(v) {
2023− return function(v1) {
2024− return v1;
2025− };
2026− });
2027− var thawST = _copyST;
2028− var singleton2 = function(k) {
2029− return function(v) {
2030− return runST(bindFlipped2(poke2(k)(v))(newImpl));
2031− };
2032− };
2033− var mutate = function(f) {
2034− return function(m2) {
2035− return runST(function __do() {
2036− var s = thawST(m2)();
2037− f(s)();
2038− return s;
2039− });
2040− };
2041− };
2042− var mapWithKey = function(f) {
2043− return function(m2) {
2044− return _mapWithKey(m2, f);
2045− };
2046− };
2047− var insert = function(k) {
2048− return function(v) {
2049− return mutate(poke2(k)(v));
2050− };
2051− };
2052− var functorObject = {
2053− map: function(f) {
2054− return function(m2) {
2055− return _fmapObject(m2, f);
2056− };
2057− }
2058− };
2059− var functorWithIndexObject = {
2060− mapWithIndex: mapWithKey,
2061− Functor0: function() {
2062− return functorObject;
2063− }
2064− };
2065− var foldM = function(dictMonad) {
2066− var bind1 = bind(dictMonad.Bind1());
2067− var pure1 = pure(dictMonad.Applicative0());
2068− return function(f) {
2069− return function(z) {
2070− return _foldM(bind1)(f)(pure1(z));
2071− };
2072− };
2073− };
2074− var foldM1 = /* @__PURE__ */ foldM(monadST);
2075− var union = function(m2) {
2076− return mutate(function(s) {
2077− return foldM1(function(s$prime) {
2078− return function(k) {
2079− return function(v) {
2080− return poke2(k)(v)(s$prime);
2081− };
2082− };
2083− })(s)(m2);
2084− });
2085− };
2086− var fold2 = /* @__PURE__ */ _foldM(applyFlipped);
2087− var foldMap2 = function(dictMonoid) {
2088− var append1 = append(dictMonoid.Semigroup0());
2089− var mempty6 = mempty(dictMonoid);
2090− return function(f) {
2091− return fold2(function(acc) {
2092− return function(k) {
2093− return function(v) {
2094− return append1(acc)(f(k)(v));
2095− };
2096− };
2097− })(mempty6);
2098− };
2099− };
2100− var foldableObject = {
2101− foldl: function(f) {
2102− return fold2(function(z) {
2103− return function(v) {
2104− return f(z);
2105− };
2106− });
2107− },
2108− foldr: function(f) {
2109− return function(z) {
2110− return function(m2) {
2111− return foldr2(f)(z)(values(m2));
2112− };
2113− };
2114− },
2115− foldMap: function(dictMonoid) {
2116− var foldMap1 = foldMap2(dictMonoid);
2117− return function(f) {
2118− return foldMap1($$const(f));
2119− };
2120− }
2121− };
2122− var foldableWithIndexObject = {
2123− foldlWithIndex: function(f) {
2124− return fold2(flip(f));
2125− },
2126− foldrWithIndex: function(f) {
2127− return function(z) {
2128− return function(m2) {
2129− return foldr2(uncurry(f))(z)(toArrayWithKey(Tuple.create)(m2));
2130− };
2131− };
2132− },
2133− foldMapWithIndex: function(dictMonoid) {
2134− return foldMap2(dictMonoid);
2135− },
2136− Foldable0: function() {
2137− return foldableObject;
2138− }
2139− };
2140− var traversableWithIndexObject = {
2141− traverseWithIndex: function(dictApplicative) {
2142− var Apply0 = dictApplicative.Apply0();
2143− var apply2 = apply(Apply0);
2144− var map4 = map(Apply0.Functor0());
2145− var pure1 = pure(dictApplicative);
2146− return function(f) {
2147− return function(ms) {
2148− return fold2(function(acc) {
2149− return function(k) {
2150− return function(v) {
2151− return apply2(map4(flip(insert(k)))(acc))(f(k)(v));
2152− };
2153− };
2154− })(pure1(empty2))(ms);
2155− };
2156− };
2157− },
2158− FunctorWithIndex0: function() {
2159− return functorWithIndexObject;
2160− },
2161− FoldableWithIndex1: function() {
2162− return foldableWithIndexObject;
2163− },
2164− Traversable2: function() {
2165− return traversableObject;
2166− }
2167− };
2168− var traversableObject = {
2169− traverse: function(dictApplicative) {
2170− var $96 = traverseWithIndex(traversableWithIndexObject)(dictApplicative);
2171− return function($97) {
2172− return $96($$const($97));
2173− };
2174− },
2175− sequence: function(dictApplicative) {
2176− return traverse(traversableObject)(dictApplicative)(identity4);
2177− },
2178− Functor0: function() {
2179− return functorObject;
2180− },
2181− Foldable1: function() {
2182− return foldableObject;
2183− }
2184− };
2185−
2186− // output/Record.Unsafe.Union/foreign.js
2187− function unsafeUnionFn(r1, r2) {
2188− var copy = {};
2189− for (var k1 in r2) {
2190− if ({}.hasOwnProperty.call(r2, k1)) {
2191− copy[k1] = r2[k1];
2192− }
2193− }
2194− for (var k2 in r1) {
2195− if ({}.hasOwnProperty.call(r1, k2)) {
2196− copy[k2] = r1[k2];
2197− }
2198− }
2199− return copy;
2200− }
2201−
2202− // output/Record.Unsafe.Union/index.js
2203− var unsafeUnion = /* @__PURE__ */ runFn2(unsafeUnionFn);
2204−
2205− // output/Plum.View/index.js
2206− var append2 = /* @__PURE__ */ append(semigroupArray);
2207− var semigroupRecord3 = /* @__PURE__ */ semigroupRecord();
2208− var childrenIsSymbol = {
2209− reflectSymbol: function() {
2210− return "children";
2211− }
2212− };
2213− var downIsSymbol = {
2214− reflectSymbol: function() {
2215− return "down";
2216− }
2217− };
2218− var hoverIsSymbol = {
2219− reflectSymbol: function() {
2220− return "hover";
2221− }
2222− };
2223− var meatIsSymbol = {
2224− reflectSymbol: function() {
2225− return "meat";
2226− }
2227− };
2228− var nervesIsSymbol = {
2229− reflectSymbol: function() {
2230− return "nerves";
2231− }
2232− };
2233− var semigroupRecordCons2 = /* @__PURE__ */ semigroupRecordCons(childrenIsSymbol)()(/* @__PURE__ */ semigroupRecordCons(downIsSymbol)()(/* @__PURE__ */ semigroupRecordCons(hoverIsSymbol)()(/* @__PURE__ */ semigroupRecordCons(meatIsSymbol)()(/* @__PURE__ */ semigroupRecordCons(nervesIsSymbol)()(semigroupRecordNil)(semigroupArray))(semigroupArray))(semigroupArray))(semigroupArray));
2234− var show2 = /* @__PURE__ */ show(showInt);
2235− var mempty2 = /* @__PURE__ */ mempty(monoidArray);
2236− var monoidRecord2 = /* @__PURE__ */ monoidRecord();
2237− var monoidRecordCons2 = /* @__PURE__ */ monoidRecordCons(childrenIsSymbol);
2238− var monoidRecordCons1 = /* @__PURE__ */ monoidRecordCons(downIsSymbol)(monoidArray)()(/* @__PURE__ */ monoidRecordCons(hoverIsSymbol)(monoidArray)()(/* @__PURE__ */ monoidRecordCons(meatIsSymbol)(monoidArray)()(/* @__PURE__ */ monoidRecordCons(nervesIsSymbol)(monoidArray)()(monoidRecordNil))));
2239− var mempty1 = /* @__PURE__ */ mempty(/* @__PURE__ */ monoidRecord2(/* @__PURE__ */ monoidRecordCons2(monoidArray)()(monoidRecordCons1)));
2240− var foldMap3 = /* @__PURE__ */ foldMap2(monoidString);
2241− var show1 = /* @__PURE__ */ show(showNumber);
2242− var mempty22 = /* @__PURE__ */ mempty(monoidUnit);
2243− var intercalate3 = /* @__PURE__ */ intercalate2(monoidString);
2244− var map2 = /* @__PURE__ */ map(/* @__PURE__ */ functorWriterT(functorIdentity));
2245− var map1 = /* @__PURE__ */ map(functorArray);
2246− var Top = /* @__PURE__ */ function() {
2247− function Top2() {
2248− }
2249− ;
2250− Top2.value = new Top2();
2251− return Top2;
2252− }();
2253− var Right2 = /* @__PURE__ */ function() {
2254− function Right3() {
2255− }
2256− ;
2257− Right3.value = new Right3();
2258− return Right3;
2259− }();
2260− var Bottom = /* @__PURE__ */ function() {
2261− function Bottom2() {
2262− }
2263− ;
2264− Bottom2.value = new Bottom2();
2265− return Bottom2;
2266− }();
2267− var Left2 = /* @__PURE__ */ function() {
2268− function Left3() {
2269− }
2270− ;
2271− Left3.value = new Left3();
2272− return Left3;
2273− }();
2274− var Px = /* @__PURE__ */ function() {
2275− function Px2(value0) {
2276− this.value0 = value0;
2277− }
2278− ;
2279− Px2.create = function(value0) {
2280− return new Px2(value0);
2281− };
2282− return Px2;
2283− }();
2284− var Fill = /* @__PURE__ */ function() {
2285− function Fill2() {
2286− }
2287− ;
2288− Fill2.value = new Fill2();
2289− return Fill2;
2290− }();
2291− var Fit = /* @__PURE__ */ function() {
2292− function Fit2() {
2293− }
2294− ;
2295− Fit2.value = new Fit2();
2296− return Fit2;
2297− }();
2298− var Max2 = /* @__PURE__ */ function() {
2299− function Max3(value0, value1) {
2300− this.value0 = value0;
2301− this.value1 = value1;
2302− }
2303− ;
2304− Max3.create = function(value0) {
2305− return function(value1) {
2306− return new Max3(value0, value1);
2307− };
2308− };
2309− return Max3;
2310− }();
2311− var Min2 = /* @__PURE__ */ function() {
2312− function Min3(value0, value1) {
2313− this.value0 = value0;
2314− this.value1 = value1;
2315− }
2316− ;
2317− Min3.create = function(value0) {
2318− return function(value1) {
2319− return new Min3(value0, value1);
2320− };
2321− };
2322− return Min3;
2323− }();
2324− var X = /* @__PURE__ */ function() {
2325− function X2() {
2326− }
2327− ;
2328− X2.value = new X2();
2329− return X2;
2330− }();
2331− var Y = /* @__PURE__ */ function() {
2332− function Y2() {
2333− }
2334− ;
2335− Y2.value = new Y2();
2336− return Y2;
2337− }();
2338− var Grid = /* @__PURE__ */ function() {
2339− function Grid2() {
2340− }
2341− ;
2342− Grid2.value = new Grid2();
2343− return Grid2;
2344− }();
2345− var Flexbox = /* @__PURE__ */ function() {
2346− function Flexbox2(value0) {
2347− this.value0 = value0;
2348− }
2349− ;
2350− Flexbox2.create = function(value0) {
2351− return new Flexbox2(value0);
2352− };
2353− return Flexbox2;
2354− }();
2355− var Generic = /* @__PURE__ */ function() {
2356− function Generic2() {
2357− }
2358− ;
2359− Generic2.value = new Generic2();
2360− return Generic2;
2361− }();
2362− var Span = /* @__PURE__ */ function() {
2363− function Span2() {
2364− }
2365− ;
2366− Span2.value = new Span2();
2367− return Span2;
2368− }();
2369− var Start = /* @__PURE__ */ function() {
2370− function Start2() {
2371− }
2372− ;
2373− Start2.value = new Start2();
2374− return Start2;
2375− }();
2376− var Center = /* @__PURE__ */ function() {
2377− function Center2() {
2378− }
2379− ;
2380− Center2.value = new Center2();
2381− return Center2;
2382− }();
2383− var End = /* @__PURE__ */ function() {
2384− function End2() {
2385− }
2386− ;
2387− End2.value = new End2();
2388− return End2;
2389− }();
2390− var Spacing = /* @__PURE__ */ function() {
2391− function Spacing2(value0, value1) {
2392− this.value0 = value0;
2393− this.value1 = value1;
2394− }
2395− ;
2396− Spacing2.create = function(value0) {
2397− return function(value1) {
2398− return new Spacing2(value0, value1);
2399− };
2400− };
2401− return Spacing2;
2402− }();
2403− var Explain = /* @__PURE__ */ function() {
2404− function Explain2() {
2405− }
2406− ;
2407− Explain2.value = new Explain2();
2408− return Explain2;
2409− }();
2410− var Align = /* @__PURE__ */ function() {
2411− function Align2(value0, value1) {
2412− this.value0 = value0;
2413− this.value1 = value1;
2414− }
2415− ;
2416− Align2.create = function(value0) {
2417− return function(value1) {
2418− return new Align2(value0, value1);
2419− };
2420− };
2421− return Align2;
2422− }();
2423− var Width = /* @__PURE__ */ function() {
2424− function Width2(value0) {
2425− this.value0 = value0;
2426− }
2427− ;
2428− Width2.create = function(value0) {
2429− return new Width2(value0);
2430− };
2431− return Width2;
2432− }();
2433− var Height = /* @__PURE__ */ function() {
2434− function Height2(value0) {
2435− this.value0 = value0;
2436− }
2437− ;
2438− Height2.create = function(value0) {
2439− return new Height2(value0);
2440− };
2441− return Height2;
2442− }();
2443− var Wrapped = /* @__PURE__ */ function() {
2444− function Wrapped2() {
2445− }
2446− ;
2447− Wrapped2.value = new Wrapped2();
2448− return Wrapped2;
2449− }();
2450− var BackgroundColor = /* @__PURE__ */ function() {
2451− function BackgroundColor2(value0) {
2452− this.value0 = value0;
2453− }
2454− ;
2455− BackgroundColor2.create = function(value0) {
2456− return new BackgroundColor2(value0);
2457− };
2458− return BackgroundColor2;
2459− }();
2460− var Padding = /* @__PURE__ */ function() {
2461− function Padding2(value0, value1) {
2462− this.value0 = value0;
2463− this.value1 = value1;
2464− }
2465− ;
2466− Padding2.create = function(value0) {
2467− return function(value1) {
2468− return new Padding2(value0, value1);
2469− };
2470− };
2471− return Padding2;
2472− }();
2473− var Spread = /* @__PURE__ */ function() {
2474− function Spread2() {
2475− }
2476− ;
2477− Spread2.value = new Spread2();
2478− return Spread2;
2479− }();
2480− var Opacity = /* @__PURE__ */ function() {
2481− function Opacity2(value0) {
2482− this.value0 = value0;
2483− }
2484− ;
2485− Opacity2.create = function(value0) {
2486− return new Opacity2(value0);
2487− };
2488− return Opacity2;
2489− }();
2490− var Pointer = /* @__PURE__ */ function() {
2491− function Pointer2() {
2492− }
2493− ;
2494− Pointer2.value = new Pointer2();
2495− return Pointer2;
2496− }();
2497− var Move = /* @__PURE__ */ function() {
2498− function Move2(value0) {
2499− this.value0 = value0;
2500− }
2501− ;
2502− Move2.create = function(value0) {
2503− return new Move2(value0);
2504− };
2505− return Move2;
2506− }();
2507− var Clip = /* @__PURE__ */ function() {
2508− function Clip2(value0) {
2509− this.value0 = value0;
2510− }
2511− ;
2512− Clip2.create = function(value0) {
2513− return new Clip2(value0);
2514− };
2515− return Clip2;
2516− }();
2517− var UI = /* @__PURE__ */ function() {
2518− function UI2(value0, value1) {
2519− this.value0 = value0;
2520− this.value1 = value1;
2521− }
2522− ;
2523− UI2.create = function(value0) {
2524− return function(value1) {
2525− return new UI2(value0, value1);
2526− };
2527− };
2528− return UI2;
2529− }();
2530− var Column = /* @__PURE__ */ function() {
2531− function Column2(value0) {
2532− this.value0 = value0;
2533− }
2534− ;
2535− Column2.create = function(value0) {
2536− return new Column2(value0);
2537− };
2538− return Column2;
2539− }();
2540− var Row = /* @__PURE__ */ function() {
2541− function Row2(value0) {
2542− this.value0 = value0;
2543− }
2544− ;
2545− Row2.create = function(value0) {
2546− return new Row2(value0);
2547− };
2548− return Row2;
2549− }();
2550− var Stack = /* @__PURE__ */ function() {
2551− function Stack2(value0) {
2552− this.value0 = value0;
2553− }
2554− ;
2555− Stack2.create = function(value0) {
2556− return new Stack2(value0);
2557− };
2558− return Stack2;
2559− }();
2560− var Wrapper = /* @__PURE__ */ function() {
2561− function Wrapper2(value0) {
2562− this.value0 = value0;
2563− }
2564− ;
2565− Wrapper2.create = function(value0) {
2566− return new Wrapper2(value0);
2567− };
2568− return Wrapper2;
2569− }();
2570− var Text = /* @__PURE__ */ function() {
2571− function Text2(value0) {
2572− this.value0 = value0;
2573− }
2574− ;
2575− Text2.create = function(value0) {
2576− return new Text2(value0);
2577− };
2578− return Text2;
2579− }();
2580− var Link = /* @__PURE__ */ function() {
2581− function Link2(value0, value1, value22) {
2582− this.value0 = value0;
2583− this.value1 = value1;
2584− this.value2 = value22;
2585− }
2586− ;
2587− Link2.create = function(value0) {
2588− return function(value1) {
2589− return function(value22) {
2590− return new Link2(value0, value1, value22);
2591− };
2592− };
2593− };
2594− return Link2;
2595− }();
2596− var Download = /* @__PURE__ */ function() {
2597− function Download2(value0, value1, value22) {
2598− this.value0 = value0;
2599− this.value1 = value1;
2600− this.value2 = value22;
2601− }
2602− ;
2603− Download2.create = function(value0) {
2604− return function(value1) {
2605− return function(value22) {
2606− return new Download2(value0, value1, value22);
2607− };
2608− };
2609− };
2610− return Download2;
2611− }();
2612− var Image2 = /* @__PURE__ */ function() {
2613− function Image3(value0, value1) {
2614− this.value0 = value0;
2615− this.value1 = value1;
2616− }
2617− ;
2618− Image3.create = function(value0) {
2619− return function(value1) {
2620− return new Image3(value0, value1);
2621− };
2622− };
2623− return Image3;
2624− }();
2625− var None = /* @__PURE__ */ function() {
2626− function None3() {
2627− }
2628− ;
2629− None3.value = new None3();
2630− return None3;
2631− }();
2632− var semigroupSkinGrowth = {
2633− append: function(v) {
2634− return function(v1) {
2635− return union(v)(v1);
2636− };
2637− }
2638− };
2639− var bindWriterT2 = /* @__PURE__ */ bindWriterT(semigroupSkinGrowth)(bindIdentity);
2640− var discard2 = /* @__PURE__ */ discard(discardUnit)(bindWriterT2);
2641− var bind2 = /* @__PURE__ */ bind(bindWriterT2);
2642− var append22 = /* @__PURE__ */ append(/* @__PURE__ */ semigroupWriterT(applyIdentity)(semigroupSkinGrowth)(semigroupArray));
2643− var semigroupMutation = {
2644− append: function(v) {
2645− return function(v1) {
2646− return {
2647− extraSkin: append2(v.extraSkin)(v1.extraSkin)
2648− };
2649− };
2650− }
2651− };
2652− var semigroupGenericUI = function(dictSemigroup) {
2653− var append3 = append(semigroupRecord3(semigroupRecordCons2(dictSemigroup)));
2654− return function(dictSemigroup1) {
2655− var append4 = append(dictSemigroup1);
2656− return {
2657− append: function(v) {
2658− return function(v1) {
2659− return new UI(append3(v.value0)(v1.value0), append4(v.value1)(v1.value1));
2660− };
2661− }
2662− };
2663− };
2664− };
2665− var renderableSide = {
2666− render: function(v) {
2667− if (v instanceof Top) {
2668− return "top";
2669− }
2670− ;
2671− if (v instanceof Right2) {
2672− return "right";
2673− }
2674− ;
2675− if (v instanceof Bottom) {
2676− return "bottom";
2677− }
2678− ;
2679− if (v instanceof Left2) {
2680− return "left";
2681− }
2682− ;
2683− throw new Error("Failed pattern match at Plum.View (line 263, column 12 - line 267, column 19): " + [v.constructor.name]);
2684− },
2685− renderKey: function(v) {
2686− if (v instanceof Top) {
2687− return "top";
2688− }
2689− ;
2690− if (v instanceof Right2) {
2691− return "right";
2692− }
2693− ;
2694− if (v instanceof Bottom) {
2695− return "bottom";
2696− }
2697− ;
2698− if (v instanceof Left2) {
2699− return "left";
2700− }
2701− ;
2702− throw new Error("Failed pattern match at Plum.View (line 268, column 15 - line 272, column 19): " + [v.constructor.name]);
2703− }
2704− };
2705− var renderableColor = {
2706− render: function(v) {
2707− return "rgb(" + (show2(v.r) + ("," + (show2(v.g) + ("," + (show2(v.b) + ("," + (show2(v.a) + "%)")))))));
2708− },
2709− renderKey: function(v) {
2710− return show2(v.r) + ("-" + (show2(v.g) + ("-" + (show2(v.b) + ("-" + show2(v.a))))));
2711− }
2712− };
2713− var monoidSkinGrowth = {
2714− mempty: empty2,
2715− Semigroup0: function() {
2716− return semigroupSkinGrowth;
2717− }
2718− };
2719− var tell2 = /* @__PURE__ */ tell(/* @__PURE__ */ monadTellWriterT(monoidSkinGrowth)(monadIdentity));
2720− var applicativeWriterT2 = /* @__PURE__ */ applicativeWriterT(monoidSkinGrowth)(applicativeIdentity);
2721− var pure2 = /* @__PURE__ */ pure(applicativeWriterT2);
2722− var mempty3 = /* @__PURE__ */ mempty(/* @__PURE__ */ monoidWriterT(applicativeIdentity)(monoidSkinGrowth)(monoidArray));
2723− var traverse2 = /* @__PURE__ */ traverse(traversableArray)(applicativeWriterT2);
2724− var traverseWithIndex2 = /* @__PURE__ */ traverseWithIndex(traversableWithIndexObject)(applicativeWriterT2);
2725− var monoidMutation = {
2726− mempty: {
2727− extraSkin: mempty2
2728− },
2729− Semigroup0: function() {
2730− return semigroupMutation;
2731− }
2732− };
2733− var mempty4 = /* @__PURE__ */ mempty(monoidMutation);
2734− var monoidGenericUI = function(dictMonoid) {
2735− var mempty52 = mempty(monoidRecord2(monoidRecordCons2(dictMonoid)()(monoidRecordCons1)));
2736− var semigroupGenericUI1 = semigroupGenericUI(dictMonoid.Semigroup0());
2737− return function(dictMonoid1) {
2738− var semigroupGenericUI2 = semigroupGenericUI1(dictMonoid1.Semigroup0());
2739− return {
2740− mempty: new UI(mempty52, mempty(dictMonoid1)),
2741− Semigroup0: function() {
2742− return semigroupGenericUI2;
2743− }
2744− };
2745− };
2746− };
2747− var functorGenericUI = {
2748− map: function(f) {
2749− return function(v) {
2750− return new UI(v.value0, f(v.value1));
2751− };
2752− }
2753− };
2754− var applyGenericUI = function(dictMonoid) {
2755− var append3 = append(semigroupRecord3(semigroupRecordCons2(dictMonoid.Semigroup0())));
2756− return {
2757− apply: function(v) {
2758− return function(v1) {
2759− return new UI(append3(v.value0)(v1.value0), v.value1(v1.value1));
2760− };
2761− },
2762− Functor0: function() {
2763− return functorGenericUI;
2764− }
2765− };
2766− };
2767− var bindGenericUI = function(dictMonoid) {
2768− var append3 = append(semigroupRecord3(semigroupRecordCons2(dictMonoid.Semigroup0())));
2769− var applyGenericUI1 = applyGenericUI(dictMonoid);
2770− return {
2771− bind: function(v) {
2772− return function(f) {
2773− var v1 = f(v.value1);
2774− return new UI(append3(v.value0)(v1.value0), v1.value1);
2775− };
2776− },
2777− Apply0: function() {
2778− return applyGenericUI1;
2779− }
2780− };
2781− };
2782− var text = function(s) {
2783− return function(v) {
2784− return new UI({
2785− nerves: mempty1.nerves,
2786− meat: mempty1.meat,
2787− hover: mempty1.hover,
2788− down: mempty1.down,
2789− children: [new Tuple({
2790− meat: v.value0.meat,
2791− nerves: v.value0.nerves,
2792− hover: v.value0.hover,
2793− down: v.value0.down
2794− }, new Text(s))]
2795− }, v.value1);
2796− };
2797− };
2798− var styleSkinGrowth = function(v) {
2799− return foldMap3(function(className) {
2800− return function(v1) {
2801− return "." + (className + ("{" + (v1.key + (":" + (v1.value + ";}")))));
2802− };
2803− })(v);
2804− };
2805− var sk = function(cName) {
2806− return function(key) {
2807− return function(value12) {
2808− return discard2(tell2(singleton2(cName)({
2809− key,
2810− value: value12
2811− })))(function() {
2812− return pure2([cName]);
2813− });
2814− };
2815− };
2816− };
2817− var rgb = function(r) {
2818− return function(g) {
2819− return function(b) {
2820− return {
2821− r: round2(r * 255),
2822− g: round2(g * 255),
2823− b: round2(b * 255),
2824− a: 100
2825− };
2826− };
2827− };
2828− };
2829− var renderKey = function(dict) {
2830− return dict.renderKey;
2831− };
2832− var renderKey1 = /* @__PURE__ */ renderKey(renderableColor);
2833− var renderKey2 = /* @__PURE__ */ renderKey(renderableSide);
2834− var render = function(dict) {
2835− return dict.render;
2836− };
2837− var render1 = /* @__PURE__ */ render(renderableColor);
2838− var render2 = /* @__PURE__ */ render(renderableSide);
2839− var renderableLength = {
2840− render: function(v) {
2841− if (v instanceof Px) {
2842− return show2(v.value0) + "px";
2843− }
2844− ;
2845− if (v instanceof Fit) {
2846− return "fit-content";
2847− }
2848− ;
2849− if (v instanceof Fill) {
2850− return "100%";
2851− }
2852− ;
2853− if (v instanceof Max2) {
2854− return "max(" + (show2(v.value0) + ("px," + (render(renderableLength)(v.value1) + ")")));
2855− }
2856− ;
2857− if (v instanceof Min2) {
2858− return "min(" + (show2(v.value0) + ("px," + (render(renderableLength)(v.value1) + ")")));
2859− }
2860− ;
2861− throw new Error("Failed pattern match at Plum.View (line 362, column 12 - line 367, column 62): " + [v.constructor.name]);
2862− },
2863− renderKey: function(v) {
2864− if (v instanceof Px) {
2865− return show2(v.value0);
2866− }
2867− ;
2868− if (v instanceof Fit) {
2869− return "fit-content";
2870− }
2871− ;
2872− if (v instanceof Fill) {
2873− return "fill";
2874− }
2875− ;
2876− if (v instanceof Max2) {
2877− return "max-" + (show2(v.value0) + ("-" + renderKey(renderableLength)(v.value1)));
2878− }
2879− ;
2880− if (v instanceof Min2) {
2881− return "min-" + (show2(v.value0) + ("-" + renderKey(renderableLength)(v.value1)));
2882− }
2883− ;
2884− throw new Error("Failed pattern match at Plum.View (line 368, column 15 - line 373, column 56): " + [v.constructor.name]);
2885− }
2886− };
2887− var renderKey3 = /* @__PURE__ */ renderKey(renderableLength);
2888− var render3 = /* @__PURE__ */ render(renderableLength);
2889− var skin = function(ctx) {
2890− return function(v) {
2891− if (v instanceof Spacing) {
2892− return sk("spacing-" + (show2(v.value0) + ("-" + show2(v.value1))))("gap")(show2(v.value0) + ("px " + (show2(v.value1) + "px")));
2893− }
2894− ;
2895− if (v instanceof Explain) {
2896− return sk("explain")("border")("dashed magenta");
2897− }
2898− ;
2899− if (v instanceof Align) {
2900− if (ctx instanceof Generic) {
2901− return mempty3;
2902− }
2903− ;
2904− if (ctx instanceof Span) {
2905− return mempty3;
2906− }
2907− ;
2908− if (ctx instanceof Grid) {
2909− var v1 = function() {
2910− if (v.value1 instanceof Start) {
2911− return "start";
2912− }
2913− ;
2914− if (v.value1 instanceof Center) {
2915− return "center";
2916− }
2917− ;
2918− if (v.value1 instanceof End) {
2919− return "end";
2920− }
2921− ;
2922− throw new Error("Failed pattern match at Plum.View (line 311, column 13 - line 314, column 27): " + [v.value1.constructor.name]);
2923− }();
2924− var k = function() {
2925− if (v.value0 instanceof X) {
2926− return "justify-items";
2927− }
2928− ;
2929− if (v.value0 instanceof Y) {
2930− return "align-items";
2931− }
2932− ;
2933− throw new Error("Failed pattern match at Plum.View (line 306, column 13 - line 308, column 33): " + [v.value0.constructor.name]);
2934− }();
2935− return sk("align-grid-" + (k + ("-" + v1)))(k)(v1);
2936− }
2937− ;
2938− if (ctx instanceof Flexbox) {
2939− var v1 = function() {
2940− if (v.value1 instanceof Start) {
2941− return "flex-start";
2942− }
2943− ;
2944− if (v.value1 instanceof Center) {
2945− return "center";
2946− }
2947− ;
2948− if (v.value1 instanceof End) {
2949− return "flex-end";
2950− }
2951− ;
2952− throw new Error("Failed pattern match at Plum.View (line 330, column 13 - line 333, column 32): " + [v.value1.constructor.name]);
2953− }();
2954− var k = function() {
2955− var v2 = new Tuple(ctx.value0, v.value0);
2956− if (v2.value0 instanceof X && v2.value1 instanceof X) {
2957− return "justify-content";
2958− }
2959− ;
2960− if (v2.value0 instanceof X && v2.value1 instanceof Y) {
2961− return "align-items";
2962− }
2963− ;
2964− if (v2.value0 instanceof Y && v2.value1 instanceof X) {
2965− return "align-items";
2966− }
2967− ;
2968− if (v2.value0 instanceof Y && v2.value1 instanceof Y) {
2969− return "justify-content";
2970− }
2971− ;
2972− throw new Error("Failed pattern match at Plum.View (line 322, column 13 - line 326, column 42): " + [v2.constructor.name]);
2973− }();
2974− return sk("align-flexbox-" + (k + ("-" + v1)))(k)(v1);
2975− }
2976− ;
2977− throw new Error("Failed pattern match at Plum.View (line 300, column 26 - line 336, column 51): " + [ctx.constructor.name]);
2978− }
2979− ;
2980− if (v instanceof Width) {
2981− return sk("width-" + renderKey3(v.value0))("width")(render3(v.value0));
2982− }
2983− ;
2984− if (v instanceof Height) {
2985− return sk("height-" + renderKey3(v.value0))("height")(render3(v.value0));
2986− }
2987− ;
2988− if (v instanceof Wrapped) {
2989− if (ctx instanceof Flexbox) {
2990− return sk("wrapped")("flex-wrap")("wrap");
2991− }
2992− ;
2993− return pure2([]);
2994− }
2995− ;
2996− if (v instanceof BackgroundColor) {
2997− return sk("bg-color-" + renderKey1(v.value0))("background-color")(render1(v.value0));
2998− }
2999− ;
3000− if (v instanceof Padding) {
3001− return sk("padding-" + (renderKey2(v.value0) + ("-" + show2(v.value1))))("padding-" + render2(v.value0))(show2(v.value1) + "px");
3002− }
3003− ;
3004− if (v instanceof Spread) {
3005− if (ctx instanceof Flexbox) {
3006− return sk("spread")("justify-content")("space-between");
3007− }
3008− ;
3009− return pure2([]);
3010− }
3011− ;
3012− if (v instanceof Opacity) {
3013− return sk("opacity-" + show1(v.value0))("opacity")(show1(v.value0));
3014− }
3015− ;
3016− if (v instanceof Pointer) {
3017− return sk("pointer")("cursor")("pointer");
3018− }
3019− ;
3020− if (v instanceof Move) {
3021− return sk("move-" + (show2(v.value0.x) + ("-" + show2(v.value0.y))))("transform")("translate(" + (show2(v.value0.x) + ("px, " + (show2(v.value0.y) + "px)"))));
3022− }
3023− ;
3024− if (v instanceof Clip && v.value0 instanceof X) {
3025− return sk("clip-x")("overflow-x")("hidden");
3026− }
3027− ;
3028− if (v instanceof Clip && v.value0 instanceof Y) {
3029− return sk("clip-y")("overflow-y")("hidden");
3030− }
3031− ;
3032− throw new Error("Failed pattern match at Plum.View (line 297, column 12 - line 355, column 46): " + [v.constructor.name]);
3033− };
3034− };
3035− var onMouseDown = function(dictMonoid) {
3036− var mempty52 = mempty(monoidRecord2(monoidRecordCons2(dictMonoid)()(monoidRecordCons1)));
3037− return function(v) {
3038− return new UI({
3039− nerves: mempty52.nerves,
3040− meat: mempty52.meat,
3041− hover: mempty52.hover,
3042− children: mempty52.children,
3043− down: v.value0.meat
3044− }, v.value1);
3045− };
3046− };
3047− var onHover = function(dictMonoid) {
3048− var mempty52 = mempty(monoidRecord2(monoidRecordCons2(dictMonoid)()(monoidRecordCons1)));
3049− return function(v) {
3050− return new UI({
3051− nerves: mempty52.nerves,
3052− meat: mempty52.meat,
3053− down: mempty52.down,
3054− children: mempty52.children,
3055− hover: v.value0.meat
3056− }, v.value1);
3057− };
3058− };
3059− var m = function(dictMonoid) {
3060− var mempty52 = mempty(monoidRecord2(monoidRecordCons2(dictMonoid)()(monoidRecordCons1)));
3061− return function(meat) {
3062− return new UI({
3063− nerves: mempty52.nerves,
3064− hover: mempty52.hover,
3065− down: mempty52.down,
3066− children: mempty52.children,
3067− meat: [meat]
3068− }, mempty22);
3069− };
3070− };
3071− var hWith = function(elem2) {
3072− return function(props) {
3073− return function(classes) {
3074− return function(children) {
3075− return h2(elem2)(unsafeUnion(props)({
3076− "class": intercalate3(" ")(classes)
3077− }))(children);
3078− };
3079− };
3080− };
3081− };
3082− var h3 = function(elem2) {
3083− return function(classes) {
3084− return function(children) {
3085− return h2(elem2)({
3086− "class": intercalate3(" ")(classes)
3087− })(children);
3088− };
3089− };
3090− };
3091− var growSkin = function(fire) {
3092− return function(v) {
3093− return function(v1) {
3094− var widthFill = [new Width(Fill.value), new Height(Fill.value)];
3095− var alignCenter = [new Align(X.value, Center.value), new Align(Y.value, Center.value)];
3096− var skn = function(ctx) {
3097− return bind2(map2(function($482) {
3098− return function(v2) {
3099− return append2(v2)(v.extraSkin);
3100− }(concat($482));
3101− })(traverse2(skin(ctx))(append2(v1.value0.meat)(append2(function() {
3102− if (ctx instanceof Span) {
3103− return mempty2;
3104− }
3105− ;
3106− if (ctx instanceof Grid) {
3107− return widthFill;
3108− }
3109− ;
3110− if (ctx instanceof Flexbox) {
3111− return widthFill;
3112− }
3113− ;
3114− if (ctx instanceof Generic) {
3115− return widthFill;
3116− }
3117− ;
3118− throw new Error("Failed pattern match at Plum.View (line 435, column 16 - line 439, column 35): " + [ctx.constructor.name]);
3119− }())(function() {
3120− if (ctx instanceof Grid) {
3121− return alignCenter;
3122− }
3123− ;
3124− if (ctx instanceof Flexbox) {
3125− return alignCenter;
3126− }
3127− ;
3128− if (ctx instanceof Span) {
3129− return mempty2;
3130− }
3131− ;
3132− if (ctx instanceof Generic) {
3133− return alignCenter;
3134− }
3135− ;
3136− throw new Error("Failed pattern match at Plum.View (line 440, column 16 - line 444, column 37): " + [ctx.constructor.name]);
3137− }())))))(function(meatClasses) {
3138− var v2 = runWriter(traverse2(skin(ctx))(v1.value0.hover));
3139− return bind2(traverseWithIndex2(function(key) {
3140− return function(val) {
3141− return tell2(singleton2(key + "-hover:hover")(val));
3142− };
3143− })(v2.value1))(function() {
3144− var v3 = runWriter(traverse2(skin(ctx))(v1.value0.down));
3145− return bind2(traverseWithIndex2(function(key) {
3146− return function(val) {
3147− return tell2(singleton2(key + "-down:active")(val));
3148− };
3149− })(v3.value1))(function() {
3150− return pure2(append2(meatClasses)(append2(map1(function(v4) {
3151− return v4 + "-hover";
3152− })(concat(v2.value0)))(map1(function(v4) {
3153− return v4 + "-down";
3154− })(concat(v3.value0)))));
3155− });
3156− });
3157− });
3158− };
3159− if (v1.value1 instanceof Text) {
3160− return map2(function(c) {
3161− return h3("span")(c)([string(v1.value1.value0)]);
3162− })(skn(Span.value));
3163− }
3164− ;
3165− if (v1.value1 instanceof Wrapper) {
3166− return bind2(append22(skn(new Flexbox(X.value)))(append22(sk("display-flex")("display")("flex"))(sk("flex-direction-row")("flex-direction")("row"))))(function(classes) {
3167− return bind2(growSkin(fire)(mempty4)(v1.value1.value0))(function(x$prime) {
3168− return pure2(h3("div")(classes)([x$prime]));
3169− });
3170− });
3171− }
3172− ;
3173− if (v1.value1 instanceof Stack) {
3174− return bind2(append22(skn(Grid.value))(sk("display-grid")("display")("grid")))(function(classes) {
3175− return bind2(append22(sk("grid-row-1")("grid-row")("1"))(sk("grid-column-1")("grid-column")("1")))(function(extraSkin) {
3176− return bind2(traverse2(growSkin(fire)({
3177− extraSkin
3178− }))(v1.value1.value0))(function(children$prime) {
3179− return pure2(h3("div")(classes)(children$prime));
3180− });
3181− });
3182− });
3183− }
3184− ;
3185− if (v1.value1 instanceof Row) {
3186− return bind2(append22(skn(new Flexbox(X.value)))(append22(sk("display-flex")("display")("flex"))(sk("flex-direction-row")("flex-direction")("row"))))(function(classes) {
3187− return bind2(traverse2(growSkin(fire)(mempty4))(v1.value1.value0))(function(children$prime) {
3188− return pure2(h3("div")(classes)(children$prime));
3189− });
3190− });
3191− }
3192− ;
3193− if (v1.value1 instanceof Column) {
3194− return bind2(append22(skn(new Flexbox(Y.value)))(append22(sk("display-flex")("display")("flex"))(sk("flex-direction-column")("flex-direction")("column"))))(function(classes) {
3195− return bind2(traverse2(growSkin(fire)(mempty4))(v1.value1.value0))(function(children$prime) {
3196− return pure2(h3("div")(classes)(children$prime));
3197− });
3198− });
3199− }
3200− ;
3201− if (v1.value1 instanceof Link) {
3202− return bind2(append22(skn(new Flexbox(X.value)))(append22(sk("display-flex")("display")("flex"))(sk("flex-direction-row")("flex-direction")("row"))))(function(classes) {
3203− return bind2(growSkin(fire)(mempty4)(v1.value1.value2))(function(child$prime) {
3204− return pure2(hWith("a")({
3205− href: v1.value1.value0,
3206− rel: "noopener noreferrer",
3207− target: function() {
3208− if (v1.value1.value1.newTab) {
3209− return "_blank";
3210− }
3211− ;
3212− return "_self";
3213− }()
3214− })(classes)([child$prime]));
3215− });
3216− });
3217− }
3218− ;
3219− if (v1.value1 instanceof Download) {
3220− return bind2(append22(skn(new Flexbox(X.value)))(append22(sk("display-flex")("display")("flex"))(sk("flex-direction-row")("flex-direction")("row"))))(function(classes) {
3221− return bind2(growSkin(fire)(mempty4)(v1.value1.value2))(function(child$prime) {
3222− return pure2(hWith("a")({
3223− href: v1.value1.value0,
3224− download: fromMaybe("")(v1.value1.value1.filename)
3225− })(classes)([child$prime]));
3226− });
3227− });
3228− }
3229− ;
3230− if (v1.value1 instanceof Image2) {
3231− return map2(function(c) {
3232− return hWith("img")({
3233− src: v1.value1.value0,
3234− alt: v1.value1.value1.description
3235− })(c)([]);
3236− })(skn(Generic.value));
3237− }
3238− ;
3239− if (v1.value1 instanceof None) {
3240− return pure2(h3("div")(mempty2)([]));
3241− }
3242− ;
3243− throw new Error("Failed pattern match at Plum.View (line 453, column 3 - line 494, column 37): " + [v1.value1.constructor.name]);
3244− };
3245− };
3246− };
3247− var grow = function(fire) {
3248− return function(v) {
3249− var v1 = runWriter(growSkin(fire)(mempty4)(v));
3250− return {
3251− node: v1.value0,
3252− style: styleSkinGrowth(v1.value1)
3253− };
3254− };
3255− };
3256− var column = function(v) {
3257− return new UI({
3258− nerves: mempty1.nerves,
3259− meat: mempty1.meat,
3260− hover: mempty1.hover,
3261− down: mempty1.down,
3262− children: [new Tuple({
3263− meat: v.value0.meat,
3264− nerves: v.value0.nerves,
3265− hover: v.value0.hover,
3266− down: v.value0.down
3267− }, new Column(v.value0.children))]
3268− }, v.value1);
3269− };
3270− var bgColor = function(dictMonoid) {
3271− var m1 = m(dictMonoid);
3272− return function(c) {
3273− return m1(new BackgroundColor(c));
3274− };
3275− };
3276−
3277− // output/Web.DOM.NonElementParentNode/foreign.js
3278− function _getElementById(id) {
3279− return function(node) {
3280− return function() {
3281− return node.getElementById(id);
3282− };
3283− };
3284− }
3285−
3286− // output/Data.Nullable/foreign.js
3287− function nullable(a, r, f) {
3288− return a == null ? r : f(a);
3289− }
3290−
3291− // output/Data.Nullable/index.js
3292− var toMaybe = function(n) {
3293− return nullable(n, Nothing.value, Just.create);
3294− };
3295−
3296− // output/Web.DOM.NonElementParentNode/index.js
3297− var map3 = /* @__PURE__ */ map(functorEffect);
3298− var getElementById = function(eid) {
3299− var $2 = map3(toMaybe);
3300− var $3 = _getElementById(eid);
3301− return function($4) {
3302− return $2($3($4));
3303− };
3304− };
3305−
3306− // output/Web.HTML/foreign.js
3307− var windowImpl = function() {
3308− return window;
3309− };
3310−
3311− // output/Web.HTML.HTMLDocument/index.js
3312− var toNonElementParentNode = unsafeCoerce2;
3313−
3314− // output/Web.HTML.Window/foreign.js
3315− function document2(window2) {
3316− return function() {
3317− return window2.document;
3318− };
3319− }
3320−
3321− // output/Plum/index.js
3322− var bind3 = /* @__PURE__ */ bind(bindEffect);
3323− var outerStyle = "html,body{height:100%;padding:0;margin:0;}";
3324− var run3 = function(id) {
3325− return function(plum2) {
3326− return function __do() {
3327− var modelRef = bind3(plum2.init)($$new)();
3328− var v = bind3(bind3(windowImpl)(document2))(function() {
3329− var $21 = getElementById(id);
3330− return function($22) {
3331− return $21(toNonElementParentNode($22));
3332− };
3333− }())();
3334− if (v instanceof Just) {
3335− var projector = createProjector();
3336− return replace(projector)(v.value0)(function __do2() {
3337− var model = read(modelRef)();
3338− var v1 = plum2.view(model);
3339− var v2 = head(v1.value0.children);
3340− if (v2 instanceof Nothing) {
3341− return h2("div")({})([]);
3342− }
3343− ;
3344− if (v2 instanceof Just) {
3345− var v3 = grow(function(msg) {
3346− return function __do3() {
3347− var m2 = read(modelRef)();
3348− var m_ = plum2.update(msg)(m2)();
3349− write(m_)(modelRef)();
3350− return scheduleRender(projector)();
3351− };
3352− })(v2.value0);
3353− return h2("div")({
3354− styles: {
3355− height: "100%",
3356− width: "100%"
3357− }
3358− })([h2("style")({})([string(outerStyle + v3.style)]), v3.node]);
3359− }
3360− ;
3361− throw new Error("Failed pattern match at Plum (line 35, column 20 - line 52, column 94): " + [v2.constructor.name]);
3362− })();
3363− }
3364− ;
3365− if (v instanceof Nothing) {
3366− return unit;
3367− }
3368− ;
3369− throw new Error("Failed pattern match at Plum (line 26, column 92 - line 54, column 25): " + [v.constructor.name]);
3370− };
3371− };
3372− };
3373−
3374− // output/Main/index.js
3375− var pure3 = /* @__PURE__ */ pure(applicativeEffect);
3376− var discard3 = /* @__PURE__ */ discard(discardUnit);
3377− var discard1 = /* @__PURE__ */ discard3(/* @__PURE__ */ bindGenericUI(monoidArray));
3378− var discard22 = /* @__PURE__ */ discard3(/* @__PURE__ */ bindGenericUI(monoidUnit));
3379− var onHover2 = /* @__PURE__ */ onHover(monoidUnit);
3380− var bgColor2 = /* @__PURE__ */ bgColor(monoidUnit);
3381− var onMouseDown2 = /* @__PURE__ */ onMouseDown(monoidUnit);
3382− var mempty5 = /* @__PURE__ */ mempty(/* @__PURE__ */ monoidGenericUI(monoidUnit)(monoidUnit));
3383− var plum = {
3384− init: /* @__PURE__ */ pure3({
3385− text: "Test"
3386− }),
3387− view: function(model) {
3388− return column(discard1(text("hi")(discard22(onHover2(bgColor2(rgb(1)(0)(0))))(function() {
3389− return onMouseDown2(bgColor2(rgb(0)(1)(0)));
3390− })))(function() {
3391− return text("hello")(mempty5);
3392− }));
3393− },
3394− update: function(msg) {
3395− return function(model) {
3396− return pure3({
3397− text: "Button pressed"
3398− });
3399− };
3400− }
3401− };
3402− var main = /* @__PURE__ */ run3("plum")(plum);
3403−
3404− // <stdin>
3405− main();
3406−})();
plum/spago.dhall+5
@@ -6,12 +6,15 @@
6 , "effect"
6 , "effect"
7 , "foldable-traversable"
7 , "foldable-traversable"
8 , "foreign-object"
8 , "foreign-object"
9+ , "functions"
9 , "integers"
10 , "integers"
11+ , "literals"
10 , "maybe"
12 , "maybe"
11 , "numbers"
13 , "numbers"
12 , "prelude"
14 , "prelude"
13 , "record"
15 , "record"
14 , "refs"
16 , "refs"
17+ , "strings"
15 , "strings-extra"
18 , "strings-extra"
16 , "transformers"
19 , "transformers"
17 , "tuples"
20 , "tuples"
@@ -19,7 +22,9 @@
19 , "unsafe-coerce"
22 , "unsafe-coerce"
20 , "untagged-union"
23 , "untagged-union"
21 , "web-dom"
24 , "web-dom"
25+ , "web-events"
22 , "web-html"
26 , "web-html"
27+ , "web-uievents"
23 ]
28 ]
24, packages = ../packages.dhall
29, packages = ../packages.dhall
25, sources = [ "src/**/*.purs", "test/**/*.purs" ]
30, sources = [ "src/**/*.purs", "test/**/*.purs" ]
plum/src/Main.purs+42−11
@@ -1,28 +1,59 @@
1module Main where
1module Main where
2
2
3+import Plum.View
3import Prelude
4import Prelude
4
5
5import Effect (Effect)
6import Effect (Effect)
6import Plum as Plum
7import Plum as Plum
7−import Plum.View
8
8
9main :: Effect Unit
9main :: Effect Unit
10main = do
10main = do
11 Plum.run "plum" plum
11 Plum.run "plum" plum
12
12
13−type Model = { text :: String }
13+type Model = { text :: String, numberOfClicks :: Int }
14+
15+data Msg = Clicked | UpdateText String
14
16
15−plum :: Plum.Plum Unit Model
17+plum :: Plum.Plum Msg Model
16plum =
18plum =
17− { init: pure { text: "Test" }
19+ { init: pure { text: "Test", numberOfClicks: 0 }
18 , view: \model -> do
20 , view: \model -> do
19 column do
21 column do
20− text "hi" do
22+ stack do
21− onHover do
23+ align Y End
24+ height Fit
25+ row do
26+ align Y End
27+ column do
22− bgColor $ rgb 1.0 0.0 0.0
28+ bgColor $ rgb 0.0 0.0 0.0
23− onMouseDown $ do
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
24− bgColor $ rgb 0.0 1.0 0.0
47+ bgColor $ rgb 0.0 0.0 0.0
25− text "hello" mempty
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
26 , update: \msg model -> case msg of
56 , 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 }
28 }
59 }
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
2
2
3import Prelude
3import Prelude
4
4
5−import Data.Array ((:))
6import Data.Array as Array
5import Data.Array as Array
7import Data.Maybe (Maybe(..))
6import Data.Maybe (Maybe(..))
8import Effect (Effect)
7import Effect (Effect)
8+import Effect.Console (log)
9import Effect.Ref as Ref
9import Effect.Ref as Ref
10−import Maquette as Maquette
10+import Foreign.Object as Object
11+import Literals.Undefined (undefined)
11import Plum.View (GenericUI(..), UI, grow)
12import Plum.View (GenericUI(..), UI, grow)
13+import Snabbdom as Snabbdom
14+import Untagged.Union (asOneOf)
12import Web.DOM.NonElementParentNode (getElementById) as Web
15import Web.DOM.NonElementParentNode (getElementById) as Web
13import Web.HTML (window) as Web
16import Web.HTML (window) as Web
14import Web.HTML.HTMLDocument (toNonElementParentNode) as Web
17import Web.HTML.HTMLDocument (toNonElementParentNode) as Web
@@ -22,35 +25,61 @@ type Plum msg model =
22
25
23run :: forall msg model. String -> Plum msg model -> Effect Unit
26run :: forall msg model. String -> Plum msg model -> Effect Unit
24run id plum = do
27run id plum = do
25− modelRef <- plum.init >>= Ref.new
26 Web.window >>= Web.document >>= Web.getElementById id <<< Web.toNonElementParentNode >>= case _ of
28 Web.window >>= Web.document >>= Web.getElementById id <<< Web.toNonElementParentNode >>= case _ of
27 Just element -> do
29 Just element -> do
28− projector <- Maquette.createProjector
30+ let node = Snabbdom.toVNode element
29− Maquette.replace projector element do
31+ patch <- Snabbdom.init
30− model <- Ref.read modelRef
32+ initModel <- plum.init
31−
33+ modelRef <- Ref.new { model: initModel, lastNode: node }
32− ( let
34+ let
35+ view model = do
33− UI { children } _ = plum.view model
36+ let UI { children } _ = plum.view model
34− in
35− pure $ case Array.head children of
37+ case Array.uncons children of
36− Nothing -> Maquette.h "div" {} []
37− Just child ->
38+ Just { head: child } -> do
38− let
39+ let
39− { node, style } =
40+ { node, style } = grow
40− ( grow
41− ( \msg -> do
41+ ( \msg -> do
42+ log "in"
42− m <- Ref.read modelRef
43+ { model: m, lastNode } <- Ref.read modelRef
43− m_ <- plum.update msg m
44+ m_ <- plum.update msg m
45+ node <- view m_
46+ newNode <- patch lastNode node
44− Ref.write m_ modelRef
47+ Ref.write { model: m_, lastNode: newNode } modelRef
45− Maquette.scheduleRender projector
48+ pure unit
46− )
49+ )
47− ) child
50+ child
48− in
51+ pure $
49− Maquette.h
50− "div"
52+ Snabbdom.h "div"
51− { styles: { height: "100%", width: "100%" } }
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+ []
52− [ Maquette.h "style" {} [ Maquette.string (outerStyle <> style) ], node ]
65+ (asOneOf $ outerStyle <> style)
53− )
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
54 Nothing -> pure unit
83 Nothing -> pure unit
55
84
56outerStyle :: String
85outerStyle :: String
plum/src/Plum/View.purs+240−41
@@ -2,6 +2,11 @@ module Plum.View
2 ( View
2 ( View
3 , Nerve(..)
3 , Nerve(..)
4 , Meat(..)
4 , Meat(..)
5+ , Font
6+ , BorderStyle(..)
7+ , Corner(..)
8+ , Shadow(..)
9+ , ShadowCfg
5 , Side(..)
10 , Side(..)
6 , Bones(..)
11 , Bones(..)
7 , grow
12 , grow
@@ -22,10 +27,10 @@ module Plum.View
22 , text
27 , text
23 , link
28 , link
24 , newTabLink
29 , newTabLink
25− , el
26 , download
30 , download
27 , downloadAs
31 , downloadAs
28 , image
32 , image
33+ , textInput
29 , spacing
34 , spacing
30 , explain
35 , explain
31 , align
36 , align
@@ -39,26 +44,52 @@ module Plum.View
39 , pointer
44 , pointer
40 , move
45 , move
41 , clip
46 , clip
47+ , borders
48+ , border
49+ , borderStyle
50+ , roundAll
51+ , round
52+ , shadow
53+ , innerShadow
42 , onHover
54 , onHover
43 , onMouseDown
55 , onMouseDown
56+ , font
57+ , fontSize
58+ , fontWeight
59+ , onClick
44 ) where
60 ) where
45
61
46import Prelude
62import Prelude
47
63
48import Control.Monad.Writer (Writer, runWriter, tell)
64import Control.Monad.Writer (Writer, runWriter, tell)
65+import Control.Monad.Writer.Trans (mapWriterT)
66+import Data.Array (foldMap)
49import Data.Array as Array
67import Data.Array as Array
68+import Data.Array.NonEmpty (concatMap)
50import Data.Int as Int
69import Data.Int as Int
51import Data.Maybe (Maybe(..))
70import Data.Maybe (Maybe(..))
52import Data.Maybe as Maybe
71import Data.Maybe as Maybe
72+import Data.String as String
53import Data.Traversable (traverse)
73import Data.Traversable (traverse)
54import Data.TraversableWithIndex (traverseWithIndex)
74import Data.TraversableWithIndex (traverseWithIndex)
55import Data.Tuple.Nested (type (/\), (/\))
75import Data.Tuple.Nested (type (/\), (/\))
56import Effect (Effect)
76import Effect (Effect)
57import Foreign.Object (Object)
77import Foreign.Object (Object)
58import Foreign.Object as Object
78import Foreign.Object as Object
59−import Maquette (VNode, string)
79+import Literals.Undefined (undefined)
60−import Maquette as Maquette
80+import Prim.TypeError (class Warn)
61−import Record.Unsafe.Union as Record
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
62
93
63type GenericUIView children msg =
94type GenericUIView children msg =
64 { nerves :: Array (Nerve msg)
95 { nerves :: Array (Nerve msg)
@@ -98,9 +129,9 @@ instance Monoid children => Bind (GenericUI children msg) where
98
129
99instance Monoid children => Monad (GenericUI children msg)
130instance Monoid children => Monad (GenericUI children msg)
100
131
101−column :: forall msg a. UI msg a -> UI msg a
132+column :: forall msg. UI msg Unit -> UI msg Unit
102−column (UI { nerves, meat, hover, down, children } a) =
133+column (UI { nerves, meat, hover, down, children } _) =
103− UI (mempty :: UIView msg) { children = [ { meat, nerves, hover, down } /\ Column children ] } a
134+ UI (mempty :: UIView msg) { children = [ { meat, nerves, hover, down } /\ Column children ] } unit
104
135
105row :: forall msg a. UI msg a -> UI msg a
136row :: forall msg a. UI msg a -> UI msg a
106row (UI { nerves, meat, hover, down, children } a) =
137row (UI { nerves, meat, hover, down, children } a) =
@@ -126,19 +157,6 @@ link url (UI { nerves, meat, hover, down, children } a) = UI
126 }
157 }
127 a
158 a
128
159
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−
142newTabLink :: forall msg a. String -> UI msg a -> UI msg a
160newTabLink :: forall msg a. String -> UI msg a -> UI msg a
143newTabLink url (UI { nerves, meat, hover, down, children } a) = UI
161newTabLink url (UI { nerves, meat, hover, down, children } a) = UI
144 (mempty :: UIView msg)
162 (mempty :: UIView msg)
@@ -182,11 +200,42 @@ image :: forall msg a. String -> { description :: String } -> GenericUI Unit msg
182image url description (UI { nerves, meat, hover, down } a) =
200image url description (UI { nerves, meat, hover, down } a) =
183 UI (mempty :: UIView msg) { children = [ { meat, nerves, hover, down } /\ Image url description ] } a
201 UI (mempty :: UIView msg) { children = [ { meat, nerves, hover, down } /\ Image url description ] } a
184
202
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+
185−h :: String -> Classes -> Array VNode -> VNode
218+h :: String -> Classes -> WiredNerves -> Array VNode -> VNode
219+h elem classes (WiredNerves on) children =
220+ Snabbdom.h elem
186−h elem classes children = Maquette.h elem { class: Array.intercalate " " classes } children
221+ { attrs: Object.singleton "class" (Array.intercalate " " classes)
187−
222+ , on
223+ , props: Object.empty
224+ , style: Object.empty
225+ }
226+ children
227+ (asOneOf undefined)
228+
188−hWith :: forall props. String -> Record props -> Classes -> Array VNode -> VNode
229+hWith :: forall props. Homogeneous props String => String -> Record props -> Classes -> WiredNerves -> Array VNode -> VNode
189−hWith elem props classes children = Maquette.h elem (Record.unsafeUnion props { class: Array.intercalate " " classes }) children
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)
190
239
191data Length = Px Int | Fill | Fit | Max Int Length | Min Int Length
240data Length = Px Int | Fill | Fit | Max Int Length | Min Int Length
192
241
@@ -194,13 +243,19 @@ data Alignment = Start | Center | End
194
243
195data Direction = X | Y
244data Direction = X | Y
196
245
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+
197m :: forall ch msg. Monoid ch => Meat -> GenericUI ch msg Unit
252m :: forall ch msg. Monoid ch => Meat -> GenericUI ch msg Unit
198m meat = UI (mempty :: GenericUIView ch msg) { meat = [ meat ] } mempty
253m meat = UI (mempty :: GenericUIView ch msg) { meat = [ meat ] } mempty
199
254
200spacing :: forall ch msg. Monoid ch => { x :: Int, y :: Int } -> GenericUI ch msg Unit
255spacing :: forall ch msg. Monoid ch => { x :: Int, y :: Int } -> GenericUI ch msg Unit
201spacing { x, y } = m $ Spacing x y
256spacing { x, y } = m $ Spacing x y
202
257
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
204explain = m Explain
259explain = m Explain
205
260
206align :: forall ch msg. Monoid ch => Direction -> Alignment -> GenericUI ch msg Unit
261align :: 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
242onMouseDown :: forall ch msg. Monoid ch => GenericUI Unit msg Unit -> GenericUI ch msg Unit
297onMouseDown :: forall ch msg. Monoid ch => GenericUI Unit msg Unit -> GenericUI ch msg Unit
243onMouseDown (UI { meat } a) = UI (mempty :: GenericUIView ch msg) { down = meat } a
298onMouseDown (UI { meat } a) = UI (mempty :: GenericUIView ch msg) { down = meat } a
244
299
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+
245data Meat
330data Meat
246 = Spacing Int Int
331 = Spacing Int Int
247 | Explain
332 | Explain
@@ -256,6 +341,51 @@ data Meat
256 | Pointer
341 | Pointer
257 | Move { x :: Int, y :: Int }
342 | Move { x :: Int, y :: Int }
258 | Clip Direction
343 | 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"
259
389
260data Side = Top | Right | Bottom | Left
390data Side = Top | Right | Bottom | Left
261
391
@@ -273,7 +403,25 @@ instance Renderable Side where
273
403
274data Nerve msg = OnClick msg
404data Nerve msg = OnClick msg
275
405
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
277
425
278none :: forall msg. View msg
426none :: forall msg. View msg
279none = mempty /\ None
427none = mempty /\ None
@@ -282,7 +430,7 @@ newtype Skin = Skin (Object String)
282
430
283sk :: String -> String -> String -> Writer SkinGrowth Classes
431sk :: String -> String -> String -> Writer SkinGrowth Classes
284sk cName key value = do
432sk cName key value = do
285− tell $ SkinGrowth $ Object.singleton cName { key, value }
433+ tell $ SkinGrowth $ { meat: Object.singleton cName { key, value }, hover: Object.empty, down: Object.empty }
286 pure [ cName ]
434 pure [ cName ]
287
435
288instance Semigroup Skin where
436instance Semigroup Skin where
@@ -353,6 +501,18 @@ skin ctx = case _ of
353 Move { x, y } -> sk ("move-" <> show x <> "-" <> show y) "transform" ("translate(" <> show x <> "px, " <> show y <> "px)")
501 Move { x, y } -> sk ("move-" <> show x <> "-" <> show y) "transform" ("translate(" <> show x <> "px, " <> show y <> "px)")
354 Clip X -> sk "clip-x" "overflow-x" "hidden"
502 Clip X -> sk "clip-x" "overflow-x" "hidden"
355 Clip Y -> sk "clip-y" "overflow-y" "hidden"
503 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 "-")
356
516
357class Renderable x where
517class Renderable x where
358 render :: x -> String
518 render :: x -> String
@@ -400,6 +560,7 @@ data Bones msg
400 | Link String { newTab :: Boolean } (View msg)
560 | Link String { newTab :: Boolean } (View msg)
401 | Download String { filename :: Maybe String } (View msg)
561 | Download String { filename :: Maybe String } (View msg)
402 | Image String { description :: String }
562 | Image String { description :: String }
563+ | TextInput { value :: String, onChange :: String -> msg }
403 | None
564 | None
404
565
405type Classes = Array String
566type Classes = Array String
@@ -412,21 +573,32 @@ instance Semigroup Mutation where
412instance Monoid Mutation where
573instance Monoid Mutation where
413 mempty = Mutation { extraSkin: mempty }
574 mempty = Mutation { extraSkin: mempty }
414
575
415−newtype SkinGrowth = SkinGrowth (Object { key :: String, value :: String })
576+newtype SkinGrowth = SkinGrowth
577+ { meat :: Object { key :: String, value :: String }
578+ , hover :: Object { key :: String, value :: String }
579+ , down :: Object { key :: String, value :: String }
580+ }
416
581
417styleSkinGrowth :: SkinGrowth -> String
582styleSkinGrowth :: SkinGrowth -> String
418styleSkinGrowth (SkinGrowth o) =
583styleSkinGrowth (SkinGrowth o) =
419− Object.foldMap (\className { key, value } -> "." <> className <> "{" <> key <> ":" <> value <> ";}") o
584+ Object.foldMap (\className { key, value } -> "." <> className <> "{" <> key <> ":" <> value <> ";}") o.meat
585+ <> Object.foldMap (\className { key, value } -> "." <> className <> "{" <> key <> ":" <> value <> ";}") o.hover
586+ <> Object.foldMap (\className { key, value } -> "." <> className <> "{" <> key <> ":" <> value <> ";}") o.down
420
587
421instance Semigroup SkinGrowth where
588instance Semigroup SkinGrowth where
422− append (SkinGrowth x) (SkinGrowth y) = SkinGrowth $ Object.union x y
589+ append (SkinGrowth x) (SkinGrowth y) = SkinGrowth $
590+ { meat: Object.union x.meat y.meat
591+ , hover: Object.union x.hover y.hover
592+ , down: Object.union x.down y.down
593+ }
423
594
424instance Monoid SkinGrowth where
595instance Monoid SkinGrowth where
425− mempty = SkinGrowth Object.empty
596+ mempty = SkinGrowth mempty
426
597
427growSkin :: forall msg. (msg -> Effect Unit) -> Mutation -> View msg -> Writer SkinGrowth VNode
598growSkin :: forall msg. (msg -> Effect Unit) -> Mutation -> View msg -> Writer SkinGrowth VNode
428growSkin fire (Mutation mutation) ({ meat, hover, down, nerves } /\ bones) = do
599growSkin fire (Mutation mutation) ({ meat, hover, down, nerves } /\ bones) = do
429 let
600 let
601+ wiredNerves = Array.foldMap (wireNerve fire) nerves
430 alignCenter = [ Align X Center, Align Y Center ]
602 alignCenter = [ Align X Center, Align Y Center ]
431 widthFill = [ Width Fill, Height Fill ]
603 widthFill = [ Width Fill, Height Fill ]
432 skn ctx = do
604 skn ctx = do
@@ -444,32 +616,46 @@ growSkin fire (Mutation mutation) ({ meat, hover, down, nerves } /\ bones) = do
444 Generic -> alignCenter
616 Generic -> alignCenter
445 )
617 )
446 let hoverClasses /\ (SkinGrowth hover') = runWriter $ traverse (skin ctx) hover
618 let hoverClasses /\ (SkinGrowth hover') = runWriter $ traverse (skin ctx) hover
619+ _ <- traverseWithIndex
620+ ( \key val -> tell $ SkinGrowth $
621+ { meat: Object.empty
447− _ <- traverseWithIndex (\key val -> tell $ SkinGrowth $ Object.singleton (key <> "-hover:hover") val) hover'
622+ , hover: Object.singleton (key <> "-hover:hover") val
623+ , down: Object.empty
624+ }
625+ )
626+ hover'.meat
448 let downClasses /\ (SkinGrowth down') = runWriter $ traverse (skin ctx) down
627 let downClasses /\ (SkinGrowth down') = runWriter $ traverse (skin ctx) down
628+ _ <- traverseWithIndex
629+ ( \key val -> tell $ SkinGrowth $
630+ { meat: Object.empty
631+ , hover: Object.empty
449− _ <- traverseWithIndex (\key val -> tell $ SkinGrowth $ Object.singleton (key <> "-down:active") val) down'
632+ , down: Object.singleton (key <> "-down:active") val
633+ }
634+ )
635+ down'.meat
450
636
451 pure $ meatClasses <> map (_ <> "-hover") (Array.concat hoverClasses) <> map (_ <> "-down") (Array.concat downClasses)
637 pure $ meatClasses <> map (_ <> "-hover") (Array.concat hoverClasses) <> map (_ <> "-down") (Array.concat downClasses)
452
638
453 case bones of
639 case bones of
454− Text t -> (\c -> h "span" c [ string t ]) <$> (skn Span)
640+ Text t -> (\c -> string "span" c wiredNerves t) <$> (skn Span)
455 Wrapper x -> do
641 Wrapper x -> do
456 classes <- (skn (Flexbox X) <> sk "display-flex" "display" "flex" <> sk "flex-direction-row" "flex-direction" "row")
642 classes <- (skn (Flexbox X) <> sk "display-flex" "display" "flex" <> sk "flex-direction-row" "flex-direction" "row")
457 x' <- growSkin fire mempty x
643 x' <- growSkin fire mempty x
458− pure $ h "div" classes [ x' ]
644+ pure $ h "div" classes wiredNerves [ x' ]
459 Stack children -> do
645 Stack children -> do
460 classes <- (skn Grid <> sk "display-grid" "display" "grid")
646 classes <- (skn Grid <> sk "display-grid" "display" "grid")
461 extraSkin <- sk "grid-row-1" "grid-row" "1" <> sk "grid-column-1" "grid-column" "1"
647 extraSkin <- sk "grid-row-1" "grid-row" "1" <> sk "grid-column-1" "grid-column" "1"
462 children' <- (traverse (growSkin fire $ Mutation { extraSkin }) children)
648 children' <- (traverse (growSkin fire $ Mutation { extraSkin }) children)
463− pure $ h "div" classes children'
649+ pure $ h "div" classes wiredNerves children'
464
650
465 Row children -> do
651 Row children -> do
466 classes <- (skn (Flexbox X) <> sk "display-flex" "display" "flex" <> sk "flex-direction-row" "flex-direction" "row")
652 classes <- (skn (Flexbox X) <> sk "display-flex" "display" "flex" <> sk "flex-direction-row" "flex-direction" "row")
467 children' <- traverse (growSkin fire mempty) children
653 children' <- traverse (growSkin fire mempty) children
468− pure $ h "div" classes children'
654+ pure $ h "div" classes wiredNerves children'
469 Column children -> do
655 Column children -> do
470 classes <- (skn (Flexbox Y) <> sk "display-flex" "display" "flex" <> sk "flex-direction-column" "flex-direction" "column")
656 classes <- (skn (Flexbox Y) <> sk "display-flex" "display" "flex" <> sk "flex-direction-column" "flex-direction" "column")
471 children' <- traverse (growSkin fire mempty) children
657 children' <- traverse (growSkin fire mempty) children
472− pure $ h "div" classes children'
658+ pure $ h "div" classes wiredNerves children'
473 Link href { newTab } child -> do
659 Link href { newTab } child -> do
474 classes <- (skn (Flexbox X) <> sk "display-flex" "display" "flex" <> sk "flex-direction-row" "flex-direction" "row")
660 classes <- (skn (Flexbox X) <> sk "display-flex" "display" "flex" <> sk "flex-direction-row" "flex-direction" "row")
475 child' <- growSkin fire mempty child
661 child' <- growSkin fire mempty child
@@ -479,6 +665,7 @@ growSkin fire (Mutation mutation) ({ meat, hover, down, nerves } /\ bones) = do
479 , target: if newTab then "_blank" else "_self"
665 , target: if newTab then "_blank" else "_self"
480 }
666 }
481 classes
667 classes
668+ wiredNerves
482 [ child' ]
669 [ child' ]
483
670
484 Download href { filename } child -> do
671 Download href { filename } child -> do
@@ -489,9 +676,20 @@ growSkin fire (Mutation mutation) ({ meat, hover, down, nerves } /\ bones) = do
489 , download: Maybe.fromMaybe "" filename
676 , download: Maybe.fromMaybe "" filename
490 }
677 }
491 classes
678 classes
679+ wiredNerves
492 [ child' ]
680 [ child' ]
493− Image src { description } -> (\c -> hWith "img" { src, alt: description } c []) <$> (skn Generic)
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) []
494− None -> pure $ h "div" mempty []
692+ None -> pure $ h "div" mempty wiredNerves []
495
693
496grow :: forall msg. (msg -> Effect Unit) -> View msg -> { node :: VNode, style :: String }
694grow :: forall msg. (msg -> Effect Unit) -> View msg -> { node :: VNode, style :: String }
497grow fire v =
695grow fire v =
@@ -499,3 +697,4 @@ grow fire v =
499 node /\ skinGrowth = runWriter (growSkin fire mempty v)
697 node /\ skinGrowth = runWriter (growSkin fire mempty v)
500 in
698 in
501 { node, style: styleSkinGrowth skinGrowth }
699 { 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