Subversion Repositories oidplus

Rev

Rev 1422 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
597 daniel-mar 1
/**
2
 * Copyright (c) Tiny Technologies, Inc. All rights reserved.
3
 * Licensed under the LGPL or a commercial license.
4
 * For LGPL see License.txt in the project root for license information.
5
 * For commercial licenses see https://www.tiny.cloud/
6
 *
1434 daniel-mar 7
 * Version: 5.10.9 (2023-11-15)
597 daniel-mar 8
 */
9
(function () {
10
    'use strict';
11
 
12
    var __assign = function () {
13
      __assign = Object.assign || function __assign(t) {
14
        for (var s, i = 1, n = arguments.length; i < n; i++) {
15
          s = arguments[i];
16
          for (var p in s)
17
            if (Object.prototype.hasOwnProperty.call(s, p))
18
              t[p] = s[p];
19
        }
20
        return t;
21
      };
22
      return __assign.apply(this, arguments);
23
    };
24
    function __rest(s, e) {
25
      var t = {};
26
      for (var p in s)
27
        if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
28
          t[p] = s[p];
29
      if (s != null && typeof Object.getOwnPropertySymbols === 'function')
30
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
31
          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
32
            t[p[i]] = s[p[i]];
33
        }
34
      return t;
35
    }
637 daniel-mar 36
    function __spreadArray(to, from, pack) {
37
      if (pack || arguments.length === 2)
38
        for (var i = 0, l = from.length, ar; i < l; i++) {
39
          if (ar || !(i in from)) {
40
            if (!ar)
41
              ar = Array.prototype.slice.call(from, 0, i);
42
            ar[i] = from[i];
43
          }
44
        }
45
      return to.concat(ar || Array.prototype.slice.call(from));
597 daniel-mar 46
    }
47
 
48
    var typeOf = function (x) {
49
      var t = typeof x;
50
      if (x === null) {
51
        return 'null';
52
      } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
53
        return 'array';
54
      } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
55
        return 'string';
56
      } else {
57
        return t;
58
      }
59
    };
637 daniel-mar 60
    var isType$1 = function (type) {
597 daniel-mar 61
      return function (value) {
62
        return typeOf(value) === type;
63
      };
64
    };
65
    var isSimpleType = function (type) {
66
      return function (value) {
67
        return typeof value === type;
68
      };
69
    };
637 daniel-mar 70
    var eq$1 = function (t) {
71
      return function (a) {
72
        return t === a;
73
      };
74
    };
75
    var isString = isType$1('string');
76
    var isObject = isType$1('object');
77
    var isArray = isType$1('array');
78
    var isNull = eq$1(null);
597 daniel-mar 79
    var isBoolean = isSimpleType('boolean');
637 daniel-mar 80
    var isUndefined = eq$1(undefined);
597 daniel-mar 81
    var isNullable = function (a) {
82
      return a === null || a === undefined;
83
    };
84
    var isNonNullable = function (a) {
85
      return !isNullable(a);
86
    };
87
    var isFunction = isSimpleType('function');
88
    var isNumber = isSimpleType('number');
89
 
90
    var noop = function () {
91
    };
92
    var compose = function (fa, fb) {
93
      return function () {
94
        var args = [];
95
        for (var _i = 0; _i < arguments.length; _i++) {
96
          args[_i] = arguments[_i];
97
        }
98
        return fa(fb.apply(null, args));
99
      };
100
    };
101
    var compose1 = function (fbc, fab) {
102
      return function (a) {
103
        return fbc(fab(a));
104
      };
105
    };
637 daniel-mar 106
    var constant$1 = function (value) {
597 daniel-mar 107
      return function () {
108
        return value;
109
      };
110
    };
111
    var identity = function (x) {
112
      return x;
113
    };
637 daniel-mar 114
    var tripleEquals = function (a, b) {
115
      return a === b;
116
    };
597 daniel-mar 117
    function curry(fn) {
118
      var initialArgs = [];
119
      for (var _i = 1; _i < arguments.length; _i++) {
120
        initialArgs[_i - 1] = arguments[_i];
121
      }
122
      return function () {
123
        var restArgs = [];
124
        for (var _i = 0; _i < arguments.length; _i++) {
125
          restArgs[_i] = arguments[_i];
126
        }
127
        var all = initialArgs.concat(restArgs);
128
        return fn.apply(null, all);
129
      };
130
    }
131
    var not = function (f) {
132
      return function (t) {
133
        return !f(t);
134
      };
135
    };
136
    var die = function (msg) {
137
      return function () {
138
        throw new Error(msg);
139
      };
140
    };
637 daniel-mar 141
    var apply$1 = function (f) {
597 daniel-mar 142
      return f();
143
    };
637 daniel-mar 144
    var never = constant$1(false);
145
    var always = constant$1(true);
597 daniel-mar 146
 
147
    var none = function () {
148
      return NONE;
149
    };
150
    var NONE = function () {
151
      var call = function (thunk) {
152
        return thunk();
153
      };
637 daniel-mar 154
      var id = identity;
597 daniel-mar 155
      var me = {
156
        fold: function (n, _s) {
157
          return n();
158
        },
159
        isSome: never,
160
        isNone: always,
161
        getOr: id,
162
        getOrThunk: call,
163
        getOrDie: function (msg) {
164
          throw new Error(msg || 'error: getOrDie called on none.');
165
        },
637 daniel-mar 166
        getOrNull: constant$1(null),
167
        getOrUndefined: constant$1(undefined),
597 daniel-mar 168
        or: id,
169
        orThunk: call,
170
        map: none,
171
        each: noop,
172
        bind: none,
173
        exists: never,
174
        forall: always,
637 daniel-mar 175
        filter: function () {
176
          return none();
177
        },
597 daniel-mar 178
        toArray: function () {
179
          return [];
180
        },
637 daniel-mar 181
        toString: constant$1('none()')
597 daniel-mar 182
      };
183
      return me;
184
    }();
185
    var some = function (a) {
637 daniel-mar 186
      var constant_a = constant$1(a);
597 daniel-mar 187
      var self = function () {
188
        return me;
189
      };
190
      var bind = function (f) {
191
        return f(a);
192
      };
193
      var me = {
194
        fold: function (n, s) {
195
          return s(a);
196
        },
197
        isSome: always,
198
        isNone: never,
199
        getOr: constant_a,
200
        getOrThunk: constant_a,
201
        getOrDie: constant_a,
202
        getOrNull: constant_a,
203
        getOrUndefined: constant_a,
204
        or: self,
205
        orThunk: self,
206
        map: function (f) {
207
          return some(f(a));
208
        },
209
        each: function (f) {
210
          f(a);
211
        },
212
        bind: bind,
213
        exists: bind,
214
        forall: bind,
215
        filter: function (f) {
216
          return f(a) ? me : NONE;
217
        },
218
        toArray: function () {
219
          return [a];
220
        },
221
        toString: function () {
222
          return 'some(' + a + ')';
223
        }
224
      };
225
      return me;
226
    };
227
    var from = function (value) {
228
      return value === null || value === undefined ? NONE : some(value);
229
    };
230
    var Optional = {
231
      some: some,
232
      none: none,
233
      from: from
234
    };
235
 
637 daniel-mar 236
    var cached = function (f) {
237
      var called = false;
238
      var r;
239
      return function () {
240
        var args = [];
241
        for (var _i = 0; _i < arguments.length; _i++) {
242
          args[_i] = arguments[_i];
243
        }
244
        if (!called) {
245
          called = true;
246
          r = f.apply(null, args);
247
        }
248
        return r;
249
      };
250
    };
251
 
252
    var DeviceType = function (os, browser, userAgent, mediaMatch) {
253
      var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
254
      var isiPhone = os.isiOS() && !isiPad;
255
      var isMobile = os.isiOS() || os.isAndroid();
256
      var isTouch = isMobile || mediaMatch('(pointer:coarse)');
257
      var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');
258
      var isPhone = isiPhone || isMobile && !isTablet;
259
      var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
260
      var isDesktop = !isPhone && !isTablet && !iOSwebview;
261
      return {
262
        isiPad: constant$1(isiPad),
263
        isiPhone: constant$1(isiPhone),
264
        isTablet: constant$1(isTablet),
265
        isPhone: constant$1(isPhone),
266
        isTouch: constant$1(isTouch),
267
        isAndroid: os.isAndroid,
268
        isiOS: os.isiOS,
269
        isWebView: constant$1(iOSwebview),
270
        isDesktop: constant$1(isDesktop)
271
      };
272
    };
273
 
597 daniel-mar 274
    var nativeSlice = Array.prototype.slice;
275
    var nativeIndexOf = Array.prototype.indexOf;
276
    var nativePush = Array.prototype.push;
277
    var rawIndexOf = function (ts, t) {
278
      return nativeIndexOf.call(ts, t);
279
    };
637 daniel-mar 280
    var contains$1 = function (xs, x) {
597 daniel-mar 281
      return rawIndexOf(xs, x) > -1;
282
    };
283
    var exists = function (xs, pred) {
284
      for (var i = 0, len = xs.length; i < len; i++) {
285
        var x = xs[i];
286
        if (pred(x, i)) {
287
          return true;
288
        }
289
      }
290
      return false;
291
    };
637 daniel-mar 292
    var map$2 = function (xs, f) {
597 daniel-mar 293
      var len = xs.length;
294
      var r = new Array(len);
295
      for (var i = 0; i < len; i++) {
296
        var x = xs[i];
297
        r[i] = f(x, i);
298
      }
299
      return r;
300
    };
637 daniel-mar 301
    var each$1 = function (xs, f) {
597 daniel-mar 302
      for (var i = 0, len = xs.length; i < len; i++) {
303
        var x = xs[i];
304
        f(x, i);
305
      }
306
    };
307
    var eachr = function (xs, f) {
308
      for (var i = xs.length - 1; i >= 0; i--) {
309
        var x = xs[i];
310
        f(x, i);
311
      }
312
    };
637 daniel-mar 313
    var filter$2 = function (xs, pred) {
597 daniel-mar 314
      var r = [];
315
      for (var i = 0, len = xs.length; i < len; i++) {
316
        var x = xs[i];
317
        if (pred(x, i)) {
318
          r.push(x);
319
        }
320
      }
321
      return r;
322
    };
323
    var foldr = function (xs, f, acc) {
637 daniel-mar 324
      eachr(xs, function (x, i) {
325
        acc = f(acc, x, i);
597 daniel-mar 326
      });
327
      return acc;
328
    };
329
    var foldl = function (xs, f, acc) {
637 daniel-mar 330
      each$1(xs, function (x, i) {
331
        acc = f(acc, x, i);
597 daniel-mar 332
      });
333
      return acc;
334
    };
335
    var findUntil = function (xs, pred, until) {
336
      for (var i = 0, len = xs.length; i < len; i++) {
337
        var x = xs[i];
338
        if (pred(x, i)) {
339
          return Optional.some(x);
340
        } else if (until(x, i)) {
341
          break;
342
        }
343
      }
344
      return Optional.none();
345
    };
637 daniel-mar 346
    var find$2 = function (xs, pred) {
597 daniel-mar 347
      return findUntil(xs, pred, never);
348
    };
637 daniel-mar 349
    var findIndex$1 = function (xs, pred) {
597 daniel-mar 350
      for (var i = 0, len = xs.length; i < len; i++) {
351
        var x = xs[i];
352
        if (pred(x, i)) {
353
          return Optional.some(i);
354
        }
355
      }
356
      return Optional.none();
357
    };
358
    var flatten = function (xs) {
359
      var r = [];
360
      for (var i = 0, len = xs.length; i < len; ++i) {
361
        if (!isArray(xs[i])) {
362
          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
363
        }
364
        nativePush.apply(r, xs[i]);
365
      }
366
      return r;
367
    };
637 daniel-mar 368
    var bind$3 = function (xs, f) {
369
      return flatten(map$2(xs, f));
597 daniel-mar 370
    };
371
    var forall = function (xs, pred) {
372
      for (var i = 0, len = xs.length; i < len; ++i) {
373
        var x = xs[i];
374
        if (pred(x, i) !== true) {
375
          return false;
376
        }
377
      }
378
      return true;
379
    };
380
    var reverse = function (xs) {
381
      var r = nativeSlice.call(xs, 0);
382
      r.reverse();
383
      return r;
384
    };
385
    var difference = function (a1, a2) {
637 daniel-mar 386
      return filter$2(a1, function (x) {
387
        return !contains$1(a2, x);
597 daniel-mar 388
      });
389
    };
637 daniel-mar 390
    var pure$2 = function (x) {
597 daniel-mar 391
      return [x];
392
    };
393
    var sort = function (xs, comparator) {
394
      var copy = nativeSlice.call(xs, 0);
395
      copy.sort(comparator);
396
      return copy;
397
    };
637 daniel-mar 398
    var get$d = function (xs, i) {
597 daniel-mar 399
      return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
400
    };
401
    var head = function (xs) {
637 daniel-mar 402
      return get$d(xs, 0);
597 daniel-mar 403
    };
404
    var findMap = function (arr, f) {
405
      for (var i = 0; i < arr.length; i++) {
406
        var r = f(arr[i], i);
407
        if (r.isSome()) {
408
          return r;
409
        }
410
      }
411
      return Optional.none();
412
    };
413
 
414
    var firstMatch = function (regexes, s) {
415
      for (var i = 0; i < regexes.length; i++) {
416
        var x = regexes[i];
417
        if (x.test(s)) {
418
          return x;
419
        }
420
      }
421
      return undefined;
422
    };
423
    var find$1 = function (regexes, agent) {
424
      var r = firstMatch(regexes, agent);
425
      if (!r) {
426
        return {
427
          major: 0,
428
          minor: 0
429
        };
430
      }
431
      var group = function (i) {
432
        return Number(agent.replace(r, '$' + i));
433
      };
637 daniel-mar 434
      return nu$8(group(1), group(2));
597 daniel-mar 435
    };
637 daniel-mar 436
    var detect$4 = function (versionRegexes, agent) {
597 daniel-mar 437
      var cleanedAgent = String(agent).toLowerCase();
438
      if (versionRegexes.length === 0) {
637 daniel-mar 439
        return unknown$3();
597 daniel-mar 440
      }
441
      return find$1(versionRegexes, cleanedAgent);
442
    };
637 daniel-mar 443
    var unknown$3 = function () {
444
      return nu$8(0, 0);
597 daniel-mar 445
    };
637 daniel-mar 446
    var nu$8 = function (major, minor) {
597 daniel-mar 447
      return {
448
        major: major,
449
        minor: minor
450
      };
451
    };
452
    var Version = {
637 daniel-mar 453
      nu: nu$8,
454
      detect: detect$4,
455
      unknown: unknown$3
597 daniel-mar 456
    };
457
 
637 daniel-mar 458
    var detectBrowser$1 = function (browsers, userAgentData) {
459
      return findMap(userAgentData.brands, function (uaBrand) {
460
        var lcBrand = uaBrand.brand.toLowerCase();
461
        return find$2(browsers, function (browser) {
462
          var _a;
463
          return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());
464
        }).map(function (info) {
465
          return {
466
            current: info.name,
467
            version: Version.nu(parseInt(uaBrand.version, 10), 0)
468
          };
469
        });
470
      });
471
    };
472
 
473
    var detect$3 = function (candidates, userAgent) {
597 daniel-mar 474
      var agent = String(userAgent).toLowerCase();
637 daniel-mar 475
      return find$2(candidates, function (candidate) {
597 daniel-mar 476
        return candidate.search(agent);
477
      });
478
    };
479
    var detectBrowser = function (browsers, userAgent) {
637 daniel-mar 480
      return detect$3(browsers, userAgent).map(function (browser) {
597 daniel-mar 481
        var version = Version.detect(browser.versionRegexes, userAgent);
482
        return {
483
          current: browser.name,
484
          version: version
485
        };
486
      });
487
    };
488
    var detectOs = function (oses, userAgent) {
637 daniel-mar 489
      return detect$3(oses, userAgent).map(function (os) {
597 daniel-mar 490
        var version = Version.detect(os.versionRegexes, userAgent);
491
        return {
492
          current: os.name,
493
          version: version
494
        };
495
      });
496
    };
497
 
498
    var checkRange = function (str, substr, start) {
499
      return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;
500
    };
501
    var supplant = function (str, obj) {
502
      var isStringOrNumber = function (a) {
503
        var t = typeof a;
504
        return t === 'string' || t === 'number';
505
      };
506
      return str.replace(/\$\{([^{}]*)\}/g, function (fullMatch, key) {
507
        var value = obj[key];
508
        return isStringOrNumber(value) ? value.toString() : fullMatch;
509
      });
510
    };
637 daniel-mar 511
    var contains = function (str, substr) {
597 daniel-mar 512
      return str.indexOf(substr) !== -1;
513
    };
514
    var endsWith = function (str, suffix) {
515
      return checkRange(str, suffix, str.length - suffix.length);
516
    };
517
    var blank = function (r) {
518
      return function (s) {
519
        return s.replace(r, '');
520
      };
521
    };
522
    var trim = blank(/^\s+|\s+$/g);
523
 
524
    var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
525
    var checkContains = function (target) {
526
      return function (uastring) {
637 daniel-mar 527
        return contains(uastring, target);
597 daniel-mar 528
      };
529
    };
530
    var browsers = [
531
      {
532
        name: 'Edge',
533
        versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
534
        search: function (uastring) {
637 daniel-mar 535
          return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit');
597 daniel-mar 536
        }
537
      },
538
      {
539
        name: 'Chrome',
637 daniel-mar 540
        brand: 'Chromium',
597 daniel-mar 541
        versionRegexes: [
542
          /.*?chrome\/([0-9]+)\.([0-9]+).*/,
543
          normalVersionRegex
544
        ],
545
        search: function (uastring) {
637 daniel-mar 546
          return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe');
597 daniel-mar 547
        }
548
      },
549
      {
550
        name: 'IE',
551
        versionRegexes: [
552
          /.*?msie\ ?([0-9]+)\.([0-9]+).*/,
553
          /.*?rv:([0-9]+)\.([0-9]+).*/
554
        ],
555
        search: function (uastring) {
637 daniel-mar 556
          return contains(uastring, 'msie') || contains(uastring, 'trident');
597 daniel-mar 557
        }
558
      },
559
      {
560
        name: 'Opera',
561
        versionRegexes: [
562
          normalVersionRegex,
563
          /.*?opera\/([0-9]+)\.([0-9]+).*/
564
        ],
565
        search: checkContains('opera')
566
      },
567
      {
568
        name: 'Firefox',
569
        versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
570
        search: checkContains('firefox')
571
      },
572
      {
573
        name: 'Safari',
574
        versionRegexes: [
575
          normalVersionRegex,
576
          /.*?cpu os ([0-9]+)_([0-9]+).*/
577
        ],
578
        search: function (uastring) {
637 daniel-mar 579
          return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit');
597 daniel-mar 580
        }
581
      }
582
    ];
583
    var oses = [
584
      {
585
        name: 'Windows',
586
        search: checkContains('win'),
587
        versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
588
      },
589
      {
590
        name: 'iOS',
591
        search: function (uastring) {
637 daniel-mar 592
          return contains(uastring, 'iphone') || contains(uastring, 'ipad');
597 daniel-mar 593
        },
594
        versionRegexes: [
595
          /.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
596
          /.*cpu os ([0-9]+)_([0-9]+).*/,
597
          /.*cpu iphone os ([0-9]+)_([0-9]+).*/
598
        ]
599
      },
600
      {
601
        name: 'Android',
602
        search: checkContains('android'),
603
        versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
604
      },
605
      {
606
        name: 'OSX',
607
        search: checkContains('mac os x'),
608
        versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]
609
      },
610
      {
611
        name: 'Linux',
612
        search: checkContains('linux'),
613
        versionRegexes: []
614
      },
615
      {
616
        name: 'Solaris',
617
        search: checkContains('sunos'),
618
        versionRegexes: []
619
      },
620
      {
621
        name: 'FreeBSD',
622
        search: checkContains('freebsd'),
623
        versionRegexes: []
624
      },
625
      {
626
        name: 'ChromeOS',
627
        search: checkContains('cros'),
628
        versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/]
629
      }
630
    ];
631
    var PlatformInfo = {
637 daniel-mar 632
      browsers: constant$1(browsers),
633
      oses: constant$1(oses)
597 daniel-mar 634
    };
635
 
636
    var edge = 'Edge';
637
    var chrome = 'Chrome';
638
    var ie = 'IE';
639
    var opera = 'Opera';
640
    var firefox = 'Firefox';
641
    var safari = 'Safari';
637 daniel-mar 642
    var unknown$2 = function () {
643
      return nu$7({
597 daniel-mar 644
        current: undefined,
645
        version: Version.unknown()
646
      });
647
    };
637 daniel-mar 648
    var nu$7 = function (info) {
597 daniel-mar 649
      var current = info.current;
650
      var version = info.version;
651
      var isBrowser = function (name) {
652
        return function () {
653
          return current === name;
654
        };
655
      };
656
      return {
657
        current: current,
658
        version: version,
659
        isEdge: isBrowser(edge),
660
        isChrome: isBrowser(chrome),
661
        isIE: isBrowser(ie),
662
        isOpera: isBrowser(opera),
663
        isFirefox: isBrowser(firefox),
664
        isSafari: isBrowser(safari)
665
      };
666
    };
667
    var Browser = {
637 daniel-mar 668
      unknown: unknown$2,
669
      nu: nu$7,
670
      edge: constant$1(edge),
671
      chrome: constant$1(chrome),
672
      ie: constant$1(ie),
673
      opera: constant$1(opera),
674
      firefox: constant$1(firefox),
675
      safari: constant$1(safari)
597 daniel-mar 676
    };
677
 
678
    var windows = 'Windows';
679
    var ios = 'iOS';
680
    var android = 'Android';
681
    var linux = 'Linux';
682
    var osx = 'OSX';
683
    var solaris = 'Solaris';
684
    var freebsd = 'FreeBSD';
685
    var chromeos = 'ChromeOS';
637 daniel-mar 686
    var unknown$1 = function () {
687
      return nu$6({
597 daniel-mar 688
        current: undefined,
689
        version: Version.unknown()
690
      });
691
    };
637 daniel-mar 692
    var nu$6 = function (info) {
597 daniel-mar 693
      var current = info.current;
694
      var version = info.version;
695
      var isOS = function (name) {
696
        return function () {
697
          return current === name;
698
        };
699
      };
700
      return {
701
        current: current,
702
        version: version,
703
        isWindows: isOS(windows),
704
        isiOS: isOS(ios),
705
        isAndroid: isOS(android),
706
        isOSX: isOS(osx),
707
        isLinux: isOS(linux),
708
        isSolaris: isOS(solaris),
709
        isFreeBSD: isOS(freebsd),
710
        isChromeOS: isOS(chromeos)
711
      };
712
    };
713
    var OperatingSystem = {
637 daniel-mar 714
      unknown: unknown$1,
715
      nu: nu$6,
716
      windows: constant$1(windows),
717
      ios: constant$1(ios),
718
      android: constant$1(android),
719
      linux: constant$1(linux),
720
      osx: constant$1(osx),
721
      solaris: constant$1(solaris),
722
      freebsd: constant$1(freebsd),
723
      chromeos: constant$1(chromeos)
597 daniel-mar 724
    };
725
 
637 daniel-mar 726
    var detect$2 = function (userAgent, userAgentDataOpt, mediaMatch) {
597 daniel-mar 727
      var browsers = PlatformInfo.browsers();
728
      var oses = PlatformInfo.oses();
637 daniel-mar 729
      var browser = userAgentDataOpt.bind(function (userAgentData) {
730
        return detectBrowser$1(browsers, userAgentData);
731
      }).orThunk(function () {
732
        return detectBrowser(browsers, userAgent);
733
      }).fold(Browser.unknown, Browser.nu);
734
      var os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
597 daniel-mar 735
      var deviceType = DeviceType(os, browser, userAgent, mediaMatch);
736
      return {
737
        browser: browser,
738
        os: os,
739
        deviceType: deviceType
740
      };
741
    };
742
    var PlatformDetection = { detect: detect$2 };
743
 
744
    var mediaMatch = function (query) {
745
      return window.matchMedia(query).matches;
746
    };
637 daniel-mar 747
    var platform$1 = cached(function () {
748
      return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch);
597 daniel-mar 749
    });
637 daniel-mar 750
    var detect$1 = function () {
751
      return platform$1();
597 daniel-mar 752
    };
753
 
637 daniel-mar 754
    var constant = constant$1;
755
    var touchstart = constant('touchstart');
756
    var touchmove = constant('touchmove');
757
    var touchend = constant('touchend');
758
    var mousedown = constant('mousedown');
759
    var mousemove = constant('mousemove');
760
    var mouseup = constant('mouseup');
761
    var mouseover = constant('mouseover');
762
    var keydown = constant('keydown');
763
    var keyup = constant('keyup');
764
    var input$1 = constant('input');
765
    var change = constant('change');
766
    var click = constant('click');
767
    var transitionend = constant('transitionend');
768
    var selectstart = constant('selectstart');
597 daniel-mar 769
 
770
    var prefixName = function (name) {
637 daniel-mar 771
      return constant$1('alloy.' + name);
597 daniel-mar 772
    };
773
    var alloy = { tap: prefixName('tap') };
637 daniel-mar 774
    var focus$4 = prefixName('focus');
597 daniel-mar 775
    var postBlur = prefixName('blur.post');
776
    var postPaste = prefixName('paste.post');
637 daniel-mar 777
    var receive$1 = prefixName('receive');
778
    var execute$5 = prefixName('execute');
597 daniel-mar 779
    var focusItem = prefixName('focus.item');
780
    var tap = alloy.tap;
781
    var longpress = prefixName('longpress');
782
    var systemInit = prefixName('system.init');
783
    var attachedToDom = prefixName('system.attached');
784
    var detachedFromDom = prefixName('system.detached');
785
    var focusShifted = prefixName('focusmanager.shifted');
637 daniel-mar 786
    var highlight$1 = prefixName('highlight');
787
    var dehighlight$1 = prefixName('dehighlight');
597 daniel-mar 788
 
789
    var emit = function (component, event) {
790
      dispatchWith(component, component.element, event, {});
791
    };
792
    var emitWith = function (component, event, properties) {
793
      dispatchWith(component, component.element, event, properties);
794
    };
795
    var emitExecute = function (component) {
637 daniel-mar 796
      emit(component, execute$5());
597 daniel-mar 797
    };
798
    var dispatch = function (component, target, event) {
799
      dispatchWith(component, target, event, {});
800
    };
801
    var dispatchWith = function (component, target, event, properties) {
802
      var data = __assign({ target: target }, properties);
803
      component.getSystem().triggerEvent(event, target, data);
804
    };
805
    var dispatchEvent = function (component, target, event, simulatedEvent) {
806
      component.getSystem().triggerEvent(event, target, simulatedEvent.event);
807
    };
808
    var dispatchFocus = function (component, target) {
809
      component.getSystem().triggerFocus(target, component.element);
810
    };
811
 
812
    var DOCUMENT = 9;
813
    var DOCUMENT_FRAGMENT = 11;
814
    var ELEMENT = 1;
815
    var TEXT = 3;
816
 
637 daniel-mar 817
    var fromHtml$2 = function (html, scope) {
597 daniel-mar 818
      var doc = scope || document;
819
      var div = doc.createElement('div');
820
      div.innerHTML = html;
821
      if (!div.hasChildNodes() || div.childNodes.length > 1) {
822
        console.error('HTML does not have a single root node', html);
823
        throw new Error('HTML must have a single root node');
824
      }
825
      return fromDom(div.childNodes[0]);
826
    };
827
    var fromTag = function (tag, scope) {
828
      var doc = scope || document;
829
      var node = doc.createElement(tag);
830
      return fromDom(node);
831
    };
832
    var fromText = function (text, scope) {
833
      var doc = scope || document;
834
      var node = doc.createTextNode(text);
835
      return fromDom(node);
836
    };
837
    var fromDom = function (node) {
838
      if (node === null || node === undefined) {
839
        throw new Error('Node cannot be null or undefined');
840
      }
841
      return { dom: node };
842
    };
843
    var fromPoint = function (docElm, x, y) {
844
      return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);
845
    };
846
    var SugarElement = {
637 daniel-mar 847
      fromHtml: fromHtml$2,
597 daniel-mar 848
      fromTag: fromTag,
849
      fromText: fromText,
850
      fromDom: fromDom,
851
      fromPoint: fromPoint
852
    };
853
 
637 daniel-mar 854
    var is$1 = function (element, selector) {
597 daniel-mar 855
      var dom = element.dom;
856
      if (dom.nodeType !== ELEMENT) {
857
        return false;
858
      } else {
859
        var elem = dom;
860
        if (elem.matches !== undefined) {
861
          return elem.matches(selector);
862
        } else if (elem.msMatchesSelector !== undefined) {
863
          return elem.msMatchesSelector(selector);
864
        } else if (elem.webkitMatchesSelector !== undefined) {
865
          return elem.webkitMatchesSelector(selector);
866
        } else if (elem.mozMatchesSelector !== undefined) {
867
          return elem.mozMatchesSelector(selector);
868
        } else {
869
          throw new Error('Browser lacks native selectors');
870
        }
871
      }
872
    };
873
    var bypassSelector = function (dom) {
874
      return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;
875
    };
637 daniel-mar 876
    var all$2 = function (selector, scope) {
597 daniel-mar 877
      var base = scope === undefined ? document : scope.dom;
637 daniel-mar 878
      return bypassSelector(base) ? [] : map$2(base.querySelectorAll(selector), SugarElement.fromDom);
597 daniel-mar 879
    };
880
    var one = function (selector, scope) {
881
      var base = scope === undefined ? document : scope.dom;
882
      return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom);
883
    };
884
 
885
    var eq = function (e1, e2) {
886
      return e1.dom === e2.dom;
887
    };
888
 
637 daniel-mar 889
    typeof window !== 'undefined' ? window : Function('return this;')();
597 daniel-mar 890
 
637 daniel-mar 891
    var name$1 = function (element) {
597 daniel-mar 892
      var r = element.dom.nodeName;
893
      return r.toLowerCase();
894
    };
895
    var type = function (element) {
896
      return element.dom.nodeType;
897
    };
637 daniel-mar 898
    var isType = function (t) {
597 daniel-mar 899
      return function (element) {
900
        return type(element) === t;
901
      };
902
    };
637 daniel-mar 903
    var isElement = isType(ELEMENT);
904
    var isText = isType(TEXT);
905
    var isDocument = isType(DOCUMENT);
906
    var isDocumentFragment = isType(DOCUMENT_FRAGMENT);
597 daniel-mar 907
 
637 daniel-mar 908
    var owner$2 = function (element) {
597 daniel-mar 909
      return SugarElement.fromDom(element.dom.ownerDocument);
910
    };
911
    var documentOrOwner = function (dos) {
637 daniel-mar 912
      return isDocument(dos) ? dos : owner$2(dos);
597 daniel-mar 913
    };
914
    var defaultView = function (element) {
915
      return SugarElement.fromDom(documentOrOwner(element).dom.defaultView);
916
    };
917
    var parent = function (element) {
918
      return Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
919
    };
920
    var parents = function (element, isRoot) {
921
      var stop = isFunction(isRoot) ? isRoot : never;
922
      var dom = element.dom;
923
      var ret = [];
924
      while (dom.parentNode !== null && dom.parentNode !== undefined) {
925
        var rawParent = dom.parentNode;
926
        var p = SugarElement.fromDom(rawParent);
927
        ret.push(p);
928
        if (stop(p) === true) {
929
          break;
930
        } else {
931
          dom = rawParent;
932
        }
933
      }
934
      return ret;
935
    };
637 daniel-mar 936
    var siblings$2 = function (element) {
597 daniel-mar 937
      var filterSelf = function (elements) {
637 daniel-mar 938
        return filter$2(elements, function (x) {
597 daniel-mar 939
          return !eq(element, x);
940
        });
941
      };
942
      return parent(element).map(children).map(filterSelf).getOr([]);
943
    };
944
    var nextSibling = function (element) {
945
      return Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);
946
    };
947
    var children = function (element) {
637 daniel-mar 948
      return map$2(element.dom.childNodes, SugarElement.fromDom);
597 daniel-mar 949
    };
950
    var child = function (element, index) {
951
      var cs = element.dom.childNodes;
952
      return Optional.from(cs[index]).map(SugarElement.fromDom);
953
    };
954
    var firstChild = function (element) {
955
      return child(element, 0);
956
    };
957
 
637 daniel-mar 958
    var before$1 = function (marker, element) {
597 daniel-mar 959
      var parent$1 = parent(marker);
960
      parent$1.each(function (v) {
961
        v.dom.insertBefore(element.dom, marker.dom);
962
      });
963
    };
637 daniel-mar 964
    var after$2 = function (marker, element) {
597 daniel-mar 965
      var sibling = nextSibling(marker);
966
      sibling.fold(function () {
967
        var parent$1 = parent(marker);
968
        parent$1.each(function (v) {
637 daniel-mar 969
          append$2(v, element);
597 daniel-mar 970
        });
971
      }, function (v) {
637 daniel-mar 972
        before$1(v, element);
597 daniel-mar 973
      });
974
    };
637 daniel-mar 975
    var prepend$1 = function (parent, element) {
597 daniel-mar 976
      var firstChild$1 = firstChild(parent);
977
      firstChild$1.fold(function () {
637 daniel-mar 978
        append$2(parent, element);
597 daniel-mar 979
      }, function (v) {
980
        parent.dom.insertBefore(element.dom, v.dom);
981
      });
982
    };
637 daniel-mar 983
    var append$2 = function (parent, element) {
597 daniel-mar 984
      parent.dom.appendChild(element.dom);
985
    };
986
    var appendAt = function (parent, element, index) {
987
      child(parent, index).fold(function () {
637 daniel-mar 988
        append$2(parent, element);
597 daniel-mar 989
      }, function (v) {
637 daniel-mar 990
        before$1(v, element);
597 daniel-mar 991
      });
992
    };
993
 
994
    var append$1 = function (parent, elements) {
637 daniel-mar 995
      each$1(elements, function (x) {
996
        append$2(parent, x);
597 daniel-mar 997
      });
998
    };
999
 
1000
    var empty = function (element) {
1001
      element.dom.textContent = '';
637 daniel-mar 1002
      each$1(children(element), function (rogue) {
1003
        remove$7(rogue);
597 daniel-mar 1004
      });
1005
    };
637 daniel-mar 1006
    var remove$7 = function (element) {
597 daniel-mar 1007
      var dom = element.dom;
1008
      if (dom.parentNode !== null) {
1009
        dom.parentNode.removeChild(dom);
1010
      }
1011
    };
1012
 
1013
    var isShadowRoot = function (dos) {
1014
      return isDocumentFragment(dos) && isNonNullable(dos.dom.host);
1015
    };
1016
    var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);
637 daniel-mar 1017
    var isSupported$1 = constant$1(supported);
597 daniel-mar 1018
    var getRootNode = supported ? function (e) {
1019
      return SugarElement.fromDom(e.dom.getRootNode());
1020
    } : documentOrOwner;
1021
    var getShadowRoot = function (e) {
1022
      var r = getRootNode(e);
1023
      return isShadowRoot(r) ? Optional.some(r) : Optional.none();
1024
    };
1025
    var getShadowHost = function (e) {
1026
      return SugarElement.fromDom(e.dom.host);
1027
    };
1028
    var getOriginalEventTarget = function (event) {
637 daniel-mar 1029
      if (isSupported$1() && isNonNullable(event.target)) {
597 daniel-mar 1030
        var el = SugarElement.fromDom(event.target);
1031
        if (isElement(el) && isOpenShadowHost(el)) {
1032
          if (event.composed && event.composedPath) {
1033
            var composedPath = event.composedPath();
1034
            if (composedPath) {
1035
              return head(composedPath);
1036
            }
1037
          }
1038
        }
1039
      }
1040
      return Optional.from(event.target);
1041
    };
1042
    var isOpenShadowHost = function (element) {
1043
      return isNonNullable(element.dom.shadowRoot);
1044
    };
1045
 
1046
    var inBody = function (element) {
1047
      var dom = isText(element) ? element.dom.parentNode : element.dom;
1048
      if (dom === undefined || dom === null || dom.ownerDocument === null) {
1049
        return false;
1050
      }
1051
      var doc = dom.ownerDocument;
1052
      return getShadowRoot(SugarElement.fromDom(dom)).fold(function () {
1053
        return doc.body.contains(dom);
1054
      }, compose1(inBody, getShadowHost));
1055
    };
1056
    var body = function () {
1057
      return getBody(SugarElement.fromDom(document));
1058
    };
1059
    var getBody = function (doc) {
1060
      var b = doc.dom.body;
1061
      if (b === null || b === undefined) {
1062
        throw new Error('Body is not available yet');
1063
      }
1064
      return SugarElement.fromDom(b);
1065
    };
1066
 
1067
    var fireDetaching = function (component) {
1068
      emit(component, detachedFromDom());
1069
      var children = component.components();
637 daniel-mar 1070
      each$1(children, fireDetaching);
597 daniel-mar 1071
    };
1072
    var fireAttaching = function (component) {
1073
      var children = component.components();
637 daniel-mar 1074
      each$1(children, fireAttaching);
597 daniel-mar 1075
      emit(component, attachedToDom());
1076
    };
637 daniel-mar 1077
    var attach$1 = function (parent, child) {
1078
      append$2(parent.element, child.element);
597 daniel-mar 1079
    };
1080
    var detachChildren = function (component) {
637 daniel-mar 1081
      each$1(component.components(), function (childComp) {
1082
        return remove$7(childComp.element);
597 daniel-mar 1083
      });
1084
      empty(component.element);
1085
      component.syncComponents();
1086
    };
1087
    var replaceChildren = function (component, newChildren) {
1088
      var subs = component.components();
1089
      detachChildren(component);
1090
      var deleted = difference(subs, newChildren);
637 daniel-mar 1091
      each$1(deleted, function (comp) {
597 daniel-mar 1092
        fireDetaching(comp);
1093
        component.getSystem().removeFromWorld(comp);
1094
      });
637 daniel-mar 1095
      each$1(newChildren, function (childComp) {
597 daniel-mar 1096
        if (!childComp.getSystem().isConnected()) {
1097
          component.getSystem().addToWorld(childComp);
637 daniel-mar 1098
          attach$1(component, childComp);
597 daniel-mar 1099
          if (inBody(component.element)) {
1100
            fireAttaching(childComp);
1101
          }
1102
        } else {
637 daniel-mar 1103
          attach$1(component, childComp);
597 daniel-mar 1104
        }
1105
        component.syncComponents();
1106
      });
1107
    };
1108
 
637 daniel-mar 1109
    var attach = function (parent, child) {
1110
      attachWith(parent, child, append$2);
597 daniel-mar 1111
    };
1112
    var attachWith = function (parent, child, insertion) {
1113
      parent.getSystem().addToWorld(child);
1114
      insertion(parent.element, child.element);
1115
      if (inBody(parent.element)) {
1116
        fireAttaching(child);
1117
      }
1118
      parent.syncComponents();
1119
    };
1120
    var doDetach = function (component) {
1121
      fireDetaching(component);
637 daniel-mar 1122
      remove$7(component.element);
597 daniel-mar 1123
      component.getSystem().removeFromWorld(component);
1124
    };
1125
    var detach = function (component) {
1126
      var parent$1 = parent(component.element).bind(function (p) {
1127
        return component.getSystem().getByDom(p).toOptional();
1128
      });
1129
      doDetach(component);
1130
      parent$1.each(function (p) {
1131
        p.syncComponents();
1132
      });
1133
    };
1134
    var attachSystemAfter = function (element, guiSystem) {
637 daniel-mar 1135
      attachSystemWith(element, guiSystem, after$2);
597 daniel-mar 1136
    };
1137
    var attachSystemWith = function (element, guiSystem, inserter) {
1138
      inserter(element, guiSystem.element);
1139
      var children$1 = children(guiSystem.element);
637 daniel-mar 1140
      each$1(children$1, function (child) {
597 daniel-mar 1141
        guiSystem.getByDom(child).each(fireAttaching);
1142
      });
1143
    };
1144
    var detachSystem = function (guiSystem) {
1145
      var children$1 = children(guiSystem.element);
637 daniel-mar 1146
      each$1(children$1, function (child) {
597 daniel-mar 1147
        guiSystem.getByDom(child).each(fireDetaching);
1148
      });
637 daniel-mar 1149
      remove$7(guiSystem.element);
597 daniel-mar 1150
    };
1151
 
1152
    var keys = Object.keys;
1153
    var hasOwnProperty = Object.hasOwnProperty;
637 daniel-mar 1154
    var each = function (obj, f) {
597 daniel-mar 1155
      var props = keys(obj);
1156
      for (var k = 0, len = props.length; k < len; k++) {
1157
        var i = props[k];
1158
        var x = obj[i];
1159
        f(x, i);
1160
      }
1161
    };
1162
    var map$1 = function (obj, f) {
1163
      return tupleMap(obj, function (x, i) {
1164
        return {
1165
          k: i,
1166
          v: f(x, i)
1167
        };
1168
      });
1169
    };
1170
    var tupleMap = function (obj, f) {
1171
      var r = {};
637 daniel-mar 1172
      each(obj, function (x, i) {
597 daniel-mar 1173
        var tuple = f(x, i);
1174
        r[tuple.k] = tuple.v;
1175
      });
1176
      return r;
1177
    };
1178
    var objAcc = function (r) {
1179
      return function (x, i) {
1180
        r[i] = x;
1181
      };
1182
    };
1183
    var internalFilter = function (obj, pred, onTrue, onFalse) {
1184
      var r = {};
637 daniel-mar 1185
      each(obj, function (x, i) {
597 daniel-mar 1186
        (pred(x, i) ? onTrue : onFalse)(x, i);
1187
      });
1188
      return r;
1189
    };
1190
    var filter$1 = function (obj, pred) {
1191
      var t = {};
1192
      internalFilter(obj, pred, objAcc(t), noop);
1193
      return t;
1194
    };
1195
    var mapToArray = function (obj, f) {
1196
      var r = [];
637 daniel-mar 1197
      each(obj, function (value, name) {
597 daniel-mar 1198
        r.push(f(value, name));
1199
      });
1200
      return r;
1201
    };
637 daniel-mar 1202
    var find = function (obj, pred) {
597 daniel-mar 1203
      var props = keys(obj);
1204
      for (var k = 0, len = props.length; k < len; k++) {
1205
        var i = props[k];
1206
        var x = obj[i];
1207
        if (pred(x, i, obj)) {
1208
          return Optional.some(x);
1209
        }
1210
      }
1211
      return Optional.none();
1212
    };
1213
    var values = function (obj) {
637 daniel-mar 1214
      return mapToArray(obj, identity);
597 daniel-mar 1215
    };
637 daniel-mar 1216
    var get$c = function (obj, key) {
1217
      return has$2(obj, key) ? Optional.from(obj[key]) : Optional.none();
597 daniel-mar 1218
    };
637 daniel-mar 1219
    var has$2 = function (obj, key) {
597 daniel-mar 1220
      return hasOwnProperty.call(obj, key);
1221
    };
1222
    var hasNonNullableKey = function (obj, key) {
637 daniel-mar 1223
      return has$2(obj, key) && obj[key] !== undefined && obj[key] !== null;
597 daniel-mar 1224
    };
1225
 
1226
    var rawSet = function (dom, key, value) {
1227
      if (isString(value) || isBoolean(value) || isNumber(value)) {
1228
        dom.setAttribute(key, value + '');
1229
      } else {
1230
        console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
1231
        throw new Error('Attribute value was not simple');
1232
      }
1233
    };
637 daniel-mar 1234
    var set$8 = function (element, key, value) {
597 daniel-mar 1235
      rawSet(element.dom, key, value);
1236
    };
637 daniel-mar 1237
    var setAll$1 = function (element, attrs) {
597 daniel-mar 1238
      var dom = element.dom;
637 daniel-mar 1239
      each(attrs, function (v, k) {
597 daniel-mar 1240
        rawSet(dom, k, v);
1241
      });
1242
    };
637 daniel-mar 1243
    var get$b = function (element, key) {
597 daniel-mar 1244
      var v = element.dom.getAttribute(key);
1245
      return v === null ? undefined : v;
1246
    };
1247
    var getOpt = function (element, key) {
637 daniel-mar 1248
      return Optional.from(get$b(element, key));
597 daniel-mar 1249
    };
1250
    var has$1 = function (element, key) {
1251
      var dom = element.dom;
1252
      return dom && dom.hasAttribute ? dom.hasAttribute(key) : false;
1253
    };
637 daniel-mar 1254
    var remove$6 = function (element, key) {
597 daniel-mar 1255
      element.dom.removeAttribute(key);
1256
    };
1257
 
637 daniel-mar 1258
    var read$2 = function (element, attr) {
1259
      var value = get$b(element, attr);
597 daniel-mar 1260
      return value === undefined || value === '' ? [] : value.split(' ');
1261
    };
637 daniel-mar 1262
    var add$3 = function (element, attr, id) {
1263
      var old = read$2(element, attr);
597 daniel-mar 1264
      var nu = old.concat([id]);
637 daniel-mar 1265
      set$8(element, attr, nu.join(' '));
597 daniel-mar 1266
      return true;
1267
    };
637 daniel-mar 1268
    var remove$5 = function (element, attr, id) {
1269
      var nu = filter$2(read$2(element, attr), function (v) {
597 daniel-mar 1270
        return v !== id;
1271
      });
1272
      if (nu.length > 0) {
637 daniel-mar 1273
        set$8(element, attr, nu.join(' '));
597 daniel-mar 1274
      } else {
637 daniel-mar 1275
        remove$6(element, attr);
597 daniel-mar 1276
      }
1277
      return false;
1278
    };
1279
 
1280
    var supports = function (element) {
1281
      return element.dom.classList !== undefined;
1282
    };
637 daniel-mar 1283
    var get$a = function (element) {
1284
      return read$2(element, 'class');
597 daniel-mar 1285
    };
637 daniel-mar 1286
    var add$2 = function (element, clazz) {
1287
      return add$3(element, 'class', clazz);
597 daniel-mar 1288
    };
637 daniel-mar 1289
    var remove$4 = function (element, clazz) {
1290
      return remove$5(element, 'class', clazz);
597 daniel-mar 1291
    };
1292
 
637 daniel-mar 1293
    var add$1 = function (element, clazz) {
597 daniel-mar 1294
      if (supports(element)) {
1295
        element.dom.classList.add(clazz);
1296
      } else {
637 daniel-mar 1297
        add$2(element, clazz);
597 daniel-mar 1298
      }
1299
    };
1300
    var cleanClass = function (element) {
637 daniel-mar 1301
      var classList = supports(element) ? element.dom.classList : get$a(element);
597 daniel-mar 1302
      if (classList.length === 0) {
637 daniel-mar 1303
        remove$6(element, 'class');
597 daniel-mar 1304
      }
1305
    };
637 daniel-mar 1306
    var remove$3 = function (element, clazz) {
597 daniel-mar 1307
      if (supports(element)) {
1308
        var classList = element.dom.classList;
1309
        classList.remove(clazz);
1310
      } else {
637 daniel-mar 1311
        remove$4(element, clazz);
597 daniel-mar 1312
      }
1313
      cleanClass(element);
1314
    };
637 daniel-mar 1315
    var has = function (element, clazz) {
597 daniel-mar 1316
      return supports(element) && element.dom.classList.contains(clazz);
1317
    };
1318
 
1319
    var swap = function (element, addCls, removeCls) {
637 daniel-mar 1320
      remove$3(element, removeCls);
1321
      add$1(element, addCls);
597 daniel-mar 1322
    };
1323
    var toAlpha = function (component, swapConfig, _swapState) {
1324
      swap(component.element, swapConfig.alpha, swapConfig.omega);
1325
    };
1326
    var toOmega = function (component, swapConfig, _swapState) {
1327
      swap(component.element, swapConfig.omega, swapConfig.alpha);
1328
    };
637 daniel-mar 1329
    var clear$1 = function (component, swapConfig, _swapState) {
1330
      remove$3(component.element, swapConfig.alpha);
1331
      remove$3(component.element, swapConfig.omega);
597 daniel-mar 1332
    };
1333
    var isAlpha = function (component, swapConfig, _swapState) {
637 daniel-mar 1334
      return has(component.element, swapConfig.alpha);
597 daniel-mar 1335
    };
1336
    var isOmega = function (component, swapConfig, _swapState) {
637 daniel-mar 1337
      return has(component.element, swapConfig.omega);
597 daniel-mar 1338
    };
1339
 
1340
    var SwapApis = /*#__PURE__*/Object.freeze({
1341
        __proto__: null,
1342
        toAlpha: toAlpha,
1343
        toOmega: toOmega,
1344
        isAlpha: isAlpha,
1345
        isOmega: isOmega,
637 daniel-mar 1346
        clear: clear$1
597 daniel-mar 1347
    });
1348
 
637 daniel-mar 1349
    var value$2 = function (o) {
597 daniel-mar 1350
      var or = function (_opt) {
637 daniel-mar 1351
        return value$2(o);
597 daniel-mar 1352
      };
1353
      var orThunk = function (_f) {
637 daniel-mar 1354
        return value$2(o);
597 daniel-mar 1355
      };
1356
      var map = function (f) {
637 daniel-mar 1357
        return value$2(f(o));
597 daniel-mar 1358
      };
1359
      var mapError = function (_f) {
637 daniel-mar 1360
        return value$2(o);
597 daniel-mar 1361
      };
1362
      var each = function (f) {
1363
        f(o);
1364
      };
1365
      var bind = function (f) {
1366
        return f(o);
1367
      };
1368
      var fold = function (_, onValue) {
1369
        return onValue(o);
1370
      };
1371
      var exists = function (f) {
1372
        return f(o);
1373
      };
1374
      var forall = function (f) {
1375
        return f(o);
1376
      };
1377
      var toOptional = function () {
1378
        return Optional.some(o);
1379
      };
1380
      return {
1381
        isValue: always,
1382
        isError: never,
637 daniel-mar 1383
        getOr: constant$1(o),
1384
        getOrThunk: constant$1(o),
1385
        getOrDie: constant$1(o),
597 daniel-mar 1386
        or: or,
1387
        orThunk: orThunk,
1388
        fold: fold,
1389
        map: map,
1390
        mapError: mapError,
1391
        each: each,
1392
        bind: bind,
1393
        exists: exists,
1394
        forall: forall,
1395
        toOptional: toOptional
1396
      };
1397
    };
1398
    var error = function (message) {
1399
      var getOrThunk = function (f) {
1400
        return f();
1401
      };
1402
      var getOrDie = function () {
1403
        return die(String(message))();
1404
      };
637 daniel-mar 1405
      var or = identity;
597 daniel-mar 1406
      var orThunk = function (f) {
1407
        return f();
1408
      };
1409
      var map = function (_f) {
1410
        return error(message);
1411
      };
1412
      var mapError = function (f) {
1413
        return error(f(message));
1414
      };
1415
      var bind = function (_f) {
1416
        return error(message);
1417
      };
1418
      var fold = function (onError, _) {
1419
        return onError(message);
1420
      };
1421
      return {
1422
        isValue: never,
1423
        isError: always,
1424
        getOr: identity,
1425
        getOrThunk: getOrThunk,
1426
        getOrDie: getOrDie,
1427
        or: or,
1428
        orThunk: orThunk,
1429
        fold: fold,
1430
        map: map,
1431
        mapError: mapError,
1432
        each: noop,
1433
        bind: bind,
1434
        exists: never,
1435
        forall: always,
1436
        toOptional: Optional.none
1437
      };
1438
    };
1439
    var fromOption = function (opt, err) {
1440
      return opt.fold(function () {
1441
        return error(err);
637 daniel-mar 1442
      }, value$2);
597 daniel-mar 1443
    };
1444
    var Result = {
637 daniel-mar 1445
      value: value$2,
597 daniel-mar 1446
      error: error,
1447
      fromOption: fromOption
1448
    };
1449
 
1450
    var SimpleResultType;
1451
    (function (SimpleResultType) {
1452
      SimpleResultType[SimpleResultType['Error'] = 0] = 'Error';
1453
      SimpleResultType[SimpleResultType['Value'] = 1] = 'Value';
1454
    }(SimpleResultType || (SimpleResultType = {})));
637 daniel-mar 1455
    var fold$1 = function (res, onError, onValue) {
597 daniel-mar 1456
      return res.stype === SimpleResultType.Error ? onError(res.serror) : onValue(res.svalue);
1457
    };
637 daniel-mar 1458
    var partition$1 = function (results) {
597 daniel-mar 1459
      var values = [];
1460
      var errors = [];
637 daniel-mar 1461
      each$1(results, function (obj) {
1462
        fold$1(obj, function (err) {
597 daniel-mar 1463
          return errors.push(err);
1464
        }, function (val) {
1465
          return values.push(val);
1466
        });
1467
      });
1468
      return {
1469
        values: values,
1470
        errors: errors
1471
      };
1472
    };
1473
    var mapError = function (res, f) {
1474
      if (res.stype === SimpleResultType.Error) {
1475
        return {
1476
          stype: SimpleResultType.Error,
1477
          serror: f(res.serror)
1478
        };
1479
      } else {
1480
        return res;
1481
      }
1482
    };
637 daniel-mar 1483
    var map = function (res, f) {
597 daniel-mar 1484
      if (res.stype === SimpleResultType.Value) {
1485
        return {
1486
          stype: SimpleResultType.Value,
1487
          svalue: f(res.svalue)
1488
        };
1489
      } else {
1490
        return res;
1491
      }
1492
    };
637 daniel-mar 1493
    var bind$2 = function (res, f) {
597 daniel-mar 1494
      if (res.stype === SimpleResultType.Value) {
1495
        return f(res.svalue);
1496
      } else {
1497
        return res;
1498
      }
1499
    };
1500
    var bindError = function (res, f) {
1501
      if (res.stype === SimpleResultType.Error) {
1502
        return f(res.serror);
1503
      } else {
1504
        return res;
1505
      }
1506
    };
1507
    var svalue = function (v) {
1508
      return {
1509
        stype: SimpleResultType.Value,
1510
        svalue: v
1511
      };
1512
    };
1513
    var serror = function (e) {
1514
      return {
1515
        stype: SimpleResultType.Error,
1516
        serror: e
1517
      };
1518
    };
637 daniel-mar 1519
    var toResult$1 = function (res) {
1520
      return fold$1(res, Result.error, Result.value);
597 daniel-mar 1521
    };
1522
    var fromResult = function (res) {
1523
      return res.fold(serror, svalue);
1524
    };
1525
    var SimpleResult = {
1526
      fromResult: fromResult,
637 daniel-mar 1527
      toResult: toResult$1,
597 daniel-mar 1528
      svalue: svalue,
637 daniel-mar 1529
      partition: partition$1,
597 daniel-mar 1530
      serror: serror,
637 daniel-mar 1531
      bind: bind$2,
597 daniel-mar 1532
      bindError: bindError,
637 daniel-mar 1533
      map: map,
597 daniel-mar 1534
      mapError: mapError,
637 daniel-mar 1535
      fold: fold$1
597 daniel-mar 1536
    };
1537
 
637 daniel-mar 1538
    var field$3 = function (key, newKey, presence, prop) {
1539
      return {
1540
        tag: 'field',
1541
        key: key,
1542
        newKey: newKey,
1543
        presence: presence,
1544
        prop: prop
1545
      };
1546
    };
1547
    var customField$1 = function (newKey, instantiator) {
1548
      return {
1549
        tag: 'custom',
1550
        newKey: newKey,
1551
        instantiator: instantiator
1552
      };
1553
    };
1554
    var fold = function (value, ifField, ifCustom) {
1555
      switch (value.tag) {
1556
      case 'field':
1557
        return ifField(value.key, value.newKey, value.presence, value.prop);
1558
      case 'custom':
1559
        return ifCustom(value.newKey, value.instantiator);
597 daniel-mar 1560
      }
1561
    };
1562
 
637 daniel-mar 1563
    var shallow$1 = function (old, nu) {
597 daniel-mar 1564
      return nu;
1565
    };
1566
    var deep = function (old, nu) {
1567
      var bothObjects = isObject(old) && isObject(nu);
1568
      return bothObjects ? deepMerge(old, nu) : nu;
1569
    };
1570
    var baseMerge = function (merger) {
1571
      return function () {
1572
        var objects = [];
1573
        for (var _i = 0; _i < arguments.length; _i++) {
1574
          objects[_i] = arguments[_i];
1575
        }
1576
        if (objects.length === 0) {
1577
          throw new Error('Can\'t merge zero objects');
1578
        }
1579
        var ret = {};
1580
        for (var j = 0; j < objects.length; j++) {
1581
          var curObject = objects[j];
1582
          for (var key in curObject) {
637 daniel-mar 1583
            if (has$2(curObject, key)) {
597 daniel-mar 1584
              ret[key] = merger(ret[key], curObject[key]);
1585
            }
1586
          }
1587
        }
1588
        return ret;
1589
      };
1590
    };
1591
    var deepMerge = baseMerge(deep);
637 daniel-mar 1592
    var merge$1 = baseMerge(shallow$1);
597 daniel-mar 1593
 
637 daniel-mar 1594
    var required$2 = function () {
1595
      return {
1596
        tag: 'required',
1597
        process: {}
1598
      };
597 daniel-mar 1599
    };
637 daniel-mar 1600
    var defaultedThunk = function (fallbackThunk) {
597 daniel-mar 1601
      return {
637 daniel-mar 1602
        tag: 'defaultedThunk',
1603
        process: fallbackThunk
597 daniel-mar 1604
      };
1605
    };
637 daniel-mar 1606
    var defaulted$1 = function (fallback) {
1607
      return defaultedThunk(constant$1(fallback));
597 daniel-mar 1608
    };
637 daniel-mar 1609
    var asOption = function () {
1610
      return {
1611
        tag: 'option',
1612
        process: {}
1613
      };
597 daniel-mar 1614
    };
637 daniel-mar 1615
    var mergeWithThunk = function (baseThunk) {
1616
      return {
1617
        tag: 'mergeWithThunk',
1618
        process: baseThunk
1619
      };
597 daniel-mar 1620
    };
637 daniel-mar 1621
    var mergeWith = function (base) {
1622
      return mergeWithThunk(constant$1(base));
597 daniel-mar 1623
    };
1624
 
1625
    var mergeValues$1 = function (values, base) {
637 daniel-mar 1626
      return values.length > 0 ? SimpleResult.svalue(deepMerge(base, merge$1.apply(undefined, values))) : SimpleResult.svalue(base);
597 daniel-mar 1627
    };
1628
    var mergeErrors$1 = function (errors) {
1629
      return compose(SimpleResult.serror, flatten)(errors);
1630
    };
1631
    var consolidateObj = function (objects, base) {
1632
      var partition = SimpleResult.partition(objects);
1633
      return partition.errors.length > 0 ? mergeErrors$1(partition.errors) : mergeValues$1(partition.values, base);
1634
    };
1635
    var consolidateArr = function (objects) {
1636
      var partitions = SimpleResult.partition(objects);
1637
      return partitions.errors.length > 0 ? mergeErrors$1(partitions.errors) : SimpleResult.svalue(partitions.values);
1638
    };
1639
    var ResultCombine = {
1640
      consolidateObj: consolidateObj,
1641
      consolidateArr: consolidateArr
1642
    };
1643
 
1644
    var formatObj = function (input) {
1645
      return isObject(input) && keys(input).length > 100 ? ' removed due to size' : JSON.stringify(input, null, 2);
1646
    };
1647
    var formatErrors = function (errors) {
1648
      var es = errors.length > 10 ? errors.slice(0, 10).concat([{
1649
          path: [],
637 daniel-mar 1650
          getErrorInfo: constant$1('... (only showing first ten failures)')
597 daniel-mar 1651
        }]) : errors;
637 daniel-mar 1652
      return map$2(es, function (e) {
597 daniel-mar 1653
        return 'Failed path: (' + e.path.join(' > ') + ')\n' + e.getErrorInfo();
1654
      });
1655
    };
1656
 
637 daniel-mar 1657
    var nu$5 = function (path, getErrorInfo) {
597 daniel-mar 1658
      return SimpleResult.serror([{
1659
          path: path,
1660
          getErrorInfo: getErrorInfo
1661
        }]);
1662
    };
637 daniel-mar 1663
    var missingRequired = function (path, key, obj) {
1664
      return nu$5(path, function () {
1665
        return 'Could not find valid *required* value for "' + key + '" in ' + formatObj(obj);
597 daniel-mar 1666
      });
1667
    };
1668
    var missingKey = function (path, key) {
637 daniel-mar 1669
      return nu$5(path, function () {
597 daniel-mar 1670
        return 'Choice schema did not contain choice key: "' + key + '"';
1671
      });
1672
    };
1673
    var missingBranch = function (path, branches, branch) {
637 daniel-mar 1674
      return nu$5(path, function () {
597 daniel-mar 1675
        return 'The chosen schema: "' + branch + '" did not exist in branches: ' + formatObj(branches);
1676
      });
1677
    };
1678
    var unsupportedFields = function (path, unsupported) {
637 daniel-mar 1679
      return nu$5(path, function () {
597 daniel-mar 1680
        return 'There are unsupported fields: [' + unsupported.join(', ') + '] specified';
1681
      });
1682
    };
1683
    var custom = function (path, err) {
637 daniel-mar 1684
      return nu$5(path, constant$1(err));
597 daniel-mar 1685
    };
1686
 
637 daniel-mar 1687
    var value$1 = function (validator) {
1688
      var extract = function (path, val) {
1689
        return SimpleResult.bindError(validator(val), function (err) {
1690
          return custom(path, err);
1691
        });
1692
      };
1693
      var toString = constant$1('val');
1694
      return {
1695
        extract: extract,
1696
        toString: toString
1697
      };
597 daniel-mar 1698
    };
637 daniel-mar 1699
    var anyValue$1 = value$1(SimpleResult.svalue);
1700
 
1701
    var requiredAccess = function (path, obj, key, bundle) {
1702
      return get$c(obj, key).fold(function () {
1703
        return missingRequired(path, key, obj);
1704
      }, bundle);
597 daniel-mar 1705
    };
637 daniel-mar 1706
    var fallbackAccess = function (obj, key, fallback, bundle) {
1707
      var v = get$c(obj, key).getOrThunk(function () {
1708
        return fallback(obj);
597 daniel-mar 1709
      });
637 daniel-mar 1710
      return bundle(v);
597 daniel-mar 1711
    };
637 daniel-mar 1712
    var optionAccess = function (obj, key, bundle) {
1713
      return bundle(get$c(obj, key));
597 daniel-mar 1714
    };
637 daniel-mar 1715
    var optionDefaultedAccess = function (obj, key, fallback, bundle) {
1716
      var opt = get$c(obj, key).map(function (val) {
1717
        return val === true ? fallback(obj) : val;
597 daniel-mar 1718
      });
637 daniel-mar 1719
      return bundle(opt);
597 daniel-mar 1720
    };
637 daniel-mar 1721
    var extractField = function (field, path, obj, key, prop) {
1722
      var bundle = function (av) {
1723
        return prop.extract(path.concat([key]), av);
1724
      };
1725
      var bundleAsOption = function (optValue) {
1726
        return optValue.fold(function () {
1727
          return SimpleResult.svalue(Optional.none());
1728
        }, function (ov) {
1729
          var result = prop.extract(path.concat([key]), ov);
1730
          return SimpleResult.map(result, Optional.some);
597 daniel-mar 1731
        });
1732
      };
637 daniel-mar 1733
      switch (field.tag) {
1734
      case 'required':
1735
        return requiredAccess(path, obj, key, bundle);
1736
      case 'defaultedThunk':
1737
        return fallbackAccess(obj, key, field.process, bundle);
1738
      case 'option':
1739
        return optionAccess(obj, key, bundleAsOption);
1740
      case 'defaultedOptionThunk':
1741
        return optionDefaultedAccess(obj, key, field.process, bundleAsOption);
1742
      case 'mergeWithThunk': {
1743
          return fallbackAccess(obj, key, constant$1({}), function (v) {
1744
            var result = deepMerge(field.process(obj), v);
1745
            return bundle(result);
1746
          });
1747
        }
1748
      }
597 daniel-mar 1749
    };
637 daniel-mar 1750
    var extractFields = function (path, obj, fields) {
1751
      var success = {};
1752
      var errors = [];
1753
      for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) {
1754
        var field = fields_1[_i];
1755
        fold(field, function (key, newKey, presence, prop) {
1756
          var result = extractField(presence, path, obj, key, prop);
1757
          SimpleResult.fold(result, function (err) {
1758
            errors.push.apply(errors, err);
1759
          }, function (res) {
1760
            success[newKey] = res;
1761
          });
1762
        }, function (newKey, instantiator) {
1763
          success[newKey] = instantiator(obj);
1764
        });
1765
      }
1766
      return errors.length > 0 ? SimpleResult.serror(errors) : SimpleResult.svalue(success);
1767
    };
597 daniel-mar 1768
    var getSetKeys = function (obj) {
637 daniel-mar 1769
      return keys(filter$1(obj, isNonNullable));
597 daniel-mar 1770
    };
1771
    var objOfOnly = function (fields) {
1772
      var delegate = objOf(fields);
637 daniel-mar 1773
      var fieldNames = foldr(fields, function (acc, value) {
1774
        return fold(value, function (key) {
1775
          var _a;
1776
          return deepMerge(acc, (_a = {}, _a[key] = true, _a));
1777
        }, constant$1(acc));
597 daniel-mar 1778
      }, {});
637 daniel-mar 1779
      var extract = function (path, o) {
597 daniel-mar 1780
        var keys = isBoolean(o) ? [] : getSetKeys(o);
637 daniel-mar 1781
        var extra = filter$2(keys, function (k) {
597 daniel-mar 1782
          return !hasNonNullableKey(fieldNames, k);
1783
        });
637 daniel-mar 1784
        return extra.length === 0 ? delegate.extract(path, o) : unsupportedFields(path, extra);
597 daniel-mar 1785
      };
1786
      return {
1787
        extract: extract,
1788
        toString: delegate.toString
1789
      };
1790
    };
637 daniel-mar 1791
    var objOf = function (values) {
1792
      var extract = function (path, o) {
1793
        return extractFields(path, o, values);
597 daniel-mar 1794
      };
1795
      var toString = function () {
637 daniel-mar 1796
        var fieldStrings = map$2(values, function (value) {
1797
          return fold(value, function (key, _okey, _presence, prop) {
597 daniel-mar 1798
            return key + ' -> ' + prop.toString();
637 daniel-mar 1799
          }, function (newKey, _instantiator) {
1800
            return 'state(' + newKey + ')';
597 daniel-mar 1801
          });
1802
        });
1803
        return 'obj{\n' + fieldStrings.join('\n') + '}';
1804
      };
1805
      return {
1806
        extract: extract,
1807
        toString: toString
1808
      };
1809
    };
1810
    var arrOf = function (prop) {
637 daniel-mar 1811
      var extract = function (path, array) {
1812
        var results = map$2(array, function (a, i) {
1813
          return prop.extract(path.concat(['[' + i + ']']), a);
597 daniel-mar 1814
        });
1815
        return ResultCombine.consolidateArr(results);
1816
      };
1817
      var toString = function () {
1818
        return 'array(' + prop.toString() + ')';
1819
      };
1820
      return {
1821
        extract: extract,
1822
        toString: toString
1823
      };
1824
    };
637 daniel-mar 1825
    var setOf$1 = function (validator, prop) {
597 daniel-mar 1826
      var validateKeys = function (path, keys) {
637 daniel-mar 1827
        return arrOf(value$1(validator)).extract(path, keys);
597 daniel-mar 1828
      };
637 daniel-mar 1829
      var extract = function (path, o) {
597 daniel-mar 1830
        var keys$1 = keys(o);
1831
        var validatedKeys = validateKeys(path, keys$1);
1832
        return SimpleResult.bind(validatedKeys, function (validKeys) {
637 daniel-mar 1833
          var schema = map$2(validKeys, function (vk) {
1834
            return field$3(vk, vk, required$2(), prop);
597 daniel-mar 1835
          });
637 daniel-mar 1836
          return objOf(schema).extract(path, o);
597 daniel-mar 1837
        });
1838
      };
1839
      var toString = function () {
1840
        return 'setOf(' + prop.toString() + ')';
1841
      };
1842
      return {
1843
        extract: extract,
1844
        toString: toString
1845
      };
1846
    };
1847
 
637 daniel-mar 1848
    var anyValue = constant$1(anyValue$1);
1849
    var typedValue = function (validator, expectedType) {
1850
      return value$1(function (a) {
1851
        var actualType = typeof a;
1852
        return validator(a) ? SimpleResult.svalue(a) : SimpleResult.serror('Expected type: ' + expectedType + ' but got: ' + actualType);
1853
      });
1854
    };
1855
    var functionProcessor = typedValue(isFunction, 'function');
1856
 
1857
    var chooseFrom = function (path, input, branches, ch) {
1858
      var fields = get$c(branches, ch);
597 daniel-mar 1859
      return fields.fold(function () {
1860
        return missingBranch(path, branches, ch);
1861
      }, function (vp) {
637 daniel-mar 1862
        return vp.extract(path.concat(['branch: ' + ch]), input);
597 daniel-mar 1863
      });
1864
    };
637 daniel-mar 1865
    var choose$2 = function (key, branches) {
1866
      var extract = function (path, input) {
1867
        var choice = get$c(input, key);
597 daniel-mar 1868
        return choice.fold(function () {
1869
          return missingKey(path, key);
1870
        }, function (chosen) {
637 daniel-mar 1871
          return chooseFrom(path, input, branches, chosen);
597 daniel-mar 1872
        });
1873
      };
1874
      var toString = function () {
1875
        return 'chooseOn(' + key + '). Possible values: ' + keys(branches);
1876
      };
1877
      return {
1878
        extract: extract,
1879
        toString: toString
1880
      };
1881
    };
1882
 
1883
    var valueOf = function (validator) {
1884
      return value$1(function (v) {
1885
        return validator(v).fold(SimpleResult.serror, SimpleResult.svalue);
1886
      });
1887
    };
637 daniel-mar 1888
    var setOf = function (validator, prop) {
1889
      return setOf$1(function (v) {
597 daniel-mar 1890
        return SimpleResult.fromResult(validator(v));
1891
      }, prop);
1892
    };
637 daniel-mar 1893
    var extractValue = function (label, prop, obj) {
1894
      var res = prop.extract([label], obj);
597 daniel-mar 1895
      return SimpleResult.mapError(res, function (errs) {
1896
        return {
1897
          input: obj,
1898
          errors: errs
1899
        };
1900
      });
1901
    };
1902
    var asRaw = function (label, prop, obj) {
637 daniel-mar 1903
      return SimpleResult.toResult(extractValue(label, prop, obj));
597 daniel-mar 1904
    };
1905
    var getOrDie = function (extraction) {
1906
      return extraction.fold(function (errInfo) {
1907
        throw new Error(formatError(errInfo));
1908
      }, identity);
1909
    };
637 daniel-mar 1910
    var asRawOrDie$1 = function (label, prop, obj) {
597 daniel-mar 1911
      return getOrDie(asRaw(label, prop, obj));
1912
    };
1913
    var formatError = function (errInfo) {
1914
      return 'Errors: \n' + formatErrors(errInfo.errors).join('\n') + '\n\nInput object: ' + formatObj(errInfo.input);
1915
    };
1916
    var choose$1 = function (key, branches) {
637 daniel-mar 1917
      return choose$2(key, map$1(branches, objOf));
597 daniel-mar 1918
    };
1919
 
637 daniel-mar 1920
    var field$2 = field$3;
1921
    var customField = customField$1;
1922
    var required$1 = function (key) {
1923
      return field$2(key, key, required$2(), anyValue());
597 daniel-mar 1924
    };
637 daniel-mar 1925
    var requiredOf = function (key, schema) {
1926
      return field$2(key, key, required$2(), schema);
597 daniel-mar 1927
    };
1928
    var forbid = function (key, message) {
637 daniel-mar 1929
      return field$2(key, key, asOption(), value$1(function (_v) {
597 daniel-mar 1930
        return SimpleResult.serror('The field: ' + key + ' is forbidden. ' + message);
1931
      }));
1932
    };
637 daniel-mar 1933
    var requiredObjOf = function (key, objSchema) {
1934
      return field$2(key, key, required$2(), objOf(objSchema));
597 daniel-mar 1935
    };
1936
    var option = function (key) {
637 daniel-mar 1937
      return field$2(key, key, asOption(), anyValue());
597 daniel-mar 1938
    };
1939
    var optionOf = function (key, schema) {
637 daniel-mar 1940
      return field$2(key, key, asOption(), schema);
597 daniel-mar 1941
    };
1942
    var optionObjOf = function (key, objSchema) {
1943
      return optionOf(key, objOf(objSchema));
1944
    };
1945
    var optionObjOfOnly = function (key, objSchema) {
1946
      return optionOf(key, objOfOnly(objSchema));
1947
    };
637 daniel-mar 1948
    var defaulted = function (key, fallback) {
1949
      return field$2(key, key, defaulted$1(fallback), anyValue());
597 daniel-mar 1950
    };
1951
    var defaultedOf = function (key, fallback, schema) {
637 daniel-mar 1952
      return field$2(key, key, defaulted$1(fallback), schema);
597 daniel-mar 1953
    };
1954
    var defaultedFunction = function (key, fallback) {
1955
      return defaultedOf(key, fallback, functionProcessor);
1956
    };
1957
    var defaultedObjOf = function (key, fallback, objSchema) {
1958
      return defaultedOf(key, fallback, objOf(objSchema));
1959
    };
1960
 
1961
    var SwapSchema = [
637 daniel-mar 1962
      required$1('alpha'),
1963
      required$1('omega')
597 daniel-mar 1964
    ];
1965
 
637 daniel-mar 1966
    var generate$5 = function (cases) {
1967
      if (!isArray(cases)) {
1968
        throw new Error('cases must be an array');
1969
      }
1970
      if (cases.length === 0) {
1971
        throw new Error('there must be at least one case');
1972
      }
1973
      var constructors = [];
1974
      var adt = {};
1975
      each$1(cases, function (acase, count) {
1976
        var keys$1 = keys(acase);
1977
        if (keys$1.length !== 1) {
1978
          throw new Error('one and only one name per case');
1979
        }
1980
        var key = keys$1[0];
1981
        var value = acase[key];
1982
        if (adt[key] !== undefined) {
1983
          throw new Error('duplicate key detected:' + key);
1984
        } else if (key === 'cata') {
1985
          throw new Error('cannot have a case named cata (sorry)');
1986
        } else if (!isArray(value)) {
1987
          throw new Error('case arguments must be an array');
1988
        }
1989
        constructors.push(key);
1990
        adt[key] = function () {
1991
          var args = [];
1992
          for (var _i = 0; _i < arguments.length; _i++) {
1993
            args[_i] = arguments[_i];
1994
          }
1995
          var argLength = args.length;
1996
          if (argLength !== value.length) {
1997
            throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);
1998
          }
1999
          var match = function (branches) {
2000
            var branchKeys = keys(branches);
2001
            if (constructors.length !== branchKeys.length) {
2002
              throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(','));
2003
            }
2004
            var allReqd = forall(constructors, function (reqKey) {
2005
              return contains$1(branchKeys, reqKey);
2006
            });
2007
            if (!allReqd) {
2008
              throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', '));
2009
            }
2010
            return branches[key].apply(null, args);
2011
          };
2012
          return {
2013
            fold: function () {
2014
              var foldArgs = [];
2015
              for (var _i = 0; _i < arguments.length; _i++) {
2016
                foldArgs[_i] = arguments[_i];
2017
              }
2018
              if (foldArgs.length !== cases.length) {
2019
                throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length);
2020
              }
2021
              var target = foldArgs[count];
2022
              return target.apply(null, args);
2023
            },
2024
            match: match,
2025
            log: function (label) {
2026
              console.log(label, {
2027
                constructors: constructors,
2028
                constructor: key,
2029
                params: args
2030
              });
2031
            }
2032
          };
2033
        };
2034
      });
2035
      return adt;
2036
    };
2037
    var Adt = { generate: generate$5 };
2038
 
2039
    Adt.generate([
2040
      {
2041
        bothErrors: [
2042
          'error1',
2043
          'error2'
2044
        ]
2045
      },
2046
      {
2047
        firstError: [
2048
          'error1',
2049
          'value2'
2050
        ]
2051
      },
2052
      {
2053
        secondError: [
2054
          'value1',
2055
          'error2'
2056
        ]
2057
      },
2058
      {
2059
        bothValues: [
2060
          'value1',
2061
          'value2'
2062
        ]
2063
      }
2064
    ]);
2065
    var partition = function (results) {
2066
      var errors = [];
2067
      var values = [];
2068
      each$1(results, function (result) {
2069
        result.fold(function (err) {
2070
          errors.push(err);
2071
        }, function (value) {
2072
          values.push(value);
2073
        });
2074
      });
2075
      return {
2076
        errors: errors,
2077
        values: values
2078
      };
2079
    };
2080
 
2081
    var exclude$1 = function (obj, fields) {
2082
      var r = {};
2083
      each(obj, function (v, k) {
2084
        if (!contains$1(fields, k)) {
2085
          r[k] = v;
2086
        }
2087
      });
2088
      return r;
2089
    };
2090
 
2091
    var wrap$1 = function (key, value) {
2092
      var _a;
2093
      return _a = {}, _a[key] = value, _a;
2094
    };
2095
    var wrapAll$1 = function (keyvalues) {
2096
      var r = {};
2097
      each$1(keyvalues, function (kv) {
2098
        r[kv.key] = kv.value;
2099
      });
2100
      return r;
2101
    };
2102
 
2103
    var exclude = function (obj, fields) {
2104
      return exclude$1(obj, fields);
2105
    };
2106
    var wrap = function (key, value) {
2107
      return wrap$1(key, value);
2108
    };
2109
    var wrapAll = function (keyvalues) {
2110
      return wrapAll$1(keyvalues);
2111
    };
2112
    var mergeValues = function (values, base) {
2113
      return values.length === 0 ? Result.value(base) : Result.value(deepMerge(base, merge$1.apply(undefined, values)));
2114
    };
2115
    var mergeErrors = function (errors) {
2116
      return Result.error(flatten(errors));
2117
    };
2118
    var consolidate = function (objs, base) {
2119
      var partitions = partition(objs);
2120
      return partitions.errors.length > 0 ? mergeErrors(partitions.errors) : mergeValues(partitions.values, base);
2121
    };
2122
 
2123
    var is = function (lhs, rhs, comparator) {
2124
      if (comparator === void 0) {
2125
        comparator = tripleEquals;
2126
      }
2127
      return lhs.exists(function (left) {
2128
        return comparator(left, rhs);
2129
      });
2130
    };
2131
    var cat = function (arr) {
2132
      var r = [];
2133
      var push = function (x) {
2134
        r.push(x);
2135
      };
2136
      for (var i = 0; i < arr.length; i++) {
2137
        arr[i].each(push);
2138
      }
2139
      return r;
2140
    };
2141
    var sequence = function (arr) {
2142
      var r = [];
2143
      for (var i = 0; i < arr.length; i++) {
2144
        var x = arr[i];
2145
        if (x.isSome()) {
2146
          r.push(x.getOrDie());
2147
        } else {
2148
          return Optional.none();
2149
        }
2150
      }
2151
      return Optional.some(r);
2152
    };
2153
    var lift2 = function (oa, ob, f) {
2154
      return oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();
2155
    };
2156
    var someIf = function (b, a) {
2157
      return b ? Optional.some(a) : Optional.none();
2158
    };
2159
 
597 daniel-mar 2160
    var ensureIsRoot = function (isRoot) {
2161
      return isFunction(isRoot) ? isRoot : never;
2162
    };
637 daniel-mar 2163
    var ancestor$2 = function (scope, transform, isRoot) {
597 daniel-mar 2164
      var element = scope.dom;
2165
      var stop = ensureIsRoot(isRoot);
2166
      while (element.parentNode) {
2167
        element = element.parentNode;
2168
        var el = SugarElement.fromDom(element);
2169
        var transformed = transform(el);
2170
        if (transformed.isSome()) {
2171
          return transformed;
2172
        } else if (stop(el)) {
2173
          break;
2174
        }
2175
      }
2176
      return Optional.none();
2177
    };
637 daniel-mar 2178
    var closest$3 = function (scope, transform, isRoot) {
597 daniel-mar 2179
      var current = transform(scope);
2180
      var stop = ensureIsRoot(isRoot);
2181
      return current.orThunk(function () {
637 daniel-mar 2182
        return stop(scope) ? Optional.none() : ancestor$2(scope, transform, stop);
597 daniel-mar 2183
      });
2184
    };
2185
 
2186
    var isSource = function (component, simulatedEvent) {
2187
      return eq(component.element, simulatedEvent.event.target);
2188
    };
2189
 
637 daniel-mar 2190
    var defaultEventHandler = {
2191
      can: always,
2192
      abort: never,
2193
      run: noop
2194
    };
597 daniel-mar 2195
    var nu$4 = function (parts) {
2196
      if (!hasNonNullableKey(parts, 'can') && !hasNonNullableKey(parts, 'abort') && !hasNonNullableKey(parts, 'run')) {
2197
        throw new Error('EventHandler defined by: ' + JSON.stringify(parts, null, 2) + ' does not have can, abort, or run!');
2198
      }
637 daniel-mar 2199
      return __assign(__assign({}, defaultEventHandler), parts);
597 daniel-mar 2200
    };
2201
    var all$1 = function (handlers, f) {
2202
      return function () {
2203
        var args = [];
2204
        for (var _i = 0; _i < arguments.length; _i++) {
2205
          args[_i] = arguments[_i];
2206
        }
2207
        return foldl(handlers, function (acc, handler) {
2208
          return acc && f(handler).apply(undefined, args);
2209
        }, true);
2210
      };
2211
    };
2212
    var any = function (handlers, f) {
2213
      return function () {
2214
        var args = [];
2215
        for (var _i = 0; _i < arguments.length; _i++) {
2216
          args[_i] = arguments[_i];
2217
        }
2218
        return foldl(handlers, function (acc, handler) {
2219
          return acc || f(handler).apply(undefined, args);
2220
        }, false);
2221
      };
2222
    };
2223
    var read$1 = function (handler) {
2224
      return isFunction(handler) ? {
2225
        can: always,
2226
        abort: never,
2227
        run: handler
2228
      } : handler;
2229
    };
637 daniel-mar 2230
    var fuse$1 = function (handlers) {
597 daniel-mar 2231
      var can = all$1(handlers, function (handler) {
2232
        return handler.can;
2233
      });
2234
      var abort = any(handlers, function (handler) {
2235
        return handler.abort;
2236
      });
2237
      var run = function () {
2238
        var args = [];
2239
        for (var _i = 0; _i < arguments.length; _i++) {
2240
          args[_i] = arguments[_i];
2241
        }
637 daniel-mar 2242
        each$1(handlers, function (handler) {
597 daniel-mar 2243
          handler.run.apply(undefined, args);
2244
        });
2245
      };
637 daniel-mar 2246
      return {
597 daniel-mar 2247
        can: can,
2248
        abort: abort,
2249
        run: run
637 daniel-mar 2250
      };
597 daniel-mar 2251
    };
2252
 
637 daniel-mar 2253
    var derive$3 = function (configs) {
2254
      return wrapAll(configs);
597 daniel-mar 2255
    };
2256
    var abort = function (name, predicate) {
2257
      return {
2258
        key: name,
2259
        value: nu$4({ abort: predicate })
2260
      };
2261
    };
2262
    var can = function (name, predicate) {
2263
      return {
2264
        key: name,
2265
        value: nu$4({ can: predicate })
2266
      };
2267
    };
2268
    var run = function (name, handler) {
2269
      return {
2270
        key: name,
2271
        value: nu$4({ run: handler })
2272
      };
2273
    };
2274
    var runActionExtra = function (name, action, extra) {
2275
      return {
2276
        key: name,
2277
        value: nu$4({
2278
          run: function (component, simulatedEvent) {
2279
            action.apply(undefined, [
2280
              component,
2281
              simulatedEvent
2282
            ].concat(extra));
2283
          }
2284
        })
2285
      };
2286
    };
2287
    var runOnName = function (name) {
2288
      return function (handler) {
2289
        return run(name, handler);
2290
      };
2291
    };
2292
    var runOnSourceName = function (name) {
2293
      return function (handler) {
2294
        return {
2295
          key: name,
2296
          value: nu$4({
2297
            run: function (component, simulatedEvent) {
2298
              if (isSource(component, simulatedEvent)) {
2299
                handler(component, simulatedEvent);
2300
              }
2301
            }
2302
          })
2303
        };
2304
      };
2305
    };
2306
    var redirectToUid = function (name, uid) {
2307
      return run(name, function (component, simulatedEvent) {
2308
        component.getSystem().getByUid(uid).each(function (redirectee) {
2309
          dispatchEvent(redirectee, redirectee.element, name, simulatedEvent);
2310
        });
2311
      });
2312
    };
2313
    var redirectToPart = function (name, detail, partName) {
2314
      var uid = detail.partUids[partName];
2315
      return redirectToUid(name, uid);
2316
    };
2317
    var cutter = function (name) {
2318
      return run(name, function (component, simulatedEvent) {
2319
        simulatedEvent.cut();
2320
      });
2321
    };
2322
    var stopper = function (name) {
2323
      return run(name, function (component, simulatedEvent) {
2324
        simulatedEvent.stop();
2325
      });
2326
    };
2327
    var runOnSource = function (name, f) {
2328
      return runOnSourceName(name)(f);
2329
    };
2330
    var runOnAttached = runOnSourceName(attachedToDom());
2331
    var runOnDetached = runOnSourceName(detachedFromDom());
2332
    var runOnInit = runOnSourceName(systemInit());
637 daniel-mar 2333
    var runOnExecute = runOnName(execute$5());
597 daniel-mar 2334
 
2335
    var markAsBehaviourApi = function (f, apiName, apiFunction) {
2336
      var delegate = apiFunction.toString();
2337
      var endIndex = delegate.indexOf(')') + 1;
2338
      var openBracketIndex = delegate.indexOf('(');
2339
      var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/);
2340
      f.toFunctionAnnotation = function () {
2341
        return {
2342
          name: apiName,
2343
          parameters: cleanParameters(parameters.slice(0, 1).concat(parameters.slice(3)))
2344
        };
2345
      };
2346
      return f;
2347
    };
2348
    var cleanParameters = function (parameters) {
637 daniel-mar 2349
      return map$2(parameters, function (p) {
597 daniel-mar 2350
        return endsWith(p, '/*') ? p.substring(0, p.length - '/*'.length) : p;
2351
      });
2352
    };
2353
    var markAsExtraApi = function (f, extraName) {
2354
      var delegate = f.toString();
2355
      var endIndex = delegate.indexOf(')') + 1;
2356
      var openBracketIndex = delegate.indexOf('(');
2357
      var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/);
2358
      f.toFunctionAnnotation = function () {
2359
        return {
2360
          name: extraName,
2361
          parameters: cleanParameters(parameters)
2362
        };
2363
      };
2364
      return f;
2365
    };
2366
    var markAsSketchApi = function (f, apiFunction) {
2367
      var delegate = apiFunction.toString();
2368
      var endIndex = delegate.indexOf(')') + 1;
2369
      var openBracketIndex = delegate.indexOf('(');
2370
      var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/);
2371
      f.toFunctionAnnotation = function () {
2372
        return {
2373
          name: 'OVERRIDE',
2374
          parameters: cleanParameters(parameters.slice(1))
2375
        };
2376
      };
2377
      return f;
2378
    };
2379
 
637 daniel-mar 2380
    var nu$3 = function (s) {
597 daniel-mar 2381
      return {
637 daniel-mar 2382
        classes: isUndefined(s.classes) ? [] : s.classes,
2383
        attributes: isUndefined(s.attributes) ? {} : s.attributes,
2384
        styles: isUndefined(s.styles) ? {} : s.styles
597 daniel-mar 2385
      };
2386
    };
637 daniel-mar 2387
    var merge = function (defnA, mod) {
597 daniel-mar 2388
      return __assign(__assign({}, defnA), {
2389
        attributes: __assign(__assign({}, defnA.attributes), mod.attributes),
2390
        styles: __assign(__assign({}, defnA.styles), mod.styles),
2391
        classes: defnA.classes.concat(mod.classes)
2392
      });
2393
    };
2394
 
2395
    var executeEvent = function (bConfig, bState, executor) {
2396
      return runOnExecute(function (component) {
2397
        executor(component, bConfig, bState);
2398
      });
2399
    };
2400
    var loadEvent = function (bConfig, bState, f) {
2401
      return runOnInit(function (component, _simulatedEvent) {
2402
        f(component, bConfig, bState);
2403
      });
2404
    };
637 daniel-mar 2405
    var create$6 = function (schema, name, active, apis, extra, state) {
597 daniel-mar 2406
      var configSchema = objOfOnly(schema);
2407
      var schemaSchema = optionObjOf(name, [optionObjOfOnly('config', schema)]);
2408
      return doCreate(configSchema, schemaSchema, name, active, apis, extra, state);
2409
    };
637 daniel-mar 2410
    var createModes$1 = function (modes, name, active, apis, extra, state) {
597 daniel-mar 2411
      var configSchema = modes;
2412
      var schemaSchema = optionObjOf(name, [optionOf('config', modes)]);
2413
      return doCreate(configSchema, schemaSchema, name, active, apis, extra, state);
2414
    };
2415
    var wrapApi = function (bName, apiFunction, apiName) {
2416
      var f = function (component) {
2417
        var rest = [];
2418
        for (var _i = 1; _i < arguments.length; _i++) {
2419
          rest[_i - 1] = arguments[_i];
2420
        }
2421
        var args = [component].concat(rest);
637 daniel-mar 2422
        return component.config({ name: constant$1(bName) }).fold(function () {
597 daniel-mar 2423
          throw new Error('We could not find any behaviour configuration for: ' + bName + '. Using API: ' + apiName);
2424
        }, function (info) {
2425
          var rest = Array.prototype.slice.call(args, 1);
2426
          return apiFunction.apply(undefined, [
2427
            component,
2428
            info.config,
2429
            info.state
2430
          ].concat(rest));
2431
        });
2432
      };
2433
      return markAsBehaviourApi(f, apiName, apiFunction);
2434
    };
2435
    var revokeBehaviour = function (name) {
2436
      return {
2437
        key: name,
2438
        value: undefined
2439
      };
2440
    };
2441
    var doCreate = function (configSchema, schemaSchema, name, active, apis, extra, state) {
2442
      var getConfig = function (info) {
2443
        return hasNonNullableKey(info, name) ? info[name]() : Optional.none();
2444
      };
2445
      var wrappedApis = map$1(apis, function (apiF, apiName) {
2446
        return wrapApi(name, apiF, apiName);
2447
      });
2448
      var wrappedExtra = map$1(extra, function (extraF, extraName) {
2449
        return markAsExtraApi(extraF, extraName);
2450
      });
2451
      var me = __assign(__assign(__assign({}, wrappedExtra), wrappedApis), {
2452
        revoke: curry(revokeBehaviour, name),
2453
        config: function (spec) {
637 daniel-mar 2454
          var prepared = asRawOrDie$1(name + '-config', configSchema, spec);
597 daniel-mar 2455
          return {
2456
            key: name,
2457
            value: {
2458
              config: prepared,
2459
              me: me,
2460
              configAsRaw: cached(function () {
637 daniel-mar 2461
                return asRawOrDie$1(name + '-config', configSchema, spec);
597 daniel-mar 2462
              }),
2463
              initialConfig: spec,
2464
              state: state
2465
            }
2466
          };
2467
        },
637 daniel-mar 2468
        schema: constant$1(schemaSchema),
597 daniel-mar 2469
        exhibit: function (info, base) {
637 daniel-mar 2470
          return lift2(getConfig(info), get$c(active, 'exhibit'), function (behaviourInfo, exhibitor) {
2471
            return exhibitor(base, behaviourInfo.config, behaviourInfo.state);
2472
          }).getOrThunk(function () {
2473
            return nu$3({});
2474
          });
597 daniel-mar 2475
        },
637 daniel-mar 2476
        name: constant$1(name),
597 daniel-mar 2477
        handlers: function (info) {
2478
          return getConfig(info).map(function (behaviourInfo) {
637 daniel-mar 2479
            var getEvents = get$c(active, 'events').getOr(function () {
597 daniel-mar 2480
              return {};
2481
            });
2482
            return getEvents(behaviourInfo.config, behaviourInfo.state);
2483
          }).getOr({});
2484
        }
2485
      });
2486
      return me;
2487
    };
2488
 
2489
    var NoState = {
2490
      init: function () {
637 daniel-mar 2491
        return nu$2({ readState: constant$1('No State required') });
597 daniel-mar 2492
      }
2493
    };
637 daniel-mar 2494
    var nu$2 = function (spec) {
597 daniel-mar 2495
      return spec;
2496
    };
2497
 
637 daniel-mar 2498
    var derive$2 = function (capabilities) {
2499
      return wrapAll(capabilities);
597 daniel-mar 2500
    };
2501
    var simpleSchema = objOfOnly([
637 daniel-mar 2502
      required$1('fields'),
2503
      required$1('name'),
2504
      defaulted('active', {}),
2505
      defaulted('apis', {}),
2506
      defaulted('state', NoState),
2507
      defaulted('extra', {})
597 daniel-mar 2508
    ]);
637 daniel-mar 2509
    var create$5 = function (data) {
2510
      var value = asRawOrDie$1('Creating behaviour: ' + data.name, simpleSchema, data);
2511
      return create$6(value.fields, value.name, value.active, value.apis, value.extra, value.state);
597 daniel-mar 2512
    };
2513
    var modeSchema = objOfOnly([
637 daniel-mar 2514
      required$1('branchKey'),
2515
      required$1('branches'),
2516
      required$1('name'),
2517
      defaulted('active', {}),
2518
      defaulted('apis', {}),
2519
      defaulted('state', NoState),
2520
      defaulted('extra', {})
597 daniel-mar 2521
    ]);
637 daniel-mar 2522
    var createModes = function (data) {
2523
      var value = asRawOrDie$1('Creating behaviour: ' + data.name, modeSchema, data);
2524
      return createModes$1(choose$1(value.branchKey, value.branches), value.name, value.active, value.apis, value.extra, value.state);
597 daniel-mar 2525
    };
637 daniel-mar 2526
    var revoke = constant$1(undefined);
597 daniel-mar 2527
 
637 daniel-mar 2528
    var Swapping = create$5({
597 daniel-mar 2529
      fields: SwapSchema,
2530
      name: 'swapping',
2531
      apis: SwapApis
2532
    });
2533
 
2534
    var Cell = function (initial) {
2535
      var value = initial;
2536
      var get = function () {
2537
        return value;
2538
      };
2539
      var set = function (v) {
2540
        value = v;
2541
      };
2542
      return {
2543
        get: get,
2544
        set: set
2545
      };
2546
    };
2547
 
2548
    var getDocument = function () {
2549
      return SugarElement.fromDom(document);
2550
    };
2551
 
637 daniel-mar 2552
    var focus$3 = function (element) {
597 daniel-mar 2553
      return element.dom.focus();
2554
    };
637 daniel-mar 2555
    var blur$1 = function (element) {
597 daniel-mar 2556
      return element.dom.blur();
2557
    };
2558
    var hasFocus = function (element) {
2559
      var root = getRootNode(element).dom;
2560
      return element.dom === root.activeElement;
2561
    };
2562
    var active = function (root) {
2563
      if (root === void 0) {
2564
        root = getDocument();
2565
      }
2566
      return Optional.from(root.dom.activeElement).map(SugarElement.fromDom);
2567
    };
2568
    var search = function (element) {
2569
      return active(getRootNode(element)).filter(function (e) {
2570
        return element.dom.contains(e.dom);
2571
      });
2572
    };
2573
 
637 daniel-mar 2574
    var global$5 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
597 daniel-mar 2575
 
637 daniel-mar 2576
    var global$4 = tinymce.util.Tools.resolve('tinymce.ThemeManager');
597 daniel-mar 2577
 
2578
    var openLink = function (target) {
2579
      var link = document.createElement('a');
2580
      link.target = '_blank';
2581
      link.href = target.href;
2582
      link.rel = 'noreferrer noopener';
2583
      var nuEvt = document.createEvent('MouseEvents');
2584
      nuEvt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
2585
      document.body.appendChild(link);
2586
      link.dispatchEvent(nuEvt);
2587
      document.body.removeChild(link);
2588
    };
2589
 
2590
    var DefaultStyleFormats = [
2591
      {
2592
        title: 'Headings',
2593
        items: [
2594
          {
2595
            title: 'Heading 1',
2596
            format: 'h1'
2597
          },
2598
          {
2599
            title: 'Heading 2',
2600
            format: 'h2'
2601
          },
2602
          {
2603
            title: 'Heading 3',
2604
            format: 'h3'
2605
          },
2606
          {
2607
            title: 'Heading 4',
2608
            format: 'h4'
2609
          },
2610
          {
2611
            title: 'Heading 5',
2612
            format: 'h5'
2613
          },
2614
          {
2615
            title: 'Heading 6',
2616
            format: 'h6'
2617
          }
2618
        ]
2619
      },
2620
      {
2621
        title: 'Inline',
2622
        items: [
2623
          {
2624
            title: 'Bold',
2625
            icon: 'bold',
2626
            format: 'bold'
2627
          },
2628
          {
2629
            title: 'Italic',
2630
            icon: 'italic',
2631
            format: 'italic'
2632
          },
2633
          {
2634
            title: 'Underline',
2635
            icon: 'underline',
2636
            format: 'underline'
2637
          },
2638
          {
2639
            title: 'Strikethrough',
2640
            icon: 'strikethrough',
2641
            format: 'strikethrough'
2642
          },
2643
          {
2644
            title: 'Superscript',
2645
            icon: 'superscript',
2646
            format: 'superscript'
2647
          },
2648
          {
2649
            title: 'Subscript',
2650
            icon: 'subscript',
2651
            format: 'subscript'
2652
          },
2653
          {
2654
            title: 'Code',
2655
            icon: 'code',
2656
            format: 'code'
2657
          }
2658
        ]
2659
      },
2660
      {
2661
        title: 'Blocks',
2662
        items: [
2663
          {
2664
            title: 'Paragraph',
2665
            format: 'p'
2666
          },
2667
          {
2668
            title: 'Blockquote',
2669
            format: 'blockquote'
2670
          },
2671
          {
2672
            title: 'Div',
2673
            format: 'div'
2674
          },
2675
          {
2676
            title: 'Pre',
2677
            format: 'pre'
2678
          }
2679
        ]
2680
      },
2681
      {
2682
        title: 'Alignment',
2683
        items: [
2684
          {
2685
            title: 'Left',
2686
            icon: 'alignleft',
2687
            format: 'alignleft'
2688
          },
2689
          {
2690
            title: 'Center',
2691
            icon: 'aligncenter',
2692
            format: 'aligncenter'
2693
          },
2694
          {
2695
            title: 'Right',
2696
            icon: 'alignright',
2697
            format: 'alignright'
2698
          },
2699
          {
2700
            title: 'Justify',
2701
            icon: 'alignjustify',
2702
            format: 'alignjustify'
2703
          }
2704
        ]
2705
      }
2706
    ];
2707
 
2708
    var defaults = [
2709
      'undo',
2710
      'bold',
2711
      'italic',
2712
      'link',
2713
      'image',
2714
      'bullist',
2715
      'styleselect'
2716
    ];
2717
    var isSkinDisabled = function (editor) {
2718
      return editor.getParam('skin') === false;
2719
    };
2720
    var readOnlyOnInit = function (_editor) {
2721
      return false;
2722
    };
2723
    var getToolbar = function (editor) {
2724
      return editor.getParam('toolbar', defaults, 'array');
2725
    };
2726
    var getStyleFormats = function (editor) {
2727
      return editor.getParam('style_formats', DefaultStyleFormats, 'array');
2728
    };
2729
    var getSkinUrl = function (editor) {
2730
      return editor.getParam('skin_url');
2731
    };
2732
 
2733
    var formatChanged = 'formatChanged';
2734
    var orientationChanged = 'orientationChanged';
2735
    var dropupDismissed = 'dropupDismissed';
2736
 
2737
    var fromHtml$1 = function (html, scope) {
2738
      var doc = scope || document;
2739
      var div = doc.createElement('div');
2740
      div.innerHTML = html;
2741
      return children(SugarElement.fromDom(div));
2742
    };
2743
 
637 daniel-mar 2744
    var get$9 = function (element) {
597 daniel-mar 2745
      return element.dom.innerHTML;
2746
    };
637 daniel-mar 2747
    var set$7 = function (element, content) {
2748
      var owner = owner$2(element);
2749
      var docDom = owner.dom;
597 daniel-mar 2750
      var fragment = SugarElement.fromDom(docDom.createDocumentFragment());
2751
      var contentElements = fromHtml$1(content, docDom);
2752
      append$1(fragment, contentElements);
2753
      empty(element);
637 daniel-mar 2754
      append$2(element, fragment);
597 daniel-mar 2755
    };
2756
    var getOuter = function (element) {
2757
      var container = SugarElement.fromTag('div');
2758
      var clone = SugarElement.fromDom(element.dom.cloneNode(true));
637 daniel-mar 2759
      append$2(container, clone);
2760
      return get$9(container);
597 daniel-mar 2761
    };
2762
 
2763
    var clone = function (original, isDeep) {
2764
      return SugarElement.fromDom(original.dom.cloneNode(isDeep));
2765
    };
637 daniel-mar 2766
    var shallow = function (original) {
597 daniel-mar 2767
      return clone(original, false);
2768
    };
2769
 
2770
    var getHtml = function (element) {
2771
      if (isShadowRoot(element)) {
2772
        return '#shadow-root';
2773
      } else {
637 daniel-mar 2774
        var clone = shallow(element);
597 daniel-mar 2775
        return getOuter(clone);
2776
      }
2777
    };
2778
 
2779
    var element = function (elem) {
2780
      return getHtml(elem);
2781
    };
2782
 
2783
    var chooseChannels = function (channels, message) {
637 daniel-mar 2784
      return message.universal ? channels : filter$2(channels, function (ch) {
2785
        return contains$1(message.channels, ch);
597 daniel-mar 2786
      });
2787
    };
637 daniel-mar 2788
    var events$a = function (receiveConfig) {
2789
      return derive$3([run(receive$1(), function (component, message) {
597 daniel-mar 2790
          var channelMap = receiveConfig.channels;
2791
          var channels = keys(channelMap);
2792
          var receivingData = message;
2793
          var targetChannels = chooseChannels(channels, receivingData);
637 daniel-mar 2794
          each$1(targetChannels, function (ch) {
597 daniel-mar 2795
            var channelInfo = channelMap[ch];
2796
            var channelSchema = channelInfo.schema;
637 daniel-mar 2797
            var data = asRawOrDie$1('channel[' + ch + '] data\nReceiver: ' + element(component.element), channelSchema, receivingData.data);
597 daniel-mar 2798
            channelInfo.onReceive(component, data);
2799
          });
2800
        })]);
2801
    };
2802
 
2803
    var ActiveReceiving = /*#__PURE__*/Object.freeze({
2804
        __proto__: null,
637 daniel-mar 2805
        events: events$a
597 daniel-mar 2806
    });
2807
 
637 daniel-mar 2808
    var unknown = 'unknown';
597 daniel-mar 2809
    var EventConfiguration;
2810
    (function (EventConfiguration) {
2811
      EventConfiguration[EventConfiguration['STOP'] = 0] = 'STOP';
2812
      EventConfiguration[EventConfiguration['NORMAL'] = 1] = 'NORMAL';
2813
      EventConfiguration[EventConfiguration['LOGGING'] = 2] = 'LOGGING';
2814
    }(EventConfiguration || (EventConfiguration = {})));
2815
    var eventConfig = Cell({});
2816
    var makeEventLogger = function (eventName, initialTarget) {
2817
      var sequence = [];
2818
      var startTime = new Date().getTime();
2819
      return {
2820
        logEventCut: function (_name, target, purpose) {
2821
          sequence.push({
2822
            outcome: 'cut',
2823
            target: target,
2824
            purpose: purpose
2825
          });
2826
        },
2827
        logEventStopped: function (_name, target, purpose) {
2828
          sequence.push({
2829
            outcome: 'stopped',
2830
            target: target,
2831
            purpose: purpose
2832
          });
2833
        },
2834
        logNoParent: function (_name, target, purpose) {
2835
          sequence.push({
2836
            outcome: 'no-parent',
2837
            target: target,
2838
            purpose: purpose
2839
          });
2840
        },
2841
        logEventNoHandlers: function (_name, target) {
2842
          sequence.push({
2843
            outcome: 'no-handlers-left',
2844
            target: target
2845
          });
2846
        },
2847
        logEventResponse: function (_name, target, purpose) {
2848
          sequence.push({
2849
            outcome: 'response',
2850
            purpose: purpose,
2851
            target: target
2852
          });
2853
        },
2854
        write: function () {
2855
          var finishTime = new Date().getTime();
637 daniel-mar 2856
          if (contains$1([
597 daniel-mar 2857
              'mousemove',
2858
              'mouseover',
2859
              'mouseout',
2860
              systemInit()
2861
            ], eventName)) {
2862
            return;
2863
          }
2864
          console.log(eventName, {
2865
            event: eventName,
2866
            time: finishTime - startTime,
2867
            target: initialTarget.dom,
637 daniel-mar 2868
            sequence: map$2(sequence, function (s) {
2869
              if (!contains$1([
597 daniel-mar 2870
                  'cut',
2871
                  'stopped',
2872
                  'response'
2873
                ], s.outcome)) {
2874
                return s.outcome;
2875
              } else {
2876
                return '{' + s.purpose + '} ' + s.outcome + ' at (' + element(s.target) + ')';
2877
              }
2878
            })
2879
          });
2880
        }
2881
      };
2882
    };
2883
    var processEvent = function (eventName, initialTarget, f) {
637 daniel-mar 2884
      var status = get$c(eventConfig.get(), eventName).orThunk(function () {
597 daniel-mar 2885
        var patterns = keys(eventConfig.get());
2886
        return findMap(patterns, function (p) {
2887
          return eventName.indexOf(p) > -1 ? Optional.some(eventConfig.get()[p]) : Optional.none();
2888
        });
2889
      }).getOr(EventConfiguration.NORMAL);
2890
      switch (status) {
2891
      case EventConfiguration.NORMAL:
2892
        return f(noLogger());
2893
      case EventConfiguration.LOGGING: {
2894
          var logger = makeEventLogger(eventName, initialTarget);
2895
          var output = f(logger);
2896
          logger.write();
2897
          return output;
2898
        }
2899
      case EventConfiguration.STOP:
2900
        return true;
2901
      }
2902
    };
2903
    var path = [
2904
      'alloy/data/Fields',
2905
      'alloy/debugging/Debugging'
2906
    ];
2907
    var getTrace = function () {
2908
      var err = new Error();
2909
      if (err.stack !== undefined) {
2910
        var lines = err.stack.split('\n');
637 daniel-mar 2911
        return find$2(lines, function (line) {
597 daniel-mar 2912
          return line.indexOf('alloy') > 0 && !exists(path, function (p) {
2913
            return line.indexOf(p) > -1;
2914
          });
637 daniel-mar 2915
        }).getOr(unknown);
597 daniel-mar 2916
      } else {
637 daniel-mar 2917
        return unknown;
597 daniel-mar 2918
      }
2919
    };
2920
    var ignoreEvent = {
2921
      logEventCut: noop,
2922
      logEventStopped: noop,
2923
      logNoParent: noop,
2924
      logEventNoHandlers: noop,
2925
      logEventResponse: noop,
2926
      write: noop
2927
    };
2928
    var monitorEvent = function (eventName, initialTarget, f) {
2929
      return processEvent(eventName, initialTarget, f);
2930
    };
637 daniel-mar 2931
    var noLogger = constant$1(ignoreEvent);
597 daniel-mar 2932
 
637 daniel-mar 2933
    var menuFields = constant$1([
2934
      required$1('menu'),
2935
      required$1('selectedMenu')
597 daniel-mar 2936
    ]);
637 daniel-mar 2937
    var itemFields = constant$1([
2938
      required$1('item'),
2939
      required$1('selectedItem')
597 daniel-mar 2940
    ]);
637 daniel-mar 2941
    constant$1(objOf(itemFields().concat(menuFields())));
2942
    var itemSchema$1 = constant$1(objOf(itemFields()));
597 daniel-mar 2943
 
637 daniel-mar 2944
    var _initSize = requiredObjOf('initSize', [
2945
      required$1('numColumns'),
2946
      required$1('numRows')
597 daniel-mar 2947
    ]);
2948
    var itemMarkers = function () {
637 daniel-mar 2949
      return requiredOf('markers', itemSchema$1());
597 daniel-mar 2950
    };
2951
    var tieredMenuMarkers = function () {
637 daniel-mar 2952
      return requiredObjOf('markers', [required$1('backgroundMenu')].concat(menuFields()).concat(itemFields()));
597 daniel-mar 2953
    };
2954
    var markers = function (required) {
637 daniel-mar 2955
      return requiredObjOf('markers', map$2(required, required$1));
597 daniel-mar 2956
    };
2957
    var onPresenceHandler = function (label, fieldName, presence) {
637 daniel-mar 2958
      getTrace();
2959
      return field$2(fieldName, fieldName, presence, valueOf(function (f) {
597 daniel-mar 2960
        return Result.value(function () {
2961
          var args = [];
2962
          for (var _i = 0; _i < arguments.length; _i++) {
2963
            args[_i] = arguments[_i];
2964
          }
2965
          return f.apply(undefined, args);
2966
        });
2967
      }));
2968
    };
2969
    var onHandler = function (fieldName) {
637 daniel-mar 2970
      return onPresenceHandler('onHandler', fieldName, defaulted$1(noop));
597 daniel-mar 2971
    };
2972
    var onKeyboardHandler = function (fieldName) {
637 daniel-mar 2973
      return onPresenceHandler('onKeyboardHandler', fieldName, defaulted$1(Optional.none));
597 daniel-mar 2974
    };
2975
    var onStrictHandler = function (fieldName) {
637 daniel-mar 2976
      return onPresenceHandler('onHandler', fieldName, required$2());
597 daniel-mar 2977
    };
2978
    var onStrictKeyboardHandler = function (fieldName) {
637 daniel-mar 2979
      return onPresenceHandler('onKeyboardHandler', fieldName, required$2());
597 daniel-mar 2980
    };
2981
    var output = function (name, value) {
637 daniel-mar 2982
      return customField(name, constant$1(value));
597 daniel-mar 2983
    };
2984
    var snapshot = function (name) {
637 daniel-mar 2985
      return customField(name, identity);
597 daniel-mar 2986
    };
637 daniel-mar 2987
    var initSize = constant$1(_initSize);
597 daniel-mar 2988
 
637 daniel-mar 2989
    var ReceivingSchema = [requiredOf('channels', setOf(Result.value, objOfOnly([
597 daniel-mar 2990
        onStrictHandler('onReceive'),
637 daniel-mar 2991
        defaulted('schema', anyValue())
597 daniel-mar 2992
      ])))];
2993
 
637 daniel-mar 2994
    var Receiving = create$5({
597 daniel-mar 2995
      fields: ReceivingSchema,
2996
      name: 'receiving',
2997
      active: ActiveReceiving
2998
    });
2999
 
3000
    var SetupBehaviourCellState = function (initialState) {
3001
      var init = function () {
3002
        var cell = Cell(initialState);
3003
        var get = function () {
3004
          return cell.get();
3005
        };
3006
        var set = function (newState) {
3007
          return cell.set(newState);
3008
        };
3009
        var clear = function () {
3010
          return cell.set(initialState);
3011
        };
3012
        var readState = function () {
3013
          return cell.get();
3014
        };
3015
        return {
3016
          get: get,
3017
          set: set,
3018
          clear: clear,
3019
          readState: readState
3020
        };
3021
      };
3022
      return { init: init };
3023
    };
3024
 
3025
    var updateAriaState = function (component, toggleConfig, toggleState) {
3026
      var ariaInfo = toggleConfig.aria;
3027
      ariaInfo.update(component, ariaInfo, toggleState.get());
3028
    };
3029
    var updateClass = function (component, toggleConfig, toggleState) {
3030
      toggleConfig.toggleClass.each(function (toggleClass) {
3031
        if (toggleState.get()) {
637 daniel-mar 3032
          add$1(component.element, toggleClass);
597 daniel-mar 3033
        } else {
637 daniel-mar 3034
          remove$3(component.element, toggleClass);
597 daniel-mar 3035
        }
3036
      });
3037
    };
3038
    var toggle = function (component, toggleConfig, toggleState) {
637 daniel-mar 3039
      set$6(component, toggleConfig, toggleState, !toggleState.get());
597 daniel-mar 3040
    };
637 daniel-mar 3041
    var on$1 = function (component, toggleConfig, toggleState) {
597 daniel-mar 3042
      toggleState.set(true);
3043
      updateClass(component, toggleConfig, toggleState);
3044
      updateAriaState(component, toggleConfig, toggleState);
3045
    };
3046
    var off = function (component, toggleConfig, toggleState) {
3047
      toggleState.set(false);
3048
      updateClass(component, toggleConfig, toggleState);
3049
      updateAriaState(component, toggleConfig, toggleState);
3050
    };
637 daniel-mar 3051
    var set$6 = function (component, toggleConfig, toggleState, state) {
3052
      var action = state ? on$1 : off;
597 daniel-mar 3053
      action(component, toggleConfig, toggleState);
3054
    };
3055
    var isOn = function (component, toggleConfig, toggleState) {
3056
      return toggleState.get();
3057
    };
637 daniel-mar 3058
    var onLoad$5 = function (component, toggleConfig, toggleState) {
3059
      set$6(component, toggleConfig, toggleState, toggleConfig.selected);
597 daniel-mar 3060
    };
3061
 
3062
    var ToggleApis = /*#__PURE__*/Object.freeze({
3063
        __proto__: null,
637 daniel-mar 3064
        onLoad: onLoad$5,
597 daniel-mar 3065
        toggle: toggle,
3066
        isOn: isOn,
637 daniel-mar 3067
        on: on$1,
597 daniel-mar 3068
        off: off,
637 daniel-mar 3069
        set: set$6
597 daniel-mar 3070
    });
3071
 
637 daniel-mar 3072
    var exhibit$5 = function () {
3073
      return nu$3({});
597 daniel-mar 3074
    };
637 daniel-mar 3075
    var events$9 = function (toggleConfig, toggleState) {
597 daniel-mar 3076
      var execute = executeEvent(toggleConfig, toggleState, toggle);
637 daniel-mar 3077
      var load = loadEvent(toggleConfig, toggleState, onLoad$5);
3078
      return derive$3(flatten([
597 daniel-mar 3079
        toggleConfig.toggleOnExecute ? [execute] : [],
3080
        [load]
3081
      ]));
3082
    };
3083
 
3084
    var ActiveToggle = /*#__PURE__*/Object.freeze({
3085
        __proto__: null,
637 daniel-mar 3086
        exhibit: exhibit$5,
3087
        events: events$9
597 daniel-mar 3088
    });
3089
 
3090
    var updatePressed = function (component, ariaInfo, status) {
637 daniel-mar 3091
      set$8(component.element, 'aria-pressed', status);
597 daniel-mar 3092
      if (ariaInfo.syncWithExpanded) {
3093
        updateExpanded(component, ariaInfo, status);
3094
      }
3095
    };
3096
    var updateSelected = function (component, ariaInfo, status) {
637 daniel-mar 3097
      set$8(component.element, 'aria-selected', status);
597 daniel-mar 3098
    };
3099
    var updateChecked = function (component, ariaInfo, status) {
637 daniel-mar 3100
      set$8(component.element, 'aria-checked', status);
597 daniel-mar 3101
    };
3102
    var updateExpanded = function (component, ariaInfo, status) {
637 daniel-mar 3103
      set$8(component.element, 'aria-expanded', status);
597 daniel-mar 3104
    };
3105
 
3106
    var ToggleSchema = [
637 daniel-mar 3107
      defaulted('selected', false),
597 daniel-mar 3108
      option('toggleClass'),
637 daniel-mar 3109
      defaulted('toggleOnExecute', true),
597 daniel-mar 3110
      defaultedOf('aria', { mode: 'none' }, choose$1('mode', {
3111
        pressed: [
637 daniel-mar 3112
          defaulted('syncWithExpanded', false),
597 daniel-mar 3113
          output('update', updatePressed)
3114
        ],
3115
        checked: [output('update', updateChecked)],
3116
        expanded: [output('update', updateExpanded)],
3117
        selected: [output('update', updateSelected)],
3118
        none: [output('update', noop)]
3119
      }))
3120
    ];
3121
 
637 daniel-mar 3122
    var Toggling = create$5({
597 daniel-mar 3123
      fields: ToggleSchema,
3124
      name: 'toggling',
3125
      active: ActiveToggle,
3126
      apis: ToggleApis,
3127
      state: SetupBehaviourCellState(false)
3128
    });
3129
 
3130
    var format = function (command, update) {
3131
      return Receiving.config({
637 daniel-mar 3132
        channels: wrap(formatChanged, {
597 daniel-mar 3133
          onReceive: function (button, data) {
3134
            if (data.command === command) {
3135
              update(button, data.state);
3136
            }
3137
          }
3138
        })
3139
      });
3140
    };
3141
    var orientation = function (onReceive) {
637 daniel-mar 3142
      return Receiving.config({ channels: wrap(orientationChanged, { onReceive: onReceive }) });
597 daniel-mar 3143
    };
637 daniel-mar 3144
    var receive = function (channel, onReceive) {
597 daniel-mar 3145
      return {
3146
        key: channel,
3147
        value: { onReceive: onReceive }
3148
      };
3149
    };
3150
 
637 daniel-mar 3151
    var prefix$2 = 'tinymce-mobile';
597 daniel-mar 3152
    var resolve = function (p) {
637 daniel-mar 3153
      return prefix$2 + '-' + p;
597 daniel-mar 3154
    };
3155
 
3156
    var pointerEvents = function () {
3157
      var onClick = function (component, simulatedEvent) {
3158
        simulatedEvent.stop();
3159
        emitExecute(component);
3160
      };
3161
      return [
3162
        run(click(), onClick),
3163
        run(tap(), onClick),
3164
        cutter(touchstart()),
3165
        cutter(mousedown())
3166
      ];
3167
    };
637 daniel-mar 3168
    var events$8 = function (optAction) {
597 daniel-mar 3169
      var executeHandler = function (action) {
3170
        return runOnExecute(function (component, simulatedEvent) {
3171
          action(component);
3172
          simulatedEvent.stop();
3173
        });
3174
      };
637 daniel-mar 3175
      return derive$3(flatten([
597 daniel-mar 3176
        optAction.map(executeHandler).toArray(),
3177
        pointerEvents()
3178
      ]));
3179
    };
3180
 
3181
    var focus$2 = function (component, focusConfig) {
3182
      if (!focusConfig.ignore) {
637 daniel-mar 3183
        focus$3(component.element);
597 daniel-mar 3184
        focusConfig.onFocus(component);
3185
      }
3186
    };
637 daniel-mar 3187
    var blur = function (component, focusConfig) {
597 daniel-mar 3188
      if (!focusConfig.ignore) {
637 daniel-mar 3189
        blur$1(component.element);
597 daniel-mar 3190
      }
3191
    };
3192
    var isFocused = function (component) {
3193
      return hasFocus(component.element);
3194
    };
3195
 
3196
    var FocusApis = /*#__PURE__*/Object.freeze({
3197
        __proto__: null,
3198
        focus: focus$2,
637 daniel-mar 3199
        blur: blur,
597 daniel-mar 3200
        isFocused: isFocused
3201
    });
3202
 
637 daniel-mar 3203
    var exhibit$4 = function (base, focusConfig) {
597 daniel-mar 3204
      var mod = focusConfig.ignore ? {} : { attributes: { tabindex: '-1' } };
637 daniel-mar 3205
      return nu$3(mod);
597 daniel-mar 3206
    };
637 daniel-mar 3207
    var events$7 = function (focusConfig) {
3208
      return derive$3([run(focus$4(), function (component, simulatedEvent) {
597 daniel-mar 3209
          focus$2(component, focusConfig);
3210
          simulatedEvent.stop();
3211
        })].concat(focusConfig.stopMousedown ? [run(mousedown(), function (_, simulatedEvent) {
3212
          simulatedEvent.event.prevent();
3213
        })] : []));
3214
    };
3215
 
3216
    var ActiveFocus = /*#__PURE__*/Object.freeze({
3217
        __proto__: null,
637 daniel-mar 3218
        exhibit: exhibit$4,
3219
        events: events$7
597 daniel-mar 3220
    });
3221
 
3222
    var FocusSchema = [
3223
      onHandler('onFocus'),
637 daniel-mar 3224
      defaulted('stopMousedown', false),
3225
      defaulted('ignore', false)
597 daniel-mar 3226
    ];
3227
 
637 daniel-mar 3228
    var Focusing = create$5({
597 daniel-mar 3229
      fields: FocusSchema,
3230
      name: 'focusing',
3231
      active: ActiveFocus,
3232
      apis: FocusApis
3233
    });
3234
 
637 daniel-mar 3235
    var isSupported = function (dom) {
597 daniel-mar 3236
      return dom.style !== undefined && isFunction(dom.style.getPropertyValue);
3237
    };
3238
 
3239
    var internalSet = function (dom, property, value) {
3240
      if (!isString(value)) {
3241
        console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
3242
        throw new Error('CSS value must be a string: ' + value);
3243
      }
637 daniel-mar 3244
      if (isSupported(dom)) {
597 daniel-mar 3245
        dom.style.setProperty(property, value);
3246
      }
3247
    };
3248
    var internalRemove = function (dom, property) {
637 daniel-mar 3249
      if (isSupported(dom)) {
597 daniel-mar 3250
        dom.style.removeProperty(property);
3251
      }
3252
    };
637 daniel-mar 3253
    var set$5 = function (element, property, value) {
597 daniel-mar 3254
      var dom = element.dom;
3255
      internalSet(dom, property, value);
3256
    };
637 daniel-mar 3257
    var setAll = function (element, css) {
597 daniel-mar 3258
      var dom = element.dom;
637 daniel-mar 3259
      each(css, function (v, k) {
597 daniel-mar 3260
        internalSet(dom, k, v);
3261
      });
3262
    };
637 daniel-mar 3263
    var get$8 = function (element, property) {
597 daniel-mar 3264
      var dom = element.dom;
3265
      var styles = window.getComputedStyle(dom);
3266
      var r = styles.getPropertyValue(property);
3267
      return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;
3268
    };
3269
    var getUnsafeProperty = function (dom, property) {
637 daniel-mar 3270
      return isSupported(dom) ? dom.style.getPropertyValue(property) : '';
597 daniel-mar 3271
    };
3272
    var getRaw = function (element, property) {
3273
      var dom = element.dom;
3274
      var raw = getUnsafeProperty(dom, property);
3275
      return Optional.from(raw).filter(function (r) {
3276
        return r.length > 0;
3277
      });
3278
    };
637 daniel-mar 3279
    var remove$2 = function (element, property) {
597 daniel-mar 3280
      var dom = element.dom;
3281
      internalRemove(dom, property);
637 daniel-mar 3282
      if (is(getOpt(element, 'style').map(trim), '')) {
3283
        remove$6(element, 'style');
597 daniel-mar 3284
      }
3285
    };
3286
    var reflow = function (e) {
3287
      return e.dom.offsetWidth;
3288
    };
3289
 
3290
    var Dimension = function (name, getOffset) {
3291
      var set = function (element, h) {
3292
        if (!isNumber(h) && !h.match(/^[0-9]+$/)) {
3293
          throw new Error(name + '.set accepts only positive integer values. Value was ' + h);
3294
        }
3295
        var dom = element.dom;
637 daniel-mar 3296
        if (isSupported(dom)) {
597 daniel-mar 3297
          dom.style[name] = h + 'px';
3298
        }
3299
      };
3300
      var get = function (element) {
3301
        var r = getOffset(element);
3302
        if (r <= 0 || r === null) {
637 daniel-mar 3303
          var css = get$8(element, name);
597 daniel-mar 3304
          return parseFloat(css) || 0;
3305
        }
3306
        return r;
3307
      };
3308
      var getOuter = get;
3309
      var aggregate = function (element, properties) {
3310
        return foldl(properties, function (acc, property) {
637 daniel-mar 3311
          var val = get$8(element, property);
597 daniel-mar 3312
          var value = val === undefined ? 0 : parseInt(val, 10);
3313
          return isNaN(value) ? acc : acc + value;
3314
        }, 0);
3315
      };
3316
      var max = function (element, value, properties) {
3317
        var cumulativeInclusions = aggregate(element, properties);
3318
        var absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0;
3319
        return absoluteMax;
3320
      };
3321
      return {
3322
        set: set,
3323
        get: get,
3324
        getOuter: getOuter,
3325
        aggregate: aggregate,
3326
        max: max
3327
      };
3328
    };
3329
 
637 daniel-mar 3330
    var api$3 = Dimension('height', function (element) {
597 daniel-mar 3331
      var dom = element.dom;
3332
      return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight;
3333
    });
637 daniel-mar 3334
    var get$7 = function (element) {
3335
      return api$3.get(element);
597 daniel-mar 3336
    };
3337
 
637 daniel-mar 3338
    var ancestors$1 = function (scope, predicate, isRoot) {
3339
      return filter$2(parents(scope, isRoot), predicate);
597 daniel-mar 3340
    };
3341
    var siblings$1 = function (scope, predicate) {
637 daniel-mar 3342
      return filter$2(siblings$2(scope), predicate);
597 daniel-mar 3343
    };
3344
 
637 daniel-mar 3345
    var all = function (selector) {
3346
      return all$2(selector);
597 daniel-mar 3347
    };
637 daniel-mar 3348
    var ancestors = function (scope, selector, isRoot) {
3349
      return ancestors$1(scope, function (e) {
3350
        return is$1(e, selector);
597 daniel-mar 3351
      }, isRoot);
3352
    };
637 daniel-mar 3353
    var siblings = function (scope, selector) {
597 daniel-mar 3354
      return siblings$1(scope, function (e) {
637 daniel-mar 3355
        return is$1(e, selector);
597 daniel-mar 3356
      });
3357
    };
3358
    var descendants = function (scope, selector) {
637 daniel-mar 3359
      return all$2(selector, scope);
597 daniel-mar 3360
    };
3361
 
3362
    function ClosestOrAncestor (is, ancestor, scope, a, isRoot) {
3363
      if (is(scope, a)) {
3364
        return Optional.some(scope);
3365
      } else if (isFunction(isRoot) && isRoot(scope)) {
3366
        return Optional.none();
3367
      } else {
3368
        return ancestor(scope, a, isRoot);
3369
      }
3370
    }
3371
 
3372
    var ancestor$1 = function (scope, predicate, isRoot) {
3373
      var element = scope.dom;
3374
      var stop = isFunction(isRoot) ? isRoot : never;
3375
      while (element.parentNode) {
3376
        element = element.parentNode;
3377
        var el = SugarElement.fromDom(element);
3378
        if (predicate(el)) {
3379
          return Optional.some(el);
3380
        } else if (stop(el)) {
3381
          break;
3382
        }
3383
      }
3384
      return Optional.none();
3385
    };
637 daniel-mar 3386
    var closest$2 = function (scope, predicate, isRoot) {
597 daniel-mar 3387
      var is = function (s, test) {
3388
        return test(s);
3389
      };
3390
      return ClosestOrAncestor(is, ancestor$1, scope, predicate, isRoot);
3391
    };
637 daniel-mar 3392
    var descendant$1 = function (scope, predicate) {
597 daniel-mar 3393
      var descend = function (node) {
3394
        for (var i = 0; i < node.childNodes.length; i++) {
3395
          var child_1 = SugarElement.fromDom(node.childNodes[i]);
3396
          if (predicate(child_1)) {
3397
            return Optional.some(child_1);
3398
          }
3399
          var res = descend(node.childNodes[i]);
3400
          if (res.isSome()) {
3401
            return res;
3402
          }
3403
        }
3404
        return Optional.none();
3405
      };
3406
      return descend(scope.dom);
3407
    };
3408
 
637 daniel-mar 3409
    var first$1 = function (selector) {
597 daniel-mar 3410
      return one(selector);
3411
    };
637 daniel-mar 3412
    var ancestor = function (scope, selector, isRoot) {
597 daniel-mar 3413
      return ancestor$1(scope, function (e) {
637 daniel-mar 3414
        return is$1(e, selector);
597 daniel-mar 3415
      }, isRoot);
3416
    };
637 daniel-mar 3417
    var descendant = function (scope, selector) {
597 daniel-mar 3418
      return one(selector, scope);
3419
    };
637 daniel-mar 3420
    var closest$1 = function (scope, selector, isRoot) {
3421
      var is = function (element, selector) {
3422
        return is$1(element, selector);
597 daniel-mar 3423
      };
637 daniel-mar 3424
      return ClosestOrAncestor(is, ancestor, scope, selector, isRoot);
597 daniel-mar 3425
    };
3426
 
3427
    var BACKSPACE = [8];
3428
    var TAB = [9];
3429
    var ENTER = [13];
3430
    var ESCAPE = [27];
3431
    var SPACE = [32];
3432
    var LEFT = [37];
3433
    var UP = [38];
3434
    var RIGHT = [39];
3435
    var DOWN = [40];
3436
 
3437
    var cyclePrev = function (values, index, predicate) {
3438
      var before = reverse(values.slice(0, index));
3439
      var after = reverse(values.slice(index + 1));
637 daniel-mar 3440
      return find$2(before.concat(after), predicate);
597 daniel-mar 3441
    };
3442
    var tryPrev = function (values, index, predicate) {
3443
      var before = reverse(values.slice(0, index));
637 daniel-mar 3444
      return find$2(before, predicate);
597 daniel-mar 3445
    };
3446
    var cycleNext = function (values, index, predicate) {
3447
      var before = values.slice(0, index);
3448
      var after = values.slice(index + 1);
637 daniel-mar 3449
      return find$2(after.concat(before), predicate);
597 daniel-mar 3450
    };
3451
    var tryNext = function (values, index, predicate) {
3452
      var after = values.slice(index + 1);
637 daniel-mar 3453
      return find$2(after, predicate);
597 daniel-mar 3454
    };
3455
 
3456
    var inSet = function (keys) {
3457
      return function (event) {
3458
        var raw = event.raw;
637 daniel-mar 3459
        return contains$1(keys, raw.which);
597 daniel-mar 3460
      };
3461
    };
3462
    var and = function (preds) {
3463
      return function (event) {
3464
        return forall(preds, function (pred) {
3465
          return pred(event);
3466
        });
3467
      };
3468
    };
3469
    var isShift = function (event) {
3470
      var raw = event.raw;
3471
      return raw.shiftKey === true;
3472
    };
3473
    var isControl = function (event) {
3474
      var raw = event.raw;
3475
      return raw.ctrlKey === true;
3476
    };
3477
    var isNotShift = not(isShift);
3478
 
3479
    var rule = function (matches, action) {
3480
      return {
3481
        matches: matches,
3482
        classification: action
3483
      };
3484
    };
637 daniel-mar 3485
    var choose = function (transitions, event) {
3486
      var transition = find$2(transitions, function (t) {
597 daniel-mar 3487
        return t.matches(event);
3488
      });
3489
      return transition.map(function (t) {
3490
        return t.classification;
3491
      });
3492
    };
3493
 
3494
    var cycleBy = function (value, delta, min, max) {
3495
      var r = value + delta;
3496
      if (r > max) {
3497
        return min;
3498
      } else if (r < min) {
3499
        return max;
3500
      } else {
3501
        return r;
3502
      }
3503
    };
3504
    var clamp = function (value, min, max) {
3505
      return Math.min(Math.max(value, min), max);
3506
    };
3507
 
3508
    var dehighlightAllExcept = function (component, hConfig, hState, skip) {
3509
      var highlighted = descendants(component.element, '.' + hConfig.highlightClass);
637 daniel-mar 3510
      each$1(highlighted, function (h) {
597 daniel-mar 3511
        if (!exists(skip, function (skipComp) {
3512
            return skipComp.element === h;
3513
          })) {
637 daniel-mar 3514
          remove$3(h, hConfig.highlightClass);
597 daniel-mar 3515
          component.getSystem().getByDom(h).each(function (target) {
3516
            hConfig.onDehighlight(component, target);
637 daniel-mar 3517
            emit(target, dehighlight$1());
597 daniel-mar 3518
          });
3519
        }
3520
      });
3521
    };
3522
    var dehighlightAll = function (component, hConfig, hState) {
3523
      return dehighlightAllExcept(component, hConfig, hState, []);
3524
    };
637 daniel-mar 3525
    var dehighlight = function (component, hConfig, hState, target) {
597 daniel-mar 3526
      if (isHighlighted(component, hConfig, hState, target)) {
637 daniel-mar 3527
        remove$3(target.element, hConfig.highlightClass);
597 daniel-mar 3528
        hConfig.onDehighlight(component, target);
637 daniel-mar 3529
        emit(target, dehighlight$1());
597 daniel-mar 3530
      }
3531
    };
637 daniel-mar 3532
    var highlight = function (component, hConfig, hState, target) {
597 daniel-mar 3533
      dehighlightAllExcept(component, hConfig, hState, [target]);
3534
      if (!isHighlighted(component, hConfig, hState, target)) {
637 daniel-mar 3535
        add$1(target.element, hConfig.highlightClass);
597 daniel-mar 3536
        hConfig.onHighlight(component, target);
637 daniel-mar 3537
        emit(target, highlight$1());
597 daniel-mar 3538
      }
3539
    };
3540
    var highlightFirst = function (component, hConfig, hState) {
3541
      getFirst(component, hConfig).each(function (firstComp) {
637 daniel-mar 3542
        highlight(component, hConfig, hState, firstComp);
597 daniel-mar 3543
      });
3544
    };
3545
    var highlightLast = function (component, hConfig, hState) {
3546
      getLast(component, hConfig).each(function (lastComp) {
637 daniel-mar 3547
        highlight(component, hConfig, hState, lastComp);
597 daniel-mar 3548
      });
3549
    };
3550
    var highlightAt = function (component, hConfig, hState, index) {
3551
      getByIndex(component, hConfig, hState, index).fold(function (err) {
3552
        throw err;
3553
      }, function (firstComp) {
637 daniel-mar 3554
        highlight(component, hConfig, hState, firstComp);
597 daniel-mar 3555
      });
3556
    };
3557
    var highlightBy = function (component, hConfig, hState, predicate) {
3558
      var candidates = getCandidates(component, hConfig);
637 daniel-mar 3559
      var targetComp = find$2(candidates, predicate);
597 daniel-mar 3560
      targetComp.each(function (c) {
637 daniel-mar 3561
        highlight(component, hConfig, hState, c);
597 daniel-mar 3562
      });
3563
    };
3564
    var isHighlighted = function (component, hConfig, hState, queryTarget) {
637 daniel-mar 3565
      return has(queryTarget.element, hConfig.highlightClass);
597 daniel-mar 3566
    };
3567
    var getHighlighted = function (component, hConfig, _hState) {
637 daniel-mar 3568
      return descendant(component.element, '.' + hConfig.highlightClass).bind(function (e) {
597 daniel-mar 3569
        return component.getSystem().getByDom(e).toOptional();
3570
      });
3571
    };
3572
    var getByIndex = function (component, hConfig, hState, index) {
3573
      var items = descendants(component.element, '.' + hConfig.itemClass);
3574
      return Optional.from(items[index]).fold(function () {
3575
        return Result.error(new Error('No element found with index ' + index));
3576
      }, component.getSystem().getByDom);
3577
    };
3578
    var getFirst = function (component, hConfig, _hState) {
637 daniel-mar 3579
      return descendant(component.element, '.' + hConfig.itemClass).bind(function (e) {
597 daniel-mar 3580
        return component.getSystem().getByDom(e).toOptional();
3581
      });
3582
    };
3583
    var getLast = function (component, hConfig, _hState) {
3584
      var items = descendants(component.element, '.' + hConfig.itemClass);
3585
      var last = items.length > 0 ? Optional.some(items[items.length - 1]) : Optional.none();
3586
      return last.bind(function (c) {
3587
        return component.getSystem().getByDom(c).toOptional();
3588
      });
3589
    };
3590
    var getDelta = function (component, hConfig, hState, delta) {
3591
      var items = descendants(component.element, '.' + hConfig.itemClass);
637 daniel-mar 3592
      var current = findIndex$1(items, function (item) {
3593
        return has(item, hConfig.highlightClass);
597 daniel-mar 3594
      });
3595
      return current.bind(function (selected) {
3596
        var dest = cycleBy(selected, delta, 0, items.length - 1);
3597
        return component.getSystem().getByDom(items[dest]).toOptional();
3598
      });
3599
    };
3600
    var getPrevious = function (component, hConfig, hState) {
3601
      return getDelta(component, hConfig, hState, -1);
3602
    };
3603
    var getNext = function (component, hConfig, hState) {
3604
      return getDelta(component, hConfig, hState, +1);
3605
    };
3606
    var getCandidates = function (component, hConfig, _hState) {
3607
      var items = descendants(component.element, '.' + hConfig.itemClass);
637 daniel-mar 3608
      return cat(map$2(items, function (i) {
597 daniel-mar 3609
        return component.getSystem().getByDom(i).toOptional();
3610
      }));
3611
    };
3612
 
3613
    var HighlightApis = /*#__PURE__*/Object.freeze({
3614
        __proto__: null,
3615
        dehighlightAll: dehighlightAll,
637 daniel-mar 3616
        dehighlight: dehighlight,
3617
        highlight: highlight,
597 daniel-mar 3618
        highlightFirst: highlightFirst,
3619
        highlightLast: highlightLast,
3620
        highlightAt: highlightAt,
3621
        highlightBy: highlightBy,
3622
        isHighlighted: isHighlighted,
3623
        getHighlighted: getHighlighted,
3624
        getFirst: getFirst,
3625
        getLast: getLast,
3626
        getPrevious: getPrevious,
3627
        getNext: getNext,
3628
        getCandidates: getCandidates
3629
    });
3630
 
3631
    var HighlightSchema = [
637 daniel-mar 3632
      required$1('highlightClass'),
3633
      required$1('itemClass'),
597 daniel-mar 3634
      onHandler('onHighlight'),
3635
      onHandler('onDehighlight')
3636
    ];
3637
 
637 daniel-mar 3638
    var Highlighting = create$5({
597 daniel-mar 3639
      fields: HighlightSchema,
3640
      name: 'highlighting',
3641
      apis: HighlightApis
3642
    });
3643
 
3644
    var reportFocusShifting = function (component, prevFocus, newFocus) {
3645
      var noChange = prevFocus.exists(function (p) {
3646
        return newFocus.exists(function (n) {
3647
          return eq(n, p);
3648
        });
3649
      });
3650
      if (!noChange) {
3651
        emitWith(component, focusShifted(), {
3652
          prevFocus: prevFocus,
3653
          newFocus: newFocus
3654
        });
3655
      }
3656
    };
637 daniel-mar 3657
    var dom$2 = function () {
597 daniel-mar 3658
      var get = function (component) {
3659
        return search(component.element);
3660
      };
3661
      var set = function (component, focusee) {
3662
        var prevFocus = get(component);
3663
        component.getSystem().triggerFocus(focusee, component.element);
3664
        var newFocus = get(component);
3665
        reportFocusShifting(component, prevFocus, newFocus);
3666
      };
3667
      return {
3668
        get: get,
3669
        set: set
3670
      };
3671
    };
3672
    var highlights = function () {
3673
      var get = function (component) {
3674
        return Highlighting.getHighlighted(component).map(function (item) {
3675
          return item.element;
3676
        });
3677
      };
3678
      var set = function (component, element) {
3679
        var prevFocus = get(component);
3680
        component.getSystem().getByDom(element).fold(noop, function (item) {
3681
          Highlighting.highlight(component, item);
3682
        });
3683
        var newFocus = get(component);
3684
        reportFocusShifting(component, prevFocus, newFocus);
3685
      };
3686
      return {
3687
        get: get,
3688
        set: set
3689
      };
3690
    };
3691
 
3692
    var FocusInsideModes;
3693
    (function (FocusInsideModes) {
3694
      FocusInsideModes['OnFocusMode'] = 'onFocus';
3695
      FocusInsideModes['OnEnterOrSpaceMode'] = 'onEnterOrSpace';
3696
      FocusInsideModes['OnApiMode'] = 'onApi';
3697
    }(FocusInsideModes || (FocusInsideModes = {})));
3698
 
3699
    var typical = function (infoSchema, stateInit, getKeydownRules, getKeyupRules, optFocusIn) {
3700
      var schema = function () {
3701
        return infoSchema.concat([
637 daniel-mar 3702
          defaulted('focusManager', dom$2()),
597 daniel-mar 3703
          defaultedOf('focusInside', 'onFocus', valueOf(function (val) {
637 daniel-mar 3704
            return contains$1([
597 daniel-mar 3705
              'onFocus',
3706
              'onEnterOrSpace',
3707
              'onApi'
3708
            ], val) ? Result.value(val) : Result.error('Invalid value for focusInside');
3709
          })),
3710
          output('handler', me),
3711
          output('state', stateInit),
3712
          output('sendFocusIn', optFocusIn)
3713
        ]);
3714
      };
3715
      var processKey = function (component, simulatedEvent, getRules, keyingConfig, keyingState) {
3716
        var rules = getRules(component, simulatedEvent, keyingConfig, keyingState);
637 daniel-mar 3717
        return choose(rules, simulatedEvent.event).bind(function (rule) {
597 daniel-mar 3718
          return rule(component, simulatedEvent, keyingConfig, keyingState);
3719
        });
3720
      };
3721
      var toEvents = function (keyingConfig, keyingState) {
3722
        var onFocusHandler = keyingConfig.focusInside !== FocusInsideModes.OnFocusMode ? Optional.none() : optFocusIn(keyingConfig).map(function (focusIn) {
637 daniel-mar 3723
          return run(focus$4(), function (component, simulatedEvent) {
597 daniel-mar 3724
            focusIn(component, keyingConfig, keyingState);
3725
            simulatedEvent.stop();
3726
          });
3727
        });
3728
        var tryGoInsideComponent = function (component, simulatedEvent) {
3729
          var isEnterOrSpace = inSet(SPACE.concat(ENTER))(simulatedEvent.event);
3730
          if (keyingConfig.focusInside === FocusInsideModes.OnEnterOrSpaceMode && isEnterOrSpace && isSource(component, simulatedEvent)) {
3731
            optFocusIn(keyingConfig).each(function (focusIn) {
3732
              focusIn(component, keyingConfig, keyingState);
3733
              simulatedEvent.stop();
3734
            });
3735
          }
3736
        };
3737
        var keyboardEvents = [
3738
          run(keydown(), function (component, simulatedEvent) {
3739
            processKey(component, simulatedEvent, getKeydownRules, keyingConfig, keyingState).fold(function () {
3740
              tryGoInsideComponent(component, simulatedEvent);
3741
            }, function (_) {
3742
              simulatedEvent.stop();
3743
            });
3744
          }),
3745
          run(keyup(), function (component, simulatedEvent) {
3746
            processKey(component, simulatedEvent, getKeyupRules, keyingConfig, keyingState).each(function (_) {
3747
              simulatedEvent.stop();
3748
            });
3749
          })
3750
        ];
637 daniel-mar 3751
        return derive$3(onFocusHandler.toArray().concat(keyboardEvents));
597 daniel-mar 3752
      };
3753
      var me = {
3754
        schema: schema,
3755
        processKey: processKey,
3756
        toEvents: toEvents
3757
      };
3758
      return me;
3759
    };
3760
 
637 daniel-mar 3761
    var create$4 = function (cyclicField) {
597 daniel-mar 3762
      var schema = [
3763
        option('onEscape'),
3764
        option('onEnter'),
637 daniel-mar 3765
        defaulted('selector', '[data-alloy-tabstop="true"]:not(:disabled)'),
3766
        defaulted('firstTabstop', 0),
3767
        defaulted('useTabstopAt', always),
597 daniel-mar 3768
        option('visibilitySelector')
3769
      ].concat([cyclicField]);
3770
      var isVisible = function (tabbingConfig, element) {
3771
        var target = tabbingConfig.visibilitySelector.bind(function (sel) {
637 daniel-mar 3772
          return closest$1(element, sel);
597 daniel-mar 3773
        }).getOr(element);
637 daniel-mar 3774
        return get$7(target) > 0;
597 daniel-mar 3775
      };
3776
      var findInitial = function (component, tabbingConfig) {
3777
        var tabstops = descendants(component.element, tabbingConfig.selector);
637 daniel-mar 3778
        var visibles = filter$2(tabstops, function (elem) {
597 daniel-mar 3779
          return isVisible(tabbingConfig, elem);
3780
        });
3781
        return Optional.from(visibles[tabbingConfig.firstTabstop]);
3782
      };
3783
      var findCurrent = function (component, tabbingConfig) {
3784
        return tabbingConfig.focusManager.get(component).bind(function (elem) {
637 daniel-mar 3785
          return closest$1(elem, tabbingConfig.selector);
597 daniel-mar 3786
        });
3787
      };
3788
      var isTabstop = function (tabbingConfig, element) {
3789
        return isVisible(tabbingConfig, element) && tabbingConfig.useTabstopAt(element);
3790
      };
3791
      var focusIn = function (component, tabbingConfig, _tabbingState) {
3792
        findInitial(component, tabbingConfig).each(function (target) {
3793
          tabbingConfig.focusManager.set(component, target);
3794
        });
3795
      };
3796
      var goFromTabstop = function (component, tabstops, stopIndex, tabbingConfig, cycle) {
3797
        return cycle(tabstops, stopIndex, function (elem) {
3798
          return isTabstop(tabbingConfig, elem);
3799
        }).fold(function () {
3800
          return tabbingConfig.cyclic ? Optional.some(true) : Optional.none();
3801
        }, function (target) {
3802
          tabbingConfig.focusManager.set(component, target);
3803
          return Optional.some(true);
3804
        });
3805
      };
3806
      var go = function (component, _simulatedEvent, tabbingConfig, cycle) {
3807
        var tabstops = descendants(component.element, tabbingConfig.selector);
3808
        return findCurrent(component, tabbingConfig).bind(function (tabstop) {
637 daniel-mar 3809
          var optStopIndex = findIndex$1(tabstops, curry(eq, tabstop));
597 daniel-mar 3810
          return optStopIndex.bind(function (stopIndex) {
3811
            return goFromTabstop(component, tabstops, stopIndex, tabbingConfig, cycle);
3812
          });
3813
        });
3814
      };
3815
      var goBackwards = function (component, simulatedEvent, tabbingConfig) {
3816
        var navigate = tabbingConfig.cyclic ? cyclePrev : tryPrev;
3817
        return go(component, simulatedEvent, tabbingConfig, navigate);
3818
      };
3819
      var goForwards = function (component, simulatedEvent, tabbingConfig) {
3820
        var navigate = tabbingConfig.cyclic ? cycleNext : tryNext;
3821
        return go(component, simulatedEvent, tabbingConfig, navigate);
3822
      };
3823
      var execute = function (component, simulatedEvent, tabbingConfig) {
3824
        return tabbingConfig.onEnter.bind(function (f) {
3825
          return f(component, simulatedEvent);
3826
        });
3827
      };
3828
      var exit = function (component, simulatedEvent, tabbingConfig) {
3829
        return tabbingConfig.onEscape.bind(function (f) {
3830
          return f(component, simulatedEvent);
3831
        });
3832
      };
637 daniel-mar 3833
      var getKeydownRules = constant$1([
597 daniel-mar 3834
        rule(and([
3835
          isShift,
3836
          inSet(TAB)
3837
        ]), goBackwards),
3838
        rule(inSet(TAB), goForwards),
3839
        rule(inSet(ESCAPE), exit),
3840
        rule(and([
3841
          isNotShift,
3842
          inSet(ENTER)
3843
        ]), execute)
3844
      ]);
637 daniel-mar 3845
      var getKeyupRules = constant$1([]);
597 daniel-mar 3846
      return typical(schema, NoState.init, getKeydownRules, getKeyupRules, function () {
3847
        return Optional.some(focusIn);
3848
      });
3849
    };
3850
 
637 daniel-mar 3851
    var AcyclicType = create$4(customField('cyclic', never));
597 daniel-mar 3852
 
637 daniel-mar 3853
    var CyclicType = create$4(customField('cyclic', always));
597 daniel-mar 3854
 
3855
    var inside = function (target) {
637 daniel-mar 3856
      return name$1(target) === 'input' && get$b(target, 'type') !== 'radio' || name$1(target) === 'textarea';
597 daniel-mar 3857
    };
3858
 
3859
    var doDefaultExecute = function (component, _simulatedEvent, focused) {
637 daniel-mar 3860
      dispatch(component, focused, execute$5());
597 daniel-mar 3861
      return Optional.some(true);
3862
    };
3863
    var defaultExecute = function (component, simulatedEvent, focused) {
3864
      var isComplex = inside(focused) && inSet(SPACE)(simulatedEvent.event);
3865
      return isComplex ? Optional.none() : doDefaultExecute(component, simulatedEvent, focused);
3866
    };
3867
    var stopEventForFirefox = function (_component, _simulatedEvent) {
3868
      return Optional.some(true);
3869
    };
3870
 
637 daniel-mar 3871
    var schema$f = [
3872
      defaulted('execute', defaultExecute),
3873
      defaulted('useSpace', false),
3874
      defaulted('useEnter', true),
3875
      defaulted('useControlEnter', false),
3876
      defaulted('useDown', false)
597 daniel-mar 3877
    ];
637 daniel-mar 3878
    var execute$4 = function (component, simulatedEvent, executeConfig) {
597 daniel-mar 3879
      return executeConfig.execute(component, simulatedEvent, component.element);
3880
    };
637 daniel-mar 3881
    var getKeydownRules$5 = function (component, _simulatedEvent, executeConfig, _executeState) {
597 daniel-mar 3882
      var spaceExec = executeConfig.useSpace && !inside(component.element) ? SPACE : [];
3883
      var enterExec = executeConfig.useEnter ? ENTER : [];
3884
      var downExec = executeConfig.useDown ? DOWN : [];
3885
      var execKeys = spaceExec.concat(enterExec).concat(downExec);
637 daniel-mar 3886
      return [rule(inSet(execKeys), execute$4)].concat(executeConfig.useControlEnter ? [rule(and([
597 daniel-mar 3887
          isControl,
3888
          inSet(ENTER)
637 daniel-mar 3889
        ]), execute$4)] : []);
597 daniel-mar 3890
    };
637 daniel-mar 3891
    var getKeyupRules$5 = function (component, _simulatedEvent, executeConfig, _executeState) {
597 daniel-mar 3892
      return executeConfig.useSpace && !inside(component.element) ? [rule(inSet(SPACE), stopEventForFirefox)] : [];
3893
    };
637 daniel-mar 3894
    var ExecutionType = typical(schema$f, NoState.init, getKeydownRules$5, getKeyupRules$5, function () {
597 daniel-mar 3895
      return Optional.none();
3896
    });
3897
 
637 daniel-mar 3898
    var singleton$1 = function (doRevoke) {
3899
      var subject = Cell(Optional.none());
3900
      var revoke = function () {
3901
        return subject.get().each(doRevoke);
3902
      };
3903
      var clear = function () {
3904
        revoke();
3905
        subject.set(Optional.none());
3906
      };
3907
      var isSet = function () {
3908
        return subject.get().isSome();
3909
      };
3910
      var get = function () {
3911
        return subject.get();
3912
      };
3913
      var set = function (s) {
3914
        revoke();
3915
        subject.set(Optional.some(s));
3916
      };
3917
      return {
3918
        clear: clear,
3919
        isSet: isSet,
3920
        get: get,
3921
        set: set
3922
      };
3923
    };
3924
    var destroyable = function () {
3925
      return singleton$1(function (s) {
3926
        return s.destroy();
3927
      });
3928
    };
3929
    var api$2 = function () {
3930
      var subject = destroyable();
3931
      var run = function (f) {
3932
        return subject.get().each(f);
3933
      };
3934
      return __assign(__assign({}, subject), { run: run });
3935
    };
3936
    var value = function () {
3937
      var subject = singleton$1(noop);
3938
      var on = function (f) {
3939
        return subject.get().each(f);
3940
      };
3941
      return __assign(__assign({}, subject), { on: on });
3942
    };
3943
 
3944
    var flatgrid$1 = function () {
3945
      var dimensions = value();
597 daniel-mar 3946
      var setGridSize = function (numRows, numColumns) {
637 daniel-mar 3947
        dimensions.set({
597 daniel-mar 3948
          numRows: numRows,
3949
          numColumns: numColumns
637 daniel-mar 3950
        });
597 daniel-mar 3951
      };
3952
      var getNumRows = function () {
3953
        return dimensions.get().map(function (d) {
3954
          return d.numRows;
3955
        });
3956
      };
3957
      var getNumColumns = function () {
3958
        return dimensions.get().map(function (d) {
3959
          return d.numColumns;
3960
        });
3961
      };
637 daniel-mar 3962
      return nu$2({
597 daniel-mar 3963
        readState: function () {
3964
          return dimensions.get().map(function (d) {
3965
            return {
3966
              numRows: String(d.numRows),
3967
              numColumns: String(d.numColumns)
3968
            };
3969
          }).getOr({
3970
            numRows: '?',
3971
            numColumns: '?'
3972
          });
3973
        },
3974
        setGridSize: setGridSize,
3975
        getNumRows: getNumRows,
3976
        getNumColumns: getNumColumns
3977
      });
3978
    };
637 daniel-mar 3979
    var init$5 = function (spec) {
597 daniel-mar 3980
      return spec.state(spec);
3981
    };
3982
 
3983
    var KeyingState = /*#__PURE__*/Object.freeze({
3984
        __proto__: null,
637 daniel-mar 3985
        flatgrid: flatgrid$1,
3986
        init: init$5
597 daniel-mar 3987
    });
3988
 
3989
    var onDirection = function (isLtr, isRtl) {
3990
      return function (element) {
3991
        return getDirection(element) === 'rtl' ? isRtl : isLtr;
3992
      };
3993
    };
3994
    var getDirection = function (element) {
637 daniel-mar 3995
      return get$8(element, 'direction') === 'rtl' ? 'rtl' : 'ltr';
597 daniel-mar 3996
    };
3997
 
3998
    var useH = function (movement) {
3999
      return function (component, simulatedEvent, config, state) {
4000
        var move = movement(component.element);
4001
        return use(move, component, simulatedEvent, config, state);
4002
      };
4003
    };
4004
    var west = function (moveLeft, moveRight) {
4005
      var movement = onDirection(moveLeft, moveRight);
4006
      return useH(movement);
4007
    };
4008
    var east = function (moveLeft, moveRight) {
4009
      var movement = onDirection(moveRight, moveLeft);
4010
      return useH(movement);
4011
    };
4012
    var useV = function (move) {
4013
      return function (component, simulatedEvent, config, state) {
4014
        return use(move, component, simulatedEvent, config, state);
4015
      };
4016
    };
4017
    var use = function (move, component, simulatedEvent, config, state) {
4018
      var outcome = config.focusManager.get(component).bind(function (focused) {
4019
        return move(component.element, focused, config, state);
4020
      });
4021
      return outcome.map(function (newFocus) {
4022
        config.focusManager.set(component, newFocus);
4023
        return true;
4024
      });
4025
    };
4026
    var north = useV;
4027
    var south = useV;
637 daniel-mar 4028
    var move$1 = useV;
597 daniel-mar 4029
 
4030
    var isHidden = function (dom) {
4031
      return dom.offsetWidth <= 0 && dom.offsetHeight <= 0;
4032
    };
4033
    var isVisible = function (element) {
4034
      return !isHidden(element.dom);
4035
    };
4036
 
4037
    var locate = function (candidates, predicate) {
637 daniel-mar 4038
      return findIndex$1(candidates, predicate).map(function (index) {
597 daniel-mar 4039
        return {
4040
          index: index,
4041
          candidates: candidates
4042
        };
4043
      });
4044
    };
4045
 
4046
    var locateVisible = function (container, current, selector) {
4047
      var predicate = function (x) {
4048
        return eq(x, current);
4049
      };
4050
      var candidates = descendants(container, selector);
637 daniel-mar 4051
      var visible = filter$2(candidates, isVisible);
597 daniel-mar 4052
      return locate(visible, predicate);
4053
    };
637 daniel-mar 4054
    var findIndex = function (elements, target) {
4055
      return findIndex$1(elements, function (elem) {
597 daniel-mar 4056
        return eq(target, elem);
4057
      });
4058
    };
4059
 
4060
    var withGrid = function (values, index, numCols, f) {
4061
      var oldRow = Math.floor(index / numCols);
4062
      var oldColumn = index % numCols;
4063
      return f(oldRow, oldColumn).bind(function (address) {
4064
        var newIndex = address.row * numCols + address.column;
4065
        return newIndex >= 0 && newIndex < values.length ? Optional.some(values[newIndex]) : Optional.none();
4066
      });
4067
    };
637 daniel-mar 4068
    var cycleHorizontal$1 = function (values, index, numRows, numCols, delta) {
597 daniel-mar 4069
      return withGrid(values, index, numCols, function (oldRow, oldColumn) {
4070
        var onLastRow = oldRow === numRows - 1;
4071
        var colsInRow = onLastRow ? values.length - oldRow * numCols : numCols;
4072
        var newColumn = cycleBy(oldColumn, delta, 0, colsInRow - 1);
4073
        return Optional.some({
4074
          row: oldRow,
4075
          column: newColumn
4076
        });
4077
      });
4078
    };
637 daniel-mar 4079
    var cycleVertical$1 = function (values, index, numRows, numCols, delta) {
597 daniel-mar 4080
      return withGrid(values, index, numCols, function (oldRow, oldColumn) {
4081
        var newRow = cycleBy(oldRow, delta, 0, numRows - 1);
4082
        var onLastRow = newRow === numRows - 1;
4083
        var colsInRow = onLastRow ? values.length - newRow * numCols : numCols;
4084
        var newCol = clamp(oldColumn, 0, colsInRow - 1);
4085
        return Optional.some({
4086
          row: newRow,
4087
          column: newCol
4088
        });
4089
      });
4090
    };
637 daniel-mar 4091
    var cycleRight$1 = function (values, index, numRows, numCols) {
4092
      return cycleHorizontal$1(values, index, numRows, numCols, +1);
597 daniel-mar 4093
    };
637 daniel-mar 4094
    var cycleLeft$1 = function (values, index, numRows, numCols) {
4095
      return cycleHorizontal$1(values, index, numRows, numCols, -1);
597 daniel-mar 4096
    };
637 daniel-mar 4097
    var cycleUp$1 = function (values, index, numRows, numCols) {
4098
      return cycleVertical$1(values, index, numRows, numCols, -1);
597 daniel-mar 4099
    };
637 daniel-mar 4100
    var cycleDown$1 = function (values, index, numRows, numCols) {
4101
      return cycleVertical$1(values, index, numRows, numCols, +1);
597 daniel-mar 4102
    };
4103
 
637 daniel-mar 4104
    var schema$e = [
4105
      required$1('selector'),
4106
      defaulted('execute', defaultExecute),
597 daniel-mar 4107
      onKeyboardHandler('onEscape'),
637 daniel-mar 4108
      defaulted('captureTab', false),
597 daniel-mar 4109
      initSize()
4110
    ];
637 daniel-mar 4111
    var focusIn$3 = function (component, gridConfig, _gridState) {
4112
      descendant(component.element, gridConfig.selector).each(function (first) {
597 daniel-mar 4113
        gridConfig.focusManager.set(component, first);
4114
      });
4115
    };
637 daniel-mar 4116
    var findCurrent$1 = function (component, gridConfig) {
597 daniel-mar 4117
      return gridConfig.focusManager.get(component).bind(function (elem) {
637 daniel-mar 4118
        return closest$1(elem, gridConfig.selector);
597 daniel-mar 4119
      });
4120
    };
637 daniel-mar 4121
    var execute$3 = function (component, simulatedEvent, gridConfig, _gridState) {
4122
      return findCurrent$1(component, gridConfig).bind(function (focused) {
597 daniel-mar 4123
        return gridConfig.execute(component, simulatedEvent, focused);
4124
      });
4125
    };
637 daniel-mar 4126
    var doMove$2 = function (cycle) {
597 daniel-mar 4127
      return function (element, focused, gridConfig, gridState) {
4128
        return locateVisible(element, focused, gridConfig.selector).bind(function (identified) {
4129
          return cycle(identified.candidates, identified.index, gridState.getNumRows().getOr(gridConfig.initSize.numRows), gridState.getNumColumns().getOr(gridConfig.initSize.numColumns));
4130
        });
4131
      };
4132
    };
4133
    var handleTab = function (_component, _simulatedEvent, gridConfig) {
4134
      return gridConfig.captureTab ? Optional.some(true) : Optional.none();
4135
    };
637 daniel-mar 4136
    var doEscape$1 = function (component, simulatedEvent, gridConfig) {
597 daniel-mar 4137
      return gridConfig.onEscape(component, simulatedEvent);
4138
    };
637 daniel-mar 4139
    var moveLeft$3 = doMove$2(cycleLeft$1);
4140
    var moveRight$3 = doMove$2(cycleRight$1);
4141
    var moveNorth$1 = doMove$2(cycleUp$1);
4142
    var moveSouth$1 = doMove$2(cycleDown$1);
4143
    var getKeydownRules$4 = constant$1([
4144
      rule(inSet(LEFT), west(moveLeft$3, moveRight$3)),
4145
      rule(inSet(RIGHT), east(moveLeft$3, moveRight$3)),
4146
      rule(inSet(UP), north(moveNorth$1)),
4147
      rule(inSet(DOWN), south(moveSouth$1)),
597 daniel-mar 4148
      rule(and([
4149
        isShift,
4150
        inSet(TAB)
4151
      ]), handleTab),
4152
      rule(and([
4153
        isNotShift,
4154
        inSet(TAB)
4155
      ]), handleTab),
637 daniel-mar 4156
      rule(inSet(ESCAPE), doEscape$1),
4157
      rule(inSet(SPACE.concat(ENTER)), execute$3)
597 daniel-mar 4158
    ]);
637 daniel-mar 4159
    var getKeyupRules$4 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);
4160
    var FlatgridType = typical(schema$e, flatgrid$1, getKeydownRules$4, getKeyupRules$4, function () {
4161
      return Optional.some(focusIn$3);
597 daniel-mar 4162
    });
4163
 
4164
    var horizontal = function (container, selector, current, delta) {
4165
      var isDisabledButton = function (candidate) {
637 daniel-mar 4166
        return name$1(candidate) === 'button' && get$b(candidate, 'disabled') === 'disabled';
597 daniel-mar 4167
      };
4168
      var tryCycle = function (initial, index, candidates) {
4169
        var newIndex = cycleBy(index, delta, 0, candidates.length - 1);
4170
        if (newIndex === initial) {
4171
          return Optional.none();
4172
        } else {
4173
          return isDisabledButton(candidates[newIndex]) ? tryCycle(initial, newIndex, candidates) : Optional.from(candidates[newIndex]);
4174
        }
4175
      };
4176
      return locateVisible(container, current, selector).bind(function (identified) {
4177
        var index = identified.index;
4178
        var candidates = identified.candidates;
4179
        return tryCycle(index, index, candidates);
4180
      });
4181
    };
4182
 
637 daniel-mar 4183
    var schema$d = [
4184
      required$1('selector'),
4185
      defaulted('getInitial', Optional.none),
4186
      defaulted('execute', defaultExecute),
597 daniel-mar 4187
      onKeyboardHandler('onEscape'),
637 daniel-mar 4188
      defaulted('executeOnMove', false),
4189
      defaulted('allowVertical', true)
597 daniel-mar 4190
    ];
637 daniel-mar 4191
    var findCurrent = function (component, flowConfig) {
597 daniel-mar 4192
      return flowConfig.focusManager.get(component).bind(function (elem) {
637 daniel-mar 4193
        return closest$1(elem, flowConfig.selector);
597 daniel-mar 4194
      });
4195
    };
637 daniel-mar 4196
    var execute$2 = function (component, simulatedEvent, flowConfig) {
4197
      return findCurrent(component, flowConfig).bind(function (focused) {
597 daniel-mar 4198
        return flowConfig.execute(component, simulatedEvent, focused);
4199
      });
4200
    };
637 daniel-mar 4201
    var focusIn$2 = function (component, flowConfig, _state) {
597 daniel-mar 4202
      flowConfig.getInitial(component).orThunk(function () {
637 daniel-mar 4203
        return descendant(component.element, flowConfig.selector);
597 daniel-mar 4204
      }).each(function (first) {
4205
        flowConfig.focusManager.set(component, first);
4206
      });
4207
    };
637 daniel-mar 4208
    var moveLeft$2 = function (element, focused, info) {
597 daniel-mar 4209
      return horizontal(element, info.selector, focused, -1);
4210
    };
637 daniel-mar 4211
    var moveRight$2 = function (element, focused, info) {
597 daniel-mar 4212
      return horizontal(element, info.selector, focused, +1);
4213
    };
4214
    var doMove$1 = function (movement) {
4215
      return function (component, simulatedEvent, flowConfig, flowState) {
4216
        return movement(component, simulatedEvent, flowConfig, flowState).bind(function () {
637 daniel-mar 4217
          return flowConfig.executeOnMove ? execute$2(component, simulatedEvent, flowConfig) : Optional.some(true);
597 daniel-mar 4218
        });
4219
      };
4220
    };
637 daniel-mar 4221
    var doEscape = function (component, simulatedEvent, flowConfig) {
597 daniel-mar 4222
      return flowConfig.onEscape(component, simulatedEvent);
4223
    };
637 daniel-mar 4224
    var getKeydownRules$3 = function (_component, _se, flowConfig, _flowState) {
597 daniel-mar 4225
      var westMovers = LEFT.concat(flowConfig.allowVertical ? UP : []);
4226
      var eastMovers = RIGHT.concat(flowConfig.allowVertical ? DOWN : []);
4227
      return [
637 daniel-mar 4228
        rule(inSet(westMovers), doMove$1(west(moveLeft$2, moveRight$2))),
4229
        rule(inSet(eastMovers), doMove$1(east(moveLeft$2, moveRight$2))),
4230
        rule(inSet(ENTER), execute$2),
4231
        rule(inSet(SPACE), execute$2),
4232
        rule(inSet(ESCAPE), doEscape)
597 daniel-mar 4233
      ];
4234
    };
637 daniel-mar 4235
    var getKeyupRules$3 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);
4236
    var FlowType = typical(schema$d, NoState.init, getKeydownRules$3, getKeyupRules$3, function () {
4237
      return Optional.some(focusIn$2);
597 daniel-mar 4238
    });
4239
 
4240
    var toCell = function (matrix, rowIndex, columnIndex) {
4241
      return Optional.from(matrix[rowIndex]).bind(function (row) {
4242
        return Optional.from(row[columnIndex]).map(function (cell) {
4243
          return {
4244
            rowIndex: rowIndex,
4245
            columnIndex: columnIndex,
4246
            cell: cell
4247
          };
4248
        });
4249
      });
4250
    };
637 daniel-mar 4251
    var cycleHorizontal = function (matrix, rowIndex, startCol, deltaCol) {
597 daniel-mar 4252
      var row = matrix[rowIndex];
4253
      var colsInRow = row.length;
4254
      var newColIndex = cycleBy(startCol, deltaCol, 0, colsInRow - 1);
4255
      return toCell(matrix, rowIndex, newColIndex);
4256
    };
637 daniel-mar 4257
    var cycleVertical = function (matrix, colIndex, startRow, deltaRow) {
597 daniel-mar 4258
      var nextRowIndex = cycleBy(startRow, deltaRow, 0, matrix.length - 1);
4259
      var colsInNextRow = matrix[nextRowIndex].length;
4260
      var nextColIndex = clamp(colIndex, 0, colsInNextRow - 1);
4261
      return toCell(matrix, nextRowIndex, nextColIndex);
4262
    };
4263
    var moveHorizontal = function (matrix, rowIndex, startCol, deltaCol) {
4264
      var row = matrix[rowIndex];
4265
      var colsInRow = row.length;
4266
      var newColIndex = clamp(startCol + deltaCol, 0, colsInRow - 1);
4267
      return toCell(matrix, rowIndex, newColIndex);
4268
    };
4269
    var moveVertical = function (matrix, colIndex, startRow, deltaRow) {
4270
      var nextRowIndex = clamp(startRow + deltaRow, 0, matrix.length - 1);
4271
      var colsInNextRow = matrix[nextRowIndex].length;
4272
      var nextColIndex = clamp(colIndex, 0, colsInNextRow - 1);
4273
      return toCell(matrix, nextRowIndex, nextColIndex);
4274
    };
637 daniel-mar 4275
    var cycleRight = function (matrix, startRow, startCol) {
4276
      return cycleHorizontal(matrix, startRow, startCol, +1);
597 daniel-mar 4277
    };
637 daniel-mar 4278
    var cycleLeft = function (matrix, startRow, startCol) {
4279
      return cycleHorizontal(matrix, startRow, startCol, -1);
597 daniel-mar 4280
    };
637 daniel-mar 4281
    var cycleUp = function (matrix, startRow, startCol) {
4282
      return cycleVertical(matrix, startCol, startRow, -1);
597 daniel-mar 4283
    };
637 daniel-mar 4284
    var cycleDown = function (matrix, startRow, startCol) {
4285
      return cycleVertical(matrix, startCol, startRow, +1);
597 daniel-mar 4286
    };
637 daniel-mar 4287
    var moveLeft$1 = function (matrix, startRow, startCol) {
597 daniel-mar 4288
      return moveHorizontal(matrix, startRow, startCol, -1);
4289
    };
637 daniel-mar 4290
    var moveRight$1 = function (matrix, startRow, startCol) {
597 daniel-mar 4291
      return moveHorizontal(matrix, startRow, startCol, +1);
4292
    };
637 daniel-mar 4293
    var moveUp$1 = function (matrix, startRow, startCol) {
597 daniel-mar 4294
      return moveVertical(matrix, startCol, startRow, -1);
4295
    };
637 daniel-mar 4296
    var moveDown$1 = function (matrix, startRow, startCol) {
597 daniel-mar 4297
      return moveVertical(matrix, startCol, startRow, +1);
4298
    };
4299
 
637 daniel-mar 4300
    var schema$c = [
4301
      requiredObjOf('selectors', [
4302
        required$1('row'),
4303
        required$1('cell')
597 daniel-mar 4304
      ]),
637 daniel-mar 4305
      defaulted('cycles', true),
4306
      defaulted('previousSelector', Optional.none),
4307
      defaulted('execute', defaultExecute)
597 daniel-mar 4308
    ];
637 daniel-mar 4309
    var focusIn$1 = function (component, matrixConfig, _state) {
597 daniel-mar 4310
      var focused = matrixConfig.previousSelector(component).orThunk(function () {
4311
        var selectors = matrixConfig.selectors;
637 daniel-mar 4312
        return descendant(component.element, selectors.cell);
597 daniel-mar 4313
      });
4314
      focused.each(function (cell) {
4315
        matrixConfig.focusManager.set(component, cell);
4316
      });
4317
    };
637 daniel-mar 4318
    var execute$1 = function (component, simulatedEvent, matrixConfig) {
597 daniel-mar 4319
      return search(component.element).bind(function (focused) {
4320
        return matrixConfig.execute(component, simulatedEvent, focused);
4321
      });
4322
    };
4323
    var toMatrix = function (rows, matrixConfig) {
637 daniel-mar 4324
      return map$2(rows, function (row) {
597 daniel-mar 4325
        return descendants(row, matrixConfig.selectors.cell);
4326
      });
4327
    };
637 daniel-mar 4328
    var doMove = function (ifCycle, ifMove) {
597 daniel-mar 4329
      return function (element, focused, matrixConfig) {
4330
        var move = matrixConfig.cycles ? ifCycle : ifMove;
637 daniel-mar 4331
        return closest$1(focused, matrixConfig.selectors.row).bind(function (inRow) {
597 daniel-mar 4332
          var cellsInRow = descendants(inRow, matrixConfig.selectors.cell);
637 daniel-mar 4333
          return findIndex(cellsInRow, focused).bind(function (colIndex) {
597 daniel-mar 4334
            var allRows = descendants(element, matrixConfig.selectors.row);
637 daniel-mar 4335
            return findIndex(allRows, inRow).bind(function (rowIndex) {
597 daniel-mar 4336
              var matrix = toMatrix(allRows, matrixConfig);
4337
              return move(matrix, rowIndex, colIndex).map(function (next) {
4338
                return next.cell;
4339
              });
4340
            });
4341
          });
4342
        });
4343
      };
4344
    };
637 daniel-mar 4345
    var moveLeft = doMove(cycleLeft, moveLeft$1);
4346
    var moveRight = doMove(cycleRight, moveRight$1);
4347
    var moveNorth = doMove(cycleUp, moveUp$1);
4348
    var moveSouth = doMove(cycleDown, moveDown$1);
4349
    var getKeydownRules$2 = constant$1([
4350
      rule(inSet(LEFT), west(moveLeft, moveRight)),
4351
      rule(inSet(RIGHT), east(moveLeft, moveRight)),
4352
      rule(inSet(UP), north(moveNorth)),
4353
      rule(inSet(DOWN), south(moveSouth)),
4354
      rule(inSet(SPACE.concat(ENTER)), execute$1)
597 daniel-mar 4355
    ]);
637 daniel-mar 4356
    var getKeyupRules$2 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);
4357
    var MatrixType = typical(schema$c, NoState.init, getKeydownRules$2, getKeyupRules$2, function () {
4358
      return Optional.some(focusIn$1);
597 daniel-mar 4359
    });
4360
 
637 daniel-mar 4361
    var schema$b = [
4362
      required$1('selector'),
4363
      defaulted('execute', defaultExecute),
4364
      defaulted('moveOnTab', false)
597 daniel-mar 4365
    ];
637 daniel-mar 4366
    var execute = function (component, simulatedEvent, menuConfig) {
597 daniel-mar 4367
      return menuConfig.focusManager.get(component).bind(function (focused) {
4368
        return menuConfig.execute(component, simulatedEvent, focused);
4369
      });
4370
    };
637 daniel-mar 4371
    var focusIn = function (component, menuConfig, _state) {
4372
      descendant(component.element, menuConfig.selector).each(function (first) {
597 daniel-mar 4373
        menuConfig.focusManager.set(component, first);
4374
      });
4375
    };
637 daniel-mar 4376
    var moveUp = function (element, focused, info) {
597 daniel-mar 4377
      return horizontal(element, info.selector, focused, -1);
4378
    };
637 daniel-mar 4379
    var moveDown = function (element, focused, info) {
597 daniel-mar 4380
      return horizontal(element, info.selector, focused, +1);
4381
    };
4382
    var fireShiftTab = function (component, simulatedEvent, menuConfig, menuState) {
637 daniel-mar 4383
      return menuConfig.moveOnTab ? move$1(moveUp)(component, simulatedEvent, menuConfig, menuState) : Optional.none();
597 daniel-mar 4384
    };
4385
    var fireTab = function (component, simulatedEvent, menuConfig, menuState) {
637 daniel-mar 4386
      return menuConfig.moveOnTab ? move$1(moveDown)(component, simulatedEvent, menuConfig, menuState) : Optional.none();
597 daniel-mar 4387
    };
637 daniel-mar 4388
    var getKeydownRules$1 = constant$1([
4389
      rule(inSet(UP), move$1(moveUp)),
4390
      rule(inSet(DOWN), move$1(moveDown)),
597 daniel-mar 4391
      rule(and([
4392
        isShift,
4393
        inSet(TAB)
4394
      ]), fireShiftTab),
4395
      rule(and([
4396
        isNotShift,
4397
        inSet(TAB)
4398
      ]), fireTab),
637 daniel-mar 4399
      rule(inSet(ENTER), execute),
4400
      rule(inSet(SPACE), execute)
597 daniel-mar 4401
    ]);
637 daniel-mar 4402
    var getKeyupRules$1 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);
4403
    var MenuType = typical(schema$b, NoState.init, getKeydownRules$1, getKeyupRules$1, function () {
4404
      return Optional.some(focusIn);
597 daniel-mar 4405
    });
4406
 
637 daniel-mar 4407
    var schema$a = [
597 daniel-mar 4408
      onKeyboardHandler('onSpace'),
4409
      onKeyboardHandler('onEnter'),
4410
      onKeyboardHandler('onShiftEnter'),
4411
      onKeyboardHandler('onLeft'),
4412
      onKeyboardHandler('onRight'),
4413
      onKeyboardHandler('onTab'),
4414
      onKeyboardHandler('onShiftTab'),
4415
      onKeyboardHandler('onUp'),
4416
      onKeyboardHandler('onDown'),
4417
      onKeyboardHandler('onEscape'),
637 daniel-mar 4418
      defaulted('stopSpaceKeyup', false),
597 daniel-mar 4419
      option('focusIn')
4420
    ];
637 daniel-mar 4421
    var getKeydownRules = function (component, simulatedEvent, specialInfo) {
597 daniel-mar 4422
      return [
4423
        rule(inSet(SPACE), specialInfo.onSpace),
4424
        rule(and([
4425
          isNotShift,
4426
          inSet(ENTER)
4427
        ]), specialInfo.onEnter),
4428
        rule(and([
4429
          isShift,
4430
          inSet(ENTER)
4431
        ]), specialInfo.onShiftEnter),
4432
        rule(and([
4433
          isShift,
4434
          inSet(TAB)
4435
        ]), specialInfo.onShiftTab),
4436
        rule(and([
4437
          isNotShift,
4438
          inSet(TAB)
4439
        ]), specialInfo.onTab),
4440
        rule(inSet(UP), specialInfo.onUp),
4441
        rule(inSet(DOWN), specialInfo.onDown),
4442
        rule(inSet(LEFT), specialInfo.onLeft),
4443
        rule(inSet(RIGHT), specialInfo.onRight),
4444
        rule(inSet(SPACE), specialInfo.onSpace),
4445
        rule(inSet(ESCAPE), specialInfo.onEscape)
4446
      ];
4447
    };
637 daniel-mar 4448
    var getKeyupRules = function (component, simulatedEvent, specialInfo) {
597 daniel-mar 4449
      return specialInfo.stopSpaceKeyup ? [rule(inSet(SPACE), stopEventForFirefox)] : [];
4450
    };
637 daniel-mar 4451
    var SpecialType = typical(schema$a, NoState.init, getKeydownRules, getKeyupRules, function (specialInfo) {
597 daniel-mar 4452
      return specialInfo.focusIn;
4453
    });
4454
 
4455
    var acyclic = AcyclicType.schema();
4456
    var cyclic = CyclicType.schema();
4457
    var flow = FlowType.schema();
637 daniel-mar 4458
    var flatgrid = FlatgridType.schema();
597 daniel-mar 4459
    var matrix = MatrixType.schema();
4460
    var execution = ExecutionType.schema();
4461
    var menu = MenuType.schema();
4462
    var special = SpecialType.schema();
4463
 
4464
    var KeyboardBranches = /*#__PURE__*/Object.freeze({
4465
        __proto__: null,
4466
        acyclic: acyclic,
4467
        cyclic: cyclic,
4468
        flow: flow,
637 daniel-mar 4469
        flatgrid: flatgrid,
597 daniel-mar 4470
        matrix: matrix,
4471
        execution: execution,
4472
        menu: menu,
4473
        special: special
4474
    });
4475
 
4476
    var isFlatgridState = function (keyState) {
4477
      return hasNonNullableKey(keyState, 'setGridSize');
4478
    };
637 daniel-mar 4479
    var Keying = createModes({
597 daniel-mar 4480
      branchKey: 'mode',
4481
      branches: KeyboardBranches,
4482
      name: 'keying',
4483
      active: {
4484
        events: function (keyingConfig, keyingState) {
4485
          var handler = keyingConfig.handler;
4486
          return handler.toEvents(keyingConfig, keyingState);
4487
        }
4488
      },
4489
      apis: {
4490
        focusIn: function (component, keyConfig, keyState) {
4491
          keyConfig.sendFocusIn(keyConfig).fold(function () {
4492
            component.getSystem().triggerFocus(component.element, component.element);
4493
          }, function (sendFocusIn) {
4494
            sendFocusIn(component, keyConfig, keyState);
4495
          });
4496
        },
4497
        setGridSize: function (component, keyConfig, keyState, numRows, numColumns) {
4498
          if (!isFlatgridState(keyState)) {
4499
            console.error('Layout does not support setGridSize');
4500
          } else {
4501
            keyState.setGridSize(numRows, numColumns);
4502
          }
4503
        }
4504
      },
4505
      state: KeyingState
4506
    });
4507
 
4508
    var field$1 = function (name, forbidden) {
637 daniel-mar 4509
      return defaultedObjOf(name, {}, map$2(forbidden, function (f) {
597 daniel-mar 4510
        return forbid(f.name(), 'Cannot configure ' + f.name() + ' for ' + name);
637 daniel-mar 4511
      }).concat([customField('dump', identity)]));
597 daniel-mar 4512
    };
637 daniel-mar 4513
    var get$6 = function (data) {
597 daniel-mar 4514
      return data.dump;
4515
    };
4516
    var augment = function (data, original) {
679 daniel-mar 4517
      return __assign(__assign({}, derive$2(original)), data.dump);
597 daniel-mar 4518
    };
4519
    var SketchBehaviours = {
4520
      field: field$1,
4521
      augment: augment,
637 daniel-mar 4522
      get: get$6
597 daniel-mar 4523
    };
4524
 
4525
    var _placeholder = 'placeholder';
637 daniel-mar 4526
    var adt$5 = Adt.generate([
597 daniel-mar 4527
      {
4528
        single: [
4529
          'required',
4530
          'valueThunk'
4531
        ]
4532
      },
4533
      {
4534
        multiple: [
4535
          'required',
4536
          'valueThunks'
4537
        ]
4538
      }
4539
    ]);
4540
    var isSubstituted = function (spec) {
637 daniel-mar 4541
      return has$2(spec, 'uiType');
597 daniel-mar 4542
    };
4543
    var subPlaceholder = function (owner, detail, compSpec, placeholders) {
4544
      if (owner.exists(function (o) {
4545
          return o !== compSpec.owner;
4546
        })) {
637 daniel-mar 4547
        return adt$5.single(true, constant$1(compSpec));
597 daniel-mar 4548
      }
637 daniel-mar 4549
      return get$c(placeholders, compSpec.name).fold(function () {
597 daniel-mar 4550
        throw new Error('Unknown placeholder component: ' + compSpec.name + '\nKnown: [' + keys(placeholders) + ']\nNamespace: ' + owner.getOr('none') + '\nSpec: ' + JSON.stringify(compSpec, null, 2));
4551
      }, function (newSpec) {
4552
        return newSpec.replace();
4553
      });
4554
    };
4555
    var scan = function (owner, detail, compSpec, placeholders) {
4556
      if (isSubstituted(compSpec) && compSpec.uiType === _placeholder) {
4557
        return subPlaceholder(owner, detail, compSpec, placeholders);
4558
      } else {
637 daniel-mar 4559
        return adt$5.single(false, constant$1(compSpec));
597 daniel-mar 4560
      }
4561
    };
4562
    var substitute = function (owner, detail, compSpec, placeholders) {
4563
      var base = scan(owner, detail, compSpec, placeholders);
4564
      return base.fold(function (req, valueThunk) {
4565
        var value = isSubstituted(compSpec) ? valueThunk(detail, compSpec.config, compSpec.validated) : valueThunk(detail);
637 daniel-mar 4566
        var childSpecs = get$c(value, 'components').getOr([]);
4567
        var substituted = bind$3(childSpecs, function (c) {
597 daniel-mar 4568
          return substitute(owner, detail, c, placeholders);
4569
        });
4570
        return [__assign(__assign({}, value), { components: substituted })];
4571
      }, function (req, valuesThunk) {
4572
        if (isSubstituted(compSpec)) {
4573
          var values = valuesThunk(detail, compSpec.config, compSpec.validated);
4574
          var preprocessor = compSpec.validated.preprocess.getOr(identity);
4575
          return preprocessor(values);
4576
        } else {
4577
          return valuesThunk(detail);
4578
        }
4579
      });
4580
    };
4581
    var substituteAll = function (owner, detail, components, placeholders) {
637 daniel-mar 4582
      return bind$3(components, function (c) {
597 daniel-mar 4583
        return substitute(owner, detail, c, placeholders);
4584
      });
4585
    };
4586
    var oneReplace = function (label, replacements) {
4587
      var called = false;
4588
      var used = function () {
4589
        return called;
4590
      };
4591
      var replace = function () {
4592
        if (called) {
4593
          throw new Error('Trying to use the same placeholder more than once: ' + label);
4594
        }
4595
        called = true;
4596
        return replacements;
4597
      };
4598
      var required = function () {
4599
        return replacements.fold(function (req, _) {
4600
          return req;
4601
        }, function (req, _) {
4602
          return req;
4603
        });
4604
      };
4605
      return {
637 daniel-mar 4606
        name: constant$1(label),
597 daniel-mar 4607
        required: required,
4608
        used: used,
4609
        replace: replace
4610
      };
4611
    };
4612
    var substitutePlaces = function (owner, detail, components, placeholders) {
4613
      var ps = map$1(placeholders, function (ph, name) {
4614
        return oneReplace(name, ph);
4615
      });
4616
      var outcome = substituteAll(owner, detail, components, ps);
637 daniel-mar 4617
      each(ps, function (p) {
597 daniel-mar 4618
        if (p.used() === false && p.required()) {
4619
          throw new Error('Placeholder: ' + p.name() + ' was not found in components list\nNamespace: ' + owner.getOr('none') + '\nComponents: ' + JSON.stringify(detail.components, null, 2));
4620
        }
4621
      });
4622
      return outcome;
4623
    };
637 daniel-mar 4624
    var single$2 = adt$5.single;
4625
    var multiple = adt$5.multiple;
4626
    var placeholder = constant$1(_placeholder);
597 daniel-mar 4627
 
4628
    var unique = 0;
637 daniel-mar 4629
    var generate$4 = function (prefix) {
597 daniel-mar 4630
      var date = new Date();
4631
      var time = date.getTime();
4632
      var random = Math.floor(Math.random() * 1000000000);
4633
      unique++;
4634
      return prefix + '_' + random + unique + String(time);
4635
    };
4636
 
637 daniel-mar 4637
    var adt$4 = Adt.generate([
597 daniel-mar 4638
      { required: ['data'] },
4639
      { external: ['data'] },
4640
      { optional: ['data'] },
4641
      { group: ['data'] }
4642
    ]);
637 daniel-mar 4643
    var fFactory = defaulted('factory', { sketch: identity });
4644
    var fSchema = defaulted('schema', []);
4645
    var fName = required$1('name');
4646
    var fPname = field$2('pname', 'pname', defaultedThunk(function (typeSpec) {
4647
      return '<alloy.' + generate$4(typeSpec.name) + '>';
4648
    }), anyValue());
4649
    var fGroupSchema = customField('schema', function () {
597 daniel-mar 4650
      return [option('preprocess')];
4651
    });
637 daniel-mar 4652
    var fDefaults = defaulted('defaults', constant$1({}));
4653
    var fOverrides = defaulted('overrides', constant$1({}));
597 daniel-mar 4654
    var requiredSpec = objOf([
4655
      fFactory,
4656
      fSchema,
4657
      fName,
4658
      fPname,
4659
      fDefaults,
4660
      fOverrides
4661
    ]);
4662
    var externalSpec = objOf([
4663
      fFactory,
4664
      fSchema,
4665
      fName,
4666
      fDefaults,
4667
      fOverrides
4668
    ]);
4669
    var optionalSpec = objOf([
4670
      fFactory,
4671
      fSchema,
4672
      fName,
4673
      fPname,
4674
      fDefaults,
4675
      fOverrides
4676
    ]);
4677
    var groupSpec = objOf([
4678
      fFactory,
4679
      fGroupSchema,
4680
      fName,
637 daniel-mar 4681
      required$1('unit'),
597 daniel-mar 4682
      fPname,
4683
      fDefaults,
4684
      fOverrides
4685
    ]);
4686
    var asNamedPart = function (part) {
4687
      return part.fold(Optional.some, Optional.none, Optional.some, Optional.some);
4688
    };
637 daniel-mar 4689
    var name = function (part) {
597 daniel-mar 4690
      var get = function (data) {
4691
        return data.name;
4692
      };
4693
      return part.fold(get, get, get, get);
4694
    };
637 daniel-mar 4695
    var convert$1 = function (adtConstructor, partSchema) {
597 daniel-mar 4696
      return function (spec) {
637 daniel-mar 4697
        var data = asRawOrDie$1('Converting part type', partSchema, spec);
597 daniel-mar 4698
        return adtConstructor(data);
4699
      };
4700
    };
637 daniel-mar 4701
    var required = convert$1(adt$4.required, requiredSpec);
4702
    convert$1(adt$4.external, externalSpec);
4703
    var optional = convert$1(adt$4.optional, optionalSpec);
4704
    var group = convert$1(adt$4.group, groupSpec);
4705
    var original = constant$1('entirety');
597 daniel-mar 4706
 
637 daniel-mar 4707
    var combine$2 = function (detail, data, partSpec, partValidated) {
597 daniel-mar 4708
      return deepMerge(data.defaults(detail, partSpec, partValidated), partSpec, { uid: detail.partUids[data.name] }, data.overrides(detail, partSpec, partValidated));
4709
    };
4710
    var subs = function (owner, detail, parts) {
4711
      var internals = {};
4712
      var externals = {};
637 daniel-mar 4713
      each$1(parts, function (part) {
597 daniel-mar 4714
        part.fold(function (data) {
637 daniel-mar 4715
          internals[data.pname] = single$2(true, function (detail, partSpec, partValidated) {
4716
            return data.factory.sketch(combine$2(detail, data, partSpec, partValidated));
597 daniel-mar 4717
          });
4718
        }, function (data) {
4719
          var partSpec = detail.parts[data.name];
637 daniel-mar 4720
          externals[data.name] = constant$1(data.factory.sketch(combine$2(detail, data, partSpec[original()]), partSpec));
597 daniel-mar 4721
        }, function (data) {
637 daniel-mar 4722
          internals[data.pname] = single$2(false, function (detail, partSpec, partValidated) {
4723
            return data.factory.sketch(combine$2(detail, data, partSpec, partValidated));
597 daniel-mar 4724
          });
4725
        }, function (data) {
4726
          internals[data.pname] = multiple(true, function (detail, _partSpec, _partValidated) {
4727
            var units = detail[data.name];
637 daniel-mar 4728
            return map$2(units, function (u) {
597 daniel-mar 4729
              return data.factory.sketch(deepMerge(data.defaults(detail, u, _partValidated), u, data.overrides(detail, u)));
4730
            });
4731
          });
4732
        });
4733
      });
4734
      return {
637 daniel-mar 4735
        internals: constant$1(internals),
4736
        externals: constant$1(externals)
597 daniel-mar 4737
      };
4738
    };
4739
 
637 daniel-mar 4740
    var generate$3 = function (owner, parts) {
597 daniel-mar 4741
      var r = {};
637 daniel-mar 4742
      each$1(parts, function (part) {
597 daniel-mar 4743
        asNamedPart(part).each(function (np) {
4744
          var g = doGenerateOne(owner, np.pname);
4745
          r[np.name] = function (config) {
637 daniel-mar 4746
            var validated = asRawOrDie$1('Part: ' + np.name + ' in ' + owner, objOf(np.schema), config);
597 daniel-mar 4747
            return __assign(__assign({}, g), {
4748
              config: config,
4749
              validated: validated
4750
            });
4751
          };
4752
        });
4753
      });
4754
      return r;
4755
    };
4756
    var doGenerateOne = function (owner, pname) {
4757
      return {
4758
        uiType: placeholder(),
4759
        owner: owner,
4760
        name: pname
4761
      };
4762
    };
4763
    var generateOne = function (owner, pname, config) {
4764
      return {
4765
        uiType: placeholder(),
4766
        owner: owner,
4767
        name: pname,
4768
        config: config,
4769
        validated: {}
4770
      };
4771
    };
4772
    var schemas = function (parts) {
637 daniel-mar 4773
      return bind$3(parts, function (part) {
597 daniel-mar 4774
        return part.fold(Optional.none, Optional.some, Optional.none, Optional.none).map(function (data) {
637 daniel-mar 4775
          return requiredObjOf(data.name, data.schema.concat([snapshot(original())]));
597 daniel-mar 4776
        }).toArray();
4777
      });
4778
    };
4779
    var names = function (parts) {
637 daniel-mar 4780
      return map$2(parts, name);
597 daniel-mar 4781
    };
4782
    var substitutes = function (owner, detail, parts) {
4783
      return subs(owner, detail, parts);
4784
    };
4785
    var components = function (owner, detail, internals) {
4786
      return substitutePlaces(Optional.some(owner), detail, detail.components, internals);
4787
    };
4788
    var getPart = function (component, detail, partKey) {
4789
      var uid = detail.partUids[partKey];
4790
      return component.getSystem().getByUid(uid).toOptional();
4791
    };
4792
    var getPartOrDie = function (component, detail, partKey) {
4793
      return getPart(component, detail, partKey).getOrDie('Could not find part: ' + partKey);
4794
    };
4795
    var getAllParts = function (component, detail) {
4796
      var system = component.getSystem();
4797
      return map$1(detail.partUids, function (pUid, _k) {
637 daniel-mar 4798
        return constant$1(system.getByUid(pUid));
597 daniel-mar 4799
      });
4800
    };
4801
    var defaultUids = function (baseUid, partTypes) {
4802
      var partNames = names(partTypes);
637 daniel-mar 4803
      return wrapAll(map$2(partNames, function (pn) {
597 daniel-mar 4804
        return {
4805
          key: pn,
4806
          value: baseUid + '-' + pn
4807
        };
4808
      }));
4809
    };
4810
    var defaultUidsSchema = function (partTypes) {
637 daniel-mar 4811
      return field$2('partUids', 'partUids', mergeWithThunk(function (spec) {
597 daniel-mar 4812
        return defaultUids(spec.uid, partTypes);
637 daniel-mar 4813
      }), anyValue());
597 daniel-mar 4814
    };
4815
 
637 daniel-mar 4816
    var premadeTag = generate$4('alloy-premade');
4817
    var premade$1 = function (comp) {
4818
      return wrap(premadeTag, comp);
597 daniel-mar 4819
    };
4820
    var getPremade = function (spec) {
637 daniel-mar 4821
      return get$c(spec, premadeTag);
597 daniel-mar 4822
    };
4823
    var makeApi = function (f) {
4824
      return markAsSketchApi(function (component) {
4825
        var rest = [];
4826
        for (var _i = 1; _i < arguments.length; _i++) {
4827
          rest[_i - 1] = arguments[_i];
4828
        }
637 daniel-mar 4829
        return f.apply(void 0, __spreadArray([
597 daniel-mar 4830
          component.getApis(),
4831
          component
679 daniel-mar 4832
        ], rest, false));
597 daniel-mar 4833
      }, f);
4834
    };
4835
 
637 daniel-mar 4836
    var prefix$1 = constant$1('alloy-id-');
4837
    var idAttr$1 = constant$1('data-alloy-id');
597 daniel-mar 4838
 
637 daniel-mar 4839
    var prefix = prefix$1();
4840
    var idAttr = idAttr$1();
597 daniel-mar 4841
    var write = function (label, elem) {
637 daniel-mar 4842
      var id = generate$4(prefix + label);
597 daniel-mar 4843
      writeOnly(elem, id);
4844
      return id;
4845
    };
4846
    var writeOnly = function (elem, uid) {
637 daniel-mar 4847
      Object.defineProperty(elem.dom, idAttr, {
597 daniel-mar 4848
        value: uid,
4849
        writable: true
4850
      });
4851
    };
637 daniel-mar 4852
    var read = function (elem) {
4853
      var id = isElement(elem) ? elem.dom[idAttr] : null;
597 daniel-mar 4854
      return Optional.from(id);
4855
    };
637 daniel-mar 4856
    var generate$2 = function (prefix) {
4857
      return generate$4(prefix);
597 daniel-mar 4858
    };
4859
 
4860
    var base = function (partSchemas, partUidsSchemas) {
637 daniel-mar 4861
      var ps = partSchemas.length > 0 ? [requiredObjOf('parts', partSchemas)] : [];
597 daniel-mar 4862
      return ps.concat([
637 daniel-mar 4863
        required$1('uid'),
4864
        defaulted('dom', {}),
4865
        defaulted('components', []),
597 daniel-mar 4866
        snapshot('originalSpec'),
637 daniel-mar 4867
        defaulted('debug.sketcher', {})
597 daniel-mar 4868
      ]).concat(partUidsSchemas);
4869
    };
637 daniel-mar 4870
    var asRawOrDie = function (label, schema, spec, partSchemas, partUidsSchemas) {
597 daniel-mar 4871
      var baseS = base(partSchemas, partUidsSchemas);
637 daniel-mar 4872
      return asRawOrDie$1(label + ' [SpecSchema]', objOfOnly(baseS.concat(schema)), spec);
597 daniel-mar 4873
    };
4874
 
4875
    var single$1 = function (owner, schema, factory, spec) {
4876
      var specWithUid = supplyUid(spec);
637 daniel-mar 4877
      var detail = asRawOrDie(owner, schema, specWithUid, [], []);
597 daniel-mar 4878
      return factory(detail, specWithUid);
4879
    };
637 daniel-mar 4880
    var composite$1 = function (owner, schema, partTypes, factory, spec) {
597 daniel-mar 4881
      var specWithUid = supplyUid(spec);
4882
      var partSchemas = schemas(partTypes);
4883
      var partUidsSchema = defaultUidsSchema(partTypes);
637 daniel-mar 4884
      var detail = asRawOrDie(owner, schema, specWithUid, partSchemas, [partUidsSchema]);
597 daniel-mar 4885
      var subs = substitutes(owner, detail, partTypes);
4886
      var components$1 = components(owner, detail, subs.internals());
4887
      return factory(detail, components$1, specWithUid, subs.externals());
4888
    };
4889
    var hasUid = function (spec) {
637 daniel-mar 4890
      return has$2(spec, 'uid');
597 daniel-mar 4891
    };
4892
    var supplyUid = function (spec) {
637 daniel-mar 4893
      return hasUid(spec) ? spec : __assign(__assign({}, spec), { uid: generate$2('uid') });
597 daniel-mar 4894
    };
4895
 
637 daniel-mar 4896
    var isSketchSpec$1 = function (spec) {
597 daniel-mar 4897
      return spec.uid !== undefined;
4898
    };
4899
    var singleSchema = objOfOnly([
637 daniel-mar 4900
      required$1('name'),
4901
      required$1('factory'),
4902
      required$1('configFields'),
4903
      defaulted('apis', {}),
4904
      defaulted('extraApis', {})
597 daniel-mar 4905
    ]);
4906
    var compositeSchema = objOfOnly([
637 daniel-mar 4907
      required$1('name'),
4908
      required$1('factory'),
4909
      required$1('configFields'),
4910
      required$1('partFields'),
4911
      defaulted('apis', {}),
4912
      defaulted('extraApis', {})
597 daniel-mar 4913
    ]);
637 daniel-mar 4914
    var single = function (rawConfig) {
4915
      var config = asRawOrDie$1('Sketcher for ' + rawConfig.name, singleSchema, rawConfig);
597 daniel-mar 4916
      var sketch = function (spec) {
4917
        return single$1(config.name, config.configFields, config.factory, spec);
4918
      };
4919
      var apis = map$1(config.apis, makeApi);
4920
      var extraApis = map$1(config.extraApis, function (f, k) {
4921
        return markAsExtraApi(f, k);
4922
      });
4923
      return __assign(__assign({
4924
        name: config.name,
4925
        configFields: config.configFields,
4926
        sketch: sketch
4927
      }, apis), extraApis);
4928
    };
637 daniel-mar 4929
    var composite = function (rawConfig) {
4930
      var config = asRawOrDie$1('Sketcher for ' + rawConfig.name, compositeSchema, rawConfig);
597 daniel-mar 4931
      var sketch = function (spec) {
637 daniel-mar 4932
        return composite$1(config.name, config.configFields, config.partFields, config.factory, spec);
597 daniel-mar 4933
      };
637 daniel-mar 4934
      var parts = generate$3(config.name, config.partFields);
597 daniel-mar 4935
      var apis = map$1(config.apis, makeApi);
4936
      var extraApis = map$1(config.extraApis, function (f, k) {
4937
        return markAsExtraApi(f, k);
4938
      });
4939
      return __assign(__assign({
4940
        name: config.name,
4941
        partFields: config.partFields,
4942
        configFields: config.configFields,
4943
        sketch: sketch,
4944
        parts: parts
4945
      }, apis), extraApis);
4946
    };
4947
 
637 daniel-mar 4948
    var factory$5 = function (detail) {
4949
      var events = events$8(detail.action);
597 daniel-mar 4950
      var tag = detail.dom.tag;
4951
      var lookupAttr = function (attr) {
637 daniel-mar 4952
        return get$c(detail.dom, 'attributes').bind(function (attrs) {
4953
          return get$c(attrs, attr);
597 daniel-mar 4954
        });
4955
      };
4956
      var getModAttributes = function () {
4957
        if (tag === 'button') {
4958
          var type = lookupAttr('type').getOr('button');
4959
          var roleAttrs = lookupAttr('role').map(function (role) {
4960
            return { role: role };
4961
          }).getOr({});
4962
          return __assign({ type: type }, roleAttrs);
4963
        } else {
4964
          var role = lookupAttr('role').getOr('button');
4965
          return { role: role };
4966
        }
4967
      };
4968
      return {
4969
        uid: detail.uid,
4970
        dom: detail.dom,
4971
        components: detail.components,
4972
        events: events,
4973
        behaviours: SketchBehaviours.augment(detail.buttonBehaviours, [
4974
          Focusing.config({}),
4975
          Keying.config({
4976
            mode: 'execution',
4977
            useSpace: true,
4978
            useEnter: true
4979
          })
4980
        ]),
4981
        domModification: { attributes: getModAttributes() },
4982
        eventOrder: detail.eventOrder
4983
      };
4984
    };
637 daniel-mar 4985
    var Button = single({
597 daniel-mar 4986
      name: 'Button',
637 daniel-mar 4987
      factory: factory$5,
597 daniel-mar 4988
      configFields: [
637 daniel-mar 4989
        defaulted('uid', undefined),
4990
        required$1('dom'),
4991
        defaulted('components', []),
597 daniel-mar 4992
        SketchBehaviours.field('buttonBehaviours', [
4993
          Focusing,
4994
          Keying
4995
        ]),
4996
        option('action'),
4997
        option('role'),
637 daniel-mar 4998
        defaulted('eventOrder', {})
597 daniel-mar 4999
      ]
5000
    });
5001
 
637 daniel-mar 5002
    var exhibit$3 = function () {
5003
      return nu$3({
597 daniel-mar 5004
        styles: {
5005
          '-webkit-user-select': 'none',
5006
          'user-select': 'none',
5007
          '-ms-user-select': 'none',
5008
          '-moz-user-select': '-moz-none'
5009
        },
5010
        attributes: { unselectable: 'on' }
5011
      });
5012
    };
637 daniel-mar 5013
    var events$6 = function () {
5014
      return derive$3([abort(selectstart(), always)]);
597 daniel-mar 5015
    };
5016
 
5017
    var ActiveUnselecting = /*#__PURE__*/Object.freeze({
5018
        __proto__: null,
637 daniel-mar 5019
        events: events$6,
5020
        exhibit: exhibit$3
597 daniel-mar 5021
    });
5022
 
637 daniel-mar 5023
    var Unselecting = create$5({
597 daniel-mar 5024
      fields: [],
5025
      name: 'unselecting',
5026
      active: ActiveUnselecting
5027
    });
5028
 
637 daniel-mar 5029
    var getAttrs$1 = function (elem) {
597 daniel-mar 5030
      var attributes = elem.dom.attributes !== undefined ? elem.dom.attributes : [];
5031
      return foldl(attributes, function (b, attr) {
5032
        var _a;
5033
        if (attr.name === 'class') {
5034
          return b;
5035
        } else {
5036
          return __assign(__assign({}, b), (_a = {}, _a[attr.name] = attr.value, _a));
5037
        }
5038
      }, {});
5039
    };
5040
    var getClasses = function (elem) {
5041
      return Array.prototype.slice.call(elem.dom.classList, 0);
5042
    };
637 daniel-mar 5043
    var fromHtml = function (html) {
597 daniel-mar 5044
      var elem = SugarElement.fromHtml(html);
5045
      var children$1 = children(elem);
637 daniel-mar 5046
      var attrs = getAttrs$1(elem);
597 daniel-mar 5047
      var classes = getClasses(elem);
637 daniel-mar 5048
      var contents = children$1.length === 0 ? {} : { innerHtml: get$9(elem) };
597 daniel-mar 5049
      return __assign({
637 daniel-mar 5050
        tag: name$1(elem),
597 daniel-mar 5051
        classes: classes,
5052
        attributes: attrs
5053
      }, contents);
5054
    };
5055
 
5056
    var dom$1 = function (rawHtml) {
637 daniel-mar 5057
      var html = supplant(rawHtml, { prefix: prefix$2 });
5058
      return fromHtml(html);
597 daniel-mar 5059
    };
5060
    var spec = function (rawHtml) {
5061
      return { dom: dom$1(rawHtml) };
5062
    };
5063
 
5064
    var forToolbarCommand = function (editor, command) {
5065
      return forToolbar(command, function () {
5066
        editor.execCommand(command);
5067
      }, {}, editor);
5068
    };
5069
    var getToggleBehaviours = function (command) {
637 daniel-mar 5070
      return derive$2([
597 daniel-mar 5071
        Toggling.config({
5072
          toggleClass: resolve('toolbar-button-selected'),
5073
          toggleOnExecute: false,
5074
          aria: { mode: 'pressed' }
5075
        }),
5076
        format(command, function (button, status) {
5077
          var toggle = status ? Toggling.on : Toggling.off;
5078
          toggle(button);
5079
        })
5080
      ]);
5081
    };
5082
    var forToolbarStateCommand = function (editor, command) {
5083
      var extraBehaviours = getToggleBehaviours(command);
5084
      return forToolbar(command, function () {
5085
        editor.execCommand(command);
5086
      }, extraBehaviours, editor);
5087
    };
5088
    var forToolbarStateAction = function (editor, clazz, command, action) {
5089
      var extraBehaviours = getToggleBehaviours(command);
5090
      return forToolbar(clazz, action, extraBehaviours, editor);
5091
    };
5092
    var getToolbarIconButton = function (clazz, editor) {
5093
      var icons = editor.ui.registry.getAll().icons;
5094
      var optOxideIcon = Optional.from(icons[clazz]);
5095
      return optOxideIcon.fold(function () {
5096
        return dom$1('<span class="${prefix}-toolbar-button ${prefix}-toolbar-group-item ${prefix}-icon-' + clazz + ' ${prefix}-icon"></span>');
5097
      }, function (icon) {
5098
        return dom$1('<span class="${prefix}-toolbar-button ${prefix}-toolbar-group-item">' + icon + '</span>');
5099
      });
5100
    };
5101
    var forToolbar = function (clazz, action, extraBehaviours, editor) {
5102
      return Button.sketch({
5103
        dom: getToolbarIconButton(clazz, editor),
5104
        action: action,
637 daniel-mar 5105
        buttonBehaviours: deepMerge(derive$2([Unselecting.config({})]), extraBehaviours)
597 daniel-mar 5106
      });
5107
    };
5108
 
5109
    var labelPart = optional({
637 daniel-mar 5110
      schema: [required$1('dom')],
597 daniel-mar 5111
      name: 'label'
5112
    });
5113
    var edgePart = function (name) {
5114
      return optional({
5115
        name: '' + name + '-edge',
5116
        overrides: function (detail) {
5117
          var action = detail.model.manager.edgeActions[name];
5118
          return action.fold(function () {
5119
            return {};
5120
          }, function (a) {
5121
            return {
637 daniel-mar 5122
              events: derive$3([
597 daniel-mar 5123
                runActionExtra(touchstart(), function (comp, se, d) {
5124
                  return a(comp, d);
5125
                }, [detail]),
5126
                runActionExtra(mousedown(), function (comp, se, d) {
5127
                  return a(comp, d);
5128
                }, [detail]),
5129
                runActionExtra(mousemove(), function (comp, se, det) {
5130
                  if (det.mouseIsDown.get()) {
5131
                    a(comp, det);
5132
                  }
5133
                }, [detail])
5134
              ])
5135
            };
5136
          });
5137
        }
5138
      });
5139
    };
5140
    var tlEdgePart = edgePart('top-left');
5141
    var tedgePart = edgePart('top');
5142
    var trEdgePart = edgePart('top-right');
5143
    var redgePart = edgePart('right');
5144
    var brEdgePart = edgePart('bottom-right');
5145
    var bedgePart = edgePart('bottom');
5146
    var blEdgePart = edgePart('bottom-left');
5147
    var ledgePart = edgePart('left');
5148
    var thumbPart = required({
5149
      name: 'thumb',
637 daniel-mar 5150
      defaults: constant$1({ dom: { styles: { position: 'absolute' } } }),
597 daniel-mar 5151
      overrides: function (detail) {
5152
        return {
637 daniel-mar 5153
          events: derive$3([
597 daniel-mar 5154
            redirectToPart(touchstart(), detail, 'spectrum'),
5155
            redirectToPart(touchmove(), detail, 'spectrum'),
5156
            redirectToPart(touchend(), detail, 'spectrum'),
5157
            redirectToPart(mousedown(), detail, 'spectrum'),
5158
            redirectToPart(mousemove(), detail, 'spectrum'),
5159
            redirectToPart(mouseup(), detail, 'spectrum')
5160
          ])
5161
        };
5162
      }
5163
    });
5164
    var spectrumPart = required({
637 daniel-mar 5165
      schema: [customField('mouseIsDown', function () {
597 daniel-mar 5166
          return Cell(false);
5167
        })],
5168
      name: 'spectrum',
5169
      overrides: function (detail) {
5170
        var modelDetail = detail.model;
5171
        var model = modelDetail.manager;
5172
        var setValueFrom = function (component, simulatedEvent) {
5173
          return model.getValueFromEvent(simulatedEvent).map(function (value) {
5174
            return model.setValueFrom(component, detail, value);
5175
          });
5176
        };
5177
        return {
637 daniel-mar 5178
          behaviours: derive$2([
597 daniel-mar 5179
            Keying.config({
5180
              mode: 'special',
5181
              onLeft: function (spectrum) {
5182
                return model.onLeft(spectrum, detail);
5183
              },
5184
              onRight: function (spectrum) {
5185
                return model.onRight(spectrum, detail);
5186
              },
5187
              onUp: function (spectrum) {
5188
                return model.onUp(spectrum, detail);
5189
              },
5190
              onDown: function (spectrum) {
5191
                return model.onDown(spectrum, detail);
5192
              }
5193
            }),
5194
            Focusing.config({})
5195
          ]),
637 daniel-mar 5196
          events: derive$3([
597 daniel-mar 5197
            run(touchstart(), setValueFrom),
5198
            run(touchmove(), setValueFrom),
5199
            run(mousedown(), setValueFrom),
5200
            run(mousemove(), function (spectrum, se) {
5201
              if (detail.mouseIsDown.get()) {
5202
                setValueFrom(spectrum, se);
5203
              }
5204
            })
5205
          ])
5206
        };
5207
      }
5208
    });
5209
    var SliderParts = [
5210
      labelPart,
5211
      ledgePart,
5212
      redgePart,
5213
      tedgePart,
5214
      bedgePart,
5215
      tlEdgePart,
5216
      trEdgePart,
5217
      blEdgePart,
5218
      brEdgePart,
5219
      thumbPart,
5220
      spectrumPart
5221
    ];
5222
 
637 daniel-mar 5223
    var onLoad$4 = function (component, repConfig, repState) {
597 daniel-mar 5224
      repConfig.store.manager.onLoad(component, repConfig, repState);
5225
    };
637 daniel-mar 5226
    var onUnload$2 = function (component, repConfig, repState) {
597 daniel-mar 5227
      repConfig.store.manager.onUnload(component, repConfig, repState);
5228
    };
637 daniel-mar 5229
    var setValue$3 = function (component, repConfig, repState, data) {
597 daniel-mar 5230
      repConfig.store.manager.setValue(component, repConfig, repState, data);
5231
    };
637 daniel-mar 5232
    var getValue$4 = function (component, repConfig, repState) {
597 daniel-mar 5233
      return repConfig.store.manager.getValue(component, repConfig, repState);
5234
    };
637 daniel-mar 5235
    var getState$1 = function (component, repConfig, repState) {
597 daniel-mar 5236
      return repState;
5237
    };
5238
 
5239
    var RepresentApis = /*#__PURE__*/Object.freeze({
5240
        __proto__: null,
637 daniel-mar 5241
        onLoad: onLoad$4,
5242
        onUnload: onUnload$2,
5243
        setValue: setValue$3,
5244
        getValue: getValue$4,
5245
        getState: getState$1
597 daniel-mar 5246
    });
5247
 
5248
    var events$5 = function (repConfig, repState) {
5249
      var es = repConfig.resetOnDom ? [
5250
        runOnAttached(function (comp, _se) {
637 daniel-mar 5251
          onLoad$4(comp, repConfig, repState);
597 daniel-mar 5252
        }),
5253
        runOnDetached(function (comp, _se) {
637 daniel-mar 5254
          onUnload$2(comp, repConfig, repState);
597 daniel-mar 5255
        })
637 daniel-mar 5256
      ] : [loadEvent(repConfig, repState, onLoad$4)];
5257
      return derive$3(es);
597 daniel-mar 5258
    };
5259
 
5260
    var ActiveRepresenting = /*#__PURE__*/Object.freeze({
5261
        __proto__: null,
5262
        events: events$5
5263
    });
5264
 
5265
    var memory = function () {
5266
      var data = Cell(null);
5267
      var readState = function () {
5268
        return {
5269
          mode: 'memory',
5270
          value: data.get()
5271
        };
5272
      };
5273
      var isNotSet = function () {
5274
        return data.get() === null;
5275
      };
5276
      var clear = function () {
5277
        data.set(null);
5278
      };
637 daniel-mar 5279
      return nu$2({
597 daniel-mar 5280
        set: data.set,
5281
        get: data.get,
5282
        isNotSet: isNotSet,
5283
        clear: clear,
5284
        readState: readState
5285
      });
5286
    };
5287
    var manual = function () {
5288
      var readState = noop;
637 daniel-mar 5289
      return nu$2({ readState: readState });
597 daniel-mar 5290
    };
5291
    var dataset = function () {
5292
      var dataByValue = Cell({});
5293
      var dataByText = Cell({});
5294
      var readState = function () {
5295
        return {
5296
          mode: 'dataset',
5297
          dataByValue: dataByValue.get(),
5298
          dataByText: dataByText.get()
5299
        };
5300
      };
5301
      var clear = function () {
5302
        dataByValue.set({});
5303
        dataByText.set({});
5304
      };
5305
      var lookup = function (itemString) {
637 daniel-mar 5306
        return get$c(dataByValue.get(), itemString).orThunk(function () {
5307
          return get$c(dataByText.get(), itemString);
597 daniel-mar 5308
        });
5309
      };
5310
      var update = function (items) {
5311
        var currentDataByValue = dataByValue.get();
5312
        var currentDataByText = dataByText.get();
5313
        var newDataByValue = {};
5314
        var newDataByText = {};
637 daniel-mar 5315
        each$1(items, function (item) {
597 daniel-mar 5316
          newDataByValue[item.value] = item;
637 daniel-mar 5317
          get$c(item, 'meta').each(function (meta) {
5318
            get$c(meta, 'text').each(function (text) {
597 daniel-mar 5319
              newDataByText[text] = item;
5320
            });
5321
          });
5322
        });
5323
        dataByValue.set(__assign(__assign({}, currentDataByValue), newDataByValue));
5324
        dataByText.set(__assign(__assign({}, currentDataByText), newDataByText));
5325
      };
637 daniel-mar 5326
      return nu$2({
597 daniel-mar 5327
        readState: readState,
5328
        lookup: lookup,
5329
        update: update,
5330
        clear: clear
5331
      });
5332
    };
637 daniel-mar 5333
    var init$4 = function (spec) {
597 daniel-mar 5334
      return spec.store.manager.state(spec);
5335
    };
5336
 
5337
    var RepresentState = /*#__PURE__*/Object.freeze({
5338
        __proto__: null,
5339
        memory: memory,
5340
        dataset: dataset,
5341
        manual: manual,
637 daniel-mar 5342
        init: init$4
597 daniel-mar 5343
    });
5344
 
637 daniel-mar 5345
    var setValue$2 = function (component, repConfig, repState, data) {
597 daniel-mar 5346
      var store = repConfig.store;
5347
      repState.update([data]);
5348
      store.setValue(component, data);
5349
      repConfig.onSetValue(component, data);
5350
    };
637 daniel-mar 5351
    var getValue$3 = function (component, repConfig, repState) {
597 daniel-mar 5352
      var store = repConfig.store;
5353
      var key = store.getDataKey(component);
637 daniel-mar 5354
      return repState.lookup(key).getOrThunk(function () {
597 daniel-mar 5355
        return store.getFallbackEntry(key);
5356
      });
5357
    };
637 daniel-mar 5358
    var onLoad$3 = function (component, repConfig, repState) {
597 daniel-mar 5359
      var store = repConfig.store;
5360
      store.initialValue.each(function (data) {
637 daniel-mar 5361
        setValue$2(component, repConfig, repState, data);
597 daniel-mar 5362
      });
5363
    };
5364
    var onUnload$1 = function (component, repConfig, repState) {
5365
      repState.clear();
5366
    };
5367
    var DatasetStore = [
5368
      option('initialValue'),
637 daniel-mar 5369
      required$1('getFallbackEntry'),
5370
      required$1('getDataKey'),
5371
      required$1('setValue'),
597 daniel-mar 5372
      output('manager', {
637 daniel-mar 5373
        setValue: setValue$2,
5374
        getValue: getValue$3,
5375
        onLoad: onLoad$3,
597 daniel-mar 5376
        onUnload: onUnload$1,
5377
        state: dataset
5378
      })
5379
    ];
5380
 
5381
    var getValue$2 = function (component, repConfig, _repState) {
5382
      return repConfig.store.getValue(component);
5383
    };
637 daniel-mar 5384
    var setValue$1 = function (component, repConfig, _repState, data) {
597 daniel-mar 5385
      repConfig.store.setValue(component, data);
5386
      repConfig.onSetValue(component, data);
5387
    };
637 daniel-mar 5388
    var onLoad$2 = function (component, repConfig, _repState) {
597 daniel-mar 5389
      repConfig.store.initialValue.each(function (data) {
5390
        repConfig.store.setValue(component, data);
5391
      });
5392
    };
5393
    var ManualStore = [
637 daniel-mar 5394
      required$1('getValue'),
5395
      defaulted('setValue', noop),
597 daniel-mar 5396
      option('initialValue'),
5397
      output('manager', {
637 daniel-mar 5398
        setValue: setValue$1,
597 daniel-mar 5399
        getValue: getValue$2,
637 daniel-mar 5400
        onLoad: onLoad$2,
597 daniel-mar 5401
        onUnload: noop,
5402
        state: NoState.init
5403
      })
5404
    ];
5405
 
637 daniel-mar 5406
    var setValue = function (component, repConfig, repState, data) {
597 daniel-mar 5407
      repState.set(data);
5408
      repConfig.onSetValue(component, data);
5409
    };
637 daniel-mar 5410
    var getValue$1 = function (component, repConfig, repState) {
597 daniel-mar 5411
      return repState.get();
5412
    };
637 daniel-mar 5413
    var onLoad$1 = function (component, repConfig, repState) {
597 daniel-mar 5414
      repConfig.store.initialValue.each(function (initVal) {
5415
        if (repState.isNotSet()) {
5416
          repState.set(initVal);
5417
        }
5418
      });
5419
    };
637 daniel-mar 5420
    var onUnload = function (component, repConfig, repState) {
597 daniel-mar 5421
      repState.clear();
5422
    };
5423
    var MemoryStore = [
5424
      option('initialValue'),
5425
      output('manager', {
637 daniel-mar 5426
        setValue: setValue,
5427
        getValue: getValue$1,
5428
        onLoad: onLoad$1,
5429
        onUnload: onUnload,
597 daniel-mar 5430
        state: memory
5431
      })
5432
    ];
5433
 
5434
    var RepresentSchema = [
5435
      defaultedOf('store', { mode: 'memory' }, choose$1('mode', {
5436
        memory: MemoryStore,
5437
        manual: ManualStore,
5438
        dataset: DatasetStore
5439
      })),
5440
      onHandler('onSetValue'),
637 daniel-mar 5441
      defaulted('resetOnDom', false)
597 daniel-mar 5442
    ];
5443
 
637 daniel-mar 5444
    var Representing = create$5({
597 daniel-mar 5445
      fields: RepresentSchema,
5446
      name: 'representing',
5447
      active: ActiveRepresenting,
5448
      apis: RepresentApis,
5449
      extra: {
5450
        setValueFrom: function (component, source) {
5451
          var value = Representing.getValue(source);
5452
          Representing.setValue(component, value);
5453
        }
5454
      },
5455
      state: RepresentState
5456
    });
5457
 
5458
    var api$1 = Dimension('width', function (element) {
5459
      return element.dom.offsetWidth;
5460
    });
5461
    var set$4 = function (element, h) {
5462
      return api$1.set(element, h);
5463
    };
637 daniel-mar 5464
    var get$5 = function (element) {
597 daniel-mar 5465
      return api$1.get(element);
5466
    };
5467
 
637 daniel-mar 5468
    var r$1 = function (left, top) {
597 daniel-mar 5469
      var translate = function (x, y) {
637 daniel-mar 5470
        return r$1(left + x, top + y);
597 daniel-mar 5471
      };
5472
      return {
5473
        left: left,
5474
        top: top,
5475
        translate: translate
5476
      };
5477
    };
637 daniel-mar 5478
    var SugarPosition = r$1;
597 daniel-mar 5479
 
5480
    var _sliderChangeEvent = 'slider.change.value';
637 daniel-mar 5481
    var sliderChangeEvent = constant$1(_sliderChangeEvent);
597 daniel-mar 5482
    var isTouchEvent = function (evt) {
5483
      return evt.type.indexOf('touch') !== -1;
5484
    };
5485
    var getEventSource = function (simulatedEvent) {
5486
      var evt = simulatedEvent.event.raw;
5487
      if (isTouchEvent(evt)) {
5488
        var touchEvent = evt;
5489
        return touchEvent.touches !== undefined && touchEvent.touches.length === 1 ? Optional.some(touchEvent.touches[0]).map(function (t) {
5490
          return SugarPosition(t.clientX, t.clientY);
5491
        }) : Optional.none();
5492
      } else {
5493
        var mouseEvent = evt;
5494
        return mouseEvent.clientX !== undefined ? Optional.some(mouseEvent).map(function (me) {
5495
          return SugarPosition(me.clientX, me.clientY);
5496
        }) : Optional.none();
5497
      }
5498
    };
5499
 
637 daniel-mar 5500
    var t = 'top', r = 'right', b = 'bottom', l = 'left';
597 daniel-mar 5501
    var minX = function (detail) {
5502
      return detail.model.minX;
5503
    };
5504
    var minY = function (detail) {
5505
      return detail.model.minY;
5506
    };
5507
    var min1X = function (detail) {
5508
      return detail.model.minX - 1;
5509
    };
5510
    var min1Y = function (detail) {
5511
      return detail.model.minY - 1;
5512
    };
5513
    var maxX = function (detail) {
5514
      return detail.model.maxX;
5515
    };
5516
    var maxY = function (detail) {
5517
      return detail.model.maxY;
5518
    };
5519
    var max1X = function (detail) {
5520
      return detail.model.maxX + 1;
5521
    };
5522
    var max1Y = function (detail) {
5523
      return detail.model.maxY + 1;
5524
    };
637 daniel-mar 5525
    var range$1 = function (detail, max, min) {
597 daniel-mar 5526
      return max(detail) - min(detail);
5527
    };
5528
    var xRange = function (detail) {
637 daniel-mar 5529
      return range$1(detail, maxX, minX);
597 daniel-mar 5530
    };
5531
    var yRange = function (detail) {
637 daniel-mar 5532
      return range$1(detail, maxY, minY);
597 daniel-mar 5533
    };
5534
    var halfX = function (detail) {
5535
      return xRange(detail) / 2;
5536
    };
5537
    var halfY = function (detail) {
5538
      return yRange(detail) / 2;
5539
    };
5540
    var step = function (detail) {
5541
      return detail.stepSize;
5542
    };
5543
    var snap = function (detail) {
5544
      return detail.snapToGrid;
5545
    };
5546
    var snapStart = function (detail) {
5547
      return detail.snapStart;
5548
    };
5549
    var rounded = function (detail) {
5550
      return detail.rounded;
5551
    };
5552
    var hasEdge = function (detail, edgeName) {
5553
      return detail[edgeName + '-edge'] !== undefined;
5554
    };
5555
    var hasLEdge = function (detail) {
5556
      return hasEdge(detail, l);
5557
    };
5558
    var hasREdge = function (detail) {
637 daniel-mar 5559
      return hasEdge(detail, r);
597 daniel-mar 5560
    };
5561
    var hasTEdge = function (detail) {
5562
      return hasEdge(detail, t);
5563
    };
5564
    var hasBEdge = function (detail) {
5565
      return hasEdge(detail, b);
5566
    };
5567
    var currentValue = function (detail) {
5568
      return detail.model.value.get();
5569
    };
5570
 
5571
    var xValue = function (x) {
5572
      return { x: x };
5573
    };
5574
    var yValue = function (y) {
5575
      return { y: y };
5576
    };
5577
    var xyValue = function (x, y) {
5578
      return {
5579
        x: x,
5580
        y: y
5581
      };
5582
    };
637 daniel-mar 5583
    var fireSliderChange$3 = function (component, value) {
597 daniel-mar 5584
      emitWith(component, sliderChangeEvent(), { value: value });
5585
    };
5586
    var setToTLEdgeXY = function (edge, detail) {
637 daniel-mar 5587
      fireSliderChange$3(edge, xyValue(min1X(detail), min1Y(detail)));
597 daniel-mar 5588
    };
5589
    var setToTEdge = function (edge, detail) {
637 daniel-mar 5590
      fireSliderChange$3(edge, yValue(min1Y(detail)));
597 daniel-mar 5591
    };
5592
    var setToTEdgeXY = function (edge, detail) {
637 daniel-mar 5593
      fireSliderChange$3(edge, xyValue(halfX(detail), min1Y(detail)));
597 daniel-mar 5594
    };
5595
    var setToTREdgeXY = function (edge, detail) {
637 daniel-mar 5596
      fireSliderChange$3(edge, xyValue(max1X(detail), min1Y(detail)));
597 daniel-mar 5597
    };
5598
    var setToREdge = function (edge, detail) {
637 daniel-mar 5599
      fireSliderChange$3(edge, xValue(max1X(detail)));
597 daniel-mar 5600
    };
5601
    var setToREdgeXY = function (edge, detail) {
637 daniel-mar 5602
      fireSliderChange$3(edge, xyValue(max1X(detail), halfY(detail)));
597 daniel-mar 5603
    };
5604
    var setToBREdgeXY = function (edge, detail) {
637 daniel-mar 5605
      fireSliderChange$3(edge, xyValue(max1X(detail), max1Y(detail)));
597 daniel-mar 5606
    };
5607
    var setToBEdge = function (edge, detail) {
637 daniel-mar 5608
      fireSliderChange$3(edge, yValue(max1Y(detail)));
597 daniel-mar 5609
    };
5610
    var setToBEdgeXY = function (edge, detail) {
637 daniel-mar 5611
      fireSliderChange$3(edge, xyValue(halfX(detail), max1Y(detail)));
597 daniel-mar 5612
    };
5613
    var setToBLEdgeXY = function (edge, detail) {
637 daniel-mar 5614
      fireSliderChange$3(edge, xyValue(min1X(detail), max1Y(detail)));
597 daniel-mar 5615
    };
5616
    var setToLEdge = function (edge, detail) {
637 daniel-mar 5617
      fireSliderChange$3(edge, xValue(min1X(detail)));
597 daniel-mar 5618
    };
5619
    var setToLEdgeXY = function (edge, detail) {
637 daniel-mar 5620
      fireSliderChange$3(edge, xyValue(min1X(detail), halfY(detail)));
597 daniel-mar 5621
    };
5622
 
5623
    var reduceBy = function (value, min, max, step) {
5624
      if (value < min) {
5625
        return value;
5626
      } else if (value > max) {
5627
        return max;
5628
      } else if (value === min) {
5629
        return min - 1;
5630
      } else {
5631
        return Math.max(min, value - step);
5632
      }
5633
    };
5634
    var increaseBy = function (value, min, max, step) {
5635
      if (value > max) {
5636
        return value;
5637
      } else if (value < min) {
5638
        return min;
5639
      } else if (value === max) {
5640
        return max + 1;
5641
      } else {
5642
        return Math.min(max, value + step);
5643
      }
5644
    };
5645
    var capValue = function (value, min, max) {
5646
      return Math.max(min, Math.min(max, value));
5647
    };
5648
    var snapValueOf = function (value, min, max, step, snapStart) {
5649
      return snapStart.fold(function () {
5650
        var initValue = value - min;
5651
        var extraValue = Math.round(initValue / step) * step;
5652
        return capValue(min + extraValue, min - 1, max + 1);
5653
      }, function (start) {
5654
        var remainder = (value - start) % step;
5655
        var adjustment = Math.round(remainder / step);
5656
        var rawSteps = Math.floor((value - start) / step);
5657
        var maxSteps = Math.floor((max - start) / step);
5658
        var numSteps = Math.min(maxSteps, rawSteps + adjustment);
5659
        var r = start + numSteps * step;
5660
        return Math.max(start, r);
5661
      });
5662
    };
5663
    var findOffsetOf = function (value, min, max) {
5664
      return Math.min(max, Math.max(value, min)) - min;
5665
    };
5666
    var findValueOf = function (args) {
5667
      var min = args.min, max = args.max, range = args.range, value = args.value, step = args.step, snap = args.snap, snapStart = args.snapStart, rounded = args.rounded, hasMinEdge = args.hasMinEdge, hasMaxEdge = args.hasMaxEdge, minBound = args.minBound, maxBound = args.maxBound, screenRange = args.screenRange;
5668
      var capMin = hasMinEdge ? min - 1 : min;
5669
      var capMax = hasMaxEdge ? max + 1 : max;
5670
      if (value < minBound) {
5671
        return capMin;
5672
      } else if (value > maxBound) {
5673
        return capMax;
5674
      } else {
5675
        var offset = findOffsetOf(value, minBound, maxBound);
5676
        var newValue = capValue(offset / screenRange * range + min, capMin, capMax);
5677
        if (snap && newValue >= min && newValue <= max) {
5678
          return snapValueOf(newValue, min, max, step, snapStart);
5679
        } else if (rounded) {
5680
          return Math.round(newValue);
5681
        } else {
5682
          return newValue;
5683
        }
5684
      }
5685
    };
637 daniel-mar 5686
    var findOffsetOfValue$2 = function (args) {
597 daniel-mar 5687
      var min = args.min, max = args.max, range = args.range, value = args.value, hasMinEdge = args.hasMinEdge, hasMaxEdge = args.hasMaxEdge, maxBound = args.maxBound, maxOffset = args.maxOffset, centerMinEdge = args.centerMinEdge, centerMaxEdge = args.centerMaxEdge;
5688
      if (value < min) {
5689
        return hasMinEdge ? 0 : centerMinEdge;
5690
      } else if (value > max) {
5691
        return hasMaxEdge ? maxBound : centerMaxEdge;
5692
      } else {
5693
        return (value - min) / range * maxOffset;
5694
      }
5695
    };
5696
 
5697
    var top = 'top', right = 'right', bottom = 'bottom', left = 'left', width = 'width', height = 'height';
637 daniel-mar 5698
    var getBounds$1 = function (component) {
597 daniel-mar 5699
      return component.element.dom.getBoundingClientRect();
5700
    };
5701
    var getBoundsProperty = function (bounds, property) {
5702
      return bounds[property];
5703
    };
5704
    var getMinXBounds = function (component) {
637 daniel-mar 5705
      var bounds = getBounds$1(component);
597 daniel-mar 5706
      return getBoundsProperty(bounds, left);
5707
    };
5708
    var getMaxXBounds = function (component) {
637 daniel-mar 5709
      var bounds = getBounds$1(component);
597 daniel-mar 5710
      return getBoundsProperty(bounds, right);
5711
    };
5712
    var getMinYBounds = function (component) {
637 daniel-mar 5713
      var bounds = getBounds$1(component);
597 daniel-mar 5714
      return getBoundsProperty(bounds, top);
5715
    };
5716
    var getMaxYBounds = function (component) {
637 daniel-mar 5717
      var bounds = getBounds$1(component);
597 daniel-mar 5718
      return getBoundsProperty(bounds, bottom);
5719
    };
5720
    var getXScreenRange = function (component) {
637 daniel-mar 5721
      var bounds = getBounds$1(component);
597 daniel-mar 5722
      return getBoundsProperty(bounds, width);
5723
    };
5724
    var getYScreenRange = function (component) {
637 daniel-mar 5725
      var bounds = getBounds$1(component);
597 daniel-mar 5726
      return getBoundsProperty(bounds, height);
5727
    };
5728
    var getCenterOffsetOf = function (componentMinEdge, componentMaxEdge, spectrumMinEdge) {
5729
      return (componentMinEdge + componentMaxEdge) / 2 - spectrumMinEdge;
5730
    };
5731
    var getXCenterOffSetOf = function (component, spectrum) {
637 daniel-mar 5732
      var componentBounds = getBounds$1(component);
5733
      var spectrumBounds = getBounds$1(spectrum);
597 daniel-mar 5734
      var componentMinEdge = getBoundsProperty(componentBounds, left);
5735
      var componentMaxEdge = getBoundsProperty(componentBounds, right);
5736
      var spectrumMinEdge = getBoundsProperty(spectrumBounds, left);
5737
      return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge);
5738
    };
5739
    var getYCenterOffSetOf = function (component, spectrum) {
637 daniel-mar 5740
      var componentBounds = getBounds$1(component);
5741
      var spectrumBounds = getBounds$1(spectrum);
597 daniel-mar 5742
      var componentMinEdge = getBoundsProperty(componentBounds, top);
5743
      var componentMaxEdge = getBoundsProperty(componentBounds, bottom);
5744
      var spectrumMinEdge = getBoundsProperty(spectrumBounds, top);
5745
      return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge);
5746
    };
5747
 
637 daniel-mar 5748
    var fireSliderChange$2 = function (spectrum, value) {
597 daniel-mar 5749
      emitWith(spectrum, sliderChangeEvent(), { value: value });
5750
    };
637 daniel-mar 5751
    var sliderValue$2 = function (x) {
597 daniel-mar 5752
      return { x: x };
5753
    };
637 daniel-mar 5754
    var findValueOfOffset$1 = function (spectrum, detail, left) {
597 daniel-mar 5755
      var args = {
5756
        min: minX(detail),
5757
        max: maxX(detail),
5758
        range: xRange(detail),
5759
        value: left,
5760
        step: step(detail),
5761
        snap: snap(detail),
5762
        snapStart: snapStart(detail),
5763
        rounded: rounded(detail),
5764
        hasMinEdge: hasLEdge(detail),
5765
        hasMaxEdge: hasREdge(detail),
5766
        minBound: getMinXBounds(spectrum),
5767
        maxBound: getMaxXBounds(spectrum),
5768
        screenRange: getXScreenRange(spectrum)
5769
      };
5770
      return findValueOf(args);
5771
    };
637 daniel-mar 5772
    var setValueFrom$2 = function (spectrum, detail, value) {
5773
      var xValue = findValueOfOffset$1(spectrum, detail, value);
5774
      var sliderVal = sliderValue$2(xValue);
5775
      fireSliderChange$2(spectrum, sliderVal);
597 daniel-mar 5776
      return xValue;
5777
    };
637 daniel-mar 5778
    var setToMin$2 = function (spectrum, detail) {
597 daniel-mar 5779
      var min = minX(detail);
637 daniel-mar 5780
      fireSliderChange$2(spectrum, sliderValue$2(min));
597 daniel-mar 5781
    };
637 daniel-mar 5782
    var setToMax$2 = function (spectrum, detail) {
597 daniel-mar 5783
      var max = maxX(detail);
637 daniel-mar 5784
      fireSliderChange$2(spectrum, sliderValue$2(max));
597 daniel-mar 5785
    };
637 daniel-mar 5786
    var moveBy$2 = function (direction, spectrum, detail) {
597 daniel-mar 5787
      var f = direction > 0 ? increaseBy : reduceBy;
5788
      var xValue = f(currentValue(detail).x, minX(detail), maxX(detail), step(detail));
637 daniel-mar 5789
      fireSliderChange$2(spectrum, sliderValue$2(xValue));
597 daniel-mar 5790
      return Optional.some(xValue);
5791
    };
637 daniel-mar 5792
    var handleMovement$2 = function (direction) {
597 daniel-mar 5793
      return function (spectrum, detail) {
637 daniel-mar 5794
        return moveBy$2(direction, spectrum, detail).map(always);
597 daniel-mar 5795
      };
5796
    };
637 daniel-mar 5797
    var getValueFromEvent$2 = function (simulatedEvent) {
597 daniel-mar 5798
      var pos = getEventSource(simulatedEvent);
5799
      return pos.map(function (p) {
5800
        return p.left;
5801
      });
5802
    };
5803
    var findOffsetOfValue$1 = function (spectrum, detail, value, minEdge, maxEdge) {
5804
      var minOffset = 0;
5805
      var maxOffset = getXScreenRange(spectrum);
5806
      var centerMinEdge = minEdge.bind(function (edge) {
5807
        return Optional.some(getXCenterOffSetOf(edge, spectrum));
5808
      }).getOr(minOffset);
5809
      var centerMaxEdge = maxEdge.bind(function (edge) {
5810
        return Optional.some(getXCenterOffSetOf(edge, spectrum));
5811
      }).getOr(maxOffset);
5812
      var args = {
5813
        min: minX(detail),
5814
        max: maxX(detail),
5815
        range: xRange(detail),
5816
        value: value,
5817
        hasMinEdge: hasLEdge(detail),
5818
        hasMaxEdge: hasREdge(detail),
5819
        minBound: getMinXBounds(spectrum),
5820
        minOffset: minOffset,
5821
        maxBound: getMaxXBounds(spectrum),
5822
        maxOffset: maxOffset,
5823
        centerMinEdge: centerMinEdge,
5824
        centerMaxEdge: centerMaxEdge
5825
      };
637 daniel-mar 5826
      return findOffsetOfValue$2(args);
597 daniel-mar 5827
    };
637 daniel-mar 5828
    var findPositionOfValue$1 = function (slider, spectrum, value, minEdge, maxEdge, detail) {
597 daniel-mar 5829
      var offset = findOffsetOfValue$1(spectrum, detail, value, minEdge, maxEdge);
5830
      return getMinXBounds(spectrum) - getMinXBounds(slider) + offset;
5831
    };
637 daniel-mar 5832
    var setPositionFromValue$2 = function (slider, thumb, detail, edges) {
597 daniel-mar 5833
      var value = currentValue(detail);
637 daniel-mar 5834
      var pos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.x, edges.getLeftEdge(slider), edges.getRightEdge(slider), detail);
5835
      var thumbRadius = get$5(thumb.element) / 2;
5836
      set$5(thumb.element, 'left', pos - thumbRadius + 'px');
597 daniel-mar 5837
    };
637 daniel-mar 5838
    var onLeft$2 = handleMovement$2(-1);
5839
    var onRight$2 = handleMovement$2(1);
5840
    var onUp$2 = Optional.none;
5841
    var onDown$2 = Optional.none;
5842
    var edgeActions$2 = {
597 daniel-mar 5843
      'top-left': Optional.none(),
5844
      'top': Optional.none(),
5845
      'top-right': Optional.none(),
5846
      'right': Optional.some(setToREdge),
5847
      'bottom-right': Optional.none(),
5848
      'bottom': Optional.none(),
5849
      'bottom-left': Optional.none(),
5850
      'left': Optional.some(setToLEdge)
5851
    };
5852
 
5853
    var HorizontalModel = /*#__PURE__*/Object.freeze({
5854
        __proto__: null,
637 daniel-mar 5855
        setValueFrom: setValueFrom$2,
5856
        setToMin: setToMin$2,
5857
        setToMax: setToMax$2,
5858
        findValueOfOffset: findValueOfOffset$1,
5859
        getValueFromEvent: getValueFromEvent$2,
5860
        findPositionOfValue: findPositionOfValue$1,
5861
        setPositionFromValue: setPositionFromValue$2,
5862
        onLeft: onLeft$2,
5863
        onRight: onRight$2,
5864
        onUp: onUp$2,
5865
        onDown: onDown$2,
5866
        edgeActions: edgeActions$2
597 daniel-mar 5867
    });
5868
 
637 daniel-mar 5869
    var fireSliderChange$1 = function (spectrum, value) {
597 daniel-mar 5870
      emitWith(spectrum, sliderChangeEvent(), { value: value });
5871
    };
5872
    var sliderValue$1 = function (y) {
5873
      return { y: y };
5874
    };
637 daniel-mar 5875
    var findValueOfOffset = function (spectrum, detail, top) {
597 daniel-mar 5876
      var args = {
5877
        min: minY(detail),
5878
        max: maxY(detail),
5879
        range: yRange(detail),
5880
        value: top,
5881
        step: step(detail),
5882
        snap: snap(detail),
5883
        snapStart: snapStart(detail),
5884
        rounded: rounded(detail),
5885
        hasMinEdge: hasTEdge(detail),
5886
        hasMaxEdge: hasBEdge(detail),
5887
        minBound: getMinYBounds(spectrum),
5888
        maxBound: getMaxYBounds(spectrum),
5889
        screenRange: getYScreenRange(spectrum)
5890
      };
5891
      return findValueOf(args);
5892
    };
5893
    var setValueFrom$1 = function (spectrum, detail, value) {
637 daniel-mar 5894
      var yValue = findValueOfOffset(spectrum, detail, value);
597 daniel-mar 5895
      var sliderVal = sliderValue$1(yValue);
637 daniel-mar 5896
      fireSliderChange$1(spectrum, sliderVal);
597 daniel-mar 5897
      return yValue;
5898
    };
5899
    var setToMin$1 = function (spectrum, detail) {
5900
      var min = minY(detail);
637 daniel-mar 5901
      fireSliderChange$1(spectrum, sliderValue$1(min));
597 daniel-mar 5902
    };
5903
    var setToMax$1 = function (spectrum, detail) {
5904
      var max = maxY(detail);
637 daniel-mar 5905
      fireSliderChange$1(spectrum, sliderValue$1(max));
597 daniel-mar 5906
    };
5907
    var moveBy$1 = function (direction, spectrum, detail) {
5908
      var f = direction > 0 ? increaseBy : reduceBy;
5909
      var yValue = f(currentValue(detail).y, minY(detail), maxY(detail), step(detail));
637 daniel-mar 5910
      fireSliderChange$1(spectrum, sliderValue$1(yValue));
597 daniel-mar 5911
      return Optional.some(yValue);
5912
    };
5913
    var handleMovement$1 = function (direction) {
5914
      return function (spectrum, detail) {
5915
        return moveBy$1(direction, spectrum, detail).map(always);
5916
      };
5917
    };
5918
    var getValueFromEvent$1 = function (simulatedEvent) {
5919
      var pos = getEventSource(simulatedEvent);
5920
      return pos.map(function (p) {
5921
        return p.top;
5922
      });
5923
    };
637 daniel-mar 5924
    var findOffsetOfValue = function (spectrum, detail, value, minEdge, maxEdge) {
597 daniel-mar 5925
      var minOffset = 0;
5926
      var maxOffset = getYScreenRange(spectrum);
5927
      var centerMinEdge = minEdge.bind(function (edge) {
5928
        return Optional.some(getYCenterOffSetOf(edge, spectrum));
5929
      }).getOr(minOffset);
5930
      var centerMaxEdge = maxEdge.bind(function (edge) {
5931
        return Optional.some(getYCenterOffSetOf(edge, spectrum));
5932
      }).getOr(maxOffset);
5933
      var args = {
5934
        min: minY(detail),
5935
        max: maxY(detail),
5936
        range: yRange(detail),
5937
        value: value,
5938
        hasMinEdge: hasTEdge(detail),
5939
        hasMaxEdge: hasBEdge(detail),
5940
        minBound: getMinYBounds(spectrum),
5941
        minOffset: minOffset,
5942
        maxBound: getMaxYBounds(spectrum),
5943
        maxOffset: maxOffset,
5944
        centerMinEdge: centerMinEdge,
5945
        centerMaxEdge: centerMaxEdge
5946
      };
637 daniel-mar 5947
      return findOffsetOfValue$2(args);
597 daniel-mar 5948
    };
637 daniel-mar 5949
    var findPositionOfValue = function (slider, spectrum, value, minEdge, maxEdge, detail) {
5950
      var offset = findOffsetOfValue(spectrum, detail, value, minEdge, maxEdge);
597 daniel-mar 5951
      return getMinYBounds(spectrum) - getMinYBounds(slider) + offset;
5952
    };
5953
    var setPositionFromValue$1 = function (slider, thumb, detail, edges) {
5954
      var value = currentValue(detail);
637 daniel-mar 5955
      var pos = findPositionOfValue(slider, edges.getSpectrum(slider), value.y, edges.getTopEdge(slider), edges.getBottomEdge(slider), detail);
5956
      var thumbRadius = get$7(thumb.element) / 2;
5957
      set$5(thumb.element, 'top', pos - thumbRadius + 'px');
597 daniel-mar 5958
    };
5959
    var onLeft$1 = Optional.none;
5960
    var onRight$1 = Optional.none;
5961
    var onUp$1 = handleMovement$1(-1);
5962
    var onDown$1 = handleMovement$1(1);
5963
    var edgeActions$1 = {
5964
      'top-left': Optional.none(),
5965
      'top': Optional.some(setToTEdge),
5966
      'top-right': Optional.none(),
5967
      'right': Optional.none(),
5968
      'bottom-right': Optional.none(),
5969
      'bottom': Optional.some(setToBEdge),
5970
      'bottom-left': Optional.none(),
5971
      'left': Optional.none()
5972
    };
5973
 
5974
    var VerticalModel = /*#__PURE__*/Object.freeze({
5975
        __proto__: null,
5976
        setValueFrom: setValueFrom$1,
5977
        setToMin: setToMin$1,
5978
        setToMax: setToMax$1,
637 daniel-mar 5979
        findValueOfOffset: findValueOfOffset,
597 daniel-mar 5980
        getValueFromEvent: getValueFromEvent$1,
637 daniel-mar 5981
        findPositionOfValue: findPositionOfValue,
597 daniel-mar 5982
        setPositionFromValue: setPositionFromValue$1,
5983
        onLeft: onLeft$1,
5984
        onRight: onRight$1,
5985
        onUp: onUp$1,
5986
        onDown: onDown$1,
5987
        edgeActions: edgeActions$1
5988
    });
5989
 
637 daniel-mar 5990
    var fireSliderChange = function (spectrum, value) {
597 daniel-mar 5991
      emitWith(spectrum, sliderChangeEvent(), { value: value });
5992
    };
637 daniel-mar 5993
    var sliderValue = function (x, y) {
597 daniel-mar 5994
      return {
5995
        x: x,
5996
        y: y
5997
      };
5998
    };
637 daniel-mar 5999
    var setValueFrom = function (spectrum, detail, value) {
6000
      var xValue = findValueOfOffset$1(spectrum, detail, value.left);
6001
      var yValue = findValueOfOffset(spectrum, detail, value.top);
6002
      var val = sliderValue(xValue, yValue);
6003
      fireSliderChange(spectrum, val);
597 daniel-mar 6004
      return val;
6005
    };
637 daniel-mar 6006
    var moveBy = function (direction, isVerticalMovement, spectrum, detail) {
597 daniel-mar 6007
      var f = direction > 0 ? increaseBy : reduceBy;
6008
      var xValue = isVerticalMovement ? currentValue(detail).x : f(currentValue(detail).x, minX(detail), maxX(detail), step(detail));
6009
      var yValue = !isVerticalMovement ? currentValue(detail).y : f(currentValue(detail).y, minY(detail), maxY(detail), step(detail));
637 daniel-mar 6010
      fireSliderChange(spectrum, sliderValue(xValue, yValue));
597 daniel-mar 6011
      return Optional.some(xValue);
6012
    };
637 daniel-mar 6013
    var handleMovement = function (direction, isVerticalMovement) {
597 daniel-mar 6014
      return function (spectrum, detail) {
637 daniel-mar 6015
        return moveBy(direction, isVerticalMovement, spectrum, detail).map(always);
597 daniel-mar 6016
      };
6017
    };
637 daniel-mar 6018
    var setToMin = function (spectrum, detail) {
597 daniel-mar 6019
      var mX = minX(detail);
6020
      var mY = minY(detail);
637 daniel-mar 6021
      fireSliderChange(spectrum, sliderValue(mX, mY));
597 daniel-mar 6022
    };
637 daniel-mar 6023
    var setToMax = function (spectrum, detail) {
597 daniel-mar 6024
      var mX = maxX(detail);
6025
      var mY = maxY(detail);
637 daniel-mar 6026
      fireSliderChange(spectrum, sliderValue(mX, mY));
597 daniel-mar 6027
    };
637 daniel-mar 6028
    var getValueFromEvent = function (simulatedEvent) {
597 daniel-mar 6029
      return getEventSource(simulatedEvent);
6030
    };
637 daniel-mar 6031
    var setPositionFromValue = function (slider, thumb, detail, edges) {
597 daniel-mar 6032
      var value = currentValue(detail);
637 daniel-mar 6033
      var xPos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.x, edges.getLeftEdge(slider), edges.getRightEdge(slider), detail);
6034
      var yPos = findPositionOfValue(slider, edges.getSpectrum(slider), value.y, edges.getTopEdge(slider), edges.getBottomEdge(slider), detail);
6035
      var thumbXRadius = get$5(thumb.element) / 2;
6036
      var thumbYRadius = get$7(thumb.element) / 2;
6037
      set$5(thumb.element, 'left', xPos - thumbXRadius + 'px');
6038
      set$5(thumb.element, 'top', yPos - thumbYRadius + 'px');
597 daniel-mar 6039
    };
637 daniel-mar 6040
    var onLeft = handleMovement(-1, false);
6041
    var onRight = handleMovement(1, false);
6042
    var onUp = handleMovement(-1, true);
6043
    var onDown = handleMovement(1, true);
6044
    var edgeActions = {
597 daniel-mar 6045
      'top-left': Optional.some(setToTLEdgeXY),
6046
      'top': Optional.some(setToTEdgeXY),
6047
      'top-right': Optional.some(setToTREdgeXY),
6048
      'right': Optional.some(setToREdgeXY),
6049
      'bottom-right': Optional.some(setToBREdgeXY),
6050
      'bottom': Optional.some(setToBEdgeXY),
6051
      'bottom-left': Optional.some(setToBLEdgeXY),
6052
      'left': Optional.some(setToLEdgeXY)
6053
    };
6054
 
6055
    var TwoDModel = /*#__PURE__*/Object.freeze({
6056
        __proto__: null,
637 daniel-mar 6057
        setValueFrom: setValueFrom,
6058
        setToMin: setToMin,
6059
        setToMax: setToMax,
6060
        getValueFromEvent: getValueFromEvent,
6061
        setPositionFromValue: setPositionFromValue,
6062
        onLeft: onLeft,
6063
        onRight: onRight,
6064
        onUp: onUp,
6065
        onDown: onDown,
6066
        edgeActions: edgeActions
597 daniel-mar 6067
    });
6068
 
6069
    var SliderSchema = [
637 daniel-mar 6070
      defaulted('stepSize', 1),
6071
      defaulted('onChange', noop),
6072
      defaulted('onChoose', noop),
6073
      defaulted('onInit', noop),
6074
      defaulted('onDragStart', noop),
6075
      defaulted('onDragEnd', noop),
6076
      defaulted('snapToGrid', false),
6077
      defaulted('rounded', true),
597 daniel-mar 6078
      option('snapStart'),
637 daniel-mar 6079
      requiredOf('model', choose$1('mode', {
597 daniel-mar 6080
        x: [
637 daniel-mar 6081
          defaulted('minX', 0),
6082
          defaulted('maxX', 100),
6083
          customField('value', function (spec) {
597 daniel-mar 6084
            return Cell(spec.mode.minX);
6085
          }),
637 daniel-mar 6086
          required$1('getInitialValue'),
597 daniel-mar 6087
          output('manager', HorizontalModel)
6088
        ],
6089
        y: [
637 daniel-mar 6090
          defaulted('minY', 0),
6091
          defaulted('maxY', 100),
6092
          customField('value', function (spec) {
597 daniel-mar 6093
            return Cell(spec.mode.minY);
6094
          }),
637 daniel-mar 6095
          required$1('getInitialValue'),
597 daniel-mar 6096
          output('manager', VerticalModel)
6097
        ],
6098
        xy: [
637 daniel-mar 6099
          defaulted('minX', 0),
6100
          defaulted('maxX', 100),
6101
          defaulted('minY', 0),
6102
          defaulted('maxY', 100),
6103
          customField('value', function (spec) {
597 daniel-mar 6104
            return Cell({
6105
              x: spec.mode.minX,
6106
              y: spec.mode.minY
6107
            });
6108
          }),
637 daniel-mar 6109
          required$1('getInitialValue'),
597 daniel-mar 6110
          output('manager', TwoDModel)
6111
        ]
6112
      })),
6113
      field$1('sliderBehaviours', [
6114
        Keying,
6115
        Representing
6116
      ]),
637 daniel-mar 6117
      customField('mouseIsDown', function () {
597 daniel-mar 6118
        return Cell(false);
6119
      })
6120
    ];
6121
 
637 daniel-mar 6122
    var mouseReleased = constant$1('mouse.released');
597 daniel-mar 6123
 
637 daniel-mar 6124
    var sketch$9 = function (detail, components, _spec, _externals) {
597 daniel-mar 6125
      var _a;
6126
      var getThumb = function (component) {
6127
        return getPartOrDie(component, detail, 'thumb');
6128
      };
6129
      var getSpectrum = function (component) {
6130
        return getPartOrDie(component, detail, 'spectrum');
6131
      };
6132
      var getLeftEdge = function (component) {
6133
        return getPart(component, detail, 'left-edge');
6134
      };
6135
      var getRightEdge = function (component) {
6136
        return getPart(component, detail, 'right-edge');
6137
      };
6138
      var getTopEdge = function (component) {
6139
        return getPart(component, detail, 'top-edge');
6140
      };
6141
      var getBottomEdge = function (component) {
6142
        return getPart(component, detail, 'bottom-edge');
6143
      };
6144
      var modelDetail = detail.model;
6145
      var model = modelDetail.manager;
6146
      var refresh = function (slider, thumb) {
6147
        model.setPositionFromValue(slider, thumb, detail, {
6148
          getLeftEdge: getLeftEdge,
6149
          getRightEdge: getRightEdge,
6150
          getTopEdge: getTopEdge,
6151
          getBottomEdge: getBottomEdge,
6152
          getSpectrum: getSpectrum
6153
        });
6154
      };
6155
      var setValue = function (slider, newValue) {
6156
        modelDetail.value.set(newValue);
6157
        var thumb = getThumb(slider);
6158
        refresh(slider, thumb);
6159
      };
6160
      var changeValue = function (slider, newValue) {
6161
        setValue(slider, newValue);
6162
        var thumb = getThumb(slider);
6163
        detail.onChange(slider, thumb, newValue);
6164
        return Optional.some(true);
6165
      };
6166
      var resetToMin = function (slider) {
6167
        model.setToMin(slider, detail);
6168
      };
6169
      var resetToMax = function (slider) {
6170
        model.setToMax(slider, detail);
6171
      };
6172
      var choose = function (slider) {
6173
        var fireOnChoose = function () {
6174
          getPart(slider, detail, 'thumb').each(function (thumb) {
6175
            var value = modelDetail.value.get();
6176
            detail.onChoose(slider, thumb, value);
6177
          });
6178
        };
6179
        var wasDown = detail.mouseIsDown.get();
6180
        detail.mouseIsDown.set(false);
6181
        if (wasDown) {
6182
          fireOnChoose();
6183
        }
6184
      };
6185
      var onDragStart = function (slider, simulatedEvent) {
6186
        simulatedEvent.stop();
6187
        detail.mouseIsDown.set(true);
6188
        detail.onDragStart(slider, getThumb(slider));
6189
      };
6190
      var onDragEnd = function (slider, simulatedEvent) {
6191
        simulatedEvent.stop();
6192
        detail.onDragEnd(slider, getThumb(slider));
6193
        choose(slider);
6194
      };
6195
      return {
6196
        uid: detail.uid,
6197
        dom: detail.dom,
6198
        components: components,
6199
        behaviours: augment(detail.sliderBehaviours, [
6200
          Keying.config({
6201
            mode: 'special',
6202
            focusIn: function (slider) {
6203
              return getPart(slider, detail, 'spectrum').map(Keying.focusIn).map(always);
6204
            }
6205
          }),
6206
          Representing.config({
6207
            store: {
6208
              mode: 'manual',
6209
              getValue: function (_) {
6210
                return modelDetail.value.get();
6211
              }
6212
            }
6213
          }),
6214
          Receiving.config({ channels: (_a = {}, _a[mouseReleased()] = { onReceive: choose }, _a) })
6215
        ]),
637 daniel-mar 6216
        events: derive$3([
597 daniel-mar 6217
          run(sliderChangeEvent(), function (slider, simulatedEvent) {
6218
            changeValue(slider, simulatedEvent.event.value);
6219
          }),
6220
          runOnAttached(function (slider, _simulatedEvent) {
6221
            var getInitial = modelDetail.getInitialValue();
6222
            modelDetail.value.set(getInitial);
6223
            var thumb = getThumb(slider);
6224
            refresh(slider, thumb);
6225
            var spectrum = getSpectrum(slider);
6226
            detail.onInit(slider, thumb, spectrum, modelDetail.value.get());
6227
          }),
6228
          run(touchstart(), onDragStart),
6229
          run(touchend(), onDragEnd),
6230
          run(mousedown(), onDragStart),
6231
          run(mouseup(), onDragEnd)
6232
        ]),
6233
        apis: {
6234
          resetToMin: resetToMin,
6235
          resetToMax: resetToMax,
6236
          setValue: setValue,
6237
          refresh: refresh
6238
        },
6239
        domModification: { styles: { position: 'relative' } }
6240
      };
6241
    };
6242
 
637 daniel-mar 6243
    var Slider = composite({
597 daniel-mar 6244
      name: 'Slider',
6245
      configFields: SliderSchema,
6246
      partFields: SliderParts,
637 daniel-mar 6247
      factory: sketch$9,
597 daniel-mar 6248
      apis: {
6249
        setValue: function (apis, slider, value) {
6250
          apis.setValue(slider, value);
6251
        },
6252
        resetToMin: function (apis, slider) {
6253
          apis.resetToMin(slider);
6254
        },
6255
        resetToMax: function (apis, slider) {
6256
          apis.resetToMax(slider);
6257
        },
6258
        refresh: function (apis, slider) {
6259
          apis.refresh(slider);
6260
        }
6261
      }
6262
    });
6263
 
6264
    var button = function (realm, clazz, makeItems, editor) {
6265
      return forToolbar(clazz, function () {
6266
        var items = makeItems();
6267
        realm.setContextToolbar([{
6268
            label: clazz + ' group',
6269
            items: items
6270
          }]);
6271
      }, {}, editor);
6272
    };
6273
 
6274
    var BLACK = -1;
637 daniel-mar 6275
    var makeSlider$1 = function (spec$1) {
597 daniel-mar 6276
      var getColor = function (hue) {
6277
        if (hue < 0) {
6278
          return 'black';
6279
        } else if (hue > 360) {
6280
          return 'white';
6281
        } else {
6282
          return 'hsl(' + hue + ', 100%, 50%)';
6283
        }
6284
      };
6285
      var onInit = function (slider, thumb, spectrum, value) {
6286
        var color = getColor(value.x());
637 daniel-mar 6287
        set$5(thumb.element, 'background-color', color);
597 daniel-mar 6288
      };
6289
      var onChange = function (slider, thumb, value) {
6290
        var color = getColor(value.x());
637 daniel-mar 6291
        set$5(thumb.element, 'background-color', color);
597 daniel-mar 6292
        spec$1.onChange(slider, thumb, color);
6293
      };
6294
      return Slider.sketch({
6295
        dom: dom$1('<div class="${prefix}-slider ${prefix}-hue-slider-container"></div>'),
6296
        components: [
6297
          Slider.parts['left-edge'](spec('<div class="${prefix}-hue-slider-black"></div>')),
6298
          Slider.parts.spectrum({
6299
            dom: dom$1('<div class="${prefix}-slider-gradient-container"></div>'),
6300
            components: [spec('<div class="${prefix}-slider-gradient"></div>')],
637 daniel-mar 6301
            behaviours: derive$2([Toggling.config({ toggleClass: resolve('thumb-active') })])
597 daniel-mar 6302
          }),
6303
          Slider.parts['right-edge'](spec('<div class="${prefix}-hue-slider-white"></div>')),
6304
          Slider.parts.thumb({
6305
            dom: dom$1('<div class="${prefix}-slider-thumb"></div>'),
637 daniel-mar 6306
            behaviours: derive$2([Toggling.config({ toggleClass: resolve('thumb-active') })])
597 daniel-mar 6307
          })
6308
        ],
6309
        onChange: onChange,
6310
        onDragStart: function (slider, thumb) {
6311
          Toggling.on(thumb);
6312
        },
6313
        onDragEnd: function (slider, thumb) {
6314
          Toggling.off(thumb);
6315
        },
6316
        onInit: onInit,
6317
        stepSize: 10,
6318
        model: {
6319
          mode: 'x',
6320
          minX: 0,
6321
          maxX: 360,
6322
          getInitialValue: function () {
6323
            return { x: spec$1.getInitialValue() };
6324
          }
6325
        },
637 daniel-mar 6326
        sliderBehaviours: derive$2([orientation(Slider.refresh)])
597 daniel-mar 6327
      });
6328
    };
637 daniel-mar 6329
    var makeItems$1 = function (spec) {
6330
      return [makeSlider$1(spec)];
597 daniel-mar 6331
    };
637 daniel-mar 6332
    var sketch$8 = function (realm, editor) {
597 daniel-mar 6333
      var spec = {
6334
        onChange: function (slider, thumb, color) {
6335
          editor.undoManager.transact(function () {
6336
            editor.formatter.apply('forecolor', { value: color });
6337
            editor.nodeChanged();
6338
          });
6339
        },
637 daniel-mar 6340
        getInitialValue: constant$1(BLACK)
597 daniel-mar 6341
      };
6342
      return button(realm, 'color-levels', function () {
637 daniel-mar 6343
        return makeItems$1(spec);
597 daniel-mar 6344
      }, editor);
6345
    };
6346
 
6347
    var candidatesArray = [
6348
      '9px',
6349
      '10px',
6350
      '11px',
6351
      '12px',
6352
      '14px',
6353
      '16px',
6354
      '18px',
6355
      '20px',
6356
      '24px',
6357
      '32px',
6358
      '36px'
6359
    ];
6360
    var defaultSize = 'medium';
6361
    var defaultIndex = 2;
6362
    var indexToSize = function (index) {
6363
      return Optional.from(candidatesArray[index]);
6364
    };
6365
    var sizeToIndex = function (size) {
637 daniel-mar 6366
      return findIndex$1(candidatesArray, function (v) {
597 daniel-mar 6367
        return v === size;
6368
      });
6369
    };
6370
    var getRawOrComputed = function (isRoot, rawStart) {
6371
      var optStart = isElement(rawStart) ? Optional.some(rawStart) : parent(rawStart).filter(isElement);
6372
      return optStart.map(function (start) {
637 daniel-mar 6373
        var inline = closest$2(start, function (elem) {
597 daniel-mar 6374
          return getRaw(elem, 'font-size').isSome();
6375
        }, isRoot).bind(function (elem) {
6376
          return getRaw(elem, 'font-size');
6377
        });
6378
        return inline.getOrThunk(function () {
637 daniel-mar 6379
          return get$8(start, 'font-size');
597 daniel-mar 6380
        });
6381
      }).getOr('');
6382
    };
6383
    var getSize = function (editor) {
6384
      var node = editor.selection.getStart();
6385
      var elem = SugarElement.fromDom(node);
6386
      var root = SugarElement.fromDom(editor.getBody());
6387
      var isRoot = function (e) {
6388
        return eq(root, e);
6389
      };
6390
      var elemSize = getRawOrComputed(isRoot, elem);
637 daniel-mar 6391
      return find$2(candidatesArray, function (size) {
597 daniel-mar 6392
        return elemSize === size;
6393
      }).getOr(defaultSize);
6394
    };
6395
    var applySize = function (editor, value) {
6396
      var currentValue = getSize(editor);
6397
      if (currentValue !== value) {
6398
        editor.execCommand('fontSize', false, value);
6399
      }
6400
    };
637 daniel-mar 6401
    var get$4 = function (editor) {
597 daniel-mar 6402
      var size = getSize(editor);
6403
      return sizeToIndex(size).getOr(defaultIndex);
6404
    };
637 daniel-mar 6405
    var apply = function (editor, index) {
597 daniel-mar 6406
      indexToSize(index).each(function (size) {
6407
        applySize(editor, size);
6408
      });
6409
    };
637 daniel-mar 6410
    var candidates = constant$1(candidatesArray);
597 daniel-mar 6411
 
637 daniel-mar 6412
    var schema$9 = objOfOnly([
6413
      required$1('getInitialValue'),
6414
      required$1('onChange'),
6415
      required$1('category'),
6416
      required$1('sizes')
597 daniel-mar 6417
    ]);
637 daniel-mar 6418
    var sketch$7 = function (rawSpec) {
6419
      var spec$1 = asRawOrDie$1('SizeSlider', schema$9, rawSpec);
597 daniel-mar 6420
      var isValidValue = function (valueIndex) {
6421
        return valueIndex >= 0 && valueIndex < spec$1.sizes.length;
6422
      };
6423
      var onChange = function (slider, thumb, valueIndex) {
6424
        var index = valueIndex.x();
6425
        if (isValidValue(index)) {
6426
          spec$1.onChange(index);
6427
        }
6428
      };
6429
      return Slider.sketch({
6430
        dom: {
6431
          tag: 'div',
6432
          classes: [
6433
            resolve('slider-' + spec$1.category + '-size-container'),
6434
            resolve('slider'),
6435
            resolve('slider-size-container')
6436
          ]
6437
        },
6438
        onChange: onChange,
6439
        onDragStart: function (slider, thumb) {
6440
          Toggling.on(thumb);
6441
        },
6442
        onDragEnd: function (slider, thumb) {
6443
          Toggling.off(thumb);
6444
        },
6445
        model: {
6446
          mode: 'x',
6447
          minX: 0,
6448
          maxX: spec$1.sizes.length - 1,
6449
          getInitialValue: function () {
6450
            return { x: spec$1.getInitialValue() };
6451
          }
6452
        },
6453
        stepSize: 1,
6454
        snapToGrid: true,
637 daniel-mar 6455
        sliderBehaviours: derive$2([orientation(Slider.refresh)]),
597 daniel-mar 6456
        components: [
6457
          Slider.parts.spectrum({
6458
            dom: dom$1('<div class="${prefix}-slider-size-container"></div>'),
6459
            components: [spec('<div class="${prefix}-slider-size-line"></div>')]
6460
          }),
6461
          Slider.parts.thumb({
6462
            dom: dom$1('<div class="${prefix}-slider-thumb"></div>'),
637 daniel-mar 6463
            behaviours: derive$2([Toggling.config({ toggleClass: resolve('thumb-active') })])
597 daniel-mar 6464
          })
6465
        ]
6466
      });
6467
    };
6468
 
6469
    var sizes = candidates();
637 daniel-mar 6470
    var makeSlider = function (spec) {
6471
      return sketch$7({
597 daniel-mar 6472
        onChange: spec.onChange,
6473
        sizes: sizes,
6474
        category: 'font',
6475
        getInitialValue: spec.getInitialValue
6476
      });
6477
    };
637 daniel-mar 6478
    var makeItems = function (spec$1) {
597 daniel-mar 6479
      return [
6480
        spec('<span class="${prefix}-toolbar-button ${prefix}-icon-small-font ${prefix}-icon"></span>'),
637 daniel-mar 6481
        makeSlider(spec$1),
597 daniel-mar 6482
        spec('<span class="${prefix}-toolbar-button ${prefix}-icon-large-font ${prefix}-icon"></span>')
6483
      ];
6484
    };
637 daniel-mar 6485
    var sketch$6 = function (realm, editor) {
597 daniel-mar 6486
      var spec = {
6487
        onChange: function (value) {
637 daniel-mar 6488
          apply(editor, value);
597 daniel-mar 6489
        },
6490
        getInitialValue: function () {
637 daniel-mar 6491
          return get$4(editor);
597 daniel-mar 6492
        }
6493
      };
6494
      return button(realm, 'font-size', function () {
637 daniel-mar 6495
        return makeItems(spec);
597 daniel-mar 6496
      }, editor);
6497
    };
6498
 
6499
    var record = function (spec) {
637 daniel-mar 6500
      var uid = isSketchSpec$1(spec) && hasNonNullableKey(spec, 'uid') ? spec.uid : generate$2('memento');
597 daniel-mar 6501
      var get = function (anyInSystem) {
6502
        return anyInSystem.getSystem().getByUid(uid).getOrDie();
6503
      };
6504
      var getOpt = function (anyInSystem) {
6505
        return anyInSystem.getSystem().getByUid(uid).toOptional();
6506
      };
6507
      var asSpec = function () {
6508
        return __assign(__assign({}, spec), { uid: uid });
6509
      };
6510
      return {
6511
        get: get,
6512
        getOpt: getOpt,
6513
        asSpec: asSpec
6514
      };
6515
    };
6516
 
679 daniel-mar 6517
    var exports$1 = {}, module = { exports: exports$1 };
6518
    (function (define, exports, module, require) {
6519
      (function (global, factory) {
6520
        typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EphoxContactWrapper = factory());
6521
      }(this, function () {
6522
        var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
6523
        var promise = { exports: {} };
6524
        (function (module) {
6525
          (function (root) {
6526
            var setTimeoutFunc = setTimeout;
6527
            function noop() {
597 daniel-mar 6528
            }
679 daniel-mar 6529
            function bind(fn, thisArg) {
6530
              return function () {
6531
                fn.apply(thisArg, arguments);
6532
              };
597 daniel-mar 6533
            }
679 daniel-mar 6534
            function Promise(fn) {
6535
              if (typeof this !== 'object')
6536
                throw new TypeError('Promises must be constructed via new');
6537
              if (typeof fn !== 'function')
6538
                throw new TypeError('not a function');
6539
              this._state = 0;
6540
              this._handled = false;
6541
              this._value = undefined;
6542
              this._deferreds = [];
6543
              doResolve(fn, this);
597 daniel-mar 6544
            }
679 daniel-mar 6545
            function handle(self, deferred) {
6546
              while (self._state === 3) {
6547
                self = self._value;
6548
              }
6549
              if (self._state === 0) {
6550
                self._deferreds.push(deferred);
6551
                return;
6552
              }
6553
              self._handled = true;
6554
              Promise._immediateFn(function () {
6555
                var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
6556
                if (cb === null) {
6557
                  (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
597 daniel-mar 6558
                  return;
6559
                }
679 daniel-mar 6560
                var ret;
6561
                try {
6562
                  ret = cb(self._value);
6563
                } catch (e) {
6564
                  reject(deferred.promise, e);
6565
                  return;
6566
                }
6567
                resolve(deferred.promise, ret);
6568
              });
6569
            }
6570
            function resolve(self, newValue) {
6571
              try {
6572
                if (newValue === self)
6573
                  throw new TypeError('A promise cannot be resolved with itself.');
6574
                if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
6575
                  var then = newValue.then;
6576
                  if (newValue instanceof Promise) {
6577
                    self._state = 3;
6578
                    self._value = newValue;
6579
                    finale(self);
6580
                    return;
6581
                  } else if (typeof then === 'function') {
6582
                    doResolve(bind(then, newValue), self);
6583
                    return;
6584
                  }
6585
                }
6586
                self._state = 1;
6587
                self._value = newValue;
6588
                finale(self);
6589
              } catch (e) {
6590
                reject(self, e);
597 daniel-mar 6591
              }
679 daniel-mar 6592
            }
6593
            function reject(self, newValue) {
6594
              self._state = 2;
6595
              self._value = newValue;
6596
              finale(self);
6597
            }
6598
            function finale(self) {
6599
              if (self._state === 2 && self._deferreds.length === 0) {
6600
                Promise._immediateFn(function () {
6601
                  if (!self._handled) {
6602
                    Promise._unhandledRejectionFn(self._value);
6603
                  }
6604
                });
597 daniel-mar 6605
              }
679 daniel-mar 6606
              for (var i = 0, len = self._deferreds.length; i < len; i++) {
6607
                handle(self, self._deferreds[i]);
6608
              }
6609
              self._deferreds = null;
597 daniel-mar 6610
            }
679 daniel-mar 6611
            function Handler(onFulfilled, onRejected, promise) {
6612
              this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
6613
              this.onRejected = typeof onRejected === 'function' ? onRejected : null;
6614
              this.promise = promise;
6615
            }
6616
            function doResolve(fn, self) {
6617
              var done = false;
6618
              try {
6619
                fn(function (value) {
6620
                  if (done)
6621
                    return;
6622
                  done = true;
6623
                  resolve(self, value);
6624
                }, function (reason) {
6625
                  if (done)
6626
                    return;
6627
                  done = true;
6628
                  reject(self, reason);
6629
                });
6630
              } catch (ex) {
6631
                if (done)
6632
                  return;
6633
                done = true;
6634
                reject(self, ex);
6635
              }
6636
            }
6637
            Promise.prototype['catch'] = function (onRejected) {
6638
              return this.then(null, onRejected);
6639
            };
6640
            Promise.prototype.then = function (onFulfilled, onRejected) {
6641
              var prom = new this.constructor(noop);
6642
              handle(this, new Handler(onFulfilled, onRejected, prom));
6643
              return prom;
6644
            };
6645
            Promise.all = function (arr) {
6646
              var args = Array.prototype.slice.call(arr);
6647
              return new Promise(function (resolve, reject) {
6648
                if (args.length === 0)
6649
                  return resolve([]);
6650
                var remaining = args.length;
6651
                function res(i, val) {
6652
                  try {
6653
                    if (val && (typeof val === 'object' || typeof val === 'function')) {
6654
                      var then = val.then;
6655
                      if (typeof then === 'function') {
6656
                        then.call(val, function (val) {
6657
                          res(i, val);
6658
                        }, reject);
6659
                        return;
6660
                      }
6661
                    }
6662
                    args[i] = val;
6663
                    if (--remaining === 0) {
6664
                      resolve(args);
6665
                    }
6666
                  } catch (ex) {
6667
                    reject(ex);
6668
                  }
6669
                }
6670
                for (var i = 0; i < args.length; i++) {
6671
                  res(i, args[i]);
6672
                }
6673
              });
6674
            };
6675
            Promise.resolve = function (value) {
6676
              if (value && typeof value === 'object' && value.constructor === Promise) {
6677
                return value;
6678
              }
6679
              return new Promise(function (resolve) {
6680
                resolve(value);
6681
              });
6682
            };
6683
            Promise.reject = function (value) {
6684
              return new Promise(function (resolve, reject) {
6685
                reject(value);
6686
              });
6687
            };
6688
            Promise.race = function (values) {
6689
              return new Promise(function (resolve, reject) {
6690
                for (var i = 0, len = values.length; i < len; i++) {
6691
                  values[i].then(resolve, reject);
6692
                }
6693
              });
6694
            };
6695
            Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) {
6696
              setImmediate(fn);
6697
            } : function (fn) {
6698
              setTimeoutFunc(fn, 0);
6699
            };
6700
            Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
6701
              if (typeof console !== 'undefined' && console) {
6702
                console.warn('Possible Unhandled Promise Rejection:', err);
6703
              }
6704
            };
6705
            Promise._setImmediateFn = function _setImmediateFn(fn) {
6706
              Promise._immediateFn = fn;
6707
            };
6708
            Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {
6709
              Promise._unhandledRejectionFn = fn;
6710
            };
6711
            if (module.exports) {
6712
              module.exports = Promise;
6713
            } else if (!root.Promise) {
6714
              root.Promise = Promise;
6715
            }
6716
          }(commonjsGlobal));
6717
        }(promise));
6718
        var promisePolyfill = promise.exports;
6719
        var Global = function () {
6720
          if (typeof window !== 'undefined') {
6721
            return window;
6722
          } else {
6723
            return Function('return this;')();
597 daniel-mar 6724
          }
679 daniel-mar 6725
        }();
6726
        var promisePolyfill_1 = { boltExport: Global.Promise || promisePolyfill };
6727
        return promisePolyfill_1;
6728
      }));
6729
    }(undefined, exports$1, module));
6730
    var Promise$1 = module.exports.boltExport;
597 daniel-mar 6731
 
6732
    var blobToDataUri = function (blob) {
679 daniel-mar 6733
      return new Promise$1(function (resolve) {
597 daniel-mar 6734
        var reader = new FileReader();
6735
        reader.onloadend = function () {
6736
          resolve(reader.result);
6737
        };
6738
        reader.readAsDataURL(blob);
6739
      });
6740
    };
637 daniel-mar 6741
    var blobToBase64$1 = function (blob) {
597 daniel-mar 6742
      return blobToDataUri(blob).then(function (dataUri) {
6743
        return dataUri.split(',')[1];
6744
      });
6745
    };
6746
 
637 daniel-mar 6747
    var blobToBase64 = function (blob) {
6748
      return blobToBase64$1(blob);
597 daniel-mar 6749
    };
6750
 
6751
    var addImage = function (editor, blob) {
637 daniel-mar 6752
      blobToBase64(blob).then(function (base64) {
597 daniel-mar 6753
        editor.undoManager.transact(function () {
6754
          var cache = editor.editorUpload.blobCache;
637 daniel-mar 6755
          var info = cache.create(generate$4('mceu'), blob, base64);
597 daniel-mar 6756
          cache.add(info);
6757
          var img = editor.dom.createHTML('img', { src: info.blobUri() });
6758
          editor.insertContent(img);
6759
        });
6760
      });
6761
    };
6762
    var extractBlob = function (simulatedEvent) {
6763
      var event = simulatedEvent.event.raw;
6764
      var files = event.target.files || event.dataTransfer.files;
6765
      return Optional.from(files[0]);
6766
    };
637 daniel-mar 6767
    var sketch$5 = function (editor) {
597 daniel-mar 6768
      var pickerDom = {
6769
        tag: 'input',
6770
        attributes: {
6771
          accept: 'image/*',
6772
          type: 'file',
6773
          title: ''
6774
        },
6775
        styles: {
6776
          visibility: 'hidden',
6777
          position: 'absolute'
6778
        }
6779
      };
6780
      var memPicker = record({
6781
        dom: pickerDom,
637 daniel-mar 6782
        events: derive$3([
597 daniel-mar 6783
          cutter(click()),
6784
          run(change(), function (picker, simulatedEvent) {
6785
            extractBlob(simulatedEvent).each(function (blob) {
6786
              addImage(editor, blob);
6787
            });
6788
          })
6789
        ])
6790
      });
6791
      return Button.sketch({
6792
        dom: getToolbarIconButton('image', editor),
6793
        components: [memPicker.asSpec()],
6794
        action: function (button) {
6795
          var picker = memPicker.get(button);
6796
          picker.element.dom.click();
6797
        }
6798
      });
6799
    };
6800
 
637 daniel-mar 6801
    var get$3 = function (element) {
597 daniel-mar 6802
      return element.dom.textContent;
6803
    };
637 daniel-mar 6804
    var set$3 = function (element, value) {
597 daniel-mar 6805
      element.dom.textContent = value;
6806
    };
6807
 
6808
    var isNotEmpty = function (val) {
6809
      return val.length > 0;
6810
    };
6811
    var defaultToEmpty = function (str) {
6812
      return str === undefined || str === null ? '' : str;
6813
    };
6814
    var noLink = function (editor) {
6815
      var text = editor.selection.getContent({ format: 'text' });
6816
      return {
6817
        url: '',
6818
        text: text,
6819
        title: '',
6820
        target: '',
6821
        link: Optional.none()
6822
      };
6823
    };
6824
    var fromLink = function (link) {
637 daniel-mar 6825
      var text = get$3(link);
6826
      var url = get$b(link, 'href');
6827
      var title = get$b(link, 'title');
6828
      var target = get$b(link, 'target');
597 daniel-mar 6829
      return {
6830
        url: defaultToEmpty(url),
6831
        text: text !== url ? defaultToEmpty(text) : '',
6832
        title: defaultToEmpty(title),
6833
        target: defaultToEmpty(target),
6834
        link: Optional.some(link)
6835
      };
6836
    };
6837
    var getInfo = function (editor) {
6838
      return query(editor).fold(function () {
6839
        return noLink(editor);
6840
      }, function (link) {
6841
        return fromLink(link);
6842
      });
6843
    };
6844
    var wasSimple = function (link) {
637 daniel-mar 6845
      var prevHref = get$b(link, 'href');
6846
      var prevText = get$3(link);
597 daniel-mar 6847
      return prevHref === prevText;
6848
    };
6849
    var getTextToApply = function (link, url, info) {
6850
      return info.text.toOptional().filter(isNotEmpty).fold(function () {
6851
        return wasSimple(link) ? Optional.some(url) : Optional.none();
6852
      }, Optional.some);
6853
    };
6854
    var unlinkIfRequired = function (editor, info) {
6855
      var activeLink = info.link.bind(identity);
6856
      activeLink.each(function (_link) {
6857
        editor.execCommand('unlink');
6858
      });
6859
    };
637 daniel-mar 6860
    var getAttrs = function (url, info) {
597 daniel-mar 6861
      var attrs = {};
6862
      attrs.href = url;
6863
      info.title.toOptional().filter(isNotEmpty).each(function (title) {
6864
        attrs.title = title;
6865
      });
6866
      info.target.toOptional().filter(isNotEmpty).each(function (target) {
6867
        attrs.target = target;
6868
      });
6869
      return attrs;
6870
    };
6871
    var applyInfo = function (editor, info) {
6872
      info.url.toOptional().filter(isNotEmpty).fold(function () {
6873
        unlinkIfRequired(editor, info);
6874
      }, function (url) {
637 daniel-mar 6875
        var attrs = getAttrs(url, info);
597 daniel-mar 6876
        var activeLink = info.link.bind(identity);
6877
        activeLink.fold(function () {
6878
          var text = info.text.toOptional().filter(isNotEmpty).getOr(url);
6879
          editor.insertContent(editor.dom.createHTML('a', attrs, editor.dom.encode(text)));
6880
        }, function (link) {
6881
          var text = getTextToApply(link, url, info);
637 daniel-mar 6882
          setAll$1(link, attrs);
597 daniel-mar 6883
          text.each(function (newText) {
637 daniel-mar 6884
            set$3(link, newText);
597 daniel-mar 6885
          });
6886
        });
6887
      });
6888
    };
6889
    var query = function (editor) {
6890
      var start = SugarElement.fromDom(editor.selection.getStart());
637 daniel-mar 6891
      return closest$1(start, 'a');
597 daniel-mar 6892
    };
6893
 
637 daniel-mar 6894
    var platform = detect$1();
6895
    var preserve$1 = function (f, editor) {
597 daniel-mar 6896
      var rng = editor.selection.getRng();
6897
      f();
6898
      editor.selection.setRng(rng);
6899
    };
6900
    var forAndroid = function (editor, f) {
637 daniel-mar 6901
      var wrapper = platform.os.isAndroid() ? preserve$1 : apply$1;
597 daniel-mar 6902
      wrapper(f, editor);
6903
    };
6904
 
637 daniel-mar 6905
    var events$4 = function (name, eventHandlers) {
6906
      var events = derive$3(eventHandlers);
6907
      return create$5({
6908
        fields: [required$1('enabled')],
597 daniel-mar 6909
        name: name,
637 daniel-mar 6910
        active: { events: constant$1(events) }
597 daniel-mar 6911
      });
6912
    };
6913
    var config = function (name, eventHandlers) {
637 daniel-mar 6914
      var me = events$4(name, eventHandlers);
597 daniel-mar 6915
      return {
6916
        key: name,
6917
        value: {
6918
          config: {},
6919
          me: me,
637 daniel-mar 6920
          configAsRaw: constant$1({}),
597 daniel-mar 6921
          initialConfig: {},
6922
          state: NoState
6923
        }
6924
      };
6925
    };
6926
 
6927
    var getCurrent = function (component, composeConfig, _composeState) {
6928
      return composeConfig.find(component);
6929
    };
6930
 
6931
    var ComposeApis = /*#__PURE__*/Object.freeze({
6932
        __proto__: null,
6933
        getCurrent: getCurrent
6934
    });
6935
 
637 daniel-mar 6936
    var ComposeSchema = [required$1('find')];
597 daniel-mar 6937
 
637 daniel-mar 6938
    var Composing = create$5({
597 daniel-mar 6939
      fields: ComposeSchema,
6940
      name: 'composing',
6941
      apis: ComposeApis
6942
    });
6943
 
637 daniel-mar 6944
    var factory$4 = function (detail) {
597 daniel-mar 6945
      var _a = detail.dom, attributes = _a.attributes, domWithoutAttributes = __rest(_a, ['attributes']);
6946
      return {
6947
        uid: detail.uid,
6948
        dom: __assign({
6949
          tag: 'div',
6950
          attributes: __assign({ role: 'presentation' }, attributes)
6951
        }, domWithoutAttributes),
6952
        components: detail.components,
637 daniel-mar 6953
        behaviours: get$6(detail.containerBehaviours),
597 daniel-mar 6954
        events: detail.events,
6955
        domModification: detail.domModification,
6956
        eventOrder: detail.eventOrder
6957
      };
6958
    };
637 daniel-mar 6959
    var Container = single({
597 daniel-mar 6960
      name: 'Container',
637 daniel-mar 6961
      factory: factory$4,
597 daniel-mar 6962
      configFields: [
637 daniel-mar 6963
        defaulted('components', []),
597 daniel-mar 6964
        field$1('containerBehaviours', []),
637 daniel-mar 6965
        defaulted('events', {}),
6966
        defaulted('domModification', {}),
6967
        defaulted('eventOrder', {})
597 daniel-mar 6968
      ]
6969
    });
6970
 
637 daniel-mar 6971
    var factory$3 = function (detail) {
597 daniel-mar 6972
      return {
6973
        uid: detail.uid,
6974
        dom: detail.dom,
6975
        behaviours: SketchBehaviours.augment(detail.dataBehaviours, [
6976
          Representing.config({
6977
            store: {
6978
              mode: 'memory',
6979
              initialValue: detail.getInitialValue()
6980
            }
6981
          }),
6982
          Composing.config({ find: Optional.some })
6983
        ]),
637 daniel-mar 6984
        events: derive$3([runOnAttached(function (component, _simulatedEvent) {
597 daniel-mar 6985
            Representing.setValue(component, detail.getInitialValue());
6986
          })])
6987
      };
6988
    };
637 daniel-mar 6989
    var DataField = single({
597 daniel-mar 6990
      name: 'DataField',
637 daniel-mar 6991
      factory: factory$3,
597 daniel-mar 6992
      configFields: [
637 daniel-mar 6993
        required$1('uid'),
6994
        required$1('dom'),
6995
        required$1('getInitialValue'),
597 daniel-mar 6996
        SketchBehaviours.field('dataBehaviours', [
6997
          Representing,
6998
          Composing
6999
        ])
7000
      ]
7001
    });
7002
 
637 daniel-mar 7003
    var get$2 = function (element) {
597 daniel-mar 7004
      return element.dom.value;
7005
    };
637 daniel-mar 7006
    var set$2 = function (element, value) {
597 daniel-mar 7007
      if (value === undefined) {
7008
        throw new Error('Value.set was undefined');
7009
      }
7010
      element.dom.value = value;
7011
    };
7012
 
637 daniel-mar 7013
    var schema$8 = constant$1([
597 daniel-mar 7014
      option('data'),
637 daniel-mar 7015
      defaulted('inputAttributes', {}),
7016
      defaulted('inputStyles', {}),
7017
      defaulted('tag', 'input'),
7018
      defaulted('inputClasses', []),
597 daniel-mar 7019
      onHandler('onSetValue'),
637 daniel-mar 7020
      defaulted('styles', {}),
7021
      defaulted('eventOrder', {}),
597 daniel-mar 7022
      field$1('inputBehaviours', [
7023
        Representing,
7024
        Focusing
7025
      ]),
637 daniel-mar 7026
      defaulted('selectOnFocus', true)
597 daniel-mar 7027
    ]);
7028
    var focusBehaviours = function (detail) {
637 daniel-mar 7029
      return derive$2([Focusing.config({
597 daniel-mar 7030
          onFocus: !detail.selectOnFocus ? noop : function (component) {
7031
            var input = component.element;
637 daniel-mar 7032
            var value = get$2(input);
597 daniel-mar 7033
            input.dom.setSelectionRange(0, value.length);
7034
          }
7035
        })]);
7036
    };
7037
    var behaviours = function (detail) {
7038
      return __assign(__assign({}, focusBehaviours(detail)), augment(detail.inputBehaviours, [Representing.config({
7039
          store: __assign(__assign({ mode: 'manual' }, detail.data.map(function (data) {
7040
            return { initialValue: data };
7041
          }).getOr({})), {
7042
            getValue: function (input) {
637 daniel-mar 7043
              return get$2(input.element);
597 daniel-mar 7044
            },
7045
            setValue: function (input, data) {
637 daniel-mar 7046
              var current = get$2(input.element);
597 daniel-mar 7047
              if (current !== data) {
637 daniel-mar 7048
                set$2(input.element, data);
597 daniel-mar 7049
              }
7050
            }
7051
          }),
7052
          onSetValue: detail.onSetValue
7053
        })]));
7054
    };
637 daniel-mar 7055
    var dom = function (detail) {
597 daniel-mar 7056
      return {
7057
        tag: detail.tag,
7058
        attributes: __assign({ type: 'text' }, detail.inputAttributes),
7059
        styles: detail.inputStyles,
7060
        classes: detail.inputClasses
7061
      };
7062
    };
7063
 
637 daniel-mar 7064
    var factory$2 = function (detail, _spec) {
597 daniel-mar 7065
      return {
7066
        uid: detail.uid,
637 daniel-mar 7067
        dom: dom(detail),
597 daniel-mar 7068
        components: [],
7069
        behaviours: behaviours(detail),
7070
        eventOrder: detail.eventOrder
7071
      };
7072
    };
637 daniel-mar 7073
    var Input = single({
597 daniel-mar 7074
      name: 'Input',
7075
      configFields: schema$8(),
637 daniel-mar 7076
      factory: factory$2
597 daniel-mar 7077
    });
7078
 
637 daniel-mar 7079
    var exhibit$2 = function (base, tabConfig) {
7080
      return nu$3({
7081
        attributes: wrapAll([{
597 daniel-mar 7082
            key: tabConfig.tabAttr,
7083
            value: 'true'
7084
          }])
7085
      });
7086
    };
7087
 
7088
    var ActiveTabstopping = /*#__PURE__*/Object.freeze({
7089
        __proto__: null,
637 daniel-mar 7090
        exhibit: exhibit$2
597 daniel-mar 7091
    });
7092
 
637 daniel-mar 7093
    var TabstopSchema = [defaulted('tabAttr', 'data-alloy-tabstop')];
597 daniel-mar 7094
 
637 daniel-mar 7095
    var Tabstopping = create$5({
597 daniel-mar 7096
      fields: TabstopSchema,
7097
      name: 'tabstopping',
7098
      active: ActiveTabstopping
7099
    });
7100
 
7101
    var global$3 = tinymce.util.Tools.resolve('tinymce.util.I18n');
7102
 
7103
    var clearInputBehaviour = 'input-clearing';
637 daniel-mar 7104
    var field = function (name, placeholder) {
597 daniel-mar 7105
      var inputSpec = record(Input.sketch({
7106
        inputAttributes: { placeholder: global$3.translate(placeholder) },
637 daniel-mar 7107
        onSetValue: function (input, _data) {
7108
          emit(input, input$1());
597 daniel-mar 7109
        },
637 daniel-mar 7110
        inputBehaviours: derive$2([
597 daniel-mar 7111
          Composing.config({ find: Optional.some }),
7112
          Tabstopping.config({}),
7113
          Keying.config({ mode: 'execution' })
7114
        ]),
7115
        selectOnFocus: false
7116
      }));
7117
      var buttonSpec = record(Button.sketch({
7118
        dom: dom$1('<button class="${prefix}-input-container-x ${prefix}-icon-cancel-circle ${prefix}-icon"></button>'),
7119
        action: function (button) {
7120
          var input = inputSpec.get(button);
7121
          Representing.setValue(input, '');
7122
        }
7123
      }));
7124
      return {
7125
        name: name,
7126
        spec: Container.sketch({
7127
          dom: dom$1('<div class="${prefix}-input-container"></div>'),
7128
          components: [
7129
            inputSpec.asSpec(),
7130
            buttonSpec.asSpec()
7131
          ],
637 daniel-mar 7132
          containerBehaviours: derive$2([
597 daniel-mar 7133
            Toggling.config({ toggleClass: resolve('input-container-empty') }),
7134
            Composing.config({
7135
              find: function (comp) {
7136
                return Optional.some(inputSpec.get(comp));
7137
              }
7138
            }),
637 daniel-mar 7139
            config(clearInputBehaviour, [run(input$1(), function (iContainer) {
597 daniel-mar 7140
                var input = inputSpec.get(iContainer);
7141
                var val = Representing.getValue(input);
7142
                var f = val.length > 0 ? Toggling.off : Toggling.on;
7143
                f(iContainer);
7144
              })])
7145
          ])
7146
        })
7147
      };
7148
    };
7149
    var hidden = function (name) {
7150
      return {
7151
        name: name,
7152
        spec: DataField.sketch({
7153
          dom: {
7154
            tag: 'span',
7155
            styles: { display: 'none' }
7156
          },
7157
          getInitialValue: function () {
7158
            return Optional.none();
7159
          }
7160
        })
7161
      };
7162
    };
7163
 
7164
    var nativeDisabled = [
7165
      'input',
7166
      'button',
7167
      'textarea',
7168
      'select'
7169
    ];
637 daniel-mar 7170
    var onLoad = function (component, disableConfig, disableState) {
597 daniel-mar 7171
      var f = disableConfig.disabled() ? disable : enable;
7172
      f(component, disableConfig);
7173
    };
7174
    var hasNative = function (component, config) {
637 daniel-mar 7175
      return config.useNative === true && contains$1(nativeDisabled, name$1(component.element));
597 daniel-mar 7176
    };
7177
    var nativeIsDisabled = function (component) {
7178
      return has$1(component.element, 'disabled');
7179
    };
7180
    var nativeDisable = function (component) {
637 daniel-mar 7181
      set$8(component.element, 'disabled', 'disabled');
597 daniel-mar 7182
    };
7183
    var nativeEnable = function (component) {
637 daniel-mar 7184
      remove$6(component.element, 'disabled');
597 daniel-mar 7185
    };
7186
    var ariaIsDisabled = function (component) {
637 daniel-mar 7187
      return get$b(component.element, 'aria-disabled') === 'true';
597 daniel-mar 7188
    };
7189
    var ariaDisable = function (component) {
637 daniel-mar 7190
      set$8(component.element, 'aria-disabled', 'true');
597 daniel-mar 7191
    };
7192
    var ariaEnable = function (component) {
637 daniel-mar 7193
      set$8(component.element, 'aria-disabled', 'false');
597 daniel-mar 7194
    };
7195
    var disable = function (component, disableConfig, _disableState) {
7196
      disableConfig.disableClass.each(function (disableClass) {
637 daniel-mar 7197
        add$1(component.element, disableClass);
597 daniel-mar 7198
      });
7199
      var f = hasNative(component, disableConfig) ? nativeDisable : ariaDisable;
7200
      f(component);
7201
      disableConfig.onDisabled(component);
7202
    };
7203
    var enable = function (component, disableConfig, _disableState) {
7204
      disableConfig.disableClass.each(function (disableClass) {
637 daniel-mar 7205
        remove$3(component.element, disableClass);
597 daniel-mar 7206
      });
7207
      var f = hasNative(component, disableConfig) ? nativeEnable : ariaEnable;
7208
      f(component);
7209
      disableConfig.onEnabled(component);
7210
    };
7211
    var isDisabled = function (component, disableConfig) {
7212
      return hasNative(component, disableConfig) ? nativeIsDisabled(component) : ariaIsDisabled(component);
7213
    };
637 daniel-mar 7214
    var set$1 = function (component, disableConfig, disableState, disabled) {
597 daniel-mar 7215
      var f = disabled ? disable : enable;
7216
      f(component, disableConfig);
7217
    };
7218
 
7219
    var DisableApis = /*#__PURE__*/Object.freeze({
7220
        __proto__: null,
7221
        enable: enable,
7222
        disable: disable,
7223
        isDisabled: isDisabled,
637 daniel-mar 7224
        onLoad: onLoad,
7225
        set: set$1
597 daniel-mar 7226
    });
7227
 
637 daniel-mar 7228
    var exhibit$1 = function (base, disableConfig) {
7229
      return nu$3({ classes: disableConfig.disabled() ? disableConfig.disableClass.toArray() : [] });
597 daniel-mar 7230
    };
637 daniel-mar 7231
    var events$3 = function (disableConfig, disableState) {
7232
      return derive$3([
7233
        abort(execute$5(), function (component, _simulatedEvent) {
597 daniel-mar 7234
          return isDisabled(component, disableConfig);
7235
        }),
637 daniel-mar 7236
        loadEvent(disableConfig, disableState, onLoad)
597 daniel-mar 7237
      ]);
7238
    };
7239
 
7240
    var ActiveDisable = /*#__PURE__*/Object.freeze({
7241
        __proto__: null,
637 daniel-mar 7242
        exhibit: exhibit$1,
7243
        events: events$3
597 daniel-mar 7244
    });
7245
 
7246
    var DisableSchema = [
7247
      defaultedFunction('disabled', never),
637 daniel-mar 7248
      defaulted('useNative', true),
597 daniel-mar 7249
      option('disableClass'),
7250
      onHandler('onDisabled'),
7251
      onHandler('onEnabled')
7252
    ];
7253
 
637 daniel-mar 7254
    var Disabling = create$5({
597 daniel-mar 7255
      fields: DisableSchema,
7256
      name: 'disabling',
7257
      active: ActiveDisable,
7258
      apis: DisableApis
7259
    });
7260
 
7261
    var owner$1 = 'form';
637 daniel-mar 7262
    var schema$7 = [field$1('formBehaviours', [Representing])];
597 daniel-mar 7263
    var getPartName = function (name) {
7264
      return '<alloy.field.' + name + '>';
7265
    };
637 daniel-mar 7266
    var sketch$4 = function (fSpec) {
597 daniel-mar 7267
      var parts = function () {
7268
        var record = [];
7269
        var field = function (name, config) {
7270
          record.push(name);
7271
          return generateOne(owner$1, getPartName(name), config);
7272
        };
7273
        return {
7274
          field: field,
637 daniel-mar 7275
          record: constant$1(record)
597 daniel-mar 7276
        };
7277
      }();
7278
      var spec = fSpec(parts);
7279
      var partNames = parts.record();
637 daniel-mar 7280
      var fieldParts = map$2(partNames, function (n) {
597 daniel-mar 7281
        return required({
7282
          name: n,
7283
          pname: getPartName(n)
7284
        });
7285
      });
637 daniel-mar 7286
      return composite$1(owner$1, schema$7, fieldParts, make$4, spec);
597 daniel-mar 7287
    };
637 daniel-mar 7288
    var toResult = function (o, e) {
597 daniel-mar 7289
      return o.fold(function () {
7290
        return Result.error(e);
7291
      }, Result.value);
7292
    };
637 daniel-mar 7293
    var make$4 = function (detail, components) {
597 daniel-mar 7294
      return {
7295
        uid: detail.uid,
7296
        dom: detail.dom,
7297
        components: components,
7298
        behaviours: augment(detail.formBehaviours, [Representing.config({
7299
            store: {
7300
              mode: 'manual',
7301
              getValue: function (form) {
7302
                var resPs = getAllParts(form, detail);
7303
                return map$1(resPs, function (resPThunk, pName) {
7304
                  return resPThunk().bind(function (v) {
7305
                    var opt = Composing.getCurrent(v);
637 daniel-mar 7306
                    return toResult(opt, new Error('Cannot find a current component to extract the value from for form part \'' + pName + '\': ' + element(v.element)));
597 daniel-mar 7307
                  }).map(Representing.getValue);
7308
                });
7309
              },
7310
              setValue: function (form, values) {
637 daniel-mar 7311
                each(values, function (newValue, key) {
597 daniel-mar 7312
                  getPart(form, detail, key).each(function (wrapper) {
7313
                    Composing.getCurrent(wrapper).each(function (field) {
7314
                      Representing.setValue(field, newValue);
7315
                    });
7316
                  });
7317
                });
7318
              }
7319
            }
7320
          })]),
7321
        apis: {
7322
          getField: function (form, key) {
7323
            return getPart(form, detail, key).bind(Composing.getCurrent);
7324
          }
7325
        }
7326
      };
7327
    };
7328
    var Form = {
7329
      getField: makeApi(function (apis, component, key) {
7330
        return apis.getField(component, key);
7331
      }),
637 daniel-mar 7332
      sketch: sketch$4
597 daniel-mar 7333
    };
7334
 
7335
    var SWIPING_LEFT = 1;
7336
    var SWIPING_RIGHT = -1;
7337
    var SWIPING_NONE = 0;
637 daniel-mar 7338
    var init$3 = function (xValue) {
597 daniel-mar 7339
      return {
7340
        xValue: xValue,
7341
        points: []
7342
      };
7343
    };
637 daniel-mar 7344
    var move = function (model, xValue) {
597 daniel-mar 7345
      if (xValue === model.xValue) {
7346
        return model;
7347
      }
7348
      var currentDirection = xValue - model.xValue > 0 ? SWIPING_LEFT : SWIPING_RIGHT;
7349
      var newPoint = {
7350
        direction: currentDirection,
7351
        xValue: xValue
7352
      };
7353
      var priorPoints = function () {
7354
        if (model.points.length === 0) {
7355
          return [];
7356
        } else {
7357
          var prev = model.points[model.points.length - 1];
7358
          return prev.direction === currentDirection ? model.points.slice(0, model.points.length - 1) : model.points;
7359
        }
7360
      }();
7361
      return {
7362
        xValue: xValue,
7363
        points: priorPoints.concat([newPoint])
7364
      };
7365
    };
7366
    var complete = function (model) {
7367
      if (model.points.length === 0) {
7368
        return SWIPING_NONE;
7369
      } else {
7370
        var firstDirection = model.points[0].direction;
7371
        var lastDirection = model.points[model.points.length - 1].direction;
7372
        return firstDirection === SWIPING_RIGHT && lastDirection === SWIPING_RIGHT ? SWIPING_RIGHT : firstDirection === SWIPING_LEFT && lastDirection === SWIPING_LEFT ? SWIPING_LEFT : SWIPING_NONE;
7373
      }
7374
    };
7375
 
637 daniel-mar 7376
    var sketch$3 = function (rawSpec) {
597 daniel-mar 7377
      var navigateEvent = 'navigateEvent';
7378
      var wrapperAdhocEvents = 'serializer-wrapper-events';
7379
      var formAdhocEvents = 'form-events';
7380
      var schema = objOf([
637 daniel-mar 7381
        required$1('fields'),
7382
        defaulted('maxFieldIndex', rawSpec.fields.length - 1),
7383
        required$1('onExecute'),
7384
        required$1('getInitialValue'),
7385
        customField('state', function () {
597 daniel-mar 7386
          return {
637 daniel-mar 7387
            dialogSwipeState: value(),
597 daniel-mar 7388
            currentScreen: Cell(0)
7389
          };
7390
        })
7391
      ]);
637 daniel-mar 7392
      var spec$1 = asRawOrDie$1('SerialisedDialog', schema, rawSpec);
597 daniel-mar 7393
      var navigationButton = function (direction, directionName, enabled) {
7394
        return Button.sketch({
7395
          dom: dom$1('<span class="${prefix}-icon-' + directionName + ' ${prefix}-icon"></span>'),
7396
          action: function (button) {
7397
            emitWith(button, navigateEvent, { direction: direction });
7398
          },
637 daniel-mar 7399
          buttonBehaviours: derive$2([Disabling.config({
597 daniel-mar 7400
              disableClass: resolve('toolbar-navigation-disabled'),
7401
              disabled: function () {
7402
                return !enabled;
7403
              }
7404
            })])
7405
        });
7406
      };
7407
      var reposition = function (dialog, message) {
637 daniel-mar 7408
        descendant(dialog.element, '.' + resolve('serialised-dialog-chain')).each(function (parent) {
7409
          set$5(parent, 'left', -spec$1.state.currentScreen.get() * message.width + 'px');
597 daniel-mar 7410
        });
7411
      };
7412
      var navigate = function (dialog, direction) {
7413
        var screens = descendants(dialog.element, '.' + resolve('serialised-dialog-screen'));
637 daniel-mar 7414
        descendant(dialog.element, '.' + resolve('serialised-dialog-chain')).each(function (parent) {
597 daniel-mar 7415
          if (spec$1.state.currentScreen.get() + direction >= 0 && spec$1.state.currentScreen.get() + direction < screens.length) {
7416
            getRaw(parent, 'left').each(function (left) {
7417
              var currentLeft = parseInt(left, 10);
637 daniel-mar 7418
              var w = get$5(screens[0]);
7419
              set$5(parent, 'left', currentLeft - direction * w + 'px');
597 daniel-mar 7420
            });
7421
            spec$1.state.currentScreen.set(spec$1.state.currentScreen.get() + direction);
7422
          }
7423
        });
7424
      };
7425
      var focusInput = function (dialog) {
7426
        var inputs = descendants(dialog.element, 'input');
7427
        var optInput = Optional.from(inputs[spec$1.state.currentScreen.get()]);
7428
        optInput.each(function (input) {
7429
          dialog.getSystem().getByDom(input).each(function (inputComp) {
7430
            dispatchFocus(dialog, inputComp.element);
7431
          });
7432
        });
7433
        var dotitems = memDots.get(dialog);
7434
        Highlighting.highlightAt(dotitems, spec$1.state.currentScreen.get());
7435
      };
7436
      var resetState = function () {
7437
        spec$1.state.currentScreen.set(0);
7438
        spec$1.state.dialogSwipeState.clear();
7439
      };
7440
      var memForm = record(Form.sketch(function (parts) {
7441
        return {
7442
          dom: dom$1('<div class="${prefix}-serialised-dialog"></div>'),
7443
          components: [Container.sketch({
7444
              dom: dom$1('<div class="${prefix}-serialised-dialog-chain" style="left: 0px; position: absolute;"></div>'),
637 daniel-mar 7445
              components: map$2(spec$1.fields, function (field, i) {
597 daniel-mar 7446
                return i <= spec$1.maxFieldIndex ? Container.sketch({
7447
                  dom: dom$1('<div class="${prefix}-serialised-dialog-screen"></div>'),
7448
                  components: [
7449
                    navigationButton(-1, 'previous', i > 0),
7450
                    parts.field(field.name, field.spec),
7451
                    navigationButton(+1, 'next', i < spec$1.maxFieldIndex)
7452
                  ]
7453
                }) : parts.field(field.name, field.spec);
7454
              })
7455
            })],
637 daniel-mar 7456
          formBehaviours: derive$2([
597 daniel-mar 7457
            orientation(function (dialog, message) {
7458
              reposition(dialog, message);
7459
            }),
7460
            Keying.config({
7461
              mode: 'special',
7462
              focusIn: function (dialog, _specialInfo) {
7463
                focusInput(dialog);
7464
              },
7465
              onTab: function (dialog, _specialInfo) {
7466
                navigate(dialog, +1);
7467
                return Optional.some(true);
7468
              },
7469
              onShiftTab: function (dialog, _specialInfo) {
7470
                navigate(dialog, -1);
7471
                return Optional.some(true);
7472
              }
7473
            }),
7474
            config(formAdhocEvents, [
7475
              runOnAttached(function (dialog, _simulatedEvent) {
7476
                resetState();
7477
                var dotitems = memDots.get(dialog);
7478
                Highlighting.highlightFirst(dotitems);
7479
                spec$1.getInitialValue(dialog).each(function (v) {
7480
                  Representing.setValue(dialog, v);
7481
                });
7482
              }),
7483
              runOnExecute(spec$1.onExecute),
7484
              run(transitionend(), function (dialog, simulatedEvent) {
7485
                var event = simulatedEvent.event;
7486
                if (event.raw.propertyName === 'left') {
7487
                  focusInput(dialog);
7488
                }
7489
              }),
7490
              run(navigateEvent, function (dialog, simulatedEvent) {
7491
                var event = simulatedEvent.event;
7492
                var direction = event.direction;
7493
                navigate(dialog, direction);
7494
              })
7495
            ])
7496
          ])
7497
        };
7498
      }));
7499
      var memDots = record({
7500
        dom: dom$1('<div class="${prefix}-dot-container"></div>'),
637 daniel-mar 7501
        behaviours: derive$2([Highlighting.config({
597 daniel-mar 7502
            highlightClass: resolve('dot-active'),
7503
            itemClass: resolve('dot-item')
7504
          })]),
637 daniel-mar 7505
        components: bind$3(spec$1.fields, function (_f, i) {
597 daniel-mar 7506
          return i <= spec$1.maxFieldIndex ? [spec('<div class="${prefix}-dot-item ${prefix}-icon-full-dot ${prefix}-icon"></div>')] : [];
7507
        })
7508
      });
7509
      return {
7510
        dom: dom$1('<div class="${prefix}-serializer-wrapper"></div>'),
7511
        components: [
7512
          memForm.asSpec(),
7513
          memDots.asSpec()
7514
        ],
637 daniel-mar 7515
        behaviours: derive$2([
597 daniel-mar 7516
          Keying.config({
7517
            mode: 'special',
7518
            focusIn: function (wrapper) {
7519
              var form = memForm.get(wrapper);
7520
              Keying.focusIn(form);
7521
            }
7522
          }),
7523
          config(wrapperAdhocEvents, [
7524
            run(touchstart(), function (_wrapper, simulatedEvent) {
7525
              var event = simulatedEvent.event;
637 daniel-mar 7526
              spec$1.state.dialogSwipeState.set(init$3(event.raw.touches[0].clientX));
597 daniel-mar 7527
            }),
7528
            run(touchmove(), function (_wrapper, simulatedEvent) {
7529
              var event = simulatedEvent.event;
7530
              spec$1.state.dialogSwipeState.on(function (state) {
7531
                simulatedEvent.event.prevent();
637 daniel-mar 7532
                spec$1.state.dialogSwipeState.set(move(state, event.raw.touches[0].clientX));
597 daniel-mar 7533
              });
7534
            }),
7535
            run(touchend(), function (wrapper, _simulatedEvent) {
7536
              spec$1.state.dialogSwipeState.on(function (state) {
7537
                var dialog = memForm.get(wrapper);
7538
                var direction = -1 * complete(state);
7539
                navigate(dialog, direction);
7540
              });
7541
            })
7542
          ])
7543
        ])
7544
      };
7545
    };
7546
 
7547
    var getGroups = cached(function (realm, editor) {
7548
      return [{
7549
          label: 'the link group',
637 daniel-mar 7550
          items: [sketch$3({
597 daniel-mar 7551
              fields: [
637 daniel-mar 7552
                field('url', 'Type or paste URL'),
7553
                field('text', 'Link text'),
7554
                field('title', 'Link title'),
7555
                field('target', 'Link target'),
597 daniel-mar 7556
                hidden('link')
7557
              ],
7558
              maxFieldIndex: [
7559
                'url',
7560
                'text',
7561
                'title',
7562
                'target'
7563
              ].length - 1,
7564
              getInitialValue: function () {
7565
                return Optional.some(getInfo(editor));
7566
              },
7567
              onExecute: function (dialog, _simulatedEvent) {
7568
                var info = Representing.getValue(dialog);
7569
                applyInfo(editor, info);
7570
                realm.restoreToolbar();
7571
                editor.focus();
7572
              }
7573
            })]
7574
        }];
7575
    });
637 daniel-mar 7576
    var sketch$2 = function (realm, editor) {
597 daniel-mar 7577
      return forToolbarStateAction(editor, 'link', 'link', function () {
7578
        var groups = getGroups(realm, editor);
7579
        realm.setContextToolbar(groups);
7580
        forAndroid(editor, function () {
7581
          realm.focusToolbar();
7582
        });
7583
        query(editor).each(function (link) {
7584
          editor.selection.select(link.dom);
7585
        });
7586
      });
7587
    };
7588
 
7589
    var isRecursive = function (component, originator, target) {
7590
      return eq(originator, component.element) && !eq(originator, target);
7591
    };
637 daniel-mar 7592
    var events$2 = derive$3([can(focus$4(), function (component, simulatedEvent) {
597 daniel-mar 7593
        var event = simulatedEvent.event;
7594
        var originator = event.originator;
7595
        var target = event.target;
7596
        if (isRecursive(component, originator, target)) {
637 daniel-mar 7597
          console.warn(focus$4() + ' did not get interpreted by the desired target. ' + '\nOriginator: ' + element(originator) + '\nTarget: ' + element(target) + '\nCheck the ' + focus$4() + ' event handlers');
597 daniel-mar 7598
          return false;
7599
        } else {
7600
          return true;
7601
        }
7602
      })]);
7603
 
7604
    var DefaultEvents = /*#__PURE__*/Object.freeze({
7605
        __proto__: null,
637 daniel-mar 7606
        events: events$2
597 daniel-mar 7607
    });
7608
 
637 daniel-mar 7609
    var make$3 = identity;
597 daniel-mar 7610
 
7611
    var NoContextApi = function (getComp) {
637 daniel-mar 7612
      var getMessage = function (event) {
7613
        return 'The component must be in a context to execute: ' + event + (getComp ? '\n' + element(getComp().element) + ' is not in context.' : '');
7614
      };
597 daniel-mar 7615
      var fail = function (event) {
7616
        return function () {
637 daniel-mar 7617
          throw new Error(getMessage(event));
597 daniel-mar 7618
        };
7619
      };
637 daniel-mar 7620
      var warn = function (event) {
7621
        return function () {
7622
          console.warn(getMessage(event));
7623
        };
7624
      };
597 daniel-mar 7625
      return {
637 daniel-mar 7626
        debugInfo: constant$1('fake'),
7627
        triggerEvent: warn('triggerEvent'),
7628
        triggerFocus: warn('triggerFocus'),
7629
        triggerEscape: warn('triggerEscape'),
7630
        broadcast: warn('broadcast'),
7631
        broadcastOn: warn('broadcastOn'),
7632
        broadcastEvent: warn('broadcastEvent'),
597 daniel-mar 7633
        build: fail('build'),
7634
        addToWorld: fail('addToWorld'),
7635
        removeFromWorld: fail('removeFromWorld'),
7636
        addToGui: fail('addToGui'),
7637
        removeFromGui: fail('removeFromGui'),
7638
        getByUid: fail('getByUid'),
7639
        getByDom: fail('getByDom'),
7640
        isConnected: never
7641
      };
7642
    };
7643
    var singleton = NoContextApi();
7644
 
637 daniel-mar 7645
    var generateFrom$1 = function (spec, all) {
7646
      var schema = map$2(all, function (a) {
597 daniel-mar 7647
        return optionObjOf(a.name(), [
637 daniel-mar 7648
          required$1('config'),
7649
          defaulted('state', NoState)
597 daniel-mar 7650
        ]);
7651
      });
7652
      var validated = asRaw('component.behaviours', objOf(schema), spec.behaviours).fold(function (errInfo) {
7653
        throw new Error(formatError(errInfo) + '\nComplete spec:\n' + JSON.stringify(spec, null, 2));
637 daniel-mar 7654
      }, identity);
597 daniel-mar 7655
      return {
7656
        list: all,
7657
        data: map$1(validated, function (optBlobThunk) {
7658
          var output = optBlobThunk.map(function (blob) {
7659
            return {
7660
              config: blob.config,
7661
              state: blob.state.init(blob.config)
7662
            };
7663
          });
637 daniel-mar 7664
          return constant$1(output);
597 daniel-mar 7665
        })
7666
      };
7667
    };
637 daniel-mar 7668
    var getBehaviours$1 = function (bData) {
597 daniel-mar 7669
      return bData.list;
7670
    };
7671
    var getData = function (bData) {
7672
      return bData.data;
7673
    };
7674
 
7675
    var byInnerKey = function (data, tuple) {
7676
      var r = {};
637 daniel-mar 7677
      each(data, function (detail, key) {
7678
        each(detail, function (value, indexKey) {
7679
          var chain = get$c(r, indexKey).getOr([]);
597 daniel-mar 7680
          r[indexKey] = chain.concat([tuple(key, value)]);
7681
        });
7682
      });
7683
      return r;
7684
    };
7685
 
7686
    var combine$1 = function (info, baseMod, behaviours, base) {
7687
      var modsByBehaviour = __assign({}, baseMod);
637 daniel-mar 7688
      each$1(behaviours, function (behaviour) {
597 daniel-mar 7689
        modsByBehaviour[behaviour.name()] = behaviour.exhibit(info, base);
7690
      });
7691
      var byAspect = byInnerKey(modsByBehaviour, function (name, modification) {
7692
        return {
7693
          name: name,
7694
          modification: modification
7695
        };
7696
      });
7697
      var combineObjects = function (objects) {
7698
        return foldr(objects, function (b, a) {
7699
          return __assign(__assign({}, a.modification), b);
7700
        }, {});
7701
      };
7702
      var combinedClasses = foldr(byAspect.classes, function (b, a) {
7703
        return a.modification.concat(b);
7704
      }, []);
7705
      var combinedAttributes = combineObjects(byAspect.attributes);
7706
      var combinedStyles = combineObjects(byAspect.styles);
637 daniel-mar 7707
      return nu$3({
597 daniel-mar 7708
        classes: combinedClasses,
7709
        attributes: combinedAttributes,
7710
        styles: combinedStyles
7711
      });
7712
    };
7713
 
7714
    var sortKeys = function (label, keyName, array, order) {
7715
      try {
7716
        var sorted = sort(array, function (a, b) {
7717
          var aKey = a[keyName];
7718
          var bKey = b[keyName];
7719
          var aIndex = order.indexOf(aKey);
7720
          var bIndex = order.indexOf(bKey);
7721
          if (aIndex === -1) {
7722
            throw new Error('The ordering for ' + label + ' does not have an entry for ' + aKey + '.\nOrder specified: ' + JSON.stringify(order, null, 2));
7723
          }
7724
          if (bIndex === -1) {
7725
            throw new Error('The ordering for ' + label + ' does not have an entry for ' + bKey + '.\nOrder specified: ' + JSON.stringify(order, null, 2));
7726
          }
7727
          if (aIndex < bIndex) {
7728
            return -1;
7729
          } else if (bIndex < aIndex) {
7730
            return 1;
7731
          } else {
7732
            return 0;
7733
          }
7734
        });
7735
        return Result.value(sorted);
7736
      } catch (err) {
7737
        return Result.error([err]);
7738
      }
7739
    };
7740
 
7741
    var uncurried = function (handler, purpose) {
7742
      return {
7743
        handler: handler,
7744
        purpose: purpose
7745
      };
7746
    };
7747
    var curried = function (handler, purpose) {
7748
      return {
7749
        cHandler: handler,
7750
        purpose: purpose
7751
      };
7752
    };
7753
    var curryArgs = function (descHandler, extraArgs) {
7754
      return curried(curry.apply(undefined, [descHandler.handler].concat(extraArgs)), descHandler.purpose);
7755
    };
7756
    var getCurried = function (descHandler) {
7757
      return descHandler.cHandler;
7758
    };
7759
 
7760
    var behaviourTuple = function (name, handler) {
7761
      return {
7762
        name: name,
7763
        handler: handler
7764
      };
7765
    };
7766
    var nameToHandlers = function (behaviours, info) {
7767
      var r = {};
637 daniel-mar 7768
      each$1(behaviours, function (behaviour) {
597 daniel-mar 7769
        r[behaviour.name()] = behaviour.handlers(info);
7770
      });
7771
      return r;
7772
    };
7773
    var groupByEvents = function (info, behaviours, base) {
7774
      var behaviourEvents = __assign(__assign({}, base), nameToHandlers(behaviours, info));
7775
      return byInnerKey(behaviourEvents, behaviourTuple);
7776
    };
637 daniel-mar 7777
    var combine = function (info, eventOrder, behaviours, base) {
597 daniel-mar 7778
      var byEventName = groupByEvents(info, behaviours, base);
7779
      return combineGroups(byEventName, eventOrder);
7780
    };
7781
    var assemble = function (rawHandler) {
7782
      var handler = read$1(rawHandler);
7783
      return function (component, simulatedEvent) {
7784
        var rest = [];
7785
        for (var _i = 2; _i < arguments.length; _i++) {
7786
          rest[_i - 2] = arguments[_i];
7787
        }
7788
        var args = [
7789
          component,
7790
          simulatedEvent
7791
        ].concat(rest);
7792
        if (handler.abort.apply(undefined, args)) {
7793
          simulatedEvent.stop();
7794
        } else if (handler.can.apply(undefined, args)) {
7795
          handler.run.apply(undefined, args);
7796
        }
7797
      };
7798
    };
7799
    var missingOrderError = function (eventName, tuples) {
637 daniel-mar 7800
      return Result.error(['The event (' + eventName + ') has more than one behaviour that listens to it.\nWhen this occurs, you must ' + 'specify an event ordering for the behaviours in your spec (e.g. [ "listing", "toggling" ]).\nThe behaviours that ' + 'can trigger it are: ' + JSON.stringify(map$2(tuples, function (c) {
597 daniel-mar 7801
          return c.name;
7802
        }), null, 2)]);
7803
    };
637 daniel-mar 7804
    var fuse = function (tuples, eventOrder, eventName) {
597 daniel-mar 7805
      var order = eventOrder[eventName];
7806
      if (!order) {
7807
        return missingOrderError(eventName, tuples);
7808
      } else {
7809
        return sortKeys('Event: ' + eventName, 'name', tuples, order).map(function (sortedTuples) {
637 daniel-mar 7810
          var handlers = map$2(sortedTuples, function (tuple) {
597 daniel-mar 7811
            return tuple.handler;
7812
          });
637 daniel-mar 7813
          return fuse$1(handlers);
597 daniel-mar 7814
        });
7815
      }
7816
    };
7817
    var combineGroups = function (byEventName, eventOrder) {
7818
      var r = mapToArray(byEventName, function (tuples, eventName) {
637 daniel-mar 7819
        var combined = tuples.length === 1 ? Result.value(tuples[0].handler) : fuse(tuples, eventOrder, eventName);
597 daniel-mar 7820
        return combined.map(function (handler) {
7821
          var assembled = assemble(handler);
637 daniel-mar 7822
          var purpose = tuples.length > 1 ? filter$2(eventOrder[eventName], function (o) {
597 daniel-mar 7823
            return exists(tuples, function (t) {
7824
              return t.name === o;
7825
            });
7826
          }).join(' > ') : tuples[0].name;
637 daniel-mar 7827
          return wrap(eventName, uncurried(assembled, purpose));
597 daniel-mar 7828
        });
7829
      });
7830
      return consolidate(r, {});
7831
    };
7832
 
637 daniel-mar 7833
    var _a;
597 daniel-mar 7834
    var baseBehaviour = 'alloy.base.behaviour';
637 daniel-mar 7835
    var schema$6 = objOf([
7836
      field$2('dom', 'dom', required$2(), objOf([
7837
        required$1('tag'),
7838
        defaulted('styles', {}),
7839
        defaulted('classes', []),
7840
        defaulted('attributes', {}),
7841
        option('value'),
7842
        option('innerHtml')
7843
      ])),
7844
      required$1('components'),
7845
      required$1('uid'),
7846
      defaulted('events', {}),
7847
      defaulted('apis', {}),
7848
      field$2('eventOrder', 'eventOrder', mergeWith((_a = {}, _a[execute$5()] = [
7849
        'disabling',
7850
        baseBehaviour,
7851
        'toggling',
7852
        'typeaheadevents'
7853
      ], _a[focus$4()] = [
7854
        baseBehaviour,
7855
        'focusing',
7856
        'keying'
7857
      ], _a[systemInit()] = [
7858
        baseBehaviour,
7859
        'disabling',
7860
        'toggling',
7861
        'representing'
7862
      ], _a[input$1()] = [
7863
        baseBehaviour,
7864
        'representing',
7865
        'streaming',
7866
        'invalidating'
7867
      ], _a[detachedFromDom()] = [
7868
        baseBehaviour,
7869
        'representing',
7870
        'item-events',
7871
        'tooltipping'
7872
      ], _a[mousedown()] = [
7873
        'focusing',
7874
        baseBehaviour,
7875
        'item-type-events'
7876
      ], _a[touchstart()] = [
7877
        'focusing',
7878
        baseBehaviour,
7879
        'item-type-events'
7880
      ], _a[mouseover()] = [
7881
        'item-type-events',
7882
        'tooltipping'
7883
      ], _a[receive$1()] = [
7884
        'receiving',
7885
        'reflecting',
7886
        'tooltipping'
7887
      ], _a)), anyValue()),
7888
      option('domModification')
7889
    ]);
597 daniel-mar 7890
    var toInfo = function (spec) {
637 daniel-mar 7891
      return asRaw('custom.definition', schema$6, spec);
597 daniel-mar 7892
    };
7893
    var toDefinition = function (detail) {
7894
      return __assign(__assign({}, detail.dom), {
7895
        uid: detail.uid,
637 daniel-mar 7896
        domChildren: map$2(detail.components, function (comp) {
597 daniel-mar 7897
          return comp.element;
7898
        })
7899
      });
7900
    };
7901
    var toModification = function (detail) {
7902
      return detail.domModification.fold(function () {
637 daniel-mar 7903
        return nu$3({});
7904
      }, nu$3);
597 daniel-mar 7905
    };
7906
    var toEvents = function (info) {
7907
      return info.events;
7908
    };
7909
 
637 daniel-mar 7910
    var add = function (element, classes) {
7911
      each$1(classes, function (x) {
7912
        add$1(element, x);
597 daniel-mar 7913
      });
7914
    };
637 daniel-mar 7915
    var remove$1 = function (element, classes) {
7916
      each$1(classes, function (x) {
7917
        remove$3(element, x);
597 daniel-mar 7918
      });
7919
    };
7920
 
7921
    var renderToDom = function (definition) {
7922
      var subject = SugarElement.fromTag(definition.tag);
637 daniel-mar 7923
      setAll$1(subject, definition.attributes);
7924
      add(subject, definition.classes);
7925
      setAll(subject, definition.styles);
597 daniel-mar 7926
      definition.innerHtml.each(function (html) {
637 daniel-mar 7927
        return set$7(subject, html);
597 daniel-mar 7928
      });
7929
      var children = definition.domChildren;
7930
      append$1(subject, children);
7931
      definition.value.each(function (value) {
637 daniel-mar 7932
        set$2(subject, value);
597 daniel-mar 7933
      });
7934
      if (!definition.uid) {
7935
        debugger;
7936
      }
7937
      writeOnly(subject, definition.uid);
7938
      return subject;
7939
    };
7940
 
637 daniel-mar 7941
    var getBehaviours = function (spec) {
7942
      var behaviours = get$c(spec, 'behaviours').getOr({});
679 daniel-mar 7943
      return bind$3(keys(behaviours), function (name) {
7944
        var behaviour = behaviours[name];
7945
        return isNonNullable(behaviour) ? [behaviour.me] : [];
597 daniel-mar 7946
      });
7947
    };
637 daniel-mar 7948
    var generateFrom = function (spec, all) {
7949
      return generateFrom$1(spec, all);
7950
    };
7951
    var generate$1 = function (spec) {
7952
      var all = getBehaviours(spec);
597 daniel-mar 7953
      return generateFrom(spec, all);
7954
    };
7955
 
7956
    var getDomDefinition = function (info, bList, bData) {
7957
      var definition = toDefinition(info);
7958
      var infoModification = toModification(info);
7959
      var baseModification = { 'alloy.base.modification': infoModification };
7960
      var modification = bList.length > 0 ? combine$1(bData, baseModification, bList, definition) : infoModification;
637 daniel-mar 7961
      return merge(definition, modification);
597 daniel-mar 7962
    };
7963
    var getEvents = function (info, bList, bData) {
7964
      var baseEvents = { 'alloy.base.behaviour': toEvents(info) };
637 daniel-mar 7965
      return combine(bData, info.eventOrder, bList, baseEvents).getOrDie();
597 daniel-mar 7966
    };
637 daniel-mar 7967
    var build$2 = function (spec) {
597 daniel-mar 7968
      var getMe = function () {
7969
        return me;
7970
      };
7971
      var systemApi = Cell(singleton);
7972
      var info = getOrDie(toInfo(spec));
637 daniel-mar 7973
      var bBlob = generate$1(spec);
7974
      var bList = getBehaviours$1(bBlob);
597 daniel-mar 7975
      var bData = getData(bBlob);
7976
      var modDefinition = getDomDefinition(info, bList, bData);
7977
      var item = renderToDom(modDefinition);
7978
      var events = getEvents(info, bList, bData);
7979
      var subcomponents = Cell(info.components);
7980
      var connect = function (newApi) {
7981
        systemApi.set(newApi);
7982
      };
7983
      var disconnect = function () {
7984
        systemApi.set(NoContextApi(getMe));
7985
      };
7986
      var syncComponents = function () {
7987
        var children$1 = children(item);
637 daniel-mar 7988
        var subs = bind$3(children$1, function (child) {
597 daniel-mar 7989
          return systemApi.get().getByDom(child).fold(function () {
7990
            return [];
637 daniel-mar 7991
          }, pure$2);
597 daniel-mar 7992
        });
7993
        subcomponents.set(subs);
7994
      };
7995
      var config = function (behaviour) {
7996
        var b = bData;
7997
        var f = isFunction(b[behaviour.name()]) ? b[behaviour.name()] : function () {
7998
          throw new Error('Could not find ' + behaviour.name() + ' in ' + JSON.stringify(spec, null, 2));
7999
        };
8000
        return f();
8001
      };
8002
      var hasConfigured = function (behaviour) {
8003
        return isFunction(bData[behaviour.name()]);
8004
      };
8005
      var getApis = function () {
8006
        return info.apis;
8007
      };
8008
      var readState = function (behaviourName) {
8009
        return bData[behaviourName]().map(function (b) {
8010
          return b.state.readState();
8011
        }).getOr('not enabled');
8012
      };
8013
      var me = {
637 daniel-mar 8014
        uid: spec.uid,
597 daniel-mar 8015
        getSystem: systemApi.get,
8016
        config: config,
8017
        hasConfigured: hasConfigured,
8018
        spec: spec,
8019
        readState: readState,
8020
        getApis: getApis,
8021
        connect: connect,
8022
        disconnect: disconnect,
8023
        element: item,
8024
        syncComponents: syncComponents,
8025
        components: subcomponents.get,
8026
        events: events
8027
      };
8028
      return me;
8029
    };
8030
 
8031
    var buildSubcomponents = function (spec) {
637 daniel-mar 8032
      var components = get$c(spec, 'components').getOr([]);
8033
      return map$2(components, build$1);
597 daniel-mar 8034
    };
8035
    var buildFromSpec = function (userSpec) {
637 daniel-mar 8036
      var _a = make$3(userSpec), specEvents = _a.events, spec = __rest(_a, ['events']);
597 daniel-mar 8037
      var components = buildSubcomponents(spec);
8038
      var completeSpec = __assign(__assign({}, spec), {
8039
        events: __assign(__assign({}, DefaultEvents), specEvents),
8040
        components: components
8041
      });
637 daniel-mar 8042
      return Result.value(build$2(completeSpec));
597 daniel-mar 8043
    };
8044
    var text = function (textContent) {
8045
      var element = SugarElement.fromText(textContent);
637 daniel-mar 8046
      return external({ element: element });
597 daniel-mar 8047
    };
637 daniel-mar 8048
    var external = function (spec) {
8049
      var extSpec = asRawOrDie$1('external.component', objOfOnly([
8050
        required$1('element'),
597 daniel-mar 8051
        option('uid')
8052
      ]), spec);
8053
      var systemApi = Cell(NoContextApi());
8054
      var connect = function (newApi) {
8055
        systemApi.set(newApi);
8056
      };
8057
      var disconnect = function () {
8058
        systemApi.set(NoContextApi(function () {
8059
          return me;
8060
        }));
8061
      };
637 daniel-mar 8062
      var uid = extSpec.uid.getOrThunk(function () {
8063
        return generate$2('external');
597 daniel-mar 8064
      });
637 daniel-mar 8065
      writeOnly(extSpec.element, uid);
597 daniel-mar 8066
      var me = {
637 daniel-mar 8067
        uid: uid,
597 daniel-mar 8068
        getSystem: systemApi.get,
8069
        config: Optional.none,
8070
        hasConfigured: never,
8071
        connect: connect,
8072
        disconnect: disconnect,
8073
        getApis: function () {
8074
          return {};
8075
        },
8076
        element: extSpec.element,
8077
        spec: spec,
637 daniel-mar 8078
        readState: constant$1('No state'),
597 daniel-mar 8079
        syncComponents: noop,
637 daniel-mar 8080
        components: constant$1([]),
597 daniel-mar 8081
        events: {}
8082
      };
637 daniel-mar 8083
      return premade$1(me);
597 daniel-mar 8084
    };
637 daniel-mar 8085
    var uids = generate$2;
8086
    var isSketchSpec = function (spec) {
8087
      return has$2(spec, 'uid');
8088
    };
597 daniel-mar 8089
    var build$1 = function (spec) {
637 daniel-mar 8090
      return getPremade(spec).getOrThunk(function () {
8091
        var userSpecWithUid = isSketchSpec(spec) ? spec : __assign({ uid: uids('') }, spec);
597 daniel-mar 8092
        return buildFromSpec(userSpecWithUid).getOrDie();
8093
      });
8094
    };
637 daniel-mar 8095
    var premade = premade$1;
597 daniel-mar 8096
 
8097
    var hoverEvent = 'alloy.item-hover';
8098
    var focusEvent = 'alloy.item-focus';
8099
    var onHover = function (item) {
8100
      if (search(item.element).isNone() || Focusing.isFocused(item)) {
8101
        if (!Focusing.isFocused(item)) {
8102
          Focusing.focus(item);
8103
        }
8104
        emitWith(item, hoverEvent, { item: item });
8105
      }
8106
    };
8107
    var onFocus = function (item) {
8108
      emitWith(item, focusEvent, { item: item });
8109
    };
637 daniel-mar 8110
    var hover = constant$1(hoverEvent);
8111
    var focus$1 = constant$1(focusEvent);
597 daniel-mar 8112
 
637 daniel-mar 8113
    var builder$2 = function (detail) {
597 daniel-mar 8114
      return {
8115
        dom: detail.dom,
8116
        domModification: __assign(__assign({}, detail.domModification), { attributes: __assign(__assign(__assign({ 'role': detail.toggling.isSome() ? 'menuitemcheckbox' : 'menuitem' }, detail.domModification.attributes), { 'aria-haspopup': detail.hasSubmenu }), detail.hasSubmenu ? { 'aria-expanded': false } : {}) }),
8117
        behaviours: SketchBehaviours.augment(detail.itemBehaviours, [
8118
          detail.toggling.fold(Toggling.revoke, function (tConfig) {
8119
            return Toggling.config(__assign({ aria: { mode: 'checked' } }, tConfig));
8120
          }),
8121
          Focusing.config({
8122
            ignore: detail.ignoreFocus,
8123
            stopMousedown: detail.ignoreFocus,
8124
            onFocus: function (component) {
8125
              onFocus(component);
8126
            }
8127
          }),
8128
          Keying.config({ mode: 'execution' }),
8129
          Representing.config({
8130
            store: {
8131
              mode: 'memory',
8132
              initialValue: detail.data
8133
            }
8134
          }),
679 daniel-mar 8135
          config('item-type-events', __spreadArray(__spreadArray([], pointerEvents(), true), [
597 daniel-mar 8136
            run(mouseover(), onHover),
8137
            run(focusItem(), Focusing.focus)
679 daniel-mar 8138
          ], false))
597 daniel-mar 8139
        ]),
8140
        components: detail.components,
8141
        eventOrder: detail.eventOrder
8142
      };
8143
    };
637 daniel-mar 8144
    var schema$5 = [
8145
      required$1('data'),
8146
      required$1('components'),
8147
      required$1('dom'),
8148
      defaulted('hasSubmenu', false),
597 daniel-mar 8149
      option('toggling'),
8150
      SketchBehaviours.field('itemBehaviours', [
8151
        Toggling,
8152
        Focusing,
8153
        Keying,
8154
        Representing
8155
      ]),
637 daniel-mar 8156
      defaulted('ignoreFocus', false),
8157
      defaulted('domModification', {}),
8158
      output('builder', builder$2),
8159
      defaulted('eventOrder', {})
597 daniel-mar 8160
    ];
8161
 
8162
    var builder$1 = function (detail) {
8163
      return {
8164
        dom: detail.dom,
8165
        components: detail.components,
637 daniel-mar 8166
        events: derive$3([stopper(focusItem())])
597 daniel-mar 8167
      };
8168
    };
637 daniel-mar 8169
    var schema$4 = [
8170
      required$1('dom'),
8171
      required$1('components'),
597 daniel-mar 8172
      output('builder', builder$1)
8173
    ];
8174
 
637 daniel-mar 8175
    var owner = constant$1('item-widget');
8176
    var parts$3 = constant$1([required({
597 daniel-mar 8177
        name: 'widget',
8178
        overrides: function (detail) {
8179
          return {
637 daniel-mar 8180
            behaviours: derive$2([Representing.config({
597 daniel-mar 8181
                store: {
8182
                  mode: 'manual',
8183
                  getValue: function (_component) {
8184
                    return detail.data;
8185
                  },
8186
                  setValue: noop
8187
                }
8188
              })])
8189
          };
8190
        }
8191
      })]);
8192
 
637 daniel-mar 8193
    var builder = function (detail) {
8194
      var subs = substitutes(owner(), detail, parts$3());
8195
      var components$1 = components(owner(), detail, subs.internals());
597 daniel-mar 8196
      var focusWidget = function (component) {
8197
        return getPart(component, detail, 'widget').map(function (widget) {
8198
          Keying.focusIn(widget);
8199
          return widget;
8200
        });
8201
      };
8202
      var onHorizontalArrow = function (component, simulatedEvent) {
8203
        return inside(simulatedEvent.event.target) ? Optional.none() : function () {
8204
          if (detail.autofocus) {
8205
            simulatedEvent.setSource(component.element);
8206
            return Optional.none();
8207
          } else {
8208
            return Optional.none();
8209
          }
8210
        }();
8211
      };
8212
      return {
8213
        dom: detail.dom,
8214
        components: components$1,
8215
        domModification: detail.domModification,
637 daniel-mar 8216
        events: derive$3([
597 daniel-mar 8217
          runOnExecute(function (component, simulatedEvent) {
8218
            focusWidget(component).each(function (_widget) {
8219
              simulatedEvent.stop();
8220
            });
8221
          }),
8222
          run(mouseover(), onHover),
8223
          run(focusItem(), function (component, _simulatedEvent) {
8224
            if (detail.autofocus) {
8225
              focusWidget(component);
8226
            } else {
8227
              Focusing.focus(component);
8228
            }
8229
          })
8230
        ]),
8231
        behaviours: SketchBehaviours.augment(detail.widgetBehaviours, [
8232
          Representing.config({
8233
            store: {
8234
              mode: 'memory',
8235
              initialValue: detail.data
8236
            }
8237
          }),
8238
          Focusing.config({
8239
            ignore: detail.ignoreFocus,
8240
            onFocus: function (component) {
8241
              onFocus(component);
8242
            }
8243
          }),
8244
          Keying.config({
8245
            mode: 'special',
8246
            focusIn: detail.autofocus ? function (component) {
8247
              focusWidget(component);
8248
            } : revoke(),
8249
            onLeft: onHorizontalArrow,
8250
            onRight: onHorizontalArrow,
8251
            onEscape: function (component, simulatedEvent) {
8252
              if (!Focusing.isFocused(component) && !detail.autofocus) {
8253
                Focusing.focus(component);
8254
                return Optional.some(true);
8255
              } else if (detail.autofocus) {
8256
                simulatedEvent.setSource(component.element);
8257
                return Optional.none();
8258
              } else {
8259
                return Optional.none();
8260
              }
8261
            }
8262
          })
8263
        ])
8264
      };
8265
    };
637 daniel-mar 8266
    var schema$3 = [
8267
      required$1('uid'),
8268
      required$1('data'),
8269
      required$1('components'),
8270
      required$1('dom'),
8271
      defaulted('autofocus', false),
8272
      defaulted('ignoreFocus', false),
597 daniel-mar 8273
      SketchBehaviours.field('widgetBehaviours', [
8274
        Representing,
8275
        Focusing,
8276
        Keying
8277
      ]),
637 daniel-mar 8278
      defaulted('domModification', {}),
8279
      defaultUidsSchema(parts$3()),
8280
      output('builder', builder)
597 daniel-mar 8281
    ];
8282
 
637 daniel-mar 8283
    var itemSchema = choose$1('type', {
8284
      widget: schema$3,
8285
      item: schema$5,
8286
      separator: schema$4
597 daniel-mar 8287
    });
8288
    var configureGrid = function (detail, movementInfo) {
8289
      return {
8290
        mode: 'flatgrid',
8291
        selector: '.' + detail.markers.item,
8292
        initSize: {
8293
          numColumns: movementInfo.initSize.numColumns,
8294
          numRows: movementInfo.initSize.numRows
8295
        },
8296
        focusManager: detail.focusManager
8297
      };
8298
    };
8299
    var configureMatrix = function (detail, movementInfo) {
8300
      return {
8301
        mode: 'matrix',
8302
        selectors: {
8303
          row: movementInfo.rowSelector,
8304
          cell: '.' + detail.markers.item
8305
        },
8306
        focusManager: detail.focusManager
8307
      };
8308
    };
8309
    var configureMenu = function (detail, movementInfo) {
8310
      return {
8311
        mode: 'menu',
8312
        selector: '.' + detail.markers.item,
8313
        moveOnTab: movementInfo.moveOnTab,
8314
        focusManager: detail.focusManager
8315
      };
8316
    };
637 daniel-mar 8317
    var parts$2 = constant$1([group({
597 daniel-mar 8318
        factory: {
8319
          sketch: function (spec) {
637 daniel-mar 8320
            var itemInfo = asRawOrDie$1('menu.spec item', itemSchema, spec);
597 daniel-mar 8321
            return itemInfo.builder(itemInfo);
8322
          }
8323
        },
8324
        name: 'items',
8325
        unit: 'item',
8326
        defaults: function (detail, u) {
637 daniel-mar 8327
          return has$2(u, 'uid') ? u : __assign(__assign({}, u), { uid: generate$2('item') });
597 daniel-mar 8328
        },
8329
        overrides: function (detail, u) {
8330
          return {
8331
            type: u.type,
8332
            ignoreFocus: detail.fakeFocus,
8333
            domModification: { classes: [detail.markers.item] }
8334
          };
8335
        }
8336
      })]);
637 daniel-mar 8337
    var schema$2 = constant$1([
8338
      required$1('value'),
8339
      required$1('items'),
8340
      required$1('dom'),
8341
      required$1('components'),
8342
      defaulted('eventOrder', {}),
597 daniel-mar 8343
      field$1('menuBehaviours', [
8344
        Highlighting,
8345
        Representing,
8346
        Composing,
8347
        Keying
8348
      ]),
8349
      defaultedOf('movement', {
8350
        mode: 'menu',
8351
        moveOnTab: true
8352
      }, choose$1('mode', {
8353
        grid: [
8354
          initSize(),
8355
          output('config', configureGrid)
8356
        ],
8357
        matrix: [
8358
          output('config', configureMatrix),
637 daniel-mar 8359
          required$1('rowSelector')
597 daniel-mar 8360
        ],
8361
        menu: [
637 daniel-mar 8362
          defaulted('moveOnTab', true),
597 daniel-mar 8363
          output('config', configureMenu)
8364
        ]
8365
      })),
8366
      itemMarkers(),
637 daniel-mar 8367
      defaulted('fakeFocus', false),
8368
      defaulted('focusManager', dom$2()),
597 daniel-mar 8369
      onHandler('onHighlight')
8370
    ]);
8371
 
637 daniel-mar 8372
    var focus = constant$1('alloy.menu-focus');
597 daniel-mar 8373
 
8374
    var make$2 = function (detail, components, _spec, _externals) {
8375
      return {
8376
        uid: detail.uid,
8377
        dom: detail.dom,
8378
        markers: detail.markers,
8379
        behaviours: augment(detail.menuBehaviours, [
8380
          Highlighting.config({
8381
            highlightClass: detail.markers.selectedItem,
8382
            itemClass: detail.markers.item,
8383
            onHighlight: detail.onHighlight
8384
          }),
8385
          Representing.config({
8386
            store: {
8387
              mode: 'memory',
8388
              initialValue: detail.value
8389
            }
8390
          }),
8391
          Composing.config({ find: Optional.some }),
8392
          Keying.config(detail.movement.config(detail, detail.movement))
8393
        ]),
637 daniel-mar 8394
        events: derive$3([
8395
          run(focus$1(), function (menu, simulatedEvent) {
597 daniel-mar 8396
            var event = simulatedEvent.event;
8397
            menu.getSystem().getByDom(event.target).each(function (item) {
8398
              Highlighting.highlight(menu, item);
8399
              simulatedEvent.stop();
637 daniel-mar 8400
              emitWith(menu, focus(), {
597 daniel-mar 8401
                menu: menu,
8402
                item: item
8403
              });
8404
            });
8405
          }),
8406
          run(hover(), function (menu, simulatedEvent) {
8407
            var item = simulatedEvent.event.item;
8408
            Highlighting.highlight(menu, item);
8409
          })
8410
        ]),
8411
        components: components,
8412
        eventOrder: detail.eventOrder,
8413
        domModification: { attributes: { role: 'menu' } }
8414
      };
8415
    };
8416
 
637 daniel-mar 8417
    var Menu = composite({
597 daniel-mar 8418
      name: 'Menu',
637 daniel-mar 8419
      configFields: schema$2(),
8420
      partFields: parts$2(),
597 daniel-mar 8421
      factory: make$2
8422
    });
8423
 
637 daniel-mar 8424
    var preserve = function (f, container) {
597 daniel-mar 8425
      var dos = getRootNode(container);
8426
      var refocus = active(dos).bind(function (focused) {
8427
        var hasFocus = function (elem) {
8428
          return eq(focused, elem);
8429
        };
637 daniel-mar 8430
        return hasFocus(container) ? Optional.some(container) : descendant$1(container, hasFocus);
597 daniel-mar 8431
      });
8432
      var result = f(container);
8433
      refocus.each(function (oldFocus) {
8434
        active(dos).filter(function (newFocus) {
8435
          return eq(newFocus, oldFocus);
8436
        }).fold(function () {
637 daniel-mar 8437
          focus$3(oldFocus);
597 daniel-mar 8438
        }, noop);
8439
      });
8440
      return result;
8441
    };
8442
 
637 daniel-mar 8443
    var set = function (component, replaceConfig, replaceState, data) {
8444
      preserve(function () {
8445
        var newChildren = map$2(data, component.getSystem().build);
597 daniel-mar 8446
        replaceChildren(component, newChildren);
8447
      }, component.element);
8448
    };
8449
    var insert = function (component, replaceConfig, insertion, childSpec) {
8450
      var child = component.getSystem().build(childSpec);
8451
      attachWith(component, child, insertion);
8452
    };
637 daniel-mar 8453
    var append = function (component, replaceConfig, replaceState, appendee) {
8454
      insert(component, replaceConfig, append$2, appendee);
597 daniel-mar 8455
    };
637 daniel-mar 8456
    var prepend = function (component, replaceConfig, replaceState, prependee) {
8457
      insert(component, replaceConfig, prepend$1, prependee);
597 daniel-mar 8458
    };
637 daniel-mar 8459
    var remove = function (component, replaceConfig, replaceState, removee) {
597 daniel-mar 8460
      var children = contents(component);
637 daniel-mar 8461
      var foundChild = find$2(children, function (child) {
597 daniel-mar 8462
        return eq(removee.element, child.element);
8463
      });
8464
      foundChild.each(detach);
8465
    };
8466
    var contents = function (component, _replaceConfig) {
8467
      return component.components();
8468
    };
8469
    var replaceAt = function (component, replaceConfig, replaceState, replaceeIndex, replacer) {
8470
      var children = contents(component);
8471
      return Optional.from(children[replaceeIndex]).map(function (replacee) {
637 daniel-mar 8472
        remove(component, replaceConfig, replaceState, replacee);
597 daniel-mar 8473
        replacer.each(function (r) {
8474
          insert(component, replaceConfig, function (p, c) {
8475
            appendAt(p, c, replaceeIndex);
8476
          }, r);
8477
        });
8478
        return replacee;
8479
      });
8480
    };
8481
    var replaceBy = function (component, replaceConfig, replaceState, replaceePred, replacer) {
8482
      var children = contents(component);
637 daniel-mar 8483
      return findIndex$1(children, replaceePred).bind(function (replaceeIndex) {
597 daniel-mar 8484
        return replaceAt(component, replaceConfig, replaceState, replaceeIndex, replacer);
8485
      });
8486
    };
8487
 
8488
    var ReplaceApis = /*#__PURE__*/Object.freeze({
8489
        __proto__: null,
637 daniel-mar 8490
        append: append,
8491
        prepend: prepend,
8492
        remove: remove,
597 daniel-mar 8493
        replaceAt: replaceAt,
8494
        replaceBy: replaceBy,
637 daniel-mar 8495
        set: set,
597 daniel-mar 8496
        contents: contents
8497
    });
8498
 
637 daniel-mar 8499
    var Replacing = create$5({
597 daniel-mar 8500
      fields: [],
8501
      name: 'replacing',
8502
      apis: ReplaceApis
8503
    });
8504
 
8505
    var transpose = function (obj) {
8506
      return tupleMap(obj, function (v, k) {
8507
        return {
8508
          k: v,
8509
          v: k
8510
        };
8511
      });
8512
    };
8513
    var trace = function (items, byItem, byMenu, finish) {
637 daniel-mar 8514
      return get$c(byMenu, finish).bind(function (triggerItem) {
8515
        return get$c(items, triggerItem).bind(function (triggerMenu) {
597 daniel-mar 8516
          var rest = trace(items, byItem, byMenu, triggerMenu);
8517
          return Optional.some([triggerMenu].concat(rest));
8518
        });
8519
      }).getOr([]);
8520
    };
637 daniel-mar 8521
    var generate = function (menus, expansions) {
597 daniel-mar 8522
      var items = {};
637 daniel-mar 8523
      each(menus, function (menuItems, menu) {
8524
        each$1(menuItems, function (item) {
597 daniel-mar 8525
          items[item] = menu;
8526
        });
8527
      });
8528
      var byItem = expansions;
8529
      var byMenu = transpose(expansions);
8530
      var menuPaths = map$1(byMenu, function (_triggerItem, submenu) {
8531
        return [submenu].concat(trace(items, byItem, byMenu, submenu));
8532
      });
8533
      return map$1(items, function (menu) {
637 daniel-mar 8534
        return get$c(menuPaths, menu).getOr([menu]);
597 daniel-mar 8535
      });
8536
    };
8537
 
637 daniel-mar 8538
    var init$2 = function () {
597 daniel-mar 8539
      var expansions = Cell({});
8540
      var menus = Cell({});
8541
      var paths = Cell({});
637 daniel-mar 8542
      var primary = value();
597 daniel-mar 8543
      var directory = Cell({});
8544
      var clear = function () {
8545
        expansions.set({});
8546
        menus.set({});
8547
        paths.set({});
637 daniel-mar 8548
        primary.clear();
597 daniel-mar 8549
      };
8550
      var isClear = function () {
8551
        return primary.get().isNone();
8552
      };
8553
      var setMenuBuilt = function (menuName, built) {
8554
        var _a;
8555
        menus.set(__assign(__assign({}, menus.get()), (_a = {}, _a[menuName] = {
8556
          type: 'prepared',
8557
          menu: built
8558
        }, _a)));
8559
      };
8560
      var setContents = function (sPrimary, sMenus, sExpansions, dir) {
637 daniel-mar 8561
        primary.set(sPrimary);
597 daniel-mar 8562
        expansions.set(sExpansions);
8563
        menus.set(sMenus);
8564
        directory.set(dir);
637 daniel-mar 8565
        var sPaths = generate(dir, sExpansions);
597 daniel-mar 8566
        paths.set(sPaths);
8567
      };
8568
      var getTriggeringItem = function (menuValue) {
637 daniel-mar 8569
        return find(expansions.get(), function (v, _k) {
597 daniel-mar 8570
          return v === menuValue;
8571
        });
8572
      };
8573
      var getTriggerData = function (menuValue, getItemByValue, path) {
8574
        return getPreparedMenu(menuValue).bind(function (menu) {
8575
          return getTriggeringItem(menuValue).bind(function (triggeringItemValue) {
8576
            return getItemByValue(triggeringItemValue).map(function (triggeredItem) {
8577
              return {
8578
                triggeredMenu: menu,
8579
                triggeringItem: triggeredItem,
8580
                triggeringPath: path
8581
              };
8582
            });
8583
          });
8584
        });
8585
      };
8586
      var getTriggeringPath = function (itemValue, getItemByValue) {
637 daniel-mar 8587
        var extraPath = filter$2(lookupItem(itemValue).toArray(), function (menuValue) {
597 daniel-mar 8588
          return getPreparedMenu(menuValue).isSome();
8589
        });
637 daniel-mar 8590
        return get$c(paths.get(), itemValue).bind(function (path) {
597 daniel-mar 8591
          var revPath = reverse(extraPath.concat(path));
637 daniel-mar 8592
          var triggers = bind$3(revPath, function (menuValue, menuIndex) {
597 daniel-mar 8593
            return getTriggerData(menuValue, getItemByValue, revPath.slice(0, menuIndex + 1)).fold(function () {
637 daniel-mar 8594
              return is(primary.get(), menuValue) ? [] : [Optional.none()];
597 daniel-mar 8595
            }, function (data) {
8596
              return [Optional.some(data)];
8597
            });
8598
          });
8599
          return sequence(triggers);
8600
        });
8601
      };
8602
      var expand = function (itemValue) {
637 daniel-mar 8603
        return get$c(expansions.get(), itemValue).map(function (menu) {
8604
          var current = get$c(paths.get(), itemValue).getOr([]);
597 daniel-mar 8605
          return [menu].concat(current);
8606
        });
8607
      };
8608
      var collapse = function (itemValue) {
637 daniel-mar 8609
        return get$c(paths.get(), itemValue).bind(function (path) {
597 daniel-mar 8610
          return path.length > 1 ? Optional.some(path.slice(1)) : Optional.none();
8611
        });
8612
      };
8613
      var refresh = function (itemValue) {
637 daniel-mar 8614
        return get$c(paths.get(), itemValue);
597 daniel-mar 8615
      };
8616
      var getPreparedMenu = function (menuValue) {
8617
        return lookupMenu(menuValue).bind(extractPreparedMenu);
8618
      };
8619
      var lookupMenu = function (menuValue) {
637 daniel-mar 8620
        return get$c(menus.get(), menuValue);
597 daniel-mar 8621
      };
8622
      var lookupItem = function (itemValue) {
637 daniel-mar 8623
        return get$c(expansions.get(), itemValue);
597 daniel-mar 8624
      };
8625
      var otherMenus = function (path) {
8626
        var menuValues = directory.get();
8627
        return difference(keys(menuValues), path);
8628
      };
8629
      var getPrimary = function () {
8630
        return primary.get().bind(getPreparedMenu);
8631
      };
8632
      var getMenus = function () {
8633
        return menus.get();
8634
      };
8635
      return {
8636
        setMenuBuilt: setMenuBuilt,
8637
        setContents: setContents,
8638
        expand: expand,
8639
        refresh: refresh,
8640
        collapse: collapse,
8641
        lookupMenu: lookupMenu,
8642
        lookupItem: lookupItem,
8643
        otherMenus: otherMenus,
8644
        getPrimary: getPrimary,
8645
        getMenus: getMenus,
8646
        clear: clear,
8647
        isClear: isClear,
8648
        getTriggeringPath: getTriggeringPath
8649
      };
8650
    };
8651
    var extractPreparedMenu = function (prep) {
8652
      return prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none();
8653
    };
8654
    var LayeredState = {
637 daniel-mar 8655
      init: init$2,
597 daniel-mar 8656
      extractPreparedMenu: extractPreparedMenu
8657
    };
8658
 
637 daniel-mar 8659
    var make$1 = function (detail, _rawUiSpec) {
8660
      var submenuParentItems = value();
597 daniel-mar 8661
      var buildMenus = function (container, primaryName, menus) {
8662
        return map$1(menus, function (spec, name) {
8663
          var makeSketch = function () {
8664
            return Menu.sketch(__assign(__assign({}, spec), {
8665
              value: name,
8666
              markers: detail.markers,
8667
              fakeFocus: detail.fakeFocus,
8668
              onHighlight: detail.onHighlight,
637 daniel-mar 8669
              focusManager: detail.fakeFocus ? highlights() : dom$2()
597 daniel-mar 8670
            }));
8671
          };
8672
          return name === primaryName ? {
8673
            type: 'prepared',
8674
            menu: container.getSystem().build(makeSketch())
8675
          } : {
8676
            type: 'notbuilt',
8677
            nbMenu: makeSketch
8678
          };
8679
        });
8680
      };
8681
      var layeredState = LayeredState.init();
8682
      var setup = function (container) {
8683
        var componentMap = buildMenus(container, detail.data.primary, detail.data.menus);
8684
        var directory = toDirectory();
8685
        layeredState.setContents(detail.data.primary, componentMap, detail.data.expansions, directory);
8686
        return layeredState.getPrimary();
8687
      };
8688
      var getItemValue = function (item) {
8689
        return Representing.getValue(item).value;
8690
      };
8691
      var getItemByValue = function (_container, menus, itemValue) {
8692
        return findMap(menus, function (menu) {
8693
          if (!menu.getSystem().isConnected()) {
8694
            return Optional.none();
8695
          }
8696
          var candidates = Highlighting.getCandidates(menu);
637 daniel-mar 8697
          return find$2(candidates, function (c) {
597 daniel-mar 8698
            return getItemValue(c) === itemValue;
8699
          });
8700
        });
8701
      };
8702
      var toDirectory = function (_container) {
8703
        return map$1(detail.data.menus, function (data, _menuName) {
637 daniel-mar 8704
          return bind$3(data.items, function (item) {
597 daniel-mar 8705
            return item.type === 'separator' ? [] : [item.data.value];
8706
          });
8707
        });
8708
      };
8709
      var setActiveMenu = function (container, menu) {
8710
        Highlighting.highlight(container, menu);
8711
        Highlighting.getHighlighted(menu).orThunk(function () {
8712
          return Highlighting.getFirst(menu);
8713
        }).each(function (item) {
8714
          dispatch(container, item.element, focusItem());
8715
        });
8716
      };
8717
      var getMenus = function (state, menuValues) {
637 daniel-mar 8718
        return cat(map$2(menuValues, function (mv) {
597 daniel-mar 8719
          return state.lookupMenu(mv).bind(function (prep) {
8720
            return prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none();
8721
          });
8722
        }));
8723
      };
8724
      var closeOthers = function (container, state, path) {
8725
        var others = getMenus(state, state.otherMenus(path));
637 daniel-mar 8726
        each$1(others, function (o) {
8727
          remove$1(o.element, [detail.markers.backgroundMenu]);
597 daniel-mar 8728
          if (!detail.stayInDom) {
8729
            Replacing.remove(container, o);
8730
          }
8731
        });
8732
      };
8733
      var getSubmenuParents = function (container) {
8734
        return submenuParentItems.get().getOrThunk(function () {
8735
          var r = {};
8736
          var items = descendants(container.element, '.' + detail.markers.item);
637 daniel-mar 8737
          var parentItems = filter$2(items, function (i) {
8738
            return get$b(i, 'aria-haspopup') === 'true';
597 daniel-mar 8739
          });
637 daniel-mar 8740
          each$1(parentItems, function (i) {
597 daniel-mar 8741
            container.getSystem().getByDom(i).each(function (itemComp) {
8742
              var key = getItemValue(itemComp);
8743
              r[key] = itemComp;
8744
            });
8745
          });
637 daniel-mar 8746
          submenuParentItems.set(r);
597 daniel-mar 8747
          return r;
8748
        });
8749
      };
8750
      var updateAriaExpansions = function (container, path) {
8751
        var parentItems = getSubmenuParents(container);
637 daniel-mar 8752
        each(parentItems, function (v, k) {
8753
          var expanded = contains$1(path, k);
8754
          set$8(v.element, 'aria-expanded', expanded);
597 daniel-mar 8755
        });
8756
      };
8757
      var updateMenuPath = function (container, state, path) {
8758
        return Optional.from(path[0]).bind(function (latestMenuName) {
8759
          return state.lookupMenu(latestMenuName).bind(function (menuPrep) {
8760
            if (menuPrep.type === 'notbuilt') {
8761
              return Optional.none();
8762
            } else {
8763
              var activeMenu = menuPrep.menu;
8764
              var rest = getMenus(state, path.slice(1));
637 daniel-mar 8765
              each$1(rest, function (r) {
8766
                add$1(r.element, detail.markers.backgroundMenu);
597 daniel-mar 8767
              });
8768
              if (!inBody(activeMenu.element)) {
637 daniel-mar 8769
                Replacing.append(container, premade(activeMenu));
597 daniel-mar 8770
              }
637 daniel-mar 8771
              remove$1(activeMenu.element, [detail.markers.backgroundMenu]);
597 daniel-mar 8772
              setActiveMenu(container, activeMenu);
8773
              closeOthers(container, state, path);
8774
              return Optional.some(activeMenu);
8775
            }
8776
          });
8777
        });
8778
      };
8779
      var ExpandHighlightDecision;
8780
      (function (ExpandHighlightDecision) {
8781
        ExpandHighlightDecision[ExpandHighlightDecision['HighlightSubmenu'] = 0] = 'HighlightSubmenu';
8782
        ExpandHighlightDecision[ExpandHighlightDecision['HighlightParent'] = 1] = 'HighlightParent';
8783
      }(ExpandHighlightDecision || (ExpandHighlightDecision = {})));
8784
      var buildIfRequired = function (container, menuName, menuPrep) {
8785
        if (menuPrep.type === 'notbuilt') {
8786
          var menu = container.getSystem().build(menuPrep.nbMenu());
8787
          layeredState.setMenuBuilt(menuName, menu);
8788
          return menu;
8789
        } else {
8790
          return menuPrep.menu;
8791
        }
8792
      };
8793
      var expandRight = function (container, item, decision) {
8794
        if (decision === void 0) {
8795
          decision = ExpandHighlightDecision.HighlightSubmenu;
8796
        }
637 daniel-mar 8797
        if (item.hasConfigured(Disabling) && Disabling.isDisabled(item)) {
8798
          return Optional.some(item);
8799
        } else {
8800
          var value = getItemValue(item);
8801
          return layeredState.expand(value).bind(function (path) {
8802
            updateAriaExpansions(container, path);
8803
            return Optional.from(path[0]).bind(function (menuName) {
8804
              return layeredState.lookupMenu(menuName).bind(function (activeMenuPrep) {
8805
                var activeMenu = buildIfRequired(container, menuName, activeMenuPrep);
8806
                if (!inBody(activeMenu.element)) {
8807
                  Replacing.append(container, premade(activeMenu));
8808
                }
8809
                detail.onOpenSubmenu(container, item, activeMenu, reverse(path));
8810
                if (decision === ExpandHighlightDecision.HighlightSubmenu) {
8811
                  Highlighting.highlightFirst(activeMenu);
8812
                  return updateMenuPath(container, layeredState, path);
8813
                } else {
8814
                  Highlighting.dehighlightAll(activeMenu);
8815
                  return Optional.some(item);
8816
                }
8817
              });
597 daniel-mar 8818
            });
8819
          });
637 daniel-mar 8820
        }
597 daniel-mar 8821
      };
8822
      var collapseLeft = function (container, item) {
8823
        var value = getItemValue(item);
8824
        return layeredState.collapse(value).bind(function (path) {
8825
          updateAriaExpansions(container, path);
8826
          return updateMenuPath(container, layeredState, path).map(function (activeMenu) {
8827
            detail.onCollapseMenu(container, item, activeMenu);
8828
            return activeMenu;
8829
          });
8830
        });
8831
      };
8832
      var updateView = function (container, item) {
8833
        var value = getItemValue(item);
8834
        return layeredState.refresh(value).bind(function (path) {
8835
          updateAriaExpansions(container, path);
8836
          return updateMenuPath(container, layeredState, path);
8837
        });
8838
      };
8839
      var onRight = function (container, item) {
8840
        return inside(item.element) ? Optional.none() : expandRight(container, item, ExpandHighlightDecision.HighlightSubmenu);
8841
      };
8842
      var onLeft = function (container, item) {
8843
        return inside(item.element) ? Optional.none() : collapseLeft(container, item);
8844
      };
8845
      var onEscape = function (container, item) {
8846
        return collapseLeft(container, item).orThunk(function () {
8847
          return detail.onEscape(container, item).map(function () {
8848
            return container;
8849
          });
8850
        });
8851
      };
8852
      var keyOnItem = function (f) {
8853
        return function (container, simulatedEvent) {
637 daniel-mar 8854
          return closest$1(simulatedEvent.getSource(), '.' + detail.markers.item).bind(function (target) {
597 daniel-mar 8855
            return container.getSystem().getByDom(target).toOptional().bind(function (item) {
8856
              return f(container, item).map(always);
8857
            });
8858
          });
8859
        };
8860
      };
637 daniel-mar 8861
      var events = derive$3([
8862
        run(focus(), function (sandbox, simulatedEvent) {
597 daniel-mar 8863
          var item = simulatedEvent.event.item;
8864
          layeredState.lookupItem(getItemValue(item)).each(function () {
8865
            var menu = simulatedEvent.event.menu;
8866
            Highlighting.highlight(sandbox, menu);
8867
            var value = getItemValue(simulatedEvent.event.item);
8868
            layeredState.refresh(value).each(function (path) {
8869
              return closeOthers(sandbox, layeredState, path);
8870
            });
8871
          });
8872
        }),
8873
        runOnExecute(function (component, simulatedEvent) {
8874
          var target = simulatedEvent.event.target;
8875
          component.getSystem().getByDom(target).each(function (item) {
8876
            var itemValue = getItemValue(item);
8877
            if (itemValue.indexOf('collapse-item') === 0) {
8878
              collapseLeft(component, item);
8879
            }
8880
            expandRight(component, item, ExpandHighlightDecision.HighlightSubmenu).fold(function () {
8881
              detail.onExecute(component, item);
8882
            }, noop);
8883
          });
8884
        }),
8885
        runOnAttached(function (container, _simulatedEvent) {
8886
          setup(container).each(function (primary) {
637 daniel-mar 8887
            Replacing.append(container, premade(primary));
597 daniel-mar 8888
            detail.onOpenMenu(container, primary);
8889
            if (detail.highlightImmediately) {
8890
              setActiveMenu(container, primary);
8891
            }
8892
          });
8893
        })
8894
      ].concat(detail.navigateOnHover ? [run(hover(), function (sandbox, simulatedEvent) {
8895
          var item = simulatedEvent.event.item;
8896
          updateView(sandbox, item);
8897
          expandRight(sandbox, item, ExpandHighlightDecision.HighlightParent);
8898
          detail.onHover(sandbox, item);
8899
        })] : []));
8900
      var getActiveItem = function (container) {
8901
        return Highlighting.getHighlighted(container).bind(Highlighting.getHighlighted);
8902
      };
8903
      var collapseMenuApi = function (container) {
8904
        getActiveItem(container).each(function (currentItem) {
8905
          collapseLeft(container, currentItem);
8906
        });
8907
      };
8908
      var highlightPrimary = function (container) {
8909
        layeredState.getPrimary().each(function (primary) {
8910
          setActiveMenu(container, primary);
8911
        });
8912
      };
8913
      var extractMenuFromContainer = function (container) {
8914
        return Optional.from(container.components()[0]).filter(function (comp) {
637 daniel-mar 8915
          return get$b(comp.element, 'role') === 'menu';
597 daniel-mar 8916
        });
8917
      };
8918
      var repositionMenus = function (container) {
8919
        var maybeActivePrimary = layeredState.getPrimary().bind(function (primary) {
8920
          return getActiveItem(container).bind(function (currentItem) {
8921
            var itemValue = getItemValue(currentItem);
8922
            var allMenus = values(layeredState.getMenus());
637 daniel-mar 8923
            var preparedMenus = cat(map$2(allMenus, LayeredState.extractPreparedMenu));
597 daniel-mar 8924
            return layeredState.getTriggeringPath(itemValue, function (v) {
8925
              return getItemByValue(container, preparedMenus, v);
8926
            });
8927
          }).map(function (triggeringPath) {
8928
            return {
8929
              primary: primary,
8930
              triggeringPath: triggeringPath
8931
            };
8932
          });
8933
        });
8934
        maybeActivePrimary.fold(function () {
8935
          extractMenuFromContainer(container).each(function (primaryMenu) {
8936
            detail.onRepositionMenu(container, primaryMenu, []);
8937
          });
8938
        }, function (_a) {
8939
          var primary = _a.primary, triggeringPath = _a.triggeringPath;
8940
          detail.onRepositionMenu(container, primary, triggeringPath);
8941
        });
8942
      };
8943
      var apis = {
8944
        collapseMenu: collapseMenuApi,
8945
        highlightPrimary: highlightPrimary,
8946
        repositionMenus: repositionMenus
8947
      };
8948
      return {
8949
        uid: detail.uid,
8950
        dom: detail.dom,
8951
        markers: detail.markers,
8952
        behaviours: augment(detail.tmenuBehaviours, [
8953
          Keying.config({
8954
            mode: 'special',
8955
            onRight: keyOnItem(onRight),
8956
            onLeft: keyOnItem(onLeft),
8957
            onEscape: keyOnItem(onEscape),
8958
            focusIn: function (container, _keyInfo) {
8959
              layeredState.getPrimary().each(function (primary) {
8960
                dispatch(container, primary.element, focusItem());
8961
              });
8962
            }
8963
          }),
8964
          Highlighting.config({
8965
            highlightClass: detail.markers.selectedMenu,
8966
            itemClass: detail.markers.menu
8967
          }),
8968
          Composing.config({
8969
            find: function (container) {
8970
              return Highlighting.getHighlighted(container);
8971
            }
8972
          }),
8973
          Replacing.config({})
8974
        ]),
8975
        eventOrder: detail.eventOrder,
8976
        apis: apis,
8977
        events: events
8978
      };
8979
    };
637 daniel-mar 8980
    var collapseItem$1 = constant$1('collapse-item');
597 daniel-mar 8981
 
8982
    var tieredData = function (primary, menus, expansions) {
8983
      return {
8984
        primary: primary,
8985
        menus: menus,
8986
        expansions: expansions
8987
      };
8988
    };
8989
    var singleData = function (name, menu) {
8990
      return {
8991
        primary: name,
637 daniel-mar 8992
        menus: wrap(name, menu),
597 daniel-mar 8993
        expansions: {}
8994
      };
8995
    };
637 daniel-mar 8996
    var collapseItem = function (text) {
597 daniel-mar 8997
      return {
637 daniel-mar 8998
        value: generate$4(collapseItem$1()),
597 daniel-mar 8999
        meta: { text: text }
9000
      };
9001
    };
637 daniel-mar 9002
    var tieredMenu = single({
597 daniel-mar 9003
      name: 'TieredMenu',
9004
      configFields: [
9005
        onStrictKeyboardHandler('onExecute'),
9006
        onStrictKeyboardHandler('onEscape'),
9007
        onStrictHandler('onOpenMenu'),
9008
        onStrictHandler('onOpenSubmenu'),
9009
        onHandler('onRepositionMenu'),
9010
        onHandler('onCollapseMenu'),
637 daniel-mar 9011
        defaulted('highlightImmediately', true),
9012
        requiredObjOf('data', [
9013
          required$1('primary'),
9014
          required$1('menus'),
9015
          required$1('expansions')
597 daniel-mar 9016
        ]),
637 daniel-mar 9017
        defaulted('fakeFocus', false),
597 daniel-mar 9018
        onHandler('onHighlight'),
9019
        onHandler('onHover'),
9020
        tieredMenuMarkers(),
637 daniel-mar 9021
        required$1('dom'),
9022
        defaulted('navigateOnHover', true),
9023
        defaulted('stayInDom', false),
597 daniel-mar 9024
        field$1('tmenuBehaviours', [
9025
          Keying,
9026
          Highlighting,
9027
          Composing,
9028
          Replacing
9029
        ]),
637 daniel-mar 9030
        defaulted('eventOrder', {})
597 daniel-mar 9031
      ],
9032
      apis: {
9033
        collapseMenu: function (apis, tmenu) {
9034
          apis.collapseMenu(tmenu);
9035
        },
9036
        highlightPrimary: function (apis, tmenu) {
9037
          apis.highlightPrimary(tmenu);
9038
        },
9039
        repositionMenus: function (apis, tmenu) {
9040
          apis.repositionMenus(tmenu);
9041
        }
9042
      },
637 daniel-mar 9043
      factory: make$1,
597 daniel-mar 9044
      extraApis: {
9045
        tieredData: tieredData,
9046
        singleData: singleData,
637 daniel-mar 9047
        collapseItem: collapseItem
597 daniel-mar 9048
      }
9049
    });
9050
 
9051
    var findRoute = function (component, transConfig, transState, route) {
637 daniel-mar 9052
      return get$c(transConfig.routes, route.start).bind(function (sConfig) {
9053
        return get$c(sConfig, route.destination);
597 daniel-mar 9054
      });
9055
    };
9056
    var getTransition = function (comp, transConfig, transState) {
9057
      var route = getCurrentRoute(comp, transConfig);
9058
      return route.bind(function (r) {
9059
        return getTransitionOf(comp, transConfig, transState, r);
9060
      });
9061
    };
9062
    var getTransitionOf = function (comp, transConfig, transState, route) {
9063
      return findRoute(comp, transConfig, transState, route).bind(function (r) {
9064
        return r.transition.map(function (t) {
9065
          return {
9066
            transition: t,
9067
            route: r
9068
          };
9069
        });
9070
      });
9071
    };
9072
    var disableTransition = function (comp, transConfig, transState) {
9073
      getTransition(comp, transConfig, transState).each(function (routeTransition) {
9074
        var t = routeTransition.transition;
637 daniel-mar 9075
        remove$3(comp.element, t.transitionClass);
9076
        remove$6(comp.element, transConfig.destinationAttr);
597 daniel-mar 9077
      });
9078
    };
9079
    var getNewRoute = function (comp, transConfig, transState, destination) {
9080
      return {
637 daniel-mar 9081
        start: get$b(comp.element, transConfig.stateAttr),
597 daniel-mar 9082
        destination: destination
9083
      };
9084
    };
9085
    var getCurrentRoute = function (comp, transConfig, _transState) {
9086
      var el = comp.element;
9087
      return getOpt(el, transConfig.destinationAttr).map(function (destination) {
9088
        return {
637 daniel-mar 9089
          start: get$b(comp.element, transConfig.stateAttr),
597 daniel-mar 9090
          destination: destination
9091
        };
9092
      });
9093
    };
9094
    var jumpTo = function (comp, transConfig, transState, destination) {
9095
      disableTransition(comp, transConfig, transState);
637 daniel-mar 9096
      if (has$1(comp.element, transConfig.stateAttr) && get$b(comp.element, transConfig.stateAttr) !== destination) {
597 daniel-mar 9097
        transConfig.onFinish(comp, destination);
9098
      }
637 daniel-mar 9099
      set$8(comp.element, transConfig.stateAttr, destination);
597 daniel-mar 9100
    };
9101
    var fasttrack = function (comp, transConfig, _transState, _destination) {
9102
      if (has$1(comp.element, transConfig.destinationAttr)) {
9103
        getOpt(comp.element, transConfig.destinationAttr).each(function (destination) {
637 daniel-mar 9104
          set$8(comp.element, transConfig.stateAttr, destination);
597 daniel-mar 9105
        });
637 daniel-mar 9106
        remove$6(comp.element, transConfig.destinationAttr);
597 daniel-mar 9107
      }
9108
    };
9109
    var progressTo = function (comp, transConfig, transState, destination) {
9110
      fasttrack(comp, transConfig);
9111
      var route = getNewRoute(comp, transConfig, transState, destination);
9112
      getTransitionOf(comp, transConfig, transState, route).fold(function () {
9113
        jumpTo(comp, transConfig, transState, destination);
9114
      }, function (routeTransition) {
9115
        disableTransition(comp, transConfig, transState);
9116
        var t = routeTransition.transition;
637 daniel-mar 9117
        add$1(comp.element, t.transitionClass);
9118
        set$8(comp.element, transConfig.destinationAttr, destination);
597 daniel-mar 9119
      });
9120
    };
637 daniel-mar 9121
    var getState = function (comp, transConfig, _transState) {
597 daniel-mar 9122
      return getOpt(comp.element, transConfig.stateAttr);
9123
    };
9124
 
9125
    var TransitionApis = /*#__PURE__*/Object.freeze({
9126
        __proto__: null,
9127
        findRoute: findRoute,
9128
        disableTransition: disableTransition,
9129
        getCurrentRoute: getCurrentRoute,
9130
        jumpTo: jumpTo,
9131
        progressTo: progressTo,
637 daniel-mar 9132
        getState: getState
597 daniel-mar 9133
    });
9134
 
637 daniel-mar 9135
    var events$1 = function (transConfig, transState) {
9136
      return derive$3([
597 daniel-mar 9137
        run(transitionend(), function (component, simulatedEvent) {
9138
          var raw = simulatedEvent.event.raw;
9139
          getCurrentRoute(component, transConfig).each(function (route) {
9140
            findRoute(component, transConfig, transState, route).each(function (rInfo) {
9141
              rInfo.transition.each(function (rTransition) {
9142
                if (raw.propertyName === rTransition.property) {
9143
                  jumpTo(component, transConfig, transState, route.destination);
9144
                  transConfig.onTransition(component, route);
9145
                }
9146
              });
9147
            });
9148
          });
9149
        }),
9150
        runOnAttached(function (comp, _se) {
9151
          jumpTo(comp, transConfig, transState, transConfig.initialState);
9152
        })
9153
      ]);
9154
    };
9155
 
9156
    var ActiveTransitioning = /*#__PURE__*/Object.freeze({
9157
        __proto__: null,
637 daniel-mar 9158
        events: events$1
597 daniel-mar 9159
    });
9160
 
9161
    var TransitionSchema = [
637 daniel-mar 9162
      defaulted('destinationAttr', 'data-transitioning-destination'),
9163
      defaulted('stateAttr', 'data-transitioning-state'),
9164
      required$1('initialState'),
597 daniel-mar 9165
      onHandler('onTransition'),
9166
      onHandler('onFinish'),
637 daniel-mar 9167
      requiredOf('routes', setOf(Result.value, setOf(Result.value, objOfOnly([optionObjOfOnly('transition', [
9168
          required$1('property'),
9169
          required$1('transitionClass')
597 daniel-mar 9170
        ])]))))
9171
    ];
9172
 
9173
    var createRoutes = function (routes) {
9174
      var r = {};
637 daniel-mar 9175
      each(routes, function (v, k) {
597 daniel-mar 9176
        var waypoints = k.split('<->');
637 daniel-mar 9177
        r[waypoints[0]] = wrap(waypoints[1], v);
9178
        r[waypoints[1]] = wrap(waypoints[0], v);
597 daniel-mar 9179
      });
9180
      return r;
9181
    };
9182
    var createBistate = function (first, second, transitions) {
637 daniel-mar 9183
      return wrapAll([
597 daniel-mar 9184
        {
9185
          key: first,
637 daniel-mar 9186
          value: wrap(second, transitions)
597 daniel-mar 9187
        },
9188
        {
9189
          key: second,
637 daniel-mar 9190
          value: wrap(first, transitions)
597 daniel-mar 9191
        }
9192
      ]);
9193
    };
9194
    var createTristate = function (first, second, third, transitions) {
637 daniel-mar 9195
      return wrapAll([
597 daniel-mar 9196
        {
9197
          key: first,
637 daniel-mar 9198
          value: wrapAll([
597 daniel-mar 9199
            {
9200
              key: second,
9201
              value: transitions
9202
            },
9203
            {
9204
              key: third,
9205
              value: transitions
9206
            }
9207
          ])
9208
        },
9209
        {
9210
          key: second,
637 daniel-mar 9211
          value: wrapAll([
597 daniel-mar 9212
            {
9213
              key: first,
9214
              value: transitions
9215
            },
9216
            {
9217
              key: third,
9218
              value: transitions
9219
            }
9220
          ])
9221
        },
9222
        {
9223
          key: third,
637 daniel-mar 9224
          value: wrapAll([
597 daniel-mar 9225
            {
9226
              key: first,
9227
              value: transitions
9228
            },
9229
            {
9230
              key: second,
9231
              value: transitions
9232
            }
9233
          ])
9234
        }
9235
      ]);
9236
    };
637 daniel-mar 9237
    var Transitioning = create$5({
597 daniel-mar 9238
      fields: TransitionSchema,
9239
      name: 'transitioning',
9240
      active: ActiveTransitioning,
9241
      apis: TransitionApis,
9242
      extra: {
9243
        createRoutes: createRoutes,
9244
        createBistate: createBistate,
9245
        createTristate: createTristate
9246
      }
9247
    });
9248
 
9249
    var scrollableStyle = resolve('scrollable');
637 daniel-mar 9250
    var register$2 = function (element) {
9251
      add$1(element, scrollableStyle);
597 daniel-mar 9252
    };
9253
    var deregister = function (element) {
637 daniel-mar 9254
      remove$3(element, scrollableStyle);
597 daniel-mar 9255
    };
9256
    var scrollable = scrollableStyle;
9257
 
637 daniel-mar 9258
    var getValue = function (item) {
9259
      return get$c(item, 'format').getOr(item.title);
597 daniel-mar 9260
    };
637 daniel-mar 9261
    var convert = function (formats, memMenuThunk) {
9262
      var mainMenu = makeMenu('Styles', [].concat(map$2(formats.items, function (k) {
9263
        return makeItem(getValue(k), k.title, k.isSelected(), k.getPreview(), hasNonNullableKey(formats.expansions, getValue(k)));
597 daniel-mar 9264
      })), memMenuThunk, false);
9265
      var submenus = map$1(formats.menus, function (menuItems, menuName) {
637 daniel-mar 9266
        var items = map$2(menuItems, function (item) {
9267
          return makeItem(getValue(item), item.title, item.isSelected !== undefined ? item.isSelected() : false, item.getPreview !== undefined ? item.getPreview() : '', hasNonNullableKey(formats.expansions, getValue(item)));
597 daniel-mar 9268
        });
9269
        return makeMenu(menuName, items, memMenuThunk, true);
9270
      });
637 daniel-mar 9271
      var menus = deepMerge(submenus, wrap('styles', mainMenu));
597 daniel-mar 9272
      var tmenu = tieredMenu.tieredData('styles', menus, formats.expansions);
9273
      return { tmenu: tmenu };
9274
    };
9275
    var makeItem = function (value, text, selected, preview, isMenu) {
9276
      return {
9277
        data: {
9278
          value: value,
9279
          text: text
9280
        },
9281
        type: 'item',
9282
        dom: {
9283
          tag: 'div',
9284
          classes: isMenu ? [resolve('styles-item-is-menu')] : []
9285
        },
9286
        toggling: {
9287
          toggleOnExecute: false,
9288
          toggleClass: resolve('format-matches'),
9289
          selected: selected
9290
        },
637 daniel-mar 9291
        itemBehaviours: derive$2(isMenu ? [] : [format(value, function (comp, status) {
597 daniel-mar 9292
            var toggle = status ? Toggling.on : Toggling.off;
9293
            toggle(comp);
9294
          })]),
9295
        components: [{
9296
            dom: {
9297
              tag: 'div',
9298
              attributes: { style: preview },
9299
              innerHtml: text
9300
            }
9301
          }]
9302
      };
9303
    };
9304
    var makeMenu = function (value, items, memMenuThunk, collapsable) {
9305
      return {
9306
        value: value,
9307
        dom: { tag: 'div' },
9308
        components: [
9309
          Button.sketch({
9310
            dom: {
9311
              tag: 'div',
9312
              classes: [resolve('styles-collapser')]
9313
            },
9314
            components: collapsable ? [
9315
              {
9316
                dom: {
9317
                  tag: 'span',
9318
                  classes: [resolve('styles-collapse-icon')]
9319
                }
9320
              },
9321
              text(value)
9322
            ] : [text(value)],
9323
            action: function (item) {
9324
              if (collapsable) {
9325
                var comp = memMenuThunk().get(item);
9326
                tieredMenu.collapseMenu(comp);
9327
              }
9328
            }
9329
          }),
9330
          {
9331
            dom: {
9332
              tag: 'div',
9333
              classes: [resolve('styles-menu-items-container')]
9334
            },
9335
            components: [Menu.parts.items({})],
637 daniel-mar 9336
            behaviours: derive$2([config('adhoc-scrollable-menu', [
597 daniel-mar 9337
                runOnAttached(function (component, _simulatedEvent) {
637 daniel-mar 9338
                  set$5(component.element, 'overflow-y', 'auto');
9339
                  set$5(component.element, '-webkit-overflow-scrolling', 'touch');
9340
                  register$2(component.element);
597 daniel-mar 9341
                }),
9342
                runOnDetached(function (component) {
637 daniel-mar 9343
                  remove$2(component.element, 'overflow-y');
9344
                  remove$2(component.element, '-webkit-overflow-scrolling');
597 daniel-mar 9345
                  deregister(component.element);
9346
                })
9347
              ])])
9348
          }
9349
        ],
9350
        items: items,
637 daniel-mar 9351
        menuBehaviours: derive$2([Transitioning.config({
597 daniel-mar 9352
            initialState: 'after',
9353
            routes: Transitioning.createTristate('before', 'current', 'after', {
9354
              transition: {
9355
                property: 'transform',
9356
                transitionClass: 'transitioning'
9357
              }
9358
            })
9359
          })])
9360
      };
9361
    };
637 daniel-mar 9362
    var sketch$1 = function (settings) {
9363
      var dataset = convert(settings.formats, function () {
597 daniel-mar 9364
        return memMenu;
9365
      });
9366
      var memMenu = record(tieredMenu.sketch({
9367
        dom: {
9368
          tag: 'div',
9369
          classes: [resolve('styles-menu')]
9370
        },
9371
        components: [],
9372
        fakeFocus: true,
9373
        stayInDom: true,
9374
        onExecute: function (_tmenu, item) {
9375
          var v = Representing.getValue(item);
9376
          settings.handle(item, v.value);
9377
          return Optional.none();
9378
        },
9379
        onEscape: function () {
9380
          return Optional.none();
9381
        },
9382
        onOpenMenu: function (container, menu) {
637 daniel-mar 9383
          var w = get$5(container.element);
597 daniel-mar 9384
          set$4(menu.element, w);
9385
          Transitioning.jumpTo(menu, 'current');
9386
        },
9387
        onOpenSubmenu: function (container, item, submenu) {
637 daniel-mar 9388
          var w = get$5(container.element);
9389
          var menu = ancestor(item.element, '[role="menu"]').getOrDie('hacky');
597 daniel-mar 9390
          var menuComp = container.getSystem().getByDom(menu).getOrDie();
9391
          set$4(submenu.element, w);
9392
          Transitioning.progressTo(menuComp, 'before');
9393
          Transitioning.jumpTo(submenu, 'after');
9394
          Transitioning.progressTo(submenu, 'current');
9395
        },
9396
        onCollapseMenu: function (container, item, menu) {
637 daniel-mar 9397
          var submenu = ancestor(item.element, '[role="menu"]').getOrDie('hacky');
597 daniel-mar 9398
          var submenuComp = container.getSystem().getByDom(submenu).getOrDie();
9399
          Transitioning.progressTo(submenuComp, 'after');
9400
          Transitioning.progressTo(menu, 'current');
9401
        },
9402
        navigateOnHover: false,
9403
        highlightImmediately: true,
9404
        data: dataset.tmenu,
9405
        markers: {
9406
          backgroundMenu: resolve('styles-background-menu'),
9407
          menu: resolve('styles-menu'),
9408
          selectedMenu: resolve('styles-selected-menu'),
9409
          item: resolve('styles-item'),
9410
          selectedItem: resolve('styles-selected-item')
9411
        }
9412
      }));
9413
      return memMenu.asSpec();
9414
    };
9415
 
9416
    var getFromExpandingItem = function (item) {
637 daniel-mar 9417
      var newItem = deepMerge(exclude(item, ['items']), { menu: true });
597 daniel-mar 9418
      var rest = expand(item.items);
637 daniel-mar 9419
      var newMenus = deepMerge(rest.menus, wrap(item.title, rest.items));
9420
      var newExpansions = deepMerge(rest.expansions, wrap(item.title, item.title));
597 daniel-mar 9421
      return {
9422
        item: newItem,
9423
        menus: newMenus,
9424
        expansions: newExpansions
9425
      };
9426
    };
9427
    var getFromItem = function (item) {
9428
      return hasNonNullableKey(item, 'items') ? getFromExpandingItem(item) : {
9429
        item: item,
9430
        menus: {},
9431
        expansions: {}
9432
      };
9433
    };
9434
    var expand = function (items) {
9435
      return foldr(items, function (acc, item) {
9436
        var newData = getFromItem(item);
9437
        return {
9438
          menus: deepMerge(acc.menus, newData.menus),
9439
          items: [newData.item].concat(acc.items),
9440
          expansions: deepMerge(acc.expansions, newData.expansions)
9441
        };
9442
      }, {
9443
        menus: {},
9444
        expansions: {},
9445
        items: []
9446
      });
9447
    };
9448
 
9449
    var register$1 = function (editor) {
9450
      var isSelectedFor = function (format) {
9451
        return function () {
9452
          return editor.formatter.match(format);
9453
        };
9454
      };
9455
      var getPreview = function (format) {
9456
        return function () {
9457
          return editor.formatter.getCssText(format);
9458
        };
9459
      };
9460
      var enrichSupported = function (item) {
9461
        return deepMerge(item, {
9462
          isSelected: isSelectedFor(item.format),
9463
          getPreview: getPreview(item.format)
9464
        });
9465
      };
9466
      var enrichMenu = function (item) {
9467
        return deepMerge(item, {
9468
          isSelected: never,
637 daniel-mar 9469
          getPreview: constant$1('')
597 daniel-mar 9470
        });
9471
      };
9472
      var enrichCustom = function (item) {
637 daniel-mar 9473
        var formatName = generate$4(item.title);
597 daniel-mar 9474
        var newItem = deepMerge(item, {
9475
          format: formatName,
9476
          isSelected: isSelectedFor(formatName),
9477
          getPreview: getPreview(formatName)
9478
        });
9479
        editor.formatter.register(formatName, newItem);
9480
        return newItem;
9481
      };
9482
      var doEnrich = function (items) {
637 daniel-mar 9483
        return map$2(items, function (item) {
597 daniel-mar 9484
          if (hasNonNullableKey(item, 'items')) {
9485
            var newItems = doEnrich(item.items);
9486
            return deepMerge(enrichMenu(item), { items: newItems });
9487
          } else if (hasNonNullableKey(item, 'format')) {
9488
            return enrichSupported(item);
9489
          } else {
9490
            return enrichCustom(item);
9491
          }
9492
        });
9493
      };
9494
      return doEnrich(getStyleFormats(editor));
9495
    };
9496
    var prune = function (editor, formats) {
9497
      var doPrune = function (items) {
637 daniel-mar 9498
        return bind$3(items, function (item) {
597 daniel-mar 9499
          if (item.items !== undefined) {
9500
            var newItems = doPrune(item.items);
9501
            return newItems.length > 0 ? [item] : [];
9502
          } else {
9503
            var keep = hasNonNullableKey(item, 'format') ? editor.formatter.canApply(item.format) : true;
9504
            return keep ? [item] : [];
9505
          }
9506
        });
9507
      };
9508
      var prunedItems = doPrune(formats);
9509
      return expand(prunedItems);
9510
    };
9511
    var ui = function (editor, formats, onDone) {
9512
      var pruned = prune(editor, formats);
637 daniel-mar 9513
      return sketch$1({
597 daniel-mar 9514
        formats: pruned,
9515
        handle: function (item, value) {
9516
          editor.undoManager.transact(function () {
9517
            if (Toggling.isOn(item)) {
9518
              editor.formatter.remove(value);
9519
            } else {
9520
              editor.formatter.apply(value);
9521
            }
9522
          });
9523
          onDone();
9524
        }
9525
      });
9526
    };
9527
 
637 daniel-mar 9528
    var extract = function (rawToolbar) {
597 daniel-mar 9529
      var toolbar = rawToolbar.replace(/\|/g, ' ').trim();
9530
      return toolbar.length > 0 ? toolbar.split(/\s+/) : [];
9531
    };
9532
    var identifyFromArray = function (toolbar) {
637 daniel-mar 9533
      return bind$3(toolbar, function (item) {
9534
        return isArray(item) ? identifyFromArray(item) : extract(item);
597 daniel-mar 9535
      });
9536
    };
9537
    var identify = function (editor) {
9538
      var toolbar = getToolbar(editor);
637 daniel-mar 9539
      return isArray(toolbar) ? identifyFromArray(toolbar) : extract(toolbar);
597 daniel-mar 9540
    };
637 daniel-mar 9541
    var setup$3 = function (realm, editor) {
597 daniel-mar 9542
      var commandSketch = function (name) {
9543
        return function () {
9544
          return forToolbarCommand(editor, name);
9545
        };
9546
      };
9547
      var stateCommandSketch = function (name) {
9548
        return function () {
9549
          return forToolbarStateCommand(editor, name);
9550
        };
9551
      };
9552
      var actionSketch = function (name, query, action) {
9553
        return function () {
9554
          return forToolbarStateAction(editor, name, query, action);
9555
        };
9556
      };
9557
      var undo = commandSketch('undo');
9558
      var redo = commandSketch('redo');
9559
      var bold = stateCommandSketch('bold');
9560
      var italic = stateCommandSketch('italic');
9561
      var underline = stateCommandSketch('underline');
9562
      var removeformat = commandSketch('removeformat');
9563
      var link = function () {
637 daniel-mar 9564
        return sketch$2(realm, editor);
597 daniel-mar 9565
      };
9566
      var unlink = actionSketch('unlink', 'link', function () {
9567
        editor.execCommand('unlink', null, false);
9568
      });
9569
      var image = function () {
637 daniel-mar 9570
        return sketch$5(editor);
597 daniel-mar 9571
      };
9572
      var bullist = actionSketch('unordered-list', 'ul', function () {
9573
        editor.execCommand('InsertUnorderedList', null, false);
9574
      });
9575
      var numlist = actionSketch('ordered-list', 'ol', function () {
9576
        editor.execCommand('InsertOrderedList', null, false);
9577
      });
9578
      var fontsizeselect = function () {
637 daniel-mar 9579
        return sketch$6(realm, editor);
597 daniel-mar 9580
      };
9581
      var forecolor = function () {
637 daniel-mar 9582
        return sketch$8(realm, editor);
597 daniel-mar 9583
      };
9584
      var styleFormats = register$1(editor);
9585
      var styleFormatsMenu = function () {
9586
        return ui(editor, styleFormats, function () {
9587
          editor.fire('scrollIntoView');
9588
        });
9589
      };
9590
      var styleselect = function () {
9591
        return forToolbar('style-formats', function (button) {
9592
          editor.fire('toReading');
9593
          realm.dropup.appear(styleFormatsMenu, Toggling.on, button);
637 daniel-mar 9594
        }, derive$2([
597 daniel-mar 9595
          Toggling.config({
9596
            toggleClass: resolve('toolbar-button-selected'),
9597
            toggleOnExecute: false,
9598
            aria: { mode: 'pressed' }
9599
          }),
9600
          Receiving.config({
637 daniel-mar 9601
            channels: wrapAll([
9602
              receive(orientationChanged, Toggling.off),
9603
              receive(dropupDismissed, Toggling.off)
597 daniel-mar 9604
            ])
9605
          })
9606
        ]), editor);
9607
      };
9608
      var feature = function (prereq, sketch) {
9609
        return {
9610
          isSupported: function () {
9611
            var buttons = editor.ui.registry.getAll().buttons;
9612
            return prereq.forall(function (p) {
9613
              return hasNonNullableKey(buttons, p);
9614
            });
9615
          },
9616
          sketch: sketch
9617
        };
9618
      };
9619
      return {
9620
        undo: feature(Optional.none(), undo),
9621
        redo: feature(Optional.none(), redo),
9622
        bold: feature(Optional.none(), bold),
9623
        italic: feature(Optional.none(), italic),
9624
        underline: feature(Optional.none(), underline),
9625
        removeformat: feature(Optional.none(), removeformat),
9626
        link: feature(Optional.none(), link),
9627
        unlink: feature(Optional.none(), unlink),
9628
        image: feature(Optional.none(), image),
9629
        bullist: feature(Optional.some('bullist'), bullist),
9630
        numlist: feature(Optional.some('numlist'), numlist),
9631
        fontsizeselect: feature(Optional.none(), fontsizeselect),
9632
        forecolor: feature(Optional.none(), forecolor),
9633
        styleselect: feature(Optional.none(), styleselect)
9634
      };
9635
    };
637 daniel-mar 9636
    var detect = function (editor, features) {
597 daniel-mar 9637
      var itemNames = identify(editor);
9638
      var present = {};
637 daniel-mar 9639
      return bind$3(itemNames, function (iName) {
597 daniel-mar 9640
        var r = !hasNonNullableKey(present, iName) && hasNonNullableKey(features, iName) && features[iName].isSupported() ? [features[iName].sketch()] : [];
9641
        present[iName] = true;
9642
        return r;
9643
      });
9644
    };
9645
 
9646
    var mkEvent = function (target, x, y, stop, prevent, kill, raw) {
9647
      return {
9648
        target: target,
9649
        x: x,
9650
        y: y,
9651
        stop: stop,
9652
        prevent: prevent,
9653
        kill: kill,
9654
        raw: raw
9655
      };
9656
    };
9657
    var fromRawEvent = function (rawEvent) {
9658
      var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));
9659
      var stop = function () {
9660
        return rawEvent.stopPropagation();
9661
      };
9662
      var prevent = function () {
9663
        return rawEvent.preventDefault();
9664
      };
9665
      var kill = compose(prevent, stop);
9666
      return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);
9667
    };
9668
    var handle = function (filter, handler) {
9669
      return function (rawEvent) {
9670
        if (filter(rawEvent)) {
9671
          handler(fromRawEvent(rawEvent));
9672
        }
9673
      };
9674
    };
9675
    var binder = function (element, event, filter, handler, useCapture) {
9676
      var wrapped = handle(filter, handler);
9677
      element.dom.addEventListener(event, wrapped, useCapture);
9678
      return { unbind: curry(unbind, element, event, wrapped, useCapture) };
9679
    };
637 daniel-mar 9680
    var bind$1 = function (element, event, filter, handler) {
597 daniel-mar 9681
      return binder(element, event, filter, handler, false);
9682
    };
637 daniel-mar 9683
    var capture$1 = function (element, event, filter, handler) {
597 daniel-mar 9684
      return binder(element, event, filter, handler, true);
9685
    };
9686
    var unbind = function (element, event, handler, useCapture) {
9687
      element.dom.removeEventListener(event, handler, useCapture);
9688
    };
9689
 
637 daniel-mar 9690
    var filter = always;
9691
    var bind = function (element, event, handler) {
9692
      return bind$1(element, event, filter, handler);
597 daniel-mar 9693
    };
637 daniel-mar 9694
    var capture = function (element, event, handler) {
9695
      return capture$1(element, event, filter, handler);
597 daniel-mar 9696
    };
9697
 
637 daniel-mar 9698
    var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay');
597 daniel-mar 9699
 
9700
    var INTERVAL = 50;
9701
    var INSURANCE = 1000 / INTERVAL;
637 daniel-mar 9702
    var get$1 = function (outerWindow) {
597 daniel-mar 9703
      var isPortrait = outerWindow.matchMedia('(orientation: portrait)').matches;
637 daniel-mar 9704
      return { isPortrait: constant$1(isPortrait) };
597 daniel-mar 9705
    };
9706
    var getActualWidth = function (outerWindow) {
637 daniel-mar 9707
      var isIos = detect$1().os.isiOS();
9708
      var isPortrait = get$1(outerWindow).isPortrait();
597 daniel-mar 9709
      return isIos && !isPortrait ? outerWindow.screen.height : outerWindow.screen.width;
9710
    };
9711
    var onChange = function (outerWindow, listeners) {
9712
      var win = SugarElement.fromDom(outerWindow);
9713
      var poller = null;
9714
      var change = function () {
637 daniel-mar 9715
        global$2.clearInterval(poller);
9716
        var orientation = get$1(outerWindow);
597 daniel-mar 9717
        listeners.onChange(orientation);
9718
        onAdjustment(function () {
9719
          listeners.onReady(orientation);
9720
        });
9721
      };
637 daniel-mar 9722
      var orientationHandle = bind(win, 'orientationchange', change);
597 daniel-mar 9723
      var onAdjustment = function (f) {
637 daniel-mar 9724
        global$2.clearInterval(poller);
597 daniel-mar 9725
        var flag = outerWindow.innerHeight;
9726
        var insurance = 0;
637 daniel-mar 9727
        poller = global$2.setInterval(function () {
597 daniel-mar 9728
          if (flag !== outerWindow.innerHeight) {
637 daniel-mar 9729
            global$2.clearInterval(poller);
597 daniel-mar 9730
            f(Optional.some(outerWindow.innerHeight));
9731
          } else if (insurance > INSURANCE) {
637 daniel-mar 9732
            global$2.clearInterval(poller);
597 daniel-mar 9733
            f(Optional.none());
9734
          }
9735
          insurance++;
9736
        }, INTERVAL);
9737
      };
9738
      var destroy = function () {
9739
        orientationHandle.unbind();
9740
      };
9741
      return {
9742
        onAdjustment: onAdjustment,
9743
        destroy: destroy
9744
      };
9745
    };
9746
 
9747
    var setStart = function (rng, situ) {
9748
      situ.fold(function (e) {
9749
        rng.setStartBefore(e.dom);
9750
      }, function (e, o) {
9751
        rng.setStart(e.dom, o);
9752
      }, function (e) {
9753
        rng.setStartAfter(e.dom);
9754
      });
9755
    };
9756
    var setFinish = function (rng, situ) {
9757
      situ.fold(function (e) {
9758
        rng.setEndBefore(e.dom);
9759
      }, function (e, o) {
9760
        rng.setEnd(e.dom, o);
9761
      }, function (e) {
9762
        rng.setEndAfter(e.dom);
9763
      });
9764
    };
9765
    var relativeToNative = function (win, startSitu, finishSitu) {
9766
      var range = win.document.createRange();
9767
      setStart(range, startSitu);
9768
      setFinish(range, finishSitu);
9769
      return range;
9770
    };
9771
    var exactToNative = function (win, start, soffset, finish, foffset) {
9772
      var rng = win.document.createRange();
9773
      rng.setStart(start.dom, soffset);
9774
      rng.setEnd(finish.dom, foffset);
9775
      return rng;
9776
    };
637 daniel-mar 9777
    var toRect$1 = function (rect) {
597 daniel-mar 9778
      return {
9779
        left: rect.left,
9780
        top: rect.top,
9781
        right: rect.right,
9782
        bottom: rect.bottom,
9783
        width: rect.width,
9784
        height: rect.height
9785
      };
9786
    };
637 daniel-mar 9787
    var getFirstRect$1 = function (rng) {
597 daniel-mar 9788
      var rects = rng.getClientRects();
9789
      var rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect();
637 daniel-mar 9790
      return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect$1) : Optional.none();
597 daniel-mar 9791
    };
9792
 
637 daniel-mar 9793
    var adt$3 = Adt.generate([
597 daniel-mar 9794
      {
9795
        ltr: [
9796
          'start',
9797
          'soffset',
9798
          'finish',
9799
          'foffset'
9800
        ]
9801
      },
9802
      {
9803
        rtl: [
9804
          'start',
9805
          'soffset',
9806
          'finish',
9807
          'foffset'
9808
        ]
9809
      }
9810
    ]);
9811
    var fromRange = function (win, type, range) {
9812
      return type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset);
9813
    };
9814
    var getRanges = function (win, selection) {
9815
      return selection.match({
9816
        domRange: function (rng) {
9817
          return {
637 daniel-mar 9818
            ltr: constant$1(rng),
597 daniel-mar 9819
            rtl: Optional.none
9820
          };
9821
        },
9822
        relative: function (startSitu, finishSitu) {
9823
          return {
9824
            ltr: cached(function () {
9825
              return relativeToNative(win, startSitu, finishSitu);
9826
            }),
9827
            rtl: cached(function () {
9828
              return Optional.some(relativeToNative(win, finishSitu, startSitu));
9829
            })
9830
          };
9831
        },
9832
        exact: function (start, soffset, finish, foffset) {
9833
          return {
9834
            ltr: cached(function () {
9835
              return exactToNative(win, start, soffset, finish, foffset);
9836
            }),
9837
            rtl: cached(function () {
9838
              return Optional.some(exactToNative(win, finish, foffset, start, soffset));
9839
            })
9840
          };
9841
        }
9842
      });
9843
    };
9844
    var doDiagnose = function (win, ranges) {
9845
      var rng = ranges.ltr();
9846
      if (rng.collapsed) {
9847
        var reversed = ranges.rtl().filter(function (rev) {
9848
          return rev.collapsed === false;
9849
        });
9850
        return reversed.map(function (rev) {
637 daniel-mar 9851
          return adt$3.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset);
597 daniel-mar 9852
        }).getOrThunk(function () {
637 daniel-mar 9853
          return fromRange(win, adt$3.ltr, rng);
597 daniel-mar 9854
        });
9855
      } else {
637 daniel-mar 9856
        return fromRange(win, adt$3.ltr, rng);
597 daniel-mar 9857
      }
9858
    };
9859
    var diagnose = function (win, selection) {
9860
      var ranges = getRanges(win, selection);
9861
      return doDiagnose(win, ranges);
9862
    };
9863
    var asLtrRange = function (win, selection) {
9864
      var diagnosis = diagnose(win, selection);
9865
      return diagnosis.match({
9866
        ltr: function (start, soffset, finish, foffset) {
9867
          var rng = win.document.createRange();
9868
          rng.setStart(start.dom, soffset);
9869
          rng.setEnd(finish.dom, foffset);
9870
          return rng;
9871
        },
9872
        rtl: function (start, soffset, finish, foffset) {
9873
          var rng = win.document.createRange();
9874
          rng.setStart(finish.dom, foffset);
9875
          rng.setEnd(start.dom, soffset);
9876
          return rng;
9877
        }
9878
      });
9879
    };
637 daniel-mar 9880
    adt$3.ltr;
9881
    adt$3.rtl;
597 daniel-mar 9882
 
9883
    var create$3 = function (start, soffset, finish, foffset) {
9884
      return {
9885
        start: start,
9886
        soffset: soffset,
9887
        finish: finish,
9888
        foffset: foffset
9889
      };
9890
    };
9891
    var SimRange = { create: create$3 };
9892
 
9893
    var NodeValue = function (is, name) {
9894
      var get = function (element) {
9895
        if (!is(element)) {
9896
          throw new Error('Can only get ' + name + ' value of a ' + name + ' node');
9897
        }
9898
        return getOption(element).getOr('');
9899
      };
9900
      var getOption = function (element) {
9901
        return is(element) ? Optional.from(element.dom.nodeValue) : Optional.none();
9902
      };
9903
      var set = function (element, value) {
9904
        if (!is(element)) {
9905
          throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');
9906
        }
9907
        element.dom.nodeValue = value;
9908
      };
9909
      return {
9910
        get: get,
9911
        getOption: getOption,
9912
        set: set
9913
      };
9914
    };
9915
 
637 daniel-mar 9916
    var api = NodeValue(isText, 'text');
597 daniel-mar 9917
    var getOption = function (element) {
637 daniel-mar 9918
      return api.getOption(element);
597 daniel-mar 9919
    };
9920
 
9921
    var getEnd = function (element) {
637 daniel-mar 9922
      return name$1(element) === 'img' ? 1 : getOption(element).fold(function () {
597 daniel-mar 9923
        return children(element).length;
9924
      }, function (v) {
9925
        return v.length;
9926
      });
9927
    };
9928
 
637 daniel-mar 9929
    var adt$2 = Adt.generate([
597 daniel-mar 9930
      { before: ['element'] },
9931
      {
9932
        on: [
9933
          'element',
9934
          'offset'
9935
        ]
9936
      },
9937
      { after: ['element'] }
9938
    ]);
9939
    var cata = function (subject, onBefore, onOn, onAfter) {
9940
      return subject.fold(onBefore, onOn, onAfter);
9941
    };
637 daniel-mar 9942
    var getStart$1 = function (situ) {
597 daniel-mar 9943
      return situ.fold(identity, identity, identity);
9944
    };
637 daniel-mar 9945
    var before = adt$2.before;
9946
    var on = adt$2.on;
9947
    var after$1 = adt$2.after;
597 daniel-mar 9948
    var Situ = {
637 daniel-mar 9949
      before: before,
9950
      on: on,
597 daniel-mar 9951
      after: after$1,
9952
      cata: cata,
637 daniel-mar 9953
      getStart: getStart$1
597 daniel-mar 9954
    };
9955
 
637 daniel-mar 9956
    var adt$1 = Adt.generate([
597 daniel-mar 9957
      { domRange: ['rng'] },
9958
      {
9959
        relative: [
9960
          'startSitu',
9961
          'finishSitu'
9962
        ]
9963
      },
9964
      {
9965
        exact: [
9966
          'start',
9967
          'soffset',
9968
          'finish',
9969
          'foffset'
9970
        ]
9971
      }
9972
    ]);
9973
    var exactFromRange = function (simRange) {
637 daniel-mar 9974
      return adt$1.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset);
597 daniel-mar 9975
    };
637 daniel-mar 9976
    var getStart = function (selection) {
597 daniel-mar 9977
      return selection.match({
9978
        domRange: function (rng) {
9979
          return SugarElement.fromDom(rng.startContainer);
9980
        },
9981
        relative: function (startSitu, _finishSitu) {
9982
          return Situ.getStart(startSitu);
9983
        },
9984
        exact: function (start, _soffset, _finish, _foffset) {
9985
          return start;
9986
        }
9987
      });
9988
    };
637 daniel-mar 9989
    var domRange = adt$1.domRange;
9990
    var relative = adt$1.relative;
9991
    var exact = adt$1.exact;
9992
    var getWin$1 = function (selection) {
9993
      var start = getStart(selection);
597 daniel-mar 9994
      return defaultView(start);
9995
    };
637 daniel-mar 9996
    var range = SimRange.create;
597 daniel-mar 9997
    var SimSelection = {
9998
      domRange: domRange,
9999
      relative: relative,
10000
      exact: exact,
10001
      exactFromRange: exactFromRange,
637 daniel-mar 10002
      getWin: getWin$1,
10003
      range: range
597 daniel-mar 10004
    };
10005
 
10006
    var beforeSpecial = function (element, offset) {
637 daniel-mar 10007
      var name = name$1(element);
10008
      if ('input' === name) {
597 daniel-mar 10009
        return Situ.after(element);
637 daniel-mar 10010
      } else if (!contains$1([
597 daniel-mar 10011
          'br',
10012
          'img'
637 daniel-mar 10013
        ], name)) {
597 daniel-mar 10014
        return Situ.on(element, offset);
10015
      } else {
10016
        return offset === 0 ? Situ.before(element) : Situ.after(element);
10017
      }
10018
    };
10019
    var preprocessExact = function (start, soffset, finish, foffset) {
10020
      var startSitu = beforeSpecial(start, soffset);
10021
      var finishSitu = beforeSpecial(finish, foffset);
10022
      return SimSelection.relative(startSitu, finishSitu);
10023
    };
10024
 
10025
    var makeRange = function (start, soffset, finish, foffset) {
637 daniel-mar 10026
      var doc = owner$2(start);
597 daniel-mar 10027
      var rng = doc.dom.createRange();
10028
      rng.setStart(start.dom, soffset);
10029
      rng.setEnd(finish.dom, foffset);
10030
      return rng;
10031
    };
637 daniel-mar 10032
    var after = function (start, soffset, finish, foffset) {
597 daniel-mar 10033
      var r = makeRange(start, soffset, finish, foffset);
10034
      var same = eq(start, finish) && soffset === foffset;
10035
      return r.collapsed && !same;
10036
    };
10037
 
10038
    var getNativeSelection = function (win) {
10039
      return Optional.from(win.getSelection());
10040
    };
10041
    var doSetNativeRange = function (win, rng) {
10042
      getNativeSelection(win).each(function (selection) {
10043
        selection.removeAllRanges();
10044
        selection.addRange(rng);
10045
      });
10046
    };
10047
    var doSetRange = function (win, start, soffset, finish, foffset) {
10048
      var rng = exactToNative(win, start, soffset, finish, foffset);
10049
      doSetNativeRange(win, rng);
10050
    };
10051
    var setLegacyRtlRange = function (win, selection, start, soffset, finish, foffset) {
10052
      selection.collapse(start.dom, soffset);
10053
      selection.extend(finish.dom, foffset);
10054
    };
10055
    var setRangeFromRelative = function (win, relative) {
10056
      return diagnose(win, relative).match({
10057
        ltr: function (start, soffset, finish, foffset) {
10058
          doSetRange(win, start, soffset, finish, foffset);
10059
        },
10060
        rtl: function (start, soffset, finish, foffset) {
10061
          getNativeSelection(win).each(function (selection) {
10062
            if (selection.setBaseAndExtent) {
10063
              selection.setBaseAndExtent(start.dom, soffset, finish.dom, foffset);
10064
            } else if (selection.extend) {
10065
              try {
10066
                setLegacyRtlRange(win, selection, start, soffset, finish, foffset);
10067
              } catch (e) {
10068
                doSetRange(win, finish, foffset, start, soffset);
10069
              }
10070
            } else {
10071
              doSetRange(win, finish, foffset, start, soffset);
10072
            }
10073
          });
10074
        }
10075
      });
10076
    };
10077
    var setExact = function (win, start, soffset, finish, foffset) {
10078
      var relative = preprocessExact(start, soffset, finish, foffset);
10079
      setRangeFromRelative(win, relative);
10080
    };
10081
    var readRange = function (selection) {
10082
      if (selection.rangeCount > 0) {
10083
        var firstRng = selection.getRangeAt(0);
10084
        var lastRng = selection.getRangeAt(selection.rangeCount - 1);
10085
        return Optional.some(SimRange.create(SugarElement.fromDom(firstRng.startContainer), firstRng.startOffset, SugarElement.fromDom(lastRng.endContainer), lastRng.endOffset));
10086
      } else {
10087
        return Optional.none();
10088
      }
10089
    };
10090
    var doGetExact = function (selection) {
10091
      if (selection.anchorNode === null || selection.focusNode === null) {
10092
        return readRange(selection);
10093
      } else {
10094
        var anchor = SugarElement.fromDom(selection.anchorNode);
10095
        var focus_1 = SugarElement.fromDom(selection.focusNode);
637 daniel-mar 10096
        return after(anchor, selection.anchorOffset, focus_1, selection.focusOffset) ? Optional.some(SimRange.create(anchor, selection.anchorOffset, focus_1, selection.focusOffset)) : readRange(selection);
597 daniel-mar 10097
      }
10098
    };
10099
    var getExact = function (win) {
10100
      return getNativeSelection(win).filter(function (sel) {
10101
        return sel.rangeCount > 0;
10102
      }).bind(doGetExact);
10103
    };
637 daniel-mar 10104
    var get = function (win) {
597 daniel-mar 10105
      return getExact(win).map(function (range) {
10106
        return SimSelection.exact(range.start, range.soffset, range.finish, range.foffset);
10107
      });
10108
    };
637 daniel-mar 10109
    var getFirstRect = function (win, selection) {
597 daniel-mar 10110
      var rng = asLtrRange(win, selection);
637 daniel-mar 10111
      return getFirstRect$1(rng);
597 daniel-mar 10112
    };
637 daniel-mar 10113
    var clear = function (win) {
597 daniel-mar 10114
      getNativeSelection(win).each(function (selection) {
10115
        return selection.removeAllRanges();
10116
      });
10117
    };
10118
 
10119
    var getBodyFromFrame = function (frame) {
10120
      return Optional.some(SugarElement.fromDom(frame.dom.contentWindow.document.body));
10121
    };
10122
    var getDocFromFrame = function (frame) {
10123
      return Optional.some(SugarElement.fromDom(frame.dom.contentWindow.document));
10124
    };
10125
    var getWinFromFrame = function (frame) {
10126
      return Optional.from(frame.dom.contentWindow);
10127
    };
10128
    var getSelectionFromFrame = function (frame) {
10129
      var optWin = getWinFromFrame(frame);
10130
      return optWin.bind(getExact);
10131
    };
10132
    var getFrame = function (editor) {
10133
      return editor.getFrame();
10134
    };
10135
    var getOrDerive = function (name, f) {
10136
      return function (editor) {
10137
        var g = editor[name].getOrThunk(function () {
10138
          var frame = getFrame(editor);
10139
          return function () {
10140
            return f(frame);
10141
          };
10142
        });
10143
        return g();
10144
      };
10145
    };
10146
    var getOrListen = function (editor, doc, name, type) {
10147
      return editor[name].getOrThunk(function () {
10148
        return function (handler) {
637 daniel-mar 10149
          return bind(doc, type, handler);
597 daniel-mar 10150
        };
10151
      });
10152
    };
10153
    var getActiveApi = function (editor) {
10154
      var frame = getFrame(editor);
10155
      var tryFallbackBox = function (win) {
10156
        var isCollapsed = function (sel) {
10157
          return eq(sel.start, sel.finish) && sel.soffset === sel.foffset;
10158
        };
10159
        var toStartRect = function (sel) {
10160
          var rect = sel.start.dom.getBoundingClientRect();
10161
          return rect.width > 0 || rect.height > 0 ? Optional.some(rect) : Optional.none();
10162
        };
10163
        return getExact(win).filter(isCollapsed).bind(toStartRect);
10164
      };
10165
      return getBodyFromFrame(frame).bind(function (body) {
10166
        return getDocFromFrame(frame).bind(function (doc) {
10167
          return getWinFromFrame(frame).map(function (win) {
10168
            var html = SugarElement.fromDom(doc.dom.documentElement);
10169
            var getCursorBox = editor.getCursorBox.getOrThunk(function () {
10170
              return function () {
637 daniel-mar 10171
                return get(win).bind(function (sel) {
10172
                  return getFirstRect(win, sel).orThunk(function () {
597 daniel-mar 10173
                    return tryFallbackBox(win);
10174
                  });
10175
                });
10176
              };
10177
            });
10178
            var setSelection = editor.setSelection.getOrThunk(function () {
10179
              return function (start, soffset, finish, foffset) {
10180
                setExact(win, start, soffset, finish, foffset);
10181
              };
10182
            });
10183
            var clearSelection = editor.clearSelection.getOrThunk(function () {
10184
              return function () {
637 daniel-mar 10185
                clear(win);
597 daniel-mar 10186
              };
10187
            });
10188
            return {
10189
              body: body,
10190
              doc: doc,
10191
              win: win,
10192
              html: html,
10193
              getSelection: curry(getSelectionFromFrame, frame),
10194
              setSelection: setSelection,
10195
              clearSelection: clearSelection,
10196
              frame: frame,
10197
              onKeyup: getOrListen(editor, doc, 'onKeyup', 'keyup'),
10198
              onNodeChanged: getOrListen(editor, doc, 'onNodeChanged', 'SelectionChange'),
10199
              onDomChanged: editor.onDomChanged,
10200
              onScrollToCursor: editor.onScrollToCursor,
10201
              onScrollToElement: editor.onScrollToElement,
10202
              onToReading: editor.onToReading,
10203
              onToEditing: editor.onToEditing,
10204
              onToolbarScrollStart: editor.onToolbarScrollStart,
10205
              onTouchContent: editor.onTouchContent,
10206
              onTapContent: editor.onTapContent,
10207
              onTouchToolstrip: editor.onTouchToolstrip,
10208
              getCursorBox: getCursorBox
10209
            };
10210
          });
10211
        });
10212
      });
10213
    };
637 daniel-mar 10214
    var getWin = getOrDerive('getWin', getWinFromFrame);
597 daniel-mar 10215
 
10216
    var tag = function () {
637 daniel-mar 10217
      var head = first$1('head').getOrDie();
597 daniel-mar 10218
      var nu = function () {
10219
        var meta = SugarElement.fromTag('meta');
637 daniel-mar 10220
        set$8(meta, 'name', 'viewport');
10221
        append$2(head, meta);
597 daniel-mar 10222
        return meta;
10223
      };
637 daniel-mar 10224
      var element = first$1('meta[name="viewport"]').getOrThunk(nu);
10225
      var backup = get$b(element, 'content');
597 daniel-mar 10226
      var maximize = function () {
637 daniel-mar 10227
        set$8(element, 'content', 'width=device-width, initial-scale=1.0, user-scalable=no, maximum-scale=1.0');
597 daniel-mar 10228
      };
10229
      var restore = function () {
10230
        if (backup !== undefined && backup !== null && backup.length > 0) {
637 daniel-mar 10231
          set$8(element, 'content', backup);
597 daniel-mar 10232
        } else {
637 daniel-mar 10233
          set$8(element, 'content', 'user-scalable=yes');
597 daniel-mar 10234
        }
10235
      };
10236
      return {
10237
        maximize: maximize,
10238
        restore: restore
10239
      };
10240
    };
10241
 
10242
    var attr = 'data-ephox-mobile-fullscreen-style';
10243
    var siblingStyles = 'display:none!important;';
10244
    var ancestorPosition = 'position:absolute!important;';
10245
    var ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;';
10246
    var bgFallback = 'background-color:rgb(255,255,255)!important;';
637 daniel-mar 10247
    var isAndroid = detect$1().os.isAndroid();
597 daniel-mar 10248
    var matchColor = function (editorBody) {
637 daniel-mar 10249
      var color = get$8(editorBody, 'background-color');
597 daniel-mar 10250
      return color !== undefined && color !== '' ? 'background-color:' + color + '!important' : bgFallback;
10251
    };
10252
    var clobberStyles = function (container, editorBody) {
10253
      var gatherSiblings = function (element) {
637 daniel-mar 10254
        return siblings(element, '*');
597 daniel-mar 10255
      };
10256
      var clobber = function (clobberStyle) {
10257
        return function (element) {
637 daniel-mar 10258
          var styles = get$b(element, 'style');
597 daniel-mar 10259
          var backup = styles === undefined ? 'no-styles' : styles.trim();
10260
          if (backup === clobberStyle) {
10261
            return;
10262
          } else {
637 daniel-mar 10263
            set$8(element, attr, backup);
10264
            set$8(element, 'style', clobberStyle);
597 daniel-mar 10265
          }
10266
        };
10267
      };
637 daniel-mar 10268
      var ancestors$1 = ancestors(container, '*');
10269
      var siblings$1 = bind$3(ancestors$1, gatherSiblings);
597 daniel-mar 10270
      var bgColor = matchColor(editorBody);
637 daniel-mar 10271
      each$1(siblings$1, clobber(siblingStyles));
10272
      each$1(ancestors$1, clobber(ancestorPosition + ancestorStyles + bgColor));
597 daniel-mar 10273
      var containerStyles = isAndroid === true ? '' : ancestorPosition;
10274
      clobber(containerStyles + ancestorStyles + bgColor)(container);
10275
    };
10276
    var restoreStyles = function () {
637 daniel-mar 10277
      var clobberedEls = all('[' + attr + ']');
10278
      each$1(clobberedEls, function (element) {
10279
        var restore = get$b(element, attr);
597 daniel-mar 10280
        if (restore !== 'no-styles') {
637 daniel-mar 10281
          set$8(element, 'style', restore);
597 daniel-mar 10282
        } else {
637 daniel-mar 10283
          remove$6(element, 'style');
597 daniel-mar 10284
        }
637 daniel-mar 10285
        remove$6(element, attr);
597 daniel-mar 10286
      });
10287
    };
10288
 
10289
    var DelayedFunction = function (fun, delay) {
10290
      var ref = null;
10291
      var schedule = function () {
10292
        var args = [];
10293
        for (var _i = 0; _i < arguments.length; _i++) {
10294
          args[_i] = arguments[_i];
10295
        }
10296
        ref = setTimeout(function () {
10297
          fun.apply(null, args);
10298
          ref = null;
10299
        }, delay);
10300
      };
10301
      var cancel = function () {
10302
        if (ref !== null) {
10303
          clearTimeout(ref);
10304
          ref = null;
10305
        }
10306
      };
10307
      return {
10308
        cancel: cancel,
10309
        schedule: schedule
10310
      };
10311
    };
10312
 
10313
    var SIGNIFICANT_MOVE = 5;
10314
    var LONGPRESS_DELAY = 400;
10315
    var getTouch = function (event) {
10316
      var raw = event.raw;
10317
      if (raw.touches === undefined || raw.touches.length !== 1) {
10318
        return Optional.none();
10319
      }
10320
      return Optional.some(raw.touches[0]);
10321
    };
10322
    var isFarEnough = function (touch, data) {
10323
      var distX = Math.abs(touch.clientX - data.x);
10324
      var distY = Math.abs(touch.clientY - data.y);
10325
      return distX > SIGNIFICANT_MOVE || distY > SIGNIFICANT_MOVE;
10326
    };
637 daniel-mar 10327
    var monitor$1 = function (settings) {
10328
      var startData = value();
597 daniel-mar 10329
      var longpressFired = Cell(false);
10330
      var longpress$1 = DelayedFunction(function (event) {
10331
        settings.triggerEvent(longpress(), event);
10332
        longpressFired.set(true);
10333
      }, LONGPRESS_DELAY);
10334
      var handleTouchstart = function (event) {
10335
        getTouch(event).each(function (touch) {
10336
          longpress$1.cancel();
10337
          var data = {
10338
            x: touch.clientX,
10339
            y: touch.clientY,
10340
            target: event.target
10341
          };
10342
          longpress$1.schedule(event);
10343
          longpressFired.set(false);
637 daniel-mar 10344
          startData.set(data);
597 daniel-mar 10345
        });
10346
        return Optional.none();
10347
      };
10348
      var handleTouchmove = function (event) {
10349
        longpress$1.cancel();
10350
        getTouch(event).each(function (touch) {
637 daniel-mar 10351
          startData.on(function (data) {
597 daniel-mar 10352
            if (isFarEnough(touch, data)) {
637 daniel-mar 10353
              startData.clear();
597 daniel-mar 10354
            }
10355
          });
10356
        });
10357
        return Optional.none();
10358
      };
10359
      var handleTouchend = function (event) {
10360
        longpress$1.cancel();
10361
        var isSame = function (data) {
10362
          return eq(data.target, event.target);
10363
        };
10364
        return startData.get().filter(isSame).map(function (_data) {
10365
          if (longpressFired.get()) {
10366
            event.prevent();
10367
            return false;
10368
          } else {
10369
            return settings.triggerEvent(tap(), event);
10370
          }
10371
        });
10372
      };
637 daniel-mar 10373
      var handlers = wrapAll([
597 daniel-mar 10374
        {
10375
          key: touchstart(),
10376
          value: handleTouchstart
10377
        },
10378
        {
10379
          key: touchmove(),
10380
          value: handleTouchmove
10381
        },
10382
        {
10383
          key: touchend(),
10384
          value: handleTouchend
10385
        }
10386
      ]);
10387
      var fireIfReady = function (event, type) {
637 daniel-mar 10388
        return get$c(handlers, type).bind(function (handler) {
597 daniel-mar 10389
          return handler(event);
10390
        });
10391
      };
10392
      return { fireIfReady: fireIfReady };
10393
    };
10394
 
637 daniel-mar 10395
    var monitor = function (editorApi) {
10396
      var tapEvent = monitor$1({
597 daniel-mar 10397
        triggerEvent: function (type, evt) {
10398
          editorApi.onTapContent(evt);
10399
        }
10400
      });
10401
      var onTouchend = function () {
637 daniel-mar 10402
        return bind(editorApi.body, 'touchend', function (evt) {
597 daniel-mar 10403
          tapEvent.fireIfReady(evt, 'touchend');
10404
        });
10405
      };
10406
      var onTouchmove = function () {
637 daniel-mar 10407
        return bind(editorApi.body, 'touchmove', function (evt) {
597 daniel-mar 10408
          tapEvent.fireIfReady(evt, 'touchmove');
10409
        });
10410
      };
10411
      var fireTouchstart = function (evt) {
10412
        tapEvent.fireIfReady(evt, 'touchstart');
10413
      };
10414
      return {
10415
        fireTouchstart: fireTouchstart,
10416
        onTouchend: onTouchend,
10417
        onTouchmove: onTouchmove
10418
      };
10419
    };
10420
 
637 daniel-mar 10421
    var isAndroid6 = detect$1().os.version.major >= 6;
10422
    var initEvents$1 = function (editorApi, toolstrip, alloy) {
10423
      var tapping = monitor(editorApi);
10424
      var outerDoc = owner$2(toolstrip);
597 daniel-mar 10425
      var isRanged = function (sel) {
10426
        return !eq(sel.start, sel.finish) || sel.soffset !== sel.foffset;
10427
      };
10428
      var hasRangeInUi = function () {
10429
        return active(outerDoc).filter(function (input) {
637 daniel-mar 10430
          return name$1(input) === 'input';
597 daniel-mar 10431
        }).exists(function (input) {
10432
          return input.dom.selectionStart !== input.dom.selectionEnd;
10433
        });
10434
      };
10435
      var updateMargin = function () {
10436
        var rangeInContent = editorApi.doc.dom.hasFocus() && editorApi.getSelection().exists(isRanged);
10437
        alloy.getByDom(toolstrip).each((rangeInContent || hasRangeInUi()) === true ? Toggling.on : Toggling.off);
10438
      };
10439
      var listeners = [
637 daniel-mar 10440
        bind(editorApi.body, 'touchstart', function (evt) {
597 daniel-mar 10441
          editorApi.onTouchContent();
10442
          tapping.fireTouchstart(evt);
10443
        }),
10444
        tapping.onTouchmove(),
10445
        tapping.onTouchend(),
637 daniel-mar 10446
        bind(toolstrip, 'touchstart', function (_evt) {
597 daniel-mar 10447
          editorApi.onTouchToolstrip();
10448
        }),
10449
        editorApi.onToReading(function () {
637 daniel-mar 10450
          blur$1(editorApi.body);
597 daniel-mar 10451
        }),
10452
        editorApi.onToEditing(noop),
10453
        editorApi.onScrollToCursor(function (tinyEvent) {
10454
          tinyEvent.preventDefault();
10455
          editorApi.getCursorBox().each(function (bounds) {
10456
            var cWin = editorApi.win;
10457
            var isOutside = bounds.top > cWin.innerHeight || bounds.bottom > cWin.innerHeight;
10458
            var cScrollBy = isOutside ? bounds.bottom - cWin.innerHeight + 50 : 0;
10459
            if (cScrollBy !== 0) {
10460
              cWin.scrollTo(cWin.pageXOffset, cWin.pageYOffset + cScrollBy);
10461
            }
10462
          });
10463
        })
10464
      ].concat(isAndroid6 === true ? [] : [
637 daniel-mar 10465
        bind(SugarElement.fromDom(editorApi.win), 'blur', function () {
597 daniel-mar 10466
          alloy.getByDom(toolstrip).each(Toggling.off);
10467
        }),
637 daniel-mar 10468
        bind(outerDoc, 'select', updateMargin),
10469
        bind(editorApi.doc, 'selectionchange', updateMargin)
597 daniel-mar 10470
      ]);
10471
      var destroy = function () {
637 daniel-mar 10472
        each$1(listeners, function (l) {
597 daniel-mar 10473
          l.unbind();
10474
        });
10475
      };
10476
      return { destroy: destroy };
10477
    };
10478
 
10479
    var safeParse = function (element, attribute) {
637 daniel-mar 10480
      var parsed = parseInt(get$b(element, attribute), 10);
597 daniel-mar 10481
      return isNaN(parsed) ? 0 : parsed;
10482
    };
10483
 
10484
    var COLLAPSED_WIDTH = 2;
10485
    var collapsedRect = function (rect) {
10486
      return __assign(__assign({}, rect), { width: COLLAPSED_WIDTH });
10487
    };
637 daniel-mar 10488
    var toRect = function (rawRect) {
597 daniel-mar 10489
      return {
10490
        left: rawRect.left,
10491
        top: rawRect.top,
10492
        right: rawRect.right,
10493
        bottom: rawRect.bottom,
10494
        width: rawRect.width,
10495
        height: rawRect.height
10496
      };
10497
    };
10498
    var getRectsFromRange = function (range) {
10499
      if (!range.collapsed) {
637 daniel-mar 10500
        return map$2(range.getClientRects(), toRect);
597 daniel-mar 10501
      } else {
10502
        var start_1 = SugarElement.fromDom(range.startContainer);
10503
        return parent(start_1).bind(function (parent) {
10504
          var selection = SimSelection.exact(start_1, range.startOffset, parent, getEnd(parent));
637 daniel-mar 10505
          var optRect = getFirstRect(range.startContainer.ownerDocument.defaultView, selection);
10506
          return optRect.map(collapsedRect).map(pure$2);
597 daniel-mar 10507
        }).getOr([]);
10508
      }
10509
    };
10510
    var getRectangles = function (cWin) {
10511
      var sel = cWin.getSelection();
10512
      return sel !== undefined && sel.rangeCount > 0 ? getRectsFromRange(sel.getRangeAt(0)) : [];
10513
    };
10514
 
10515
    var autocompleteHack = function () {
10516
      return function (f) {
637 daniel-mar 10517
        global$2.setTimeout(function () {
597 daniel-mar 10518
          f();
10519
        }, 0);
10520
      };
10521
    };
637 daniel-mar 10522
    var resume$1 = function (cWin) {
597 daniel-mar 10523
      cWin.focus();
10524
      var iBody = SugarElement.fromDom(cWin.document.body);
10525
      var inInput = active().exists(function (elem) {
637 daniel-mar 10526
        return contains$1([
597 daniel-mar 10527
          'input',
10528
          'textarea'
637 daniel-mar 10529
        ], name$1(elem));
597 daniel-mar 10530
      });
637 daniel-mar 10531
      var transaction = inInput ? autocompleteHack() : apply$1;
597 daniel-mar 10532
      transaction(function () {
637 daniel-mar 10533
        active().each(blur$1);
10534
        focus$3(iBody);
597 daniel-mar 10535
      });
10536
    };
10537
 
10538
    var EXTRA_SPACING = 50;
10539
    var data = 'data-' + resolve('last-outer-height');
10540
    var setLastHeight = function (cBody, value) {
637 daniel-mar 10541
      set$8(cBody, data, value);
597 daniel-mar 10542
    };
10543
    var getLastHeight = function (cBody) {
10544
      return safeParse(cBody, data);
10545
    };
10546
    var getBoundsFrom = function (rect) {
10547
      return {
10548
        top: rect.top,
10549
        bottom: rect.top + rect.height
10550
      };
10551
    };
637 daniel-mar 10552
    var getBounds = function (cWin) {
597 daniel-mar 10553
      var rects = getRectangles(cWin);
10554
      return rects.length > 0 ? Optional.some(rects[0]).map(getBoundsFrom) : Optional.none();
10555
    };
10556
    var findDelta = function (outerWindow, cBody) {
10557
      var last = getLastHeight(cBody);
10558
      var current = outerWindow.innerHeight;
10559
      return last > current ? Optional.some(last - current) : Optional.none();
10560
    };
10561
    var calculate = function (cWin, bounds, delta) {
10562
      var isOutside = bounds.top > cWin.innerHeight || bounds.bottom > cWin.innerHeight;
10563
      return isOutside ? Math.min(delta, bounds.bottom - cWin.innerHeight + EXTRA_SPACING) : 0;
10564
    };
637 daniel-mar 10565
    var setup$2 = function (outerWindow, cWin) {
597 daniel-mar 10566
      var cBody = SugarElement.fromDom(cWin.document.body);
10567
      var toEditing = function () {
637 daniel-mar 10568
        resume$1(cWin);
597 daniel-mar 10569
      };
637 daniel-mar 10570
      var onResize = bind(SugarElement.fromDom(outerWindow), 'resize', function () {
597 daniel-mar 10571
        findDelta(outerWindow, cBody).each(function (delta) {
637 daniel-mar 10572
          getBounds(cWin).each(function (bounds) {
597 daniel-mar 10573
            var cScrollBy = calculate(cWin, bounds, delta);
10574
            if (cScrollBy !== 0) {
10575
              cWin.scrollTo(cWin.pageXOffset, cWin.pageYOffset + cScrollBy);
10576
            }
10577
          });
10578
        });
10579
        setLastHeight(cBody, outerWindow.innerHeight);
10580
      });
10581
      setLastHeight(cBody, outerWindow.innerHeight);
10582
      var destroy = function () {
10583
        onResize.unbind();
10584
      };
10585
      return {
10586
        toEditing: toEditing,
10587
        destroy: destroy
10588
      };
10589
    };
10590
 
637 daniel-mar 10591
    var create$2 = function (platform, mask) {
597 daniel-mar 10592
      var meta = tag();
10593
      var androidApi = api$2();
10594
      var androidEvents = api$2();
10595
      var enter = function () {
10596
        mask.hide();
637 daniel-mar 10597
        add$1(platform.container, resolve('fullscreen-maximized'));
10598
        add$1(platform.container, resolve('android-maximized'));
597 daniel-mar 10599
        meta.maximize();
637 daniel-mar 10600
        add$1(platform.body, resolve('android-scroll-reload'));
10601
        androidApi.set(setup$2(platform.win, getWin(platform.editor).getOrDie('no')));
597 daniel-mar 10602
        getActiveApi(platform.editor).each(function (editorApi) {
10603
          clobberStyles(platform.container, editorApi.body);
637 daniel-mar 10604
          androidEvents.set(initEvents$1(editorApi, platform.toolstrip, platform.alloy));
597 daniel-mar 10605
        });
10606
      };
10607
      var exit = function () {
10608
        meta.restore();
10609
        mask.show();
637 daniel-mar 10610
        remove$3(platform.container, resolve('fullscreen-maximized'));
10611
        remove$3(platform.container, resolve('android-maximized'));
597 daniel-mar 10612
        restoreStyles();
637 daniel-mar 10613
        remove$3(platform.body, resolve('android-scroll-reload'));
597 daniel-mar 10614
        androidEvents.clear();
10615
        androidApi.clear();
10616
      };
10617
      return {
10618
        enter: enter,
10619
        exit: exit
10620
      };
10621
    };
10622
 
637 daniel-mar 10623
    var first = function (fn, rate) {
597 daniel-mar 10624
      var timer = null;
10625
      var cancel = function () {
637 daniel-mar 10626
        if (!isNull(timer)) {
597 daniel-mar 10627
          clearTimeout(timer);
10628
          timer = null;
10629
        }
10630
      };
10631
      var throttle = function () {
10632
        var args = [];
10633
        for (var _i = 0; _i < arguments.length; _i++) {
10634
          args[_i] = arguments[_i];
10635
        }
637 daniel-mar 10636
        if (isNull(timer)) {
597 daniel-mar 10637
          timer = setTimeout(function () {
637 daniel-mar 10638
            timer = null;
597 daniel-mar 10639
            fn.apply(null, args);
10640
          }, rate);
10641
        }
10642
      };
10643
      return {
10644
        cancel: cancel,
10645
        throttle: throttle
10646
      };
10647
    };
10648
    var last = function (fn, rate) {
10649
      var timer = null;
10650
      var cancel = function () {
637 daniel-mar 10651
        if (!isNull(timer)) {
597 daniel-mar 10652
          clearTimeout(timer);
10653
          timer = null;
10654
        }
10655
      };
10656
      var throttle = function () {
10657
        var args = [];
10658
        for (var _i = 0; _i < arguments.length; _i++) {
10659
          args[_i] = arguments[_i];
10660
        }
637 daniel-mar 10661
        cancel();
597 daniel-mar 10662
        timer = setTimeout(function () {
637 daniel-mar 10663
          timer = null;
597 daniel-mar 10664
          fn.apply(null, args);
10665
        }, rate);
10666
      };
10667
      return {
10668
        cancel: cancel,
10669
        throttle: throttle
10670
      };
10671
    };
10672
 
637 daniel-mar 10673
    var sketch = function (onView, _translate) {
597 daniel-mar 10674
      var memIcon = record(Container.sketch({
10675
        dom: dom$1('<div aria-hidden="true" class="${prefix}-mask-tap-icon"></div>'),
637 daniel-mar 10676
        containerBehaviours: derive$2([Toggling.config({
597 daniel-mar 10677
            toggleClass: resolve('mask-tap-icon-selected'),
10678
            toggleOnExecute: false
10679
          })])
10680
      }));
637 daniel-mar 10681
      var onViewThrottle = first(onView, 200);
597 daniel-mar 10682
      return Container.sketch({
10683
        dom: dom$1('<div class="${prefix}-disabled-mask"></div>'),
10684
        components: [Container.sketch({
10685
            dom: dom$1('<div class="${prefix}-content-container"></div>'),
10686
            components: [Button.sketch({
10687
                dom: dom$1('<div class="${prefix}-content-tap-section"></div>'),
10688
                components: [memIcon.asSpec()],
10689
                action: function (_button) {
10690
                  onViewThrottle.throttle();
10691
                },
637 daniel-mar 10692
                buttonBehaviours: derive$2([Toggling.config({ toggleClass: resolve('mask-tap-icon-selected') })])
597 daniel-mar 10693
              })]
10694
          })]
10695
      });
10696
    };
10697
 
637 daniel-mar 10698
    var unbindNoop = constant$1({ unbind: noop });
597 daniel-mar 10699
    var MobileSchema = objOf([
637 daniel-mar 10700
      requiredObjOf('editor', [
10701
        required$1('getFrame'),
597 daniel-mar 10702
        option('getBody'),
10703
        option('getDoc'),
10704
        option('getWin'),
10705
        option('getSelection'),
10706
        option('setSelection'),
10707
        option('clearSelection'),
10708
        option('cursorSaver'),
10709
        option('onKeyup'),
10710
        option('onNodeChanged'),
10711
        option('getCursorBox'),
637 daniel-mar 10712
        required$1('onDomChanged'),
10713
        defaulted('onTouchContent', noop),
10714
        defaulted('onTapContent', noop),
10715
        defaulted('onTouchToolstrip', noop),
10716
        defaulted('onScrollToCursor', unbindNoop),
10717
        defaulted('onScrollToElement', unbindNoop),
10718
        defaulted('onToEditing', unbindNoop),
10719
        defaulted('onToReading', unbindNoop),
10720
        defaulted('onToolbarScrollStart', identity)
597 daniel-mar 10721
      ]),
637 daniel-mar 10722
      required$1('socket'),
10723
      required$1('toolstrip'),
10724
      required$1('dropup'),
10725
      required$1('toolbar'),
10726
      required$1('container'),
10727
      required$1('alloy'),
10728
      customField('win', function (spec) {
10729
        return owner$2(spec.socket).dom.defaultView;
597 daniel-mar 10730
      }),
637 daniel-mar 10731
      customField('body', function (spec) {
597 daniel-mar 10732
        return SugarElement.fromDom(spec.socket.dom.ownerDocument.body);
10733
      }),
637 daniel-mar 10734
      defaulted('translate', identity),
10735
      defaulted('setReadOnly', noop),
10736
      defaulted('readOnlyOnInit', always)
597 daniel-mar 10737
    ]);
10738
 
637 daniel-mar 10739
    var produce$1 = function (raw) {
10740
      var mobile = asRawOrDie$1('Getting AndroidWebapp schema', MobileSchema, raw);
10741
      set$5(mobile.toolstrip, 'width', '100%');
597 daniel-mar 10742
      var onTap = function () {
10743
        mobile.setReadOnly(mobile.readOnlyOnInit());
10744
        mode.enter();
10745
      };
637 daniel-mar 10746
      var mask = build$1(sketch(onTap, mobile.translate));
597 daniel-mar 10747
      mobile.alloy.add(mask);
10748
      var maskApi = {
10749
        show: function () {
10750
          mobile.alloy.add(mask);
10751
        },
10752
        hide: function () {
10753
          mobile.alloy.remove(mask);
10754
        }
10755
      };
637 daniel-mar 10756
      append$2(mobile.container, mask.element);
10757
      var mode = create$2(mobile, maskApi);
597 daniel-mar 10758
      return {
10759
        setReadOnly: mobile.setReadOnly,
10760
        refreshStructure: noop,
10761
        enter: mode.enter,
10762
        exit: mode.exit,
10763
        destroy: noop
10764
      };
10765
    };
10766
 
637 daniel-mar 10767
    var schema$1 = constant$1([
10768
      required$1('dom'),
10769
      defaulted('shell', true),
597 daniel-mar 10770
      field$1('toolbarBehaviours', [Replacing])
10771
    ]);
10772
    var enhanceGroups = function () {
637 daniel-mar 10773
      return { behaviours: derive$2([Replacing.config({})]) };
597 daniel-mar 10774
    };
637 daniel-mar 10775
    var parts$1 = constant$1([optional({
597 daniel-mar 10776
        name: 'groups',
10777
        overrides: enhanceGroups
10778
      })]);
10779
 
637 daniel-mar 10780
    var factory$1 = function (detail, components, _spec, _externals) {
597 daniel-mar 10781
      var setGroups = function (toolbar, groups) {
10782
        getGroupContainer(toolbar).fold(function () {
10783
          console.error('Toolbar was defined to not be a shell, but no groups container was specified in components');
10784
          throw new Error('Toolbar was defined to not be a shell, but no groups container was specified in components');
10785
        }, function (container) {
10786
          Replacing.set(container, groups);
10787
        });
10788
      };
10789
      var getGroupContainer = function (component) {
10790
        return detail.shell ? Optional.some(component) : getPart(component, detail, 'groups');
10791
      };
10792
      var extra = detail.shell ? {
10793
        behaviours: [Replacing.config({})],
10794
        components: []
10795
      } : {
10796
        behaviours: [],
10797
        components: components
10798
      };
10799
      return {
10800
        uid: detail.uid,
10801
        dom: detail.dom,
10802
        components: extra.components,
10803
        behaviours: augment(detail.toolbarBehaviours, extra.behaviours),
10804
        apis: { setGroups: setGroups },
10805
        domModification: { attributes: { role: 'group' } }
10806
      };
10807
    };
637 daniel-mar 10808
    var Toolbar = composite({
597 daniel-mar 10809
      name: 'Toolbar',
637 daniel-mar 10810
      configFields: schema$1(),
10811
      partFields: parts$1(),
10812
      factory: factory$1,
597 daniel-mar 10813
      apis: {
10814
        setGroups: function (apis, toolbar, groups) {
10815
          apis.setGroups(toolbar, groups);
10816
        }
10817
      }
10818
    });
10819
 
637 daniel-mar 10820
    var schema = constant$1([
10821
      required$1('items'),
597 daniel-mar 10822
      markers(['itemSelector']),
10823
      field$1('tgroupBehaviours', [Keying])
10824
    ]);
637 daniel-mar 10825
    var parts = constant$1([group({
597 daniel-mar 10826
        name: 'items',
10827
        unit: 'item'
10828
      })]);
10829
 
637 daniel-mar 10830
    var factory = function (detail, components, _spec, _externals) {
597 daniel-mar 10831
      return {
10832
        uid: detail.uid,
10833
        dom: detail.dom,
10834
        components: components,
10835
        behaviours: augment(detail.tgroupBehaviours, [Keying.config({
10836
            mode: 'flow',
10837
            selector: detail.markers.itemSelector
10838
          })]),
10839
        domModification: { attributes: { role: 'toolbar' } }
10840
      };
10841
    };
637 daniel-mar 10842
    var ToolbarGroup = composite({
597 daniel-mar 10843
      name: 'ToolbarGroup',
637 daniel-mar 10844
      configFields: schema(),
10845
      partFields: parts(),
10846
      factory: factory
597 daniel-mar 10847
    });
10848
 
10849
    var dataHorizontal = 'data-' + resolve('horizontal-scroll');
10850
    var canScrollVertically = function (container) {
10851
      container.dom.scrollTop = 1;
10852
      var result = container.dom.scrollTop !== 0;
10853
      container.dom.scrollTop = 0;
10854
      return result;
10855
    };
10856
    var canScrollHorizontally = function (container) {
10857
      container.dom.scrollLeft = 1;
10858
      var result = container.dom.scrollLeft !== 0;
10859
      container.dom.scrollLeft = 0;
10860
      return result;
10861
    };
10862
    var hasVerticalScroll = function (container) {
10863
      return container.dom.scrollTop > 0 || canScrollVertically(container);
10864
    };
10865
    var hasHorizontalScroll = function (container) {
10866
      return container.dom.scrollLeft > 0 || canScrollHorizontally(container);
10867
    };
10868
    var markAsHorizontal = function (container) {
637 daniel-mar 10869
      set$8(container, dataHorizontal, 'true');
597 daniel-mar 10870
    };
10871
    var hasScroll = function (container) {
637 daniel-mar 10872
      return get$b(container, dataHorizontal) === 'true' ? hasHorizontalScroll(container) : hasVerticalScroll(container);
597 daniel-mar 10873
    };
10874
    var exclusive = function (scope, selector) {
637 daniel-mar 10875
      return bind(scope, 'touchmove', function (event) {
10876
        closest$1(event.target, selector).filter(hasScroll).fold(function () {
597 daniel-mar 10877
          event.prevent();
10878
        }, noop);
10879
      });
10880
    };
10881
 
10882
    var ScrollingToolbar = function () {
10883
      var makeGroup = function (gSpec) {
10884
        var scrollClass = gSpec.scrollable === true ? '${prefix}-toolbar-scrollable-group' : '';
10885
        return {
10886
          dom: dom$1('<div aria-label="' + gSpec.label + '" class="${prefix}-toolbar-group ' + scrollClass + '"></div>'),
637 daniel-mar 10887
          tgroupBehaviours: derive$2([config('adhoc-scrollable-toolbar', gSpec.scrollable === true ? [runOnInit(function (component, _simulatedEvent) {
10888
                set$5(component.element, 'overflow-x', 'auto');
597 daniel-mar 10889
                markAsHorizontal(component.element);
637 daniel-mar 10890
                register$2(component.element);
597 daniel-mar 10891
              })] : [])]),
10892
          components: [Container.sketch({ components: [ToolbarGroup.parts.items({})] })],
10893
          markers: { itemSelector: '.' + resolve('toolbar-group-item') },
10894
          items: gSpec.items
10895
        };
10896
      };
10897
      var toolbar = build$1(Toolbar.sketch({
10898
        dom: dom$1('<div class="${prefix}-toolbar"></div>'),
10899
        components: [Toolbar.parts.groups({})],
637 daniel-mar 10900
        toolbarBehaviours: derive$2([
597 daniel-mar 10901
          Toggling.config({
10902
            toggleClass: resolve('context-toolbar'),
10903
            toggleOnExecute: false,
10904
            aria: { mode: 'none' }
10905
          }),
10906
          Keying.config({ mode: 'cyclic' })
10907
        ]),
10908
        shell: true
10909
      }));
10910
      var wrapper = build$1(Container.sketch({
10911
        dom: { classes: [resolve('toolstrip')] },
637 daniel-mar 10912
        components: [premade(toolbar)],
10913
        containerBehaviours: derive$2([Toggling.config({
597 daniel-mar 10914
            toggleClass: resolve('android-selection-context-toolbar'),
10915
            toggleOnExecute: false
10916
          })])
10917
      }));
10918
      var resetGroups = function () {
10919
        Toolbar.setGroups(toolbar, initGroups.get());
10920
        Toggling.off(toolbar);
10921
      };
10922
      var initGroups = Cell([]);
10923
      var setGroups = function (gs) {
10924
        initGroups.set(gs);
10925
        resetGroups();
10926
      };
10927
      var createGroups = function (gs) {
637 daniel-mar 10928
        return map$2(gs, compose(ToolbarGroup.sketch, makeGroup));
597 daniel-mar 10929
      };
10930
      var refresh = function () {
10931
      };
10932
      var setContextToolbar = function (gs) {
10933
        Toggling.on(toolbar);
10934
        Toolbar.setGroups(toolbar, gs);
10935
      };
10936
      var restoreToolbar = function () {
10937
        if (Toggling.isOn(toolbar)) {
10938
          resetGroups();
10939
        }
10940
      };
10941
      var focus = function () {
10942
        Keying.focusIn(toolbar);
10943
      };
10944
      return {
10945
        wrapper: wrapper,
10946
        toolbar: toolbar,
10947
        createGroups: createGroups,
10948
        setGroups: setGroups,
10949
        setContextToolbar: setContextToolbar,
10950
        restoreToolbar: restoreToolbar,
10951
        refresh: refresh,
10952
        focus: focus
10953
      };
10954
    };
10955
 
10956
    var makeEditSwitch = function (webapp) {
10957
      return build$1(Button.sketch({
10958
        dom: dom$1('<div class="${prefix}-mask-edit-icon ${prefix}-icon"></div>'),
10959
        action: function () {
10960
          webapp.run(function (w) {
10961
            w.setReadOnly(false);
10962
          });
10963
        }
10964
      }));
10965
    };
10966
    var makeSocket = function () {
10967
      return build$1(Container.sketch({
10968
        dom: dom$1('<div class="${prefix}-editor-socket"></div>'),
10969
        components: [],
637 daniel-mar 10970
        containerBehaviours: derive$2([Replacing.config({})])
597 daniel-mar 10971
      }));
10972
    };
10973
    var showEdit = function (socket, switchToEdit) {
637 daniel-mar 10974
      Replacing.append(socket, premade(switchToEdit));
597 daniel-mar 10975
    };
10976
    var hideEdit = function (socket, switchToEdit) {
10977
      Replacing.remove(socket, switchToEdit);
10978
    };
10979
    var updateMode = function (socket, switchToEdit, readOnly, root) {
10980
      var swap = readOnly === true ? Swapping.toAlpha : Swapping.toOmega;
10981
      swap(root);
10982
      var f = readOnly ? showEdit : hideEdit;
10983
      f(socket, switchToEdit);
10984
    };
10985
 
10986
    var getAnimationRoot = function (component, slideConfig) {
10987
      return slideConfig.getAnimationRoot.fold(function () {
10988
        return component.element;
10989
      }, function (get) {
10990
        return get(component);
10991
      });
10992
    };
10993
 
10994
    var getDimensionProperty = function (slideConfig) {
10995
      return slideConfig.dimension.property;
10996
    };
10997
    var getDimension = function (slideConfig, elem) {
10998
      return slideConfig.dimension.getDimension(elem);
10999
    };
11000
    var disableTransitions = function (component, slideConfig) {
11001
      var root = getAnimationRoot(component, slideConfig);
637 daniel-mar 11002
      remove$1(root, [
597 daniel-mar 11003
        slideConfig.shrinkingClass,
11004
        slideConfig.growingClass
11005
      ]);
11006
    };
11007
    var setShrunk = function (component, slideConfig) {
637 daniel-mar 11008
      remove$3(component.element, slideConfig.openClass);
11009
      add$1(component.element, slideConfig.closedClass);
11010
      set$5(component.element, getDimensionProperty(slideConfig), '0px');
597 daniel-mar 11011
      reflow(component.element);
11012
    };
11013
    var setGrown = function (component, slideConfig) {
637 daniel-mar 11014
      remove$3(component.element, slideConfig.closedClass);
11015
      add$1(component.element, slideConfig.openClass);
11016
      remove$2(component.element, getDimensionProperty(slideConfig));
597 daniel-mar 11017
    };
11018
    var doImmediateShrink = function (component, slideConfig, slideState, _calculatedSize) {
11019
      slideState.setCollapsed();
637 daniel-mar 11020
      set$5(component.element, getDimensionProperty(slideConfig), getDimension(slideConfig, component.element));
597 daniel-mar 11021
      reflow(component.element);
11022
      disableTransitions(component, slideConfig);
11023
      setShrunk(component, slideConfig);
11024
      slideConfig.onStartShrink(component);
11025
      slideConfig.onShrunk(component);
11026
    };
11027
    var doStartShrink = function (component, slideConfig, slideState, calculatedSize) {
11028
      var size = calculatedSize.getOrThunk(function () {
11029
        return getDimension(slideConfig, component.element);
11030
      });
11031
      slideState.setCollapsed();
637 daniel-mar 11032
      set$5(component.element, getDimensionProperty(slideConfig), size);
597 daniel-mar 11033
      reflow(component.element);
11034
      var root = getAnimationRoot(component, slideConfig);
637 daniel-mar 11035
      remove$3(root, slideConfig.growingClass);
11036
      add$1(root, slideConfig.shrinkingClass);
597 daniel-mar 11037
      setShrunk(component, slideConfig);
11038
      slideConfig.onStartShrink(component);
11039
    };
11040
    var doStartSmartShrink = function (component, slideConfig, slideState) {
11041
      var size = getDimension(slideConfig, component.element);
11042
      var shrinker = size === '0px' ? doImmediateShrink : doStartShrink;
11043
      shrinker(component, slideConfig, slideState, Optional.some(size));
11044
    };
11045
    var doStartGrow = function (component, slideConfig, slideState) {
11046
      var root = getAnimationRoot(component, slideConfig);
637 daniel-mar 11047
      var wasShrinking = has(root, slideConfig.shrinkingClass);
597 daniel-mar 11048
      var beforeSize = getDimension(slideConfig, component.element);
11049
      setGrown(component, slideConfig);
11050
      var fullSize = getDimension(slideConfig, component.element);
11051
      var startPartialGrow = function () {
637 daniel-mar 11052
        set$5(component.element, getDimensionProperty(slideConfig), beforeSize);
597 daniel-mar 11053
        reflow(component.element);
11054
      };
11055
      var startCompleteGrow = function () {
11056
        setShrunk(component, slideConfig);
11057
      };
11058
      var setStartSize = wasShrinking ? startPartialGrow : startCompleteGrow;
11059
      setStartSize();
637 daniel-mar 11060
      remove$3(root, slideConfig.shrinkingClass);
11061
      add$1(root, slideConfig.growingClass);
597 daniel-mar 11062
      setGrown(component, slideConfig);
637 daniel-mar 11063
      set$5(component.element, getDimensionProperty(slideConfig), fullSize);
597 daniel-mar 11064
      slideState.setExpanded();
11065
      slideConfig.onStartGrow(component);
11066
    };
637 daniel-mar 11067
    var refresh$1 = function (component, slideConfig, slideState) {
597 daniel-mar 11068
      if (slideState.isExpanded()) {
637 daniel-mar 11069
        remove$2(component.element, getDimensionProperty(slideConfig));
597 daniel-mar 11070
        var fullSize = getDimension(slideConfig, component.element);
637 daniel-mar 11071
        set$5(component.element, getDimensionProperty(slideConfig), fullSize);
597 daniel-mar 11072
      }
11073
    };
11074
    var grow = function (component, slideConfig, slideState) {
11075
      if (!slideState.isExpanded()) {
11076
        doStartGrow(component, slideConfig, slideState);
11077
      }
11078
    };
11079
    var shrink = function (component, slideConfig, slideState) {
11080
      if (slideState.isExpanded()) {
11081
        doStartSmartShrink(component, slideConfig, slideState);
11082
      }
11083
    };
11084
    var immediateShrink = function (component, slideConfig, slideState) {
11085
      if (slideState.isExpanded()) {
637 daniel-mar 11086
        doImmediateShrink(component, slideConfig, slideState);
597 daniel-mar 11087
      }
11088
    };
11089
    var hasGrown = function (component, slideConfig, slideState) {
11090
      return slideState.isExpanded();
11091
    };
11092
    var hasShrunk = function (component, slideConfig, slideState) {
11093
      return slideState.isCollapsed();
11094
    };
11095
    var isGrowing = function (component, slideConfig, _slideState) {
11096
      var root = getAnimationRoot(component, slideConfig);
637 daniel-mar 11097
      return has(root, slideConfig.growingClass) === true;
597 daniel-mar 11098
    };
11099
    var isShrinking = function (component, slideConfig, _slideState) {
11100
      var root = getAnimationRoot(component, slideConfig);
637 daniel-mar 11101
      return has(root, slideConfig.shrinkingClass) === true;
597 daniel-mar 11102
    };
11103
    var isTransitioning = function (component, slideConfig, slideState) {
11104
      return isGrowing(component, slideConfig) || isShrinking(component, slideConfig);
11105
    };
11106
    var toggleGrow = function (component, slideConfig, slideState) {
11107
      var f = slideState.isExpanded() ? doStartSmartShrink : doStartGrow;
11108
      f(component, slideConfig, slideState);
11109
    };
11110
 
11111
    var SlidingApis = /*#__PURE__*/Object.freeze({
11112
        __proto__: null,
637 daniel-mar 11113
        refresh: refresh$1,
597 daniel-mar 11114
        grow: grow,
11115
        shrink: shrink,
11116
        immediateShrink: immediateShrink,
11117
        hasGrown: hasGrown,
11118
        hasShrunk: hasShrunk,
11119
        isGrowing: isGrowing,
11120
        isShrinking: isShrinking,
11121
        isTransitioning: isTransitioning,
11122
        toggleGrow: toggleGrow,
11123
        disableTransitions: disableTransitions
11124
    });
11125
 
637 daniel-mar 11126
    var exhibit = function (base, slideConfig, _slideState) {
597 daniel-mar 11127
      var expanded = slideConfig.expanded;
637 daniel-mar 11128
      return expanded ? nu$3({
597 daniel-mar 11129
        classes: [slideConfig.openClass],
11130
        styles: {}
637 daniel-mar 11131
      }) : nu$3({
597 daniel-mar 11132
        classes: [slideConfig.closedClass],
637 daniel-mar 11133
        styles: wrap(slideConfig.dimension.property, '0px')
597 daniel-mar 11134
      });
11135
    };
637 daniel-mar 11136
    var events = function (slideConfig, slideState) {
11137
      return derive$3([runOnSource(transitionend(), function (component, simulatedEvent) {
597 daniel-mar 11138
          var raw = simulatedEvent.event.raw;
11139
          if (raw.propertyName === slideConfig.dimension.property) {
11140
            disableTransitions(component, slideConfig);
11141
            if (slideState.isExpanded()) {
637 daniel-mar 11142
              remove$2(component.element, slideConfig.dimension.property);
597 daniel-mar 11143
            }
11144
            var notify = slideState.isExpanded() ? slideConfig.onGrown : slideConfig.onShrunk;
11145
            notify(component);
11146
          }
11147
        })]);
11148
    };
11149
 
11150
    var ActiveSliding = /*#__PURE__*/Object.freeze({
11151
        __proto__: null,
637 daniel-mar 11152
        exhibit: exhibit,
11153
        events: events
597 daniel-mar 11154
    });
11155
 
11156
    var SlidingSchema = [
637 daniel-mar 11157
      required$1('closedClass'),
11158
      required$1('openClass'),
11159
      required$1('shrinkingClass'),
11160
      required$1('growingClass'),
597 daniel-mar 11161
      option('getAnimationRoot'),
11162
      onHandler('onShrunk'),
11163
      onHandler('onStartShrink'),
11164
      onHandler('onGrown'),
11165
      onHandler('onStartGrow'),
637 daniel-mar 11166
      defaulted('expanded', false),
11167
      requiredOf('dimension', choose$1('property', {
597 daniel-mar 11168
        width: [
11169
          output('property', 'width'),
11170
          output('getDimension', function (elem) {
637 daniel-mar 11171
            return get$5(elem) + 'px';
597 daniel-mar 11172
          })
11173
        ],
11174
        height: [
11175
          output('property', 'height'),
11176
          output('getDimension', function (elem) {
637 daniel-mar 11177
            return get$7(elem) + 'px';
597 daniel-mar 11178
          })
11179
        ]
11180
      }))
11181
    ];
11182
 
637 daniel-mar 11183
    var init$1 = function (spec) {
597 daniel-mar 11184
      var state = Cell(spec.expanded);
11185
      var readState = function () {
11186
        return 'expanded: ' + state.get();
11187
      };
637 daniel-mar 11188
      return nu$2({
597 daniel-mar 11189
        isExpanded: function () {
11190
          return state.get() === true;
11191
        },
11192
        isCollapsed: function () {
11193
          return state.get() === false;
11194
        },
11195
        setCollapsed: curry(state.set, false),
11196
        setExpanded: curry(state.set, true),
11197
        readState: readState
11198
      });
11199
    };
11200
 
11201
    var SlidingState = /*#__PURE__*/Object.freeze({
11202
        __proto__: null,
637 daniel-mar 11203
        init: init$1
597 daniel-mar 11204
    });
11205
 
637 daniel-mar 11206
    var Sliding = create$5({
597 daniel-mar 11207
      fields: SlidingSchema,
11208
      name: 'sliding',
11209
      active: ActiveSliding,
11210
      apis: SlidingApis,
11211
      state: SlidingState
11212
    });
11213
 
637 daniel-mar 11214
    var build = function (refresh, scrollIntoView) {
597 daniel-mar 11215
      var dropup = build$1(Container.sketch({
11216
        dom: {
11217
          tag: 'div',
11218
          classes: [resolve('dropup')]
11219
        },
11220
        components: [],
637 daniel-mar 11221
        containerBehaviours: derive$2([
597 daniel-mar 11222
          Replacing.config({}),
11223
          Sliding.config({
11224
            closedClass: resolve('dropup-closed'),
11225
            openClass: resolve('dropup-open'),
11226
            shrinkingClass: resolve('dropup-shrinking'),
11227
            growingClass: resolve('dropup-growing'),
11228
            dimension: { property: 'height' },
11229
            onShrunk: function (component) {
11230
              refresh();
11231
              scrollIntoView();
11232
              Replacing.set(component, []);
11233
            },
11234
            onGrown: function (_component) {
11235
              refresh();
11236
              scrollIntoView();
11237
            }
11238
          }),
11239
          orientation(function (_component, _data) {
11240
            disappear(noop);
11241
          })
11242
        ])
11243
      }));
11244
      var appear = function (menu, update, component) {
11245
        if (Sliding.hasShrunk(dropup) === true && Sliding.isTransitioning(dropup) === false) {
11246
          window.requestAnimationFrame(function () {
11247
            update(component);
11248
            Replacing.set(dropup, [menu()]);
11249
            Sliding.grow(dropup);
11250
          });
11251
        }
11252
      };
11253
      var disappear = function (onReadyToShrink) {
11254
        window.requestAnimationFrame(function () {
11255
          onReadyToShrink();
11256
          Sliding.shrink(dropup);
11257
        });
11258
      };
11259
      return {
11260
        appear: appear,
11261
        disappear: disappear,
11262
        component: dropup,
11263
        element: dropup.element
11264
      };
11265
    };
11266
 
637 daniel-mar 11267
    var closest = function (scope, selector, isRoot) {
11268
      return closest$1(scope, selector, isRoot).isSome();
597 daniel-mar 11269
    };
11270
 
11271
    var isDangerous = function (event) {
11272
      var keyEv = event.raw;
637 daniel-mar 11273
      return keyEv.which === BACKSPACE[0] && !contains$1([
597 daniel-mar 11274
        'input',
11275
        'textarea'
637 daniel-mar 11276
      ], name$1(event.target)) && !closest(event.target, '[contenteditable="true"]');
597 daniel-mar 11277
    };
11278
    var isFirefox = function () {
637 daniel-mar 11279
      return detect$1().browser.isFirefox();
597 daniel-mar 11280
    };
11281
    var bindFocus = function (container, handler) {
11282
      if (isFirefox()) {
637 daniel-mar 11283
        return capture(container, 'focus', handler);
597 daniel-mar 11284
      } else {
637 daniel-mar 11285
        return bind(container, 'focusin', handler);
597 daniel-mar 11286
      }
11287
    };
11288
    var bindBlur = function (container, handler) {
11289
      if (isFirefox()) {
637 daniel-mar 11290
        return capture(container, 'blur', handler);
597 daniel-mar 11291
      } else {
637 daniel-mar 11292
        return bind(container, 'focusout', handler);
597 daniel-mar 11293
      }
11294
    };
637 daniel-mar 11295
    var setup$1 = function (container, rawSettings) {
679 daniel-mar 11296
      var settings = __assign({ stopBackspace: true }, rawSettings);
597 daniel-mar 11297
      var pointerEvents = [
11298
        'touchstart',
11299
        'touchmove',
11300
        'touchend',
11301
        'touchcancel',
11302
        'gesturestart',
11303
        'mousedown',
11304
        'mouseup',
11305
        'mouseover',
11306
        'mousemove',
11307
        'mouseout',
11308
        'click'
11309
      ];
637 daniel-mar 11310
      var tapEvent = monitor$1(settings);
11311
      var simpleEvents = map$2(pointerEvents.concat([
597 daniel-mar 11312
        'selectstart',
11313
        'input',
11314
        'contextmenu',
11315
        'change',
11316
        'transitionend',
637 daniel-mar 11317
        'transitioncancel',
597 daniel-mar 11318
        'drag',
11319
        'dragstart',
11320
        'dragend',
11321
        'dragenter',
11322
        'dragleave',
11323
        'dragover',
11324
        'drop',
11325
        'keyup'
11326
      ]), function (type) {
637 daniel-mar 11327
        return bind(container, type, function (event) {
597 daniel-mar 11328
          tapEvent.fireIfReady(event, type).each(function (tapStopped) {
11329
            if (tapStopped) {
11330
              event.kill();
11331
            }
11332
          });
11333
          var stopped = settings.triggerEvent(type, event);
11334
          if (stopped) {
11335
            event.kill();
11336
          }
11337
        });
11338
      });
637 daniel-mar 11339
      var pasteTimeout = value();
11340
      var onPaste = bind(container, 'paste', function (event) {
597 daniel-mar 11341
        tapEvent.fireIfReady(event, 'paste').each(function (tapStopped) {
11342
          if (tapStopped) {
11343
            event.kill();
11344
          }
11345
        });
11346
        var stopped = settings.triggerEvent('paste', event);
11347
        if (stopped) {
11348
          event.kill();
11349
        }
637 daniel-mar 11350
        pasteTimeout.set(setTimeout(function () {
597 daniel-mar 11351
          settings.triggerEvent(postPaste(), event);
637 daniel-mar 11352
        }, 0));
597 daniel-mar 11353
      });
637 daniel-mar 11354
      var onKeydown = bind(container, 'keydown', function (event) {
597 daniel-mar 11355
        var stopped = settings.triggerEvent('keydown', event);
11356
        if (stopped) {
11357
          event.kill();
679 daniel-mar 11358
        } else if (settings.stopBackspace && isDangerous(event)) {
597 daniel-mar 11359
          event.prevent();
11360
        }
11361
      });
11362
      var onFocusIn = bindFocus(container, function (event) {
11363
        var stopped = settings.triggerEvent('focusin', event);
11364
        if (stopped) {
11365
          event.kill();
11366
        }
11367
      });
637 daniel-mar 11368
      var focusoutTimeout = value();
597 daniel-mar 11369
      var onFocusOut = bindBlur(container, function (event) {
11370
        var stopped = settings.triggerEvent('focusout', event);
11371
        if (stopped) {
11372
          event.kill();
11373
        }
637 daniel-mar 11374
        focusoutTimeout.set(setTimeout(function () {
597 daniel-mar 11375
          settings.triggerEvent(postBlur(), event);
637 daniel-mar 11376
        }, 0));
597 daniel-mar 11377
      });
11378
      var unbind = function () {
637 daniel-mar 11379
        each$1(simpleEvents, function (e) {
597 daniel-mar 11380
          e.unbind();
11381
        });
11382
        onKeydown.unbind();
11383
        onFocusIn.unbind();
11384
        onFocusOut.unbind();
11385
        onPaste.unbind();
637 daniel-mar 11386
        pasteTimeout.on(clearTimeout);
11387
        focusoutTimeout.on(clearTimeout);
597 daniel-mar 11388
      };
11389
      return { unbind: unbind };
11390
    };
11391
 
637 daniel-mar 11392
    var derive$1 = function (rawEvent, rawTarget) {
11393
      var source = get$c(rawEvent, 'target').getOr(rawTarget);
597 daniel-mar 11394
      return Cell(source);
11395
    };
11396
 
11397
    var fromSource = function (event, source) {
11398
      var stopper = Cell(false);
11399
      var cutter = Cell(false);
11400
      var stop = function () {
11401
        stopper.set(true);
11402
      };
11403
      var cut = function () {
11404
        cutter.set(true);
11405
      };
11406
      return {
11407
        stop: stop,
11408
        cut: cut,
11409
        isStopped: stopper.get,
11410
        isCut: cutter.get,
11411
        event: event,
11412
        setSource: source.set,
11413
        getSource: source.get
11414
      };
11415
    };
11416
    var fromExternal = function (event) {
11417
      var stopper = Cell(false);
11418
      var stop = function () {
11419
        stopper.set(true);
11420
      };
11421
      return {
11422
        stop: stop,
11423
        cut: noop,
11424
        isStopped: stopper.get,
11425
        isCut: never,
11426
        event: event,
11427
        setSource: die('Cannot set source of a broadcasted event'),
11428
        getSource: die('Cannot get source of a broadcasted event')
11429
      };
11430
    };
11431
 
637 daniel-mar 11432
    var adt = Adt.generate([
597 daniel-mar 11433
      { stopped: [] },
11434
      { resume: ['element'] },
11435
      { complete: [] }
11436
    ]);
11437
    var doTriggerHandler = function (lookup, eventType, rawEvent, target, source, logger) {
11438
      var handler = lookup(eventType, target);
11439
      var simulatedEvent = fromSource(rawEvent, source);
11440
      return handler.fold(function () {
11441
        logger.logEventNoHandlers(eventType, target);
637 daniel-mar 11442
        return adt.complete();
597 daniel-mar 11443
      }, function (handlerInfo) {
11444
        var descHandler = handlerInfo.descHandler;
11445
        var eventHandler = getCurried(descHandler);
11446
        eventHandler(simulatedEvent);
11447
        if (simulatedEvent.isStopped()) {
11448
          logger.logEventStopped(eventType, handlerInfo.element, descHandler.purpose);
637 daniel-mar 11449
          return adt.stopped();
597 daniel-mar 11450
        } else if (simulatedEvent.isCut()) {
11451
          logger.logEventCut(eventType, handlerInfo.element, descHandler.purpose);
637 daniel-mar 11452
          return adt.complete();
597 daniel-mar 11453
        } else {
11454
          return parent(handlerInfo.element).fold(function () {
11455
            logger.logNoParent(eventType, handlerInfo.element, descHandler.purpose);
637 daniel-mar 11456
            return adt.complete();
597 daniel-mar 11457
          }, function (parent) {
11458
            logger.logEventResponse(eventType, handlerInfo.element, descHandler.purpose);
637 daniel-mar 11459
            return adt.resume(parent);
597 daniel-mar 11460
          });
11461
        }
11462
      });
11463
    };
11464
    var doTriggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, source, logger) {
11465
      return doTriggerHandler(lookup, eventType, rawEvent, rawTarget, source, logger).fold(always, function (parent) {
11466
        return doTriggerOnUntilStopped(lookup, eventType, rawEvent, parent, source, logger);
11467
      }, never);
11468
    };
11469
    var triggerHandler = function (lookup, eventType, rawEvent, target, logger) {
637 daniel-mar 11470
      var source = derive$1(rawEvent, target);
597 daniel-mar 11471
      return doTriggerHandler(lookup, eventType, rawEvent, target, source, logger);
11472
    };
11473
    var broadcast = function (listeners, rawEvent, _logger) {
11474
      var simulatedEvent = fromExternal(rawEvent);
637 daniel-mar 11475
      each$1(listeners, function (listener) {
597 daniel-mar 11476
        var descHandler = listener.descHandler;
11477
        var handler = getCurried(descHandler);
11478
        handler(simulatedEvent);
11479
      });
11480
      return simulatedEvent.isStopped();
11481
    };
11482
    var triggerUntilStopped = function (lookup, eventType, rawEvent, logger) {
11483
      return triggerOnUntilStopped(lookup, eventType, rawEvent, rawEvent.target, logger);
11484
    };
11485
    var triggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, logger) {
637 daniel-mar 11486
      var source = derive$1(rawEvent, rawTarget);
597 daniel-mar 11487
      return doTriggerOnUntilStopped(lookup, eventType, rawEvent, rawTarget, source, logger);
11488
    };
11489
 
11490
    var eventHandler = function (element, descHandler) {
11491
      return {
11492
        element: element,
11493
        descHandler: descHandler
11494
      };
11495
    };
11496
    var broadcastHandler = function (id, handler) {
11497
      return {
11498
        id: id,
11499
        descHandler: handler
11500
      };
11501
    };
11502
    var EventRegistry = function () {
11503
      var registry = {};
11504
      var registerId = function (extraArgs, id, events) {
637 daniel-mar 11505
        each(events, function (v, k) {
597 daniel-mar 11506
          var handlers = registry[k] !== undefined ? registry[k] : {};
11507
          handlers[id] = curryArgs(v, extraArgs);
11508
          registry[k] = handlers;
11509
        });
11510
      };
11511
      var findHandler = function (handlers, elem) {
679 daniel-mar 11512
        return read(elem).bind(function (id) {
11513
          return get$c(handlers, id);
11514
        }).map(function (descHandler) {
11515
          return eventHandler(elem, descHandler);
597 daniel-mar 11516
        });
11517
      };
11518
      var filterByType = function (type) {
637 daniel-mar 11519
        return get$c(registry, type).map(function (handlers) {
597 daniel-mar 11520
          return mapToArray(handlers, function (f, id) {
11521
            return broadcastHandler(id, f);
11522
          });
11523
        }).getOr([]);
11524
      };
11525
      var find = function (isAboveRoot, type, target) {
679 daniel-mar 11526
        return get$c(registry, type).bind(function (handlers) {
11527
          return closest$3(target, function (elem) {
11528
            return findHandler(handlers, elem);
11529
          }, isAboveRoot);
11530
        });
597 daniel-mar 11531
      };
11532
      var unregisterId = function (id) {
637 daniel-mar 11533
        each(registry, function (handlersById, _eventName) {
11534
          if (has$2(handlersById, id)) {
597 daniel-mar 11535
            delete handlersById[id];
11536
          }
11537
        });
11538
      };
11539
      return {
11540
        registerId: registerId,
11541
        unregisterId: unregisterId,
11542
        filterByType: filterByType,
11543
        find: find
11544
      };
11545
    };
11546
 
11547
    var Registry = function () {
11548
      var events = EventRegistry();
11549
      var components = {};
11550
      var readOrTag = function (component) {
11551
        var elem = component.element;
637 daniel-mar 11552
        return read(elem).getOrThunk(function () {
597 daniel-mar 11553
          return write('uid-', component.element);
11554
        });
11555
      };
11556
      var failOnDuplicate = function (component, tagId) {
11557
        var conflict = components[tagId];
11558
        if (conflict === component) {
11559
          unregister(component);
11560
        } else {
11561
          throw new Error('The tagId "' + tagId + '" is already used by: ' + element(conflict.element) + '\nCannot use it for: ' + element(component.element) + '\n' + 'The conflicting element is' + (inBody(conflict.element) ? ' ' : ' not ') + 'already in the DOM');
11562
        }
11563
      };
11564
      var register = function (component) {
11565
        var tagId = readOrTag(component);
11566
        if (hasNonNullableKey(components, tagId)) {
11567
          failOnDuplicate(component, tagId);
11568
        }
11569
        var extraArgs = [component];
11570
        events.registerId(extraArgs, tagId, component.events);
11571
        components[tagId] = component;
11572
      };
11573
      var unregister = function (component) {
637 daniel-mar 11574
        read(component.element).each(function (tagId) {
597 daniel-mar 11575
          delete components[tagId];
11576
          events.unregisterId(tagId);
11577
        });
11578
      };
11579
      var filter = function (type) {
11580
        return events.filterByType(type);
11581
      };
11582
      var find = function (isAboveRoot, type, target) {
11583
        return events.find(isAboveRoot, type, target);
11584
      };
11585
      var getById = function (id) {
637 daniel-mar 11586
        return get$c(components, id);
597 daniel-mar 11587
      };
11588
      return {
11589
        find: find,
11590
        filter: filter,
11591
        register: register,
11592
        unregister: unregister,
11593
        getById: getById
11594
      };
11595
    };
11596
 
637 daniel-mar 11597
    var takeover$1 = function (root) {
597 daniel-mar 11598
      var isAboveRoot = function (el) {
11599
        return parent(root.element).fold(always, function (parent) {
11600
          return eq(el, parent);
11601
        });
11602
      };
11603
      var registry = Registry();
11604
      var lookup = function (eventName, target) {
11605
        return registry.find(isAboveRoot, eventName, target);
11606
      };
637 daniel-mar 11607
      var domEvents = setup$1(root.element, {
597 daniel-mar 11608
        triggerEvent: function (eventName, event) {
11609
          return monitorEvent(eventName, event.target, function (logger) {
11610
            return triggerUntilStopped(lookup, eventName, event, logger);
11611
          });
11612
        }
11613
      });
11614
      var systemApi = {
637 daniel-mar 11615
        debugInfo: constant$1('real'),
597 daniel-mar 11616
        triggerEvent: function (eventName, target, data) {
11617
          monitorEvent(eventName, target, function (logger) {
11618
            return triggerOnUntilStopped(lookup, eventName, data, target, logger);
11619
          });
11620
        },
11621
        triggerFocus: function (target, originator) {
637 daniel-mar 11622
          read(target).fold(function () {
11623
            focus$3(target);
597 daniel-mar 11624
          }, function (_alloyId) {
637 daniel-mar 11625
            monitorEvent(focus$4(), target, function (logger) {
11626
              triggerHandler(lookup, focus$4(), {
597 daniel-mar 11627
                originator: originator,
11628
                kill: noop,
11629
                prevent: noop,
11630
                target: target
11631
              }, target, logger);
11632
              return false;
11633
            });
11634
          });
11635
        },
11636
        triggerEscape: function (comp, simulatedEvent) {
11637
          systemApi.triggerEvent('keydown', comp.element, simulatedEvent.event);
11638
        },
11639
        getByUid: function (uid) {
11640
          return getByUid(uid);
11641
        },
11642
        getByDom: function (elem) {
11643
          return getByDom(elem);
11644
        },
11645
        build: build$1,
11646
        addToGui: function (c) {
11647
          add(c);
11648
        },
11649
        removeFromGui: function (c) {
637 daniel-mar 11650
          remove(c);
597 daniel-mar 11651
        },
11652
        addToWorld: function (c) {
11653
          addToWorld(c);
11654
        },
11655
        removeFromWorld: function (c) {
11656
          removeFromWorld(c);
11657
        },
11658
        broadcast: function (message) {
11659
          broadcast$1(message);
11660
        },
11661
        broadcastOn: function (channels, message) {
11662
          broadcastOn(channels, message);
11663
        },
11664
        broadcastEvent: function (eventName, event) {
11665
          broadcastEvent(eventName, event);
11666
        },
11667
        isConnected: always
11668
      };
11669
      var addToWorld = function (component) {
11670
        component.connect(systemApi);
11671
        if (!isText(component.element)) {
11672
          registry.register(component);
637 daniel-mar 11673
          each$1(component.components(), addToWorld);
597 daniel-mar 11674
          systemApi.triggerEvent(systemInit(), component.element, { target: component.element });
11675
        }
11676
      };
11677
      var removeFromWorld = function (component) {
11678
        if (!isText(component.element)) {
637 daniel-mar 11679
          each$1(component.components(), removeFromWorld);
597 daniel-mar 11680
          registry.unregister(component);
11681
        }
11682
        component.disconnect();
11683
      };
11684
      var add = function (component) {
637 daniel-mar 11685
        attach(root, component);
597 daniel-mar 11686
      };
637 daniel-mar 11687
      var remove = function (component) {
597 daniel-mar 11688
        detach(component);
11689
      };
11690
      var destroy = function () {
11691
        domEvents.unbind();
637 daniel-mar 11692
        remove$7(root.element);
597 daniel-mar 11693
      };
11694
      var broadcastData = function (data) {
637 daniel-mar 11695
        var receivers = registry.filter(receive$1());
11696
        each$1(receivers, function (receiver) {
597 daniel-mar 11697
          var descHandler = receiver.descHandler;
11698
          var handler = getCurried(descHandler);
11699
          handler(data);
11700
        });
11701
      };
11702
      var broadcast$1 = function (message) {
11703
        broadcastData({
11704
          universal: true,
11705
          data: message
11706
        });
11707
      };
11708
      var broadcastOn = function (channels, message) {
11709
        broadcastData({
11710
          universal: false,
11711
          channels: channels,
11712
          data: message
11713
        });
11714
      };
11715
      var broadcastEvent = function (eventName, event) {
11716
        var listeners = registry.filter(eventName);
11717
        return broadcast(listeners, event);
11718
      };
11719
      var getByUid = function (uid) {
11720
        return registry.getById(uid).fold(function () {
11721
          return Result.error(new Error('Could not find component with uid: "' + uid + '" in system.'));
11722
        }, Result.value);
11723
      };
11724
      var getByDom = function (elem) {
637 daniel-mar 11725
        var uid = read(elem).getOr('not found');
597 daniel-mar 11726
        return getByUid(uid);
11727
      };
11728
      addToWorld(root);
11729
      return {
11730
        root: root,
11731
        element: root.element,
11732
        destroy: destroy,
11733
        add: add,
637 daniel-mar 11734
        remove: remove,
597 daniel-mar 11735
        getByUid: getByUid,
11736
        getByDom: getByDom,
11737
        addToWorld: addToWorld,
11738
        removeFromWorld: removeFromWorld,
11739
        broadcast: broadcast$1,
11740
        broadcastOn: broadcastOn,
11741
        broadcastEvent: broadcastEvent
11742
      };
11743
    };
11744
 
11745
    var READ_ONLY_MODE_CLASS = resolve('readonly-mode');
11746
    var EDIT_MODE_CLASS = resolve('edit-mode');
11747
    function OuterContainer (spec) {
11748
      var root = build$1(Container.sketch({
11749
        dom: { classes: [resolve('outer-container')].concat(spec.classes) },
637 daniel-mar 11750
        containerBehaviours: derive$2([Swapping.config({
597 daniel-mar 11751
            alpha: READ_ONLY_MODE_CLASS,
11752
            omega: EDIT_MODE_CLASS
11753
          })])
11754
      }));
637 daniel-mar 11755
      return takeover$1(root);
597 daniel-mar 11756
    }
11757
 
11758
    function AndroidRealm (scrollIntoView) {
11759
      var alloy = OuterContainer({ classes: [resolve('android-container')] });
11760
      var toolbar = ScrollingToolbar();
11761
      var webapp = api$2();
11762
      var switchToEdit = makeEditSwitch(webapp);
11763
      var socket = makeSocket();
637 daniel-mar 11764
      var dropup = build(noop, scrollIntoView);
597 daniel-mar 11765
      alloy.add(toolbar.wrapper);
11766
      alloy.add(socket);
11767
      alloy.add(dropup.component);
11768
      var setToolbarGroups = function (rawGroups) {
11769
        var groups = toolbar.createGroups(rawGroups);
11770
        toolbar.setGroups(groups);
11771
      };
11772
      var setContextToolbar = function (rawGroups) {
11773
        var groups = toolbar.createGroups(rawGroups);
11774
        toolbar.setContextToolbar(groups);
11775
      };
11776
      var focusToolbar = function () {
11777
        toolbar.focus();
11778
      };
11779
      var restoreToolbar = function () {
11780
        toolbar.restoreToolbar();
11781
      };
11782
      var init = function (spec) {
637 daniel-mar 11783
        webapp.set(produce$1(spec));
597 daniel-mar 11784
      };
11785
      var exit = function () {
11786
        webapp.run(function (w) {
11787
          w.exit();
11788
          Replacing.remove(socket, switchToEdit);
11789
        });
11790
      };
11791
      var updateMode$1 = function (readOnly) {
11792
        updateMode(socket, switchToEdit, readOnly, alloy.root);
11793
      };
11794
      return {
11795
        system: alloy,
11796
        element: alloy.element,
11797
        init: init,
11798
        exit: exit,
11799
        setToolbarGroups: setToolbarGroups,
11800
        setContextToolbar: setContextToolbar,
11801
        focusToolbar: focusToolbar,
11802
        restoreToolbar: restoreToolbar,
11803
        updateMode: updateMode$1,
11804
        socket: socket,
11805
        dropup: dropup
11806
      };
11807
    }
11808
 
637 daniel-mar 11809
    var input = function (parent, operation) {
597 daniel-mar 11810
      var input = SugarElement.fromTag('input');
637 daniel-mar 11811
      setAll(input, {
597 daniel-mar 11812
        opacity: '0',
11813
        position: 'absolute',
11814
        top: '-1000px',
11815
        left: '-1000px'
11816
      });
637 daniel-mar 11817
      append$2(parent, input);
11818
      focus$3(input);
597 daniel-mar 11819
      operation(input);
637 daniel-mar 11820
      remove$7(input);
597 daniel-mar 11821
    };
11822
 
637 daniel-mar 11823
    var refresh = function (winScope) {
597 daniel-mar 11824
      var sel = winScope.getSelection();
11825
      if (sel.rangeCount > 0) {
11826
        var br = sel.getRangeAt(0);
11827
        var r = winScope.document.createRange();
11828
        r.setStart(br.startContainer, br.startOffset);
11829
        r.setEnd(br.endContainer, br.endOffset);
11830
        sel.removeAllRanges();
11831
        sel.addRange(r);
11832
      }
11833
    };
11834
 
637 daniel-mar 11835
    var resume = function (cWin, frame) {
597 daniel-mar 11836
      active().each(function (active) {
11837
        if (!eq(active, frame)) {
637 daniel-mar 11838
          blur$1(active);
597 daniel-mar 11839
        }
11840
      });
11841
      cWin.focus();
637 daniel-mar 11842
      focus$3(SugarElement.fromDom(cWin.document.body));
11843
      refresh(cWin);
597 daniel-mar 11844
    };
11845
 
11846
    var stubborn = function (outerBody, cWin, page, frame) {
11847
      var toEditing = function () {
637 daniel-mar 11848
        resume(cWin, frame);
597 daniel-mar 11849
      };
11850
      var toReading = function () {
637 daniel-mar 11851
        input(outerBody, blur$1);
597 daniel-mar 11852
      };
637 daniel-mar 11853
      var captureInput = bind(page, 'keydown', function (evt) {
11854
        if (!contains$1([
597 daniel-mar 11855
            'input',
11856
            'textarea'
637 daniel-mar 11857
          ], name$1(evt.target))) {
597 daniel-mar 11858
          toEditing();
11859
        }
11860
      });
11861
      var onToolbarTouch = noop;
11862
      var destroy = function () {
11863
        captureInput.unbind();
11864
      };
11865
      return {
11866
        toReading: toReading,
11867
        toEditing: toEditing,
11868
        onToolbarTouch: onToolbarTouch,
11869
        destroy: destroy
11870
      };
11871
    };
11872
 
637 daniel-mar 11873
    var initEvents = function (editorApi, iosApi, toolstrip, socket, _dropup) {
597 daniel-mar 11874
      var saveSelectionFirst = function () {
11875
        iosApi.run(function (api) {
11876
          api.highlightSelection();
11877
        });
11878
      };
11879
      var refreshIosSelection = function () {
11880
        iosApi.run(function (api) {
11881
          api.refreshSelection();
11882
        });
11883
      };
11884
      var scrollToY = function (yTop, height) {
11885
        var y = yTop - socket.dom.scrollTop;
11886
        iosApi.run(function (api) {
11887
          api.scrollIntoView(y, y + height);
11888
        });
11889
      };
11890
      var scrollToElement = function (_target) {
11891
        scrollToY(iosApi, socket);
11892
      };
11893
      var scrollToCursor = function () {
11894
        editorApi.getCursorBox().each(function (box) {
11895
          scrollToY(box.top, box.height);
11896
        });
11897
      };
11898
      var clearSelection = function () {
11899
        iosApi.run(function (api) {
11900
          api.clearSelection();
11901
        });
11902
      };
11903
      var clearAndRefresh = function () {
11904
        clearSelection();
11905
        refreshThrottle.throttle();
11906
      };
11907
      var refreshView = function () {
11908
        scrollToCursor();
11909
        iosApi.run(function (api) {
11910
          api.syncHeight();
11911
        });
11912
      };
11913
      var reposition = function () {
637 daniel-mar 11914
        var toolbarHeight = get$7(toolstrip);
597 daniel-mar 11915
        iosApi.run(function (api) {
11916
          api.setViewportOffset(toolbarHeight);
11917
        });
11918
        refreshIosSelection();
11919
        refreshView();
11920
      };
11921
      var toEditing = function () {
11922
        iosApi.run(function (api) {
11923
          api.toEditing();
11924
        });
11925
      };
11926
      var toReading = function () {
11927
        iosApi.run(function (api) {
11928
          api.toReading();
11929
        });
11930
      };
11931
      var onToolbarTouch = function (event) {
11932
        iosApi.run(function (api) {
11933
          api.onToolbarTouch(event);
11934
        });
11935
      };
637 daniel-mar 11936
      var tapping = monitor(editorApi);
597 daniel-mar 11937
      var refreshThrottle = last(refreshView, 300);
11938
      var listeners = [
11939
        editorApi.onKeyup(clearAndRefresh),
11940
        editorApi.onNodeChanged(refreshIosSelection),
11941
        editorApi.onDomChanged(refreshThrottle.throttle),
11942
        editorApi.onDomChanged(refreshIosSelection),
11943
        editorApi.onScrollToCursor(function (tinyEvent) {
11944
          tinyEvent.preventDefault();
11945
          refreshThrottle.throttle();
11946
        }),
11947
        editorApi.onScrollToElement(function (event) {
11948
          scrollToElement(event.element);
11949
        }),
11950
        editorApi.onToEditing(toEditing),
11951
        editorApi.onToReading(toReading),
637 daniel-mar 11952
        bind(editorApi.doc, 'touchend', function (touchEvent) {
597 daniel-mar 11953
          if (eq(editorApi.html, touchEvent.target) || eq(editorApi.body, touchEvent.target)) ;
11954
        }),
637 daniel-mar 11955
        bind(toolstrip, 'transitionend', function (transitionEvent) {
597 daniel-mar 11956
          if (transitionEvent.raw.propertyName === 'height') {
11957
            reposition();
11958
          }
11959
        }),
637 daniel-mar 11960
        capture(toolstrip, 'touchstart', function (touchEvent) {
597 daniel-mar 11961
          saveSelectionFirst();
11962
          onToolbarTouch(touchEvent);
11963
          editorApi.onTouchToolstrip();
11964
        }),
637 daniel-mar 11965
        bind(editorApi.body, 'touchstart', function (evt) {
597 daniel-mar 11966
          clearSelection();
11967
          editorApi.onTouchContent();
11968
          tapping.fireTouchstart(evt);
11969
        }),
11970
        tapping.onTouchmove(),
11971
        tapping.onTouchend(),
637 daniel-mar 11972
        bind(editorApi.body, 'click', function (event) {
597 daniel-mar 11973
          event.kill();
11974
        }),
637 daniel-mar 11975
        bind(toolstrip, 'touchmove', function () {
597 daniel-mar 11976
          editorApi.onToolbarScrollStart();
11977
        })
11978
      ];
11979
      var destroy = function () {
637 daniel-mar 11980
        each$1(listeners, function (l) {
597 daniel-mar 11981
          l.unbind();
11982
        });
11983
      };
11984
      return { destroy: destroy };
11985
    };
11986
 
11987
    function FakeSelection (win, frame) {
11988
      var doc = win.document;
11989
      var container = SugarElement.fromTag('div');
637 daniel-mar 11990
      add$1(container, resolve('unfocused-selections'));
11991
      append$2(SugarElement.fromDom(doc.documentElement), container);
11992
      var onTouch = bind(container, 'touchstart', function (event) {
597 daniel-mar 11993
        event.prevent();
637 daniel-mar 11994
        resume(win, frame);
597 daniel-mar 11995
        clear();
11996
      });
11997
      var make = function (rectangle) {
11998
        var span = SugarElement.fromTag('span');
637 daniel-mar 11999
        add(span, [
597 daniel-mar 12000
          resolve('layer-editor'),
12001
          resolve('unfocused-selection')
12002
        ]);
637 daniel-mar 12003
        setAll(span, {
597 daniel-mar 12004
          left: rectangle.left + 'px',
12005
          top: rectangle.top + 'px',
12006
          width: rectangle.width + 'px',
12007
          height: rectangle.height + 'px'
12008
        });
12009
        return span;
12010
      };
12011
      var update = function () {
12012
        clear();
12013
        var rectangles = getRectangles(win);
637 daniel-mar 12014
        var spans = map$2(rectangles, make);
597 daniel-mar 12015
        append$1(container, spans);
12016
      };
12017
      var clear = function () {
12018
        empty(container);
12019
      };
12020
      var destroy = function () {
12021
        onTouch.unbind();
637 daniel-mar 12022
        remove$7(container);
597 daniel-mar 12023
      };
12024
      var isActive = function () {
12025
        return children(container).length > 0;
12026
      };
12027
      return {
12028
        update: update,
12029
        isActive: isActive,
12030
        destroy: destroy,
12031
        clear: clear
12032
      };
12033
    }
12034
 
637 daniel-mar 12035
    var nu$1 = function (baseFn) {
597 daniel-mar 12036
      var data = Optional.none();
12037
      var callbacks = [];
12038
      var map = function (f) {
637 daniel-mar 12039
        return nu$1(function (nCallback) {
597 daniel-mar 12040
          get(function (data) {
12041
            nCallback(f(data));
12042
          });
12043
        });
12044
      };
12045
      var get = function (nCallback) {
12046
        if (isReady()) {
12047
          call(nCallback);
12048
        } else {
12049
          callbacks.push(nCallback);
12050
        }
12051
      };
12052
      var set = function (x) {
12053
        if (!isReady()) {
12054
          data = Optional.some(x);
12055
          run(callbacks);
12056
          callbacks = [];
12057
        }
12058
      };
12059
      var isReady = function () {
12060
        return data.isSome();
12061
      };
12062
      var run = function (cbs) {
637 daniel-mar 12063
        each$1(cbs, call);
597 daniel-mar 12064
      };
12065
      var call = function (cb) {
12066
        data.each(function (x) {
12067
          setTimeout(function () {
12068
            cb(x);
12069
          }, 0);
12070
        });
12071
      };
12072
      baseFn(set);
12073
      return {
12074
        get: get,
12075
        map: map,
12076
        isReady: isReady
12077
      };
12078
    };
12079
    var pure$1 = function (a) {
637 daniel-mar 12080
      return nu$1(function (callback) {
597 daniel-mar 12081
        callback(a);
12082
      });
12083
    };
12084
    var LazyValue = {
637 daniel-mar 12085
      nu: nu$1,
597 daniel-mar 12086
      pure: pure$1
12087
    };
12088
 
12089
    var errorReporter = function (err) {
12090
      setTimeout(function () {
12091
        throw err;
12092
      }, 0);
12093
    };
637 daniel-mar 12094
    var make = function (run) {
597 daniel-mar 12095
      var get = function (callback) {
12096
        run().then(callback, errorReporter);
12097
      };
12098
      var map = function (fab) {
637 daniel-mar 12099
        return make(function () {
597 daniel-mar 12100
          return run().then(fab);
12101
        });
12102
      };
12103
      var bind = function (aFutureB) {
637 daniel-mar 12104
        return make(function () {
597 daniel-mar 12105
          return run().then(function (v) {
12106
            return aFutureB(v).toPromise();
12107
          });
12108
        });
12109
      };
12110
      var anonBind = function (futureB) {
637 daniel-mar 12111
        return make(function () {
597 daniel-mar 12112
          return run().then(function () {
12113
            return futureB.toPromise();
12114
          });
12115
        });
12116
      };
12117
      var toLazy = function () {
12118
        return LazyValue.nu(get);
12119
      };
12120
      var toCached = function () {
12121
        var cache = null;
637 daniel-mar 12122
        return make(function () {
597 daniel-mar 12123
          if (cache === null) {
12124
            cache = run();
12125
          }
12126
          return cache;
12127
        });
12128
      };
12129
      var toPromise = run;
12130
      return {
12131
        map: map,
12132
        bind: bind,
12133
        anonBind: anonBind,
12134
        toLazy: toLazy,
12135
        toCached: toCached,
12136
        toPromise: toPromise,
12137
        get: get
12138
      };
12139
    };
637 daniel-mar 12140
    var nu = function (baseFn) {
12141
      return make(function () {
597 daniel-mar 12142
        return new Promise$1(baseFn);
12143
      });
12144
    };
637 daniel-mar 12145
    var pure = function (a) {
12146
      return make(function () {
597 daniel-mar 12147
        return Promise$1.resolve(a);
12148
      });
12149
    };
12150
    var Future = {
637 daniel-mar 12151
      nu: nu,
12152
      pure: pure
597 daniel-mar 12153
    };
12154
 
12155
    var adjust = function (value, destination, amount) {
12156
      if (Math.abs(value - destination) <= amount) {
12157
        return Optional.none();
12158
      } else if (value < destination) {
12159
        return Optional.some(value + amount);
12160
      } else {
12161
        return Optional.some(value - amount);
12162
      }
12163
    };
637 daniel-mar 12164
    var create$1 = function () {
597 daniel-mar 12165
      var interval = null;
12166
      var animate = function (getCurrent, destination, amount, increment, doFinish, rate) {
12167
        var finished = false;
12168
        var finish = function (v) {
12169
          finished = true;
12170
          doFinish(v);
12171
        };
637 daniel-mar 12172
        global$2.clearInterval(interval);
597 daniel-mar 12173
        var abort = function (v) {
637 daniel-mar 12174
          global$2.clearInterval(interval);
597 daniel-mar 12175
          finish(v);
12176
        };
637 daniel-mar 12177
        interval = global$2.setInterval(function () {
597 daniel-mar 12178
          var value = getCurrent();
12179
          adjust(value, destination, amount).fold(function () {
637 daniel-mar 12180
            global$2.clearInterval(interval);
597 daniel-mar 12181
            finish(destination);
12182
          }, function (s) {
12183
            increment(s, abort);
12184
            if (!finished) {
12185
              var newValue = getCurrent();
12186
              if (newValue !== s || Math.abs(newValue - destination) > Math.abs(value - destination)) {
637 daniel-mar 12187
                global$2.clearInterval(interval);
597 daniel-mar 12188
                finish(destination);
12189
              }
12190
            }
12191
          });
12192
        }, rate);
12193
      };
12194
      return { animate: animate };
12195
    };
12196
 
12197
    var findDevice = function (deviceWidth, deviceHeight) {
12198
      var devices = [
12199
        {
12200
          width: 320,
12201
          height: 480,
12202
          keyboard: {
12203
            portrait: 300,
12204
            landscape: 240
12205
          }
12206
        },
12207
        {
12208
          width: 320,
12209
          height: 568,
12210
          keyboard: {
12211
            portrait: 300,
12212
            landscape: 240
12213
          }
12214
        },
12215
        {
12216
          width: 375,
12217
          height: 667,
12218
          keyboard: {
12219
            portrait: 305,
12220
            landscape: 240
12221
          }
12222
        },
12223
        {
12224
          width: 414,
12225
          height: 736,
12226
          keyboard: {
12227
            portrait: 320,
12228
            landscape: 240
12229
          }
12230
        },
12231
        {
12232
          width: 768,
12233
          height: 1024,
12234
          keyboard: {
12235
            portrait: 320,
12236
            landscape: 400
12237
          }
12238
        },
12239
        {
12240
          width: 1024,
12241
          height: 1366,
12242
          keyboard: {
12243
            portrait: 380,
12244
            landscape: 460
12245
          }
12246
        }
12247
      ];
12248
      return findMap(devices, function (device) {
12249
        return someIf(deviceWidth <= device.width && deviceHeight <= device.height, device.keyboard);
12250
      }).getOr({
12251
        portrait: deviceHeight / 5,
12252
        landscape: deviceWidth / 4
12253
      });
12254
    };
12255
 
12256
    var softKeyboardLimits = function (outerWindow) {
12257
      return findDevice(outerWindow.screen.width, outerWindow.screen.height);
12258
    };
12259
    var accountableKeyboardHeight = function (outerWindow) {
637 daniel-mar 12260
      var portrait = get$1(outerWindow).isPortrait();
597 daniel-mar 12261
      var limits = softKeyboardLimits(outerWindow);
12262
      var keyboard = portrait ? limits.portrait : limits.landscape;
12263
      var visualScreenHeight = portrait ? outerWindow.screen.height : outerWindow.screen.width;
12264
      return visualScreenHeight - outerWindow.innerHeight > keyboard ? 0 : keyboard;
12265
    };
12266
    var getGreenzone = function (socket, dropup) {
637 daniel-mar 12267
      var outerWindow = owner$2(socket).dom.defaultView;
12268
      var viewportHeight = get$7(socket) + get$7(dropup);
597 daniel-mar 12269
      var acc = accountableKeyboardHeight(outerWindow);
12270
      return viewportHeight - acc;
12271
    };
12272
    var updatePadding = function (contentBody, socket, dropup) {
12273
      var greenzoneHeight = getGreenzone(socket, dropup);
637 daniel-mar 12274
      var deltaHeight = get$7(socket) + get$7(dropup) - greenzoneHeight;
12275
      set$5(contentBody, 'padding-bottom', deltaHeight + 'px');
597 daniel-mar 12276
    };
12277
 
12278
    var fixture = Adt.generate([
12279
      {
12280
        fixed: [
12281
          'element',
12282
          'property',
12283
          'offsetY'
12284
        ]
12285
      },
12286
      {
12287
        scroller: [
12288
          'element',
12289
          'offsetY'
12290
        ]
12291
      }
12292
    ]);
12293
    var yFixedData = 'data-' + resolve('position-y-fixed');
12294
    var yFixedProperty = 'data-' + resolve('y-property');
12295
    var yScrollingData = 'data-' + resolve('scrolling');
12296
    var windowSizeData = 'data-' + resolve('last-window-height');
12297
    var getYFixedData = function (element) {
12298
      return safeParse(element, yFixedData);
12299
    };
12300
    var getYFixedProperty = function (element) {
637 daniel-mar 12301
      return get$b(element, yFixedProperty);
597 daniel-mar 12302
    };
12303
    var getLastWindowSize = function (element) {
12304
      return safeParse(element, windowSizeData);
12305
    };
12306
    var classifyFixed = function (element, offsetY) {
12307
      var prop = getYFixedProperty(element);
12308
      return fixture.fixed(element, prop, offsetY);
12309
    };
12310
    var classifyScrolling = function (element, offsetY) {
12311
      return fixture.scroller(element, offsetY);
12312
    };
12313
    var classify = function (element) {
12314
      var offsetY = getYFixedData(element);
637 daniel-mar 12315
      var classifier = get$b(element, yScrollingData) === 'true' ? classifyScrolling : classifyFixed;
597 daniel-mar 12316
      return classifier(element, offsetY);
12317
    };
12318
    var findFixtures = function (container) {
12319
      var candidates = descendants(container, '[' + yFixedData + ']');
637 daniel-mar 12320
      return map$2(candidates, classify);
597 daniel-mar 12321
    };
12322
    var takeoverToolbar = function (toolbar) {
637 daniel-mar 12323
      var oldToolbarStyle = get$b(toolbar, 'style');
12324
      setAll(toolbar, {
597 daniel-mar 12325
        position: 'absolute',
12326
        top: '0px'
12327
      });
637 daniel-mar 12328
      set$8(toolbar, yFixedData, '0px');
12329
      set$8(toolbar, yFixedProperty, 'top');
597 daniel-mar 12330
      var restore = function () {
637 daniel-mar 12331
        set$8(toolbar, 'style', oldToolbarStyle || '');
12332
        remove$6(toolbar, yFixedData);
12333
        remove$6(toolbar, yFixedProperty);
597 daniel-mar 12334
      };
12335
      return { restore: restore };
12336
    };
12337
    var takeoverViewport = function (toolbarHeight, height, viewport) {
637 daniel-mar 12338
      var oldViewportStyle = get$b(viewport, 'style');
12339
      register$2(viewport);
12340
      setAll(viewport, {
597 daniel-mar 12341
        position: 'absolute',
12342
        height: height + 'px',
12343
        width: '100%',
12344
        top: toolbarHeight + 'px'
12345
      });
637 daniel-mar 12346
      set$8(viewport, yFixedData, toolbarHeight + 'px');
12347
      set$8(viewport, yScrollingData, 'true');
12348
      set$8(viewport, yFixedProperty, 'top');
597 daniel-mar 12349
      var restore = function () {
12350
        deregister(viewport);
637 daniel-mar 12351
        set$8(viewport, 'style', oldViewportStyle || '');
12352
        remove$6(viewport, yFixedData);
12353
        remove$6(viewport, yScrollingData);
12354
        remove$6(viewport, yFixedProperty);
597 daniel-mar 12355
      };
12356
      return { restore: restore };
12357
    };
12358
    var takeoverDropup = function (dropup) {
637 daniel-mar 12359
      var oldDropupStyle = get$b(dropup, 'style');
12360
      setAll(dropup, {
597 daniel-mar 12361
        position: 'absolute',
12362
        bottom: '0px'
12363
      });
637 daniel-mar 12364
      set$8(dropup, yFixedData, '0px');
12365
      set$8(dropup, yFixedProperty, 'bottom');
597 daniel-mar 12366
      var restore = function () {
637 daniel-mar 12367
        set$8(dropup, 'style', oldDropupStyle || '');
12368
        remove$6(dropup, yFixedData);
12369
        remove$6(dropup, yFixedProperty);
597 daniel-mar 12370
      };
12371
      return { restore: restore };
12372
    };
12373
    var deriveViewportHeight = function (viewport, toolbarHeight, dropupHeight) {
637 daniel-mar 12374
      var outerWindow = owner$2(viewport).dom.defaultView;
597 daniel-mar 12375
      var winH = outerWindow.innerHeight;
637 daniel-mar 12376
      set$8(viewport, windowSizeData, winH + 'px');
597 daniel-mar 12377
      return winH - toolbarHeight - dropupHeight;
12378
    };
637 daniel-mar 12379
    var takeover = function (viewport, contentBody, toolbar, dropup) {
12380
      var outerWindow = owner$2(viewport).dom.defaultView;
597 daniel-mar 12381
      var toolbarSetup = takeoverToolbar(toolbar);
637 daniel-mar 12382
      var toolbarHeight = get$7(toolbar);
12383
      var dropupHeight = get$7(dropup);
597 daniel-mar 12384
      var viewportHeight = deriveViewportHeight(viewport, toolbarHeight, dropupHeight);
12385
      var viewportSetup = takeoverViewport(toolbarHeight, viewportHeight, viewport);
12386
      var dropupSetup = takeoverDropup(dropup);
12387
      var isActive = true;
12388
      var restore = function () {
12389
        isActive = false;
12390
        toolbarSetup.restore();
12391
        viewportSetup.restore();
12392
        dropupSetup.restore();
12393
      };
12394
      var isExpanding = function () {
12395
        var currentWinHeight = outerWindow.innerHeight;
12396
        var lastWinHeight = getLastWindowSize(viewport);
12397
        return currentWinHeight > lastWinHeight;
12398
      };
12399
      var refresh = function () {
12400
        if (isActive) {
637 daniel-mar 12401
          var newToolbarHeight = get$7(toolbar);
12402
          var dropupHeight_1 = get$7(dropup);
597 daniel-mar 12403
          var newHeight = deriveViewportHeight(viewport, newToolbarHeight, dropupHeight_1);
637 daniel-mar 12404
          set$8(viewport, yFixedData, newToolbarHeight + 'px');
12405
          set$5(viewport, 'height', newHeight + 'px');
597 daniel-mar 12406
          updatePadding(contentBody, viewport, dropup);
12407
        }
12408
      };
12409
      var setViewportOffset = function (newYOffset) {
12410
        var offsetPx = newYOffset + 'px';
637 daniel-mar 12411
        set$8(viewport, yFixedData, offsetPx);
597 daniel-mar 12412
        refresh();
12413
      };
12414
      updatePadding(contentBody, viewport, dropup);
12415
      return {
12416
        setViewportOffset: setViewportOffset,
12417
        isExpanding: isExpanding,
12418
        isShrinking: not(isExpanding),
12419
        refresh: refresh,
12420
        restore: restore
12421
      };
12422
    };
12423
 
637 daniel-mar 12424
    var animator = create$1();
597 daniel-mar 12425
    var ANIMATION_STEP = 15;
12426
    var NUM_TOP_ANIMATION_FRAMES = 10;
12427
    var ANIMATION_RATE = 10;
12428
    var lastScroll = 'data-' + resolve('last-scroll-top');
12429
    var getTop = function (element) {
12430
      var raw = getRaw(element, 'top').getOr('0');
12431
      return parseInt(raw, 10);
12432
    };
12433
    var getScrollTop = function (element) {
12434
      return parseInt(element.dom.scrollTop, 10);
12435
    };
12436
    var moveScrollAndTop = function (element, destination, finalTop) {
12437
      return Future.nu(function (callback) {
12438
        var getCurrent = curry(getScrollTop, element);
12439
        var update = function (newScroll) {
12440
          element.dom.scrollTop = newScroll;
637 daniel-mar 12441
          set$5(element, 'top', getTop(element) + ANIMATION_STEP + 'px');
597 daniel-mar 12442
        };
12443
        var finish = function () {
12444
          element.dom.scrollTop = destination;
637 daniel-mar 12445
          set$5(element, 'top', finalTop + 'px');
597 daniel-mar 12446
          callback(destination);
12447
        };
12448
        animator.animate(getCurrent, destination, ANIMATION_STEP, update, finish, ANIMATION_RATE);
12449
      });
12450
    };
12451
    var moveOnlyScroll = function (element, destination) {
12452
      return Future.nu(function (callback) {
12453
        var getCurrent = curry(getScrollTop, element);
637 daniel-mar 12454
        set$8(element, lastScroll, getCurrent());
597 daniel-mar 12455
        var update = function (newScroll, abort) {
12456
          var previous = safeParse(element, lastScroll);
12457
          if (previous !== element.dom.scrollTop) {
12458
            abort(element.dom.scrollTop);
12459
          } else {
12460
            element.dom.scrollTop = newScroll;
637 daniel-mar 12461
            set$8(element, lastScroll, newScroll);
597 daniel-mar 12462
          }
12463
        };
12464
        var finish = function () {
12465
          element.dom.scrollTop = destination;
637 daniel-mar 12466
          set$8(element, lastScroll, destination);
597 daniel-mar 12467
          callback(destination);
12468
        };
12469
        var distance = Math.abs(destination - getCurrent());
12470
        var step = Math.ceil(distance / NUM_TOP_ANIMATION_FRAMES);
12471
        animator.animate(getCurrent, destination, step, update, finish, ANIMATION_RATE);
12472
      });
12473
    };
12474
    var moveOnlyTop = function (element, destination) {
12475
      return Future.nu(function (callback) {
12476
        var getCurrent = curry(getTop, element);
12477
        var update = function (newTop) {
637 daniel-mar 12478
          set$5(element, 'top', newTop + 'px');
597 daniel-mar 12479
        };
12480
        var finish = function () {
12481
          update(destination);
12482
          callback(destination);
12483
        };
12484
        var distance = Math.abs(destination - getCurrent());
12485
        var step = Math.ceil(distance / NUM_TOP_ANIMATION_FRAMES);
12486
        animator.animate(getCurrent, destination, step, update, finish, ANIMATION_RATE);
12487
      });
12488
    };
12489
    var updateTop = function (element, amount) {
12490
      var newTop = amount + getYFixedData(element) + 'px';
637 daniel-mar 12491
      set$5(element, 'top', newTop);
597 daniel-mar 12492
    };
12493
    var moveWindowScroll = function (toolbar, viewport, destY) {
637 daniel-mar 12494
      var outerWindow = owner$2(toolbar).dom.defaultView;
597 daniel-mar 12495
      return Future.nu(function (callback) {
12496
        updateTop(toolbar, destY);
12497
        updateTop(viewport, destY);
12498
        outerWindow.scrollTo(0, destY);
12499
        callback(destY);
12500
      });
12501
    };
12502
 
12503
    function BackgroundActivity (doAction) {
12504
      var action = Cell(LazyValue.pure({}));
12505
      var start = function (value) {
12506
        var future = LazyValue.nu(function (callback) {
12507
          return doAction(value).get(callback);
12508
        });
12509
        action.set(future);
12510
      };
12511
      var idle = function (g) {
12512
        action.get().get(function () {
12513
          g();
12514
        });
12515
      };
12516
      return {
12517
        start: start,
12518
        idle: idle
12519
      };
12520
    }
12521
 
12522
    var scrollIntoView = function (cWin, socket, dropup, top, bottom) {
12523
      var greenzone = getGreenzone(socket, dropup);
637 daniel-mar 12524
      var refreshCursor = curry(refresh, cWin);
597 daniel-mar 12525
      if (top > greenzone || bottom > greenzone) {
12526
        moveOnlyScroll(socket, socket.dom.scrollTop - greenzone + bottom).get(refreshCursor);
12527
      } else if (top < 0) {
12528
        moveOnlyScroll(socket, socket.dom.scrollTop + top).get(refreshCursor);
12529
      } else ;
12530
    };
12531
 
637 daniel-mar 12532
    var par$1 = function (asyncValues, nu) {
597 daniel-mar 12533
      return nu(function (callback) {
12534
        var r = [];
12535
        var count = 0;
12536
        var cb = function (i) {
12537
          return function (value) {
12538
            r[i] = value;
12539
            count++;
12540
            if (count >= asyncValues.length) {
12541
              callback(r);
12542
            }
12543
          };
12544
        };
12545
        if (asyncValues.length === 0) {
12546
          callback([]);
12547
        } else {
637 daniel-mar 12548
          each$1(asyncValues, function (asyncValue, i) {
597 daniel-mar 12549
            asyncValue.get(cb(i));
12550
          });
12551
        }
12552
      });
12553
    };
12554
 
637 daniel-mar 12555
    var par = function (futures) {
12556
      return par$1(futures, Future.nu);
597 daniel-mar 12557
    };
12558
 
12559
    var updateFixed = function (element, property, winY, offsetY) {
12560
      var destination = winY + offsetY;
637 daniel-mar 12561
      set$5(element, property, destination + 'px');
597 daniel-mar 12562
      return Future.pure(offsetY);
12563
    };
12564
    var updateScrollingFixed = function (element, winY, offsetY) {
12565
      var destTop = winY + offsetY;
12566
      var oldProp = getRaw(element, 'top').getOr(offsetY);
12567
      var delta = destTop - parseInt(oldProp, 10);
12568
      var destScroll = element.dom.scrollTop + delta;
12569
      return moveScrollAndTop(element, destScroll, destTop);
12570
    };
12571
    var updateFixture = function (fixture, winY) {
12572
      return fixture.fold(function (element, property, offsetY) {
12573
        return updateFixed(element, property, winY, offsetY);
12574
      }, function (element, offsetY) {
12575
        return updateScrollingFixed(element, winY, offsetY);
12576
      });
12577
    };
12578
    var updatePositions = function (container, winY) {
12579
      var fixtures = findFixtures(container);
637 daniel-mar 12580
      var updates = map$2(fixtures, function (fixture) {
597 daniel-mar 12581
        return updateFixture(fixture, winY);
12582
      });
637 daniel-mar 12583
      return par(updates);
597 daniel-mar 12584
    };
12585
 
12586
    var VIEW_MARGIN = 5;
637 daniel-mar 12587
    var register = function (toolstrip, socket, container, outerWindow, structure, cWin) {
597 daniel-mar 12588
      var scroller = BackgroundActivity(function (y) {
12589
        return moveWindowScroll(toolstrip, socket, y);
12590
      });
12591
      var scrollBounds = function () {
12592
        var rects = getRectangles(cWin);
12593
        return Optional.from(rects[0]).bind(function (rect) {
12594
          var viewTop = rect.top - socket.dom.scrollTop;
12595
          var outside = viewTop > outerWindow.innerHeight + VIEW_MARGIN || viewTop < -VIEW_MARGIN;
12596
          return outside ? Optional.some({
12597
            top: viewTop,
12598
            bottom: viewTop + rect.height
12599
          }) : Optional.none();
12600
        });
12601
      };
12602
      var scrollThrottle = last(function () {
12603
        scroller.idle(function () {
12604
          updatePositions(container, outerWindow.pageYOffset).get(function () {
12605
            var extraScroll = scrollBounds();
12606
            extraScroll.each(function (extra) {
12607
              socket.dom.scrollTop = socket.dom.scrollTop + extra.top;
12608
            });
12609
            scroller.start(0);
12610
            structure.refresh();
12611
          });
12612
        });
12613
      }, 1000);
637 daniel-mar 12614
      var onScroll = bind(SugarElement.fromDom(outerWindow), 'scroll', function () {
597 daniel-mar 12615
        if (outerWindow.pageYOffset < 0) {
12616
          return;
12617
        }
12618
        scrollThrottle.throttle();
12619
      });
12620
      updatePositions(container, outerWindow.pageYOffset).get(identity);
12621
      return { unbind: onScroll.unbind };
12622
    };
637 daniel-mar 12623
    var setup = function (bag) {
597 daniel-mar 12624
      var cWin = bag.cWin;
12625
      var ceBody = bag.ceBody;
12626
      var socket = bag.socket;
12627
      var toolstrip = bag.toolstrip;
12628
      var contentElement = bag.contentElement;
12629
      var keyboardType = bag.keyboardType;
12630
      var outerWindow = bag.outerWindow;
12631
      var dropup = bag.dropup;
12632
      var outerBody = bag.outerBody;
637 daniel-mar 12633
      var structure = takeover(socket, ceBody, toolstrip, dropup);
597 daniel-mar 12634
      var keyboardModel = keyboardType(outerBody, cWin, body(), contentElement);
12635
      var toEditing = function () {
12636
        keyboardModel.toEditing();
12637
        clearSelection();
12638
      };
12639
      var toReading = function () {
12640
        keyboardModel.toReading();
12641
      };
12642
      var onToolbarTouch = function (_event) {
12643
        keyboardModel.onToolbarTouch();
12644
      };
12645
      var onOrientation = onChange(outerWindow, {
12646
        onChange: noop,
12647
        onReady: structure.refresh
12648
      });
12649
      onOrientation.onAdjustment(function () {
12650
        structure.refresh();
12651
      });
637 daniel-mar 12652
      var onResize = bind(SugarElement.fromDom(outerWindow), 'resize', function () {
597 daniel-mar 12653
        if (structure.isExpanding()) {
12654
          structure.refresh();
12655
        }
12656
      });
637 daniel-mar 12657
      var onScroll = register(toolstrip, socket, outerBody, outerWindow, structure, cWin);
597 daniel-mar 12658
      var unfocusedSelection = FakeSelection(cWin, contentElement);
12659
      var refreshSelection = function () {
12660
        if (unfocusedSelection.isActive()) {
12661
          unfocusedSelection.update();
12662
        }
12663
      };
12664
      var highlightSelection = function () {
12665
        unfocusedSelection.update();
12666
      };
12667
      var clearSelection = function () {
12668
        unfocusedSelection.clear();
12669
      };
12670
      var scrollIntoView$1 = function (top, bottom) {
12671
        scrollIntoView(cWin, socket, dropup, top, bottom);
12672
      };
12673
      var syncHeight = function () {
637 daniel-mar 12674
        set$5(contentElement, 'height', contentElement.dom.contentWindow.document.body.scrollHeight + 'px');
597 daniel-mar 12675
      };
12676
      var setViewportOffset = function (newYOffset) {
12677
        structure.setViewportOffset(newYOffset);
12678
        moveOnlyTop(socket, newYOffset).get(identity);
12679
      };
12680
      var destroy = function () {
12681
        structure.restore();
12682
        onOrientation.destroy();
12683
        onScroll.unbind();
12684
        onResize.unbind();
12685
        keyboardModel.destroy();
12686
        unfocusedSelection.destroy();
637 daniel-mar 12687
        input(body(), blur$1);
597 daniel-mar 12688
      };
12689
      return {
12690
        toEditing: toEditing,
12691
        toReading: toReading,
12692
        onToolbarTouch: onToolbarTouch,
12693
        refreshSelection: refreshSelection,
12694
        clearSelection: clearSelection,
12695
        highlightSelection: highlightSelection,
12696
        scrollIntoView: scrollIntoView$1,
12697
        updateToolbarPadding: noop,
12698
        setViewportOffset: setViewportOffset,
12699
        syncHeight: syncHeight,
12700
        refreshStructure: structure.refresh,
12701
        destroy: destroy
12702
      };
12703
    };
12704
 
637 daniel-mar 12705
    var create = function (platform, mask) {
597 daniel-mar 12706
      var meta = tag();
637 daniel-mar 12707
      var priorState = value();
12708
      var scrollEvents = value();
597 daniel-mar 12709
      var iosApi = api$2();
12710
      var iosEvents = api$2();
12711
      var enter = function () {
12712
        mask.hide();
12713
        var doc = SugarElement.fromDom(document);
12714
        getActiveApi(platform.editor).each(function (editorApi) {
12715
          priorState.set({
12716
            socketHeight: getRaw(platform.socket, 'height'),
12717
            iframeHeight: getRaw(editorApi.frame, 'height'),
12718
            outerScroll: document.body.scrollTop
12719
          });
12720
          scrollEvents.set({ exclusives: exclusive(doc, '.' + scrollable) });
637 daniel-mar 12721
          add$1(platform.container, resolve('fullscreen-maximized'));
597 daniel-mar 12722
          clobberStyles(platform.container, editorApi.body);
12723
          meta.maximize();
637 daniel-mar 12724
          set$5(platform.socket, 'overflow', 'scroll');
12725
          set$5(platform.socket, '-webkit-overflow-scrolling', 'touch');
12726
          focus$3(editorApi.body);
12727
          iosApi.set(setup({
597 daniel-mar 12728
            cWin: editorApi.win,
12729
            ceBody: editorApi.body,
12730
            socket: platform.socket,
12731
            toolstrip: platform.toolstrip,
12732
            dropup: platform.dropup.element,
12733
            contentElement: editorApi.frame,
12734
            outerBody: platform.body,
12735
            outerWindow: platform.win,
12736
            keyboardType: stubborn
12737
          }));
12738
          iosApi.run(function (api) {
12739
            api.syncHeight();
12740
          });
637 daniel-mar 12741
          iosEvents.set(initEvents(editorApi, iosApi, platform.toolstrip, platform.socket, platform.dropup));
597 daniel-mar 12742
        });
12743
      };
12744
      var exit = function () {
12745
        meta.restore();
12746
        iosEvents.clear();
12747
        iosApi.clear();
12748
        mask.show();
12749
        priorState.on(function (s) {
12750
          s.socketHeight.each(function (h) {
637 daniel-mar 12751
            set$5(platform.socket, 'height', h);
597 daniel-mar 12752
          });
12753
          s.iframeHeight.each(function (h) {
637 daniel-mar 12754
            set$5(platform.editor.getFrame(), 'height', h);
597 daniel-mar 12755
          });
12756
          document.body.scrollTop = s.scrollTop;
12757
        });
12758
        priorState.clear();
12759
        scrollEvents.on(function (s) {
12760
          s.exclusives.unbind();
12761
        });
12762
        scrollEvents.clear();
637 daniel-mar 12763
        remove$3(platform.container, resolve('fullscreen-maximized'));
597 daniel-mar 12764
        restoreStyles();
12765
        deregister(platform.toolbar);
637 daniel-mar 12766
        remove$2(platform.socket, 'overflow');
12767
        remove$2(platform.socket, '-webkit-overflow-scrolling');
12768
        blur$1(platform.editor.getFrame());
597 daniel-mar 12769
        getActiveApi(platform.editor).each(function (editorApi) {
12770
          editorApi.clearSelection();
12771
        });
12772
      };
12773
      var refreshStructure = function () {
12774
        iosApi.run(function (api) {
12775
          api.refreshStructure();
12776
        });
12777
      };
12778
      return {
12779
        enter: enter,
12780
        refreshStructure: refreshStructure,
12781
        exit: exit
12782
      };
12783
    };
12784
 
637 daniel-mar 12785
    var produce = function (raw) {
12786
      var mobile = asRawOrDie$1('Getting IosWebapp schema', MobileSchema, raw);
12787
      set$5(mobile.toolstrip, 'width', '100%');
12788
      set$5(mobile.container, 'position', 'relative');
597 daniel-mar 12789
      var onView = function () {
12790
        mobile.setReadOnly(mobile.readOnlyOnInit());
12791
        mode.enter();
12792
      };
637 daniel-mar 12793
      var mask = build$1(sketch(onView, mobile.translate));
597 daniel-mar 12794
      mobile.alloy.add(mask);
12795
      var maskApi = {
12796
        show: function () {
12797
          mobile.alloy.add(mask);
12798
        },
12799
        hide: function () {
12800
          mobile.alloy.remove(mask);
12801
        }
12802
      };
637 daniel-mar 12803
      var mode = create(mobile, maskApi);
597 daniel-mar 12804
      return {
12805
        setReadOnly: mobile.setReadOnly,
12806
        refreshStructure: mode.refreshStructure,
12807
        enter: mode.enter,
12808
        exit: mode.exit,
12809
        destroy: noop
12810
      };
12811
    };
12812
 
12813
    function IosRealm (scrollIntoView) {
12814
      var alloy = OuterContainer({ classes: [resolve('ios-container')] });
12815
      var toolbar = ScrollingToolbar();
12816
      var webapp = api$2();
12817
      var switchToEdit = makeEditSwitch(webapp);
12818
      var socket = makeSocket();
637 daniel-mar 12819
      var dropup = build(function () {
597 daniel-mar 12820
        webapp.run(function (w) {
12821
          w.refreshStructure();
12822
        });
12823
      }, scrollIntoView);
12824
      alloy.add(toolbar.wrapper);
12825
      alloy.add(socket);
12826
      alloy.add(dropup.component);
12827
      var setToolbarGroups = function (rawGroups) {
12828
        var groups = toolbar.createGroups(rawGroups);
12829
        toolbar.setGroups(groups);
12830
      };
12831
      var setContextToolbar = function (rawGroups) {
12832
        var groups = toolbar.createGroups(rawGroups);
12833
        toolbar.setContextToolbar(groups);
12834
      };
12835
      var focusToolbar = function () {
12836
        toolbar.focus();
12837
      };
12838
      var restoreToolbar = function () {
12839
        toolbar.restoreToolbar();
12840
      };
12841
      var init = function (spec) {
637 daniel-mar 12842
        webapp.set(produce(spec));
597 daniel-mar 12843
      };
12844
      var exit = function () {
12845
        webapp.run(function (w) {
12846
          Replacing.remove(socket, switchToEdit);
12847
          w.exit();
12848
        });
12849
      };
12850
      var updateMode$1 = function (readOnly) {
12851
        updateMode(socket, switchToEdit, readOnly, alloy.root);
12852
      };
12853
      return {
12854
        system: alloy,
12855
        element: alloy.element,
12856
        init: init,
12857
        exit: exit,
12858
        setToolbarGroups: setToolbarGroups,
12859
        setContextToolbar: setContextToolbar,
12860
        focusToolbar: focusToolbar,
12861
        restoreToolbar: restoreToolbar,
12862
        updateMode: updateMode$1,
12863
        socket: socket,
12864
        dropup: dropup
12865
      };
12866
    }
12867
 
637 daniel-mar 12868
    var global$1 = tinymce.util.Tools.resolve('tinymce.EditorManager');
597 daniel-mar 12869
 
637 daniel-mar 12870
    var derive = function (editor) {
12871
      var base = Optional.from(getSkinUrl(editor)).getOrThunk(function () {
12872
        return global$1.baseURL + '/skins/ui/oxide';
597 daniel-mar 12873
      });
12874
      return {
12875
        content: base + '/content.mobile.min.css',
12876
        ui: base + '/skin.mobile.min.css'
12877
      };
12878
    };
12879
 
12880
    var fireChange = function (realm, command, state) {
12881
      realm.system.broadcastOn([formatChanged], {
12882
        command: command,
12883
        state: state
12884
      });
12885
    };
637 daniel-mar 12886
    var init = function (realm, editor) {
597 daniel-mar 12887
      var allFormats = keys(editor.formatter.get());
637 daniel-mar 12888
      each$1(allFormats, function (command) {
597 daniel-mar 12889
        editor.formatter.formatChanged(command, function (state) {
12890
          fireChange(realm, command, state);
12891
        });
12892
      });
637 daniel-mar 12893
      each$1([
597 daniel-mar 12894
        'ul',
12895
        'ol'
12896
      ], function (command) {
12897
        editor.selection.selectorChanged(command, function (state, _data) {
12898
          fireChange(realm, command, state);
12899
        });
12900
      });
12901
    };
12902
 
12903
    var fireSkinLoaded = function (editor) {
12904
      return function () {
12905
        var done = function () {
12906
          editor._skinLoaded = true;
12907
          editor.fire('SkinLoaded');
12908
        };
12909
        if (editor.initialized) {
12910
          done();
12911
        } else {
12912
          editor.on('init', done);
12913
        }
12914
      };
12915
    };
12916
 
12917
    var READING = 'toReading';
12918
    var EDITING = 'toEditing';
12919
    var renderMobileTheme = function (editor) {
12920
      var renderUI = function () {
12921
        var targetNode = editor.getElement();
637 daniel-mar 12922
        var cssUrls = derive(editor);
597 daniel-mar 12923
        if (isSkinDisabled(editor) === false) {
637 daniel-mar 12924
          var styleSheetLoader_1 = global$5.DOM.styleSheetLoader;
597 daniel-mar 12925
          editor.contentCSS.push(cssUrls.content);
12926
          styleSheetLoader_1.load(cssUrls.ui, fireSkinLoaded(editor));
12927
          editor.on('remove', function () {
12928
            return styleSheetLoader_1.unload(cssUrls.ui);
12929
          });
12930
        } else {
12931
          fireSkinLoaded(editor)();
12932
        }
12933
        var doScrollIntoView = function () {
12934
          editor.fire('ScrollIntoView');
12935
        };
637 daniel-mar 12936
        var realm = detect$1().os.isAndroid() ? AndroidRealm(doScrollIntoView) : IosRealm(doScrollIntoView);
597 daniel-mar 12937
        var original = SugarElement.fromDom(targetNode);
12938
        attachSystemAfter(original, realm.system);
12939
        var findFocusIn = function (elem) {
12940
          return search(elem).bind(function (focused) {
12941
            return realm.system.getByDom(focused).toOptional();
12942
          });
12943
        };
12944
        var outerWindow = targetNode.ownerDocument.defaultView;
12945
        var orientation = onChange(outerWindow, {
12946
          onChange: function () {
12947
            var alloy = realm.system;
12948
            alloy.broadcastOn([orientationChanged], { width: getActualWidth(outerWindow) });
12949
          },
12950
          onReady: noop
12951
        });
12952
        var setReadOnly = function (dynamicGroup, readOnlyGroups, mainGroups, ro) {
12953
          if (ro === false) {
12954
            editor.selection.collapse();
12955
          }
12956
          var toolbars = configureToolbar(dynamicGroup, readOnlyGroups, mainGroups);
12957
          realm.setToolbarGroups(ro === true ? toolbars.readOnly : toolbars.main);
12958
          editor.setMode(ro === true ? 'readonly' : 'design');
12959
          editor.fire(ro === true ? READING : EDITING);
12960
          realm.updateMode(ro);
12961
        };
12962
        var configureToolbar = function (dynamicGroup, readOnlyGroups, mainGroups) {
12963
          var dynamic = dynamicGroup.get();
12964
          var toolbars = {
12965
            readOnly: dynamic.backToMask.concat(readOnlyGroups.get()),
12966
            main: dynamic.backToMask.concat(mainGroups.get())
12967
          };
12968
          return toolbars;
12969
        };
12970
        var bindHandler = function (label, handler) {
12971
          editor.on(label, handler);
12972
          return {
12973
            unbind: function () {
12974
              editor.off(label);
12975
            }
12976
          };
12977
        };
12978
        editor.on('init', function () {
12979
          realm.init({
12980
            editor: {
12981
              getFrame: function () {
12982
                return SugarElement.fromDom(editor.contentAreaContainer.querySelector('iframe'));
12983
              },
12984
              onDomChanged: function () {
12985
                return { unbind: noop };
12986
              },
12987
              onToReading: function (handler) {
12988
                return bindHandler(READING, handler);
12989
              },
12990
              onToEditing: function (handler) {
12991
                return bindHandler(EDITING, handler);
12992
              },
12993
              onScrollToCursor: function (handler) {
12994
                editor.on('ScrollIntoView', function (tinyEvent) {
12995
                  handler(tinyEvent);
12996
                });
12997
                var unbind = function () {
12998
                  editor.off('ScrollIntoView');
12999
                  orientation.destroy();
13000
                };
13001
                return { unbind: unbind };
13002
              },
13003
              onTouchToolstrip: function () {
13004
                hideDropup();
13005
              },
13006
              onTouchContent: function () {
13007
                var toolbar = SugarElement.fromDom(editor.editorContainer.querySelector('.' + resolve('toolbar')));
13008
                findFocusIn(toolbar).each(emitExecute);
13009
                realm.restoreToolbar();
13010
                hideDropup();
13011
              },
13012
              onTapContent: function (evt) {
13013
                var target = evt.target;
637 daniel-mar 13014
                if (name$1(target) === 'img') {
597 daniel-mar 13015
                  editor.selection.select(target.dom);
13016
                  evt.kill();
637 daniel-mar 13017
                } else if (name$1(target) === 'a') {
597 daniel-mar 13018
                  var component = realm.system.getByDom(SugarElement.fromDom(editor.editorContainer));
13019
                  component.each(function (container) {
13020
                    if (Swapping.isAlpha(container)) {
13021
                      openLink(target.dom);
13022
                    }
13023
                  });
13024
                }
13025
              }
13026
            },
13027
            container: SugarElement.fromDom(editor.editorContainer),
13028
            socket: SugarElement.fromDom(editor.contentAreaContainer),
13029
            toolstrip: SugarElement.fromDom(editor.editorContainer.querySelector('.' + resolve('toolstrip'))),
13030
            toolbar: SugarElement.fromDom(editor.editorContainer.querySelector('.' + resolve('toolbar'))),
13031
            dropup: realm.dropup,
13032
            alloy: realm.system,
13033
            translate: noop,
13034
            setReadOnly: function (ro) {
13035
              setReadOnly(dynamicGroup, readOnlyGroups, mainGroups, ro);
13036
            },
13037
            readOnlyOnInit: function () {
13038
              return readOnlyOnInit();
13039
            }
13040
          });
13041
          var hideDropup = function () {
13042
            realm.dropup.disappear(function () {
13043
              realm.system.broadcastOn([dropupDismissed], {});
13044
            });
13045
          };
13046
          var backToMaskGroup = {
13047
            label: 'The first group',
13048
            scrollable: false,
13049
            items: [forToolbar('back', function () {
13050
                editor.selection.collapse();
13051
                realm.exit();
13052
              }, {}, editor)]
13053
          };
13054
          var backToReadOnlyGroup = {
13055
            label: 'Back to read only',
13056
            scrollable: false,
13057
            items: [forToolbar('readonly-back', function () {
13058
                setReadOnly(dynamicGroup, readOnlyGroups, mainGroups, true);
13059
              }, {}, editor)]
13060
          };
13061
          var readOnlyGroup = {
13062
            label: 'The read only mode group',
13063
            scrollable: true,
13064
            items: []
13065
          };
637 daniel-mar 13066
          var features = setup$3(realm, editor);
13067
          var items = detect(editor, features);
597 daniel-mar 13068
          var actionGroup = {
13069
            label: 'the action group',
13070
            scrollable: true,
13071
            items: items
13072
          };
13073
          var extraGroup = {
13074
            label: 'The extra group',
13075
            scrollable: false,
13076
            items: []
13077
          };
13078
          var mainGroups = Cell([
13079
            actionGroup,
13080
            extraGroup
13081
          ]);
13082
          var readOnlyGroups = Cell([
13083
            readOnlyGroup,
13084
            extraGroup
13085
          ]);
13086
          var dynamicGroup = Cell({
13087
            backToMask: [backToMaskGroup],
13088
            backToReadOnly: [backToReadOnlyGroup]
13089
          });
637 daniel-mar 13090
          init(realm, editor);
597 daniel-mar 13091
        });
13092
        editor.on('remove', function () {
13093
          realm.exit();
13094
        });
13095
        editor.on('detach', function () {
13096
          detachSystem(realm.system);
13097
          realm.system.destroy();
13098
        });
13099
        return {
13100
          iframeContainer: realm.socket.element.dom,
13101
          editorContainer: realm.element.dom
13102
        };
13103
      };
13104
      return {
13105
        getNotificationManagerImpl: function () {
13106
          return {
637 daniel-mar 13107
            open: constant$1({
597 daniel-mar 13108
              progressBar: { value: noop },
13109
              close: noop,
13110
              text: noop,
637 daniel-mar 13111
              getEl: constant$1(null),
597 daniel-mar 13112
              moveTo: noop,
13113
              moveRel: noop,
13114
              settings: {}
13115
            }),
13116
            close: noop,
13117
            reposition: noop,
637 daniel-mar 13118
            getArgs: constant$1({})
597 daniel-mar 13119
          };
13120
        },
13121
        renderUI: renderUI
13122
      };
13123
    };
13124
    function Theme () {
637 daniel-mar 13125
      global$4.add('mobile', renderMobileTheme);
597 daniel-mar 13126
    }
13127
 
13128
    Theme();
13129
 
13130
}());