Subversion Repositories oidplus

Rev

Rev 637 | Rev 759 | Go to most recent revision | 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
 *
679 daniel-mar 7
 * Version: 5.10.2 (2021-11-17)
597 daniel-mar 8
 */
9
(function () {
10
    'use strict';
11
 
12
    var typeOf = function (x) {
13
      var t = typeof x;
14
      if (x === null) {
15
        return 'null';
16
      } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
17
        return 'array';
18
      } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
19
        return 'string';
20
      } else {
21
        return t;
22
      }
23
    };
637 daniel-mar 24
    var isType$1 = function (type) {
597 daniel-mar 25
      return function (value) {
26
        return typeOf(value) === type;
27
      };
28
    };
29
    var isSimpleType = function (type) {
30
      return function (value) {
31
        return typeof value === type;
32
      };
33
    };
637 daniel-mar 34
    var eq$1 = function (t) {
597 daniel-mar 35
      return function (a) {
36
        return t === a;
37
      };
38
    };
637 daniel-mar 39
    var isString = isType$1('string');
40
    var isObject = isType$1('object');
41
    var isArray = isType$1('array');
42
    var isNull = eq$1(null);
597 daniel-mar 43
    var isBoolean = isSimpleType('boolean');
637 daniel-mar 44
    var isUndefined = eq$1(undefined);
597 daniel-mar 45
    var isNullable = function (a) {
46
      return a === null || a === undefined;
47
    };
48
    var isNonNullable = function (a) {
49
      return !isNullable(a);
50
    };
51
    var isFunction = isSimpleType('function');
52
    var isNumber = isSimpleType('number');
53
    var isArrayOf = function (value, pred) {
54
      if (isArray(value)) {
55
        for (var i = 0, len = value.length; i < len; ++i) {
56
          if (!pred(value[i])) {
57
            return false;
58
          }
59
        }
60
        return true;
61
      }
62
      return false;
63
    };
64
 
65
    var noop = function () {
66
    };
67
    var noarg = function (f) {
68
      return function () {
69
        return f();
70
      };
71
    };
72
    var compose = function (fa, fb) {
73
      return function () {
74
        var args = [];
75
        for (var _i = 0; _i < arguments.length; _i++) {
76
          args[_i] = arguments[_i];
77
        }
78
        return fa(fb.apply(null, args));
79
      };
80
    };
81
    var compose1 = function (fbc, fab) {
82
      return function (a) {
83
        return fbc(fab(a));
84
      };
85
    };
637 daniel-mar 86
    var constant$1 = function (value) {
597 daniel-mar 87
      return function () {
88
        return value;
89
      };
90
    };
637 daniel-mar 91
    var identity$1 = function (x) {
597 daniel-mar 92
      return x;
93
    };
637 daniel-mar 94
    var tripleEquals = function (a, b) {
95
      return a === b;
96
    };
597 daniel-mar 97
    function curry(fn) {
98
      var initialArgs = [];
99
      for (var _i = 1; _i < arguments.length; _i++) {
100
        initialArgs[_i - 1] = arguments[_i];
101
      }
102
      return function () {
103
        var restArgs = [];
104
        for (var _i = 0; _i < arguments.length; _i++) {
105
          restArgs[_i] = arguments[_i];
106
        }
107
        var all = initialArgs.concat(restArgs);
108
        return fn.apply(null, all);
109
      };
110
    }
111
    var not = function (f) {
112
      return function (t) {
113
        return !f(t);
114
      };
115
    };
116
    var die = function (msg) {
117
      return function () {
118
        throw new Error(msg);
119
      };
120
    };
637 daniel-mar 121
    var never = constant$1(false);
122
    var always = constant$1(true);
597 daniel-mar 123
 
679 daniel-mar 124
    var global$g = tinymce.util.Tools.resolve('tinymce.ThemeManager');
597 daniel-mar 125
 
126
    var __assign = function () {
127
      __assign = Object.assign || function __assign(t) {
128
        for (var s, i = 1, n = arguments.length; i < n; i++) {
129
          s = arguments[i];
130
          for (var p in s)
131
            if (Object.prototype.hasOwnProperty.call(s, p))
132
              t[p] = s[p];
133
        }
134
        return t;
135
      };
136
      return __assign.apply(this, arguments);
137
    };
138
    function __rest(s, e) {
139
      var t = {};
140
      for (var p in s)
141
        if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
142
          t[p] = s[p];
143
      if (s != null && typeof Object.getOwnPropertySymbols === 'function')
144
        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
145
          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
146
            t[p[i]] = s[p[i]];
147
        }
148
      return t;
149
    }
637 daniel-mar 150
    function __spreadArray(to, from, pack) {
151
      if (pack || arguments.length === 2)
152
        for (var i = 0, l = from.length, ar; i < l; i++) {
153
          if (ar || !(i in from)) {
154
            if (!ar)
155
              ar = Array.prototype.slice.call(from, 0, i);
156
            ar[i] = from[i];
157
          }
158
        }
159
      return to.concat(ar || Array.prototype.slice.call(from));
597 daniel-mar 160
    }
161
 
162
    var none = function () {
163
      return NONE;
164
    };
165
    var NONE = function () {
166
      var call = function (thunk) {
167
        return thunk();
168
      };
637 daniel-mar 169
      var id = identity$1;
597 daniel-mar 170
      var me = {
171
        fold: function (n, _s) {
172
          return n();
173
        },
174
        isSome: never,
175
        isNone: always,
176
        getOr: id,
177
        getOrThunk: call,
178
        getOrDie: function (msg) {
179
          throw new Error(msg || 'error: getOrDie called on none.');
180
        },
637 daniel-mar 181
        getOrNull: constant$1(null),
182
        getOrUndefined: constant$1(undefined),
597 daniel-mar 183
        or: id,
184
        orThunk: call,
185
        map: none,
186
        each: noop,
187
        bind: none,
188
        exists: never,
189
        forall: always,
637 daniel-mar 190
        filter: function () {
191
          return none();
192
        },
597 daniel-mar 193
        toArray: function () {
194
          return [];
195
        },
637 daniel-mar 196
        toString: constant$1('none()')
597 daniel-mar 197
      };
198
      return me;
199
    }();
200
    var some = function (a) {
637 daniel-mar 201
      var constant_a = constant$1(a);
597 daniel-mar 202
      var self = function () {
203
        return me;
204
      };
205
      var bind = function (f) {
206
        return f(a);
207
      };
208
      var me = {
209
        fold: function (n, s) {
210
          return s(a);
211
        },
212
        isSome: always,
213
        isNone: never,
214
        getOr: constant_a,
215
        getOrThunk: constant_a,
216
        getOrDie: constant_a,
217
        getOrNull: constant_a,
218
        getOrUndefined: constant_a,
219
        or: self,
220
        orThunk: self,
221
        map: function (f) {
222
          return some(f(a));
223
        },
224
        each: function (f) {
225
          f(a);
226
        },
227
        bind: bind,
228
        exists: bind,
229
        forall: bind,
230
        filter: function (f) {
231
          return f(a) ? me : NONE;
232
        },
233
        toArray: function () {
234
          return [a];
235
        },
236
        toString: function () {
237
          return 'some(' + a + ')';
238
        }
239
      };
240
      return me;
241
    };
637 daniel-mar 242
    var from$1 = function (value) {
597 daniel-mar 243
      return value === null || value === undefined ? NONE : some(value);
244
    };
245
    var Optional = {
246
      some: some,
247
      none: none,
637 daniel-mar 248
      from: from$1
597 daniel-mar 249
    };
250
 
251
    var nativeSlice = Array.prototype.slice;
252
    var nativeIndexOf = Array.prototype.indexOf;
253
    var nativePush = Array.prototype.push;
254
    var rawIndexOf = function (ts, t) {
255
      return nativeIndexOf.call(ts, t);
256
    };
257
    var indexOf = function (xs, x) {
258
      var r = rawIndexOf(xs, x);
259
      return r === -1 ? Optional.none() : Optional.some(r);
260
    };
637 daniel-mar 261
    var contains$2 = function (xs, x) {
597 daniel-mar 262
      return rawIndexOf(xs, x) > -1;
263
    };
264
    var exists = function (xs, pred) {
265
      for (var i = 0, len = xs.length; i < len; i++) {
266
        var x = xs[i];
267
        if (pred(x, i)) {
268
          return true;
269
        }
270
      }
271
      return false;
272
    };
637 daniel-mar 273
    var range$2 = function (num, f) {
597 daniel-mar 274
      var r = [];
275
      for (var i = 0; i < num; i++) {
276
        r.push(f(i));
277
      }
278
      return r;
279
    };
637 daniel-mar 280
    var chunk$1 = function (array, size) {
597 daniel-mar 281
      var r = [];
282
      for (var i = 0; i < array.length; i += size) {
283
        var s = nativeSlice.call(array, i, i + size);
284
        r.push(s);
285
      }
286
      return r;
287
    };
637 daniel-mar 288
    var map$2 = function (xs, f) {
597 daniel-mar 289
      var len = xs.length;
290
      var r = new Array(len);
291
      for (var i = 0; i < len; i++) {
292
        var x = xs[i];
293
        r[i] = f(x, i);
294
      }
295
      return r;
296
    };
637 daniel-mar 297
    var each$1 = function (xs, f) {
597 daniel-mar 298
      for (var i = 0, len = xs.length; i < len; i++) {
299
        var x = xs[i];
300
        f(x, i);
301
      }
302
    };
303
    var eachr = function (xs, f) {
304
      for (var i = xs.length - 1; i >= 0; i--) {
305
        var x = xs[i];
306
        f(x, i);
307
      }
308
    };
637 daniel-mar 309
    var partition$3 = function (xs, pred) {
597 daniel-mar 310
      var pass = [];
311
      var fail = [];
312
      for (var i = 0, len = xs.length; i < len; i++) {
313
        var x = xs[i];
314
        var arr = pred(x, i) ? pass : fail;
315
        arr.push(x);
316
      }
317
      return {
318
        pass: pass,
319
        fail: fail
320
      };
321
    };
637 daniel-mar 322
    var filter$2 = function (xs, pred) {
597 daniel-mar 323
      var r = [];
324
      for (var i = 0, len = xs.length; i < len; i++) {
325
        var x = xs[i];
326
        if (pred(x, i)) {
327
          r.push(x);
328
        }
329
      }
330
      return r;
331
    };
332
    var foldr = function (xs, f, acc) {
637 daniel-mar 333
      eachr(xs, function (x, i) {
334
        acc = f(acc, x, i);
597 daniel-mar 335
      });
336
      return acc;
337
    };
338
    var foldl = function (xs, f, acc) {
637 daniel-mar 339
      each$1(xs, function (x, i) {
340
        acc = f(acc, x, i);
597 daniel-mar 341
      });
342
      return acc;
343
    };
344
    var findUntil = function (xs, pred, until) {
345
      for (var i = 0, len = xs.length; i < len; i++) {
346
        var x = xs[i];
347
        if (pred(x, i)) {
348
          return Optional.some(x);
349
        } else if (until(x, i)) {
350
          break;
351
        }
352
      }
353
      return Optional.none();
354
    };
637 daniel-mar 355
    var find$5 = function (xs, pred) {
597 daniel-mar 356
      return findUntil(xs, pred, never);
357
    };
637 daniel-mar 358
    var findIndex$1 = function (xs, pred) {
597 daniel-mar 359
      for (var i = 0, len = xs.length; i < len; i++) {
360
        var x = xs[i];
361
        if (pred(x, i)) {
362
          return Optional.some(i);
363
        }
364
      }
365
      return Optional.none();
366
    };
367
    var flatten = function (xs) {
368
      var r = [];
369
      for (var i = 0, len = xs.length; i < len; ++i) {
370
        if (!isArray(xs[i])) {
371
          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
372
        }
373
        nativePush.apply(r, xs[i]);
374
      }
375
      return r;
376
    };
637 daniel-mar 377
    var bind$3 = function (xs, f) {
378
      return flatten(map$2(xs, f));
597 daniel-mar 379
    };
380
    var forall = function (xs, pred) {
381
      for (var i = 0, len = xs.length; i < len; ++i) {
382
        var x = xs[i];
383
        if (pred(x, i) !== true) {
384
          return false;
385
        }
386
      }
387
      return true;
388
    };
389
    var reverse = function (xs) {
390
      var r = nativeSlice.call(xs, 0);
391
      r.reverse();
392
      return r;
393
    };
394
    var difference = function (a1, a2) {
637 daniel-mar 395
      return filter$2(a1, function (x) {
396
        return !contains$2(a2, x);
597 daniel-mar 397
      });
398
    };
399
    var mapToObject = function (xs, f) {
400
      var r = {};
401
      for (var i = 0, len = xs.length; i < len; i++) {
402
        var x = xs[i];
403
        r[String(x)] = f(x, i);
404
      }
405
      return r;
406
    };
637 daniel-mar 407
    var pure$2 = function (x) {
408
      return [x];
409
    };
597 daniel-mar 410
    var sort = function (xs, comparator) {
411
      var copy = nativeSlice.call(xs, 0);
412
      copy.sort(comparator);
413
      return copy;
414
    };
637 daniel-mar 415
    var get$f = function (xs, i) {
597 daniel-mar 416
      return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
417
    };
418
    var head = function (xs) {
637 daniel-mar 419
      return get$f(xs, 0);
597 daniel-mar 420
    };
637 daniel-mar 421
    var last$2 = function (xs) {
422
      return get$f(xs, xs.length - 1);
597 daniel-mar 423
    };
637 daniel-mar 424
    var from = isFunction(Array.from) ? Array.from : function (x) {
597 daniel-mar 425
      return nativeSlice.call(x);
426
    };
427
    var findMap = function (arr, f) {
428
      for (var i = 0; i < arr.length; i++) {
429
        var r = f(arr[i], i);
430
        if (r.isSome()) {
431
          return r;
432
        }
433
      }
434
      return Optional.none();
435
    };
436
 
679 daniel-mar 437
    var keys = Object.keys;
438
    var hasOwnProperty = Object.hasOwnProperty;
439
    var each = function (obj, f) {
440
      var props = keys(obj);
441
      for (var k = 0, len = props.length; k < len; k++) {
442
        var i = props[k];
443
        var x = obj[i];
444
        f(x, i);
445
      }
446
    };
447
    var map$1 = function (obj, f) {
448
      return tupleMap(obj, function (x, i) {
449
        return {
450
          k: i,
451
          v: f(x, i)
452
        };
453
      });
454
    };
455
    var tupleMap = function (obj, f) {
456
      var r = {};
457
      each(obj, function (x, i) {
458
        var tuple = f(x, i);
459
        r[tuple.k] = tuple.v;
460
      });
461
      return r;
462
    };
463
    var objAcc = function (r) {
464
      return function (x, i) {
465
        r[i] = x;
466
      };
467
    };
468
    var internalFilter = function (obj, pred, onTrue, onFalse) {
469
      var r = {};
470
      each(obj, function (x, i) {
471
        (pred(x, i) ? onTrue : onFalse)(x, i);
472
      });
473
      return r;
474
    };
475
    var filter$1 = function (obj, pred) {
476
      var t = {};
477
      internalFilter(obj, pred, objAcc(t), noop);
478
      return t;
479
    };
480
    var mapToArray = function (obj, f) {
481
      var r = [];
482
      each(obj, function (value, name) {
483
        r.push(f(value, name));
484
      });
485
      return r;
486
    };
487
    var find$4 = function (obj, pred) {
488
      var props = keys(obj);
489
      for (var k = 0, len = props.length; k < len; k++) {
490
        var i = props[k];
491
        var x = obj[i];
492
        if (pred(x, i, obj)) {
493
          return Optional.some(x);
494
        }
495
      }
496
      return Optional.none();
497
    };
498
    var values = function (obj) {
499
      return mapToArray(obj, identity$1);
500
    };
501
    var get$e = function (obj, key) {
502
      return has$2(obj, key) ? Optional.from(obj[key]) : Optional.none();
503
    };
504
    var has$2 = function (obj, key) {
505
      return hasOwnProperty.call(obj, key);
506
    };
507
    var hasNonNullableKey = function (obj, key) {
508
      return has$2(obj, key) && obj[key] !== undefined && obj[key] !== null;
509
    };
510
 
511
    var is$1 = function (lhs, rhs, comparator) {
512
      if (comparator === void 0) {
513
        comparator = tripleEquals;
514
      }
515
      return lhs.exists(function (left) {
516
        return comparator(left, rhs);
517
      });
518
    };
519
    var equals = function (lhs, rhs, comparator) {
520
      if (comparator === void 0) {
521
        comparator = tripleEquals;
522
      }
523
      return lift2(lhs, rhs, comparator).getOr(lhs.isNone() && rhs.isNone());
524
    };
525
    var cat = function (arr) {
526
      var r = [];
527
      var push = function (x) {
528
        r.push(x);
529
      };
530
      for (var i = 0; i < arr.length; i++) {
531
        arr[i].each(push);
532
      }
533
      return r;
534
    };
535
    var sequence = function (arr) {
536
      var r = [];
537
      for (var i = 0; i < arr.length; i++) {
538
        var x = arr[i];
539
        if (x.isSome()) {
540
          r.push(x.getOrDie());
541
        } else {
542
          return Optional.none();
543
        }
544
      }
545
      return Optional.some(r);
546
    };
547
    var lift2 = function (oa, ob, f) {
548
      return oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();
549
    };
550
    var lift3 = function (oa, ob, oc, f) {
551
      return oa.isSome() && ob.isSome() && oc.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie(), oc.getOrDie())) : Optional.none();
552
    };
553
    var mapFrom = function (a, f) {
554
      return a !== undefined && a !== null ? Optional.some(f(a)) : Optional.none();
555
    };
556
    var someIf = function (b, a) {
557
      return b ? Optional.some(a) : Optional.none();
558
    };
559
 
560
    var addToEnd = function (str, suffix) {
561
      return str + suffix;
562
    };
563
    var removeFromStart = function (str, numChars) {
564
      return str.substring(numChars);
565
    };
566
 
567
    var checkRange = function (str, substr, start) {
568
      return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;
569
    };
570
    var removeLeading = function (str, prefix) {
571
      return startsWith(str, prefix) ? removeFromStart(str, prefix.length) : str;
572
    };
573
    var ensureTrailing = function (str, suffix) {
574
      return endsWith(str, suffix) ? str : addToEnd(str, suffix);
575
    };
576
    var contains$1 = function (str, substr) {
577
      return str.indexOf(substr) !== -1;
578
    };
579
    var startsWith = function (str, prefix) {
580
      return checkRange(str, prefix, 0);
581
    };
582
    var endsWith = function (str, suffix) {
583
      return checkRange(str, suffix, str.length - suffix.length);
584
    };
585
    var blank = function (r) {
586
      return function (s) {
587
        return s.replace(r, '');
588
      };
589
    };
590
    var trim$1 = blank(/^\s+|\s+$/g);
591
    var isNotEmpty = function (s) {
592
      return s.length > 0;
593
    };
594
    var isEmpty = function (s) {
595
      return !isNotEmpty(s);
596
    };
597
 
598
    var isSupported$1 = function (dom) {
599
      return dom.style !== undefined && isFunction(dom.style.getPropertyValue);
600
    };
601
 
602
    var fromHtml$2 = function (html, scope) {
603
      var doc = scope || document;
604
      var div = doc.createElement('div');
605
      div.innerHTML = html;
606
      if (!div.hasChildNodes() || div.childNodes.length > 1) {
607
        console.error('HTML does not have a single root node', html);
608
        throw new Error('HTML must have a single root node');
609
      }
610
      return fromDom(div.childNodes[0]);
611
    };
612
    var fromTag = function (tag, scope) {
613
      var doc = scope || document;
614
      var node = doc.createElement(tag);
615
      return fromDom(node);
616
    };
617
    var fromText = function (text, scope) {
618
      var doc = scope || document;
619
      var node = doc.createTextNode(text);
620
      return fromDom(node);
621
    };
622
    var fromDom = function (node) {
623
      if (node === null || node === undefined) {
624
        throw new Error('Node cannot be null or undefined');
625
      }
626
      return { dom: node };
627
    };
628
    var fromPoint = function (docElm, x, y) {
629
      return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);
630
    };
631
    var SugarElement = {
632
      fromHtml: fromHtml$2,
633
      fromTag: fromTag,
634
      fromText: fromText,
635
      fromDom: fromDom,
636
      fromPoint: fromPoint
637
    };
638
 
639
    typeof window !== 'undefined' ? window : Function('return this;')();
640
 
641
    var DOCUMENT = 9;
642
    var DOCUMENT_FRAGMENT = 11;
643
    var ELEMENT = 1;
644
    var TEXT = 3;
645
 
646
    var name$2 = function (element) {
647
      var r = element.dom.nodeName;
648
      return r.toLowerCase();
649
    };
650
    var type = function (element) {
651
      return element.dom.nodeType;
652
    };
653
    var isType = function (t) {
654
      return function (element) {
655
        return type(element) === t;
656
      };
657
    };
658
    var isElement$2 = isType(ELEMENT);
659
    var isText$1 = isType(TEXT);
660
    var isDocument = isType(DOCUMENT);
661
    var isDocumentFragment = isType(DOCUMENT_FRAGMENT);
662
 
663
    var cached = function (f) {
664
      var called = false;
665
      var r;
666
      return function () {
667
        var args = [];
668
        for (var _i = 0; _i < arguments.length; _i++) {
669
          args[_i] = arguments[_i];
670
        }
671
        if (!called) {
672
          called = true;
673
          r = f.apply(null, args);
674
        }
675
        return r;
676
      };
677
    };
678
 
679
    var DeviceType = function (os, browser, userAgent, mediaMatch) {
680
      var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
681
      var isiPhone = os.isiOS() && !isiPad;
682
      var isMobile = os.isiOS() || os.isAndroid();
683
      var isTouch = isMobile || mediaMatch('(pointer:coarse)');
684
      var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');
685
      var isPhone = isiPhone || isMobile && !isTablet;
686
      var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
687
      var isDesktop = !isPhone && !isTablet && !iOSwebview;
688
      return {
689
        isiPad: constant$1(isiPad),
690
        isiPhone: constant$1(isiPhone),
691
        isTablet: constant$1(isTablet),
692
        isPhone: constant$1(isPhone),
693
        isTouch: constant$1(isTouch),
694
        isAndroid: os.isAndroid,
695
        isiOS: os.isiOS,
696
        isWebView: constant$1(iOSwebview),
697
        isDesktop: constant$1(isDesktop)
698
      };
699
    };
700
 
701
    var firstMatch = function (regexes, s) {
702
      for (var i = 0; i < regexes.length; i++) {
703
        var x = regexes[i];
704
        if (x.test(s)) {
705
          return x;
706
        }
707
      }
708
      return undefined;
709
    };
710
    var find$3 = function (regexes, agent) {
711
      var r = firstMatch(regexes, agent);
712
      if (!r) {
713
        return {
714
          major: 0,
715
          minor: 0
716
        };
717
      }
718
      var group = function (i) {
719
        return Number(agent.replace(r, '$' + i));
720
      };
721
      return nu$d(group(1), group(2));
722
    };
723
    var detect$4 = function (versionRegexes, agent) {
724
      var cleanedAgent = String(agent).toLowerCase();
725
      if (versionRegexes.length === 0) {
726
        return unknown$3();
727
      }
728
      return find$3(versionRegexes, cleanedAgent);
729
    };
730
    var unknown$3 = function () {
731
      return nu$d(0, 0);
732
    };
733
    var nu$d = function (major, minor) {
734
      return {
735
        major: major,
736
        minor: minor
737
      };
738
    };
739
    var Version = {
740
      nu: nu$d,
741
      detect: detect$4,
742
      unknown: unknown$3
743
    };
744
 
745
    var detectBrowser$1 = function (browsers, userAgentData) {
746
      return findMap(userAgentData.brands, function (uaBrand) {
747
        var lcBrand = uaBrand.brand.toLowerCase();
748
        return find$5(browsers, function (browser) {
749
          var _a;
750
          return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());
751
        }).map(function (info) {
752
          return {
753
            current: info.name,
754
            version: Version.nu(parseInt(uaBrand.version, 10), 0)
755
          };
756
        });
757
      });
758
    };
759
 
760
    var detect$3 = function (candidates, userAgent) {
761
      var agent = String(userAgent).toLowerCase();
762
      return find$5(candidates, function (candidate) {
763
        return candidate.search(agent);
764
      });
765
    };
766
    var detectBrowser = function (browsers, userAgent) {
767
      return detect$3(browsers, userAgent).map(function (browser) {
768
        var version = Version.detect(browser.versionRegexes, userAgent);
769
        return {
770
          current: browser.name,
771
          version: version
772
        };
773
      });
774
    };
775
    var detectOs = function (oses, userAgent) {
776
      return detect$3(oses, userAgent).map(function (os) {
777
        var version = Version.detect(os.versionRegexes, userAgent);
778
        return {
779
          current: os.name,
780
          version: version
781
        };
782
      });
783
    };
784
 
785
    var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
786
    var checkContains = function (target) {
787
      return function (uastring) {
788
        return contains$1(uastring, target);
789
      };
790
    };
791
    var browsers = [
792
      {
793
        name: 'Edge',
794
        versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
795
        search: function (uastring) {
796
          return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit');
797
        }
798
      },
799
      {
800
        name: 'Chrome',
801
        brand: 'Chromium',
802
        versionRegexes: [
803
          /.*?chrome\/([0-9]+)\.([0-9]+).*/,
804
          normalVersionRegex
805
        ],
806
        search: function (uastring) {
807
          return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe');
808
        }
809
      },
810
      {
811
        name: 'IE',
812
        versionRegexes: [
813
          /.*?msie\ ?([0-9]+)\.([0-9]+).*/,
814
          /.*?rv:([0-9]+)\.([0-9]+).*/
815
        ],
816
        search: function (uastring) {
817
          return contains$1(uastring, 'msie') || contains$1(uastring, 'trident');
818
        }
819
      },
820
      {
821
        name: 'Opera',
822
        versionRegexes: [
823
          normalVersionRegex,
824
          /.*?opera\/([0-9]+)\.([0-9]+).*/
825
        ],
826
        search: checkContains('opera')
827
      },
828
      {
829
        name: 'Firefox',
830
        versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
831
        search: checkContains('firefox')
832
      },
833
      {
834
        name: 'Safari',
835
        versionRegexes: [
836
          normalVersionRegex,
837
          /.*?cpu os ([0-9]+)_([0-9]+).*/
838
        ],
839
        search: function (uastring) {
840
          return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit');
841
        }
842
      }
843
    ];
844
    var oses = [
845
      {
846
        name: 'Windows',
847
        search: checkContains('win'),
848
        versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
849
      },
850
      {
851
        name: 'iOS',
852
        search: function (uastring) {
853
          return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad');
854
        },
855
        versionRegexes: [
856
          /.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
857
          /.*cpu os ([0-9]+)_([0-9]+).*/,
858
          /.*cpu iphone os ([0-9]+)_([0-9]+).*/
859
        ]
860
      },
861
      {
862
        name: 'Android',
863
        search: checkContains('android'),
864
        versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
865
      },
866
      {
867
        name: 'OSX',
868
        search: checkContains('mac os x'),
869
        versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]
870
      },
871
      {
872
        name: 'Linux',
873
        search: checkContains('linux'),
874
        versionRegexes: []
875
      },
876
      {
877
        name: 'Solaris',
878
        search: checkContains('sunos'),
879
        versionRegexes: []
880
      },
881
      {
882
        name: 'FreeBSD',
883
        search: checkContains('freebsd'),
884
        versionRegexes: []
885
      },
886
      {
887
        name: 'ChromeOS',
888
        search: checkContains('cros'),
889
        versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/]
890
      }
891
    ];
892
    var PlatformInfo = {
893
      browsers: constant$1(browsers),
894
      oses: constant$1(oses)
895
    };
896
 
897
    var edge = 'Edge';
898
    var chrome = 'Chrome';
899
    var ie = 'IE';
900
    var opera = 'Opera';
901
    var firefox = 'Firefox';
902
    var safari = 'Safari';
903
    var unknown$2 = function () {
904
      return nu$c({
905
        current: undefined,
906
        version: Version.unknown()
907
      });
908
    };
909
    var nu$c = function (info) {
910
      var current = info.current;
911
      var version = info.version;
912
      var isBrowser = function (name) {
913
        return function () {
914
          return current === name;
915
        };
916
      };
917
      return {
918
        current: current,
919
        version: version,
920
        isEdge: isBrowser(edge),
921
        isChrome: isBrowser(chrome),
922
        isIE: isBrowser(ie),
923
        isOpera: isBrowser(opera),
924
        isFirefox: isBrowser(firefox),
925
        isSafari: isBrowser(safari)
926
      };
927
    };
928
    var Browser = {
929
      unknown: unknown$2,
930
      nu: nu$c,
931
      edge: constant$1(edge),
932
      chrome: constant$1(chrome),
933
      ie: constant$1(ie),
934
      opera: constant$1(opera),
935
      firefox: constant$1(firefox),
936
      safari: constant$1(safari)
937
    };
938
 
939
    var windows = 'Windows';
940
    var ios = 'iOS';
941
    var android = 'Android';
942
    var linux = 'Linux';
943
    var osx = 'OSX';
944
    var solaris = 'Solaris';
945
    var freebsd = 'FreeBSD';
946
    var chromeos = 'ChromeOS';
947
    var unknown$1 = function () {
948
      return nu$b({
949
        current: undefined,
950
        version: Version.unknown()
951
      });
952
    };
953
    var nu$b = function (info) {
954
      var current = info.current;
955
      var version = info.version;
956
      var isOS = function (name) {
957
        return function () {
958
          return current === name;
959
        };
960
      };
961
      return {
962
        current: current,
963
        version: version,
964
        isWindows: isOS(windows),
965
        isiOS: isOS(ios),
966
        isAndroid: isOS(android),
967
        isOSX: isOS(osx),
968
        isLinux: isOS(linux),
969
        isSolaris: isOS(solaris),
970
        isFreeBSD: isOS(freebsd),
971
        isChromeOS: isOS(chromeos)
972
      };
973
    };
974
    var OperatingSystem = {
975
      unknown: unknown$1,
976
      nu: nu$b,
977
      windows: constant$1(windows),
978
      ios: constant$1(ios),
979
      android: constant$1(android),
980
      linux: constant$1(linux),
981
      osx: constant$1(osx),
982
      solaris: constant$1(solaris),
983
      freebsd: constant$1(freebsd),
984
      chromeos: constant$1(chromeos)
985
    };
986
 
987
    var detect$2 = function (userAgent, userAgentDataOpt, mediaMatch) {
988
      var browsers = PlatformInfo.browsers();
989
      var oses = PlatformInfo.oses();
990
      var browser = userAgentDataOpt.bind(function (userAgentData) {
991
        return detectBrowser$1(browsers, userAgentData);
992
      }).orThunk(function () {
993
        return detectBrowser(browsers, userAgent);
994
      }).fold(Browser.unknown, Browser.nu);
995
      var os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
996
      var deviceType = DeviceType(os, browser, userAgent, mediaMatch);
997
      return {
998
        browser: browser,
999
        os: os,
1000
        deviceType: deviceType
1001
      };
1002
    };
1003
    var PlatformDetection = { detect: detect$2 };
1004
 
1005
    var mediaMatch = function (query) {
1006
      return window.matchMedia(query).matches;
1007
    };
1008
    var platform = cached(function () {
1009
      return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch);
1010
    });
1011
    var detect$1 = function () {
1012
      return platform();
1013
    };
1014
 
1015
    var compareDocumentPosition = function (a, b, match) {
1016
      return (a.compareDocumentPosition(b) & match) !== 0;
1017
    };
1018
    var documentPositionContainedBy = function (a, b) {
1019
      return compareDocumentPosition(a, b, Node.DOCUMENT_POSITION_CONTAINED_BY);
1020
    };
1021
 
1022
    var is = function (element, selector) {
1023
      var dom = element.dom;
1024
      if (dom.nodeType !== ELEMENT) {
1025
        return false;
1026
      } else {
1027
        var elem = dom;
1028
        if (elem.matches !== undefined) {
1029
          return elem.matches(selector);
1030
        } else if (elem.msMatchesSelector !== undefined) {
1031
          return elem.msMatchesSelector(selector);
1032
        } else if (elem.webkitMatchesSelector !== undefined) {
1033
          return elem.webkitMatchesSelector(selector);
1034
        } else if (elem.mozMatchesSelector !== undefined) {
1035
          return elem.mozMatchesSelector(selector);
1036
        } else {
1037
          throw new Error('Browser lacks native selectors');
1038
        }
1039
      }
1040
    };
1041
    var bypassSelector = function (dom) {
1042
      return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;
1043
    };
1044
    var all$3 = function (selector, scope) {
1045
      var base = scope === undefined ? document : scope.dom;
1046
      return bypassSelector(base) ? [] : map$2(base.querySelectorAll(selector), SugarElement.fromDom);
1047
    };
1048
    var one = function (selector, scope) {
1049
      var base = scope === undefined ? document : scope.dom;
1050
      return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom);
1051
    };
1052
 
1053
    var eq = function (e1, e2) {
1054
      return e1.dom === e2.dom;
1055
    };
1056
    var regularContains = function (e1, e2) {
1057
      var d1 = e1.dom;
1058
      var d2 = e2.dom;
1059
      return d1 === d2 ? false : d1.contains(d2);
1060
    };
1061
    var ieContains = function (e1, e2) {
1062
      return documentPositionContainedBy(e1.dom, e2.dom);
1063
    };
1064
    var contains = function (e1, e2) {
1065
      return detect$1().browser.isIE() ? ieContains(e1, e2) : regularContains(e1, e2);
1066
    };
1067
 
1068
    var owner$4 = function (element) {
1069
      return SugarElement.fromDom(element.dom.ownerDocument);
1070
    };
1071
    var documentOrOwner = function (dos) {
1072
      return isDocument(dos) ? dos : owner$4(dos);
1073
    };
1074
    var documentElement = function (element) {
1075
      return SugarElement.fromDom(documentOrOwner(element).dom.documentElement);
1076
    };
1077
    var defaultView = function (element) {
1078
      return SugarElement.fromDom(documentOrOwner(element).dom.defaultView);
1079
    };
1080
    var parent = function (element) {
1081
      return Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
1082
    };
1083
    var parentNode = function (element) {
1084
      return parent(element);
1085
    };
1086
    var offsetParent = function (element) {
1087
      return Optional.from(element.dom.offsetParent).map(SugarElement.fromDom);
1088
    };
1089
    var nextSibling = function (element) {
1090
      return Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);
1091
    };
1092
    var children = function (element) {
1093
      return map$2(element.dom.childNodes, SugarElement.fromDom);
1094
    };
1095
    var child$2 = function (element, index) {
1096
      var cs = element.dom.childNodes;
1097
      return Optional.from(cs[index]).map(SugarElement.fromDom);
1098
    };
1099
    var firstChild = function (element) {
1100
      return child$2(element, 0);
1101
    };
1102
    var spot = function (element, offset) {
1103
      return {
1104
        element: element,
1105
        offset: offset
1106
      };
1107
    };
1108
    var leaf = function (element, offset) {
1109
      var cs = children(element);
1110
      return cs.length > 0 && offset < cs.length ? spot(cs[offset], 0) : spot(element, offset);
1111
    };
1112
 
1113
    var isShadowRoot = function (dos) {
1114
      return isDocumentFragment(dos) && isNonNullable(dos.dom.host);
1115
    };
1116
    var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);
1117
    var isSupported = constant$1(supported);
1118
    var getRootNode = supported ? function (e) {
1119
      return SugarElement.fromDom(e.dom.getRootNode());
1120
    } : documentOrOwner;
1121
    var getContentContainer = function (dos) {
1122
      return isShadowRoot(dos) ? dos : SugarElement.fromDom(documentOrOwner(dos).dom.body);
1123
    };
1124
    var isInShadowRoot = function (e) {
1125
      return getShadowRoot(e).isSome();
1126
    };
1127
    var getShadowRoot = function (e) {
1128
      var r = getRootNode(e);
1129
      return isShadowRoot(r) ? Optional.some(r) : Optional.none();
1130
    };
1131
    var getShadowHost = function (e) {
1132
      return SugarElement.fromDom(e.dom.host);
1133
    };
1134
    var getOriginalEventTarget = function (event) {
1135
      if (isSupported() && isNonNullable(event.target)) {
1136
        var el = SugarElement.fromDom(event.target);
1137
        if (isElement$2(el) && isOpenShadowHost(el)) {
1138
          if (event.composed && event.composedPath) {
1139
            var composedPath = event.composedPath();
1140
            if (composedPath) {
1141
              return head(composedPath);
1142
            }
1143
          }
1144
        }
1145
      }
1146
      return Optional.from(event.target);
1147
    };
1148
    var isOpenShadowHost = function (element) {
1149
      return isNonNullable(element.dom.shadowRoot);
1150
    };
1151
 
1152
    var inBody = function (element) {
1153
      var dom = isText$1(element) ? element.dom.parentNode : element.dom;
1154
      if (dom === undefined || dom === null || dom.ownerDocument === null) {
1155
        return false;
1156
      }
1157
      var doc = dom.ownerDocument;
1158
      return getShadowRoot(SugarElement.fromDom(dom)).fold(function () {
1159
        return doc.body.contains(dom);
1160
      }, compose1(inBody, getShadowHost));
1161
    };
1162
    var body = function () {
1163
      return getBody(SugarElement.fromDom(document));
1164
    };
1165
    var getBody = function (doc) {
1166
      var b = doc.dom.body;
1167
      if (b === null || b === undefined) {
1168
        throw new Error('Body is not available yet');
1169
      }
1170
      return SugarElement.fromDom(b);
1171
    };
1172
 
1173
    var rawSet = function (dom, key, value) {
1174
      if (isString(value) || isBoolean(value) || isNumber(value)) {
1175
        dom.setAttribute(key, value + '');
1176
      } else {
1177
        console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
1178
        throw new Error('Attribute value was not simple');
1179
      }
1180
    };
1181
    var set$8 = function (element, key, value) {
1182
      rawSet(element.dom, key, value);
1183
    };
1184
    var setAll$1 = function (element, attrs) {
1185
      var dom = element.dom;
1186
      each(attrs, function (v, k) {
1187
        rawSet(dom, k, v);
1188
      });
1189
    };
1190
    var get$d = function (element, key) {
1191
      var v = element.dom.getAttribute(key);
1192
      return v === null ? undefined : v;
1193
    };
1194
    var getOpt = function (element, key) {
1195
      return Optional.from(get$d(element, key));
1196
    };
1197
    var has$1 = function (element, key) {
1198
      var dom = element.dom;
1199
      return dom && dom.hasAttribute ? dom.hasAttribute(key) : false;
1200
    };
1201
    var remove$7 = function (element, key) {
1202
      element.dom.removeAttribute(key);
1203
    };
1204
 
1205
    var internalSet = function (dom, property, value) {
1206
      if (!isString(value)) {
1207
        console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
1208
        throw new Error('CSS value must be a string: ' + value);
1209
      }
1210
      if (isSupported$1(dom)) {
1211
        dom.style.setProperty(property, value);
1212
      }
1213
    };
1214
    var internalRemove = function (dom, property) {
1215
      if (isSupported$1(dom)) {
1216
        dom.style.removeProperty(property);
1217
      }
1218
    };
1219
    var set$7 = function (element, property, value) {
1220
      var dom = element.dom;
1221
      internalSet(dom, property, value);
1222
    };
1223
    var setAll = function (element, css) {
1224
      var dom = element.dom;
1225
      each(css, function (v, k) {
1226
        internalSet(dom, k, v);
1227
      });
1228
    };
1229
    var setOptions = function (element, css) {
1230
      var dom = element.dom;
1231
      each(css, function (v, k) {
1232
        v.fold(function () {
1233
          internalRemove(dom, k);
1234
        }, function (value) {
1235
          internalSet(dom, k, value);
1236
        });
1237
      });
1238
    };
1239
    var get$c = function (element, property) {
1240
      var dom = element.dom;
1241
      var styles = window.getComputedStyle(dom);
1242
      var r = styles.getPropertyValue(property);
1243
      return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;
1244
    };
1245
    var getUnsafeProperty = function (dom, property) {
1246
      return isSupported$1(dom) ? dom.style.getPropertyValue(property) : '';
1247
    };
1248
    var getRaw = function (element, property) {
1249
      var dom = element.dom;
1250
      var raw = getUnsafeProperty(dom, property);
1251
      return Optional.from(raw).filter(function (r) {
1252
        return r.length > 0;
1253
      });
1254
    };
1255
    var getAllRaw = function (element) {
1256
      var css = {};
1257
      var dom = element.dom;
1258
      if (isSupported$1(dom)) {
1259
        for (var i = 0; i < dom.style.length; i++) {
1260
          var ruleName = dom.style.item(i);
1261
          css[ruleName] = dom.style[ruleName];
1262
        }
1263
      }
1264
      return css;
1265
    };
1266
    var isValidValue = function (tag, property, value) {
1267
      var element = SugarElement.fromTag(tag);
1268
      set$7(element, property, value);
1269
      var style = getRaw(element, property);
1270
      return style.isSome();
1271
    };
1272
    var remove$6 = function (element, property) {
1273
      var dom = element.dom;
1274
      internalRemove(dom, property);
1275
      if (is$1(getOpt(element, 'style').map(trim$1), '')) {
1276
        remove$7(element, 'style');
1277
      }
1278
    };
1279
    var reflow = function (e) {
1280
      return e.dom.offsetWidth;
1281
    };
1282
 
1283
    var Dimension = function (name, getOffset) {
1284
      var set = function (element, h) {
1285
        if (!isNumber(h) && !h.match(/^[0-9]+$/)) {
1286
          throw new Error(name + '.set accepts only positive integer values. Value was ' + h);
1287
        }
1288
        var dom = element.dom;
1289
        if (isSupported$1(dom)) {
1290
          dom.style[name] = h + 'px';
1291
        }
1292
      };
1293
      var get = function (element) {
1294
        var r = getOffset(element);
1295
        if (r <= 0 || r === null) {
1296
          var css = get$c(element, name);
1297
          return parseFloat(css) || 0;
1298
        }
1299
        return r;
1300
      };
1301
      var getOuter = get;
1302
      var aggregate = function (element, properties) {
1303
        return foldl(properties, function (acc, property) {
1304
          var val = get$c(element, property);
1305
          var value = val === undefined ? 0 : parseInt(val, 10);
1306
          return isNaN(value) ? acc : acc + value;
1307
        }, 0);
1308
      };
1309
      var max = function (element, value, properties) {
1310
        var cumulativeInclusions = aggregate(element, properties);
1311
        var absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0;
1312
        return absoluteMax;
1313
      };
1314
      return {
1315
        set: set,
1316
        get: get,
1317
        getOuter: getOuter,
1318
        aggregate: aggregate,
1319
        max: max
1320
      };
1321
    };
1322
 
1323
    var api$3 = Dimension('height', function (element) {
1324
      var dom = element.dom;
1325
      return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight;
1326
    });
1327
    var get$b = function (element) {
1328
      return api$3.get(element);
1329
    };
1330
    var getOuter$2 = function (element) {
1331
      return api$3.getOuter(element);
1332
    };
1333
    var setMax$1 = function (element, value) {
1334
      var inclusions = [
1335
        'margin-top',
1336
        'border-top-width',
1337
        'padding-top',
1338
        'padding-bottom',
1339
        'border-bottom-width',
1340
        'margin-bottom'
1341
      ];
1342
      var absMax = api$3.max(element, value, inclusions);
1343
      set$7(element, 'max-height', absMax + 'px');
1344
    };
1345
 
1346
    var r$1 = function (left, top) {
1347
      var translate = function (x, y) {
1348
        return r$1(left + x, top + y);
1349
      };
1350
      return {
1351
        left: left,
1352
        top: top,
1353
        translate: translate
1354
      };
1355
    };
1356
    var SugarPosition = r$1;
1357
 
1358
    var boxPosition = function (dom) {
1359
      var box = dom.getBoundingClientRect();
1360
      return SugarPosition(box.left, box.top);
1361
    };
1362
    var firstDefinedOrZero = function (a, b) {
1363
      if (a !== undefined) {
1364
        return a;
1365
      } else {
1366
        return b !== undefined ? b : 0;
1367
      }
1368
    };
1369
    var absolute$3 = function (element) {
1370
      var doc = element.dom.ownerDocument;
1371
      var body = doc.body;
1372
      var win = doc.defaultView;
1373
      var html = doc.documentElement;
1374
      if (body === element.dom) {
1375
        return SugarPosition(body.offsetLeft, body.offsetTop);
1376
      }
1377
      var scrollTop = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageYOffset, html.scrollTop);
1378
      var scrollLeft = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageXOffset, html.scrollLeft);
1379
      var clientTop = firstDefinedOrZero(html.clientTop, body.clientTop);
1380
      var clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft);
1381
      return viewport$1(element).translate(scrollLeft - clientLeft, scrollTop - clientTop);
1382
    };
1383
    var viewport$1 = function (element) {
1384
      var dom = element.dom;
1385
      var doc = dom.ownerDocument;
1386
      var body = doc.body;
1387
      if (body === dom) {
1388
        return SugarPosition(body.offsetLeft, body.offsetTop);
1389
      }
1390
      if (!inBody(element)) {
1391
        return SugarPosition(0, 0);
1392
      }
1393
      return boxPosition(dom);
1394
    };
1395
 
1396
    var api$2 = Dimension('width', function (element) {
1397
      return element.dom.offsetWidth;
1398
    });
1399
    var set$6 = function (element, h) {
1400
      return api$2.set(element, h);
1401
    };
1402
    var get$a = function (element) {
1403
      return api$2.get(element);
1404
    };
1405
    var getOuter$1 = function (element) {
1406
      return api$2.getOuter(element);
1407
    };
1408
    var setMax = function (element, value) {
1409
      var inclusions = [
1410
        'margin-left',
1411
        'border-left-width',
1412
        'padding-left',
1413
        'padding-right',
1414
        'border-right-width',
1415
        'margin-right'
1416
      ];
1417
      var absMax = api$2.max(element, value, inclusions);
1418
      set$7(element, 'max-width', absMax + 'px');
1419
    };
1420
 
1421
    var mkEvent = function (target, x, y, stop, prevent, kill, raw) {
1422
      return {
1423
        target: target,
1424
        x: x,
1425
        y: y,
1426
        stop: stop,
1427
        prevent: prevent,
1428
        kill: kill,
1429
        raw: raw
1430
      };
1431
    };
1432
    var fromRawEvent$1 = function (rawEvent) {
1433
      var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));
1434
      var stop = function () {
1435
        return rawEvent.stopPropagation();
1436
      };
1437
      var prevent = function () {
1438
        return rawEvent.preventDefault();
1439
      };
1440
      var kill = compose(prevent, stop);
1441
      return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);
1442
    };
1443
    var handle = function (filter, handler) {
1444
      return function (rawEvent) {
1445
        if (filter(rawEvent)) {
1446
          handler(fromRawEvent$1(rawEvent));
1447
        }
1448
      };
1449
    };
1450
    var binder = function (element, event, filter, handler, useCapture) {
1451
      var wrapped = handle(filter, handler);
1452
      element.dom.addEventListener(event, wrapped, useCapture);
1453
      return { unbind: curry(unbind, element, event, wrapped, useCapture) };
1454
    };
1455
    var bind$2 = function (element, event, filter, handler) {
1456
      return binder(element, event, filter, handler, false);
1457
    };
1458
    var capture$1 = function (element, event, filter, handler) {
1459
      return binder(element, event, filter, handler, true);
1460
    };
1461
    var unbind = function (element, event, handler, useCapture) {
1462
      element.dom.removeEventListener(event, handler, useCapture);
1463
    };
1464
 
1465
    var before$2 = function (marker, element) {
1466
      var parent$1 = parent(marker);
1467
      parent$1.each(function (v) {
1468
        v.dom.insertBefore(element.dom, marker.dom);
1469
      });
1470
    };
1471
    var after$2 = function (marker, element) {
1472
      var sibling = nextSibling(marker);
1473
      sibling.fold(function () {
1474
        var parent$1 = parent(marker);
1475
        parent$1.each(function (v) {
1476
          append$2(v, element);
1477
        });
1478
      }, function (v) {
1479
        before$2(v, element);
1480
      });
1481
    };
1482
    var prepend$1 = function (parent, element) {
1483
      var firstChild$1 = firstChild(parent);
1484
      firstChild$1.fold(function () {
1485
        append$2(parent, element);
1486
      }, function (v) {
1487
        parent.dom.insertBefore(element.dom, v.dom);
1488
      });
1489
    };
1490
    var append$2 = function (parent, element) {
1491
      parent.dom.appendChild(element.dom);
1492
    };
1493
    var appendAt = function (parent, element, index) {
1494
      child$2(parent, index).fold(function () {
1495
        append$2(parent, element);
1496
      }, function (v) {
1497
        before$2(v, element);
1498
      });
1499
    };
1500
 
1501
    var before$1 = function (marker, elements) {
1502
      each$1(elements, function (x) {
1503
        before$2(marker, x);
1504
      });
1505
    };
1506
    var append$1 = function (parent, elements) {
1507
      each$1(elements, function (x) {
1508
        append$2(parent, x);
1509
      });
1510
    };
1511
 
1512
    var empty = function (element) {
1513
      element.dom.textContent = '';
1514
      each$1(children(element), function (rogue) {
1515
        remove$5(rogue);
1516
      });
1517
    };
1518
    var remove$5 = function (element) {
1519
      var dom = element.dom;
1520
      if (dom.parentNode !== null) {
1521
        dom.parentNode.removeChild(dom);
1522
      }
1523
    };
1524
    var unwrap = function (wrapper) {
1525
      var children$1 = children(wrapper);
1526
      if (children$1.length > 0) {
1527
        before$1(wrapper, children$1);
1528
      }
1529
      remove$5(wrapper);
1530
    };
1531
 
1532
    var get$9 = function (_DOC) {
1533
      var doc = _DOC !== undefined ? _DOC.dom : document;
1534
      var x = doc.body.scrollLeft || doc.documentElement.scrollLeft;
1535
      var y = doc.body.scrollTop || doc.documentElement.scrollTop;
1536
      return SugarPosition(x, y);
1537
    };
1538
    var to = function (x, y, _DOC) {
1539
      var doc = _DOC !== undefined ? _DOC.dom : document;
1540
      var win = doc.defaultView;
1541
      if (win) {
1542
        win.scrollTo(x, y);
1543
      }
1544
    };
1545
 
1546
    var get$8 = function (_win) {
1547
      var win = _win === undefined ? window : _win;
1548
      if (detect$1().browser.isFirefox()) {
1549
        return Optional.none();
1550
      } else {
1551
        return Optional.from(win['visualViewport']);
1552
      }
1553
    };
1554
    var bounds$1 = function (x, y, width, height) {
1555
      return {
1556
        x: x,
1557
        y: y,
1558
        width: width,
1559
        height: height,
1560
        right: x + width,
1561
        bottom: y + height
1562
      };
1563
    };
1564
    var getBounds$3 = function (_win) {
1565
      var win = _win === undefined ? window : _win;
1566
      var doc = win.document;
1567
      var scroll = get$9(SugarElement.fromDom(doc));
1568
      return get$8(win).fold(function () {
1569
        var html = win.document.documentElement;
1570
        var width = html.clientWidth;
1571
        var height = html.clientHeight;
1572
        return bounds$1(scroll.left, scroll.top, width, height);
1573
      }, function (visualViewport) {
1574
        return bounds$1(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height);
1575
      });
1576
    };
1577
 
1578
    var walkUp = function (navigation, doc) {
1579
      var frame = navigation.view(doc);
1580
      return frame.fold(constant$1([]), function (f) {
1581
        var parent = navigation.owner(f);
1582
        var rest = walkUp(navigation, parent);
1583
        return [f].concat(rest);
1584
      });
1585
    };
1586
    var pathTo = function (element, navigation) {
1587
      var d = navigation.owner(element);
1588
      var paths = walkUp(navigation, d);
1589
      return Optional.some(paths);
1590
    };
1591
 
1592
    var view = function (doc) {
1593
      var _a;
1594
      var element = doc.dom === document ? Optional.none() : Optional.from((_a = doc.dom.defaultView) === null || _a === void 0 ? void 0 : _a.frameElement);
1595
      return element.map(SugarElement.fromDom);
1596
    };
1597
    var owner$3 = function (element) {
1598
      return owner$4(element);
1599
    };
1600
 
1601
    var Navigation = /*#__PURE__*/Object.freeze({
1602
        __proto__: null,
1603
        view: view,
1604
        owner: owner$3
1605
    });
1606
 
1607
    var find$2 = function (element) {
1608
      var doc = SugarElement.fromDom(document);
1609
      var scroll = get$9(doc);
1610
      var path = pathTo(element, Navigation);
1611
      return path.fold(curry(absolute$3, element), function (frames) {
1612
        var offset = viewport$1(element);
1613
        var r = foldr(frames, function (b, a) {
1614
          var loc = viewport$1(a);
1615
          return {
1616
            left: b.left + loc.left,
1617
            top: b.top + loc.top
1618
          };
1619
        }, {
1620
          left: 0,
1621
          top: 0
1622
        });
1623
        return SugarPosition(r.left + offset.left + scroll.left, r.top + offset.top + scroll.top);
1624
      });
1625
    };
1626
 
1627
    var pointed = function (point, width, height) {
1628
      return {
1629
        point: point,
1630
        width: width,
1631
        height: height
1632
      };
1633
    };
1634
    var rect = function (x, y, width, height) {
1635
      return {
1636
        x: x,
1637
        y: y,
1638
        width: width,
1639
        height: height
1640
      };
1641
    };
1642
    var bounds = function (x, y, width, height) {
1643
      return {
1644
        x: x,
1645
        y: y,
1646
        width: width,
1647
        height: height,
1648
        right: x + width,
1649
        bottom: y + height
1650
      };
1651
    };
1652
    var box$1 = function (element) {
1653
      var xy = absolute$3(element);
1654
      var w = getOuter$1(element);
1655
      var h = getOuter$2(element);
1656
      return bounds(xy.left, xy.top, w, h);
1657
    };
1658
    var absolute$2 = function (element) {
1659
      var position = find$2(element);
1660
      var width = getOuter$1(element);
1661
      var height = getOuter$2(element);
1662
      return bounds(position.left, position.top, width, height);
1663
    };
1664
    var win = function () {
1665
      return getBounds$3(window);
1666
    };
1667
 
637 daniel-mar 1668
    var value$3 = function (o) {
597 daniel-mar 1669
      var or = function (_opt) {
637 daniel-mar 1670
        return value$3(o);
597 daniel-mar 1671
      };
1672
      var orThunk = function (_f) {
637 daniel-mar 1673
        return value$3(o);
597 daniel-mar 1674
      };
1675
      var map = function (f) {
637 daniel-mar 1676
        return value$3(f(o));
597 daniel-mar 1677
      };
1678
      var mapError = function (_f) {
637 daniel-mar 1679
        return value$3(o);
597 daniel-mar 1680
      };
1681
      var each = function (f) {
1682
        f(o);
1683
      };
1684
      var bind = function (f) {
1685
        return f(o);
1686
      };
1687
      var fold = function (_, onValue) {
1688
        return onValue(o);
1689
      };
1690
      var exists = function (f) {
1691
        return f(o);
1692
      };
1693
      var forall = function (f) {
1694
        return f(o);
1695
      };
1696
      var toOptional = function () {
1697
        return Optional.some(o);
1698
      };
1699
      return {
1700
        isValue: always,
1701
        isError: never,
637 daniel-mar 1702
        getOr: constant$1(o),
1703
        getOrThunk: constant$1(o),
1704
        getOrDie: constant$1(o),
597 daniel-mar 1705
        or: or,
1706
        orThunk: orThunk,
1707
        fold: fold,
1708
        map: map,
1709
        mapError: mapError,
1710
        each: each,
1711
        bind: bind,
1712
        exists: exists,
1713
        forall: forall,
1714
        toOptional: toOptional
1715
      };
1716
    };
637 daniel-mar 1717
    var error$1 = function (message) {
597 daniel-mar 1718
      var getOrThunk = function (f) {
1719
        return f();
1720
      };
1721
      var getOrDie = function () {
1722
        return die(String(message))();
1723
      };
637 daniel-mar 1724
      var or = identity$1;
597 daniel-mar 1725
      var orThunk = function (f) {
1726
        return f();
1727
      };
1728
      var map = function (_f) {
637 daniel-mar 1729
        return error$1(message);
597 daniel-mar 1730
      };
1731
      var mapError = function (f) {
637 daniel-mar 1732
        return error$1(f(message));
597 daniel-mar 1733
      };
1734
      var bind = function (_f) {
637 daniel-mar 1735
        return error$1(message);
597 daniel-mar 1736
      };
1737
      var fold = function (onError, _) {
1738
        return onError(message);
1739
      };
1740
      return {
1741
        isValue: never,
1742
        isError: always,
637 daniel-mar 1743
        getOr: identity$1,
597 daniel-mar 1744
        getOrThunk: getOrThunk,
1745
        getOrDie: getOrDie,
1746
        or: or,
1747
        orThunk: orThunk,
1748
        fold: fold,
1749
        map: map,
1750
        mapError: mapError,
1751
        each: noop,
1752
        bind: bind,
1753
        exists: never,
1754
        forall: always,
1755
        toOptional: Optional.none
1756
      };
1757
    };
1758
    var fromOption = function (opt, err) {
1759
      return opt.fold(function () {
637 daniel-mar 1760
        return error$1(err);
1761
      }, value$3);
597 daniel-mar 1762
    };
1763
    var Result = {
637 daniel-mar 1764
      value: value$3,
1765
      error: error$1,
597 daniel-mar 1766
      fromOption: fromOption
1767
    };
1768
 
1769
    var SimpleResultType;
1770
    (function (SimpleResultType) {
1771
      SimpleResultType[SimpleResultType['Error'] = 0] = 'Error';
1772
      SimpleResultType[SimpleResultType['Value'] = 1] = 'Value';
1773
    }(SimpleResultType || (SimpleResultType = {})));
637 daniel-mar 1774
    var fold$1 = function (res, onError, onValue) {
597 daniel-mar 1775
      return res.stype === SimpleResultType.Error ? onError(res.serror) : onValue(res.svalue);
1776
    };
637 daniel-mar 1777
    var partition$2 = function (results) {
597 daniel-mar 1778
      var values = [];
1779
      var errors = [];
637 daniel-mar 1780
      each$1(results, function (obj) {
1781
        fold$1(obj, function (err) {
597 daniel-mar 1782
          return errors.push(err);
1783
        }, function (val) {
1784
          return values.push(val);
1785
        });
1786
      });
1787
      return {
1788
        values: values,
1789
        errors: errors
1790
      };
1791
    };
1792
    var mapError = function (res, f) {
1793
      if (res.stype === SimpleResultType.Error) {
1794
        return {
1795
          stype: SimpleResultType.Error,
1796
          serror: f(res.serror)
1797
        };
1798
      } else {
1799
        return res;
1800
      }
1801
    };
679 daniel-mar 1802
    var map = function (res, f) {
597 daniel-mar 1803
      if (res.stype === SimpleResultType.Value) {
1804
        return {
1805
          stype: SimpleResultType.Value,
1806
          svalue: f(res.svalue)
1807
        };
1808
      } else {
1809
        return res;
1810
      }
1811
    };
679 daniel-mar 1812
    var bind$1 = function (res, f) {
597 daniel-mar 1813
      if (res.stype === SimpleResultType.Value) {
1814
        return f(res.svalue);
1815
      } else {
1816
        return res;
1817
      }
1818
    };
1819
    var bindError = function (res, f) {
1820
      if (res.stype === SimpleResultType.Error) {
1821
        return f(res.serror);
1822
      } else {
1823
        return res;
1824
      }
1825
    };
1826
    var svalue = function (v) {
1827
      return {
1828
        stype: SimpleResultType.Value,
1829
        svalue: v
1830
      };
1831
    };
1832
    var serror = function (e) {
1833
      return {
1834
        stype: SimpleResultType.Error,
1835
        serror: e
1836
      };
1837
    };
637 daniel-mar 1838
    var toResult$1 = function (res) {
1839
      return fold$1(res, Result.error, Result.value);
597 daniel-mar 1840
    };
637 daniel-mar 1841
    var fromResult$1 = function (res) {
597 daniel-mar 1842
      return res.fold(serror, svalue);
1843
    };
1844
    var SimpleResult = {
637 daniel-mar 1845
      fromResult: fromResult$1,
1846
      toResult: toResult$1,
597 daniel-mar 1847
      svalue: svalue,
637 daniel-mar 1848
      partition: partition$2,
597 daniel-mar 1849
      serror: serror,
679 daniel-mar 1850
      bind: bind$1,
597 daniel-mar 1851
      bindError: bindError,
679 daniel-mar 1852
      map: map,
597 daniel-mar 1853
      mapError: mapError,
637 daniel-mar 1854
      fold: fold$1
597 daniel-mar 1855
    };
1856
 
637 daniel-mar 1857
    var field$2 = function (key, newKey, presence, prop) {
1858
      return {
1859
        tag: 'field',
1860
        key: key,
1861
        newKey: newKey,
1862
        presence: presence,
1863
        prop: prop
1864
      };
1865
    };
1866
    var customField$1 = function (newKey, instantiator) {
1867
      return {
1868
        tag: 'custom',
1869
        newKey: newKey,
1870
        instantiator: instantiator
1871
      };
1872
    };
1873
    var fold = function (value, ifField, ifCustom) {
1874
      switch (value.tag) {
1875
      case 'field':
1876
        return ifField(value.key, value.newKey, value.presence, value.prop);
1877
      case 'custom':
1878
        return ifCustom(value.newKey, value.instantiator);
1879
      }
1880
    };
1881
 
1882
    var shallow$1 = function (old, nu) {
597 daniel-mar 1883
      return nu;
1884
    };
1885
    var deep = function (old, nu) {
1886
      var bothObjects = isObject(old) && isObject(nu);
1887
      return bothObjects ? deepMerge(old, nu) : nu;
1888
    };
1889
    var baseMerge = function (merger) {
1890
      return function () {
1891
        var objects = [];
1892
        for (var _i = 0; _i < arguments.length; _i++) {
1893
          objects[_i] = arguments[_i];
1894
        }
1895
        if (objects.length === 0) {
1896
          throw new Error('Can\'t merge zero objects');
1897
        }
1898
        var ret = {};
1899
        for (var j = 0; j < objects.length; j++) {
1900
          var curObject = objects[j];
1901
          for (var key in curObject) {
637 daniel-mar 1902
            if (has$2(curObject, key)) {
597 daniel-mar 1903
              ret[key] = merger(ret[key], curObject[key]);
1904
            }
1905
          }
1906
        }
1907
        return ret;
1908
      };
1909
    };
1910
    var deepMerge = baseMerge(deep);
637 daniel-mar 1911
    var merge$1 = baseMerge(shallow$1);
597 daniel-mar 1912
 
637 daniel-mar 1913
    var required$2 = function () {
1914
      return {
1915
        tag: 'required',
1916
        process: {}
1917
      };
597 daniel-mar 1918
    };
637 daniel-mar 1919
    var defaultedThunk = function (fallbackThunk) {
597 daniel-mar 1920
      return {
637 daniel-mar 1921
        tag: 'defaultedThunk',
1922
        process: fallbackThunk
597 daniel-mar 1923
      };
1924
    };
637 daniel-mar 1925
    var defaulted$1 = function (fallback) {
1926
      return defaultedThunk(constant$1(fallback));
597 daniel-mar 1927
    };
637 daniel-mar 1928
    var asOption = function () {
1929
      return {
1930
        tag: 'option',
1931
        process: {}
1932
      };
597 daniel-mar 1933
    };
637 daniel-mar 1934
    var mergeWithThunk = function (baseThunk) {
1935
      return {
1936
        tag: 'mergeWithThunk',
1937
        process: baseThunk
1938
      };
597 daniel-mar 1939
    };
637 daniel-mar 1940
    var mergeWith = function (base) {
1941
      return mergeWithThunk(constant$1(base));
597 daniel-mar 1942
    };
1943
 
1944
    var mergeValues$1 = function (values, base) {
637 daniel-mar 1945
      return values.length > 0 ? SimpleResult.svalue(deepMerge(base, merge$1.apply(undefined, values))) : SimpleResult.svalue(base);
597 daniel-mar 1946
    };
1947
    var mergeErrors$1 = function (errors) {
1948
      return compose(SimpleResult.serror, flatten)(errors);
1949
    };
1950
    var consolidateObj = function (objects, base) {
1951
      var partition = SimpleResult.partition(objects);
1952
      return partition.errors.length > 0 ? mergeErrors$1(partition.errors) : mergeValues$1(partition.values, base);
1953
    };
1954
    var consolidateArr = function (objects) {
1955
      var partitions = SimpleResult.partition(objects);
1956
      return partitions.errors.length > 0 ? mergeErrors$1(partitions.errors) : SimpleResult.svalue(partitions.values);
1957
    };
1958
    var ResultCombine = {
1959
      consolidateObj: consolidateObj,
1960
      consolidateArr: consolidateArr
1961
    };
1962
 
1963
    var formatObj = function (input) {
1964
      return isObject(input) && keys(input).length > 100 ? ' removed due to size' : JSON.stringify(input, null, 2);
1965
    };
1966
    var formatErrors = function (errors) {
1967
      var es = errors.length > 10 ? errors.slice(0, 10).concat([{
1968
          path: [],
637 daniel-mar 1969
          getErrorInfo: constant$1('... (only showing first ten failures)')
597 daniel-mar 1970
        }]) : errors;
637 daniel-mar 1971
      return map$2(es, function (e) {
597 daniel-mar 1972
        return 'Failed path: (' + e.path.join(' > ') + ')\n' + e.getErrorInfo();
1973
      });
1974
    };
1975
 
679 daniel-mar 1976
    var nu$a = function (path, getErrorInfo) {
597 daniel-mar 1977
      return SimpleResult.serror([{
1978
          path: path,
1979
          getErrorInfo: getErrorInfo
1980
        }]);
1981
    };
637 daniel-mar 1982
    var missingRequired = function (path, key, obj) {
679 daniel-mar 1983
      return nu$a(path, function () {
637 daniel-mar 1984
        return 'Could not find valid *required* value for "' + key + '" in ' + formatObj(obj);
597 daniel-mar 1985
      });
1986
    };
1987
    var missingKey = function (path, key) {
679 daniel-mar 1988
      return nu$a(path, function () {
597 daniel-mar 1989
        return 'Choice schema did not contain choice key: "' + key + '"';
1990
      });
1991
    };
1992
    var missingBranch = function (path, branches, branch) {
679 daniel-mar 1993
      return nu$a(path, function () {
597 daniel-mar 1994
        return 'The chosen schema: "' + branch + '" did not exist in branches: ' + formatObj(branches);
1995
      });
1996
    };
1997
    var unsupportedFields = function (path, unsupported) {
679 daniel-mar 1998
      return nu$a(path, function () {
597 daniel-mar 1999
        return 'There are unsupported fields: [' + unsupported.join(', ') + '] specified';
2000
      });
2001
    };
2002
    var custom = function (path, err) {
679 daniel-mar 2003
      return nu$a(path, constant$1(err));
597 daniel-mar 2004
    };
2005
 
637 daniel-mar 2006
    var value$2 = function (validator) {
2007
      var extract = function (path, val) {
2008
        return SimpleResult.bindError(validator(val), function (err) {
2009
          return custom(path, err);
2010
        });
2011
      };
2012
      var toString = constant$1('val');
2013
      return {
2014
        extract: extract,
2015
        toString: toString
2016
      };
597 daniel-mar 2017
    };
637 daniel-mar 2018
    var anyValue$1 = value$2(SimpleResult.svalue);
2019
 
2020
    var requiredAccess = function (path, obj, key, bundle) {
2021
      return get$e(obj, key).fold(function () {
2022
        return missingRequired(path, key, obj);
2023
      }, bundle);
597 daniel-mar 2024
    };
637 daniel-mar 2025
    var fallbackAccess = function (obj, key, fallback, bundle) {
2026
      var v = get$e(obj, key).getOrThunk(function () {
2027
        return fallback(obj);
2028
      });
2029
      return bundle(v);
597 daniel-mar 2030
    };
637 daniel-mar 2031
    var optionAccess = function (obj, key, bundle) {
2032
      return bundle(get$e(obj, key));
2033
    };
2034
    var optionDefaultedAccess = function (obj, key, fallback, bundle) {
2035
      var opt = get$e(obj, key).map(function (val) {
597 daniel-mar 2036
        return val === true ? fallback(obj) : val;
2037
      });
637 daniel-mar 2038
      return bundle(opt);
597 daniel-mar 2039
    };
637 daniel-mar 2040
    var extractField = function (field, path, obj, key, prop) {
2041
      var bundle = function (av) {
2042
        return prop.extract(path.concat([key]), av);
2043
      };
2044
      var bundleAsOption = function (optValue) {
2045
        return optValue.fold(function () {
2046
          return SimpleResult.svalue(Optional.none());
2047
        }, function (ov) {
2048
          var result = prop.extract(path.concat([key]), ov);
2049
          return SimpleResult.map(result, Optional.some);
2050
        });
2051
      };
2052
      switch (field.tag) {
2053
      case 'required':
2054
        return requiredAccess(path, obj, key, bundle);
2055
      case 'defaultedThunk':
2056
        return fallbackAccess(obj, key, field.process, bundle);
2057
      case 'option':
2058
        return optionAccess(obj, key, bundleAsOption);
2059
      case 'defaultedOptionThunk':
2060
        return optionDefaultedAccess(obj, key, field.process, bundleAsOption);
2061
      case 'mergeWithThunk': {
2062
          return fallbackAccess(obj, key, constant$1({}), function (v) {
2063
            var result = deepMerge(field.process(obj), v);
2064
            return bundle(result);
597 daniel-mar 2065
          });
637 daniel-mar 2066
        }
2067
      }
2068
    };
2069
    var extractFields = function (path, obj, fields) {
2070
      var success = {};
2071
      var errors = [];
2072
      for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) {
2073
        var field = fields_1[_i];
2074
        fold(field, function (key, newKey, presence, prop) {
2075
          var result = extractField(presence, path, obj, key, prop);
2076
          SimpleResult.fold(result, function (err) {
2077
            errors.push.apply(errors, err);
2078
          }, function (res) {
2079
            success[newKey] = res;
597 daniel-mar 2080
          });
637 daniel-mar 2081
        }, function (newKey, instantiator) {
2082
          success[newKey] = instantiator(obj);
2083
        });
2084
      }
2085
      return errors.length > 0 ? SimpleResult.serror(errors) : SimpleResult.svalue(success);
597 daniel-mar 2086
    };
2087
    var valueThunk = function (getDelegate) {
637 daniel-mar 2088
      var extract = function (path, val) {
2089
        return getDelegate().extract(path, val);
597 daniel-mar 2090
      };
2091
      var toString = function () {
2092
        return getDelegate().toString();
2093
      };
2094
      return {
2095
        extract: extract,
2096
        toString: toString
2097
      };
2098
    };
2099
    var getSetKeys = function (obj) {
637 daniel-mar 2100
      return keys(filter$1(obj, isNonNullable));
597 daniel-mar 2101
    };
2102
    var objOfOnly = function (fields) {
2103
      var delegate = objOf(fields);
637 daniel-mar 2104
      var fieldNames = foldr(fields, function (acc, value) {
2105
        return fold(value, function (key) {
2106
          var _a;
2107
          return deepMerge(acc, (_a = {}, _a[key] = true, _a));
2108
        }, constant$1(acc));
597 daniel-mar 2109
      }, {});
637 daniel-mar 2110
      var extract = function (path, o) {
597 daniel-mar 2111
        var keys = isBoolean(o) ? [] : getSetKeys(o);
637 daniel-mar 2112
        var extra = filter$2(keys, function (k) {
597 daniel-mar 2113
          return !hasNonNullableKey(fieldNames, k);
2114
        });
637 daniel-mar 2115
        return extra.length === 0 ? delegate.extract(path, o) : unsupportedFields(path, extra);
597 daniel-mar 2116
      };
2117
      return {
2118
        extract: extract,
2119
        toString: delegate.toString
2120
      };
2121
    };
637 daniel-mar 2122
    var objOf = function (values) {
2123
      var extract = function (path, o) {
2124
        return extractFields(path, o, values);
597 daniel-mar 2125
      };
2126
      var toString = function () {
637 daniel-mar 2127
        var fieldStrings = map$2(values, function (value) {
2128
          return fold(value, function (key, _okey, _presence, prop) {
597 daniel-mar 2129
            return key + ' -> ' + prop.toString();
637 daniel-mar 2130
          }, function (newKey, _instantiator) {
2131
            return 'state(' + newKey + ')';
597 daniel-mar 2132
          });
2133
        });
2134
        return 'obj{\n' + fieldStrings.join('\n') + '}';
2135
      };
2136
      return {
2137
        extract: extract,
2138
        toString: toString
2139
      };
2140
    };
2141
    var arrOf = function (prop) {
637 daniel-mar 2142
      var extract = function (path, array) {
2143
        var results = map$2(array, function (a, i) {
2144
          return prop.extract(path.concat(['[' + i + ']']), a);
597 daniel-mar 2145
        });
2146
        return ResultCombine.consolidateArr(results);
2147
      };
2148
      var toString = function () {
2149
        return 'array(' + prop.toString() + ')';
2150
      };
2151
      return {
2152
        extract: extract,
2153
        toString: toString
2154
      };
2155
    };
2156
    var oneOf = function (props) {
637 daniel-mar 2157
      var extract = function (path, val) {
597 daniel-mar 2158
        var errors = [];
2159
        for (var _i = 0, props_1 = props; _i < props_1.length; _i++) {
2160
          var prop = props_1[_i];
637 daniel-mar 2161
          var res = prop.extract(path, val);
597 daniel-mar 2162
          if (res.stype === SimpleResultType.Value) {
2163
            return res;
2164
          }
2165
          errors.push(res);
2166
        }
2167
        return ResultCombine.consolidateArr(errors);
2168
      };
2169
      var toString = function () {
637 daniel-mar 2170
        return 'oneOf(' + map$2(props, function (prop) {
597 daniel-mar 2171
          return prop.toString();
2172
        }).join(', ') + ')';
2173
      };
2174
      return {
2175
        extract: extract,
2176
        toString: toString
2177
      };
2178
    };
637 daniel-mar 2179
    var setOf$1 = function (validator, prop) {
597 daniel-mar 2180
      var validateKeys = function (path, keys) {
637 daniel-mar 2181
        return arrOf(value$2(validator)).extract(path, keys);
597 daniel-mar 2182
      };
637 daniel-mar 2183
      var extract = function (path, o) {
597 daniel-mar 2184
        var keys$1 = keys(o);
2185
        var validatedKeys = validateKeys(path, keys$1);
2186
        return SimpleResult.bind(validatedKeys, function (validKeys) {
637 daniel-mar 2187
          var schema = map$2(validKeys, function (vk) {
2188
            return field$2(vk, vk, required$2(), prop);
597 daniel-mar 2189
          });
637 daniel-mar 2190
          return objOf(schema).extract(path, o);
597 daniel-mar 2191
        });
2192
      };
2193
      var toString = function () {
2194
        return 'setOf(' + prop.toString() + ')';
2195
      };
2196
      return {
2197
        extract: extract,
2198
        toString: toString
2199
      };
2200
    };
637 daniel-mar 2201
    var thunk = function (_desc, processor) {
2202
      var getP = cached(processor);
2203
      var extract = function (path, val) {
2204
        return getP().extract(path, val);
597 daniel-mar 2205
      };
2206
      var toString = function () {
2207
        return getP().toString();
2208
      };
2209
      return {
2210
        extract: extract,
2211
        toString: toString
2212
      };
2213
    };
2214
    var arrOfObj = compose(arrOf, objOf);
2215
 
637 daniel-mar 2216
    var anyValue = constant$1(anyValue$1);
2217
    var typedValue = function (validator, expectedType) {
2218
      return value$2(function (a) {
2219
        var actualType = typeof a;
2220
        return validator(a) ? SimpleResult.svalue(a) : SimpleResult.serror('Expected type: ' + expectedType + ' but got: ' + actualType);
2221
      });
2222
    };
2223
    var number = typedValue(isNumber, 'number');
2224
    var string = typedValue(isString, 'string');
2225
    var boolean = typedValue(isBoolean, 'boolean');
2226
    var functionProcessor = typedValue(isFunction, 'function');
2227
    var isPostMessageable = function (val) {
2228
      if (Object(val) !== val) {
2229
        return true;
2230
      }
2231
      switch ({}.toString.call(val).slice(8, -1)) {
2232
      case 'Boolean':
2233
      case 'Number':
2234
      case 'String':
2235
      case 'Date':
2236
      case 'RegExp':
2237
      case 'Blob':
2238
      case 'FileList':
2239
      case 'ImageData':
2240
      case 'ImageBitmap':
2241
      case 'ArrayBuffer':
2242
        return true;
2243
      case 'Array':
2244
      case 'Object':
2245
        return Object.keys(val).every(function (prop) {
2246
          return isPostMessageable(val[prop]);
2247
        });
2248
      default:
2249
        return false;
2250
      }
2251
    };
2252
    var postMessageable = value$2(function (a) {
2253
      if (isPostMessageable(a)) {
2254
        return SimpleResult.svalue(a);
2255
      } else {
2256
        return SimpleResult.serror('Expected value to be acceptable for sending via postMessage');
2257
      }
2258
    });
2259
 
2260
    var chooseFrom = function (path, input, branches, ch) {
2261
      var fields = get$e(branches, ch);
597 daniel-mar 2262
      return fields.fold(function () {
2263
        return missingBranch(path, branches, ch);
2264
      }, function (vp) {
637 daniel-mar 2265
        return vp.extract(path.concat(['branch: ' + ch]), input);
597 daniel-mar 2266
      });
2267
    };
637 daniel-mar 2268
    var choose$2 = function (key, branches) {
2269
      var extract = function (path, input) {
2270
        var choice = get$e(input, key);
597 daniel-mar 2271
        return choice.fold(function () {
2272
          return missingKey(path, key);
2273
        }, function (chosen) {
637 daniel-mar 2274
          return chooseFrom(path, input, branches, chosen);
597 daniel-mar 2275
        });
2276
      };
2277
      var toString = function () {
2278
        return 'chooseOn(' + key + '). Possible values: ' + keys(branches);
2279
      };
2280
      return {
2281
        extract: extract,
2282
        toString: toString
2283
      };
2284
    };
2285
 
2286
    var arrOfVal = function () {
637 daniel-mar 2287
      return arrOf(anyValue$1);
597 daniel-mar 2288
    };
2289
    var valueOf = function (validator) {
637 daniel-mar 2290
      return value$2(function (v) {
597 daniel-mar 2291
        return validator(v).fold(SimpleResult.serror, SimpleResult.svalue);
2292
      });
2293
    };
637 daniel-mar 2294
    var setOf = function (validator, prop) {
2295
      return setOf$1(function (v) {
597 daniel-mar 2296
        return SimpleResult.fromResult(validator(v));
2297
      }, prop);
2298
    };
637 daniel-mar 2299
    var extractValue = function (label, prop, obj) {
2300
      var res = prop.extract([label], obj);
597 daniel-mar 2301
      return SimpleResult.mapError(res, function (errs) {
2302
        return {
2303
          input: obj,
2304
          errors: errs
2305
        };
2306
      });
2307
    };
2308
    var asRaw = function (label, prop, obj) {
637 daniel-mar 2309
      return SimpleResult.toResult(extractValue(label, prop, obj));
597 daniel-mar 2310
    };
2311
    var getOrDie = function (extraction) {
2312
      return extraction.fold(function (errInfo) {
2313
        throw new Error(formatError(errInfo));
637 daniel-mar 2314
      }, identity$1);
597 daniel-mar 2315
    };
637 daniel-mar 2316
    var asRawOrDie$1 = function (label, prop, obj) {
597 daniel-mar 2317
      return getOrDie(asRaw(label, prop, obj));
2318
    };
2319
    var formatError = function (errInfo) {
2320
      return 'Errors: \n' + formatErrors(errInfo.errors).join('\n') + '\n\nInput object: ' + formatObj(errInfo.input);
2321
    };
2322
    var choose$1 = function (key, branches) {
679 daniel-mar 2323
      return choose$2(key, map$1(branches, objOf));
597 daniel-mar 2324
    };
2325
    var thunkOf = function (desc, schema) {
2326
      return thunk(desc, schema);
2327
    };
2328
 
637 daniel-mar 2329
    var field$1 = field$2;
2330
    var customField = customField$1;
597 daniel-mar 2331
    var validateEnum = function (values) {
2332
      return valueOf(function (value) {
637 daniel-mar 2333
        return contains$2(values, value) ? Result.value(value) : Result.error('Unsupported value: "' + value + '", choose one of "' + values.join(', ') + '".');
597 daniel-mar 2334
      });
2335
    };
637 daniel-mar 2336
    var required$1 = function (key) {
2337
      return field$1(key, key, required$2(), anyValue());
597 daniel-mar 2338
    };
637 daniel-mar 2339
    var requiredOf = function (key, schema) {
2340
      return field$1(key, key, required$2(), schema);
597 daniel-mar 2341
    };
637 daniel-mar 2342
    var requiredNumber = function (key) {
2343
      return requiredOf(key, number);
597 daniel-mar 2344
    };
637 daniel-mar 2345
    var requiredString = function (key) {
2346
      return requiredOf(key, string);
597 daniel-mar 2347
    };
637 daniel-mar 2348
    var requiredStringEnum = function (key, values) {
2349
      return field$1(key, key, required$2(), validateEnum(values));
597 daniel-mar 2350
    };
637 daniel-mar 2351
    var requiredBoolean = function (key) {
2352
      return requiredOf(key, boolean);
597 daniel-mar 2353
    };
637 daniel-mar 2354
    var requiredFunction = function (key) {
2355
      return requiredOf(key, functionProcessor);
597 daniel-mar 2356
    };
2357
    var forbid = function (key, message) {
637 daniel-mar 2358
      return field$1(key, key, asOption(), value$2(function (_v) {
597 daniel-mar 2359
        return SimpleResult.serror('The field: ' + key + ' is forbidden. ' + message);
2360
      }));
2361
    };
637 daniel-mar 2362
    var requiredObjOf = function (key, objSchema) {
2363
      return field$1(key, key, required$2(), objOf(objSchema));
597 daniel-mar 2364
    };
637 daniel-mar 2365
    var requiredArrayOfObj = function (key, objFields) {
2366
      return field$1(key, key, required$2(), arrOfObj(objFields));
597 daniel-mar 2367
    };
637 daniel-mar 2368
    var requiredArrayOf = function (key, schema) {
2369
      return field$1(key, key, required$2(), arrOf(schema));
597 daniel-mar 2370
    };
2371
    var option = function (key) {
637 daniel-mar 2372
      return field$1(key, key, asOption(), anyValue());
597 daniel-mar 2373
    };
2374
    var optionOf = function (key, schema) {
637 daniel-mar 2375
      return field$1(key, key, asOption(), schema);
597 daniel-mar 2376
    };
2377
    var optionNumber = function (key) {
2378
      return optionOf(key, number);
2379
    };
2380
    var optionString = function (key) {
2381
      return optionOf(key, string);
2382
    };
2383
    var optionFunction = function (key) {
2384
      return optionOf(key, functionProcessor);
2385
    };
2386
    var optionArrayOf = function (key, schema) {
2387
      return optionOf(key, arrOf(schema));
2388
    };
2389
    var optionObjOf = function (key, objSchema) {
2390
      return optionOf(key, objOf(objSchema));
2391
    };
2392
    var optionObjOfOnly = function (key, objSchema) {
2393
      return optionOf(key, objOfOnly(objSchema));
2394
    };
637 daniel-mar 2395
    var defaulted = function (key, fallback) {
2396
      return field$1(key, key, defaulted$1(fallback), anyValue());
597 daniel-mar 2397
    };
2398
    var defaultedOf = function (key, fallback, schema) {
637 daniel-mar 2399
      return field$1(key, key, defaulted$1(fallback), schema);
597 daniel-mar 2400
    };
2401
    var defaultedNumber = function (key, fallback) {
2402
      return defaultedOf(key, fallback, number);
2403
    };
2404
    var defaultedString = function (key, fallback) {
2405
      return defaultedOf(key, fallback, string);
2406
    };
2407
    var defaultedStringEnum = function (key, fallback, values) {
2408
      return defaultedOf(key, fallback, validateEnum(values));
2409
    };
2410
    var defaultedBoolean = function (key, fallback) {
2411
      return defaultedOf(key, fallback, boolean);
2412
    };
2413
    var defaultedFunction = function (key, fallback) {
2414
      return defaultedOf(key, fallback, functionProcessor);
2415
    };
2416
    var defaultedPostMsg = function (key, fallback) {
2417
      return defaultedOf(key, fallback, postMessageable);
2418
    };
2419
    var defaultedArrayOf = function (key, fallback, schema) {
2420
      return defaultedOf(key, fallback, arrOf(schema));
2421
    };
2422
    var defaultedObjOf = function (key, fallback, objSchema) {
2423
      return defaultedOf(key, fallback, objOf(objSchema));
2424
    };
2425
 
2426
    var Cell = function (initial) {
2427
      var value = initial;
2428
      var get = function () {
2429
        return value;
2430
      };
2431
      var set = function (v) {
2432
        value = v;
2433
      };
2434
      return {
2435
        get: get,
2436
        set: set
2437
      };
2438
    };
2439
 
637 daniel-mar 2440
    var generate$7 = function (cases) {
2441
      if (!isArray(cases)) {
2442
        throw new Error('cases must be an array');
2443
      }
2444
      if (cases.length === 0) {
2445
        throw new Error('there must be at least one case');
2446
      }
2447
      var constructors = [];
2448
      var adt = {};
2449
      each$1(cases, function (acase, count) {
2450
        var keys$1 = keys(acase);
2451
        if (keys$1.length !== 1) {
2452
          throw new Error('one and only one name per case');
2453
        }
2454
        var key = keys$1[0];
2455
        var value = acase[key];
2456
        if (adt[key] !== undefined) {
2457
          throw new Error('duplicate key detected:' + key);
2458
        } else if (key === 'cata') {
2459
          throw new Error('cannot have a case named cata (sorry)');
2460
        } else if (!isArray(value)) {
2461
          throw new Error('case arguments must be an array');
2462
        }
2463
        constructors.push(key);
2464
        adt[key] = function () {
2465
          var args = [];
2466
          for (var _i = 0; _i < arguments.length; _i++) {
2467
            args[_i] = arguments[_i];
2468
          }
2469
          var argLength = args.length;
2470
          if (argLength !== value.length) {
2471
            throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);
2472
          }
2473
          var match = function (branches) {
2474
            var branchKeys = keys(branches);
2475
            if (constructors.length !== branchKeys.length) {
2476
              throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(','));
2477
            }
2478
            var allReqd = forall(constructors, function (reqKey) {
2479
              return contains$2(branchKeys, reqKey);
2480
            });
2481
            if (!allReqd) {
2482
              throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', '));
2483
            }
2484
            return branches[key].apply(null, args);
2485
          };
2486
          return {
2487
            fold: function () {
2488
              var foldArgs = [];
2489
              for (var _i = 0; _i < arguments.length; _i++) {
2490
                foldArgs[_i] = arguments[_i];
2491
              }
2492
              if (foldArgs.length !== cases.length) {
2493
                throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length);
2494
              }
2495
              var target = foldArgs[count];
2496
              return target.apply(null, args);
2497
            },
2498
            match: match,
2499
            log: function (label) {
2500
              console.log(label, {
2501
                constructors: constructors,
2502
                constructor: key,
2503
                params: args
2504
              });
2505
            }
2506
          };
2507
        };
2508
      });
2509
      return adt;
2510
    };
2511
    var Adt = { generate: generate$7 };
2512
 
2513
    Adt.generate([
2514
      {
2515
        bothErrors: [
2516
          'error1',
2517
          'error2'
2518
        ]
2519
      },
2520
      {
2521
        firstError: [
2522
          'error1',
2523
          'value2'
2524
        ]
2525
      },
2526
      {
2527
        secondError: [
2528
          'value1',
2529
          'error2'
2530
        ]
2531
      },
2532
      {
2533
        bothValues: [
2534
          'value1',
2535
          'value2'
2536
        ]
2537
      }
2538
    ]);
2539
    var partition$1 = function (results) {
2540
      var errors = [];
2541
      var values = [];
2542
      each$1(results, function (result) {
2543
        result.fold(function (err) {
2544
          errors.push(err);
2545
        }, function (value) {
2546
          values.push(value);
2547
        });
2548
      });
2549
      return {
2550
        errors: errors,
2551
        values: values
2552
      };
2553
    };
2554
 
2555
    var exclude$1 = function (obj, fields) {
2556
      var r = {};
2557
      each(obj, function (v, k) {
2558
        if (!contains$2(fields, k)) {
2559
          r[k] = v;
2560
        }
2561
      });
2562
      return r;
2563
    };
2564
 
2565
    var wrap$2 = function (key, value) {
2566
      var _a;
2567
      return _a = {}, _a[key] = value, _a;
2568
    };
2569
    var wrapAll$1 = function (keyvalues) {
2570
      var r = {};
2571
      each$1(keyvalues, function (kv) {
2572
        r[kv.key] = kv.value;
2573
      });
2574
      return r;
2575
    };
2576
 
2577
    var exclude = function (obj, fields) {
2578
      return exclude$1(obj, fields);
2579
    };
2580
    var wrap$1 = function (key, value) {
2581
      return wrap$2(key, value);
2582
    };
2583
    var wrapAll = function (keyvalues) {
2584
      return wrapAll$1(keyvalues);
2585
    };
2586
    var mergeValues = function (values, base) {
2587
      return values.length === 0 ? Result.value(base) : Result.value(deepMerge(base, merge$1.apply(undefined, values)));
2588
    };
2589
    var mergeErrors = function (errors) {
2590
      return Result.error(flatten(errors));
2591
    };
2592
    var consolidate = function (objs, base) {
2593
      var partitions = partition$1(objs);
2594
      return partitions.errors.length > 0 ? mergeErrors(partitions.errors) : mergeValues(partitions.values, base);
2595
    };
2596
 
597 daniel-mar 2597
    var ensureIsRoot = function (isRoot) {
2598
      return isFunction(isRoot) ? isRoot : never;
2599
    };
637 daniel-mar 2600
    var ancestor$2 = function (scope, transform, isRoot) {
597 daniel-mar 2601
      var element = scope.dom;
2602
      var stop = ensureIsRoot(isRoot);
2603
      while (element.parentNode) {
2604
        element = element.parentNode;
2605
        var el = SugarElement.fromDom(element);
2606
        var transformed = transform(el);
2607
        if (transformed.isSome()) {
2608
          return transformed;
2609
        } else if (stop(el)) {
2610
          break;
2611
        }
2612
      }
2613
      return Optional.none();
2614
    };
637 daniel-mar 2615
    var closest$4 = function (scope, transform, isRoot) {
597 daniel-mar 2616
      var current = transform(scope);
2617
      var stop = ensureIsRoot(isRoot);
2618
      return current.orThunk(function () {
637 daniel-mar 2619
        return stop(scope) ? Optional.none() : ancestor$2(scope, transform, stop);
597 daniel-mar 2620
      });
2621
    };
2622
 
2623
    var isSource = function (component, simulatedEvent) {
637 daniel-mar 2624
      return eq(component.element, simulatedEvent.event.target);
597 daniel-mar 2625
    };
2626
 
637 daniel-mar 2627
    var defaultEventHandler = {
2628
      can: always,
2629
      abort: never,
2630
      run: noop
2631
    };
2632
    var nu$9 = function (parts) {
597 daniel-mar 2633
      if (!hasNonNullableKey(parts, 'can') && !hasNonNullableKey(parts, 'abort') && !hasNonNullableKey(parts, 'run')) {
2634
        throw new Error('EventHandler defined by: ' + JSON.stringify(parts, null, 2) + ' does not have can, abort, or run!');
2635
      }
637 daniel-mar 2636
      return __assign(__assign({}, defaultEventHandler), parts);
597 daniel-mar 2637
    };
637 daniel-mar 2638
    var all$2 = function (handlers, f) {
597 daniel-mar 2639
      return function () {
2640
        var args = [];
2641
        for (var _i = 0; _i < arguments.length; _i++) {
2642
          args[_i] = arguments[_i];
2643
        }
2644
        return foldl(handlers, function (acc, handler) {
2645
          return acc && f(handler).apply(undefined, args);
2646
        }, true);
2647
      };
2648
    };
2649
    var any = function (handlers, f) {
2650
      return function () {
2651
        var args = [];
2652
        for (var _i = 0; _i < arguments.length; _i++) {
2653
          args[_i] = arguments[_i];
2654
        }
2655
        return foldl(handlers, function (acc, handler) {
2656
          return acc || f(handler).apply(undefined, args);
2657
        }, false);
2658
      };
2659
    };
637 daniel-mar 2660
    var read$2 = function (handler) {
597 daniel-mar 2661
      return isFunction(handler) ? {
2662
        can: always,
2663
        abort: never,
2664
        run: handler
2665
      } : handler;
2666
    };
637 daniel-mar 2667
    var fuse$1 = function (handlers) {
2668
      var can = all$2(handlers, function (handler) {
597 daniel-mar 2669
        return handler.can;
2670
      });
2671
      var abort = any(handlers, function (handler) {
2672
        return handler.abort;
2673
      });
2674
      var run = function () {
2675
        var args = [];
2676
        for (var _i = 0; _i < arguments.length; _i++) {
2677
          args[_i] = arguments[_i];
2678
        }
637 daniel-mar 2679
        each$1(handlers, function (handler) {
597 daniel-mar 2680
          handler.run.apply(undefined, args);
2681
        });
2682
      };
637 daniel-mar 2683
      return {
597 daniel-mar 2684
        can: can,
2685
        abort: abort,
2686
        run: run
637 daniel-mar 2687
      };
597 daniel-mar 2688
    };
2689
 
637 daniel-mar 2690
    var constant = constant$1;
2691
    var touchstart = constant('touchstart');
2692
    var touchmove = constant('touchmove');
2693
    var touchend = constant('touchend');
2694
    var touchcancel = constant('touchcancel');
2695
    var mousedown = constant('mousedown');
2696
    var mousemove = constant('mousemove');
2697
    var mouseout = constant('mouseout');
2698
    var mouseup = constant('mouseup');
2699
    var mouseover = constant('mouseover');
2700
    var focusin = constant('focusin');
2701
    var focusout = constant('focusout');
2702
    var keydown = constant('keydown');
2703
    var keyup = constant('keyup');
2704
    var input = constant('input');
2705
    var change = constant('change');
2706
    var click = constant('click');
2707
    var transitioncancel = constant('transitioncancel');
2708
    var transitionend = constant('transitionend');
2709
    var transitionstart = constant('transitionstart');
2710
    var selectstart = constant('selectstart');
597 daniel-mar 2711
 
2712
    var prefixName = function (name) {
637 daniel-mar 2713
      return constant$1('alloy.' + name);
597 daniel-mar 2714
    };
2715
    var alloy = { tap: prefixName('tap') };
637 daniel-mar 2716
    var focus$4 = prefixName('focus');
597 daniel-mar 2717
    var postBlur = prefixName('blur.post');
2718
    var postPaste = prefixName('paste.post');
2719
    var receive = prefixName('receive');
637 daniel-mar 2720
    var execute$5 = prefixName('execute');
597 daniel-mar 2721
    var focusItem = prefixName('focus.item');
2722
    var tap = alloy.tap;
2723
    var longpress = prefixName('longpress');
2724
    var sandboxClose = prefixName('sandbox.close');
2725
    var typeaheadCancel = prefixName('typeahead.cancel');
2726
    var systemInit = prefixName('system.init');
2727
    var documentTouchmove = prefixName('system.touchmove');
2728
    var documentTouchend = prefixName('system.touchend');
2729
    var windowScroll = prefixName('system.scroll');
2730
    var windowResize = prefixName('system.resize');
2731
    var attachedToDom = prefixName('system.attached');
2732
    var detachedFromDom = prefixName('system.detached');
2733
    var dismissRequested = prefixName('system.dismissRequested');
2734
    var repositionRequested = prefixName('system.repositionRequested');
2735
    var focusShifted = prefixName('focusmanager.shifted');
2736
    var slotVisibility = prefixName('slotcontainer.visibility');
2737
    var changeTab = prefixName('change.tab');
2738
    var dismissTab = prefixName('dismiss.tab');
637 daniel-mar 2739
    var highlight$1 = prefixName('highlight');
2740
    var dehighlight$1 = prefixName('dehighlight');
597 daniel-mar 2741
 
2742
    var emit = function (component, event) {
2743
      dispatchWith(component, component.element, event, {});
2744
    };
2745
    var emitWith = function (component, event, properties) {
2746
      dispatchWith(component, component.element, event, properties);
2747
    };
2748
    var emitExecute = function (component) {
637 daniel-mar 2749
      emit(component, execute$5());
597 daniel-mar 2750
    };
2751
    var dispatch = function (component, target, event) {
2752
      dispatchWith(component, target, event, {});
2753
    };
2754
    var dispatchWith = function (component, target, event, properties) {
2755
      var data = __assign({ target: target }, properties);
2756
      component.getSystem().triggerEvent(event, target, data);
2757
    };
2758
    var dispatchEvent = function (component, target, event, simulatedEvent) {
2759
      component.getSystem().triggerEvent(event, target, simulatedEvent.event);
2760
    };
2761
 
637 daniel-mar 2762
    var derive$2 = function (configs) {
2763
      return wrapAll(configs);
597 daniel-mar 2764
    };
2765
    var abort = function (name, predicate) {
2766
      return {
2767
        key: name,
637 daniel-mar 2768
        value: nu$9({ abort: predicate })
597 daniel-mar 2769
      };
2770
    };
2771
    var can = function (name, predicate) {
2772
      return {
2773
        key: name,
637 daniel-mar 2774
        value: nu$9({ can: predicate })
597 daniel-mar 2775
      };
2776
    };
2777
    var preventDefault = function (name) {
2778
      return {
2779
        key: name,
637 daniel-mar 2780
        value: nu$9({
597 daniel-mar 2781
          run: function (component, simulatedEvent) {
2782
            simulatedEvent.event.prevent();
2783
          }
2784
        })
2785
      };
2786
    };
637 daniel-mar 2787
    var run$1 = function (name, handler) {
597 daniel-mar 2788
      return {
2789
        key: name,
637 daniel-mar 2790
        value: nu$9({ run: handler })
597 daniel-mar 2791
      };
2792
    };
2793
    var runActionExtra = function (name, action, extra) {
2794
      return {
2795
        key: name,
637 daniel-mar 2796
        value: nu$9({
597 daniel-mar 2797
          run: function (component, simulatedEvent) {
2798
            action.apply(undefined, [
2799
              component,
2800
              simulatedEvent
2801
            ].concat(extra));
2802
          }
2803
        })
2804
      };
2805
    };
2806
    var runOnName = function (name) {
2807
      return function (handler) {
637 daniel-mar 2808
        return run$1(name, handler);
597 daniel-mar 2809
      };
2810
    };
2811
    var runOnSourceName = function (name) {
2812
      return function (handler) {
2813
        return {
2814
          key: name,
637 daniel-mar 2815
          value: nu$9({
597 daniel-mar 2816
            run: function (component, simulatedEvent) {
2817
              if (isSource(component, simulatedEvent)) {
2818
                handler(component, simulatedEvent);
2819
              }
2820
            }
2821
          })
2822
        };
2823
      };
2824
    };
2825
    var redirectToUid = function (name, uid) {
637 daniel-mar 2826
      return run$1(name, function (component, simulatedEvent) {
597 daniel-mar 2827
        component.getSystem().getByUid(uid).each(function (redirectee) {
2828
          dispatchEvent(redirectee, redirectee.element, name, simulatedEvent);
2829
        });
2830
      });
2831
    };
2832
    var redirectToPart = function (name, detail, partName) {
2833
      var uid = detail.partUids[partName];
2834
      return redirectToUid(name, uid);
2835
    };
2836
    var runWithTarget = function (name, f) {
637 daniel-mar 2837
      return run$1(name, function (component, simulatedEvent) {
597 daniel-mar 2838
        var ev = simulatedEvent.event;
637 daniel-mar 2839
        var target = component.getSystem().getByDom(ev.target).getOrThunk(function () {
2840
          var closest = closest$4(ev.target, function (el) {
597 daniel-mar 2841
            return component.getSystem().getByDom(el).toOptional();
2842
          }, never);
637 daniel-mar 2843
          return closest.getOr(component);
597 daniel-mar 2844
        });
2845
        f(component, target, simulatedEvent);
2846
      });
2847
    };
2848
    var cutter = function (name) {
637 daniel-mar 2849
      return run$1(name, function (component, simulatedEvent) {
597 daniel-mar 2850
        simulatedEvent.cut();
2851
      });
2852
    };
2853
    var stopper = function (name) {
637 daniel-mar 2854
      return run$1(name, function (component, simulatedEvent) {
597 daniel-mar 2855
        simulatedEvent.stop();
2856
      });
2857
    };
2858
    var runOnSource = function (name, f) {
2859
      return runOnSourceName(name)(f);
2860
    };
2861
    var runOnAttached = runOnSourceName(attachedToDom());
2862
    var runOnDetached = runOnSourceName(detachedFromDom());
2863
    var runOnInit = runOnSourceName(systemInit());
637 daniel-mar 2864
    var runOnExecute$1 = runOnName(execute$5());
597 daniel-mar 2865
 
2866
    var fromHtml$1 = function (html, scope) {
2867
      var doc = scope || document;
2868
      var div = doc.createElement('div');
2869
      div.innerHTML = html;
2870
      return children(SugarElement.fromDom(div));
2871
    };
2872
 
679 daniel-mar 2873
    var get$7 = function (element) {
597 daniel-mar 2874
      return element.dom.innerHTML;
2875
    };
679 daniel-mar 2876
    var set$5 = function (element, content) {
637 daniel-mar 2877
      var owner = owner$4(element);
2878
      var docDom = owner.dom;
597 daniel-mar 2879
      var fragment = SugarElement.fromDom(docDom.createDocumentFragment());
2880
      var contentElements = fromHtml$1(content, docDom);
2881
      append$1(fragment, contentElements);
2882
      empty(element);
637 daniel-mar 2883
      append$2(element, fragment);
597 daniel-mar 2884
    };
679 daniel-mar 2885
    var getOuter = function (element) {
597 daniel-mar 2886
      var container = SugarElement.fromTag('div');
2887
      var clone = SugarElement.fromDom(element.dom.cloneNode(true));
637 daniel-mar 2888
      append$2(container, clone);
679 daniel-mar 2889
      return get$7(container);
597 daniel-mar 2890
    };
2891
 
637 daniel-mar 2892
    var clone$1 = function (original, isDeep) {
597 daniel-mar 2893
      return SugarElement.fromDom(original.dom.cloneNode(isDeep));
2894
    };
637 daniel-mar 2895
    var shallow = function (original) {
2896
      return clone$1(original, false);
597 daniel-mar 2897
    };
2898
 
2899
    var getHtml = function (element) {
2900
      if (isShadowRoot(element)) {
2901
        return '#shadow-root';
2902
      } else {
637 daniel-mar 2903
        var clone = shallow(element);
679 daniel-mar 2904
        return getOuter(clone);
597 daniel-mar 2905
      }
2906
    };
2907
 
2908
    var element = function (elem) {
2909
      return getHtml(elem);
2910
    };
2911
 
2912
    var isRecursive = function (component, originator, target) {
637 daniel-mar 2913
      return eq(originator, component.element) && !eq(originator, target);
597 daniel-mar 2914
    };
637 daniel-mar 2915
    var events$i = derive$2([can(focus$4(), function (component, simulatedEvent) {
597 daniel-mar 2916
        var event = simulatedEvent.event;
2917
        var originator = event.originator;
2918
        var target = event.target;
2919
        if (isRecursive(component, originator, target)) {
637 daniel-mar 2920
          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 2921
          return false;
2922
        } else {
2923
          return true;
2924
        }
2925
      })]);
2926
 
2927
    var DefaultEvents = /*#__PURE__*/Object.freeze({
2928
        __proto__: null,
637 daniel-mar 2929
        events: events$i
597 daniel-mar 2930
    });
2931
 
2932
    var unique = 0;
637 daniel-mar 2933
    var generate$6 = function (prefix) {
597 daniel-mar 2934
      var date = new Date();
2935
      var time = date.getTime();
2936
      var random = Math.floor(Math.random() * 1000000000);
2937
      unique++;
2938
      return prefix + '_' + random + unique + String(time);
2939
    };
2940
 
637 daniel-mar 2941
    var prefix$1 = constant$1('alloy-id-');
2942
    var idAttr$1 = constant$1('data-alloy-id');
597 daniel-mar 2943
 
637 daniel-mar 2944
    var prefix = prefix$1();
2945
    var idAttr = idAttr$1();
597 daniel-mar 2946
    var write = function (label, elem) {
637 daniel-mar 2947
      var id = generate$6(prefix + label);
597 daniel-mar 2948
      writeOnly(elem, id);
2949
      return id;
2950
    };
2951
    var writeOnly = function (elem, uid) {
637 daniel-mar 2952
      Object.defineProperty(elem.dom, idAttr, {
597 daniel-mar 2953
        value: uid,
2954
        writable: true
2955
      });
2956
    };
2957
    var read$1 = function (elem) {
637 daniel-mar 2958
      var id = isElement$2(elem) ? elem.dom[idAttr] : null;
597 daniel-mar 2959
      return Optional.from(id);
2960
    };
637 daniel-mar 2961
    var generate$5 = function (prefix) {
2962
      return generate$6(prefix);
597 daniel-mar 2963
    };
2964
 
637 daniel-mar 2965
    var make$8 = identity$1;
597 daniel-mar 2966
 
2967
    var NoContextApi = function (getComp) {
637 daniel-mar 2968
      var getMessage = function (event) {
2969
        return 'The component must be in a context to execute: ' + event + (getComp ? '\n' + element(getComp().element) + ' is not in context.' : '');
2970
      };
597 daniel-mar 2971
      var fail = function (event) {
2972
        return function () {
637 daniel-mar 2973
          throw new Error(getMessage(event));
597 daniel-mar 2974
        };
2975
      };
637 daniel-mar 2976
      var warn = function (event) {
2977
        return function () {
2978
          console.warn(getMessage(event));
2979
        };
2980
      };
597 daniel-mar 2981
      return {
637 daniel-mar 2982
        debugInfo: constant$1('fake'),
2983
        triggerEvent: warn('triggerEvent'),
2984
        triggerFocus: warn('triggerFocus'),
2985
        triggerEscape: warn('triggerEscape'),
2986
        broadcast: warn('broadcast'),
2987
        broadcastOn: warn('broadcastOn'),
2988
        broadcastEvent: warn('broadcastEvent'),
597 daniel-mar 2989
        build: fail('build'),
2990
        addToWorld: fail('addToWorld'),
2991
        removeFromWorld: fail('removeFromWorld'),
2992
        addToGui: fail('addToGui'),
2993
        removeFromGui: fail('removeFromGui'),
2994
        getByUid: fail('getByUid'),
2995
        getByDom: fail('getByDom'),
2996
        isConnected: never
2997
      };
2998
    };
637 daniel-mar 2999
    var singleton$1 = NoContextApi();
597 daniel-mar 3000
 
3001
    var markAsBehaviourApi = function (f, apiName, apiFunction) {
3002
      var delegate = apiFunction.toString();
3003
      var endIndex = delegate.indexOf(')') + 1;
3004
      var openBracketIndex = delegate.indexOf('(');
3005
      var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/);
3006
      f.toFunctionAnnotation = function () {
3007
        return {
3008
          name: apiName,
3009
          parameters: cleanParameters(parameters.slice(0, 1).concat(parameters.slice(3)))
3010
        };
3011
      };
3012
      return f;
3013
    };
3014
    var cleanParameters = function (parameters) {
637 daniel-mar 3015
      return map$2(parameters, function (p) {
597 daniel-mar 3016
        return endsWith(p, '/*') ? p.substring(0, p.length - '/*'.length) : p;
3017
      });
3018
    };
3019
    var markAsExtraApi = function (f, extraName) {
3020
      var delegate = f.toString();
3021
      var endIndex = delegate.indexOf(')') + 1;
3022
      var openBracketIndex = delegate.indexOf('(');
3023
      var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/);
3024
      f.toFunctionAnnotation = function () {
3025
        return {
3026
          name: extraName,
3027
          parameters: cleanParameters(parameters)
3028
        };
3029
      };
3030
      return f;
3031
    };
3032
    var markAsSketchApi = function (f, apiFunction) {
3033
      var delegate = apiFunction.toString();
3034
      var endIndex = delegate.indexOf(')') + 1;
3035
      var openBracketIndex = delegate.indexOf('(');
3036
      var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/);
3037
      f.toFunctionAnnotation = function () {
3038
        return {
3039
          name: 'OVERRIDE',
3040
          parameters: cleanParameters(parameters.slice(1))
3041
        };
3042
      };
3043
      return f;
3044
    };
3045
 
637 daniel-mar 3046
    var premadeTag = generate$6('alloy-premade');
3047
    var premade$1 = function (comp) {
597 daniel-mar 3048
      return wrap$1(premadeTag, comp);
3049
    };
3050
    var getPremade = function (spec) {
637 daniel-mar 3051
      return get$e(spec, premadeTag);
597 daniel-mar 3052
    };
3053
    var makeApi = function (f) {
3054
      return markAsSketchApi(function (component) {
3055
        var rest = [];
3056
        for (var _i = 1; _i < arguments.length; _i++) {
3057
          rest[_i - 1] = arguments[_i];
3058
        }
637 daniel-mar 3059
        return f.apply(void 0, __spreadArray([
597 daniel-mar 3060
          component.getApis(),
3061
          component
679 daniel-mar 3062
        ], rest, false));
597 daniel-mar 3063
      }, f);
3064
    };
3065
 
3066
    var NoState = {
3067
      init: function () {
637 daniel-mar 3068
        return nu$8({ readState: constant$1('No State required') });
597 daniel-mar 3069
      }
3070
    };
637 daniel-mar 3071
    var nu$8 = function (spec) {
597 daniel-mar 3072
      return spec;
3073
    };
3074
 
637 daniel-mar 3075
    var generateFrom$1 = function (spec, all) {
3076
      var schema = map$2(all, function (a) {
597 daniel-mar 3077
        return optionObjOf(a.name(), [
637 daniel-mar 3078
          required$1('config'),
3079
          defaulted('state', NoState)
597 daniel-mar 3080
        ]);
3081
      });
3082
      var validated = asRaw('component.behaviours', objOf(schema), spec.behaviours).fold(function (errInfo) {
3083
        throw new Error(formatError(errInfo) + '\nComplete spec:\n' + JSON.stringify(spec, null, 2));
637 daniel-mar 3084
      }, identity$1);
597 daniel-mar 3085
      return {
3086
        list: all,
679 daniel-mar 3087
        data: map$1(validated, function (optBlobThunk) {
597 daniel-mar 3088
          var output = optBlobThunk.map(function (blob) {
3089
            return {
3090
              config: blob.config,
3091
              state: blob.state.init(blob.config)
3092
            };
3093
          });
637 daniel-mar 3094
          return constant$1(output);
597 daniel-mar 3095
        })
3096
      };
3097
    };
637 daniel-mar 3098
    var getBehaviours$3 = function (bData) {
597 daniel-mar 3099
      return bData.list;
3100
    };
637 daniel-mar 3101
    var getData$2 = function (bData) {
597 daniel-mar 3102
      return bData.data;
3103
    };
3104
 
3105
    var byInnerKey = function (data, tuple) {
3106
      var r = {};
637 daniel-mar 3107
      each(data, function (detail, key) {
3108
        each(detail, function (value, indexKey) {
3109
          var chain = get$e(r, indexKey).getOr([]);
597 daniel-mar 3110
          r[indexKey] = chain.concat([tuple(key, value)]);
3111
        });
3112
      });
3113
      return r;
3114
    };
3115
 
637 daniel-mar 3116
    var nu$7 = function (s) {
597 daniel-mar 3117
      return {
637 daniel-mar 3118
        classes: isUndefined(s.classes) ? [] : s.classes,
3119
        attributes: isUndefined(s.attributes) ? {} : s.attributes,
3120
        styles: isUndefined(s.styles) ? {} : s.styles
597 daniel-mar 3121
      };
3122
    };
637 daniel-mar 3123
    var merge = function (defnA, mod) {
597 daniel-mar 3124
      return __assign(__assign({}, defnA), {
3125
        attributes: __assign(__assign({}, defnA.attributes), mod.attributes),
3126
        styles: __assign(__assign({}, defnA.styles), mod.styles),
3127
        classes: defnA.classes.concat(mod.classes)
3128
      });
3129
    };
3130
 
637 daniel-mar 3131
    var combine$2 = function (info, baseMod, behaviours, base) {
597 daniel-mar 3132
      var modsByBehaviour = __assign({}, baseMod);
637 daniel-mar 3133
      each$1(behaviours, function (behaviour) {
597 daniel-mar 3134
        modsByBehaviour[behaviour.name()] = behaviour.exhibit(info, base);
3135
      });
3136
      var byAspect = byInnerKey(modsByBehaviour, function (name, modification) {
3137
        return {
3138
          name: name,
3139
          modification: modification
3140
        };
3141
      });
3142
      var combineObjects = function (objects) {
3143
        return foldr(objects, function (b, a) {
3144
          return __assign(__assign({}, a.modification), b);
3145
        }, {});
3146
      };
3147
      var combinedClasses = foldr(byAspect.classes, function (b, a) {
3148
        return a.modification.concat(b);
3149
      }, []);
3150
      var combinedAttributes = combineObjects(byAspect.attributes);
3151
      var combinedStyles = combineObjects(byAspect.styles);
637 daniel-mar 3152
      return nu$7({
597 daniel-mar 3153
        classes: combinedClasses,
3154
        attributes: combinedAttributes,
3155
        styles: combinedStyles
3156
      });
3157
    };
3158
 
3159
    var sortKeys = function (label, keyName, array, order) {
3160
      try {
3161
        var sorted = sort(array, function (a, b) {
3162
          var aKey = a[keyName];
3163
          var bKey = b[keyName];
3164
          var aIndex = order.indexOf(aKey);
3165
          var bIndex = order.indexOf(bKey);
3166
          if (aIndex === -1) {
3167
            throw new Error('The ordering for ' + label + ' does not have an entry for ' + aKey + '.\nOrder specified: ' + JSON.stringify(order, null, 2));
3168
          }
3169
          if (bIndex === -1) {
3170
            throw new Error('The ordering for ' + label + ' does not have an entry for ' + bKey + '.\nOrder specified: ' + JSON.stringify(order, null, 2));
3171
          }
3172
          if (aIndex < bIndex) {
3173
            return -1;
3174
          } else if (bIndex < aIndex) {
3175
            return 1;
3176
          } else {
3177
            return 0;
3178
          }
3179
        });
3180
        return Result.value(sorted);
3181
      } catch (err) {
3182
        return Result.error([err]);
3183
      }
3184
    };
3185
 
3186
    var uncurried = function (handler, purpose) {
3187
      return {
3188
        handler: handler,
3189
        purpose: purpose
3190
      };
3191
    };
3192
    var curried = function (handler, purpose) {
3193
      return {
3194
        cHandler: handler,
3195
        purpose: purpose
3196
      };
3197
    };
3198
    var curryArgs = function (descHandler, extraArgs) {
3199
      return curried(curry.apply(undefined, [descHandler.handler].concat(extraArgs)), descHandler.purpose);
3200
    };
3201
    var getCurried = function (descHandler) {
3202
      return descHandler.cHandler;
3203
    };
3204
 
3205
    var behaviourTuple = function (name, handler) {
3206
      return {
3207
        name: name,
3208
        handler: handler
3209
      };
3210
    };
3211
    var nameToHandlers = function (behaviours, info) {
3212
      var r = {};
637 daniel-mar 3213
      each$1(behaviours, function (behaviour) {
597 daniel-mar 3214
        r[behaviour.name()] = behaviour.handlers(info);
3215
      });
3216
      return r;
3217
    };
3218
    var groupByEvents = function (info, behaviours, base) {
3219
      var behaviourEvents = __assign(__assign({}, base), nameToHandlers(behaviours, info));
3220
      return byInnerKey(behaviourEvents, behaviourTuple);
3221
    };
3222
    var combine$1 = function (info, eventOrder, behaviours, base) {
3223
      var byEventName = groupByEvents(info, behaviours, base);
3224
      return combineGroups(byEventName, eventOrder);
3225
    };
3226
    var assemble = function (rawHandler) {
637 daniel-mar 3227
      var handler = read$2(rawHandler);
597 daniel-mar 3228
      return function (component, simulatedEvent) {
3229
        var rest = [];
3230
        for (var _i = 2; _i < arguments.length; _i++) {
3231
          rest[_i - 2] = arguments[_i];
3232
        }
3233
        var args = [
3234
          component,
3235
          simulatedEvent
3236
        ].concat(rest);
3237
        if (handler.abort.apply(undefined, args)) {
3238
          simulatedEvent.stop();
3239
        } else if (handler.can.apply(undefined, args)) {
3240
          handler.run.apply(undefined, args);
3241
        }
3242
      };
3243
    };
3244
    var missingOrderError = function (eventName, tuples) {
637 daniel-mar 3245
      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 3246
          return c.name;
3247
        }), null, 2)]);
3248
    };
637 daniel-mar 3249
    var fuse = function (tuples, eventOrder, eventName) {
597 daniel-mar 3250
      var order = eventOrder[eventName];
3251
      if (!order) {
3252
        return missingOrderError(eventName, tuples);
3253
      } else {
3254
        return sortKeys('Event: ' + eventName, 'name', tuples, order).map(function (sortedTuples) {
637 daniel-mar 3255
          var handlers = map$2(sortedTuples, function (tuple) {
597 daniel-mar 3256
            return tuple.handler;
3257
          });
637 daniel-mar 3258
          return fuse$1(handlers);
597 daniel-mar 3259
        });
3260
      }
3261
    };
3262
    var combineGroups = function (byEventName, eventOrder) {
3263
      var r = mapToArray(byEventName, function (tuples, eventName) {
637 daniel-mar 3264
        var combined = tuples.length === 1 ? Result.value(tuples[0].handler) : fuse(tuples, eventOrder, eventName);
597 daniel-mar 3265
        return combined.map(function (handler) {
3266
          var assembled = assemble(handler);
637 daniel-mar 3267
          var purpose = tuples.length > 1 ? filter$2(eventOrder[eventName], function (o) {
597 daniel-mar 3268
            return exists(tuples, function (t) {
3269
              return t.name === o;
3270
            });
3271
          }).join(' > ') : tuples[0].name;
3272
          return wrap$1(eventName, uncurried(assembled, purpose));
3273
        });
3274
      });
3275
      return consolidate(r, {});
3276
    };
3277
 
637 daniel-mar 3278
    var _a$2;
597 daniel-mar 3279
    var baseBehaviour = 'alloy.base.behaviour';
637 daniel-mar 3280
    var schema$z = objOf([
3281
      field$1('dom', 'dom', required$2(), objOf([
3282
        required$1('tag'),
3283
        defaulted('styles', {}),
3284
        defaulted('classes', []),
3285
        defaulted('attributes', {}),
3286
        option('value'),
3287
        option('innerHtml')
3288
      ])),
3289
      required$1('components'),
3290
      required$1('uid'),
3291
      defaulted('events', {}),
3292
      defaulted('apis', {}),
3293
      field$1('eventOrder', 'eventOrder', mergeWith((_a$2 = {}, _a$2[execute$5()] = [
3294
        'disabling',
3295
        baseBehaviour,
3296
        'toggling',
3297
        'typeaheadevents'
3298
      ], _a$2[focus$4()] = [
3299
        baseBehaviour,
3300
        'focusing',
3301
        'keying'
3302
      ], _a$2[systemInit()] = [
3303
        baseBehaviour,
3304
        'disabling',
3305
        'toggling',
3306
        'representing'
3307
      ], _a$2[input()] = [
3308
        baseBehaviour,
3309
        'representing',
3310
        'streaming',
3311
        'invalidating'
3312
      ], _a$2[detachedFromDom()] = [
3313
        baseBehaviour,
3314
        'representing',
3315
        'item-events',
3316
        'tooltipping'
3317
      ], _a$2[mousedown()] = [
3318
        'focusing',
3319
        baseBehaviour,
3320
        'item-type-events'
3321
      ], _a$2[touchstart()] = [
3322
        'focusing',
3323
        baseBehaviour,
3324
        'item-type-events'
3325
      ], _a$2[mouseover()] = [
3326
        'item-type-events',
3327
        'tooltipping'
3328
      ], _a$2[receive()] = [
3329
        'receiving',
3330
        'reflecting',
3331
        'tooltipping'
3332
      ], _a$2)), anyValue()),
3333
      option('domModification')
3334
    ]);
597 daniel-mar 3335
    var toInfo = function (spec) {
637 daniel-mar 3336
      return asRaw('custom.definition', schema$z, spec);
597 daniel-mar 3337
    };
3338
    var toDefinition = function (detail) {
3339
      return __assign(__assign({}, detail.dom), {
3340
        uid: detail.uid,
637 daniel-mar 3341
        domChildren: map$2(detail.components, function (comp) {
597 daniel-mar 3342
          return comp.element;
3343
        })
3344
      });
3345
    };
3346
    var toModification = function (detail) {
3347
      return detail.domModification.fold(function () {
637 daniel-mar 3348
        return nu$7({});
3349
      }, nu$7);
597 daniel-mar 3350
    };
3351
    var toEvents = function (info) {
3352
      return info.events;
3353
    };
3354
 
637 daniel-mar 3355
    var read = function (element, attr) {
679 daniel-mar 3356
      var value = get$d(element, attr);
597 daniel-mar 3357
      return value === undefined || value === '' ? [] : value.split(' ');
3358
    };
637 daniel-mar 3359
    var add$4 = function (element, attr, id) {
3360
      var old = read(element, attr);
597 daniel-mar 3361
      var nu = old.concat([id]);
679 daniel-mar 3362
      set$8(element, attr, nu.join(' '));
597 daniel-mar 3363
      return true;
3364
    };
679 daniel-mar 3365
    var remove$4 = function (element, attr, id) {
637 daniel-mar 3366
      var nu = filter$2(read(element, attr), function (v) {
597 daniel-mar 3367
        return v !== id;
3368
      });
3369
      if (nu.length > 0) {
679 daniel-mar 3370
        set$8(element, attr, nu.join(' '));
597 daniel-mar 3371
      } else {
679 daniel-mar 3372
        remove$7(element, attr);
597 daniel-mar 3373
      }
3374
      return false;
3375
    };
3376
 
3377
    var supports = function (element) {
3378
      return element.dom.classList !== undefined;
3379
    };
679 daniel-mar 3380
    var get$6 = function (element) {
637 daniel-mar 3381
      return read(element, 'class');
597 daniel-mar 3382
    };
637 daniel-mar 3383
    var add$3 = function (element, clazz) {
3384
      return add$4(element, 'class', clazz);
597 daniel-mar 3385
    };
679 daniel-mar 3386
    var remove$3 = function (element, clazz) {
3387
      return remove$4(element, 'class', clazz);
597 daniel-mar 3388
    };
3389
 
3390
    var add$2 = function (element, clazz) {
3391
      if (supports(element)) {
3392
        element.dom.classList.add(clazz);
3393
      } else {
637 daniel-mar 3394
        add$3(element, clazz);
597 daniel-mar 3395
      }
3396
    };
3397
    var cleanClass = function (element) {
679 daniel-mar 3398
      var classList = supports(element) ? element.dom.classList : get$6(element);
597 daniel-mar 3399
      if (classList.length === 0) {
679 daniel-mar 3400
        remove$7(element, 'class');
597 daniel-mar 3401
      }
3402
    };
679 daniel-mar 3403
    var remove$2 = function (element, clazz) {
597 daniel-mar 3404
      if (supports(element)) {
3405
        var classList = element.dom.classList;
3406
        classList.remove(clazz);
3407
      } else {
679 daniel-mar 3408
        remove$3(element, clazz);
597 daniel-mar 3409
      }
3410
      cleanClass(element);
3411
    };
637 daniel-mar 3412
    var has = function (element, clazz) {
597 daniel-mar 3413
      return supports(element) && element.dom.classList.contains(clazz);
3414
    };
3415
 
637 daniel-mar 3416
    var add$1 = function (element, classes) {
3417
      each$1(classes, function (x) {
597 daniel-mar 3418
        add$2(element, x);
3419
      });
3420
    };
679 daniel-mar 3421
    var remove$1 = function (element, classes) {
637 daniel-mar 3422
      each$1(classes, function (x) {
679 daniel-mar 3423
        remove$2(element, x);
597 daniel-mar 3424
      });
3425
    };
637 daniel-mar 3426
    var hasAll = function (element, classes) {
3427
      return forall(classes, function (clazz) {
3428
        return has(element, clazz);
3429
      });
3430
    };
597 daniel-mar 3431
 
679 daniel-mar 3432
    var get$5 = function (element) {
597 daniel-mar 3433
      return element.dom.value;
3434
    };
679 daniel-mar 3435
    var set$4 = function (element, value) {
597 daniel-mar 3436
      if (value === undefined) {
3437
        throw new Error('Value.set was undefined');
3438
      }
3439
      element.dom.value = value;
3440
    };
3441
 
3442
    var renderToDom = function (definition) {
3443
      var subject = SugarElement.fromTag(definition.tag);
637 daniel-mar 3444
      setAll$1(subject, definition.attributes);
3445
      add$1(subject, definition.classes);
3446
      setAll(subject, definition.styles);
597 daniel-mar 3447
      definition.innerHtml.each(function (html) {
679 daniel-mar 3448
        return set$5(subject, html);
597 daniel-mar 3449
      });
3450
      var children = definition.domChildren;
3451
      append$1(subject, children);
3452
      definition.value.each(function (value) {
679 daniel-mar 3453
        set$4(subject, value);
597 daniel-mar 3454
      });
3455
      if (!definition.uid) {
3456
        debugger;
3457
      }
3458
      writeOnly(subject, definition.uid);
3459
      return subject;
3460
    };
3461
 
637 daniel-mar 3462
    var getBehaviours$2 = function (spec) {
3463
      var behaviours = get$e(spec, 'behaviours').getOr({});
679 daniel-mar 3464
      return bind$3(keys(behaviours), function (name) {
3465
        var behaviour = behaviours[name];
3466
        return isNonNullable(behaviour) ? [behaviour.me] : [];
597 daniel-mar 3467
      });
3468
    };
637 daniel-mar 3469
    var generateFrom = function (spec, all) {
3470
      return generateFrom$1(spec, all);
3471
    };
3472
    var generate$4 = function (spec) {
3473
      var all = getBehaviours$2(spec);
597 daniel-mar 3474
      return generateFrom(spec, all);
3475
    };
3476
 
3477
    var getDomDefinition = function (info, bList, bData) {
3478
      var definition = toDefinition(info);
3479
      var infoModification = toModification(info);
3480
      var baseModification = { 'alloy.base.modification': infoModification };
637 daniel-mar 3481
      var modification = bList.length > 0 ? combine$2(bData, baseModification, bList, definition) : infoModification;
3482
      return merge(definition, modification);
597 daniel-mar 3483
    };
3484
    var getEvents = function (info, bList, bData) {
3485
      var baseEvents = { 'alloy.base.behaviour': toEvents(info) };
3486
      return combine$1(bData, info.eventOrder, bList, baseEvents).getOrDie();
3487
    };
637 daniel-mar 3488
    var build$2 = function (spec) {
597 daniel-mar 3489
      var getMe = function () {
3490
        return me;
3491
      };
637 daniel-mar 3492
      var systemApi = Cell(singleton$1);
597 daniel-mar 3493
      var info = getOrDie(toInfo(spec));
637 daniel-mar 3494
      var bBlob = generate$4(spec);
3495
      var bList = getBehaviours$3(bBlob);
3496
      var bData = getData$2(bBlob);
597 daniel-mar 3497
      var modDefinition = getDomDefinition(info, bList, bData);
3498
      var item = renderToDom(modDefinition);
3499
      var events = getEvents(info, bList, bData);
3500
      var subcomponents = Cell(info.components);
3501
      var connect = function (newApi) {
3502
        systemApi.set(newApi);
3503
      };
3504
      var disconnect = function () {
3505
        systemApi.set(NoContextApi(getMe));
3506
      };
3507
      var syncComponents = function () {
3508
        var children$1 = children(item);
637 daniel-mar 3509
        var subs = bind$3(children$1, function (child) {
597 daniel-mar 3510
          return systemApi.get().getByDom(child).fold(function () {
3511
            return [];
637 daniel-mar 3512
          }, pure$2);
597 daniel-mar 3513
        });
3514
        subcomponents.set(subs);
3515
      };
3516
      var config = function (behaviour) {
3517
        var b = bData;
3518
        var f = isFunction(b[behaviour.name()]) ? b[behaviour.name()] : function () {
3519
          throw new Error('Could not find ' + behaviour.name() + ' in ' + JSON.stringify(spec, null, 2));
3520
        };
3521
        return f();
3522
      };
3523
      var hasConfigured = function (behaviour) {
3524
        return isFunction(bData[behaviour.name()]);
3525
      };
3526
      var getApis = function () {
3527
        return info.apis;
3528
      };
3529
      var readState = function (behaviourName) {
3530
        return bData[behaviourName]().map(function (b) {
3531
          return b.state.readState();
3532
        }).getOr('not enabled');
3533
      };
3534
      var me = {
637 daniel-mar 3535
        uid: spec.uid,
597 daniel-mar 3536
        getSystem: systemApi.get,
3537
        config: config,
3538
        hasConfigured: hasConfigured,
3539
        spec: spec,
3540
        readState: readState,
3541
        getApis: getApis,
3542
        connect: connect,
3543
        disconnect: disconnect,
3544
        element: item,
3545
        syncComponents: syncComponents,
3546
        components: subcomponents.get,
3547
        events: events
3548
      };
3549
      return me;
3550
    };
3551
 
3552
    var buildSubcomponents = function (spec) {
637 daniel-mar 3553
      var components = get$e(spec, 'components').getOr([]);
3554
      return map$2(components, build$1);
597 daniel-mar 3555
    };
3556
    var buildFromSpec = function (userSpec) {
637 daniel-mar 3557
      var _a = make$8(userSpec), specEvents = _a.events, spec = __rest(_a, ['events']);
597 daniel-mar 3558
      var components = buildSubcomponents(spec);
3559
      var completeSpec = __assign(__assign({}, spec), {
3560
        events: __assign(__assign({}, DefaultEvents), specEvents),
3561
        components: components
3562
      });
637 daniel-mar 3563
      return Result.value(build$2(completeSpec));
597 daniel-mar 3564
    };
3565
    var text = function (textContent) {
3566
      var element = SugarElement.fromText(textContent);
637 daniel-mar 3567
      return external$2({ element: element });
597 daniel-mar 3568
    };
637 daniel-mar 3569
    var external$2 = function (spec) {
3570
      var extSpec = asRawOrDie$1('external.component', objOfOnly([
3571
        required$1('element'),
597 daniel-mar 3572
        option('uid')
3573
      ]), spec);
3574
      var systemApi = Cell(NoContextApi());
3575
      var connect = function (newApi) {
3576
        systemApi.set(newApi);
3577
      };
3578
      var disconnect = function () {
3579
        systemApi.set(NoContextApi(function () {
3580
          return me;
3581
        }));
3582
      };
637 daniel-mar 3583
      var uid = extSpec.uid.getOrThunk(function () {
3584
        return generate$5('external');
597 daniel-mar 3585
      });
637 daniel-mar 3586
      writeOnly(extSpec.element, uid);
597 daniel-mar 3587
      var me = {
637 daniel-mar 3588
        uid: uid,
597 daniel-mar 3589
        getSystem: systemApi.get,
3590
        config: Optional.none,
3591
        hasConfigured: never,
3592
        connect: connect,
3593
        disconnect: disconnect,
3594
        getApis: function () {
3595
          return {};
3596
        },
3597
        element: extSpec.element,
3598
        spec: spec,
637 daniel-mar 3599
        readState: constant$1('No state'),
597 daniel-mar 3600
        syncComponents: noop,
637 daniel-mar 3601
        components: constant$1([]),
597 daniel-mar 3602
        events: {}
3603
      };
637 daniel-mar 3604
      return premade$1(me);
597 daniel-mar 3605
    };
637 daniel-mar 3606
    var uids = generate$5;
3607
    var isSketchSpec$1 = function (spec) {
3608
      return has$2(spec, 'uid');
3609
    };
597 daniel-mar 3610
    var build$1 = function (spec) {
637 daniel-mar 3611
      return getPremade(spec).getOrThunk(function () {
3612
        var userSpecWithUid = isSketchSpec$1(spec) ? spec : __assign({ uid: uids('') }, spec);
597 daniel-mar 3613
        return buildFromSpec(userSpecWithUid).getOrDie();
3614
      });
3615
    };
637 daniel-mar 3616
    var premade = premade$1;
597 daniel-mar 3617
 
3618
    function ClosestOrAncestor (is, ancestor, scope, a, isRoot) {
3619
      if (is(scope, a)) {
3620
        return Optional.some(scope);
3621
      } else if (isFunction(isRoot) && isRoot(scope)) {
3622
        return Optional.none();
3623
      } else {
3624
        return ancestor(scope, a, isRoot);
3625
      }
3626
    }
3627
 
3628
    var ancestor$1 = function (scope, predicate, isRoot) {
3629
      var element = scope.dom;
3630
      var stop = isFunction(isRoot) ? isRoot : never;
3631
      while (element.parentNode) {
3632
        element = element.parentNode;
3633
        var el = SugarElement.fromDom(element);
3634
        if (predicate(el)) {
3635
          return Optional.some(el);
3636
        } else if (stop(el)) {
3637
          break;
3638
        }
3639
      }
3640
      return Optional.none();
3641
    };
637 daniel-mar 3642
    var closest$3 = function (scope, predicate, isRoot) {
597 daniel-mar 3643
      var is = function (s, test) {
3644
        return test(s);
3645
      };
3646
      return ClosestOrAncestor(is, ancestor$1, scope, predicate, isRoot);
3647
    };
637 daniel-mar 3648
    var child$1 = function (scope, predicate) {
3649
      var pred = function (node) {
3650
        return predicate(SugarElement.fromDom(node));
3651
      };
3652
      var result = find$5(scope.dom.childNodes, pred);
3653
      return result.map(SugarElement.fromDom);
3654
    };
3655
    var descendant$1 = function (scope, predicate) {
597 daniel-mar 3656
      var descend = function (node) {
3657
        for (var i = 0; i < node.childNodes.length; i++) {
3658
          var child_1 = SugarElement.fromDom(node.childNodes[i]);
3659
          if (predicate(child_1)) {
3660
            return Optional.some(child_1);
3661
          }
3662
          var res = descend(node.childNodes[i]);
3663
          if (res.isSome()) {
3664
            return res;
3665
          }
3666
        }
3667
        return Optional.none();
3668
      };
3669
      return descend(scope.dom);
3670
    };
3671
 
3672
    var closest$2 = function (scope, predicate, isRoot) {
637 daniel-mar 3673
      return closest$3(scope, predicate, isRoot).isSome();
597 daniel-mar 3674
    };
3675
 
637 daniel-mar 3676
    var ancestor = function (scope, selector, isRoot) {
597 daniel-mar 3677
      return ancestor$1(scope, function (e) {
679 daniel-mar 3678
        return is(e, selector);
597 daniel-mar 3679
      }, isRoot);
3680
    };
637 daniel-mar 3681
    var child = function (scope, selector) {
3682
      return child$1(scope, function (e) {
679 daniel-mar 3683
        return is(e, selector);
637 daniel-mar 3684
      });
3685
    };
3686
    var descendant = function (scope, selector) {
597 daniel-mar 3687
      return one(selector, scope);
3688
    };
637 daniel-mar 3689
    var closest$1 = function (scope, selector, isRoot) {
679 daniel-mar 3690
      var is$1 = function (element, selector) {
3691
        return is(element, selector);
597 daniel-mar 3692
      };
679 daniel-mar 3693
      return ClosestOrAncestor(is$1, ancestor, scope, selector, isRoot);
597 daniel-mar 3694
    };
3695
 
637 daniel-mar 3696
    var find$1 = function (queryElem) {
3697
      var dependent = closest$3(queryElem, function (elem) {
3698
        if (!isElement$2(elem)) {
597 daniel-mar 3699
          return false;
3700
        }
679 daniel-mar 3701
        var id = get$d(elem, 'id');
597 daniel-mar 3702
        return id !== undefined && id.indexOf('aria-owns') > -1;
3703
      });
3704
      return dependent.bind(function (dep) {
679 daniel-mar 3705
        var id = get$d(dep, 'id');
597 daniel-mar 3706
        var dos = getRootNode(dep);
637 daniel-mar 3707
        return descendant(dos, '[aria-owns="' + id + '"]');
597 daniel-mar 3708
      });
3709
    };
3710
    var manager = function () {
637 daniel-mar 3711
      var ariaId = generate$6('aria-owns');
597 daniel-mar 3712
      var link = function (elem) {
679 daniel-mar 3713
        set$8(elem, 'aria-owns', ariaId);
597 daniel-mar 3714
      };
3715
      var unlink = function (elem) {
679 daniel-mar 3716
        remove$7(elem, 'aria-owns');
597 daniel-mar 3717
      };
3718
      return {
3719
        id: ariaId,
3720
        link: link,
3721
        unlink: unlink
3722
      };
3723
    };
3724
 
3725
    var isAriaPartOf = function (component, queryElem) {
637 daniel-mar 3726
      return find$1(queryElem).exists(function (owner) {
3727
        return isPartOf$1(component, owner);
597 daniel-mar 3728
      });
3729
    };
637 daniel-mar 3730
    var isPartOf$1 = function (component, queryElem) {
597 daniel-mar 3731
      return closest$2(queryElem, function (el) {
637 daniel-mar 3732
        return eq(el, component.element);
597 daniel-mar 3733
      }, never) || isAriaPartOf(component, queryElem);
3734
    };
3735
 
637 daniel-mar 3736
    var unknown = 'unknown';
597 daniel-mar 3737
    var EventConfiguration;
3738
    (function (EventConfiguration) {
3739
      EventConfiguration[EventConfiguration['STOP'] = 0] = 'STOP';
3740
      EventConfiguration[EventConfiguration['NORMAL'] = 1] = 'NORMAL';
3741
      EventConfiguration[EventConfiguration['LOGGING'] = 2] = 'LOGGING';
3742
    }(EventConfiguration || (EventConfiguration = {})));
3743
    var eventConfig = Cell({});
3744
    var makeEventLogger = function (eventName, initialTarget) {
3745
      var sequence = [];
3746
      var startTime = new Date().getTime();
3747
      return {
3748
        logEventCut: function (_name, target, purpose) {
3749
          sequence.push({
3750
            outcome: 'cut',
3751
            target: target,
3752
            purpose: purpose
3753
          });
3754
        },
3755
        logEventStopped: function (_name, target, purpose) {
3756
          sequence.push({
3757
            outcome: 'stopped',
3758
            target: target,
3759
            purpose: purpose
3760
          });
3761
        },
3762
        logNoParent: function (_name, target, purpose) {
3763
          sequence.push({
3764
            outcome: 'no-parent',
3765
            target: target,
3766
            purpose: purpose
3767
          });
3768
        },
3769
        logEventNoHandlers: function (_name, target) {
3770
          sequence.push({
3771
            outcome: 'no-handlers-left',
3772
            target: target
3773
          });
3774
        },
3775
        logEventResponse: function (_name, target, purpose) {
3776
          sequence.push({
3777
            outcome: 'response',
3778
            purpose: purpose,
3779
            target: target
3780
          });
3781
        },
3782
        write: function () {
3783
          var finishTime = new Date().getTime();
637 daniel-mar 3784
          if (contains$2([
597 daniel-mar 3785
              'mousemove',
3786
              'mouseover',
3787
              'mouseout',
3788
              systemInit()
3789
            ], eventName)) {
3790
            return;
3791
          }
3792
          console.log(eventName, {
3793
            event: eventName,
3794
            time: finishTime - startTime,
3795
            target: initialTarget.dom,
637 daniel-mar 3796
            sequence: map$2(sequence, function (s) {
3797
              if (!contains$2([
597 daniel-mar 3798
                  'cut',
3799
                  'stopped',
3800
                  'response'
3801
                ], s.outcome)) {
3802
                return s.outcome;
3803
              } else {
3804
                return '{' + s.purpose + '} ' + s.outcome + ' at (' + element(s.target) + ')';
3805
              }
3806
            })
3807
          });
3808
        }
3809
      };
3810
    };
3811
    var processEvent = function (eventName, initialTarget, f) {
637 daniel-mar 3812
      var status = get$e(eventConfig.get(), eventName).orThunk(function () {
597 daniel-mar 3813
        var patterns = keys(eventConfig.get());
3814
        return findMap(patterns, function (p) {
3815
          return eventName.indexOf(p) > -1 ? Optional.some(eventConfig.get()[p]) : Optional.none();
3816
        });
3817
      }).getOr(EventConfiguration.NORMAL);
3818
      switch (status) {
3819
      case EventConfiguration.NORMAL:
3820
        return f(noLogger());
3821
      case EventConfiguration.LOGGING: {
3822
          var logger = makeEventLogger(eventName, initialTarget);
3823
          var output = f(logger);
3824
          logger.write();
3825
          return output;
3826
        }
3827
      case EventConfiguration.STOP:
3828
        return true;
3829
      }
3830
    };
3831
    var path = [
3832
      'alloy/data/Fields',
3833
      'alloy/debugging/Debugging'
3834
    ];
3835
    var getTrace = function () {
3836
      var err = new Error();
3837
      if (err.stack !== undefined) {
3838
        var lines = err.stack.split('\n');
637 daniel-mar 3839
        return find$5(lines, function (line) {
597 daniel-mar 3840
          return line.indexOf('alloy') > 0 && !exists(path, function (p) {
3841
            return line.indexOf(p) > -1;
3842
          });
637 daniel-mar 3843
        }).getOr(unknown);
597 daniel-mar 3844
      } else {
637 daniel-mar 3845
        return unknown;
597 daniel-mar 3846
      }
3847
    };
3848
    var ignoreEvent = {
3849
      logEventCut: noop,
3850
      logEventStopped: noop,
3851
      logNoParent: noop,
3852
      logEventNoHandlers: noop,
3853
      logEventResponse: noop,
3854
      write: noop
3855
    };
3856
    var monitorEvent = function (eventName, initialTarget, f) {
3857
      return processEvent(eventName, initialTarget, f);
3858
    };
637 daniel-mar 3859
    var noLogger = constant$1(ignoreEvent);
597 daniel-mar 3860
 
637 daniel-mar 3861
    var menuFields = constant$1([
3862
      required$1('menu'),
3863
      required$1('selectedMenu')
597 daniel-mar 3864
    ]);
637 daniel-mar 3865
    var itemFields = constant$1([
3866
      required$1('item'),
3867
      required$1('selectedItem')
597 daniel-mar 3868
    ]);
637 daniel-mar 3869
    constant$1(objOf(itemFields().concat(menuFields())));
3870
    var itemSchema$3 = constant$1(objOf(itemFields()));
597 daniel-mar 3871
 
637 daniel-mar 3872
    var _initSize = requiredObjOf('initSize', [
3873
      required$1('numColumns'),
3874
      required$1('numRows')
597 daniel-mar 3875
    ]);
3876
    var itemMarkers = function () {
637 daniel-mar 3877
      return requiredOf('markers', itemSchema$3());
597 daniel-mar 3878
    };
3879
    var tieredMenuMarkers = function () {
637 daniel-mar 3880
      return requiredObjOf('markers', [required$1('backgroundMenu')].concat(menuFields()).concat(itemFields()));
597 daniel-mar 3881
    };
637 daniel-mar 3882
    var markers$1 = function (required) {
3883
      return requiredObjOf('markers', map$2(required, required$1));
597 daniel-mar 3884
    };
3885
    var onPresenceHandler = function (label, fieldName, presence) {
637 daniel-mar 3886
      getTrace();
3887
      return field$1(fieldName, fieldName, presence, valueOf(function (f) {
597 daniel-mar 3888
        return Result.value(function () {
3889
          var args = [];
3890
          for (var _i = 0; _i < arguments.length; _i++) {
3891
            args[_i] = arguments[_i];
3892
          }
3893
          return f.apply(undefined, args);
3894
        });
3895
      }));
3896
    };
3897
    var onHandler = function (fieldName) {
637 daniel-mar 3898
      return onPresenceHandler('onHandler', fieldName, defaulted$1(noop));
597 daniel-mar 3899
    };
3900
    var onKeyboardHandler = function (fieldName) {
637 daniel-mar 3901
      return onPresenceHandler('onKeyboardHandler', fieldName, defaulted$1(Optional.none));
597 daniel-mar 3902
    };
3903
    var onStrictHandler = function (fieldName) {
637 daniel-mar 3904
      return onPresenceHandler('onHandler', fieldName, required$2());
597 daniel-mar 3905
    };
3906
    var onStrictKeyboardHandler = function (fieldName) {
637 daniel-mar 3907
      return onPresenceHandler('onKeyboardHandler', fieldName, required$2());
597 daniel-mar 3908
    };
637 daniel-mar 3909
    var output$1 = function (name, value) {
3910
      return customField(name, constant$1(value));
597 daniel-mar 3911
    };
3912
    var snapshot = function (name) {
637 daniel-mar 3913
      return customField(name, identity$1);
597 daniel-mar 3914
    };
637 daniel-mar 3915
    var initSize = constant$1(_initSize);
597 daniel-mar 3916
 
637 daniel-mar 3917
    var nu$6 = function (x, y, bubble, direction, placement, boundsRestriction, labelPrefix, alwaysFit) {
3918
      if (alwaysFit === void 0) {
3919
        alwaysFit = false;
3920
      }
597 daniel-mar 3921
      return {
3922
        x: x,
3923
        y: y,
3924
        bubble: bubble,
3925
        direction: direction,
637 daniel-mar 3926
        placement: placement,
3927
        restriction: boundsRestriction,
3928
        label: labelPrefix + '-' + placement,
3929
        alwaysFit: alwaysFit
597 daniel-mar 3930
      };
3931
    };
3932
 
637 daniel-mar 3933
    var adt$a = Adt.generate([
597 daniel-mar 3934
      { southeast: [] },
3935
      { southwest: [] },
3936
      { northeast: [] },
3937
      { northwest: [] },
3938
      { south: [] },
3939
      { north: [] },
3940
      { east: [] },
3941
      { west: [] }
3942
    ]);
637 daniel-mar 3943
    var cata$2 = function (subject, southeast, southwest, northeast, northwest, south, north, east, west) {
597 daniel-mar 3944
      return subject.fold(southeast, southwest, northeast, northwest, south, north, east, west);
3945
    };
3946
    var cataVertical = function (subject, south, middle, north) {
3947
      return subject.fold(south, south, north, north, south, north, middle, middle);
3948
    };
3949
    var cataHorizontal = function (subject, east, middle, west) {
3950
      return subject.fold(east, west, east, west, middle, middle, east, west);
3951
    };
637 daniel-mar 3952
    var southeast$3 = adt$a.southeast;
3953
    var southwest$3 = adt$a.southwest;
3954
    var northeast$3 = adt$a.northeast;
3955
    var northwest$3 = adt$a.northwest;
3956
    var south$3 = adt$a.south;
3957
    var north$3 = adt$a.north;
3958
    var east$3 = adt$a.east;
3959
    var west$3 = adt$a.west;
597 daniel-mar 3960
 
637 daniel-mar 3961
    var cycleBy = function (value, delta, min, max) {
3962
      var r = value + delta;
3963
      if (r > max) {
3964
        return min;
3965
      } else if (r < min) {
3966
        return max;
3967
      } else {
3968
        return r;
3969
      }
3970
    };
3971
    var clamp$1 = function (value, min, max) {
3972
      return Math.min(Math.max(value, min), max);
3973
    };
3974
 
597 daniel-mar 3975
    var getRestriction = function (anchor, restriction) {
3976
      switch (restriction) {
3977
      case 1:
3978
        return anchor.x;
3979
      case 0:
3980
        return anchor.x + anchor.width;
3981
      case 2:
3982
        return anchor.y;
3983
      case 3:
3984
        return anchor.y + anchor.height;
3985
      }
3986
    };
3987
    var boundsRestriction = function (anchor, restrictions) {
3988
      return mapToObject([
3989
        'left',
3990
        'right',
3991
        'top',
3992
        'bottom'
3993
      ], function (dir) {
637 daniel-mar 3994
        return get$e(restrictions, dir).map(function (restriction) {
597 daniel-mar 3995
          return getRestriction(anchor, restriction);
3996
        });
3997
      });
3998
    };
637 daniel-mar 3999
    var adjustBounds = function (bounds$1, restriction, bubbleOffset) {
597 daniel-mar 4000
      var applyRestriction = function (dir, current) {
637 daniel-mar 4001
        return restriction[dir].map(function (pos) {
4002
          var isVerticalAxis = dir === 'top' || dir === 'bottom';
4003
          var offset = isVerticalAxis ? bubbleOffset.top : bubbleOffset.left;
4004
          var comparator = dir === 'left' || dir === 'top' ? Math.max : Math.min;
4005
          var newPos = comparator(pos, current) + offset;
4006
          return isVerticalAxis ? clamp$1(newPos, bounds$1.y, bounds$1.bottom) : clamp$1(newPos, bounds$1.x, bounds$1.right);
597 daniel-mar 4007
        }).getOr(current);
4008
      };
637 daniel-mar 4009
      var adjustedLeft = applyRestriction('left', bounds$1.x);
4010
      var adjustedTop = applyRestriction('top', bounds$1.y);
4011
      var adjustedRight = applyRestriction('right', bounds$1.right);
4012
      var adjustedBottom = applyRestriction('bottom', bounds$1.bottom);
4013
      return bounds(adjustedLeft, adjustedTop, adjustedRight - adjustedLeft, adjustedBottom - adjustedTop);
597 daniel-mar 4014
    };
4015
 
637 daniel-mar 4016
    var labelPrefix$2 = 'layout';
4017
    var eastX$1 = function (anchor) {
597 daniel-mar 4018
      return anchor.x;
4019
    };
637 daniel-mar 4020
    var middleX$1 = function (anchor, element) {
597 daniel-mar 4021
      return anchor.x + anchor.width / 2 - element.width / 2;
4022
    };
637 daniel-mar 4023
    var westX$1 = function (anchor, element) {
597 daniel-mar 4024
      return anchor.x + anchor.width - element.width;
4025
    };
637 daniel-mar 4026
    var northY$2 = function (anchor, element) {
597 daniel-mar 4027
      return anchor.y - element.height;
4028
    };
637 daniel-mar 4029
    var southY$2 = function (anchor) {
597 daniel-mar 4030
      return anchor.y + anchor.height;
4031
    };
637 daniel-mar 4032
    var centreY$1 = function (anchor, element) {
597 daniel-mar 4033
      return anchor.y + anchor.height / 2 - element.height / 2;
4034
    };
637 daniel-mar 4035
    var eastEdgeX$1 = function (anchor) {
597 daniel-mar 4036
      return anchor.x + anchor.width;
4037
    };
637 daniel-mar 4038
    var westEdgeX$1 = function (anchor, element) {
597 daniel-mar 4039
      return anchor.x - element.width;
4040
    };
637 daniel-mar 4041
    var southeast$2 = function (anchor, element, bubbles) {
4042
      return nu$6(eastX$1(anchor), southY$2(anchor), bubbles.southeast(), southeast$3(), 'southeast', boundsRestriction(anchor, {
597 daniel-mar 4043
        left: 1,
4044
        top: 3
637 daniel-mar 4045
      }), labelPrefix$2);
597 daniel-mar 4046
    };
637 daniel-mar 4047
    var southwest$2 = function (anchor, element, bubbles) {
4048
      return nu$6(westX$1(anchor, element), southY$2(anchor), bubbles.southwest(), southwest$3(), 'southwest', boundsRestriction(anchor, {
597 daniel-mar 4049
        right: 0,
4050
        top: 3
637 daniel-mar 4051
      }), labelPrefix$2);
597 daniel-mar 4052
    };
637 daniel-mar 4053
    var northeast$2 = function (anchor, element, bubbles) {
4054
      return nu$6(eastX$1(anchor), northY$2(anchor, element), bubbles.northeast(), northeast$3(), 'northeast', boundsRestriction(anchor, {
597 daniel-mar 4055
        left: 1,
4056
        bottom: 2
637 daniel-mar 4057
      }), labelPrefix$2);
597 daniel-mar 4058
    };
637 daniel-mar 4059
    var northwest$2 = function (anchor, element, bubbles) {
4060
      return nu$6(westX$1(anchor, element), northY$2(anchor, element), bubbles.northwest(), northwest$3(), 'northwest', boundsRestriction(anchor, {
597 daniel-mar 4061
        right: 0,
4062
        bottom: 2
637 daniel-mar 4063
      }), labelPrefix$2);
597 daniel-mar 4064
    };
637 daniel-mar 4065
    var north$2 = function (anchor, element, bubbles) {
4066
      return nu$6(middleX$1(anchor, element), northY$2(anchor, element), bubbles.north(), north$3(), 'north', boundsRestriction(anchor, { bottom: 2 }), labelPrefix$2);
597 daniel-mar 4067
    };
637 daniel-mar 4068
    var south$2 = function (anchor, element, bubbles) {
4069
      return nu$6(middleX$1(anchor, element), southY$2(anchor), bubbles.south(), south$3(), 'south', boundsRestriction(anchor, { top: 3 }), labelPrefix$2);
597 daniel-mar 4070
    };
637 daniel-mar 4071
    var east$2 = function (anchor, element, bubbles) {
4072
      return nu$6(eastEdgeX$1(anchor), centreY$1(anchor, element), bubbles.east(), east$3(), 'east', boundsRestriction(anchor, { left: 0 }), labelPrefix$2);
597 daniel-mar 4073
    };
637 daniel-mar 4074
    var west$2 = function (anchor, element, bubbles) {
4075
      return nu$6(westEdgeX$1(anchor, element), centreY$1(anchor, element), bubbles.west(), west$3(), 'west', boundsRestriction(anchor, { right: 1 }), labelPrefix$2);
597 daniel-mar 4076
    };
637 daniel-mar 4077
    var all$1 = function () {
597 daniel-mar 4078
      return [
637 daniel-mar 4079
        southeast$2,
4080
        southwest$2,
4081
        northeast$2,
4082
        northwest$2,
4083
        south$2,
4084
        north$2,
4085
        east$2,
4086
        west$2
597 daniel-mar 4087
      ];
4088
    };
637 daniel-mar 4089
    var allRtl$1 = function () {
597 daniel-mar 4090
      return [
637 daniel-mar 4091
        southwest$2,
4092
        southeast$2,
4093
        northwest$2,
4094
        northeast$2,
4095
        south$2,
4096
        north$2,
4097
        east$2,
4098
        west$2
597 daniel-mar 4099
      ];
4100
    };
4101
    var aboveOrBelow = function () {
4102
      return [
637 daniel-mar 4103
        northeast$2,
4104
        northwest$2,
4105
        southeast$2,
4106
        southwest$2,
4107
        north$2,
4108
        south$2
597 daniel-mar 4109
      ];
4110
    };
4111
    var aboveOrBelowRtl = function () {
4112
      return [
637 daniel-mar 4113
        northwest$2,
4114
        northeast$2,
4115
        southwest$2,
4116
        southeast$2,
4117
        north$2,
4118
        south$2
597 daniel-mar 4119
      ];
4120
    };
4121
    var belowOrAbove = function () {
4122
      return [
637 daniel-mar 4123
        southeast$2,
4124
        southwest$2,
4125
        northeast$2,
4126
        northwest$2,
4127
        south$2,
4128
        north$2
597 daniel-mar 4129
      ];
4130
    };
4131
    var belowOrAboveRtl = function () {
4132
      return [
637 daniel-mar 4133
        southwest$2,
4134
        southeast$2,
4135
        northwest$2,
4136
        northeast$2,
4137
        south$2,
4138
        north$2
597 daniel-mar 4139
      ];
4140
    };
4141
 
4142
    var chooseChannels = function (channels, message) {
637 daniel-mar 4143
      return message.universal ? channels : filter$2(channels, function (ch) {
4144
        return contains$2(message.channels, ch);
597 daniel-mar 4145
      });
4146
    };
637 daniel-mar 4147
    var events$h = function (receiveConfig) {
4148
      return derive$2([run$1(receive(), function (component, message) {
597 daniel-mar 4149
          var channelMap = receiveConfig.channels;
4150
          var channels = keys(channelMap);
4151
          var receivingData = message;
4152
          var targetChannels = chooseChannels(channels, receivingData);
637 daniel-mar 4153
          each$1(targetChannels, function (ch) {
597 daniel-mar 4154
            var channelInfo = channelMap[ch];
4155
            var channelSchema = channelInfo.schema;
637 daniel-mar 4156
            var data = asRawOrDie$1('channel[' + ch + '] data\nReceiver: ' + element(component.element), channelSchema, receivingData.data);
597 daniel-mar 4157
            channelInfo.onReceive(component, data);
4158
          });
4159
        })]);
4160
    };
4161
 
4162
    var ActiveReceiving = /*#__PURE__*/Object.freeze({
4163
        __proto__: null,
637 daniel-mar 4164
        events: events$h
597 daniel-mar 4165
    });
4166
 
637 daniel-mar 4167
    var ReceivingSchema = [requiredOf('channels', setOf(Result.value, objOfOnly([
597 daniel-mar 4168
        onStrictHandler('onReceive'),
637 daniel-mar 4169
        defaulted('schema', anyValue())
597 daniel-mar 4170
      ])))];
4171
 
4172
    var executeEvent = function (bConfig, bState, executor) {
637 daniel-mar 4173
      return runOnExecute$1(function (component) {
597 daniel-mar 4174
        executor(component, bConfig, bState);
4175
      });
4176
    };
4177
    var loadEvent = function (bConfig, bState, f) {
4178
      return runOnInit(function (component, _simulatedEvent) {
4179
        f(component, bConfig, bState);
4180
      });
4181
    };
637 daniel-mar 4182
    var create$8 = function (schema, name, active, apis, extra, state) {
597 daniel-mar 4183
      var configSchema = objOfOnly(schema);
4184
      var schemaSchema = optionObjOf(name, [optionObjOfOnly('config', schema)]);
4185
      return doCreate(configSchema, schemaSchema, name, active, apis, extra, state);
4186
    };
637 daniel-mar 4187
    var createModes$1 = function (modes, name, active, apis, extra, state) {
597 daniel-mar 4188
      var configSchema = modes;
4189
      var schemaSchema = optionObjOf(name, [optionOf('config', modes)]);
4190
      return doCreate(configSchema, schemaSchema, name, active, apis, extra, state);
4191
    };
4192
    var wrapApi = function (bName, apiFunction, apiName) {
4193
      var f = function (component) {
4194
        var rest = [];
4195
        for (var _i = 1; _i < arguments.length; _i++) {
4196
          rest[_i - 1] = arguments[_i];
4197
        }
4198
        var args = [component].concat(rest);
637 daniel-mar 4199
        return component.config({ name: constant$1(bName) }).fold(function () {
597 daniel-mar 4200
          throw new Error('We could not find any behaviour configuration for: ' + bName + '. Using API: ' + apiName);
4201
        }, function (info) {
4202
          var rest = Array.prototype.slice.call(args, 1);
4203
          return apiFunction.apply(undefined, [
4204
            component,
4205
            info.config,
4206
            info.state
4207
          ].concat(rest));
4208
        });
4209
      };
4210
      return markAsBehaviourApi(f, apiName, apiFunction);
4211
    };
4212
    var revokeBehaviour = function (name) {
4213
      return {
4214
        key: name,
4215
        value: undefined
4216
      };
4217
    };
4218
    var doCreate = function (configSchema, schemaSchema, name, active, apis, extra, state) {
4219
      var getConfig = function (info) {
4220
        return hasNonNullableKey(info, name) ? info[name]() : Optional.none();
4221
      };
679 daniel-mar 4222
      var wrappedApis = map$1(apis, function (apiF, apiName) {
597 daniel-mar 4223
        return wrapApi(name, apiF, apiName);
4224
      });
679 daniel-mar 4225
      var wrappedExtra = map$1(extra, function (extraF, extraName) {
597 daniel-mar 4226
        return markAsExtraApi(extraF, extraName);
4227
      });
4228
      var me = __assign(__assign(__assign({}, wrappedExtra), wrappedApis), {
4229
        revoke: curry(revokeBehaviour, name),
4230
        config: function (spec) {
637 daniel-mar 4231
          var prepared = asRawOrDie$1(name + '-config', configSchema, spec);
597 daniel-mar 4232
          return {
4233
            key: name,
4234
            value: {
4235
              config: prepared,
4236
              me: me,
4237
              configAsRaw: cached(function () {
637 daniel-mar 4238
                return asRawOrDie$1(name + '-config', configSchema, spec);
597 daniel-mar 4239
              }),
4240
              initialConfig: spec,
4241
              state: state
4242
            }
4243
          };
4244
        },
637 daniel-mar 4245
        schema: constant$1(schemaSchema),
597 daniel-mar 4246
        exhibit: function (info, base) {
637 daniel-mar 4247
          return lift2(getConfig(info), get$e(active, 'exhibit'), function (behaviourInfo, exhibitor) {
4248
            return exhibitor(base, behaviourInfo.config, behaviourInfo.state);
4249
          }).getOrThunk(function () {
4250
            return nu$7({});
4251
          });
597 daniel-mar 4252
        },
637 daniel-mar 4253
        name: constant$1(name),
597 daniel-mar 4254
        handlers: function (info) {
4255
          return getConfig(info).map(function (behaviourInfo) {
637 daniel-mar 4256
            var getEvents = get$e(active, 'events').getOr(function () {
597 daniel-mar 4257
              return {};
4258
            });
4259
            return getEvents(behaviourInfo.config, behaviourInfo.state);
4260
          }).getOr({});
4261
        }
4262
      });
4263
      return me;
4264
    };
4265
 
4266
    var derive$1 = function (capabilities) {
637 daniel-mar 4267
      return wrapAll(capabilities);
597 daniel-mar 4268
    };
4269
    var simpleSchema = objOfOnly([
637 daniel-mar 4270
      required$1('fields'),
4271
      required$1('name'),
4272
      defaulted('active', {}),
4273
      defaulted('apis', {}),
4274
      defaulted('state', NoState),
4275
      defaulted('extra', {})
597 daniel-mar 4276
    ]);
637 daniel-mar 4277
    var create$7 = function (data) {
4278
      var value = asRawOrDie$1('Creating behaviour: ' + data.name, simpleSchema, data);
4279
      return create$8(value.fields, value.name, value.active, value.apis, value.extra, value.state);
597 daniel-mar 4280
    };
4281
    var modeSchema = objOfOnly([
637 daniel-mar 4282
      required$1('branchKey'),
4283
      required$1('branches'),
4284
      required$1('name'),
4285
      defaulted('active', {}),
4286
      defaulted('apis', {}),
4287
      defaulted('state', NoState),
4288
      defaulted('extra', {})
597 daniel-mar 4289
    ]);
637 daniel-mar 4290
    var createModes = function (data) {
4291
      var value = asRawOrDie$1('Creating behaviour: ' + data.name, modeSchema, data);
4292
      return createModes$1(choose$1(value.branchKey, value.branches), value.name, value.active, value.apis, value.extra, value.state);
597 daniel-mar 4293
    };
637 daniel-mar 4294
    var revoke = constant$1(undefined);
597 daniel-mar 4295
 
637 daniel-mar 4296
    var Receiving = create$7({
597 daniel-mar 4297
      fields: ReceivingSchema,
4298
      name: 'receiving',
4299
      active: ActiveReceiving
4300
    });
4301
 
637 daniel-mar 4302
    var exhibit$6 = function (base, posConfig) {
4303
      return nu$7({
597 daniel-mar 4304
        classes: [],
4305
        styles: posConfig.useFixed() ? {} : { position: 'relative' }
4306
      });
4307
    };
4308
 
4309
    var ActivePosition = /*#__PURE__*/Object.freeze({
4310
        __proto__: null,
637 daniel-mar 4311
        exhibit: exhibit$6
597 daniel-mar 4312
    });
4313
 
4314
    var getDocument = function () {
4315
      return SugarElement.fromDom(document);
4316
    };
4317
 
637 daniel-mar 4318
    var focus$3 = function (element) {
597 daniel-mar 4319
      return element.dom.focus();
4320
    };
637 daniel-mar 4321
    var blur$1 = function (element) {
597 daniel-mar 4322
      return element.dom.blur();
4323
    };
4324
    var hasFocus = function (element) {
4325
      var root = getRootNode(element).dom;
4326
      return element.dom === root.activeElement;
4327
    };
4328
    var active = function (root) {
4329
      if (root === void 0) {
4330
        root = getDocument();
4331
      }
4332
      return Optional.from(root.dom.activeElement).map(SugarElement.fromDom);
4333
    };
4334
    var search = function (element) {
4335
      return active(getRootNode(element)).filter(function (e) {
4336
        return element.dom.contains(e.dom);
4337
      });
4338
    };
4339
 
637 daniel-mar 4340
    var preserve$1 = function (f, container) {
597 daniel-mar 4341
      var dos = getRootNode(container);
4342
      var refocus = active(dos).bind(function (focused) {
4343
        var hasFocus = function (elem) {
637 daniel-mar 4344
          return eq(focused, elem);
597 daniel-mar 4345
        };
637 daniel-mar 4346
        return hasFocus(container) ? Optional.some(container) : descendant$1(container, hasFocus);
597 daniel-mar 4347
      });
4348
      var result = f(container);
4349
      refocus.each(function (oldFocus) {
4350
        active(dos).filter(function (newFocus) {
637 daniel-mar 4351
          return eq(newFocus, oldFocus);
597 daniel-mar 4352
        }).fold(function () {
637 daniel-mar 4353
          focus$3(oldFocus);
597 daniel-mar 4354
        }, noop);
4355
      });
4356
      return result;
4357
    };
4358
 
4359
    var NuPositionCss = function (position, left, top, right, bottom) {
637 daniel-mar 4360
      var toPx = function (num) {
4361
        return num + 'px';
4362
      };
597 daniel-mar 4363
      return {
4364
        position: position,
637 daniel-mar 4365
        left: left.map(toPx),
4366
        top: top.map(toPx),
4367
        right: right.map(toPx),
4368
        bottom: bottom.map(toPx)
597 daniel-mar 4369
      };
4370
    };
637 daniel-mar 4371
    var toOptions = function (position) {
4372
      return __assign(__assign({}, position), { position: Optional.some(position.position) });
4373
    };
597 daniel-mar 4374
    var applyPositionCss = function (element, position) {
637 daniel-mar 4375
      setOptions(element, toOptions(position));
597 daniel-mar 4376
    };
4377
 
637 daniel-mar 4378
    var adt$9 = Adt.generate([
597 daniel-mar 4379
      { none: [] },
4380
      {
4381
        relative: [
4382
          'x',
4383
          'y',
4384
          'width',
4385
          'height'
4386
        ]
4387
      },
4388
      {
4389
        fixed: [
4390
          'x',
4391
          'y',
4392
          'width',
4393
          'height'
4394
        ]
4395
      }
4396
    ]);
4397
    var positionWithDirection = function (posName, decision, x, y, width, height) {
637 daniel-mar 4398
      var decisionRect = decision.rect;
4399
      var decisionX = decisionRect.x - x;
4400
      var decisionY = decisionRect.y - y;
4401
      var decisionWidth = decisionRect.width;
4402
      var decisionHeight = decisionRect.height;
597 daniel-mar 4403
      var decisionRight = width - (decisionX + decisionWidth);
4404
      var decisionBottom = height - (decisionY + decisionHeight);
4405
      var left = Optional.some(decisionX);
4406
      var top = Optional.some(decisionY);
4407
      var right = Optional.some(decisionRight);
4408
      var bottom = Optional.some(decisionBottom);
4409
      var none = Optional.none();
637 daniel-mar 4410
      return cata$2(decision.direction, function () {
597 daniel-mar 4411
        return NuPositionCss(posName, left, top, none, none);
4412
      }, function () {
4413
        return NuPositionCss(posName, none, top, right, none);
4414
      }, function () {
4415
        return NuPositionCss(posName, left, none, none, bottom);
4416
      }, function () {
4417
        return NuPositionCss(posName, none, none, right, bottom);
4418
      }, function () {
4419
        return NuPositionCss(posName, left, top, none, none);
4420
      }, function () {
4421
        return NuPositionCss(posName, left, none, none, bottom);
4422
      }, function () {
4423
        return NuPositionCss(posName, left, top, none, none);
4424
      }, function () {
4425
        return NuPositionCss(posName, none, top, right, none);
4426
      });
4427
    };
4428
    var reposition = function (origin, decision) {
4429
      return origin.fold(function () {
637 daniel-mar 4430
        var decisionRect = decision.rect;
4431
        return NuPositionCss('absolute', Optional.some(decisionRect.x), Optional.some(decisionRect.y), Optional.none(), Optional.none());
597 daniel-mar 4432
      }, function (x, y, width, height) {
4433
        return positionWithDirection('absolute', decision, x, y, width, height);
4434
      }, function (x, y, width, height) {
4435
        return positionWithDirection('fixed', decision, x, y, width, height);
4436
      });
4437
    };
4438
    var toBox = function (origin, element) {
637 daniel-mar 4439
      var rel = curry(find$2, element);
597 daniel-mar 4440
      var position = origin.fold(rel, rel, function () {
679 daniel-mar 4441
        var scroll = get$9();
637 daniel-mar 4442
        return find$2(element).translate(-scroll.left, -scroll.top);
597 daniel-mar 4443
      });
679 daniel-mar 4444
      var width = getOuter$1(element);
4445
      var height = getOuter$2(element);
637 daniel-mar 4446
      return bounds(position.left, position.top, width, height);
597 daniel-mar 4447
    };
637 daniel-mar 4448
    var viewport = function (origin, getBounds) {
597 daniel-mar 4449
      return getBounds.fold(function () {
637 daniel-mar 4450
        return origin.fold(win, win, bounds);
597 daniel-mar 4451
      }, function (b) {
4452
        return origin.fold(b, b, function () {
637 daniel-mar 4453
          var bounds$1 = b();
4454
          var pos = translate$2(origin, bounds$1.x, bounds$1.y);
4455
          return bounds(pos.left, pos.top, bounds$1.width, bounds$1.height);
597 daniel-mar 4456
        });
4457
      });
4458
    };
637 daniel-mar 4459
    var translate$2 = function (origin, x, y) {
597 daniel-mar 4460
      var pos = SugarPosition(x, y);
4461
      var removeScroll = function () {
679 daniel-mar 4462
        var outerScroll = get$9();
597 daniel-mar 4463
        return pos.translate(-outerScroll.left, -outerScroll.top);
4464
      };
637 daniel-mar 4465
      return origin.fold(constant$1(pos), constant$1(pos), removeScroll);
597 daniel-mar 4466
    };
4467
    var cata$1 = function (subject, onNone, onRelative, onFixed) {
4468
      return subject.fold(onNone, onRelative, onFixed);
4469
    };
637 daniel-mar 4470
    adt$9.none;
4471
    var relative$1 = adt$9.relative;
4472
    var fixed$1 = adt$9.fixed;
597 daniel-mar 4473
 
4474
    var anchor = function (anchorBox, origin) {
4475
      return {
4476
        anchorBox: anchorBox,
4477
        origin: origin
4478
      };
4479
    };
637 daniel-mar 4480
    var box = function (anchorBox, origin) {
597 daniel-mar 4481
      return anchor(anchorBox, origin);
4482
    };
4483
 
637 daniel-mar 4484
    var placementAttribute = 'data-alloy-placement';
4485
    var setPlacement$1 = function (element, placement) {
679 daniel-mar 4486
      set$8(element, placementAttribute, placement);
597 daniel-mar 4487
    };
637 daniel-mar 4488
    var getPlacement = function (element) {
4489
      return getOpt(element, placementAttribute);
597 daniel-mar 4490
    };
637 daniel-mar 4491
    var reset$2 = function (element) {
679 daniel-mar 4492
      return remove$7(element, placementAttribute);
637 daniel-mar 4493
    };
597 daniel-mar 4494
 
637 daniel-mar 4495
    var adt$8 = Adt.generate([
597 daniel-mar 4496
      { fit: ['reposition'] },
4497
      {
4498
        nofit: [
4499
          'reposition',
637 daniel-mar 4500
          'visibleW',
4501
          'visibleH',
4502
          'isVisible'
597 daniel-mar 4503
        ]
4504
      }
4505
    ]);
637 daniel-mar 4506
    var determinePosition = function (box, bounds) {
4507
      var boundsX = bounds.x, boundsY = bounds.y, boundsRight = bounds.right, boundsBottom = bounds.bottom;
4508
      var x = box.x, y = box.y, right = box.right, bottom = box.bottom, width = box.width, height = box.height;
4509
      var xInBounds = x >= boundsX && x <= boundsRight;
4510
      var yInBounds = y >= boundsY && y <= boundsBottom;
597 daniel-mar 4511
      var originInBounds = xInBounds && yInBounds;
637 daniel-mar 4512
      var rightInBounds = right <= boundsRight && right >= boundsX;
4513
      var bottomInBounds = bottom <= boundsBottom && bottom >= boundsY;
4514
      var sizeInBounds = rightInBounds && bottomInBounds;
4515
      var visibleW = Math.min(width, x >= boundsX ? boundsRight - x : right - boundsX);
4516
      var visibleH = Math.min(height, y >= boundsY ? boundsBottom - y : bottom - boundsY);
597 daniel-mar 4517
      return {
4518
        originInBounds: originInBounds,
4519
        sizeInBounds: sizeInBounds,
637 daniel-mar 4520
        visibleW: visibleW,
4521
        visibleH: visibleH
597 daniel-mar 4522
      };
4523
    };
637 daniel-mar 4524
    var calcReposition = function (box, bounds$1) {
4525
      var boundsX = bounds$1.x, boundsY = bounds$1.y, boundsRight = bounds$1.right, boundsBottom = bounds$1.bottom;
4526
      var x = box.x, y = box.y, width = box.width, height = box.height;
4527
      var maxX = Math.max(boundsX, boundsRight - width);
4528
      var maxY = Math.max(boundsY, boundsBottom - height);
4529
      var restrictedX = clamp$1(x, boundsX, maxX);
4530
      var restrictedY = clamp$1(y, boundsY, maxY);
4531
      var restrictedWidth = Math.min(restrictedX + width, boundsRight) - restrictedX;
4532
      var restrictedHeight = Math.min(restrictedY + height, boundsBottom) - restrictedY;
4533
      return bounds(restrictedX, restrictedY, restrictedWidth, restrictedHeight);
4534
    };
4535
    var calcMaxSizes = function (direction, box, bounds) {
4536
      var upAvailable = constant$1(box.bottom - bounds.y);
4537
      var downAvailable = constant$1(bounds.bottom - box.y);
4538
      var maxHeight = cataVertical(direction, downAvailable, downAvailable, upAvailable);
4539
      var westAvailable = constant$1(box.right - bounds.x);
4540
      var eastAvailable = constant$1(bounds.right - box.x);
4541
      var maxWidth = cataHorizontal(direction, eastAvailable, eastAvailable, westAvailable);
4542
      return {
4543
        maxWidth: maxWidth,
4544
        maxHeight: maxHeight
4545
      };
4546
    };
4547
    var attempt = function (candidate, width, height, bounds$1) {
4548
      var bubble = candidate.bubble;
4549
      var bubbleOffset = bubble.offset;
4550
      var adjustedBounds = adjustBounds(bounds$1, candidate.restriction, bubbleOffset);
4551
      var newX = candidate.x + bubbleOffset.left;
4552
      var newY = candidate.y + bubbleOffset.top;
4553
      var box = bounds(newX, newY, width, height);
4554
      var _a = determinePosition(box, adjustedBounds), originInBounds = _a.originInBounds, sizeInBounds = _a.sizeInBounds, visibleW = _a.visibleW, visibleH = _a.visibleH;
4555
      var fits = originInBounds && sizeInBounds;
4556
      var fittedBox = fits ? box : calcReposition(box, adjustedBounds);
4557
      var isPartlyVisible = fittedBox.width > 0 && fittedBox.height > 0;
4558
      var _b = calcMaxSizes(candidate.direction, fittedBox, bounds$1), maxWidth = _b.maxWidth, maxHeight = _b.maxHeight;
597 daniel-mar 4559
      var reposition = {
637 daniel-mar 4560
        rect: fittedBox,
597 daniel-mar 4561
        maxHeight: maxHeight,
4562
        maxWidth: maxWidth,
4563
        direction: candidate.direction,
637 daniel-mar 4564
        placement: candidate.placement,
597 daniel-mar 4565
        classes: {
637 daniel-mar 4566
          on: bubble.classesOn,
4567
          off: bubble.classesOff
597 daniel-mar 4568
        },
637 daniel-mar 4569
        layout: candidate.label,
4570
        testY: newY
597 daniel-mar 4571
      };
637 daniel-mar 4572
      return fits || candidate.alwaysFit ? adt$8.fit(reposition) : adt$8.nofit(reposition, visibleW, visibleH, isPartlyVisible);
597 daniel-mar 4573
    };
637 daniel-mar 4574
    var attempts = function (element, candidates, anchorBox, elementBox, bubbles, bounds) {
597 daniel-mar 4575
      var panelWidth = elementBox.width;
4576
      var panelHeight = elementBox.height;
637 daniel-mar 4577
      var attemptBestFit = function (layout, reposition, visibleW, visibleH, isVisible) {
4578
        var next = layout(anchorBox, elementBox, bubbles, element, bounds);
597 daniel-mar 4579
        var attemptLayout = attempt(next, panelWidth, panelHeight, bounds);
637 daniel-mar 4580
        return attemptLayout.fold(constant$1(attemptLayout), function (newReposition, newVisibleW, newVisibleH, newIsVisible) {
4581
          var improved = isVisible === newIsVisible ? newVisibleH > visibleH || newVisibleW > visibleW : !isVisible && newIsVisible;
4582
          return improved ? attemptLayout : adt$8.nofit(reposition, visibleW, visibleH, isVisible);
597 daniel-mar 4583
        });
4584
      };
4585
      var abc = foldl(candidates, function (b, a) {
4586
        var bestNext = curry(attemptBestFit, a);
637 daniel-mar 4587
        return b.fold(constant$1(b), bestNext);
4588
      }, adt$8.nofit({
4589
        rect: anchorBox,
597 daniel-mar 4590
        maxHeight: elementBox.height,
4591
        maxWidth: elementBox.width,
637 daniel-mar 4592
        direction: southeast$3(),
4593
        placement: 'southeast',
597 daniel-mar 4594
        classes: {
4595
          on: [],
4596
          off: []
4597
        },
637 daniel-mar 4598
        layout: 'none',
4599
        testY: anchorBox.y
4600
      }, -1, -1, false));
4601
      return abc.fold(identity$1, identity$1);
597 daniel-mar 4602
    };
4603
 
637 daniel-mar 4604
    var singleton = function (doRevoke) {
4605
      var subject = Cell(Optional.none());
4606
      var revoke = function () {
4607
        return subject.get().each(doRevoke);
4608
      };
4609
      var clear = function () {
4610
        revoke();
4611
        subject.set(Optional.none());
4612
      };
4613
      var isSet = function () {
4614
        return subject.get().isSome();
4615
      };
4616
      var get = function () {
4617
        return subject.get();
4618
      };
4619
      var set = function (s) {
4620
        revoke();
4621
        subject.set(Optional.some(s));
4622
      };
4623
      return {
4624
        clear: clear,
4625
        isSet: isSet,
4626
        get: get,
4627
        set: set
4628
      };
4629
    };
4630
    var destroyable = function () {
4631
      return singleton(function (s) {
4632
        return s.destroy();
4633
      });
4634
    };
4635
    var unbindable = function () {
4636
      return singleton(function (s) {
4637
        return s.unbind();
4638
      });
4639
    };
679 daniel-mar 4640
    var api$1 = function () {
4641
      var subject = destroyable();
4642
      var run = function (f) {
4643
        return subject.get().each(f);
4644
      };
4645
      return __assign(__assign({}, subject), { run: run });
4646
    };
637 daniel-mar 4647
    var value$1 = function () {
4648
      var subject = singleton(noop);
4649
      var on = function (f) {
4650
        return subject.get().each(f);
4651
      };
4652
      return __assign(__assign({}, subject), { on: on });
4653
    };
4654
 
4655
    var filter = always;
4656
    var bind = function (element, event, handler) {
679 daniel-mar 4657
      return bind$2(element, event, filter, handler);
637 daniel-mar 4658
    };
4659
    var capture = function (element, event, handler) {
4660
      return capture$1(element, event, filter, handler);
4661
    };
4662
    var fromRawEvent = fromRawEvent$1;
4663
 
4664
    var properties = [
4665
      'top',
4666
      'bottom',
4667
      'right',
4668
      'left'
4669
    ];
4670
    var timerAttr = 'data-alloy-transition-timer';
4671
    var isTransitioning$1 = function (element, transition) {
4672
      return hasAll(element, transition.classes);
4673
    };
4674
    var shouldApplyTransitionCss = function (transition, decision, lastPlacement) {
4675
      return lastPlacement.exists(function (placer) {
4676
        var mode = transition.mode;
4677
        return mode === 'all' ? true : placer[mode] !== decision[mode];
4678
      });
4679
    };
4680
    var hasChanges = function (position, intermediate) {
4681
      var round = function (value) {
679 daniel-mar 4682
        return parseFloat(value).toFixed(3);
637 daniel-mar 4683
      };
4684
      return find$4(intermediate, function (value, key) {
4685
        var newValue = position[key].map(round);
4686
        var val = value.map(round);
4687
        return !equals(newValue, val);
4688
      }).isSome();
4689
    };
4690
    var getTransitionDuration = function (element) {
4691
      var get = function (name) {
679 daniel-mar 4692
        var style = get$c(element, name);
637 daniel-mar 4693
        var times = isString(style) ? style.split(/\s*,\s*/) : [];
4694
        return filter$2(times, isNotEmpty);
4695
      };
4696
      var parse = function (value) {
4697
        if (isString(value) && /^[\d.]+/.test(value)) {
4698
          var num = parseFloat(value);
4699
          return endsWith(value, 'ms') ? num : num * 1000;
4700
        } else {
4701
          return 0;
4702
        }
4703
      };
4704
      var delay = get('transition-delay');
4705
      var duration = get('transition-duration');
4706
      return foldl(duration, function (acc, dur, i) {
4707
        var time = parse(delay[i]) + parse(dur);
4708
        return Math.max(acc, time);
4709
      }, 0);
4710
    };
4711
    var setupTransitionListeners = function (element, transition) {
4712
      var transitionEnd = unbindable();
4713
      var transitionCancel = unbindable();
4714
      var timer;
4715
      var isSourceTransition = function (e) {
4716
        var _a;
4717
        var pseudoElement = (_a = e.raw.pseudoElement) !== null && _a !== void 0 ? _a : '';
4718
        return eq(e.target, element) && isEmpty(pseudoElement) && contains$2(properties, e.raw.propertyName);
4719
      };
4720
      var transitionDone = function (e) {
4721
        if (isNullable(e) || isSourceTransition(e)) {
4722
          transitionEnd.clear();
4723
          transitionCancel.clear();
4724
          var type = e === null || e === void 0 ? void 0 : e.raw.type;
4725
          if (isNullable(type) || type === transitionend()) {
4726
            clearTimeout(timer);
679 daniel-mar 4727
            remove$7(element, timerAttr);
4728
            remove$1(element, transition.classes);
637 daniel-mar 4729
          }
4730
        }
4731
      };
4732
      var transitionStarted = function () {
4733
        transitionEnd.set(bind(element, transitionend(), transitionDone));
4734
        transitionCancel.set(bind(element, transitioncancel(), transitionDone));
4735
      };
4736
      if ('ontransitionstart' in element.dom) {
4737
        var transitionStart_1 = bind(element, transitionstart(), function (e) {
4738
          if (isSourceTransition(e)) {
4739
            transitionStart_1.unbind();
4740
            transitionStarted();
4741
          }
4742
        });
4743
      } else {
4744
        transitionStarted();
4745
      }
4746
      var duration = getTransitionDuration(element);
4747
      requestAnimationFrame(function () {
4748
        timer = setTimeout(transitionDone, duration + 17);
679 daniel-mar 4749
        set$8(element, timerAttr, timer);
637 daniel-mar 4750
      });
4751
    };
4752
    var startTransitioning = function (element, transition) {
4753
      add$1(element, transition.classes);
4754
      getOpt(element, timerAttr).each(function (timerId) {
4755
        clearTimeout(parseInt(timerId, 10));
679 daniel-mar 4756
        remove$7(element, timerAttr);
637 daniel-mar 4757
      });
4758
      setupTransitionListeners(element, transition);
4759
    };
4760
    var applyTransitionCss = function (element, origin, position, transition, decision, lastPlacement) {
4761
      var shouldTransition = shouldApplyTransitionCss(transition, decision, lastPlacement);
4762
      if (shouldTransition || isTransitioning$1(element, transition)) {
679 daniel-mar 4763
        set$7(element, 'position', position.position);
637 daniel-mar 4764
        var rect = toBox(origin, element);
4765
        var intermediatePosition_1 = reposition(origin, __assign(__assign({}, decision), { rect: rect }));
4766
        var intermediateCssOptions = mapToObject(properties, function (prop) {
4767
          return intermediatePosition_1[prop];
4768
        });
4769
        if (hasChanges(position, intermediateCssOptions)) {
4770
          setOptions(element, intermediateCssOptions);
4771
          if (shouldTransition) {
4772
            startTransitioning(element, transition);
4773
          }
4774
          reflow(element);
4775
        }
4776
      } else {
679 daniel-mar 4777
        remove$1(element, transition.classes);
637 daniel-mar 4778
      }
4779
    };
4780
 
597 daniel-mar 4781
    var elementSize = function (p) {
4782
      return {
679 daniel-mar 4783
        width: getOuter$1(p),
4784
        height: getOuter$2(p)
597 daniel-mar 4785
      };
4786
    };
4787
    var layout = function (anchorBox, element, bubbles, options) {
679 daniel-mar 4788
      remove$6(element, 'max-height');
4789
      remove$6(element, 'max-width');
597 daniel-mar 4790
      var elementBox = elementSize(element);
637 daniel-mar 4791
      return attempts(element, options.preference, anchorBox, elementBox, bubbles, options.bounds);
597 daniel-mar 4792
    };
4793
    var setClasses = function (element, decision) {
4794
      var classInfo = decision.classes;
679 daniel-mar 4795
      remove$1(element, classInfo.off);
637 daniel-mar 4796
      add$1(element, classInfo.on);
597 daniel-mar 4797
    };
4798
    var setHeight = function (element, decision, options) {
4799
      var maxHeightFunction = options.maxHeightFunction;
4800
      maxHeightFunction(element, decision.maxHeight);
4801
    };
4802
    var setWidth = function (element, decision, options) {
4803
      var maxWidthFunction = options.maxWidthFunction;
4804
      maxWidthFunction(element, decision.maxWidth);
4805
    };
637 daniel-mar 4806
    var position$2 = function (element, decision, options) {
4807
      var positionCss = reposition(options.origin, decision);
4808
      options.transition.each(function (transition) {
4809
        applyTransitionCss(element, options.origin, positionCss, transition, decision, options.lastPlacement);
4810
      });
4811
      applyPositionCss(element, positionCss);
597 daniel-mar 4812
    };
637 daniel-mar 4813
    var setPlacement = function (element, decision) {
4814
      setPlacement$1(element, decision.placement);
4815
    };
597 daniel-mar 4816
 
4817
    var setMaxHeight = function (element, maxHeight) {
637 daniel-mar 4818
      setMax$1(element, Math.floor(maxHeight));
597 daniel-mar 4819
    };
637 daniel-mar 4820
    var anchored = constant$1(function (element, available) {
597 daniel-mar 4821
      setMaxHeight(element, available);
637 daniel-mar 4822
      setAll(element, {
597 daniel-mar 4823
        'overflow-x': 'hidden',
4824
        'overflow-y': 'auto'
4825
      });
4826
    });
637 daniel-mar 4827
    var expandable$1 = constant$1(function (element, available) {
597 daniel-mar 4828
      setMaxHeight(element, available);
4829
    });
4830
 
4831
    var defaultOr = function (options, key, dephault) {
4832
      return options[key] === undefined ? dephault : options[key];
4833
    };
637 daniel-mar 4834
    var simple = function (anchor, element, bubble, layouts, lastPlacement, getBounds, overrideOptions, transition) {
597 daniel-mar 4835
      var maxHeightFunction = defaultOr(overrideOptions, 'maxHeightFunction', anchored());
4836
      var maxWidthFunction = defaultOr(overrideOptions, 'maxWidthFunction', noop);
4837
      var anchorBox = anchor.anchorBox;
4838
      var origin = anchor.origin;
4839
      var options = {
637 daniel-mar 4840
        bounds: viewport(origin, getBounds),
597 daniel-mar 4841
        origin: origin,
4842
        preference: layouts,
4843
        maxHeightFunction: maxHeightFunction,
637 daniel-mar 4844
        maxWidthFunction: maxWidthFunction,
4845
        lastPlacement: lastPlacement,
4846
        transition: transition
597 daniel-mar 4847
      };
637 daniel-mar 4848
      return go(anchorBox, element, bubble, options);
597 daniel-mar 4849
    };
4850
    var go = function (anchorBox, element, bubble, options) {
4851
      var decision = layout(anchorBox, element, bubble, options);
637 daniel-mar 4852
      position$2(element, decision, options);
4853
      setPlacement(element, decision);
597 daniel-mar 4854
      setClasses(element, decision);
4855
      setHeight(element, decision, options);
4856
      setWidth(element, decision, options);
637 daniel-mar 4857
      return {
4858
        layout: decision.layout,
4859
        placement: decision.placement
4860
      };
597 daniel-mar 4861
    };
4862
 
4863
    var allAlignments = [
4864
      'valignCentre',
4865
      'alignLeft',
4866
      'alignRight',
4867
      'alignCentre',
4868
      'top',
4869
      'bottom',
4870
      'left',
637 daniel-mar 4871
      'right',
4872
      'inset'
597 daniel-mar 4873
    ];
637 daniel-mar 4874
    var nu$5 = function (xOffset, yOffset, classes, insetModifier) {
4875
      if (insetModifier === void 0) {
4876
        insetModifier = 1;
4877
      }
4878
      var insetXOffset = xOffset * insetModifier;
4879
      var insetYOffset = yOffset * insetModifier;
597 daniel-mar 4880
      var getClasses = function (prop) {
637 daniel-mar 4881
        return get$e(classes, prop).getOr([]);
597 daniel-mar 4882
      };
4883
      var make = function (xDelta, yDelta, alignmentsOn) {
4884
        var alignmentsOff = difference(allAlignments, alignmentsOn);
4885
        return {
4886
          offset: SugarPosition(xDelta, yDelta),
637 daniel-mar 4887
          classesOn: bind$3(alignmentsOn, getClasses),
4888
          classesOff: bind$3(alignmentsOff, getClasses)
597 daniel-mar 4889
        };
4890
      };
4891
      return {
4892
        southeast: function () {
637 daniel-mar 4893
          return make(-xOffset, yOffset, [
597 daniel-mar 4894
            'top',
4895
            'alignLeft'
4896
          ]);
4897
        },
4898
        southwest: function () {
637 daniel-mar 4899
          return make(xOffset, yOffset, [
597 daniel-mar 4900
            'top',
4901
            'alignRight'
4902
          ]);
4903
        },
4904
        south: function () {
637 daniel-mar 4905
          return make(-xOffset / 2, yOffset, [
597 daniel-mar 4906
            'top',
4907
            'alignCentre'
4908
          ]);
4909
        },
4910
        northeast: function () {
637 daniel-mar 4911
          return make(-xOffset, -yOffset, [
597 daniel-mar 4912
            'bottom',
4913
            'alignLeft'
4914
          ]);
4915
        },
4916
        northwest: function () {
637 daniel-mar 4917
          return make(xOffset, -yOffset, [
597 daniel-mar 4918
            'bottom',
4919
            'alignRight'
4920
          ]);
4921
        },
4922
        north: function () {
637 daniel-mar 4923
          return make(-xOffset / 2, -yOffset, [
597 daniel-mar 4924
            'bottom',
4925
            'alignCentre'
4926
          ]);
4927
        },
4928
        east: function () {
637 daniel-mar 4929
          return make(xOffset, -yOffset / 2, [
597 daniel-mar 4930
            'valignCentre',
4931
            'left'
4932
          ]);
4933
        },
4934
        west: function () {
637 daniel-mar 4935
          return make(-xOffset, -yOffset / 2, [
597 daniel-mar 4936
            'valignCentre',
4937
            'right'
4938
          ]);
4939
        },
637 daniel-mar 4940
        insetNortheast: function () {
4941
          return make(insetXOffset, insetYOffset, [
597 daniel-mar 4942
            'top',
637 daniel-mar 4943
            'alignLeft',
4944
            'inset'
597 daniel-mar 4945
          ]);
4946
        },
637 daniel-mar 4947
        insetNorthwest: function () {
4948
          return make(-insetXOffset, insetYOffset, [
597 daniel-mar 4949
            'top',
637 daniel-mar 4950
            'alignRight',
4951
            'inset'
597 daniel-mar 4952
          ]);
4953
        },
637 daniel-mar 4954
        insetNorth: function () {
4955
          return make(-insetXOffset / 2, insetYOffset, [
597 daniel-mar 4956
            'top',
637 daniel-mar 4957
            'alignCentre',
4958
            'inset'
597 daniel-mar 4959
          ]);
4960
        },
637 daniel-mar 4961
        insetSoutheast: function () {
4962
          return make(insetXOffset, -insetYOffset, [
597 daniel-mar 4963
            'bottom',
637 daniel-mar 4964
            'alignLeft',
4965
            'inset'
597 daniel-mar 4966
          ]);
4967
        },
637 daniel-mar 4968
        insetSouthwest: function () {
4969
          return make(-insetXOffset, -insetYOffset, [
597 daniel-mar 4970
            'bottom',
637 daniel-mar 4971
            'alignRight',
4972
            'inset'
597 daniel-mar 4973
          ]);
4974
        },
637 daniel-mar 4975
        insetSouth: function () {
4976
          return make(-insetXOffset / 2, -insetYOffset, [
597 daniel-mar 4977
            'bottom',
637 daniel-mar 4978
            'alignCentre',
4979
            'inset'
597 daniel-mar 4980
          ]);
4981
        },
637 daniel-mar 4982
        insetEast: function () {
4983
          return make(-insetXOffset, -insetYOffset / 2, [
597 daniel-mar 4984
            'valignCentre',
637 daniel-mar 4985
            'right',
4986
            'inset'
597 daniel-mar 4987
          ]);
4988
        },
637 daniel-mar 4989
        insetWest: function () {
4990
          return make(insetXOffset, -insetYOffset / 2, [
597 daniel-mar 4991
            'valignCentre',
637 daniel-mar 4992
            'left',
4993
            'inset'
597 daniel-mar 4994
          ]);
4995
        }
4996
      };
4997
    };
4998
    var fallback = function () {
637 daniel-mar 4999
      return nu$5(0, 0, {});
597 daniel-mar 5000
    };
5001
 
637 daniel-mar 5002
    var nu$4 = identity$1;
597 daniel-mar 5003
 
5004
    var onDirection = function (isLtr, isRtl) {
5005
      return function (element) {
5006
        return getDirection(element) === 'rtl' ? isRtl : isLtr;
5007
      };
5008
    };
5009
    var getDirection = function (element) {
679 daniel-mar 5010
      return get$c(element, 'direction') === 'rtl' ? 'rtl' : 'ltr';
597 daniel-mar 5011
    };
5012
 
5013
    var AttributeValue;
5014
    (function (AttributeValue) {
5015
      AttributeValue['TopToBottom'] = 'toptobottom';
5016
      AttributeValue['BottomToTop'] = 'bottomtotop';
5017
    }(AttributeValue || (AttributeValue = {})));
5018
    var Attribute = 'data-alloy-vertical-dir';
5019
    var isBottomToTopDir = function (el) {
5020
      return closest$2(el, function (current) {
679 daniel-mar 5021
        return isElement$2(current) && get$d(current, 'data-alloy-vertical-dir') === AttributeValue.BottomToTop;
597 daniel-mar 5022
      });
5023
    };
5024
 
637 daniel-mar 5025
    var schema$y = function () {
597 daniel-mar 5026
      return optionObjOf('layouts', [
637 daniel-mar 5027
        required$1('onLtr'),
5028
        required$1('onRtl'),
597 daniel-mar 5029
        option('onBottomLtr'),
5030
        option('onBottomRtl')
5031
      ]);
5032
    };
637 daniel-mar 5033
    var get$4 = function (elem, info, defaultLtr, defaultRtl, defaultBottomLtr, defaultBottomRtl, dirElement) {
597 daniel-mar 5034
      var isBottomToTop = dirElement.map(isBottomToTopDir).getOr(false);
5035
      var customLtr = info.layouts.map(function (ls) {
5036
        return ls.onLtr(elem);
5037
      });
5038
      var customRtl = info.layouts.map(function (ls) {
5039
        return ls.onRtl(elem);
5040
      });
5041
      var ltr = isBottomToTop ? info.layouts.bind(function (ls) {
5042
        return ls.onBottomLtr.map(function (f) {
5043
          return f(elem);
5044
        });
5045
      }).or(customLtr).getOr(defaultBottomLtr) : customLtr.getOr(defaultLtr);
5046
      var rtl = isBottomToTop ? info.layouts.bind(function (ls) {
5047
        return ls.onBottomRtl.map(function (f) {
5048
          return f(elem);
5049
        });
5050
      }).or(customRtl).getOr(defaultBottomRtl) : customRtl.getOr(defaultRtl);
5051
      var f = onDirection(ltr, rtl);
5052
      return f(elem);
5053
    };
5054
 
637 daniel-mar 5055
    var placement$4 = function (component, anchorInfo, origin) {
597 daniel-mar 5056
      var hotspot = anchorInfo.hotspot;
5057
      var anchorBox = toBox(origin, hotspot.element);
637 daniel-mar 5058
      var layouts = get$4(component.element, anchorInfo, belowOrAbove(), belowOrAboveRtl(), aboveOrBelow(), aboveOrBelowRtl(), Optional.some(anchorInfo.hotspot.element));
5059
      return Optional.some(nu$4({
597 daniel-mar 5060
        anchorBox: anchorBox,
5061
        bubble: anchorInfo.bubble.getOr(fallback()),
5062
        overrides: anchorInfo.overrides,
5063
        layouts: layouts,
5064
        placer: Optional.none()
5065
      }));
5066
    };
5067
    var HotspotAnchor = [
637 daniel-mar 5068
      required$1('hotspot'),
597 daniel-mar 5069
      option('bubble'),
637 daniel-mar 5070
      defaulted('overrides', {}),
5071
      schema$y(),
5072
      output$1('placement', placement$4)
597 daniel-mar 5073
    ];
5074
 
637 daniel-mar 5075
    var placement$3 = function (component, anchorInfo, origin) {
5076
      var pos = translate$2(origin, anchorInfo.x, anchorInfo.y);
5077
      var anchorBox = bounds(pos.left, pos.top, anchorInfo.width, anchorInfo.height);
5078
      var layouts = get$4(component.element, anchorInfo, all$1(), allRtl$1(), all$1(), allRtl$1(), Optional.none());
5079
      return Optional.some(nu$4({
597 daniel-mar 5080
        anchorBox: anchorBox,
5081
        bubble: anchorInfo.bubble,
5082
        overrides: anchorInfo.overrides,
5083
        layouts: layouts,
5084
        placer: Optional.none()
5085
      }));
5086
    };
5087
    var MakeshiftAnchor = [
637 daniel-mar 5088
      required$1('x'),
5089
      required$1('y'),
5090
      defaulted('height', 0),
5091
      defaulted('width', 0),
5092
      defaulted('bubble', fallback()),
5093
      defaulted('overrides', {}),
5094
      schema$y(),
5095
      output$1('placement', placement$3)
597 daniel-mar 5096
    ];
5097
 
637 daniel-mar 5098
    var adt$7 = Adt.generate([
597 daniel-mar 5099
      { screen: ['point'] },
5100
      {
5101
        absolute: [
5102
          'point',
5103
          'scrollLeft',
5104
          'scrollTop'
5105
        ]
5106
      }
5107
    ]);
5108
    var toFixed = function (pos) {
637 daniel-mar 5109
      return pos.fold(identity$1, function (point, scrollLeft, scrollTop) {
597 daniel-mar 5110
        return point.translate(-scrollLeft, -scrollTop);
5111
      });
5112
    };
5113
    var toAbsolute = function (pos) {
637 daniel-mar 5114
      return pos.fold(identity$1, identity$1);
597 daniel-mar 5115
    };
5116
    var sum = function (points) {
5117
      return foldl(points, function (b, a) {
5118
        return b.translate(a.left, a.top);
5119
      }, SugarPosition(0, 0));
5120
    };
5121
    var sumAsFixed = function (positions) {
637 daniel-mar 5122
      var points = map$2(positions, toFixed);
597 daniel-mar 5123
      return sum(points);
5124
    };
5125
    var sumAsAbsolute = function (positions) {
637 daniel-mar 5126
      var points = map$2(positions, toAbsolute);
597 daniel-mar 5127
      return sum(points);
5128
    };
637 daniel-mar 5129
    var screen = adt$7.screen;
5130
    var absolute$1 = adt$7.absolute;
597 daniel-mar 5131
 
5132
    var getOffset = function (component, origin, anchorInfo) {
5133
      var win = defaultView(anchorInfo.root).dom;
5134
      var hasSameOwner = function (frame) {
637 daniel-mar 5135
        var frameOwner = owner$4(frame);
5136
        var compOwner = owner$4(component.element);
5137
        return eq(frameOwner, compOwner);
597 daniel-mar 5138
      };
637 daniel-mar 5139
      return Optional.from(win.frameElement).map(SugarElement.fromDom).filter(hasSameOwner).map(absolute$3);
597 daniel-mar 5140
    };
5141
    var getRootPoint = function (component, origin, anchorInfo) {
637 daniel-mar 5142
      var doc = owner$4(component.element);
679 daniel-mar 5143
      var outerScroll = get$9(doc);
597 daniel-mar 5144
      var offset = getOffset(component, origin, anchorInfo).getOr(outerScroll);
637 daniel-mar 5145
      return absolute$1(offset, outerScroll.left, outerScroll.top);
597 daniel-mar 5146
    };
5147
 
637 daniel-mar 5148
    var getBox = function (left, top, width, height) {
5149
      var point = screen(SugarPosition(left, top));
5150
      return Optional.some(pointed(point, width, height));
597 daniel-mar 5151
    };
5152
    var calcNewAnchor = function (optBox, rootPoint, anchorInfo, origin, elem) {
5153
      return optBox.map(function (box) {
5154
        var points = [
5155
          rootPoint,
5156
          box.point
5157
        ];
5158
        var topLeft = cata$1(origin, function () {
5159
          return sumAsAbsolute(points);
5160
        }, function () {
5161
          return sumAsAbsolute(points);
5162
        }, function () {
5163
          return sumAsFixed(points);
5164
        });
5165
        var anchorBox = rect(topLeft.left, topLeft.top, box.width, box.height);
5166
        var layoutsLtr = anchorInfo.showAbove ? aboveOrBelow() : belowOrAbove();
5167
        var layoutsRtl = anchorInfo.showAbove ? aboveOrBelowRtl() : belowOrAboveRtl();
637 daniel-mar 5168
        var layouts = get$4(elem, anchorInfo, layoutsLtr, layoutsRtl, layoutsLtr, layoutsRtl, Optional.none());
5169
        return nu$4({
597 daniel-mar 5170
          anchorBox: anchorBox,
5171
          bubble: anchorInfo.bubble.getOr(fallback()),
5172
          overrides: anchorInfo.overrides,
5173
          layouts: layouts,
5174
          placer: Optional.none()
5175
        });
5176
      });
5177
    };
5178
 
5179
    var placement$2 = function (component, anchorInfo, origin) {
5180
      var rootPoint = getRootPoint(component, origin, anchorInfo);
5181
      return anchorInfo.node.filter(inBody).bind(function (target) {
5182
        var rect = target.dom.getBoundingClientRect();
637 daniel-mar 5183
        var nodeBox = getBox(rect.left, rect.top, rect.width, rect.height);
597 daniel-mar 5184
        var elem = anchorInfo.node.getOr(component.element);
5185
        return calcNewAnchor(nodeBox, rootPoint, anchorInfo, origin, elem);
5186
      });
5187
    };
5188
    var NodeAnchor = [
637 daniel-mar 5189
      required$1('node'),
5190
      required$1('root'),
597 daniel-mar 5191
      option('bubble'),
637 daniel-mar 5192
      schema$y(),
5193
      defaulted('overrides', {}),
5194
      defaulted('showAbove', false),
5195
      output$1('placement', placement$2)
597 daniel-mar 5196
    ];
5197
 
5198
    var zeroWidth = '\uFEFF';
5199
    var nbsp = '\xA0';
5200
 
637 daniel-mar 5201
    var create$6 = function (start, soffset, finish, foffset) {
597 daniel-mar 5202
      return {
5203
        start: start,
5204
        soffset: soffset,
5205
        finish: finish,
5206
        foffset: foffset
5207
      };
5208
    };
637 daniel-mar 5209
    var SimRange = { create: create$6 };
597 daniel-mar 5210
 
5211
    var adt$6 = Adt.generate([
5212
      { before: ['element'] },
5213
      {
5214
        on: [
5215
          'element',
5216
          'offset'
5217
        ]
5218
      },
5219
      { after: ['element'] }
5220
    ]);
637 daniel-mar 5221
    var cata = function (subject, onBefore, onOn, onAfter) {
597 daniel-mar 5222
      return subject.fold(onBefore, onOn, onAfter);
5223
    };
637 daniel-mar 5224
    var getStart$1 = function (situ) {
5225
      return situ.fold(identity$1, identity$1, identity$1);
597 daniel-mar 5226
    };
637 daniel-mar 5227
    var before = adt$6.before;
5228
    var on$1 = adt$6.on;
597 daniel-mar 5229
    var after$1 = adt$6.after;
5230
    var Situ = {
637 daniel-mar 5231
      before: before,
5232
      on: on$1,
597 daniel-mar 5233
      after: after$1,
637 daniel-mar 5234
      cata: cata,
5235
      getStart: getStart$1
597 daniel-mar 5236
    };
5237
 
637 daniel-mar 5238
    var adt$5 = Adt.generate([
597 daniel-mar 5239
      { domRange: ['rng'] },
5240
      {
5241
        relative: [
5242
          'startSitu',
5243
          'finishSitu'
5244
        ]
5245
      },
5246
      {
5247
        exact: [
5248
          'start',
5249
          'soffset',
5250
          'finish',
5251
          'foffset'
5252
        ]
5253
      }
5254
    ]);
5255
    var exactFromRange = function (simRange) {
637 daniel-mar 5256
      return adt$5.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset);
597 daniel-mar 5257
    };
637 daniel-mar 5258
    var getStart = function (selection) {
597 daniel-mar 5259
      return selection.match({
5260
        domRange: function (rng) {
5261
          return SugarElement.fromDom(rng.startContainer);
5262
        },
5263
        relative: function (startSitu, _finishSitu) {
5264
          return Situ.getStart(startSitu);
5265
        },
5266
        exact: function (start, _soffset, _finish, _foffset) {
5267
          return start;
5268
        }
5269
      });
5270
    };
637 daniel-mar 5271
    var domRange = adt$5.domRange;
5272
    var relative = adt$5.relative;
5273
    var exact = adt$5.exact;
597 daniel-mar 5274
    var getWin = function (selection) {
637 daniel-mar 5275
      var start = getStart(selection);
597 daniel-mar 5276
      return defaultView(start);
5277
    };
5278
    var range$1 = SimRange.create;
5279
    var SimSelection = {
5280
      domRange: domRange,
637 daniel-mar 5281
      relative: relative,
597 daniel-mar 5282
      exact: exact,
5283
      exactFromRange: exactFromRange,
5284
      getWin: getWin,
5285
      range: range$1
5286
    };
5287
 
5288
    var setStart = function (rng, situ) {
5289
      situ.fold(function (e) {
5290
        rng.setStartBefore(e.dom);
5291
      }, function (e, o) {
5292
        rng.setStart(e.dom, o);
5293
      }, function (e) {
5294
        rng.setStartAfter(e.dom);
5295
      });
5296
    };
5297
    var setFinish = function (rng, situ) {
5298
      situ.fold(function (e) {
5299
        rng.setEndBefore(e.dom);
5300
      }, function (e, o) {
5301
        rng.setEnd(e.dom, o);
5302
      }, function (e) {
5303
        rng.setEndAfter(e.dom);
5304
      });
5305
    };
5306
    var relativeToNative = function (win, startSitu, finishSitu) {
5307
      var range = win.document.createRange();
5308
      setStart(range, startSitu);
5309
      setFinish(range, finishSitu);
5310
      return range;
5311
    };
5312
    var exactToNative = function (win, start, soffset, finish, foffset) {
5313
      var rng = win.document.createRange();
5314
      rng.setStart(start.dom, soffset);
5315
      rng.setEnd(finish.dom, foffset);
5316
      return rng;
5317
    };
5318
    var toRect = function (rect) {
5319
      return {
5320
        left: rect.left,
5321
        top: rect.top,
5322
        right: rect.right,
5323
        bottom: rect.bottom,
5324
        width: rect.width,
5325
        height: rect.height
5326
      };
5327
    };
637 daniel-mar 5328
    var getFirstRect$1 = function (rng) {
597 daniel-mar 5329
      var rects = rng.getClientRects();
5330
      var rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect();
5331
      return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect) : Optional.none();
5332
    };
637 daniel-mar 5333
    var getBounds$2 = function (rng) {
5334
      var rect = rng.getBoundingClientRect();
5335
      return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect) : Optional.none();
5336
    };
597 daniel-mar 5337
 
637 daniel-mar 5338
    var adt$4 = Adt.generate([
597 daniel-mar 5339
      {
5340
        ltr: [
5341
          'start',
5342
          'soffset',
5343
          'finish',
5344
          'foffset'
5345
        ]
5346
      },
5347
      {
5348
        rtl: [
5349
          'start',
5350
          'soffset',
5351
          'finish',
5352
          'foffset'
5353
        ]
5354
      }
5355
    ]);
5356
    var fromRange = function (win, type, range) {
5357
      return type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset);
5358
    };
5359
    var getRanges = function (win, selection) {
5360
      return selection.match({
5361
        domRange: function (rng) {
5362
          return {
637 daniel-mar 5363
            ltr: constant$1(rng),
597 daniel-mar 5364
            rtl: Optional.none
5365
          };
5366
        },
5367
        relative: function (startSitu, finishSitu) {
5368
          return {
5369
            ltr: cached(function () {
5370
              return relativeToNative(win, startSitu, finishSitu);
5371
            }),
5372
            rtl: cached(function () {
5373
              return Optional.some(relativeToNative(win, finishSitu, startSitu));
5374
            })
5375
          };
5376
        },
5377
        exact: function (start, soffset, finish, foffset) {
5378
          return {
5379
            ltr: cached(function () {
5380
              return exactToNative(win, start, soffset, finish, foffset);
5381
            }),
5382
            rtl: cached(function () {
5383
              return Optional.some(exactToNative(win, finish, foffset, start, soffset));
5384
            })
5385
          };
5386
        }
5387
      });
5388
    };
5389
    var doDiagnose = function (win, ranges) {
5390
      var rng = ranges.ltr();
5391
      if (rng.collapsed) {
5392
        var reversed = ranges.rtl().filter(function (rev) {
5393
          return rev.collapsed === false;
5394
        });
5395
        return reversed.map(function (rev) {
637 daniel-mar 5396
          return adt$4.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset);
597 daniel-mar 5397
        }).getOrThunk(function () {
637 daniel-mar 5398
          return fromRange(win, adt$4.ltr, rng);
597 daniel-mar 5399
        });
5400
      } else {
637 daniel-mar 5401
        return fromRange(win, adt$4.ltr, rng);
597 daniel-mar 5402
      }
5403
    };
5404
    var diagnose = function (win, selection) {
5405
      var ranges = getRanges(win, selection);
5406
      return doDiagnose(win, ranges);
5407
    };
5408
    var asLtrRange = function (win, selection) {
5409
      var diagnosis = diagnose(win, selection);
5410
      return diagnosis.match({
5411
        ltr: function (start, soffset, finish, foffset) {
5412
          var rng = win.document.createRange();
5413
          rng.setStart(start.dom, soffset);
5414
          rng.setEnd(finish.dom, foffset);
5415
          return rng;
5416
        },
5417
        rtl: function (start, soffset, finish, foffset) {
5418
          var rng = win.document.createRange();
5419
          rng.setStart(finish.dom, foffset);
5420
          rng.setEnd(start.dom, soffset);
5421
          return rng;
5422
        }
5423
      });
5424
    };
637 daniel-mar 5425
    adt$4.ltr;
5426
    adt$4.rtl;
597 daniel-mar 5427
 
5428
    var NodeValue = function (is, name) {
5429
      var get = function (element) {
5430
        if (!is(element)) {
5431
          throw new Error('Can only get ' + name + ' value of a ' + name + ' node');
5432
        }
5433
        return getOption(element).getOr('');
5434
      };
5435
      var getOption = function (element) {
5436
        return is(element) ? Optional.from(element.dom.nodeValue) : Optional.none();
5437
      };
5438
      var set = function (element, value) {
5439
        if (!is(element)) {
5440
          throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');
5441
        }
5442
        element.dom.nodeValue = value;
5443
      };
5444
      return {
5445
        get: get,
5446
        getOption: getOption,
5447
        set: set
5448
      };
5449
    };
5450
 
637 daniel-mar 5451
    var api = NodeValue(isText$1, 'text');
5452
    var get$3 = function (element) {
5453
      return api.get(element);
597 daniel-mar 5454
    };
5455
    var getOption = function (element) {
637 daniel-mar 5456
      return api.getOption(element);
597 daniel-mar 5457
    };
5458
 
5459
    var getEnd = function (element) {
637 daniel-mar 5460
      return name$2(element) === 'img' ? 1 : getOption(element).fold(function () {
597 daniel-mar 5461
        return children(element).length;
5462
      }, function (v) {
5463
        return v.length;
5464
      });
5465
    };
5466
    var isTextNodeWithCursorPosition = function (el) {
5467
      return getOption(el).filter(function (text) {
5468
        return text.trim().length !== 0 || text.indexOf(nbsp) > -1;
5469
      }).isSome();
5470
    };
5471
    var elementsWithCursorPosition = [
5472
      'img',
5473
      'br'
5474
    ];
5475
    var isCursorPosition = function (elem) {
5476
      var hasCursorPosition = isTextNodeWithCursorPosition(elem);
637 daniel-mar 5477
      return hasCursorPosition || contains$2(elementsWithCursorPosition, name$2(elem));
597 daniel-mar 5478
    };
5479
 
5480
    var last$1 = function (element) {
5481
      return descendantRtl(element, isCursorPosition);
5482
    };
5483
    var descendantRtl = function (scope, predicate) {
5484
      var descend = function (element) {
5485
        var children$1 = children(element);
5486
        for (var i = children$1.length - 1; i >= 0; i--) {
5487
          var child = children$1[i];
5488
          if (predicate(child)) {
5489
            return Optional.some(child);
5490
          }
5491
          var res = descend(child);
5492
          if (res.isSome()) {
5493
            return res;
5494
          }
5495
        }
5496
        return Optional.none();
5497
      };
5498
      return descend(scope);
5499
    };
5500
 
5501
    var descendants = function (scope, selector) {
637 daniel-mar 5502
      return all$3(selector, scope);
597 daniel-mar 5503
    };
5504
 
5505
    var makeRange = function (start, soffset, finish, foffset) {
637 daniel-mar 5506
      var doc = owner$4(start);
597 daniel-mar 5507
      var rng = doc.dom.createRange();
5508
      rng.setStart(start.dom, soffset);
5509
      rng.setEnd(finish.dom, foffset);
5510
      return rng;
5511
    };
637 daniel-mar 5512
    var after = function (start, soffset, finish, foffset) {
597 daniel-mar 5513
      var r = makeRange(start, soffset, finish, foffset);
637 daniel-mar 5514
      var same = eq(start, finish) && soffset === foffset;
597 daniel-mar 5515
      return r.collapsed && !same;
5516
    };
5517
 
5518
    var getNativeSelection = function (win) {
5519
      return Optional.from(win.getSelection());
5520
    };
5521
    var readRange = function (selection) {
5522
      if (selection.rangeCount > 0) {
5523
        var firstRng = selection.getRangeAt(0);
5524
        var lastRng = selection.getRangeAt(selection.rangeCount - 1);
5525
        return Optional.some(SimRange.create(SugarElement.fromDom(firstRng.startContainer), firstRng.startOffset, SugarElement.fromDom(lastRng.endContainer), lastRng.endOffset));
5526
      } else {
5527
        return Optional.none();
5528
      }
5529
    };
5530
    var doGetExact = function (selection) {
5531
      if (selection.anchorNode === null || selection.focusNode === null) {
5532
        return readRange(selection);
5533
      } else {
5534
        var anchor = SugarElement.fromDom(selection.anchorNode);
5535
        var focus_1 = SugarElement.fromDom(selection.focusNode);
637 daniel-mar 5536
        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 5537
      }
5538
    };
5539
    var getExact = function (win) {
5540
      return getNativeSelection(win).filter(function (sel) {
5541
        return sel.rangeCount > 0;
5542
      }).bind(doGetExact);
5543
    };
637 daniel-mar 5544
    var getFirstRect = function (win, selection) {
597 daniel-mar 5545
      var rng = asLtrRange(win, selection);
637 daniel-mar 5546
      return getFirstRect$1(rng);
597 daniel-mar 5547
    };
637 daniel-mar 5548
    var getBounds$1 = function (win, selection) {
5549
      var rng = asLtrRange(win, selection);
5550
      return getBounds$2(rng);
5551
    };
597 daniel-mar 5552
 
637 daniel-mar 5553
    var point$1 = function (element, offset) {
597 daniel-mar 5554
      return {
5555
        element: element,
5556
        offset: offset
5557
      };
5558
    };
637 daniel-mar 5559
    var descendOnce$1 = function (element, offset) {
597 daniel-mar 5560
      var children$1 = children(element);
5561
      if (children$1.length === 0) {
637 daniel-mar 5562
        return point$1(element, offset);
597 daniel-mar 5563
      } else if (offset < children$1.length) {
637 daniel-mar 5564
        return point$1(children$1[offset], 0);
597 daniel-mar 5565
      } else {
5566
        var last = children$1[children$1.length - 1];
637 daniel-mar 5567
        var len = isText$1(last) ? get$3(last).length : children(last).length;
5568
        return point$1(last, len);
597 daniel-mar 5569
      }
5570
    };
5571
 
637 daniel-mar 5572
    var descendOnce = function (element, offset) {
5573
      return isText$1(element) ? point$1(element, offset) : descendOnce$1(element, offset);
597 daniel-mar 5574
    };
5575
    var getAnchorSelection = function (win, anchorInfo) {
5576
      var getSelection = anchorInfo.getSelection.getOrThunk(function () {
5577
        return function () {
5578
          return getExact(win);
5579
        };
5580
      });
5581
      return getSelection().map(function (sel) {
637 daniel-mar 5582
        var modStart = descendOnce(sel.start, sel.soffset);
5583
        var modFinish = descendOnce(sel.finish, sel.foffset);
597 daniel-mar 5584
        return SimSelection.range(modStart.element, modStart.offset, modFinish.element, modFinish.offset);
5585
      });
5586
    };
637 daniel-mar 5587
    var placement$1 = function (component, anchorInfo, origin) {
597 daniel-mar 5588
      var win = defaultView(anchorInfo.root).dom;
5589
      var rootPoint = getRootPoint(component, origin, anchorInfo);
5590
      var selectionBox = getAnchorSelection(win, anchorInfo).bind(function (sel) {
637 daniel-mar 5591
        var optRect = getBounds$1(win, SimSelection.exactFromRange(sel)).orThunk(function () {
597 daniel-mar 5592
          var x = SugarElement.fromText(zeroWidth);
637 daniel-mar 5593
          before$2(sel.start, x);
5594
          var rect = getFirstRect(win, SimSelection.exact(x, 0, x, 1));
679 daniel-mar 5595
          remove$5(x);
637 daniel-mar 5596
          return rect;
597 daniel-mar 5597
        });
5598
        return optRect.bind(function (rawRect) {
637 daniel-mar 5599
          return getBox(rawRect.left, rawRect.top, rawRect.width, rawRect.height);
597 daniel-mar 5600
        });
5601
      });
5602
      var targetElement = getAnchorSelection(win, anchorInfo).bind(function (sel) {
637 daniel-mar 5603
        return isElement$2(sel.start) ? Optional.some(sel.start) : parentNode(sel.start);
597 daniel-mar 5604
      });
5605
      var elem = targetElement.getOr(component.element);
5606
      return calcNewAnchor(selectionBox, rootPoint, anchorInfo, origin, elem);
5607
    };
5608
    var SelectionAnchor = [
5609
      option('getSelection'),
637 daniel-mar 5610
      required$1('root'),
597 daniel-mar 5611
      option('bubble'),
637 daniel-mar 5612
      schema$y(),
5613
      defaulted('overrides', {}),
5614
      defaulted('showAbove', false),
5615
      output$1('placement', placement$1)
597 daniel-mar 5616
    ];
5617
 
637 daniel-mar 5618
    var labelPrefix$1 = 'link-layout';
5619
    var eastX = function (anchor) {
597 daniel-mar 5620
      return anchor.x + anchor.width;
5621
    };
637 daniel-mar 5622
    var westX = function (anchor, element) {
597 daniel-mar 5623
      return anchor.x - element.width;
5624
    };
5625
    var northY$1 = function (anchor, element) {
5626
      return anchor.y - element.height + anchor.height;
5627
    };
5628
    var southY$1 = function (anchor) {
5629
      return anchor.y;
5630
    };
637 daniel-mar 5631
    var southeast$1 = function (anchor, element, bubbles) {
5632
      return nu$6(eastX(anchor), southY$1(anchor), bubbles.southeast(), southeast$3(), 'southeast', boundsRestriction(anchor, {
597 daniel-mar 5633
        left: 0,
5634
        top: 2
637 daniel-mar 5635
      }), labelPrefix$1);
597 daniel-mar 5636
    };
637 daniel-mar 5637
    var southwest$1 = function (anchor, element, bubbles) {
5638
      return nu$6(westX(anchor, element), southY$1(anchor), bubbles.southwest(), southwest$3(), 'southwest', boundsRestriction(anchor, {
597 daniel-mar 5639
        right: 1,
5640
        top: 2
637 daniel-mar 5641
      }), labelPrefix$1);
597 daniel-mar 5642
    };
637 daniel-mar 5643
    var northeast$1 = function (anchor, element, bubbles) {
5644
      return nu$6(eastX(anchor), northY$1(anchor, element), bubbles.northeast(), northeast$3(), 'northeast', boundsRestriction(anchor, {
597 daniel-mar 5645
        left: 0,
5646
        bottom: 3
637 daniel-mar 5647
      }), labelPrefix$1);
597 daniel-mar 5648
    };
637 daniel-mar 5649
    var northwest$1 = function (anchor, element, bubbles) {
5650
      return nu$6(westX(anchor, element), northY$1(anchor, element), bubbles.northwest(), northwest$3(), 'northwest', boundsRestriction(anchor, {
597 daniel-mar 5651
        right: 1,
5652
        bottom: 3
637 daniel-mar 5653
      }), labelPrefix$1);
597 daniel-mar 5654
    };
637 daniel-mar 5655
    var all = function () {
597 daniel-mar 5656
      return [
637 daniel-mar 5657
        southeast$1,
5658
        southwest$1,
5659
        northeast$1,
5660
        northwest$1
597 daniel-mar 5661
      ];
5662
    };
637 daniel-mar 5663
    var allRtl = function () {
597 daniel-mar 5664
      return [
637 daniel-mar 5665
        southwest$1,
5666
        southeast$1,
5667
        northwest$1,
5668
        northeast$1
597 daniel-mar 5669
      ];
5670
    };
5671
 
637 daniel-mar 5672
    var placement = function (component, submenuInfo, origin) {
597 daniel-mar 5673
      var anchorBox = toBox(origin, submenuInfo.item.element);
637 daniel-mar 5674
      var layouts = get$4(component.element, submenuInfo, all(), allRtl(), all(), allRtl(), Optional.none());
5675
      return Optional.some(nu$4({
597 daniel-mar 5676
        anchorBox: anchorBox,
5677
        bubble: fallback(),
5678
        overrides: submenuInfo.overrides,
5679
        layouts: layouts,
5680
        placer: Optional.none()
5681
      }));
5682
    };
5683
    var SubmenuAnchor = [
637 daniel-mar 5684
      required$1('item'),
5685
      schema$y(),
5686
      defaulted('overrides', {}),
5687
      output$1('placement', placement)
597 daniel-mar 5688
    ];
5689
 
637 daniel-mar 5690
    var AnchorSchema = choose$1('type', {
597 daniel-mar 5691
      selection: SelectionAnchor,
5692
      node: NodeAnchor,
5693
      hotspot: HotspotAnchor,
5694
      submenu: SubmenuAnchor,
5695
      makeshift: MakeshiftAnchor
5696
    });
5697
 
637 daniel-mar 5698
    var TransitionSchema = [
5699
      requiredArrayOf('classes', string),
5700
      defaultedStringEnum('mode', 'all', [
5701
        'all',
5702
        'layout',
5703
        'placement'
5704
      ])
5705
    ];
5706
    var PositionSchema = [
5707
      defaulted('useFixed', never),
5708
      option('getBounds')
5709
    ];
5710
    var PlacementSchema = [
5711
      requiredOf('anchor', AnchorSchema),
5712
      optionObjOf('transition', TransitionSchema)
5713
    ];
5714
 
597 daniel-mar 5715
    var getFixedOrigin = function () {
5716
      var html = document.documentElement;
637 daniel-mar 5717
      return fixed$1(0, 0, html.clientWidth, html.clientHeight);
597 daniel-mar 5718
    };
5719
    var getRelativeOrigin = function (component) {
637 daniel-mar 5720
      var position = absolute$3(component.element);
597 daniel-mar 5721
      var bounds = component.element.dom.getBoundingClientRect();
637 daniel-mar 5722
      return relative$1(position.left, position.top, bounds.width, bounds.height);
597 daniel-mar 5723
    };
637 daniel-mar 5724
    var place = function (component, origin, anchoring, getBounds, placee, lastPlace, transition) {
5725
      var anchor = box(anchoring.anchorBox, origin);
5726
      return simple(anchor, placee.element, anchoring.bubble, anchoring.layouts, lastPlace, getBounds, anchoring.overrides, transition);
597 daniel-mar 5727
    };
637 daniel-mar 5728
    var position$1 = function (component, posConfig, posState, placee, placementSpec) {
5729
      positionWithin(component, posConfig, posState, placee, placementSpec, Optional.none());
597 daniel-mar 5730
    };
637 daniel-mar 5731
    var positionWithin = function (component, posConfig, posState, placee, placementSpec, boxElement) {
5732
      var boundsBox = boxElement.map(box$1);
5733
      return positionWithinBounds(component, posConfig, posState, placee, placementSpec, boundsBox);
597 daniel-mar 5734
    };
637 daniel-mar 5735
    var positionWithinBounds = function (component, posConfig, posState, placee, placementSpec, bounds) {
5736
      var placeeDetail = asRawOrDie$1('placement.info', objOf(PlacementSchema), placementSpec);
5737
      var anchorage = placeeDetail.anchor;
5738
      var element = placee.element;
5739
      var placeeState = posState.get(placee.uid);
5740
      preserve$1(function () {
679 daniel-mar 5741
        set$7(element, 'position', 'fixed');
637 daniel-mar 5742
        var oldVisibility = getRaw(element, 'visibility');
679 daniel-mar 5743
        set$7(element, 'visibility', 'hidden');
597 daniel-mar 5744
        var origin = posConfig.useFixed() ? getFixedOrigin() : getRelativeOrigin(component);
5745
        var placer = anchorage.placement;
637 daniel-mar 5746
        var getBounds = bounds.map(constant$1).or(posConfig.getBounds);
597 daniel-mar 5747
        placer(component, anchorage, origin).each(function (anchoring) {
5748
          var doPlace = anchoring.placer.getOr(place);
637 daniel-mar 5749
          var newState = doPlace(component, origin, anchoring, getBounds, placee, placeeState, placeeDetail.transition);
5750
          posState.set(placee.uid, newState);
597 daniel-mar 5751
        });
5752
        oldVisibility.fold(function () {
679 daniel-mar 5753
          remove$6(element, 'visibility');
597 daniel-mar 5754
        }, function (vis) {
679 daniel-mar 5755
          set$7(element, 'visibility', vis);
597 daniel-mar 5756
        });
679 daniel-mar 5757
        if (getRaw(element, 'left').isNone() && getRaw(element, 'top').isNone() && getRaw(element, 'right').isNone() && getRaw(element, 'bottom').isNone() && is$1(getRaw(element, 'position'), 'fixed')) {
5758
          remove$6(element, 'position');
597 daniel-mar 5759
        }
637 daniel-mar 5760
      }, element);
597 daniel-mar 5761
    };
5762
    var getMode = function (component, pConfig, _pState) {
5763
      return pConfig.useFixed() ? 'fixed' : 'absolute';
5764
    };
637 daniel-mar 5765
    var reset$1 = function (component, pConfig, posState, placee) {
5766
      var element = placee.element;
5767
      each$1([
5768
        'position',
5769
        'left',
5770
        'right',
5771
        'top',
5772
        'bottom'
5773
      ], function (prop) {
679 daniel-mar 5774
        return remove$6(element, prop);
637 daniel-mar 5775
      });
5776
      reset$2(element);
5777
      posState.clear(placee.uid);
5778
    };
597 daniel-mar 5779
 
5780
    var PositionApis = /*#__PURE__*/Object.freeze({
5781
        __proto__: null,
5782
        position: position$1,
5783
        positionWithin: positionWithin,
5784
        positionWithinBounds: positionWithinBounds,
637 daniel-mar 5785
        getMode: getMode,
5786
        reset: reset$1
597 daniel-mar 5787
    });
5788
 
637 daniel-mar 5789
    var init$g = function () {
5790
      var state = {};
5791
      var set = function (id, data) {
5792
        state[id] = data;
5793
      };
5794
      var get = function (id) {
5795
        return get$e(state, id);
5796
      };
5797
      var clear = function (id) {
5798
        if (isNonNullable(id)) {
5799
          delete state[id];
5800
        } else {
5801
          state = {};
5802
        }
5803
      };
5804
      return nu$8({
5805
        readState: function () {
5806
          return state;
5807
        },
5808
        clear: clear,
5809
        set: set,
5810
        get: get
5811
      });
5812
    };
597 daniel-mar 5813
 
637 daniel-mar 5814
    var PositioningState = /*#__PURE__*/Object.freeze({
5815
        __proto__: null,
5816
        init: init$g
5817
    });
5818
 
5819
    var Positioning = create$7({
597 daniel-mar 5820
      fields: PositionSchema,
5821
      name: 'positioning',
5822
      active: ActivePosition,
637 daniel-mar 5823
      apis: PositionApis,
5824
      state: PositioningState
597 daniel-mar 5825
    });
5826
 
5827
    var fireDetaching = function (component) {
5828
      emit(component, detachedFromDom());
5829
      var children = component.components();
637 daniel-mar 5830
      each$1(children, fireDetaching);
597 daniel-mar 5831
    };
5832
    var fireAttaching = function (component) {
5833
      var children = component.components();
637 daniel-mar 5834
      each$1(children, fireAttaching);
597 daniel-mar 5835
      emit(component, attachedToDom());
5836
    };
637 daniel-mar 5837
    var attach$1 = function (parent, child) {
5838
      append$2(parent.element, child.element);
597 daniel-mar 5839
    };
637 daniel-mar 5840
    var detachChildren$1 = function (component) {
5841
      each$1(component.components(), function (childComp) {
679 daniel-mar 5842
        return remove$5(childComp.element);
597 daniel-mar 5843
      });
5844
      empty(component.element);
5845
      component.syncComponents();
5846
    };
5847
    var replaceChildren = function (component, newChildren) {
5848
      var subs = component.components();
637 daniel-mar 5849
      detachChildren$1(component);
597 daniel-mar 5850
      var deleted = difference(subs, newChildren);
637 daniel-mar 5851
      each$1(deleted, function (comp) {
597 daniel-mar 5852
        fireDetaching(comp);
5853
        component.getSystem().removeFromWorld(comp);
5854
      });
637 daniel-mar 5855
      each$1(newChildren, function (childComp) {
597 daniel-mar 5856
        if (!childComp.getSystem().isConnected()) {
5857
          component.getSystem().addToWorld(childComp);
637 daniel-mar 5858
          attach$1(component, childComp);
597 daniel-mar 5859
          if (inBody(component.element)) {
5860
            fireAttaching(childComp);
5861
          }
5862
        } else {
637 daniel-mar 5863
          attach$1(component, childComp);
597 daniel-mar 5864
        }
5865
        component.syncComponents();
5866
      });
5867
    };
5868
 
637 daniel-mar 5869
    var attach = function (parent, child) {
5870
      attachWith(parent, child, append$2);
597 daniel-mar 5871
    };
5872
    var attachWith = function (parent, child, insertion) {
5873
      parent.getSystem().addToWorld(child);
5874
      insertion(parent.element, child.element);
5875
      if (inBody(parent.element)) {
5876
        fireAttaching(child);
5877
      }
5878
      parent.syncComponents();
5879
    };
5880
    var doDetach = function (component) {
5881
      fireDetaching(component);
679 daniel-mar 5882
      remove$5(component.element);
597 daniel-mar 5883
      component.getSystem().removeFromWorld(component);
5884
    };
5885
    var detach = function (component) {
5886
      var parent$1 = parent(component.element).bind(function (p) {
5887
        return component.getSystem().getByDom(p).toOptional();
5888
      });
5889
      doDetach(component);
5890
      parent$1.each(function (p) {
5891
        p.syncComponents();
5892
      });
5893
    };
637 daniel-mar 5894
    var detachChildren = function (component) {
597 daniel-mar 5895
      var subs = component.components();
637 daniel-mar 5896
      each$1(subs, doDetach);
597 daniel-mar 5897
      empty(component.element);
5898
      component.syncComponents();
5899
    };
5900
    var attachSystem = function (element, guiSystem) {
637 daniel-mar 5901
      attachSystemWith(element, guiSystem, append$2);
597 daniel-mar 5902
    };
5903
    var attachSystemAfter = function (element, guiSystem) {
637 daniel-mar 5904
      attachSystemWith(element, guiSystem, after$2);
597 daniel-mar 5905
    };
5906
    var attachSystemWith = function (element, guiSystem, inserter) {
5907
      inserter(element, guiSystem.element);
5908
      var children$1 = children(guiSystem.element);
637 daniel-mar 5909
      each$1(children$1, function (child) {
597 daniel-mar 5910
        guiSystem.getByDom(child).each(fireAttaching);
5911
      });
5912
    };
5913
    var detachSystem = function (guiSystem) {
5914
      var children$1 = children(guiSystem.element);
637 daniel-mar 5915
      each$1(children$1, function (child) {
597 daniel-mar 5916
        guiSystem.getByDom(child).each(fireDetaching);
5917
      });
679 daniel-mar 5918
      remove$5(guiSystem.element);
597 daniel-mar 5919
    };
5920
 
5921
    var rebuild = function (sandbox, sConfig, sState, data) {
5922
      sState.get().each(function (_data) {
637 daniel-mar 5923
        detachChildren(sandbox);
597 daniel-mar 5924
      });
5925
      var point = sConfig.getAttachPoint(sandbox);
637 daniel-mar 5926
      attach(point, sandbox);
597 daniel-mar 5927
      var built = sandbox.getSystem().build(data);
637 daniel-mar 5928
      attach(sandbox, built);
597 daniel-mar 5929
      sState.set(built);
5930
      return built;
5931
    };
637 daniel-mar 5932
    var open$1 = function (sandbox, sConfig, sState, data) {
597 daniel-mar 5933
      var newState = rebuild(sandbox, sConfig, sState, data);
5934
      sConfig.onOpen(sandbox, newState);
5935
      return newState;
5936
    };
5937
    var setContent = function (sandbox, sConfig, sState, data) {
5938
      return sState.get().map(function () {
5939
        return rebuild(sandbox, sConfig, sState, data);
5940
      });
5941
    };
5942
    var openWhileCloaked = function (sandbox, sConfig, sState, data, transaction) {
5943
      cloak(sandbox, sConfig);
637 daniel-mar 5944
      open$1(sandbox, sConfig, sState, data);
597 daniel-mar 5945
      transaction();
5946
      decloak(sandbox, sConfig);
5947
    };
637 daniel-mar 5948
    var close$1 = function (sandbox, sConfig, sState) {
597 daniel-mar 5949
      sState.get().each(function (data) {
637 daniel-mar 5950
        detachChildren(sandbox);
597 daniel-mar 5951
        detach(sandbox);
5952
        sConfig.onClose(sandbox, data);
5953
        sState.clear();
5954
      });
5955
    };
637 daniel-mar 5956
    var isOpen$1 = function (_sandbox, _sConfig, sState) {
597 daniel-mar 5957
      return sState.isOpen();
5958
    };
637 daniel-mar 5959
    var isPartOf = function (sandbox, sConfig, sState, queryElem) {
5960
      return isOpen$1(sandbox, sConfig, sState) && sState.get().exists(function (data) {
597 daniel-mar 5961
        return sConfig.isPartOf(sandbox, data, queryElem);
5962
      });
5963
    };
637 daniel-mar 5964
    var getState$2 = function (_sandbox, _sConfig, sState) {
597 daniel-mar 5965
      return sState.get();
5966
    };
5967
    var store = function (sandbox, cssKey, attr, newValue) {
5968
      getRaw(sandbox.element, cssKey).fold(function () {
679 daniel-mar 5969
        remove$7(sandbox.element, attr);
597 daniel-mar 5970
      }, function (v) {
679 daniel-mar 5971
        set$8(sandbox.element, attr, v);
597 daniel-mar 5972
      });
679 daniel-mar 5973
      set$7(sandbox.element, cssKey, newValue);
597 daniel-mar 5974
    };
5975
    var restore = function (sandbox, cssKey, attr) {
5976
      getOpt(sandbox.element, attr).fold(function () {
679 daniel-mar 5977
        return remove$6(sandbox.element, cssKey);
597 daniel-mar 5978
      }, function (oldValue) {
679 daniel-mar 5979
        return set$7(sandbox.element, cssKey, oldValue);
597 daniel-mar 5980
      });
5981
    };
5982
    var cloak = function (sandbox, sConfig, _sState) {
5983
      var sink = sConfig.getAttachPoint(sandbox);
679 daniel-mar 5984
      set$7(sandbox.element, 'position', Positioning.getMode(sink));
597 daniel-mar 5985
      store(sandbox, 'visibility', sConfig.cloakVisibilityAttr, 'hidden');
5986
    };
5987
    var hasPosition = function (element) {
5988
      return exists([
5989
        'top',
5990
        'left',
5991
        'right',
5992
        'bottom'
5993
      ], function (pos) {
5994
        return getRaw(element, pos).isSome();
5995
      });
5996
    };
5997
    var decloak = function (sandbox, sConfig, _sState) {
5998
      if (!hasPosition(sandbox.element)) {
679 daniel-mar 5999
        remove$6(sandbox.element, 'position');
597 daniel-mar 6000
      }
6001
      restore(sandbox, 'visibility', sConfig.cloakVisibilityAttr);
6002
    };
6003
 
6004
    var SandboxApis = /*#__PURE__*/Object.freeze({
6005
        __proto__: null,
6006
        cloak: cloak,
6007
        decloak: decloak,
637 daniel-mar 6008
        open: open$1,
597 daniel-mar 6009
        openWhileCloaked: openWhileCloaked,
637 daniel-mar 6010
        close: close$1,
6011
        isOpen: isOpen$1,
6012
        isPartOf: isPartOf,
6013
        getState: getState$2,
597 daniel-mar 6014
        setContent: setContent
6015
    });
6016
 
637 daniel-mar 6017
    var events$g = function (sandboxConfig, sandboxState) {
6018
      return derive$2([run$1(sandboxClose(), function (sandbox, _simulatedEvent) {
6019
          close$1(sandbox, sandboxConfig, sandboxState);
597 daniel-mar 6020
        })]);
6021
    };
6022
 
6023
    var ActiveSandbox = /*#__PURE__*/Object.freeze({
6024
        __proto__: null,
637 daniel-mar 6025
        events: events$g
597 daniel-mar 6026
    });
6027
 
6028
    var SandboxSchema = [
6029
      onHandler('onOpen'),
6030
      onHandler('onClose'),
637 daniel-mar 6031
      required$1('isPartOf'),
6032
      required$1('getAttachPoint'),
6033
      defaulted('cloakVisibilityAttr', 'data-precloak-visibility')
597 daniel-mar 6034
    ];
6035
 
637 daniel-mar 6036
    var init$f = function () {
6037
      var contents = value$1();
6038
      var readState = constant$1('not-implemented');
6039
      return nu$8({
597 daniel-mar 6040
        readState: readState,
637 daniel-mar 6041
        isOpen: contents.isSet,
6042
        clear: contents.clear,
6043
        set: contents.set,
6044
        get: contents.get
597 daniel-mar 6045
      });
6046
    };
6047
 
6048
    var SandboxState = /*#__PURE__*/Object.freeze({
6049
        __proto__: null,
637 daniel-mar 6050
        init: init$f
597 daniel-mar 6051
    });
6052
 
637 daniel-mar 6053
    var Sandboxing = create$7({
597 daniel-mar 6054
      fields: SandboxSchema,
6055
      name: 'sandboxing',
6056
      active: ActiveSandbox,
6057
      apis: SandboxApis,
6058
      state: SandboxState
6059
    });
6060
 
637 daniel-mar 6061
    var dismissPopups = constant$1('dismiss.popups');
6062
    var repositionPopups = constant$1('reposition.popups');
6063
    var mouseReleased = constant$1('mouse.released');
597 daniel-mar 6064
 
637 daniel-mar 6065
    var schema$x = objOfOnly([
6066
      defaulted('isExtraPart', never),
6067
      optionObjOf('fireEventInstead', [defaulted('event', dismissRequested())])
597 daniel-mar 6068
    ]);
637 daniel-mar 6069
    var receivingChannel$1 = function (rawSpec) {
597 daniel-mar 6070
      var _a;
637 daniel-mar 6071
      var detail = asRawOrDie$1('Dismissal', schema$x, rawSpec);
597 daniel-mar 6072
      return _a = {}, _a[dismissPopups()] = {
637 daniel-mar 6073
        schema: objOfOnly([required$1('target')]),
597 daniel-mar 6074
        onReceive: function (sandbox, data) {
6075
          if (Sandboxing.isOpen(sandbox)) {
6076
            var isPart = Sandboxing.isPartOf(sandbox, data.target) || detail.isExtraPart(sandbox, data.target);
6077
            if (!isPart) {
6078
              detail.fireEventInstead.fold(function () {
6079
                return Sandboxing.close(sandbox);
6080
              }, function (fe) {
6081
                return emit(sandbox, fe.event);
6082
              });
6083
            }
6084
          }
6085
        }
6086
      }, _a;
6087
    };
6088
 
637 daniel-mar 6089
    var schema$w = objOfOnly([
6090
      optionObjOf('fireEventInstead', [defaulted('event', repositionRequested())]),
6091
      requiredFunction('doReposition')
597 daniel-mar 6092
    ]);
637 daniel-mar 6093
    var receivingChannel = function (rawSpec) {
597 daniel-mar 6094
      var _a;
637 daniel-mar 6095
      var detail = asRawOrDie$1('Reposition', schema$w, rawSpec);
597 daniel-mar 6096
      return _a = {}, _a[repositionPopups()] = {
6097
        onReceive: function (sandbox) {
6098
          if (Sandboxing.isOpen(sandbox)) {
6099
            detail.fireEventInstead.fold(function () {
6100
              return detail.doReposition(sandbox);
6101
            }, function (fe) {
6102
              return emit(sandbox, fe.event);
6103
            });
6104
          }
6105
        }
6106
      }, _a;
6107
    };
6108
 
637 daniel-mar 6109
    var onLoad$5 = function (component, repConfig, repState) {
597 daniel-mar 6110
      repConfig.store.manager.onLoad(component, repConfig, repState);
6111
    };
637 daniel-mar 6112
    var onUnload$2 = function (component, repConfig, repState) {
597 daniel-mar 6113
      repConfig.store.manager.onUnload(component, repConfig, repState);
6114
    };
637 daniel-mar 6115
    var setValue$3 = function (component, repConfig, repState, data) {
597 daniel-mar 6116
      repConfig.store.manager.setValue(component, repConfig, repState, data);
6117
    };
637 daniel-mar 6118
    var getValue$3 = function (component, repConfig, repState) {
597 daniel-mar 6119
      return repConfig.store.manager.getValue(component, repConfig, repState);
6120
    };
6121
    var getState$1 = function (component, repConfig, repState) {
6122
      return repState;
6123
    };
6124
 
6125
    var RepresentApis = /*#__PURE__*/Object.freeze({
6126
        __proto__: null,
637 daniel-mar 6127
        onLoad: onLoad$5,
6128
        onUnload: onUnload$2,
6129
        setValue: setValue$3,
6130
        getValue: getValue$3,
597 daniel-mar 6131
        getState: getState$1
6132
    });
6133
 
637 daniel-mar 6134
    var events$f = function (repConfig, repState) {
597 daniel-mar 6135
      var es = repConfig.resetOnDom ? [
6136
        runOnAttached(function (comp, _se) {
637 daniel-mar 6137
          onLoad$5(comp, repConfig, repState);
597 daniel-mar 6138
        }),
6139
        runOnDetached(function (comp, _se) {
637 daniel-mar 6140
          onUnload$2(comp, repConfig, repState);
597 daniel-mar 6141
        })
637 daniel-mar 6142
      ] : [loadEvent(repConfig, repState, onLoad$5)];
6143
      return derive$2(es);
597 daniel-mar 6144
    };
6145
 
6146
    var ActiveRepresenting = /*#__PURE__*/Object.freeze({
6147
        __proto__: null,
637 daniel-mar 6148
        events: events$f
597 daniel-mar 6149
    });
6150
 
637 daniel-mar 6151
    var memory$1 = function () {
597 daniel-mar 6152
      var data = Cell(null);
6153
      var readState = function () {
6154
        return {
6155
          mode: 'memory',
6156
          value: data.get()
6157
        };
6158
      };
6159
      var isNotSet = function () {
6160
        return data.get() === null;
6161
      };
6162
      var clear = function () {
6163
        data.set(null);
6164
      };
637 daniel-mar 6165
      return nu$8({
597 daniel-mar 6166
        set: data.set,
6167
        get: data.get,
6168
        isNotSet: isNotSet,
6169
        clear: clear,
6170
        readState: readState
6171
      });
6172
    };
6173
    var manual = function () {
6174
      var readState = noop;
637 daniel-mar 6175
      return nu$8({ readState: readState });
597 daniel-mar 6176
    };
6177
    var dataset = function () {
6178
      var dataByValue = Cell({});
6179
      var dataByText = Cell({});
6180
      var readState = function () {
6181
        return {
6182
          mode: 'dataset',
6183
          dataByValue: dataByValue.get(),
6184
          dataByText: dataByText.get()
6185
        };
6186
      };
6187
      var clear = function () {
6188
        dataByValue.set({});
6189
        dataByText.set({});
6190
      };
6191
      var lookup = function (itemString) {
637 daniel-mar 6192
        return get$e(dataByValue.get(), itemString).orThunk(function () {
6193
          return get$e(dataByText.get(), itemString);
597 daniel-mar 6194
        });
6195
      };
6196
      var update = function (items) {
6197
        var currentDataByValue = dataByValue.get();
6198
        var currentDataByText = dataByText.get();
6199
        var newDataByValue = {};
6200
        var newDataByText = {};
637 daniel-mar 6201
        each$1(items, function (item) {
597 daniel-mar 6202
          newDataByValue[item.value] = item;
637 daniel-mar 6203
          get$e(item, 'meta').each(function (meta) {
6204
            get$e(meta, 'text').each(function (text) {
597 daniel-mar 6205
              newDataByText[text] = item;
6206
            });
6207
          });
6208
        });
6209
        dataByValue.set(__assign(__assign({}, currentDataByValue), newDataByValue));
6210
        dataByText.set(__assign(__assign({}, currentDataByText), newDataByText));
6211
      };
637 daniel-mar 6212
      return nu$8({
597 daniel-mar 6213
        readState: readState,
6214
        lookup: lookup,
6215
        update: update,
6216
        clear: clear
6217
      });
6218
    };
637 daniel-mar 6219
    var init$e = function (spec) {
597 daniel-mar 6220
      return spec.store.manager.state(spec);
6221
    };
6222
 
6223
    var RepresentState = /*#__PURE__*/Object.freeze({
6224
        __proto__: null,
637 daniel-mar 6225
        memory: memory$1,
597 daniel-mar 6226
        dataset: dataset,
6227
        manual: manual,
637 daniel-mar 6228
        init: init$e
597 daniel-mar 6229
    });
6230
 
637 daniel-mar 6231
    var setValue$2 = function (component, repConfig, repState, data) {
597 daniel-mar 6232
      var store = repConfig.store;
6233
      repState.update([data]);
6234
      store.setValue(component, data);
6235
      repConfig.onSetValue(component, data);
6236
    };
637 daniel-mar 6237
    var getValue$2 = function (component, repConfig, repState) {
597 daniel-mar 6238
      var store = repConfig.store;
6239
      var key = store.getDataKey(component);
637 daniel-mar 6240
      return repState.lookup(key).getOrThunk(function () {
597 daniel-mar 6241
        return store.getFallbackEntry(key);
6242
      });
6243
    };
637 daniel-mar 6244
    var onLoad$4 = function (component, repConfig, repState) {
597 daniel-mar 6245
      var store = repConfig.store;
6246
      store.initialValue.each(function (data) {
637 daniel-mar 6247
        setValue$2(component, repConfig, repState, data);
597 daniel-mar 6248
      });
6249
    };
6250
    var onUnload$1 = function (component, repConfig, repState) {
6251
      repState.clear();
6252
    };
6253
    var DatasetStore = [
6254
      option('initialValue'),
637 daniel-mar 6255
      required$1('getFallbackEntry'),
6256
      required$1('getDataKey'),
6257
      required$1('setValue'),
6258
      output$1('manager', {
6259
        setValue: setValue$2,
6260
        getValue: getValue$2,
6261
        onLoad: onLoad$4,
597 daniel-mar 6262
        onUnload: onUnload$1,
6263
        state: dataset
6264
      })
6265
    ];
6266
 
637 daniel-mar 6267
    var getValue$1 = function (component, repConfig, _repState) {
597 daniel-mar 6268
      return repConfig.store.getValue(component);
6269
    };
637 daniel-mar 6270
    var setValue$1 = function (component, repConfig, _repState, data) {
597 daniel-mar 6271
      repConfig.store.setValue(component, data);
6272
      repConfig.onSetValue(component, data);
6273
    };
637 daniel-mar 6274
    var onLoad$3 = function (component, repConfig, _repState) {
597 daniel-mar 6275
      repConfig.store.initialValue.each(function (data) {
6276
        repConfig.store.setValue(component, data);
6277
      });
6278
    };
6279
    var ManualStore = [
637 daniel-mar 6280
      required$1('getValue'),
6281
      defaulted('setValue', noop),
597 daniel-mar 6282
      option('initialValue'),
637 daniel-mar 6283
      output$1('manager', {
6284
        setValue: setValue$1,
6285
        getValue: getValue$1,
6286
        onLoad: onLoad$3,
597 daniel-mar 6287
        onUnload: noop,
6288
        state: NoState.init
6289
      })
6290
    ];
6291
 
637 daniel-mar 6292
    var setValue = function (component, repConfig, repState, data) {
597 daniel-mar 6293
      repState.set(data);
6294
      repConfig.onSetValue(component, data);
6295
    };
637 daniel-mar 6296
    var getValue = function (component, repConfig, repState) {
597 daniel-mar 6297
      return repState.get();
6298
    };
637 daniel-mar 6299
    var onLoad$2 = function (component, repConfig, repState) {
597 daniel-mar 6300
      repConfig.store.initialValue.each(function (initVal) {
6301
        if (repState.isNotSet()) {
6302
          repState.set(initVal);
6303
        }
6304
      });
6305
    };
637 daniel-mar 6306
    var onUnload = function (component, repConfig, repState) {
597 daniel-mar 6307
      repState.clear();
6308
    };
6309
    var MemoryStore = [
6310
      option('initialValue'),
637 daniel-mar 6311
      output$1('manager', {
6312
        setValue: setValue,
6313
        getValue: getValue,
6314
        onLoad: onLoad$2,
6315
        onUnload: onUnload,
6316
        state: memory$1
597 daniel-mar 6317
      })
6318
    ];
6319
 
6320
    var RepresentSchema = [
6321
      defaultedOf('store', { mode: 'memory' }, choose$1('mode', {
6322
        memory: MemoryStore,
6323
        manual: ManualStore,
6324
        dataset: DatasetStore
6325
      })),
6326
      onHandler('onSetValue'),
637 daniel-mar 6327
      defaulted('resetOnDom', false)
597 daniel-mar 6328
    ];
6329
 
637 daniel-mar 6330
    var Representing = create$7({
597 daniel-mar 6331
      fields: RepresentSchema,
6332
      name: 'representing',
6333
      active: ActiveRepresenting,
6334
      apis: RepresentApis,
6335
      extra: {
6336
        setValueFrom: function (component, source) {
6337
          var value = Representing.getValue(source);
6338
          Representing.setValue(component, value);
6339
        }
6340
      },
6341
      state: RepresentState
6342
    });
6343
 
637 daniel-mar 6344
    var field = function (name, forbidden) {
6345
      return defaultedObjOf(name, {}, map$2(forbidden, function (f) {
597 daniel-mar 6346
        return forbid(f.name(), 'Cannot configure ' + f.name() + ' for ' + name);
637 daniel-mar 6347
      }).concat([customField('dump', identity$1)]));
597 daniel-mar 6348
    };
637 daniel-mar 6349
    var get$2 = function (data) {
597 daniel-mar 6350
      return data.dump;
6351
    };
6352
    var augment = function (data, original) {
679 daniel-mar 6353
      return __assign(__assign({}, derive$1(original)), data.dump);
597 daniel-mar 6354
    };
6355
    var SketchBehaviours = {
637 daniel-mar 6356
      field: field,
597 daniel-mar 6357
      augment: augment,
637 daniel-mar 6358
      get: get$2
597 daniel-mar 6359
    };
6360
 
6361
    var _placeholder = 'placeholder';
637 daniel-mar 6362
    var adt$3 = Adt.generate([
597 daniel-mar 6363
      {
6364
        single: [
6365
          'required',
6366
          'valueThunk'
6367
        ]
6368
      },
6369
      {
6370
        multiple: [
6371
          'required',
6372
          'valueThunks'
6373
        ]
6374
      }
6375
    ]);
6376
    var isSubstituted = function (spec) {
637 daniel-mar 6377
      return has$2(spec, 'uiType');
597 daniel-mar 6378
    };
6379
    var subPlaceholder = function (owner, detail, compSpec, placeholders) {
6380
      if (owner.exists(function (o) {
6381
          return o !== compSpec.owner;
6382
        })) {
637 daniel-mar 6383
        return adt$3.single(true, constant$1(compSpec));
597 daniel-mar 6384
      }
637 daniel-mar 6385
      return get$e(placeholders, compSpec.name).fold(function () {
597 daniel-mar 6386
        throw new Error('Unknown placeholder component: ' + compSpec.name + '\nKnown: [' + keys(placeholders) + ']\nNamespace: ' + owner.getOr('none') + '\nSpec: ' + JSON.stringify(compSpec, null, 2));
6387
      }, function (newSpec) {
6388
        return newSpec.replace();
6389
      });
6390
    };
6391
    var scan = function (owner, detail, compSpec, placeholders) {
6392
      if (isSubstituted(compSpec) && compSpec.uiType === _placeholder) {
6393
        return subPlaceholder(owner, detail, compSpec, placeholders);
6394
      } else {
637 daniel-mar 6395
        return adt$3.single(false, constant$1(compSpec));
597 daniel-mar 6396
      }
6397
    };
6398
    var substitute = function (owner, detail, compSpec, placeholders) {
6399
      var base = scan(owner, detail, compSpec, placeholders);
6400
      return base.fold(function (req, valueThunk) {
6401
        var value = isSubstituted(compSpec) ? valueThunk(detail, compSpec.config, compSpec.validated) : valueThunk(detail);
637 daniel-mar 6402
        var childSpecs = get$e(value, 'components').getOr([]);
6403
        var substituted = bind$3(childSpecs, function (c) {
597 daniel-mar 6404
          return substitute(owner, detail, c, placeholders);
6405
        });
6406
        return [__assign(__assign({}, value), { components: substituted })];
6407
      }, function (req, valuesThunk) {
6408
        if (isSubstituted(compSpec)) {
6409
          var values = valuesThunk(detail, compSpec.config, compSpec.validated);
637 daniel-mar 6410
          var preprocessor = compSpec.validated.preprocess.getOr(identity$1);
597 daniel-mar 6411
          return preprocessor(values);
6412
        } else {
6413
          return valuesThunk(detail);
6414
        }
6415
      });
6416
    };
6417
    var substituteAll = function (owner, detail, components, placeholders) {
637 daniel-mar 6418
      return bind$3(components, function (c) {
597 daniel-mar 6419
        return substitute(owner, detail, c, placeholders);
6420
      });
6421
    };
6422
    var oneReplace = function (label, replacements) {
6423
      var called = false;
6424
      var used = function () {
6425
        return called;
6426
      };
6427
      var replace = function () {
6428
        if (called) {
6429
          throw new Error('Trying to use the same placeholder more than once: ' + label);
6430
        }
6431
        called = true;
6432
        return replacements;
6433
      };
6434
      var required = function () {
6435
        return replacements.fold(function (req, _) {
6436
          return req;
6437
        }, function (req, _) {
6438
          return req;
6439
        });
6440
      };
6441
      return {
637 daniel-mar 6442
        name: constant$1(label),
597 daniel-mar 6443
        required: required,
6444
        used: used,
6445
        replace: replace
6446
      };
6447
    };
6448
    var substitutePlaces = function (owner, detail, components, placeholders) {
679 daniel-mar 6449
      var ps = map$1(placeholders, function (ph, name) {
597 daniel-mar 6450
        return oneReplace(name, ph);
6451
      });
6452
      var outcome = substituteAll(owner, detail, components, ps);
637 daniel-mar 6453
      each(ps, function (p) {
597 daniel-mar 6454
        if (p.used() === false && p.required()) {
6455
          throw new Error('Placeholder: ' + p.name() + ' was not found in components list\nNamespace: ' + owner.getOr('none') + '\nComponents: ' + JSON.stringify(detail.components, null, 2));
6456
        }
6457
      });
6458
      return outcome;
6459
    };
637 daniel-mar 6460
    var single$2 = adt$3.single;
6461
    var multiple = adt$3.multiple;
6462
    var placeholder = constant$1(_placeholder);
597 daniel-mar 6463
 
637 daniel-mar 6464
    var adt$2 = Adt.generate([
597 daniel-mar 6465
      { required: ['data'] },
6466
      { external: ['data'] },
6467
      { optional: ['data'] },
6468
      { group: ['data'] }
6469
    ]);
637 daniel-mar 6470
    var fFactory = defaulted('factory', { sketch: identity$1 });
6471
    var fSchema = defaulted('schema', []);
6472
    var fName = required$1('name');
6473
    var fPname = field$1('pname', 'pname', defaultedThunk(function (typeSpec) {
6474
      return '<alloy.' + generate$6(typeSpec.name) + '>';
6475
    }), anyValue());
6476
    var fGroupSchema = customField('schema', function () {
597 daniel-mar 6477
      return [option('preprocess')];
6478
    });
637 daniel-mar 6479
    var fDefaults = defaulted('defaults', constant$1({}));
6480
    var fOverrides = defaulted('overrides', constant$1({}));
597 daniel-mar 6481
    var requiredSpec = objOf([
6482
      fFactory,
6483
      fSchema,
6484
      fName,
6485
      fPname,
6486
      fDefaults,
6487
      fOverrides
6488
    ]);
6489
    var externalSpec = objOf([
6490
      fFactory,
6491
      fSchema,
6492
      fName,
6493
      fDefaults,
6494
      fOverrides
6495
    ]);
6496
    var optionalSpec = objOf([
6497
      fFactory,
6498
      fSchema,
6499
      fName,
6500
      fPname,
6501
      fDefaults,
6502
      fOverrides
6503
    ]);
6504
    var groupSpec = objOf([
6505
      fFactory,
6506
      fGroupSchema,
6507
      fName,
637 daniel-mar 6508
      required$1('unit'),
597 daniel-mar 6509
      fPname,
6510
      fDefaults,
6511
      fOverrides
6512
    ]);
6513
    var asNamedPart = function (part) {
6514
      return part.fold(Optional.some, Optional.none, Optional.some, Optional.some);
6515
    };
6516
    var name$1 = function (part) {
6517
      var get = function (data) {
6518
        return data.name;
6519
      };
6520
      return part.fold(get, get, get, get);
6521
    };
6522
    var asCommon = function (part) {
637 daniel-mar 6523
      return part.fold(identity$1, identity$1, identity$1, identity$1);
597 daniel-mar 6524
    };
6525
    var convert = function (adtConstructor, partSchema) {
6526
      return function (spec) {
637 daniel-mar 6527
        var data = asRawOrDie$1('Converting part type', partSchema, spec);
597 daniel-mar 6528
        return adtConstructor(data);
6529
      };
6530
    };
637 daniel-mar 6531
    var required = convert(adt$2.required, requiredSpec);
6532
    var external$1 = convert(adt$2.external, externalSpec);
6533
    var optional = convert(adt$2.optional, optionalSpec);
6534
    var group = convert(adt$2.group, groupSpec);
6535
    var original = constant$1('entirety');
597 daniel-mar 6536
 
6537
    var PartType = /*#__PURE__*/Object.freeze({
6538
        __proto__: null,
6539
        required: required,
6540
        external: external$1,
6541
        optional: optional,
6542
        group: group,
6543
        asNamedPart: asNamedPart,
6544
        name: name$1,
6545
        asCommon: asCommon,
6546
        original: original
6547
    });
6548
 
637 daniel-mar 6549
    var combine = function (detail, data, partSpec, partValidated) {
597 daniel-mar 6550
      return deepMerge(data.defaults(detail, partSpec, partValidated), partSpec, { uid: detail.partUids[data.name] }, data.overrides(detail, partSpec, partValidated));
6551
    };
6552
    var subs = function (owner, detail, parts) {
6553
      var internals = {};
6554
      var externals = {};
637 daniel-mar 6555
      each$1(parts, function (part) {
597 daniel-mar 6556
        part.fold(function (data) {
637 daniel-mar 6557
          internals[data.pname] = single$2(true, function (detail, partSpec, partValidated) {
6558
            return data.factory.sketch(combine(detail, data, partSpec, partValidated));
597 daniel-mar 6559
          });
6560
        }, function (data) {
6561
          var partSpec = detail.parts[data.name];
637 daniel-mar 6562
          externals[data.name] = constant$1(data.factory.sketch(combine(detail, data, partSpec[original()]), partSpec));
597 daniel-mar 6563
        }, function (data) {
637 daniel-mar 6564
          internals[data.pname] = single$2(false, function (detail, partSpec, partValidated) {
6565
            return data.factory.sketch(combine(detail, data, partSpec, partValidated));
597 daniel-mar 6566
          });
6567
        }, function (data) {
6568
          internals[data.pname] = multiple(true, function (detail, _partSpec, _partValidated) {
6569
            var units = detail[data.name];
637 daniel-mar 6570
            return map$2(units, function (u) {
597 daniel-mar 6571
              return data.factory.sketch(deepMerge(data.defaults(detail, u, _partValidated), u, data.overrides(detail, u)));
6572
            });
6573
          });
6574
        });
6575
      });
6576
      return {
637 daniel-mar 6577
        internals: constant$1(internals),
6578
        externals: constant$1(externals)
597 daniel-mar 6579
      };
6580
    };
6581
 
637 daniel-mar 6582
    var generate$3 = function (owner, parts) {
597 daniel-mar 6583
      var r = {};
637 daniel-mar 6584
      each$1(parts, function (part) {
597 daniel-mar 6585
        asNamedPart(part).each(function (np) {
6586
          var g = doGenerateOne(owner, np.pname);
6587
          r[np.name] = function (config) {
637 daniel-mar 6588
            var validated = asRawOrDie$1('Part: ' + np.name + ' in ' + owner, objOf(np.schema), config);
597 daniel-mar 6589
            return __assign(__assign({}, g), {
6590
              config: config,
6591
              validated: validated
6592
            });
6593
          };
6594
        });
6595
      });
6596
      return r;
6597
    };
6598
    var doGenerateOne = function (owner, pname) {
6599
      return {
6600
        uiType: placeholder(),
6601
        owner: owner,
6602
        name: pname
6603
      };
6604
    };
637 daniel-mar 6605
    var generateOne$1 = function (owner, pname, config) {
597 daniel-mar 6606
      return {
6607
        uiType: placeholder(),
6608
        owner: owner,
6609
        name: pname,
6610
        config: config,
6611
        validated: {}
6612
      };
6613
    };
6614
    var schemas = function (parts) {
637 daniel-mar 6615
      return bind$3(parts, function (part) {
597 daniel-mar 6616
        return part.fold(Optional.none, Optional.some, Optional.none, Optional.none).map(function (data) {
637 daniel-mar 6617
          return requiredObjOf(data.name, data.schema.concat([snapshot(original())]));
597 daniel-mar 6618
        }).toArray();
6619
      });
6620
    };
6621
    var names = function (parts) {
637 daniel-mar 6622
      return map$2(parts, name$1);
597 daniel-mar 6623
    };
6624
    var substitutes = function (owner, detail, parts) {
6625
      return subs(owner, detail, parts);
6626
    };
637 daniel-mar 6627
    var components$1 = function (owner, detail, internals) {
597 daniel-mar 6628
      return substitutePlaces(Optional.some(owner), detail, detail.components, internals);
6629
    };
6630
    var getPart = function (component, detail, partKey) {
6631
      var uid = detail.partUids[partKey];
6632
      return component.getSystem().getByUid(uid).toOptional();
6633
    };
6634
    var getPartOrDie = function (component, detail, partKey) {
6635
      return getPart(component, detail, partKey).getOrDie('Could not find part: ' + partKey);
6636
    };
6637
    var getParts = function (component, detail, partKeys) {
6638
      var r = {};
6639
      var uids = detail.partUids;
6640
      var system = component.getSystem();
637 daniel-mar 6641
      each$1(partKeys, function (pk) {
6642
        r[pk] = constant$1(system.getByUid(uids[pk]));
597 daniel-mar 6643
      });
6644
      return r;
6645
    };
6646
    var getAllParts = function (component, detail) {
6647
      var system = component.getSystem();
679 daniel-mar 6648
      return map$1(detail.partUids, function (pUid, _k) {
637 daniel-mar 6649
        return constant$1(system.getByUid(pUid));
597 daniel-mar 6650
      });
6651
    };
6652
    var getAllPartNames = function (detail) {
6653
      return keys(detail.partUids);
6654
    };
6655
    var getPartsOrDie = function (component, detail, partKeys) {
6656
      var r = {};
6657
      var uids = detail.partUids;
6658
      var system = component.getSystem();
637 daniel-mar 6659
      each$1(partKeys, function (pk) {
6660
        r[pk] = constant$1(system.getByUid(uids[pk]).getOrDie());
597 daniel-mar 6661
      });
6662
      return r;
6663
    };
6664
    var defaultUids = function (baseUid, partTypes) {
6665
      var partNames = names(partTypes);
637 daniel-mar 6666
      return wrapAll(map$2(partNames, function (pn) {
597 daniel-mar 6667
        return {
6668
          key: pn,
6669
          value: baseUid + '-' + pn
6670
        };
6671
      }));
6672
    };
6673
    var defaultUidsSchema = function (partTypes) {
637 daniel-mar 6674
      return field$1('partUids', 'partUids', mergeWithThunk(function (spec) {
597 daniel-mar 6675
        return defaultUids(spec.uid, partTypes);
637 daniel-mar 6676
      }), anyValue());
597 daniel-mar 6677
    };
6678
 
6679
    var AlloyParts = /*#__PURE__*/Object.freeze({
6680
        __proto__: null,
637 daniel-mar 6681
        generate: generate$3,
6682
        generateOne: generateOne$1,
597 daniel-mar 6683
        schemas: schemas,
6684
        names: names,
6685
        substitutes: substitutes,
637 daniel-mar 6686
        components: components$1,
597 daniel-mar 6687
        defaultUids: defaultUids,
6688
        defaultUidsSchema: defaultUidsSchema,
6689
        getAllParts: getAllParts,
6690
        getAllPartNames: getAllPartNames,
6691
        getPart: getPart,
6692
        getPartOrDie: getPartOrDie,
6693
        getParts: getParts,
6694
        getPartsOrDie: getPartsOrDie
6695
    });
6696
 
6697
    var base = function (partSchemas, partUidsSchemas) {
637 daniel-mar 6698
      var ps = partSchemas.length > 0 ? [requiredObjOf('parts', partSchemas)] : [];
597 daniel-mar 6699
      return ps.concat([
637 daniel-mar 6700
        required$1('uid'),
6701
        defaulted('dom', {}),
6702
        defaulted('components', []),
597 daniel-mar 6703
        snapshot('originalSpec'),
637 daniel-mar 6704
        defaulted('debug.sketcher', {})
597 daniel-mar 6705
      ]).concat(partUidsSchemas);
6706
    };
637 daniel-mar 6707
    var asRawOrDie = function (label, schema, spec, partSchemas, partUidsSchemas) {
597 daniel-mar 6708
      var baseS = base(partSchemas, partUidsSchemas);
637 daniel-mar 6709
      return asRawOrDie$1(label + ' [SpecSchema]', objOfOnly(baseS.concat(schema)), spec);
597 daniel-mar 6710
    };
6711
 
6712
    var single$1 = function (owner, schema, factory, spec) {
6713
      var specWithUid = supplyUid(spec);
637 daniel-mar 6714
      var detail = asRawOrDie(owner, schema, specWithUid, [], []);
597 daniel-mar 6715
      return factory(detail, specWithUid);
6716
    };
637 daniel-mar 6717
    var composite$1 = function (owner, schema, partTypes, factory, spec) {
597 daniel-mar 6718
      var specWithUid = supplyUid(spec);
6719
      var partSchemas = schemas(partTypes);
6720
      var partUidsSchema = defaultUidsSchema(partTypes);
637 daniel-mar 6721
      var detail = asRawOrDie(owner, schema, specWithUid, partSchemas, [partUidsSchema]);
597 daniel-mar 6722
      var subs = substitutes(owner, detail, partTypes);
637 daniel-mar 6723
      var components = components$1(owner, detail, subs.internals());
6724
      return factory(detail, components, specWithUid, subs.externals());
597 daniel-mar 6725
    };
6726
    var hasUid = function (spec) {
637 daniel-mar 6727
      return has$2(spec, 'uid');
597 daniel-mar 6728
    };
6729
    var supplyUid = function (spec) {
637 daniel-mar 6730
      return hasUid(spec) ? spec : __assign(__assign({}, spec), { uid: generate$5('uid') });
597 daniel-mar 6731
    };
6732
 
6733
    var isSketchSpec = function (spec) {
6734
      return spec.uid !== undefined;
6735
    };
6736
    var singleSchema = objOfOnly([
637 daniel-mar 6737
      required$1('name'),
6738
      required$1('factory'),
6739
      required$1('configFields'),
6740
      defaulted('apis', {}),
6741
      defaulted('extraApis', {})
597 daniel-mar 6742
    ]);
6743
    var compositeSchema = objOfOnly([
637 daniel-mar 6744
      required$1('name'),
6745
      required$1('factory'),
6746
      required$1('configFields'),
6747
      required$1('partFields'),
6748
      defaulted('apis', {}),
6749
      defaulted('extraApis', {})
597 daniel-mar 6750
    ]);
637 daniel-mar 6751
    var single = function (rawConfig) {
6752
      var config = asRawOrDie$1('Sketcher for ' + rawConfig.name, singleSchema, rawConfig);
597 daniel-mar 6753
      var sketch = function (spec) {
6754
        return single$1(config.name, config.configFields, config.factory, spec);
6755
      };
679 daniel-mar 6756
      var apis = map$1(config.apis, makeApi);
6757
      var extraApis = map$1(config.extraApis, function (f, k) {
597 daniel-mar 6758
        return markAsExtraApi(f, k);
6759
      });
6760
      return __assign(__assign({
6761
        name: config.name,
6762
        configFields: config.configFields,
6763
        sketch: sketch
6764
      }, apis), extraApis);
6765
    };
637 daniel-mar 6766
    var composite = function (rawConfig) {
6767
      var config = asRawOrDie$1('Sketcher for ' + rawConfig.name, compositeSchema, rawConfig);
597 daniel-mar 6768
      var sketch = function (spec) {
637 daniel-mar 6769
        return composite$1(config.name, config.configFields, config.partFields, config.factory, spec);
597 daniel-mar 6770
      };
637 daniel-mar 6771
      var parts = generate$3(config.name, config.partFields);
679 daniel-mar 6772
      var apis = map$1(config.apis, makeApi);
6773
      var extraApis = map$1(config.extraApis, function (f, k) {
597 daniel-mar 6774
        return markAsExtraApi(f, k);
6775
      });
6776
      return __assign(__assign({
6777
        name: config.name,
6778
        partFields: config.partFields,
6779
        configFields: config.configFields,
6780
        sketch: sketch,
6781
        parts: parts
6782
      }, apis), extraApis);
6783
    };
6784
 
6785
    var inside = function (target) {
679 daniel-mar 6786
      return name$2(target) === 'input' && get$d(target, 'type') !== 'radio' || name$2(target) === 'textarea';
597 daniel-mar 6787
    };
6788
 
6789
    var getCurrent = function (component, composeConfig, _composeState) {
6790
      return composeConfig.find(component);
6791
    };
6792
 
6793
    var ComposeApis = /*#__PURE__*/Object.freeze({
6794
        __proto__: null,
6795
        getCurrent: getCurrent
6796
    });
6797
 
637 daniel-mar 6798
    var ComposeSchema = [required$1('find')];
597 daniel-mar 6799
 
637 daniel-mar 6800
    var Composing = create$7({
597 daniel-mar 6801
      fields: ComposeSchema,
6802
      name: 'composing',
6803
      apis: ComposeApis
6804
    });
6805
 
637 daniel-mar 6806
    var nativeDisabled = [
6807
      'input',
6808
      'button',
6809
      'textarea',
6810
      'select'
6811
    ];
6812
    var onLoad$1 = function (component, disableConfig, disableState) {
6813
      var f = disableConfig.disabled() ? disable$1 : enable$1;
6814
      f(component, disableConfig);
6815
    };
6816
    var hasNative = function (component, config) {
6817
      return config.useNative === true && contains$2(nativeDisabled, name$2(component.element));
6818
    };
6819
    var nativeIsDisabled = function (component) {
6820
      return has$1(component.element, 'disabled');
6821
    };
6822
    var nativeDisable = function (component) {
679 daniel-mar 6823
      set$8(component.element, 'disabled', 'disabled');
637 daniel-mar 6824
    };
6825
    var nativeEnable = function (component) {
679 daniel-mar 6826
      remove$7(component.element, 'disabled');
637 daniel-mar 6827
    };
6828
    var ariaIsDisabled = function (component) {
679 daniel-mar 6829
      return get$d(component.element, 'aria-disabled') === 'true';
637 daniel-mar 6830
    };
6831
    var ariaDisable = function (component) {
679 daniel-mar 6832
      set$8(component.element, 'aria-disabled', 'true');
637 daniel-mar 6833
    };
6834
    var ariaEnable = function (component) {
679 daniel-mar 6835
      set$8(component.element, 'aria-disabled', 'false');
637 daniel-mar 6836
    };
6837
    var disable$1 = function (component, disableConfig, _disableState) {
6838
      disableConfig.disableClass.each(function (disableClass) {
6839
        add$2(component.element, disableClass);
6840
      });
6841
      var f = hasNative(component, disableConfig) ? nativeDisable : ariaDisable;
6842
      f(component);
6843
      disableConfig.onDisabled(component);
6844
    };
6845
    var enable$1 = function (component, disableConfig, _disableState) {
6846
      disableConfig.disableClass.each(function (disableClass) {
679 daniel-mar 6847
        remove$2(component.element, disableClass);
637 daniel-mar 6848
      });
6849
      var f = hasNative(component, disableConfig) ? nativeEnable : ariaEnable;
6850
      f(component);
6851
      disableConfig.onEnabled(component);
6852
    };
6853
    var isDisabled = function (component, disableConfig) {
6854
      return hasNative(component, disableConfig) ? nativeIsDisabled(component) : ariaIsDisabled(component);
6855
    };
6856
    var set$3 = function (component, disableConfig, disableState, disabled) {
6857
      var f = disabled ? disable$1 : enable$1;
6858
      f(component, disableConfig);
6859
    };
6860
 
6861
    var DisableApis = /*#__PURE__*/Object.freeze({
6862
        __proto__: null,
6863
        enable: enable$1,
6864
        disable: disable$1,
6865
        isDisabled: isDisabled,
6866
        onLoad: onLoad$1,
6867
        set: set$3
6868
    });
6869
 
6870
    var exhibit$5 = function (base, disableConfig) {
6871
      return nu$7({ classes: disableConfig.disabled() ? disableConfig.disableClass.toArray() : [] });
6872
    };
6873
    var events$e = function (disableConfig, disableState) {
6874
      return derive$2([
6875
        abort(execute$5(), function (component, _simulatedEvent) {
6876
          return isDisabled(component, disableConfig);
6877
        }),
6878
        loadEvent(disableConfig, disableState, onLoad$1)
6879
      ]);
6880
    };
6881
 
6882
    var ActiveDisable = /*#__PURE__*/Object.freeze({
6883
        __proto__: null,
6884
        exhibit: exhibit$5,
6885
        events: events$e
6886
    });
6887
 
6888
    var DisableSchema = [
6889
      defaultedFunction('disabled', never),
6890
      defaulted('useNative', true),
6891
      option('disableClass'),
6892
      onHandler('onDisabled'),
6893
      onHandler('onEnabled')
6894
    ];
6895
 
6896
    var Disabling = create$7({
6897
      fields: DisableSchema,
6898
      name: 'disabling',
6899
      active: ActiveDisable,
6900
      apis: DisableApis
6901
    });
6902
 
597 daniel-mar 6903
    var dehighlightAllExcept = function (component, hConfig, hState, skip) {
6904
      var highlighted = descendants(component.element, '.' + hConfig.highlightClass);
637 daniel-mar 6905
      each$1(highlighted, function (h) {
597 daniel-mar 6906
        if (!exists(skip, function (skipComp) {
6907
            return skipComp.element === h;
6908
          })) {
679 daniel-mar 6909
          remove$2(h, hConfig.highlightClass);
597 daniel-mar 6910
          component.getSystem().getByDom(h).each(function (target) {
6911
            hConfig.onDehighlight(component, target);
637 daniel-mar 6912
            emit(target, dehighlight$1());
597 daniel-mar 6913
          });
6914
        }
6915
      });
6916
    };
6917
    var dehighlightAll = function (component, hConfig, hState) {
6918
      return dehighlightAllExcept(component, hConfig, hState, []);
6919
    };
637 daniel-mar 6920
    var dehighlight = function (component, hConfig, hState, target) {
597 daniel-mar 6921
      if (isHighlighted(component, hConfig, hState, target)) {
679 daniel-mar 6922
        remove$2(target.element, hConfig.highlightClass);
597 daniel-mar 6923
        hConfig.onDehighlight(component, target);
637 daniel-mar 6924
        emit(target, dehighlight$1());
597 daniel-mar 6925
      }
6926
    };
637 daniel-mar 6927
    var highlight = function (component, hConfig, hState, target) {
597 daniel-mar 6928
      dehighlightAllExcept(component, hConfig, hState, [target]);
6929
      if (!isHighlighted(component, hConfig, hState, target)) {
6930
        add$2(target.element, hConfig.highlightClass);
6931
        hConfig.onHighlight(component, target);
637 daniel-mar 6932
        emit(target, highlight$1());
597 daniel-mar 6933
      }
6934
    };
6935
    var highlightFirst = function (component, hConfig, hState) {
6936
      getFirst(component, hConfig).each(function (firstComp) {
637 daniel-mar 6937
        highlight(component, hConfig, hState, firstComp);
597 daniel-mar 6938
      });
6939
    };
6940
    var highlightLast = function (component, hConfig, hState) {
6941
      getLast(component, hConfig).each(function (lastComp) {
637 daniel-mar 6942
        highlight(component, hConfig, hState, lastComp);
597 daniel-mar 6943
      });
6944
    };
6945
    var highlightAt = function (component, hConfig, hState, index) {
6946
      getByIndex(component, hConfig, hState, index).fold(function (err) {
6947
        throw err;
6948
      }, function (firstComp) {
637 daniel-mar 6949
        highlight(component, hConfig, hState, firstComp);
597 daniel-mar 6950
      });
6951
    };
6952
    var highlightBy = function (component, hConfig, hState, predicate) {
6953
      var candidates = getCandidates(component, hConfig);
637 daniel-mar 6954
      var targetComp = find$5(candidates, predicate);
597 daniel-mar 6955
      targetComp.each(function (c) {
637 daniel-mar 6956
        highlight(component, hConfig, hState, c);
597 daniel-mar 6957
      });
6958
    };
6959
    var isHighlighted = function (component, hConfig, hState, queryTarget) {
637 daniel-mar 6960
      return has(queryTarget.element, hConfig.highlightClass);
597 daniel-mar 6961
    };
6962
    var getHighlighted = function (component, hConfig, _hState) {
637 daniel-mar 6963
      return descendant(component.element, '.' + hConfig.highlightClass).bind(function (e) {
597 daniel-mar 6964
        return component.getSystem().getByDom(e).toOptional();
6965
      });
6966
    };
6967
    var getByIndex = function (component, hConfig, hState, index) {
6968
      var items = descendants(component.element, '.' + hConfig.itemClass);
6969
      return Optional.from(items[index]).fold(function () {
6970
        return Result.error(new Error('No element found with index ' + index));
6971
      }, component.getSystem().getByDom);
6972
    };
6973
    var getFirst = function (component, hConfig, _hState) {
637 daniel-mar 6974
      return descendant(component.element, '.' + hConfig.itemClass).bind(function (e) {
597 daniel-mar 6975
        return component.getSystem().getByDom(e).toOptional();
6976
      });
6977
    };
6978
    var getLast = function (component, hConfig, _hState) {
6979
      var items = descendants(component.element, '.' + hConfig.itemClass);
6980
      var last = items.length > 0 ? Optional.some(items[items.length - 1]) : Optional.none();
6981
      return last.bind(function (c) {
6982
        return component.getSystem().getByDom(c).toOptional();
6983
      });
6984
    };
637 daniel-mar 6985
    var getDelta$2 = function (component, hConfig, hState, delta) {
597 daniel-mar 6986
      var items = descendants(component.element, '.' + hConfig.itemClass);
637 daniel-mar 6987
      var current = findIndex$1(items, function (item) {
6988
        return has(item, hConfig.highlightClass);
597 daniel-mar 6989
      });
6990
      return current.bind(function (selected) {
6991
        var dest = cycleBy(selected, delta, 0, items.length - 1);
6992
        return component.getSystem().getByDom(items[dest]).toOptional();
6993
      });
6994
    };
6995
    var getPrevious = function (component, hConfig, hState) {
637 daniel-mar 6996
      return getDelta$2(component, hConfig, hState, -1);
597 daniel-mar 6997
    };
6998
    var getNext = function (component, hConfig, hState) {
637 daniel-mar 6999
      return getDelta$2(component, hConfig, hState, +1);
597 daniel-mar 7000
    };
7001
    var getCandidates = function (component, hConfig, _hState) {
7002
      var items = descendants(component.element, '.' + hConfig.itemClass);
637 daniel-mar 7003
      return cat(map$2(items, function (i) {
597 daniel-mar 7004
        return component.getSystem().getByDom(i).toOptional();
7005
      }));
7006
    };
7007
 
7008
    var HighlightApis = /*#__PURE__*/Object.freeze({
7009
        __proto__: null,
7010
        dehighlightAll: dehighlightAll,
637 daniel-mar 7011
        dehighlight: dehighlight,
7012
        highlight: highlight,
597 daniel-mar 7013
        highlightFirst: highlightFirst,
7014
        highlightLast: highlightLast,
7015
        highlightAt: highlightAt,
7016
        highlightBy: highlightBy,
7017
        isHighlighted: isHighlighted,
7018
        getHighlighted: getHighlighted,
7019
        getFirst: getFirst,
7020
        getLast: getLast,
7021
        getPrevious: getPrevious,
7022
        getNext: getNext,
7023
        getCandidates: getCandidates
7024
    });
7025
 
7026
    var HighlightSchema = [
637 daniel-mar 7027
      required$1('highlightClass'),
7028
      required$1('itemClass'),
597 daniel-mar 7029
      onHandler('onHighlight'),
7030
      onHandler('onDehighlight')
7031
    ];
7032
 
637 daniel-mar 7033
    var Highlighting = create$7({
597 daniel-mar 7034
      fields: HighlightSchema,
7035
      name: 'highlighting',
7036
      apis: HighlightApis
7037
    });
7038
 
7039
    var BACKSPACE = [8];
7040
    var TAB = [9];
7041
    var ENTER = [13];
7042
    var ESCAPE = [27];
7043
    var SPACE = [32];
7044
    var LEFT = [37];
7045
    var UP = [38];
7046
    var RIGHT = [39];
7047
    var DOWN = [40];
7048
 
7049
    var cyclePrev = function (values, index, predicate) {
7050
      var before = reverse(values.slice(0, index));
7051
      var after = reverse(values.slice(index + 1));
637 daniel-mar 7052
      return find$5(before.concat(after), predicate);
597 daniel-mar 7053
    };
7054
    var tryPrev = function (values, index, predicate) {
7055
      var before = reverse(values.slice(0, index));
637 daniel-mar 7056
      return find$5(before, predicate);
597 daniel-mar 7057
    };
7058
    var cycleNext = function (values, index, predicate) {
7059
      var before = values.slice(0, index);
7060
      var after = values.slice(index + 1);
637 daniel-mar 7061
      return find$5(after.concat(before), predicate);
597 daniel-mar 7062
    };
7063
    var tryNext = function (values, index, predicate) {
7064
      var after = values.slice(index + 1);
637 daniel-mar 7065
      return find$5(after, predicate);
597 daniel-mar 7066
    };
7067
 
7068
    var inSet = function (keys) {
7069
      return function (event) {
7070
        var raw = event.raw;
637 daniel-mar 7071
        return contains$2(keys, raw.which);
597 daniel-mar 7072
      };
7073
    };
7074
    var and = function (preds) {
7075
      return function (event) {
7076
        return forall(preds, function (pred) {
7077
          return pred(event);
7078
        });
7079
      };
7080
    };
7081
    var isShift = function (event) {
7082
      var raw = event.raw;
7083
      return raw.shiftKey === true;
7084
    };
7085
    var isControl = function (event) {
7086
      var raw = event.raw;
7087
      return raw.ctrlKey === true;
7088
    };
7089
    var isNotShift = not(isShift);
7090
 
7091
    var rule = function (matches, action) {
7092
      return {
7093
        matches: matches,
7094
        classification: action
7095
      };
7096
    };
637 daniel-mar 7097
    var choose = function (transitions, event) {
7098
      var transition = find$5(transitions, function (t) {
597 daniel-mar 7099
        return t.matches(event);
7100
      });
7101
      return transition.map(function (t) {
7102
        return t.classification;
7103
      });
7104
    };
7105
 
7106
    var reportFocusShifting = function (component, prevFocus, newFocus) {
7107
      var noChange = prevFocus.exists(function (p) {
7108
        return newFocus.exists(function (n) {
637 daniel-mar 7109
          return eq(n, p);
597 daniel-mar 7110
        });
7111
      });
7112
      if (!noChange) {
7113
        emitWith(component, focusShifted(), {
7114
          prevFocus: prevFocus,
7115
          newFocus: newFocus
7116
        });
7117
      }
7118
    };
637 daniel-mar 7119
    var dom$2 = function () {
597 daniel-mar 7120
      var get = function (component) {
7121
        return search(component.element);
7122
      };
7123
      var set = function (component, focusee) {
7124
        var prevFocus = get(component);
7125
        component.getSystem().triggerFocus(focusee, component.element);
7126
        var newFocus = get(component);
7127
        reportFocusShifting(component, prevFocus, newFocus);
7128
      };
7129
      return {
7130
        get: get,
7131
        set: set
7132
      };
7133
    };
7134
    var highlights = function () {
7135
      var get = function (component) {
7136
        return Highlighting.getHighlighted(component).map(function (item) {
7137
          return item.element;
7138
        });
7139
      };
7140
      var set = function (component, element) {
7141
        var prevFocus = get(component);
7142
        component.getSystem().getByDom(element).fold(noop, function (item) {
7143
          Highlighting.highlight(component, item);
7144
        });
7145
        var newFocus = get(component);
7146
        reportFocusShifting(component, prevFocus, newFocus);
7147
      };
7148
      return {
7149
        get: get,
7150
        set: set
7151
      };
7152
    };
7153
 
7154
    var FocusInsideModes;
7155
    (function (FocusInsideModes) {
7156
      FocusInsideModes['OnFocusMode'] = 'onFocus';
7157
      FocusInsideModes['OnEnterOrSpaceMode'] = 'onEnterOrSpace';
7158
      FocusInsideModes['OnApiMode'] = 'onApi';
7159
    }(FocusInsideModes || (FocusInsideModes = {})));
7160
 
7161
    var typical = function (infoSchema, stateInit, getKeydownRules, getKeyupRules, optFocusIn) {
7162
      var schema = function () {
7163
        return infoSchema.concat([
637 daniel-mar 7164
          defaulted('focusManager', dom$2()),
597 daniel-mar 7165
          defaultedOf('focusInside', 'onFocus', valueOf(function (val) {
637 daniel-mar 7166
            return contains$2([
597 daniel-mar 7167
              'onFocus',
7168
              'onEnterOrSpace',
7169
              'onApi'
7170
            ], val) ? Result.value(val) : Result.error('Invalid value for focusInside');
7171
          })),
637 daniel-mar 7172
          output$1('handler', me),
7173
          output$1('state', stateInit),
7174
          output$1('sendFocusIn', optFocusIn)
597 daniel-mar 7175
        ]);
7176
      };
7177
      var processKey = function (component, simulatedEvent, getRules, keyingConfig, keyingState) {
7178
        var rules = getRules(component, simulatedEvent, keyingConfig, keyingState);
637 daniel-mar 7179
        return choose(rules, simulatedEvent.event).bind(function (rule) {
597 daniel-mar 7180
          return rule(component, simulatedEvent, keyingConfig, keyingState);
7181
        });
7182
      };
7183
      var toEvents = function (keyingConfig, keyingState) {
7184
        var onFocusHandler = keyingConfig.focusInside !== FocusInsideModes.OnFocusMode ? Optional.none() : optFocusIn(keyingConfig).map(function (focusIn) {
637 daniel-mar 7185
          return run$1(focus$4(), function (component, simulatedEvent) {
597 daniel-mar 7186
            focusIn(component, keyingConfig, keyingState);
7187
            simulatedEvent.stop();
7188
          });
7189
        });
7190
        var tryGoInsideComponent = function (component, simulatedEvent) {
7191
          var isEnterOrSpace = inSet(SPACE.concat(ENTER))(simulatedEvent.event);
7192
          if (keyingConfig.focusInside === FocusInsideModes.OnEnterOrSpaceMode && isEnterOrSpace && isSource(component, simulatedEvent)) {
7193
            optFocusIn(keyingConfig).each(function (focusIn) {
7194
              focusIn(component, keyingConfig, keyingState);
7195
              simulatedEvent.stop();
7196
            });
7197
          }
7198
        };
7199
        var keyboardEvents = [
637 daniel-mar 7200
          run$1(keydown(), function (component, simulatedEvent) {
597 daniel-mar 7201
            processKey(component, simulatedEvent, getKeydownRules, keyingConfig, keyingState).fold(function () {
7202
              tryGoInsideComponent(component, simulatedEvent);
7203
            }, function (_) {
7204
              simulatedEvent.stop();
7205
            });
7206
          }),
637 daniel-mar 7207
          run$1(keyup(), function (component, simulatedEvent) {
597 daniel-mar 7208
            processKey(component, simulatedEvent, getKeyupRules, keyingConfig, keyingState).each(function (_) {
7209
              simulatedEvent.stop();
7210
            });
7211
          })
7212
        ];
637 daniel-mar 7213
        return derive$2(onFocusHandler.toArray().concat(keyboardEvents));
597 daniel-mar 7214
      };
7215
      var me = {
7216
        schema: schema,
7217
        processKey: processKey,
7218
        toEvents: toEvents
7219
      };
7220
      return me;
7221
    };
7222
 
637 daniel-mar 7223
    var create$5 = function (cyclicField) {
597 daniel-mar 7224
      var schema = [
7225
        option('onEscape'),
7226
        option('onEnter'),
637 daniel-mar 7227
        defaulted('selector', '[data-alloy-tabstop="true"]:not(:disabled)'),
7228
        defaulted('firstTabstop', 0),
7229
        defaulted('useTabstopAt', always),
597 daniel-mar 7230
        option('visibilitySelector')
7231
      ].concat([cyclicField]);
7232
      var isVisible = function (tabbingConfig, element) {
7233
        var target = tabbingConfig.visibilitySelector.bind(function (sel) {
637 daniel-mar 7234
          return closest$1(element, sel);
597 daniel-mar 7235
        }).getOr(element);
679 daniel-mar 7236
        return get$b(target) > 0;
597 daniel-mar 7237
      };
7238
      var findInitial = function (component, tabbingConfig) {
7239
        var tabstops = descendants(component.element, tabbingConfig.selector);
637 daniel-mar 7240
        var visibles = filter$2(tabstops, function (elem) {
597 daniel-mar 7241
          return isVisible(tabbingConfig, elem);
7242
        });
7243
        return Optional.from(visibles[tabbingConfig.firstTabstop]);
7244
      };
7245
      var findCurrent = function (component, tabbingConfig) {
7246
        return tabbingConfig.focusManager.get(component).bind(function (elem) {
637 daniel-mar 7247
          return closest$1(elem, tabbingConfig.selector);
597 daniel-mar 7248
        });
7249
      };
7250
      var isTabstop = function (tabbingConfig, element) {
7251
        return isVisible(tabbingConfig, element) && tabbingConfig.useTabstopAt(element);
7252
      };
7253
      var focusIn = function (component, tabbingConfig, _tabbingState) {
7254
        findInitial(component, tabbingConfig).each(function (target) {
7255
          tabbingConfig.focusManager.set(component, target);
7256
        });
7257
      };
7258
      var goFromTabstop = function (component, tabstops, stopIndex, tabbingConfig, cycle) {
7259
        return cycle(tabstops, stopIndex, function (elem) {
7260
          return isTabstop(tabbingConfig, elem);
7261
        }).fold(function () {
7262
          return tabbingConfig.cyclic ? Optional.some(true) : Optional.none();
7263
        }, function (target) {
7264
          tabbingConfig.focusManager.set(component, target);
7265
          return Optional.some(true);
7266
        });
7267
      };
7268
      var go = function (component, _simulatedEvent, tabbingConfig, cycle) {
7269
        var tabstops = descendants(component.element, tabbingConfig.selector);
7270
        return findCurrent(component, tabbingConfig).bind(function (tabstop) {
637 daniel-mar 7271
          var optStopIndex = findIndex$1(tabstops, curry(eq, tabstop));
597 daniel-mar 7272
          return optStopIndex.bind(function (stopIndex) {
7273
            return goFromTabstop(component, tabstops, stopIndex, tabbingConfig, cycle);
7274
          });
7275
        });
7276
      };
7277
      var goBackwards = function (component, simulatedEvent, tabbingConfig) {
7278
        var navigate = tabbingConfig.cyclic ? cyclePrev : tryPrev;
7279
        return go(component, simulatedEvent, tabbingConfig, navigate);
7280
      };
7281
      var goForwards = function (component, simulatedEvent, tabbingConfig) {
7282
        var navigate = tabbingConfig.cyclic ? cycleNext : tryNext;
7283
        return go(component, simulatedEvent, tabbingConfig, navigate);
7284
      };
7285
      var execute = function (component, simulatedEvent, tabbingConfig) {
7286
        return tabbingConfig.onEnter.bind(function (f) {
7287
          return f(component, simulatedEvent);
7288
        });
7289
      };
7290
      var exit = function (component, simulatedEvent, tabbingConfig) {
7291
        return tabbingConfig.onEscape.bind(function (f) {
7292
          return f(component, simulatedEvent);
7293
        });
7294
      };
637 daniel-mar 7295
      var getKeydownRules = constant$1([
597 daniel-mar 7296
        rule(and([
7297
          isShift,
7298
          inSet(TAB)
7299
        ]), goBackwards),
7300
        rule(inSet(TAB), goForwards),
7301
        rule(inSet(ESCAPE), exit),
7302
        rule(and([
7303
          isNotShift,
7304
          inSet(ENTER)
7305
        ]), execute)
7306
      ]);
637 daniel-mar 7307
      var getKeyupRules = constant$1([]);
597 daniel-mar 7308
      return typical(schema, NoState.init, getKeydownRules, getKeyupRules, function () {
7309
        return Optional.some(focusIn);
7310
      });
7311
    };
7312
 
637 daniel-mar 7313
    var AcyclicType = create$5(customField('cyclic', never));
597 daniel-mar 7314
 
637 daniel-mar 7315
    var CyclicType = create$5(customField('cyclic', always));
597 daniel-mar 7316
 
7317
    var doDefaultExecute = function (component, _simulatedEvent, focused) {
637 daniel-mar 7318
      dispatch(component, focused, execute$5());
597 daniel-mar 7319
      return Optional.some(true);
7320
    };
7321
    var defaultExecute = function (component, simulatedEvent, focused) {
7322
      var isComplex = inside(focused) && inSet(SPACE)(simulatedEvent.event);
7323
      return isComplex ? Optional.none() : doDefaultExecute(component, simulatedEvent, focused);
7324
    };
7325
    var stopEventForFirefox = function (_component, _simulatedEvent) {
7326
      return Optional.some(true);
7327
    };
7328
 
637 daniel-mar 7329
    var schema$v = [
7330
      defaulted('execute', defaultExecute),
7331
      defaulted('useSpace', false),
7332
      defaulted('useEnter', true),
7333
      defaulted('useControlEnter', false),
7334
      defaulted('useDown', false)
597 daniel-mar 7335
    ];
637 daniel-mar 7336
    var execute$4 = function (component, simulatedEvent, executeConfig) {
597 daniel-mar 7337
      return executeConfig.execute(component, simulatedEvent, component.element);
7338
    };
637 daniel-mar 7339
    var getKeydownRules$5 = function (component, _simulatedEvent, executeConfig, _executeState) {
597 daniel-mar 7340
      var spaceExec = executeConfig.useSpace && !inside(component.element) ? SPACE : [];
7341
      var enterExec = executeConfig.useEnter ? ENTER : [];
7342
      var downExec = executeConfig.useDown ? DOWN : [];
7343
      var execKeys = spaceExec.concat(enterExec).concat(downExec);
637 daniel-mar 7344
      return [rule(inSet(execKeys), execute$4)].concat(executeConfig.useControlEnter ? [rule(and([
597 daniel-mar 7345
          isControl,
7346
          inSet(ENTER)
637 daniel-mar 7347
        ]), execute$4)] : []);
597 daniel-mar 7348
    };
637 daniel-mar 7349
    var getKeyupRules$5 = function (component, _simulatedEvent, executeConfig, _executeState) {
597 daniel-mar 7350
      return executeConfig.useSpace && !inside(component.element) ? [rule(inSet(SPACE), stopEventForFirefox)] : [];
7351
    };
637 daniel-mar 7352
    var ExecutionType = typical(schema$v, NoState.init, getKeydownRules$5, getKeyupRules$5, function () {
597 daniel-mar 7353
      return Optional.none();
7354
    });
7355
 
637 daniel-mar 7356
    var flatgrid$1 = function () {
7357
      var dimensions = value$1();
597 daniel-mar 7358
      var setGridSize = function (numRows, numColumns) {
637 daniel-mar 7359
        dimensions.set({
597 daniel-mar 7360
          numRows: numRows,
7361
          numColumns: numColumns
637 daniel-mar 7362
        });
597 daniel-mar 7363
      };
7364
      var getNumRows = function () {
7365
        return dimensions.get().map(function (d) {
7366
          return d.numRows;
7367
        });
7368
      };
7369
      var getNumColumns = function () {
7370
        return dimensions.get().map(function (d) {
7371
          return d.numColumns;
7372
        });
7373
      };
637 daniel-mar 7374
      return nu$8({
597 daniel-mar 7375
        readState: function () {
7376
          return dimensions.get().map(function (d) {
7377
            return {
7378
              numRows: String(d.numRows),
7379
              numColumns: String(d.numColumns)
7380
            };
7381
          }).getOr({
7382
            numRows: '?',
7383
            numColumns: '?'
7384
          });
7385
        },
7386
        setGridSize: setGridSize,
7387
        getNumRows: getNumRows,
7388
        getNumColumns: getNumColumns
7389
      });
7390
    };
637 daniel-mar 7391
    var init$d = function (spec) {
597 daniel-mar 7392
      return spec.state(spec);
7393
    };
7394
 
7395
    var KeyingState = /*#__PURE__*/Object.freeze({
7396
        __proto__: null,
637 daniel-mar 7397
        flatgrid: flatgrid$1,
7398
        init: init$d
597 daniel-mar 7399
    });
7400
 
7401
    var useH = function (movement) {
7402
      return function (component, simulatedEvent, config, state) {
7403
        var move = movement(component.element);
7404
        return use(move, component, simulatedEvent, config, state);
7405
      };
7406
    };
637 daniel-mar 7407
    var west$1 = function (moveLeft, moveRight) {
597 daniel-mar 7408
      var movement = onDirection(moveLeft, moveRight);
7409
      return useH(movement);
7410
    };
637 daniel-mar 7411
    var east$1 = function (moveLeft, moveRight) {
597 daniel-mar 7412
      var movement = onDirection(moveRight, moveLeft);
7413
      return useH(movement);
7414
    };
7415
    var useV = function (move) {
7416
      return function (component, simulatedEvent, config, state) {
7417
        return use(move, component, simulatedEvent, config, state);
7418
      };
7419
    };
7420
    var use = function (move, component, simulatedEvent, config, state) {
7421
      var outcome = config.focusManager.get(component).bind(function (focused) {
7422
        return move(component.element, focused, config, state);
7423
      });
7424
      return outcome.map(function (newFocus) {
7425
        config.focusManager.set(component, newFocus);
7426
        return true;
7427
      });
7428
    };
637 daniel-mar 7429
    var north$1 = useV;
7430
    var south$1 = useV;
7431
    var move$1 = useV;
597 daniel-mar 7432
 
637 daniel-mar 7433
    var isHidden$1 = function (dom) {
597 daniel-mar 7434
      return dom.offsetWidth <= 0 && dom.offsetHeight <= 0;
7435
    };
7436
    var isVisible = function (element) {
637 daniel-mar 7437
      return !isHidden$1(element.dom);
597 daniel-mar 7438
    };
7439
 
7440
    var locate = function (candidates, predicate) {
637 daniel-mar 7441
      return findIndex$1(candidates, predicate).map(function (index) {
597 daniel-mar 7442
        return {
7443
          index: index,
7444
          candidates: candidates
7445
        };
7446
      });
7447
    };
7448
 
7449
    var locateVisible = function (container, current, selector) {
7450
      var predicate = function (x) {
637 daniel-mar 7451
        return eq(x, current);
597 daniel-mar 7452
      };
7453
      var candidates = descendants(container, selector);
637 daniel-mar 7454
      var visible = filter$2(candidates, isVisible);
597 daniel-mar 7455
      return locate(visible, predicate);
7456
    };
637 daniel-mar 7457
    var findIndex = function (elements, target) {
7458
      return findIndex$1(elements, function (elem) {
7459
        return eq(target, elem);
597 daniel-mar 7460
      });
7461
    };
7462
 
7463
    var withGrid = function (values, index, numCols, f) {
7464
      var oldRow = Math.floor(index / numCols);
7465
      var oldColumn = index % numCols;
7466
      return f(oldRow, oldColumn).bind(function (address) {
7467
        var newIndex = address.row * numCols + address.column;
7468
        return newIndex >= 0 && newIndex < values.length ? Optional.some(values[newIndex]) : Optional.none();
7469
      });
7470
    };
637 daniel-mar 7471
    var cycleHorizontal$1 = function (values, index, numRows, numCols, delta) {
597 daniel-mar 7472
      return withGrid(values, index, numCols, function (oldRow, oldColumn) {
7473
        var onLastRow = oldRow === numRows - 1;
7474
        var colsInRow = onLastRow ? values.length - oldRow * numCols : numCols;
7475
        var newColumn = cycleBy(oldColumn, delta, 0, colsInRow - 1);
7476
        return Optional.some({
7477
          row: oldRow,
7478
          column: newColumn
7479
        });
7480
      });
7481
    };
637 daniel-mar 7482
    var cycleVertical$1 = function (values, index, numRows, numCols, delta) {
597 daniel-mar 7483
      return withGrid(values, index, numCols, function (oldRow, oldColumn) {
7484
        var newRow = cycleBy(oldRow, delta, 0, numRows - 1);
7485
        var onLastRow = newRow === numRows - 1;
7486
        var colsInRow = onLastRow ? values.length - newRow * numCols : numCols;
637 daniel-mar 7487
        var newCol = clamp$1(oldColumn, 0, colsInRow - 1);
597 daniel-mar 7488
        return Optional.some({
7489
          row: newRow,
7490
          column: newCol
7491
        });
7492
      });
7493
    };
637 daniel-mar 7494
    var cycleRight$1 = function (values, index, numRows, numCols) {
7495
      return cycleHorizontal$1(values, index, numRows, numCols, +1);
597 daniel-mar 7496
    };
637 daniel-mar 7497
    var cycleLeft$1 = function (values, index, numRows, numCols) {
7498
      return cycleHorizontal$1(values, index, numRows, numCols, -1);
597 daniel-mar 7499
    };
637 daniel-mar 7500
    var cycleUp$1 = function (values, index, numRows, numCols) {
7501
      return cycleVertical$1(values, index, numRows, numCols, -1);
597 daniel-mar 7502
    };
637 daniel-mar 7503
    var cycleDown$1 = function (values, index, numRows, numCols) {
7504
      return cycleVertical$1(values, index, numRows, numCols, +1);
597 daniel-mar 7505
    };
7506
 
637 daniel-mar 7507
    var schema$u = [
7508
      required$1('selector'),
7509
      defaulted('execute', defaultExecute),
597 daniel-mar 7510
      onKeyboardHandler('onEscape'),
637 daniel-mar 7511
      defaulted('captureTab', false),
597 daniel-mar 7512
      initSize()
7513
    ];
637 daniel-mar 7514
    var focusIn$3 = function (component, gridConfig, _gridState) {
7515
      descendant(component.element, gridConfig.selector).each(function (first) {
597 daniel-mar 7516
        gridConfig.focusManager.set(component, first);
7517
      });
7518
    };
637 daniel-mar 7519
    var findCurrent$1 = function (component, gridConfig) {
597 daniel-mar 7520
      return gridConfig.focusManager.get(component).bind(function (elem) {
637 daniel-mar 7521
        return closest$1(elem, gridConfig.selector);
597 daniel-mar 7522
      });
7523
    };
637 daniel-mar 7524
    var execute$3 = function (component, simulatedEvent, gridConfig, _gridState) {
7525
      return findCurrent$1(component, gridConfig).bind(function (focused) {
597 daniel-mar 7526
        return gridConfig.execute(component, simulatedEvent, focused);
7527
      });
7528
    };
637 daniel-mar 7529
    var doMove$2 = function (cycle) {
597 daniel-mar 7530
      return function (element, focused, gridConfig, gridState) {
7531
        return locateVisible(element, focused, gridConfig.selector).bind(function (identified) {
7532
          return cycle(identified.candidates, identified.index, gridState.getNumRows().getOr(gridConfig.initSize.numRows), gridState.getNumColumns().getOr(gridConfig.initSize.numColumns));
7533
        });
7534
      };
7535
    };
7536
    var handleTab = function (_component, _simulatedEvent, gridConfig) {
7537
      return gridConfig.captureTab ? Optional.some(true) : Optional.none();
7538
    };
637 daniel-mar 7539
    var doEscape$1 = function (component, simulatedEvent, gridConfig) {
597 daniel-mar 7540
      return gridConfig.onEscape(component, simulatedEvent);
7541
    };
637 daniel-mar 7542
    var moveLeft$3 = doMove$2(cycleLeft$1);
7543
    var moveRight$3 = doMove$2(cycleRight$1);
7544
    var moveNorth$1 = doMove$2(cycleUp$1);
7545
    var moveSouth$1 = doMove$2(cycleDown$1);
7546
    var getKeydownRules$4 = constant$1([
7547
      rule(inSet(LEFT), west$1(moveLeft$3, moveRight$3)),
7548
      rule(inSet(RIGHT), east$1(moveLeft$3, moveRight$3)),
7549
      rule(inSet(UP), north$1(moveNorth$1)),
7550
      rule(inSet(DOWN), south$1(moveSouth$1)),
597 daniel-mar 7551
      rule(and([
7552
        isShift,
7553
        inSet(TAB)
7554
      ]), handleTab),
7555
      rule(and([
7556
        isNotShift,
7557
        inSet(TAB)
7558
      ]), handleTab),
637 daniel-mar 7559
      rule(inSet(ESCAPE), doEscape$1),
7560
      rule(inSet(SPACE.concat(ENTER)), execute$3)
597 daniel-mar 7561
    ]);
637 daniel-mar 7562
    var getKeyupRules$4 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);
7563
    var FlatgridType = typical(schema$u, flatgrid$1, getKeydownRules$4, getKeyupRules$4, function () {
7564
      return Optional.some(focusIn$3);
597 daniel-mar 7565
    });
7566
 
7567
    var horizontal = function (container, selector, current, delta) {
7568
      var isDisabledButton = function (candidate) {
679 daniel-mar 7569
        return name$2(candidate) === 'button' && get$d(candidate, 'disabled') === 'disabled';
597 daniel-mar 7570
      };
7571
      var tryCycle = function (initial, index, candidates) {
7572
        var newIndex = cycleBy(index, delta, 0, candidates.length - 1);
7573
        if (newIndex === initial) {
7574
          return Optional.none();
7575
        } else {
7576
          return isDisabledButton(candidates[newIndex]) ? tryCycle(initial, newIndex, candidates) : Optional.from(candidates[newIndex]);
7577
        }
7578
      };
7579
      return locateVisible(container, current, selector).bind(function (identified) {
7580
        var index = identified.index;
7581
        var candidates = identified.candidates;
7582
        return tryCycle(index, index, candidates);
7583
      });
7584
    };
7585
 
637 daniel-mar 7586
    var schema$t = [
7587
      required$1('selector'),
7588
      defaulted('getInitial', Optional.none),
7589
      defaulted('execute', defaultExecute),
597 daniel-mar 7590
      onKeyboardHandler('onEscape'),
637 daniel-mar 7591
      defaulted('executeOnMove', false),
7592
      defaulted('allowVertical', true)
597 daniel-mar 7593
    ];
637 daniel-mar 7594
    var findCurrent = function (component, flowConfig) {
597 daniel-mar 7595
      return flowConfig.focusManager.get(component).bind(function (elem) {
637 daniel-mar 7596
        return closest$1(elem, flowConfig.selector);
597 daniel-mar 7597
      });
7598
    };
637 daniel-mar 7599
    var execute$2 = function (component, simulatedEvent, flowConfig) {
7600
      return findCurrent(component, flowConfig).bind(function (focused) {
597 daniel-mar 7601
        return flowConfig.execute(component, simulatedEvent, focused);
7602
      });
7603
    };
637 daniel-mar 7604
    var focusIn$2 = function (component, flowConfig, _state) {
597 daniel-mar 7605
      flowConfig.getInitial(component).orThunk(function () {
637 daniel-mar 7606
        return descendant(component.element, flowConfig.selector);
597 daniel-mar 7607
      }).each(function (first) {
7608
        flowConfig.focusManager.set(component, first);
7609
      });
7610
    };
637 daniel-mar 7611
    var moveLeft$2 = function (element, focused, info) {
597 daniel-mar 7612
      return horizontal(element, info.selector, focused, -1);
7613
    };
637 daniel-mar 7614
    var moveRight$2 = function (element, focused, info) {
597 daniel-mar 7615
      return horizontal(element, info.selector, focused, +1);
7616
    };
7617
    var doMove$1 = function (movement) {
7618
      return function (component, simulatedEvent, flowConfig, flowState) {
7619
        return movement(component, simulatedEvent, flowConfig, flowState).bind(function () {
637 daniel-mar 7620
          return flowConfig.executeOnMove ? execute$2(component, simulatedEvent, flowConfig) : Optional.some(true);
597 daniel-mar 7621
        });
7622
      };
7623
    };
637 daniel-mar 7624
    var doEscape = function (component, simulatedEvent, flowConfig) {
597 daniel-mar 7625
      return flowConfig.onEscape(component, simulatedEvent);
7626
    };
637 daniel-mar 7627
    var getKeydownRules$3 = function (_component, _se, flowConfig, _flowState) {
597 daniel-mar 7628
      var westMovers = LEFT.concat(flowConfig.allowVertical ? UP : []);
7629
      var eastMovers = RIGHT.concat(flowConfig.allowVertical ? DOWN : []);
7630
      return [
637 daniel-mar 7631
        rule(inSet(westMovers), doMove$1(west$1(moveLeft$2, moveRight$2))),
7632
        rule(inSet(eastMovers), doMove$1(east$1(moveLeft$2, moveRight$2))),
7633
        rule(inSet(ENTER), execute$2),
7634
        rule(inSet(SPACE), execute$2),
7635
        rule(inSet(ESCAPE), doEscape)
597 daniel-mar 7636
      ];
7637
    };
637 daniel-mar 7638
    var getKeyupRules$3 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);
7639
    var FlowType = typical(schema$t, NoState.init, getKeydownRules$3, getKeyupRules$3, function () {
7640
      return Optional.some(focusIn$2);
597 daniel-mar 7641
    });
7642
 
7643
    var toCell = function (matrix, rowIndex, columnIndex) {
7644
      return Optional.from(matrix[rowIndex]).bind(function (row) {
7645
        return Optional.from(row[columnIndex]).map(function (cell) {
7646
          return {
7647
            rowIndex: rowIndex,
7648
            columnIndex: columnIndex,
7649
            cell: cell
7650
          };
7651
        });
7652
      });
7653
    };
637 daniel-mar 7654
    var cycleHorizontal = function (matrix, rowIndex, startCol, deltaCol) {
597 daniel-mar 7655
      var row = matrix[rowIndex];
7656
      var colsInRow = row.length;
7657
      var newColIndex = cycleBy(startCol, deltaCol, 0, colsInRow - 1);
7658
      return toCell(matrix, rowIndex, newColIndex);
7659
    };
637 daniel-mar 7660
    var cycleVertical = function (matrix, colIndex, startRow, deltaRow) {
597 daniel-mar 7661
      var nextRowIndex = cycleBy(startRow, deltaRow, 0, matrix.length - 1);
7662
      var colsInNextRow = matrix[nextRowIndex].length;
637 daniel-mar 7663
      var nextColIndex = clamp$1(colIndex, 0, colsInNextRow - 1);
597 daniel-mar 7664
      return toCell(matrix, nextRowIndex, nextColIndex);
7665
    };
7666
    var moveHorizontal = function (matrix, rowIndex, startCol, deltaCol) {
7667
      var row = matrix[rowIndex];
7668
      var colsInRow = row.length;
637 daniel-mar 7669
      var newColIndex = clamp$1(startCol + deltaCol, 0, colsInRow - 1);
597 daniel-mar 7670
      return toCell(matrix, rowIndex, newColIndex);
7671
    };
7672
    var moveVertical = function (matrix, colIndex, startRow, deltaRow) {
637 daniel-mar 7673
      var nextRowIndex = clamp$1(startRow + deltaRow, 0, matrix.length - 1);
597 daniel-mar 7674
      var colsInNextRow = matrix[nextRowIndex].length;
637 daniel-mar 7675
      var nextColIndex = clamp$1(colIndex, 0, colsInNextRow - 1);
597 daniel-mar 7676
      return toCell(matrix, nextRowIndex, nextColIndex);
7677
    };
637 daniel-mar 7678
    var cycleRight = function (matrix, startRow, startCol) {
7679
      return cycleHorizontal(matrix, startRow, startCol, +1);
597 daniel-mar 7680
    };
637 daniel-mar 7681
    var cycleLeft = function (matrix, startRow, startCol) {
7682
      return cycleHorizontal(matrix, startRow, startCol, -1);
597 daniel-mar 7683
    };
637 daniel-mar 7684
    var cycleUp = function (matrix, startRow, startCol) {
7685
      return cycleVertical(matrix, startCol, startRow, -1);
597 daniel-mar 7686
    };
637 daniel-mar 7687
    var cycleDown = function (matrix, startRow, startCol) {
7688
      return cycleVertical(matrix, startCol, startRow, +1);
597 daniel-mar 7689
    };
637 daniel-mar 7690
    var moveLeft$1 = function (matrix, startRow, startCol) {
597 daniel-mar 7691
      return moveHorizontal(matrix, startRow, startCol, -1);
7692
    };
637 daniel-mar 7693
    var moveRight$1 = function (matrix, startRow, startCol) {
597 daniel-mar 7694
      return moveHorizontal(matrix, startRow, startCol, +1);
7695
    };
637 daniel-mar 7696
    var moveUp$1 = function (matrix, startRow, startCol) {
597 daniel-mar 7697
      return moveVertical(matrix, startCol, startRow, -1);
7698
    };
637 daniel-mar 7699
    var moveDown$1 = function (matrix, startRow, startCol) {
597 daniel-mar 7700
      return moveVertical(matrix, startCol, startRow, +1);
7701
    };
7702
 
637 daniel-mar 7703
    var schema$s = [
7704
      requiredObjOf('selectors', [
7705
        required$1('row'),
7706
        required$1('cell')
597 daniel-mar 7707
      ]),
637 daniel-mar 7708
      defaulted('cycles', true),
7709
      defaulted('previousSelector', Optional.none),
7710
      defaulted('execute', defaultExecute)
597 daniel-mar 7711
    ];
637 daniel-mar 7712
    var focusIn$1 = function (component, matrixConfig, _state) {
597 daniel-mar 7713
      var focused = matrixConfig.previousSelector(component).orThunk(function () {
7714
        var selectors = matrixConfig.selectors;
637 daniel-mar 7715
        return descendant(component.element, selectors.cell);
597 daniel-mar 7716
      });
7717
      focused.each(function (cell) {
7718
        matrixConfig.focusManager.set(component, cell);
7719
      });
7720
    };
637 daniel-mar 7721
    var execute$1 = function (component, simulatedEvent, matrixConfig) {
597 daniel-mar 7722
      return search(component.element).bind(function (focused) {
7723
        return matrixConfig.execute(component, simulatedEvent, focused);
7724
      });
7725
    };
7726
    var toMatrix = function (rows, matrixConfig) {
637 daniel-mar 7727
      return map$2(rows, function (row) {
597 daniel-mar 7728
        return descendants(row, matrixConfig.selectors.cell);
7729
      });
7730
    };
637 daniel-mar 7731
    var doMove = function (ifCycle, ifMove) {
597 daniel-mar 7732
      return function (element, focused, matrixConfig) {
7733
        var move = matrixConfig.cycles ? ifCycle : ifMove;
637 daniel-mar 7734
        return closest$1(focused, matrixConfig.selectors.row).bind(function (inRow) {
597 daniel-mar 7735
          var cellsInRow = descendants(inRow, matrixConfig.selectors.cell);
637 daniel-mar 7736
          return findIndex(cellsInRow, focused).bind(function (colIndex) {
597 daniel-mar 7737
            var allRows = descendants(element, matrixConfig.selectors.row);
637 daniel-mar 7738
            return findIndex(allRows, inRow).bind(function (rowIndex) {
597 daniel-mar 7739
              var matrix = toMatrix(allRows, matrixConfig);
7740
              return move(matrix, rowIndex, colIndex).map(function (next) {
7741
                return next.cell;
7742
              });
7743
            });
7744
          });
7745
        });
7746
      };
7747
    };
637 daniel-mar 7748
    var moveLeft = doMove(cycleLeft, moveLeft$1);
7749
    var moveRight = doMove(cycleRight, moveRight$1);
7750
    var moveNorth = doMove(cycleUp, moveUp$1);
7751
    var moveSouth = doMove(cycleDown, moveDown$1);
7752
    var getKeydownRules$2 = constant$1([
7753
      rule(inSet(LEFT), west$1(moveLeft, moveRight)),
7754
      rule(inSet(RIGHT), east$1(moveLeft, moveRight)),
7755
      rule(inSet(UP), north$1(moveNorth)),
7756
      rule(inSet(DOWN), south$1(moveSouth)),
7757
      rule(inSet(SPACE.concat(ENTER)), execute$1)
597 daniel-mar 7758
    ]);
637 daniel-mar 7759
    var getKeyupRules$2 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);
7760
    var MatrixType = typical(schema$s, NoState.init, getKeydownRules$2, getKeyupRules$2, function () {
7761
      return Optional.some(focusIn$1);
597 daniel-mar 7762
    });
7763
 
637 daniel-mar 7764
    var schema$r = [
7765
      required$1('selector'),
7766
      defaulted('execute', defaultExecute),
7767
      defaulted('moveOnTab', false)
597 daniel-mar 7768
    ];
637 daniel-mar 7769
    var execute = function (component, simulatedEvent, menuConfig) {
597 daniel-mar 7770
      return menuConfig.focusManager.get(component).bind(function (focused) {
7771
        return menuConfig.execute(component, simulatedEvent, focused);
7772
      });
7773
    };
637 daniel-mar 7774
    var focusIn = function (component, menuConfig, _state) {
7775
      descendant(component.element, menuConfig.selector).each(function (first) {
597 daniel-mar 7776
        menuConfig.focusManager.set(component, first);
7777
      });
7778
    };
637 daniel-mar 7779
    var moveUp = function (element, focused, info) {
597 daniel-mar 7780
      return horizontal(element, info.selector, focused, -1);
7781
    };
637 daniel-mar 7782
    var moveDown = function (element, focused, info) {
597 daniel-mar 7783
      return horizontal(element, info.selector, focused, +1);
7784
    };
7785
    var fireShiftTab = function (component, simulatedEvent, menuConfig, menuState) {
637 daniel-mar 7786
      return menuConfig.moveOnTab ? move$1(moveUp)(component, simulatedEvent, menuConfig, menuState) : Optional.none();
597 daniel-mar 7787
    };
7788
    var fireTab = function (component, simulatedEvent, menuConfig, menuState) {
637 daniel-mar 7789
      return menuConfig.moveOnTab ? move$1(moveDown)(component, simulatedEvent, menuConfig, menuState) : Optional.none();
597 daniel-mar 7790
    };
637 daniel-mar 7791
    var getKeydownRules$1 = constant$1([
7792
      rule(inSet(UP), move$1(moveUp)),
7793
      rule(inSet(DOWN), move$1(moveDown)),
597 daniel-mar 7794
      rule(and([
7795
        isShift,
7796
        inSet(TAB)
7797
      ]), fireShiftTab),
7798
      rule(and([
7799
        isNotShift,
7800
        inSet(TAB)
7801
      ]), fireTab),
637 daniel-mar 7802
      rule(inSet(ENTER), execute),
7803
      rule(inSet(SPACE), execute)
597 daniel-mar 7804
    ]);
637 daniel-mar 7805
    var getKeyupRules$1 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);
7806
    var MenuType = typical(schema$r, NoState.init, getKeydownRules$1, getKeyupRules$1, function () {
7807
      return Optional.some(focusIn);
597 daniel-mar 7808
    });
7809
 
637 daniel-mar 7810
    var schema$q = [
597 daniel-mar 7811
      onKeyboardHandler('onSpace'),
7812
      onKeyboardHandler('onEnter'),
7813
      onKeyboardHandler('onShiftEnter'),
7814
      onKeyboardHandler('onLeft'),
7815
      onKeyboardHandler('onRight'),
7816
      onKeyboardHandler('onTab'),
7817
      onKeyboardHandler('onShiftTab'),
7818
      onKeyboardHandler('onUp'),
7819
      onKeyboardHandler('onDown'),
7820
      onKeyboardHandler('onEscape'),
637 daniel-mar 7821
      defaulted('stopSpaceKeyup', false),
597 daniel-mar 7822
      option('focusIn')
7823
    ];
637 daniel-mar 7824
    var getKeydownRules = function (component, simulatedEvent, specialInfo) {
597 daniel-mar 7825
      return [
7826
        rule(inSet(SPACE), specialInfo.onSpace),
7827
        rule(and([
7828
          isNotShift,
7829
          inSet(ENTER)
7830
        ]), specialInfo.onEnter),
7831
        rule(and([
7832
          isShift,
7833
          inSet(ENTER)
7834
        ]), specialInfo.onShiftEnter),
7835
        rule(and([
7836
          isShift,
7837
          inSet(TAB)
7838
        ]), specialInfo.onShiftTab),
7839
        rule(and([
7840
          isNotShift,
7841
          inSet(TAB)
7842
        ]), specialInfo.onTab),
7843
        rule(inSet(UP), specialInfo.onUp),
7844
        rule(inSet(DOWN), specialInfo.onDown),
7845
        rule(inSet(LEFT), specialInfo.onLeft),
7846
        rule(inSet(RIGHT), specialInfo.onRight),
7847
        rule(inSet(SPACE), specialInfo.onSpace),
7848
        rule(inSet(ESCAPE), specialInfo.onEscape)
7849
      ];
7850
    };
637 daniel-mar 7851
    var getKeyupRules = function (component, simulatedEvent, specialInfo) {
597 daniel-mar 7852
      return specialInfo.stopSpaceKeyup ? [rule(inSet(SPACE), stopEventForFirefox)] : [];
7853
    };
637 daniel-mar 7854
    var SpecialType = typical(schema$q, NoState.init, getKeydownRules, getKeyupRules, function (specialInfo) {
597 daniel-mar 7855
      return specialInfo.focusIn;
7856
    });
7857
 
7858
    var acyclic = AcyclicType.schema();
7859
    var cyclic = CyclicType.schema();
7860
    var flow = FlowType.schema();
637 daniel-mar 7861
    var flatgrid = FlatgridType.schema();
597 daniel-mar 7862
    var matrix = MatrixType.schema();
7863
    var execution = ExecutionType.schema();
7864
    var menu = MenuType.schema();
7865
    var special = SpecialType.schema();
7866
 
7867
    var KeyboardBranches = /*#__PURE__*/Object.freeze({
7868
        __proto__: null,
7869
        acyclic: acyclic,
7870
        cyclic: cyclic,
7871
        flow: flow,
637 daniel-mar 7872
        flatgrid: flatgrid,
597 daniel-mar 7873
        matrix: matrix,
7874
        execution: execution,
7875
        menu: menu,
7876
        special: special
7877
    });
7878
 
7879
    var isFlatgridState = function (keyState) {
7880
      return hasNonNullableKey(keyState, 'setGridSize');
7881
    };
637 daniel-mar 7882
    var Keying = createModes({
597 daniel-mar 7883
      branchKey: 'mode',
7884
      branches: KeyboardBranches,
7885
      name: 'keying',
7886
      active: {
7887
        events: function (keyingConfig, keyingState) {
7888
          var handler = keyingConfig.handler;
7889
          return handler.toEvents(keyingConfig, keyingState);
7890
        }
7891
      },
7892
      apis: {
7893
        focusIn: function (component, keyConfig, keyState) {
7894
          keyConfig.sendFocusIn(keyConfig).fold(function () {
7895
            component.getSystem().triggerFocus(component.element, component.element);
7896
          }, function (sendFocusIn) {
7897
            sendFocusIn(component, keyConfig, keyState);
7898
          });
7899
        },
7900
        setGridSize: function (component, keyConfig, keyState, numRows, numColumns) {
7901
          if (!isFlatgridState(keyState)) {
7902
            console.error('Layout does not support setGridSize');
7903
          } else {
7904
            keyState.setGridSize(numRows, numColumns);
7905
          }
7906
        }
7907
      },
7908
      state: KeyingState
7909
    });
7910
 
637 daniel-mar 7911
    var set$2 = function (component, replaceConfig, replaceState, data) {
7912
      preserve$1(function () {
7913
        var newChildren = map$2(data, component.getSystem().build);
597 daniel-mar 7914
        replaceChildren(component, newChildren);
7915
      }, component.element);
7916
    };
7917
    var insert = function (component, replaceConfig, insertion, childSpec) {
7918
      var child = component.getSystem().build(childSpec);
7919
      attachWith(component, child, insertion);
7920
    };
637 daniel-mar 7921
    var append = function (component, replaceConfig, replaceState, appendee) {
7922
      insert(component, replaceConfig, append$2, appendee);
597 daniel-mar 7923
    };
637 daniel-mar 7924
    var prepend = function (component, replaceConfig, replaceState, prependee) {
7925
      insert(component, replaceConfig, prepend$1, prependee);
597 daniel-mar 7926
    };
637 daniel-mar 7927
    var remove = function (component, replaceConfig, replaceState, removee) {
597 daniel-mar 7928
      var children = contents(component);
637 daniel-mar 7929
      var foundChild = find$5(children, function (child) {
7930
        return eq(removee.element, child.element);
597 daniel-mar 7931
      });
7932
      foundChild.each(detach);
7933
    };
7934
    var contents = function (component, _replaceConfig) {
7935
      return component.components();
7936
    };
7937
    var replaceAt = function (component, replaceConfig, replaceState, replaceeIndex, replacer) {
7938
      var children = contents(component);
7939
      return Optional.from(children[replaceeIndex]).map(function (replacee) {
637 daniel-mar 7940
        remove(component, replaceConfig, replaceState, replacee);
597 daniel-mar 7941
        replacer.each(function (r) {
7942
          insert(component, replaceConfig, function (p, c) {
7943
            appendAt(p, c, replaceeIndex);
7944
          }, r);
7945
        });
7946
        return replacee;
7947
      });
7948
    };
7949
    var replaceBy = function (component, replaceConfig, replaceState, replaceePred, replacer) {
7950
      var children = contents(component);
637 daniel-mar 7951
      return findIndex$1(children, replaceePred).bind(function (replaceeIndex) {
597 daniel-mar 7952
        return replaceAt(component, replaceConfig, replaceState, replaceeIndex, replacer);
7953
      });
7954
    };
7955
 
7956
    var ReplaceApis = /*#__PURE__*/Object.freeze({
7957
        __proto__: null,
637 daniel-mar 7958
        append: append,
7959
        prepend: prepend,
7960
        remove: remove,
597 daniel-mar 7961
        replaceAt: replaceAt,
7962
        replaceBy: replaceBy,
637 daniel-mar 7963
        set: set$2,
597 daniel-mar 7964
        contents: contents
7965
    });
7966
 
637 daniel-mar 7967
    var Replacing = create$7({
597 daniel-mar 7968
      fields: [],
7969
      name: 'replacing',
7970
      apis: ReplaceApis
7971
    });
7972
 
637 daniel-mar 7973
    var events$d = function (name, eventHandlers) {
7974
      var events = derive$2(eventHandlers);
7975
      return create$7({
7976
        fields: [required$1('enabled')],
597 daniel-mar 7977
        name: name,
637 daniel-mar 7978
        active: { events: constant$1(events) }
597 daniel-mar 7979
      });
7980
    };
7981
    var config = function (name, eventHandlers) {
637 daniel-mar 7982
      var me = events$d(name, eventHandlers);
597 daniel-mar 7983
      return {
7984
        key: name,
7985
        value: {
7986
          config: {},
7987
          me: me,
637 daniel-mar 7988
          configAsRaw: constant$1({}),
597 daniel-mar 7989
          initialConfig: {},
7990
          state: NoState
7991
        }
7992
      };
7993
    };
7994
 
7995
    var focus$2 = function (component, focusConfig) {
7996
      if (!focusConfig.ignore) {
637 daniel-mar 7997
        focus$3(component.element);
597 daniel-mar 7998
        focusConfig.onFocus(component);
7999
      }
8000
    };
637 daniel-mar 8001
    var blur = function (component, focusConfig) {
597 daniel-mar 8002
      if (!focusConfig.ignore) {
637 daniel-mar 8003
        blur$1(component.element);
597 daniel-mar 8004
      }
8005
    };
8006
    var isFocused = function (component) {
8007
      return hasFocus(component.element);
8008
    };
8009
 
8010
    var FocusApis = /*#__PURE__*/Object.freeze({
8011
        __proto__: null,
8012
        focus: focus$2,
637 daniel-mar 8013
        blur: blur,
597 daniel-mar 8014
        isFocused: isFocused
8015
    });
8016
 
637 daniel-mar 8017
    var exhibit$4 = function (base, focusConfig) {
597 daniel-mar 8018
      var mod = focusConfig.ignore ? {} : { attributes: { tabindex: '-1' } };
637 daniel-mar 8019
      return nu$7(mod);
597 daniel-mar 8020
    };
637 daniel-mar 8021
    var events$c = function (focusConfig) {
8022
      return derive$2([run$1(focus$4(), function (component, simulatedEvent) {
597 daniel-mar 8023
          focus$2(component, focusConfig);
8024
          simulatedEvent.stop();
637 daniel-mar 8025
        })].concat(focusConfig.stopMousedown ? [run$1(mousedown(), function (_, simulatedEvent) {
597 daniel-mar 8026
          simulatedEvent.event.prevent();
8027
        })] : []));
8028
    };
8029
 
8030
    var ActiveFocus = /*#__PURE__*/Object.freeze({
8031
        __proto__: null,
637 daniel-mar 8032
        exhibit: exhibit$4,
8033
        events: events$c
597 daniel-mar 8034
    });
8035
 
8036
    var FocusSchema = [
8037
      onHandler('onFocus'),
637 daniel-mar 8038
      defaulted('stopMousedown', false),
8039
      defaulted('ignore', false)
597 daniel-mar 8040
    ];
8041
 
637 daniel-mar 8042
    var Focusing = create$7({
597 daniel-mar 8043
      fields: FocusSchema,
8044
      name: 'focusing',
8045
      active: ActiveFocus,
8046
      apis: FocusApis
8047
    });
8048
 
8049
    var SetupBehaviourCellState = function (initialState) {
8050
      var init = function () {
8051
        var cell = Cell(initialState);
8052
        var get = function () {
8053
          return cell.get();
8054
        };
8055
        var set = function (newState) {
8056
          return cell.set(newState);
8057
        };
8058
        var clear = function () {
8059
          return cell.set(initialState);
8060
        };
8061
        var readState = function () {
8062
          return cell.get();
8063
        };
8064
        return {
8065
          get: get,
8066
          set: set,
8067
          clear: clear,
8068
          readState: readState
8069
        };
8070
      };
8071
      return { init: init };
8072
    };
8073
 
8074
    var updateAriaState = function (component, toggleConfig, toggleState) {
8075
      var ariaInfo = toggleConfig.aria;
8076
      ariaInfo.update(component, ariaInfo, toggleState.get());
8077
    };
8078
    var updateClass = function (component, toggleConfig, toggleState) {
8079
      toggleConfig.toggleClass.each(function (toggleClass) {
8080
        if (toggleState.get()) {
8081
          add$2(component.element, toggleClass);
8082
        } else {
679 daniel-mar 8083
          remove$2(component.element, toggleClass);
597 daniel-mar 8084
        }
8085
      });
8086
    };
637 daniel-mar 8087
    var toggle$2 = function (component, toggleConfig, toggleState) {
8088
      set$1(component, toggleConfig, toggleState, !toggleState.get());
597 daniel-mar 8089
    };
637 daniel-mar 8090
    var on = function (component, toggleConfig, toggleState) {
597 daniel-mar 8091
      toggleState.set(true);
8092
      updateClass(component, toggleConfig, toggleState);
8093
      updateAriaState(component, toggleConfig, toggleState);
8094
    };
8095
    var off = function (component, toggleConfig, toggleState) {
8096
      toggleState.set(false);
8097
      updateClass(component, toggleConfig, toggleState);
8098
      updateAriaState(component, toggleConfig, toggleState);
8099
    };
637 daniel-mar 8100
    var set$1 = function (component, toggleConfig, toggleState, state) {
8101
      var action = state ? on : off;
597 daniel-mar 8102
      action(component, toggleConfig, toggleState);
8103
    };
8104
    var isOn = function (component, toggleConfig, toggleState) {
8105
      return toggleState.get();
8106
    };
637 daniel-mar 8107
    var onLoad = function (component, toggleConfig, toggleState) {
8108
      set$1(component, toggleConfig, toggleState, toggleConfig.selected);
597 daniel-mar 8109
    };
8110
 
8111
    var ToggleApis = /*#__PURE__*/Object.freeze({
8112
        __proto__: null,
637 daniel-mar 8113
        onLoad: onLoad,
8114
        toggle: toggle$2,
597 daniel-mar 8115
        isOn: isOn,
637 daniel-mar 8116
        on: on,
597 daniel-mar 8117
        off: off,
637 daniel-mar 8118
        set: set$1
597 daniel-mar 8119
    });
8120
 
637 daniel-mar 8121
    var exhibit$3 = function () {
8122
      return nu$7({});
597 daniel-mar 8123
    };
637 daniel-mar 8124
    var events$b = function (toggleConfig, toggleState) {
8125
      var execute = executeEvent(toggleConfig, toggleState, toggle$2);
8126
      var load = loadEvent(toggleConfig, toggleState, onLoad);
8127
      return derive$2(flatten([
597 daniel-mar 8128
        toggleConfig.toggleOnExecute ? [execute] : [],
8129
        [load]
8130
      ]));
8131
    };
8132
 
8133
    var ActiveToggle = /*#__PURE__*/Object.freeze({
8134
        __proto__: null,
637 daniel-mar 8135
        exhibit: exhibit$3,
8136
        events: events$b
597 daniel-mar 8137
    });
8138
 
8139
    var updatePressed = function (component, ariaInfo, status) {
679 daniel-mar 8140
      set$8(component.element, 'aria-pressed', status);
597 daniel-mar 8141
      if (ariaInfo.syncWithExpanded) {
8142
        updateExpanded(component, ariaInfo, status);
8143
      }
8144
    };
8145
    var updateSelected = function (component, ariaInfo, status) {
679 daniel-mar 8146
      set$8(component.element, 'aria-selected', status);
597 daniel-mar 8147
    };
8148
    var updateChecked = function (component, ariaInfo, status) {
679 daniel-mar 8149
      set$8(component.element, 'aria-checked', status);
597 daniel-mar 8150
    };
8151
    var updateExpanded = function (component, ariaInfo, status) {
679 daniel-mar 8152
      set$8(component.element, 'aria-expanded', status);
597 daniel-mar 8153
    };
8154
 
8155
    var ToggleSchema = [
637 daniel-mar 8156
      defaulted('selected', false),
597 daniel-mar 8157
      option('toggleClass'),
637 daniel-mar 8158
      defaulted('toggleOnExecute', true),
597 daniel-mar 8159
      defaultedOf('aria', { mode: 'none' }, choose$1('mode', {
8160
        pressed: [
637 daniel-mar 8161
          defaulted('syncWithExpanded', false),
8162
          output$1('update', updatePressed)
597 daniel-mar 8163
        ],
637 daniel-mar 8164
        checked: [output$1('update', updateChecked)],
8165
        expanded: [output$1('update', updateExpanded)],
8166
        selected: [output$1('update', updateSelected)],
8167
        none: [output$1('update', noop)]
597 daniel-mar 8168
      }))
8169
    ];
8170
 
637 daniel-mar 8171
    var Toggling = create$7({
597 daniel-mar 8172
      fields: ToggleSchema,
8173
      name: 'toggling',
8174
      active: ActiveToggle,
8175
      apis: ToggleApis,
8176
      state: SetupBehaviourCellState(false)
8177
    });
8178
 
8179
    var pointerEvents = function () {
8180
      var onClick = function (component, simulatedEvent) {
8181
        simulatedEvent.stop();
8182
        emitExecute(component);
8183
      };
8184
      return [
637 daniel-mar 8185
        run$1(click(), onClick),
8186
        run$1(tap(), onClick),
597 daniel-mar 8187
        cutter(touchstart()),
8188
        cutter(mousedown())
8189
      ];
8190
    };
637 daniel-mar 8191
    var events$a = function (optAction) {
597 daniel-mar 8192
      var executeHandler = function (action) {
637 daniel-mar 8193
        return runOnExecute$1(function (component, simulatedEvent) {
597 daniel-mar 8194
          action(component);
8195
          simulatedEvent.stop();
8196
        });
8197
      };
637 daniel-mar 8198
      return derive$2(flatten([
597 daniel-mar 8199
        optAction.map(executeHandler).toArray(),
8200
        pointerEvents()
8201
      ]));
8202
    };
8203
 
8204
    var hoverEvent = 'alloy.item-hover';
8205
    var focusEvent = 'alloy.item-focus';
8206
    var onHover = function (item) {
8207
      if (search(item.element).isNone() || Focusing.isFocused(item)) {
8208
        if (!Focusing.isFocused(item)) {
8209
          Focusing.focus(item);
8210
        }
8211
        emitWith(item, hoverEvent, { item: item });
8212
      }
8213
    };
637 daniel-mar 8214
    var onFocus$1 = function (item) {
597 daniel-mar 8215
      emitWith(item, focusEvent, { item: item });
8216
    };
637 daniel-mar 8217
    var hover = constant$1(hoverEvent);
8218
    var focus$1 = constant$1(focusEvent);
597 daniel-mar 8219
 
637 daniel-mar 8220
    var builder$2 = function (detail) {
597 daniel-mar 8221
      return {
8222
        dom: detail.dom,
8223
        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 } : {}) }),
8224
        behaviours: SketchBehaviours.augment(detail.itemBehaviours, [
8225
          detail.toggling.fold(Toggling.revoke, function (tConfig) {
8226
            return Toggling.config(__assign({ aria: { mode: 'checked' } }, tConfig));
8227
          }),
8228
          Focusing.config({
8229
            ignore: detail.ignoreFocus,
8230
            stopMousedown: detail.ignoreFocus,
8231
            onFocus: function (component) {
637 daniel-mar 8232
              onFocus$1(component);
597 daniel-mar 8233
            }
8234
          }),
8235
          Keying.config({ mode: 'execution' }),
8236
          Representing.config({
8237
            store: {
8238
              mode: 'memory',
8239
              initialValue: detail.data
8240
            }
8241
          }),
679 daniel-mar 8242
          config('item-type-events', __spreadArray(__spreadArray([], pointerEvents(), true), [
637 daniel-mar 8243
            run$1(mouseover(), onHover),
8244
            run$1(focusItem(), Focusing.focus)
679 daniel-mar 8245
          ], false))
597 daniel-mar 8246
        ]),
8247
        components: detail.components,
8248
        eventOrder: detail.eventOrder
8249
      };
8250
    };
637 daniel-mar 8251
    var schema$p = [
8252
      required$1('data'),
8253
      required$1('components'),
8254
      required$1('dom'),
8255
      defaulted('hasSubmenu', false),
597 daniel-mar 8256
      option('toggling'),
8257
      SketchBehaviours.field('itemBehaviours', [
8258
        Toggling,
8259
        Focusing,
8260
        Keying,
8261
        Representing
8262
      ]),
637 daniel-mar 8263
      defaulted('ignoreFocus', false),
8264
      defaulted('domModification', {}),
8265
      output$1('builder', builder$2),
8266
      defaulted('eventOrder', {})
597 daniel-mar 8267
    ];
8268
 
8269
    var builder$1 = function (detail) {
8270
      return {
8271
        dom: detail.dom,
8272
        components: detail.components,
637 daniel-mar 8273
        events: derive$2([stopper(focusItem())])
597 daniel-mar 8274
      };
8275
    };
637 daniel-mar 8276
    var schema$o = [
8277
      required$1('dom'),
8278
      required$1('components'),
8279
      output$1('builder', builder$1)
597 daniel-mar 8280
    ];
8281
 
637 daniel-mar 8282
    var owner$2 = constant$1('item-widget');
8283
    var parts$h = constant$1([required({
597 daniel-mar 8284
        name: 'widget',
8285
        overrides: function (detail) {
8286
          return {
8287
            behaviours: derive$1([Representing.config({
8288
                store: {
8289
                  mode: 'manual',
8290
                  getValue: function (_component) {
8291
                    return detail.data;
8292
                  },
8293
                  setValue: noop
8294
                }
8295
              })])
8296
          };
8297
        }
8298
      })]);
8299
 
637 daniel-mar 8300
    var builder = function (detail) {
8301
      var subs = substitutes(owner$2(), detail, parts$h());
8302
      var components = components$1(owner$2(), detail, subs.internals());
597 daniel-mar 8303
      var focusWidget = function (component) {
8304
        return getPart(component, detail, 'widget').map(function (widget) {
8305
          Keying.focusIn(widget);
8306
          return widget;
8307
        });
8308
      };
8309
      var onHorizontalArrow = function (component, simulatedEvent) {
8310
        return inside(simulatedEvent.event.target) ? Optional.none() : function () {
8311
          if (detail.autofocus) {
8312
            simulatedEvent.setSource(component.element);
8313
            return Optional.none();
8314
          } else {
8315
            return Optional.none();
8316
          }
8317
        }();
8318
      };
8319
      return {
8320
        dom: detail.dom,
637 daniel-mar 8321
        components: components,
597 daniel-mar 8322
        domModification: detail.domModification,
637 daniel-mar 8323
        events: derive$2([
8324
          runOnExecute$1(function (component, simulatedEvent) {
597 daniel-mar 8325
            focusWidget(component).each(function (_widget) {
8326
              simulatedEvent.stop();
8327
            });
8328
          }),
637 daniel-mar 8329
          run$1(mouseover(), onHover),
8330
          run$1(focusItem(), function (component, _simulatedEvent) {
597 daniel-mar 8331
            if (detail.autofocus) {
8332
              focusWidget(component);
8333
            } else {
8334
              Focusing.focus(component);
8335
            }
8336
          })
8337
        ]),
8338
        behaviours: SketchBehaviours.augment(detail.widgetBehaviours, [
8339
          Representing.config({
8340
            store: {
8341
              mode: 'memory',
8342
              initialValue: detail.data
8343
            }
8344
          }),
8345
          Focusing.config({
8346
            ignore: detail.ignoreFocus,
8347
            onFocus: function (component) {
637 daniel-mar 8348
              onFocus$1(component);
597 daniel-mar 8349
            }
8350
          }),
8351
          Keying.config({
8352
            mode: 'special',
8353
            focusIn: detail.autofocus ? function (component) {
8354
              focusWidget(component);
8355
            } : revoke(),
8356
            onLeft: onHorizontalArrow,
8357
            onRight: onHorizontalArrow,
8358
            onEscape: function (component, simulatedEvent) {
8359
              if (!Focusing.isFocused(component) && !detail.autofocus) {
8360
                Focusing.focus(component);
8361
                return Optional.some(true);
8362
              } else if (detail.autofocus) {
8363
                simulatedEvent.setSource(component.element);
8364
                return Optional.none();
8365
              } else {
8366
                return Optional.none();
8367
              }
8368
            }
8369
          })
8370
        ])
8371
      };
8372
    };
637 daniel-mar 8373
    var schema$n = [
8374
      required$1('uid'),
8375
      required$1('data'),
8376
      required$1('components'),
8377
      required$1('dom'),
8378
      defaulted('autofocus', false),
8379
      defaulted('ignoreFocus', false),
597 daniel-mar 8380
      SketchBehaviours.field('widgetBehaviours', [
8381
        Representing,
8382
        Focusing,
8383
        Keying
8384
      ]),
637 daniel-mar 8385
      defaulted('domModification', {}),
8386
      defaultUidsSchema(parts$h()),
8387
      output$1('builder', builder)
597 daniel-mar 8388
    ];
8389
 
637 daniel-mar 8390
    var itemSchema$2 = choose$1('type', {
8391
      widget: schema$n,
8392
      item: schema$p,
8393
      separator: schema$o
597 daniel-mar 8394
    });
8395
    var configureGrid = function (detail, movementInfo) {
8396
      return {
8397
        mode: 'flatgrid',
8398
        selector: '.' + detail.markers.item,
8399
        initSize: {
8400
          numColumns: movementInfo.initSize.numColumns,
8401
          numRows: movementInfo.initSize.numRows
8402
        },
8403
        focusManager: detail.focusManager
8404
      };
8405
    };
8406
    var configureMatrix = function (detail, movementInfo) {
8407
      return {
8408
        mode: 'matrix',
8409
        selectors: {
8410
          row: movementInfo.rowSelector,
8411
          cell: '.' + detail.markers.item
8412
        },
8413
        focusManager: detail.focusManager
8414
      };
8415
    };
8416
    var configureMenu = function (detail, movementInfo) {
8417
      return {
8418
        mode: 'menu',
8419
        selector: '.' + detail.markers.item,
8420
        moveOnTab: movementInfo.moveOnTab,
8421
        focusManager: detail.focusManager
8422
      };
8423
    };
637 daniel-mar 8424
    var parts$g = constant$1([group({
597 daniel-mar 8425
        factory: {
8426
          sketch: function (spec) {
637 daniel-mar 8427
            var itemInfo = asRawOrDie$1('menu.spec item', itemSchema$2, spec);
597 daniel-mar 8428
            return itemInfo.builder(itemInfo);
8429
          }
8430
        },
8431
        name: 'items',
8432
        unit: 'item',
8433
        defaults: function (detail, u) {
637 daniel-mar 8434
          return has$2(u, 'uid') ? u : __assign(__assign({}, u), { uid: generate$5('item') });
597 daniel-mar 8435
        },
8436
        overrides: function (detail, u) {
8437
          return {
8438
            type: u.type,
8439
            ignoreFocus: detail.fakeFocus,
8440
            domModification: { classes: [detail.markers.item] }
8441
          };
8442
        }
8443
      })]);
637 daniel-mar 8444
    var schema$m = constant$1([
8445
      required$1('value'),
8446
      required$1('items'),
8447
      required$1('dom'),
8448
      required$1('components'),
8449
      defaulted('eventOrder', {}),
8450
      field('menuBehaviours', [
597 daniel-mar 8451
        Highlighting,
8452
        Representing,
8453
        Composing,
8454
        Keying
8455
      ]),
8456
      defaultedOf('movement', {
8457
        mode: 'menu',
8458
        moveOnTab: true
8459
      }, choose$1('mode', {
8460
        grid: [
8461
          initSize(),
637 daniel-mar 8462
          output$1('config', configureGrid)
597 daniel-mar 8463
        ],
8464
        matrix: [
637 daniel-mar 8465
          output$1('config', configureMatrix),
8466
          required$1('rowSelector')
597 daniel-mar 8467
        ],
8468
        menu: [
637 daniel-mar 8469
          defaulted('moveOnTab', true),
8470
          output$1('config', configureMenu)
597 daniel-mar 8471
        ]
8472
      })),
8473
      itemMarkers(),
637 daniel-mar 8474
      defaulted('fakeFocus', false),
8475
      defaulted('focusManager', dom$2()),
597 daniel-mar 8476
      onHandler('onHighlight')
8477
    ]);
8478
 
637 daniel-mar 8479
    var focus = constant$1('alloy.menu-focus');
597 daniel-mar 8480
 
637 daniel-mar 8481
    var make$7 = function (detail, components, _spec, _externals) {
597 daniel-mar 8482
      return {
8483
        uid: detail.uid,
8484
        dom: detail.dom,
8485
        markers: detail.markers,
8486
        behaviours: augment(detail.menuBehaviours, [
8487
          Highlighting.config({
8488
            highlightClass: detail.markers.selectedItem,
8489
            itemClass: detail.markers.item,
8490
            onHighlight: detail.onHighlight
8491
          }),
8492
          Representing.config({
8493
            store: {
8494
              mode: 'memory',
8495
              initialValue: detail.value
8496
            }
8497
          }),
8498
          Composing.config({ find: Optional.some }),
8499
          Keying.config(detail.movement.config(detail, detail.movement))
8500
        ]),
637 daniel-mar 8501
        events: derive$2([
8502
          run$1(focus$1(), function (menu, simulatedEvent) {
597 daniel-mar 8503
            var event = simulatedEvent.event;
8504
            menu.getSystem().getByDom(event.target).each(function (item) {
8505
              Highlighting.highlight(menu, item);
8506
              simulatedEvent.stop();
637 daniel-mar 8507
              emitWith(menu, focus(), {
597 daniel-mar 8508
                menu: menu,
8509
                item: item
8510
              });
8511
            });
8512
          }),
637 daniel-mar 8513
          run$1(hover(), function (menu, simulatedEvent) {
597 daniel-mar 8514
            var item = simulatedEvent.event.item;
8515
            Highlighting.highlight(menu, item);
8516
          })
8517
        ]),
8518
        components: components,
8519
        eventOrder: detail.eventOrder,
8520
        domModification: { attributes: { role: 'menu' } }
8521
      };
8522
    };
8523
 
637 daniel-mar 8524
    var Menu = composite({
597 daniel-mar 8525
      name: 'Menu',
637 daniel-mar 8526
      configFields: schema$m(),
8527
      partFields: parts$g(),
8528
      factory: make$7
597 daniel-mar 8529
    });
8530
 
637 daniel-mar 8531
    var transpose$1 = function (obj) {
597 daniel-mar 8532
      return tupleMap(obj, function (v, k) {
8533
        return {
8534
          k: v,
8535
          v: k
8536
        };
8537
      });
8538
    };
8539
    var trace = function (items, byItem, byMenu, finish) {
637 daniel-mar 8540
      return get$e(byMenu, finish).bind(function (triggerItem) {
8541
        return get$e(items, triggerItem).bind(function (triggerMenu) {
597 daniel-mar 8542
          var rest = trace(items, byItem, byMenu, triggerMenu);
8543
          return Optional.some([triggerMenu].concat(rest));
8544
        });
8545
      }).getOr([]);
8546
    };
637 daniel-mar 8547
    var generate$2 = function (menus, expansions) {
597 daniel-mar 8548
      var items = {};
637 daniel-mar 8549
      each(menus, function (menuItems, menu) {
8550
        each$1(menuItems, function (item) {
597 daniel-mar 8551
          items[item] = menu;
8552
        });
8553
      });
8554
      var byItem = expansions;
637 daniel-mar 8555
      var byMenu = transpose$1(expansions);
679 daniel-mar 8556
      var menuPaths = map$1(byMenu, function (_triggerItem, submenu) {
597 daniel-mar 8557
        return [submenu].concat(trace(items, byItem, byMenu, submenu));
8558
      });
679 daniel-mar 8559
      return map$1(items, function (menu) {
637 daniel-mar 8560
        return get$e(menuPaths, menu).getOr([menu]);
597 daniel-mar 8561
      });
8562
    };
8563
 
637 daniel-mar 8564
    var init$c = function () {
597 daniel-mar 8565
      var expansions = Cell({});
8566
      var menus = Cell({});
8567
      var paths = Cell({});
637 daniel-mar 8568
      var primary = value$1();
597 daniel-mar 8569
      var directory = Cell({});
8570
      var clear = function () {
8571
        expansions.set({});
8572
        menus.set({});
8573
        paths.set({});
637 daniel-mar 8574
        primary.clear();
597 daniel-mar 8575
      };
8576
      var isClear = function () {
8577
        return primary.get().isNone();
8578
      };
8579
      var setMenuBuilt = function (menuName, built) {
8580
        var _a;
8581
        menus.set(__assign(__assign({}, menus.get()), (_a = {}, _a[menuName] = {
8582
          type: 'prepared',
8583
          menu: built
8584
        }, _a)));
8585
      };
8586
      var setContents = function (sPrimary, sMenus, sExpansions, dir) {
637 daniel-mar 8587
        primary.set(sPrimary);
597 daniel-mar 8588
        expansions.set(sExpansions);
8589
        menus.set(sMenus);
8590
        directory.set(dir);
637 daniel-mar 8591
        var sPaths = generate$2(dir, sExpansions);
597 daniel-mar 8592
        paths.set(sPaths);
8593
      };
8594
      var getTriggeringItem = function (menuValue) {
637 daniel-mar 8595
        return find$4(expansions.get(), function (v, _k) {
597 daniel-mar 8596
          return v === menuValue;
8597
        });
8598
      };
8599
      var getTriggerData = function (menuValue, getItemByValue, path) {
8600
        return getPreparedMenu(menuValue).bind(function (menu) {
8601
          return getTriggeringItem(menuValue).bind(function (triggeringItemValue) {
8602
            return getItemByValue(triggeringItemValue).map(function (triggeredItem) {
8603
              return {
8604
                triggeredMenu: menu,
8605
                triggeringItem: triggeredItem,
8606
                triggeringPath: path
8607
              };
8608
            });
8609
          });
8610
        });
8611
      };
8612
      var getTriggeringPath = function (itemValue, getItemByValue) {
637 daniel-mar 8613
        var extraPath = filter$2(lookupItem(itemValue).toArray(), function (menuValue) {
597 daniel-mar 8614
          return getPreparedMenu(menuValue).isSome();
8615
        });
637 daniel-mar 8616
        return get$e(paths.get(), itemValue).bind(function (path) {
597 daniel-mar 8617
          var revPath = reverse(extraPath.concat(path));
637 daniel-mar 8618
          var triggers = bind$3(revPath, function (menuValue, menuIndex) {
597 daniel-mar 8619
            return getTriggerData(menuValue, getItemByValue, revPath.slice(0, menuIndex + 1)).fold(function () {
679 daniel-mar 8620
              return is$1(primary.get(), menuValue) ? [] : [Optional.none()];
597 daniel-mar 8621
            }, function (data) {
8622
              return [Optional.some(data)];
8623
            });
8624
          });
8625
          return sequence(triggers);
8626
        });
8627
      };
8628
      var expand = function (itemValue) {
637 daniel-mar 8629
        return get$e(expansions.get(), itemValue).map(function (menu) {
8630
          var current = get$e(paths.get(), itemValue).getOr([]);
597 daniel-mar 8631
          return [menu].concat(current);
8632
        });
8633
      };
8634
      var collapse = function (itemValue) {
637 daniel-mar 8635
        return get$e(paths.get(), itemValue).bind(function (path) {
597 daniel-mar 8636
          return path.length > 1 ? Optional.some(path.slice(1)) : Optional.none();
8637
        });
8638
      };
8639
      var refresh = function (itemValue) {
637 daniel-mar 8640
        return get$e(paths.get(), itemValue);
597 daniel-mar 8641
      };
8642
      var getPreparedMenu = function (menuValue) {
8643
        return lookupMenu(menuValue).bind(extractPreparedMenu);
8644
      };
8645
      var lookupMenu = function (menuValue) {
637 daniel-mar 8646
        return get$e(menus.get(), menuValue);
597 daniel-mar 8647
      };
8648
      var lookupItem = function (itemValue) {
637 daniel-mar 8649
        return get$e(expansions.get(), itemValue);
597 daniel-mar 8650
      };
8651
      var otherMenus = function (path) {
8652
        var menuValues = directory.get();
8653
        return difference(keys(menuValues), path);
8654
      };
8655
      var getPrimary = function () {
8656
        return primary.get().bind(getPreparedMenu);
8657
      };
8658
      var getMenus = function () {
8659
        return menus.get();
8660
      };
8661
      return {
8662
        setMenuBuilt: setMenuBuilt,
8663
        setContents: setContents,
8664
        expand: expand,
8665
        refresh: refresh,
8666
        collapse: collapse,
8667
        lookupMenu: lookupMenu,
8668
        lookupItem: lookupItem,
8669
        otherMenus: otherMenus,
8670
        getPrimary: getPrimary,
8671
        getMenus: getMenus,
8672
        clear: clear,
8673
        isClear: isClear,
8674
        getTriggeringPath: getTriggeringPath
8675
      };
8676
    };
8677
    var extractPreparedMenu = function (prep) {
8678
      return prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none();
8679
    };
8680
    var LayeredState = {
637 daniel-mar 8681
      init: init$c,
597 daniel-mar 8682
      extractPreparedMenu: extractPreparedMenu
8683
    };
8684
 
637 daniel-mar 8685
    var make$6 = function (detail, _rawUiSpec) {
8686
      var submenuParentItems = value$1();
597 daniel-mar 8687
      var buildMenus = function (container, primaryName, menus) {
679 daniel-mar 8688
        return map$1(menus, function (spec, name) {
597 daniel-mar 8689
          var makeSketch = function () {
8690
            return Menu.sketch(__assign(__assign({}, spec), {
8691
              value: name,
8692
              markers: detail.markers,
8693
              fakeFocus: detail.fakeFocus,
8694
              onHighlight: detail.onHighlight,
637 daniel-mar 8695
              focusManager: detail.fakeFocus ? highlights() : dom$2()
597 daniel-mar 8696
            }));
8697
          };
8698
          return name === primaryName ? {
8699
            type: 'prepared',
8700
            menu: container.getSystem().build(makeSketch())
8701
          } : {
8702
            type: 'notbuilt',
8703
            nbMenu: makeSketch
8704
          };
8705
        });
8706
      };
8707
      var layeredState = LayeredState.init();
8708
      var setup = function (container) {
8709
        var componentMap = buildMenus(container, detail.data.primary, detail.data.menus);
8710
        var directory = toDirectory();
8711
        layeredState.setContents(detail.data.primary, componentMap, detail.data.expansions, directory);
8712
        return layeredState.getPrimary();
8713
      };
8714
      var getItemValue = function (item) {
8715
        return Representing.getValue(item).value;
8716
      };
8717
      var getItemByValue = function (_container, menus, itemValue) {
8718
        return findMap(menus, function (menu) {
8719
          if (!menu.getSystem().isConnected()) {
8720
            return Optional.none();
8721
          }
8722
          var candidates = Highlighting.getCandidates(menu);
637 daniel-mar 8723
          return find$5(candidates, function (c) {
597 daniel-mar 8724
            return getItemValue(c) === itemValue;
8725
          });
8726
        });
8727
      };
8728
      var toDirectory = function (_container) {
679 daniel-mar 8729
        return map$1(detail.data.menus, function (data, _menuName) {
637 daniel-mar 8730
          return bind$3(data.items, function (item) {
597 daniel-mar 8731
            return item.type === 'separator' ? [] : [item.data.value];
8732
          });
8733
        });
8734
      };
8735
      var setActiveMenu = function (container, menu) {
8736
        Highlighting.highlight(container, menu);
8737
        Highlighting.getHighlighted(menu).orThunk(function () {
8738
          return Highlighting.getFirst(menu);
8739
        }).each(function (item) {
8740
          dispatch(container, item.element, focusItem());
8741
        });
8742
      };
8743
      var getMenus = function (state, menuValues) {
637 daniel-mar 8744
        return cat(map$2(menuValues, function (mv) {
597 daniel-mar 8745
          return state.lookupMenu(mv).bind(function (prep) {
8746
            return prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none();
8747
          });
8748
        }));
8749
      };
8750
      var closeOthers = function (container, state, path) {
8751
        var others = getMenus(state, state.otherMenus(path));
637 daniel-mar 8752
        each$1(others, function (o) {
679 daniel-mar 8753
          remove$1(o.element, [detail.markers.backgroundMenu]);
597 daniel-mar 8754
          if (!detail.stayInDom) {
8755
            Replacing.remove(container, o);
8756
          }
8757
        });
8758
      };
8759
      var getSubmenuParents = function (container) {
8760
        return submenuParentItems.get().getOrThunk(function () {
8761
          var r = {};
8762
          var items = descendants(container.element, '.' + detail.markers.item);
637 daniel-mar 8763
          var parentItems = filter$2(items, function (i) {
679 daniel-mar 8764
            return get$d(i, 'aria-haspopup') === 'true';
597 daniel-mar 8765
          });
637 daniel-mar 8766
          each$1(parentItems, function (i) {
597 daniel-mar 8767
            container.getSystem().getByDom(i).each(function (itemComp) {
8768
              var key = getItemValue(itemComp);
8769
              r[key] = itemComp;
8770
            });
8771
          });
637 daniel-mar 8772
          submenuParentItems.set(r);
597 daniel-mar 8773
          return r;
8774
        });
8775
      };
8776
      var updateAriaExpansions = function (container, path) {
8777
        var parentItems = getSubmenuParents(container);
637 daniel-mar 8778
        each(parentItems, function (v, k) {
8779
          var expanded = contains$2(path, k);
679 daniel-mar 8780
          set$8(v.element, 'aria-expanded', expanded);
597 daniel-mar 8781
        });
8782
      };
8783
      var updateMenuPath = function (container, state, path) {
8784
        return Optional.from(path[0]).bind(function (latestMenuName) {
8785
          return state.lookupMenu(latestMenuName).bind(function (menuPrep) {
8786
            if (menuPrep.type === 'notbuilt') {
8787
              return Optional.none();
8788
            } else {
8789
              var activeMenu = menuPrep.menu;
8790
              var rest = getMenus(state, path.slice(1));
637 daniel-mar 8791
              each$1(rest, function (r) {
597 daniel-mar 8792
                add$2(r.element, detail.markers.backgroundMenu);
8793
              });
8794
              if (!inBody(activeMenu.element)) {
637 daniel-mar 8795
                Replacing.append(container, premade(activeMenu));
597 daniel-mar 8796
              }
679 daniel-mar 8797
              remove$1(activeMenu.element, [detail.markers.backgroundMenu]);
597 daniel-mar 8798
              setActiveMenu(container, activeMenu);
8799
              closeOthers(container, state, path);
8800
              return Optional.some(activeMenu);
8801
            }
8802
          });
8803
        });
8804
      };
8805
      var ExpandHighlightDecision;
8806
      (function (ExpandHighlightDecision) {
8807
        ExpandHighlightDecision[ExpandHighlightDecision['HighlightSubmenu'] = 0] = 'HighlightSubmenu';
8808
        ExpandHighlightDecision[ExpandHighlightDecision['HighlightParent'] = 1] = 'HighlightParent';
8809
      }(ExpandHighlightDecision || (ExpandHighlightDecision = {})));
8810
      var buildIfRequired = function (container, menuName, menuPrep) {
8811
        if (menuPrep.type === 'notbuilt') {
8812
          var menu = container.getSystem().build(menuPrep.nbMenu());
8813
          layeredState.setMenuBuilt(menuName, menu);
8814
          return menu;
8815
        } else {
8816
          return menuPrep.menu;
8817
        }
8818
      };
8819
      var expandRight = function (container, item, decision) {
8820
        if (decision === void 0) {
8821
          decision = ExpandHighlightDecision.HighlightSubmenu;
8822
        }
637 daniel-mar 8823
        if (item.hasConfigured(Disabling) && Disabling.isDisabled(item)) {
8824
          return Optional.some(item);
8825
        } else {
8826
          var value = getItemValue(item);
8827
          return layeredState.expand(value).bind(function (path) {
8828
            updateAriaExpansions(container, path);
8829
            return Optional.from(path[0]).bind(function (menuName) {
8830
              return layeredState.lookupMenu(menuName).bind(function (activeMenuPrep) {
8831
                var activeMenu = buildIfRequired(container, menuName, activeMenuPrep);
8832
                if (!inBody(activeMenu.element)) {
8833
                  Replacing.append(container, premade(activeMenu));
8834
                }
8835
                detail.onOpenSubmenu(container, item, activeMenu, reverse(path));
8836
                if (decision === ExpandHighlightDecision.HighlightSubmenu) {
8837
                  Highlighting.highlightFirst(activeMenu);
8838
                  return updateMenuPath(container, layeredState, path);
8839
                } else {
8840
                  Highlighting.dehighlightAll(activeMenu);
8841
                  return Optional.some(item);
8842
                }
8843
              });
597 daniel-mar 8844
            });
8845
          });
637 daniel-mar 8846
        }
597 daniel-mar 8847
      };
8848
      var collapseLeft = function (container, item) {
8849
        var value = getItemValue(item);
8850
        return layeredState.collapse(value).bind(function (path) {
8851
          updateAriaExpansions(container, path);
8852
          return updateMenuPath(container, layeredState, path).map(function (activeMenu) {
8853
            detail.onCollapseMenu(container, item, activeMenu);
8854
            return activeMenu;
8855
          });
8856
        });
8857
      };
8858
      var updateView = function (container, item) {
8859
        var value = getItemValue(item);
8860
        return layeredState.refresh(value).bind(function (path) {
8861
          updateAriaExpansions(container, path);
8862
          return updateMenuPath(container, layeredState, path);
8863
        });
8864
      };
8865
      var onRight = function (container, item) {
8866
        return inside(item.element) ? Optional.none() : expandRight(container, item, ExpandHighlightDecision.HighlightSubmenu);
8867
      };
8868
      var onLeft = function (container, item) {
8869
        return inside(item.element) ? Optional.none() : collapseLeft(container, item);
8870
      };
8871
      var onEscape = function (container, item) {
8872
        return collapseLeft(container, item).orThunk(function () {
8873
          return detail.onEscape(container, item).map(function () {
8874
            return container;
8875
          });
8876
        });
8877
      };
8878
      var keyOnItem = function (f) {
8879
        return function (container, simulatedEvent) {
637 daniel-mar 8880
          return closest$1(simulatedEvent.getSource(), '.' + detail.markers.item).bind(function (target) {
597 daniel-mar 8881
            return container.getSystem().getByDom(target).toOptional().bind(function (item) {
8882
              return f(container, item).map(always);
8883
            });
8884
          });
8885
        };
8886
      };
637 daniel-mar 8887
      var events = derive$2([
8888
        run$1(focus(), function (sandbox, simulatedEvent) {
597 daniel-mar 8889
          var item = simulatedEvent.event.item;
8890
          layeredState.lookupItem(getItemValue(item)).each(function () {
8891
            var menu = simulatedEvent.event.menu;
8892
            Highlighting.highlight(sandbox, menu);
8893
            var value = getItemValue(simulatedEvent.event.item);
8894
            layeredState.refresh(value).each(function (path) {
8895
              return closeOthers(sandbox, layeredState, path);
8896
            });
8897
          });
8898
        }),
637 daniel-mar 8899
        runOnExecute$1(function (component, simulatedEvent) {
597 daniel-mar 8900
          var target = simulatedEvent.event.target;
8901
          component.getSystem().getByDom(target).each(function (item) {
8902
            var itemValue = getItemValue(item);
8903
            if (itemValue.indexOf('collapse-item') === 0) {
8904
              collapseLeft(component, item);
8905
            }
8906
            expandRight(component, item, ExpandHighlightDecision.HighlightSubmenu).fold(function () {
8907
              detail.onExecute(component, item);
8908
            }, noop);
8909
          });
8910
        }),
8911
        runOnAttached(function (container, _simulatedEvent) {
8912
          setup(container).each(function (primary) {
637 daniel-mar 8913
            Replacing.append(container, premade(primary));
597 daniel-mar 8914
            detail.onOpenMenu(container, primary);
8915
            if (detail.highlightImmediately) {
8916
              setActiveMenu(container, primary);
8917
            }
8918
          });
8919
        })
637 daniel-mar 8920
      ].concat(detail.navigateOnHover ? [run$1(hover(), function (sandbox, simulatedEvent) {
597 daniel-mar 8921
          var item = simulatedEvent.event.item;
8922
          updateView(sandbox, item);
8923
          expandRight(sandbox, item, ExpandHighlightDecision.HighlightParent);
8924
          detail.onHover(sandbox, item);
8925
        })] : []));
8926
      var getActiveItem = function (container) {
8927
        return Highlighting.getHighlighted(container).bind(Highlighting.getHighlighted);
8928
      };
8929
      var collapseMenuApi = function (container) {
8930
        getActiveItem(container).each(function (currentItem) {
8931
          collapseLeft(container, currentItem);
8932
        });
8933
      };
8934
      var highlightPrimary = function (container) {
8935
        layeredState.getPrimary().each(function (primary) {
8936
          setActiveMenu(container, primary);
8937
        });
8938
      };
8939
      var extractMenuFromContainer = function (container) {
8940
        return Optional.from(container.components()[0]).filter(function (comp) {
679 daniel-mar 8941
          return get$d(comp.element, 'role') === 'menu';
597 daniel-mar 8942
        });
8943
      };
8944
      var repositionMenus = function (container) {
8945
        var maybeActivePrimary = layeredState.getPrimary().bind(function (primary) {
8946
          return getActiveItem(container).bind(function (currentItem) {
8947
            var itemValue = getItemValue(currentItem);
8948
            var allMenus = values(layeredState.getMenus());
637 daniel-mar 8949
            var preparedMenus = cat(map$2(allMenus, LayeredState.extractPreparedMenu));
597 daniel-mar 8950
            return layeredState.getTriggeringPath(itemValue, function (v) {
8951
              return getItemByValue(container, preparedMenus, v);
8952
            });
8953
          }).map(function (triggeringPath) {
8954
            return {
8955
              primary: primary,
8956
              triggeringPath: triggeringPath
8957
            };
8958
          });
8959
        });
8960
        maybeActivePrimary.fold(function () {
8961
          extractMenuFromContainer(container).each(function (primaryMenu) {
8962
            detail.onRepositionMenu(container, primaryMenu, []);
8963
          });
8964
        }, function (_a) {
8965
          var primary = _a.primary, triggeringPath = _a.triggeringPath;
8966
          detail.onRepositionMenu(container, primary, triggeringPath);
8967
        });
8968
      };
8969
      var apis = {
8970
        collapseMenu: collapseMenuApi,
8971
        highlightPrimary: highlightPrimary,
8972
        repositionMenus: repositionMenus
8973
      };
8974
      return {
8975
        uid: detail.uid,
8976
        dom: detail.dom,
8977
        markers: detail.markers,
8978
        behaviours: augment(detail.tmenuBehaviours, [
8979
          Keying.config({
8980
            mode: 'special',
8981
            onRight: keyOnItem(onRight),
8982
            onLeft: keyOnItem(onLeft),
8983
            onEscape: keyOnItem(onEscape),
8984
            focusIn: function (container, _keyInfo) {
8985
              layeredState.getPrimary().each(function (primary) {
8986
                dispatch(container, primary.element, focusItem());
8987
              });
8988
            }
8989
          }),
8990
          Highlighting.config({
8991
            highlightClass: detail.markers.selectedMenu,
8992
            itemClass: detail.markers.menu
8993
          }),
8994
          Composing.config({
8995
            find: function (container) {
8996
              return Highlighting.getHighlighted(container);
8997
            }
8998
          }),
8999
          Replacing.config({})
9000
        ]),
9001
        eventOrder: detail.eventOrder,
9002
        apis: apis,
9003
        events: events
9004
      };
9005
    };
637 daniel-mar 9006
    var collapseItem$1 = constant$1('collapse-item');
597 daniel-mar 9007
 
9008
    var tieredData = function (primary, menus, expansions) {
9009
      return {
9010
        primary: primary,
9011
        menus: menus,
9012
        expansions: expansions
9013
      };
9014
    };
9015
    var singleData = function (name, menu) {
9016
      return {
9017
        primary: name,
9018
        menus: wrap$1(name, menu),
9019
        expansions: {}
9020
      };
9021
    };
637 daniel-mar 9022
    var collapseItem = function (text) {
597 daniel-mar 9023
      return {
637 daniel-mar 9024
        value: generate$6(collapseItem$1()),
597 daniel-mar 9025
        meta: { text: text }
9026
      };
9027
    };
637 daniel-mar 9028
    var tieredMenu = single({
597 daniel-mar 9029
      name: 'TieredMenu',
9030
      configFields: [
9031
        onStrictKeyboardHandler('onExecute'),
9032
        onStrictKeyboardHandler('onEscape'),
9033
        onStrictHandler('onOpenMenu'),
9034
        onStrictHandler('onOpenSubmenu'),
9035
        onHandler('onRepositionMenu'),
9036
        onHandler('onCollapseMenu'),
637 daniel-mar 9037
        defaulted('highlightImmediately', true),
9038
        requiredObjOf('data', [
9039
          required$1('primary'),
9040
          required$1('menus'),
9041
          required$1('expansions')
597 daniel-mar 9042
        ]),
637 daniel-mar 9043
        defaulted('fakeFocus', false),
597 daniel-mar 9044
        onHandler('onHighlight'),
9045
        onHandler('onHover'),
9046
        tieredMenuMarkers(),
637 daniel-mar 9047
        required$1('dom'),
9048
        defaulted('navigateOnHover', true),
9049
        defaulted('stayInDom', false),
9050
        field('tmenuBehaviours', [
597 daniel-mar 9051
          Keying,
9052
          Highlighting,
9053
          Composing,
9054
          Replacing
9055
        ]),
637 daniel-mar 9056
        defaulted('eventOrder', {})
597 daniel-mar 9057
      ],
9058
      apis: {
9059
        collapseMenu: function (apis, tmenu) {
9060
          apis.collapseMenu(tmenu);
9061
        },
9062
        highlightPrimary: function (apis, tmenu) {
9063
          apis.highlightPrimary(tmenu);
9064
        },
9065
        repositionMenus: function (apis, tmenu) {
9066
          apis.repositionMenus(tmenu);
9067
        }
9068
      },
637 daniel-mar 9069
      factory: make$6,
597 daniel-mar 9070
      extraApis: {
9071
        tieredData: tieredData,
9072
        singleData: singleData,
637 daniel-mar 9073
        collapseItem: collapseItem
597 daniel-mar 9074
      }
9075
    });
9076
 
637 daniel-mar 9077
    var makeMenu = function (detail, menuSandbox, placementSpec, menuSpec, getBounds) {
597 daniel-mar 9078
      var lazySink = function () {
9079
        return detail.lazySink(menuSandbox);
9080
      };
9081
      var layouts = menuSpec.type === 'horizontal' ? {
9082
        layouts: {
9083
          onLtr: function () {
9084
            return belowOrAbove();
9085
          },
9086
          onRtl: function () {
9087
            return belowOrAboveRtl();
9088
          }
9089
        }
9090
      } : {};
9091
      var isFirstTierSubmenu = function (triggeringPaths) {
9092
        return triggeringPaths.length === 2;
9093
      };
9094
      var getSubmenuLayouts = function (triggeringPaths) {
9095
        return isFirstTierSubmenu(triggeringPaths) ? layouts : {};
9096
      };
9097
      return tieredMenu.sketch({
9098
        dom: { tag: 'div' },
9099
        data: menuSpec.data,
9100
        markers: menuSpec.menu.markers,
9101
        highlightImmediately: menuSpec.menu.highlightImmediately,
9102
        onEscape: function () {
9103
          Sandboxing.close(menuSandbox);
9104
          detail.onEscape.map(function (handler) {
9105
            return handler(menuSandbox);
9106
          });
9107
          return Optional.some(true);
9108
        },
9109
        onExecute: function () {
9110
          return Optional.some(true);
9111
        },
9112
        onOpenMenu: function (tmenu, menu) {
637 daniel-mar 9113
          Positioning.positionWithinBounds(lazySink().getOrDie(), menu, placementSpec, getBounds());
597 daniel-mar 9114
        },
9115
        onOpenSubmenu: function (tmenu, item, submenu, triggeringPaths) {
9116
          var sink = lazySink().getOrDie();
637 daniel-mar 9117
          Positioning.position(sink, submenu, {
9118
            anchor: __assign({
9119
              type: 'submenu',
9120
              item: item
9121
            }, getSubmenuLayouts(triggeringPaths))
9122
          });
597 daniel-mar 9123
        },
9124
        onRepositionMenu: function (tmenu, primaryMenu, submenuTriggers) {
9125
          var sink = lazySink().getOrDie();
637 daniel-mar 9126
          Positioning.positionWithinBounds(sink, primaryMenu, placementSpec, getBounds());
9127
          each$1(submenuTriggers, function (st) {
597 daniel-mar 9128
            var submenuLayouts = getSubmenuLayouts(st.triggeringPath);
637 daniel-mar 9129
            Positioning.position(sink, st.triggeredMenu, {
9130
              anchor: __assign({
9131
                type: 'submenu',
9132
                item: st.triggeringItem
9133
              }, submenuLayouts)
9134
            });
597 daniel-mar 9135
          });
9136
        }
9137
      });
9138
    };
637 daniel-mar 9139
    var factory$m = function (detail, spec) {
597 daniel-mar 9140
      var isPartOfRelated = function (sandbox, queryElem) {
9141
        var related = detail.getRelated(sandbox);
9142
        return related.exists(function (rel) {
637 daniel-mar 9143
          return isPartOf$1(rel, queryElem);
597 daniel-mar 9144
        });
9145
      };
9146
      var setContent = function (sandbox, thing) {
9147
        Sandboxing.setContent(sandbox, thing);
9148
      };
637 daniel-mar 9149
      var showAt = function (sandbox, thing, placementSpec) {
9150
        showWithin(sandbox, thing, placementSpec, Optional.none());
597 daniel-mar 9151
      };
637 daniel-mar 9152
      var showWithin = function (sandbox, thing, placementSpec, boxElement) {
9153
        showWithinBounds(sandbox, thing, placementSpec, function () {
597 daniel-mar 9154
          return boxElement.map(function (elem) {
637 daniel-mar 9155
            return box$1(elem);
597 daniel-mar 9156
          });
9157
        });
9158
      };
637 daniel-mar 9159
      var showWithinBounds = function (sandbox, thing, placementSpec, getBounds) {
597 daniel-mar 9160
        var sink = detail.lazySink(sandbox).getOrDie();
9161
        Sandboxing.openWhileCloaked(sandbox, thing, function () {
637 daniel-mar 9162
          return Positioning.positionWithinBounds(sink, sandbox, placementSpec, getBounds());
597 daniel-mar 9163
        });
9164
        Representing.setValue(sandbox, Optional.some({
9165
          mode: 'position',
637 daniel-mar 9166
          config: placementSpec,
597 daniel-mar 9167
          getBounds: getBounds
9168
        }));
9169
      };
637 daniel-mar 9170
      var showMenuAt = function (sandbox, placementSpec, menuSpec) {
9171
        showMenuWithinBounds(sandbox, placementSpec, menuSpec, Optional.none);
597 daniel-mar 9172
      };
637 daniel-mar 9173
      var showMenuWithinBounds = function (sandbox, placementSpec, menuSpec, getBounds) {
9174
        var menu = makeMenu(detail, sandbox, placementSpec, menuSpec, getBounds);
597 daniel-mar 9175
        Sandboxing.open(sandbox, menu);
9176
        Representing.setValue(sandbox, Optional.some({
9177
          mode: 'menu',
9178
          menu: menu
9179
        }));
9180
      };
9181
      var hide = function (sandbox) {
9182
        if (Sandboxing.isOpen(sandbox)) {
9183
          Representing.setValue(sandbox, Optional.none());
9184
          Sandboxing.close(sandbox);
9185
        }
9186
      };
9187
      var getContent = function (sandbox) {
9188
        return Sandboxing.getState(sandbox);
9189
      };
9190
      var reposition = function (sandbox) {
9191
        if (Sandboxing.isOpen(sandbox)) {
9192
          Representing.getValue(sandbox).each(function (state) {
9193
            switch (state.mode) {
9194
            case 'menu':
637 daniel-mar 9195
              Sandboxing.getState(sandbox).each(tieredMenu.repositionMenus);
597 daniel-mar 9196
              break;
9197
            case 'position':
9198
              var sink = detail.lazySink(sandbox).getOrDie();
637 daniel-mar 9199
              Positioning.positionWithinBounds(sink, sandbox, state.config, state.getBounds());
597 daniel-mar 9200
              break;
9201
            }
9202
          });
9203
        }
9204
      };
9205
      var apis = {
9206
        setContent: setContent,
9207
        showAt: showAt,
9208
        showWithin: showWithin,
9209
        showWithinBounds: showWithinBounds,
9210
        showMenuAt: showMenuAt,
9211
        showMenuWithinBounds: showMenuWithinBounds,
9212
        hide: hide,
9213
        getContent: getContent,
9214
        reposition: reposition,
9215
        isOpen: Sandboxing.isOpen
9216
      };
9217
      return {
9218
        uid: detail.uid,
9219
        dom: detail.dom,
9220
        behaviours: augment(detail.inlineBehaviours, [
9221
          Sandboxing.config({
9222
            isPartOf: function (sandbox, data, queryElem) {
637 daniel-mar 9223
              return isPartOf$1(data, queryElem) || isPartOfRelated(sandbox, queryElem);
597 daniel-mar 9224
            },
9225
            getAttachPoint: function (sandbox) {
9226
              return detail.lazySink(sandbox).getOrDie();
9227
            },
9228
            onOpen: function (sandbox) {
9229
              detail.onShow(sandbox);
9230
            },
9231
            onClose: function (sandbox) {
9232
              detail.onHide(sandbox);
9233
            }
9234
          }),
9235
          Representing.config({
9236
            store: {
9237
              mode: 'memory',
9238
              initialValue: Optional.none()
9239
            }
9240
          }),
9241
          Receiving.config({
637 daniel-mar 9242
            channels: __assign(__assign({}, receivingChannel$1(__assign({ isExtraPart: spec.isExtraPart }, detail.fireDismissalEventInstead.map(function (fe) {
597 daniel-mar 9243
              return { fireEventInstead: { event: fe.event } };
637 daniel-mar 9244
            }).getOr({})))), receivingChannel(__assign(__assign({}, detail.fireRepositionEventInstead.map(function (fe) {
597 daniel-mar 9245
              return { fireEventInstead: { event: fe.event } };
9246
            }).getOr({})), { doReposition: reposition })))
9247
          })
9248
        ]),
9249
        eventOrder: detail.eventOrder,
9250
        apis: apis
9251
      };
9252
    };
637 daniel-mar 9253
    var InlineView = single({
597 daniel-mar 9254
      name: 'InlineView',
9255
      configFields: [
637 daniel-mar 9256
        required$1('lazySink'),
597 daniel-mar 9257
        onHandler('onShow'),
9258
        onHandler('onHide'),
9259
        optionFunction('onEscape'),
637 daniel-mar 9260
        field('inlineBehaviours', [
597 daniel-mar 9261
          Sandboxing,
9262
          Representing,
9263
          Receiving
9264
        ]),
637 daniel-mar 9265
        optionObjOf('fireDismissalEventInstead', [defaulted('event', dismissRequested())]),
9266
        optionObjOf('fireRepositionEventInstead', [defaulted('event', repositionRequested())]),
9267
        defaulted('getRelated', Optional.none),
9268
        defaulted('isExtraPart', never),
9269
        defaulted('eventOrder', Optional.none)
597 daniel-mar 9270
      ],
637 daniel-mar 9271
      factory: factory$m,
597 daniel-mar 9272
      apis: {
9273
        showAt: function (apis, component, anchor, thing) {
9274
          apis.showAt(component, anchor, thing);
9275
        },
9276
        showWithin: function (apis, component, anchor, thing, boxElement) {
9277
          apis.showWithin(component, anchor, thing, boxElement);
9278
        },
9279
        showWithinBounds: function (apis, component, anchor, thing, bounds) {
9280
          apis.showWithinBounds(component, anchor, thing, bounds);
9281
        },
9282
        showMenuAt: function (apis, component, anchor, menuSpec) {
9283
          apis.showMenuAt(component, anchor, menuSpec);
9284
        },
9285
        showMenuWithinBounds: function (apis, component, anchor, menuSpec, bounds) {
9286
          apis.showMenuWithinBounds(component, anchor, menuSpec, bounds);
9287
        },
9288
        hide: function (apis, component) {
9289
          apis.hide(component);
9290
        },
9291
        isOpen: function (apis, component) {
9292
          return apis.isOpen(component);
9293
        },
9294
        getContent: function (apis, component) {
9295
          return apis.getContent(component);
9296
        },
9297
        setContent: function (apis, component, thing) {
9298
          apis.setContent(component, thing);
9299
        },
9300
        reposition: function (apis, component) {
9301
          apis.reposition(component);
9302
        }
9303
      }
9304
    });
9305
 
637 daniel-mar 9306
    var labelPrefix = 'layout-inset';
9307
    var westEdgeX = function (anchor) {
597 daniel-mar 9308
      return anchor.x;
9309
    };
637 daniel-mar 9310
    var middleX = function (anchor, element) {
597 daniel-mar 9311
      return anchor.x + anchor.width / 2 - element.width / 2;
9312
    };
637 daniel-mar 9313
    var eastEdgeX = function (anchor, element) {
597 daniel-mar 9314
      return anchor.x + anchor.width - element.width;
9315
    };
637 daniel-mar 9316
    var northY = function (anchor) {
597 daniel-mar 9317
      return anchor.y;
9318
    };
637 daniel-mar 9319
    var southY = function (anchor, element) {
597 daniel-mar 9320
      return anchor.y + anchor.height - element.height;
9321
    };
637 daniel-mar 9322
    var centreY = function (anchor, element) {
9323
      return anchor.y + anchor.height / 2 - element.height / 2;
9324
    };
9325
    var southwest = function (anchor, element, bubbles) {
9326
      return nu$6(eastEdgeX(anchor, element), southY(anchor, element), bubbles.insetSouthwest(), northwest$3(), 'southwest', boundsRestriction(anchor, {
597 daniel-mar 9327
        right: 0,
9328
        bottom: 3
637 daniel-mar 9329
      }), labelPrefix);
597 daniel-mar 9330
    };
637 daniel-mar 9331
    var southeast = function (anchor, element, bubbles) {
9332
      return nu$6(westEdgeX(anchor), southY(anchor, element), bubbles.insetSoutheast(), northeast$3(), 'southeast', boundsRestriction(anchor, {
597 daniel-mar 9333
        left: 1,
9334
        bottom: 3
637 daniel-mar 9335
      }), labelPrefix);
597 daniel-mar 9336
    };
637 daniel-mar 9337
    var northwest = function (anchor, element, bubbles) {
9338
      return nu$6(eastEdgeX(anchor, element), northY(anchor), bubbles.insetNorthwest(), southwest$3(), 'northwest', boundsRestriction(anchor, {
597 daniel-mar 9339
        right: 0,
9340
        top: 2
637 daniel-mar 9341
      }), labelPrefix);
597 daniel-mar 9342
    };
637 daniel-mar 9343
    var northeast = function (anchor, element, bubbles) {
9344
      return nu$6(westEdgeX(anchor), northY(anchor), bubbles.insetNortheast(), southeast$3(), 'northeast', boundsRestriction(anchor, {
597 daniel-mar 9345
        left: 1,
9346
        top: 2
637 daniel-mar 9347
      }), labelPrefix);
597 daniel-mar 9348
    };
637 daniel-mar 9349
    var north = function (anchor, element, bubbles) {
9350
      return nu$6(middleX(anchor, element), northY(anchor), bubbles.insetNorth(), south$3(), 'north', boundsRestriction(anchor, { top: 2 }), labelPrefix);
597 daniel-mar 9351
    };
637 daniel-mar 9352
    var south = function (anchor, element, bubbles) {
9353
      return nu$6(middleX(anchor, element), southY(anchor, element), bubbles.insetSouth(), north$3(), 'south', boundsRestriction(anchor, { bottom: 3 }), labelPrefix);
597 daniel-mar 9354
    };
637 daniel-mar 9355
    var east = function (anchor, element, bubbles) {
9356
      return nu$6(eastEdgeX(anchor, element), centreY(anchor, element), bubbles.insetEast(), west$3(), 'east', boundsRestriction(anchor, { right: 0 }), labelPrefix);
9357
    };
9358
    var west = function (anchor, element, bubbles) {
9359
      return nu$6(westEdgeX(anchor), centreY(anchor, element), bubbles.insetWest(), east$3(), 'west', boundsRestriction(anchor, { left: 1 }), labelPrefix);
9360
    };
9361
    var lookupPreserveLayout = function (lastPlacement) {
9362
      switch (lastPlacement) {
9363
      case 'north':
9364
        return north;
9365
      case 'northeast':
9366
        return northeast;
9367
      case 'northwest':
9368
        return northwest;
9369
      case 'south':
9370
        return south;
9371
      case 'southeast':
9372
        return southeast;
9373
      case 'southwest':
9374
        return southwest;
9375
      case 'east':
9376
        return east;
9377
      case 'west':
9378
        return west;
9379
      }
9380
    };
9381
    var preserve = function (anchor, element, bubbles, placee, bounds) {
9382
      var layout = getPlacement(placee).map(lookupPreserveLayout).getOr(north);
9383
      return layout(anchor, element, bubbles, placee, bounds);
9384
    };
9385
    var lookupFlippedLayout = function (lastPlacement) {
9386
      switch (lastPlacement) {
9387
      case 'north':
9388
        return south;
9389
      case 'northeast':
9390
        return southeast;
9391
      case 'northwest':
9392
        return southwest;
9393
      case 'south':
9394
        return north;
9395
      case 'southeast':
9396
        return northeast;
9397
      case 'southwest':
9398
        return northwest;
9399
      case 'east':
9400
        return west;
9401
      case 'west':
9402
        return east;
9403
      }
9404
    };
9405
    var flip$2 = function (anchor, element, bubbles, placee, bounds) {
9406
      var layout = getPlacement(placee).map(lookupFlippedLayout).getOr(north);
9407
      return layout(anchor, element, bubbles, placee, bounds);
9408
    };
597 daniel-mar 9409
 
679 daniel-mar 9410
    var global$f = tinymce.util.Tools.resolve('tinymce.util.Delay');
597 daniel-mar 9411
 
637 daniel-mar 9412
    var factory$l = function (detail) {
9413
      var events = events$a(detail.action);
597 daniel-mar 9414
      var tag = detail.dom.tag;
9415
      var lookupAttr = function (attr) {
637 daniel-mar 9416
        return get$e(detail.dom, 'attributes').bind(function (attrs) {
9417
          return get$e(attrs, attr);
597 daniel-mar 9418
        });
9419
      };
9420
      var getModAttributes = function () {
9421
        if (tag === 'button') {
9422
          var type = lookupAttr('type').getOr('button');
9423
          var roleAttrs = lookupAttr('role').map(function (role) {
9424
            return { role: role };
9425
          }).getOr({});
9426
          return __assign({ type: type }, roleAttrs);
9427
        } else {
9428
          var role = lookupAttr('role').getOr('button');
9429
          return { role: role };
9430
        }
9431
      };
9432
      return {
9433
        uid: detail.uid,
9434
        dom: detail.dom,
9435
        components: detail.components,
9436
        events: events,
9437
        behaviours: SketchBehaviours.augment(detail.buttonBehaviours, [
9438
          Focusing.config({}),
9439
          Keying.config({
9440
            mode: 'execution',
9441
            useSpace: true,
9442
            useEnter: true
9443
          })
9444
        ]),
9445
        domModification: { attributes: getModAttributes() },
9446
        eventOrder: detail.eventOrder
9447
      };
9448
    };
637 daniel-mar 9449
    var Button = single({
597 daniel-mar 9450
      name: 'Button',
637 daniel-mar 9451
      factory: factory$l,
597 daniel-mar 9452
      configFields: [
637 daniel-mar 9453
        defaulted('uid', undefined),
9454
        required$1('dom'),
9455
        defaulted('components', []),
597 daniel-mar 9456
        SketchBehaviours.field('buttonBehaviours', [
9457
          Focusing,
9458
          Keying
9459
        ]),
9460
        option('action'),
9461
        option('role'),
637 daniel-mar 9462
        defaulted('eventOrder', {})
597 daniel-mar 9463
      ]
9464
    });
9465
 
9466
    var record = function (spec) {
637 daniel-mar 9467
      var uid = isSketchSpec(spec) && hasNonNullableKey(spec, 'uid') ? spec.uid : generate$5('memento');
597 daniel-mar 9468
      var get = function (anyInSystem) {
9469
        return anyInSystem.getSystem().getByUid(uid).getOrDie();
9470
      };
9471
      var getOpt = function (anyInSystem) {
9472
        return anyInSystem.getSystem().getByUid(uid).toOptional();
9473
      };
9474
      var asSpec = function () {
9475
        return __assign(__assign({}, spec), { uid: uid });
9476
      };
9477
      return {
9478
        get: get,
9479
        getOpt: getOpt,
9480
        asSpec: asSpec
9481
      };
9482
    };
9483
 
679 daniel-mar 9484
    var global$e = tinymce.util.Tools.resolve('tinymce.util.I18n');
637 daniel-mar 9485
 
9486
    var rtlTransform = {
9487
      'indent': true,
9488
      'outdent': true,
9489
      'table-insert-column-after': true,
9490
      'table-insert-column-before': true,
9491
      'paste-column-after': true,
9492
      'paste-column-before': true,
9493
      'unordered-list': true,
9494
      'list-bull-circle': true,
9495
      'list-bull-default': true,
9496
      'list-bull-square': true
9497
    };
9498
    var defaultIconName = 'temporary-placeholder';
597 daniel-mar 9499
    var defaultIcon = function (icons) {
637 daniel-mar 9500
      return function () {
9501
        return get$e(icons, defaultIconName).getOr('!not found!');
9502
      };
597 daniel-mar 9503
    };
637 daniel-mar 9504
    var getIconName = function (name, icons) {
9505
      var lcName = name.toLowerCase();
679 daniel-mar 9506
      if (global$e.isRtl()) {
637 daniel-mar 9507
        var rtlName = ensureTrailing(lcName, '-rtl');
9508
        return has$2(icons, rtlName) ? rtlName : lcName;
9509
      } else {
9510
        return lcName;
9511
      }
597 daniel-mar 9512
    };
637 daniel-mar 9513
    var lookupIcon = function (name, icons) {
9514
      return get$e(icons, getIconName(name, icons));
597 daniel-mar 9515
    };
637 daniel-mar 9516
    var get$1 = function (name, iconProvider) {
9517
      var icons = iconProvider();
9518
      return lookupIcon(name, icons).getOrThunk(defaultIcon(icons));
9519
    };
9520
    var getOr = function (name, iconProvider, fallbackIcon) {
9521
      var icons = iconProvider();
9522
      return lookupIcon(name, icons).or(fallbackIcon).getOrThunk(defaultIcon(icons));
9523
    };
9524
    var needsRtlTransform = function (iconName) {
679 daniel-mar 9525
      return global$e.isRtl() ? has$2(rtlTransform, iconName) : false;
637 daniel-mar 9526
    };
9527
    var addFocusableBehaviour = function () {
9528
      return config('add-focusable', [runOnAttached(function (comp) {
9529
          child(comp.element, 'svg').each(function (svg) {
679 daniel-mar 9530
            return set$8(svg, 'focusable', 'false');
637 daniel-mar 9531
          });
9532
        })]);
9533
    };
9534
    var renderIcon$2 = function (spec, iconName, icons, fallbackIcon) {
9535
      var _a, _b;
9536
      var rtlIconClasses = needsRtlTransform(iconName) ? ['tox-icon--flip'] : [];
9537
      var iconHtml = get$e(icons, getIconName(iconName, icons)).or(fallbackIcon).getOrThunk(defaultIcon(icons));
9538
      return {
9539
        dom: {
9540
          tag: spec.tag,
9541
          attributes: (_a = spec.attributes) !== null && _a !== void 0 ? _a : {},
9542
          classes: spec.classes.concat(rtlIconClasses),
9543
          innerHtml: iconHtml
9544
        },
679 daniel-mar 9545
        behaviours: derive$1(__spreadArray(__spreadArray([], (_b = spec.behaviours) !== null && _b !== void 0 ? _b : [], true), [addFocusableBehaviour()], false))
637 daniel-mar 9546
      };
9547
    };
9548
    var render$3 = function (iconName, spec, iconProvider, fallbackIcon) {
9549
      if (fallbackIcon === void 0) {
9550
        fallbackIcon = Optional.none();
9551
      }
9552
      return renderIcon$2(spec, iconName, iconProvider(), fallbackIcon);
9553
    };
9554
    var renderFirst = function (iconNames, spec, iconProvider) {
9555
      var icons = iconProvider();
9556
      var iconName = find$5(iconNames, function (name) {
9557
        return has$2(icons, getIconName(name, icons));
597 daniel-mar 9558
      });
637 daniel-mar 9559
      return renderIcon$2(spec, iconName.getOr(defaultIconName), icons, Optional.none());
597 daniel-mar 9560
    };
9561
 
9562
    var notificationIconMap = {
9563
      success: 'checkmark',
9564
      error: 'warning',
9565
      err: 'error',
9566
      warning: 'warning',
9567
      warn: 'warning',
9568
      info: 'info'
9569
    };
637 daniel-mar 9570
    var factory$k = function (detail) {
597 daniel-mar 9571
      var memBannerText = record({
9572
        dom: {
9573
          tag: 'p',
9574
          innerHtml: detail.translationProvider(detail.text)
9575
        },
9576
        behaviours: derive$1([Replacing.config({})])
9577
      });
9578
      var renderPercentBar = function (percent) {
9579
        return {
9580
          dom: {
9581
            tag: 'div',
9582
            classes: ['tox-bar'],
9583
            attributes: { style: 'width: ' + percent + '%' }
9584
          }
9585
        };
9586
      };
9587
      var renderPercentText = function (percent) {
9588
        return {
9589
          dom: {
9590
            tag: 'div',
9591
            classes: ['tox-text'],
9592
            innerHtml: percent + '%'
9593
          }
9594
        };
9595
      };
9596
      var memBannerProgress = record({
9597
        dom: {
9598
          tag: 'div',
9599
          classes: detail.progress ? [
9600
            'tox-progress-bar',
9601
            'tox-progress-indicator'
9602
          ] : ['tox-progress-bar']
9603
        },
9604
        components: [
9605
          {
9606
            dom: {
9607
              tag: 'div',
9608
              classes: ['tox-bar-container']
9609
            },
9610
            components: [renderPercentBar(0)]
9611
          },
9612
          renderPercentText(0)
9613
        ],
9614
        behaviours: derive$1([Replacing.config({})])
9615
      });
9616
      var updateProgress = function (comp, percent) {
9617
        if (comp.getSystem().isConnected()) {
9618
          memBannerProgress.getOpt(comp).each(function (progress) {
9619
            Replacing.set(progress, [
9620
              {
9621
                dom: {
9622
                  tag: 'div',
9623
                  classes: ['tox-bar-container']
9624
                },
9625
                components: [renderPercentBar(percent)]
9626
              },
9627
              renderPercentText(percent)
9628
            ]);
9629
          });
9630
        }
9631
      };
9632
      var updateText = function (comp, text$1) {
9633
        if (comp.getSystem().isConnected()) {
9634
          var banner = memBannerText.get(comp);
9635
          Replacing.set(banner, [text(text$1)]);
9636
        }
9637
      };
9638
      var apis = {
9639
        updateProgress: updateProgress,
9640
        updateText: updateText
9641
      };
9642
      var iconChoices = flatten([
9643
        detail.icon.toArray(),
9644
        detail.level.toArray(),
9645
        detail.level.bind(function (level) {
9646
          return Optional.from(notificationIconMap[level]);
9647
        }).toArray()
9648
      ]);
9649
      var memButton = record(Button.sketch({
9650
        dom: {
9651
          tag: 'button',
9652
          classes: [
9653
            'tox-notification__dismiss',
9654
            'tox-button',
9655
            'tox-button--naked',
9656
            'tox-button--icon'
9657
          ]
9658
        },
637 daniel-mar 9659
        components: [render$3('close', {
9660
            tag: 'div',
9661
            classes: ['tox-icon'],
9662
            attributes: { 'aria-label': detail.translationProvider('Close') }
9663
          }, detail.iconProvider)],
597 daniel-mar 9664
        action: function (comp) {
9665
          detail.onAction(comp);
9666
        }
9667
      }));
637 daniel-mar 9668
      var notificationIconSpec = renderFirst(iconChoices, {
9669
        tag: 'div',
9670
        classes: ['tox-notification__icon']
9671
      }, detail.iconProvider);
9672
      var notificationBodySpec = {
9673
        dom: {
9674
          tag: 'div',
9675
          classes: ['tox-notification__body']
9676
        },
9677
        components: [memBannerText.asSpec()],
9678
        behaviours: derive$1([Replacing.config({})])
9679
      };
597 daniel-mar 9680
      var components = [
637 daniel-mar 9681
        notificationIconSpec,
9682
        notificationBodySpec
597 daniel-mar 9683
      ];
9684
      return {
9685
        uid: detail.uid,
9686
        dom: {
9687
          tag: 'div',
9688
          attributes: { role: 'alert' },
9689
          classes: detail.level.map(function (level) {
9690
            return [
9691
              'tox-notification',
9692
              'tox-notification--in',
9693
              'tox-notification--' + level
9694
            ];
9695
          }).getOr([
9696
            'tox-notification',
9697
            'tox-notification--in'
9698
          ])
9699
        },
9700
        behaviours: derive$1([
9701
          Focusing.config({}),
637 daniel-mar 9702
          config('notification-events', [run$1(focusin(), function (comp) {
597 daniel-mar 9703
              memButton.getOpt(comp).each(Focusing.focus);
9704
            })])
9705
        ]),
9706
        components: components.concat(detail.progress ? [memBannerProgress.asSpec()] : []).concat(!detail.closeButton ? [] : [memButton.asSpec()]),
9707
        apis: apis
9708
      };
9709
    };
637 daniel-mar 9710
    var Notification = single({
597 daniel-mar 9711
      name: 'Notification',
637 daniel-mar 9712
      factory: factory$k,
597 daniel-mar 9713
      configFields: [
9714
        option('level'),
637 daniel-mar 9715
        required$1('progress'),
9716
        required$1('icon'),
9717
        required$1('onAction'),
9718
        required$1('text'),
9719
        required$1('iconProvider'),
9720
        required$1('translationProvider'),
597 daniel-mar 9721
        defaultedBoolean('closeButton', true)
9722
      ],
9723
      apis: {
9724
        updateProgress: function (apis, comp, percent) {
9725
          apis.updateProgress(comp, percent);
9726
        },
9727
        updateText: function (apis, comp, text) {
9728
          apis.updateText(comp, text);
9729
        }
9730
      }
9731
    });
9732
 
9733
    function NotificationManagerImpl (editor, extras, uiMothership) {
637 daniel-mar 9734
      var sharedBackstage = extras.backstage.shared;
597 daniel-mar 9735
      var getLayoutDirection = function (rel) {
9736
        switch (rel) {
9737
        case 'bc-bc':
637 daniel-mar 9738
          return south;
597 daniel-mar 9739
        case 'tc-tc':
637 daniel-mar 9740
          return north;
597 daniel-mar 9741
        case 'tc-bc':
637 daniel-mar 9742
          return north$2;
597 daniel-mar 9743
        case 'bc-tc':
9744
        default:
637 daniel-mar 9745
          return south$2;
597 daniel-mar 9746
        }
9747
      };
679 daniel-mar 9748
      var reposition = function (notifications) {
597 daniel-mar 9749
        if (notifications.length > 0) {
637 daniel-mar 9750
          each$1(notifications, function (notification, index) {
679 daniel-mar 9751
            if (index === 0) {
9752
              notification.moveRel(null, 'banner');
9753
            } else {
597 daniel-mar 9754
              notification.moveRel(notifications[index - 1].getEl(), 'bc-tc');
9755
            }
9756
          });
9757
        }
9758
      };
9759
      var open = function (settings, closeCallback) {
9760
        var hideCloseButton = !settings.closeButton && settings.timeout && (settings.timeout > 0 || settings.timeout < 0);
9761
        var close = function () {
9762
          closeCallback();
9763
          InlineView.hide(notificationWrapper);
9764
        };
9765
        var notification = build$1(Notification.sketch({
9766
          text: settings.text,
637 daniel-mar 9767
          level: contains$2([
597 daniel-mar 9768
            'success',
9769
            'error',
9770
            'warning',
9771
            'warn',
9772
            'info'
9773
          ], settings.type) ? settings.type : undefined,
9774
          progress: settings.progressBar === true,
9775
          icon: Optional.from(settings.icon),
9776
          closeButton: !hideCloseButton,
9777
          onAction: close,
637 daniel-mar 9778
          iconProvider: sharedBackstage.providers.icons,
9779
          translationProvider: sharedBackstage.providers.translate
597 daniel-mar 9780
        }));
9781
        var notificationWrapper = build$1(InlineView.sketch(__assign({
9782
          dom: {
9783
            tag: 'div',
9784
            classes: ['tox-notifications-container']
9785
          },
637 daniel-mar 9786
          lazySink: sharedBackstage.getSink,
597 daniel-mar 9787
          fireDismissalEventInstead: {}
637 daniel-mar 9788
        }, sharedBackstage.header.isPositionedAtTop() ? {} : { fireRepositionEventInstead: {} })));
597 daniel-mar 9789
        uiMothership.add(notificationWrapper);
9790
        if (settings.timeout > 0) {
679 daniel-mar 9791
          global$f.setTimeout(function () {
597 daniel-mar 9792
            close();
9793
          }, settings.timeout);
9794
        }
679 daniel-mar 9795
        var getBounds = function () {
9796
          var contentArea = box$1(SugarElement.fromDom(editor.getContentAreaContainer()));
9797
          var win$1 = win();
9798
          var x = clamp$1(win$1.x, contentArea.x, contentArea.right);
9799
          var y = clamp$1(win$1.y, contentArea.y, contentArea.bottom);
9800
          var right = Math.max(contentArea.right, win$1.right);
9801
          var bottom = Math.max(contentArea.bottom, win$1.bottom);
9802
          return Optional.some(bounds(x, y, right - x, bottom - y));
9803
        };
597 daniel-mar 9804
        return {
9805
          close: close,
9806
          moveTo: function (x, y) {
637 daniel-mar 9807
            InlineView.showAt(notificationWrapper, premade(notification), {
9808
              anchor: {
9809
                type: 'makeshift',
9810
                x: x,
9811
                y: y
9812
              }
9813
            });
597 daniel-mar 9814
          },
9815
          moveRel: function (element, rel) {
679 daniel-mar 9816
            var notificationSpec = premade(notification);
9817
            var anchorOverrides = { maxHeightFunction: expandable$1() };
9818
            if (rel !== 'banner' && isNonNullable(element)) {
597 daniel-mar 9819
              var layoutDirection_1 = getLayoutDirection(rel);
9820
              var nodeAnchor = {
637 daniel-mar 9821
                type: 'node',
597 daniel-mar 9822
                root: body(),
9823
                node: Optional.some(SugarElement.fromDom(element)),
679 daniel-mar 9824
                overrides: anchorOverrides,
597 daniel-mar 9825
                layouts: {
9826
                  onRtl: function () {
9827
                    return [layoutDirection_1];
9828
                  },
9829
                  onLtr: function () {
9830
                    return [layoutDirection_1];
9831
                  }
9832
                }
9833
              };
679 daniel-mar 9834
              InlineView.showWithinBounds(notificationWrapper, notificationSpec, { anchor: nodeAnchor }, getBounds);
597 daniel-mar 9835
            } else {
679 daniel-mar 9836
              var anchor = __assign(__assign({}, sharedBackstage.anchors.banner()), { overrides: anchorOverrides });
9837
              InlineView.showWithinBounds(notificationWrapper, notificationSpec, { anchor: anchor }, getBounds);
597 daniel-mar 9838
            }
9839
          },
9840
          text: function (nuText) {
9841
            Notification.updateText(notification, nuText);
9842
          },
9843
          settings: settings,
9844
          getEl: function () {
9845
            return notification.element.dom;
9846
          },
9847
          progressBar: {
9848
            value: function (percent) {
9849
              Notification.updateProgress(notification, percent);
9850
            }
9851
          }
9852
        };
9853
      };
9854
      var close = function (notification) {
9855
        notification.close();
9856
      };
9857
      var getArgs = function (notification) {
9858
        return notification.settings;
9859
      };
9860
      return {
9861
        open: open,
9862
        close: close,
9863
        reposition: reposition,
9864
        getArgs: getArgs
9865
      };
9866
    }
9867
 
9868
    var first = function (fn, rate) {
9869
      var timer = null;
9870
      var cancel = function () {
637 daniel-mar 9871
        if (!isNull(timer)) {
597 daniel-mar 9872
          clearTimeout(timer);
9873
          timer = null;
9874
        }
9875
      };
9876
      var throttle = function () {
9877
        var args = [];
9878
        for (var _i = 0; _i < arguments.length; _i++) {
9879
          args[_i] = arguments[_i];
9880
        }
637 daniel-mar 9881
        if (isNull(timer)) {
597 daniel-mar 9882
          timer = setTimeout(function () {
637 daniel-mar 9883
            timer = null;
597 daniel-mar 9884
            fn.apply(null, args);
9885
          }, rate);
9886
        }
9887
      };
9888
      return {
9889
        cancel: cancel,
9890
        throttle: throttle
9891
      };
9892
    };
637 daniel-mar 9893
    var last = function (fn, rate) {
597 daniel-mar 9894
      var timer = null;
9895
      var cancel = function () {
637 daniel-mar 9896
        if (!isNull(timer)) {
597 daniel-mar 9897
          clearTimeout(timer);
9898
          timer = null;
9899
        }
9900
      };
9901
      var throttle = function () {
9902
        var args = [];
9903
        for (var _i = 0; _i < arguments.length; _i++) {
9904
          args[_i] = arguments[_i];
9905
        }
637 daniel-mar 9906
        cancel();
597 daniel-mar 9907
        timer = setTimeout(function () {
637 daniel-mar 9908
          timer = null;
597 daniel-mar 9909
          fn.apply(null, args);
9910
        }, rate);
9911
      };
9912
      return {
9913
        cancel: cancel,
9914
        throttle: throttle
9915
      };
9916
    };
9917
 
679 daniel-mar 9918
    var global$d = tinymce.util.Tools.resolve('tinymce.dom.TextSeeker');
597 daniel-mar 9919
 
9920
    var isBoundary = function (dom, node) {
637 daniel-mar 9921
      return dom.isBlock(node) || contains$2([
597 daniel-mar 9922
        'BR',
9923
        'IMG',
9924
        'HR',
9925
        'INPUT'
9926
      ], node.nodeName) || dom.getContentEditable(node) === 'false';
9927
    };
9928
    var repeatLeft = function (dom, node, offset, process, rootNode) {
679 daniel-mar 9929
      var search = global$d(dom, function (node) {
597 daniel-mar 9930
        return isBoundary(dom, node);
9931
      });
9932
      return Optional.from(search.backwards(node, offset, process, rootNode));
9933
    };
9934
 
9935
    var autocompleteSelector = '[data-mce-autocompleter]';
9936
    var create$4 = function (editor, range) {
637 daniel-mar 9937
      return detect(SugarElement.fromDom(editor.selection.getNode())).getOrThunk(function () {
597 daniel-mar 9938
        var wrapper = SugarElement.fromHtml('<span data-mce-autocompleter="1" data-mce-bogus="1"></span>', editor.getDoc());
637 daniel-mar 9939
        append$2(wrapper, SugarElement.fromDom(range.extractContents()));
597 daniel-mar 9940
        range.insertNode(wrapper.dom);
9941
        parent(wrapper).each(function (elm) {
9942
          return elm.dom.normalize();
9943
        });
9944
        last$1(wrapper).map(function (last) {
9945
          editor.selection.setCursorLocation(last.dom, getEnd(last));
9946
        });
9947
        return wrapper;
9948
      });
9949
    };
637 daniel-mar 9950
    var detect = function (elm) {
9951
      return closest$1(elm, autocompleteSelector);
597 daniel-mar 9952
    };
9953
 
9954
    var isValidTextRange = function (rng) {
9955
      return rng.collapsed && rng.startContainer.nodeType === 3;
9956
    };
9957
    var getText = function (rng) {
9958
      return rng.toString().replace(/\u00A0/g, ' ').replace(/\uFEFF/g, '');
9959
    };
9960
    var isWhitespace = function (chr) {
9961
      return chr !== '' && ' \xA0\f\n\r\t\x0B'.indexOf(chr) !== -1;
9962
    };
9963
 
9964
    var stripTriggerChar = function (text, triggerCh) {
9965
      return text.substring(triggerCh.length);
9966
    };
9967
    var findChar = function (text, index, ch) {
9968
      var i;
9969
      for (i = index - 1; i >= 0; i--) {
9970
        var char = text.charAt(i);
9971
        if (isWhitespace(char)) {
9972
          return Optional.none();
9973
        }
9974
        if (char === ch) {
9975
          break;
9976
        }
9977
      }
9978
      return Optional.some(i);
9979
    };
9980
    var findStart = function (dom, initRange, ch, minChars) {
9981
      if (minChars === void 0) {
9982
        minChars = 0;
9983
      }
9984
      if (!isValidTextRange(initRange)) {
9985
        return Optional.none();
9986
      }
9987
      var findTriggerChIndex = function (element, offset, text) {
9988
        return findChar(text, offset, ch).getOr(offset);
9989
      };
9990
      var root = dom.getParent(initRange.startContainer, dom.isBlock) || dom.getRoot();
9991
      return repeatLeft(dom, initRange.startContainer, initRange.startOffset, findTriggerChIndex, root).bind(function (spot) {
9992
        var range = initRange.cloneRange();
9993
        range.setStart(spot.container, spot.offset);
9994
        range.setEnd(initRange.endContainer, initRange.endOffset);
9995
        if (range.collapsed) {
9996
          return Optional.none();
9997
        }
9998
        var text = getText(range);
9999
        var triggerCharIndex = text.lastIndexOf(ch);
10000
        if (triggerCharIndex !== 0 || stripTriggerChar(text, ch).length < minChars) {
10001
          return Optional.none();
10002
        } else {
10003
          return Optional.some({
10004
            text: stripTriggerChar(text, ch),
10005
            range: range,
10006
            triggerChar: ch
10007
          });
10008
        }
10009
      });
10010
    };
10011
    var getContext = function (dom, initRange, ch, minChars) {
10012
      if (minChars === void 0) {
10013
        minChars = 0;
10014
      }
637 daniel-mar 10015
      return detect(SugarElement.fromDom(initRange.startContainer)).fold(function () {
597 daniel-mar 10016
        return findStart(dom, initRange, ch, minChars);
10017
      }, function (elm) {
10018
        var range = dom.createRng();
10019
        range.selectNode(elm.dom);
10020
        var text = getText(range);
10021
        return Optional.some({
10022
          range: range,
10023
          text: stripTriggerChar(text, ch),
10024
          triggerChar: ch
10025
        });
10026
      });
10027
    };
10028
 
637 daniel-mar 10029
    var setup$e = function (api, editor) {
597 daniel-mar 10030
      editor.on('keypress compositionend', api.onKeypress.throttle);
10031
      editor.on('remove', api.onKeypress.cancel);
10032
      var redirectKeyToItem = function (item, e) {
10033
        emitWith(item, keydown(), { raw: e });
10034
      };
10035
      editor.on('keydown', function (e) {
10036
        var getItem = function () {
10037
          return api.getView().bind(Highlighting.getHighlighted);
10038
        };
10039
        if (e.which === 8) {
10040
          api.onKeypress.throttle(e);
10041
        }
10042
        if (api.isActive()) {
10043
          if (e.which === 27) {
10044
            api.cancelIfNecessary();
10045
          }
10046
          if (api.isMenuOpen()) {
10047
            if (e.which === 13) {
10048
              getItem().each(emitExecute);
10049
              e.preventDefault();
10050
            } else if (e.which === 40) {
10051
              getItem().fold(function () {
10052
                api.getView().each(Highlighting.highlightFirst);
10053
              }, function (item) {
10054
                redirectKeyToItem(item, e);
10055
              });
10056
              e.preventDefault();
10057
              e.stopImmediatePropagation();
10058
            } else if (e.which === 37 || e.which === 38 || e.which === 39) {
10059
              getItem().each(function (item) {
10060
                redirectKeyToItem(item, e);
10061
                e.preventDefault();
10062
                e.stopImmediatePropagation();
10063
              });
10064
            }
10065
          } else {
10066
            if (e.which === 13 || e.which === 38 || e.which === 40) {
10067
              api.cancelIfNecessary();
10068
            }
10069
          }
10070
        }
10071
      });
10072
      editor.on('NodeChange', function (e) {
637 daniel-mar 10073
        if (api.isActive() && !api.isProcessingAction() && detect(SugarElement.fromDom(e.element)).isNone()) {
597 daniel-mar 10074
          api.cancelIfNecessary();
10075
        }
10076
      });
10077
    };
637 daniel-mar 10078
    var AutocompleterEditorEvents = { setup: setup$e };
597 daniel-mar 10079
 
679 daniel-mar 10080
    var global$c = tinymce.util.Tools.resolve('tinymce.util.Promise');
597 daniel-mar 10081
 
637 daniel-mar 10082
    var point = function (container, offset) {
597 daniel-mar 10083
      return {
10084
        container: container,
10085
        offset: offset
10086
      };
10087
    };
10088
 
637 daniel-mar 10089
    var isText = function (node) {
597 daniel-mar 10090
      return node.nodeType === TEXT;
10091
    };
10092
    var isElement$1 = function (node) {
10093
      return node.nodeType === ELEMENT;
10094
    };
10095
    var toLast = function (node) {
637 daniel-mar 10096
      if (isText(node)) {
10097
        return point(node, node.data.length);
597 daniel-mar 10098
      } else {
10099
        var children = node.childNodes;
637 daniel-mar 10100
        return children.length > 0 ? toLast(children[children.length - 1]) : point(node, children.length);
597 daniel-mar 10101
      }
10102
    };
10103
    var toLeaf = function (node, offset) {
10104
      var children = node.childNodes;
10105
      if (children.length > 0 && offset < children.length) {
10106
        return toLeaf(children[offset], 0);
10107
      } else if (children.length > 0 && isElement$1(node) && children.length === offset) {
10108
        return toLast(children[children.length - 1]);
10109
      } else {
637 daniel-mar 10110
        return point(node, offset);
597 daniel-mar 10111
      }
10112
    };
10113
 
10114
    var isPreviousCharContent = function (dom, leaf) {
10115
      return repeatLeft(dom, leaf.container, leaf.offset, function (element, offset) {
10116
        return offset === 0 ? -1 : offset;
10117
      }, dom.getRoot()).filter(function (spot) {
10118
        var char = spot.container.data.charAt(spot.offset - 1);
10119
        return !isWhitespace(char);
10120
      }).isSome();
10121
    };
10122
    var isStartOfWord = function (dom) {
10123
      return function (rng) {
10124
        var leaf = toLeaf(rng.startContainer, rng.startOffset);
10125
        return !isPreviousCharContent(dom, leaf);
10126
      };
10127
    };
10128
    var getTriggerContext = function (dom, initRange, database) {
10129
      return findMap(database.triggerChars, function (ch) {
10130
        return getContext(dom, initRange, ch);
10131
      });
10132
    };
637 daniel-mar 10133
    var lookup$2 = function (editor, getDatabase) {
597 daniel-mar 10134
      var database = getDatabase();
10135
      var rng = editor.selection.getRng();
10136
      return getTriggerContext(editor.dom, rng, database).bind(function (context) {
10137
        return lookupWithContext(editor, getDatabase, context);
10138
      });
10139
    };
10140
    var lookupWithContext = function (editor, getDatabase, context, fetchOptions) {
10141
      if (fetchOptions === void 0) {
10142
        fetchOptions = {};
10143
      }
10144
      var database = getDatabase();
10145
      var rng = editor.selection.getRng();
10146
      var startText = rng.startContainer.nodeValue;
637 daniel-mar 10147
      var autocompleters = filter$2(database.lookupByChar(context.triggerChar), function (autocompleter) {
597 daniel-mar 10148
        return context.text.length >= autocompleter.minChars && autocompleter.matches.getOrThunk(function () {
10149
          return isStartOfWord(editor.dom);
10150
        })(context.range, startText, context.text);
10151
      });
10152
      if (autocompleters.length === 0) {
10153
        return Optional.none();
10154
      }
679 daniel-mar 10155
      var lookupData = global$c.all(map$2(autocompleters, function (ac) {
597 daniel-mar 10156
        var fetchResult = ac.fetch(context.text, ac.maxResults, fetchOptions);
10157
        return fetchResult.then(function (results) {
10158
          return {
10159
            matchText: context.text,
10160
            items: results,
10161
            columns: ac.columns,
10162
            onAction: ac.onAction,
10163
            highlightOn: ac.highlightOn
10164
          };
10165
        });
10166
      }));
10167
      return Optional.some({
10168
        lookupData: lookupData,
10169
        context: context
10170
      });
10171
    };
10172
 
10173
    var separatorMenuItemSchema = objOf([
637 daniel-mar 10174
      requiredString('type'),
597 daniel-mar 10175
      optionString('text')
10176
    ]);
10177
    var createSeparatorMenuItem = function (spec) {
10178
      return asRaw('separatormenuitem', separatorMenuItemSchema, spec);
10179
    };
10180
 
10181
    var autocompleterItemSchema = objOf([
637 daniel-mar 10182
      defaulted('type', 'autocompleteitem'),
10183
      defaulted('active', false),
10184
      defaulted('disabled', false),
10185
      defaulted('meta', {}),
10186
      requiredString('value'),
597 daniel-mar 10187
      optionString('text'),
10188
      optionString('icon')
10189
    ]);
10190
    var autocompleterSchema = objOf([
637 daniel-mar 10191
      requiredString('type'),
10192
      requiredString('ch'),
597 daniel-mar 10193
      defaultedNumber('minChars', 1),
637 daniel-mar 10194
      defaulted('columns', 1),
597 daniel-mar 10195
      defaultedNumber('maxResults', 10),
10196
      optionFunction('matches'),
637 daniel-mar 10197
      requiredFunction('fetch'),
10198
      requiredFunction('onAction'),
597 daniel-mar 10199
      defaultedArrayOf('highlightOn', [], string)
10200
    ]);
10201
    var createSeparatorItem = function (spec) {
10202
      return asRaw('Autocompleter.Separator', separatorMenuItemSchema, spec);
10203
    };
10204
    var createAutocompleterItem = function (spec) {
10205
      return asRaw('Autocompleter.Item', autocompleterItemSchema, spec);
10206
    };
10207
    var createAutocompleter = function (spec) {
10208
      return asRaw('Autocompleter', autocompleterSchema, spec);
10209
    };
10210
 
10211
    var baseToolbarButtonFields = [
10212
      defaultedBoolean('disabled', false),
10213
      optionString('tooltip'),
10214
      optionString('icon'),
10215
      optionString('text'),
10216
      defaultedFunction('onSetup', function () {
10217
        return noop;
10218
      })
10219
    ];
10220
    var toolbarButtonSchema = objOf([
637 daniel-mar 10221
      requiredString('type'),
10222
      requiredFunction('onAction')
597 daniel-mar 10223
    ].concat(baseToolbarButtonFields));
10224
    var createToolbarButton = function (spec) {
10225
      return asRaw('toolbarbutton', toolbarButtonSchema, spec);
10226
    };
10227
 
10228
    var baseToolbarToggleButtonFields = [defaultedBoolean('active', false)].concat(baseToolbarButtonFields);
10229
    var toggleButtonSchema = objOf(baseToolbarToggleButtonFields.concat([
637 daniel-mar 10230
      requiredString('type'),
10231
      requiredFunction('onAction')
597 daniel-mar 10232
    ]));
10233
    var createToggleButton = function (spec) {
10234
      return asRaw('ToggleButton', toggleButtonSchema, spec);
10235
    };
10236
 
10237
    var contextBarFields = [
10238
      defaultedFunction('predicate', never),
10239
      defaultedStringEnum('scope', 'node', [
10240
        'node',
10241
        'editor'
10242
      ]),
10243
      defaultedStringEnum('position', 'selection', [
10244
        'node',
10245
        'selection',
10246
        'line'
10247
      ])
10248
    ];
10249
 
10250
    var contextButtonFields = baseToolbarButtonFields.concat([
637 daniel-mar 10251
      defaulted('type', 'contextformbutton'),
10252
      defaulted('primary', false),
10253
      requiredFunction('onAction'),
10254
      customField('original', identity$1)
597 daniel-mar 10255
    ]);
10256
    var contextToggleButtonFields = baseToolbarToggleButtonFields.concat([
637 daniel-mar 10257
      defaulted('type', 'contextformbutton'),
10258
      defaulted('primary', false),
10259
      requiredFunction('onAction'),
10260
      customField('original', identity$1)
597 daniel-mar 10261
    ]);
637 daniel-mar 10262
    var launchButtonFields = baseToolbarButtonFields.concat([defaulted('type', 'contextformbutton')]);
10263
    var launchToggleButtonFields = baseToolbarToggleButtonFields.concat([defaulted('type', 'contextformtogglebutton')]);
597 daniel-mar 10264
    var toggleOrNormal = choose$1('type', {
10265
      contextformbutton: contextButtonFields,
10266
      contextformtogglebutton: contextToggleButtonFields
10267
    });
10268
    var contextFormSchema = objOf([
637 daniel-mar 10269
      defaulted('type', 'contextform'),
10270
      defaultedFunction('initValue', constant$1('')),
597 daniel-mar 10271
      optionString('label'),
637 daniel-mar 10272
      requiredArrayOf('commands', toggleOrNormal),
597 daniel-mar 10273
      optionOf('launch', choose$1('type', {
10274
        contextformbutton: launchButtonFields,
10275
        contextformtogglebutton: launchToggleButtonFields
10276
      }))
10277
    ].concat(contextBarFields));
10278
    var createContextForm = function (spec) {
10279
      return asRaw('ContextForm', contextFormSchema, spec);
10280
    };
10281
 
10282
    var contextToolbarSchema = objOf([
637 daniel-mar 10283
      defaulted('type', 'contexttoolbar'),
10284
      requiredString('items')
597 daniel-mar 10285
    ].concat(contextBarFields));
10286
    var createContextToolbar = function (spec) {
10287
      return asRaw('ContextToolbar', contextToolbarSchema, spec);
10288
    };
10289
 
10290
    var stringArray = function (a) {
10291
      var all = {};
637 daniel-mar 10292
      each$1(a, function (key) {
597 daniel-mar 10293
        all[key] = {};
10294
      });
10295
      return keys(all);
10296
    };
10297
 
637 daniel-mar 10298
    var register$b = function (editor) {
597 daniel-mar 10299
      var popups = editor.ui.registry.getAll().popups;
679 daniel-mar 10300
      var dataset = map$1(popups, function (popup) {
597 daniel-mar 10301
        return createAutocompleter(popup).fold(function (err) {
10302
          throw new Error(formatError(err));
637 daniel-mar 10303
        }, identity$1);
597 daniel-mar 10304
      });
10305
      var triggerChars = stringArray(mapToArray(dataset, function (v) {
10306
        return v.ch;
10307
      }));
10308
      var datasetValues = values(dataset);
10309
      var lookupByChar = function (ch) {
637 daniel-mar 10310
        return filter$2(datasetValues, function (dv) {
597 daniel-mar 10311
          return dv.ch === ch;
10312
        });
10313
      };
10314
      return {
10315
        dataset: dataset,
10316
        triggerChars: triggerChars,
10317
        lookupByChar: lookupByChar
10318
      };
10319
    };
10320
 
10321
    var ItemResponse;
10322
    (function (ItemResponse) {
10323
      ItemResponse[ItemResponse['CLOSE_ON_EXECUTE'] = 0] = 'CLOSE_ON_EXECUTE';
10324
      ItemResponse[ItemResponse['BUBBLE_TO_SANDBOX'] = 1] = 'BUBBLE_TO_SANDBOX';
10325
    }(ItemResponse || (ItemResponse = {})));
10326
    var ItemResponse$1 = ItemResponse;
10327
 
10328
    var navClass = 'tox-menu-nav__js';
10329
    var selectableClass = 'tox-collection__item';
10330
    var colorClass = 'tox-swatch';
10331
    var presetClasses = {
10332
      normal: navClass,
10333
      color: colorClass
10334
    };
10335
    var tickedClass = 'tox-collection__item--enabled';
10336
    var groupHeadingClass = 'tox-collection__group-heading';
10337
    var iconClass = 'tox-collection__item-icon';
10338
    var textClass = 'tox-collection__item-label';
10339
    var accessoryClass = 'tox-collection__item-accessory';
10340
    var caretClass = 'tox-collection__item-caret';
10341
    var checkmarkClass = 'tox-collection__item-checkmark';
10342
    var activeClass = 'tox-collection__item--active';
10343
    var containerClass = 'tox-collection__item-container';
10344
    var containerColumnClass = 'tox-collection__item-container--column';
10345
    var containerRowClass = 'tox-collection__item-container--row';
10346
    var containerAlignRightClass = 'tox-collection__item-container--align-right';
10347
    var containerAlignLeftClass = 'tox-collection__item-container--align-left';
10348
    var containerValignTopClass = 'tox-collection__item-container--valign-top';
10349
    var containerValignMiddleClass = 'tox-collection__item-container--valign-middle';
10350
    var containerValignBottomClass = 'tox-collection__item-container--valign-bottom';
10351
    var classForPreset = function (presets) {
637 daniel-mar 10352
      return get$e(presetClasses, presets).getOr(navClass);
597 daniel-mar 10353
    };
10354
 
10355
    var forMenu = function (presets) {
10356
      if (presets === 'color') {
10357
        return 'tox-swatches';
10358
      } else {
10359
        return 'tox-menu';
10360
      }
10361
    };
10362
    var classes = function (presets) {
10363
      return {
10364
        backgroundMenu: 'tox-background-menu',
10365
        selectedMenu: 'tox-selected-menu',
10366
        selectedItem: 'tox-collection__item--active',
10367
        hasIcons: 'tox-menu--has-icons',
10368
        menu: forMenu(presets),
10369
        tieredMenu: 'tox-tiered-menu'
10370
      };
10371
    };
10372
 
637 daniel-mar 10373
    var markers = function (presets) {
597 daniel-mar 10374
      var menuClasses = classes(presets);
10375
      return {
10376
        backgroundMenu: menuClasses.backgroundMenu,
10377
        selectedMenu: menuClasses.selectedMenu,
10378
        menu: menuClasses.menu,
10379
        selectedItem: menuClasses.selectedItem,
10380
        item: classForPreset(presets)
10381
      };
10382
    };
10383
    var dom$1 = function (hasIcons, columns, presets) {
10384
      var menuClasses = classes(presets);
10385
      return {
10386
        tag: 'div',
10387
        classes: flatten([
10388
          [
10389
            menuClasses.menu,
10390
            'tox-menu-' + columns + '-column'
10391
          ],
10392
          hasIcons ? [menuClasses.hasIcons] : []
10393
        ])
10394
      };
10395
    };
637 daniel-mar 10396
    var components = [Menu.parts.items({})];
597 daniel-mar 10397
    var part = function (hasIcons, columns, presets) {
10398
      var menuClasses = classes(presets);
10399
      var d = {
10400
        tag: 'div',
10401
        classes: flatten([[menuClasses.tieredMenu]])
10402
      };
10403
      return {
10404
        dom: d,
637 daniel-mar 10405
        markers: markers(presets)
597 daniel-mar 10406
      };
10407
    };
10408
 
637 daniel-mar 10409
    var chunk = function (rowDom, numColumns) {
597 daniel-mar 10410
      return function (items) {
637 daniel-mar 10411
        var chunks = chunk$1(items, numColumns);
10412
        return map$2(chunks, function (c) {
597 daniel-mar 10413
          return {
10414
            dom: rowDom,
10415
            components: c
10416
          };
10417
        });
10418
      };
10419
    };
10420
    var forSwatch = function (columns) {
10421
      return {
10422
        dom: {
10423
          tag: 'div',
10424
          classes: [
10425
            'tox-menu',
10426
            'tox-swatches-menu'
10427
          ]
10428
        },
10429
        components: [{
10430
            dom: {
10431
              tag: 'div',
10432
              classes: ['tox-swatches']
10433
            },
10434
            components: [Menu.parts.items({
637 daniel-mar 10435
                preprocess: columns !== 'auto' ? chunk({
597 daniel-mar 10436
                  tag: 'div',
10437
                  classes: ['tox-swatches__row']
637 daniel-mar 10438
                }, columns) : identity$1
597 daniel-mar 10439
              })]
10440
          }]
10441
      };
10442
    };
10443
    var forToolbar = function (columns) {
10444
      return {
10445
        dom: {
10446
          tag: 'div',
10447
          classes: [
10448
            'tox-menu',
10449
            'tox-collection',
10450
            'tox-collection--toolbar',
10451
            'tox-collection--toolbar-lg'
10452
          ]
10453
        },
10454
        components: [Menu.parts.items({
637 daniel-mar 10455
            preprocess: chunk({
597 daniel-mar 10456
              tag: 'div',
10457
              classes: ['tox-collection__group']
10458
            }, columns)
10459
          })]
10460
      };
10461
    };
10462
    var preprocessCollection = function (items, isSeparator) {
10463
      var allSplits = [];
10464
      var currentSplit = [];
637 daniel-mar 10465
      each$1(items, function (item, i) {
597 daniel-mar 10466
        if (isSeparator(item, i)) {
10467
          if (currentSplit.length > 0) {
10468
            allSplits.push(currentSplit);
10469
          }
10470
          currentSplit = [];
637 daniel-mar 10471
          if (has$2(item.dom, 'innerHtml')) {
597 daniel-mar 10472
            currentSplit.push(item);
10473
          }
10474
        } else {
10475
          currentSplit.push(item);
10476
        }
10477
      });
10478
      if (currentSplit.length > 0) {
10479
        allSplits.push(currentSplit);
10480
      }
637 daniel-mar 10481
      return map$2(allSplits, function (s) {
597 daniel-mar 10482
        return {
10483
          dom: {
10484
            tag: 'div',
10485
            classes: ['tox-collection__group']
10486
          },
10487
          components: s
10488
        };
10489
      });
10490
    };
10491
    var forCollection = function (columns, initItems, _hasIcons) {
10492
      return {
10493
        dom: {
10494
          tag: 'div',
10495
          classes: [
10496
            'tox-menu',
10497
            'tox-collection'
10498
          ].concat(columns === 1 ? ['tox-collection--list'] : ['tox-collection--grid'])
10499
        },
10500
        components: [Menu.parts.items({
10501
            preprocess: function (items) {
10502
              if (columns !== 'auto' && columns > 1) {
637 daniel-mar 10503
                return chunk({
597 daniel-mar 10504
                  tag: 'div',
10505
                  classes: ['tox-collection__group']
10506
                }, columns)(items);
10507
              } else {
10508
                return preprocessCollection(items, function (_item, i) {
10509
                  return initItems[i].type === 'separator';
10510
                });
10511
              }
10512
            }
10513
          })]
10514
      };
10515
    };
10516
    var forHorizontalCollection = function (initItems, _hasIcons) {
10517
      return {
10518
        dom: {
10519
          tag: 'div',
10520
          classes: [
10521
            'tox-collection',
10522
            'tox-collection--horizontal'
10523
          ]
10524
        },
10525
        components: [Menu.parts.items({
10526
            preprocess: function (items) {
10527
              return preprocessCollection(items, function (_item, i) {
10528
                return initItems[i].type === 'separator';
10529
              });
10530
            }
10531
          })]
10532
      };
10533
    };
10534
 
10535
    var menuHasIcons = function (xs) {
10536
      return exists(xs, function (item) {
10537
        return 'icon' in item && item.icon !== undefined;
10538
      });
10539
    };
10540
    var handleError = function (error) {
10541
      console.error(formatError(error));
10542
      console.log(error);
10543
      return Optional.none();
10544
    };
10545
    var createHorizontalPartialMenuWithAlloyItems = function (value, _hasIcons, items, _columns, _presets) {
10546
      var structure = forHorizontalCollection(items);
10547
      return {
10548
        value: value,
10549
        dom: structure.dom,
10550
        components: structure.components,
10551
        items: items
10552
      };
10553
    };
10554
    var createPartialMenuWithAlloyItems = function (value, hasIcons, items, columns, presets) {
10555
      if (presets === 'color') {
10556
        var structure = forSwatch(columns);
10557
        return {
10558
          value: value,
10559
          dom: structure.dom,
10560
          components: structure.components,
10561
          items: items
10562
        };
10563
      }
10564
      if (presets === 'normal' && columns === 'auto') {
10565
        var structure = forCollection(columns, items);
10566
        return {
10567
          value: value,
10568
          dom: structure.dom,
10569
          components: structure.components,
10570
          items: items
10571
        };
10572
      }
10573
      if (presets === 'normal' && columns === 1) {
10574
        var structure = forCollection(1, items);
10575
        return {
10576
          value: value,
10577
          dom: structure.dom,
10578
          components: structure.components,
10579
          items: items
10580
        };
10581
      }
10582
      if (presets === 'normal') {
10583
        var structure = forCollection(columns, items);
10584
        return {
10585
          value: value,
10586
          dom: structure.dom,
10587
          components: structure.components,
10588
          items: items
10589
        };
10590
      }
10591
      if (presets === 'listpreview' && columns !== 'auto') {
10592
        var structure = forToolbar(columns);
10593
        return {
10594
          value: value,
10595
          dom: structure.dom,
10596
          components: structure.components,
10597
          items: items
10598
        };
10599
      }
10600
      return {
10601
        value: value,
10602
        dom: dom$1(hasIcons, columns, presets),
637 daniel-mar 10603
        components: components,
597 daniel-mar 10604
        items: items
10605
      };
10606
    };
10607
 
10608
    var cardImageFields = [
637 daniel-mar 10609
      requiredString('type'),
10610
      requiredString('src'),
597 daniel-mar 10611
      optionString('alt'),
10612
      defaultedArrayOf('classes', [], string)
10613
    ];
10614
    var cardImageSchema = objOf(cardImageFields);
10615
 
10616
    var cardTextFields = [
637 daniel-mar 10617
      requiredString('type'),
10618
      requiredString('text'),
597 daniel-mar 10619
      optionString('name'),
10620
      defaultedArrayOf('classes', ['tox-collection__item-label'], string)
10621
    ];
10622
    var cardTextSchema = objOf(cardTextFields);
10623
 
637 daniel-mar 10624
    var itemSchema$1 = valueThunk(function () {
10625
      return choose$2('type', {
597 daniel-mar 10626
        cardimage: cardImageSchema,
10627
        cardtext: cardTextSchema,
10628
        cardcontainer: cardContainerSchema
10629
      });
10630
    });
10631
    var cardContainerSchema = objOf([
637 daniel-mar 10632
      requiredString('type'),
597 daniel-mar 10633
      defaultedString('direction', 'horizontal'),
10634
      defaultedString('align', 'left'),
10635
      defaultedString('valign', 'middle'),
637 daniel-mar 10636
      requiredArrayOf('items', itemSchema$1)
597 daniel-mar 10637
    ]);
10638
 
10639
    var commonMenuItemFields = [
10640
      defaultedBoolean('disabled', false),
10641
      optionString('text'),
10642
      optionString('shortcut'),
637 daniel-mar 10643
      field$1('value', 'value', defaultedThunk(function () {
10644
        return generate$6('menuitem-value');
10645
      }), anyValue()),
10646
      defaulted('meta', {})
597 daniel-mar 10647
    ];
10648
 
10649
    var cardMenuItemSchema = objOf([
637 daniel-mar 10650
      requiredString('type'),
597 daniel-mar 10651
      optionString('label'),
637 daniel-mar 10652
      requiredArrayOf('items', itemSchema$1),
597 daniel-mar 10653
      defaultedFunction('onSetup', function () {
10654
        return noop;
10655
      }),
10656
      defaultedFunction('onAction', noop)
10657
    ].concat(commonMenuItemFields));
10658
    var createCardMenuItem = function (spec) {
10659
      return asRaw('cardmenuitem', cardMenuItemSchema, spec);
10660
    };
10661
 
10662
    var choiceMenuItemSchema = objOf([
637 daniel-mar 10663
      requiredString('type'),
597 daniel-mar 10664
      defaultedBoolean('active', false),
10665
      optionString('icon')
10666
    ].concat(commonMenuItemFields));
10667
    var createChoiceMenuItem = function (spec) {
10668
      return asRaw('choicemenuitem', choiceMenuItemSchema, spec);
10669
    };
10670
 
637 daniel-mar 10671
    var baseFields = [
10672
      requiredString('type'),
10673
      requiredString('fancytype'),
10674
      defaultedFunction('onAction', noop)
597 daniel-mar 10675
    ];
637 daniel-mar 10676
    var insertTableFields = [defaulted('initData', {})].concat(baseFields);
10677
    var colorSwatchFields = [defaultedObjOf('initData', {}, [
10678
        defaultedBoolean('allowCustomColors', true),
10679
        optionArrayOf('colors', anyValue())
10680
      ])].concat(baseFields);
10681
    var fancyMenuItemSchema = choose$1('fancytype', {
10682
      inserttable: insertTableFields,
10683
      colorswatch: colorSwatchFields
10684
    });
597 daniel-mar 10685
    var createFancyMenuItem = function (spec) {
10686
      return asRaw('fancymenuitem', fancyMenuItemSchema, spec);
10687
    };
10688
 
10689
    var menuItemSchema = objOf([
637 daniel-mar 10690
      requiredString('type'),
597 daniel-mar 10691
      defaultedFunction('onSetup', function () {
10692
        return noop;
10693
      }),
10694
      defaultedFunction('onAction', noop),
10695
      optionString('icon')
10696
    ].concat(commonMenuItemFields));
10697
    var createMenuItem = function (spec) {
10698
      return asRaw('menuitem', menuItemSchema, spec);
10699
    };
10700
 
10701
    var nestedMenuItemSchema = objOf([
637 daniel-mar 10702
      requiredString('type'),
10703
      requiredFunction('getSubmenuItems'),
597 daniel-mar 10704
      defaultedFunction('onSetup', function () {
10705
        return noop;
10706
      }),
10707
      optionString('icon')
10708
    ].concat(commonMenuItemFields));
10709
    var createNestedMenuItem = function (spec) {
10710
      return asRaw('nestedmenuitem', nestedMenuItemSchema, spec);
10711
    };
10712
 
10713
    var toggleMenuItemSchema = objOf([
637 daniel-mar 10714
      requiredString('type'),
597 daniel-mar 10715
      optionString('icon'),
10716
      defaultedBoolean('active', false),
10717
      defaultedFunction('onSetup', function () {
10718
        return noop;
10719
      }),
637 daniel-mar 10720
      requiredFunction('onAction')
597 daniel-mar 10721
    ].concat(commonMenuItemFields));
10722
    var createToggleMenuItem = function (spec) {
10723
      return asRaw('togglemenuitem', toggleMenuItemSchema, spec);
10724
    };
10725
 
10726
    var detectSize = function (comp, margin, selectorClass) {
10727
      var descendants$1 = descendants(comp.element, '.' + selectorClass);
10728
      if (descendants$1.length > 0) {
637 daniel-mar 10729
        var columnLength = findIndex$1(descendants$1, function (c) {
597 daniel-mar 10730
          var thisTop = c.dom.getBoundingClientRect().top;
10731
          var cTop = descendants$1[0].dom.getBoundingClientRect().top;
10732
          return Math.abs(thisTop - cTop) > margin;
10733
        }).getOr(descendants$1.length);
10734
        return Optional.some({
10735
          numColumns: columnLength,
10736
          numRows: Math.ceil(descendants$1.length / columnLength)
10737
        });
10738
      } else {
10739
        return Optional.none();
10740
      }
10741
    };
10742
 
10743
    var namedEvents = function (name, handlers) {
10744
      return derive$1([config(name, handlers)]);
10745
    };
10746
    var unnamedEvents = function (handlers) {
637 daniel-mar 10747
      return namedEvents(generate$6('unnamed-events'), handlers);
597 daniel-mar 10748
    };
10749
    var SimpleBehaviours = {
10750
      namedEvents: namedEvents,
10751
      unnamedEvents: unnamedEvents
10752
    };
10753
 
637 daniel-mar 10754
    var ExclusivityChannel = generate$6('tooltip.exclusive');
10755
    var ShowTooltipEvent = generate$6('tooltip.show');
10756
    var HideTooltipEvent = generate$6('tooltip.hide');
597 daniel-mar 10757
 
10758
    var hideAllExclusive = function (component, _tConfig, _tState) {
10759
      component.getSystem().broadcastOn([ExclusivityChannel], {});
10760
    };
10761
    var setComponents = function (component, tConfig, tState, specs) {
10762
      tState.getTooltip().each(function (tooltip) {
10763
        if (tooltip.getSystem().isConnected()) {
10764
          Replacing.set(tooltip, specs);
10765
        }
10766
      });
10767
    };
10768
 
10769
    var TooltippingApis = /*#__PURE__*/Object.freeze({
10770
        __proto__: null,
10771
        hideAllExclusive: hideAllExclusive,
10772
        setComponents: setComponents
10773
    });
10774
 
637 daniel-mar 10775
    var events$9 = function (tooltipConfig, state) {
597 daniel-mar 10776
      var hide = function (comp) {
10777
        state.getTooltip().each(function (p) {
10778
          detach(p);
10779
          tooltipConfig.onHide(comp, p);
10780
          state.clearTooltip();
10781
        });
10782
        state.clearTimer();
10783
      };
10784
      var show = function (comp) {
10785
        if (!state.isShowing()) {
10786
          hideAllExclusive(comp);
10787
          var sink = tooltipConfig.lazySink(comp).getOrDie();
10788
          var popup = comp.getSystem().build({
10789
            dom: tooltipConfig.tooltipDom,
10790
            components: tooltipConfig.tooltipComponents,
637 daniel-mar 10791
            events: derive$2(tooltipConfig.mode === 'normal' ? [
10792
              run$1(mouseover(), function (_) {
597 daniel-mar 10793
                emit(comp, ShowTooltipEvent);
10794
              }),
637 daniel-mar 10795
              run$1(mouseout(), function (_) {
597 daniel-mar 10796
                emit(comp, HideTooltipEvent);
10797
              })
10798
            ] : []),
10799
            behaviours: derive$1([Replacing.config({})])
10800
          });
10801
          state.setTooltip(popup);
637 daniel-mar 10802
          attach(sink, popup);
597 daniel-mar 10803
          tooltipConfig.onShow(comp, popup);
637 daniel-mar 10804
          Positioning.position(sink, popup, { anchor: tooltipConfig.anchor(comp) });
597 daniel-mar 10805
        }
10806
      };
637 daniel-mar 10807
      return derive$2(flatten([
597 daniel-mar 10808
        [
637 daniel-mar 10809
          run$1(ShowTooltipEvent, function (comp) {
597 daniel-mar 10810
            state.resetTimer(function () {
10811
              show(comp);
10812
            }, tooltipConfig.delay);
10813
          }),
637 daniel-mar 10814
          run$1(HideTooltipEvent, function (comp) {
597 daniel-mar 10815
            state.resetTimer(function () {
10816
              hide(comp);
10817
            }, tooltipConfig.delay);
10818
          }),
637 daniel-mar 10819
          run$1(receive(), function (comp, message) {
597 daniel-mar 10820
            var receivingData = message;
10821
            if (!receivingData.universal) {
637 daniel-mar 10822
              if (contains$2(receivingData.channels, ExclusivityChannel)) {
597 daniel-mar 10823
                hide(comp);
10824
              }
10825
            }
10826
          }),
10827
          runOnDetached(function (comp) {
10828
            hide(comp);
10829
          })
10830
        ],
10831
        tooltipConfig.mode === 'normal' ? [
637 daniel-mar 10832
          run$1(focusin(), function (comp) {
597 daniel-mar 10833
            emit(comp, ShowTooltipEvent);
10834
          }),
637 daniel-mar 10835
          run$1(postBlur(), function (comp) {
597 daniel-mar 10836
            emit(comp, HideTooltipEvent);
10837
          }),
637 daniel-mar 10838
          run$1(mouseover(), function (comp) {
597 daniel-mar 10839
            emit(comp, ShowTooltipEvent);
10840
          }),
637 daniel-mar 10841
          run$1(mouseout(), function (comp) {
597 daniel-mar 10842
            emit(comp, HideTooltipEvent);
10843
          })
10844
        ] : [
637 daniel-mar 10845
          run$1(highlight$1(), function (comp, _se) {
597 daniel-mar 10846
            emit(comp, ShowTooltipEvent);
10847
          }),
637 daniel-mar 10848
          run$1(dehighlight$1(), function (comp) {
597 daniel-mar 10849
            emit(comp, HideTooltipEvent);
10850
          })
10851
        ]
10852
      ]));
10853
    };
10854
 
10855
    var ActiveTooltipping = /*#__PURE__*/Object.freeze({
10856
        __proto__: null,
637 daniel-mar 10857
        events: events$9
597 daniel-mar 10858
    });
10859
 
10860
    var TooltippingSchema = [
637 daniel-mar 10861
      required$1('lazySink'),
10862
      required$1('tooltipDom'),
10863
      defaulted('exclusive', true),
10864
      defaulted('tooltipComponents', []),
10865
      defaulted('delay', 300),
597 daniel-mar 10866
      defaultedStringEnum('mode', 'normal', [
10867
        'normal',
10868
        'follow-highlight'
10869
      ]),
637 daniel-mar 10870
      defaulted('anchor', function (comp) {
597 daniel-mar 10871
        return {
637 daniel-mar 10872
          type: 'hotspot',
597 daniel-mar 10873
          hotspot: comp,
10874
          layouts: {
637 daniel-mar 10875
            onLtr: constant$1([
10876
              south$2,
10877
              north$2,
10878
              southeast$2,
10879
              northeast$2,
10880
              southwest$2,
10881
              northwest$2
597 daniel-mar 10882
            ]),
637 daniel-mar 10883
            onRtl: constant$1([
10884
              south$2,
10885
              north$2,
10886
              southeast$2,
10887
              northeast$2,
10888
              southwest$2,
10889
              northwest$2
597 daniel-mar 10890
            ])
10891
          }
10892
        };
10893
      }),
10894
      onHandler('onHide'),
10895
      onHandler('onShow')
10896
    ];
10897
 
637 daniel-mar 10898
    var init$b = function () {
10899
      var timer = value$1();
10900
      var popup = value$1();
597 daniel-mar 10901
      var clearTimer = function () {
637 daniel-mar 10902
        timer.on(clearTimeout);
597 daniel-mar 10903
      };
10904
      var resetTimer = function (f, delay) {
10905
        clearTimer();
637 daniel-mar 10906
        timer.set(setTimeout(f, delay));
597 daniel-mar 10907
      };
637 daniel-mar 10908
      var readState = constant$1('not-implemented');
10909
      return nu$8({
10910
        getTooltip: popup.get,
10911
        isShowing: popup.isSet,
10912
        setTooltip: popup.set,
10913
        clearTooltip: popup.clear,
597 daniel-mar 10914
        clearTimer: clearTimer,
10915
        resetTimer: resetTimer,
10916
        readState: readState
10917
      });
10918
    };
10919
 
10920
    var TooltippingState = /*#__PURE__*/Object.freeze({
10921
        __proto__: null,
637 daniel-mar 10922
        init: init$b
597 daniel-mar 10923
    });
10924
 
637 daniel-mar 10925
    var Tooltipping = create$7({
597 daniel-mar 10926
      fields: TooltippingSchema,
10927
      name: 'tooltipping',
10928
      active: ActiveTooltipping,
10929
      state: TooltippingState,
10930
      apis: TooltippingApis
10931
    });
10932
 
10933
    var escape = function (text) {
10934
      return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
10935
    };
10936
 
679 daniel-mar 10937
    var global$b = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
597 daniel-mar 10938
 
679 daniel-mar 10939
    var global$a = tinymce.util.Tools.resolve('tinymce.EditorManager');
597 daniel-mar 10940
 
10941
    var getSkinUrl = function (editor) {
10942
      var skin = editor.getParam('skin');
10943
      var skinUrl = editor.getParam('skin_url');
10944
      if (skin !== false) {
10945
        var skinName = skin ? skin : 'oxide';
10946
        if (skinUrl) {
10947
          skinUrl = editor.documentBaseURI.toAbsolute(skinUrl);
10948
        } else {
679 daniel-mar 10949
          skinUrl = global$a.baseURL + '/skins/ui/' + skinName;
597 daniel-mar 10950
        }
10951
      }
10952
      return skinUrl;
10953
    };
10954
    var isReadOnly = function (editor) {
10955
      return editor.getParam('readonly', false, 'boolean');
10956
    };
10957
    var isSkinDisabled = function (editor) {
10958
      return editor.getParam('skin') === false;
10959
    };
10960
    var getHeightSetting = function (editor) {
10961
      return editor.getParam('height', Math.max(editor.getElement().offsetHeight, 200));
10962
    };
10963
    var getWidthSetting = function (editor) {
679 daniel-mar 10964
      return editor.getParam('width', global$b.DOM.getStyle(editor.getElement(), 'width'));
597 daniel-mar 10965
    };
10966
    var getMinWidthSetting = function (editor) {
10967
      return Optional.from(editor.getParam('min_width')).filter(isNumber);
10968
    };
10969
    var getMinHeightSetting = function (editor) {
10970
      return Optional.from(editor.getParam('min_height')).filter(isNumber);
10971
    };
10972
    var getMaxWidthSetting = function (editor) {
10973
      return Optional.from(editor.getParam('max_width')).filter(isNumber);
10974
    };
10975
    var getMaxHeightSetting = function (editor) {
10976
      return Optional.from(editor.getParam('max_height')).filter(isNumber);
10977
    };
10978
    var getUserStyleFormats = function (editor) {
10979
      return Optional.from(editor.getParam('style_formats')).filter(isArray);
10980
    };
10981
    var isMergeStyleFormats = function (editor) {
10982
      return editor.getParam('style_formats_merge', false, 'boolean');
10983
    };
10984
    var getLineHeightFormats = function (editor) {
10985
      return editor.getParam('lineheight_formats', '1 1.1 1.2 1.3 1.4 1.5 2', 'string').split(' ');
10986
    };
637 daniel-mar 10987
    var getContentLanguages = function (editor) {
10988
      return editor.getParam('content_langs', undefined, 'array');
10989
    };
597 daniel-mar 10990
    var getRemovedMenuItems = function (editor) {
10991
      return editor.getParam('removed_menuitems', '');
10992
    };
10993
    var isMenubarEnabled = function (editor) {
10994
      return editor.getParam('menubar', true, 'boolean') !== false;
10995
    };
10996
    var isToolbarEnabled = function (editor) {
10997
      var toolbar = editor.getParam('toolbar', true);
10998
      var isToolbarTrue = toolbar === true;
10999
      var isToolbarString = isString(toolbar);
11000
      var isToolbarObjectArray = isArray(toolbar) && toolbar.length > 0;
11001
      return !isMultipleToolbars(editor) && (isToolbarObjectArray || isToolbarString || isToolbarTrue);
11002
    };
11003
    var getMultipleToolbarsSetting = function (editor) {
637 daniel-mar 11004
      var toolbars = range$2(9, function (num) {
597 daniel-mar 11005
        return editor.getParam('toolbar' + (num + 1), false, 'string');
11006
      });
637 daniel-mar 11007
      var toolbarArray = filter$2(toolbars, function (toolbar) {
597 daniel-mar 11008
        return typeof toolbar === 'string';
11009
      });
11010
      return toolbarArray.length > 0 ? Optional.some(toolbarArray) : Optional.none();
11011
    };
11012
    var isMultipleToolbars = function (editor) {
11013
      return getMultipleToolbarsSetting(editor).fold(function () {
11014
        var toolbar = editor.getParam('toolbar', [], 'string[]');
11015
        return toolbar.length > 0;
11016
      }, always);
11017
    };
11018
    var ToolbarMode;
11019
    (function (ToolbarMode) {
11020
      ToolbarMode['default'] = 'wrap';
11021
      ToolbarMode['floating'] = 'floating';
11022
      ToolbarMode['sliding'] = 'sliding';
11023
      ToolbarMode['scrolling'] = 'scrolling';
11024
    }(ToolbarMode || (ToolbarMode = {})));
11025
    var getToolbarMode = function (editor) {
11026
      return editor.getParam('toolbar_mode', '', 'string');
11027
    };
11028
    var ToolbarLocation;
11029
    (function (ToolbarLocation) {
11030
      ToolbarLocation['auto'] = 'auto';
11031
      ToolbarLocation['top'] = 'top';
11032
      ToolbarLocation['bottom'] = 'bottom';
11033
    }(ToolbarLocation || (ToolbarLocation = {})));
11034
    var getToolbarGroups = function (editor) {
11035
      return editor.getParam('toolbar_groups', {}, 'object');
11036
    };
11037
    var getToolbarLocation = function (editor) {
11038
      return editor.getParam('toolbar_location', ToolbarLocation.auto, 'string');
11039
    };
11040
    var isToolbarLocationBottom = function (editor) {
11041
      return getToolbarLocation(editor) === ToolbarLocation.bottom;
11042
    };
11043
    var fixedContainerSelector = function (editor) {
11044
      return editor.getParam('fixed_toolbar_container', '', 'string');
11045
    };
11046
    var fixedToolbarContainerTarget = function (editor) {
11047
      return editor.getParam('fixed_toolbar_container_target');
11048
    };
11049
    var isToolbarPersist = function (editor) {
11050
      return editor.getParam('toolbar_persist', false, 'boolean');
11051
    };
11052
    var fixedContainerTarget = function (editor) {
11053
      if (!editor.inline) {
11054
        return Optional.none();
11055
      }
11056
      var selector = fixedContainerSelector(editor);
11057
      if (selector.length > 0) {
637 daniel-mar 11058
        return descendant(body(), selector);
597 daniel-mar 11059
      }
11060
      var element = fixedToolbarContainerTarget(editor);
11061
      if (isNonNullable(element)) {
11062
        return Optional.some(SugarElement.fromDom(element));
11063
      }
11064
      return Optional.none();
11065
    };
11066
    var useFixedContainer = function (editor) {
11067
      return editor.inline && fixedContainerTarget(editor).isSome();
11068
    };
11069
    var getUiContainer = function (editor) {
11070
      var fixedContainer = fixedContainerTarget(editor);
11071
      return fixedContainer.getOrThunk(function () {
11072
        return getContentContainer(getRootNode(SugarElement.fromDom(editor.getElement())));
11073
      });
11074
    };
11075
    var isDistractionFree = function (editor) {
11076
      return editor.inline && !isMenubarEnabled(editor) && !isToolbarEnabled(editor) && !isMultipleToolbars(editor);
11077
    };
11078
    var isStickyToolbar = function (editor) {
11079
      var isStickyToolbar = editor.getParam('toolbar_sticky', false, 'boolean');
11080
      return (isStickyToolbar || editor.inline) && !useFixedContainer(editor) && !isDistractionFree(editor);
11081
    };
637 daniel-mar 11082
    var getStickyToolbarOffset = function (editor) {
11083
      return editor.getParam('toolbar_sticky_offset', 0, 'number');
11084
    };
11085
    var isDraggableModal$1 = function (editor) {
597 daniel-mar 11086
      return editor.getParam('draggable_modal', false, 'boolean');
11087
    };
11088
    var getMenus = function (editor) {
11089
      var menu = editor.getParam('menu');
11090
      if (menu) {
679 daniel-mar 11091
        return map$1(menu, function (menu) {
597 daniel-mar 11092
          return __assign(__assign({}, menu), { items: menu.items });
11093
        });
11094
      } else {
11095
        return {};
11096
      }
11097
    };
11098
    var getMenubar = function (editor) {
11099
      return editor.getParam('menubar');
11100
    };
11101
    var getToolbar = function (editor) {
11102
      return editor.getParam('toolbar', true);
11103
    };
11104
    var getFilePickerCallback = function (editor) {
11105
      return editor.getParam('file_picker_callback');
11106
    };
11107
    var getFilePickerTypes = function (editor) {
11108
      return editor.getParam('file_picker_types');
11109
    };
11110
    var getFileBrowserCallbackTypes = function (editor) {
11111
      return editor.getParam('file_browser_callback_types');
11112
    };
11113
    var noTypeaheadUrls = function (editor) {
11114
      return editor.getParam('typeahead_urls') === false;
11115
    };
11116
    var getAnchorTop = function (editor) {
11117
      return editor.getParam('anchor_top', '#top');
11118
    };
11119
    var getAnchorBottom = function (editor) {
11120
      return editor.getParam('anchor_bottom', '#bottom');
11121
    };
11122
    var getFilePickerValidatorHandler = function (editor) {
11123
      var handler = editor.getParam('file_picker_validator_handler', undefined, 'function');
11124
      if (handler === undefined) {
11125
        return editor.getParam('filepicker_validator_handler', undefined, 'function');
11126
      } else {
11127
        return handler;
11128
      }
11129
    };
11130
 
11131
    var ReadOnlyChannel = 'silver.readonly';
637 daniel-mar 11132
    var ReadOnlyDataSchema = objOf([requiredBoolean('readonly')]);
597 daniel-mar 11133
    var broadcastReadonly = function (uiComponents, readonly) {
11134
      var outerContainer = uiComponents.outerContainer;
11135
      var target = outerContainer.element;
11136
      if (readonly) {
11137
        uiComponents.mothership.broadcastOn([dismissPopups()], { target: target });
11138
        uiComponents.uiMothership.broadcastOn([dismissPopups()], { target: target });
11139
      }
11140
      uiComponents.mothership.broadcastOn([ReadOnlyChannel], { readonly: readonly });
11141
      uiComponents.uiMothership.broadcastOn([ReadOnlyChannel], { readonly: readonly });
11142
    };
11143
    var setupReadonlyModeSwitch = function (editor, uiComponents) {
11144
      editor.on('init', function () {
11145
        if (editor.mode.isReadOnly()) {
11146
          broadcastReadonly(uiComponents, true);
11147
        }
11148
      });
11149
      editor.on('SwitchMode', function () {
11150
        return broadcastReadonly(uiComponents, editor.mode.isReadOnly());
11151
      });
11152
      if (isReadOnly(editor)) {
11153
        editor.setMode('readonly');
11154
      }
11155
    };
11156
    var receivingConfig = function () {
11157
      var _a;
11158
      return Receiving.config({
11159
        channels: (_a = {}, _a[ReadOnlyChannel] = {
11160
          schema: ReadOnlyDataSchema,
11161
          onReceive: function (comp, data) {
11162
            Disabling.set(comp, data.readonly);
11163
          }
11164
        }, _a)
11165
      });
11166
    };
11167
 
11168
    var item = function (disabled) {
11169
      return Disabling.config({
11170
        disabled: disabled,
11171
        disableClass: 'tox-collection__item--state-disabled'
11172
      });
11173
    };
11174
    var button = function (disabled) {
11175
      return Disabling.config({ disabled: disabled });
11176
    };
11177
    var splitButton = function (disabled) {
11178
      return Disabling.config({
11179
        disabled: disabled,
11180
        disableClass: 'tox-tbtn--disabled'
11181
      });
11182
    };
11183
    var toolbarButton = function (disabled) {
11184
      return Disabling.config({
11185
        disabled: disabled,
11186
        disableClass: 'tox-tbtn--disabled',
11187
        useNative: false
11188
      });
11189
    };
11190
    var DisablingConfigs = {
11191
      item: item,
11192
      button: button,
11193
      splitButton: splitButton,
11194
      toolbarButton: toolbarButton
11195
    };
11196
 
11197
    var runWithApi = function (info, comp) {
11198
      var api = info.getApi(comp);
11199
      return function (f) {
11200
        f(api);
11201
      };
11202
    };
11203
    var onControlAttached = function (info, editorOffCell) {
11204
      return runOnAttached(function (comp) {
11205
        var run = runWithApi(info, comp);
11206
        run(function (api) {
11207
          var onDestroy = info.onSetup(api);
11208
          if (isFunction(onDestroy)) {
11209
            editorOffCell.set(onDestroy);
11210
          }
11211
        });
11212
      });
11213
    };
11214
    var onControlDetached = function (getApi, editorOffCell) {
11215
      return runOnDetached(function (comp) {
11216
        return runWithApi(getApi, comp)(editorOffCell.get());
11217
      });
11218
    };
11219
 
637 daniel-mar 11220
    var _a$1;
597 daniel-mar 11221
    var onMenuItemExecute = function (info, itemResponse) {
637 daniel-mar 11222
      return runOnExecute$1(function (comp, simulatedEvent) {
597 daniel-mar 11223
        runWithApi(info, comp)(info.onAction);
11224
        if (!info.triggersSubmenu && itemResponse === ItemResponse$1.CLOSE_ON_EXECUTE) {
637 daniel-mar 11225
          emit(comp, sandboxClose());
597 daniel-mar 11226
          simulatedEvent.stop();
11227
        }
11228
      });
11229
    };
637 daniel-mar 11230
    var menuItemEventOrder = (_a$1 = {}, _a$1[execute$5()] = [
597 daniel-mar 11231
      'disabling',
11232
      'alloy.base.behaviour',
11233
      'toggling',
11234
      'item-events'
637 daniel-mar 11235
    ], _a$1);
597 daniel-mar 11236
 
637 daniel-mar 11237
    var componentRenderPipeline = cat;
597 daniel-mar 11238
    var renderCommonItem = function (spec, structure, itemResponse, providersbackstage) {
11239
      var editorOffCell = Cell(noop);
11240
      return {
11241
        type: 'item',
11242
        dom: structure.dom,
11243
        components: componentRenderPipeline(structure.optComponents),
11244
        data: spec.data,
11245
        eventOrder: menuItemEventOrder,
11246
        hasSubmenu: spec.triggersSubmenu,
11247
        itemBehaviours: derive$1([
11248
          config('item-events', [
11249
            onMenuItemExecute(spec, itemResponse),
11250
            onControlAttached(spec, editorOffCell),
11251
            onControlDetached(spec, editorOffCell)
11252
          ]),
11253
          DisablingConfigs.item(function () {
11254
            return spec.disabled || providersbackstage.isDisabled();
11255
          }),
11256
          receivingConfig(),
11257
          Replacing.config({})
11258
        ].concat(spec.itemBehaviours))
11259
      };
11260
    };
11261
    var buildData = function (source) {
11262
      return {
11263
        value: source.value,
11264
        meta: __assign({ text: source.text.getOr('') }, source.meta)
11265
      };
11266
    };
11267
 
679 daniel-mar 11268
    var global$9 = tinymce.util.Tools.resolve('tinymce.Env');
597 daniel-mar 11269
 
11270
    var convertText = function (source) {
11271
      var mac = {
11272
        alt: '&#x2325;',
11273
        ctrl: '&#x2303;',
11274
        shift: '&#x21E7;',
11275
        meta: '&#x2318;',
11276
        access: '&#x2303;&#x2325;'
11277
      };
11278
      var other = {
11279
        meta: 'Ctrl',
11280
        access: 'Shift+Alt'
11281
      };
679 daniel-mar 11282
      var replace = global$9.mac ? mac : other;
597 daniel-mar 11283
      var shortcut = source.split('+');
637 daniel-mar 11284
      var updated = map$2(shortcut, function (segment) {
597 daniel-mar 11285
        var search = segment.toLowerCase().trim();
637 daniel-mar 11286
        return has$2(replace, search) ? replace[search] : segment;
597 daniel-mar 11287
      });
679 daniel-mar 11288
      return global$9.mac ? updated.join('') : updated.join('+');
597 daniel-mar 11289
    };
11290
 
637 daniel-mar 11291
    var renderIcon$1 = function (name, icons, classes) {
11292
      if (classes === void 0) {
11293
        classes = [iconClass];
11294
      }
11295
      return render$3(name, {
11296
        tag: 'div',
11297
        classes: classes
11298
      }, icons);
597 daniel-mar 11299
    };
11300
    var renderText = function (text$1) {
11301
      return {
11302
        dom: {
11303
          tag: 'div',
11304
          classes: [textClass]
11305
        },
679 daniel-mar 11306
        components: [text(global$e.translate(text$1))]
597 daniel-mar 11307
      };
11308
    };
11309
    var renderHtml = function (html, classes) {
11310
      return {
11311
        dom: {
11312
          tag: 'div',
11313
          classes: classes,
11314
          innerHtml: html
11315
        }
11316
      };
11317
    };
11318
    var renderStyledText = function (style, text$1) {
11319
      return {
11320
        dom: {
11321
          tag: 'div',
11322
          classes: [textClass]
11323
        },
11324
        components: [{
11325
            dom: {
11326
              tag: style.tag,
11327
              styles: style.styles
11328
            },
679 daniel-mar 11329
            components: [text(global$e.translate(text$1))]
597 daniel-mar 11330
          }]
11331
      };
11332
    };
11333
    var renderShortcut = function (shortcut) {
11334
      return {
11335
        dom: {
11336
          tag: 'div',
11337
          classes: [accessoryClass],
11338
          innerHtml: convertText(shortcut)
11339
        }
11340
      };
11341
    };
11342
    var renderCheckmark = function (icons) {
637 daniel-mar 11343
      return renderIcon$1('checkmark', icons, [checkmarkClass]);
597 daniel-mar 11344
    };
11345
    var renderSubmenuCaret = function (icons) {
637 daniel-mar 11346
      return renderIcon$1('chevron-right', icons, [caretClass]);
597 daniel-mar 11347
    };
11348
    var renderDownwardsCaret = function (icons) {
637 daniel-mar 11349
      return renderIcon$1('chevron-down', icons, [caretClass]);
597 daniel-mar 11350
    };
11351
    var renderContainer = function (container, components) {
11352
      var directionClass = container.direction === 'vertical' ? containerColumnClass : containerRowClass;
11353
      var alignClass = container.align === 'left' ? containerAlignLeftClass : containerAlignRightClass;
11354
      var getValignClass = function () {
11355
        switch (container.valign) {
11356
        case 'top':
11357
          return containerValignTopClass;
11358
        case 'middle':
11359
          return containerValignMiddleClass;
11360
        case 'bottom':
11361
          return containerValignBottomClass;
11362
        }
11363
      };
11364
      return {
11365
        dom: {
11366
          tag: 'div',
11367
          classes: [
11368
            containerClass,
11369
            directionClass,
11370
            alignClass,
11371
            getValignClass()
11372
          ]
11373
        },
11374
        components: components
11375
      };
11376
    };
11377
    var renderImage = function (src, classes, alt) {
11378
      return {
11379
        dom: {
11380
          tag: 'img',
11381
          classes: classes,
11382
          attributes: {
11383
            src: src,
11384
            alt: alt.getOr('')
11385
          }
11386
        }
11387
      };
11388
    };
11389
 
637 daniel-mar 11390
    var renderColorStructure = function (item, providerBackstage, fallbackIcon) {
597 daniel-mar 11391
      var colorPickerCommand = 'custom';
11392
      var removeColorCommand = 'remove';
637 daniel-mar 11393
      var itemText = item.ariaLabel;
11394
      var itemValue = item.value;
11395
      var iconSvg = item.iconContent.map(function (name) {
11396
        return getOr(name, providerBackstage.icons, fallbackIcon);
11397
      });
597 daniel-mar 11398
      var getDom = function () {
11399
        var common = colorClass;
11400
        var icon = iconSvg.getOr('');
11401
        var attributes = itemText.map(function (text) {
11402
          return { title: providerBackstage.translate(text) };
11403
        }).getOr({});
11404
        var baseDom = {
11405
          tag: 'div',
11406
          attributes: attributes,
11407
          classes: [common]
11408
        };
11409
        if (itemValue === colorPickerCommand) {
11410
          return __assign(__assign({}, baseDom), {
11411
            tag: 'button',
679 daniel-mar 11412
            classes: __spreadArray(__spreadArray([], baseDom.classes, true), ['tox-swatches__picker-btn'], false),
597 daniel-mar 11413
            innerHtml: icon
11414
          });
11415
        } else if (itemValue === removeColorCommand) {
11416
          return __assign(__assign({}, baseDom), {
679 daniel-mar 11417
            classes: __spreadArray(__spreadArray([], baseDom.classes, true), ['tox-swatch--remove'], false),
597 daniel-mar 11418
            innerHtml: icon
11419
          });
11420
        } else {
11421
          return __assign(__assign({}, baseDom), {
11422
            attributes: __assign(__assign({}, baseDom.attributes), { 'data-mce-color': itemValue }),
11423
            styles: { 'background-color': itemValue }
11424
          });
11425
        }
11426
      };
11427
      return {
11428
        dom: getDom(),
11429
        optComponents: []
11430
      };
11431
    };
637 daniel-mar 11432
    var renderItemDomStructure = function (ariaLabel) {
597 daniel-mar 11433
      var domTitle = ariaLabel.map(function (label) {
679 daniel-mar 11434
        return { attributes: { title: global$e.translate(label) } };
597 daniel-mar 11435
      }).getOr({});
11436
      return __assign({
11437
        tag: 'div',
11438
        classes: [
11439
          navClass,
11440
          selectableClass
637 daniel-mar 11441
        ]
597 daniel-mar 11442
      }, domTitle);
11443
    };
637 daniel-mar 11444
    var renderNormalItemStructure = function (info, providersBackstage, renderIcons, fallbackIcon) {
11445
      var iconSpec = {
11446
        tag: 'div',
11447
        classes: [iconClass]
11448
      };
11449
      var renderIcon = function (iconName) {
11450
        return render$3(iconName, iconSpec, providersBackstage.icons, fallbackIcon);
11451
      };
11452
      var renderEmptyIcon = function () {
11453
        return Optional.some({ dom: iconSpec });
11454
      };
11455
      var leftIcon = renderIcons ? info.iconContent.map(renderIcon).orThunk(renderEmptyIcon) : Optional.none();
597 daniel-mar 11456
      var checkmark = info.checkMark;
637 daniel-mar 11457
      var textRender = Optional.from(info.meta).fold(function () {
11458
        return renderText;
11459
      }, function (meta) {
11460
        return has$2(meta, 'style') ? curry(renderStyledText, meta.style) : renderText;
11461
      });
597 daniel-mar 11462
      var content = info.htmlContent.fold(function () {
11463
        return info.textContent.map(textRender);
11464
      }, function (html) {
11465
        return Optional.some(renderHtml(html, [textClass]));
11466
      });
11467
      var menuItem = {
637 daniel-mar 11468
        dom: renderItemDomStructure(info.ariaLabel),
597 daniel-mar 11469
        optComponents: [
11470
          leftIcon,
11471
          content,
11472
          info.shortcutContent.map(renderShortcut),
11473
          checkmark,
11474
          info.caret
11475
        ]
11476
      };
11477
      return menuItem;
11478
    };
11479
    var renderItemStructure = function (info, providersBackstage, renderIcons, fallbackIcon) {
11480
      if (fallbackIcon === void 0) {
11481
        fallbackIcon = Optional.none();
11482
      }
11483
      if (info.presets === 'color') {
637 daniel-mar 11484
        return renderColorStructure(info, providersBackstage, fallbackIcon);
597 daniel-mar 11485
      } else {
637 daniel-mar 11486
        return renderNormalItemStructure(info, providersBackstage, renderIcons, fallbackIcon);
597 daniel-mar 11487
      }
11488
    };
11489
 
11490
    var tooltipBehaviour = function (meta, sharedBackstage) {
637 daniel-mar 11491
      return get$e(meta, 'tooltipWorker').map(function (tooltipWorker) {
597 daniel-mar 11492
        return [Tooltipping.config({
11493
            lazySink: sharedBackstage.getSink,
11494
            tooltipDom: {
11495
              tag: 'div',
11496
              classes: ['tox-tooltip-worker-container']
11497
            },
11498
            tooltipComponents: [],
11499
            anchor: function (comp) {
11500
              return {
637 daniel-mar 11501
                type: 'submenu',
597 daniel-mar 11502
                item: comp,
637 daniel-mar 11503
                overrides: { maxHeightFunction: expandable$1 }
597 daniel-mar 11504
              };
11505
            },
11506
            mode: 'follow-highlight',
11507
            onShow: function (component, _tooltip) {
11508
              tooltipWorker(function (elm) {
637 daniel-mar 11509
                Tooltipping.setComponents(component, [external$2({ element: SugarElement.fromDom(elm) })]);
597 daniel-mar 11510
              });
11511
            }
11512
          })];
11513
      }).getOr([]);
11514
    };
11515
    var encodeText = function (text) {
679 daniel-mar 11516
      return global$b.DOM.encode(text);
597 daniel-mar 11517
    };
11518
    var replaceText = function (text, matchText) {
679 daniel-mar 11519
      var translated = global$e.translate(text);
597 daniel-mar 11520
      var encoded = encodeText(translated);
11521
      if (matchText.length > 0) {
11522
        var escapedMatchRegex = new RegExp(escape(matchText), 'gi');
11523
        return encoded.replace(escapedMatchRegex, function (match) {
11524
          return '<span class="tox-autocompleter-highlight">' + match + '</span>';
11525
        });
11526
      } else {
11527
        return encoded;
11528
      }
11529
    };
11530
    var renderAutocompleteItem = function (spec, matchText, useText, presets, onItemValueHandler, itemResponse, sharedBackstage, renderIcons) {
11531
      if (renderIcons === void 0) {
11532
        renderIcons = true;
11533
      }
11534
      var structure = renderItemStructure({
11535
        presets: presets,
11536
        textContent: Optional.none(),
11537
        htmlContent: useText ? spec.text.map(function (text) {
11538
          return replaceText(text, matchText);
11539
        }) : Optional.none(),
11540
        ariaLabel: spec.text,
11541
        iconContent: spec.icon,
11542
        shortcutContent: Optional.none(),
11543
        checkMark: Optional.none(),
11544
        caret: Optional.none(),
11545
        value: spec.value
11546
      }, sharedBackstage.providers, renderIcons, spec.icon);
11547
      return renderCommonItem({
11548
        data: buildData(spec),
11549
        disabled: spec.disabled,
637 daniel-mar 11550
        getApi: constant$1({}),
597 daniel-mar 11551
        onAction: function (_api) {
11552
          return onItemValueHandler(spec.value, spec.meta);
11553
        },
637 daniel-mar 11554
        onSetup: constant$1(noop),
597 daniel-mar 11555
        triggersSubmenu: false,
11556
        itemBehaviours: tooltipBehaviour(spec.meta, sharedBackstage)
11557
      }, structure, itemResponse, sharedBackstage.providers);
11558
    };
11559
 
637 daniel-mar 11560
    var render$2 = function (items, extras) {
11561
      return map$2(items, function (item) {
597 daniel-mar 11562
        switch (item.type) {
11563
        case 'cardcontainer':
637 daniel-mar 11564
          return renderContainer(item, render$2(item.items, extras));
597 daniel-mar 11565
        case 'cardimage':
11566
          return renderImage(item.src, item.classes, item.alt);
11567
        case 'cardtext':
11568
          var shouldHighlight = item.name.exists(function (name) {
637 daniel-mar 11569
            return contains$2(extras.cardText.highlightOn, name);
597 daniel-mar 11570
          });
11571
          var matchText = shouldHighlight ? Optional.from(extras.cardText.matchText).getOr('') : '';
11572
          return renderHtml(replaceText(item.text, matchText), item.classes);
11573
        }
11574
      });
11575
    };
11576
    var renderCardMenuItem = function (spec, itemResponse, sharedBackstage, extras) {
11577
      var getApi = function (component) {
11578
        return {
11579
          isDisabled: function () {
11580
            return Disabling.isDisabled(component);
11581
          },
11582
          setDisabled: function (state) {
11583
            Disabling.set(component, state);
637 daniel-mar 11584
            each$1(descendants(component.element, '*'), function (elm) {
597 daniel-mar 11585
              component.getSystem().getByDom(elm).each(function (comp) {
11586
                if (comp.hasConfigured(Disabling)) {
11587
                  Disabling.set(comp, state);
11588
                }
11589
              });
11590
            });
11591
          }
11592
        };
11593
      };
11594
      var structure = {
637 daniel-mar 11595
        dom: renderItemDomStructure(spec.label),
597 daniel-mar 11596
        optComponents: [Optional.some({
11597
            dom: {
11598
              tag: 'div',
11599
              classes: [
11600
                containerClass,
11601
                containerRowClass
11602
              ]
11603
            },
637 daniel-mar 11604
            components: render$2(spec.items, extras)
597 daniel-mar 11605
          })]
11606
      };
11607
      return renderCommonItem({
11608
        data: buildData(__assign({ text: Optional.none() }, spec)),
11609
        disabled: spec.disabled,
11610
        getApi: getApi,
11611
        onAction: spec.onAction,
11612
        onSetup: spec.onSetup,
11613
        triggersSubmenu: false,
11614
        itemBehaviours: Optional.from(extras.itemBehaviours).getOr([])
11615
      }, structure, itemResponse, sharedBackstage.providers);
11616
    };
11617
 
11618
    var renderChoiceItem = function (spec, useText, presets, onItemValueHandler, isSelected, itemResponse, providersBackstage, renderIcons) {
11619
      if (renderIcons === void 0) {
11620
        renderIcons = true;
11621
      }
11622
      var getApi = function (component) {
11623
        return {
11624
          setActive: function (state) {
11625
            Toggling.set(component, state);
11626
          },
11627
          isActive: function () {
11628
            return Toggling.isOn(component);
11629
          },
11630
          isDisabled: function () {
11631
            return Disabling.isDisabled(component);
11632
          },
11633
          setDisabled: function (state) {
11634
            return Disabling.set(component, state);
11635
          }
11636
        };
11637
      };
11638
      var structure = renderItemStructure({
11639
        presets: presets,
11640
        textContent: useText ? spec.text : Optional.none(),
11641
        htmlContent: Optional.none(),
11642
        ariaLabel: spec.text,
11643
        iconContent: spec.icon,
11644
        shortcutContent: useText ? spec.shortcut : Optional.none(),
11645
        checkMark: useText ? Optional.some(renderCheckmark(providersBackstage.icons)) : Optional.none(),
11646
        caret: Optional.none(),
11647
        value: spec.value
11648
      }, providersBackstage, renderIcons);
11649
      return deepMerge(renderCommonItem({
11650
        data: buildData(spec),
11651
        disabled: spec.disabled,
11652
        getApi: getApi,
11653
        onAction: function (_api) {
11654
          return onItemValueHandler(spec.value);
11655
        },
11656
        onSetup: function (api) {
11657
          api.setActive(isSelected);
11658
          return noop;
11659
        },
11660
        triggersSubmenu: false,
11661
        itemBehaviours: []
11662
      }, structure, itemResponse, providersBackstage), {
11663
        toggling: {
11664
          toggleClass: tickedClass,
11665
          toggleOnExecute: false,
11666
          selected: spec.active
11667
        }
11668
      });
11669
    };
11670
 
637 daniel-mar 11671
    var parts$f = generate$3(owner$2(), parts$h());
597 daniel-mar 11672
 
11673
    var hexColour = function (value) {
11674
      return { value: value };
11675
    };
11676
    var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
11677
    var longformRegex = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i;
11678
    var isHexString = function (hex) {
11679
      return shorthandRegex.test(hex) || longformRegex.test(hex);
11680
    };
637 daniel-mar 11681
    var normalizeHex = function (hex) {
11682
      return removeLeading(hex, '#').toUpperCase();
11683
    };
11684
    var fromString$1 = function (hex) {
11685
      return isHexString(hex) ? Optional.some({ value: normalizeHex(hex) }) : Optional.none();
11686
    };
597 daniel-mar 11687
    var getLongForm = function (hex) {
11688
      var hexString = hex.value.replace(shorthandRegex, function (m, r, g, b) {
11689
        return r + r + g + g + b + b;
11690
      });
11691
      return { value: hexString };
11692
    };
11693
    var extractValues = function (hex) {
11694
      var longForm = getLongForm(hex);
11695
      var splitForm = longformRegex.exec(longForm.value);
11696
      return splitForm === null ? [
11697
        'FFFFFF',
11698
        'FF',
11699
        'FF',
11700
        'FF'
11701
      ] : splitForm;
11702
    };
11703
    var toHex = function (component) {
11704
      var hex = component.toString(16);
11705
      return (hex.length === 1 ? '0' + hex : hex).toUpperCase();
11706
    };
11707
    var fromRgba = function (rgbaColour) {
11708
      var value = toHex(rgbaColour.red) + toHex(rgbaColour.green) + toHex(rgbaColour.blue);
11709
      return hexColour(value);
11710
    };
11711
 
11712
    var min = Math.min;
11713
    var max = Math.max;
637 daniel-mar 11714
    var round$1 = Math.round;
597 daniel-mar 11715
    var rgbRegex = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)/;
11716
    var rgbaRegex = /^rgba\((\d+),\s*(\d+),\s*(\d+),\s*(\d?(?:\.\d+)?)\)/;
11717
    var rgbaColour = function (red, green, blue, alpha) {
11718
      return {
11719
        red: red,
11720
        green: green,
11721
        blue: blue,
11722
        alpha: alpha
11723
      };
11724
    };
11725
    var isRgbaComponent = function (value) {
11726
      var num = parseInt(value, 10);
11727
      return num.toString() === value && num >= 0 && num <= 255;
11728
    };
11729
    var fromHsv = function (hsv) {
11730
      var r;
11731
      var g;
11732
      var b;
11733
      var hue = (hsv.hue || 0) % 360;
11734
      var saturation = hsv.saturation / 100;
11735
      var brightness = hsv.value / 100;
11736
      saturation = max(0, min(saturation, 1));
11737
      brightness = max(0, min(brightness, 1));
11738
      if (saturation === 0) {
637 daniel-mar 11739
        r = g = b = round$1(255 * brightness);
597 daniel-mar 11740
        return rgbaColour(r, g, b, 1);
11741
      }
11742
      var side = hue / 60;
11743
      var chroma = brightness * saturation;
11744
      var x = chroma * (1 - Math.abs(side % 2 - 1));
11745
      var match = brightness - chroma;
11746
      switch (Math.floor(side)) {
11747
      case 0:
11748
        r = chroma;
11749
        g = x;
11750
        b = 0;
11751
        break;
11752
      case 1:
11753
        r = x;
11754
        g = chroma;
11755
        b = 0;
11756
        break;
11757
      case 2:
11758
        r = 0;
11759
        g = chroma;
11760
        b = x;
11761
        break;
11762
      case 3:
11763
        r = 0;
11764
        g = x;
11765
        b = chroma;
11766
        break;
11767
      case 4:
11768
        r = x;
11769
        g = 0;
11770
        b = chroma;
11771
        break;
11772
      case 5:
11773
        r = chroma;
11774
        g = 0;
11775
        b = x;
11776
        break;
11777
      default:
11778
        r = g = b = 0;
11779
      }
637 daniel-mar 11780
      r = round$1(255 * (r + match));
11781
      g = round$1(255 * (g + match));
11782
      b = round$1(255 * (b + match));
597 daniel-mar 11783
      return rgbaColour(r, g, b, 1);
11784
    };
11785
    var fromHex = function (hexColour) {
11786
      var result = extractValues(hexColour);
11787
      var red = parseInt(result[1], 16);
11788
      var green = parseInt(result[2], 16);
11789
      var blue = parseInt(result[3], 16);
11790
      return rgbaColour(red, green, blue, 1);
11791
    };
11792
    var fromStringValues = function (red, green, blue, alpha) {
11793
      var r = parseInt(red, 10);
11794
      var g = parseInt(green, 10);
11795
      var b = parseInt(blue, 10);
11796
      var a = parseFloat(alpha);
11797
      return rgbaColour(r, g, b, a);
11798
    };
11799
    var fromString = function (rgbaString) {
11800
      if (rgbaString === 'transparent') {
11801
        return Optional.some(rgbaColour(0, 0, 0, 0));
11802
      }
11803
      var rgbMatch = rgbRegex.exec(rgbaString);
11804
      if (rgbMatch !== null) {
11805
        return Optional.some(fromStringValues(rgbMatch[1], rgbMatch[2], rgbMatch[3], '1'));
11806
      }
11807
      var rgbaMatch = rgbaRegex.exec(rgbaString);
11808
      if (rgbaMatch !== null) {
11809
        return Optional.some(fromStringValues(rgbaMatch[1], rgbaMatch[2], rgbaMatch[3], rgbaMatch[4]));
11810
      }
11811
      return Optional.none();
11812
    };
11813
    var toString = function (rgba) {
11814
      return 'rgba(' + rgba.red + ',' + rgba.green + ',' + rgba.blue + ',' + rgba.alpha + ')';
11815
    };
11816
    var red = rgbaColour(255, 0, 0, 1);
11817
 
637 daniel-mar 11818
    var fireSkinLoaded$1 = function (editor) {
597 daniel-mar 11819
      return editor.fire('SkinLoaded');
11820
    };
637 daniel-mar 11821
    var fireSkinLoadError$1 = function (editor, error) {
597 daniel-mar 11822
      return editor.fire('SkinLoadError', error);
11823
    };
11824
    var fireResizeEditor = function (editor) {
11825
      return editor.fire('ResizeEditor');
11826
    };
11827
    var fireResizeContent = function (editor, e) {
11828
      return editor.fire('ResizeContent', e);
11829
    };
11830
    var fireScrollContent = function (editor, e) {
11831
      return editor.fire('ScrollContent', e);
11832
    };
11833
    var fireTextColorChange = function (editor, data) {
11834
      return editor.fire('TextColorChange', data);
11835
    };
11836
 
637 daniel-mar 11837
    var hsvColour = function (hue, saturation, value) {
11838
      return {
11839
        hue: hue,
11840
        saturation: saturation,
11841
        value: value
11842
      };
11843
    };
11844
    var fromRgb = function (rgbaColour) {
11845
      var h = 0;
11846
      var s = 0;
11847
      var v = 0;
11848
      var r = rgbaColour.red / 255;
11849
      var g = rgbaColour.green / 255;
11850
      var b = rgbaColour.blue / 255;
11851
      var minRGB = Math.min(r, Math.min(g, b));
11852
      var maxRGB = Math.max(r, Math.max(g, b));
11853
      if (minRGB === maxRGB) {
11854
        v = minRGB;
11855
        return hsvColour(0, 0, v * 100);
11856
      }
11857
      var d = r === minRGB ? g - b : b === minRGB ? r - g : b - r;
11858
      h = r === minRGB ? 3 : b === minRGB ? 1 : 5;
11859
      h = 60 * (h - d / (maxRGB - minRGB));
11860
      s = (maxRGB - minRGB) / maxRGB;
11861
      v = maxRGB;
11862
      return hsvColour(Math.round(h), Math.round(s * 100), Math.round(v * 100));
11863
    };
11864
 
11865
    var hexToHsv = function (hex) {
11866
      return fromRgb(fromHex(hex));
11867
    };
11868
    var hsvToHex = function (hsv) {
11869
      return fromRgba(fromHsv(hsv));
11870
    };
11871
    var anyToHex = function (color) {
11872
      return fromString$1(color).orThunk(function () {
11873
        return fromString(color).map(fromRgba);
11874
      }).getOrThunk(function () {
11875
        var canvas = document.createElement('canvas');
11876
        canvas.height = 1;
11877
        canvas.width = 1;
11878
        var canvasContext = canvas.getContext('2d');
11879
        canvasContext.clearRect(0, 0, canvas.width, canvas.height);
11880
        canvasContext.fillStyle = '#FFFFFF';
11881
        canvasContext.fillStyle = color;
11882
        canvasContext.fillRect(0, 0, 1, 1);
11883
        var rgba = canvasContext.getImageData(0, 0, 1, 1).data;
11884
        var r = rgba[0];
11885
        var g = rgba[1];
11886
        var b = rgba[2];
11887
        var a = rgba[3];
11888
        return fromRgba(rgbaColour(r, g, b, a));
11889
      });
11890
    };
11891
 
679 daniel-mar 11892
    var global$8 = tinymce.util.Tools.resolve('tinymce.util.LocalStorage');
597 daniel-mar 11893
 
11894
    var storageName = 'tinymce-custom-colors';
11895
    function ColorCache (max) {
11896
      if (max === void 0) {
11897
        max = 10;
11898
      }
679 daniel-mar 11899
      var storageString = global$8.getItem(storageName);
597 daniel-mar 11900
      var localstorage = isString(storageString) ? JSON.parse(storageString) : [];
11901
      var prune = function (list) {
11902
        var diff = max - list.length;
11903
        return diff < 0 ? list.slice(0, max) : list;
11904
      };
11905
      var cache = prune(localstorage);
11906
      var add = function (key) {
11907
        indexOf(cache, key).each(remove);
11908
        cache.unshift(key);
11909
        if (cache.length > max) {
11910
          cache.pop();
11911
        }
679 daniel-mar 11912
        global$8.setItem(storageName, JSON.stringify(cache));
597 daniel-mar 11913
      };
11914
      var remove = function (idx) {
11915
        cache.splice(idx, 1);
11916
      };
11917
      var state = function () {
11918
        return cache.slice(0);
11919
      };
11920
      return {
11921
        add: add,
11922
        state: state
11923
      };
11924
    }
11925
 
11926
    var choiceItem = 'choiceitem';
11927
    var defaultColors = [
11928
      {
11929
        type: choiceItem,
11930
        text: 'Light Green',
11931
        value: '#BFEDD2'
11932
      },
11933
      {
11934
        type: choiceItem,
11935
        text: 'Light Yellow',
11936
        value: '#FBEEB8'
11937
      },
11938
      {
11939
        type: choiceItem,
11940
        text: 'Light Red',
11941
        value: '#F8CAC6'
11942
      },
11943
      {
11944
        type: choiceItem,
11945
        text: 'Light Purple',
11946
        value: '#ECCAFA'
11947
      },
11948
      {
11949
        type: choiceItem,
11950
        text: 'Light Blue',
11951
        value: '#C2E0F4'
11952
      },
11953
      {
11954
        type: choiceItem,
11955
        text: 'Green',
11956
        value: '#2DC26B'
11957
      },
11958
      {
11959
        type: choiceItem,
11960
        text: 'Yellow',
11961
        value: '#F1C40F'
11962
      },
11963
      {
11964
        type: choiceItem,
11965
        text: 'Red',
11966
        value: '#E03E2D'
11967
      },
11968
      {
11969
        type: choiceItem,
11970
        text: 'Purple',
11971
        value: '#B96AD9'
11972
      },
11973
      {
11974
        type: choiceItem,
11975
        text: 'Blue',
11976
        value: '#3598DB'
11977
      },
11978
      {
11979
        type: choiceItem,
11980
        text: 'Dark Turquoise',
11981
        value: '#169179'
11982
      },
11983
      {
11984
        type: choiceItem,
11985
        text: 'Orange',
11986
        value: '#E67E23'
11987
      },
11988
      {
11989
        type: choiceItem,
11990
        text: 'Dark Red',
11991
        value: '#BA372A'
11992
      },
11993
      {
11994
        type: choiceItem,
11995
        text: 'Dark Purple',
11996
        value: '#843FA1'
11997
      },
11998
      {
11999
        type: choiceItem,
12000
        text: 'Dark Blue',
12001
        value: '#236FA1'
12002
      },
12003
      {
12004
        type: choiceItem,
12005
        text: 'Light Gray',
12006
        value: '#ECF0F1'
12007
      },
12008
      {
12009
        type: choiceItem,
12010
        text: 'Medium Gray',
12011
        value: '#CED4D9'
12012
      },
12013
      {
12014
        type: choiceItem,
12015
        text: 'Gray',
12016
        value: '#95A5A6'
12017
      },
12018
      {
12019
        type: choiceItem,
12020
        text: 'Dark Gray',
12021
        value: '#7E8C8D'
12022
      },
12023
      {
12024
        type: choiceItem,
12025
        text: 'Navy Blue',
12026
        value: '#34495E'
12027
      },
12028
      {
12029
        type: choiceItem,
12030
        text: 'Black',
12031
        value: '#000000'
12032
      },
12033
      {
12034
        type: choiceItem,
12035
        text: 'White',
12036
        value: '#ffffff'
12037
      }
12038
    ];
12039
    var colorCache = ColorCache(10);
12040
    var mapColors = function (colorMap) {
12041
      var colors = [];
12042
      for (var i = 0; i < colorMap.length; i += 2) {
12043
        colors.push({
12044
          text: colorMap[i + 1],
637 daniel-mar 12045
          value: '#' + anyToHex(colorMap[i]).value,
597 daniel-mar 12046
          type: 'choiceitem'
12047
        });
12048
      }
12049
      return colors;
12050
    };
637 daniel-mar 12051
    var getColorCols$2 = function (editor, defaultCols) {
597 daniel-mar 12052
      return editor.getParam('color_cols', defaultCols, 'number');
12053
    };
637 daniel-mar 12054
    var hasCustomColors$1 = function (editor) {
597 daniel-mar 12055
      return editor.getParam('custom_colors') !== false;
12056
    };
12057
    var getColorMap = function (editor) {
12058
      return editor.getParam('color_map');
12059
    };
637 daniel-mar 12060
    var getColors$2 = function (editor) {
597 daniel-mar 12061
      var unmapped = getColorMap(editor);
12062
      return unmapped !== undefined ? mapColors(unmapped) : defaultColors;
12063
    };
12064
    var getCurrentColors = function () {
637 daniel-mar 12065
      return map$2(colorCache.state(), function (color) {
597 daniel-mar 12066
        return {
12067
          type: choiceItem,
12068
          text: color,
12069
          value: color
12070
        };
12071
      });
12072
    };
12073
    var addColor = function (color) {
12074
      colorCache.add(color);
12075
    };
12076
 
679 daniel-mar 12077
    var fallbackColor = '#000000';
597 daniel-mar 12078
    var getCurrentColor = function (editor, format) {
12079
      var color;
12080
      editor.dom.getParents(editor.selection.getStart(), function (elm) {
12081
        var value;
12082
        if (value = elm.style[format === 'forecolor' ? 'color' : 'background-color']) {
12083
          color = color ? color : value;
12084
        }
12085
      });
679 daniel-mar 12086
      return Optional.from(color);
597 daniel-mar 12087
    };
12088
    var applyFormat = function (editor, format, value) {
12089
      editor.undoManager.transact(function () {
12090
        editor.focus();
12091
        editor.formatter.apply(format, { value: value });
12092
        editor.nodeChanged();
12093
      });
12094
    };
12095
    var removeFormat = function (editor, format) {
12096
      editor.undoManager.transact(function () {
12097
        editor.focus();
12098
        editor.formatter.remove(format, { value: null }, null, true);
12099
        editor.nodeChanged();
12100
      });
12101
    };
12102
    var registerCommands = function (editor) {
12103
      editor.addCommand('mceApplyTextcolor', function (format, value) {
12104
        applyFormat(editor, format, value);
12105
      });
12106
      editor.addCommand('mceRemoveTextcolor', function (format) {
12107
        removeFormat(editor, format);
12108
      });
12109
    };
12110
    var calcCols = function (colors) {
12111
      return Math.max(5, Math.ceil(Math.sqrt(colors)));
12112
    };
12113
    var getColorCols$1 = function (editor) {
637 daniel-mar 12114
      var colors = getColors$2(editor);
597 daniel-mar 12115
      var defaultCols = calcCols(colors.length);
637 daniel-mar 12116
      return getColorCols$2(editor, defaultCols);
597 daniel-mar 12117
    };
12118
    var getAdditionalColors = function (hasCustom) {
12119
      var type = 'choiceitem';
12120
      var remove = {
12121
        type: type,
12122
        text: 'Remove color',
12123
        icon: 'color-swatch-remove-color',
12124
        value: 'remove'
12125
      };
12126
      var custom = {
12127
        type: type,
12128
        text: 'Custom color',
12129
        icon: 'color-picker',
12130
        value: 'custom'
12131
      };
12132
      return hasCustom ? [
12133
        remove,
12134
        custom
12135
      ] : [remove];
12136
    };
12137
    var applyColor = function (editor, format, value, onChoice) {
12138
      if (value === 'custom') {
12139
        var dialog = colorPickerDialog(editor);
12140
        dialog(function (colorOpt) {
12141
          colorOpt.each(function (color) {
12142
            addColor(color);
12143
            editor.execCommand('mceApplyTextcolor', format, color);
12144
            onChoice(color);
12145
          });
679 daniel-mar 12146
        }, fallbackColor);
597 daniel-mar 12147
      } else if (value === 'remove') {
12148
        onChoice('');
12149
        editor.execCommand('mceRemoveTextcolor', format);
12150
      } else {
12151
        onChoice(value);
12152
        editor.execCommand('mceApplyTextcolor', format, value);
12153
      }
12154
    };
12155
    var getColors$1 = function (colors, hasCustom) {
12156
      return colors.concat(getCurrentColors().concat(getAdditionalColors(hasCustom)));
12157
    };
637 daniel-mar 12158
    var getFetch$1 = function (colors, hasCustom) {
597 daniel-mar 12159
      return function (callback) {
12160
        callback(getColors$1(colors, hasCustom));
12161
      };
12162
    };
12163
    var setIconColor = function (splitButtonApi, name, newColor) {
12164
      var id = name === 'forecolor' ? 'tox-icon-text-color__color' : 'tox-icon-highlight-bg-color__color';
12165
      splitButtonApi.setIconFill(id, newColor);
12166
    };
12167
    var registerTextColorButton = function (editor, name, format, tooltip, lastColor) {
12168
      editor.ui.registry.addSplitButton(name, {
12169
        tooltip: tooltip,
12170
        presets: 'color',
12171
        icon: name === 'forecolor' ? 'text-color' : 'highlight-bg-color',
12172
        select: function (value) {
679 daniel-mar 12173
          var optCurrentRgb = getCurrentColor(editor, format);
597 daniel-mar 12174
          return optCurrentRgb.bind(function (currentRgb) {
12175
            return fromString(currentRgb).map(function (rgba) {
12176
              var currentHex = fromRgba(rgba).value;
12177
              return contains$1(value.toLowerCase(), currentHex);
12178
            });
12179
          }).getOr(false);
12180
        },
12181
        columns: getColorCols$1(editor),
637 daniel-mar 12182
        fetch: getFetch$1(getColors$2(editor), hasCustomColors$1(editor)),
597 daniel-mar 12183
        onAction: function (_splitButtonApi) {
679 daniel-mar 12184
          applyColor(editor, format, lastColor.get(), noop);
597 daniel-mar 12185
        },
12186
        onItemAction: function (_splitButtonApi, value) {
12187
          applyColor(editor, format, value, function (newColor) {
12188
            lastColor.set(newColor);
12189
            fireTextColorChange(editor, {
12190
              name: name,
12191
              color: newColor
12192
            });
12193
          });
12194
        },
12195
        onSetup: function (splitButtonApi) {
679 daniel-mar 12196
          setIconColor(splitButtonApi, name, lastColor.get());
597 daniel-mar 12197
          var handler = function (e) {
12198
            if (e.name === name) {
12199
              setIconColor(splitButtonApi, e.name, e.color);
12200
            }
12201
          };
12202
          editor.on('TextColorChange', handler);
12203
          return function () {
12204
            editor.off('TextColorChange', handler);
12205
          };
12206
        }
12207
      });
12208
    };
12209
    var registerTextColorMenuItem = function (editor, name, format, text) {
12210
      editor.ui.registry.addNestedMenuItem(name, {
12211
        text: text,
12212
        icon: name === 'forecolor' ? 'text-color' : 'highlight-bg-color',
12213
        getSubmenuItems: function () {
12214
          return [{
12215
              type: 'fancymenuitem',
12216
              fancytype: 'colorswatch',
12217
              onAction: function (data) {
12218
                applyColor(editor, format, data.value, noop);
12219
              }
12220
            }];
12221
        }
12222
      });
12223
    };
12224
    var colorPickerDialog = function (editor) {
12225
      return function (callback, value) {
12226
        var isValid = false;
12227
        var onSubmit = function (api) {
12228
          var data = api.getData();
12229
          var hex = data.colorpicker;
12230
          if (isValid) {
12231
            callback(Optional.from(hex));
12232
            api.close();
12233
          } else {
12234
            editor.windowManager.alert(editor.translate([
12235
              'Invalid hex color code: {0}',
12236
              hex
12237
            ]));
12238
          }
12239
        };
12240
        var onAction = function (_api, details) {
12241
          if (details.name === 'hex-valid') {
12242
            isValid = details.value;
12243
          }
12244
        };
12245
        var initialData = { colorpicker: value };
12246
        editor.windowManager.open({
12247
          title: 'Color Picker',
12248
          size: 'normal',
12249
          body: {
12250
            type: 'panel',
12251
            items: [{
12252
                type: 'colorpicker',
12253
                name: 'colorpicker',
12254
                label: 'Color'
12255
              }]
12256
          },
12257
          buttons: [
12258
            {
12259
              type: 'cancel',
12260
              name: 'cancel',
12261
              text: 'Cancel'
12262
            },
12263
            {
12264
              type: 'submit',
12265
              name: 'save',
12266
              text: 'Save',
12267
              primary: true
12268
            }
12269
          ],
12270
          initialData: initialData,
12271
          onAction: onAction,
12272
          onSubmit: onSubmit,
12273
          onClose: noop,
12274
          onCancel: function () {
12275
            callback(Optional.none());
12276
          }
12277
        });
12278
      };
12279
    };
637 daniel-mar 12280
    var register$a = function (editor) {
597 daniel-mar 12281
      registerCommands(editor);
679 daniel-mar 12282
      var lastForeColor = Cell(fallbackColor);
12283
      var lastBackColor = Cell(fallbackColor);
597 daniel-mar 12284
      registerTextColorButton(editor, 'forecolor', 'forecolor', 'Text color', lastForeColor);
12285
      registerTextColorButton(editor, 'backcolor', 'hilitecolor', 'Background color', lastBackColor);
12286
      registerTextColorMenuItem(editor, 'forecolor', 'forecolor', 'Text color');
12287
      registerTextColorMenuItem(editor, 'backcolor', 'hilitecolor', 'Background color');
12288
    };
12289
 
12290
    var createPartialChoiceMenu = function (value, items, onItemValueHandler, columns, presets, itemResponse, select, providersBackstage) {
12291
      var hasIcons = menuHasIcons(items);
12292
      var presetItemTypes = presets !== 'color' ? 'normal' : 'color';
12293
      var alloyItems = createChoiceItems(items, onItemValueHandler, columns, presetItemTypes, itemResponse, select, providersBackstage);
12294
      return createPartialMenuWithAlloyItems(value, hasIcons, alloyItems, columns, presets);
12295
    };
12296
    var createChoiceItems = function (items, onItemValueHandler, columns, itemPresets, itemResponse, select, providersBackstage) {
637 daniel-mar 12297
      return cat(map$2(items, function (item) {
597 daniel-mar 12298
        if (item.type === 'choiceitem') {
12299
          return createChoiceMenuItem(item).fold(handleError, function (d) {
12300
            return Optional.some(renderChoiceItem(d, columns === 1, itemPresets, onItemValueHandler, select(item.value), itemResponse, providersBackstage, menuHasIcons(items)));
12301
          });
12302
        } else {
12303
          return Optional.none();
12304
        }
12305
      }));
12306
    };
12307
 
12308
    var deriveMenuMovement = function (columns, presets) {
637 daniel-mar 12309
      var menuMarkers = markers(presets);
597 daniel-mar 12310
      if (columns === 1) {
12311
        return {
12312
          mode: 'menu',
12313
          moveOnTab: true
12314
        };
12315
      } else if (columns === 'auto') {
12316
        return {
12317
          mode: 'grid',
12318
          selector: '.' + menuMarkers.item,
12319
          initSize: {
12320
            numColumns: 1,
12321
            numRows: 1
12322
          }
12323
        };
12324
      } else {
12325
        var rowClass = presets === 'color' ? 'tox-swatches__row' : 'tox-collection__group';
12326
        return {
12327
          mode: 'matrix',
12328
          rowSelector: '.' + rowClass
12329
        };
12330
      }
12331
    };
12332
    var deriveCollectionMovement = function (columns, presets) {
12333
      if (columns === 1) {
12334
        return {
12335
          mode: 'menu',
12336
          moveOnTab: false,
12337
          selector: '.tox-collection__item'
12338
        };
12339
      } else if (columns === 'auto') {
12340
        return {
12341
          mode: 'flatgrid',
12342
          selector: '.' + 'tox-collection__item',
12343
          initSize: {
12344
            numColumns: 1,
12345
            numRows: 1
12346
          }
12347
        };
12348
      } else {
12349
        return {
12350
          mode: 'matrix',
12351
          selectors: {
12352
            row: presets === 'color' ? '.tox-swatches__row' : '.tox-collection__group',
12353
            cell: presets === 'color' ? '.' + colorClass : '.' + selectableClass
12354
          }
12355
        };
12356
      }
12357
    };
12358
 
12359
    var renderColorSwatchItem = function (spec, backstage) {
637 daniel-mar 12360
      var items = getColorItems(spec, backstage);
597 daniel-mar 12361
      var columns = backstage.colorinput.getColorCols();
12362
      var presets = 'color';
637 daniel-mar 12363
      var menuSpec = createPartialChoiceMenu(generate$6('menu-value'), items, function (value) {
597 daniel-mar 12364
        spec.onAction({ value: value });
12365
      }, columns, presets, ItemResponse$1.CLOSE_ON_EXECUTE, never, backstage.shared.providers);
12366
      var widgetSpec = __assign(__assign({}, menuSpec), {
637 daniel-mar 12367
        markers: markers(presets),
597 daniel-mar 12368
        movement: deriveMenuMovement(columns, presets)
12369
      });
12370
      return {
12371
        type: 'widget',
637 daniel-mar 12372
        data: { value: generate$6('widget-id') },
597 daniel-mar 12373
        dom: {
12374
          tag: 'div',
12375
          classes: ['tox-fancymenuitem']
12376
        },
12377
        autofocus: true,
637 daniel-mar 12378
        components: [parts$f.widget(Menu.sketch(widgetSpec))]
597 daniel-mar 12379
      };
12380
    };
637 daniel-mar 12381
    var getColorItems = function (spec, backstage) {
12382
      var useCustomColors = spec.initData.allowCustomColors && backstage.colorinput.hasCustomColors();
12383
      return spec.initData.colors.fold(function () {
12384
        return getColors$1(backstage.colorinput.getColors(), useCustomColors);
12385
      }, function (colors) {
12386
        return colors.concat(getAdditionalColors(useCustomColors));
12387
      });
12388
    };
597 daniel-mar 12389
 
637 daniel-mar 12390
    var cellOverEvent = generate$6('cell-over');
12391
    var cellExecuteEvent = generate$6('cell-execute');
597 daniel-mar 12392
    var makeCell = function (row, col, labelId) {
12393
      var _a;
12394
      var emitCellOver = function (c) {
12395
        return emitWith(c, cellOverEvent, {
12396
          row: row,
12397
          col: col
12398
        });
12399
      };
12400
      var emitExecute = function (c) {
12401
        return emitWith(c, cellExecuteEvent, {
12402
          row: row,
12403
          col: col
12404
        });
12405
      };
12406
      var onClick = function (c, se) {
12407
        se.stop();
12408
        emitExecute(c);
12409
      };
12410
      return build$1({
12411
        dom: {
12412
          tag: 'div',
12413
          attributes: (_a = { role: 'button' }, _a['aria-labelledby'] = labelId, _a)
12414
        },
12415
        behaviours: derive$1([
12416
          config('insert-table-picker-cell', [
637 daniel-mar 12417
            run$1(mouseover(), Focusing.focus),
12418
            run$1(execute$5(), emitExecute),
12419
            run$1(click(), onClick),
12420
            run$1(tap(), onClick)
597 daniel-mar 12421
          ]),
12422
          Toggling.config({
12423
            toggleClass: 'tox-insert-table-picker__selected',
12424
            toggleOnExecute: false
12425
          }),
12426
          Focusing.config({ onFocus: emitCellOver })
12427
        ])
12428
      });
12429
    };
12430
    var makeCells = function (labelId, numRows, numCols) {
12431
      var cells = [];
12432
      for (var i = 0; i < numRows; i++) {
12433
        var row = [];
12434
        for (var j = 0; j < numCols; j++) {
12435
          row.push(makeCell(i, j, labelId));
12436
        }
12437
        cells.push(row);
12438
      }
12439
      return cells;
12440
    };
12441
    var selectCells = function (cells, selectedRow, selectedColumn, numRows, numColumns) {
12442
      for (var i = 0; i < numRows; i++) {
12443
        for (var j = 0; j < numColumns; j++) {
12444
          Toggling.set(cells[i][j], i <= selectedRow && j <= selectedColumn);
12445
        }
12446
      }
12447
    };
12448
    var makeComponents = function (cells) {
637 daniel-mar 12449
      return bind$3(cells, function (cellRow) {
12450
        return map$2(cellRow, premade);
597 daniel-mar 12451
      });
12452
    };
12453
    var makeLabelText = function (row, col) {
679 daniel-mar 12454
      return text(col + 'x' + row);
597 daniel-mar 12455
    };
12456
    var renderInsertTableMenuItem = function (spec) {
12457
      var numRows = 10;
12458
      var numColumns = 10;
637 daniel-mar 12459
      var sizeLabelId = generate$6('size-label');
597 daniel-mar 12460
      var cells = makeCells(sizeLabelId, numRows, numColumns);
679 daniel-mar 12461
      var emptyLabelText = makeLabelText(0, 0);
597 daniel-mar 12462
      var memLabel = record({
12463
        dom: {
12464
          tag: 'span',
12465
          classes: ['tox-insert-table-picker__label'],
12466
          attributes: { id: sizeLabelId }
12467
        },
679 daniel-mar 12468
        components: [emptyLabelText],
597 daniel-mar 12469
        behaviours: derive$1([Replacing.config({})])
12470
      });
12471
      return {
12472
        type: 'widget',
637 daniel-mar 12473
        data: { value: generate$6('widget-id') },
597 daniel-mar 12474
        dom: {
12475
          tag: 'div',
12476
          classes: ['tox-fancymenuitem']
12477
        },
12478
        autofocus: true,
637 daniel-mar 12479
        components: [parts$f.widget({
597 daniel-mar 12480
            dom: {
12481
              tag: 'div',
12482
              classes: ['tox-insert-table-picker']
12483
            },
12484
            components: makeComponents(cells).concat(memLabel.asSpec()),
12485
            behaviours: derive$1([
12486
              config('insert-table-picker', [
679 daniel-mar 12487
                runOnAttached(function (c) {
12488
                  Replacing.set(memLabel.get(c), [emptyLabelText]);
12489
                }),
597 daniel-mar 12490
                runWithTarget(cellOverEvent, function (c, t, e) {
679 daniel-mar 12491
                  var _a = e.event, row = _a.row, col = _a.col;
597 daniel-mar 12492
                  selectCells(cells, row, col, numRows, numColumns);
679 daniel-mar 12493
                  Replacing.set(memLabel.get(c), [makeLabelText(row + 1, col + 1)]);
597 daniel-mar 12494
                }),
12495
                runWithTarget(cellExecuteEvent, function (c, _, e) {
679 daniel-mar 12496
                  var _a = e.event, row = _a.row, col = _a.col;
597 daniel-mar 12497
                  spec.onAction({
679 daniel-mar 12498
                    numRows: row + 1,
12499
                    numColumns: col + 1
597 daniel-mar 12500
                  });
12501
                  emit(c, sandboxClose());
12502
                })
12503
              ]),
12504
              Keying.config({
12505
                initSize: {
12506
                  numRows: numRows,
12507
                  numColumns: numColumns
12508
                },
12509
                mode: 'flatgrid',
12510
                selector: '[role="button"]'
12511
              })
12512
            ])
12513
          })]
12514
      };
12515
    };
12516
 
12517
    var fancyMenuItems = {
12518
      inserttable: renderInsertTableMenuItem,
12519
      colorswatch: renderColorSwatchItem
12520
    };
12521
    var renderFancyMenuItem = function (spec, backstage) {
637 daniel-mar 12522
      return get$e(fancyMenuItems, spec.fancytype).map(function (render) {
597 daniel-mar 12523
        return render(spec, backstage);
12524
      });
12525
    };
12526
 
12527
    var renderNestedItem = function (spec, itemResponse, providersBackstage, renderIcons, downwardsCaret) {
12528
      if (renderIcons === void 0) {
12529
        renderIcons = true;
12530
      }
12531
      if (downwardsCaret === void 0) {
12532
        downwardsCaret = false;
12533
      }
12534
      var caret = downwardsCaret ? renderDownwardsCaret(providersBackstage.icons) : renderSubmenuCaret(providersBackstage.icons);
12535
      var getApi = function (component) {
12536
        return {
12537
          isDisabled: function () {
12538
            return Disabling.isDisabled(component);
12539
          },
12540
          setDisabled: function (state) {
12541
            return Disabling.set(component, state);
12542
          }
12543
        };
12544
      };
12545
      var structure = renderItemStructure({
12546
        presets: 'normal',
12547
        iconContent: spec.icon,
12548
        textContent: spec.text,
12549
        htmlContent: Optional.none(),
12550
        ariaLabel: spec.text,
12551
        caret: Optional.some(caret),
12552
        checkMark: Optional.none(),
12553
        shortcutContent: spec.shortcut
12554
      }, providersBackstage, renderIcons);
12555
      return renderCommonItem({
12556
        data: buildData(spec),
12557
        getApi: getApi,
12558
        disabled: spec.disabled,
12559
        onAction: noop,
12560
        onSetup: spec.onSetup,
12561
        triggersSubmenu: true,
12562
        itemBehaviours: []
12563
      }, structure, itemResponse, providersBackstage);
12564
    };
12565
 
12566
    var renderNormalItem = function (spec, itemResponse, providersBackstage, renderIcons) {
12567
      if (renderIcons === void 0) {
12568
        renderIcons = true;
12569
      }
12570
      var getApi = function (component) {
12571
        return {
12572
          isDisabled: function () {
12573
            return Disabling.isDisabled(component);
12574
          },
12575
          setDisabled: function (state) {
12576
            return Disabling.set(component, state);
12577
          }
12578
        };
12579
      };
12580
      var structure = renderItemStructure({
12581
        presets: 'normal',
12582
        iconContent: spec.icon,
12583
        textContent: spec.text,
12584
        htmlContent: Optional.none(),
12585
        ariaLabel: spec.text,
12586
        caret: Optional.none(),
12587
        checkMark: Optional.none(),
12588
        shortcutContent: spec.shortcut
12589
      }, providersBackstage, renderIcons);
12590
      return renderCommonItem({
12591
        data: buildData(spec),
12592
        getApi: getApi,
12593
        disabled: spec.disabled,
12594
        onAction: spec.onAction,
12595
        onSetup: spec.onSetup,
12596
        triggersSubmenu: false,
12597
        itemBehaviours: []
12598
      }, structure, itemResponse, providersBackstage);
12599
    };
12600
 
12601
    var renderSeparatorItem = function (spec) {
12602
      var innerHtml = spec.text.fold(function () {
12603
        return {};
12604
      }, function (text) {
12605
        return { innerHtml: text };
12606
      });
12607
      return {
12608
        type: 'separator',
12609
        dom: __assign({
12610
          tag: 'div',
12611
          classes: [
12612
            selectableClass,
12613
            groupHeadingClass
12614
          ]
12615
        }, innerHtml),
12616
        components: []
12617
      };
12618
    };
12619
 
12620
    var renderToggleMenuItem = function (spec, itemResponse, providersBackstage, renderIcons) {
12621
      if (renderIcons === void 0) {
12622
        renderIcons = true;
12623
      }
12624
      var getApi = function (component) {
12625
        return {
12626
          setActive: function (state) {
12627
            Toggling.set(component, state);
12628
          },
12629
          isActive: function () {
12630
            return Toggling.isOn(component);
12631
          },
12632
          isDisabled: function () {
12633
            return Disabling.isDisabled(component);
12634
          },
12635
          setDisabled: function (state) {
12636
            return Disabling.set(component, state);
12637
          }
12638
        };
12639
      };
12640
      var structure = renderItemStructure({
12641
        iconContent: spec.icon,
12642
        textContent: spec.text,
12643
        htmlContent: Optional.none(),
12644
        ariaLabel: spec.text,
12645
        checkMark: Optional.some(renderCheckmark(providersBackstage.icons)),
12646
        caret: Optional.none(),
12647
        shortcutContent: spec.shortcut,
12648
        presets: 'normal',
12649
        meta: spec.meta
12650
      }, providersBackstage, renderIcons);
12651
      return deepMerge(renderCommonItem({
12652
        data: buildData(spec),
12653
        disabled: spec.disabled,
12654
        getApi: getApi,
12655
        onAction: spec.onAction,
12656
        onSetup: spec.onSetup,
12657
        triggersSubmenu: false,
12658
        itemBehaviours: []
12659
      }, structure, itemResponse, providersBackstage), {
12660
        toggling: {
12661
          toggleClass: tickedClass,
12662
          toggleOnExecute: false,
12663
          selected: spec.active
12664
        }
12665
      });
12666
    };
12667
 
12668
    var autocomplete = renderAutocompleteItem;
637 daniel-mar 12669
    var separator$3 = renderSeparatorItem;
597 daniel-mar 12670
    var normal = renderNormalItem;
12671
    var nested = renderNestedItem;
12672
    var toggle$1 = renderToggleMenuItem;
12673
    var fancy = renderFancyMenuItem;
12674
    var card = renderCardMenuItem;
12675
 
12676
    var FocusMode;
12677
    (function (FocusMode) {
12678
      FocusMode[FocusMode['ContentFocus'] = 0] = 'ContentFocus';
12679
      FocusMode[FocusMode['UiFocus'] = 1] = 'UiFocus';
12680
    }(FocusMode || (FocusMode = {})));
12681
    var createMenuItemFromBridge = function (item, itemResponse, backstage, menuHasIcons, isHorizontalMenu) {
12682
      var providersBackstage = backstage.shared.providers;
12683
      var parseForHorizontalMenu = function (menuitem) {
12684
        return !isHorizontalMenu ? menuitem : __assign(__assign({}, menuitem), {
12685
          shortcut: Optional.none(),
12686
          icon: menuitem.text.isSome() ? Optional.none() : menuitem.icon
12687
        });
12688
      };
12689
      switch (item.type) {
12690
      case 'menuitem':
12691
        return createMenuItem(item).fold(handleError, function (d) {
12692
          return Optional.some(normal(parseForHorizontalMenu(d), itemResponse, providersBackstage, menuHasIcons));
12693
        });
12694
      case 'nestedmenuitem':
12695
        return createNestedMenuItem(item).fold(handleError, function (d) {
12696
          return Optional.some(nested(parseForHorizontalMenu(d), itemResponse, providersBackstage, menuHasIcons, isHorizontalMenu));
12697
        });
12698
      case 'togglemenuitem':
12699
        return createToggleMenuItem(item).fold(handleError, function (d) {
12700
          return Optional.some(toggle$1(parseForHorizontalMenu(d), itemResponse, providersBackstage, menuHasIcons));
12701
        });
12702
      case 'separator':
12703
        return createSeparatorMenuItem(item).fold(handleError, function (d) {
637 daniel-mar 12704
          return Optional.some(separator$3(d));
597 daniel-mar 12705
        });
12706
      case 'fancymenuitem':
12707
        return createFancyMenuItem(item).fold(handleError, function (d) {
12708
          return fancy(parseForHorizontalMenu(d), backstage);
12709
        });
12710
      default: {
12711
          console.error('Unknown item in general menu', item);
12712
          return Optional.none();
12713
        }
12714
      }
12715
    };
12716
    var createAutocompleteItems = function (items, matchText, onItemValueHandler, columns, itemResponse, sharedBackstage, highlightOn) {
12717
      var renderText = columns === 1;
12718
      var renderIcons = !renderText || menuHasIcons(items);
637 daniel-mar 12719
      return cat(map$2(items, function (item) {
597 daniel-mar 12720
        switch (item.type) {
12721
        case 'separator':
12722
          return createSeparatorItem(item).fold(handleError, function (d) {
637 daniel-mar 12723
            return Optional.some(separator$3(d));
597 daniel-mar 12724
          });
12725
        case 'cardmenuitem':
12726
          return createCardMenuItem(item).fold(handleError, function (d) {
12727
            return Optional.some(card(__assign(__assign({}, d), {
12728
              onAction: function (api) {
12729
                d.onAction(api);
12730
                onItemValueHandler(d.value, d.meta);
12731
              }
12732
            }), itemResponse, sharedBackstage, {
12733
              itemBehaviours: tooltipBehaviour(d.meta, sharedBackstage),
12734
              cardText: {
12735
                matchText: matchText,
12736
                highlightOn: highlightOn
12737
              }
12738
            }));
12739
          });
12740
        case 'autocompleteitem':
12741
        default:
12742
          return createAutocompleterItem(item).fold(handleError, function (d) {
12743
            return Optional.some(autocomplete(d, matchText, renderText, 'normal', onItemValueHandler, itemResponse, sharedBackstage, renderIcons));
12744
          });
12745
        }
12746
      }));
12747
    };
12748
    var createPartialMenu = function (value, items, itemResponse, backstage, isHorizontalMenu) {
12749
      var hasIcons = menuHasIcons(items);
637 daniel-mar 12750
      var alloyItems = cat(map$2(items, function (item) {
597 daniel-mar 12751
        var itemHasIcon = function (i) {
637 daniel-mar 12752
          return isHorizontalMenu ? !has$2(i, 'text') : hasIcons;
597 daniel-mar 12753
        };
12754
        var createItem = function (i) {
12755
          return createMenuItemFromBridge(i, itemResponse, backstage, itemHasIcon(i), isHorizontalMenu);
12756
        };
12757
        if (item.type === 'nestedmenuitem' && item.getSubmenuItems().length <= 0) {
12758
          return createItem(__assign(__assign({}, item), { disabled: true }));
12759
        } else {
12760
          return createItem(item);
12761
        }
12762
      }));
12763
      var createPartial = isHorizontalMenu ? createHorizontalPartialMenuWithAlloyItems : createPartialMenuWithAlloyItems;
12764
      return createPartial(value, hasIcons, alloyItems, 1, 'normal');
12765
    };
12766
    var createTieredDataFrom = function (partialMenu) {
12767
      return tieredMenu.singleData(partialMenu.value, partialMenu);
12768
    };
12769
    var createMenuFrom = function (partialMenu, columns, focusMode, presets) {
637 daniel-mar 12770
      var focusManager = focusMode === FocusMode.ContentFocus ? highlights() : dom$2();
597 daniel-mar 12771
      var movement = deriveMenuMovement(columns, presets);
637 daniel-mar 12772
      var menuMarkers = markers(presets);
597 daniel-mar 12773
      return {
12774
        dom: partialMenu.dom,
12775
        components: partialMenu.components,
12776
        items: partialMenu.items,
12777
        value: partialMenu.value,
12778
        markers: {
12779
          selectedItem: menuMarkers.selectedItem,
12780
          item: menuMarkers.item
12781
        },
12782
        movement: movement,
12783
        fakeFocus: focusMode === FocusMode.ContentFocus,
12784
        focusManager: focusManager,
12785
        menuBehaviours: SimpleBehaviours.unnamedEvents(columns !== 'auto' ? [] : [runOnAttached(function (comp, _se) {
12786
            detectSize(comp, 4, menuMarkers.item).each(function (_a) {
12787
              var numColumns = _a.numColumns, numRows = _a.numRows;
12788
              Keying.setGridSize(comp, numRows, numColumns);
12789
            });
12790
          })])
12791
      };
12792
    };
12793
 
637 daniel-mar 12794
    var register$9 = function (editor, sharedBackstage) {
12795
      var activeAutocompleter = value$1();
597 daniel-mar 12796
      var processingAction = Cell(false);
12797
      var autocompleter = build$1(InlineView.sketch({
12798
        dom: {
12799
          tag: 'div',
12800
          classes: ['tox-autocompleter']
12801
        },
12802
        components: [],
12803
        fireDismissalEventInstead: {},
637 daniel-mar 12804
        inlineBehaviours: derive$1([config('dismissAutocompleter', [run$1(dismissRequested(), function () {
597 daniel-mar 12805
              return cancelIfNecessary();
12806
            })])]),
12807
        lazySink: sharedBackstage.getSink
12808
      }));
12809
      var isMenuOpen = function () {
12810
        return InlineView.isOpen(autocompleter);
12811
      };
12812
      var isActive = function () {
12813
        return activeAutocompleter.get().isSome();
12814
      };
12815
      var hideIfNecessary = function () {
12816
        if (isActive()) {
12817
          InlineView.hide(autocompleter);
12818
        }
12819
      };
12820
      var cancelIfNecessary = function () {
12821
        if (isActive()) {
12822
          var lastElement = activeAutocompleter.get().map(function (ac) {
12823
            return ac.element;
12824
          });
637 daniel-mar 12825
          detect(lastElement.getOr(SugarElement.fromDom(editor.selection.getNode()))).each(unwrap);
597 daniel-mar 12826
          hideIfNecessary();
637 daniel-mar 12827
          activeAutocompleter.clear();
597 daniel-mar 12828
          processingAction.set(false);
12829
        }
12830
      };
12831
      var getAutocompleters = cached(function () {
637 daniel-mar 12832
        return register$b(editor);
597 daniel-mar 12833
      });
12834
      var getCombinedItems = function (triggerChar, matches) {
12835
        var columns = findMap(matches, function (m) {
12836
          return Optional.from(m.columns);
12837
        }).getOr(1);
637 daniel-mar 12838
        return bind$3(matches, function (match) {
597 daniel-mar 12839
          var choices = match.items;
12840
          return createAutocompleteItems(choices, match.matchText, function (itemValue, itemMeta) {
12841
            var nr = editor.selection.getRng();
12842
            getContext(editor.dom, nr, triggerChar).fold(function () {
12843
              return console.error('Lost context. Cursor probably moved');
12844
            }, function (_a) {
12845
              var range = _a.range;
12846
              var autocompleterApi = {
12847
                hide: function () {
12848
                  cancelIfNecessary();
12849
                },
12850
                reload: function (fetchOptions) {
12851
                  hideIfNecessary();
12852
                  load(fetchOptions);
12853
                }
12854
              };
12855
              processingAction.set(true);
12856
              match.onAction(autocompleterApi, range, itemValue, itemMeta);
12857
              processingAction.set(false);
12858
            });
12859
          }, columns, ItemResponse$1.BUBBLE_TO_SANDBOX, sharedBackstage, match.highlightOn);
12860
        });
12861
      };
12862
      var commenceIfNecessary = function (context) {
12863
        if (!isActive()) {
12864
          var wrapper = create$4(editor, context.range);
637 daniel-mar 12865
          activeAutocompleter.set({
597 daniel-mar 12866
            triggerChar: context.triggerChar,
12867
            element: wrapper,
12868
            matchLength: context.text.length
637 daniel-mar 12869
          });
597 daniel-mar 12870
          processingAction.set(false);
12871
        }
12872
      };
12873
      var display = function (ac, context, lookupData, items) {
12874
        ac.matchLength = context.text.length;
12875
        var columns = findMap(lookupData, function (ld) {
12876
          return Optional.from(ld.columns);
12877
        }).getOr(1);
637 daniel-mar 12878
        InlineView.showAt(autocompleter, Menu.sketch(createMenuFrom(createPartialMenuWithAlloyItems('autocompleter-value', true, items, columns, 'normal'), columns, FocusMode.ContentFocus, 'normal')), {
12879
          anchor: {
12880
            type: 'node',
12881
            root: SugarElement.fromDom(editor.getBody()),
12882
            node: Optional.from(ac.element)
12883
          }
12884
        });
597 daniel-mar 12885
        InlineView.getContent(autocompleter).each(Highlighting.highlightFirst);
12886
      };
12887
      var doLookup = function (fetchOptions) {
12888
        return activeAutocompleter.get().map(function (ac) {
12889
          return getContext(editor.dom, editor.selection.getRng(), ac.triggerChar).bind(function (newContext) {
12890
            return lookupWithContext(editor, getAutocompleters, newContext, fetchOptions);
12891
          });
12892
        }).getOrThunk(function () {
637 daniel-mar 12893
          return lookup$2(editor, getAutocompleters);
597 daniel-mar 12894
        });
12895
      };
12896
      var load = function (fetchOptions) {
12897
        doLookup(fetchOptions).fold(cancelIfNecessary, function (lookupInfo) {
12898
          commenceIfNecessary(lookupInfo.context);
12899
          lookupInfo.lookupData.then(function (lookupData) {
12900
            activeAutocompleter.get().map(function (ac) {
12901
              var context = lookupInfo.context;
12902
              if (ac.triggerChar === context.triggerChar) {
12903
                var combinedItems = getCombinedItems(context.triggerChar, lookupData);
12904
                if (combinedItems.length > 0) {
12905
                  display(ac, context, lookupData, combinedItems);
12906
                } else if (context.text.length - ac.matchLength >= 10) {
12907
                  cancelIfNecessary();
12908
                } else {
12909
                  hideIfNecessary();
12910
                }
12911
              }
12912
            });
12913
          });
12914
        });
12915
      };
637 daniel-mar 12916
      var onKeypress = last(function (e) {
597 daniel-mar 12917
        if (e.which === 27) {
12918
          return;
12919
        }
12920
        load();
12921
      }, 50);
12922
      var autocompleterUiApi = {
12923
        onKeypress: onKeypress,
12924
        cancelIfNecessary: cancelIfNecessary,
12925
        isMenuOpen: isMenuOpen,
12926
        isActive: isActive,
12927
        isProcessingAction: processingAction.get,
12928
        getView: function () {
12929
          return InlineView.getContent(autocompleter);
12930
        }
12931
      };
12932
      if (editor.hasPlugin('rtc') === false) {
12933
        AutocompleterEditorEvents.setup(autocompleterUiApi, editor);
12934
      }
12935
    };
637 daniel-mar 12936
    var Autocompleter = { register: register$9 };
597 daniel-mar 12937
 
637 daniel-mar 12938
    var closest = function (scope, selector, isRoot) {
12939
      return closest$1(scope, selector, isRoot).isSome();
597 daniel-mar 12940
    };
12941
 
12942
    var DelayedFunction = function (fun, delay) {
12943
      var ref = null;
12944
      var schedule = function () {
12945
        var args = [];
12946
        for (var _i = 0; _i < arguments.length; _i++) {
12947
          args[_i] = arguments[_i];
12948
        }
12949
        ref = setTimeout(function () {
12950
          fun.apply(null, args);
12951
          ref = null;
12952
        }, delay);
12953
      };
12954
      var cancel = function () {
12955
        if (ref !== null) {
12956
          clearTimeout(ref);
12957
          ref = null;
12958
        }
12959
      };
12960
      return {
12961
        cancel: cancel,
12962
        schedule: schedule
12963
      };
12964
    };
12965
 
12966
    var SIGNIFICANT_MOVE = 5;
12967
    var LONGPRESS_DELAY = 400;
12968
    var getTouch = function (event) {
12969
      var raw = event.raw;
12970
      if (raw.touches === undefined || raw.touches.length !== 1) {
12971
        return Optional.none();
12972
      }
12973
      return Optional.some(raw.touches[0]);
12974
    };
12975
    var isFarEnough = function (touch, data) {
12976
      var distX = Math.abs(touch.clientX - data.x);
12977
      var distY = Math.abs(touch.clientY - data.y);
12978
      return distX > SIGNIFICANT_MOVE || distY > SIGNIFICANT_MOVE;
12979
    };
12980
    var monitor = function (settings) {
637 daniel-mar 12981
      var startData = value$1();
597 daniel-mar 12982
      var longpressFired = Cell(false);
12983
      var longpress$1 = DelayedFunction(function (event) {
12984
        settings.triggerEvent(longpress(), event);
12985
        longpressFired.set(true);
12986
      }, LONGPRESS_DELAY);
12987
      var handleTouchstart = function (event) {
12988
        getTouch(event).each(function (touch) {
12989
          longpress$1.cancel();
12990
          var data = {
12991
            x: touch.clientX,
12992
            y: touch.clientY,
12993
            target: event.target
12994
          };
12995
          longpress$1.schedule(event);
12996
          longpressFired.set(false);
637 daniel-mar 12997
          startData.set(data);
597 daniel-mar 12998
        });
12999
        return Optional.none();
13000
      };
13001
      var handleTouchmove = function (event) {
13002
        longpress$1.cancel();
13003
        getTouch(event).each(function (touch) {
637 daniel-mar 13004
          startData.on(function (data) {
597 daniel-mar 13005
            if (isFarEnough(touch, data)) {
637 daniel-mar 13006
              startData.clear();
597 daniel-mar 13007
            }
13008
          });
13009
        });
13010
        return Optional.none();
13011
      };
13012
      var handleTouchend = function (event) {
13013
        longpress$1.cancel();
13014
        var isSame = function (data) {
637 daniel-mar 13015
          return eq(data.target, event.target);
597 daniel-mar 13016
        };
13017
        return startData.get().filter(isSame).map(function (_data) {
13018
          if (longpressFired.get()) {
13019
            event.prevent();
13020
            return false;
13021
          } else {
13022
            return settings.triggerEvent(tap(), event);
13023
          }
13024
        });
13025
      };
637 daniel-mar 13026
      var handlers = wrapAll([
597 daniel-mar 13027
        {
13028
          key: touchstart(),
13029
          value: handleTouchstart
13030
        },
13031
        {
13032
          key: touchmove(),
13033
          value: handleTouchmove
13034
        },
13035
        {
13036
          key: touchend(),
13037
          value: handleTouchend
13038
        }
13039
      ]);
13040
      var fireIfReady = function (event, type) {
637 daniel-mar 13041
        return get$e(handlers, type).bind(function (handler) {
597 daniel-mar 13042
          return handler(event);
13043
        });
13044
      };
13045
      return { fireIfReady: fireIfReady };
13046
    };
13047
 
13048
    var isDangerous = function (event) {
13049
      var keyEv = event.raw;
637 daniel-mar 13050
      return keyEv.which === BACKSPACE[0] && !contains$2([
597 daniel-mar 13051
        'input',
13052
        'textarea'
637 daniel-mar 13053
      ], name$2(event.target)) && !closest(event.target, '[contenteditable="true"]');
597 daniel-mar 13054
    };
13055
    var isFirefox = function () {
637 daniel-mar 13056
      return detect$1().browser.isFirefox();
597 daniel-mar 13057
    };
13058
    var bindFocus = function (container, handler) {
13059
      if (isFirefox()) {
637 daniel-mar 13060
        return capture(container, 'focus', handler);
597 daniel-mar 13061
      } else {
637 daniel-mar 13062
        return bind(container, 'focusin', handler);
597 daniel-mar 13063
      }
13064
    };
13065
    var bindBlur = function (container, handler) {
13066
      if (isFirefox()) {
637 daniel-mar 13067
        return capture(container, 'blur', handler);
597 daniel-mar 13068
      } else {
637 daniel-mar 13069
        return bind(container, 'focusout', handler);
597 daniel-mar 13070
      }
13071
    };
637 daniel-mar 13072
    var setup$d = function (container, rawSettings) {
679 daniel-mar 13073
      var settings = __assign({ stopBackspace: true }, rawSettings);
597 daniel-mar 13074
      var pointerEvents = [
13075
        'touchstart',
13076
        'touchmove',
13077
        'touchend',
13078
        'touchcancel',
13079
        'gesturestart',
13080
        'mousedown',
13081
        'mouseup',
13082
        'mouseover',
13083
        'mousemove',
13084
        'mouseout',
13085
        'click'
13086
      ];
13087
      var tapEvent = monitor(settings);
637 daniel-mar 13088
      var simpleEvents = map$2(pointerEvents.concat([
597 daniel-mar 13089
        'selectstart',
13090
        'input',
13091
        'contextmenu',
13092
        'change',
13093
        'transitionend',
637 daniel-mar 13094
        'transitioncancel',
597 daniel-mar 13095
        'drag',
13096
        'dragstart',
13097
        'dragend',
13098
        'dragenter',
13099
        'dragleave',
13100
        'dragover',
13101
        'drop',
13102
        'keyup'
13103
      ]), function (type) {
637 daniel-mar 13104
        return bind(container, type, function (event) {
597 daniel-mar 13105
          tapEvent.fireIfReady(event, type).each(function (tapStopped) {
13106
            if (tapStopped) {
13107
              event.kill();
13108
            }
13109
          });
13110
          var stopped = settings.triggerEvent(type, event);
13111
          if (stopped) {
13112
            event.kill();
13113
          }
13114
        });
13115
      });
637 daniel-mar 13116
      var pasteTimeout = value$1();
13117
      var onPaste = bind(container, 'paste', function (event) {
597 daniel-mar 13118
        tapEvent.fireIfReady(event, 'paste').each(function (tapStopped) {
13119
          if (tapStopped) {
13120
            event.kill();
13121
          }
13122
        });
13123
        var stopped = settings.triggerEvent('paste', event);
13124
        if (stopped) {
13125
          event.kill();
13126
        }
637 daniel-mar 13127
        pasteTimeout.set(setTimeout(function () {
597 daniel-mar 13128
          settings.triggerEvent(postPaste(), event);
637 daniel-mar 13129
        }, 0));
597 daniel-mar 13130
      });
637 daniel-mar 13131
      var onKeydown = bind(container, 'keydown', function (event) {
597 daniel-mar 13132
        var stopped = settings.triggerEvent('keydown', event);
13133
        if (stopped) {
13134
          event.kill();
679 daniel-mar 13135
        } else if (settings.stopBackspace && isDangerous(event)) {
597 daniel-mar 13136
          event.prevent();
13137
        }
13138
      });
13139
      var onFocusIn = bindFocus(container, function (event) {
13140
        var stopped = settings.triggerEvent('focusin', event);
13141
        if (stopped) {
13142
          event.kill();
13143
        }
13144
      });
637 daniel-mar 13145
      var focusoutTimeout = value$1();
597 daniel-mar 13146
      var onFocusOut = bindBlur(container, function (event) {
13147
        var stopped = settings.triggerEvent('focusout', event);
13148
        if (stopped) {
13149
          event.kill();
13150
        }
637 daniel-mar 13151
        focusoutTimeout.set(setTimeout(function () {
597 daniel-mar 13152
          settings.triggerEvent(postBlur(), event);
637 daniel-mar 13153
        }, 0));
597 daniel-mar 13154
      });
13155
      var unbind = function () {
637 daniel-mar 13156
        each$1(simpleEvents, function (e) {
597 daniel-mar 13157
          e.unbind();
13158
        });
13159
        onKeydown.unbind();
13160
        onFocusIn.unbind();
13161
        onFocusOut.unbind();
13162
        onPaste.unbind();
637 daniel-mar 13163
        pasteTimeout.on(clearTimeout);
13164
        focusoutTimeout.on(clearTimeout);
597 daniel-mar 13165
      };
13166
      return { unbind: unbind };
13167
    };
13168
 
637 daniel-mar 13169
    var derive = function (rawEvent, rawTarget) {
13170
      var source = get$e(rawEvent, 'target').getOr(rawTarget);
597 daniel-mar 13171
      return Cell(source);
13172
    };
13173
 
13174
    var fromSource = function (event, source) {
13175
      var stopper = Cell(false);
13176
      var cutter = Cell(false);
13177
      var stop = function () {
13178
        stopper.set(true);
13179
      };
13180
      var cut = function () {
13181
        cutter.set(true);
13182
      };
13183
      return {
13184
        stop: stop,
13185
        cut: cut,
13186
        isStopped: stopper.get,
13187
        isCut: cutter.get,
13188
        event: event,
13189
        setSource: source.set,
13190
        getSource: source.get
13191
      };
13192
    };
13193
    var fromExternal = function (event) {
13194
      var stopper = Cell(false);
13195
      var stop = function () {
13196
        stopper.set(true);
13197
      };
13198
      return {
13199
        stop: stop,
13200
        cut: noop,
13201
        isStopped: stopper.get,
13202
        isCut: never,
13203
        event: event,
13204
        setSource: die('Cannot set source of a broadcasted event'),
13205
        getSource: die('Cannot get source of a broadcasted event')
13206
      };
13207
    };
13208
 
637 daniel-mar 13209
    var adt$1 = Adt.generate([
597 daniel-mar 13210
      { stopped: [] },
13211
      { resume: ['element'] },
13212
      { complete: [] }
13213
    ]);
13214
    var doTriggerHandler = function (lookup, eventType, rawEvent, target, source, logger) {
13215
      var handler = lookup(eventType, target);
13216
      var simulatedEvent = fromSource(rawEvent, source);
13217
      return handler.fold(function () {
13218
        logger.logEventNoHandlers(eventType, target);
637 daniel-mar 13219
        return adt$1.complete();
597 daniel-mar 13220
      }, function (handlerInfo) {
13221
        var descHandler = handlerInfo.descHandler;
13222
        var eventHandler = getCurried(descHandler);
13223
        eventHandler(simulatedEvent);
13224
        if (simulatedEvent.isStopped()) {
13225
          logger.logEventStopped(eventType, handlerInfo.element, descHandler.purpose);
637 daniel-mar 13226
          return adt$1.stopped();
597 daniel-mar 13227
        } else if (simulatedEvent.isCut()) {
13228
          logger.logEventCut(eventType, handlerInfo.element, descHandler.purpose);
637 daniel-mar 13229
          return adt$1.complete();
597 daniel-mar 13230
        } else {
13231
          return parent(handlerInfo.element).fold(function () {
13232
            logger.logNoParent(eventType, handlerInfo.element, descHandler.purpose);
637 daniel-mar 13233
            return adt$1.complete();
597 daniel-mar 13234
          }, function (parent) {
13235
            logger.logEventResponse(eventType, handlerInfo.element, descHandler.purpose);
637 daniel-mar 13236
            return adt$1.resume(parent);
597 daniel-mar 13237
          });
13238
        }
13239
      });
13240
    };
13241
    var doTriggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, source, logger) {
13242
      return doTriggerHandler(lookup, eventType, rawEvent, rawTarget, source, logger).fold(always, function (parent) {
13243
        return doTriggerOnUntilStopped(lookup, eventType, rawEvent, parent, source, logger);
13244
      }, never);
13245
    };
13246
    var triggerHandler = function (lookup, eventType, rawEvent, target, logger) {
637 daniel-mar 13247
      var source = derive(rawEvent, target);
597 daniel-mar 13248
      return doTriggerHandler(lookup, eventType, rawEvent, target, source, logger);
13249
    };
13250
    var broadcast = function (listeners, rawEvent, _logger) {
13251
      var simulatedEvent = fromExternal(rawEvent);
637 daniel-mar 13252
      each$1(listeners, function (listener) {
597 daniel-mar 13253
        var descHandler = listener.descHandler;
13254
        var handler = getCurried(descHandler);
13255
        handler(simulatedEvent);
13256
      });
13257
      return simulatedEvent.isStopped();
13258
    };
13259
    var triggerUntilStopped = function (lookup, eventType, rawEvent, logger) {
13260
      return triggerOnUntilStopped(lookup, eventType, rawEvent, rawEvent.target, logger);
13261
    };
13262
    var triggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, logger) {
637 daniel-mar 13263
      var source = derive(rawEvent, rawTarget);
597 daniel-mar 13264
      return doTriggerOnUntilStopped(lookup, eventType, rawEvent, rawTarget, source, logger);
13265
    };
13266
 
13267
    var eventHandler = function (element, descHandler) {
13268
      return {
13269
        element: element,
13270
        descHandler: descHandler
13271
      };
13272
    };
13273
    var broadcastHandler = function (id, handler) {
13274
      return {
13275
        id: id,
13276
        descHandler: handler
13277
      };
13278
    };
13279
    var EventRegistry = function () {
13280
      var registry = {};
13281
      var registerId = function (extraArgs, id, events) {
637 daniel-mar 13282
        each(events, function (v, k) {
597 daniel-mar 13283
          var handlers = registry[k] !== undefined ? registry[k] : {};
13284
          handlers[id] = curryArgs(v, extraArgs);
13285
          registry[k] = handlers;
13286
        });
13287
      };
13288
      var findHandler = function (handlers, elem) {
679 daniel-mar 13289
        return read$1(elem).bind(function (id) {
13290
          return get$e(handlers, id);
13291
        }).map(function (descHandler) {
13292
          return eventHandler(elem, descHandler);
597 daniel-mar 13293
        });
13294
      };
13295
      var filterByType = function (type) {
637 daniel-mar 13296
        return get$e(registry, type).map(function (handlers) {
597 daniel-mar 13297
          return mapToArray(handlers, function (f, id) {
13298
            return broadcastHandler(id, f);
13299
          });
13300
        }).getOr([]);
13301
      };
13302
      var find = function (isAboveRoot, type, target) {
679 daniel-mar 13303
        return get$e(registry, type).bind(function (handlers) {
13304
          return closest$4(target, function (elem) {
13305
            return findHandler(handlers, elem);
13306
          }, isAboveRoot);
13307
        });
597 daniel-mar 13308
      };
13309
      var unregisterId = function (id) {
637 daniel-mar 13310
        each(registry, function (handlersById, _eventName) {
13311
          if (has$2(handlersById, id)) {
597 daniel-mar 13312
            delete handlersById[id];
13313
          }
13314
        });
13315
      };
13316
      return {
13317
        registerId: registerId,
13318
        unregisterId: unregisterId,
13319
        filterByType: filterByType,
13320
        find: find
13321
      };
13322
    };
13323
 
13324
    var Registry = function () {
13325
      var events = EventRegistry();
13326
      var components = {};
13327
      var readOrTag = function (component) {
13328
        var elem = component.element;
637 daniel-mar 13329
        return read$1(elem).getOrThunk(function () {
597 daniel-mar 13330
          return write('uid-', component.element);
13331
        });
13332
      };
13333
      var failOnDuplicate = function (component, tagId) {
13334
        var conflict = components[tagId];
13335
        if (conflict === component) {
13336
          unregister(component);
13337
        } else {
13338
          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');
13339
        }
13340
      };
13341
      var register = function (component) {
13342
        var tagId = readOrTag(component);
13343
        if (hasNonNullableKey(components, tagId)) {
13344
          failOnDuplicate(component, tagId);
13345
        }
13346
        var extraArgs = [component];
13347
        events.registerId(extraArgs, tagId, component.events);
13348
        components[tagId] = component;
13349
      };
13350
      var unregister = function (component) {
13351
        read$1(component.element).each(function (tagId) {
13352
          delete components[tagId];
13353
          events.unregisterId(tagId);
13354
        });
13355
      };
13356
      var filter = function (type) {
13357
        return events.filterByType(type);
13358
      };
13359
      var find = function (isAboveRoot, type, target) {
13360
        return events.find(isAboveRoot, type, target);
13361
      };
13362
      var getById = function (id) {
637 daniel-mar 13363
        return get$e(components, id);
597 daniel-mar 13364
      };
13365
      return {
13366
        find: find,
13367
        filter: filter,
13368
        register: register,
13369
        unregister: unregister,
13370
        getById: getById
13371
      };
13372
    };
13373
 
637 daniel-mar 13374
    var factory$j = function (detail) {
597 daniel-mar 13375
      var _a = detail.dom, attributes = _a.attributes, domWithoutAttributes = __rest(_a, ['attributes']);
13376
      return {
13377
        uid: detail.uid,
13378
        dom: __assign({
13379
          tag: 'div',
13380
          attributes: __assign({ role: 'presentation' }, attributes)
13381
        }, domWithoutAttributes),
13382
        components: detail.components,
637 daniel-mar 13383
        behaviours: get$2(detail.containerBehaviours),
597 daniel-mar 13384
        events: detail.events,
13385
        domModification: detail.domModification,
13386
        eventOrder: detail.eventOrder
13387
      };
13388
    };
637 daniel-mar 13389
    var Container = single({
597 daniel-mar 13390
      name: 'Container',
637 daniel-mar 13391
      factory: factory$j,
597 daniel-mar 13392
      configFields: [
637 daniel-mar 13393
        defaulted('components', []),
13394
        field('containerBehaviours', []),
13395
        defaulted('events', {}),
13396
        defaulted('domModification', {}),
13397
        defaulted('eventOrder', {})
597 daniel-mar 13398
      ]
13399
    });
13400
 
13401
    var takeover = function (root) {
13402
      var isAboveRoot = function (el) {
13403
        return parent(root.element).fold(always, function (parent) {
637 daniel-mar 13404
          return eq(el, parent);
597 daniel-mar 13405
        });
13406
      };
13407
      var registry = Registry();
13408
      var lookup = function (eventName, target) {
13409
        return registry.find(isAboveRoot, eventName, target);
13410
      };
637 daniel-mar 13411
      var domEvents = setup$d(root.element, {
597 daniel-mar 13412
        triggerEvent: function (eventName, event) {
13413
          return monitorEvent(eventName, event.target, function (logger) {
13414
            return triggerUntilStopped(lookup, eventName, event, logger);
13415
          });
13416
        }
13417
      });
13418
      var systemApi = {
637 daniel-mar 13419
        debugInfo: constant$1('real'),
597 daniel-mar 13420
        triggerEvent: function (eventName, target, data) {
13421
          monitorEvent(eventName, target, function (logger) {
13422
            return triggerOnUntilStopped(lookup, eventName, data, target, logger);
13423
          });
13424
        },
13425
        triggerFocus: function (target, originator) {
13426
          read$1(target).fold(function () {
637 daniel-mar 13427
            focus$3(target);
597 daniel-mar 13428
          }, function (_alloyId) {
637 daniel-mar 13429
            monitorEvent(focus$4(), target, function (logger) {
13430
              triggerHandler(lookup, focus$4(), {
597 daniel-mar 13431
                originator: originator,
13432
                kill: noop,
13433
                prevent: noop,
13434
                target: target
13435
              }, target, logger);
13436
              return false;
13437
            });
13438
          });
13439
        },
13440
        triggerEscape: function (comp, simulatedEvent) {
13441
          systemApi.triggerEvent('keydown', comp.element, simulatedEvent.event);
13442
        },
13443
        getByUid: function (uid) {
13444
          return getByUid(uid);
13445
        },
13446
        getByDom: function (elem) {
13447
          return getByDom(elem);
13448
        },
13449
        build: build$1,
13450
        addToGui: function (c) {
13451
          add(c);
13452
        },
13453
        removeFromGui: function (c) {
637 daniel-mar 13454
          remove(c);
597 daniel-mar 13455
        },
13456
        addToWorld: function (c) {
13457
          addToWorld(c);
13458
        },
13459
        removeFromWorld: function (c) {
13460
          removeFromWorld(c);
13461
        },
13462
        broadcast: function (message) {
13463
          broadcast$1(message);
13464
        },
13465
        broadcastOn: function (channels, message) {
13466
          broadcastOn(channels, message);
13467
        },
13468
        broadcastEvent: function (eventName, event) {
13469
          broadcastEvent(eventName, event);
13470
        },
13471
        isConnected: always
13472
      };
13473
      var addToWorld = function (component) {
13474
        component.connect(systemApi);
637 daniel-mar 13475
        if (!isText$1(component.element)) {
597 daniel-mar 13476
          registry.register(component);
637 daniel-mar 13477
          each$1(component.components(), addToWorld);
597 daniel-mar 13478
          systemApi.triggerEvent(systemInit(), component.element, { target: component.element });
13479
        }
13480
      };
13481
      var removeFromWorld = function (component) {
637 daniel-mar 13482
        if (!isText$1(component.element)) {
13483
          each$1(component.components(), removeFromWorld);
597 daniel-mar 13484
          registry.unregister(component);
13485
        }
13486
        component.disconnect();
13487
      };
13488
      var add = function (component) {
637 daniel-mar 13489
        attach(root, component);
597 daniel-mar 13490
      };
637 daniel-mar 13491
      var remove = function (component) {
597 daniel-mar 13492
        detach(component);
13493
      };
13494
      var destroy = function () {
13495
        domEvents.unbind();
679 daniel-mar 13496
        remove$5(root.element);
597 daniel-mar 13497
      };
13498
      var broadcastData = function (data) {
13499
        var receivers = registry.filter(receive());
637 daniel-mar 13500
        each$1(receivers, function (receiver) {
597 daniel-mar 13501
          var descHandler = receiver.descHandler;
13502
          var handler = getCurried(descHandler);
13503
          handler(data);
13504
        });
13505
      };
13506
      var broadcast$1 = function (message) {
13507
        broadcastData({
13508
          universal: true,
13509
          data: message
13510
        });
13511
      };
13512
      var broadcastOn = function (channels, message) {
13513
        broadcastData({
13514
          universal: false,
13515
          channels: channels,
13516
          data: message
13517
        });
13518
      };
13519
      var broadcastEvent = function (eventName, event) {
13520
        var listeners = registry.filter(eventName);
13521
        return broadcast(listeners, event);
13522
      };
13523
      var getByUid = function (uid) {
13524
        return registry.getById(uid).fold(function () {
13525
          return Result.error(new Error('Could not find component with uid: "' + uid + '" in system.'));
13526
        }, Result.value);
13527
      };
13528
      var getByDom = function (elem) {
13529
        var uid = read$1(elem).getOr('not found');
13530
        return getByUid(uid);
13531
      };
13532
      addToWorld(root);
13533
      return {
13534
        root: root,
13535
        element: root.element,
13536
        destroy: destroy,
13537
        add: add,
637 daniel-mar 13538
        remove: remove,
597 daniel-mar 13539
        getByUid: getByUid,
13540
        getByDom: getByDom,
13541
        addToWorld: addToWorld,
13542
        removeFromWorld: removeFromWorld,
13543
        broadcast: broadcast$1,
13544
        broadcastOn: broadcastOn,
13545
        broadcastEvent: broadcastEvent
13546
      };
13547
    };
13548
 
13549
    var renderBar = function (spec, backstage) {
13550
      return {
13551
        dom: {
13552
          tag: 'div',
13553
          classes: [
13554
            'tox-bar',
13555
            'tox-form__controls-h-stack'
13556
          ]
13557
        },
637 daniel-mar 13558
        components: map$2(spec.items, backstage.interpreter)
597 daniel-mar 13559
      };
13560
    };
13561
 
637 daniel-mar 13562
    var schema$l = constant$1([
13563
      defaulted('prefix', 'form-field'),
13564
      field('fieldBehaviours', [
597 daniel-mar 13565
        Composing,
13566
        Representing
13567
      ])
13568
    ]);
637 daniel-mar 13569
    var parts$e = constant$1([
597 daniel-mar 13570
      optional({
637 daniel-mar 13571
        schema: [required$1('dom')],
597 daniel-mar 13572
        name: 'label'
13573
      }),
13574
      optional({
13575
        factory: {
13576
          sketch: function (spec) {
13577
            return {
13578
              uid: spec.uid,
13579
              dom: {
13580
                tag: 'span',
13581
                styles: { display: 'none' },
13582
                attributes: { 'aria-hidden': 'true' },
13583
                innerHtml: spec.text
13584
              }
13585
            };
13586
          }
13587
        },
637 daniel-mar 13588
        schema: [required$1('text')],
597 daniel-mar 13589
        name: 'aria-descriptor'
13590
      }),
13591
      required({
13592
        factory: {
13593
          sketch: function (spec) {
637 daniel-mar 13594
            var excludeFactory = exclude(spec, ['factory']);
597 daniel-mar 13595
            return spec.factory.sketch(excludeFactory);
13596
          }
13597
        },
637 daniel-mar 13598
        schema: [required$1('factory')],
597 daniel-mar 13599
        name: 'field'
13600
      })
13601
    ]);
13602
 
637 daniel-mar 13603
    var factory$i = function (detail, components, _spec, _externals) {
597 daniel-mar 13604
      var behaviours = augment(detail.fieldBehaviours, [
13605
        Composing.config({
13606
          find: function (container) {
13607
            return getPart(container, detail, 'field');
13608
          }
13609
        }),
13610
        Representing.config({
13611
          store: {
13612
            mode: 'manual',
13613
            getValue: function (field) {
13614
              return Composing.getCurrent(field).bind(Representing.getValue);
13615
            },
13616
            setValue: function (field, value) {
13617
              Composing.getCurrent(field).each(function (current) {
13618
                Representing.setValue(current, value);
13619
              });
13620
            }
13621
          }
13622
        })
13623
      ]);
637 daniel-mar 13624
      var events = derive$2([runOnAttached(function (component, _simulatedEvent) {
597 daniel-mar 13625
          var ps = getParts(component, detail, [
13626
            'label',
13627
            'field',
13628
            'aria-descriptor'
13629
          ]);
13630
          ps.field().each(function (field) {
637 daniel-mar 13631
            var id = generate$6(detail.prefix);
597 daniel-mar 13632
            ps.label().each(function (label) {
679 daniel-mar 13633
              set$8(label.element, 'for', id);
13634
              set$8(field.element, 'id', id);
597 daniel-mar 13635
            });
13636
            ps['aria-descriptor']().each(function (descriptor) {
637 daniel-mar 13637
              var descriptorId = generate$6(detail.prefix);
679 daniel-mar 13638
              set$8(descriptor.element, 'id', descriptorId);
13639
              set$8(field.element, 'aria-describedby', descriptorId);
597 daniel-mar 13640
            });
13641
          });
13642
        })]);
13643
      var apis = {
13644
        getField: function (container) {
13645
          return getPart(container, detail, 'field');
13646
        },
13647
        getLabel: function (container) {
13648
          return getPart(container, detail, 'label');
13649
        }
13650
      };
13651
      return {
13652
        uid: detail.uid,
13653
        dom: detail.dom,
13654
        components: components,
13655
        behaviours: behaviours,
13656
        events: events,
13657
        apis: apis
13658
      };
13659
    };
637 daniel-mar 13660
    var FormField = composite({
597 daniel-mar 13661
      name: 'FormField',
637 daniel-mar 13662
      configFields: schema$l(),
13663
      partFields: parts$e(),
13664
      factory: factory$i,
597 daniel-mar 13665
      apis: {
13666
        getField: function (apis, comp) {
13667
          return apis.getField(comp);
13668
        },
13669
        getLabel: function (apis, comp) {
13670
          return apis.getLabel(comp);
13671
        }
13672
      }
13673
    });
13674
 
637 daniel-mar 13675
    var exhibit$2 = function (base, tabConfig) {
13676
      return nu$7({
13677
        attributes: wrapAll([{
597 daniel-mar 13678
            key: tabConfig.tabAttr,
13679
            value: 'true'
13680
          }])
13681
      });
13682
    };
13683
 
13684
    var ActiveTabstopping = /*#__PURE__*/Object.freeze({
13685
        __proto__: null,
637 daniel-mar 13686
        exhibit: exhibit$2
597 daniel-mar 13687
    });
13688
 
637 daniel-mar 13689
    var TabstopSchema = [defaulted('tabAttr', 'data-alloy-tabstop')];
597 daniel-mar 13690
 
637 daniel-mar 13691
    var Tabstopping = create$7({
597 daniel-mar 13692
      fields: TabstopSchema,
13693
      name: 'tabstopping',
13694
      active: ActiveTabstopping
13695
    });
13696
 
679 daniel-mar 13697
    var global$7 = tinymce.util.Tools.resolve('tinymce.html.Entities');
597 daniel-mar 13698
 
13699
    var renderFormFieldWith = function (pLabel, pField, extraClasses, extraBehaviours) {
13700
      var spec = renderFormFieldSpecWith(pLabel, pField, extraClasses, extraBehaviours);
13701
      return FormField.sketch(spec);
13702
    };
13703
    var renderFormField = function (pLabel, pField) {
13704
      return renderFormFieldWith(pLabel, pField, [], []);
13705
    };
13706
    var renderFormFieldSpecWith = function (pLabel, pField, extraClasses, extraBehaviours) {
13707
      return {
13708
        dom: renderFormFieldDomWith(extraClasses),
13709
        components: pLabel.toArray().concat([pField]),
13710
        fieldBehaviours: derive$1(extraBehaviours)
13711
      };
13712
    };
13713
    var renderFormFieldDom = function () {
13714
      return renderFormFieldDomWith([]);
13715
    };
13716
    var renderFormFieldDomWith = function (extraClasses) {
13717
      return {
13718
        tag: 'div',
13719
        classes: ['tox-form__group'].concat(extraClasses)
13720
      };
13721
    };
637 daniel-mar 13722
    var renderLabel$2 = function (label, providersBackstage) {
597 daniel-mar 13723
      return FormField.parts.label({
13724
        dom: {
13725
          tag: 'label',
13726
          classes: ['tox-label'],
13727
          innerHtml: providersBackstage.translate(label)
13728
        }
13729
      });
13730
    };
13731
 
637 daniel-mar 13732
    var formChangeEvent = generate$6('form-component-change');
13733
    var formCloseEvent = generate$6('form-close');
13734
    var formCancelEvent = generate$6('form-cancel');
13735
    var formActionEvent = generate$6('form-action');
13736
    var formSubmitEvent = generate$6('form-submit');
13737
    var formBlockEvent = generate$6('form-block');
13738
    var formUnblockEvent = generate$6('form-unblock');
13739
    var formTabChangeEvent = generate$6('form-tabchange');
13740
    var formResizeEvent = generate$6('form-resize');
597 daniel-mar 13741
 
13742
    var renderCollection = function (spec, providersBackstage) {
13743
      var _a;
13744
      var pLabel = spec.label.map(function (label) {
637 daniel-mar 13745
        return renderLabel$2(label, providersBackstage);
597 daniel-mar 13746
      });
13747
      var runOnItem = function (f) {
13748
        return function (comp, se) {
637 daniel-mar 13749
          closest$1(se.event.target, '[data-collection-item-value]').each(function (target) {
679 daniel-mar 13750
            f(comp, se, target, get$d(target, 'data-collection-item-value'));
597 daniel-mar 13751
          });
13752
        };
13753
      };
13754
      var setContents = function (comp, items) {
637 daniel-mar 13755
        var htmlLines = map$2(items, function (item) {
679 daniel-mar 13756
          var itemText = global$e.translate(item.text);
597 daniel-mar 13757
          var textContent = spec.columns === 1 ? '<div class="tox-collection__item-label">' + itemText + '</div>' : '';
13758
          var iconContent = '<div class="tox-collection__item-icon">' + item.icon + '</div>';
13759
          var mapItemName = {
13760
            '_': ' ',
13761
            ' - ': ' ',
13762
            '-': ' '
13763
          };
13764
          var ariaLabel = itemText.replace(/\_| \- |\-/g, function (match) {
13765
            return mapItemName[match];
13766
          });
13767
          var disabledClass = providersBackstage.isDisabled() ? ' tox-collection__item--state-disabled' : '';
679 daniel-mar 13768
          return '<div class="tox-collection__item' + disabledClass + '" tabindex="-1" data-collection-item-value="' + global$7.encodeAllRaw(item.value) + '" title="' + ariaLabel + '" aria-label="' + ariaLabel + '">' + iconContent + textContent + '</div>';
597 daniel-mar 13769
        });
637 daniel-mar 13770
        var chunks = spec.columns !== 'auto' && spec.columns > 1 ? chunk$1(htmlLines, spec.columns) : [htmlLines];
13771
        var html = map$2(chunks, function (ch) {
597 daniel-mar 13772
          return '<div class="tox-collection__group">' + ch.join('') + '</div>';
13773
        });
679 daniel-mar 13774
        set$5(comp.element, html.join(''));
597 daniel-mar 13775
      };
13776
      var onClick = runOnItem(function (comp, se, tgt, itemValue) {
13777
        se.stop();
13778
        if (!providersBackstage.isDisabled()) {
13779
          emitWith(comp, formActionEvent, {
13780
            name: spec.name,
13781
            value: itemValue
13782
          });
13783
        }
13784
      });
13785
      var collectionEvents = [
637 daniel-mar 13786
        run$1(mouseover(), runOnItem(function (comp, se, tgt) {
13787
          focus$3(tgt);
597 daniel-mar 13788
        })),
637 daniel-mar 13789
        run$1(click(), onClick),
13790
        run$1(tap(), onClick),
13791
        run$1(focusin(), runOnItem(function (comp, se, tgt) {
13792
          descendant(comp.element, '.' + activeClass).each(function (currentActive) {
679 daniel-mar 13793
            remove$2(currentActive, activeClass);
597 daniel-mar 13794
          });
13795
          add$2(tgt, activeClass);
13796
        })),
637 daniel-mar 13797
        run$1(focusout(), runOnItem(function (comp) {
13798
          descendant(comp.element, '.' + activeClass).each(function (currentActive) {
679 daniel-mar 13799
            remove$2(currentActive, activeClass);
597 daniel-mar 13800
          });
13801
        })),
637 daniel-mar 13802
        runOnExecute$1(runOnItem(function (comp, se, tgt, itemValue) {
597 daniel-mar 13803
          emitWith(comp, formActionEvent, {
13804
            name: spec.name,
13805
            value: itemValue
13806
          });
13807
        }))
13808
      ];
13809
      var iterCollectionItems = function (comp, applyAttributes) {
637 daniel-mar 13810
        return map$2(descendants(comp.element, '.tox-collection__item'), applyAttributes);
597 daniel-mar 13811
      };
13812
      var pField = FormField.parts.field({
13813
        dom: {
13814
          tag: 'div',
13815
          classes: ['tox-collection'].concat(spec.columns !== 1 ? ['tox-collection--grid'] : ['tox-collection--list'])
13816
        },
13817
        components: [],
637 daniel-mar 13818
        factory: { sketch: identity$1 },
597 daniel-mar 13819
        behaviours: derive$1([
13820
          Disabling.config({
13821
            disabled: providersBackstage.isDisabled,
13822
            onDisabled: function (comp) {
13823
              iterCollectionItems(comp, function (childElm) {
13824
                add$2(childElm, 'tox-collection__item--state-disabled');
679 daniel-mar 13825
                set$8(childElm, 'aria-disabled', true);
597 daniel-mar 13826
              });
13827
            },
13828
            onEnabled: function (comp) {
13829
              iterCollectionItems(comp, function (childElm) {
679 daniel-mar 13830
                remove$2(childElm, 'tox-collection__item--state-disabled');
13831
                remove$7(childElm, 'aria-disabled');
597 daniel-mar 13832
              });
13833
            }
13834
          }),
13835
          receivingConfig(),
13836
          Replacing.config({}),
13837
          Representing.config({
13838
            store: {
13839
              mode: 'memory',
13840
              initialValue: []
13841
            },
13842
            onSetValue: function (comp, items) {
13843
              setContents(comp, items);
13844
              if (spec.columns === 'auto') {
13845
                detectSize(comp, 5, 'tox-collection__item').each(function (_a) {
13846
                  var numRows = _a.numRows, numColumns = _a.numColumns;
13847
                  Keying.setGridSize(comp, numRows, numColumns);
13848
                });
13849
              }
13850
              emit(comp, formResizeEvent);
13851
            }
13852
          }),
13853
          Tabstopping.config({}),
13854
          Keying.config(deriveCollectionMovement(spec.columns, 'normal')),
13855
          config('collection-events', collectionEvents)
13856
        ]),
637 daniel-mar 13857
        eventOrder: (_a = {}, _a[execute$5()] = [
597 daniel-mar 13858
          'disabling',
13859
          'alloy.base.behaviour',
13860
          'collection-events'
13861
        ], _a)
13862
      });
13863
      var extraClasses = ['tox-form__group--collection'];
13864
      return renderFormFieldWith(pLabel, pField, extraClasses, []);
13865
    };
13866
 
637 daniel-mar 13867
    var schema$k = constant$1([
597 daniel-mar 13868
      option('data'),
637 daniel-mar 13869
      defaulted('inputAttributes', {}),
13870
      defaulted('inputStyles', {}),
13871
      defaulted('tag', 'input'),
13872
      defaulted('inputClasses', []),
597 daniel-mar 13873
      onHandler('onSetValue'),
637 daniel-mar 13874
      defaulted('styles', {}),
13875
      defaulted('eventOrder', {}),
13876
      field('inputBehaviours', [
597 daniel-mar 13877
        Representing,
13878
        Focusing
13879
      ]),
637 daniel-mar 13880
      defaulted('selectOnFocus', true)
597 daniel-mar 13881
    ]);
13882
    var focusBehaviours = function (detail) {
13883
      return derive$1([Focusing.config({
13884
          onFocus: !detail.selectOnFocus ? noop : function (component) {
13885
            var input = component.element;
679 daniel-mar 13886
            var value = get$5(input);
597 daniel-mar 13887
            input.dom.setSelectionRange(0, value.length);
13888
          }
13889
        })]);
13890
    };
13891
    var behaviours = function (detail) {
13892
      return __assign(__assign({}, focusBehaviours(detail)), augment(detail.inputBehaviours, [Representing.config({
13893
          store: __assign(__assign({ mode: 'manual' }, detail.data.map(function (data) {
13894
            return { initialValue: data };
13895
          }).getOr({})), {
13896
            getValue: function (input) {
679 daniel-mar 13897
              return get$5(input.element);
597 daniel-mar 13898
            },
13899
            setValue: function (input, data) {
679 daniel-mar 13900
              var current = get$5(input.element);
597 daniel-mar 13901
              if (current !== data) {
679 daniel-mar 13902
                set$4(input.element, data);
597 daniel-mar 13903
              }
13904
            }
13905
          }),
13906
          onSetValue: detail.onSetValue
13907
        })]));
13908
    };
637 daniel-mar 13909
    var dom = function (detail) {
597 daniel-mar 13910
      return {
13911
        tag: detail.tag,
13912
        attributes: __assign({ type: 'text' }, detail.inputAttributes),
13913
        styles: detail.inputStyles,
13914
        classes: detail.inputClasses
13915
      };
13916
    };
13917
 
637 daniel-mar 13918
    var factory$h = function (detail, _spec) {
597 daniel-mar 13919
      return {
13920
        uid: detail.uid,
637 daniel-mar 13921
        dom: dom(detail),
597 daniel-mar 13922
        components: [],
13923
        behaviours: behaviours(detail),
13924
        eventOrder: detail.eventOrder
13925
      };
13926
    };
637 daniel-mar 13927
    var Input = single({
597 daniel-mar 13928
      name: 'Input',
637 daniel-mar 13929
      configFields: schema$k(),
13930
      factory: factory$h
597 daniel-mar 13931
    });
13932
 
13933
    var exports$1 = {}, module = { exports: exports$1 };
13934
    (function (define, exports, module, require) {
679 daniel-mar 13935
      (function (global, factory) {
13936
        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());
13937
      }(this, function () {
13938
        var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
13939
        var promise = { exports: {} };
13940
        (function (module) {
13941
          (function (root) {
13942
            var setTimeoutFunc = setTimeout;
13943
            function noop() {
597 daniel-mar 13944
            }
679 daniel-mar 13945
            function bind(fn, thisArg) {
13946
              return function () {
13947
                fn.apply(thisArg, arguments);
13948
              };
13949
            }
13950
            function Promise(fn) {
13951
              if (typeof this !== 'object')
13952
                throw new TypeError('Promises must be constructed via new');
13953
              if (typeof fn !== 'function')
13954
                throw new TypeError('not a function');
13955
              this._state = 0;
13956
              this._handled = false;
13957
              this._value = undefined;
13958
              this._deferreds = [];
13959
              doResolve(fn, this);
13960
            }
13961
            function handle(self, deferred) {
13962
              while (self._state === 3) {
13963
                self = self._value;
597 daniel-mar 13964
              }
679 daniel-mar 13965
              if (self._state === 0) {
13966
                self._deferreds.push(deferred);
13967
                return;
597 daniel-mar 13968
              }
679 daniel-mar 13969
              self._handled = true;
13970
              Promise._immediateFn(function () {
13971
                var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
13972
                if (cb === null) {
13973
                  (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
13974
                  return;
597 daniel-mar 13975
                }
679 daniel-mar 13976
                var ret;
597 daniel-mar 13977
                try {
679 daniel-mar 13978
                  ret = cb(self._value);
597 daniel-mar 13979
                } catch (e) {
679 daniel-mar 13980
                  reject(deferred.promise, e);
13981
                  return;
597 daniel-mar 13982
                }
679 daniel-mar 13983
                resolve(deferred.promise, ret);
13984
              });
13985
            }
13986
            function resolve(self, newValue) {
13987
              try {
13988
                if (newValue === self)
13989
                  throw new TypeError('A promise cannot be resolved with itself.');
13990
                if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
13991
                  var then = newValue.then;
13992
                  if (newValue instanceof Promise) {
13993
                    self._state = 3;
13994
                    self._value = newValue;
13995
                    finale(self);
13996
                    return;
13997
                  } else if (typeof then === 'function') {
13998
                    doResolve(bind(then, newValue), self);
13999
                    return;
597 daniel-mar 14000
                  }
14001
                }
679 daniel-mar 14002
                self._state = 1;
14003
                self._value = newValue;
14004
                finale(self);
14005
              } catch (e) {
14006
                reject(self, e);
597 daniel-mar 14007
              }
679 daniel-mar 14008
            }
14009
            function reject(self, newValue) {
14010
              self._state = 2;
14011
              self._value = newValue;
14012
              finale(self);
14013
            }
14014
            function finale(self) {
14015
              if (self._state === 2 && self._deferreds.length === 0) {
14016
                Promise._immediateFn(function () {
14017
                  if (!self._handled) {
14018
                    Promise._unhandledRejectionFn(self._value);
597 daniel-mar 14019
                  }
679 daniel-mar 14020
                });
597 daniel-mar 14021
              }
679 daniel-mar 14022
              for (var i = 0, len = self._deferreds.length; i < len; i++) {
14023
                handle(self, self._deferreds[i]);
597 daniel-mar 14024
              }
679 daniel-mar 14025
              self._deferreds = null;
14026
            }
14027
            function Handler(onFulfilled, onRejected, promise) {
14028
              this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
14029
              this.onRejected = typeof onRejected === 'function' ? onRejected : null;
14030
              this.promise = promise;
14031
            }
14032
            function doResolve(fn, self) {
14033
              var done = false;
14034
              try {
14035
                fn(function (value) {
14036
                  if (done)
14037
                    return;
14038
                  done = true;
14039
                  resolve(self, value);
14040
                }, function (reason) {
14041
                  if (done)
14042
                    return;
14043
                  done = true;
14044
                  reject(self, reason);
14045
                });
14046
              } catch (ex) {
14047
                if (done)
597 daniel-mar 14048
                  return;
679 daniel-mar 14049
                done = true;
14050
                reject(self, ex);
597 daniel-mar 14051
              }
679 daniel-mar 14052
            }
14053
            Promise.prototype['catch'] = function (onRejected) {
14054
              return this.then(null, onRejected);
14055
            };
14056
            Promise.prototype.then = function (onFulfilled, onRejected) {
14057
              var prom = new this.constructor(noop);
14058
              handle(this, new Handler(onFulfilled, onRejected, prom));
14059
              return prom;
14060
            };
14061
            Promise.all = function (arr) {
14062
              var args = Array.prototype.slice.call(arr);
14063
              return new Promise(function (resolve, reject) {
14064
                if (args.length === 0)
14065
                  return resolve([]);
14066
                var remaining = args.length;
14067
                function res(i, val) {
14068
                  try {
14069
                    if (val && (typeof val === 'object' || typeof val === 'function')) {
14070
                      var then = val.then;
14071
                      if (typeof then === 'function') {
14072
                        then.call(val, function (val) {
14073
                          res(i, val);
14074
                        }, reject);
597 daniel-mar 14075
                        return;
14076
                      }
14077
                    }
679 daniel-mar 14078
                    args[i] = val;
14079
                    if (--remaining === 0) {
14080
                      resolve(args);
597 daniel-mar 14081
                    }
679 daniel-mar 14082
                  } catch (ex) {
14083
                    reject(ex);
597 daniel-mar 14084
                  }
14085
                }
679 daniel-mar 14086
                for (var i = 0; i < args.length; i++) {
14087
                  res(i, args[i]);
14088
                }
14089
              });
14090
            };
14091
            Promise.resolve = function (value) {
14092
              if (value && typeof value === 'object' && value.constructor === Promise) {
14093
                return value;
14094
              }
14095
              return new Promise(function (resolve) {
14096
                resolve(value);
14097
              });
14098
            };
14099
            Promise.reject = function (value) {
14100
              return new Promise(function (resolve, reject) {
14101
                reject(value);
14102
              });
14103
            };
14104
            Promise.race = function (values) {
14105
              return new Promise(function (resolve, reject) {
14106
                for (var i = 0, len = values.length; i < len; i++) {
14107
                  values[i].then(resolve, reject);
14108
                }
14109
              });
14110
            };
14111
            Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) {
14112
              setImmediate(fn);
14113
            } : function (fn) {
14114
              setTimeoutFunc(fn, 0);
14115
            };
14116
            Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
14117
              if (typeof console !== 'undefined' && console) {
14118
                console.warn('Possible Unhandled Promise Rejection:', err);
14119
              }
14120
            };
14121
            Promise._setImmediateFn = function _setImmediateFn(fn) {
14122
              Promise._immediateFn = fn;
14123
            };
14124
            Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {
14125
              Promise._unhandledRejectionFn = fn;
14126
            };
14127
            if (module.exports) {
14128
              module.exports = Promise;
14129
            } else if (!root.Promise) {
14130
              root.Promise = Promise;
597 daniel-mar 14131
            }
679 daniel-mar 14132
          }(commonjsGlobal));
14133
        }(promise));
14134
        var promisePolyfill = promise.exports;
14135
        var Global = function () {
14136
          if (typeof window !== 'undefined') {
14137
            return window;
14138
          } else {
14139
            return Function('return this;')();
14140
          }
14141
        }();
14142
        var promisePolyfill_1 = { boltExport: Global.Promise || promisePolyfill };
14143
        return promisePolyfill_1;
597 daniel-mar 14144
      }));
679 daniel-mar 14145
    }(undefined, exports$1, module));
14146
    var Promise$1 = module.exports.boltExport;
597 daniel-mar 14147
 
637 daniel-mar 14148
    var nu$3 = function (baseFn) {
597 daniel-mar 14149
      var data = Optional.none();
14150
      var callbacks = [];
14151
      var map = function (f) {
637 daniel-mar 14152
        return nu$3(function (nCallback) {
597 daniel-mar 14153
          get(function (data) {
14154
            nCallback(f(data));
14155
          });
14156
        });
14157
      };
14158
      var get = function (nCallback) {
14159
        if (isReady()) {
14160
          call(nCallback);
14161
        } else {
14162
          callbacks.push(nCallback);
14163
        }
14164
      };
14165
      var set = function (x) {
14166
        if (!isReady()) {
14167
          data = Optional.some(x);
14168
          run(callbacks);
14169
          callbacks = [];
14170
        }
14171
      };
14172
      var isReady = function () {
14173
        return data.isSome();
14174
      };
14175
      var run = function (cbs) {
637 daniel-mar 14176
        each$1(cbs, call);
597 daniel-mar 14177
      };
14178
      var call = function (cb) {
14179
        data.each(function (x) {
14180
          setTimeout(function () {
14181
            cb(x);
14182
          }, 0);
14183
        });
14184
      };
14185
      baseFn(set);
14186
      return {
14187
        get: get,
14188
        map: map,
14189
        isReady: isReady
14190
      };
14191
    };
637 daniel-mar 14192
    var pure$1 = function (a) {
14193
      return nu$3(function (callback) {
597 daniel-mar 14194
        callback(a);
14195
      });
14196
    };
14197
    var LazyValue = {
637 daniel-mar 14198
      nu: nu$3,
14199
      pure: pure$1
597 daniel-mar 14200
    };
14201
 
14202
    var errorReporter = function (err) {
14203
      setTimeout(function () {
14204
        throw err;
14205
      }, 0);
14206
    };
637 daniel-mar 14207
    var make$5 = function (run) {
597 daniel-mar 14208
      var get = function (callback) {
14209
        run().then(callback, errorReporter);
14210
      };
14211
      var map = function (fab) {
637 daniel-mar 14212
        return make$5(function () {
597 daniel-mar 14213
          return run().then(fab);
14214
        });
14215
      };
14216
      var bind = function (aFutureB) {
637 daniel-mar 14217
        return make$5(function () {
597 daniel-mar 14218
          return run().then(function (v) {
14219
            return aFutureB(v).toPromise();
14220
          });
14221
        });
14222
      };
14223
      var anonBind = function (futureB) {
637 daniel-mar 14224
        return make$5(function () {
597 daniel-mar 14225
          return run().then(function () {
14226
            return futureB.toPromise();
14227
          });
14228
        });
14229
      };
14230
      var toLazy = function () {
14231
        return LazyValue.nu(get);
14232
      };
14233
      var toCached = function () {
14234
        var cache = null;
637 daniel-mar 14235
        return make$5(function () {
597 daniel-mar 14236
          if (cache === null) {
14237
            cache = run();
14238
          }
14239
          return cache;
14240
        });
14241
      };
14242
      var toPromise = run;
14243
      return {
14244
        map: map,
14245
        bind: bind,
14246
        anonBind: anonBind,
14247
        toLazy: toLazy,
14248
        toCached: toCached,
14249
        toPromise: toPromise,
14250
        get: get
14251
      };
14252
    };
637 daniel-mar 14253
    var nu$2 = function (baseFn) {
14254
      return make$5(function () {
679 daniel-mar 14255
        return new Promise$1(baseFn);
597 daniel-mar 14256
      });
14257
    };
637 daniel-mar 14258
    var pure = function (a) {
14259
      return make$5(function () {
679 daniel-mar 14260
        return Promise$1.resolve(a);
597 daniel-mar 14261
      });
14262
    };
14263
    var Future = {
637 daniel-mar 14264
      nu: nu$2,
14265
      pure: pure
597 daniel-mar 14266
    };
14267
 
14268
    var ariaElements = [
14269
      'input',
14270
      'textarea'
14271
    ];
14272
    var isAriaElement = function (elem) {
637 daniel-mar 14273
      var name = name$2(elem);
14274
      return contains$2(ariaElements, name);
597 daniel-mar 14275
    };
14276
    var markValid = function (component, invalidConfig) {
14277
      var elem = invalidConfig.getRoot(component).getOr(component.element);
679 daniel-mar 14278
      remove$2(elem, invalidConfig.invalidClass);
597 daniel-mar 14279
      invalidConfig.notify.each(function (notifyInfo) {
14280
        if (isAriaElement(component.element)) {
679 daniel-mar 14281
          set$8(component.element, 'aria-invalid', false);
597 daniel-mar 14282
        }
14283
        notifyInfo.getContainer(component).each(function (container) {
679 daniel-mar 14284
          set$5(container, notifyInfo.validHtml);
597 daniel-mar 14285
        });
14286
        notifyInfo.onValid(component);
14287
      });
14288
    };
14289
    var markInvalid = function (component, invalidConfig, invalidState, text) {
14290
      var elem = invalidConfig.getRoot(component).getOr(component.element);
14291
      add$2(elem, invalidConfig.invalidClass);
14292
      invalidConfig.notify.each(function (notifyInfo) {
14293
        if (isAriaElement(component.element)) {
679 daniel-mar 14294
          set$8(component.element, 'aria-invalid', true);
597 daniel-mar 14295
        }
14296
        notifyInfo.getContainer(component).each(function (container) {
679 daniel-mar 14297
          set$5(container, text);
597 daniel-mar 14298
        });
14299
        notifyInfo.onInvalid(component, text);
14300
      });
14301
    };
14302
    var query = function (component, invalidConfig, _invalidState) {
14303
      return invalidConfig.validator.fold(function () {
14304
        return Future.pure(Result.value(true));
14305
      }, function (validatorInfo) {
14306
        return validatorInfo.validate(component);
14307
      });
14308
    };
637 daniel-mar 14309
    var run = function (component, invalidConfig, invalidState) {
597 daniel-mar 14310
      invalidConfig.notify.each(function (notifyInfo) {
14311
        notifyInfo.onValidate(component);
14312
      });
14313
      return query(component, invalidConfig).map(function (valid) {
14314
        if (component.getSystem().isConnected()) {
14315
          return valid.fold(function (err) {
14316
            markInvalid(component, invalidConfig, invalidState, err);
14317
            return Result.error(err);
14318
          }, function (v) {
14319
            markValid(component, invalidConfig);
14320
            return Result.value(v);
14321
          });
14322
        } else {
14323
          return Result.error('No longer in system');
14324
        }
14325
      });
14326
    };
14327
    var isInvalid = function (component, invalidConfig) {
14328
      var elem = invalidConfig.getRoot(component).getOr(component.element);
637 daniel-mar 14329
      return has(elem, invalidConfig.invalidClass);
597 daniel-mar 14330
    };
14331
 
14332
    var InvalidateApis = /*#__PURE__*/Object.freeze({
14333
        __proto__: null,
14334
        markValid: markValid,
14335
        markInvalid: markInvalid,
14336
        query: query,
637 daniel-mar 14337
        run: run,
597 daniel-mar 14338
        isInvalid: isInvalid
14339
    });
14340
 
637 daniel-mar 14341
    var events$8 = function (invalidConfig, invalidState) {
597 daniel-mar 14342
      return invalidConfig.validator.map(function (validatorInfo) {
637 daniel-mar 14343
        return derive$2([run$1(validatorInfo.onEvent, function (component) {
14344
            run(component, invalidConfig, invalidState).get(identity$1);
597 daniel-mar 14345
          })].concat(validatorInfo.validateOnLoad ? [runOnAttached(function (component) {
637 daniel-mar 14346
            run(component, invalidConfig, invalidState).get(noop);
597 daniel-mar 14347
          })] : []));
14348
      }).getOr({});
14349
    };
14350
 
14351
    var ActiveInvalidate = /*#__PURE__*/Object.freeze({
14352
        __proto__: null,
637 daniel-mar 14353
        events: events$8
597 daniel-mar 14354
    });
14355
 
14356
    var InvalidateSchema = [
637 daniel-mar 14357
      required$1('invalidClass'),
14358
      defaulted('getRoot', Optional.none),
597 daniel-mar 14359
      optionObjOf('notify', [
637 daniel-mar 14360
        defaulted('aria', 'alert'),
14361
        defaulted('getContainer', Optional.none),
14362
        defaulted('validHtml', ''),
597 daniel-mar 14363
        onHandler('onValid'),
14364
        onHandler('onInvalid'),
14365
        onHandler('onValidate')
14366
      ]),
14367
      optionObjOf('validator', [
637 daniel-mar 14368
        required$1('validate'),
14369
        defaulted('onEvent', 'input'),
14370
        defaulted('validateOnLoad', true)
597 daniel-mar 14371
      ])
14372
    ];
14373
 
637 daniel-mar 14374
    var Invalidating = create$7({
597 daniel-mar 14375
      fields: InvalidateSchema,
14376
      name: 'invalidating',
14377
      active: ActiveInvalidate,
14378
      apis: InvalidateApis,
14379
      extra: {
14380
        validation: function (validator) {
14381
          return function (component) {
14382
            var v = Representing.getValue(component);
14383
            return Future.pure(validator(v));
14384
          };
14385
        }
14386
      }
14387
    });
14388
 
14389
    var getCoupled = function (component, coupleConfig, coupleState, name) {
14390
      return coupleState.getOrCreate(component, coupleConfig, name);
14391
    };
14392
 
14393
    var CouplingApis = /*#__PURE__*/Object.freeze({
14394
        __proto__: null,
14395
        getCoupled: getCoupled
14396
    });
14397
 
637 daniel-mar 14398
    var CouplingSchema = [requiredOf('others', setOf(Result.value, anyValue()))];
597 daniel-mar 14399
 
637 daniel-mar 14400
    var init$a = function () {
597 daniel-mar 14401
      var coupled = {};
14402
      var getOrCreate = function (component, coupleConfig, name) {
14403
        var available = keys(coupleConfig.others);
14404
        if (!available) {
14405
          throw new Error('Cannot find coupled component: ' + name + '. Known coupled components: ' + JSON.stringify(available, null, 2));
14406
        } else {
637 daniel-mar 14407
          return get$e(coupled, name).getOrThunk(function () {
14408
            var builder = get$e(coupleConfig.others, name).getOrDie('No information found for coupled component: ' + name);
597 daniel-mar 14409
            var spec = builder(component);
14410
            var built = component.getSystem().build(spec);
14411
            coupled[name] = built;
14412
            return built;
14413
          });
14414
        }
14415
      };
637 daniel-mar 14416
      var readState = constant$1({});
14417
      return nu$8({
597 daniel-mar 14418
        readState: readState,
14419
        getOrCreate: getOrCreate
14420
      });
14421
    };
14422
 
14423
    var CouplingState = /*#__PURE__*/Object.freeze({
14424
        __proto__: null,
637 daniel-mar 14425
        init: init$a
597 daniel-mar 14426
    });
14427
 
637 daniel-mar 14428
    var Coupling = create$7({
597 daniel-mar 14429
      fields: CouplingSchema,
14430
      name: 'coupling',
14431
      apis: CouplingApis,
14432
      state: CouplingState
14433
    });
14434
 
637 daniel-mar 14435
    var suffix = constant$1('sink');
14436
    var partType$1 = constant$1(optional({
597 daniel-mar 14437
      name: suffix(),
637 daniel-mar 14438
      overrides: constant$1({
597 daniel-mar 14439
        dom: { tag: 'div' },
14440
        behaviours: derive$1([Positioning.config({ useFixed: always })]),
637 daniel-mar 14441
        events: derive$2([
597 daniel-mar 14442
          cutter(keydown()),
14443
          cutter(mousedown()),
14444
          cutter(click())
14445
        ])
14446
      })
14447
    }));
14448
 
14449
    var HighlightOnOpen;
14450
    (function (HighlightOnOpen) {
14451
      HighlightOnOpen[HighlightOnOpen['HighlightFirst'] = 0] = 'HighlightFirst';
14452
      HighlightOnOpen[HighlightOnOpen['HighlightNone'] = 1] = 'HighlightNone';
14453
    }(HighlightOnOpen || (HighlightOnOpen = {})));
14454
    var getAnchor = function (detail, component) {
14455
      var hotspot = detail.getHotspot(component).getOr(component);
637 daniel-mar 14456
      var type = 'hotspot';
597 daniel-mar 14457
      var overrides = detail.getAnchorOverrides();
14458
      return detail.layouts.fold(function () {
14459
        return {
637 daniel-mar 14460
          type: type,
597 daniel-mar 14461
          hotspot: hotspot,
14462
          overrides: overrides
14463
        };
14464
      }, function (layouts) {
14465
        return {
637 daniel-mar 14466
          type: type,
597 daniel-mar 14467
          hotspot: hotspot,
14468
          overrides: overrides,
14469
          layouts: layouts
14470
        };
14471
      });
14472
    };
14473
    var fetch = function (detail, mapFetch, component) {
14474
      var fetcher = detail.fetch;
14475
      return fetcher(component).map(mapFetch);
14476
    };
14477
    var openF = function (detail, mapFetch, anchor, component, sandbox, externals, highlightOnOpen) {
14478
      var futureData = fetch(detail, mapFetch, component);
14479
      var getLazySink = getSink(component, detail);
14480
      return futureData.map(function (tdata) {
14481
        return tdata.bind(function (data) {
14482
          return Optional.from(tieredMenu.sketch(__assign(__assign({}, externals.menu()), {
637 daniel-mar 14483
            uid: generate$5(''),
597 daniel-mar 14484
            data: data,
14485
            highlightImmediately: highlightOnOpen === HighlightOnOpen.HighlightFirst,
14486
            onOpenMenu: function (tmenu, menu) {
14487
              var sink = getLazySink().getOrDie();
637 daniel-mar 14488
              Positioning.position(sink, menu, { anchor: anchor });
597 daniel-mar 14489
              Sandboxing.decloak(sandbox);
14490
            },
14491
            onOpenSubmenu: function (tmenu, item, submenu) {
14492
              var sink = getLazySink().getOrDie();
637 daniel-mar 14493
              Positioning.position(sink, submenu, {
14494
                anchor: {
14495
                  type: 'submenu',
14496
                  item: item
14497
                }
14498
              });
597 daniel-mar 14499
              Sandboxing.decloak(sandbox);
14500
            },
14501
            onRepositionMenu: function (tmenu, primaryMenu, submenuTriggers) {
14502
              var sink = getLazySink().getOrDie();
637 daniel-mar 14503
              Positioning.position(sink, primaryMenu, { anchor: anchor });
14504
              each$1(submenuTriggers, function (st) {
14505
                Positioning.position(sink, st.triggeredMenu, {
14506
                  anchor: {
14507
                    type: 'submenu',
14508
                    item: st.triggeringItem
14509
                  }
14510
                });
597 daniel-mar 14511
              });
14512
            },
14513
            onEscape: function () {
14514
              Focusing.focus(component);
14515
              Sandboxing.close(sandbox);
14516
              return Optional.some(true);
14517
            }
14518
          })));
14519
        });
14520
      });
14521
    };
637 daniel-mar 14522
    var open = function (detail, mapFetch, hotspot, sandbox, externals, onOpenSync, highlightOnOpen) {
597 daniel-mar 14523
      var anchor = getAnchor(detail, hotspot);
14524
      var processed = openF(detail, mapFetch, anchor, hotspot, sandbox, externals, highlightOnOpen);
14525
      return processed.map(function (tdata) {
14526
        tdata.fold(function () {
14527
          if (Sandboxing.isOpen(sandbox)) {
14528
            Sandboxing.close(sandbox);
14529
          }
14530
        }, function (data) {
14531
          Sandboxing.cloak(sandbox);
14532
          Sandboxing.open(sandbox, data);
14533
          onOpenSync(sandbox);
14534
        });
14535
        return sandbox;
14536
      });
14537
    };
637 daniel-mar 14538
    var close = function (detail, mapFetch, component, sandbox, _externals, _onOpenSync, _highlightOnOpen) {
597 daniel-mar 14539
      Sandboxing.close(sandbox);
14540
      return Future.pure(sandbox);
14541
    };
14542
    var togglePopup = function (detail, mapFetch, hotspot, externals, onOpenSync, highlightOnOpen) {
14543
      var sandbox = Coupling.getCoupled(hotspot, 'sandbox');
14544
      var showing = Sandboxing.isOpen(sandbox);
637 daniel-mar 14545
      var action = showing ? close : open;
597 daniel-mar 14546
      return action(detail, mapFetch, hotspot, sandbox, externals, onOpenSync, highlightOnOpen);
14547
    };
14548
    var matchWidth = function (hotspot, container, useMinWidth) {
14549
      var menu = Composing.getCurrent(container).getOr(container);
679 daniel-mar 14550
      var buttonWidth = get$a(hotspot.element);
597 daniel-mar 14551
      if (useMinWidth) {
679 daniel-mar 14552
        set$7(menu.element, 'min-width', buttonWidth + 'px');
597 daniel-mar 14553
      } else {
679 daniel-mar 14554
        set$6(menu.element, buttonWidth);
597 daniel-mar 14555
      }
14556
    };
14557
    var getSink = function (anyInSystem, sinkDetail) {
14558
      return anyInSystem.getSystem().getByUid(sinkDetail.uid + '-' + suffix()).map(function (internalSink) {
14559
        return function () {
14560
          return Result.value(internalSink);
14561
        };
14562
      }).getOrThunk(function () {
14563
        return sinkDetail.lazySink.fold(function () {
14564
          return function () {
14565
            return Result.error(new Error('No internal sink is specified, nor could an external sink be found'));
14566
          };
14567
        }, function (lazySinkFn) {
14568
          return function () {
14569
            return lazySinkFn(anyInSystem);
14570
          };
14571
        });
14572
      });
14573
    };
14574
    var doRepositionMenus = function (sandbox) {
14575
      Sandboxing.getState(sandbox).each(function (tmenu) {
14576
        tieredMenu.repositionMenus(tmenu);
14577
      });
14578
    };
637 daniel-mar 14579
    var makeSandbox$1 = function (detail, hotspot, extras) {
597 daniel-mar 14580
      var ariaOwner = manager();
14581
      var onOpen = function (component, menu) {
14582
        var anchor = getAnchor(detail, hotspot);
14583
        ariaOwner.link(hotspot.element);
14584
        if (detail.matchWidth) {
14585
          matchWidth(anchor.hotspot, menu, detail.useMinWidth);
14586
        }
14587
        detail.onOpen(anchor, component, menu);
14588
        if (extras !== undefined && extras.onOpen !== undefined) {
14589
          extras.onOpen(component, menu);
14590
        }
14591
      };
14592
      var onClose = function (component, menu) {
14593
        ariaOwner.unlink(hotspot.element);
14594
        if (extras !== undefined && extras.onClose !== undefined) {
14595
          extras.onClose(component, menu);
14596
        }
14597
      };
14598
      var lazySink = getSink(hotspot, detail);
14599
      return {
14600
        dom: {
14601
          tag: 'div',
14602
          classes: detail.sandboxClasses,
14603
          attributes: {
14604
            id: ariaOwner.id,
14605
            role: 'listbox'
14606
          }
14607
        },
14608
        behaviours: SketchBehaviours.augment(detail.sandboxBehaviours, [
14609
          Representing.config({
14610
            store: {
14611
              mode: 'memory',
14612
              initialValue: hotspot
14613
            }
14614
          }),
14615
          Sandboxing.config({
14616
            onOpen: onOpen,
14617
            onClose: onClose,
14618
            isPartOf: function (container, data, queryElem) {
637 daniel-mar 14619
              return isPartOf$1(data, queryElem) || isPartOf$1(hotspot, queryElem);
597 daniel-mar 14620
            },
14621
            getAttachPoint: function () {
14622
              return lazySink().getOrDie();
14623
            }
14624
          }),
14625
          Composing.config({
14626
            find: function (sandbox) {
14627
              return Sandboxing.getState(sandbox).bind(function (menu) {
14628
                return Composing.getCurrent(menu);
14629
              });
14630
            }
14631
          }),
637 daniel-mar 14632
          Receiving.config({ channels: __assign(__assign({}, receivingChannel$1({ isExtraPart: never })), receivingChannel({ doReposition: doRepositionMenus })) })
597 daniel-mar 14633
        ])
14634
      };
14635
    };
14636
    var repositionMenus = function (comp) {
14637
      var sandbox = Coupling.getCoupled(comp, 'sandbox');
14638
      doRepositionMenus(sandbox);
14639
    };
14640
 
14641
    var sandboxFields = function () {
14642
      return [
637 daniel-mar 14643
        defaulted('sandboxClasses', []),
597 daniel-mar 14644
        SketchBehaviours.field('sandboxBehaviours', [
14645
          Composing,
14646
          Receiving,
14647
          Sandboxing,
14648
          Representing
14649
        ])
14650
      ];
14651
    };
14652
 
637 daniel-mar 14653
    var schema$j = constant$1([
14654
      required$1('dom'),
14655
      required$1('fetch'),
597 daniel-mar 14656
      onHandler('onOpen'),
14657
      onKeyboardHandler('onExecute'),
637 daniel-mar 14658
      defaulted('getHotspot', Optional.some),
14659
      defaulted('getAnchorOverrides', constant$1({})),
14660
      schema$y(),
14661
      field('dropdownBehaviours', [
597 daniel-mar 14662
        Toggling,
14663
        Coupling,
14664
        Keying,
14665
        Focusing
14666
      ]),
637 daniel-mar 14667
      required$1('toggleClass'),
14668
      defaulted('eventOrder', {}),
597 daniel-mar 14669
      option('lazySink'),
637 daniel-mar 14670
      defaulted('matchWidth', false),
14671
      defaulted('useMinWidth', false),
597 daniel-mar 14672
      option('role')
14673
    ].concat(sandboxFields()));
637 daniel-mar 14674
    var parts$d = constant$1([
597 daniel-mar 14675
      external$1({
14676
        schema: [tieredMenuMarkers()],
14677
        name: 'menu',
14678
        defaults: function (detail) {
14679
          return { onExecute: detail.onExecute };
14680
        }
14681
      }),
637 daniel-mar 14682
      partType$1()
597 daniel-mar 14683
    ]);
14684
 
637 daniel-mar 14685
    var factory$g = function (detail, components, _spec, externals) {
597 daniel-mar 14686
      var _a;
14687
      var lookupAttr = function (attr) {
637 daniel-mar 14688
        return get$e(detail.dom, 'attributes').bind(function (attrs) {
14689
          return get$e(attrs, attr);
597 daniel-mar 14690
        });
14691
      };
14692
      var switchToMenu = function (sandbox) {
14693
        Sandboxing.getState(sandbox).each(function (tmenu) {
14694
          tieredMenu.highlightPrimary(tmenu);
14695
        });
14696
      };
14697
      var action = function (component) {
14698
        var onOpenSync = switchToMenu;
637 daniel-mar 14699
        togglePopup(detail, identity$1, component, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop);
597 daniel-mar 14700
      };
14701
      var apis = {
14702
        expand: function (comp) {
14703
          if (!Toggling.isOn(comp)) {
637 daniel-mar 14704
            togglePopup(detail, identity$1, comp, externals, noop, HighlightOnOpen.HighlightNone).get(noop);
597 daniel-mar 14705
          }
14706
        },
14707
        open: function (comp) {
14708
          if (!Toggling.isOn(comp)) {
637 daniel-mar 14709
            togglePopup(detail, identity$1, comp, externals, noop, HighlightOnOpen.HighlightFirst).get(noop);
597 daniel-mar 14710
          }
14711
        },
14712
        isOpen: Toggling.isOn,
14713
        close: function (comp) {
14714
          if (Toggling.isOn(comp)) {
637 daniel-mar 14715
            togglePopup(detail, identity$1, comp, externals, noop, HighlightOnOpen.HighlightFirst).get(noop);
597 daniel-mar 14716
          }
14717
        },
14718
        repositionMenus: function (comp) {
14719
          if (Toggling.isOn(comp)) {
14720
            repositionMenus(comp);
14721
          }
14722
        }
14723
      };
14724
      var triggerExecute = function (comp, _se) {
14725
        emitExecute(comp);
14726
        return Optional.some(true);
14727
      };
14728
      return {
14729
        uid: detail.uid,
14730
        dom: detail.dom,
14731
        components: components,
14732
        behaviours: augment(detail.dropdownBehaviours, [
14733
          Toggling.config({
14734
            toggleClass: detail.toggleClass,
14735
            aria: { mode: 'expanded' }
14736
          }),
14737
          Coupling.config({
14738
            others: {
14739
              sandbox: function (hotspot) {
637 daniel-mar 14740
                return makeSandbox$1(detail, hotspot, {
597 daniel-mar 14741
                  onOpen: function () {
14742
                    return Toggling.on(hotspot);
14743
                  },
14744
                  onClose: function () {
14745
                    return Toggling.off(hotspot);
14746
                  }
14747
                });
14748
              }
14749
            }
14750
          }),
14751
          Keying.config({
14752
            mode: 'special',
14753
            onSpace: triggerExecute,
14754
            onEnter: triggerExecute,
14755
            onDown: function (comp, _se) {
14756
              if (Dropdown.isOpen(comp)) {
14757
                var sandbox = Coupling.getCoupled(comp, 'sandbox');
14758
                switchToMenu(sandbox);
14759
              } else {
14760
                Dropdown.open(comp);
14761
              }
14762
              return Optional.some(true);
14763
            },
14764
            onEscape: function (comp, _se) {
14765
              if (Dropdown.isOpen(comp)) {
14766
                Dropdown.close(comp);
14767
                return Optional.some(true);
14768
              } else {
14769
                return Optional.none();
14770
              }
14771
            }
14772
          }),
14773
          Focusing.config({})
14774
        ]),
637 daniel-mar 14775
        events: events$a(Optional.some(action)),
14776
        eventOrder: __assign(__assign({}, detail.eventOrder), (_a = {}, _a[execute$5()] = [
597 daniel-mar 14777
          'disabling',
14778
          'toggling',
14779
          'alloy.base.behaviour'
14780
        ], _a)),
14781
        apis: apis,
14782
        domModification: {
14783
          attributes: __assign(__assign({ 'aria-haspopup': 'true' }, detail.role.fold(function () {
14784
            return {};
14785
          }, function (role) {
14786
            return { role: role };
14787
          })), detail.dom.tag === 'button' ? { type: lookupAttr('type').getOr('button') } : {})
14788
        }
14789
      };
14790
    };
637 daniel-mar 14791
    var Dropdown = composite({
597 daniel-mar 14792
      name: 'Dropdown',
637 daniel-mar 14793
      configFields: schema$j(),
14794
      partFields: parts$d(),
14795
      factory: factory$g,
597 daniel-mar 14796
      apis: {
14797
        open: function (apis, comp) {
14798
          return apis.open(comp);
14799
        },
14800
        expand: function (apis, comp) {
14801
          return apis.expand(comp);
14802
        },
14803
        close: function (apis, comp) {
14804
          return apis.close(comp);
14805
        },
14806
        isOpen: function (apis, comp) {
14807
          return apis.isOpen(comp);
14808
        },
14809
        repositionMenus: function (apis, comp) {
14810
          return apis.repositionMenus(comp);
14811
        }
14812
      }
14813
    });
14814
 
637 daniel-mar 14815
    var exhibit$1 = function () {
14816
      return nu$7({
597 daniel-mar 14817
        styles: {
14818
          '-webkit-user-select': 'none',
14819
          'user-select': 'none',
14820
          '-ms-user-select': 'none',
14821
          '-moz-user-select': '-moz-none'
14822
        },
14823
        attributes: { unselectable: 'on' }
14824
      });
14825
    };
637 daniel-mar 14826
    var events$7 = function () {
14827
      return derive$2([abort(selectstart(), always)]);
597 daniel-mar 14828
    };
14829
 
14830
    var ActiveUnselecting = /*#__PURE__*/Object.freeze({
14831
        __proto__: null,
637 daniel-mar 14832
        events: events$7,
14833
        exhibit: exhibit$1
597 daniel-mar 14834
    });
14835
 
637 daniel-mar 14836
    var Unselecting = create$7({
597 daniel-mar 14837
      fields: [],
14838
      name: 'unselecting',
14839
      active: ActiveUnselecting
14840
    });
14841
 
14842
    var renderPanelButton = function (spec, sharedBackstage) {
14843
      return Dropdown.sketch({
14844
        dom: spec.dom,
14845
        components: spec.components,
14846
        toggleClass: 'mce-active',
14847
        dropdownBehaviours: derive$1([
14848
          DisablingConfigs.button(sharedBackstage.providers.isDisabled),
14849
          receivingConfig(),
14850
          Unselecting.config({}),
14851
          Tabstopping.config({})
14852
        ]),
14853
        layouts: spec.layouts,
14854
        sandboxClasses: ['tox-dialog__popups'],
14855
        lazySink: sharedBackstage.getSink,
14856
        fetch: function (comp) {
14857
          return Future.nu(function (callback) {
14858
            return spec.fetch(callback);
14859
          }).map(function (items) {
637 daniel-mar 14860
            return Optional.from(createTieredDataFrom(deepMerge(createPartialChoiceMenu(generate$6('menu-value'), items, function (value) {
597 daniel-mar 14861
              spec.onItemAction(comp, value);
14862
            }, spec.columns, spec.presets, ItemResponse$1.CLOSE_ON_EXECUTE, never, sharedBackstage.providers), { movement: deriveMenuMovement(spec.columns, spec.presets) })));
14863
          });
14864
        },
14865
        parts: { menu: part(false, 1, spec.presets) }
14866
      });
14867
    };
14868
 
637 daniel-mar 14869
    var colorInputChangeEvent = generate$6('color-input-change');
14870
    var colorSwatchChangeEvent = generate$6('color-swatch-change');
14871
    var colorPickerCancelEvent = generate$6('color-picker-cancel');
597 daniel-mar 14872
    var renderColorInput = function (spec, sharedBackstage, colorInputBackstage) {
14873
      var pField = FormField.parts.field({
14874
        factory: Input,
14875
        inputClasses: ['tox-textfield'],
14876
        onSetValue: function (c) {
14877
          return Invalidating.run(c).get(noop);
14878
        },
14879
        inputBehaviours: derive$1([
14880
          Disabling.config({ disabled: sharedBackstage.providers.isDisabled }),
14881
          receivingConfig(),
14882
          Tabstopping.config({}),
14883
          Invalidating.config({
14884
            invalidClass: 'tox-textbox-field-invalid',
14885
            getRoot: function (comp) {
14886
              return parent(comp.element);
14887
            },
14888
            notify: {
14889
              onValid: function (comp) {
14890
                var val = Representing.getValue(comp);
14891
                emitWith(comp, colorInputChangeEvent, { color: val });
14892
              }
14893
            },
14894
            validator: {
14895
              validateOnLoad: false,
14896
              validate: function (input) {
14897
                var inputValue = Representing.getValue(input);
14898
                if (inputValue.length === 0) {
14899
                  return Future.pure(Result.value(true));
14900
                } else {
14901
                  var span = SugarElement.fromTag('span');
679 daniel-mar 14902
                  set$7(span, 'background-color', inputValue);
597 daniel-mar 14903
                  var res = getRaw(span, 'background-color').fold(function () {
14904
                    return Result.error('blah');
14905
                  }, function (_) {
14906
                    return Result.value(inputValue);
14907
                  });
14908
                  return Future.pure(res);
14909
                }
14910
              }
14911
            }
14912
          })
14913
        ]),
14914
        selectOnFocus: false
14915
      });
14916
      var pLabel = spec.label.map(function (label) {
637 daniel-mar 14917
        return renderLabel$2(label, sharedBackstage.providers);
597 daniel-mar 14918
      });
14919
      var emitSwatchChange = function (colorBit, value) {
14920
        emitWith(colorBit, colorSwatchChangeEvent, { value: value });
14921
      };
14922
      var onItemAction = function (comp, value) {
14923
        memColorButton.getOpt(comp).each(function (colorBit) {
14924
          if (value === 'custom') {
14925
            colorInputBackstage.colorPicker(function (valueOpt) {
14926
              valueOpt.fold(function () {
14927
                return emit(colorBit, colorPickerCancelEvent);
14928
              }, function (value) {
14929
                emitSwatchChange(colorBit, value);
14930
                addColor(value);
14931
              });
14932
            }, '#ffffff');
14933
          } else if (value === 'remove') {
14934
            emitSwatchChange(colorBit, '');
14935
          } else {
14936
            emitSwatchChange(colorBit, value);
14937
          }
14938
        });
14939
      };
14940
      var memColorButton = record(renderPanelButton({
14941
        dom: {
14942
          tag: 'span',
14943
          attributes: { 'aria-label': sharedBackstage.providers.translate('Color swatch') }
14944
        },
14945
        layouts: {
14946
          onRtl: function () {
14947
            return [
637 daniel-mar 14948
              southwest$2,
14949
              southeast$2,
14950
              south$2
597 daniel-mar 14951
            ];
14952
          },
14953
          onLtr: function () {
14954
            return [
637 daniel-mar 14955
              southeast$2,
14956
              southwest$2,
14957
              south$2
597 daniel-mar 14958
            ];
14959
          }
14960
        },
14961
        components: [],
637 daniel-mar 14962
        fetch: getFetch$1(colorInputBackstage.getColors(), colorInputBackstage.hasCustomColors()),
597 daniel-mar 14963
        columns: colorInputBackstage.getColorCols(),
14964
        presets: 'color',
14965
        onItemAction: onItemAction
14966
      }, sharedBackstage));
14967
      return FormField.sketch({
14968
        dom: {
14969
          tag: 'div',
14970
          classes: ['tox-form__group']
14971
        },
14972
        components: pLabel.toArray().concat([{
14973
            dom: {
14974
              tag: 'div',
14975
              classes: ['tox-color-input']
14976
            },
14977
            components: [
14978
              pField,
14979
              memColorButton.asSpec()
14980
            ]
14981
          }]),
14982
        fieldBehaviours: derive$1([config('form-field-events', [
637 daniel-mar 14983
            run$1(colorInputChangeEvent, function (comp, se) {
597 daniel-mar 14984
              memColorButton.getOpt(comp).each(function (colorButton) {
679 daniel-mar 14985
                set$7(colorButton.element, 'background-color', se.event.color);
597 daniel-mar 14986
              });
14987
              emitWith(comp, formChangeEvent, { name: spec.name });
14988
            }),
637 daniel-mar 14989
            run$1(colorSwatchChangeEvent, function (comp, se) {
597 daniel-mar 14990
              FormField.getField(comp).each(function (field) {
14991
                Representing.setValue(field, se.event.value);
14992
                Composing.getCurrent(comp).each(Focusing.focus);
14993
              });
14994
            }),
637 daniel-mar 14995
            run$1(colorPickerCancelEvent, function (comp, _se) {
597 daniel-mar 14996
              FormField.getField(comp).each(function (_field) {
14997
                Composing.getCurrent(comp).each(Focusing.focus);
14998
              });
14999
            })
15000
          ])])
15001
      });
15002
    };
15003
 
15004
    var labelPart = optional({
637 daniel-mar 15005
      schema: [required$1('dom')],
597 daniel-mar 15006
      name: 'label'
15007
    });
15008
    var edgePart = function (name) {
15009
      return optional({
15010
        name: '' + name + '-edge',
15011
        overrides: function (detail) {
15012
          var action = detail.model.manager.edgeActions[name];
15013
          return action.fold(function () {
15014
            return {};
15015
          }, function (a) {
15016
            return {
637 daniel-mar 15017
              events: derive$2([
597 daniel-mar 15018
                runActionExtra(touchstart(), function (comp, se, d) {
15019
                  return a(comp, d);
15020
                }, [detail]),
15021
                runActionExtra(mousedown(), function (comp, se, d) {
15022
                  return a(comp, d);
15023
                }, [detail]),
15024
                runActionExtra(mousemove(), function (comp, se, det) {
15025
                  if (det.mouseIsDown.get()) {
15026
                    a(comp, det);
15027
                  }
15028
                }, [detail])
15029
              ])
15030
            };
15031
          });
15032
        }
15033
      });
15034
    };
15035
    var tlEdgePart = edgePart('top-left');
15036
    var tedgePart = edgePart('top');
15037
    var trEdgePart = edgePart('top-right');
15038
    var redgePart = edgePart('right');
15039
    var brEdgePart = edgePart('bottom-right');
15040
    var bedgePart = edgePart('bottom');
15041
    var blEdgePart = edgePart('bottom-left');
15042
    var ledgePart = edgePart('left');
15043
    var thumbPart = required({
15044
      name: 'thumb',
637 daniel-mar 15045
      defaults: constant$1({ dom: { styles: { position: 'absolute' } } }),
597 daniel-mar 15046
      overrides: function (detail) {
15047
        return {
637 daniel-mar 15048
          events: derive$2([
597 daniel-mar 15049
            redirectToPart(touchstart(), detail, 'spectrum'),
15050
            redirectToPart(touchmove(), detail, 'spectrum'),
15051
            redirectToPart(touchend(), detail, 'spectrum'),
15052
            redirectToPart(mousedown(), detail, 'spectrum'),
15053
            redirectToPart(mousemove(), detail, 'spectrum'),
15054
            redirectToPart(mouseup(), detail, 'spectrum')
15055
          ])
15056
        };
15057
      }
15058
    });
15059
    var spectrumPart = required({
637 daniel-mar 15060
      schema: [customField('mouseIsDown', function () {
597 daniel-mar 15061
          return Cell(false);
15062
        })],
15063
      name: 'spectrum',
15064
      overrides: function (detail) {
15065
        var modelDetail = detail.model;
15066
        var model = modelDetail.manager;
15067
        var setValueFrom = function (component, simulatedEvent) {
15068
          return model.getValueFromEvent(simulatedEvent).map(function (value) {
15069
            return model.setValueFrom(component, detail, value);
15070
          });
15071
        };
15072
        return {
15073
          behaviours: derive$1([
15074
            Keying.config({
15075
              mode: 'special',
15076
              onLeft: function (spectrum) {
15077
                return model.onLeft(spectrum, detail);
15078
              },
15079
              onRight: function (spectrum) {
15080
                return model.onRight(spectrum, detail);
15081
              },
15082
              onUp: function (spectrum) {
15083
                return model.onUp(spectrum, detail);
15084
              },
15085
              onDown: function (spectrum) {
15086
                return model.onDown(spectrum, detail);
15087
              }
15088
            }),
15089
            Focusing.config({})
15090
          ]),
637 daniel-mar 15091
          events: derive$2([
15092
            run$1(touchstart(), setValueFrom),
15093
            run$1(touchmove(), setValueFrom),
15094
            run$1(mousedown(), setValueFrom),
15095
            run$1(mousemove(), function (spectrum, se) {
597 daniel-mar 15096
              if (detail.mouseIsDown.get()) {
15097
                setValueFrom(spectrum, se);
15098
              }
15099
            })
15100
          ])
15101
        };
15102
      }
15103
    });
15104
    var SliderParts = [
15105
      labelPart,
15106
      ledgePart,
15107
      redgePart,
15108
      tedgePart,
15109
      bedgePart,
15110
      tlEdgePart,
15111
      trEdgePart,
15112
      blEdgePart,
15113
      brEdgePart,
15114
      thumbPart,
15115
      spectrumPart
15116
    ];
15117
 
15118
    var _sliderChangeEvent = 'slider.change.value';
637 daniel-mar 15119
    var sliderChangeEvent = constant$1(_sliderChangeEvent);
679 daniel-mar 15120
    var isTouchEvent$2 = function (evt) {
597 daniel-mar 15121
      return evt.type.indexOf('touch') !== -1;
15122
    };
15123
    var getEventSource = function (simulatedEvent) {
15124
      var evt = simulatedEvent.event.raw;
679 daniel-mar 15125
      if (isTouchEvent$2(evt)) {
597 daniel-mar 15126
        var touchEvent = evt;
15127
        return touchEvent.touches !== undefined && touchEvent.touches.length === 1 ? Optional.some(touchEvent.touches[0]).map(function (t) {
15128
          return SugarPosition(t.clientX, t.clientY);
15129
        }) : Optional.none();
15130
      } else {
15131
        var mouseEvent = evt;
15132
        return mouseEvent.clientX !== undefined ? Optional.some(mouseEvent).map(function (me) {
15133
          return SugarPosition(me.clientX, me.clientY);
15134
        }) : Optional.none();
15135
      }
15136
    };
15137
 
637 daniel-mar 15138
    var t = 'top', r = 'right', b = 'bottom', l = 'left';
597 daniel-mar 15139
    var minX = function (detail) {
15140
      return detail.model.minX;
15141
    };
15142
    var minY = function (detail) {
15143
      return detail.model.minY;
15144
    };
15145
    var min1X = function (detail) {
15146
      return detail.model.minX - 1;
15147
    };
15148
    var min1Y = function (detail) {
15149
      return detail.model.minY - 1;
15150
    };
15151
    var maxX = function (detail) {
15152
      return detail.model.maxX;
15153
    };
15154
    var maxY = function (detail) {
15155
      return detail.model.maxY;
15156
    };
15157
    var max1X = function (detail) {
15158
      return detail.model.maxX + 1;
15159
    };
15160
    var max1Y = function (detail) {
15161
      return detail.model.maxY + 1;
15162
    };
637 daniel-mar 15163
    var range = function (detail, max, min) {
597 daniel-mar 15164
      return max(detail) - min(detail);
15165
    };
15166
    var xRange = function (detail) {
637 daniel-mar 15167
      return range(detail, maxX, minX);
597 daniel-mar 15168
    };
15169
    var yRange = function (detail) {
637 daniel-mar 15170
      return range(detail, maxY, minY);
597 daniel-mar 15171
    };
15172
    var halfX = function (detail) {
15173
      return xRange(detail) / 2;
15174
    };
15175
    var halfY = function (detail) {
15176
      return yRange(detail) / 2;
15177
    };
15178
    var step = function (detail) {
15179
      return detail.stepSize;
15180
    };
15181
    var snap = function (detail) {
15182
      return detail.snapToGrid;
15183
    };
15184
    var snapStart = function (detail) {
15185
      return detail.snapStart;
15186
    };
15187
    var rounded = function (detail) {
15188
      return detail.rounded;
15189
    };
15190
    var hasEdge = function (detail, edgeName) {
15191
      return detail[edgeName + '-edge'] !== undefined;
15192
    };
15193
    var hasLEdge = function (detail) {
15194
      return hasEdge(detail, l);
15195
    };
15196
    var hasREdge = function (detail) {
637 daniel-mar 15197
      return hasEdge(detail, r);
597 daniel-mar 15198
    };
15199
    var hasTEdge = function (detail) {
15200
      return hasEdge(detail, t);
15201
    };
15202
    var hasBEdge = function (detail) {
15203
      return hasEdge(detail, b);
15204
    };
15205
    var currentValue = function (detail) {
15206
      return detail.model.value.get();
15207
    };
15208
 
15209
    var xValue = function (x) {
15210
      return { x: x };
15211
    };
15212
    var yValue = function (y) {
15213
      return { y: y };
15214
    };
15215
    var xyValue = function (x, y) {
15216
      return {
15217
        x: x,
15218
        y: y
15219
      };
15220
    };
637 daniel-mar 15221
    var fireSliderChange$3 = function (component, value) {
597 daniel-mar 15222
      emitWith(component, sliderChangeEvent(), { value: value });
15223
    };
15224
    var setToTLEdgeXY = function (edge, detail) {
637 daniel-mar 15225
      fireSliderChange$3(edge, xyValue(min1X(detail), min1Y(detail)));
597 daniel-mar 15226
    };
15227
    var setToTEdge = function (edge, detail) {
637 daniel-mar 15228
      fireSliderChange$3(edge, yValue(min1Y(detail)));
597 daniel-mar 15229
    };
15230
    var setToTEdgeXY = function (edge, detail) {
637 daniel-mar 15231
      fireSliderChange$3(edge, xyValue(halfX(detail), min1Y(detail)));
597 daniel-mar 15232
    };
15233
    var setToTREdgeXY = function (edge, detail) {
637 daniel-mar 15234
      fireSliderChange$3(edge, xyValue(max1X(detail), min1Y(detail)));
597 daniel-mar 15235
    };
15236
    var setToREdge = function (edge, detail) {
637 daniel-mar 15237
      fireSliderChange$3(edge, xValue(max1X(detail)));
597 daniel-mar 15238
    };
15239
    var setToREdgeXY = function (edge, detail) {
637 daniel-mar 15240
      fireSliderChange$3(edge, xyValue(max1X(detail), halfY(detail)));
597 daniel-mar 15241
    };
15242
    var setToBREdgeXY = function (edge, detail) {
637 daniel-mar 15243
      fireSliderChange$3(edge, xyValue(max1X(detail), max1Y(detail)));
597 daniel-mar 15244
    };
15245
    var setToBEdge = function (edge, detail) {
637 daniel-mar 15246
      fireSliderChange$3(edge, yValue(max1Y(detail)));
597 daniel-mar 15247
    };
15248
    var setToBEdgeXY = function (edge, detail) {
637 daniel-mar 15249
      fireSliderChange$3(edge, xyValue(halfX(detail), max1Y(detail)));
597 daniel-mar 15250
    };
15251
    var setToBLEdgeXY = function (edge, detail) {
637 daniel-mar 15252
      fireSliderChange$3(edge, xyValue(min1X(detail), max1Y(detail)));
597 daniel-mar 15253
    };
15254
    var setToLEdge = function (edge, detail) {
637 daniel-mar 15255
      fireSliderChange$3(edge, xValue(min1X(detail)));
597 daniel-mar 15256
    };
15257
    var setToLEdgeXY = function (edge, detail) {
637 daniel-mar 15258
      fireSliderChange$3(edge, xyValue(min1X(detail), halfY(detail)));
597 daniel-mar 15259
    };
15260
 
15261
    var reduceBy = function (value, min, max, step) {
15262
      if (value < min) {
15263
        return value;
15264
      } else if (value > max) {
15265
        return max;
15266
      } else if (value === min) {
15267
        return min - 1;
15268
      } else {
15269
        return Math.max(min, value - step);
15270
      }
15271
    };
15272
    var increaseBy = function (value, min, max, step) {
15273
      if (value > max) {
15274
        return value;
15275
      } else if (value < min) {
15276
        return min;
15277
      } else if (value === max) {
15278
        return max + 1;
15279
      } else {
15280
        return Math.min(max, value + step);
15281
      }
15282
    };
15283
    var capValue = function (value, min, max) {
15284
      return Math.max(min, Math.min(max, value));
15285
    };
15286
    var snapValueOf = function (value, min, max, step, snapStart) {
15287
      return snapStart.fold(function () {
15288
        var initValue = value - min;
15289
        var extraValue = Math.round(initValue / step) * step;
15290
        return capValue(min + extraValue, min - 1, max + 1);
15291
      }, function (start) {
15292
        var remainder = (value - start) % step;
15293
        var adjustment = Math.round(remainder / step);
15294
        var rawSteps = Math.floor((value - start) / step);
15295
        var maxSteps = Math.floor((max - start) / step);
15296
        var numSteps = Math.min(maxSteps, rawSteps + adjustment);
15297
        var r = start + numSteps * step;
15298
        return Math.max(start, r);
15299
      });
15300
    };
15301
    var findOffsetOf = function (value, min, max) {
15302
      return Math.min(max, Math.max(value, min)) - min;
15303
    };
15304
    var findValueOf = function (args) {
15305
      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;
15306
      var capMin = hasMinEdge ? min - 1 : min;
15307
      var capMax = hasMaxEdge ? max + 1 : max;
15308
      if (value < minBound) {
15309
        return capMin;
15310
      } else if (value > maxBound) {
15311
        return capMax;
15312
      } else {
15313
        var offset = findOffsetOf(value, minBound, maxBound);
15314
        var newValue = capValue(offset / screenRange * range + min, capMin, capMax);
15315
        if (snap && newValue >= min && newValue <= max) {
15316
          return snapValueOf(newValue, min, max, step, snapStart);
15317
        } else if (rounded) {
15318
          return Math.round(newValue);
15319
        } else {
15320
          return newValue;
15321
        }
15322
      }
15323
    };
637 daniel-mar 15324
    var findOffsetOfValue$2 = function (args) {
597 daniel-mar 15325
      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;
15326
      if (value < min) {
15327
        return hasMinEdge ? 0 : centerMinEdge;
15328
      } else if (value > max) {
15329
        return hasMaxEdge ? maxBound : centerMaxEdge;
15330
      } else {
15331
        return (value - min) / range * maxOffset;
15332
      }
15333
    };
15334
 
15335
    var top = 'top', right = 'right', bottom = 'bottom', left = 'left', width = 'width', height = 'height';
637 daniel-mar 15336
    var getBounds = function (component) {
597 daniel-mar 15337
      return component.element.dom.getBoundingClientRect();
15338
    };
15339
    var getBoundsProperty = function (bounds, property) {
15340
      return bounds[property];
15341
    };
15342
    var getMinXBounds = function (component) {
637 daniel-mar 15343
      var bounds = getBounds(component);
597 daniel-mar 15344
      return getBoundsProperty(bounds, left);
15345
    };
15346
    var getMaxXBounds = function (component) {
637 daniel-mar 15347
      var bounds = getBounds(component);
597 daniel-mar 15348
      return getBoundsProperty(bounds, right);
15349
    };
15350
    var getMinYBounds = function (component) {
637 daniel-mar 15351
      var bounds = getBounds(component);
597 daniel-mar 15352
      return getBoundsProperty(bounds, top);
15353
    };
15354
    var getMaxYBounds = function (component) {
637 daniel-mar 15355
      var bounds = getBounds(component);
597 daniel-mar 15356
      return getBoundsProperty(bounds, bottom);
15357
    };
15358
    var getXScreenRange = function (component) {
637 daniel-mar 15359
      var bounds = getBounds(component);
597 daniel-mar 15360
      return getBoundsProperty(bounds, width);
15361
    };
15362
    var getYScreenRange = function (component) {
637 daniel-mar 15363
      var bounds = getBounds(component);
597 daniel-mar 15364
      return getBoundsProperty(bounds, height);
15365
    };
15366
    var getCenterOffsetOf = function (componentMinEdge, componentMaxEdge, spectrumMinEdge) {
15367
      return (componentMinEdge + componentMaxEdge) / 2 - spectrumMinEdge;
15368
    };
15369
    var getXCenterOffSetOf = function (component, spectrum) {
637 daniel-mar 15370
      var componentBounds = getBounds(component);
15371
      var spectrumBounds = getBounds(spectrum);
597 daniel-mar 15372
      var componentMinEdge = getBoundsProperty(componentBounds, left);
15373
      var componentMaxEdge = getBoundsProperty(componentBounds, right);
15374
      var spectrumMinEdge = getBoundsProperty(spectrumBounds, left);
15375
      return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge);
15376
    };
15377
    var getYCenterOffSetOf = function (component, spectrum) {
637 daniel-mar 15378
      var componentBounds = getBounds(component);
15379
      var spectrumBounds = getBounds(spectrum);
597 daniel-mar 15380
      var componentMinEdge = getBoundsProperty(componentBounds, top);
15381
      var componentMaxEdge = getBoundsProperty(componentBounds, bottom);
15382
      var spectrumMinEdge = getBoundsProperty(spectrumBounds, top);
15383
      return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge);
15384
    };
15385
 
637 daniel-mar 15386
    var fireSliderChange$2 = function (spectrum, value) {
597 daniel-mar 15387
      emitWith(spectrum, sliderChangeEvent(), { value: value });
15388
    };
637 daniel-mar 15389
    var sliderValue$2 = function (x) {
597 daniel-mar 15390
      return { x: x };
15391
    };
637 daniel-mar 15392
    var findValueOfOffset$1 = function (spectrum, detail, left) {
597 daniel-mar 15393
      var args = {
15394
        min: minX(detail),
15395
        max: maxX(detail),
15396
        range: xRange(detail),
15397
        value: left,
15398
        step: step(detail),
15399
        snap: snap(detail),
15400
        snapStart: snapStart(detail),
15401
        rounded: rounded(detail),
15402
        hasMinEdge: hasLEdge(detail),
15403
        hasMaxEdge: hasREdge(detail),
15404
        minBound: getMinXBounds(spectrum),
15405
        maxBound: getMaxXBounds(spectrum),
15406
        screenRange: getXScreenRange(spectrum)
15407
      };
15408
      return findValueOf(args);
15409
    };
637 daniel-mar 15410
    var setValueFrom$2 = function (spectrum, detail, value) {
15411
      var xValue = findValueOfOffset$1(spectrum, detail, value);
15412
      var sliderVal = sliderValue$2(xValue);
15413
      fireSliderChange$2(spectrum, sliderVal);
597 daniel-mar 15414
      return xValue;
15415
    };
637 daniel-mar 15416
    var setToMin$2 = function (spectrum, detail) {
597 daniel-mar 15417
      var min = minX(detail);
637 daniel-mar 15418
      fireSliderChange$2(spectrum, sliderValue$2(min));
597 daniel-mar 15419
    };
637 daniel-mar 15420
    var setToMax$2 = function (spectrum, detail) {
597 daniel-mar 15421
      var max = maxX(detail);
637 daniel-mar 15422
      fireSliderChange$2(spectrum, sliderValue$2(max));
597 daniel-mar 15423
    };
637 daniel-mar 15424
    var moveBy$2 = function (direction, spectrum, detail) {
597 daniel-mar 15425
      var f = direction > 0 ? increaseBy : reduceBy;
15426
      var xValue = f(currentValue(detail).x, minX(detail), maxX(detail), step(detail));
637 daniel-mar 15427
      fireSliderChange$2(spectrum, sliderValue$2(xValue));
597 daniel-mar 15428
      return Optional.some(xValue);
15429
    };
637 daniel-mar 15430
    var handleMovement$2 = function (direction) {
597 daniel-mar 15431
      return function (spectrum, detail) {
637 daniel-mar 15432
        return moveBy$2(direction, spectrum, detail).map(always);
597 daniel-mar 15433
      };
15434
    };
637 daniel-mar 15435
    var getValueFromEvent$2 = function (simulatedEvent) {
597 daniel-mar 15436
      var pos = getEventSource(simulatedEvent);
15437
      return pos.map(function (p) {
15438
        return p.left;
15439
      });
15440
    };
15441
    var findOffsetOfValue$1 = function (spectrum, detail, value, minEdge, maxEdge) {
15442
      var minOffset = 0;
15443
      var maxOffset = getXScreenRange(spectrum);
15444
      var centerMinEdge = minEdge.bind(function (edge) {
15445
        return Optional.some(getXCenterOffSetOf(edge, spectrum));
15446
      }).getOr(minOffset);
15447
      var centerMaxEdge = maxEdge.bind(function (edge) {
15448
        return Optional.some(getXCenterOffSetOf(edge, spectrum));
15449
      }).getOr(maxOffset);
15450
      var args = {
15451
        min: minX(detail),
15452
        max: maxX(detail),
15453
        range: xRange(detail),
15454
        value: value,
15455
        hasMinEdge: hasLEdge(detail),
15456
        hasMaxEdge: hasREdge(detail),
15457
        minBound: getMinXBounds(spectrum),
15458
        minOffset: minOffset,
15459
        maxBound: getMaxXBounds(spectrum),
15460
        maxOffset: maxOffset,
15461
        centerMinEdge: centerMinEdge,
15462
        centerMaxEdge: centerMaxEdge
15463
      };
637 daniel-mar 15464
      return findOffsetOfValue$2(args);
597 daniel-mar 15465
    };
637 daniel-mar 15466
    var findPositionOfValue$1 = function (slider, spectrum, value, minEdge, maxEdge, detail) {
597 daniel-mar 15467
      var offset = findOffsetOfValue$1(spectrum, detail, value, minEdge, maxEdge);
15468
      return getMinXBounds(spectrum) - getMinXBounds(slider) + offset;
15469
    };
637 daniel-mar 15470
    var setPositionFromValue$2 = function (slider, thumb, detail, edges) {
597 daniel-mar 15471
      var value = currentValue(detail);
637 daniel-mar 15472
      var pos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.x, edges.getLeftEdge(slider), edges.getRightEdge(slider), detail);
679 daniel-mar 15473
      var thumbRadius = get$a(thumb.element) / 2;
15474
      set$7(thumb.element, 'left', pos - thumbRadius + 'px');
597 daniel-mar 15475
    };
637 daniel-mar 15476
    var onLeft$2 = handleMovement$2(-1);
15477
    var onRight$2 = handleMovement$2(1);
15478
    var onUp$2 = Optional.none;
15479
    var onDown$2 = Optional.none;
15480
    var edgeActions$2 = {
597 daniel-mar 15481
      'top-left': Optional.none(),
15482
      'top': Optional.none(),
15483
      'top-right': Optional.none(),
15484
      'right': Optional.some(setToREdge),
15485
      'bottom-right': Optional.none(),
15486
      'bottom': Optional.none(),
15487
      'bottom-left': Optional.none(),
15488
      'left': Optional.some(setToLEdge)
15489
    };
15490
 
15491
    var HorizontalModel = /*#__PURE__*/Object.freeze({
15492
        __proto__: null,
637 daniel-mar 15493
        setValueFrom: setValueFrom$2,
15494
        setToMin: setToMin$2,
15495
        setToMax: setToMax$2,
15496
        findValueOfOffset: findValueOfOffset$1,
15497
        getValueFromEvent: getValueFromEvent$2,
15498
        findPositionOfValue: findPositionOfValue$1,
15499
        setPositionFromValue: setPositionFromValue$2,
15500
        onLeft: onLeft$2,
15501
        onRight: onRight$2,
15502
        onUp: onUp$2,
15503
        onDown: onDown$2,
15504
        edgeActions: edgeActions$2
597 daniel-mar 15505
    });
15506
 
637 daniel-mar 15507
    var fireSliderChange$1 = function (spectrum, value) {
597 daniel-mar 15508
      emitWith(spectrum, sliderChangeEvent(), { value: value });
15509
    };
15510
    var sliderValue$1 = function (y) {
15511
      return { y: y };
15512
    };
637 daniel-mar 15513
    var findValueOfOffset = function (spectrum, detail, top) {
597 daniel-mar 15514
      var args = {
15515
        min: minY(detail),
15516
        max: maxY(detail),
15517
        range: yRange(detail),
15518
        value: top,
15519
        step: step(detail),
15520
        snap: snap(detail),
15521
        snapStart: snapStart(detail),
15522
        rounded: rounded(detail),
15523
        hasMinEdge: hasTEdge(detail),
15524
        hasMaxEdge: hasBEdge(detail),
15525
        minBound: getMinYBounds(spectrum),
15526
        maxBound: getMaxYBounds(spectrum),
15527
        screenRange: getYScreenRange(spectrum)
15528
      };
15529
      return findValueOf(args);
15530
    };
15531
    var setValueFrom$1 = function (spectrum, detail, value) {
637 daniel-mar 15532
      var yValue = findValueOfOffset(spectrum, detail, value);
597 daniel-mar 15533
      var sliderVal = sliderValue$1(yValue);
637 daniel-mar 15534
      fireSliderChange$1(spectrum, sliderVal);
597 daniel-mar 15535
      return yValue;
15536
    };
15537
    var setToMin$1 = function (spectrum, detail) {
15538
      var min = minY(detail);
637 daniel-mar 15539
      fireSliderChange$1(spectrum, sliderValue$1(min));
597 daniel-mar 15540
    };
15541
    var setToMax$1 = function (spectrum, detail) {
15542
      var max = maxY(detail);
637 daniel-mar 15543
      fireSliderChange$1(spectrum, sliderValue$1(max));
597 daniel-mar 15544
    };
15545
    var moveBy$1 = function (direction, spectrum, detail) {
15546
      var f = direction > 0 ? increaseBy : reduceBy;
15547
      var yValue = f(currentValue(detail).y, minY(detail), maxY(detail), step(detail));
637 daniel-mar 15548
      fireSliderChange$1(spectrum, sliderValue$1(yValue));
597 daniel-mar 15549
      return Optional.some(yValue);
15550
    };
15551
    var handleMovement$1 = function (direction) {
15552
      return function (spectrum, detail) {
15553
        return moveBy$1(direction, spectrum, detail).map(always);
15554
      };
15555
    };
15556
    var getValueFromEvent$1 = function (simulatedEvent) {
15557
      var pos = getEventSource(simulatedEvent);
15558
      return pos.map(function (p) {
15559
        return p.top;
15560
      });
15561
    };
637 daniel-mar 15562
    var findOffsetOfValue = function (spectrum, detail, value, minEdge, maxEdge) {
597 daniel-mar 15563
      var minOffset = 0;
15564
      var maxOffset = getYScreenRange(spectrum);
15565
      var centerMinEdge = minEdge.bind(function (edge) {
15566
        return Optional.some(getYCenterOffSetOf(edge, spectrum));
15567
      }).getOr(minOffset);
15568
      var centerMaxEdge = maxEdge.bind(function (edge) {
15569
        return Optional.some(getYCenterOffSetOf(edge, spectrum));
15570
      }).getOr(maxOffset);
15571
      var args = {
15572
        min: minY(detail),
15573
        max: maxY(detail),
15574
        range: yRange(detail),
15575
        value: value,
15576
        hasMinEdge: hasTEdge(detail),
15577
        hasMaxEdge: hasBEdge(detail),
15578
        minBound: getMinYBounds(spectrum),
15579
        minOffset: minOffset,
15580
        maxBound: getMaxYBounds(spectrum),
15581
        maxOffset: maxOffset,
15582
        centerMinEdge: centerMinEdge,
15583
        centerMaxEdge: centerMaxEdge
15584
      };
637 daniel-mar 15585
      return findOffsetOfValue$2(args);
597 daniel-mar 15586
    };
637 daniel-mar 15587
    var findPositionOfValue = function (slider, spectrum, value, minEdge, maxEdge, detail) {
15588
      var offset = findOffsetOfValue(spectrum, detail, value, minEdge, maxEdge);
597 daniel-mar 15589
      return getMinYBounds(spectrum) - getMinYBounds(slider) + offset;
15590
    };
15591
    var setPositionFromValue$1 = function (slider, thumb, detail, edges) {
15592
      var value = currentValue(detail);
637 daniel-mar 15593
      var pos = findPositionOfValue(slider, edges.getSpectrum(slider), value.y, edges.getTopEdge(slider), edges.getBottomEdge(slider), detail);
679 daniel-mar 15594
      var thumbRadius = get$b(thumb.element) / 2;
15595
      set$7(thumb.element, 'top', pos - thumbRadius + 'px');
597 daniel-mar 15596
    };
15597
    var onLeft$1 = Optional.none;
15598
    var onRight$1 = Optional.none;
15599
    var onUp$1 = handleMovement$1(-1);
15600
    var onDown$1 = handleMovement$1(1);
15601
    var edgeActions$1 = {
15602
      'top-left': Optional.none(),
15603
      'top': Optional.some(setToTEdge),
15604
      'top-right': Optional.none(),
15605
      'right': Optional.none(),
15606
      'bottom-right': Optional.none(),
15607
      'bottom': Optional.some(setToBEdge),
15608
      'bottom-left': Optional.none(),
15609
      'left': Optional.none()
15610
    };
15611
 
15612
    var VerticalModel = /*#__PURE__*/Object.freeze({
15613
        __proto__: null,
15614
        setValueFrom: setValueFrom$1,
15615
        setToMin: setToMin$1,
15616
        setToMax: setToMax$1,
637 daniel-mar 15617
        findValueOfOffset: findValueOfOffset,
597 daniel-mar 15618
        getValueFromEvent: getValueFromEvent$1,
637 daniel-mar 15619
        findPositionOfValue: findPositionOfValue,
597 daniel-mar 15620
        setPositionFromValue: setPositionFromValue$1,
15621
        onLeft: onLeft$1,
15622
        onRight: onRight$1,
15623
        onUp: onUp$1,
15624
        onDown: onDown$1,
15625
        edgeActions: edgeActions$1
15626
    });
15627
 
637 daniel-mar 15628
    var fireSliderChange = function (spectrum, value) {
597 daniel-mar 15629
      emitWith(spectrum, sliderChangeEvent(), { value: value });
15630
    };
637 daniel-mar 15631
    var sliderValue = function (x, y) {
597 daniel-mar 15632
      return {
15633
        x: x,
15634
        y: y
15635
      };
15636
    };
637 daniel-mar 15637
    var setValueFrom = function (spectrum, detail, value) {
15638
      var xValue = findValueOfOffset$1(spectrum, detail, value.left);
15639
      var yValue = findValueOfOffset(spectrum, detail, value.top);
15640
      var val = sliderValue(xValue, yValue);
15641
      fireSliderChange(spectrum, val);
597 daniel-mar 15642
      return val;
15643
    };
637 daniel-mar 15644
    var moveBy = function (direction, isVerticalMovement, spectrum, detail) {
597 daniel-mar 15645
      var f = direction > 0 ? increaseBy : reduceBy;
15646
      var xValue = isVerticalMovement ? currentValue(detail).x : f(currentValue(detail).x, minX(detail), maxX(detail), step(detail));
15647
      var yValue = !isVerticalMovement ? currentValue(detail).y : f(currentValue(detail).y, minY(detail), maxY(detail), step(detail));
637 daniel-mar 15648
      fireSliderChange(spectrum, sliderValue(xValue, yValue));
597 daniel-mar 15649
      return Optional.some(xValue);
15650
    };
637 daniel-mar 15651
    var handleMovement = function (direction, isVerticalMovement) {
597 daniel-mar 15652
      return function (spectrum, detail) {
637 daniel-mar 15653
        return moveBy(direction, isVerticalMovement, spectrum, detail).map(always);
597 daniel-mar 15654
      };
15655
    };
637 daniel-mar 15656
    var setToMin = function (spectrum, detail) {
597 daniel-mar 15657
      var mX = minX(detail);
15658
      var mY = minY(detail);
637 daniel-mar 15659
      fireSliderChange(spectrum, sliderValue(mX, mY));
597 daniel-mar 15660
    };
637 daniel-mar 15661
    var setToMax = function (spectrum, detail) {
597 daniel-mar 15662
      var mX = maxX(detail);
15663
      var mY = maxY(detail);
637 daniel-mar 15664
      fireSliderChange(spectrum, sliderValue(mX, mY));
597 daniel-mar 15665
    };
637 daniel-mar 15666
    var getValueFromEvent = function (simulatedEvent) {
597 daniel-mar 15667
      return getEventSource(simulatedEvent);
15668
    };
637 daniel-mar 15669
    var setPositionFromValue = function (slider, thumb, detail, edges) {
597 daniel-mar 15670
      var value = currentValue(detail);
637 daniel-mar 15671
      var xPos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.x, edges.getLeftEdge(slider), edges.getRightEdge(slider), detail);
15672
      var yPos = findPositionOfValue(slider, edges.getSpectrum(slider), value.y, edges.getTopEdge(slider), edges.getBottomEdge(slider), detail);
679 daniel-mar 15673
      var thumbXRadius = get$a(thumb.element) / 2;
15674
      var thumbYRadius = get$b(thumb.element) / 2;
15675
      set$7(thumb.element, 'left', xPos - thumbXRadius + 'px');
15676
      set$7(thumb.element, 'top', yPos - thumbYRadius + 'px');
597 daniel-mar 15677
    };
637 daniel-mar 15678
    var onLeft = handleMovement(-1, false);
15679
    var onRight = handleMovement(1, false);
15680
    var onUp = handleMovement(-1, true);
15681
    var onDown = handleMovement(1, true);
15682
    var edgeActions = {
597 daniel-mar 15683
      'top-left': Optional.some(setToTLEdgeXY),
15684
      'top': Optional.some(setToTEdgeXY),
15685
      'top-right': Optional.some(setToTREdgeXY),
15686
      'right': Optional.some(setToREdgeXY),
15687
      'bottom-right': Optional.some(setToBREdgeXY),
15688
      'bottom': Optional.some(setToBEdgeXY),
15689
      'bottom-left': Optional.some(setToBLEdgeXY),
15690
      'left': Optional.some(setToLEdgeXY)
15691
    };
15692
 
15693
    var TwoDModel = /*#__PURE__*/Object.freeze({
15694
        __proto__: null,
637 daniel-mar 15695
        setValueFrom: setValueFrom,
15696
        setToMin: setToMin,
15697
        setToMax: setToMax,
15698
        getValueFromEvent: getValueFromEvent,
15699
        setPositionFromValue: setPositionFromValue,
15700
        onLeft: onLeft,
15701
        onRight: onRight,
15702
        onUp: onUp,
15703
        onDown: onDown,
15704
        edgeActions: edgeActions
597 daniel-mar 15705
    });
15706
 
15707
    var SliderSchema = [
637 daniel-mar 15708
      defaulted('stepSize', 1),
15709
      defaulted('onChange', noop),
15710
      defaulted('onChoose', noop),
15711
      defaulted('onInit', noop),
15712
      defaulted('onDragStart', noop),
15713
      defaulted('onDragEnd', noop),
15714
      defaulted('snapToGrid', false),
15715
      defaulted('rounded', true),
597 daniel-mar 15716
      option('snapStart'),
637 daniel-mar 15717
      requiredOf('model', choose$1('mode', {
597 daniel-mar 15718
        x: [
637 daniel-mar 15719
          defaulted('minX', 0),
15720
          defaulted('maxX', 100),
15721
          customField('value', function (spec) {
597 daniel-mar 15722
            return Cell(spec.mode.minX);
15723
          }),
637 daniel-mar 15724
          required$1('getInitialValue'),
15725
          output$1('manager', HorizontalModel)
597 daniel-mar 15726
        ],
15727
        y: [
637 daniel-mar 15728
          defaulted('minY', 0),
15729
          defaulted('maxY', 100),
15730
          customField('value', function (spec) {
597 daniel-mar 15731
            return Cell(spec.mode.minY);
15732
          }),
637 daniel-mar 15733
          required$1('getInitialValue'),
15734
          output$1('manager', VerticalModel)
597 daniel-mar 15735
        ],
15736
        xy: [
637 daniel-mar 15737
          defaulted('minX', 0),
15738
          defaulted('maxX', 100),
15739
          defaulted('minY', 0),
15740
          defaulted('maxY', 100),
15741
          customField('value', function (spec) {
597 daniel-mar 15742
            return Cell({
15743
              x: spec.mode.minX,
15744
              y: spec.mode.minY
15745
            });
15746
          }),
637 daniel-mar 15747
          required$1('getInitialValue'),
15748
          output$1('manager', TwoDModel)
597 daniel-mar 15749
        ]
15750
      })),
637 daniel-mar 15751
      field('sliderBehaviours', [
597 daniel-mar 15752
        Keying,
15753
        Representing
15754
      ]),
637 daniel-mar 15755
      customField('mouseIsDown', function () {
597 daniel-mar 15756
        return Cell(false);
15757
      })
15758
    ];
15759
 
637 daniel-mar 15760
    var sketch$2 = function (detail, components, _spec, _externals) {
597 daniel-mar 15761
      var _a;
15762
      var getThumb = function (component) {
15763
        return getPartOrDie(component, detail, 'thumb');
15764
      };
15765
      var getSpectrum = function (component) {
15766
        return getPartOrDie(component, detail, 'spectrum');
15767
      };
15768
      var getLeftEdge = function (component) {
15769
        return getPart(component, detail, 'left-edge');
15770
      };
15771
      var getRightEdge = function (component) {
15772
        return getPart(component, detail, 'right-edge');
15773
      };
15774
      var getTopEdge = function (component) {
15775
        return getPart(component, detail, 'top-edge');
15776
      };
15777
      var getBottomEdge = function (component) {
15778
        return getPart(component, detail, 'bottom-edge');
15779
      };
15780
      var modelDetail = detail.model;
15781
      var model = modelDetail.manager;
15782
      var refresh = function (slider, thumb) {
15783
        model.setPositionFromValue(slider, thumb, detail, {
15784
          getLeftEdge: getLeftEdge,
15785
          getRightEdge: getRightEdge,
15786
          getTopEdge: getTopEdge,
15787
          getBottomEdge: getBottomEdge,
15788
          getSpectrum: getSpectrum
15789
        });
15790
      };
15791
      var setValue = function (slider, newValue) {
15792
        modelDetail.value.set(newValue);
15793
        var thumb = getThumb(slider);
15794
        refresh(slider, thumb);
15795
      };
15796
      var changeValue = function (slider, newValue) {
15797
        setValue(slider, newValue);
15798
        var thumb = getThumb(slider);
15799
        detail.onChange(slider, thumb, newValue);
15800
        return Optional.some(true);
15801
      };
15802
      var resetToMin = function (slider) {
15803
        model.setToMin(slider, detail);
15804
      };
15805
      var resetToMax = function (slider) {
15806
        model.setToMax(slider, detail);
15807
      };
15808
      var choose = function (slider) {
15809
        var fireOnChoose = function () {
15810
          getPart(slider, detail, 'thumb').each(function (thumb) {
15811
            var value = modelDetail.value.get();
15812
            detail.onChoose(slider, thumb, value);
15813
          });
15814
        };
15815
        var wasDown = detail.mouseIsDown.get();
15816
        detail.mouseIsDown.set(false);
15817
        if (wasDown) {
15818
          fireOnChoose();
15819
        }
15820
      };
15821
      var onDragStart = function (slider, simulatedEvent) {
15822
        simulatedEvent.stop();
15823
        detail.mouseIsDown.set(true);
15824
        detail.onDragStart(slider, getThumb(slider));
15825
      };
15826
      var onDragEnd = function (slider, simulatedEvent) {
15827
        simulatedEvent.stop();
15828
        detail.onDragEnd(slider, getThumb(slider));
15829
        choose(slider);
15830
      };
15831
      return {
15832
        uid: detail.uid,
15833
        dom: detail.dom,
15834
        components: components,
15835
        behaviours: augment(detail.sliderBehaviours, [
15836
          Keying.config({
15837
            mode: 'special',
15838
            focusIn: function (slider) {
15839
              return getPart(slider, detail, 'spectrum').map(Keying.focusIn).map(always);
15840
            }
15841
          }),
15842
          Representing.config({
15843
            store: {
15844
              mode: 'manual',
15845
              getValue: function (_) {
15846
                return modelDetail.value.get();
15847
              }
15848
            }
15849
          }),
15850
          Receiving.config({ channels: (_a = {}, _a[mouseReleased()] = { onReceive: choose }, _a) })
15851
        ]),
637 daniel-mar 15852
        events: derive$2([
15853
          run$1(sliderChangeEvent(), function (slider, simulatedEvent) {
597 daniel-mar 15854
            changeValue(slider, simulatedEvent.event.value);
15855
          }),
15856
          runOnAttached(function (slider, _simulatedEvent) {
15857
            var getInitial = modelDetail.getInitialValue();
15858
            modelDetail.value.set(getInitial);
15859
            var thumb = getThumb(slider);
15860
            refresh(slider, thumb);
15861
            var spectrum = getSpectrum(slider);
15862
            detail.onInit(slider, thumb, spectrum, modelDetail.value.get());
15863
          }),
637 daniel-mar 15864
          run$1(touchstart(), onDragStart),
15865
          run$1(touchend(), onDragEnd),
15866
          run$1(mousedown(), onDragStart),
15867
          run$1(mouseup(), onDragEnd)
597 daniel-mar 15868
        ]),
15869
        apis: {
15870
          resetToMin: resetToMin,
15871
          resetToMax: resetToMax,
15872
          setValue: setValue,
15873
          refresh: refresh
15874
        },
15875
        domModification: { styles: { position: 'relative' } }
15876
      };
15877
    };
15878
 
637 daniel-mar 15879
    var Slider = composite({
597 daniel-mar 15880
      name: 'Slider',
15881
      configFields: SliderSchema,
15882
      partFields: SliderParts,
637 daniel-mar 15883
      factory: sketch$2,
597 daniel-mar 15884
      apis: {
15885
        setValue: function (apis, slider, value) {
15886
          apis.setValue(slider, value);
15887
        },
15888
        resetToMin: function (apis, slider) {
15889
          apis.resetToMin(slider);
15890
        },
15891
        resetToMax: function (apis, slider) {
15892
          apis.resetToMax(slider);
15893
        },
15894
        refresh: function (apis, slider) {
15895
          apis.refresh(slider);
15896
        }
15897
      }
15898
    });
15899
 
637 daniel-mar 15900
    var fieldsUpdate = generate$6('rgb-hex-update');
15901
    var sliderUpdate = generate$6('slider-update');
15902
    var paletteUpdate = generate$6('palette-update');
597 daniel-mar 15903
 
15904
    var sliderFactory = function (translate, getClass) {
15905
      var spectrum = Slider.parts.spectrum({
15906
        dom: {
15907
          tag: 'div',
15908
          classes: [getClass('hue-slider-spectrum')],
15909
          attributes: { role: 'presentation' }
15910
        }
15911
      });
15912
      var thumb = Slider.parts.thumb({
15913
        dom: {
15914
          tag: 'div',
15915
          classes: [getClass('hue-slider-thumb')],
15916
          attributes: { role: 'presentation' }
15917
        }
15918
      });
15919
      return Slider.sketch({
15920
        dom: {
15921
          tag: 'div',
15922
          classes: [getClass('hue-slider')],
15923
          attributes: { role: 'presentation' }
15924
        },
15925
        rounded: false,
15926
        model: {
15927
          mode: 'y',
637 daniel-mar 15928
          getInitialValue: constant$1({ y: 0 })
597 daniel-mar 15929
        },
15930
        components: [
15931
          spectrum,
15932
          thumb
15933
        ],
15934
        sliderBehaviours: derive$1([Focusing.config({})]),
15935
        onChange: function (slider, _thumb, value) {
15936
          emitWith(slider, sliderUpdate, { value: value });
15937
        }
15938
      });
15939
    };
15940
 
637 daniel-mar 15941
    var owner$1 = 'form';
15942
    var schema$i = [field('formBehaviours', [Representing])];
15943
    var getPartName$1 = function (name) {
597 daniel-mar 15944
      return '<alloy.field.' + name + '>';
15945
    };
15946
    var sketch$1 = function (fSpec) {
15947
      var parts = function () {
15948
        var record = [];
15949
        var field = function (name, config) {
15950
          record.push(name);
637 daniel-mar 15951
          return generateOne$1(owner$1, getPartName$1(name), config);
597 daniel-mar 15952
        };
15953
        return {
15954
          field: field,
637 daniel-mar 15955
          record: constant$1(record)
597 daniel-mar 15956
        };
15957
      }();
15958
      var spec = fSpec(parts);
15959
      var partNames = parts.record();
637 daniel-mar 15960
      var fieldParts = map$2(partNames, function (n) {
597 daniel-mar 15961
        return required({
15962
          name: n,
637 daniel-mar 15963
          pname: getPartName$1(n)
597 daniel-mar 15964
        });
15965
      });
637 daniel-mar 15966
      return composite$1(owner$1, schema$i, fieldParts, make$4, spec);
597 daniel-mar 15967
    };
637 daniel-mar 15968
    var toResult = function (o, e) {
597 daniel-mar 15969
      return o.fold(function () {
15970
        return Result.error(e);
15971
      }, Result.value);
15972
    };
15973
    var make$4 = function (detail, components) {
15974
      return {
15975
        uid: detail.uid,
15976
        dom: detail.dom,
15977
        components: components,
15978
        behaviours: augment(detail.formBehaviours, [Representing.config({
15979
            store: {
15980
              mode: 'manual',
15981
              getValue: function (form) {
15982
                var resPs = getAllParts(form, detail);
679 daniel-mar 15983
                return map$1(resPs, function (resPThunk, pName) {
597 daniel-mar 15984
                  return resPThunk().bind(function (v) {
15985
                    var opt = Composing.getCurrent(v);
637 daniel-mar 15986
                    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 15987
                  }).map(Representing.getValue);
15988
                });
15989
              },
15990
              setValue: function (form, values) {
637 daniel-mar 15991
                each(values, function (newValue, key) {
597 daniel-mar 15992
                  getPart(form, detail, key).each(function (wrapper) {
15993
                    Composing.getCurrent(wrapper).each(function (field) {
15994
                      Representing.setValue(field, newValue);
15995
                    });
15996
                  });
15997
                });
15998
              }
15999
            }
16000
          })]),
16001
        apis: {
16002
          getField: function (form, key) {
16003
            return getPart(form, detail, key).bind(Composing.getCurrent);
16004
          }
16005
        }
16006
      };
16007
    };
16008
    var Form = {
16009
      getField: makeApi(function (apis, component, key) {
16010
        return apis.getField(component, key);
16011
      }),
16012
      sketch: sketch$1
16013
    };
16014
 
637 daniel-mar 16015
    var validInput = generate$6('valid-input');
16016
    var invalidInput = generate$6('invalid-input');
16017
    var validatingInput = generate$6('validating-input');
597 daniel-mar 16018
    var translatePrefix = 'colorcustom.rgb.';
16019
    var rgbFormFactory = function (translate, getClass, onValidHexx, onInvalidHexx) {
16020
      var invalidation = function (label, isValid) {
16021
        return Invalidating.config({
16022
          invalidClass: getClass('invalid'),
16023
          notify: {
16024
            onValidate: function (comp) {
16025
              emitWith(comp, validatingInput, { type: label });
16026
            },
16027
            onValid: function (comp) {
16028
              emitWith(comp, validInput, {
16029
                type: label,
16030
                value: Representing.getValue(comp)
16031
              });
16032
            },
16033
            onInvalid: function (comp) {
16034
              emitWith(comp, invalidInput, {
16035
                type: label,
16036
                value: Representing.getValue(comp)
16037
              });
16038
            }
16039
          },
16040
          validator: {
16041
            validate: function (comp) {
16042
              var value = Representing.getValue(comp);
16043
              var res = isValid(value) ? Result.value(true) : Result.error(translate('aria.input.invalid'));
16044
              return Future.pure(res);
16045
            },
16046
            validateOnLoad: false
16047
          }
16048
        });
16049
      };
16050
      var renderTextField = function (isValid, name, label, description, data) {
16051
        var helptext = translate(translatePrefix + 'range');
16052
        var pLabel = FormField.parts.label({
16053
          dom: {
16054
            tag: 'label',
16055
            innerHtml: label,
16056
            attributes: { 'aria-label': description }
16057
          }
16058
        });
16059
        var pField = FormField.parts.field({
16060
          data: data,
16061
          factory: Input,
16062
          inputAttributes: __assign({ type: 'text' }, name === 'hex' ? { 'aria-live': 'polite' } : {}),
16063
          inputClasses: [getClass('textfield')],
16064
          inputBehaviours: derive$1([
16065
            invalidation(name, isValid),
16066
            Tabstopping.config({})
16067
          ]),
16068
          onSetValue: function (input) {
16069
            if (Invalidating.isInvalid(input)) {
16070
              var run = Invalidating.run(input);
16071
              run.get(noop);
16072
            }
16073
          }
16074
        });
16075
        var comps = [
16076
          pLabel,
16077
          pField
16078
        ];
16079
        var concats = name !== 'hex' ? [FormField.parts['aria-descriptor']({ text: helptext })] : [];
16080
        var components = comps.concat(concats);
16081
        return {
16082
          dom: {
16083
            tag: 'div',
16084
            attributes: { role: 'presentation' }
16085
          },
16086
          components: components
16087
        };
16088
      };
16089
      var copyRgbToHex = function (form, rgba) {
16090
        var hex = fromRgba(rgba);
16091
        Form.getField(form, 'hex').each(function (hexField) {
16092
          if (!Focusing.isFocused(hexField)) {
16093
            Representing.setValue(form, { hex: hex.value });
16094
          }
16095
        });
16096
        return hex;
16097
      };
16098
      var copyRgbToForm = function (form, rgb) {
16099
        var red = rgb.red;
16100
        var green = rgb.green;
16101
        var blue = rgb.blue;
16102
        Representing.setValue(form, {
16103
          red: red,
16104
          green: green,
16105
          blue: blue
16106
        });
16107
      };
16108
      var memPreview = record({
16109
        dom: {
16110
          tag: 'div',
16111
          classes: [getClass('rgba-preview')],
16112
          styles: { 'background-color': 'white' },
16113
          attributes: { role: 'presentation' }
16114
        }
16115
      });
16116
      var updatePreview = function (anyInSystem, hex) {
16117
        memPreview.getOpt(anyInSystem).each(function (preview) {
679 daniel-mar 16118
          set$7(preview.element, 'background-color', '#' + hex.value);
597 daniel-mar 16119
        });
16120
      };
16121
      var factory = function () {
16122
        var state = {
16123
          red: Cell(Optional.some(255)),
16124
          green: Cell(Optional.some(255)),
16125
          blue: Cell(Optional.some(255)),
16126
          hex: Cell(Optional.some('ffffff'))
16127
        };
16128
        var copyHexToRgb = function (form, hex) {
16129
          var rgb = fromHex(hex);
16130
          copyRgbToForm(form, rgb);
16131
          setValueRgb(rgb);
16132
        };
16133
        var get = function (prop) {
16134
          return state[prop].get();
16135
        };
16136
        var set = function (prop, value) {
16137
          state[prop].set(value);
16138
        };
16139
        var getValueRgb = function () {
16140
          return get('red').bind(function (red) {
16141
            return get('green').bind(function (green) {
16142
              return get('blue').map(function (blue) {
16143
                return rgbaColour(red, green, blue, 1);
16144
              });
16145
            });
16146
          });
16147
        };
16148
        var setValueRgb = function (rgb) {
16149
          var red = rgb.red;
16150
          var green = rgb.green;
16151
          var blue = rgb.blue;
16152
          set('red', Optional.some(red));
16153
          set('green', Optional.some(green));
16154
          set('blue', Optional.some(blue));
16155
        };
16156
        var onInvalidInput = function (form, simulatedEvent) {
16157
          var data = simulatedEvent.event;
16158
          if (data.type !== 'hex') {
16159
            set(data.type, Optional.none());
16160
          } else {
16161
            onInvalidHexx(form);
16162
          }
16163
        };
16164
        var onValidHex = function (form, value) {
16165
          onValidHexx(form);
16166
          var hex = hexColour(value);
16167
          set('hex', Optional.some(value));
16168
          var rgb = fromHex(hex);
16169
          copyRgbToForm(form, rgb);
16170
          setValueRgb(rgb);
16171
          emitWith(form, fieldsUpdate, { hex: hex });
16172
          updatePreview(form, hex);
16173
        };
16174
        var onValidRgb = function (form, prop, value) {
16175
          var val = parseInt(value, 10);
16176
          set(prop, Optional.some(val));
16177
          getValueRgb().each(function (rgb) {
16178
            var hex = copyRgbToHex(form, rgb);
16179
            emitWith(form, fieldsUpdate, { hex: hex });
16180
            updatePreview(form, hex);
16181
          });
16182
        };
16183
        var isHexInputEvent = function (data) {
16184
          return data.type === 'hex';
16185
        };
16186
        var onValidInput = function (form, simulatedEvent) {
16187
          var data = simulatedEvent.event;
16188
          if (isHexInputEvent(data)) {
16189
            onValidHex(form, data.value);
16190
          } else {
16191
            onValidRgb(form, data.type, data.value);
16192
          }
16193
        };
16194
        var formPartStrings = function (key) {
16195
          return {
16196
            label: translate(translatePrefix + key + '.label'),
16197
            description: translate(translatePrefix + key + '.description')
16198
          };
16199
        };
16200
        var redStrings = formPartStrings('red');
16201
        var greenStrings = formPartStrings('green');
16202
        var blueStrings = formPartStrings('blue');
16203
        var hexStrings = formPartStrings('hex');
16204
        return deepMerge(Form.sketch(function (parts) {
16205
          return {
16206
            dom: {
16207
              tag: 'form',
16208
              classes: [getClass('rgb-form')],
16209
              attributes: { 'aria-label': translate('aria.color.picker') }
16210
            },
16211
            components: [
16212
              parts.field('red', FormField.sketch(renderTextField(isRgbaComponent, 'red', redStrings.label, redStrings.description, 255))),
16213
              parts.field('green', FormField.sketch(renderTextField(isRgbaComponent, 'green', greenStrings.label, greenStrings.description, 255))),
16214
              parts.field('blue', FormField.sketch(renderTextField(isRgbaComponent, 'blue', blueStrings.label, blueStrings.description, 255))),
16215
              parts.field('hex', FormField.sketch(renderTextField(isHexString, 'hex', hexStrings.label, hexStrings.description, 'ffffff'))),
16216
              memPreview.asSpec()
16217
            ],
16218
            formBehaviours: derive$1([
16219
              Invalidating.config({ invalidClass: getClass('form-invalid') }),
16220
              config('rgb-form-events', [
637 daniel-mar 16221
                run$1(validInput, onValidInput),
16222
                run$1(invalidInput, onInvalidInput),
16223
                run$1(validatingInput, onInvalidInput)
597 daniel-mar 16224
              ])
16225
            ])
16226
          };
16227
        }), {
16228
          apis: {
16229
            updateHex: function (form, hex) {
16230
              Representing.setValue(form, { hex: hex.value });
16231
              copyHexToRgb(form, hex);
16232
              updatePreview(form, hex);
16233
            }
16234
          }
16235
        });
16236
      };
637 daniel-mar 16237
      var rgbFormSketcher = single({
597 daniel-mar 16238
        factory: factory,
16239
        name: 'RgbForm',
16240
        configFields: [],
16241
        apis: {
16242
          updateHex: function (apis, form, hex) {
16243
            apis.updateHex(form, hex);
16244
          }
16245
        },
16246
        extraApis: {}
16247
      });
16248
      return rgbFormSketcher;
16249
    };
16250
 
16251
    var paletteFactory = function (_translate, getClass) {
16252
      var spectrumPart = Slider.parts.spectrum({
16253
        dom: {
16254
          tag: 'canvas',
16255
          attributes: { role: 'presentation' },
16256
          classes: [getClass('sv-palette-spectrum')]
16257
        }
16258
      });
16259
      var thumbPart = Slider.parts.thumb({
16260
        dom: {
16261
          tag: 'div',
16262
          attributes: { role: 'presentation' },
16263
          classes: [getClass('sv-palette-thumb')],
16264
          innerHtml: '<div class=' + getClass('sv-palette-inner-thumb') + ' role="presentation"></div>'
16265
        }
16266
      });
16267
      var setColour = function (canvas, rgba) {
16268
        var width = canvas.width, height = canvas.height;
16269
        var ctx = canvas.getContext('2d');
16270
        if (ctx === null) {
16271
          return;
16272
        }
16273
        ctx.fillStyle = rgba;
16274
        ctx.fillRect(0, 0, width, height);
16275
        var grdWhite = ctx.createLinearGradient(0, 0, width, 0);
16276
        grdWhite.addColorStop(0, 'rgba(255,255,255,1)');
16277
        grdWhite.addColorStop(1, 'rgba(255,255,255,0)');
16278
        ctx.fillStyle = grdWhite;
16279
        ctx.fillRect(0, 0, width, height);
16280
        var grdBlack = ctx.createLinearGradient(0, 0, 0, height);
16281
        grdBlack.addColorStop(0, 'rgba(0,0,0,0)');
16282
        grdBlack.addColorStop(1, 'rgba(0,0,0,1)');
16283
        ctx.fillStyle = grdBlack;
16284
        ctx.fillRect(0, 0, width, height);
16285
      };
16286
      var setPaletteHue = function (slider, hue) {
16287
        var canvas = slider.components()[0].element.dom;
16288
        var hsv = hsvColour(hue, 100, 100);
16289
        var rgba = fromHsv(hsv);
16290
        setColour(canvas, toString(rgba));
16291
      };
16292
      var setPaletteThumb = function (slider, hex) {
16293
        var hsv = fromRgb(fromHex(hex));
16294
        Slider.setValue(slider, {
16295
          x: hsv.saturation,
16296
          y: 100 - hsv.value
16297
        });
16298
      };
16299
      var factory = function (_detail) {
637 daniel-mar 16300
        var getInitialValue = constant$1({
597 daniel-mar 16301
          x: 0,
16302
          y: 0
16303
        });
16304
        var onChange = function (slider, _thumb, value) {
16305
          emitWith(slider, paletteUpdate, { value: value });
16306
        };
16307
        var onInit = function (_slider, _thumb, spectrum, _value) {
16308
          setColour(spectrum.element.dom, toString(red));
16309
        };
16310
        var sliderBehaviours = derive$1([
16311
          Composing.config({ find: Optional.some }),
16312
          Focusing.config({})
16313
        ]);
16314
        return Slider.sketch({
16315
          dom: {
16316
            tag: 'div',
16317
            attributes: { role: 'presentation' },
16318
            classes: [getClass('sv-palette')]
16319
          },
16320
          model: {
16321
            mode: 'xy',
16322
            getInitialValue: getInitialValue
16323
          },
16324
          rounded: false,
16325
          components: [
16326
            spectrumPart,
16327
            thumbPart
16328
          ],
16329
          onChange: onChange,
16330
          onInit: onInit,
16331
          sliderBehaviours: sliderBehaviours
16332
        });
16333
      };
637 daniel-mar 16334
      var saturationBrightnessPaletteSketcher = single({
597 daniel-mar 16335
        factory: factory,
16336
        name: 'SaturationBrightnessPalette',
16337
        configFields: [],
16338
        apis: {
16339
          setHue: function (_apis, slider, hue) {
16340
            setPaletteHue(slider, hue);
16341
          },
16342
          setThumb: function (_apis, slider, hex) {
16343
            setPaletteThumb(slider, hex);
16344
          }
16345
        },
16346
        extraApis: {}
16347
      });
16348
      return saturationBrightnessPaletteSketcher;
16349
    };
16350
 
16351
    var makeFactory = function (translate, getClass) {
16352
      var factory = function (detail) {
16353
        var rgbForm = rgbFormFactory(translate, getClass, detail.onValidHex, detail.onInvalidHex);
16354
        var sbPalette = paletteFactory(translate, getClass);
16355
        var hueSliderToDegrees = function (hue) {
16356
          return (100 - hue) / 100 * 360;
16357
        };
16358
        var hueDegreesToSlider = function (hue) {
16359
          return 100 - hue / 360 * 100;
16360
        };
16361
        var state = {
16362
          paletteRgba: Cell(red),
16363
          paletteHue: Cell(0)
16364
        };
16365
        var memSlider = record(sliderFactory(translate, getClass));
16366
        var memPalette = record(sbPalette.sketch({}));
16367
        var memRgb = record(rgbForm.sketch({}));
16368
        var updatePalette = function (anyInSystem, _hex, hue) {
16369
          memPalette.getOpt(anyInSystem).each(function (palette) {
16370
            sbPalette.setHue(palette, hue);
16371
          });
16372
        };
16373
        var updateFields = function (anyInSystem, hex) {
16374
          memRgb.getOpt(anyInSystem).each(function (form) {
16375
            rgbForm.updateHex(form, hex);
16376
          });
16377
        };
16378
        var updateSlider = function (anyInSystem, _hex, hue) {
16379
          memSlider.getOpt(anyInSystem).each(function (slider) {
16380
            Slider.setValue(slider, { y: hueDegreesToSlider(hue) });
16381
          });
16382
        };
16383
        var updatePaletteThumb = function (anyInSystem, hex) {
16384
          memPalette.getOpt(anyInSystem).each(function (palette) {
16385
            sbPalette.setThumb(palette, hex);
16386
          });
16387
        };
16388
        var updateState = function (hex, hue) {
16389
          var rgba = fromHex(hex);
16390
          state.paletteRgba.set(rgba);
16391
          state.paletteHue.set(hue);
16392
        };
16393
        var runUpdates = function (anyInSystem, hex, hue, updates) {
16394
          updateState(hex, hue);
637 daniel-mar 16395
          each$1(updates, function (update) {
597 daniel-mar 16396
            update(anyInSystem, hex, hue);
16397
          });
16398
        };
16399
        var onPaletteUpdate = function () {
16400
          var updates = [updateFields];
16401
          return function (form, simulatedEvent) {
16402
            var value = simulatedEvent.event.value;
16403
            var oldHue = state.paletteHue.get();
16404
            var newHsv = hsvColour(oldHue, value.x, 100 - value.y);
16405
            var newHex = hsvToHex(newHsv);
16406
            runUpdates(form, newHex, oldHue, updates);
16407
          };
16408
        };
16409
        var onSliderUpdate = function () {
16410
          var updates = [
16411
            updatePalette,
16412
            updateFields
16413
          ];
16414
          return function (form, simulatedEvent) {
16415
            var hue = hueSliderToDegrees(simulatedEvent.event.value.y);
16416
            var oldRgb = state.paletteRgba.get();
16417
            var oldHsv = fromRgb(oldRgb);
16418
            var newHsv = hsvColour(hue, oldHsv.saturation, oldHsv.value);
16419
            var newHex = hsvToHex(newHsv);
16420
            runUpdates(form, newHex, hue, updates);
16421
          };
16422
        };
16423
        var onFieldsUpdate = function () {
16424
          var updates = [
16425
            updatePalette,
16426
            updateSlider,
16427
            updatePaletteThumb
16428
          ];
16429
          return function (form, simulatedEvent) {
16430
            var hex = simulatedEvent.event.hex;
16431
            var hsv = hexToHsv(hex);
16432
            runUpdates(form, hex, hsv.hue, updates);
16433
          };
16434
        };
16435
        return {
16436
          uid: detail.uid,
16437
          dom: detail.dom,
16438
          components: [
16439
            memPalette.asSpec(),
16440
            memSlider.asSpec(),
16441
            memRgb.asSpec()
16442
          ],
16443
          behaviours: derive$1([
16444
            config('colour-picker-events', [
637 daniel-mar 16445
              run$1(fieldsUpdate, onFieldsUpdate()),
16446
              run$1(paletteUpdate, onPaletteUpdate()),
16447
              run$1(sliderUpdate, onSliderUpdate())
597 daniel-mar 16448
            ]),
16449
            Composing.config({
16450
              find: function (comp) {
16451
                return memRgb.getOpt(comp);
16452
              }
16453
            }),
16454
            Keying.config({ mode: 'acyclic' })
16455
          ])
16456
        };
16457
      };
637 daniel-mar 16458
      var colourPickerSketcher = single({
597 daniel-mar 16459
        name: 'ColourPicker',
16460
        configFields: [
637 daniel-mar 16461
          required$1('dom'),
16462
          defaulted('onValidHex', noop),
16463
          defaulted('onInvalidHex', noop)
597 daniel-mar 16464
        ],
16465
        factory: factory
16466
      });
16467
      return colourPickerSketcher;
16468
    };
16469
 
16470
    var self$1 = function () {
16471
      return Composing.config({ find: Optional.some });
16472
    };
637 daniel-mar 16473
    var memento$1 = function (mem) {
597 daniel-mar 16474
      return Composing.config({ find: mem.getOpt });
16475
    };
16476
    var childAt = function (index) {
16477
      return Composing.config({
16478
        find: function (comp) {
637 daniel-mar 16479
          return child$2(comp.element, index).bind(function (element) {
597 daniel-mar 16480
            return comp.getSystem().getByDom(element).toOptional();
16481
          });
16482
        }
16483
      });
16484
    };
16485
    var ComposingConfigs = {
16486
      self: self$1,
637 daniel-mar 16487
      memento: memento$1,
597 daniel-mar 16488
      childAt: childAt
16489
    };
16490
 
16491
    var english = {
16492
      'colorcustom.rgb.red.label': 'R',
16493
      'colorcustom.rgb.red.description': 'Red component',
16494
      'colorcustom.rgb.green.label': 'G',
16495
      'colorcustom.rgb.green.description': 'Green component',
16496
      'colorcustom.rgb.blue.label': 'B',
16497
      'colorcustom.rgb.blue.description': 'Blue component',
16498
      'colorcustom.rgb.hex.label': '#',
16499
      'colorcustom.rgb.hex.description': 'Hex color code',
16500
      'colorcustom.rgb.range': 'Range 0 to 255',
16501
      'colorcustom.sb.saturation': 'Saturation',
16502
      'colorcustom.sb.brightness': 'Brightness',
16503
      'colorcustom.sb.picker': 'Saturation and Brightness Picker',
16504
      'colorcustom.sb.palette': 'Saturation and Brightness Palette',
16505
      'colorcustom.sb.instructions': 'Use arrow keys to select saturation and brightness, on x and y axes',
16506
      'colorcustom.hue.hue': 'Hue',
16507
      'colorcustom.hue.slider': 'Hue Slider',
16508
      'colorcustom.hue.palette': 'Hue Palette',
16509
      'colorcustom.hue.instructions': 'Use arrow keys to select a hue',
16510
      'aria.color.picker': 'Color Picker',
16511
      'aria.input.invalid': 'Invalid input'
16512
    };
16513
    var getEnglishText = function (key) {
16514
      return english[key];
16515
    };
16516
    var translate$1 = function (key) {
16517
      return getEnglishText(key);
16518
    };
16519
    var renderColorPicker = function (_spec) {
16520
      var getClass = function (key) {
16521
        return 'tox-' + key;
16522
      };
16523
      var colourPickerFactory = makeFactory(translate$1, getClass);
16524
      var onValidHex = function (form) {
16525
        emitWith(form, formActionEvent, {
16526
          name: 'hex-valid',
16527
          value: true
16528
        });
16529
      };
16530
      var onInvalidHex = function (form) {
16531
        emitWith(form, formActionEvent, {
16532
          name: 'hex-valid',
16533
          value: false
16534
        });
16535
      };
16536
      var memPicker = record(colourPickerFactory.sketch({
16537
        dom: {
16538
          tag: 'div',
16539
          classes: [getClass('color-picker-container')],
16540
          attributes: { role: 'presentation' }
16541
        },
16542
        onValidHex: onValidHex,
16543
        onInvalidHex: onInvalidHex
16544
      }));
16545
      return {
16546
        dom: { tag: 'div' },
16547
        components: [memPicker.asSpec()],
16548
        behaviours: derive$1([
16549
          Representing.config({
16550
            store: {
16551
              mode: 'manual',
16552
              getValue: function (comp) {
16553
                var picker = memPicker.get(comp);
16554
                var optRgbForm = Composing.getCurrent(picker);
16555
                var optHex = optRgbForm.bind(function (rgbForm) {
16556
                  var formValues = Representing.getValue(rgbForm);
16557
                  return formValues.hex;
16558
                });
16559
                return optHex.map(function (hex) {
16560
                  return '#' + hex;
16561
                }).getOr('');
16562
              },
16563
              setValue: function (comp, newValue) {
16564
                var pattern = /^#([a-fA-F0-9]{3}(?:[a-fA-F0-9]{3})?)/;
16565
                var m = pattern.exec(newValue);
16566
                var picker = memPicker.get(comp);
16567
                var optRgbForm = Composing.getCurrent(picker);
16568
                optRgbForm.fold(function () {
16569
                  console.log('Can not find form');
16570
                }, function (rgbForm) {
16571
                  Representing.setValue(rgbForm, { hex: Optional.from(m[1]).getOr('') });
16572
                  Form.getField(rgbForm, 'hex').each(function (hexField) {
16573
                    emit(hexField, input());
16574
                  });
16575
                });
16576
              }
16577
            }
16578
          }),
16579
          ComposingConfigs.self()
16580
        ])
16581
      };
16582
    };
16583
 
679 daniel-mar 16584
    var global$6 = tinymce.util.Tools.resolve('tinymce.Resource');
597 daniel-mar 16585
 
16586
    var isOldCustomEditor = function (spec) {
637 daniel-mar 16587
      return has$2(spec, 'init');
597 daniel-mar 16588
    };
16589
    var renderCustomEditor = function (spec) {
637 daniel-mar 16590
      var editorApi = value$1();
597 daniel-mar 16591
      var memReplaced = record({ dom: { tag: spec.tag } });
637 daniel-mar 16592
      var initialValue = value$1();
597 daniel-mar 16593
      return {
16594
        dom: {
16595
          tag: 'div',
16596
          classes: ['tox-custom-editor']
16597
        },
16598
        behaviours: derive$1([
16599
          config('custom-editor-events', [runOnAttached(function (component) {
16600
              memReplaced.getOpt(component).each(function (ta) {
679 daniel-mar 16601
                (isOldCustomEditor(spec) ? spec.init(ta.element.dom) : global$6.load(spec.scriptId, spec.scriptUrl).then(function (init) {
597 daniel-mar 16602
                  return init(ta.element.dom, spec.settings);
16603
                })).then(function (ea) {
637 daniel-mar 16604
                  initialValue.on(function (cvalue) {
597 daniel-mar 16605
                    ea.setValue(cvalue);
16606
                  });
637 daniel-mar 16607
                  initialValue.clear();
16608
                  editorApi.set(ea);
597 daniel-mar 16609
                });
16610
              });
16611
            })]),
16612
          Representing.config({
16613
            store: {
16614
              mode: 'manual',
16615
              getValue: function () {
16616
                return editorApi.get().fold(function () {
16617
                  return initialValue.get().getOr('');
16618
                }, function (ed) {
16619
                  return ed.getValue();
16620
                });
16621
              },
16622
              setValue: function (component, value) {
16623
                editorApi.get().fold(function () {
637 daniel-mar 16624
                  initialValue.set(value);
597 daniel-mar 16625
                }, function (ed) {
16626
                  return ed.setValue(value);
16627
                });
16628
              }
16629
            }
16630
          }),
16631
          ComposingConfigs.self()
16632
        ]),
16633
        components: [memReplaced.asSpec()]
16634
      };
16635
    };
16636
 
679 daniel-mar 16637
    var global$5 = tinymce.util.Tools.resolve('tinymce.util.Tools');
597 daniel-mar 16638
 
16639
    var processors = objOf([
637 daniel-mar 16640
      defaulted('preprocess', identity$1),
16641
      defaulted('postprocess', identity$1)
597 daniel-mar 16642
    ]);
637 daniel-mar 16643
    var memento = function (mem, rawProcessors) {
16644
      var ps = asRawOrDie$1('RepresentingConfigs.memento processors', processors, rawProcessors);
597 daniel-mar 16645
      return Representing.config({
16646
        store: {
16647
          mode: 'manual',
16648
          getValue: function (comp) {
16649
            var other = mem.get(comp);
16650
            var rawValue = Representing.getValue(other);
16651
            return ps.postprocess(rawValue);
16652
          },
16653
          setValue: function (comp, rawValue) {
16654
            var newValue = ps.preprocess(rawValue);
16655
            var other = mem.get(comp);
16656
            Representing.setValue(other, newValue);
16657
          }
16658
        }
16659
      });
16660
    };
16661
    var withComp = function (optInitialValue, getter, setter) {
16662
      return Representing.config(deepMerge({
16663
        store: {
16664
          mode: 'manual',
16665
          getValue: getter,
16666
          setValue: setter
16667
        }
16668
      }, optInitialValue.map(function (initialValue) {
16669
        return { store: { initialValue: initialValue } };
16670
      }).getOr({})));
16671
    };
16672
    var withElement = function (initialValue, getter, setter) {
16673
      return withComp(initialValue, function (c) {
16674
        return getter(c.element);
16675
      }, function (c, v) {
16676
        return setter(c.element, v);
16677
      });
16678
    };
16679
    var domValue = function (optInitialValue) {
679 daniel-mar 16680
      return withElement(optInitialValue, get$5, set$4);
597 daniel-mar 16681
    };
16682
    var domHtml = function (optInitialValue) {
679 daniel-mar 16683
      return withElement(optInitialValue, get$7, set$5);
597 daniel-mar 16684
    };
637 daniel-mar 16685
    var memory = function (initialValue) {
597 daniel-mar 16686
      return Representing.config({
16687
        store: {
16688
          mode: 'memory',
16689
          initialValue: initialValue
16690
        }
16691
      });
16692
    };
16693
    var RepresentingConfigs = {
637 daniel-mar 16694
      memento: memento,
597 daniel-mar 16695
      withElement: withElement,
16696
      withComp: withComp,
16697
      domValue: domValue,
16698
      domHtml: domHtml,
637 daniel-mar 16699
      memory: memory
597 daniel-mar 16700
    };
16701
 
16702
    var defaultImageFileTypes = 'jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp';
16703
    var filterByExtension = function (files, providersBackstage) {
679 daniel-mar 16704
      var allowedImageFileTypes = global$5.explode(providersBackstage.getSetting('images_file_types', defaultImageFileTypes, 'string'));
597 daniel-mar 16705
      var isFileInAllowedTypes = function (file) {
16706
        return exists(allowedImageFileTypes, function (type) {
16707
          return endsWith(file.name.toLowerCase(), '.' + type.toLowerCase());
16708
        });
16709
      };
637 daniel-mar 16710
      return filter$2(from(files), isFileInAllowedTypes);
597 daniel-mar 16711
    };
16712
    var renderDropZone = function (spec, providersBackstage) {
16713
      var stopper = function (_, se) {
16714
        se.stop();
16715
      };
16716
      var sequence = function (actions) {
16717
        return function (comp, se) {
637 daniel-mar 16718
          each$1(actions, function (a) {
597 daniel-mar 16719
            a(comp, se);
16720
          });
16721
        };
16722
      };
16723
      var onDrop = function (comp, se) {
16724
        if (!Disabling.isDisabled(comp)) {
16725
          var transferEvent = se.event.raw;
16726
          handleFiles(comp, transferEvent.dataTransfer.files);
16727
        }
16728
      };
16729
      var onSelect = function (component, simulatedEvent) {
16730
        var input = simulatedEvent.event.raw.target;
16731
        handleFiles(component, input.files);
16732
      };
16733
      var handleFiles = function (component, files) {
16734
        Representing.setValue(component, filterByExtension(files, providersBackstage));
16735
        emitWith(component, formChangeEvent, { name: spec.name });
16736
      };
16737
      var memInput = record({
16738
        dom: {
16739
          tag: 'input',
16740
          attributes: {
16741
            type: 'file',
16742
            accept: 'image/*'
16743
          },
16744
          styles: { display: 'none' }
16745
        },
16746
        behaviours: derive$1([config('input-file-events', [
16747
            cutter(click()),
16748
            cutter(tap())
16749
          ])])
16750
      });
16751
      var renderField = function (s) {
16752
        return {
16753
          uid: s.uid,
16754
          dom: {
16755
            tag: 'div',
16756
            classes: ['tox-dropzone-container']
16757
          },
16758
          behaviours: derive$1([
16759
            RepresentingConfigs.memory([]),
16760
            ComposingConfigs.self(),
16761
            Disabling.config({}),
16762
            Toggling.config({
16763
              toggleClass: 'dragenter',
16764
              toggleOnExecute: false
16765
            }),
16766
            config('dropzone-events', [
637 daniel-mar 16767
              run$1('dragenter', sequence([
597 daniel-mar 16768
                stopper,
16769
                Toggling.toggle
16770
              ])),
637 daniel-mar 16771
              run$1('dragleave', sequence([
597 daniel-mar 16772
                stopper,
16773
                Toggling.toggle
16774
              ])),
637 daniel-mar 16775
              run$1('dragover', stopper),
16776
              run$1('drop', sequence([
597 daniel-mar 16777
                stopper,
16778
                onDrop
16779
              ])),
637 daniel-mar 16780
              run$1(change(), onSelect)
597 daniel-mar 16781
            ])
16782
          ]),
16783
          components: [{
16784
              dom: {
16785
                tag: 'div',
16786
                classes: ['tox-dropzone'],
16787
                styles: {}
16788
              },
16789
              components: [
16790
                {
16791
                  dom: {
16792
                    tag: 'p',
16793
                    innerHtml: providersBackstage.translate('Drop an image here')
16794
                  }
16795
                },
16796
                Button.sketch({
16797
                  dom: {
16798
                    tag: 'button',
16799
                    innerHtml: providersBackstage.translate('Browse for an image'),
16800
                    styles: { position: 'relative' },
16801
                    classes: [
16802
                      'tox-button',
16803
                      'tox-button--secondary'
16804
                    ]
16805
                  },
16806
                  components: [memInput.asSpec()],
16807
                  action: function (comp) {
16808
                    var inputComp = memInput.get(comp);
16809
                    inputComp.element.dom.click();
16810
                  },
16811
                  buttonBehaviours: derive$1([
16812
                    Tabstopping.config({}),
16813
                    DisablingConfigs.button(providersBackstage.isDisabled),
16814
                    receivingConfig()
16815
                  ])
16816
                })
16817
              ]
16818
            }]
16819
        };
16820
      };
16821
      var pLabel = spec.label.map(function (label) {
637 daniel-mar 16822
        return renderLabel$2(label, providersBackstage);
597 daniel-mar 16823
      });
16824
      var pField = FormField.parts.field({ factory: { sketch: renderField } });
16825
      return renderFormFieldWith(pLabel, pField, ['tox-form__group--stretched'], []);
16826
    };
16827
 
16828
    var renderGrid = function (spec, backstage) {
16829
      return {
16830
        dom: {
16831
          tag: 'div',
16832
          classes: [
16833
            'tox-form__grid',
16834
            'tox-form__grid--' + spec.columns + 'col'
16835
          ]
16836
        },
637 daniel-mar 16837
        components: map$2(spec.items, backstage.interpreter)
597 daniel-mar 16838
      };
16839
    };
16840
 
637 daniel-mar 16841
    var beforeObject = generate$6('alloy-fake-before-tabstop');
16842
    var afterObject = generate$6('alloy-fake-after-tabstop');
597 daniel-mar 16843
    var craftWithClasses = function (classes) {
16844
      return {
16845
        dom: {
16846
          tag: 'div',
16847
          styles: {
16848
            width: '1px',
16849
            height: '1px',
16850
            outline: 'none'
16851
          },
16852
          attributes: { tabindex: '0' },
16853
          classes: classes
16854
        },
16855
        behaviours: derive$1([
16856
          Focusing.config({ ignore: true }),
16857
          Tabstopping.config({})
16858
        ])
16859
      };
16860
    };
16861
    var craft = function (spec) {
16862
      return {
16863
        dom: {
16864
          tag: 'div',
16865
          classes: ['tox-navobj']
16866
        },
16867
        components: [
16868
          craftWithClasses([beforeObject]),
16869
          spec,
16870
          craftWithClasses([afterObject])
16871
        ],
16872
        behaviours: derive$1([ComposingConfigs.childAt(1)])
16873
      };
16874
    };
16875
    var triggerTab = function (placeholder, shiftKey) {
16876
      emitWith(placeholder, keydown(), {
16877
        raw: {
16878
          which: 9,
16879
          shiftKey: shiftKey
16880
        }
16881
      });
16882
    };
637 daniel-mar 16883
    var onFocus = function (container, targetComp) {
597 daniel-mar 16884
      var target = targetComp.element;
637 daniel-mar 16885
      if (has(target, beforeObject)) {
597 daniel-mar 16886
        triggerTab(container, true);
637 daniel-mar 16887
      } else if (has(target, afterObject)) {
597 daniel-mar 16888
        triggerTab(container, false);
16889
      }
16890
    };
16891
    var isPseudoStop = function (element) {
637 daniel-mar 16892
      return closest(element, [
597 daniel-mar 16893
        '.' + beforeObject,
16894
        '.' + afterObject
16895
      ].join(','), never);
16896
    };
16897
 
637 daniel-mar 16898
    var platformNeedsSandboxing = !(detect$1().browser.isIE() || detect$1().browser.isEdge());
597 daniel-mar 16899
    var getDynamicSource = function (isSandbox) {
16900
      var cachedValue = Cell('');
16901
      return {
16902
        getValue: function (_frameComponent) {
16903
          return cachedValue.get();
16904
        },
16905
        setValue: function (frameComponent, html) {
16906
          if (!isSandbox) {
679 daniel-mar 16907
            set$8(frameComponent.element, 'src', 'javascript:\'\'');
597 daniel-mar 16908
            var doc = frameComponent.element.dom.contentWindow.document;
16909
            doc.open();
16910
            doc.write(html);
16911
            doc.close();
16912
          } else {
679 daniel-mar 16913
            set$8(frameComponent.element, 'srcdoc', html);
597 daniel-mar 16914
          }
16915
          cachedValue.set(html);
16916
        }
16917
      };
16918
    };
16919
    var renderIFrame = function (spec, providersBackstage) {
16920
      var isSandbox = platformNeedsSandboxing && spec.sandboxed;
16921
      var attributes = __assign(__assign({}, spec.label.map(function (title) {
16922
        return { title: title };
16923
      }).getOr({})), isSandbox ? { sandbox: 'allow-scripts allow-same-origin' } : {});
16924
      var sourcing = getDynamicSource(isSandbox);
16925
      var pLabel = spec.label.map(function (label) {
637 daniel-mar 16926
        return renderLabel$2(label, providersBackstage);
597 daniel-mar 16927
      });
16928
      var factory = function (newSpec) {
16929
        return craft({
16930
          uid: newSpec.uid,
16931
          dom: {
16932
            tag: 'iframe',
16933
            attributes: attributes
16934
          },
16935
          behaviours: derive$1([
16936
            Tabstopping.config({}),
16937
            Focusing.config({}),
16938
            RepresentingConfigs.withComp(Optional.none(), sourcing.getValue, sourcing.setValue)
16939
          ])
16940
        });
16941
      };
16942
      var pField = FormField.parts.field({ factory: { sketch: factory } });
16943
      return renderFormFieldWith(pLabel, pField, ['tox-form__group--stretched'], []);
16944
    };
16945
 
637 daniel-mar 16946
    var create$3 = function (width, height) {
16947
      return resize$3(document.createElement('canvas'), width, height);
597 daniel-mar 16948
    };
637 daniel-mar 16949
    var clone = function (canvas) {
16950
      var tCanvas = create$3(canvas.width, canvas.height);
597 daniel-mar 16951
      var ctx = get2dContext(tCanvas);
16952
      ctx.drawImage(canvas, 0, 0);
16953
      return tCanvas;
16954
    };
16955
    var get2dContext = function (canvas) {
16956
      return canvas.getContext('2d');
16957
    };
637 daniel-mar 16958
    var resize$3 = function (canvas, width, height) {
597 daniel-mar 16959
      canvas.width = width;
16960
      canvas.height = height;
16961
      return canvas;
16962
    };
16963
 
637 daniel-mar 16964
    var getWidth$1 = function (image) {
597 daniel-mar 16965
      return image.naturalWidth || image.width;
16966
    };
637 daniel-mar 16967
    var getHeight$1 = function (image) {
597 daniel-mar 16968
      return image.naturalHeight || image.height;
16969
    };
16970
 
16971
    var blobToImage = function (blob) {
16972
      return new Promise$1(function (resolve, reject) {
16973
        var blobUrl = URL.createObjectURL(blob);
16974
        var image = new Image();
16975
        var removeListeners = function () {
16976
          image.removeEventListener('load', loaded);
16977
          image.removeEventListener('error', error);
16978
        };
16979
        var loaded = function () {
16980
          removeListeners();
16981
          resolve(image);
16982
        };
16983
        var error = function () {
16984
          removeListeners();
16985
          reject('Unable to load data of type ' + blob.type + ': ' + blobUrl);
16986
        };
16987
        image.addEventListener('load', loaded);
16988
        image.addEventListener('error', error);
16989
        image.src = blobUrl;
16990
        if (image.complete) {
16991
          setTimeout(loaded, 0);
16992
        }
16993
      });
16994
    };
16995
    var dataUriToBlobSync = function (uri) {
16996
      var data = uri.split(',');
16997
      var matches = /data:([^;]+)/.exec(data[0]);
16998
      if (!matches) {
16999
        return Optional.none();
17000
      }
17001
      var mimetype = matches[1];
17002
      var base64 = data[1];
17003
      var sliceSize = 1024;
17004
      var byteCharacters = atob(base64);
17005
      var bytesLength = byteCharacters.length;
17006
      var slicesCount = Math.ceil(bytesLength / sliceSize);
17007
      var byteArrays = new Array(slicesCount);
17008
      for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
17009
        var begin = sliceIndex * sliceSize;
17010
        var end = Math.min(begin + sliceSize, bytesLength);
17011
        var bytes = new Array(end - begin);
17012
        for (var offset = begin, i = 0; offset < end; ++i, ++offset) {
17013
          bytes[i] = byteCharacters[offset].charCodeAt(0);
17014
        }
17015
        byteArrays[sliceIndex] = new Uint8Array(bytes);
17016
      }
17017
      return Optional.some(new Blob(byteArrays, { type: mimetype }));
17018
    };
17019
    var dataUriToBlob = function (uri) {
17020
      return new Promise$1(function (resolve, reject) {
17021
        dataUriToBlobSync(uri).fold(function () {
17022
          reject('uri is not base64: ' + uri);
17023
        }, resolve);
17024
      });
17025
    };
17026
    var canvasToBlob = function (canvas, type, quality) {
17027
      type = type || 'image/png';
17028
      if (isFunction(HTMLCanvasElement.prototype.toBlob)) {
17029
        return new Promise$1(function (resolve, reject) {
17030
          canvas.toBlob(function (blob) {
17031
            if (blob) {
17032
              resolve(blob);
17033
            } else {
17034
              reject();
17035
            }
17036
          }, type, quality);
17037
        });
17038
      } else {
17039
        return dataUriToBlob(canvas.toDataURL(type, quality));
17040
      }
17041
    };
17042
    var canvasToDataURL = function (canvas, type, quality) {
17043
      type = type || 'image/png';
17044
      return canvas.toDataURL(type, quality);
17045
    };
17046
    var blobToCanvas = function (blob) {
17047
      return blobToImage(blob).then(function (image) {
17048
        revokeImageUrl(image);
637 daniel-mar 17049
        var canvas = create$3(getWidth$1(image), getHeight$1(image));
597 daniel-mar 17050
        var context = get2dContext(canvas);
17051
        context.drawImage(image, 0, 0);
17052
        return canvas;
17053
      });
17054
    };
17055
    var blobToDataUri = function (blob) {
17056
      return new Promise$1(function (resolve) {
17057
        var reader = new FileReader();
17058
        reader.onloadend = function () {
17059
          resolve(reader.result);
17060
        };
17061
        reader.readAsDataURL(blob);
17062
      });
17063
    };
17064
    var revokeImageUrl = function (image) {
17065
      URL.revokeObjectURL(image.src);
17066
    };
17067
 
637 daniel-mar 17068
    var create$2 = function (getCanvas, blob, uri) {
597 daniel-mar 17069
      var initialType = blob.type;
637 daniel-mar 17070
      var getType = constant$1(initialType);
597 daniel-mar 17071
      var toBlob = function () {
17072
        return Promise$1.resolve(blob);
17073
      };
637 daniel-mar 17074
      var toDataURL = constant$1(uri);
597 daniel-mar 17075
      var toBase64 = function () {
17076
        return uri.split(',')[1];
17077
      };
17078
      var toAdjustedBlob = function (type, quality) {
17079
        return getCanvas.then(function (canvas) {
17080
          return canvasToBlob(canvas, type, quality);
17081
        });
17082
      };
17083
      var toAdjustedDataURL = function (type, quality) {
17084
        return getCanvas.then(function (canvas) {
17085
          return canvasToDataURL(canvas, type, quality);
17086
        });
17087
      };
17088
      var toAdjustedBase64 = function (type, quality) {
17089
        return toAdjustedDataURL(type, quality).then(function (dataurl) {
17090
          return dataurl.split(',')[1];
17091
        });
17092
      };
17093
      var toCanvas = function () {
637 daniel-mar 17094
        return getCanvas.then(clone);
597 daniel-mar 17095
      };
17096
      return {
17097
        getType: getType,
17098
        toBlob: toBlob,
17099
        toDataURL: toDataURL,
17100
        toBase64: toBase64,
17101
        toAdjustedBlob: toAdjustedBlob,
17102
        toAdjustedDataURL: toAdjustedDataURL,
17103
        toAdjustedBase64: toAdjustedBase64,
17104
        toCanvas: toCanvas
17105
      };
17106
    };
17107
    var fromBlob = function (blob) {
17108
      return blobToDataUri(blob).then(function (uri) {
637 daniel-mar 17109
        return create$2(blobToCanvas(blob), blob, uri);
597 daniel-mar 17110
      });
17111
    };
17112
    var fromCanvas = function (canvas, type) {
17113
      return canvasToBlob(canvas, type).then(function (blob) {
637 daniel-mar 17114
        return create$2(Promise$1.resolve(canvas), blob, canvas.toDataURL());
597 daniel-mar 17115
      });
17116
    };
17117
 
17118
    var blobToImageResult = function (blob) {
17119
      return fromBlob(blob);
17120
    };
17121
 
637 daniel-mar 17122
    var clamp = function (value, min, max) {
597 daniel-mar 17123
      var parsedValue = typeof value === 'string' ? parseFloat(value) : value;
17124
      if (parsedValue > max) {
17125
        parsedValue = max;
17126
      } else if (parsedValue < min) {
17127
        parsedValue = min;
17128
      }
17129
      return parsedValue;
17130
    };
637 daniel-mar 17131
    var identity = function () {
597 daniel-mar 17132
      return [
17133
        1,
17134
        0,
17135
        0,
17136
        0,
17137
        0,
17138
        0,
17139
        1,
17140
        0,
17141
        0,
17142
        0,
17143
        0,
17144
        0,
17145
        1,
17146
        0,
17147
        0,
17148
        0,
17149
        0,
17150
        0,
17151
        1,
17152
        0,
17153
        0,
17154
        0,
17155
        0,
17156
        0,
17157
        1
17158
      ];
17159
    };
17160
    var DELTA_INDEX = [
17161
      0,
17162
      0.01,
17163
      0.02,
17164
      0.04,
17165
      0.05,
17166
      0.06,
17167
      0.07,
17168
      0.08,
17169
      0.1,
17170
      0.11,
17171
      0.12,
17172
      0.14,
17173
      0.15,
17174
      0.16,
17175
      0.17,
17176
      0.18,
17177
      0.2,
17178
      0.21,
17179
      0.22,
17180
      0.24,
17181
      0.25,
17182
      0.27,
17183
      0.28,
17184
      0.3,
17185
      0.32,
17186
      0.34,
17187
      0.36,
17188
      0.38,
17189
      0.4,
17190
      0.42,
17191
      0.44,
17192
      0.46,
17193
      0.48,
17194
      0.5,
17195
      0.53,
17196
      0.56,
17197
      0.59,
17198
      0.62,
17199
      0.65,
17200
      0.68,
17201
      0.71,
17202
      0.74,
17203
      0.77,
17204
      0.8,
17205
      0.83,
17206
      0.86,
17207
      0.89,
17208
      0.92,
17209
      0.95,
17210
      0.98,
17211
      1,
17212
      1.06,
17213
      1.12,
17214
      1.18,
17215
      1.24,
17216
      1.3,
17217
      1.36,
17218
      1.42,
17219
      1.48,
17220
      1.54,
17221
      1.6,
17222
      1.66,
17223
      1.72,
17224
      1.78,
17225
      1.84,
17226
      1.9,
17227
      1.96,
17228
      2,
17229
      2.12,
17230
      2.25,
17231
      2.37,
17232
      2.5,
17233
      2.62,
17234
      2.75,
17235
      2.87,
17236
      3,
17237
      3.2,
17238
      3.4,
17239
      3.6,
17240
      3.8,
17241
      4,
17242
      4.3,
17243
      4.7,
17244
      4.9,
17245
      5,
17246
      5.5,
17247
      6,
17248
      6.5,
17249
      6.8,
17250
      7,
17251
      7.3,
17252
      7.5,
17253
      7.8,
17254
      8,
17255
      8.4,
17256
      8.7,
17257
      9,
17258
      9.4,
17259
      9.6,
17260
      9.8,
17261
      10
17262
    ];
17263
    var multiply = function (matrix1, matrix2) {
17264
      var col = [];
17265
      var out = new Array(25);
17266
      var val;
17267
      for (var i = 0; i < 5; i++) {
17268
        for (var j = 0; j < 5; j++) {
17269
          col[j] = matrix2[j + i * 5];
17270
        }
17271
        for (var j = 0; j < 5; j++) {
17272
          val = 0;
17273
          for (var k = 0; k < 5; k++) {
17274
            val += matrix1[j + k * 5] * col[k];
17275
          }
17276
          out[j + i * 5] = val;
17277
        }
17278
      }
17279
      return out;
17280
    };
17281
    var adjustContrast = function (matrix, value) {
17282
      var x;
637 daniel-mar 17283
      value = clamp(value, -1, 1);
597 daniel-mar 17284
      value *= 100;
17285
      if (value < 0) {
17286
        x = 127 + value / 100 * 127;
17287
      } else {
17288
        x = value % 1;
17289
        if (x === 0) {
17290
          x = DELTA_INDEX[value];
17291
        } else {
17292
          x = DELTA_INDEX[Math.floor(value)] * (1 - x) + DELTA_INDEX[Math.floor(value) + 1] * x;
17293
        }
17294
        x = x * 127 + 127;
17295
      }
17296
      return multiply(matrix, [
17297
        x / 127,
17298
        0,
17299
        0,
17300
        0,
17301
        0.5 * (127 - x),
17302
        0,
17303
        x / 127,
17304
        0,
17305
        0,
17306
        0.5 * (127 - x),
17307
        0,
17308
        0,
17309
        x / 127,
17310
        0,
17311
        0.5 * (127 - x),
17312
        0,
17313
        0,
17314
        0,
17315
        1,
17316
        0,
17317
        0,
17318
        0,
17319
        0,
17320
        0,
17321
        1
17322
      ]);
17323
    };
17324
    var adjustBrightness = function (matrix, value) {
637 daniel-mar 17325
      value = clamp(255 * value, -255, 255);
597 daniel-mar 17326
      return multiply(matrix, [
17327
        1,
17328
        0,
17329
        0,
17330
        0,
17331
        value,
17332
        0,
17333
        1,
17334
        0,
17335
        0,
17336
        value,
17337
        0,
17338
        0,
17339
        1,
17340
        0,
17341
        value,
17342
        0,
17343
        0,
17344
        0,
17345
        1,
17346
        0,
17347
        0,
17348
        0,
17349
        0,
17350
        0,
17351
        1
17352
      ]);
17353
    };
17354
    var adjustColors = function (matrix, adjustR, adjustG, adjustB) {
637 daniel-mar 17355
      adjustR = clamp(adjustR, 0, 2);
17356
      adjustG = clamp(adjustG, 0, 2);
17357
      adjustB = clamp(adjustB, 0, 2);
597 daniel-mar 17358
      return multiply(matrix, [
17359
        adjustR,
17360
        0,
17361
        0,
17362
        0,
17363
        0,
17364
        0,
17365
        adjustG,
17366
        0,
17367
        0,
17368
        0,
17369
        0,
17370
        0,
17371
        adjustB,
17372
        0,
17373
        0,
17374
        0,
17375
        0,
17376
        0,
17377
        1,
17378
        0,
17379
        0,
17380
        0,
17381
        0,
17382
        0,
17383
        1
17384
      ]);
17385
    };
17386
 
17387
    var colorFilter = function (ir, matrix) {
17388
      return ir.toCanvas().then(function (canvas) {
17389
        return applyColorFilter(canvas, ir.getType(), matrix);
17390
      });
17391
    };
17392
    var applyColorFilter = function (canvas, type, matrix) {
17393
      var context = get2dContext(canvas);
17394
      var applyMatrix = function (pixelsData, m) {
17395
        var r, g, b, a;
17396
        var data = pixelsData.data, m0 = m[0], m1 = m[1], m2 = m[2], m3 = m[3], m4 = m[4], m5 = m[5], m6 = m[6], m7 = m[7], m8 = m[8], m9 = m[9], m10 = m[10], m11 = m[11], m12 = m[12], m13 = m[13], m14 = m[14], m15 = m[15], m16 = m[16], m17 = m[17], m18 = m[18], m19 = m[19];
17397
        for (var i = 0; i < data.length; i += 4) {
17398
          r = data[i];
17399
          g = data[i + 1];
17400
          b = data[i + 2];
17401
          a = data[i + 3];
17402
          data[i] = r * m0 + g * m1 + b * m2 + a * m3 + m4;
17403
          data[i + 1] = r * m5 + g * m6 + b * m7 + a * m8 + m9;
17404
          data[i + 2] = r * m10 + g * m11 + b * m12 + a * m13 + m14;
17405
          data[i + 3] = r * m15 + g * m16 + b * m17 + a * m18 + m19;
17406
        }
17407
        return pixelsData;
17408
      };
17409
      var pixels = applyMatrix(context.getImageData(0, 0, canvas.width, canvas.height), matrix);
17410
      context.putImageData(pixels, 0, 0);
17411
      return fromCanvas(canvas, type);
17412
    };
17413
    var convoluteFilter = function (ir, matrix) {
17414
      return ir.toCanvas().then(function (canvas) {
17415
        return applyConvoluteFilter(canvas, ir.getType(), matrix);
17416
      });
17417
    };
17418
    var applyConvoluteFilter = function (canvas, type, matrix) {
17419
      var context = get2dContext(canvas);
17420
      var applyMatrix = function (pIn, pOut, aMatrix) {
17421
        var clamp = function (value, min, max) {
17422
          if (value > max) {
17423
            value = max;
17424
          } else if (value < min) {
17425
            value = min;
17426
          }
17427
          return value;
17428
        };
17429
        var side = Math.round(Math.sqrt(aMatrix.length));
17430
        var halfSide = Math.floor(side / 2);
17431
        var rgba = pIn.data;
17432
        var drgba = pOut.data;
17433
        var w = pIn.width;
17434
        var h = pIn.height;
17435
        for (var y = 0; y < h; y++) {
17436
          for (var x = 0; x < w; x++) {
17437
            var r = 0;
17438
            var g = 0;
17439
            var b = 0;
17440
            for (var cy = 0; cy < side; cy++) {
17441
              for (var cx = 0; cx < side; cx++) {
17442
                var scx = clamp(x + cx - halfSide, 0, w - 1);
17443
                var scy = clamp(y + cy - halfSide, 0, h - 1);
17444
                var innerOffset = (scy * w + scx) * 4;
17445
                var wt = aMatrix[cy * side + cx];
17446
                r += rgba[innerOffset] * wt;
17447
                g += rgba[innerOffset + 1] * wt;
17448
                b += rgba[innerOffset + 2] * wt;
17449
              }
17450
            }
17451
            var offset = (y * w + x) * 4;
17452
            drgba[offset] = clamp(r, 0, 255);
17453
            drgba[offset + 1] = clamp(g, 0, 255);
17454
            drgba[offset + 2] = clamp(b, 0, 255);
17455
          }
17456
        }
17457
        return pOut;
17458
      };
17459
      var pixelsIn = context.getImageData(0, 0, canvas.width, canvas.height);
17460
      var pixelsOut = context.getImageData(0, 0, canvas.width, canvas.height);
17461
      pixelsOut = applyMatrix(pixelsIn, pixelsOut, matrix);
17462
      context.putImageData(pixelsOut, 0, 0);
17463
      return fromCanvas(canvas, type);
17464
    };
17465
    var functionColorFilter = function (colorFn) {
17466
      var filterImpl = function (canvas, type, value) {
17467
        var context = get2dContext(canvas);
17468
        var lookup = new Array(256);
17469
        var applyLookup = function (pixelsData, lookupData) {
17470
          var data = pixelsData.data;
17471
          for (var i = 0; i < data.length; i += 4) {
17472
            data[i] = lookupData[data[i]];
17473
            data[i + 1] = lookupData[data[i + 1]];
17474
            data[i + 2] = lookupData[data[i + 2]];
17475
          }
17476
          return pixelsData;
17477
        };
17478
        for (var i = 0; i < lookup.length; i++) {
17479
          lookup[i] = colorFn(i, value);
17480
        }
17481
        var pixels = applyLookup(context.getImageData(0, 0, canvas.width, canvas.height), lookup);
17482
        context.putImageData(pixels, 0, 0);
17483
        return fromCanvas(canvas, type);
17484
      };
17485
      return function (ir, value) {
17486
        return ir.toCanvas().then(function (canvas) {
17487
          return filterImpl(canvas, ir.getType(), value);
17488
        });
17489
      };
17490
    };
17491
    var complexAdjustableColorFilter = function (matrixAdjustFn) {
17492
      return function (ir, adjust) {
637 daniel-mar 17493
        return colorFilter(ir, matrixAdjustFn(identity(), adjust));
597 daniel-mar 17494
      };
17495
    };
17496
    var basicColorFilter = function (matrix) {
17497
      return function (ir) {
17498
        return colorFilter(ir, matrix);
17499
      };
17500
    };
17501
    var basicConvolutionFilter = function (kernel) {
17502
      return function (ir) {
17503
        return convoluteFilter(ir, kernel);
17504
      };
17505
    };
637 daniel-mar 17506
    var invert$1 = basicColorFilter([
597 daniel-mar 17507
      -1,
17508
      0,
17509
      0,
17510
      0,
17511
      255,
17512
      0,
17513
      -1,
17514
      0,
17515
      0,
17516
      255,
17517
      0,
17518
      0,
17519
      -1,
17520
      0,
17521
      255,
17522
      0,
17523
      0,
17524
      0,
17525
      1,
17526
      0,
17527
      0,
17528
      0,
17529
      0,
17530
      0,
17531
      1
17532
    ]);
637 daniel-mar 17533
    var brightness$1 = complexAdjustableColorFilter(adjustBrightness);
17534
    var contrast$1 = complexAdjustableColorFilter(adjustContrast);
17535
    var colorize$1 = function (ir, adjustR, adjustG, adjustB) {
17536
      return colorFilter(ir, adjustColors(identity(), adjustR, adjustG, adjustB));
597 daniel-mar 17537
    };
637 daniel-mar 17538
    var sharpen$1 = basicConvolutionFilter([
597 daniel-mar 17539
      0,
17540
      -1,
17541
      0,
17542
      -1,
17543
      5,
17544
      -1,
17545
      0,
17546
      -1,
17547
 
17548
    ]);
637 daniel-mar 17549
    var gamma$1 = functionColorFilter(function (color, value) {
597 daniel-mar 17550
      return Math.pow(color / 255, 1 - value) * 255;
17551
    });
17552
 
17553
    var scale = function (image, dW, dH) {
637 daniel-mar 17554
      var sW = getWidth$1(image);
17555
      var sH = getHeight$1(image);
597 daniel-mar 17556
      var wRatio = dW / sW;
17557
      var hRatio = dH / sH;
17558
      var scaleCapped = false;
17559
      if (wRatio < 0.5 || wRatio > 2) {
17560
        wRatio = wRatio < 0.5 ? 0.5 : 2;
17561
        scaleCapped = true;
17562
      }
17563
      if (hRatio < 0.5 || hRatio > 2) {
17564
        hRatio = hRatio < 0.5 ? 0.5 : 2;
17565
        scaleCapped = true;
17566
      }
17567
      var scaled = _scale(image, wRatio, hRatio);
17568
      return !scaleCapped ? scaled : scaled.then(function (tCanvas) {
17569
        return scale(tCanvas, dW, dH);
17570
      });
17571
    };
17572
    var _scale = function (image, wRatio, hRatio) {
17573
      return new Promise$1(function (resolve) {
637 daniel-mar 17574
        var sW = getWidth$1(image);
17575
        var sH = getHeight$1(image);
597 daniel-mar 17576
        var dW = Math.floor(sW * wRatio);
17577
        var dH = Math.floor(sH * hRatio);
637 daniel-mar 17578
        var canvas = create$3(dW, dH);
597 daniel-mar 17579
        var context = get2dContext(canvas);
17580
        context.drawImage(image, 0, 0, sW, sH, 0, 0, dW, dH);
17581
        resolve(canvas);
17582
      });
17583
    };
17584
 
17585
    var ceilWithPrecision = function (num, precision) {
17586
      if (precision === void 0) {
17587
        precision = 2;
17588
      }
17589
      var mul = Math.pow(10, precision);
17590
      var upper = Math.round(num * mul);
17591
      return Math.ceil(upper / mul);
17592
    };
637 daniel-mar 17593
    var rotate$1 = function (ir, angle) {
597 daniel-mar 17594
      return ir.toCanvas().then(function (canvas) {
17595
        return applyRotate(canvas, ir.getType(), angle);
17596
      });
17597
    };
17598
    var applyRotate = function (image, type, angle) {
17599
      var degrees = angle < 0 ? 360 + angle : angle;
17600
      var rad = degrees * Math.PI / 180;
17601
      var width = image.width;
17602
      var height = image.height;
17603
      var sin = Math.sin(rad);
17604
      var cos = Math.cos(rad);
17605
      var newWidth = ceilWithPrecision(Math.abs(width * cos) + Math.abs(height * sin));
17606
      var newHeight = ceilWithPrecision(Math.abs(width * sin) + Math.abs(height * cos));
637 daniel-mar 17607
      var canvas = create$3(newWidth, newHeight);
597 daniel-mar 17608
      var context = get2dContext(canvas);
17609
      context.translate(newWidth / 2, newHeight / 2);
17610
      context.rotate(rad);
17611
      context.drawImage(image, -width / 2, -height / 2);
17612
      return fromCanvas(canvas, type);
17613
    };
637 daniel-mar 17614
    var flip$1 = function (ir, axis) {
597 daniel-mar 17615
      return ir.toCanvas().then(function (canvas) {
17616
        return applyFlip(canvas, ir.getType(), axis);
17617
      });
17618
    };
17619
    var applyFlip = function (image, type, axis) {
637 daniel-mar 17620
      var canvas = create$3(image.width, image.height);
597 daniel-mar 17621
      var context = get2dContext(canvas);
17622
      if (axis === 'v') {
17623
        context.scale(1, -1);
17624
        context.drawImage(image, 0, -canvas.height);
17625
      } else {
17626
        context.scale(-1, 1);
17627
        context.drawImage(image, -canvas.width, 0);
17628
      }
17629
      return fromCanvas(canvas, type);
17630
    };
637 daniel-mar 17631
    var crop$1 = function (ir, x, y, w, h) {
597 daniel-mar 17632
      return ir.toCanvas().then(function (canvas) {
17633
        return applyCrop(canvas, ir.getType(), x, y, w, h);
17634
      });
17635
    };
17636
    var applyCrop = function (image, type, x, y, w, h) {
637 daniel-mar 17637
      var canvas = create$3(w, h);
597 daniel-mar 17638
      var context = get2dContext(canvas);
17639
      context.drawImage(image, -x, -y);
17640
      return fromCanvas(canvas, type);
17641
    };
637 daniel-mar 17642
    var resize$2 = function (ir, w, h) {
597 daniel-mar 17643
      return ir.toCanvas().then(function (canvas) {
17644
        return scale(canvas, w, h).then(function (newCanvas) {
17645
          return fromCanvas(newCanvas, ir.getType());
17646
        });
17647
      });
17648
    };
17649
 
637 daniel-mar 17650
    var invert = function (ir) {
17651
      return invert$1(ir);
597 daniel-mar 17652
    };
637 daniel-mar 17653
    var sharpen = function (ir) {
17654
      return sharpen$1(ir);
597 daniel-mar 17655
    };
637 daniel-mar 17656
    var gamma = function (ir, value) {
17657
      return gamma$1(ir, value);
597 daniel-mar 17658
    };
637 daniel-mar 17659
    var colorize = function (ir, adjustR, adjustG, adjustB) {
17660
      return colorize$1(ir, adjustR, adjustG, adjustB);
597 daniel-mar 17661
    };
637 daniel-mar 17662
    var brightness = function (ir, adjust) {
17663
      return brightness$1(ir, adjust);
597 daniel-mar 17664
    };
637 daniel-mar 17665
    var contrast = function (ir, adjust) {
17666
      return contrast$1(ir, adjust);
597 daniel-mar 17667
    };
637 daniel-mar 17668
    var flip = function (ir, axis) {
17669
      return flip$1(ir, axis);
597 daniel-mar 17670
    };
637 daniel-mar 17671
    var crop = function (ir, x, y, w, h) {
17672
      return crop$1(ir, x, y, w, h);
597 daniel-mar 17673
    };
637 daniel-mar 17674
    var resize$1 = function (ir, w, h) {
17675
      return resize$2(ir, w, h);
597 daniel-mar 17676
    };
637 daniel-mar 17677
    var rotate = function (ir, angle) {
17678
      return rotate$1(ir, angle);
597 daniel-mar 17679
    };
17680
 
637 daniel-mar 17681
    var renderIcon = function (iconName, iconsProvider, behaviours) {
17682
      return render$3(iconName, {
17683
        tag: 'span',
17684
        classes: [
17685
          'tox-icon',
17686
          'tox-tbtn__icon-wrap'
17687
        ],
17688
        behaviours: behaviours
17689
      }, iconsProvider);
597 daniel-mar 17690
    };
17691
    var renderIconFromPack = function (iconName, iconsProvider) {
637 daniel-mar 17692
      return renderIcon(iconName, iconsProvider, []);
597 daniel-mar 17693
    };
17694
    var renderReplacableIconFromPack = function (iconName, iconsProvider) {
637 daniel-mar 17695
      return renderIcon(iconName, iconsProvider, [Replacing.config({})]);
597 daniel-mar 17696
    };
17697
    var renderLabel$1 = function (text, prefix, providersBackstage) {
17698
      return {
17699
        dom: {
17700
          tag: 'span',
17701
          innerHtml: providersBackstage.translate(text),
17702
          classes: [prefix + '__select-label']
17703
        },
17704
        behaviours: derive$1([Replacing.config({})])
17705
      };
17706
    };
17707
 
637 daniel-mar 17708
    var _a;
17709
    var internalToolbarButtonExecute = generate$6('toolbar.button.execute');
597 daniel-mar 17710
    var onToolbarButtonExecute = function (info) {
637 daniel-mar 17711
      return runOnExecute$1(function (comp, _simulatedEvent) {
597 daniel-mar 17712
        runWithApi(info, comp)(function (itemApi) {
17713
          emitWith(comp, internalToolbarButtonExecute, { buttonApi: itemApi });
17714
          info.onAction(itemApi);
17715
        });
17716
      });
17717
    };
637 daniel-mar 17718
    var toolbarButtonEventOrder = (_a = {}, _a[execute$5()] = [
597 daniel-mar 17719
      'disabling',
17720
      'alloy.base.behaviour',
17721
      'toggling',
17722
      'toolbar-button-events'
637 daniel-mar 17723
    ], _a);
597 daniel-mar 17724
 
637 daniel-mar 17725
    var updateMenuText = generate$6('update-menu-text');
17726
    var updateMenuIcon = generate$6('update-menu-icon');
597 daniel-mar 17727
    var renderCommonDropdown = function (spec, prefix, sharedBackstage) {
17728
      var editorOffCell = Cell(noop);
17729
      var optMemDisplayText = spec.text.map(function (text) {
17730
        return record(renderLabel$1(text, prefix, sharedBackstage.providers));
17731
      });
17732
      var optMemDisplayIcon = spec.icon.map(function (iconName) {
17733
        return record(renderReplacableIconFromPack(iconName, sharedBackstage.providers.icons));
17734
      });
17735
      var onLeftOrRightInMenu = function (comp, se) {
17736
        var dropdown = Representing.getValue(comp);
17737
        Focusing.focus(dropdown);
17738
        emitWith(dropdown, 'keydown', { raw: se.event.raw });
17739
        Dropdown.close(dropdown);
17740
        return Optional.some(true);
17741
      };
17742
      var role = spec.role.fold(function () {
17743
        return {};
17744
      }, function (role) {
17745
        return { role: role };
17746
      });
17747
      var tooltipAttributes = spec.tooltip.fold(function () {
17748
        return {};
17749
      }, function (tooltip) {
17750
        var translatedTooltip = sharedBackstage.providers.translate(tooltip);
17751
        return {
17752
          'title': translatedTooltip,
17753
          'aria-label': translatedTooltip
17754
        };
17755
      });
637 daniel-mar 17756
      var iconSpec = render$3('chevron-down', {
17757
        tag: 'div',
17758
        classes: [prefix + '__select-chevron']
17759
      }, sharedBackstage.providers.icons);
597 daniel-mar 17760
      var memDropdown = record(Dropdown.sketch(__assign(__assign(__assign({}, spec.uid ? { uid: spec.uid } : {}), role), {
17761
        dom: {
17762
          tag: 'button',
17763
          classes: [
17764
            prefix,
17765
            prefix + '--select'
637 daniel-mar 17766
          ].concat(map$2(spec.classes, function (c) {
597 daniel-mar 17767
            return prefix + '--' + c;
17768
          })),
17769
          attributes: __assign({}, tooltipAttributes)
17770
        },
17771
        components: componentRenderPipeline([
17772
          optMemDisplayIcon.map(function (mem) {
17773
            return mem.asSpec();
17774
          }),
17775
          optMemDisplayText.map(function (mem) {
17776
            return mem.asSpec();
17777
          }),
637 daniel-mar 17778
          Optional.some(iconSpec)
597 daniel-mar 17779
        ]),
17780
        matchWidth: true,
17781
        useMinWidth: true,
679 daniel-mar 17782
        dropdownBehaviours: derive$1(__spreadArray(__spreadArray([], spec.dropdownBehaviours, true), [
597 daniel-mar 17783
          DisablingConfigs.button(function () {
17784
            return spec.disabled || sharedBackstage.providers.isDisabled();
17785
          }),
17786
          receivingConfig(),
17787
          Unselecting.config({}),
17788
          Replacing.config({}),
17789
          config('dropdown-events', [
17790
            onControlAttached(spec, editorOffCell),
17791
            onControlDetached(spec, editorOffCell)
17792
          ]),
17793
          config('menubutton-update-display-text', [
637 daniel-mar 17794
            run$1(updateMenuText, function (comp, se) {
597 daniel-mar 17795
              optMemDisplayText.bind(function (mem) {
17796
                return mem.getOpt(comp);
17797
              }).each(function (displayText) {
17798
                Replacing.set(displayText, [text(sharedBackstage.providers.translate(se.event.text))]);
17799
              });
17800
            }),
637 daniel-mar 17801
            run$1(updateMenuIcon, function (comp, se) {
597 daniel-mar 17802
              optMemDisplayIcon.bind(function (mem) {
17803
                return mem.getOpt(comp);
17804
              }).each(function (displayIcon) {
17805
                Replacing.set(displayIcon, [renderReplacableIconFromPack(se.event.icon, sharedBackstage.providers.icons)]);
17806
              });
17807
            })
17808
          ])
679 daniel-mar 17809
        ], false)),
597 daniel-mar 17810
        eventOrder: deepMerge(toolbarButtonEventOrder, {
17811
          mousedown: [
17812
            'focusing',
17813
            'alloy.base.behaviour',
17814
            'item-type-events',
17815
            'normal-dropdown-events'
17816
          ]
17817
        }),
17818
        sandboxBehaviours: derive$1([Keying.config({
17819
            mode: 'special',
17820
            onLeft: onLeftOrRightInMenu,
17821
            onRight: onLeftOrRightInMenu
17822
          })]),
17823
        lazySink: sharedBackstage.getSink,
17824
        toggleClass: prefix + '--active',
17825
        parts: { menu: part(false, spec.columns, spec.presets) },
17826
        fetch: function (comp) {
17827
          return Future.nu(curry(spec.fetch, comp));
17828
        }
17829
      })));
17830
      return memDropdown.asSpec();
17831
    };
17832
 
17833
    var isMenuItemReference = function (item) {
17834
      return isString(item);
17835
    };
637 daniel-mar 17836
    var isSeparator$1 = function (item) {
597 daniel-mar 17837
      return item.type === 'separator';
17838
    };
17839
    var isExpandingMenuItem = function (item) {
637 daniel-mar 17840
      return has$2(item, 'getSubmenuItems');
597 daniel-mar 17841
    };
637 daniel-mar 17842
    var separator$2 = { type: 'separator' };
597 daniel-mar 17843
    var unwrapReferences = function (items, menuItems) {
17844
      var realItems = foldl(items, function (acc, item) {
17845
        if (isMenuItemReference(item)) {
17846
          if (item === '') {
17847
            return acc;
17848
          } else if (item === '|') {
637 daniel-mar 17849
            return acc.length > 0 && !isSeparator$1(acc[acc.length - 1]) ? acc.concat([separator$2]) : acc;
17850
          } else if (has$2(menuItems, item.toLowerCase())) {
597 daniel-mar 17851
            return acc.concat([menuItems[item.toLowerCase()]]);
17852
          } else {
17853
            return acc;
17854
          }
17855
        } else {
17856
          return acc.concat([item]);
17857
        }
17858
      }, []);
637 daniel-mar 17859
      if (realItems.length > 0 && isSeparator$1(realItems[realItems.length - 1])) {
597 daniel-mar 17860
        realItems.pop();
17861
      }
17862
      return realItems;
17863
    };
17864
    var getFromExpandingItem = function (item, menuItems) {
17865
      var submenuItems = item.getSubmenuItems();
17866
      var rest = expand(submenuItems, menuItems);
17867
      var newMenus = deepMerge(rest.menus, wrap$1(item.value, rest.items));
17868
      var newExpansions = deepMerge(rest.expansions, wrap$1(item.value, item.value));
17869
      return {
17870
        item: item,
17871
        menus: newMenus,
17872
        expansions: newExpansions
17873
      };
17874
    };
17875
    var getFromItem = function (item, menuItems) {
17876
      return isExpandingMenuItem(item) ? getFromExpandingItem(item, menuItems) : {
17877
        item: item,
17878
        menus: {},
17879
        expansions: {}
17880
      };
17881
    };
17882
    var generateValueIfRequired = function (item) {
637 daniel-mar 17883
      if (isSeparator$1(item)) {
597 daniel-mar 17884
        return item;
17885
      } else {
637 daniel-mar 17886
        var itemValue = get$e(item, 'value').getOrThunk(function () {
17887
          return generate$6('generated-menu-item');
597 daniel-mar 17888
        });
17889
        return deepMerge({ value: itemValue }, item);
17890
      }
17891
    };
17892
    var expand = function (items, menuItems) {
17893
      var realItems = unwrapReferences(isString(items) ? items.split(' ') : items, menuItems);
17894
      return foldr(realItems, function (acc, item) {
17895
        var itemWithValue = generateValueIfRequired(item);
17896
        var newData = getFromItem(itemWithValue, menuItems);
17897
        return {
17898
          menus: deepMerge(acc.menus, newData.menus),
17899
          items: [newData.item].concat(acc.items),
17900
          expansions: deepMerge(acc.expansions, newData.expansions)
17901
        };
17902
      }, {
17903
        menus: {},
17904
        expansions: {},
17905
        items: []
17906
      });
17907
    };
17908
 
637 daniel-mar 17909
    var build = function (items, itemResponse, backstage, isHorizontalMenu) {
17910
      var primary = generate$6('primary-menu');
597 daniel-mar 17911
      var data = expand(items, backstage.shared.providers.menuItems());
17912
      if (data.items.length === 0) {
17913
        return Optional.none();
17914
      }
17915
      var mainMenu = createPartialMenu(primary, data.items, itemResponse, backstage, isHorizontalMenu);
679 daniel-mar 17916
      var submenus = map$1(data.menus, function (menuItems, menuName) {
597 daniel-mar 17917
        return createPartialMenu(menuName, menuItems, itemResponse, backstage, false);
17918
      });
17919
      var menus = deepMerge(submenus, wrap$1(primary, mainMenu));
17920
      return Optional.from(tieredMenu.tieredData(primary, menus, data.expansions));
17921
    };
17922
 
17923
    var getMenuButtonApi = function (component) {
17924
      return {
17925
        isDisabled: function () {
17926
          return Disabling.isDisabled(component);
17927
        },
17928
        setDisabled: function (state) {
17929
          return Disabling.set(component, state);
17930
        },
17931
        setActive: function (state) {
17932
          var elm = component.element;
17933
          if (state) {
17934
            add$2(elm, 'tox-tbtn--enabled');
679 daniel-mar 17935
            set$8(elm, 'aria-pressed', true);
597 daniel-mar 17936
          } else {
679 daniel-mar 17937
            remove$2(elm, 'tox-tbtn--enabled');
17938
            remove$7(elm, 'aria-pressed');
597 daniel-mar 17939
          }
17940
        },
17941
        isActive: function () {
637 daniel-mar 17942
          return has(component.element, 'tox-tbtn--enabled');
597 daniel-mar 17943
        }
17944
      };
17945
    };
17946
    var renderMenuButton = function (spec, prefix, backstage, role) {
17947
      return renderCommonDropdown({
17948
        text: spec.text,
17949
        icon: spec.icon,
17950
        tooltip: spec.tooltip,
17951
        role: role,
17952
        fetch: function (_comp, callback) {
17953
          spec.fetch(function (items) {
637 daniel-mar 17954
            callback(build(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, false));
597 daniel-mar 17955
          });
17956
        },
17957
        onSetup: spec.onSetup,
17958
        getApi: getMenuButtonApi,
17959
        columns: 1,
17960
        presets: 'normal',
17961
        classes: [],
17962
        dropdownBehaviours: [Tabstopping.config({})]
17963
      }, prefix, backstage.shared);
17964
    };
637 daniel-mar 17965
    var getFetch = function (items, getButton, backstage) {
597 daniel-mar 17966
      var getMenuItemAction = function (item) {
17967
        return function (api) {
17968
          var newValue = !api.isActive();
17969
          api.setActive(newValue);
17970
          item.storage.set(newValue);
17971
          backstage.shared.getSink().each(function (sink) {
17972
            getButton().getOpt(sink).each(function (orig) {
637 daniel-mar 17973
              focus$3(orig.element);
597 daniel-mar 17974
              emitWith(orig, formActionEvent, {
17975
                name: item.name,
17976
                value: item.storage.get()
17977
              });
17978
            });
17979
          });
17980
        };
17981
      };
17982
      var getMenuItemSetup = function (item) {
17983
        return function (api) {
17984
          api.setActive(item.storage.get());
17985
        };
17986
      };
17987
      return function (success) {
637 daniel-mar 17988
        success(map$2(items, function (item) {
597 daniel-mar 17989
          var text = item.text.fold(function () {
17990
            return {};
17991
          }, function (text) {
17992
            return { text: text };
17993
          });
17994
          return __assign(__assign({
17995
            type: item.type,
17996
            active: false
17997
          }, text), {
17998
            onAction: getMenuItemAction(item),
17999
            onSetup: getMenuItemSetup(item)
18000
          });
18001
        }));
18002
      };
18003
    };
18004
 
18005
    var renderCommonSpec = function (spec, actionOpt, extraBehaviours, dom, components, providersBackstage) {
18006
      if (extraBehaviours === void 0) {
18007
        extraBehaviours = [];
18008
      }
18009
      var action = actionOpt.fold(function () {
18010
        return {};
18011
      }, function (action) {
18012
        return { action: action };
18013
      });
18014
      var common = __assign({
18015
        buttonBehaviours: derive$1([
18016
          DisablingConfigs.button(function () {
18017
            return spec.disabled || providersBackstage.isDisabled();
18018
          }),
18019
          receivingConfig(),
18020
          Tabstopping.config({}),
18021
          config('button press', [
18022
            preventDefault('click'),
18023
            preventDefault('mousedown')
18024
          ])
18025
        ].concat(extraBehaviours)),
18026
        eventOrder: {
18027
          click: [
18028
            'button press',
18029
            'alloy.base.behaviour'
18030
          ],
18031
          mousedown: [
18032
            'button press',
18033
            'alloy.base.behaviour'
18034
          ]
18035
        }
18036
      }, action);
18037
      var domFinal = deepMerge(common, { dom: dom });
18038
      return deepMerge(domFinal, { components: components });
18039
    };
18040
    var renderIconButtonSpec = function (spec, action, providersBackstage, extraBehaviours) {
18041
      if (extraBehaviours === void 0) {
18042
        extraBehaviours = [];
18043
      }
18044
      var tooltipAttributes = spec.tooltip.map(function (tooltip) {
18045
        return {
18046
          'aria-label': providersBackstage.translate(tooltip),
18047
          'title': providersBackstage.translate(tooltip)
18048
        };
18049
      }).getOr({});
18050
      var dom = {
18051
        tag: 'button',
18052
        classes: ['tox-tbtn'],
18053
        attributes: tooltipAttributes
18054
      };
18055
      var icon = spec.icon.map(function (iconName) {
18056
        return renderIconFromPack(iconName, providersBackstage.icons);
18057
      });
18058
      var components = componentRenderPipeline([icon]);
18059
      return renderCommonSpec(spec, action, extraBehaviours, dom, components, providersBackstage);
18060
    };
18061
    var renderIconButton = function (spec, action, providersBackstage, extraBehaviours) {
18062
      if (extraBehaviours === void 0) {
18063
        extraBehaviours = [];
18064
      }
18065
      var iconButtonSpec = renderIconButtonSpec(spec, Optional.some(action), providersBackstage, extraBehaviours);
18066
      return Button.sketch(iconButtonSpec);
18067
    };
18068
    var renderButtonSpec = function (spec, action, providersBackstage, extraBehaviours, extraClasses) {
18069
      if (extraBehaviours === void 0) {
18070
        extraBehaviours = [];
18071
      }
18072
      if (extraClasses === void 0) {
18073
        extraClasses = [];
18074
      }
18075
      var translatedText = providersBackstage.translate(spec.text);
18076
      var icon = spec.icon ? spec.icon.map(function (iconName) {
18077
        return renderIconFromPack(iconName, providersBackstage.icons);
18078
      }) : Optional.none();
18079
      var components = icon.isSome() ? componentRenderPipeline([icon]) : [];
18080
      var innerHtml = icon.isSome() ? {} : { innerHtml: translatedText };
637 daniel-mar 18081
      var classes = __spreadArray(__spreadArray(__spreadArray(__spreadArray([], !spec.primary && !spec.borderless ? [
597 daniel-mar 18082
        'tox-button',
18083
        'tox-button--secondary'
679 daniel-mar 18084
      ] : ['tox-button'], true), icon.isSome() ? ['tox-button--icon'] : [], true), spec.borderless ? ['tox-button--naked'] : [], true), extraClasses, true);
597 daniel-mar 18085
      var dom = __assign(__assign({
18086
        tag: 'button',
18087
        classes: classes
18088
      }, innerHtml), { attributes: { title: translatedText } });
18089
      return renderCommonSpec(spec, action, extraBehaviours, dom, components, providersBackstage);
18090
    };
18091
    var renderButton = function (spec, action, providersBackstage, extraBehaviours, extraClasses) {
18092
      if (extraBehaviours === void 0) {
18093
        extraBehaviours = [];
18094
      }
18095
      if (extraClasses === void 0) {
18096
        extraClasses = [];
18097
      }
18098
      var buttonSpec = renderButtonSpec(spec, Optional.some(action), providersBackstage, extraBehaviours, extraClasses);
18099
      return Button.sketch(buttonSpec);
18100
    };
18101
    var getAction = function (name, buttonType) {
18102
      return function (comp) {
18103
        if (buttonType === 'custom') {
18104
          emitWith(comp, formActionEvent, {
18105
            name: name,
18106
            value: {}
18107
          });
18108
        } else if (buttonType === 'submit') {
18109
          emit(comp, formSubmitEvent);
18110
        } else if (buttonType === 'cancel') {
18111
          emit(comp, formCancelEvent);
18112
        } else {
18113
          console.error('Unknown button type: ', buttonType);
18114
        }
18115
      };
18116
    };
18117
    var isMenuFooterButtonSpec = function (spec, buttonType) {
18118
      return buttonType === 'menu';
18119
    };
18120
    var isNormalFooterButtonSpec = function (spec, buttonType) {
18121
      return buttonType === 'custom' || buttonType === 'cancel' || buttonType === 'submit';
18122
    };
18123
    var renderFooterButton = function (spec, buttonType, backstage) {
18124
      if (isMenuFooterButtonSpec(spec, buttonType)) {
18125
        var getButton = function () {
18126
          return memButton_1;
18127
        };
18128
        var menuButtonSpec = spec;
18129
        var fixedSpec = __assign(__assign({}, spec), {
18130
          onSetup: function (api) {
18131
            api.setDisabled(spec.disabled);
18132
            return noop;
18133
          },
637 daniel-mar 18134
          fetch: getFetch(menuButtonSpec.items, getButton, backstage)
597 daniel-mar 18135
        });
18136
        var memButton_1 = record(renderMenuButton(fixedSpec, 'tox-tbtn', backstage, Optional.none()));
18137
        return memButton_1.asSpec();
18138
      } else if (isNormalFooterButtonSpec(spec, buttonType)) {
18139
        var action = getAction(spec.name, buttonType);
18140
        var buttonSpec = __assign(__assign({}, spec), { borderless: false });
18141
        return renderButton(buttonSpec, action, backstage.shared.providers, []);
18142
      } else {
18143
        console.error('Unknown footer button type: ', buttonType);
18144
      }
18145
    };
18146
    var renderDialogButton = function (spec, providersBackstage) {
18147
      var action = getAction(spec.name, 'custom');
18148
      return renderFormField(Optional.none(), FormField.parts.field(__assign({ factory: Button }, renderButtonSpec(spec, Optional.some(action), providersBackstage, [
18149
        RepresentingConfigs.memory(''),
18150
        ComposingConfigs.self()
18151
      ]))));
18152
    };
18153
 
637 daniel-mar 18154
    var schema$h = constant$1([
18155
      defaulted('field1Name', 'field1'),
18156
      defaulted('field2Name', 'field2'),
597 daniel-mar 18157
      onStrictHandler('onLockedChange'),
637 daniel-mar 18158
      markers$1(['lockClass']),
18159
      defaulted('locked', false),
597 daniel-mar 18160
      SketchBehaviours.field('coupledFieldBehaviours', [
18161
        Composing,
18162
        Representing
18163
      ])
18164
    ]);
18165
    var getField = function (comp, detail, partName) {
18166
      return getPart(comp, detail, partName).bind(Composing.getCurrent);
18167
    };
18168
    var coupledPart = function (selfName, otherName) {
18169
      return required({
18170
        factory: FormField,
18171
        name: selfName,
18172
        overrides: function (detail) {
18173
          return {
637 daniel-mar 18174
            fieldBehaviours: derive$1([config('coupled-input-behaviour', [run$1(input(), function (me) {
597 daniel-mar 18175
                  getField(me, detail, otherName).each(function (other) {
18176
                    getPart(me, detail, 'lock').each(function (lock) {
18177
                      if (Toggling.isOn(lock)) {
18178
                        detail.onLockedChange(me, other, lock);
18179
                      }
18180
                    });
18181
                  });
18182
                })])])
18183
          };
18184
        }
18185
      });
18186
    };
637 daniel-mar 18187
    var parts$c = constant$1([
597 daniel-mar 18188
      coupledPart('field1', 'field2'),
18189
      coupledPart('field2', 'field1'),
18190
      required({
18191
        factory: Button,
637 daniel-mar 18192
        schema: [required$1('dom')],
597 daniel-mar 18193
        name: 'lock',
18194
        overrides: function (detail) {
18195
          return {
18196
            buttonBehaviours: derive$1([Toggling.config({
18197
                selected: detail.locked,
18198
                toggleClass: detail.markers.lockClass,
18199
                aria: { mode: 'pressed' }
18200
              })])
18201
          };
18202
        }
18203
      })
18204
    ]);
18205
 
637 daniel-mar 18206
    var factory$f = function (detail, components, _spec, _externals) {
597 daniel-mar 18207
      return {
18208
        uid: detail.uid,
18209
        dom: detail.dom,
18210
        components: components,
18211
        behaviours: SketchBehaviours.augment(detail.coupledFieldBehaviours, [
18212
          Composing.config({ find: Optional.some }),
18213
          Representing.config({
18214
            store: {
18215
              mode: 'manual',
18216
              getValue: function (comp) {
18217
                var _a;
18218
                var parts = getPartsOrDie(comp, detail, [
18219
                  'field1',
18220
                  'field2'
18221
                ]);
18222
                return _a = {}, _a[detail.field1Name] = Representing.getValue(parts.field1()), _a[detail.field2Name] = Representing.getValue(parts.field2()), _a;
18223
              },
18224
              setValue: function (comp, value) {
18225
                var parts = getPartsOrDie(comp, detail, [
18226
                  'field1',
18227
                  'field2'
18228
                ]);
18229
                if (hasNonNullableKey(value, detail.field1Name)) {
18230
                  Representing.setValue(parts.field1(), value[detail.field1Name]);
18231
                }
18232
                if (hasNonNullableKey(value, detail.field2Name)) {
18233
                  Representing.setValue(parts.field2(), value[detail.field2Name]);
18234
                }
18235
              }
18236
            }
18237
          })
18238
        ]),
18239
        apis: {
18240
          getField1: function (component) {
18241
            return getPart(component, detail, 'field1');
18242
          },
18243
          getField2: function (component) {
18244
            return getPart(component, detail, 'field2');
18245
          },
18246
          getLock: function (component) {
18247
            return getPart(component, detail, 'lock');
18248
          }
18249
        }
18250
      };
18251
    };
637 daniel-mar 18252
    var FormCoupledInputs = composite({
597 daniel-mar 18253
      name: 'FormCoupledInputs',
637 daniel-mar 18254
      configFields: schema$h(),
18255
      partFields: parts$c(),
18256
      factory: factory$f,
597 daniel-mar 18257
      apis: {
18258
        getField1: function (apis, component) {
18259
          return apis.getField1(component);
18260
        },
18261
        getField2: function (apis, component) {
18262
          return apis.getField2(component);
18263
        },
18264
        getLock: function (apis, component) {
18265
          return apis.getLock(component);
18266
        }
18267
      }
18268
    });
18269
 
18270
    var formatSize = function (size) {
18271
      var unitDec = {
18272
        '': 0,
18273
        'px': 0,
18274
        'pt': 1,
18275
        'mm': 1,
18276
        'pc': 2,
18277
        'ex': 2,
18278
        'em': 2,
18279
        'ch': 2,
18280
        'rem': 2,
18281
        'cm': 3,
18282
        'in': 4,
18283
        '%': 4
18284
      };
18285
      var maxDecimal = function (unit) {
18286
        return unit in unitDec ? unitDec[unit] : 1;
18287
      };
18288
      var numText = size.value.toFixed(maxDecimal(size.unit));
18289
      if (numText.indexOf('.') !== -1) {
18290
        numText = numText.replace(/\.?0*$/, '');
18291
      }
18292
      return numText + size.unit;
18293
    };
18294
    var parseSize = function (sizeText) {
18295
      var numPattern = /^\s*(\d+(?:\.\d+)?)\s*(|cm|mm|in|px|pt|pc|em|ex|ch|rem|vw|vh|vmin|vmax|%)\s*$/;
18296
      var match = numPattern.exec(sizeText);
18297
      if (match !== null) {
18298
        var value = parseFloat(match[1]);
18299
        var unit = match[2];
18300
        return Result.value({
18301
          value: value,
18302
          unit: unit
18303
        });
18304
      } else {
18305
        return Result.error(sizeText);
18306
      }
18307
    };
18308
    var convertUnit = function (size, unit) {
18309
      var inInch = {
18310
        '': 96,
18311
        'px': 96,
18312
        'pt': 72,
18313
        'cm': 2.54,
18314
        'pc': 12,
18315
        'mm': 25.4,
18316
        'in': 1
18317
      };
18318
      var supported = function (u) {
637 daniel-mar 18319
        return has$2(inInch, u);
597 daniel-mar 18320
      };
18321
      if (size.unit === unit) {
18322
        return Optional.some(size.value);
18323
      } else if (supported(size.unit) && supported(unit)) {
18324
        if (inInch[size.unit] === inInch[unit]) {
18325
          return Optional.some(size.value);
18326
        } else {
18327
          return Optional.some(size.value / inInch[size.unit] * inInch[unit]);
18328
        }
18329
      } else {
18330
        return Optional.none();
18331
      }
18332
    };
18333
    var noSizeConversion = function (_input) {
18334
      return Optional.none();
18335
    };
18336
    var ratioSizeConversion = function (scale, unit) {
18337
      return function (size) {
18338
        return convertUnit(size, unit).map(function (value) {
18339
          return {
18340
            value: value * scale,
18341
            unit: unit
18342
          };
18343
        });
18344
      };
18345
    };
18346
    var makeRatioConverter = function (currentFieldText, otherFieldText) {
18347
      var cValue = parseSize(currentFieldText).toOptional();
18348
      var oValue = parseSize(otherFieldText).toOptional();
18349
      return lift2(cValue, oValue, function (cSize, oSize) {
18350
        return convertUnit(cSize, oSize.unit).map(function (val) {
18351
          return oSize.value / val;
18352
        }).map(function (r) {
18353
          return ratioSizeConversion(r, oSize.unit);
18354
        }).getOr(noSizeConversion);
18355
      }).getOr(noSizeConversion);
18356
    };
18357
 
18358
    var renderSizeInput = function (spec, providersBackstage) {
18359
      var converter = noSizeConversion;
637 daniel-mar 18360
      var ratioEvent = generate$6('ratio-event');
18361
      var makeIcon = function (iconName) {
18362
        return render$3(iconName, {
18363
          tag: 'span',
18364
          classes: [
18365
            'tox-icon',
18366
            'tox-lock-icon__' + iconName
18367
          ]
18368
        }, providersBackstage.icons);
18369
      };
597 daniel-mar 18370
      var pLock = FormCoupledInputs.parts.lock({
18371
        dom: {
18372
          tag: 'button',
18373
          classes: [
18374
            'tox-lock',
18375
            'tox-button',
18376
            'tox-button--naked',
18377
            'tox-button--icon'
18378
          ],
18379
          attributes: { title: providersBackstage.translate(spec.label.getOr('Constrain proportions')) }
18380
        },
18381
        components: [
637 daniel-mar 18382
          makeIcon('lock'),
18383
          makeIcon('unlock')
597 daniel-mar 18384
        ],
18385
        buttonBehaviours: derive$1([
18386
          Disabling.config({
18387
            disabled: function () {
18388
              return spec.disabled || providersBackstage.isDisabled();
18389
            }
18390
          }),
18391
          receivingConfig(),
18392
          Tabstopping.config({})
18393
        ])
18394
      });
18395
      var formGroup = function (components) {
18396
        return {
18397
          dom: {
18398
            tag: 'div',
18399
            classes: ['tox-form__group']
18400
          },
18401
          components: components
18402
        };
18403
      };
18404
      var getFieldPart = function (isField1) {
18405
        return FormField.parts.field({
18406
          factory: Input,
18407
          inputClasses: ['tox-textfield'],
18408
          inputBehaviours: derive$1([
18409
            Disabling.config({
18410
              disabled: function () {
18411
                return spec.disabled || providersBackstage.isDisabled();
18412
              }
18413
            }),
18414
            receivingConfig(),
18415
            Tabstopping.config({}),
18416
            config('size-input-events', [
637 daniel-mar 18417
              run$1(focusin(), function (component, _simulatedEvent) {
597 daniel-mar 18418
                emitWith(component, ratioEvent, { isField1: isField1 });
18419
              }),
637 daniel-mar 18420
              run$1(change(), function (component, _simulatedEvent) {
597 daniel-mar 18421
                emitWith(component, formChangeEvent, { name: spec.name });
18422
              })
18423
            ])
18424
          ]),
18425
          selectOnFocus: false
18426
        });
18427
      };
18428
      var getLabel = function (label) {
18429
        return {
18430
          dom: {
18431
            tag: 'label',
18432
            classes: ['tox-label'],
18433
            innerHtml: providersBackstage.translate(label)
18434
          }
18435
        };
18436
      };
18437
      var widthField = FormCoupledInputs.parts.field1(formGroup([
18438
        FormField.parts.label(getLabel('Width')),
18439
        getFieldPart(true)
18440
      ]));
18441
      var heightField = FormCoupledInputs.parts.field2(formGroup([
18442
        FormField.parts.label(getLabel('Height')),
18443
        getFieldPart(false)
18444
      ]));
18445
      return FormCoupledInputs.sketch({
18446
        dom: {
18447
          tag: 'div',
18448
          classes: ['tox-form__group']
18449
        },
18450
        components: [{
18451
            dom: {
18452
              tag: 'div',
18453
              classes: ['tox-form__controls-h-stack']
18454
            },
18455
            components: [
18456
              widthField,
18457
              heightField,
18458
              formGroup([
18459
                getLabel('&nbsp;'),
18460
                pLock
18461
              ])
18462
            ]
18463
          }],
18464
        field1Name: 'width',
18465
        field2Name: 'height',
18466
        locked: true,
18467
        markers: { lockClass: 'tox-locked' },
18468
        onLockedChange: function (current, other, _lock) {
18469
          parseSize(Representing.getValue(current)).each(function (size) {
18470
            converter(size).each(function (newSize) {
18471
              Representing.setValue(other, formatSize(newSize));
18472
            });
18473
          });
18474
        },
18475
        coupledFieldBehaviours: derive$1([
18476
          Disabling.config({
18477
            disabled: function () {
18478
              return spec.disabled || providersBackstage.isDisabled();
18479
            },
18480
            onDisabled: function (comp) {
18481
              FormCoupledInputs.getField1(comp).bind(FormField.getField).each(Disabling.disable);
18482
              FormCoupledInputs.getField2(comp).bind(FormField.getField).each(Disabling.disable);
18483
              FormCoupledInputs.getLock(comp).each(Disabling.disable);
18484
            },
18485
            onEnabled: function (comp) {
18486
              FormCoupledInputs.getField1(comp).bind(FormField.getField).each(Disabling.enable);
18487
              FormCoupledInputs.getField2(comp).bind(FormField.getField).each(Disabling.enable);
18488
              FormCoupledInputs.getLock(comp).each(Disabling.enable);
18489
            }
18490
          }),
18491
          receivingConfig(),
637 daniel-mar 18492
          config('size-input-events2', [run$1(ratioEvent, function (component, simulatedEvent) {
597 daniel-mar 18493
              var isField1 = simulatedEvent.event.isField1;
18494
              var optCurrent = isField1 ? FormCoupledInputs.getField1(component) : FormCoupledInputs.getField2(component);
18495
              var optOther = isField1 ? FormCoupledInputs.getField2(component) : FormCoupledInputs.getField1(component);
18496
              var value1 = optCurrent.map(Representing.getValue).getOr('');
18497
              var value2 = optOther.map(Representing.getValue).getOr('');
18498
              converter = makeRatioConverter(value1, value2);
18499
            })])
18500
        ])
18501
      });
18502
    };
18503
 
637 daniel-mar 18504
    var undo = constant$1(generate$6('undo'));
18505
    var redo = constant$1(generate$6('redo'));
18506
    var zoom = constant$1(generate$6('zoom'));
18507
    var back = constant$1(generate$6('back'));
18508
    var apply = constant$1(generate$6('apply'));
18509
    var swap = constant$1(generate$6('swap'));
18510
    var transform$1 = constant$1(generate$6('transform'));
18511
    var tempTransform = constant$1(generate$6('temp-transform'));
18512
    var transformApply = constant$1(generate$6('transform-apply'));
597 daniel-mar 18513
    var internal = {
18514
      undo: undo,
18515
      redo: redo,
18516
      zoom: zoom,
18517
      back: back,
18518
      apply: apply,
18519
      swap: swap,
637 daniel-mar 18520
      transform: transform$1,
597 daniel-mar 18521
      tempTransform: tempTransform,
18522
      transformApply: transformApply
18523
    };
637 daniel-mar 18524
    var saveState = constant$1('save-state');
18525
    var disable = constant$1('disable');
18526
    var enable = constant$1('enable');
18527
    var external = {
597 daniel-mar 18528
      formActionEvent: formActionEvent,
18529
      saveState: saveState,
637 daniel-mar 18530
      disable: disable,
18531
      enable: enable
597 daniel-mar 18532
    };
18533
 
18534
    var renderEditPanel = function (imagePanel, providersBackstage) {
18535
      var createButton = function (text, action, disabled, primary) {
18536
        return record(renderButton({
18537
          name: text,
18538
          text: text,
18539
          disabled: disabled,
18540
          primary: primary,
18541
          icon: Optional.none(),
18542
          borderless: false
18543
        }, action, providersBackstage));
18544
      };
18545
      var createIconButton = function (icon, tooltip, action, disabled) {
18546
        return record(renderIconButton({
18547
          name: icon,
18548
          icon: Optional.some(icon),
18549
          tooltip: Optional.some(tooltip),
18550
          disabled: disabled,
18551
          primary: false,
18552
          borderless: false
18553
        }, action, providersBackstage));
18554
      };
18555
      var disableAllComponents = function (comps, eventcomp) {
18556
        comps.map(function (mem) {
18557
          var component = mem.get(eventcomp);
18558
          if (component.hasConfigured(Disabling)) {
18559
            Disabling.disable(component);
18560
          }
18561
        });
18562
      };
18563
      var enableAllComponents = function (comps, eventcomp) {
18564
        comps.map(function (mem) {
18565
          var component = mem.get(eventcomp);
18566
          if (component.hasConfigured(Disabling)) {
18567
            Disabling.enable(component);
18568
          }
18569
        });
18570
      };
18571
      var panelDom = {
18572
        tag: 'div',
18573
        classes: [
18574
          'tox-image-tools__toolbar',
18575
          'tox-image-tools-edit-panel'
18576
        ]
18577
      };
18578
      var noop$1 = noop;
18579
      var emit$1 = function (comp, event, data) {
18580
        emitWith(comp, event, data);
18581
      };
18582
      var emitDisable = function (component) {
637 daniel-mar 18583
        return emit(component, external.disable());
597 daniel-mar 18584
      };
18585
      var emitEnable = function (component) {
637 daniel-mar 18586
        return emit(component, external.enable());
597 daniel-mar 18587
      };
18588
      var emitTransform = function (comp, transform) {
18589
        emitDisable(comp);
18590
        emit$1(comp, internal.transform(), { transform: transform });
18591
        emitEnable(comp);
18592
      };
18593
      var emitTempTransform = function (comp, transform) {
18594
        emitDisable(comp);
18595
        emit$1(comp, internal.tempTransform(), { transform: transform });
18596
        emitEnable(comp);
18597
      };
18598
      var getBackSwap = function (anyInSystem) {
18599
        return function () {
18600
          memContainer.getOpt(anyInSystem).each(function (container) {
18601
            Replacing.set(container, [ButtonPanel]);
18602
          });
18603
        };
18604
      };
18605
      var emitTransformApply = function (comp, transform) {
18606
        emitDisable(comp);
18607
        emit$1(comp, internal.transformApply(), {
18608
          transform: transform,
18609
          swap: getBackSwap(comp)
18610
        });
18611
        emitEnable(comp);
18612
      };
18613
      var createBackButton = function () {
18614
        return createButton('Back', function (button) {
18615
          return emit$1(button, internal.back(), { swap: getBackSwap(button) });
18616
        }, false, false);
18617
      };
18618
      var createSpacer = function () {
18619
        return record({
18620
          dom: {
18621
            tag: 'div',
18622
            classes: ['tox-spacer']
18623
          },
18624
          behaviours: derive$1([Disabling.config({})])
18625
        });
18626
      };
18627
      var createApplyButton = function () {
18628
        return createButton('Apply', function (button) {
18629
          return emit$1(button, internal.apply(), { swap: getBackSwap(button) });
18630
        }, true, true);
18631
      };
18632
      var makeCropTransform = function () {
18633
        return function (ir) {
18634
          var rect = imagePanel.getRect();
637 daniel-mar 18635
          return crop(ir, rect.x, rect.y, rect.w, rect.h);
597 daniel-mar 18636
        };
18637
      };
18638
      var cropPanelComponents = [
18639
        createBackButton(),
18640
        createSpacer(),
18641
        createButton('Apply', function (button) {
18642
          var transform = makeCropTransform();
18643
          emitTransformApply(button, transform);
18644
          imagePanel.hideCrop();
18645
        }, false, true)
18646
      ];
18647
      var CropPanel = Container.sketch({
18648
        dom: panelDom,
18649
        components: cropPanelComponents.map(function (mem) {
18650
          return mem.asSpec();
18651
        }),
18652
        containerBehaviours: derive$1([config('image-tools-crop-buttons-events', [
637 daniel-mar 18653
            run$1(external.disable(), function (comp, _se) {
597 daniel-mar 18654
              disableAllComponents(cropPanelComponents, comp);
18655
            }),
637 daniel-mar 18656
            run$1(external.enable(), function (comp, _se) {
597 daniel-mar 18657
              enableAllComponents(cropPanelComponents, comp);
18658
            })
18659
          ])])
18660
      });
18661
      var memSize = record(renderSizeInput({
18662
        name: 'size',
18663
        label: Optional.none(),
18664
        constrain: true,
18665
        disabled: false
18666
      }, providersBackstage));
18667
      var makeResizeTransform = function (width, height) {
18668
        return function (ir) {
637 daniel-mar 18669
          return resize$1(ir, width, height);
597 daniel-mar 18670
        };
18671
      };
18672
      var resizePanelComponents = [
18673
        createBackButton(),
18674
        createSpacer(),
18675
        memSize,
18676
        createSpacer(),
18677
        createButton('Apply', function (button) {
18678
          memSize.getOpt(button).each(function (sizeInput) {
18679
            var value = Representing.getValue(sizeInput);
18680
            var width = parseInt(value.width, 10);
18681
            var height = parseInt(value.height, 10);
18682
            var transform = makeResizeTransform(width, height);
18683
            emitTransformApply(button, transform);
18684
          });
18685
        }, false, true)
18686
      ];
18687
      var ResizePanel = Container.sketch({
18688
        dom: panelDom,
18689
        components: resizePanelComponents.map(function (mem) {
18690
          return mem.asSpec();
18691
        }),
18692
        containerBehaviours: derive$1([config('image-tools-resize-buttons-events', [
637 daniel-mar 18693
            run$1(external.disable(), function (comp, _se) {
597 daniel-mar 18694
              disableAllComponents(resizePanelComponents, comp);
18695
            }),
637 daniel-mar 18696
            run$1(external.enable(), function (comp, _se) {
597 daniel-mar 18697
              enableAllComponents(resizePanelComponents, comp);
18698
            })
18699
          ])])
18700
      });
18701
      var makeValueTransform = function (transform, value) {
18702
        return function (ir) {
18703
          return transform(ir, value);
18704
        };
18705
      };
637 daniel-mar 18706
      var horizontalFlip = makeValueTransform(flip, 'h');
18707
      var verticalFlip = makeValueTransform(flip, 'v');
18708
      var counterclockwiseRotate = makeValueTransform(rotate, -90);
18709
      var clockwiseRotate = makeValueTransform(rotate, 90);
597 daniel-mar 18710
      var flipRotateOnAction = function (comp, operation) {
18711
        emitTempTransform(comp, operation);
18712
      };
18713
      var flipRotateComponents = [
18714
        createBackButton(),
18715
        createSpacer(),
18716
        createIconButton('flip-horizontally', 'Flip horizontally', function (button) {
18717
          flipRotateOnAction(button, horizontalFlip);
18718
        }, false),
18719
        createIconButton('flip-vertically', 'Flip vertically', function (button) {
18720
          flipRotateOnAction(button, verticalFlip);
18721
        }, false),
18722
        createIconButton('rotate-left', 'Rotate counterclockwise', function (button) {
18723
          flipRotateOnAction(button, counterclockwiseRotate);
18724
        }, false),
18725
        createIconButton('rotate-right', 'Rotate clockwise', function (button) {
18726
          flipRotateOnAction(button, clockwiseRotate);
18727
        }, false),
18728
        createSpacer(),
18729
        createApplyButton()
18730
      ];
18731
      var FlipRotatePanel = Container.sketch({
18732
        dom: panelDom,
18733
        components: flipRotateComponents.map(function (mem) {
18734
          return mem.asSpec();
18735
        }),
18736
        containerBehaviours: derive$1([config('image-tools-fliprotate-buttons-events', [
637 daniel-mar 18737
            run$1(external.disable(), function (comp, _se) {
597 daniel-mar 18738
              disableAllComponents(flipRotateComponents, comp);
18739
            }),
637 daniel-mar 18740
            run$1(external.enable(), function (comp, _se) {
597 daniel-mar 18741
              enableAllComponents(flipRotateComponents, comp);
18742
            })
18743
          ])])
18744
      });
18745
      var makeSlider = function (label, onChoose, min, value, max) {
18746
        var labelPart = Slider.parts.label({
18747
          dom: {
18748
            tag: 'label',
18749
            classes: ['tox-label'],
18750
            innerHtml: providersBackstage.translate(label)
18751
          }
18752
        });
18753
        var spectrum = Slider.parts.spectrum({
18754
          dom: {
18755
            tag: 'div',
18756
            classes: ['tox-slider__rail'],
18757
            attributes: { role: 'presentation' }
18758
          }
18759
        });
18760
        var thumb = Slider.parts.thumb({
18761
          dom: {
18762
            tag: 'div',
18763
            classes: ['tox-slider__handle'],
18764
            attributes: { role: 'presentation' }
18765
          }
18766
        });
18767
        return record(Slider.sketch({
18768
          dom: {
18769
            tag: 'div',
18770
            classes: ['tox-slider'],
18771
            attributes: { role: 'presentation' }
18772
          },
18773
          model: {
18774
            mode: 'x',
18775
            minX: min,
18776
            maxX: max,
637 daniel-mar 18777
            getInitialValue: constant$1({ x: value })
597 daniel-mar 18778
          },
18779
          components: [
18780
            labelPart,
18781
            spectrum,
18782
            thumb
18783
          ],
18784
          sliderBehaviours: derive$1([Focusing.config({})]),
18785
          onChoose: onChoose
18786
        }));
18787
      };
18788
      var makeVariableSlider = function (label, transform, min, value, max) {
18789
        var onChoose = function (slider, _thumb, value) {
18790
          var valTransform = makeValueTransform(transform, value.x / 100);
18791
          emitTransform(slider, valTransform);
18792
        };
18793
        return makeSlider(label, onChoose, min, value, max);
18794
      };
18795
      var variableFilterPanelComponents = function (label, transform, min, value, max) {
18796
        return [
18797
          createBackButton(),
18798
          makeVariableSlider(label, transform, min, value, max),
18799
          createApplyButton()
18800
        ];
18801
      };
18802
      var createVariableFilterPanel = function (label, transform, min, value, max) {
18803
        var filterPanelComponents = variableFilterPanelComponents(label, transform, min, value, max);
18804
        return Container.sketch({
18805
          dom: panelDom,
18806
          components: filterPanelComponents.map(function (mem) {
18807
            return mem.asSpec();
18808
          }),
18809
          containerBehaviours: derive$1([config('image-tools-filter-panel-buttons-events', [
637 daniel-mar 18810
              run$1(external.disable(), function (comp, _se) {
597 daniel-mar 18811
                disableAllComponents(filterPanelComponents, comp);
18812
              }),
637 daniel-mar 18813
              run$1(external.enable(), function (comp, _se) {
597 daniel-mar 18814
                enableAllComponents(filterPanelComponents, comp);
18815
              })
18816
            ])])
18817
        });
18818
      };
18819
      var filterPanelComponents = [
18820
        createBackButton(),
18821
        createSpacer(),
18822
        createApplyButton()
18823
      ];
18824
      var FilterPanel = Container.sketch({
18825
        dom: panelDom,
18826
        components: filterPanelComponents.map(function (mem) {
18827
          return mem.asSpec();
18828
        })
18829
      });
637 daniel-mar 18830
      var BrightnessPanel = createVariableFilterPanel('Brightness', brightness, -100, 0, 100);
18831
      var ContrastPanel = createVariableFilterPanel('Contrast', contrast, -100, 0, 100);
18832
      var GammaPanel = createVariableFilterPanel('Gamma', gamma, -100, 0, 100);
597 daniel-mar 18833
      var makeColorTransform = function (red, green, blue) {
18834
        return function (ir) {
637 daniel-mar 18835
          return colorize(ir, red, green, blue);
597 daniel-mar 18836
        };
18837
      };
18838
      var makeColorSlider = function (label) {
18839
        var onChoose = function (slider, _thumb, _value) {
18840
          var redOpt = memRed.getOpt(slider);
18841
          var blueOpt = memBlue.getOpt(slider);
18842
          var greenOpt = memGreen.getOpt(slider);
18843
          redOpt.each(function (red) {
18844
            blueOpt.each(function (blue) {
18845
              greenOpt.each(function (green) {
18846
                var r = Representing.getValue(red).x / 100;
18847
                var g = Representing.getValue(green).x / 100;
18848
                var b = Representing.getValue(blue).x / 100;
18849
                var transform = makeColorTransform(r, g, b);
18850
                emitTransform(slider, transform);
18851
              });
18852
            });
18853
          });
18854
        };
18855
        return makeSlider(label, onChoose, 0, 100, 200);
18856
      };
18857
      var memRed = makeColorSlider('R');
18858
      var memGreen = makeColorSlider('G');
18859
      var memBlue = makeColorSlider('B');
18860
      var colorizePanelComponents = [
18861
        createBackButton(),
18862
        memRed,
18863
        memGreen,
18864
        memBlue,
18865
        createApplyButton()
18866
      ];
18867
      var ColorizePanel = Container.sketch({
18868
        dom: panelDom,
18869
        components: colorizePanelComponents.map(function (mem) {
18870
          return mem.asSpec();
18871
        })
18872
      });
18873
      var getTransformPanelEvent = function (panel, transform, update) {
18874
        return function (button) {
18875
          var swap = function () {
18876
            memContainer.getOpt(button).each(function (container) {
18877
              Replacing.set(container, [panel]);
18878
              update(container);
18879
            });
18880
          };
18881
          emit$1(button, internal.swap(), {
18882
            transform: transform,
18883
            swap: swap
18884
          });
18885
        };
18886
      };
18887
      var cropPanelUpdate = function (_anyInSystem) {
18888
        imagePanel.showCrop();
18889
      };
18890
      var resizePanelUpdate = function (anyInSystem) {
18891
        memSize.getOpt(anyInSystem).each(function (sizeInput) {
18892
          var measurements = imagePanel.getMeasurements();
18893
          var width = measurements.width;
18894
          var height = measurements.height;
18895
          Representing.setValue(sizeInput, {
18896
            width: width,
18897
            height: height
18898
          });
18899
        });
18900
      };
637 daniel-mar 18901
      var sharpenTransform = Optional.some(sharpen);
18902
      var invertTransform = Optional.some(invert);
597 daniel-mar 18903
      var buttonPanelComponents = [
18904
        createIconButton('crop', 'Crop', getTransformPanelEvent(CropPanel, Optional.none(), cropPanelUpdate), false),
18905
        createIconButton('resize', 'Resize', getTransformPanelEvent(ResizePanel, Optional.none(), resizePanelUpdate), false),
18906
        createIconButton('orientation', 'Orientation', getTransformPanelEvent(FlipRotatePanel, Optional.none(), noop$1), false),
18907
        createIconButton('brightness', 'Brightness', getTransformPanelEvent(BrightnessPanel, Optional.none(), noop$1), false),
18908
        createIconButton('sharpen', 'Sharpen', getTransformPanelEvent(FilterPanel, sharpenTransform, noop$1), false),
18909
        createIconButton('contrast', 'Contrast', getTransformPanelEvent(ContrastPanel, Optional.none(), noop$1), false),
18910
        createIconButton('color-levels', 'Color levels', getTransformPanelEvent(ColorizePanel, Optional.none(), noop$1), false),
18911
        createIconButton('gamma', 'Gamma', getTransformPanelEvent(GammaPanel, Optional.none(), noop$1), false),
18912
        createIconButton('invert', 'Invert', getTransformPanelEvent(FilterPanel, invertTransform, noop$1), false)
18913
      ];
18914
      var ButtonPanel = Container.sketch({
18915
        dom: panelDom,
18916
        components: buttonPanelComponents.map(function (mem) {
18917
          return mem.asSpec();
18918
        })
18919
      });
18920
      var container = Container.sketch({
18921
        dom: { tag: 'div' },
18922
        components: [ButtonPanel],
18923
        containerBehaviours: derive$1([Replacing.config({})])
18924
      });
18925
      var memContainer = record(container);
18926
      var getApplyButton = function (anyInSystem) {
18927
        return memContainer.getOpt(anyInSystem).map(function (container) {
18928
          var panel = container.components()[0];
18929
          return panel.components()[panel.components().length - 1];
18930
        });
18931
      };
18932
      return {
18933
        memContainer: memContainer,
18934
        getApplyButton: getApplyButton
18935
      };
18936
    };
18937
 
679 daniel-mar 18938
    var global$4 = tinymce.util.Tools.resolve('tinymce.geom.Rect');
597 daniel-mar 18939
 
637 daniel-mar 18940
    var global$3 = tinymce.util.Tools.resolve('tinymce.util.Observable');
597 daniel-mar 18941
 
637 daniel-mar 18942
    var global$2 = tinymce.util.Tools.resolve('tinymce.util.VK');
597 daniel-mar 18943
 
18944
    var getDocumentSize = function (doc) {
18945
      var max = Math.max;
18946
      var documentElement = doc.documentElement;
18947
      var body = doc.body;
18948
      var scrollWidth = max(documentElement.scrollWidth, body.scrollWidth);
18949
      var clientWidth = max(documentElement.clientWidth, body.clientWidth);
18950
      var offsetWidth = max(documentElement.offsetWidth, body.offsetWidth);
18951
      var scrollHeight = max(documentElement.scrollHeight, body.scrollHeight);
18952
      var clientHeight = max(documentElement.clientHeight, body.clientHeight);
18953
      var offsetHeight = max(documentElement.offsetHeight, body.offsetHeight);
18954
      return {
18955
        width: scrollWidth < offsetWidth ? clientWidth : scrollWidth,
18956
        height: scrollHeight < offsetHeight ? clientHeight : scrollHeight
18957
      };
18958
    };
679 daniel-mar 18959
    var isTouchEvent$1 = function (e) {
18960
      return isNonNullable(e.changedTouches);
18961
    };
597 daniel-mar 18962
    var updateWithTouchData = function (e) {
679 daniel-mar 18963
      if (isTouchEvent$1(e)) {
18964
        var keys = 'screenX screenY pageX pageY clientX clientY'.split(' ');
18965
        for (var i = 0; i < keys.length; i++) {
597 daniel-mar 18966
          e[keys[i]] = e.changedTouches[0][keys[i]];
18967
        }
18968
      }
18969
    };
18970
    function DragHelper (id, settings) {
679 daniel-mar 18971
      var _a, _b, _c;
18972
      var eventOverlay;
18973
      var handleEvents = [];
18974
      var overlayEvents = [];
18975
      var doc = (_a = settings.document) !== null && _a !== void 0 ? _a : document;
18976
      var root = (_b = settings.root) !== null && _b !== void 0 ? _b : doc;
18977
      var sugarDoc = SugarElement.fromDom(doc);
597 daniel-mar 18978
      var downButton;
679 daniel-mar 18979
      var startX;
18980
      var startY;
18981
      var handleElement = SugarElement.fromDom(root.getElementById((_c = settings.handle) !== null && _c !== void 0 ? _c : id));
597 daniel-mar 18982
      var start = function (e) {
679 daniel-mar 18983
        var rawEvent = e.raw;
597 daniel-mar 18984
        var docSize = getDocumentSize(doc);
679 daniel-mar 18985
        updateWithTouchData(rawEvent);
18986
        e.prevent();
18987
        downButton = rawEvent.button;
18988
        startX = rawEvent.screenX;
18989
        startY = rawEvent.screenY;
18990
        var cursor = get$c(handleElement, 'cursor');
18991
        eventOverlay = SugarElement.fromTag('div', doc);
18992
        setAll(eventOverlay, {
18993
          'position': 'absolute',
18994
          'top': '0',
18995
          'left': '0',
18996
          'width': docSize.width + 'px',
18997
          'height': docSize.height + 'px',
18998
          'z-index': 2147483647 + '',
18999
          'opacity': '0.0001',
597 daniel-mar 19000
          cursor: cursor
679 daniel-mar 19001
        });
19002
        append$2(getBody(sugarDoc), eventOverlay);
19003
        overlayEvents.push(bind(sugarDoc, 'mousemove', drag), bind(sugarDoc, 'touchmove', drag), bind(sugarDoc, 'mouseup', stop), bind(sugarDoc, 'touchend', stop));
19004
        settings.start(rawEvent);
597 daniel-mar 19005
      };
19006
      var drag = function (e) {
679 daniel-mar 19007
        var rawEvent = e.raw;
19008
        updateWithTouchData(rawEvent);
19009
        if (rawEvent.button !== downButton) {
597 daniel-mar 19010
          return stop(e);
19011
        }
679 daniel-mar 19012
        rawEvent.deltaX = rawEvent.screenX - startX;
19013
        rawEvent.deltaY = rawEvent.screenY - startY;
19014
        e.prevent();
19015
        settings.drag(rawEvent);
597 daniel-mar 19016
      };
19017
      var stop = function (e) {
679 daniel-mar 19018
        updateWithTouchData(e.raw);
19019
        each$1(overlayEvents, function (e) {
19020
          return e.unbind();
19021
        });
19022
        overlayEvents = [];
19023
        remove$5(eventOverlay);
597 daniel-mar 19024
        if (settings.stop) {
679 daniel-mar 19025
          settings.stop(e.raw);
597 daniel-mar 19026
        }
19027
      };
19028
      var destroy = function () {
679 daniel-mar 19029
        each$1(overlayEvents.concat(handleEvents), function (e) {
19030
          return e.unbind();
19031
        });
19032
        overlayEvents = [];
19033
        handleEvents = [];
19034
        if (isNonNullable(eventOverlay)) {
19035
          remove$5(eventOverlay);
19036
        }
597 daniel-mar 19037
      };
679 daniel-mar 19038
      handleEvents.push(bind(handleElement, 'mousedown', start), bind(handleElement, 'touchstart', start));
597 daniel-mar 19039
      return { destroy: destroy };
19040
    }
19041
 
19042
    var count = 0;
637 daniel-mar 19043
    var create$1 = function (currentRect, viewPortRect, clampRect, containerElm, action) {
597 daniel-mar 19044
      var dragHelpers;
679 daniel-mar 19045
      var events = [];
597 daniel-mar 19046
      var prefix = 'tox-';
19047
      var id = prefix + 'crid-' + count++;
679 daniel-mar 19048
      var container = SugarElement.fromDom(containerElm);
597 daniel-mar 19049
      var handles = [
19050
        {
19051
          name: 'move',
19052
          xMul: 0,
19053
          yMul: 0,
19054
          deltaX: 1,
19055
          deltaY: 1,
19056
          deltaW: 0,
19057
          deltaH: 0,
19058
          label: 'Crop Mask'
19059
        },
19060
        {
19061
          name: 'nw',
19062
          xMul: 0,
19063
          yMul: 0,
19064
          deltaX: 1,
19065
          deltaY: 1,
19066
          deltaW: -1,
19067
          deltaH: -1,
19068
          label: 'Top Left Crop Handle'
19069
        },
19070
        {
19071
          name: 'ne',
19072
          xMul: 1,
19073
          yMul: 0,
19074
          deltaX: 0,
19075
          deltaY: 1,
19076
          deltaW: 1,
19077
          deltaH: -1,
19078
          label: 'Top Right Crop Handle'
19079
        },
19080
        {
19081
          name: 'sw',
19082
          xMul: 0,
19083
          yMul: 1,
19084
          deltaX: 1,
19085
          deltaY: 0,
19086
          deltaW: -1,
19087
          deltaH: 1,
19088
          label: 'Bottom Left Crop Handle'
19089
        },
19090
        {
19091
          name: 'se',
19092
          xMul: 1,
19093
          yMul: 1,
19094
          deltaX: 0,
19095
          deltaY: 0,
19096
          deltaW: 1,
19097
          deltaH: 1,
19098
          label: 'Bottom Right Crop Handle'
19099
        }
19100
      ];
19101
      var blockers = [
19102
        'top',
19103
        'right',
19104
        'bottom',
19105
        'left'
19106
      ];
19107
      var getAbsoluteRect = function (outerRect, relativeRect) {
19108
        return {
19109
          x: relativeRect.x + outerRect.x,
19110
          y: relativeRect.y + outerRect.y,
19111
          w: relativeRect.w,
19112
          h: relativeRect.h
19113
        };
19114
      };
19115
      var getRelativeRect = function (outerRect, innerRect) {
19116
        return {
19117
          x: innerRect.x - outerRect.x,
19118
          y: innerRect.y - outerRect.y,
19119
          w: innerRect.w,
19120
          h: innerRect.h
19121
        };
19122
      };
19123
      var getInnerRect = function () {
19124
        return getRelativeRect(clampRect, currentRect);
19125
      };
19126
      var moveRect = function (handle, startRect, deltaX, deltaY) {
679 daniel-mar 19127
        var x = startRect.x + deltaX * handle.deltaX;
19128
        var y = startRect.y + deltaY * handle.deltaY;
19129
        var w = Math.max(20, startRect.w + deltaX * handle.deltaW);
19130
        var h = Math.max(20, startRect.h + deltaY * handle.deltaH);
19131
        var rect = currentRect = global$4.clamp({
597 daniel-mar 19132
          x: x,
19133
          y: y,
19134
          w: w,
19135
          h: h
19136
        }, clampRect, handle.name === 'move');
19137
        rect = getRelativeRect(clampRect, rect);
19138
        instance.fire('updateRect', { rect: rect });
19139
        setInnerRect(rect);
19140
      };
19141
      var render = function () {
19142
        var createDragHelper = function (handle) {
19143
          var startRect;
19144
          return DragHelper(id, {
19145
            document: containerElm.ownerDocument,
679 daniel-mar 19146
            root: getRootNode(container).dom,
597 daniel-mar 19147
            handle: id + '-' + handle.name,
19148
            start: function () {
19149
              startRect = currentRect;
19150
            },
19151
            drag: function (e) {
19152
              moveRect(handle, startRect, e.deltaX, e.deltaY);
19153
            }
19154
          });
19155
        };
679 daniel-mar 19156
        var cropContainer = SugarElement.fromTag('div');
19157
        setAll$1(cropContainer, {
19158
          id: id,
19159
          'class': prefix + 'croprect-container',
19160
          'role': 'grid',
19161
          'aria-dropeffect': 'execute'
597 daniel-mar 19162
        });
679 daniel-mar 19163
        append$2(container, cropContainer);
19164
        each$1(blockers, function (blocker) {
19165
          descendant(container, '#' + id).each(function (blockerElm) {
19166
            var cropBlocker = SugarElement.fromTag('div');
19167
            setAll$1(cropBlocker, {
19168
              'id': id + '-' + blocker,
19169
              'class': prefix + 'croprect-block',
19170
              'data-mce-bogus': 'all'
19171
            });
19172
            set$7(cropBlocker, 'display', 'none');
19173
            append$2(blockerElm, cropBlocker);
19174
          });
597 daniel-mar 19175
        });
679 daniel-mar 19176
        each$1(handles, function (handle) {
19177
          descendant(container, '#' + id).each(function (handleElm) {
19178
            var cropHandle = SugarElement.fromTag('div');
19179
            setAll$1(cropHandle, {
19180
              'id': id + '-' + handle.name,
19181
              'aria-label': handle.label,
19182
              'aria-grabbed': 'false',
19183
              'data-mce-bogus': 'all',
19184
              'role': 'gridcell',
19185
              'tabindex': '-1',
19186
              'title': handle.label
19187
            });
19188
            add$1(cropHandle, [
19189
              prefix + 'croprect-handle',
19190
              prefix + 'croprect-handle-' + handle.name
19191
            ]);
19192
            set$7(cropHandle, 'display', 'none');
19193
            append$2(handleElm, cropHandle);
19194
          });
19195
        });
19196
        dragHelpers = map$2(handles, createDragHelper);
597 daniel-mar 19197
        repaint(currentRect);
679 daniel-mar 19198
        var handleFocus = function (e) {
19199
          set$8(e.target, 'aria-grabbed', e.raw.type === 'focus' ? 'true' : 'false');
19200
        };
19201
        var handleKeydown = function (e) {
597 daniel-mar 19202
          var activeHandle;
679 daniel-mar 19203
          each$1(handles, function (handle) {
19204
            if (get$d(e.target, 'id') === id + '-' + handle.name) {
597 daniel-mar 19205
              activeHandle = handle;
19206
              return false;
19207
            }
19208
          });
19209
          var moveAndBlock = function (evt, handle, startRect, deltaX, deltaY) {
19210
            evt.stopPropagation();
19211
            evt.preventDefault();
19212
            moveRect(activeHandle, startRect, deltaX, deltaY);
19213
          };
679 daniel-mar 19214
          switch (e.raw.keyCode) {
637 daniel-mar 19215
          case global$2.LEFT:
597 daniel-mar 19216
            moveAndBlock(e, activeHandle, currentRect, -10, 0);
19217
            break;
637 daniel-mar 19218
          case global$2.RIGHT:
597 daniel-mar 19219
            moveAndBlock(e, activeHandle, currentRect, 10, 0);
19220
            break;
637 daniel-mar 19221
          case global$2.UP:
597 daniel-mar 19222
            moveAndBlock(e, activeHandle, currentRect, 0, -10);
19223
            break;
637 daniel-mar 19224
          case global$2.DOWN:
597 daniel-mar 19225
            moveAndBlock(e, activeHandle, currentRect, 0, 10);
19226
            break;
637 daniel-mar 19227
          case global$2.ENTER:
19228
          case global$2.SPACEBAR:
679 daniel-mar 19229
            e.prevent();
597 daniel-mar 19230
            action();
19231
            break;
19232
          }
679 daniel-mar 19233
        };
19234
        events.push(bind(container, 'focusin', handleFocus), bind(container, 'focusout', handleFocus), bind(container, 'keydown', handleKeydown));
597 daniel-mar 19235
      };
19236
      var toggleVisibility = function (state) {
679 daniel-mar 19237
        var selectors = __spreadArray(__spreadArray([], map$2(handles, function (handle) {
597 daniel-mar 19238
          return '#' + id + '-' + handle.name;
679 daniel-mar 19239
        }), true), map$2(blockers, function (blocker) {
597 daniel-mar 19240
          return '#' + id + '-' + blocker;
679 daniel-mar 19241
        }), true).join(',');
19242
        var elems = descendants(container, selectors);
597 daniel-mar 19243
        if (state) {
679 daniel-mar 19244
          each$1(elems, function (elm) {
19245
            return remove$6(elm, 'display');
19246
          });
597 daniel-mar 19247
        } else {
679 daniel-mar 19248
          each$1(elems, function (elm) {
19249
            return set$7(elm, 'display', 'none');
19250
          });
597 daniel-mar 19251
        }
19252
      };
19253
      var repaint = function (rect) {
679 daniel-mar 19254
        var updateElementRect = function (name, newRect) {
19255
          descendant(container, '#' + id + '-' + name).each(function (elm) {
19256
            setAll(elm, {
19257
              left: newRect.x + 'px',
19258
              top: newRect.y + 'px',
19259
              width: Math.max(0, newRect.w) + 'px',
19260
              height: Math.max(0, newRect.h) + 'px'
19261
            });
597 daniel-mar 19262
          });
19263
        };
679 daniel-mar 19264
        each$1(handles, function (handle) {
19265
          descendant(container, '#' + id + '-' + handle.name).each(function (elm) {
19266
            setAll(elm, {
19267
              left: rect.w * handle.xMul + rect.x + 'px',
19268
              top: rect.h * handle.yMul + rect.y + 'px'
19269
            });
597 daniel-mar 19270
          });
19271
        });
19272
        updateElementRect('top', {
19273
          x: viewPortRect.x,
19274
          y: viewPortRect.y,
19275
          w: viewPortRect.w,
19276
          h: rect.y - viewPortRect.y
19277
        });
19278
        updateElementRect('right', {
19279
          x: rect.x + rect.w,
19280
          y: rect.y,
19281
          w: viewPortRect.w - rect.x - rect.w + viewPortRect.x,
19282
          h: rect.h
19283
        });
19284
        updateElementRect('bottom', {
19285
          x: viewPortRect.x,
19286
          y: rect.y + rect.h,
19287
          w: viewPortRect.w,
19288
          h: viewPortRect.h - rect.y - rect.h + viewPortRect.y
19289
        });
19290
        updateElementRect('left', {
19291
          x: viewPortRect.x,
19292
          y: rect.y,
19293
          w: rect.x - viewPortRect.x,
19294
          h: rect.h
19295
        });
19296
        updateElementRect('move', rect);
19297
      };
19298
      var setRect = function (rect) {
19299
        currentRect = rect;
19300
        repaint(currentRect);
19301
      };
19302
      var setViewPortRect = function (rect) {
19303
        viewPortRect = rect;
19304
        repaint(currentRect);
19305
      };
19306
      var setInnerRect = function (rect) {
19307
        setRect(getAbsoluteRect(clampRect, rect));
19308
      };
19309
      var setClampRect = function (rect) {
19310
        clampRect = rect;
19311
        repaint(currentRect);
19312
      };
19313
      var destroy = function () {
679 daniel-mar 19314
        each$1(dragHelpers, function (helper) {
19315
          return helper.destroy();
597 daniel-mar 19316
        });
19317
        dragHelpers = [];
679 daniel-mar 19318
        each$1(events, function (e) {
19319
          return e.unbind();
19320
        });
19321
        events = [];
597 daniel-mar 19322
      };
19323
      render();
679 daniel-mar 19324
      var instance = __assign(__assign({}, global$3), {
597 daniel-mar 19325
        toggleVisibility: toggleVisibility,
19326
        setClampRect: setClampRect,
19327
        setRect: setRect,
19328
        getInnerRect: getInnerRect,
19329
        setInnerRect: setInnerRect,
19330
        setViewPortRect: setViewPortRect,
19331
        destroy: destroy
679 daniel-mar 19332
      });
597 daniel-mar 19333
      return instance;
19334
    };
637 daniel-mar 19335
    var CropRect = { create: create$1 };
597 daniel-mar 19336
 
19337
    var loadImage = function (image) {
679 daniel-mar 19338
      return new global$c(function (resolve) {
597 daniel-mar 19339
        var loaded = function () {
19340
          image.removeEventListener('load', loaded);
19341
          resolve(image);
19342
        };
19343
        if (image.complete) {
19344
          resolve(image);
19345
        } else {
19346
          image.addEventListener('load', loaded);
19347
        }
19348
      });
19349
    };
19350
    var renderImagePanel = function (initialUrl) {
19351
      var memBg = record({
19352
        dom: {
19353
          tag: 'div',
19354
          classes: ['tox-image-tools__image-bg'],
19355
          attributes: { role: 'presentation' }
19356
        }
19357
      });
19358
      var zoomState = Cell(1);
679 daniel-mar 19359
      var cropRect = api$1();
597 daniel-mar 19360
      var rectState = Cell({
19361
        x: 0,
19362
        y: 0,
19363
        w: 1,
19364
        h: 1
19365
      });
19366
      var viewRectState = Cell({
19367
        x: 0,
19368
        y: 0,
19369
        w: 1,
19370
        h: 1
19371
      });
19372
      var repaintImg = function (anyInSystem, img) {
19373
        memContainer.getOpt(anyInSystem).each(function (panel) {
19374
          var zoom = zoomState.get();
679 daniel-mar 19375
          var panelW = get$a(panel.element);
19376
          var panelH = get$b(panel.element);
597 daniel-mar 19377
          var width = img.dom.naturalWidth * zoom;
19378
          var height = img.dom.naturalHeight * zoom;
19379
          var left = Math.max(0, panelW / 2 - width / 2);
19380
          var top = Math.max(0, panelH / 2 - height / 2);
19381
          var css = {
19382
            left: left.toString() + 'px',
19383
            top: top.toString() + 'px',
19384
            width: width.toString() + 'px',
19385
            height: height.toString() + 'px',
19386
            position: 'absolute'
19387
          };
637 daniel-mar 19388
          setAll(img, css);
597 daniel-mar 19389
          memBg.getOpt(panel).each(function (bg) {
637 daniel-mar 19390
            setAll(bg.element, css);
597 daniel-mar 19391
          });
679 daniel-mar 19392
          cropRect.run(function (cRect) {
597 daniel-mar 19393
            var rect = rectState.get();
19394
            cRect.setRect({
19395
              x: rect.x * zoom + left,
19396
              y: rect.y * zoom + top,
19397
              w: rect.w * zoom,
19398
              h: rect.h * zoom
19399
            });
19400
            cRect.setClampRect({
19401
              x: left,
19402
              y: top,
19403
              w: width,
19404
              h: height
19405
            });
19406
            cRect.setViewPortRect({
19407
              x: 0,
19408
              y: 0,
19409
              w: panelW,
19410
              h: panelH
19411
            });
19412
          });
19413
        });
19414
      };
19415
      var zoomFit = function (anyInSystem, img) {
19416
        memContainer.getOpt(anyInSystem).each(function (panel) {
679 daniel-mar 19417
          var panelW = get$a(panel.element);
19418
          var panelH = get$b(panel.element);
597 daniel-mar 19419
          var width = img.dom.naturalWidth;
19420
          var height = img.dom.naturalHeight;
19421
          var zoom = Math.min(panelW / width, panelH / height);
19422
          if (zoom >= 1) {
19423
            zoomState.set(1);
19424
          } else {
19425
            zoomState.set(zoom);
19426
          }
19427
        });
19428
      };
19429
      var updateSrc = function (anyInSystem, url) {
19430
        var img = SugarElement.fromTag('img');
679 daniel-mar 19431
        set$8(img, 'src', url);
597 daniel-mar 19432
        return loadImage(img.dom).then(function () {
637 daniel-mar 19433
          if (anyInSystem.getSystem().isConnected()) {
19434
            memContainer.getOpt(anyInSystem).map(function (panel) {
19435
              var aImg = external$2({ element: img });
19436
              Replacing.replaceAt(panel, 1, Optional.some(aImg));
19437
              var lastViewRect = viewRectState.get();
19438
              var viewRect = {
19439
                x: 0,
19440
                y: 0,
19441
                w: img.dom.naturalWidth,
19442
                h: img.dom.naturalHeight
19443
              };
19444
              viewRectState.set(viewRect);
679 daniel-mar 19445
              var rect = global$4.inflate(viewRect, -20, -20);
637 daniel-mar 19446
              rectState.set(rect);
19447
              if (lastViewRect.w !== viewRect.w || lastViewRect.h !== viewRect.h) {
19448
                zoomFit(panel, img);
19449
              }
19450
              repaintImg(panel, img);
19451
            });
19452
          }
597 daniel-mar 19453
        });
19454
      };
19455
      var zoom = function (anyInSystem, direction) {
19456
        var currentZoom = zoomState.get();
19457
        var newZoom = direction > 0 ? Math.min(2, currentZoom + 0.1) : Math.max(0.1, currentZoom - 0.1);
19458
        zoomState.set(newZoom);
19459
        memContainer.getOpt(anyInSystem).each(function (panel) {
19460
          var img = panel.components()[1].element;
19461
          repaintImg(panel, img);
19462
        });
19463
      };
19464
      var showCrop = function () {
679 daniel-mar 19465
        cropRect.run(function (cRect) {
597 daniel-mar 19466
          cRect.toggleVisibility(true);
19467
        });
19468
      };
19469
      var hideCrop = function () {
679 daniel-mar 19470
        cropRect.run(function (cRect) {
597 daniel-mar 19471
          cRect.toggleVisibility(false);
19472
        });
19473
      };
19474
      var getRect = function () {
19475
        return rectState.get();
19476
      };
19477
      var container = Container.sketch({
19478
        dom: {
19479
          tag: 'div',
19480
          classes: ['tox-image-tools__image']
19481
        },
19482
        components: [
19483
          memBg.asSpec(),
19484
          {
19485
            dom: {
19486
              tag: 'img',
19487
              attributes: { src: initialUrl }
19488
            }
19489
          },
19490
          {
19491
            dom: { tag: 'div' },
679 daniel-mar 19492
            behaviours: derive$1([config('image-panel-crop-events', [
19493
                runOnAttached(function (comp) {
597 daniel-mar 19494
                  memContainer.getOpt(comp).each(function (container) {
19495
                    var el = container.element.dom;
19496
                    var cRect = CropRect.create({
19497
                      x: 10,
19498
                      y: 10,
19499
                      w: 100,
19500
                      h: 100
19501
                    }, {
19502
                      x: 0,
19503
                      y: 0,
19504
                      w: 200,
19505
                      h: 200
19506
                    }, {
19507
                      x: 0,
19508
                      y: 0,
19509
                      w: 200,
19510
                      h: 200
19511
                    }, el, noop);
19512
                    cRect.toggleVisibility(false);
19513
                    cRect.on('updateRect', function (e) {
19514
                      var rect = e.rect;
19515
                      var zoom = zoomState.get();
19516
                      var newRect = {
19517
                        x: Math.round(rect.x / zoom),
19518
                        y: Math.round(rect.y / zoom),
19519
                        w: Math.round(rect.w / zoom),
19520
                        h: Math.round(rect.h / zoom)
19521
                      };
19522
                      rectState.set(newRect);
19523
                    });
637 daniel-mar 19524
                    cropRect.set(cRect);
597 daniel-mar 19525
                  });
679 daniel-mar 19526
                }),
19527
                runOnDetached(function () {
19528
                  cropRect.clear();
19529
                })
19530
              ])])
597 daniel-mar 19531
          }
19532
        ],
19533
        containerBehaviours: derive$1([
19534
          Replacing.config({}),
19535
          config('image-panel-events', [runOnAttached(function (comp) {
19536
              updateSrc(comp, initialUrl);
19537
            })])
19538
        ])
19539
      });
19540
      var memContainer = record(container);
19541
      var getMeasurements = function () {
19542
        var viewRect = viewRectState.get();
19543
        return {
19544
          width: viewRect.w,
19545
          height: viewRect.h
19546
        };
19547
      };
19548
      return {
19549
        memContainer: memContainer,
19550
        updateSrc: updateSrc,
19551
        zoom: zoom,
19552
        showCrop: showCrop,
19553
        hideCrop: hideCrop,
19554
        getRect: getRect,
19555
        getMeasurements: getMeasurements
19556
      };
19557
    };
19558
 
19559
    var createButton = function (innerHtml, icon, disabled, action, providersBackstage) {
19560
      return renderIconButton({
19561
        name: innerHtml,
19562
        icon: Optional.some(icon),
19563
        disabled: disabled,
19564
        tooltip: Optional.some(innerHtml),
19565
        primary: false,
19566
        borderless: false
19567
      }, action, providersBackstage);
19568
    };
19569
    var setButtonEnabled = function (button, enabled) {
19570
      if (enabled) {
19571
        Disabling.enable(button);
19572
      } else {
19573
        Disabling.disable(button);
19574
      }
19575
    };
19576
    var renderSideBar = function (providersBackstage) {
19577
      var updateButtonUndoStates = function (anyInSystem, undoEnabled, redoEnabled) {
19578
        memUndo.getOpt(anyInSystem).each(function (undo) {
19579
          setButtonEnabled(undo, undoEnabled);
19580
        });
19581
        memRedo.getOpt(anyInSystem).each(function (redo) {
19582
          setButtonEnabled(redo, redoEnabled);
19583
        });
19584
      };
19585
      var memUndo = record(createButton('Undo', 'undo', true, function (button) {
19586
        emitWith(button, internal.undo(), { direction: 1 });
19587
      }, providersBackstage));
19588
      var memRedo = record(createButton('Redo', 'redo', true, function (button) {
19589
        emitWith(button, internal.redo(), { direction: 1 });
19590
      }, providersBackstage));
19591
      var container = Container.sketch({
19592
        dom: {
19593
          tag: 'div',
19594
          classes: [
19595
            'tox-image-tools__toolbar',
19596
            'tox-image-tools__sidebar'
19597
          ]
19598
        },
19599
        components: [
19600
          memUndo.asSpec(),
19601
          memRedo.asSpec(),
19602
          createButton('Zoom in', 'zoom-in', false, function (button) {
19603
            emitWith(button, internal.zoom(), { direction: 1 });
19604
          }, providersBackstage),
19605
          createButton('Zoom out', 'zoom-out', false, function (button) {
19606
            emitWith(button, internal.zoom(), { direction: -1 });
19607
          }, providersBackstage)
19608
        ]
19609
      });
19610
      return {
19611
        container: container,
19612
        updateButtonUndoStates: updateButtonUndoStates
19613
      };
19614
    };
19615
 
19616
    function UndoStack () {
19617
      var data = [];
19618
      var index = -1;
19619
      var add = function (state) {
19620
        var removed = data.splice(++index);
19621
        data.push(state);
19622
        return {
19623
          state: state,
19624
          removed: removed
19625
        };
19626
      };
19627
      var undo = function () {
19628
        if (canUndo()) {
19629
          return data[--index];
19630
        }
19631
      };
19632
      var redo = function () {
19633
        if (canRedo()) {
19634
          return data[++index];
19635
        }
19636
      };
19637
      var canUndo = function () {
19638
        return index > 0;
19639
      };
19640
      var canRedo = function () {
19641
        return index !== -1 && index < data.length - 1;
19642
      };
19643
      return {
19644
        data: data,
19645
        add: add,
19646
        undo: undo,
19647
        redo: redo,
19648
        canUndo: canUndo,
19649
        canRedo: canRedo
19650
      };
19651
    }
19652
 
19653
    var makeState = function (initialState) {
19654
      var blobState = Cell(initialState);
637 daniel-mar 19655
      var tempState = value$1();
597 daniel-mar 19656
      var undoStack = UndoStack();
19657
      undoStack.add(initialState);
19658
      var getBlobState = function () {
19659
        return blobState.get();
19660
      };
19661
      var setBlobState = function (state) {
19662
        blobState.set(state);
19663
      };
19664
      var getTempState = function () {
637 daniel-mar 19665
        return tempState.get().getOrThunk(blobState.get);
597 daniel-mar 19666
      };
19667
      var updateTempState = function (blob) {
19668
        var newTempState = createState(blob);
19669
        destroyTempState();
637 daniel-mar 19670
        tempState.set(newTempState);
597 daniel-mar 19671
        return newTempState.url;
19672
      };
19673
      var createState = function (blob) {
19674
        return {
19675
          blob: blob,
19676
          url: URL.createObjectURL(blob)
19677
        };
19678
      };
19679
      var destroyState = function (state) {
19680
        URL.revokeObjectURL(state.url);
19681
      };
19682
      var destroyStates = function (states) {
679 daniel-mar 19683
        global$5.each(states, destroyState);
597 daniel-mar 19684
      };
19685
      var destroyTempState = function () {
637 daniel-mar 19686
        tempState.on(destroyState);
19687
        tempState.clear();
597 daniel-mar 19688
      };
19689
      var addBlobState = function (blob) {
19690
        var newState = createState(blob);
19691
        setBlobState(newState);
19692
        var removed = undoStack.add(newState).removed;
19693
        destroyStates(removed);
19694
        return newState.url;
19695
      };
19696
      var addTempState = function (blob) {
19697
        var newState = createState(blob);
637 daniel-mar 19698
        tempState.set(newState);
597 daniel-mar 19699
        return newState.url;
19700
      };
19701
      var applyTempState = function (postApply) {
19702
        return tempState.get().fold(noop, function (temp) {
19703
          addBlobState(temp.blob);
19704
          postApply();
19705
        });
19706
      };
19707
      var undo = function () {
19708
        var currentState = undoStack.undo();
19709
        setBlobState(currentState);
19710
        return currentState.url;
19711
      };
19712
      var redo = function () {
19713
        var currentState = undoStack.redo();
19714
        setBlobState(currentState);
19715
        return currentState.url;
19716
      };
19717
      var getHistoryStates = function () {
19718
        var undoEnabled = undoStack.canUndo();
19719
        var redoEnabled = undoStack.canRedo();
19720
        return {
19721
          undoEnabled: undoEnabled,
19722
          redoEnabled: redoEnabled
19723
        };
19724
      };
19725
      return {
19726
        getBlobState: getBlobState,
19727
        setBlobState: setBlobState,
19728
        addBlobState: addBlobState,
19729
        getTempState: getTempState,
19730
        updateTempState: updateTempState,
19731
        addTempState: addTempState,
19732
        applyTempState: applyTempState,
19733
        destroyTempState: destroyTempState,
19734
        undo: undo,
19735
        redo: redo,
19736
        getHistoryStates: getHistoryStates
19737
      };
19738
    };
19739
 
19740
    var renderImageTools = function (detail, providersBackstage) {
19741
      var state = makeState(detail.currentState);
19742
      var zoom = function (anyInSystem, simulatedEvent) {
19743
        var direction = simulatedEvent.event.direction;
19744
        imagePanel.zoom(anyInSystem, direction);
19745
      };
19746
      var updateButtonUndoStates = function (anyInSystem) {
19747
        var historyStates = state.getHistoryStates();
19748
        sideBar.updateButtonUndoStates(anyInSystem, historyStates.undoEnabled, historyStates.redoEnabled);
637 daniel-mar 19749
        emitWith(anyInSystem, external.formActionEvent, {
19750
          name: external.saveState(),
597 daniel-mar 19751
          value: historyStates.undoEnabled
19752
        });
19753
      };
19754
      var disableUndoRedo = function (anyInSystem) {
19755
        sideBar.updateButtonUndoStates(anyInSystem, false, false);
19756
      };
19757
      var undo = function (anyInSystem, _simulatedEvent) {
19758
        var url = state.undo();
19759
        updateSrc(anyInSystem, url).then(function (_oImg) {
19760
          unblock(anyInSystem);
19761
          updateButtonUndoStates(anyInSystem);
19762
        });
19763
      };
19764
      var redo = function (anyInSystem, _simulatedEvent) {
19765
        var url = state.redo();
19766
        updateSrc(anyInSystem, url).then(function (_oImg) {
19767
          unblock(anyInSystem);
19768
          updateButtonUndoStates(anyInSystem);
19769
        });
19770
      };
19771
      var imageResultToBlob = function (ir) {
19772
        return ir.toBlob();
19773
      };
19774
      var block = function (anyInSystem) {
637 daniel-mar 19775
        emitWith(anyInSystem, external.formActionEvent, {
19776
          name: external.disable(),
597 daniel-mar 19777
          value: {}
19778
        });
19779
      };
19780
      var unblock = function (anyInSystem) {
19781
        editPanel.getApplyButton(anyInSystem).each(function (applyButton) {
19782
          Disabling.enable(applyButton);
19783
        });
637 daniel-mar 19784
        emitWith(anyInSystem, external.formActionEvent, {
19785
          name: external.enable(),
597 daniel-mar 19786
          value: {}
19787
        });
19788
      };
19789
      var updateSrc = function (anyInSystem, src) {
19790
        block(anyInSystem);
19791
        return imagePanel.updateSrc(anyInSystem, src);
19792
      };
19793
      var blobManipulate = function (anyInSystem, blob, filter, action, swap) {
19794
        block(anyInSystem);
637 daniel-mar 19795
        blobToImageResult(blob).then(filter).then(imageResultToBlob).then(action).then(function (url) {
19796
          return updateSrc(anyInSystem, url);
19797
        }).then(function () {
19798
          updateButtonUndoStates(anyInSystem);
19799
          swap();
19800
          unblock(anyInSystem);
597 daniel-mar 19801
        }).catch(function (err) {
19802
          console.log(err);
637 daniel-mar 19803
          if (anyInSystem.getSystem().isConnected()) {
19804
            unblock(anyInSystem);
19805
          }
597 daniel-mar 19806
        });
19807
      };
19808
      var manipulate = function (anyInSystem, filter, swap) {
19809
        var blob = state.getBlobState().blob;
19810
        var action = function (blob) {
19811
          return state.updateTempState(blob);
19812
        };
19813
        blobManipulate(anyInSystem, blob, filter, action, swap);
19814
      };
19815
      var tempManipulate = function (anyInSystem, filter) {
19816
        var blob = state.getTempState().blob;
19817
        var action = function (blob) {
19818
          return state.addTempState(blob);
19819
        };
19820
        blobManipulate(anyInSystem, blob, filter, action, noop);
19821
      };
19822
      var manipulateApply = function (anyInSystem, filter, swap) {
19823
        var blob = state.getBlobState().blob;
19824
        var action = function (blob) {
19825
          var url = state.addBlobState(blob);
19826
          destroyTempState(anyInSystem);
19827
          return url;
19828
        };
19829
        blobManipulate(anyInSystem, blob, filter, action, swap);
19830
      };
19831
      var apply = function (anyInSystem, simulatedEvent) {
19832
        var postApply = function () {
19833
          destroyTempState(anyInSystem);
19834
          var swap = simulatedEvent.event.swap;
19835
          swap();
19836
        };
19837
        state.applyTempState(postApply);
19838
      };
19839
      var destroyTempState = function (anyInSystem) {
19840
        var currentUrl = state.getBlobState().url;
19841
        state.destroyTempState();
19842
        updateButtonUndoStates(anyInSystem);
19843
        return currentUrl;
19844
      };
19845
      var cancel = function (anyInSystem) {
19846
        var currentUrl = destroyTempState(anyInSystem);
19847
        updateSrc(anyInSystem, currentUrl).then(function (_oImg) {
19848
          unblock(anyInSystem);
19849
        });
19850
      };
19851
      var back = function (anyInSystem, simulatedEvent) {
19852
        cancel(anyInSystem);
19853
        var swap = simulatedEvent.event.swap;
19854
        swap();
19855
        imagePanel.hideCrop();
19856
      };
19857
      var transform = function (anyInSystem, simulatedEvent) {
19858
        return manipulate(anyInSystem, simulatedEvent.event.transform, noop);
19859
      };
19860
      var tempTransform = function (anyInSystem, simulatedEvent) {
19861
        return tempManipulate(anyInSystem, simulatedEvent.event.transform);
19862
      };
19863
      var transformApply = function (anyInSystem, simulatedEvent) {
19864
        return manipulateApply(anyInSystem, simulatedEvent.event.transform, simulatedEvent.event.swap);
19865
      };
19866
      var imagePanel = renderImagePanel(detail.currentState.url);
19867
      var sideBar = renderSideBar(providersBackstage);
19868
      var editPanel = renderEditPanel(imagePanel, providersBackstage);
19869
      var swap = function (anyInSystem, simulatedEvent) {
19870
        disableUndoRedo(anyInSystem);
19871
        var transform = simulatedEvent.event.transform;
19872
        var swap = simulatedEvent.event.swap;
19873
        transform.fold(function () {
19874
          swap();
19875
        }, function (transform) {
19876
          manipulate(anyInSystem, transform, swap);
19877
        });
19878
      };
19879
      return {
19880
        dom: {
19881
          tag: 'div',
19882
          attributes: { role: 'presentation' }
19883
        },
19884
        components: [
19885
          editPanel.memContainer.asSpec(),
19886
          imagePanel.memContainer.asSpec(),
19887
          sideBar.container
19888
        ],
19889
        behaviours: derive$1([
19890
          Representing.config({
19891
            store: {
19892
              mode: 'manual',
19893
              getValue: function () {
19894
                return state.getBlobState();
19895
              }
19896
            }
19897
          }),
19898
          config('image-tools-events', [
637 daniel-mar 19899
            run$1(internal.undo(), undo),
19900
            run$1(internal.redo(), redo),
19901
            run$1(internal.zoom(), zoom),
19902
            run$1(internal.back(), back),
19903
            run$1(internal.apply(), apply),
19904
            run$1(internal.transform(), transform),
19905
            run$1(internal.tempTransform(), tempTransform),
19906
            run$1(internal.transformApply(), transformApply),
19907
            run$1(internal.swap(), swap)
597 daniel-mar 19908
          ]),
19909
          ComposingConfigs.self()
19910
        ])
19911
      };
19912
    };
19913
 
637 daniel-mar 19914
    var renderLabel = function (spec, backstageShared) {
597 daniel-mar 19915
      var label = {
19916
        dom: {
19917
          tag: 'label',
19918
          innerHtml: backstageShared.providers.translate(spec.label),
19919
          classes: ['tox-label']
19920
        }
19921
      };
637 daniel-mar 19922
      var comps = map$2(spec.items, backstageShared.interpreter);
597 daniel-mar 19923
      return {
19924
        dom: {
19925
          tag: 'div',
19926
          classes: ['tox-form__group']
19927
        },
19928
        components: [label].concat(comps),
19929
        behaviours: derive$1([
19930
          ComposingConfigs.self(),
19931
          Replacing.config({}),
19932
          RepresentingConfigs.domHtml(Optional.none()),
19933
          Keying.config({ mode: 'acyclic' })
19934
        ])
19935
      };
19936
    };
19937
 
19938
    var isSingleListItem = function (item) {
637 daniel-mar 19939
      return !has$2(item, 'items');
597 daniel-mar 19940
    };
19941
    var dataAttribute = 'data-value';
19942
    var fetchItems = function (dropdownComp, name, items, selectedValue) {
637 daniel-mar 19943
      return map$2(items, function (item) {
597 daniel-mar 19944
        if (!isSingleListItem(item)) {
19945
          return {
19946
            type: 'nestedmenuitem',
19947
            text: item.text,
19948
            getSubmenuItems: function () {
19949
              return fetchItems(dropdownComp, name, item.items, selectedValue);
19950
            }
19951
          };
19952
        } else {
19953
          return {
19954
            type: 'togglemenuitem',
19955
            text: item.text,
19956
            value: item.value,
19957
            active: item.value === selectedValue,
19958
            onAction: function () {
19959
              Representing.setValue(dropdownComp, item.value);
19960
              emitWith(dropdownComp, formChangeEvent, { name: name });
19961
              Focusing.focus(dropdownComp);
19962
            }
19963
          };
19964
        }
19965
      });
19966
    };
19967
    var findItemByValue = function (items, value) {
19968
      return findMap(items, function (item) {
19969
        if (!isSingleListItem(item)) {
19970
          return findItemByValue(item.items, value);
19971
        } else {
19972
          return someIf(item.value === value, item);
19973
        }
19974
      });
19975
    };
19976
    var renderListBox = function (spec, backstage) {
19977
      var providersBackstage = backstage.shared.providers;
19978
      var initialItem = head(spec.items).filter(isSingleListItem);
19979
      var pLabel = spec.label.map(function (label) {
637 daniel-mar 19980
        return renderLabel$2(label, providersBackstage);
597 daniel-mar 19981
      });
19982
      var pField = FormField.parts.field({
19983
        dom: {},
19984
        factory: {
19985
          sketch: function (sketchSpec) {
19986
            return renderCommonDropdown({
19987
              uid: sketchSpec.uid,
19988
              text: initialItem.map(function (item) {
19989
                return item.text;
19990
              }),
19991
              icon: Optional.none(),
19992
              tooltip: spec.label,
19993
              role: Optional.none(),
19994
              fetch: function (comp, callback) {
19995
                var items = fetchItems(comp, spec.name, spec.items, Representing.getValue(comp));
637 daniel-mar 19996
                callback(build(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, false));
597 daniel-mar 19997
              },
637 daniel-mar 19998
              onSetup: constant$1(noop),
19999
              getApi: constant$1({}),
597 daniel-mar 20000
              columns: 1,
20001
              presets: 'normal',
20002
              classes: [],
20003
              dropdownBehaviours: [
20004
                Tabstopping.config({}),
20005
                Representing.config({
20006
                  store: {
20007
                    mode: 'manual',
20008
                    initialValue: initialItem.map(function (item) {
20009
                      return item.value;
20010
                    }).getOr(''),
20011
                    getValue: function (comp) {
679 daniel-mar 20012
                      return get$d(comp.element, dataAttribute);
597 daniel-mar 20013
                    },
20014
                    setValue: function (comp, data) {
20015
                      findItemByValue(spec.items, data).each(function (item) {
679 daniel-mar 20016
                        set$8(comp.element, dataAttribute, item.value);
597 daniel-mar 20017
                        emitWith(comp, updateMenuText, { text: item.text });
20018
                      });
20019
                    }
20020
                  }
20021
                })
20022
              ]
20023
            }, 'tox-listbox', backstage.shared);
20024
          }
20025
        }
20026
      });
20027
      var listBoxWrap = {
20028
        dom: {
20029
          tag: 'div',
20030
          classes: ['tox-listboxfield']
20031
        },
20032
        components: [pField]
20033
      };
20034
      return FormField.sketch({
20035
        dom: {
20036
          tag: 'div',
20037
          classes: ['tox-form__group']
20038
        },
20039
        components: flatten([
20040
          pLabel.toArray(),
20041
          [listBoxWrap]
20042
        ]),
20043
        fieldBehaviours: derive$1([Disabling.config({
637 daniel-mar 20044
            disabled: constant$1(spec.disabled),
597 daniel-mar 20045
            onDisabled: function (comp) {
20046
              FormField.getField(comp).each(Disabling.disable);
20047
            },
20048
            onEnabled: function (comp) {
20049
              FormField.getField(comp).each(Disabling.enable);
20050
            }
20051
          })])
20052
      });
20053
    };
20054
 
20055
    var renderPanel = function (spec, backstage) {
20056
      return {
20057
        dom: {
20058
          tag: 'div',
20059
          classes: spec.classes
20060
        },
637 daniel-mar 20061
        components: map$2(spec.items, backstage.shared.interpreter)
597 daniel-mar 20062
      };
20063
    };
20064
 
637 daniel-mar 20065
    var factory$e = function (detail, _spec) {
20066
      var options = map$2(detail.options, function (option) {
597 daniel-mar 20067
        return {
20068
          dom: {
20069
            tag: 'option',
20070
            value: option.value,
20071
            innerHtml: option.text
20072
          }
20073
        };
20074
      });
20075
      var initialValues = detail.data.map(function (v) {
20076
        return wrap$1('initialValue', v);
20077
      }).getOr({});
20078
      return {
20079
        uid: detail.uid,
20080
        dom: {
20081
          tag: 'select',
20082
          classes: detail.selectClasses,
20083
          attributes: detail.selectAttributes
20084
        },
20085
        components: options,
20086
        behaviours: augment(detail.selectBehaviours, [
20087
          Focusing.config({}),
20088
          Representing.config({
20089
            store: __assign({
20090
              mode: 'manual',
20091
              getValue: function (select) {
679 daniel-mar 20092
                return get$5(select.element);
597 daniel-mar 20093
              },
20094
              setValue: function (select, newValue) {
637 daniel-mar 20095
                var found = find$5(detail.options, function (opt) {
597 daniel-mar 20096
                  return opt.value === newValue;
20097
                });
20098
                if (found.isSome()) {
679 daniel-mar 20099
                  set$4(select.element, newValue);
597 daniel-mar 20100
                }
20101
              }
20102
            }, initialValues)
20103
          })
20104
        ])
20105
      };
20106
    };
637 daniel-mar 20107
    var HtmlSelect = single({
597 daniel-mar 20108
      name: 'HtmlSelect',
20109
      configFields: [
637 daniel-mar 20110
        required$1('options'),
20111
        field('selectBehaviours', [
597 daniel-mar 20112
          Focusing,
20113
          Representing
20114
        ]),
637 daniel-mar 20115
        defaulted('selectClasses', []),
20116
        defaulted('selectAttributes', {}),
597 daniel-mar 20117
        option('data')
20118
      ],
637 daniel-mar 20119
      factory: factory$e
597 daniel-mar 20120
    });
20121
 
20122
    var renderSelectBox = function (spec, providersBackstage) {
637 daniel-mar 20123
      var translatedOptions = map$2(spec.items, function (item) {
597 daniel-mar 20124
        return {
20125
          text: providersBackstage.translate(item.text),
20126
          value: item.value
20127
        };
20128
      });
20129
      var pLabel = spec.label.map(function (label) {
637 daniel-mar 20130
        return renderLabel$2(label, providersBackstage);
597 daniel-mar 20131
      });
20132
      var pField = FormField.parts.field({
20133
        dom: {},
20134
        selectAttributes: { size: spec.size },
20135
        options: translatedOptions,
20136
        factory: HtmlSelect,
20137
        selectBehaviours: derive$1([
20138
          Disabling.config({
20139
            disabled: function () {
20140
              return spec.disabled || providersBackstage.isDisabled();
20141
            }
20142
          }),
20143
          Tabstopping.config({}),
637 daniel-mar 20144
          config('selectbox-change', [run$1(change(), function (component, _) {
597 daniel-mar 20145
              emitWith(component, formChangeEvent, { name: spec.name });
20146
            })])
20147
        ])
20148
      });
637 daniel-mar 20149
      var chevron = spec.size > 1 ? Optional.none() : Optional.some(render$3('chevron-down', {
20150
        tag: 'div',
20151
        classes: ['tox-selectfield__icon-js']
20152
      }, providersBackstage.icons));
597 daniel-mar 20153
      var selectWrap = {
20154
        dom: {
20155
          tag: 'div',
20156
          classes: ['tox-selectfield']
20157
        },
20158
        components: flatten([
20159
          [pField],
20160
          chevron.toArray()
20161
        ])
20162
      };
20163
      return FormField.sketch({
20164
        dom: {
20165
          tag: 'div',
20166
          classes: ['tox-form__group']
20167
        },
20168
        components: flatten([
20169
          pLabel.toArray(),
20170
          [selectWrap]
20171
        ]),
20172
        fieldBehaviours: derive$1([
20173
          Disabling.config({
20174
            disabled: function () {
20175
              return spec.disabled || providersBackstage.isDisabled();
20176
            },
20177
            onDisabled: function (comp) {
20178
              FormField.getField(comp).each(Disabling.disable);
20179
            },
20180
            onEnabled: function (comp) {
20181
              FormField.getField(comp).each(Disabling.enable);
20182
            }
20183
          }),
20184
          receivingConfig()
20185
        ])
20186
      });
20187
    };
20188
 
20189
    var renderTable = function (spec, providersBackstage) {
20190
      var renderTh = function (text) {
20191
        return {
20192
          dom: {
20193
            tag: 'th',
20194
            innerHtml: providersBackstage.translate(text)
20195
          }
20196
        };
20197
      };
20198
      var renderHeader = function (header) {
20199
        return {
20200
          dom: { tag: 'thead' },
20201
          components: [{
20202
              dom: { tag: 'tr' },
637 daniel-mar 20203
              components: map$2(header, renderTh)
597 daniel-mar 20204
            }]
20205
        };
20206
      };
20207
      var renderTd = function (text) {
20208
        return {
20209
          dom: {
20210
            tag: 'td',
20211
            innerHtml: providersBackstage.translate(text)
20212
          }
20213
        };
20214
      };
20215
      var renderTr = function (row) {
20216
        return {
20217
          dom: { tag: 'tr' },
637 daniel-mar 20218
          components: map$2(row, renderTd)
597 daniel-mar 20219
        };
20220
      };
20221
      var renderRows = function (rows) {
20222
        return {
20223
          dom: { tag: 'tbody' },
637 daniel-mar 20224
          components: map$2(rows, renderTr)
597 daniel-mar 20225
        };
20226
      };
20227
      return {
20228
        dom: {
20229
          tag: 'table',
20230
          classes: ['tox-dialog__table']
20231
        },
20232
        components: [
20233
          renderHeader(spec.header),
20234
          renderRows(spec.cells)
20235
        ],
20236
        behaviours: derive$1([
20237
          Tabstopping.config({}),
20238
          Focusing.config({})
20239
        ])
20240
      };
20241
    };
20242
 
20243
    var renderTextField = function (spec, providersBackstage) {
20244
      var pLabel = spec.label.map(function (label) {
637 daniel-mar 20245
        return renderLabel$2(label, providersBackstage);
597 daniel-mar 20246
      });
20247
      var baseInputBehaviours = [
20248
        Disabling.config({
20249
          disabled: function () {
20250
            return spec.disabled || providersBackstage.isDisabled();
20251
          }
20252
        }),
20253
        receivingConfig(),
20254
        Keying.config({
20255
          mode: 'execution',
20256
          useEnter: spec.multiline !== true,
20257
          useControlEnter: spec.multiline === true,
20258
          execute: function (comp) {
20259
            emit(comp, formSubmitEvent);
20260
            return Optional.some(true);
20261
          }
20262
        }),
20263
        config('textfield-change', [
637 daniel-mar 20264
          run$1(input(), function (component, _) {
597 daniel-mar 20265
            emitWith(component, formChangeEvent, { name: spec.name });
20266
          }),
637 daniel-mar 20267
          run$1(postPaste(), function (component, _) {
597 daniel-mar 20268
            emitWith(component, formChangeEvent, { name: spec.name });
20269
          })
20270
        ]),
20271
        Tabstopping.config({})
20272
      ];
20273
      var validatingBehaviours = spec.validation.map(function (vl) {
20274
        return Invalidating.config({
20275
          getRoot: function (input) {
20276
            return parent(input.element);
20277
          },
20278
          invalidClass: 'tox-invalid',
20279
          validator: {
20280
            validate: function (input) {
20281
              var v = Representing.getValue(input);
20282
              var result = vl.validator(v);
20283
              return Future.pure(result === true ? Result.value(v) : Result.error(result));
20284
            },
20285
            validateOnLoad: vl.validateOnLoad
20286
          }
20287
        });
20288
      }).toArray();
637 daniel-mar 20289
      var placeholder = spec.placeholder.fold(constant$1({}), function (p) {
597 daniel-mar 20290
        return { placeholder: providersBackstage.translate(p) };
20291
      });
637 daniel-mar 20292
      var inputMode = spec.inputMode.fold(constant$1({}), function (mode) {
597 daniel-mar 20293
        return { inputmode: mode };
20294
      });
20295
      var inputAttributes = __assign(__assign({}, placeholder), inputMode);
20296
      var pField = FormField.parts.field({
20297
        tag: spec.multiline === true ? 'textarea' : 'input',
20298
        inputAttributes: inputAttributes,
20299
        inputClasses: [spec.classname],
20300
        inputBehaviours: derive$1(flatten([
20301
          baseInputBehaviours,
20302
          validatingBehaviours
20303
        ])),
20304
        selectOnFocus: false,
20305
        factory: Input
20306
      });
20307
      var extraClasses = spec.flex ? ['tox-form__group--stretched'] : [];
20308
      var extraClasses2 = extraClasses.concat(spec.maximized ? ['tox-form-group--maximize'] : []);
20309
      var extraBehaviours = [
20310
        Disabling.config({
20311
          disabled: function () {
20312
            return spec.disabled || providersBackstage.isDisabled();
20313
          },
20314
          onDisabled: function (comp) {
20315
            FormField.getField(comp).each(Disabling.disable);
20316
          },
20317
          onEnabled: function (comp) {
20318
            FormField.getField(comp).each(Disabling.enable);
20319
          }
20320
        }),
20321
        receivingConfig()
20322
      ];
20323
      return renderFormFieldWith(pLabel, pField, extraClasses2, extraBehaviours);
20324
    };
20325
    var renderInput = function (spec, providersBackstage) {
20326
      return renderTextField({
20327
        name: spec.name,
20328
        multiline: false,
20329
        label: spec.label,
20330
        inputMode: spec.inputMode,
20331
        placeholder: spec.placeholder,
20332
        flex: false,
20333
        disabled: spec.disabled,
20334
        classname: 'tox-textfield',
20335
        validation: Optional.none(),
20336
        maximized: spec.maximized
20337
      }, providersBackstage);
20338
    };
20339
    var renderTextarea = function (spec, providersBackstage) {
20340
      return renderTextField({
20341
        name: spec.name,
20342
        multiline: true,
20343
        label: spec.label,
20344
        inputMode: Optional.none(),
20345
        placeholder: spec.placeholder,
20346
        flex: true,
20347
        disabled: spec.disabled,
20348
        classname: 'tox-textarea',
20349
        validation: Optional.none(),
20350
        maximized: spec.maximized
20351
      }, providersBackstage);
20352
    };
20353
 
637 daniel-mar 20354
    var events$6 = function (streamConfig, streamState) {
597 daniel-mar 20355
      var streams = streamConfig.stream.streams;
20356
      var processor = streams.setup(streamConfig, streamState);
637 daniel-mar 20357
      return derive$2([
20358
        run$1(streamConfig.event, processor),
597 daniel-mar 20359
        runOnDetached(function () {
20360
          return streamState.cancel();
20361
        })
20362
      ].concat(streamConfig.cancelEvent.map(function (e) {
637 daniel-mar 20363
        return [run$1(e, function () {
597 daniel-mar 20364
            return streamState.cancel();
20365
          })];
20366
      }).getOr([])));
20367
    };
20368
 
20369
    var ActiveStreaming = /*#__PURE__*/Object.freeze({
20370
        __proto__: null,
637 daniel-mar 20371
        events: events$6
597 daniel-mar 20372
    });
20373
 
20374
    var throttle = function (_config) {
20375
      var state = Cell(null);
20376
      var readState = function () {
20377
        return { timer: state.get() !== null ? 'set' : 'unset' };
20378
      };
20379
      var setTimer = function (t) {
20380
        state.set(t);
20381
      };
20382
      var cancel = function () {
20383
        var t = state.get();
20384
        if (t !== null) {
20385
          t.cancel();
20386
        }
20387
      };
637 daniel-mar 20388
      return nu$8({
597 daniel-mar 20389
        readState: readState,
20390
        setTimer: setTimer,
20391
        cancel: cancel
20392
      });
20393
    };
637 daniel-mar 20394
    var init$9 = function (spec) {
597 daniel-mar 20395
      return spec.stream.streams.state(spec);
20396
    };
20397
 
20398
    var StreamingState = /*#__PURE__*/Object.freeze({
20399
        __proto__: null,
20400
        throttle: throttle,
637 daniel-mar 20401
        init: init$9
597 daniel-mar 20402
    });
20403
 
637 daniel-mar 20404
    var setup$c = function (streamInfo, streamState) {
597 daniel-mar 20405
      var sInfo = streamInfo.stream;
637 daniel-mar 20406
      var throttler = last(streamInfo.onStream, sInfo.delay);
597 daniel-mar 20407
      streamState.setTimer(throttler);
20408
      return function (component, simulatedEvent) {
20409
        throttler.throttle(component, simulatedEvent);
20410
        if (sInfo.stopEvent) {
20411
          simulatedEvent.stop();
20412
        }
20413
      };
20414
    };
20415
    var StreamingSchema = [
637 daniel-mar 20416
      requiredOf('stream', choose$1('mode', {
597 daniel-mar 20417
        throttle: [
637 daniel-mar 20418
          required$1('delay'),
20419
          defaulted('stopEvent', true),
20420
          output$1('streams', {
20421
            setup: setup$c,
597 daniel-mar 20422
            state: throttle
20423
          })
20424
        ]
20425
      })),
637 daniel-mar 20426
      defaulted('event', 'input'),
597 daniel-mar 20427
      option('cancelEvent'),
20428
      onStrictHandler('onStream')
20429
    ];
20430
 
637 daniel-mar 20431
    var Streaming = create$7({
597 daniel-mar 20432
      fields: StreamingSchema,
20433
      name: 'streaming',
20434
      active: ActiveStreaming,
20435
      state: StreamingState
20436
    });
20437
 
20438
    var setValueFromItem = function (model, input, item) {
20439
      var itemData = Representing.getValue(item);
20440
      Representing.setValue(input, itemData);
20441
      setCursorAtEnd(input);
20442
    };
20443
    var setSelectionOn = function (input, f) {
20444
      var el = input.element;
679 daniel-mar 20445
      var value = get$5(el);
597 daniel-mar 20446
      var node = el.dom;
679 daniel-mar 20447
      if (get$d(el, 'type') !== 'number') {
597 daniel-mar 20448
        f(node, value);
20449
      }
20450
    };
20451
    var setCursorAtEnd = function (input) {
20452
      setSelectionOn(input, function (node, value) {
20453
        return node.setSelectionRange(value.length, value.length);
20454
      });
20455
    };
20456
    var setSelectionToEnd = function (input, startOffset) {
20457
      setSelectionOn(input, function (node, value) {
20458
        return node.setSelectionRange(startOffset, value.length);
20459
      });
20460
    };
20461
    var attemptSelectOver = function (model, input, item) {
20462
      if (!model.selectsOver) {
20463
        return Optional.none();
20464
      } else {
20465
        var currentValue = Representing.getValue(input);
20466
        var inputDisplay_1 = model.getDisplayText(currentValue);
20467
        var itemValue = Representing.getValue(item);
20468
        var itemDisplay = model.getDisplayText(itemValue);
20469
        return itemDisplay.indexOf(inputDisplay_1) === 0 ? Optional.some(function () {
20470
          setValueFromItem(model, input, item);
20471
          setSelectionToEnd(input, inputDisplay_1.length);
20472
        }) : Optional.none();
20473
      }
20474
    };
20475
 
637 daniel-mar 20476
    var itemExecute = constant$1('alloy.typeahead.itemexecute');
597 daniel-mar 20477
 
637 daniel-mar 20478
    var make$3 = function (detail, components, spec, externals) {
597 daniel-mar 20479
      var navigateList = function (comp, simulatedEvent, highlighter) {
20480
        detail.previewing.set(false);
20481
        var sandbox = Coupling.getCoupled(comp, 'sandbox');
20482
        if (Sandboxing.isOpen(sandbox)) {
20483
          Composing.getCurrent(sandbox).each(function (menu) {
20484
            Highlighting.getHighlighted(menu).fold(function () {
20485
              highlighter(menu);
20486
            }, function () {
20487
              dispatchEvent(sandbox, menu.element, 'keydown', simulatedEvent);
20488
            });
20489
          });
20490
        } else {
20491
          var onOpenSync = function (sandbox) {
20492
            Composing.getCurrent(sandbox).each(highlighter);
20493
          };
637 daniel-mar 20494
          open(detail, mapFetch(comp), comp, sandbox, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop);
597 daniel-mar 20495
        }
20496
      };
20497
      var focusBehaviours$1 = focusBehaviours(detail);
20498
      var mapFetch = function (comp) {
20499
        return function (tdata) {
20500
          return tdata.map(function (data) {
20501
            var menus = values(data.menus);
637 daniel-mar 20502
            var items = bind$3(menus, function (menu) {
20503
              return filter$2(menu.items, function (item) {
597 daniel-mar 20504
                return item.type === 'item';
20505
              });
20506
            });
20507
            var repState = Representing.getState(comp);
637 daniel-mar 20508
            repState.update(map$2(items, function (item) {
597 daniel-mar 20509
              return item.data;
20510
            }));
20511
            return data;
20512
          });
20513
        };
20514
      };
20515
      var behaviours = [
20516
        Focusing.config({}),
20517
        Representing.config({
20518
          onSetValue: detail.onSetValue,
20519
          store: __assign({
20520
            mode: 'dataset',
20521
            getDataKey: function (comp) {
679 daniel-mar 20522
              return get$5(comp.element);
597 daniel-mar 20523
            },
20524
            getFallbackEntry: function (itemString) {
20525
              return {
20526
                value: itemString,
20527
                meta: {}
20528
              };
20529
            },
20530
            setValue: function (comp, data) {
679 daniel-mar 20531
              set$4(comp.element, detail.model.getDisplayText(data));
597 daniel-mar 20532
            }
20533
          }, detail.initialData.map(function (d) {
20534
            return wrap$1('initialValue', d);
20535
          }).getOr({}))
20536
        }),
20537
        Streaming.config({
20538
          stream: {
20539
            mode: 'throttle',
20540
            delay: detail.responseTime,
20541
            stopEvent: false
20542
          },
20543
          onStream: function (component, _simulatedEvent) {
20544
            var sandbox = Coupling.getCoupled(component, 'sandbox');
20545
            var focusInInput = Focusing.isFocused(component);
20546
            if (focusInInput) {
679 daniel-mar 20547
              if (get$5(component.element).length >= detail.minChars) {
597 daniel-mar 20548
                var previousValue_1 = Composing.getCurrent(sandbox).bind(function (menu) {
20549
                  return Highlighting.getHighlighted(menu).map(Representing.getValue);
20550
                });
20551
                detail.previewing.set(true);
20552
                var onOpenSync = function (_sandbox) {
20553
                  Composing.getCurrent(sandbox).each(function (menu) {
20554
                    previousValue_1.fold(function () {
20555
                      if (detail.model.selectsOver) {
20556
                        Highlighting.highlightFirst(menu);
20557
                      }
20558
                    }, function (pv) {
20559
                      Highlighting.highlightBy(menu, function (item) {
20560
                        var itemData = Representing.getValue(item);
20561
                        return itemData.value === pv.value;
20562
                      });
20563
                      Highlighting.getHighlighted(menu).orThunk(function () {
20564
                        Highlighting.highlightFirst(menu);
20565
                        return Optional.none();
20566
                      });
20567
                    });
20568
                  });
20569
                };
637 daniel-mar 20570
                open(detail, mapFetch(component), component, sandbox, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop);
597 daniel-mar 20571
              }
20572
            }
20573
          },
20574
          cancelEvent: typeaheadCancel()
20575
        }),
20576
        Keying.config({
20577
          mode: 'special',
20578
          onDown: function (comp, simulatedEvent) {
20579
            navigateList(comp, simulatedEvent, Highlighting.highlightFirst);
20580
            return Optional.some(true);
20581
          },
20582
          onEscape: function (comp) {
20583
            var sandbox = Coupling.getCoupled(comp, 'sandbox');
20584
            if (Sandboxing.isOpen(sandbox)) {
20585
              Sandboxing.close(sandbox);
20586
              return Optional.some(true);
20587
            }
20588
            return Optional.none();
20589
          },
20590
          onUp: function (comp, simulatedEvent) {
20591
            navigateList(comp, simulatedEvent, Highlighting.highlightLast);
20592
            return Optional.some(true);
20593
          },
20594
          onEnter: function (comp) {
20595
            var sandbox = Coupling.getCoupled(comp, 'sandbox');
20596
            var sandboxIsOpen = Sandboxing.isOpen(sandbox);
20597
            if (sandboxIsOpen && !detail.previewing.get()) {
20598
              return Composing.getCurrent(sandbox).bind(function (menu) {
20599
                return Highlighting.getHighlighted(menu);
20600
              }).map(function (item) {
20601
                emitWith(comp, itemExecute(), { item: item });
20602
                return true;
20603
              });
20604
            } else {
20605
              var currentValue = Representing.getValue(comp);
20606
              emit(comp, typeaheadCancel());
20607
              detail.onExecute(sandbox, comp, currentValue);
20608
              if (sandboxIsOpen) {
20609
                Sandboxing.close(sandbox);
20610
              }
20611
              return Optional.some(true);
20612
            }
20613
          }
20614
        }),
20615
        Toggling.config({
20616
          toggleClass: detail.markers.openClass,
20617
          aria: { mode: 'expanded' }
20618
        }),
20619
        Coupling.config({
20620
          others: {
20621
            sandbox: function (hotspot) {
637 daniel-mar 20622
              return makeSandbox$1(detail, hotspot, {
597 daniel-mar 20623
                onOpen: function () {
20624
                  return Toggling.on(hotspot);
20625
                },
20626
                onClose: function () {
20627
                  return Toggling.off(hotspot);
20628
                }
20629
              });
20630
            }
20631
          }
20632
        }),
20633
        config('typeaheadevents', [
637 daniel-mar 20634
          runOnExecute$1(function (comp) {
597 daniel-mar 20635
            var onOpenSync = noop;
20636
            togglePopup(detail, mapFetch(comp), comp, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop);
20637
          }),
637 daniel-mar 20638
          run$1(itemExecute(), function (comp, se) {
597 daniel-mar 20639
            var sandbox = Coupling.getCoupled(comp, 'sandbox');
20640
            setValueFromItem(detail.model, comp, se.event.item);
20641
            emit(comp, typeaheadCancel());
20642
            detail.onItemExecute(comp, sandbox, se.event.item, Representing.getValue(comp));
20643
            Sandboxing.close(sandbox);
20644
            setCursorAtEnd(comp);
20645
          })
637 daniel-mar 20646
        ].concat(detail.dismissOnBlur ? [run$1(postBlur(), function (typeahead) {
597 daniel-mar 20647
            var sandbox = Coupling.getCoupled(typeahead, 'sandbox');
20648
            if (search(sandbox.element).isNone()) {
20649
              Sandboxing.close(sandbox);
20650
            }
20651
          })] : []))
20652
      ];
20653
      return {
20654
        uid: detail.uid,
637 daniel-mar 20655
        dom: dom(deepMerge(detail, {
597 daniel-mar 20656
          inputAttributes: {
20657
            'role': 'combobox',
20658
            'aria-autocomplete': 'list',
20659
            'aria-haspopup': 'true'
20660
          }
20661
        })),
20662
        behaviours: __assign(__assign({}, focusBehaviours$1), augment(detail.typeaheadBehaviours, behaviours)),
20663
        eventOrder: detail.eventOrder
20664
      };
20665
    };
20666
 
637 daniel-mar 20667
    var schema$g = constant$1([
597 daniel-mar 20668
      option('lazySink'),
637 daniel-mar 20669
      required$1('fetch'),
20670
      defaulted('minChars', 5),
20671
      defaulted('responseTime', 1000),
597 daniel-mar 20672
      onHandler('onOpen'),
637 daniel-mar 20673
      defaulted('getHotspot', Optional.some),
20674
      defaulted('getAnchorOverrides', constant$1({})),
20675
      defaulted('layouts', Optional.none()),
20676
      defaulted('eventOrder', {}),
597 daniel-mar 20677
      defaultedObjOf('model', {}, [
637 daniel-mar 20678
        defaulted('getDisplayText', function (itemData) {
597 daniel-mar 20679
          return itemData.meta !== undefined && itemData.meta.text !== undefined ? itemData.meta.text : itemData.value;
20680
        }),
637 daniel-mar 20681
        defaulted('selectsOver', true),
20682
        defaulted('populateFromBrowse', true)
597 daniel-mar 20683
      ]),
20684
      onHandler('onSetValue'),
20685
      onKeyboardHandler('onExecute'),
20686
      onHandler('onItemExecute'),
637 daniel-mar 20687
      defaulted('inputClasses', []),
20688
      defaulted('inputAttributes', {}),
20689
      defaulted('inputStyles', {}),
20690
      defaulted('matchWidth', true),
20691
      defaulted('useMinWidth', false),
20692
      defaulted('dismissOnBlur', true),
20693
      markers$1(['openClass']),
597 daniel-mar 20694
      option('initialData'),
637 daniel-mar 20695
      field('typeaheadBehaviours', [
597 daniel-mar 20696
        Focusing,
20697
        Representing,
20698
        Streaming,
20699
        Keying,
20700
        Toggling,
20701
        Coupling
20702
      ]),
637 daniel-mar 20703
      customField('previewing', function () {
597 daniel-mar 20704
        return Cell(true);
20705
      })
637 daniel-mar 20706
    ].concat(schema$k()).concat(sandboxFields()));
20707
    var parts$b = constant$1([external$1({
597 daniel-mar 20708
        schema: [tieredMenuMarkers()],
20709
        name: 'menu',
20710
        overrides: function (detail) {
20711
          return {
20712
            fakeFocus: true,
20713
            onHighlight: function (menu, item) {
20714
              if (!detail.previewing.get()) {
20715
                menu.getSystem().getByUid(detail.uid).each(function (input) {
20716
                  if (detail.model.populateFromBrowse) {
20717
                    setValueFromItem(detail.model, input, item);
20718
                  }
20719
                });
20720
              } else {
20721
                menu.getSystem().getByUid(detail.uid).each(function (input) {
20722
                  attemptSelectOver(detail.model, input, item).fold(function () {
20723
                    return Highlighting.dehighlight(menu, item);
20724
                  }, function (fn) {
20725
                    return fn();
20726
                  });
20727
                });
20728
              }
20729
              detail.previewing.set(false);
20730
            },
20731
            onExecute: function (menu, item) {
20732
              return menu.getSystem().getByUid(detail.uid).toOptional().map(function (typeahead) {
20733
                emitWith(typeahead, itemExecute(), { item: item });
20734
                return true;
20735
              });
20736
            },
20737
            onHover: function (menu, item) {
20738
              detail.previewing.set(false);
20739
              menu.getSystem().getByUid(detail.uid).each(function (input) {
20740
                if (detail.model.populateFromBrowse) {
20741
                  setValueFromItem(detail.model, input, item);
20742
                }
20743
              });
20744
            }
20745
          };
20746
        }
20747
      })]);
20748
 
637 daniel-mar 20749
    var Typeahead = composite({
597 daniel-mar 20750
      name: 'Typeahead',
637 daniel-mar 20751
      configFields: schema$g(),
20752
      partFields: parts$b(),
20753
      factory: make$3
597 daniel-mar 20754
    });
20755
 
637 daniel-mar 20756
    var wrap = function (delegate) {
597 daniel-mar 20757
      var toCached = function () {
637 daniel-mar 20758
        return wrap(delegate.toCached());
597 daniel-mar 20759
      };
20760
      var bindFuture = function (f) {
637 daniel-mar 20761
        return wrap(delegate.bind(function (resA) {
597 daniel-mar 20762
          return resA.fold(function (err) {
20763
            return Future.pure(Result.error(err));
20764
          }, function (a) {
20765
            return f(a);
20766
          });
20767
        }));
20768
      };
20769
      var bindResult = function (f) {
637 daniel-mar 20770
        return wrap(delegate.map(function (resA) {
597 daniel-mar 20771
          return resA.bind(f);
20772
        }));
20773
      };
20774
      var mapResult = function (f) {
637 daniel-mar 20775
        return wrap(delegate.map(function (resA) {
597 daniel-mar 20776
          return resA.map(f);
20777
        }));
20778
      };
20779
      var mapError = function (f) {
637 daniel-mar 20780
        return wrap(delegate.map(function (resA) {
597 daniel-mar 20781
          return resA.mapError(f);
20782
        }));
20783
      };
20784
      var foldResult = function (whenError, whenValue) {
20785
        return delegate.map(function (res) {
20786
          return res.fold(whenError, whenValue);
20787
        });
20788
      };
20789
      var withTimeout = function (timeout, errorThunk) {
637 daniel-mar 20790
        return wrap(Future.nu(function (callback) {
597 daniel-mar 20791
          var timedOut = false;
20792
          var timer = setTimeout(function () {
20793
            timedOut = true;
20794
            callback(Result.error(errorThunk()));
20795
          }, timeout);
20796
          delegate.get(function (result) {
20797
            if (!timedOut) {
20798
              clearTimeout(timer);
20799
              callback(result);
20800
            }
20801
          });
20802
        }));
20803
      };
20804
      return __assign(__assign({}, delegate), {
20805
        toCached: toCached,
20806
        bindFuture: bindFuture,
20807
        bindResult: bindResult,
20808
        mapResult: mapResult,
20809
        mapError: mapError,
20810
        foldResult: foldResult,
20811
        withTimeout: withTimeout
20812
      });
20813
    };
637 daniel-mar 20814
    var nu$1 = function (worker) {
20815
      return wrap(Future.nu(worker));
597 daniel-mar 20816
    };
637 daniel-mar 20817
    var value = function (value) {
20818
      return wrap(Future.pure(Result.value(value)));
597 daniel-mar 20819
    };
637 daniel-mar 20820
    var error = function (error) {
20821
      return wrap(Future.pure(Result.error(error)));
597 daniel-mar 20822
    };
637 daniel-mar 20823
    var fromResult = function (result) {
20824
      return wrap(Future.pure(result));
597 daniel-mar 20825
    };
20826
    var fromFuture = function (future) {
637 daniel-mar 20827
      return wrap(future.map(Result.value));
597 daniel-mar 20828
    };
20829
    var fromPromise = function (promise) {
637 daniel-mar 20830
      return nu$1(function (completer) {
597 daniel-mar 20831
        promise.then(function (value) {
20832
          completer(Result.value(value));
20833
        }, function (error) {
20834
          completer(Result.error(error));
20835
        });
20836
      });
20837
    };
20838
    var FutureResult = {
637 daniel-mar 20839
      nu: nu$1,
20840
      wrap: wrap,
20841
      pure: value,
20842
      value: value,
20843
      error: error,
20844
      fromResult: fromResult,
597 daniel-mar 20845
      fromFuture: fromFuture,
20846
      fromPromise: fromPromise
20847
    };
20848
 
637 daniel-mar 20849
    var separator$1 = { type: 'separator' };
597 daniel-mar 20850
    var toMenuItem = function (target) {
20851
      return {
20852
        type: 'menuitem',
20853
        value: target.url,
20854
        text: target.title,
20855
        meta: { attach: target.attach },
20856
        onAction: noop
20857
      };
20858
    };
20859
    var staticMenuItem = function (title, url) {
20860
      return {
20861
        type: 'menuitem',
20862
        value: url,
20863
        text: title,
20864
        meta: { attach: undefined },
20865
        onAction: noop
20866
      };
20867
    };
20868
    var toMenuItems = function (targets) {
637 daniel-mar 20869
      return map$2(targets, toMenuItem);
597 daniel-mar 20870
    };
20871
    var filterLinkTargets = function (type, targets) {
637 daniel-mar 20872
      return filter$2(targets, function (target) {
597 daniel-mar 20873
        return target.type === type;
20874
      });
20875
    };
20876
    var filteredTargets = function (type, targets) {
20877
      return toMenuItems(filterLinkTargets(type, targets));
20878
    };
20879
    var headerTargets = function (linkInfo) {
20880
      return filteredTargets('header', linkInfo.targets);
20881
    };
20882
    var anchorTargets = function (linkInfo) {
20883
      return filteredTargets('anchor', linkInfo.targets);
20884
    };
20885
    var anchorTargetTop = function (linkInfo) {
20886
      return Optional.from(linkInfo.anchorTop).map(function (url) {
20887
        return staticMenuItem('<top>', url);
20888
      }).toArray();
20889
    };
20890
    var anchorTargetBottom = function (linkInfo) {
20891
      return Optional.from(linkInfo.anchorBottom).map(function (url) {
20892
        return staticMenuItem('<bottom>', url);
20893
      }).toArray();
20894
    };
20895
    var historyTargets = function (history) {
637 daniel-mar 20896
      return map$2(history, function (url) {
597 daniel-mar 20897
        return staticMenuItem(url, url);
20898
      });
20899
    };
20900
    var joinMenuLists = function (items) {
20901
      return foldl(items, function (a, b) {
20902
        var bothEmpty = a.length === 0 || b.length === 0;
637 daniel-mar 20903
        return bothEmpty ? a.concat(b) : a.concat(separator$1, b);
597 daniel-mar 20904
      }, []);
20905
    };
20906
    var filterByQuery = function (term, menuItems) {
20907
      var lowerCaseTerm = term.toLowerCase();
637 daniel-mar 20908
      return filter$2(menuItems, function (item) {
597 daniel-mar 20909
        var text = item.meta !== undefined && item.meta.text !== undefined ? item.meta.text : item.text;
20910
        return contains$1(text.toLowerCase(), lowerCaseTerm) || contains$1(item.value.toLowerCase(), lowerCaseTerm);
20911
      });
20912
    };
20913
 
20914
    var getItems = function (fileType, input, urlBackstage) {
20915
      var urlInputValue = Representing.getValue(input);
20916
      var term = urlInputValue.meta.text !== undefined ? urlInputValue.meta.text : urlInputValue.value;
20917
      var info = urlBackstage.getLinkInformation();
20918
      return info.fold(function () {
20919
        return [];
20920
      }, function (linkInfo) {
20921
        var history = filterByQuery(term, historyTargets(urlBackstage.getHistory(fileType)));
20922
        return fileType === 'file' ? joinMenuLists([
20923
          history,
20924
          filterByQuery(term, headerTargets(linkInfo)),
20925
          filterByQuery(term, flatten([
20926
            anchorTargetTop(linkInfo),
20927
            anchorTargets(linkInfo),
20928
            anchorTargetBottom(linkInfo)
20929
          ]))
20930
        ]) : history;
20931
      });
20932
    };
637 daniel-mar 20933
    var errorId = generate$6('aria-invalid');
597 daniel-mar 20934
    var renderUrlInput = function (spec, backstage, urlBackstage) {
20935
      var _a;
20936
      var providersBackstage = backstage.shared.providers;
20937
      var updateHistory = function (component) {
20938
        var urlEntry = Representing.getValue(component);
20939
        urlBackstage.addToHistory(urlEntry.value, spec.filetype);
20940
      };
20941
      var pField = FormField.parts.field({
20942
        factory: Typeahead,
20943
        dismissOnBlur: true,
20944
        inputClasses: ['tox-textfield'],
20945
        sandboxClasses: ['tox-dialog__popups'],
20946
        inputAttributes: {
20947
          'aria-errormessage': errorId,
20948
          'type': 'url'
20949
        },
20950
        minChars: 0,
20951
        responseTime: 0,
20952
        fetch: function (input) {
20953
          var items = getItems(spec.filetype, input, urlBackstage);
637 daniel-mar 20954
          var tdata = build(items, ItemResponse$1.BUBBLE_TO_SANDBOX, backstage, false);
597 daniel-mar 20955
          return Future.pure(tdata);
20956
        },
20957
        getHotspot: function (comp) {
20958
          return memUrlBox.getOpt(comp);
20959
        },
20960
        onSetValue: function (comp, _newValue) {
20961
          if (comp.hasConfigured(Invalidating)) {
20962
            Invalidating.run(comp).get(noop);
20963
          }
20964
        },
20965
        typeaheadBehaviours: derive$1(flatten([
20966
          urlBackstage.getValidationHandler().map(function (handler) {
20967
            return Invalidating.config({
20968
              getRoot: function (comp) {
20969
                return parent(comp.element);
20970
              },
20971
              invalidClass: 'tox-control-wrap--status-invalid',
20972
              notify: {
20973
                onInvalid: function (comp, err) {
20974
                  memInvalidIcon.getOpt(comp).each(function (invalidComp) {
679 daniel-mar 20975
                    set$8(invalidComp.element, 'title', providersBackstage.translate(err));
597 daniel-mar 20976
                  });
20977
                }
20978
              },
20979
              validator: {
20980
                validate: function (input) {
20981
                  var urlEntry = Representing.getValue(input);
20982
                  return FutureResult.nu(function (completer) {
20983
                    handler({
20984
                      type: spec.filetype,
20985
                      url: urlEntry.value
20986
                    }, function (validation) {
20987
                      if (validation.status === 'invalid') {
20988
                        var err = Result.error(validation.message);
20989
                        completer(err);
20990
                      } else {
20991
                        var val = Result.value(validation.message);
20992
                        completer(val);
20993
                      }
20994
                    });
20995
                  });
20996
                },
20997
                validateOnLoad: false
20998
              }
20999
            });
21000
          }).toArray(),
21001
          [
21002
            Disabling.config({
21003
              disabled: function () {
21004
                return spec.disabled || providersBackstage.isDisabled();
21005
              }
21006
            }),
21007
            Tabstopping.config({}),
21008
            config('urlinput-events', flatten([
637 daniel-mar 21009
              spec.filetype === 'file' ? [run$1(input(), function (comp) {
597 daniel-mar 21010
                  emitWith(comp, formChangeEvent, { name: spec.name });
21011
                })] : [],
21012
              [
637 daniel-mar 21013
                run$1(change(), function (comp) {
597 daniel-mar 21014
                  emitWith(comp, formChangeEvent, { name: spec.name });
21015
                  updateHistory(comp);
21016
                }),
637 daniel-mar 21017
                run$1(postPaste(), function (comp) {
597 daniel-mar 21018
                  emitWith(comp, formChangeEvent, { name: spec.name });
21019
                  updateHistory(comp);
21020
                })
21021
              ]
21022
            ]))
21023
          ]
21024
        ])),
21025
        eventOrder: (_a = {}, _a[input()] = [
21026
          'streaming',
21027
          'urlinput-events',
21028
          'invalidating'
21029
        ], _a),
21030
        model: {
21031
          getDisplayText: function (itemData) {
21032
            return itemData.value;
21033
          },
21034
          selectsOver: false,
21035
          populateFromBrowse: false
21036
        },
21037
        markers: { openClass: 'tox-textfield--popup-open' },
21038
        lazySink: backstage.shared.getSink,
21039
        parts: { menu: part(false, 1, 'normal') },
21040
        onExecute: function (_menu, component, _entry) {
21041
          emitWith(component, formSubmitEvent, {});
21042
        },
21043
        onItemExecute: function (typeahead, _sandbox, _item, _value) {
21044
          updateHistory(typeahead);
21045
          emitWith(typeahead, formChangeEvent, { name: spec.name });
21046
        }
21047
      });
21048
      var pLabel = spec.label.map(function (label) {
637 daniel-mar 21049
        return renderLabel$2(label, providersBackstage);
597 daniel-mar 21050
      });
21051
      var makeIcon = function (name, errId, icon, label) {
21052
        if (icon === void 0) {
21053
          icon = name;
21054
        }
21055
        if (label === void 0) {
21056
          label = name;
21057
        }
637 daniel-mar 21058
        return render$3(icon, {
21059
          tag: 'div',
21060
          classes: [
21061
            'tox-icon',
21062
            'tox-control-wrap__status-icon-' + name
21063
          ],
21064
          attributes: __assign({
21065
            'title': providersBackstage.translate(label),
21066
            'aria-live': 'polite'
21067
          }, errId.fold(function () {
21068
            return {};
21069
          }, function (id) {
21070
            return { id: id };
21071
          }))
21072
        }, providersBackstage.icons);
597 daniel-mar 21073
      };
21074
      var memInvalidIcon = record(makeIcon('invalid', Optional.some(errorId), 'warning'));
21075
      var memStatus = record({
21076
        dom: {
21077
          tag: 'div',
21078
          classes: ['tox-control-wrap__status-icon-wrap']
21079
        },
21080
        components: [memInvalidIcon.asSpec()]
21081
      });
21082
      var optUrlPicker = urlBackstage.getUrlPicker(spec.filetype);
637 daniel-mar 21083
      var browseUrlEvent = generate$6('browser.url.event');
597 daniel-mar 21084
      var memUrlBox = record({
21085
        dom: {
21086
          tag: 'div',
21087
          classes: ['tox-control-wrap']
21088
        },
21089
        components: [
21090
          pField,
21091
          memStatus.asSpec()
21092
        ],
21093
        behaviours: derive$1([Disabling.config({
21094
            disabled: function () {
21095
              return spec.disabled || providersBackstage.isDisabled();
21096
            }
21097
          })])
21098
      });
21099
      var memUrlPickerButton = record(renderButton({
21100
        name: spec.name,
21101
        icon: Optional.some('browse'),
21102
        text: spec.label.getOr(''),
21103
        disabled: spec.disabled,
21104
        primary: false,
21105
        borderless: true
21106
      }, function (component) {
21107
        return emit(component, browseUrlEvent);
21108
      }, providersBackstage, [], ['tox-browse-url']));
21109
      var controlHWrapper = function () {
21110
        return {
21111
          dom: {
21112
            tag: 'div',
21113
            classes: ['tox-form__controls-h-stack']
21114
          },
21115
          components: flatten([
21116
            [memUrlBox.asSpec()],
21117
            optUrlPicker.map(function () {
21118
              return memUrlPickerButton.asSpec();
21119
            }).toArray()
21120
          ])
21121
        };
21122
      };
21123
      var openUrlPicker = function (comp) {
21124
        Composing.getCurrent(comp).each(function (field) {
21125
          var componentData = Representing.getValue(field);
21126
          var urlData = __assign({ fieldname: spec.name }, componentData);
21127
          optUrlPicker.each(function (picker) {
21128
            picker(urlData).get(function (chosenData) {
21129
              Representing.setValue(field, chosenData);
21130
              emitWith(comp, formChangeEvent, { name: spec.name });
21131
            });
21132
          });
21133
        });
21134
      };
21135
      return FormField.sketch({
21136
        dom: renderFormFieldDom(),
21137
        components: pLabel.toArray().concat([controlHWrapper()]),
21138
        fieldBehaviours: derive$1([
21139
          Disabling.config({
21140
            disabled: function () {
21141
              return spec.disabled || providersBackstage.isDisabled();
21142
            },
21143
            onDisabled: function (comp) {
21144
              FormField.getField(comp).each(Disabling.disable);
21145
              memUrlPickerButton.getOpt(comp).each(Disabling.disable);
21146
            },
21147
            onEnabled: function (comp) {
21148
              FormField.getField(comp).each(Disabling.enable);
21149
              memUrlPickerButton.getOpt(comp).each(Disabling.enable);
21150
            }
21151
          }),
21152
          receivingConfig(),
637 daniel-mar 21153
          config('url-input-events', [run$1(browseUrlEvent, openUrlPicker)])
597 daniel-mar 21154
        ])
21155
      });
21156
    };
21157
 
21158
    var renderAlertBanner = function (spec, providersBackstage) {
21159
      return Container.sketch({
21160
        dom: {
21161
          tag: 'div',
21162
          attributes: { role: 'alert' },
21163
          classes: [
21164
            'tox-notification',
21165
            'tox-notification--in',
21166
            'tox-notification--' + spec.level
21167
          ]
21168
        },
21169
        components: [
21170
          {
21171
            dom: {
21172
              tag: 'div',
21173
              classes: ['tox-notification__icon']
21174
            },
21175
            components: [Button.sketch({
21176
                dom: {
21177
                  tag: 'button',
21178
                  classes: [
21179
                    'tox-button',
21180
                    'tox-button--naked',
21181
                    'tox-button--icon'
21182
                  ],
637 daniel-mar 21183
                  innerHtml: get$1(spec.icon, providersBackstage.icons),
597 daniel-mar 21184
                  attributes: { title: providersBackstage.translate(spec.iconTooltip) }
21185
                },
21186
                action: function (comp) {
21187
                  emitWith(comp, formActionEvent, {
21188
                    name: 'alert-banner',
21189
                    value: spec.url
21190
                  });
637 daniel-mar 21191
                },
21192
                buttonBehaviours: derive$1([addFocusableBehaviour()])
597 daniel-mar 21193
              })]
21194
          },
21195
          {
21196
            dom: {
21197
              tag: 'div',
21198
              classes: ['tox-notification__body'],
21199
              innerHtml: providersBackstage.translate(spec.text)
21200
            }
21201
          }
21202
        ]
21203
      });
21204
    };
21205
 
21206
    var renderCheckbox = function (spec, providerBackstage) {
21207
      var repBehaviour = Representing.config({
21208
        store: {
21209
          mode: 'manual',
21210
          getValue: function (comp) {
21211
            var el = comp.element.dom;
21212
            return el.checked;
21213
          },
21214
          setValue: function (comp, value) {
21215
            var el = comp.element.dom;
21216
            el.checked = value;
21217
          }
21218
        }
21219
      });
21220
      var toggleCheckboxHandler = function (comp) {
21221
        comp.element.dom.click();
21222
        return Optional.some(true);
21223
      };
21224
      var pField = FormField.parts.field({
637 daniel-mar 21225
        factory: { sketch: identity$1 },
597 daniel-mar 21226
        dom: {
21227
          tag: 'input',
21228
          classes: ['tox-checkbox__input'],
21229
          attributes: { type: 'checkbox' }
21230
        },
21231
        behaviours: derive$1([
21232
          ComposingConfigs.self(),
21233
          Disabling.config({
21234
            disabled: function () {
21235
              return spec.disabled || providerBackstage.isDisabled();
21236
            }
21237
          }),
21238
          Tabstopping.config({}),
21239
          Focusing.config({}),
21240
          repBehaviour,
21241
          Keying.config({
21242
            mode: 'special',
21243
            onEnter: toggleCheckboxHandler,
21244
            onSpace: toggleCheckboxHandler,
21245
            stopSpaceKeyup: true
21246
          }),
637 daniel-mar 21247
          config('checkbox-events', [run$1(change(), function (component, _) {
597 daniel-mar 21248
              emitWith(component, formChangeEvent, { name: spec.name });
21249
            })])
21250
        ])
21251
      });
21252
      var pLabel = FormField.parts.label({
21253
        dom: {
21254
          tag: 'span',
21255
          classes: ['tox-checkbox__label'],
21256
          innerHtml: providerBackstage.translate(spec.label)
21257
        },
21258
        behaviours: derive$1([Unselecting.config({})])
21259
      });
21260
      var makeIcon = function (className) {
21261
        var iconName = className === 'checked' ? 'selected' : 'unselected';
637 daniel-mar 21262
        return render$3(iconName, {
21263
          tag: 'span',
21264
          classes: [
21265
            'tox-icon',
21266
            'tox-checkbox-icon__' + className
21267
          ]
21268
        }, providerBackstage.icons);
597 daniel-mar 21269
      };
21270
      var memIcons = record({
21271
        dom: {
21272
          tag: 'div',
21273
          classes: ['tox-checkbox__icons']
21274
        },
21275
        components: [
21276
          makeIcon('checked'),
21277
          makeIcon('unchecked')
21278
        ]
21279
      });
21280
      return FormField.sketch({
21281
        dom: {
21282
          tag: 'label',
21283
          classes: ['tox-checkbox']
21284
        },
21285
        components: [
21286
          pField,
21287
          memIcons.asSpec(),
21288
          pLabel
21289
        ],
21290
        fieldBehaviours: derive$1([
21291
          Disabling.config({
21292
            disabled: function () {
21293
              return spec.disabled || providerBackstage.isDisabled();
21294
            },
21295
            disableClass: 'tox-checkbox--disabled',
21296
            onDisabled: function (comp) {
21297
              FormField.getField(comp).each(Disabling.disable);
21298
            },
21299
            onEnabled: function (comp) {
21300
              FormField.getField(comp).each(Disabling.enable);
21301
            }
21302
          }),
21303
          receivingConfig()
21304
        ])
21305
      });
21306
    };
21307
 
21308
    var renderHtmlPanel = function (spec) {
21309
      if (spec.presets === 'presentation') {
21310
        return Container.sketch({
21311
          dom: {
21312
            tag: 'div',
21313
            classes: ['tox-form__group'],
21314
            innerHtml: spec.html
21315
          }
21316
        });
21317
      } else {
21318
        return Container.sketch({
21319
          dom: {
21320
            tag: 'div',
21321
            classes: ['tox-form__group'],
21322
            innerHtml: spec.html,
21323
            attributes: { role: 'document' }
21324
          },
21325
          containerBehaviours: derive$1([
21326
            Tabstopping.config({}),
21327
            Focusing.config({})
21328
          ])
21329
        });
21330
      }
21331
    };
21332
 
637 daniel-mar 21333
    var make$2 = function (render) {
597 daniel-mar 21334
      return function (parts, spec, backstage) {
637 daniel-mar 21335
        return get$e(spec, 'name').fold(function () {
597 daniel-mar 21336
          return render(spec, backstage);
21337
        }, function (fieldName) {
21338
          return parts.field(fieldName, render(spec, backstage));
21339
        });
21340
      };
21341
    };
21342
    var makeIframe = function (render) {
21343
      return function (parts, spec, backstage) {
21344
        var iframeSpec = deepMerge(spec, { source: 'dynamic' });
637 daniel-mar 21345
        return make$2(render)(parts, iframeSpec, backstage);
597 daniel-mar 21346
      };
21347
    };
21348
    var factories = {
637 daniel-mar 21349
      bar: make$2(function (spec, backstage) {
597 daniel-mar 21350
        return renderBar(spec, backstage.shared);
21351
      }),
637 daniel-mar 21352
      collection: make$2(function (spec, backstage) {
597 daniel-mar 21353
        return renderCollection(spec, backstage.shared.providers);
21354
      }),
637 daniel-mar 21355
      alertbanner: make$2(function (spec, backstage) {
597 daniel-mar 21356
        return renderAlertBanner(spec, backstage.shared.providers);
21357
      }),
637 daniel-mar 21358
      input: make$2(function (spec, backstage) {
597 daniel-mar 21359
        return renderInput(spec, backstage.shared.providers);
21360
      }),
637 daniel-mar 21361
      textarea: make$2(function (spec, backstage) {
597 daniel-mar 21362
        return renderTextarea(spec, backstage.shared.providers);
21363
      }),
637 daniel-mar 21364
      label: make$2(function (spec, backstage) {
21365
        return renderLabel(spec, backstage.shared);
597 daniel-mar 21366
      }),
21367
      iframe: makeIframe(function (spec, backstage) {
21368
        return renderIFrame(spec, backstage.shared.providers);
21369
      }),
637 daniel-mar 21370
      button: make$2(function (spec, backstage) {
597 daniel-mar 21371
        return renderDialogButton(spec, backstage.shared.providers);
21372
      }),
637 daniel-mar 21373
      checkbox: make$2(function (spec, backstage) {
597 daniel-mar 21374
        return renderCheckbox(spec, backstage.shared.providers);
21375
      }),
637 daniel-mar 21376
      colorinput: make$2(function (spec, backstage) {
597 daniel-mar 21377
        return renderColorInput(spec, backstage.shared, backstage.colorinput);
21378
      }),
637 daniel-mar 21379
      colorpicker: make$2(renderColorPicker),
21380
      dropzone: make$2(function (spec, backstage) {
597 daniel-mar 21381
        return renderDropZone(spec, backstage.shared.providers);
21382
      }),
637 daniel-mar 21383
      grid: make$2(function (spec, backstage) {
597 daniel-mar 21384
        return renderGrid(spec, backstage.shared);
21385
      }),
637 daniel-mar 21386
      listbox: make$2(function (spec, backstage) {
597 daniel-mar 21387
        return renderListBox(spec, backstage);
21388
      }),
637 daniel-mar 21389
      selectbox: make$2(function (spec, backstage) {
597 daniel-mar 21390
        return renderSelectBox(spec, backstage.shared.providers);
21391
      }),
637 daniel-mar 21392
      sizeinput: make$2(function (spec, backstage) {
597 daniel-mar 21393
        return renderSizeInput(spec, backstage.shared.providers);
21394
      }),
637 daniel-mar 21395
      urlinput: make$2(function (spec, backstage) {
597 daniel-mar 21396
        return renderUrlInput(spec, backstage, backstage.urlinput);
21397
      }),
637 daniel-mar 21398
      customeditor: make$2(renderCustomEditor),
21399
      htmlpanel: make$2(renderHtmlPanel),
21400
      imagetools: make$2(function (spec, backstage) {
597 daniel-mar 21401
        return renderImageTools(spec, backstage.shared.providers);
21402
      }),
637 daniel-mar 21403
      table: make$2(function (spec, backstage) {
597 daniel-mar 21404
        return renderTable(spec, backstage.shared.providers);
21405
      }),
637 daniel-mar 21406
      panel: make$2(function (spec, backstage) {
597 daniel-mar 21407
        return renderPanel(spec, backstage);
21408
      })
21409
    };
21410
    var noFormParts = {
21411
      field: function (_name, spec) {
21412
        return spec;
21413
      }
21414
    };
21415
    var interpretInForm = function (parts, spec, oldBackstage) {
21416
      var newBackstage = deepMerge(oldBackstage, {
21417
        shared: {
21418
          interpreter: function (childSpec) {
21419
            return interpretParts(parts, childSpec, newBackstage);
21420
          }
21421
        }
21422
      });
21423
      return interpretParts(parts, spec, newBackstage);
21424
    };
21425
    var interpretParts = function (parts, spec, backstage) {
637 daniel-mar 21426
      return get$e(factories, spec.type).fold(function () {
597 daniel-mar 21427
        console.error('Unknown factory type "' + spec.type + '", defaulting to container: ', spec);
21428
        return spec;
21429
      }, function (factory) {
21430
        return factory(parts, spec, backstage);
21431
      });
21432
    };
21433
    var interpretWithoutForm = function (spec, backstage) {
21434
      var parts = noFormParts;
21435
      return interpretParts(parts, spec, backstage);
21436
    };
21437
 
637 daniel-mar 21438
    var bubbleAlignments$2 = {
597 daniel-mar 21439
      valignCentre: [],
21440
      alignCentre: [],
21441
      alignLeft: [],
21442
      alignRight: [],
21443
      right: [],
21444
      left: [],
21445
      bottom: [],
21446
      top: []
21447
    };
21448
    var getInlineDialogAnchor = function (contentAreaElement, lazyAnchorbar, lazyUseEditableAreaAnchor) {
637 daniel-mar 21449
      var bubbleSize = 12;
21450
      var overrides = { maxHeightFunction: expandable$1() };
597 daniel-mar 21451
      var editableAreaAnchor = function () {
21452
        return {
637 daniel-mar 21453
          type: 'node',
597 daniel-mar 21454
          root: getContentContainer(contentAreaElement()),
21455
          node: Optional.from(contentAreaElement()),
637 daniel-mar 21456
          bubble: nu$5(bubbleSize, bubbleSize, bubbleAlignments$2),
597 daniel-mar 21457
          layouts: {
21458
            onRtl: function () {
637 daniel-mar 21459
              return [northeast];
597 daniel-mar 21460
            },
21461
            onLtr: function () {
637 daniel-mar 21462
              return [northwest];
597 daniel-mar 21463
            }
21464
          },
21465
          overrides: overrides
21466
        };
21467
      };
21468
      var standardAnchor = function () {
21469
        return {
637 daniel-mar 21470
          type: 'hotspot',
597 daniel-mar 21471
          hotspot: lazyAnchorbar(),
637 daniel-mar 21472
          bubble: nu$5(-bubbleSize, bubbleSize, bubbleAlignments$2),
597 daniel-mar 21473
          layouts: {
21474
            onRtl: function () {
637 daniel-mar 21475
              return [southeast$2];
597 daniel-mar 21476
            },
21477
            onLtr: function () {
637 daniel-mar 21478
              return [southwest$2];
597 daniel-mar 21479
            }
21480
          },
21481
          overrides: overrides
21482
        };
21483
      };
21484
      return function () {
21485
        return lazyUseEditableAreaAnchor() ? editableAreaAnchor() : standardAnchor();
21486
      };
21487
    };
21488
    var getBannerAnchor = function (contentAreaElement, lazyAnchorbar, lazyUseEditableAreaAnchor) {
21489
      var editableAreaAnchor = function () {
21490
        return {
637 daniel-mar 21491
          type: 'node',
597 daniel-mar 21492
          root: getContentContainer(contentAreaElement()),
21493
          node: Optional.from(contentAreaElement()),
21494
          layouts: {
21495
            onRtl: function () {
637 daniel-mar 21496
              return [north];
597 daniel-mar 21497
            },
21498
            onLtr: function () {
637 daniel-mar 21499
              return [north];
597 daniel-mar 21500
            }
21501
          }
21502
        };
21503
      };
21504
      var standardAnchor = function () {
21505
        return {
637 daniel-mar 21506
          type: 'hotspot',
597 daniel-mar 21507
          hotspot: lazyAnchorbar(),
21508
          layouts: {
21509
            onRtl: function () {
637 daniel-mar 21510
              return [south$2];
597 daniel-mar 21511
            },
21512
            onLtr: function () {
637 daniel-mar 21513
              return [south$2];
597 daniel-mar 21514
            }
21515
          }
21516
        };
21517
      };
21518
      return function () {
21519
        return lazyUseEditableAreaAnchor() ? editableAreaAnchor() : standardAnchor();
21520
      };
21521
    };
21522
    var getCursorAnchor = function (editor, bodyElement) {
21523
      return function () {
21524
        return {
637 daniel-mar 21525
          type: 'selection',
597 daniel-mar 21526
          root: bodyElement(),
21527
          getSelection: function () {
21528
            var rng = editor.selection.getRng();
21529
            return Optional.some(SimSelection.range(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset));
21530
          }
21531
        };
21532
      };
21533
    };
637 daniel-mar 21534
    var getNodeAnchor$1 = function (bodyElement) {
597 daniel-mar 21535
      return function (element) {
21536
        return {
637 daniel-mar 21537
          type: 'node',
597 daniel-mar 21538
          root: bodyElement(),
21539
          node: element
21540
        };
21541
      };
21542
    };
21543
    var getAnchors = function (editor, lazyAnchorbar, isToolbarTop) {
21544
      var useFixedToolbarContainer = useFixedContainer(editor);
21545
      var bodyElement = function () {
21546
        return SugarElement.fromDom(editor.getBody());
21547
      };
21548
      var contentAreaElement = function () {
21549
        return SugarElement.fromDom(editor.getContentAreaContainer());
21550
      };
21551
      var lazyUseEditableAreaAnchor = function () {
21552
        return useFixedToolbarContainer || !isToolbarTop();
21553
      };
21554
      return {
21555
        inlineDialog: getInlineDialogAnchor(contentAreaElement, lazyAnchorbar, lazyUseEditableAreaAnchor),
21556
        banner: getBannerAnchor(contentAreaElement, lazyAnchorbar, lazyUseEditableAreaAnchor),
21557
        cursor: getCursorAnchor(editor, bodyElement),
637 daniel-mar 21558
        node: getNodeAnchor$1(bodyElement)
597 daniel-mar 21559
      };
21560
    };
21561
 
21562
    var colorPicker = function (editor) {
21563
      return function (callback, value) {
21564
        var dialog = colorPickerDialog(editor);
21565
        dialog(callback, value);
21566
      };
21567
    };
637 daniel-mar 21568
    var hasCustomColors = function (editor) {
597 daniel-mar 21569
      return function () {
637 daniel-mar 21570
        return hasCustomColors$1(editor);
597 daniel-mar 21571
      };
21572
    };
637 daniel-mar 21573
    var getColors = function (editor) {
597 daniel-mar 21574
      return function () {
637 daniel-mar 21575
        return getColors$2(editor);
597 daniel-mar 21576
      };
21577
    };
637 daniel-mar 21578
    var getColorCols = function (editor) {
597 daniel-mar 21579
      return function () {
21580
        return getColorCols$1(editor);
21581
      };
21582
    };
21583
    var ColorInputBackstage = function (editor) {
21584
      return {
21585
        colorPicker: colorPicker(editor),
637 daniel-mar 21586
        hasCustomColors: hasCustomColors(editor),
21587
        getColors: getColors(editor),
21588
        getColorCols: getColorCols(editor)
597 daniel-mar 21589
      };
21590
    };
21591
 
637 daniel-mar 21592
    var isDraggableModal = function (editor) {
597 daniel-mar 21593
      return function () {
637 daniel-mar 21594
        return isDraggableModal$1(editor);
597 daniel-mar 21595
      };
21596
    };
21597
    var DialogBackstage = function (editor) {
637 daniel-mar 21598
      return { isDraggableModal: isDraggableModal(editor) };
597 daniel-mar 21599
    };
21600
 
21601
    var HeaderBackstage = function (editor) {
21602
      var mode = Cell(isToolbarLocationBottom(editor) ? 'bottom' : 'top');
21603
      return {
21604
        isPositionedAtTop: function () {
21605
          return mode.get() === 'top';
21606
        },
21607
        getDockingMode: mode.get,
21608
        setDockingMode: mode.set
21609
      };
21610
    };
21611
 
21612
    var defaultStyleFormats = [
21613
      {
21614
        title: 'Headings',
21615
        items: [
21616
          {
21617
            title: 'Heading 1',
21618
            format: 'h1'
21619
          },
21620
          {
21621
            title: 'Heading 2',
21622
            format: 'h2'
21623
          },
21624
          {
21625
            title: 'Heading 3',
21626
            format: 'h3'
21627
          },
21628
          {
21629
            title: 'Heading 4',
21630
            format: 'h4'
21631
          },
21632
          {
21633
            title: 'Heading 5',
21634
            format: 'h5'
21635
          },
21636
          {
21637
            title: 'Heading 6',
21638
            format: 'h6'
21639
          }
21640
        ]
21641
      },
21642
      {
21643
        title: 'Inline',
21644
        items: [
21645
          {
21646
            title: 'Bold',
21647
            format: 'bold'
21648
          },
21649
          {
21650
            title: 'Italic',
21651
            format: 'italic'
21652
          },
21653
          {
21654
            title: 'Underline',
21655
            format: 'underline'
21656
          },
21657
          {
21658
            title: 'Strikethrough',
21659
            format: 'strikethrough'
21660
          },
21661
          {
21662
            title: 'Superscript',
21663
            format: 'superscript'
21664
          },
21665
          {
21666
            title: 'Subscript',
21667
            format: 'subscript'
21668
          },
21669
          {
21670
            title: 'Code',
21671
            format: 'code'
21672
          }
21673
        ]
21674
      },
21675
      {
21676
        title: 'Blocks',
21677
        items: [
21678
          {
21679
            title: 'Paragraph',
21680
            format: 'p'
21681
          },
21682
          {
21683
            title: 'Blockquote',
21684
            format: 'blockquote'
21685
          },
21686
          {
21687
            title: 'Div',
21688
            format: 'div'
21689
          },
21690
          {
21691
            title: 'Pre',
21692
            format: 'pre'
21693
          }
21694
        ]
21695
      },
21696
      {
21697
        title: 'Align',
21698
        items: [
21699
          {
21700
            title: 'Left',
21701
            format: 'alignleft'
21702
          },
21703
          {
21704
            title: 'Center',
21705
            format: 'aligncenter'
21706
          },
21707
          {
21708
            title: 'Right',
21709
            format: 'alignright'
21710
          },
21711
          {
21712
            title: 'Justify',
21713
            format: 'alignjustify'
21714
          }
21715
        ]
21716
      }
21717
    ];
21718
    var isNestedFormat = function (format) {
637 daniel-mar 21719
      return has$2(format, 'items');
597 daniel-mar 21720
    };
21721
    var isBlockFormat = function (format) {
637 daniel-mar 21722
      return has$2(format, 'block');
597 daniel-mar 21723
    };
21724
    var isInlineFormat = function (format) {
637 daniel-mar 21725
      return has$2(format, 'inline');
597 daniel-mar 21726
    };
21727
    var isSelectorFormat = function (format) {
637 daniel-mar 21728
      return has$2(format, 'selector');
597 daniel-mar 21729
    };
21730
    var mapFormats = function (userFormats) {
21731
      return foldl(userFormats, function (acc, fmt) {
21732
        if (isNestedFormat(fmt)) {
21733
          var result = mapFormats(fmt.items);
21734
          return {
21735
            customFormats: acc.customFormats.concat(result.customFormats),
21736
            formats: acc.formats.concat([{
21737
                title: fmt.title,
21738
                items: result.formats
21739
              }])
21740
          };
21741
        } else if (isInlineFormat(fmt) || isBlockFormat(fmt) || isSelectorFormat(fmt)) {
21742
          var formatName = isString(fmt.name) ? fmt.name : fmt.title.toLowerCase();
21743
          var formatNameWithPrefix = 'custom-' + formatName;
21744
          return {
21745
            customFormats: acc.customFormats.concat([{
21746
                name: formatNameWithPrefix,
21747
                format: fmt
21748
              }]),
21749
            formats: acc.formats.concat([{
21750
                title: fmt.title,
21751
                format: formatNameWithPrefix,
21752
                icon: fmt.icon
21753
              }])
21754
          };
21755
        } else {
21756
          return __assign(__assign({}, acc), { formats: acc.formats.concat(fmt) });
21757
        }
21758
      }, {
21759
        customFormats: [],
21760
        formats: []
21761
      });
21762
    };
21763
    var registerCustomFormats = function (editor, userFormats) {
21764
      var result = mapFormats(userFormats);
21765
      var registerFormats = function (customFormats) {
637 daniel-mar 21766
        each$1(customFormats, function (fmt) {
597 daniel-mar 21767
          if (!editor.formatter.has(fmt.name)) {
21768
            editor.formatter.register(fmt.name, fmt.format);
21769
          }
21770
        });
21771
      };
21772
      if (editor.formatter) {
21773
        registerFormats(result.customFormats);
21774
      } else {
21775
        editor.on('init', function () {
21776
          registerFormats(result.customFormats);
21777
        });
21778
      }
21779
      return result.formats;
21780
    };
21781
    var getStyleFormats = function (editor) {
21782
      return getUserStyleFormats(editor).map(function (userFormats) {
21783
        var registeredUserFormats = registerCustomFormats(editor, userFormats);
21784
        return isMergeStyleFormats(editor) ? defaultStyleFormats.concat(registeredUserFormats) : registeredUserFormats;
21785
      }).getOr(defaultStyleFormats);
21786
    };
21787
 
21788
    var processBasic = function (item, isSelectedFor, getPreviewFor) {
21789
      var formatterSpec = {
21790
        type: 'formatter',
21791
        isSelected: isSelectedFor(item.format),
21792
        getStylePreview: getPreviewFor(item.format)
21793
      };
21794
      return deepMerge(item, formatterSpec);
21795
    };
637 daniel-mar 21796
    var register$8 = function (editor, formats, isSelectedFor, getPreviewFor) {
597 daniel-mar 21797
      var enrichSupported = function (item) {
21798
        return processBasic(item, isSelectedFor, getPreviewFor);
21799
      };
21800
      var enrichMenu = function (item) {
21801
        var submenuSpec = { type: 'submenu' };
21802
        return deepMerge(item, submenuSpec);
21803
      };
21804
      var enrichCustom = function (item) {
637 daniel-mar 21805
        var formatName = isString(item.name) ? item.name : generate$6(item.title);
597 daniel-mar 21806
        var formatNameWithPrefix = 'custom-' + formatName;
21807
        var customSpec = {
21808
          type: 'formatter',
21809
          format: formatNameWithPrefix,
21810
          isSelected: isSelectedFor(formatNameWithPrefix),
21811
          getStylePreview: getPreviewFor(formatNameWithPrefix)
21812
        };
21813
        var newItem = deepMerge(item, customSpec);
21814
        editor.formatter.register(formatName, newItem);
21815
        return newItem;
21816
      };
21817
      var doEnrich = function (items) {
637 daniel-mar 21818
        return map$2(items, function (item) {
597 daniel-mar 21819
          var keys$1 = keys(item);
21820
          if (hasNonNullableKey(item, 'items')) {
637 daniel-mar 21821
            var newItems = doEnrich(item.items);
21822
            return deepMerge(enrichMenu(item), { getStyleItems: constant$1(newItems) });
597 daniel-mar 21823
          } else if (hasNonNullableKey(item, 'format')) {
21824
            return enrichSupported(item);
637 daniel-mar 21825
          } else if (keys$1.length === 1 && contains$2(keys$1, 'title')) {
597 daniel-mar 21826
            return deepMerge(item, { type: 'separator' });
21827
          } else {
21828
            return enrichCustom(item);
21829
          }
21830
        });
21831
      };
21832
      return doEnrich(formats);
21833
    };
21834
 
637 daniel-mar 21835
    var init$8 = function (editor) {
597 daniel-mar 21836
      var isSelectedFor = function (format) {
21837
        return function () {
21838
          return editor.formatter.match(format);
21839
        };
21840
      };
21841
      var getPreviewFor = function (format) {
21842
        return function () {
21843
          var fmt = editor.formatter.get(format);
21844
          return fmt !== undefined ? Optional.some({
21845
            tag: fmt.length > 0 ? fmt[0].inline || fmt[0].block || 'div' : 'div',
21846
            styles: editor.dom.parseStyle(editor.formatter.getCssText(format))
21847
          }) : Optional.none();
21848
        };
21849
      };
21850
      var flatten = function (fmt) {
21851
        var subs = fmt.items;
637 daniel-mar 21852
        return subs !== undefined && subs.length > 0 ? bind$3(subs, flatten) : [fmt.format];
597 daniel-mar 21853
      };
21854
      var settingsFormats = Cell([]);
21855
      var settingsFlattenedFormats = Cell([]);
21856
      var eventsFormats = Cell([]);
21857
      var eventsFlattenedFormats = Cell([]);
21858
      var replaceSettings = Cell(false);
21859
      editor.on('PreInit', function (_e) {
21860
        var formats = getStyleFormats(editor);
637 daniel-mar 21861
        var enriched = register$8(editor, formats, isSelectedFor, getPreviewFor);
597 daniel-mar 21862
        settingsFormats.set(enriched);
637 daniel-mar 21863
        settingsFlattenedFormats.set(bind$3(enriched, flatten));
597 daniel-mar 21864
      });
21865
      editor.on('addStyleModifications', function (e) {
637 daniel-mar 21866
        var modifications = register$8(editor, e.items, isSelectedFor, getPreviewFor);
597 daniel-mar 21867
        eventsFormats.set(modifications);
21868
        replaceSettings.set(e.replace);
637 daniel-mar 21869
        eventsFlattenedFormats.set(bind$3(modifications, flatten));
597 daniel-mar 21870
      });
21871
      var getData = function () {
21872
        var fromSettings = replaceSettings.get() ? [] : settingsFormats.get();
21873
        var fromEvents = eventsFormats.get();
21874
        return fromSettings.concat(fromEvents);
21875
      };
21876
      var getFlattenedKeys = function () {
21877
        var fromSettings = replaceSettings.get() ? [] : settingsFlattenedFormats.get();
21878
        var fromEvents = eventsFlattenedFormats.get();
21879
        return fromSettings.concat(fromEvents);
21880
      };
21881
      return {
21882
        getData: getData,
21883
        getFlattenedKeys: getFlattenedKeys
21884
      };
21885
    };
21886
 
637 daniel-mar 21887
    var isElement = function (node) {
597 daniel-mar 21888
      return isNonNullable(node) && node.nodeType === 1;
21889
    };
679 daniel-mar 21890
    var trim = global$5.trim;
597 daniel-mar 21891
    var hasContentEditableState = function (value) {
21892
      return function (node) {
637 daniel-mar 21893
        if (isElement(node)) {
597 daniel-mar 21894
          if (node.contentEditable === value) {
21895
            return true;
21896
          }
21897
          if (node.getAttribute('data-mce-contenteditable') === value) {
21898
            return true;
21899
          }
21900
        }
21901
        return false;
21902
      };
21903
    };
21904
    var isContentEditableTrue = hasContentEditableState('true');
21905
    var isContentEditableFalse = hasContentEditableState('false');
637 daniel-mar 21906
    var create = function (type, title, url, level, attach) {
597 daniel-mar 21907
      return {
21908
        type: type,
21909
        title: title,
21910
        url: url,
21911
        level: level,
21912
        attach: attach
21913
      };
21914
    };
21915
    var isChildOfContentEditableTrue = function (node) {
21916
      while (node = node.parentNode) {
21917
        var value = node.contentEditable;
21918
        if (value && value !== 'inherit') {
21919
          return isContentEditableTrue(node);
21920
        }
21921
      }
21922
      return false;
21923
    };
21924
    var select = function (selector, root) {
637 daniel-mar 21925
      return map$2(descendants(SugarElement.fromDom(root), selector), function (element) {
597 daniel-mar 21926
        return element.dom;
21927
      });
21928
    };
21929
    var getElementText = function (elm) {
21930
      return elm.innerText || elm.textContent;
21931
    };
21932
    var getOrGenerateId = function (elm) {
637 daniel-mar 21933
      return elm.id ? elm.id : generate$6('h');
597 daniel-mar 21934
    };
21935
    var isAnchor = function (elm) {
21936
      return elm && elm.nodeName === 'A' && (elm.id || elm.name) !== undefined;
21937
    };
21938
    var isValidAnchor = function (elm) {
21939
      return isAnchor(elm) && isEditable(elm);
21940
    };
21941
    var isHeader = function (elm) {
21942
      return elm && /^(H[1-6])$/.test(elm.nodeName);
21943
    };
21944
    var isEditable = function (elm) {
21945
      return isChildOfContentEditableTrue(elm) && !isContentEditableFalse(elm);
21946
    };
21947
    var isValidHeader = function (elm) {
21948
      return isHeader(elm) && isEditable(elm);
21949
    };
21950
    var getLevel = function (elm) {
21951
      return isHeader(elm) ? parseInt(elm.nodeName.substr(1), 10) : 0;
21952
    };
21953
    var headerTarget = function (elm) {
21954
      var headerId = getOrGenerateId(elm);
21955
      var attach = function () {
21956
        elm.id = headerId;
21957
      };
637 daniel-mar 21958
      return create('header', getElementText(elm), '#' + headerId, getLevel(elm), attach);
597 daniel-mar 21959
    };
21960
    var anchorTarget = function (elm) {
21961
      var anchorId = elm.id || elm.name;
21962
      var anchorText = getElementText(elm);
637 daniel-mar 21963
      return create('anchor', anchorText ? anchorText : '#' + anchorId, '#' + anchorId, 0, noop);
597 daniel-mar 21964
    };
21965
    var getHeaderTargets = function (elms) {
637 daniel-mar 21966
      return map$2(filter$2(elms, isValidHeader), headerTarget);
597 daniel-mar 21967
    };
21968
    var getAnchorTargets = function (elms) {
637 daniel-mar 21969
      return map$2(filter$2(elms, isValidAnchor), anchorTarget);
597 daniel-mar 21970
    };
21971
    var getTargetElements = function (elm) {
21972
      var elms = select('h1,h2,h3,h4,h5,h6,a:not([href])', elm);
21973
      return elms;
21974
    };
21975
    var hasTitle = function (target) {
637 daniel-mar 21976
      return trim(target.title).length > 0;
597 daniel-mar 21977
    };
637 daniel-mar 21978
    var find = function (elm) {
597 daniel-mar 21979
      var elms = getTargetElements(elm);
637 daniel-mar 21980
      return filter$2(getHeaderTargets(elms).concat(getAnchorTargets(elms)), hasTitle);
597 daniel-mar 21981
    };
637 daniel-mar 21982
    var LinkTargets = { find: find };
597 daniel-mar 21983
 
21984
    var STORAGE_KEY = 'tinymce-url-history';
21985
    var HISTORY_LENGTH = 5;
21986
    var isHttpUrl = function (url) {
21987
      return isString(url) && /^https?/.test(url);
21988
    };
21989
    var isArrayOfUrl = function (a) {
21990
      return isArray(a) && a.length <= HISTORY_LENGTH && forall(a, isHttpUrl);
21991
    };
21992
    var isRecordOfUrlArray = function (r) {
637 daniel-mar 21993
      return isObject(r) && find$4(r, function (value) {
597 daniel-mar 21994
        return !isArrayOfUrl(value);
21995
      }).isNone();
21996
    };
21997
    var getAllHistory = function () {
679 daniel-mar 21998
      var unparsedHistory = global$8.getItem(STORAGE_KEY);
597 daniel-mar 21999
      if (unparsedHistory === null) {
22000
        return {};
22001
      }
22002
      var history;
22003
      try {
22004
        history = JSON.parse(unparsedHistory);
22005
      } catch (e) {
22006
        if (e instanceof SyntaxError) {
22007
          console.log('Local storage ' + STORAGE_KEY + ' was not valid JSON', e);
22008
          return {};
22009
        }
22010
        throw e;
22011
      }
22012
      if (!isRecordOfUrlArray(history)) {
22013
        console.log('Local storage ' + STORAGE_KEY + ' was not valid format', history);
22014
        return {};
22015
      }
22016
      return history;
22017
    };
22018
    var setAllHistory = function (history) {
22019
      if (!isRecordOfUrlArray(history)) {
22020
        throw new Error('Bad format for history:\n' + JSON.stringify(history));
22021
      }
679 daniel-mar 22022
      global$8.setItem(STORAGE_KEY, JSON.stringify(history));
597 daniel-mar 22023
    };
22024
    var getHistory = function (fileType) {
22025
      var history = getAllHistory();
637 daniel-mar 22026
      return get$e(history, fileType).getOr([]);
597 daniel-mar 22027
    };
22028
    var addToHistory = function (url, fileType) {
22029
      if (!isHttpUrl(url)) {
22030
        return;
22031
      }
22032
      var history = getAllHistory();
637 daniel-mar 22033
      var items = get$e(history, fileType).getOr([]);
22034
      var itemsWithoutUrl = filter$2(items, function (item) {
597 daniel-mar 22035
        return item !== url;
22036
      });
22037
      history[fileType] = [url].concat(itemsWithoutUrl).slice(0, HISTORY_LENGTH);
22038
      setAllHistory(history);
22039
    };
22040
 
22041
    var isTruthy = function (value) {
22042
      return !!value;
22043
    };
22044
    var makeMap = function (value) {
679 daniel-mar 22045
      return map$1(global$5.makeMap(value, /[, ]/), isTruthy);
597 daniel-mar 22046
    };
22047
    var getPicker = function (editor) {
22048
      return Optional.from(getFilePickerCallback(editor)).filter(isFunction);
22049
    };
22050
    var getPickerTypes = function (editor) {
22051
      var optFileTypes = Optional.some(getFilePickerTypes(editor)).filter(isTruthy);
22052
      var optLegacyTypes = Optional.some(getFileBrowserCallbackTypes(editor)).filter(isTruthy);
22053
      var optTypes = optFileTypes.or(optLegacyTypes).map(makeMap);
22054
      return getPicker(editor).fold(never, function (_picker) {
22055
        return optTypes.fold(always, function (types) {
22056
          return keys(types).length > 0 ? types : false;
22057
        });
22058
      });
22059
    };
22060
    var getPickerSetting = function (editor, filetype) {
22061
      var pickerTypes = getPickerTypes(editor);
22062
      if (isBoolean(pickerTypes)) {
22063
        return pickerTypes ? getPicker(editor) : Optional.none();
22064
      } else {
22065
        return pickerTypes[filetype] ? getPicker(editor) : Optional.none();
22066
      }
22067
    };
22068
    var getUrlPicker = function (editor, filetype) {
22069
      return getPickerSetting(editor, filetype).map(function (picker) {
22070
        return function (entry) {
22071
          return Future.nu(function (completer) {
22072
            var handler = function (value, meta) {
22073
              if (!isString(value)) {
22074
                throw new Error('Expected value to be string');
22075
              }
22076
              if (meta !== undefined && !isObject(meta)) {
22077
                throw new Error('Expected meta to be a object');
22078
              }
22079
              var r = {
22080
                value: value,
22081
                meta: meta
22082
              };
22083
              completer(r);
22084
            };
22085
            var meta = __assign({
22086
              filetype: filetype,
22087
              fieldname: entry.fieldname
22088
            }, Optional.from(entry.meta).getOr({}));
22089
            picker.call(editor, handler, entry.value, meta);
22090
          });
22091
        };
22092
      });
22093
    };
22094
    var getTextSetting = function (value) {
22095
      return Optional.from(value).filter(isString).getOrUndefined();
22096
    };
22097
    var getLinkInformation = function (editor) {
22098
      if (noTypeaheadUrls(editor)) {
22099
        return Optional.none();
22100
      }
22101
      return Optional.some({
22102
        targets: LinkTargets.find(editor.getBody()),
22103
        anchorTop: getTextSetting(getAnchorTop(editor)),
22104
        anchorBottom: getTextSetting(getAnchorBottom(editor))
22105
      });
22106
    };
22107
    var getValidationHandler = function (editor) {
22108
      return Optional.from(getFilePickerValidatorHandler(editor));
22109
    };
22110
    var UrlInputBackstage = function (editor) {
22111
      return {
22112
        getHistory: getHistory,
22113
        addToHistory: addToHistory,
22114
        getLinkInformation: function () {
22115
          return getLinkInformation(editor);
22116
        },
22117
        getValidationHandler: function () {
22118
          return getValidationHandler(editor);
22119
        },
22120
        getUrlPicker: function (filetype) {
22121
          return getUrlPicker(editor, filetype);
22122
        }
22123
      };
22124
    };
22125
 
637 daniel-mar 22126
    var init$7 = function (sink, editor, lazyAnchorbar) {
597 daniel-mar 22127
      var contextMenuState = Cell(false);
22128
      var toolbar = HeaderBackstage(editor);
22129
      var backstage = {
22130
        shared: {
22131
          providers: {
22132
            icons: function () {
22133
              return editor.ui.registry.getAll().icons;
22134
            },
22135
            menuItems: function () {
22136
              return editor.ui.registry.getAll().menuItems;
22137
            },
679 daniel-mar 22138
            translate: global$e.translate,
597 daniel-mar 22139
            isDisabled: function () {
22140
              return editor.mode.isReadOnly() || editor.ui.isDisabled();
22141
            },
22142
            getSetting: editor.getParam.bind(editor)
22143
          },
22144
          interpreter: function (s) {
22145
            return interpretWithoutForm(s, backstage);
22146
          },
22147
          anchors: getAnchors(editor, lazyAnchorbar, toolbar.isPositionedAtTop),
22148
          header: toolbar,
22149
          getSink: function () {
22150
            return Result.value(sink);
22151
          }
22152
        },
22153
        urlinput: UrlInputBackstage(editor),
637 daniel-mar 22154
        styleselect: init$8(editor),
597 daniel-mar 22155
        colorinput: ColorInputBackstage(editor),
22156
        dialog: DialogBackstage(editor),
22157
        isContextMenuOpen: function () {
22158
          return contextMenuState.get();
22159
        },
22160
        setContextMenuState: function (state) {
22161
          return contextMenuState.set(state);
22162
        }
22163
      };
22164
      return backstage;
22165
    };
22166
 
637 daniel-mar 22167
    var setup$b = function (editor, mothership, uiMothership) {
22168
      var broadcastEvent = function (name, evt) {
22169
        each$1([
22170
          mothership,
22171
          uiMothership
22172
        ], function (ship) {
22173
          ship.broadcastEvent(name, evt);
22174
        });
22175
      };
22176
      var broadcastOn = function (channel, message) {
22177
        each$1([
22178
          mothership,
22179
          uiMothership
22180
        ], function (ship) {
22181
          ship.broadcastOn([channel], message);
22182
        });
22183
      };
22184
      var fireDismissPopups = function (evt) {
22185
        return broadcastOn(dismissPopups(), { target: evt.target });
22186
      };
679 daniel-mar 22187
      var doc = getDocument();
22188
      var onTouchstart = bind(doc, 'touchstart', fireDismissPopups);
22189
      var onTouchmove = bind(doc, 'touchmove', function (evt) {
637 daniel-mar 22190
        return broadcastEvent(documentTouchmove(), evt);
22191
      });
679 daniel-mar 22192
      var onTouchend = bind(doc, 'touchend', function (evt) {
637 daniel-mar 22193
        return broadcastEvent(documentTouchend(), evt);
22194
      });
679 daniel-mar 22195
      var onMousedown = bind(doc, 'mousedown', fireDismissPopups);
22196
      var onMouseup = bind(doc, 'mouseup', function (evt) {
637 daniel-mar 22197
        if (evt.raw.button === 0) {
22198
          broadcastOn(mouseReleased(), { target: evt.target });
22199
        }
22200
      });
22201
      var onContentClick = function (raw) {
22202
        return broadcastOn(dismissPopups(), { target: SugarElement.fromDom(raw.target) });
22203
      };
22204
      var onContentMouseup = function (raw) {
22205
        if (raw.button === 0) {
22206
          broadcastOn(mouseReleased(), { target: SugarElement.fromDom(raw.target) });
22207
        }
22208
      };
22209
      var onContentMousedown = function () {
22210
        each$1(editor.editorManager.get(), function (loopEditor) {
22211
          if (editor !== loopEditor) {
22212
            loopEditor.fire('DismissPopups', { relatedTarget: editor });
22213
          }
22214
        });
22215
      };
22216
      var onWindowScroll = function (evt) {
22217
        return broadcastEvent(windowScroll(), fromRawEvent(evt));
22218
      };
22219
      var onWindowResize = function (evt) {
22220
        broadcastOn(repositionPopups(), {});
22221
        broadcastEvent(windowResize(), fromRawEvent(evt));
22222
      };
22223
      var onEditorResize = function () {
22224
        return broadcastOn(repositionPopups(), {});
22225
      };
22226
      var onEditorProgress = function (evt) {
22227
        if (evt.state) {
22228
          broadcastOn(dismissPopups(), { target: SugarElement.fromDom(editor.getContainer()) });
22229
        }
22230
      };
22231
      var onDismissPopups = function (event) {
22232
        broadcastOn(dismissPopups(), { target: SugarElement.fromDom(event.relatedTarget.getContainer()) });
22233
      };
22234
      editor.on('PostRender', function () {
22235
        editor.on('click', onContentClick);
22236
        editor.on('tap', onContentClick);
22237
        editor.on('mouseup', onContentMouseup);
22238
        editor.on('mousedown', onContentMousedown);
22239
        editor.on('ScrollWindow', onWindowScroll);
22240
        editor.on('ResizeWindow', onWindowResize);
22241
        editor.on('ResizeEditor', onEditorResize);
22242
        editor.on('AfterProgressState', onEditorProgress);
22243
        editor.on('DismissPopups', onDismissPopups);
22244
      });
22245
      editor.on('remove', function () {
22246
        editor.off('click', onContentClick);
22247
        editor.off('tap', onContentClick);
22248
        editor.off('mouseup', onContentMouseup);
22249
        editor.off('mousedown', onContentMousedown);
22250
        editor.off('ScrollWindow', onWindowScroll);
22251
        editor.off('ResizeWindow', onWindowResize);
22252
        editor.off('ResizeEditor', onEditorResize);
22253
        editor.off('AfterProgressState', onEditorProgress);
22254
        editor.off('DismissPopups', onDismissPopups);
22255
        onMousedown.unbind();
22256
        onTouchstart.unbind();
22257
        onTouchmove.unbind();
22258
        onTouchend.unbind();
22259
        onMouseup.unbind();
22260
      });
22261
      editor.on('detach', function () {
22262
        detachSystem(mothership);
22263
        detachSystem(uiMothership);
22264
        mothership.destroy();
22265
        uiMothership.destroy();
22266
      });
22267
    };
22268
 
22269
    var parts$a = AlloyParts;
22270
    var partType = PartType;
22271
 
22272
    var schema$f = constant$1([
22273
      defaulted('shell', false),
22274
      required$1('makeItem'),
22275
      defaulted('setupItem', noop),
22276
      SketchBehaviours.field('listBehaviours', [Replacing])
22277
    ]);
22278
    var customListDetail = function () {
22279
      return { behaviours: derive$1([Replacing.config({})]) };
22280
    };
22281
    var itemsPart = optional({
22282
      name: 'items',
22283
      overrides: customListDetail
597 daniel-mar 22284
    });
637 daniel-mar 22285
    var parts$9 = constant$1([itemsPart]);
22286
    var name = constant$1('CustomList');
597 daniel-mar 22287
 
637 daniel-mar 22288
    var factory$d = function (detail, components, _spec, _external) {
22289
      var setItems = function (list, items) {
22290
        getListContainer(list).fold(function () {
22291
          console.error('Custom List was defined to not be a shell, but no item container was specified in components');
22292
          throw new Error('Custom List was defined to not be a shell, but no item container was specified in components');
22293
        }, function (container) {
22294
          var itemComps = Replacing.contents(container);
22295
          var numListsRequired = items.length;
22296
          var numListsToAdd = numListsRequired - itemComps.length;
22297
          var itemsToAdd = numListsToAdd > 0 ? range$2(numListsToAdd, function () {
22298
            return detail.makeItem();
22299
          }) : [];
22300
          var itemsToRemove = itemComps.slice(numListsRequired);
22301
          each$1(itemsToRemove, function (item) {
22302
            return Replacing.remove(container, item);
22303
          });
22304
          each$1(itemsToAdd, function (item) {
22305
            return Replacing.append(container, item);
22306
          });
22307
          var builtLists = Replacing.contents(container);
22308
          each$1(builtLists, function (item, i) {
22309
            detail.setupItem(list, item, items[i], i);
22310
          });
22311
        });
22312
      };
22313
      var extra = detail.shell ? {
22314
        behaviours: [Replacing.config({})],
22315
        components: []
22316
      } : {
22317
        behaviours: [],
22318
        components: components
22319
      };
22320
      var getListContainer = function (component) {
22321
        return detail.shell ? Optional.some(component) : getPart(component, detail, 'items');
22322
      };
22323
      return {
22324
        uid: detail.uid,
22325
        dom: detail.dom,
22326
        components: extra.components,
22327
        behaviours: augment(detail.listBehaviours, extra.behaviours),
22328
        apis: { setItems: setItems }
22329
      };
22330
    };
22331
    var CustomList = composite({
22332
      name: name(),
22333
      configFields: schema$f(),
22334
      partFields: parts$9(),
22335
      factory: factory$d,
22336
      apis: {
22337
        setItems: function (apis, list, items) {
22338
          apis.setItems(list, items);
22339
        }
22340
      }
22341
    });
597 daniel-mar 22342
 
637 daniel-mar 22343
    var schema$e = constant$1([
22344
      required$1('dom'),
22345
      defaulted('shell', true),
22346
      field('toolbarBehaviours', [Replacing])
597 daniel-mar 22347
    ]);
22348
    var enhanceGroups = function () {
22349
      return { behaviours: derive$1([Replacing.config({})]) };
22350
    };
637 daniel-mar 22351
    var parts$8 = constant$1([optional({
597 daniel-mar 22352
        name: 'groups',
22353
        overrides: enhanceGroups
22354
      })]);
22355
 
637 daniel-mar 22356
    var factory$c = function (detail, components, _spec, _externals) {
597 daniel-mar 22357
      var setGroups = function (toolbar, groups) {
22358
        getGroupContainer(toolbar).fold(function () {
22359
          console.error('Toolbar was defined to not be a shell, but no groups container was specified in components');
22360
          throw new Error('Toolbar was defined to not be a shell, but no groups container was specified in components');
22361
        }, function (container) {
22362
          Replacing.set(container, groups);
22363
        });
22364
      };
22365
      var getGroupContainer = function (component) {
22366
        return detail.shell ? Optional.some(component) : getPart(component, detail, 'groups');
22367
      };
22368
      var extra = detail.shell ? {
22369
        behaviours: [Replacing.config({})],
22370
        components: []
22371
      } : {
22372
        behaviours: [],
22373
        components: components
22374
      };
22375
      return {
22376
        uid: detail.uid,
22377
        dom: detail.dom,
22378
        components: extra.components,
22379
        behaviours: augment(detail.toolbarBehaviours, extra.behaviours),
22380
        apis: { setGroups: setGroups },
22381
        domModification: { attributes: { role: 'group' } }
22382
      };
22383
    };
637 daniel-mar 22384
    var Toolbar = composite({
597 daniel-mar 22385
      name: 'Toolbar',
637 daniel-mar 22386
      configFields: schema$e(),
22387
      partFields: parts$8(),
22388
      factory: factory$c,
597 daniel-mar 22389
      apis: {
22390
        setGroups: function (apis, toolbar, groups) {
22391
          apis.setGroups(toolbar, groups);
22392
        }
22393
      }
22394
    });
22395
 
637 daniel-mar 22396
    var setup$a = noop;
22397
    var isDocked$2 = never;
22398
    var getBehaviours$1 = constant$1([]);
22399
 
22400
    var StaticHeader = /*#__PURE__*/Object.freeze({
22401
        __proto__: null,
22402
        setup: setup$a,
22403
        isDocked: isDocked$2,
22404
        getBehaviours: getBehaviours$1
22405
    });
22406
 
22407
    var getOffsetParent = function (element) {
679 daniel-mar 22408
      var isFixed = is$1(getRaw(element, 'position'), 'fixed');
637 daniel-mar 22409
      var offsetParent$1 = isFixed ? Optional.none() : offsetParent(element);
22410
      return offsetParent$1.orThunk(function () {
22411
        var marker = SugarElement.fromTag('span');
22412
        return parent(element).bind(function (parent) {
22413
          append$2(parent, marker);
22414
          var offsetParent$1 = offsetParent(marker);
679 daniel-mar 22415
          remove$5(marker);
637 daniel-mar 22416
          return offsetParent$1;
22417
        });
22418
      });
22419
    };
22420
    var getOrigin = function (element) {
22421
      return getOffsetParent(element).map(absolute$3).getOrThunk(function () {
22422
        return SugarPosition(0, 0);
22423
      });
22424
    };
22425
 
22426
    var morphAdt = Adt.generate([
22427
      { static: [] },
22428
      { absolute: ['positionCss'] },
22429
      { fixed: ['positionCss'] }
22430
    ]);
22431
    var appear = function (component, contextualInfo) {
22432
      var elem = component.element;
22433
      add$2(elem, contextualInfo.transitionClass);
679 daniel-mar 22434
      remove$2(elem, contextualInfo.fadeOutClass);
637 daniel-mar 22435
      add$2(elem, contextualInfo.fadeInClass);
22436
      contextualInfo.onShow(component);
22437
    };
22438
    var disappear = function (component, contextualInfo) {
22439
      var elem = component.element;
22440
      add$2(elem, contextualInfo.transitionClass);
679 daniel-mar 22441
      remove$2(elem, contextualInfo.fadeInClass);
637 daniel-mar 22442
      add$2(elem, contextualInfo.fadeOutClass);
22443
      contextualInfo.onHide(component);
22444
    };
22445
    var isPartiallyVisible = function (box, viewport) {
22446
      return box.y < viewport.bottom && box.bottom > viewport.y;
22447
    };
22448
    var isTopCompletelyVisible = function (box, viewport) {
22449
      return box.y >= viewport.y;
22450
    };
22451
    var isBottomCompletelyVisible = function (box, viewport) {
22452
      return box.bottom <= viewport.bottom;
22453
    };
22454
    var isVisibleForModes = function (modes, box, viewport) {
22455
      return forall(modes, function (mode) {
22456
        switch (mode) {
22457
        case 'bottom':
22458
          return isBottomCompletelyVisible(box, viewport);
22459
        case 'top':
22460
          return isTopCompletelyVisible(box, viewport);
22461
        }
22462
      });
22463
    };
22464
    var getPrior = function (elem, state) {
22465
      return state.getInitialPos().map(function (pos) {
679 daniel-mar 22466
        return bounds(pos.bounds.x, pos.bounds.y, get$a(elem), get$b(elem));
637 daniel-mar 22467
      });
22468
    };
22469
    var storePrior = function (elem, box, state) {
22470
      state.setInitialPos({
22471
        style: getAllRaw(elem),
679 daniel-mar 22472
        position: get$c(elem, 'position') || 'static',
637 daniel-mar 22473
        bounds: box
22474
      });
22475
    };
22476
    var revertToOriginal = function (elem, box, state) {
22477
      return state.getInitialPos().bind(function (position) {
22478
        state.clearInitialPos();
22479
        switch (position.position) {
22480
        case 'static':
22481
          return Optional.some(morphAdt.static());
22482
        case 'absolute':
22483
          var offsetBox_1 = getOffsetParent(elem).map(box$1).getOrThunk(function () {
22484
            return box$1(body());
22485
          });
22486
          return Optional.some(morphAdt.absolute(NuPositionCss('absolute', get$e(position.style, 'left').map(function (_left) {
22487
            return box.x - offsetBox_1.x;
22488
          }), get$e(position.style, 'top').map(function (_top) {
22489
            return box.y - offsetBox_1.y;
22490
          }), get$e(position.style, 'right').map(function (_right) {
22491
            return offsetBox_1.right - box.right;
22492
          }), get$e(position.style, 'bottom').map(function (_bottom) {
22493
            return offsetBox_1.bottom - box.bottom;
22494
          }))));
22495
        default:
22496
          return Optional.none();
22497
        }
22498
      });
22499
    };
22500
    var morphToOriginal = function (elem, viewport, state) {
22501
      return getPrior(elem, state).filter(function (box) {
22502
        return isVisibleForModes(state.getModes(), box, viewport);
22503
      }).bind(function (box) {
22504
        return revertToOriginal(elem, box, state);
22505
      });
22506
    };
22507
    var morphToFixed = function (elem, viewport, state) {
22508
      var box = box$1(elem);
22509
      if (!isVisibleForModes(state.getModes(), box, viewport)) {
22510
        storePrior(elem, box, state);
22511
        var winBox = win();
22512
        var left = box.x - winBox.x;
22513
        var top_1 = viewport.y - winBox.y;
22514
        var bottom = winBox.bottom - viewport.bottom;
22515
        var isTop = box.y <= viewport.y;
22516
        return Optional.some(morphAdt.fixed(NuPositionCss('fixed', Optional.some(left), isTop ? Optional.some(top_1) : Optional.none(), Optional.none(), !isTop ? Optional.some(bottom) : Optional.none())));
22517
      } else {
22518
        return Optional.none();
22519
      }
22520
    };
22521
    var getMorph = function (component, viewport, state) {
22522
      var elem = component.element;
679 daniel-mar 22523
      var isDocked = is$1(getRaw(elem, 'position'), 'fixed');
637 daniel-mar 22524
      return isDocked ? morphToOriginal(elem, viewport, state) : morphToFixed(elem, viewport, state);
22525
    };
22526
    var getMorphToOriginal = function (component, state) {
22527
      var elem = component.element;
22528
      return getPrior(elem, state).bind(function (box) {
22529
        return revertToOriginal(elem, box, state);
22530
      });
22531
    };
22532
 
679 daniel-mar 22533
    var morphToStatic = function (component, config, state) {
22534
      state.setDocked(false);
637 daniel-mar 22535
      each$1([
22536
        'left',
22537
        'right',
22538
        'top',
22539
        'bottom',
22540
        'position'
22541
      ], function (prop) {
679 daniel-mar 22542
        return remove$6(component.element, prop);
637 daniel-mar 22543
      });
22544
      config.onUndocked(component);
22545
    };
679 daniel-mar 22546
    var morphToCoord = function (component, config, state, position) {
22547
      var isDocked = position.position === 'fixed';
22548
      state.setDocked(isDocked);
637 daniel-mar 22549
      applyPositionCss(component.element, position);
679 daniel-mar 22550
      var method = isDocked ? config.onDocked : config.onUndocked;
637 daniel-mar 22551
      method(component);
22552
    };
22553
    var updateVisibility = function (component, config, state, viewport, morphToDocked) {
22554
      if (morphToDocked === void 0) {
22555
        morphToDocked = false;
22556
      }
22557
      config.contextual.each(function (contextInfo) {
22558
        contextInfo.lazyContext(component).each(function (box) {
22559
          var isVisible = isPartiallyVisible(box, viewport);
22560
          if (isVisible !== state.isVisible()) {
22561
            state.setVisible(isVisible);
22562
            if (morphToDocked && !isVisible) {
22563
              add$1(component.element, [contextInfo.fadeOutClass]);
22564
              contextInfo.onHide(component);
22565
            } else {
22566
              var method = isVisible ? appear : disappear;
22567
              method(component, contextInfo);
22568
            }
22569
          }
22570
        });
22571
      });
22572
    };
22573
    var refreshInternal = function (component, config, state) {
22574
      var viewport = config.lazyViewport(component);
22575
      var isDocked = state.isDocked();
22576
      if (isDocked) {
22577
        updateVisibility(component, config, state, viewport);
22578
      }
22579
      getMorph(component, viewport, state).each(function (morph) {
22580
        morph.fold(function () {
679 daniel-mar 22581
          return morphToStatic(component, config, state);
637 daniel-mar 22582
        }, function (position) {
679 daniel-mar 22583
          return morphToCoord(component, config, state, position);
637 daniel-mar 22584
        }, function (position) {
22585
          updateVisibility(component, config, state, viewport, true);
679 daniel-mar 22586
          morphToCoord(component, config, state, position);
637 daniel-mar 22587
        });
22588
      });
22589
    };
22590
    var resetInternal = function (component, config, state) {
22591
      var elem = component.element;
22592
      state.setDocked(false);
22593
      getMorphToOriginal(component, state).each(function (morph) {
22594
        morph.fold(function () {
679 daniel-mar 22595
          return morphToStatic(component, config, state);
637 daniel-mar 22596
        }, function (position) {
679 daniel-mar 22597
          return morphToCoord(component, config, state, position);
637 daniel-mar 22598
        }, noop);
22599
      });
22600
      state.setVisible(true);
22601
      config.contextual.each(function (contextInfo) {
679 daniel-mar 22602
        remove$1(elem, [
637 daniel-mar 22603
          contextInfo.fadeInClass,
22604
          contextInfo.fadeOutClass,
22605
          contextInfo.transitionClass
22606
        ]);
22607
        contextInfo.onShow(component);
22608
      });
22609
      refresh$4(component, config, state);
22610
    };
22611
    var refresh$4 = function (component, config, state) {
22612
      if (component.getSystem().isConnected()) {
22613
        refreshInternal(component, config, state);
22614
      }
22615
    };
22616
    var reset = function (component, config, state) {
22617
      if (state.isDocked()) {
22618
        resetInternal(component, config, state);
22619
      }
22620
    };
22621
    var isDocked$1 = function (component, config, state) {
22622
      return state.isDocked();
22623
    };
22624
    var setModes = function (component, config, state, modes) {
22625
      return state.setModes(modes);
22626
    };
22627
    var getModes = function (component, config, state) {
22628
      return state.getModes();
22629
    };
22630
 
22631
    var DockingApis = /*#__PURE__*/Object.freeze({
22632
        __proto__: null,
22633
        refresh: refresh$4,
22634
        reset: reset,
22635
        isDocked: isDocked$1,
22636
        getModes: getModes,
22637
        setModes: setModes
22638
    });
22639
 
22640
    var events$5 = function (dockInfo, dockState) {
22641
      return derive$2([
22642
        runOnSource(transitionend(), function (component, simulatedEvent) {
22643
          dockInfo.contextual.each(function (contextInfo) {
22644
            if (has(component.element, contextInfo.transitionClass)) {
679 daniel-mar 22645
              remove$1(component.element, [
637 daniel-mar 22646
                contextInfo.transitionClass,
22647
                contextInfo.fadeInClass
22648
              ]);
22649
              var notify = dockState.isVisible() ? contextInfo.onShown : contextInfo.onHidden;
22650
              notify(component);
22651
            }
22652
            simulatedEvent.stop();
22653
          });
22654
        }),
22655
        run$1(windowScroll(), function (component, _) {
22656
          refresh$4(component, dockInfo, dockState);
22657
        }),
22658
        run$1(windowResize(), function (component, _) {
22659
          reset(component, dockInfo, dockState);
22660
        })
22661
      ]);
22662
    };
22663
 
22664
    var ActiveDocking = /*#__PURE__*/Object.freeze({
22665
        __proto__: null,
22666
        events: events$5
22667
    });
22668
 
22669
    var DockingSchema = [
22670
      optionObjOf('contextual', [
22671
        requiredString('fadeInClass'),
22672
        requiredString('fadeOutClass'),
22673
        requiredString('transitionClass'),
22674
        requiredFunction('lazyContext'),
22675
        onHandler('onShow'),
22676
        onHandler('onShown'),
22677
        onHandler('onHide'),
22678
        onHandler('onHidden')
22679
      ]),
22680
      defaultedFunction('lazyViewport', win),
22681
      defaultedArrayOf('modes', [
22682
        'top',
22683
        'bottom'
22684
      ], string),
22685
      onHandler('onDocked'),
22686
      onHandler('onUndocked')
22687
    ];
22688
 
22689
    var init$6 = function (spec) {
22690
      var docked = Cell(false);
22691
      var visible = Cell(true);
22692
      var initialBounds = value$1();
22693
      var modes = Cell(spec.modes);
22694
      var readState = function () {
22695
        return 'docked:  ' + docked.get() + ', visible: ' + visible.get() + ', modes: ' + modes.get().join(',');
22696
      };
22697
      return nu$8({
22698
        isDocked: docked.get,
22699
        setDocked: docked.set,
22700
        getInitialPos: initialBounds.get,
22701
        setInitialPos: initialBounds.set,
22702
        clearInitialPos: initialBounds.clear,
22703
        isVisible: visible.get,
22704
        setVisible: visible.set,
22705
        getModes: modes.get,
22706
        setModes: modes.set,
22707
        readState: readState
22708
      });
22709
    };
22710
 
22711
    var DockingState = /*#__PURE__*/Object.freeze({
22712
        __proto__: null,
22713
        init: init$6
22714
    });
22715
 
22716
    var Docking = create$7({
22717
      fields: DockingSchema,
22718
      name: 'docking',
22719
      active: ActiveDocking,
22720
      apis: DockingApis,
22721
      state: DockingState
22722
    });
22723
 
22724
    var toolbarHeightChange = constant$1(generate$6('toolbar-height-change'));
22725
 
22726
    var visibility = {
22727
      fadeInClass: 'tox-editor-dock-fadein',
22728
      fadeOutClass: 'tox-editor-dock-fadeout',
22729
      transitionClass: 'tox-editor-dock-transition'
22730
    };
22731
    var editorStickyOnClass = 'tox-tinymce--toolbar-sticky-on';
22732
    var editorStickyOffClass = 'tox-tinymce--toolbar-sticky-off';
22733
    var scrollFromBehindHeader = function (e, containerHeader) {
22734
      var doc = owner$4(containerHeader);
22735
      var viewHeight = doc.dom.defaultView.innerHeight;
679 daniel-mar 22736
      var scrollPos = get$9(doc);
637 daniel-mar 22737
      var markerElement = SugarElement.fromDom(e.elm);
22738
      var markerPos = absolute$2(markerElement);
679 daniel-mar 22739
      var markerHeight = get$b(markerElement);
637 daniel-mar 22740
      var markerTop = markerPos.y;
22741
      var markerBottom = markerTop + markerHeight;
22742
      var editorHeaderPos = absolute$3(containerHeader);
679 daniel-mar 22743
      var editorHeaderHeight = get$b(containerHeader);
637 daniel-mar 22744
      var editorHeaderTop = editorHeaderPos.top;
22745
      var editorHeaderBottom = editorHeaderTop + editorHeaderHeight;
22746
      var editorHeaderDockedAtTop = Math.abs(editorHeaderTop - scrollPos.top) < 2;
22747
      var editorHeaderDockedAtBottom = Math.abs(editorHeaderBottom - (scrollPos.top + viewHeight)) < 2;
22748
      if (editorHeaderDockedAtTop && markerTop < editorHeaderBottom) {
22749
        to(scrollPos.left, markerTop - editorHeaderHeight, doc);
22750
      } else if (editorHeaderDockedAtBottom && markerBottom > editorHeaderTop) {
22751
        var y = markerTop - viewHeight + markerHeight + editorHeaderHeight;
22752
        to(scrollPos.left, y, doc);
22753
      }
22754
    };
22755
    var isDockedMode = function (header, mode) {
22756
      return contains$2(Docking.getModes(header), mode);
22757
    };
22758
    var updateIframeContentFlow = function (header) {
22759
      var getOccupiedHeight = function (elm) {
679 daniel-mar 22760
        return getOuter$2(elm) + (parseInt(get$c(elm, 'margin-top'), 10) || 0) + (parseInt(get$c(elm, 'margin-bottom'), 10) || 0);
637 daniel-mar 22761
      };
22762
      var elm = header.element;
22763
      parent(elm).each(function (parentElem) {
22764
        var padding = 'padding-' + Docking.getModes(header)[0];
22765
        if (Docking.isDocked(header)) {
679 daniel-mar 22766
          var parentWidth = get$a(parentElem);
22767
          set$7(elm, 'width', parentWidth + 'px');
22768
          set$7(parentElem, padding, getOccupiedHeight(elm) + 'px');
637 daniel-mar 22769
        } else {
679 daniel-mar 22770
          remove$6(elm, 'width');
22771
          remove$6(parentElem, padding);
637 daniel-mar 22772
        }
22773
      });
22774
    };
22775
    var updateSinkVisibility = function (sinkElem, visible) {
22776
      if (visible) {
679 daniel-mar 22777
        remove$2(sinkElem, visibility.fadeOutClass);
637 daniel-mar 22778
        add$1(sinkElem, [
22779
          visibility.transitionClass,
22780
          visibility.fadeInClass
22781
        ]);
22782
      } else {
679 daniel-mar 22783
        remove$2(sinkElem, visibility.fadeInClass);
637 daniel-mar 22784
        add$1(sinkElem, [
22785
          visibility.fadeOutClass,
22786
          visibility.transitionClass
22787
        ]);
22788
      }
22789
    };
22790
    var updateEditorClasses = function (editor, docked) {
22791
      var editorContainer = SugarElement.fromDom(editor.getContainer());
22792
      if (docked) {
22793
        add$2(editorContainer, editorStickyOnClass);
679 daniel-mar 22794
        remove$2(editorContainer, editorStickyOffClass);
637 daniel-mar 22795
      } else {
22796
        add$2(editorContainer, editorStickyOffClass);
679 daniel-mar 22797
        remove$2(editorContainer, editorStickyOnClass);
637 daniel-mar 22798
      }
22799
    };
22800
    var restoreFocus = function (headerElem, focusedElem) {
22801
      var ownerDoc = owner$4(focusedElem);
22802
      active(ownerDoc).filter(function (activeElm) {
22803
        return !eq(focusedElem, activeElm);
22804
      }).filter(function (activeElm) {
22805
        return eq(activeElm, SugarElement.fromDom(ownerDoc.dom.body)) || contains(headerElem, activeElm);
22806
      }).each(function () {
22807
        return focus$3(focusedElem);
22808
      });
22809
    };
22810
    var findFocusedElem = function (rootElm, lazySink) {
22811
      return search(rootElm).orThunk(function () {
22812
        return lazySink().toOptional().bind(function (sink) {
22813
          return search(sink.element);
22814
        });
22815
      });
22816
    };
22817
    var setup$9 = function (editor, sharedBackstage, lazyHeader) {
22818
      if (!editor.inline) {
22819
        if (!sharedBackstage.header.isPositionedAtTop()) {
22820
          editor.on('ResizeEditor', function () {
22821
            lazyHeader().each(Docking.reset);
22822
          });
22823
        }
22824
        editor.on('ResizeWindow ResizeEditor', function () {
22825
          lazyHeader().each(updateIframeContentFlow);
22826
        });
22827
        editor.on('SkinLoaded', function () {
22828
          lazyHeader().each(function (comp) {
22829
            Docking.isDocked(comp) ? Docking.reset(comp) : Docking.refresh(comp);
22830
          });
22831
        });
22832
        editor.on('FullscreenStateChanged', function () {
22833
          lazyHeader().each(Docking.reset);
22834
        });
22835
      }
22836
      editor.on('AfterScrollIntoView', function (e) {
22837
        lazyHeader().each(function (header) {
22838
          Docking.refresh(header);
22839
          var headerElem = header.element;
22840
          if (isVisible(headerElem)) {
22841
            scrollFromBehindHeader(e, headerElem);
22842
          }
22843
        });
22844
      });
22845
      editor.on('PostRender', function () {
22846
        updateEditorClasses(editor, false);
22847
      });
22848
    };
22849
    var isDocked = function (lazyHeader) {
22850
      return lazyHeader().map(Docking.isDocked).getOr(false);
22851
    };
22852
    var getIframeBehaviours = function () {
22853
      var _a;
22854
      return [Receiving.config({ channels: (_a = {}, _a[toolbarHeightChange()] = { onReceive: updateIframeContentFlow }, _a) })];
22855
    };
22856
    var getBehaviours = function (editor, sharedBackstage) {
22857
      var focusedElm = value$1();
22858
      var lazySink = sharedBackstage.getSink;
22859
      var runOnSinkElement = function (f) {
22860
        lazySink().each(function (sink) {
22861
          return f(sink.element);
22862
        });
22863
      };
22864
      var onDockingSwitch = function (comp) {
22865
        if (!editor.inline) {
22866
          updateIframeContentFlow(comp);
22867
        }
22868
        updateEditorClasses(editor, Docking.isDocked(comp));
22869
        comp.getSystem().broadcastOn([repositionPopups()], {});
22870
        lazySink().each(function (sink) {
22871
          return sink.getSystem().broadcastOn([repositionPopups()], {});
22872
        });
22873
      };
22874
      var additionalBehaviours = editor.inline ? [] : getIframeBehaviours();
22875
      return __spreadArray([
22876
        Focusing.config({}),
22877
        Docking.config({
22878
          contextual: __assign({
22879
            lazyContext: function (comp) {
679 daniel-mar 22880
              var headerHeight = getOuter$2(comp.element);
637 daniel-mar 22881
              var container = editor.inline ? editor.getContentAreaContainer() : editor.getContainer();
22882
              var box = box$1(SugarElement.fromDom(container));
22883
              var boxHeight = box.height - headerHeight;
22884
              var topBound = box.y + (isDockedMode(comp, 'top') ? 0 : headerHeight);
22885
              return Optional.some(bounds(box.x, topBound, box.width, boxHeight));
22886
            },
22887
            onShow: function () {
22888
              runOnSinkElement(function (elem) {
22889
                return updateSinkVisibility(elem, true);
22890
              });
22891
            },
22892
            onShown: function (comp) {
22893
              runOnSinkElement(function (elem) {
679 daniel-mar 22894
                return remove$1(elem, [
637 daniel-mar 22895
                  visibility.transitionClass,
22896
                  visibility.fadeInClass
22897
                ]);
22898
              });
22899
              focusedElm.get().each(function (elem) {
22900
                restoreFocus(comp.element, elem);
22901
                focusedElm.clear();
22902
              });
22903
            },
22904
            onHide: function (comp) {
22905
              findFocusedElem(comp.element, lazySink).fold(focusedElm.clear, focusedElm.set);
22906
              runOnSinkElement(function (elem) {
22907
                return updateSinkVisibility(elem, false);
22908
              });
22909
            },
22910
            onHidden: function () {
22911
              runOnSinkElement(function (elem) {
679 daniel-mar 22912
                return remove$1(elem, [visibility.transitionClass]);
637 daniel-mar 22913
              });
22914
            }
22915
          }, visibility),
22916
          lazyViewport: function (comp) {
22917
            var win$1 = win();
22918
            var offset = getStickyToolbarOffset(editor);
22919
            var top = win$1.y + (isDockedMode(comp, 'top') ? offset : 0);
22920
            var height = win$1.height - (isDockedMode(comp, 'bottom') ? offset : 0);
22921
            return bounds(win$1.x, top, win$1.width, height);
22922
          },
22923
          modes: [sharedBackstage.header.getDockingMode()],
22924
          onDocked: onDockingSwitch,
22925
          onUndocked: onDockingSwitch
22926
        })
679 daniel-mar 22927
      ], additionalBehaviours, true);
637 daniel-mar 22928
    };
22929
 
22930
    var StickyHeader = /*#__PURE__*/Object.freeze({
22931
        __proto__: null,
22932
        setup: setup$9,
22933
        isDocked: isDocked,
22934
        getBehaviours: getBehaviours
22935
    });
22936
 
22937
    var renderHeader = function (spec) {
22938
      var editor = spec.editor;
22939
      var getBehaviours$2 = spec.sticky ? getBehaviours : getBehaviours$1;
22940
      return {
22941
        uid: spec.uid,
22942
        dom: spec.dom,
22943
        components: spec.components,
22944
        behaviours: derive$1(getBehaviours$2(editor, spec.sharedBackstage))
22945
      };
22946
    };
22947
 
22948
    var groupToolbarButtonSchema = objOf([
22949
      requiredString('type'),
22950
      requiredOf('items', oneOf([
22951
        arrOfObj([
22952
          requiredString('name'),
22953
          requiredArrayOf('items', string)
22954
        ]),
22955
        string
22956
      ]))
22957
    ].concat(baseToolbarButtonFields));
22958
    var createGroupToolbarButton = function (spec) {
22959
      return asRaw('GroupToolbarButton', groupToolbarButtonSchema, spec);
22960
    };
22961
 
22962
    var baseMenuButtonFields = [
22963
      optionString('text'),
22964
      optionString('tooltip'),
22965
      optionString('icon'),
22966
      requiredFunction('fetch'),
22967
      defaultedFunction('onSetup', function () {
22968
        return noop;
22969
      })
22970
    ];
22971
 
679 daniel-mar 22972
    var MenuButtonSchema = objOf(__spreadArray([requiredString('type')], baseMenuButtonFields, true));
637 daniel-mar 22973
    var createMenuButton = function (spec) {
22974
      return asRaw('menubutton', MenuButtonSchema, spec);
22975
    };
22976
 
22977
    var splitButtonSchema = objOf([
22978
      requiredString('type'),
22979
      optionString('tooltip'),
22980
      optionString('icon'),
22981
      optionString('text'),
22982
      optionFunction('select'),
22983
      requiredFunction('fetch'),
22984
      defaultedFunction('onSetup', function () {
22985
        return noop;
22986
      }),
22987
      defaultedStringEnum('presets', 'normal', [
22988
        'normal',
22989
        'color',
22990
        'listpreview'
22991
      ]),
22992
      defaulted('columns', 1),
22993
      requiredFunction('onAction'),
22994
      requiredFunction('onItemAction')
22995
    ]);
22996
    var createSplitButton = function (spec) {
22997
      return asRaw('SplitButton', splitButtonSchema, spec);
22998
    };
22999
 
23000
    var factory$b = function (detail, spec) {
23001
      var setMenus = function (comp, menus) {
23002
        var newMenus = map$2(menus, function (m) {
23003
          var buttonSpec = {
23004
            type: 'menubutton',
23005
            text: m.text,
23006
            fetch: function (callback) {
23007
              callback(m.getItems());
23008
            }
23009
          };
23010
          var internal = createMenuButton(buttonSpec).mapError(function (errInfo) {
23011
            return formatError(errInfo);
23012
          }).getOrDie();
23013
          return renderMenuButton(internal, 'tox-mbtn', spec.backstage, Optional.some('menuitem'));
23014
        });
23015
        Replacing.set(comp, newMenus);
23016
      };
23017
      var apis = {
23018
        focus: Keying.focusIn,
23019
        setMenus: setMenus
23020
      };
23021
      return {
23022
        uid: detail.uid,
23023
        dom: detail.dom,
23024
        components: [],
23025
        behaviours: derive$1([
23026
          Replacing.config({}),
23027
          config('menubar-events', [
23028
            runOnAttached(function (component) {
23029
              detail.onSetup(component);
23030
            }),
23031
            run$1(mouseover(), function (comp, se) {
23032
              descendant(comp.element, '.' + 'tox-mbtn--active').each(function (activeButton) {
23033
                closest$1(se.event.target, '.' + 'tox-mbtn').each(function (hoveredButton) {
23034
                  if (!eq(activeButton, hoveredButton)) {
23035
                    comp.getSystem().getByDom(activeButton).each(function (activeComp) {
23036
                      comp.getSystem().getByDom(hoveredButton).each(function (hoveredComp) {
23037
                        Dropdown.expand(hoveredComp);
23038
                        Dropdown.close(activeComp);
23039
                        Focusing.focus(hoveredComp);
23040
                      });
23041
                    });
23042
                  }
23043
                });
23044
              });
23045
            }),
23046
            run$1(focusShifted(), function (comp, se) {
23047
              se.event.prevFocus.bind(function (prev) {
23048
                return comp.getSystem().getByDom(prev).toOptional();
23049
              }).each(function (prev) {
23050
                se.event.newFocus.bind(function (nu) {
23051
                  return comp.getSystem().getByDom(nu).toOptional();
23052
                }).each(function (nu) {
23053
                  if (Dropdown.isOpen(prev)) {
23054
                    Dropdown.expand(nu);
23055
                    Dropdown.close(prev);
23056
                  }
23057
                });
23058
              });
23059
            })
23060
          ]),
23061
          Keying.config({
23062
            mode: 'flow',
23063
            selector: '.' + 'tox-mbtn',
23064
            onEscape: function (comp) {
23065
              detail.onEscape(comp);
23066
              return Optional.some(true);
23067
            }
23068
          }),
23069
          Tabstopping.config({})
23070
        ]),
23071
        apis: apis,
23072
        domModification: { attributes: { role: 'menubar' } }
23073
      };
23074
    };
23075
    var SilverMenubar = single({
23076
      factory: factory$b,
23077
      name: 'silver.Menubar',
23078
      configFields: [
23079
        required$1('dom'),
23080
        required$1('uid'),
23081
        required$1('onEscape'),
23082
        required$1('backstage'),
23083
        defaulted('onSetup', noop)
23084
      ],
23085
      apis: {
23086
        focus: function (apis, comp) {
23087
          apis.focus(comp);
23088
        },
23089
        setMenus: function (apis, comp, menus) {
23090
          apis.setMenus(comp, menus);
23091
        }
23092
      }
23093
    });
23094
 
23095
    var getAnimationRoot = function (component, slideConfig) {
23096
      return slideConfig.getAnimationRoot.fold(function () {
23097
        return component.element;
23098
      }, function (get) {
23099
        return get(component);
23100
      });
23101
    };
23102
 
23103
    var getDimensionProperty = function (slideConfig) {
23104
      return slideConfig.dimension.property;
23105
    };
23106
    var getDimension = function (slideConfig, elem) {
23107
      return slideConfig.dimension.getDimension(elem);
23108
    };
23109
    var disableTransitions = function (component, slideConfig) {
23110
      var root = getAnimationRoot(component, slideConfig);
679 daniel-mar 23111
      remove$1(root, [
637 daniel-mar 23112
        slideConfig.shrinkingClass,
23113
        slideConfig.growingClass
23114
      ]);
23115
    };
23116
    var setShrunk = function (component, slideConfig) {
679 daniel-mar 23117
      remove$2(component.element, slideConfig.openClass);
637 daniel-mar 23118
      add$2(component.element, slideConfig.closedClass);
679 daniel-mar 23119
      set$7(component.element, getDimensionProperty(slideConfig), '0px');
637 daniel-mar 23120
      reflow(component.element);
23121
    };
23122
    var setGrown = function (component, slideConfig) {
679 daniel-mar 23123
      remove$2(component.element, slideConfig.closedClass);
637 daniel-mar 23124
      add$2(component.element, slideConfig.openClass);
679 daniel-mar 23125
      remove$6(component.element, getDimensionProperty(slideConfig));
637 daniel-mar 23126
    };
23127
    var doImmediateShrink = function (component, slideConfig, slideState, _calculatedSize) {
23128
      slideState.setCollapsed();
679 daniel-mar 23129
      set$7(component.element, getDimensionProperty(slideConfig), getDimension(slideConfig, component.element));
637 daniel-mar 23130
      reflow(component.element);
23131
      disableTransitions(component, slideConfig);
23132
      setShrunk(component, slideConfig);
23133
      slideConfig.onStartShrink(component);
23134
      slideConfig.onShrunk(component);
23135
    };
23136
    var doStartShrink = function (component, slideConfig, slideState, calculatedSize) {
23137
      var size = calculatedSize.getOrThunk(function () {
23138
        return getDimension(slideConfig, component.element);
23139
      });
23140
      slideState.setCollapsed();
679 daniel-mar 23141
      set$7(component.element, getDimensionProperty(slideConfig), size);
637 daniel-mar 23142
      reflow(component.element);
23143
      var root = getAnimationRoot(component, slideConfig);
679 daniel-mar 23144
      remove$2(root, slideConfig.growingClass);
637 daniel-mar 23145
      add$2(root, slideConfig.shrinkingClass);
23146
      setShrunk(component, slideConfig);
23147
      slideConfig.onStartShrink(component);
23148
    };
23149
    var doStartSmartShrink = function (component, slideConfig, slideState) {
23150
      var size = getDimension(slideConfig, component.element);
23151
      var shrinker = size === '0px' ? doImmediateShrink : doStartShrink;
23152
      shrinker(component, slideConfig, slideState, Optional.some(size));
23153
    };
23154
    var doStartGrow = function (component, slideConfig, slideState) {
23155
      var root = getAnimationRoot(component, slideConfig);
23156
      var wasShrinking = has(root, slideConfig.shrinkingClass);
23157
      var beforeSize = getDimension(slideConfig, component.element);
23158
      setGrown(component, slideConfig);
23159
      var fullSize = getDimension(slideConfig, component.element);
23160
      var startPartialGrow = function () {
679 daniel-mar 23161
        set$7(component.element, getDimensionProperty(slideConfig), beforeSize);
637 daniel-mar 23162
        reflow(component.element);
23163
      };
23164
      var startCompleteGrow = function () {
23165
        setShrunk(component, slideConfig);
23166
      };
23167
      var setStartSize = wasShrinking ? startPartialGrow : startCompleteGrow;
23168
      setStartSize();
679 daniel-mar 23169
      remove$2(root, slideConfig.shrinkingClass);
637 daniel-mar 23170
      add$2(root, slideConfig.growingClass);
23171
      setGrown(component, slideConfig);
679 daniel-mar 23172
      set$7(component.element, getDimensionProperty(slideConfig), fullSize);
637 daniel-mar 23173
      slideState.setExpanded();
23174
      slideConfig.onStartGrow(component);
23175
    };
23176
    var refresh$3 = function (component, slideConfig, slideState) {
23177
      if (slideState.isExpanded()) {
679 daniel-mar 23178
        remove$6(component.element, getDimensionProperty(slideConfig));
637 daniel-mar 23179
        var fullSize = getDimension(slideConfig, component.element);
679 daniel-mar 23180
        set$7(component.element, getDimensionProperty(slideConfig), fullSize);
637 daniel-mar 23181
      }
23182
    };
23183
    var grow = function (component, slideConfig, slideState) {
23184
      if (!slideState.isExpanded()) {
23185
        doStartGrow(component, slideConfig, slideState);
23186
      }
23187
    };
23188
    var shrink = function (component, slideConfig, slideState) {
23189
      if (slideState.isExpanded()) {
23190
        doStartSmartShrink(component, slideConfig, slideState);
23191
      }
23192
    };
23193
    var immediateShrink = function (component, slideConfig, slideState) {
23194
      if (slideState.isExpanded()) {
23195
        doImmediateShrink(component, slideConfig, slideState);
23196
      }
23197
    };
23198
    var hasGrown = function (component, slideConfig, slideState) {
23199
      return slideState.isExpanded();
23200
    };
23201
    var hasShrunk = function (component, slideConfig, slideState) {
23202
      return slideState.isCollapsed();
23203
    };
23204
    var isGrowing = function (component, slideConfig, _slideState) {
23205
      var root = getAnimationRoot(component, slideConfig);
23206
      return has(root, slideConfig.growingClass) === true;
23207
    };
23208
    var isShrinking = function (component, slideConfig, _slideState) {
23209
      var root = getAnimationRoot(component, slideConfig);
23210
      return has(root, slideConfig.shrinkingClass) === true;
23211
    };
23212
    var isTransitioning = function (component, slideConfig, slideState) {
23213
      return isGrowing(component, slideConfig) || isShrinking(component, slideConfig);
23214
    };
23215
    var toggleGrow = function (component, slideConfig, slideState) {
23216
      var f = slideState.isExpanded() ? doStartSmartShrink : doStartGrow;
23217
      f(component, slideConfig, slideState);
23218
    };
23219
 
23220
    var SlidingApis = /*#__PURE__*/Object.freeze({
23221
        __proto__: null,
23222
        refresh: refresh$3,
23223
        grow: grow,
23224
        shrink: shrink,
23225
        immediateShrink: immediateShrink,
23226
        hasGrown: hasGrown,
23227
        hasShrunk: hasShrunk,
23228
        isGrowing: isGrowing,
23229
        isShrinking: isShrinking,
23230
        isTransitioning: isTransitioning,
23231
        toggleGrow: toggleGrow,
23232
        disableTransitions: disableTransitions
23233
    });
23234
 
23235
    var exhibit = function (base, slideConfig, _slideState) {
23236
      var expanded = slideConfig.expanded;
23237
      return expanded ? nu$7({
23238
        classes: [slideConfig.openClass],
23239
        styles: {}
23240
      }) : nu$7({
23241
        classes: [slideConfig.closedClass],
23242
        styles: wrap$1(slideConfig.dimension.property, '0px')
23243
      });
23244
    };
23245
    var events$4 = function (slideConfig, slideState) {
23246
      return derive$2([runOnSource(transitionend(), function (component, simulatedEvent) {
23247
          var raw = simulatedEvent.event.raw;
23248
          if (raw.propertyName === slideConfig.dimension.property) {
23249
            disableTransitions(component, slideConfig);
23250
            if (slideState.isExpanded()) {
679 daniel-mar 23251
              remove$6(component.element, slideConfig.dimension.property);
637 daniel-mar 23252
            }
23253
            var notify = slideState.isExpanded() ? slideConfig.onGrown : slideConfig.onShrunk;
23254
            notify(component);
23255
          }
23256
        })]);
23257
    };
23258
 
23259
    var ActiveSliding = /*#__PURE__*/Object.freeze({
23260
        __proto__: null,
23261
        exhibit: exhibit,
23262
        events: events$4
23263
    });
23264
 
23265
    var SlidingSchema = [
23266
      required$1('closedClass'),
23267
      required$1('openClass'),
23268
      required$1('shrinkingClass'),
23269
      required$1('growingClass'),
23270
      option('getAnimationRoot'),
23271
      onHandler('onShrunk'),
23272
      onHandler('onStartShrink'),
23273
      onHandler('onGrown'),
23274
      onHandler('onStartGrow'),
23275
      defaulted('expanded', false),
23276
      requiredOf('dimension', choose$1('property', {
23277
        width: [
23278
          output$1('property', 'width'),
23279
          output$1('getDimension', function (elem) {
679 daniel-mar 23280
            return get$a(elem) + 'px';
637 daniel-mar 23281
          })
23282
        ],
23283
        height: [
23284
          output$1('property', 'height'),
23285
          output$1('getDimension', function (elem) {
679 daniel-mar 23286
            return get$b(elem) + 'px';
637 daniel-mar 23287
          })
23288
        ]
23289
      }))
23290
    ];
23291
 
23292
    var init$5 = function (spec) {
23293
      var state = Cell(spec.expanded);
23294
      var readState = function () {
23295
        return 'expanded: ' + state.get();
23296
      };
23297
      return nu$8({
23298
        isExpanded: function () {
23299
          return state.get() === true;
23300
        },
23301
        isCollapsed: function () {
23302
          return state.get() === false;
23303
        },
23304
        setCollapsed: curry(state.set, false),
23305
        setExpanded: curry(state.set, true),
23306
        readState: readState
23307
      });
23308
    };
23309
 
23310
    var SlidingState = /*#__PURE__*/Object.freeze({
23311
        __proto__: null,
23312
        init: init$5
23313
    });
23314
 
23315
    var Sliding = create$7({
23316
      fields: SlidingSchema,
23317
      name: 'sliding',
23318
      active: ActiveSliding,
23319
      apis: SlidingApis,
23320
      state: SlidingState
23321
    });
23322
 
23323
    var owner = 'container';
23324
    var schema$d = [field('slotBehaviours', [])];
23325
    var getPartName = function (name) {
23326
      return '<alloy.field.' + name + '>';
23327
    };
23328
    var sketch = function (sSpec) {
23329
      var parts = function () {
23330
        var record = [];
23331
        var slot = function (name, config) {
23332
          record.push(name);
23333
          return generateOne$1(owner, getPartName(name), config);
23334
        };
23335
        return {
23336
          slot: slot,
23337
          record: constant$1(record)
23338
        };
23339
      }();
23340
      var spec = sSpec(parts);
23341
      var partNames = parts.record();
23342
      var fieldParts = map$2(partNames, function (n) {
23343
        return required({
23344
          name: n,
23345
          pname: getPartName(n)
23346
        });
23347
      });
23348
      return composite$1(owner, schema$d, fieldParts, make$1, spec);
23349
    };
23350
    var make$1 = function (detail, components) {
23351
      var getSlotNames = function (_) {
23352
        return getAllPartNames(detail);
23353
      };
23354
      var getSlot = function (container, key) {
23355
        return getPart(container, detail, key);
23356
      };
23357
      var onSlot = function (f, def) {
23358
        return function (container, key) {
23359
          return getPart(container, detail, key).map(function (slot) {
23360
            return f(slot, key);
23361
          }).getOr(def);
23362
        };
23363
      };
23364
      var onSlots = function (f) {
23365
        return function (container, keys) {
23366
          each$1(keys, function (key) {
23367
            return f(container, key);
23368
          });
23369
        };
23370
      };
23371
      var doShowing = function (comp, _key) {
679 daniel-mar 23372
        return get$d(comp.element, 'aria-hidden') !== 'true';
637 daniel-mar 23373
      };
23374
      var doShow = function (comp, key) {
23375
        if (!doShowing(comp)) {
23376
          var element = comp.element;
679 daniel-mar 23377
          remove$6(element, 'display');
23378
          remove$7(element, 'aria-hidden');
637 daniel-mar 23379
          emitWith(comp, slotVisibility(), {
23380
            name: key,
23381
            visible: true
23382
          });
23383
        }
23384
      };
23385
      var doHide = function (comp, key) {
23386
        if (doShowing(comp)) {
23387
          var element = comp.element;
679 daniel-mar 23388
          set$7(element, 'display', 'none');
23389
          set$8(element, 'aria-hidden', 'true');
637 daniel-mar 23390
          emitWith(comp, slotVisibility(), {
23391
            name: key,
23392
            visible: false
23393
          });
23394
        }
23395
      };
23396
      var isShowing = onSlot(doShowing, false);
23397
      var hideSlot = onSlot(doHide);
23398
      var hideSlots = onSlots(hideSlot);
23399
      var hideAllSlots = function (container) {
23400
        return hideSlots(container, getSlotNames());
23401
      };
23402
      var showSlot = onSlot(doShow);
23403
      var apis = {
23404
        getSlotNames: getSlotNames,
23405
        getSlot: getSlot,
23406
        isShowing: isShowing,
23407
        hideSlot: hideSlot,
23408
        hideAllSlots: hideAllSlots,
23409
        showSlot: showSlot
23410
      };
23411
      return {
23412
        uid: detail.uid,
23413
        dom: detail.dom,
23414
        components: components,
23415
        behaviours: get$2(detail.slotBehaviours),
23416
        apis: apis
23417
      };
23418
    };
679 daniel-mar 23419
    var slotApis = map$1({
637 daniel-mar 23420
      getSlotNames: function (apis, c) {
23421
        return apis.getSlotNames(c);
23422
      },
23423
      getSlot: function (apis, c, key) {
23424
        return apis.getSlot(c, key);
23425
      },
23426
      isShowing: function (apis, c, key) {
23427
        return apis.isShowing(c, key);
23428
      },
23429
      hideSlot: function (apis, c, key) {
23430
        return apis.hideSlot(c, key);
23431
      },
23432
      hideAllSlots: function (apis, c) {
23433
        return apis.hideAllSlots(c);
23434
      },
23435
      showSlot: function (apis, c, key) {
23436
        return apis.showSlot(c, key);
23437
      }
23438
    }, function (value) {
23439
      return makeApi(value);
23440
    });
23441
    var SlotContainer = __assign(__assign({}, slotApis), { sketch: sketch });
23442
 
23443
    var sidebarSchema = objOf([
23444
      optionString('icon'),
23445
      optionString('tooltip'),
23446
      defaultedFunction('onShow', noop),
23447
      defaultedFunction('onHide', noop),
23448
      defaultedFunction('onSetup', function () {
23449
        return noop;
23450
      })
23451
    ]);
23452
    var createSidebar = function (spec) {
23453
      return asRaw('sidebar', sidebarSchema, spec);
23454
    };
23455
 
23456
    var setup$8 = function (editor) {
23457
      var sidebars = editor.ui.registry.getAll().sidebars;
23458
      each$1(keys(sidebars), function (name) {
23459
        var spec = sidebars[name];
23460
        var isActive = function () {
679 daniel-mar 23461
          return is$1(Optional.from(editor.queryCommandValue('ToggleSidebar')), name);
637 daniel-mar 23462
        };
23463
        editor.ui.registry.addToggleButton(name, {
23464
          icon: spec.icon,
23465
          tooltip: spec.tooltip,
23466
          onAction: function (buttonApi) {
23467
            editor.execCommand('ToggleSidebar', false, name);
23468
            buttonApi.setActive(isActive());
23469
          },
23470
          onSetup: function (buttonApi) {
23471
            var handleToggle = function () {
23472
              return buttonApi.setActive(isActive());
23473
            };
23474
            editor.on('ToggleSidebar', handleToggle);
23475
            return function () {
23476
              editor.off('ToggleSidebar', handleToggle);
23477
            };
23478
          }
23479
        });
23480
      });
23481
    };
23482
    var getApi = function (comp) {
23483
      return {
23484
        element: function () {
23485
          return comp.element.dom;
23486
        }
23487
      };
23488
    };
23489
    var makePanels = function (parts, panelConfigs) {
23490
      var specs = map$2(keys(panelConfigs), function (name) {
23491
        var spec = panelConfigs[name];
23492
        var bridged = getOrDie(createSidebar(spec));
23493
        return {
23494
          name: name,
23495
          getApi: getApi,
23496
          onSetup: bridged.onSetup,
23497
          onShow: bridged.onShow,
23498
          onHide: bridged.onHide
23499
        };
23500
      });
23501
      return map$2(specs, function (spec) {
23502
        var editorOffCell = Cell(noop);
23503
        return parts.slot(spec.name, {
23504
          dom: {
23505
            tag: 'div',
23506
            classes: ['tox-sidebar__pane']
23507
          },
23508
          behaviours: SimpleBehaviours.unnamedEvents([
23509
            onControlAttached(spec, editorOffCell),
23510
            onControlDetached(spec, editorOffCell),
23511
            run$1(slotVisibility(), function (sidepanel, se) {
23512
              var data = se.event;
23513
              var optSidePanelSpec = find$5(specs, function (config) {
23514
                return config.name === data.name;
23515
              });
23516
              optSidePanelSpec.each(function (sidePanelSpec) {
23517
                var handler = data.visible ? sidePanelSpec.onShow : sidePanelSpec.onHide;
23518
                handler(sidePanelSpec.getApi(sidepanel));
23519
              });
23520
            })
23521
          ])
23522
        });
23523
      });
23524
    };
23525
    var makeSidebar = function (panelConfigs) {
23526
      return SlotContainer.sketch(function (parts) {
23527
        return {
23528
          dom: {
23529
            tag: 'div',
23530
            classes: ['tox-sidebar__pane-container']
23531
          },
23532
          components: makePanels(parts, panelConfigs),
23533
          slotBehaviours: SimpleBehaviours.unnamedEvents([runOnAttached(function (slotContainer) {
23534
              return SlotContainer.hideAllSlots(slotContainer);
23535
            })])
23536
        };
23537
      });
23538
    };
23539
    var setSidebar = function (sidebar, panelConfigs) {
23540
      var optSlider = Composing.getCurrent(sidebar);
23541
      optSlider.each(function (slider) {
23542
        return Replacing.set(slider, [makeSidebar(panelConfigs)]);
23543
      });
23544
    };
23545
    var toggleSidebar = function (sidebar, name) {
23546
      var optSlider = Composing.getCurrent(sidebar);
23547
      optSlider.each(function (slider) {
23548
        var optSlotContainer = Composing.getCurrent(slider);
23549
        optSlotContainer.each(function (slotContainer) {
23550
          if (Sliding.hasGrown(slider)) {
23551
            if (SlotContainer.isShowing(slotContainer, name)) {
23552
              Sliding.shrink(slider);
23553
            } else {
23554
              SlotContainer.hideAllSlots(slotContainer);
23555
              SlotContainer.showSlot(slotContainer, name);
23556
            }
23557
          } else {
23558
            SlotContainer.hideAllSlots(slotContainer);
23559
            SlotContainer.showSlot(slotContainer, name);
23560
            Sliding.grow(slider);
23561
          }
23562
        });
23563
      });
23564
    };
23565
    var whichSidebar = function (sidebar) {
23566
      var optSlider = Composing.getCurrent(sidebar);
23567
      return optSlider.bind(function (slider) {
23568
        var sidebarOpen = Sliding.isGrowing(slider) || Sliding.hasGrown(slider);
23569
        if (sidebarOpen) {
23570
          var optSlotContainer = Composing.getCurrent(slider);
23571
          return optSlotContainer.bind(function (slotContainer) {
23572
            return find$5(SlotContainer.getSlotNames(slotContainer), function (name) {
23573
              return SlotContainer.isShowing(slotContainer, name);
23574
            });
23575
          });
23576
        } else {
23577
          return Optional.none();
23578
        }
23579
      });
23580
    };
23581
    var fixSize = generate$6('FixSizeEvent');
23582
    var autoSize = generate$6('AutoSizeEvent');
23583
    var renderSidebar = function (spec) {
23584
      return {
23585
        uid: spec.uid,
23586
        dom: {
23587
          tag: 'div',
23588
          classes: ['tox-sidebar'],
23589
          attributes: { role: 'complementary' }
23590
        },
23591
        components: [{
23592
            dom: {
23593
              tag: 'div',
23594
              classes: ['tox-sidebar__slider']
23595
            },
23596
            components: [],
23597
            behaviours: derive$1([
23598
              Tabstopping.config({}),
23599
              Focusing.config({}),
23600
              Sliding.config({
23601
                dimension: { property: 'width' },
23602
                closedClass: 'tox-sidebar--sliding-closed',
23603
                openClass: 'tox-sidebar--sliding-open',
23604
                shrinkingClass: 'tox-sidebar--sliding-shrinking',
23605
                growingClass: 'tox-sidebar--sliding-growing',
23606
                onShrunk: function (slider) {
23607
                  var optSlotContainer = Composing.getCurrent(slider);
23608
                  optSlotContainer.each(SlotContainer.hideAllSlots);
23609
                  emit(slider, autoSize);
23610
                },
23611
                onGrown: function (slider) {
23612
                  emit(slider, autoSize);
23613
                },
23614
                onStartGrow: function (slider) {
23615
                  emitWith(slider, fixSize, { width: getRaw(slider.element, 'width').getOr('') });
23616
                },
23617
                onStartShrink: function (slider) {
679 daniel-mar 23618
                  emitWith(slider, fixSize, { width: get$a(slider.element) + 'px' });
637 daniel-mar 23619
                }
23620
              }),
23621
              Replacing.config({}),
23622
              Composing.config({
23623
                find: function (comp) {
23624
                  var children = Replacing.contents(comp);
23625
                  return head(children);
23626
                }
23627
              })
23628
            ])
23629
          }],
23630
        behaviours: derive$1([
23631
          ComposingConfigs.childAt(0),
23632
          config('sidebar-sliding-events', [
23633
            run$1(fixSize, function (comp, se) {
679 daniel-mar 23634
              set$7(comp.element, 'width', se.event.width);
637 daniel-mar 23635
            }),
23636
            run$1(autoSize, function (comp, _se) {
679 daniel-mar 23637
              remove$6(comp.element, 'width');
637 daniel-mar 23638
            })
23639
          ])
23640
        ])
23641
      };
23642
    };
23643
 
23644
    var block = function (component, config, state, getBusySpec) {
679 daniel-mar 23645
      set$8(component.element, 'aria-busy', true);
637 daniel-mar 23646
      var root = config.getRoot(component).getOr(component);
23647
      var blockerBehaviours = derive$1([
23648
        Keying.config({
23649
          mode: 'special',
23650
          onTab: function () {
23651
            return Optional.some(true);
23652
          },
23653
          onShiftTab: function () {
23654
            return Optional.some(true);
23655
          }
23656
        }),
23657
        Focusing.config({})
23658
      ]);
23659
      var blockSpec = getBusySpec(root, blockerBehaviours);
23660
      var blocker = root.getSystem().build(blockSpec);
23661
      Replacing.append(root, premade(blocker));
23662
      if (blocker.hasConfigured(Keying) && config.focus) {
23663
        Keying.focusIn(blocker);
23664
      }
23665
      if (!state.isBlocked()) {
23666
        config.onBlock(component);
23667
      }
23668
      state.blockWith(function () {
23669
        return Replacing.remove(root, blocker);
23670
      });
23671
    };
23672
    var unblock = function (component, config, state) {
679 daniel-mar 23673
      remove$7(component.element, 'aria-busy');
637 daniel-mar 23674
      if (state.isBlocked()) {
23675
        config.onUnblock(component);
23676
      }
23677
      state.clear();
23678
    };
23679
 
23680
    var BlockingApis = /*#__PURE__*/Object.freeze({
23681
        __proto__: null,
23682
        block: block,
23683
        unblock: unblock
23684
    });
23685
 
23686
    var BlockingSchema = [
23687
      defaultedFunction('getRoot', Optional.none),
23688
      defaultedBoolean('focus', true),
23689
      onHandler('onBlock'),
23690
      onHandler('onUnblock')
23691
    ];
23692
 
23693
    var init$4 = function () {
23694
      var blocker = destroyable();
23695
      var blockWith = function (destroy) {
23696
        blocker.set({ destroy: destroy });
23697
      };
23698
      return nu$8({
23699
        readState: blocker.isSet,
23700
        blockWith: blockWith,
23701
        clear: blocker.clear,
23702
        isBlocked: blocker.isSet
23703
      });
23704
    };
23705
 
23706
    var BlockingState = /*#__PURE__*/Object.freeze({
23707
        __proto__: null,
23708
        init: init$4
23709
    });
23710
 
23711
    var Blocking = create$7({
23712
      fields: BlockingSchema,
23713
      name: 'blocking',
23714
      apis: BlockingApis,
23715
      state: BlockingState
23716
    });
23717
 
23718
    var getAttrs = function (elem) {
23719
      var attributes = elem.dom.attributes !== undefined ? elem.dom.attributes : [];
23720
      return foldl(attributes, function (b, attr) {
23721
        var _a;
23722
        if (attr.name === 'class') {
23723
          return b;
23724
        } else {
23725
          return __assign(__assign({}, b), (_a = {}, _a[attr.name] = attr.value, _a));
23726
        }
23727
      }, {});
23728
    };
23729
    var getClasses = function (elem) {
23730
      return Array.prototype.slice.call(elem.dom.classList, 0);
23731
    };
23732
    var fromHtml = function (html) {
23733
      var elem = SugarElement.fromHtml(html);
23734
      var children$1 = children(elem);
23735
      var attrs = getAttrs(elem);
23736
      var classes = getClasses(elem);
679 daniel-mar 23737
      var contents = children$1.length === 0 ? {} : { innerHtml: get$7(elem) };
637 daniel-mar 23738
      return __assign({
23739
        tag: name$2(elem),
23740
        classes: classes,
23741
        attributes: attrs
23742
      }, contents);
23743
    };
23744
 
23745
    var getBusySpec$1 = function (providerBackstage) {
23746
      return function (_root, _behaviours) {
23747
        return {
23748
          dom: {
23749
            tag: 'div',
23750
            attributes: {
23751
              'aria-label': providerBackstage.translate('Loading...'),
23752
              'tabindex': '0'
23753
            },
23754
            classes: ['tox-throbber__busy-spinner']
23755
          },
23756
          components: [{ dom: fromHtml('<div class="tox-spinner"><div></div><div></div><div></div></div>') }]
23757
        };
23758
      };
23759
    };
23760
    var focusBusyComponent = function (throbber) {
23761
      return Composing.getCurrent(throbber).each(function (comp) {
23762
        return focus$3(comp.element);
23763
      });
23764
    };
23765
    var toggleEditorTabIndex = function (editor, state) {
23766
      var tabIndexAttr = 'tabindex';
23767
      var dataTabIndexAttr = 'data-mce-' + tabIndexAttr;
23768
      Optional.from(editor.iframeElement).map(SugarElement.fromDom).each(function (iframe) {
23769
        if (state) {
23770
          getOpt(iframe, tabIndexAttr).each(function (tabIndex) {
679 daniel-mar 23771
            return set$8(iframe, dataTabIndexAttr, tabIndex);
637 daniel-mar 23772
          });
679 daniel-mar 23773
          set$8(iframe, tabIndexAttr, -1);
637 daniel-mar 23774
        } else {
679 daniel-mar 23775
          remove$7(iframe, tabIndexAttr);
637 daniel-mar 23776
          getOpt(iframe, dataTabIndexAttr).each(function (tabIndex) {
679 daniel-mar 23777
            set$8(iframe, tabIndexAttr, tabIndex);
23778
            remove$7(iframe, dataTabIndexAttr);
637 daniel-mar 23779
          });
23780
        }
23781
      });
23782
    };
23783
    var toggleThrobber = function (editor, comp, state, providerBackstage) {
23784
      var element = comp.element;
23785
      toggleEditorTabIndex(editor, state);
23786
      if (state) {
23787
        Blocking.block(comp, getBusySpec$1(providerBackstage));
679 daniel-mar 23788
        remove$6(element, 'display');
23789
        remove$7(element, 'aria-hidden');
637 daniel-mar 23790
        if (editor.hasFocus()) {
23791
          focusBusyComponent(comp);
23792
        }
23793
      } else {
23794
        var throbberFocus = Composing.getCurrent(comp).exists(function (busyComp) {
23795
          return hasFocus(busyComp.element);
23796
        });
23797
        Blocking.unblock(comp);
679 daniel-mar 23798
        set$7(element, 'display', 'none');
23799
        set$8(element, 'aria-hidden', 'true');
637 daniel-mar 23800
        if (throbberFocus) {
23801
          editor.focus();
23802
        }
23803
      }
23804
    };
23805
    var renderThrobber = function (spec) {
23806
      return {
23807
        uid: spec.uid,
23808
        dom: {
23809
          tag: 'div',
23810
          attributes: { 'aria-hidden': 'true' },
23811
          classes: ['tox-throbber'],
23812
          styles: { display: 'none' }
23813
        },
23814
        behaviours: derive$1([
23815
          Replacing.config({}),
23816
          Blocking.config({ focus: false }),
23817
          Composing.config({
23818
            find: function (comp) {
23819
              return head(comp.components());
23820
            }
23821
          })
23822
        ]),
23823
        components: []
23824
      };
23825
    };
23826
    var isFocusEvent = function (event) {
23827
      return event.type === 'focusin';
23828
    };
23829
    var isPasteBinTarget = function (event) {
23830
      if (isFocusEvent(event)) {
23831
        var node = event.composed ? head(event.composedPath()) : Optional.from(event.target);
23832
        return node.map(SugarElement.fromDom).filter(isElement$2).exists(function (targetElm) {
23833
          return has(targetElm, 'mce-pastebin');
23834
        });
23835
      } else {
23836
        return false;
23837
      }
23838
    };
23839
    var setup$7 = function (editor, lazyThrobber, sharedBackstage) {
23840
      var throbberState = Cell(false);
23841
      var timer = value$1();
23842
      var stealFocus = function (e) {
23843
        if (throbberState.get() && !isPasteBinTarget(e)) {
23844
          e.preventDefault();
23845
          focusBusyComponent(lazyThrobber());
23846
          editor.editorManager.setActive(editor);
23847
        }
23848
      };
23849
      if (!editor.inline) {
23850
        editor.on('PreInit', function () {
23851
          editor.dom.bind(editor.getWin(), 'focusin', stealFocus);
23852
          editor.on('BeforeExecCommand', function (e) {
23853
            if (e.command.toLowerCase() === 'mcefocus' && e.value !== true) {
23854
              stealFocus(e);
23855
            }
23856
          });
23857
        });
23858
      }
23859
      var toggle = function (state) {
23860
        if (state !== throbberState.get()) {
23861
          throbberState.set(state);
23862
          toggleThrobber(editor, lazyThrobber(), state, sharedBackstage.providers);
23863
          editor.fire('AfterProgressState', { state: state });
23864
        }
23865
      };
23866
      editor.on('ProgressState', function (e) {
679 daniel-mar 23867
        timer.on(global$f.clearTimeout);
637 daniel-mar 23868
        if (isNumber(e.time)) {
679 daniel-mar 23869
          var timerId = global$f.setEditorTimeout(editor, function () {
637 daniel-mar 23870
            return toggle(e.state);
23871
          }, e.time);
23872
          timer.set(timerId);
23873
        } else {
23874
          toggle(e.state);
23875
          timer.clear();
23876
        }
23877
      });
23878
    };
23879
 
23880
    var generate$1 = function (xs, f) {
597 daniel-mar 23881
      var init = {
23882
        len: 0,
23883
        list: []
23884
      };
23885
      var r = foldl(xs, function (b, a) {
23886
        var value = f(a, b.len);
637 daniel-mar 23887
        return value.fold(constant$1(b), function (v) {
597 daniel-mar 23888
          return {
23889
            len: v.finish,
23890
            list: b.list.concat([v])
23891
          };
23892
        });
23893
      }, init);
23894
      return r.list;
23895
    };
23896
 
637 daniel-mar 23897
    var output = function (within, extra, withinWidth) {
597 daniel-mar 23898
      return {
23899
        within: within,
23900
        extra: extra,
23901
        withinWidth: withinWidth
23902
      };
23903
    };
23904
    var apportion = function (units, total, len) {
637 daniel-mar 23905
      var parray = generate$1(units, function (unit, current) {
597 daniel-mar 23906
        var width = len(unit);
23907
        return Optional.some({
23908
          element: unit,
23909
          start: current,
23910
          finish: current + width,
23911
          width: width
23912
        });
23913
      });
637 daniel-mar 23914
      var within = filter$2(parray, function (unit) {
597 daniel-mar 23915
        return unit.finish <= total;
23916
      });
23917
      var withinWidth = foldr(within, function (acc, el) {
23918
        return acc + el.width;
23919
      }, 0);
23920
      var extra = parray.slice(within.length);
23921
      return {
23922
        within: within,
23923
        extra: extra,
23924
        withinWidth: withinWidth
23925
      };
23926
    };
23927
    var toUnit = function (parray) {
637 daniel-mar 23928
      return map$2(parray, function (unit) {
597 daniel-mar 23929
        return unit.element;
23930
      });
23931
    };
23932
    var fitLast = function (within, extra, withinWidth) {
23933
      var fits = toUnit(within.concat(extra));
637 daniel-mar 23934
      return output(fits, [], withinWidth);
597 daniel-mar 23935
    };
23936
    var overflow = function (within, extra, overflower, withinWidth) {
23937
      var fits = toUnit(within).concat([overflower]);
637 daniel-mar 23938
      return output(fits, toUnit(extra), withinWidth);
597 daniel-mar 23939
    };
23940
    var fitAll = function (within, extra, withinWidth) {
637 daniel-mar 23941
      return output(toUnit(within), [], withinWidth);
597 daniel-mar 23942
    };
23943
    var tryFit = function (total, units, len) {
23944
      var divide = apportion(units, total, len);
23945
      return divide.extra.length === 0 ? Optional.some(divide) : Optional.none();
23946
    };
637 daniel-mar 23947
    var partition = function (total, units, len, overflower) {
597 daniel-mar 23948
      var divide = tryFit(total, units, len).getOrThunk(function () {
23949
        return apportion(units, total - len(overflower), len);
23950
      });
23951
      var within = divide.within;
23952
      var extra = divide.extra;
23953
      var withinWidth = divide.withinWidth;
23954
      if (extra.length === 1 && extra[0].width <= len(overflower)) {
23955
        return fitLast(within, extra, withinWidth);
23956
      } else if (extra.length >= 1) {
23957
        return overflow(within, extra, overflower, withinWidth);
23958
      } else {
23959
        return fitAll(within, extra, withinWidth);
23960
      }
23961
    };
23962
 
637 daniel-mar 23963
    var setGroups$1 = function (toolbar, storedGroups) {
23964
      var bGroups = map$2(storedGroups, function (g) {
23965
        return premade(g);
597 daniel-mar 23966
      });
23967
      Toolbar.setGroups(toolbar, bGroups);
23968
    };
23969
    var findFocusedComp = function (comps) {
23970
      return findMap(comps, function (comp) {
23971
        return search(comp.element).bind(function (focusedElm) {
23972
          return comp.getSystem().getByDom(focusedElm).toOptional();
23973
        });
23974
      });
23975
    };
637 daniel-mar 23976
    var refresh$2 = function (toolbar, detail, setOverflow) {
23977
      var builtGroups = detail.builtGroups.get();
23978
      if (builtGroups.length === 0) {
23979
        return;
23980
      }
597 daniel-mar 23981
      var primary = getPartOrDie(toolbar, detail, 'primary');
23982
      var overflowGroup = Coupling.getCoupled(toolbar, 'overflowGroup');
679 daniel-mar 23983
      set$7(primary.element, 'visibility', 'hidden');
637 daniel-mar 23984
      var groups = builtGroups.concat([overflowGroup]);
597 daniel-mar 23985
      var focusedComp = findFocusedComp(groups);
23986
      setOverflow([]);
637 daniel-mar 23987
      setGroups$1(primary, groups);
679 daniel-mar 23988
      var availableWidth = get$a(primary.element);
637 daniel-mar 23989
      var overflows = partition(availableWidth, detail.builtGroups.get(), function (comp) {
679 daniel-mar 23990
        return get$a(comp.element);
597 daniel-mar 23991
      }, overflowGroup);
23992
      if (overflows.extra.length === 0) {
23993
        Replacing.remove(primary, overflowGroup);
23994
        setOverflow([]);
23995
      } else {
637 daniel-mar 23996
        setGroups$1(primary, overflows.within);
597 daniel-mar 23997
        setOverflow(overflows.extra);
23998
      }
679 daniel-mar 23999
      remove$6(primary.element, 'visibility');
597 daniel-mar 24000
      reflow(primary.element);
24001
      focusedComp.each(Focusing.focus);
24002
    };
24003
 
637 daniel-mar 24004
    var schema$c = constant$1([
24005
      field('splitToolbarBehaviours', [Coupling]),
24006
      customField('builtGroups', function () {
597 daniel-mar 24007
        return Cell([]);
24008
      })
24009
    ]);
24010
 
637 daniel-mar 24011
    var schema$b = constant$1([
24012
      markers$1(['overflowToggledClass']),
597 daniel-mar 24013
      optionFunction('getOverflowBounds'),
637 daniel-mar 24014
      required$1('lazySink'),
24015
      customField('overflowGroups', function () {
597 daniel-mar 24016
        return Cell([]);
24017
      })
637 daniel-mar 24018
    ].concat(schema$c()));
24019
    var parts$7 = constant$1([
597 daniel-mar 24020
      required({
24021
        factory: Toolbar,
637 daniel-mar 24022
        schema: schema$e(),
597 daniel-mar 24023
        name: 'primary'
24024
      }),
24025
      external$1({
637 daniel-mar 24026
        schema: schema$e(),
597 daniel-mar 24027
        name: 'overflow'
24028
      }),
24029
      external$1({ name: 'overflow-button' }),
24030
      external$1({ name: 'overflow-group' })
24031
    ]);
24032
 
637 daniel-mar 24033
    var expandable = constant$1(function (element, available) {
24034
      setMax(element, Math.floor(available));
24035
    });
24036
 
24037
    var schema$a = constant$1([
24038
      markers$1(['toggledClass']),
24039
      required$1('lazySink'),
24040
      requiredFunction('fetch'),
597 daniel-mar 24041
      optionFunction('getBounds'),
637 daniel-mar 24042
      optionObjOf('fireDismissalEventInstead', [defaulted('event', dismissRequested())]),
24043
      schema$y()
597 daniel-mar 24044
    ]);
637 daniel-mar 24045
    var parts$6 = constant$1([
597 daniel-mar 24046
      external$1({
24047
        name: 'button',
24048
        overrides: function (detail) {
24049
          return {
24050
            dom: { attributes: { 'aria-haspopup': 'true' } },
24051
            buttonBehaviours: derive$1([Toggling.config({
24052
                toggleClass: detail.markers.toggledClass,
24053
                aria: { mode: 'expanded' },
24054
                toggleOnExecute: false
24055
              })])
24056
          };
24057
        }
24058
      }),
24059
      external$1({
24060
        factory: Toolbar,
637 daniel-mar 24061
        schema: schema$e(),
597 daniel-mar 24062
        name: 'toolbar',
24063
        overrides: function (detail) {
24064
          return {
24065
            toolbarBehaviours: derive$1([Keying.config({
24066
                mode: 'cyclic',
24067
                onEscape: function (comp) {
24068
                  getPart(comp, detail, 'button').each(Focusing.focus);
24069
                  return Optional.none();
24070
                }
24071
              })])
24072
          };
24073
        }
24074
      })
24075
    ]);
24076
 
637 daniel-mar 24077
    var toggle = function (button, externals) {
597 daniel-mar 24078
      var toolbarSandbox = Coupling.getCoupled(button, 'toolbarSandbox');
24079
      if (Sandboxing.isOpen(toolbarSandbox)) {
24080
        Sandboxing.close(toolbarSandbox);
24081
      } else {
24082
        Sandboxing.open(toolbarSandbox, externals.toolbar());
24083
      }
24084
    };
637 daniel-mar 24085
    var position = function (button, toolbar, detail, layouts) {
597 daniel-mar 24086
      var bounds = detail.getBounds.map(function (bounder) {
24087
        return bounder();
24088
      });
24089
      var sink = detail.lazySink(button).getOrDie();
637 daniel-mar 24090
      Positioning.positionWithinBounds(sink, toolbar, {
24091
        anchor: {
24092
          type: 'hotspot',
24093
          hotspot: button,
24094
          layouts: layouts,
24095
          overrides: { maxWidthFunction: expandable() }
24096
        }
24097
      }, bounds);
597 daniel-mar 24098
    };
637 daniel-mar 24099
    var setGroups = function (button, toolbar, detail, layouts, groups) {
597 daniel-mar 24100
      Toolbar.setGroups(toolbar, groups);
637 daniel-mar 24101
      position(button, toolbar, detail, layouts);
597 daniel-mar 24102
      Toggling.on(button);
24103
    };
637 daniel-mar 24104
    var makeSandbox = function (button, spec, detail) {
597 daniel-mar 24105
      var ariaOwner = manager();
24106
      var onOpen = function (sandbox, toolbar) {
24107
        detail.fetch().get(function (groups) {
637 daniel-mar 24108
          setGroups(button, toolbar, detail, spec.layouts, groups);
597 daniel-mar 24109
          ariaOwner.link(button.element);
24110
          Keying.focusIn(toolbar);
24111
        });
24112
      };
24113
      var onClose = function () {
24114
        Toggling.off(button);
24115
        Focusing.focus(button);
24116
        ariaOwner.unlink(button.element);
24117
      };
24118
      return {
24119
        dom: {
24120
          tag: 'div',
24121
          attributes: { id: ariaOwner.id }
24122
        },
24123
        behaviours: derive$1([
24124
          Keying.config({
24125
            mode: 'special',
24126
            onEscape: function (comp) {
24127
              Sandboxing.close(comp);
24128
              return Optional.some(true);
24129
            }
24130
          }),
24131
          Sandboxing.config({
24132
            onOpen: onOpen,
24133
            onClose: onClose,
24134
            isPartOf: function (container, data, queryElem) {
637 daniel-mar 24135
              return isPartOf$1(data, queryElem) || isPartOf$1(button, queryElem);
597 daniel-mar 24136
            },
24137
            getAttachPoint: function () {
24138
              return detail.lazySink(button).getOrDie();
24139
            }
24140
          }),
24141
          Receiving.config({
637 daniel-mar 24142
            channels: __assign(__assign({}, receivingChannel$1(__assign({ isExtraPart: never }, detail.fireDismissalEventInstead.map(function (fe) {
597 daniel-mar 24143
              return { fireEventInstead: { event: fe.event } };
637 daniel-mar 24144
            }).getOr({})))), receivingChannel({
597 daniel-mar 24145
              doReposition: function () {
24146
                Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox')).each(function (toolbar) {
637 daniel-mar 24147
                  position(button, toolbar, detail, spec.layouts);
597 daniel-mar 24148
                });
24149
              }
24150
            }))
24151
          })
24152
        ])
24153
      };
24154
    };
24155
    var factory$a = function (detail, components, spec, externals) {
24156
      return __assign(__assign({}, Button.sketch(__assign(__assign({}, externals.button()), {
24157
        action: function (button) {
637 daniel-mar 24158
          toggle(button, externals);
597 daniel-mar 24159
        },
24160
        buttonBehaviours: SketchBehaviours.augment({ dump: externals.button().buttonBehaviours }, [Coupling.config({
24161
            others: {
24162
              toolbarSandbox: function (button) {
637 daniel-mar 24163
                return makeSandbox(button, spec, detail);
597 daniel-mar 24164
              }
24165
            }
24166
          })])
24167
      }))), {
24168
        apis: {
24169
          setGroups: function (button, groups) {
24170
            Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox')).each(function (toolbar) {
637 daniel-mar 24171
              setGroups(button, toolbar, detail, spec.layouts, groups);
597 daniel-mar 24172
            });
24173
          },
24174
          reposition: function (button) {
24175
            Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox')).each(function (toolbar) {
637 daniel-mar 24176
              position(button, toolbar, detail, spec.layouts);
597 daniel-mar 24177
            });
24178
          },
24179
          toggle: function (button) {
637 daniel-mar 24180
            toggle(button, externals);
597 daniel-mar 24181
          },
24182
          getToolbar: function (button) {
24183
            return Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox'));
24184
          },
24185
          isOpen: function (button) {
24186
            return Sandboxing.isOpen(Coupling.getCoupled(button, 'toolbarSandbox'));
24187
          }
24188
        }
24189
      });
24190
    };
637 daniel-mar 24191
    var FloatingToolbarButton = composite({
597 daniel-mar 24192
      name: 'FloatingToolbarButton',
24193
      factory: factory$a,
637 daniel-mar 24194
      configFields: schema$a(),
24195
      partFields: parts$6(),
597 daniel-mar 24196
      apis: {
24197
        setGroups: function (apis, button, groups) {
24198
          apis.setGroups(button, groups);
24199
        },
24200
        reposition: function (apis, button) {
24201
          apis.reposition(button);
24202
        },
24203
        toggle: function (apis, button) {
24204
          apis.toggle(button);
24205
        },
24206
        getToolbar: function (apis, button) {
24207
          return apis.getToolbar(button);
24208
        },
24209
        isOpen: function (apis, button) {
24210
          return apis.isOpen(button);
24211
        }
24212
      }
24213
    });
24214
 
637 daniel-mar 24215
    var schema$9 = constant$1([
24216
      required$1('items'),
24217
      markers$1(['itemSelector']),
24218
      field('tgroupBehaviours', [Keying])
597 daniel-mar 24219
    ]);
637 daniel-mar 24220
    var parts$5 = constant$1([group({
597 daniel-mar 24221
        name: 'items',
24222
        unit: 'item'
24223
      })]);
24224
 
637 daniel-mar 24225
    var factory$9 = function (detail, components, _spec, _externals) {
597 daniel-mar 24226
      return {
24227
        uid: detail.uid,
24228
        dom: detail.dom,
24229
        components: components,
24230
        behaviours: augment(detail.tgroupBehaviours, [Keying.config({
24231
            mode: 'flow',
24232
            selector: detail.markers.itemSelector
24233
          })]),
24234
        domModification: { attributes: { role: 'toolbar' } }
24235
      };
24236
    };
637 daniel-mar 24237
    var ToolbarGroup = composite({
597 daniel-mar 24238
      name: 'ToolbarGroup',
637 daniel-mar 24239
      configFields: schema$9(),
24240
      partFields: parts$5(),
24241
      factory: factory$9
597 daniel-mar 24242
    });
24243
 
24244
    var buildGroups = function (comps) {
637 daniel-mar 24245
      return map$2(comps, function (g) {
24246
        return premade(g);
597 daniel-mar 24247
      });
24248
    };
24249
    var refresh$1 = function (toolbar, memFloatingToolbarButton, detail) {
637 daniel-mar 24250
      refresh$2(toolbar, detail, function (overflowGroups) {
597 daniel-mar 24251
        detail.overflowGroups.set(overflowGroups);
24252
        memFloatingToolbarButton.getOpt(toolbar).each(function (floatingToolbarButton) {
24253
          FloatingToolbarButton.setGroups(floatingToolbarButton, buildGroups(overflowGroups));
24254
        });
24255
      });
24256
    };
637 daniel-mar 24257
    var factory$8 = function (detail, components, spec, externals) {
597 daniel-mar 24258
      var memFloatingToolbarButton = record(FloatingToolbarButton.sketch({
24259
        fetch: function () {
24260
          return Future.nu(function (resolve) {
24261
            resolve(buildGroups(detail.overflowGroups.get()));
24262
          });
24263
        },
24264
        layouts: {
24265
          onLtr: function () {
24266
            return [
637 daniel-mar 24267
              southwest$2,
24268
              southeast$2
597 daniel-mar 24269
            ];
24270
          },
24271
          onRtl: function () {
24272
            return [
637 daniel-mar 24273
              southeast$2,
24274
              southwest$2
597 daniel-mar 24275
            ];
24276
          },
24277
          onBottomLtr: function () {
24278
            return [
637 daniel-mar 24279
              northwest$2,
24280
              northeast$2
597 daniel-mar 24281
            ];
24282
          },
24283
          onBottomRtl: function () {
24284
            return [
637 daniel-mar 24285
              northeast$2,
24286
              northwest$2
597 daniel-mar 24287
            ];
24288
          }
24289
        },
24290
        getBounds: spec.getOverflowBounds,
24291
        lazySink: detail.lazySink,
24292
        fireDismissalEventInstead: {},
24293
        markers: { toggledClass: detail.markers.overflowToggledClass },
24294
        parts: {
24295
          button: externals['overflow-button'](),
24296
          toolbar: externals.overflow()
24297
        }
24298
      }));
24299
      return {
24300
        uid: detail.uid,
24301
        dom: detail.dom,
24302
        components: components,
24303
        behaviours: augment(detail.splitToolbarBehaviours, [Coupling.config({
24304
            others: {
24305
              overflowGroup: function () {
24306
                return ToolbarGroup.sketch(__assign(__assign({}, externals['overflow-group']()), { items: [memFloatingToolbarButton.asSpec()] }));
24307
              }
24308
            }
24309
          })]),
24310
        apis: {
24311
          setGroups: function (toolbar, groups) {
637 daniel-mar 24312
            detail.builtGroups.set(map$2(groups, toolbar.getSystem().build));
597 daniel-mar 24313
            refresh$1(toolbar, memFloatingToolbarButton, detail);
24314
          },
24315
          refresh: function (toolbar) {
24316
            return refresh$1(toolbar, memFloatingToolbarButton, detail);
24317
          },
24318
          toggle: function (toolbar) {
24319
            memFloatingToolbarButton.getOpt(toolbar).each(function (floatingToolbarButton) {
24320
              FloatingToolbarButton.toggle(floatingToolbarButton);
24321
            });
24322
          },
24323
          isOpen: function (toolbar) {
24324
            return memFloatingToolbarButton.getOpt(toolbar).map(FloatingToolbarButton.isOpen).getOr(false);
24325
          },
24326
          reposition: function (toolbar) {
24327
            memFloatingToolbarButton.getOpt(toolbar).each(function (floatingToolbarButton) {
24328
              FloatingToolbarButton.reposition(floatingToolbarButton);
24329
            });
24330
          },
24331
          getOverflow: function (toolbar) {
24332
            return memFloatingToolbarButton.getOpt(toolbar).bind(FloatingToolbarButton.getToolbar);
24333
          }
24334
        },
24335
        domModification: { attributes: { role: 'group' } }
24336
      };
24337
    };
637 daniel-mar 24338
    var SplitFloatingToolbar = composite({
597 daniel-mar 24339
      name: 'SplitFloatingToolbar',
637 daniel-mar 24340
      configFields: schema$b(),
24341
      partFields: parts$7(),
24342
      factory: factory$8,
597 daniel-mar 24343
      apis: {
24344
        setGroups: function (apis, toolbar, groups) {
24345
          apis.setGroups(toolbar, groups);
24346
        },
24347
        refresh: function (apis, toolbar) {
24348
          apis.refresh(toolbar);
24349
        },
24350
        reposition: function (apis, toolbar) {
24351
          apis.reposition(toolbar);
24352
        },
24353
        toggle: function (apis, toolbar) {
24354
          apis.toggle(toolbar);
24355
        },
24356
        isOpen: function (apis, toolbar) {
24357
          return apis.isOpen(toolbar);
24358
        },
24359
        getOverflow: function (apis, toolbar) {
24360
          return apis.getOverflow(toolbar);
24361
        }
24362
      }
24363
    });
24364
 
637 daniel-mar 24365
    var schema$8 = constant$1([
24366
      markers$1([
597 daniel-mar 24367
        'closedClass',
24368
        'openClass',
24369
        'shrinkingClass',
24370
        'growingClass',
24371
        'overflowToggledClass'
24372
      ]),
24373
      onHandler('onOpened'),
24374
      onHandler('onClosed')
637 daniel-mar 24375
    ].concat(schema$c()));
24376
    var parts$4 = constant$1([
597 daniel-mar 24377
      required({
24378
        factory: Toolbar,
637 daniel-mar 24379
        schema: schema$e(),
597 daniel-mar 24380
        name: 'primary'
24381
      }),
24382
      required({
24383
        factory: Toolbar,
637 daniel-mar 24384
        schema: schema$e(),
597 daniel-mar 24385
        name: 'overflow',
24386
        overrides: function (detail) {
24387
          return {
24388
            toolbarBehaviours: derive$1([
24389
              Sliding.config({
24390
                dimension: { property: 'height' },
24391
                closedClass: detail.markers.closedClass,
24392
                openClass: detail.markers.openClass,
24393
                shrinkingClass: detail.markers.shrinkingClass,
24394
                growingClass: detail.markers.growingClass,
24395
                onShrunk: function (comp) {
24396
                  getPart(comp, detail, 'overflow-button').each(function (button) {
24397
                    Toggling.off(button);
24398
                    Focusing.focus(button);
24399
                  });
24400
                  detail.onClosed(comp);
24401
                },
24402
                onGrown: function (comp) {
24403
                  Keying.focusIn(comp);
24404
                  detail.onOpened(comp);
24405
                },
24406
                onStartGrow: function (comp) {
24407
                  getPart(comp, detail, 'overflow-button').each(Toggling.on);
24408
                }
24409
              }),
24410
              Keying.config({
24411
                mode: 'acyclic',
24412
                onEscape: function (comp) {
24413
                  getPart(comp, detail, 'overflow-button').each(Focusing.focus);
24414
                  return Optional.some(true);
24415
                }
24416
              })
24417
            ])
24418
          };
24419
        }
24420
      }),
24421
      external$1({
24422
        name: 'overflow-button',
24423
        overrides: function (detail) {
24424
          return {
24425
            buttonBehaviours: derive$1([Toggling.config({
24426
                toggleClass: detail.markers.overflowToggledClass,
24427
                aria: { mode: 'pressed' },
24428
                toggleOnExecute: false
24429
              })])
24430
          };
24431
        }
24432
      }),
24433
      external$1({ name: 'overflow-group' })
24434
    ]);
24435
 
637 daniel-mar 24436
    var isOpen = function (toolbar, detail) {
597 daniel-mar 24437
      return getPart(toolbar, detail, 'overflow').map(Sliding.hasGrown).getOr(false);
24438
    };
24439
    var toggleToolbar = function (toolbar, detail) {
24440
      getPart(toolbar, detail, 'overflow-button').bind(function () {
24441
        return getPart(toolbar, detail, 'overflow');
24442
      }).each(function (overf) {
637 daniel-mar 24443
        refresh(toolbar, detail);
597 daniel-mar 24444
        Sliding.toggleGrow(overf);
24445
      });
24446
    };
637 daniel-mar 24447
    var refresh = function (toolbar, detail) {
597 daniel-mar 24448
      getPart(toolbar, detail, 'overflow').each(function (overflow) {
637 daniel-mar 24449
        refresh$2(toolbar, detail, function (groups) {
24450
          var builtGroups = map$2(groups, function (g) {
24451
            return premade(g);
597 daniel-mar 24452
          });
24453
          Toolbar.setGroups(overflow, builtGroups);
24454
        });
24455
        getPart(toolbar, detail, 'overflow-button').each(function (button) {
24456
          if (Sliding.hasGrown(overflow)) {
24457
            Toggling.on(button);
24458
          }
24459
        });
24460
        Sliding.refresh(overflow);
24461
      });
24462
    };
637 daniel-mar 24463
    var factory$7 = function (detail, components, spec, externals) {
597 daniel-mar 24464
      var toolbarToggleEvent = 'alloy.toolbar.toggle';
24465
      var doSetGroups = function (toolbar, groups) {
637 daniel-mar 24466
        var built = map$2(groups, toolbar.getSystem().build);
597 daniel-mar 24467
        detail.builtGroups.set(built);
24468
      };
24469
      return {
24470
        uid: detail.uid,
24471
        dom: detail.dom,
24472
        components: components,
24473
        behaviours: augment(detail.splitToolbarBehaviours, [
24474
          Coupling.config({
24475
            others: {
24476
              overflowGroup: function (toolbar) {
24477
                return ToolbarGroup.sketch(__assign(__assign({}, externals['overflow-group']()), {
24478
                  items: [Button.sketch(__assign(__assign({}, externals['overflow-button']()), {
24479
                      action: function (_button) {
24480
                        emit(toolbar, toolbarToggleEvent);
24481
                      }
24482
                    }))]
24483
                }));
24484
              }
24485
            }
24486
          }),
637 daniel-mar 24487
          config('toolbar-toggle-events', [run$1(toolbarToggleEvent, function (toolbar) {
597 daniel-mar 24488
              toggleToolbar(toolbar, detail);
24489
            })])
24490
        ]),
24491
        apis: {
24492
          setGroups: function (toolbar, groups) {
24493
            doSetGroups(toolbar, groups);
637 daniel-mar 24494
            refresh(toolbar, detail);
597 daniel-mar 24495
          },
24496
          refresh: function (toolbar) {
637 daniel-mar 24497
            return refresh(toolbar, detail);
597 daniel-mar 24498
          },
24499
          toggle: function (toolbar) {
24500
            return toggleToolbar(toolbar, detail);
24501
          },
24502
          isOpen: function (toolbar) {
637 daniel-mar 24503
            return isOpen(toolbar, detail);
597 daniel-mar 24504
          }
24505
        },
24506
        domModification: { attributes: { role: 'group' } }
24507
      };
24508
    };
637 daniel-mar 24509
    var SplitSlidingToolbar = composite({
597 daniel-mar 24510
      name: 'SplitSlidingToolbar',
637 daniel-mar 24511
      configFields: schema$8(),
24512
      partFields: parts$4(),
24513
      factory: factory$7,
597 daniel-mar 24514
      apis: {
24515
        setGroups: function (apis, toolbar, groups) {
24516
          apis.setGroups(toolbar, groups);
24517
        },
24518
        refresh: function (apis, toolbar) {
24519
          apis.refresh(toolbar);
24520
        },
24521
        toggle: function (apis, toolbar) {
24522
          apis.toggle(toolbar);
24523
        },
24524
        isOpen: function (apis, toolbar) {
24525
          return apis.isOpen(toolbar);
24526
        }
24527
      }
24528
    });
24529
 
24530
    var renderToolbarGroupCommon = function (toolbarGroup) {
24531
      var attributes = toolbarGroup.title.fold(function () {
24532
        return {};
24533
      }, function (title) {
24534
        return { attributes: { title: title } };
24535
      });
24536
      return {
24537
        dom: __assign({
24538
          tag: 'div',
24539
          classes: ['tox-toolbar__group']
24540
        }, attributes),
24541
        components: [ToolbarGroup.parts.items({})],
24542
        items: toolbarGroup.items,
24543
        markers: { itemSelector: '*:not(.tox-split-button) > .tox-tbtn:not([disabled]), ' + '.tox-split-button:not([disabled]), ' + '.tox-toolbar-nav-js:not([disabled])' },
24544
        tgroupBehaviours: derive$1([
24545
          Tabstopping.config({}),
24546
          Focusing.config({})
24547
        ])
24548
      };
24549
    };
24550
    var renderToolbarGroup = function (toolbarGroup) {
24551
      return ToolbarGroup.sketch(renderToolbarGroupCommon(toolbarGroup));
24552
    };
24553
    var getToolbarbehaviours = function (toolbarSpec, modeName) {
24554
      var onAttached = runOnAttached(function (component) {
637 daniel-mar 24555
        var groups = map$2(toolbarSpec.initGroups, renderToolbarGroup);
597 daniel-mar 24556
        Toolbar.setGroups(component, groups);
24557
      });
24558
      return derive$1([
24559
        DisablingConfigs.toolbarButton(toolbarSpec.providers.isDisabled),
24560
        receivingConfig(),
24561
        Keying.config({
24562
          mode: modeName,
24563
          onEscape: toolbarSpec.onEscape,
24564
          selector: '.tox-toolbar__group'
24565
        }),
24566
        config('toolbar-events', [onAttached])
24567
      ]);
24568
    };
24569
    var renderMoreToolbarCommon = function (toolbarSpec) {
24570
      var modeName = toolbarSpec.cyclicKeying ? 'cyclic' : 'acyclic';
24571
      return {
24572
        uid: toolbarSpec.uid,
24573
        dom: {
24574
          tag: 'div',
24575
          classes: ['tox-toolbar-overlord']
24576
        },
24577
        parts: {
24578
          'overflow-group': renderToolbarGroupCommon({
24579
            title: Optional.none(),
24580
            items: []
24581
          }),
24582
          'overflow-button': renderIconButtonSpec({
24583
            name: 'more',
24584
            icon: Optional.some('more-drawer'),
24585
            disabled: false,
24586
            tooltip: Optional.some('More...'),
24587
            primary: false,
24588
            borderless: false
24589
          }, Optional.none(), toolbarSpec.providers)
24590
        },
24591
        splitToolbarBehaviours: getToolbarbehaviours(toolbarSpec, modeName)
24592
      };
24593
    };
24594
    var renderFloatingMoreToolbar = function (toolbarSpec) {
24595
      var baseSpec = renderMoreToolbarCommon(toolbarSpec);
24596
      var overflowXOffset = 4;
24597
      var primary = SplitFloatingToolbar.parts.primary({
24598
        dom: {
24599
          tag: 'div',
24600
          classes: ['tox-toolbar__primary']
24601
        }
24602
      });
24603
      return SplitFloatingToolbar.sketch(__assign(__assign({}, baseSpec), {
24604
        lazySink: toolbarSpec.getSink,
24605
        getOverflowBounds: function () {
24606
          var headerElem = toolbarSpec.moreDrawerData.lazyHeader().element;
637 daniel-mar 24607
          var headerBounds = absolute$2(headerElem);
597 daniel-mar 24608
          var docElem = documentElement(headerElem);
637 daniel-mar 24609
          var docBounds = absolute$2(docElem);
597 daniel-mar 24610
          var height = Math.max(docElem.dom.scrollHeight, docBounds.height);
637 daniel-mar 24611
          return bounds(headerBounds.x + overflowXOffset, docBounds.y, headerBounds.width - overflowXOffset * 2, height);
597 daniel-mar 24612
        },
24613
        parts: __assign(__assign({}, baseSpec.parts), {
24614
          overflow: {
24615
            dom: {
24616
              tag: 'div',
24617
              classes: ['tox-toolbar__overflow'],
24618
              attributes: toolbarSpec.attributes
24619
            }
24620
          }
24621
        }),
24622
        components: [primary],
24623
        markers: { overflowToggledClass: 'tox-tbtn--enabled' }
24624
      }));
24625
    };
24626
    var renderSlidingMoreToolbar = function (toolbarSpec) {
24627
      var primary = SplitSlidingToolbar.parts.primary({
24628
        dom: {
24629
          tag: 'div',
24630
          classes: ['tox-toolbar__primary']
24631
        }
24632
      });
24633
      var overflow = SplitSlidingToolbar.parts.overflow({
24634
        dom: {
24635
          tag: 'div',
24636
          classes: ['tox-toolbar__overflow']
24637
        }
24638
      });
24639
      var baseSpec = renderMoreToolbarCommon(toolbarSpec);
24640
      return SplitSlidingToolbar.sketch(__assign(__assign({}, baseSpec), {
24641
        components: [
24642
          primary,
24643
          overflow
24644
        ],
24645
        markers: {
24646
          openClass: 'tox-toolbar__overflow--open',
24647
          closedClass: 'tox-toolbar__overflow--closed',
24648
          growingClass: 'tox-toolbar__overflow--growing',
24649
          shrinkingClass: 'tox-toolbar__overflow--shrinking',
24650
          overflowToggledClass: 'tox-tbtn--enabled'
24651
        },
24652
        onOpened: function (comp) {
24653
          comp.getSystem().broadcastOn([toolbarHeightChange()], { type: 'opened' });
24654
        },
24655
        onClosed: function (comp) {
24656
          comp.getSystem().broadcastOn([toolbarHeightChange()], { type: 'closed' });
24657
        }
24658
      }));
24659
    };
24660
    var renderToolbar = function (toolbarSpec) {
24661
      var modeName = toolbarSpec.cyclicKeying ? 'cyclic' : 'acyclic';
24662
      return Toolbar.sketch({
24663
        uid: toolbarSpec.uid,
24664
        dom: {
24665
          tag: 'div',
24666
          classes: ['tox-toolbar'].concat(toolbarSpec.type === ToolbarMode.scrolling ? ['tox-toolbar--scrolling'] : [])
24667
        },
24668
        components: [Toolbar.parts.groups({})],
24669
        toolbarBehaviours: getToolbarbehaviours(toolbarSpec, modeName)
24670
      });
24671
    };
24672
 
637 daniel-mar 24673
    var factory$6 = function (detail, components, _spec) {
24674
      var apis = {
24675
        getSocket: function (comp) {
24676
          return parts$a.getPart(comp, detail, 'socket');
24677
        },
24678
        setSidebar: function (comp, panelConfigs) {
24679
          parts$a.getPart(comp, detail, 'sidebar').each(function (sidebar) {
24680
            return setSidebar(sidebar, panelConfigs);
597 daniel-mar 24681
          });
637 daniel-mar 24682
        },
24683
        toggleSidebar: function (comp, name) {
24684
          parts$a.getPart(comp, detail, 'sidebar').each(function (sidebar) {
24685
            return toggleSidebar(sidebar, name);
24686
          });
24687
        },
24688
        whichSidebar: function (comp) {
24689
          return parts$a.getPart(comp, detail, 'sidebar').bind(whichSidebar).getOrNull();
24690
        },
24691
        getHeader: function (comp) {
24692
          return parts$a.getPart(comp, detail, 'header');
24693
        },
24694
        getToolbar: function (comp) {
24695
          return parts$a.getPart(comp, detail, 'toolbar');
24696
        },
24697
        setToolbar: function (comp, groups) {
24698
          parts$a.getPart(comp, detail, 'toolbar').each(function (toolbar) {
24699
            toolbar.getApis().setGroups(toolbar, groups);
24700
          });
24701
        },
24702
        setToolbars: function (comp, toolbars) {
24703
          parts$a.getPart(comp, detail, 'multiple-toolbar').each(function (mToolbar) {
24704
            CustomList.setItems(mToolbar, toolbars);
24705
          });
24706
        },
24707
        refreshToolbar: function (comp) {
24708
          var toolbar = parts$a.getPart(comp, detail, 'toolbar');
24709
          toolbar.each(function (toolbar) {
24710
            return toolbar.getApis().refresh(toolbar);
24711
          });
24712
        },
24713
        toggleToolbarDrawer: function (comp) {
24714
          parts$a.getPart(comp, detail, 'toolbar').each(function (toolbar) {
24715
            mapFrom(toolbar.getApis().toggle, function (toggle) {
24716
              return toggle(toolbar);
597 daniel-mar 24717
            });
637 daniel-mar 24718
          });
597 daniel-mar 24719
        },
637 daniel-mar 24720
        isToolbarDrawerToggled: function (comp) {
24721
          return parts$a.getPart(comp, detail, 'toolbar').bind(function (toolbar) {
24722
            return Optional.from(toolbar.getApis().isOpen).map(function (isOpen) {
24723
              return isOpen(toolbar);
24724
            });
24725
          }).getOr(false);
24726
        },
24727
        getThrobber: function (comp) {
24728
          return parts$a.getPart(comp, detail, 'throbber');
24729
        },
24730
        focusToolbar: function (comp) {
24731
          var optToolbar = parts$a.getPart(comp, detail, 'toolbar').orThunk(function () {
24732
            return parts$a.getPart(comp, detail, 'multiple-toolbar');
597 daniel-mar 24733
          });
637 daniel-mar 24734
          optToolbar.each(function (toolbar) {
24735
            Keying.focusIn(toolbar);
24736
          });
24737
        },
24738
        setMenubar: function (comp, menus) {
24739
          parts$a.getPart(comp, detail, 'menubar').each(function (menubar) {
24740
            SilverMenubar.setMenus(menubar, menus);
24741
          });
24742
        },
24743
        focusMenubar: function (comp) {
24744
          parts$a.getPart(comp, detail, 'menubar').each(function (menubar) {
24745
            SilverMenubar.focus(menubar);
24746
          });
597 daniel-mar 24747
        }
24748
      };
24749
      return {
24750
        uid: detail.uid,
24751
        dom: detail.dom,
24752
        components: components,
24753
        apis: apis,
637 daniel-mar 24754
        behaviours: detail.behaviours
597 daniel-mar 24755
      };
24756
    };
637 daniel-mar 24757
    var partMenubar = partType.optional({
24758
      factory: SilverMenubar,
24759
      name: 'menubar',
24760
      schema: [required$1('backstage')]
24761
    });
24762
    var toolbarFactory = function (spec) {
24763
      if (spec.type === ToolbarMode.sliding) {
24764
        return renderSlidingMoreToolbar;
24765
      } else if (spec.type === ToolbarMode.floating) {
24766
        return renderFloatingMoreToolbar;
24767
      } else {
24768
        return renderToolbar;
24769
      }
24770
    };
24771
    var partMultipleToolbar = partType.optional({
24772
      factory: {
24773
        sketch: function (spec) {
24774
          return CustomList.sketch({
24775
            uid: spec.uid,
24776
            dom: spec.dom,
24777
            listBehaviours: derive$1([Keying.config({
24778
                mode: 'acyclic',
24779
                selector: '.tox-toolbar'
24780
              })]),
24781
            makeItem: function () {
24782
              return renderToolbar({
24783
                type: spec.type,
24784
                uid: generate$6('multiple-toolbar-item'),
24785
                cyclicKeying: false,
24786
                initGroups: [],
24787
                providers: spec.providers,
24788
                onEscape: function () {
24789
                  spec.onEscape();
24790
                  return Optional.some(true);
24791
                }
24792
              });
24793
            },
24794
            setupItem: function (_mToolbar, tc, data, _index) {
24795
              Toolbar.setGroups(tc, data);
24796
            },
24797
            shell: true
24798
          });
597 daniel-mar 24799
        }
637 daniel-mar 24800
      },
24801
      name: 'multiple-toolbar',
24802
      schema: [
24803
        required$1('dom'),
24804
        required$1('onEscape')
24805
      ]
597 daniel-mar 24806
    });
637 daniel-mar 24807
    var partToolbar = partType.optional({
24808
      factory: {
24809
        sketch: function (spec) {
24810
          var renderer = toolbarFactory(spec);
24811
          var toolbarSpec = {
24812
            type: spec.type,
24813
            uid: spec.uid,
24814
            onEscape: function () {
24815
              spec.onEscape();
24816
              return Optional.some(true);
24817
            },
24818
            cyclicKeying: false,
24819
            initGroups: [],
24820
            getSink: spec.getSink,
24821
            providers: spec.providers,
24822
            moreDrawerData: {
24823
              lazyToolbar: spec.lazyToolbar,
24824
              lazyMoreButton: spec.lazyMoreButton,
24825
              lazyHeader: spec.lazyHeader
24826
            },
24827
            attributes: spec.attributes
24828
          };
24829
          return renderer(toolbarSpec);
597 daniel-mar 24830
        }
637 daniel-mar 24831
      },
24832
      name: 'toolbar',
24833
      schema: [
24834
        required$1('dom'),
24835
        required$1('onEscape'),
24836
        required$1('getSink')
24837
      ]
24838
    });
24839
    var partHeader = partType.optional({
24840
      factory: { sketch: renderHeader },
24841
      name: 'header',
24842
      schema: [required$1('dom')]
24843
    });
24844
    var partSocket = partType.optional({
24845
      name: 'socket',
24846
      schema: [required$1('dom')]
24847
    });
24848
    var partSidebar = partType.optional({
24849
      factory: { sketch: renderSidebar },
24850
      name: 'sidebar',
24851
      schema: [required$1('dom')]
24852
    });
24853
    var partThrobber = partType.optional({
24854
      factory: { sketch: renderThrobber },
24855
      name: 'throbber',
24856
      schema: [required$1('dom')]
24857
    });
24858
    var OuterContainer = composite({
24859
      name: 'OuterContainer',
24860
      factory: factory$6,
24861
      configFields: [
24862
        required$1('dom'),
24863
        required$1('behaviours')
24864
      ],
24865
      partFields: [
24866
        partHeader,
24867
        partMenubar,
24868
        partToolbar,
24869
        partMultipleToolbar,
24870
        partSocket,
24871
        partSidebar,
24872
        partThrobber
24873
      ],
24874
      apis: {
24875
        getSocket: function (apis, comp) {
24876
          return apis.getSocket(comp);
597 daniel-mar 24877
        },
637 daniel-mar 24878
        setSidebar: function (apis, comp, panelConfigs) {
24879
          apis.setSidebar(comp, panelConfigs);
597 daniel-mar 24880
        },
637 daniel-mar 24881
        toggleSidebar: function (apis, comp, name) {
24882
          apis.toggleSidebar(comp, name);
597 daniel-mar 24883
        },
637 daniel-mar 24884
        whichSidebar: function (apis, comp) {
24885
          return apis.whichSidebar(comp);
24886
        },
24887
        getHeader: function (apis, comp) {
24888
          return apis.getHeader(comp);
24889
        },
24890
        getToolbar: function (apis, comp) {
24891
          return apis.getToolbar(comp);
24892
        },
24893
        setToolbar: function (apis, comp, grps) {
24894
          var groups = map$2(grps, function (grp) {
24895
            return renderToolbarGroup(grp);
24896
          });
24897
          apis.setToolbar(comp, groups);
24898
        },
24899
        setToolbars: function (apis, comp, ts) {
24900
          var renderedToolbars = map$2(ts, function (g) {
24901
            return map$2(g, renderToolbarGroup);
24902
          });
24903
          apis.setToolbars(comp, renderedToolbars);
24904
        },
24905
        refreshToolbar: function (apis, comp) {
24906
          return apis.refreshToolbar(comp);
24907
        },
24908
        toggleToolbarDrawer: function (apis, comp) {
24909
          apis.toggleToolbarDrawer(comp);
24910
        },
24911
        isToolbarDrawerToggled: function (apis, comp) {
24912
          return apis.isToolbarDrawerToggled(comp);
24913
        },
24914
        getThrobber: function (apis, comp) {
24915
          return apis.getThrobber(comp);
24916
        },
24917
        setMenubar: function (apis, comp, menus) {
24918
          apis.setMenubar(comp, menus);
24919
        },
24920
        focusMenubar: function (apis, comp) {
24921
          apis.focusMenubar(comp);
24922
        },
24923
        focusToolbar: function (apis, comp) {
24924
          apis.focusToolbar(comp);
597 daniel-mar 24925
        }
637 daniel-mar 24926
      }
24927
    });
24928
 
24929
    var defaultMenubar = 'file edit view insert format tools table help';
24930
    var defaultMenus = {
24931
      file: {
24932
        title: 'File',
24933
        items: 'newdocument restoredraft | preview | export print | deleteallconversations'
24934
      },
24935
      edit: {
24936
        title: 'Edit',
24937
        items: 'undo redo | cut copy paste pastetext | selectall | searchreplace'
24938
      },
24939
      view: {
24940
        title: 'View',
24941
        items: 'code | visualaid visualchars visualblocks | spellchecker | preview fullscreen | showcomments'
24942
      },
24943
      insert: {
24944
        title: 'Insert',
24945
        items: 'image link media addcomment pageembed template codesample inserttable | charmap emoticons hr | pagebreak nonbreaking anchor toc | insertdatetime'
24946
      },
24947
      format: {
24948
        title: 'Format',
24949
        items: 'bold italic underline strikethrough superscript subscript codeformat | formats blockformats fontformats fontsizes align lineheight | forecolor backcolor | language | removeformat'
24950
      },
24951
      tools: {
24952
        title: 'Tools',
24953
        items: 'spellchecker spellcheckerlanguage | a11ycheck code wordcount'
24954
      },
24955
      table: {
24956
        title: 'Table',
24957
        items: 'inserttable | cell row column | advtablesort | tableprops deletetable'
24958
      },
24959
      help: {
24960
        title: 'Help',
24961
        items: 'help'
24962
      }
597 daniel-mar 24963
    };
637 daniel-mar 24964
    var make = function (menu, registry, editor) {
24965
      var removedMenuItems = getRemovedMenuItems(editor).split(/[ ,]/);
597 daniel-mar 24966
      return {
637 daniel-mar 24967
        text: menu.title,
24968
        getItems: function () {
24969
          return bind$3(menu.items, function (i) {
24970
            var itemName = i.toLowerCase();
24971
            if (itemName.trim().length === 0) {
24972
              return [];
24973
            } else if (exists(removedMenuItems, function (removedMenuItem) {
24974
                return removedMenuItem === itemName;
24975
              })) {
24976
              return [];
24977
            } else if (itemName === 'separator' || itemName === '|') {
24978
              return [{ type: 'separator' }];
24979
            } else if (registry.menuItems[itemName]) {
24980
              return [registry.menuItems[itemName]];
24981
            } else {
24982
              return [];
597 daniel-mar 24983
            }
24984
          });
637 daniel-mar 24985
        }
597 daniel-mar 24986
      };
24987
    };
637 daniel-mar 24988
    var parseItemsString = function (items) {
24989
      if (typeof items === 'string') {
24990
        return items.split(' ');
24991
      }
24992
      return items;
24993
    };
24994
    var identifyMenus = function (editor, registry) {
24995
      var rawMenuData = __assign(__assign({}, defaultMenus), registry.menus);
24996
      var userDefinedMenus = keys(registry.menus).length > 0;
24997
      var menubar = registry.menubar === undefined || registry.menubar === true ? parseItemsString(defaultMenubar) : parseItemsString(registry.menubar === false ? '' : registry.menubar);
24998
      var validMenus = filter$2(menubar, function (menuName) {
24999
        var isDefaultMenu = has$2(defaultMenus, menuName);
25000
        if (userDefinedMenus) {
25001
          return isDefaultMenu || get$e(registry.menus, menuName).exists(function (menu) {
25002
            return has$2(menu, 'items');
597 daniel-mar 25003
          });
637 daniel-mar 25004
        } else {
25005
          return isDefaultMenu;
597 daniel-mar 25006
        }
25007
      });
637 daniel-mar 25008
      var menus = map$2(validMenus, function (menuName) {
25009
        var menuData = rawMenuData[menuName];
25010
        return make({
25011
          title: menuData.title,
25012
          items: parseItemsString(menuData.items)
25013
        }, registry, editor);
597 daniel-mar 25014
      });
637 daniel-mar 25015
      return filter$2(menus, function (menu) {
25016
        var isNotSeparator = function (item) {
25017
          return item.type !== 'separator';
597 daniel-mar 25018
        };
637 daniel-mar 25019
        return menu.getItems().length > 0 && exists(menu.getItems(), isNotSeparator);
597 daniel-mar 25020
      });
25021
    };
25022
 
637 daniel-mar 25023
    var fireSkinLoaded = function (editor) {
25024
      var done = function () {
25025
        editor._skinLoaded = true;
25026
        fireSkinLoaded$1(editor);
25027
      };
25028
      return function () {
25029
        if (editor.initialized) {
25030
          done();
25031
        } else {
25032
          editor.on('init', done);
597 daniel-mar 25033
        }
25034
      };
25035
    };
637 daniel-mar 25036
    var fireSkinLoadError = function (editor, err) {
25037
      return function () {
25038
        return fireSkinLoadError$1(editor, { message: err });
597 daniel-mar 25039
      };
25040
    };
25041
 
637 daniel-mar 25042
    var loadStylesheet = function (editor, stylesheetUrl, styleSheetLoader) {
679 daniel-mar 25043
      return new global$c(function (resolve, reject) {
637 daniel-mar 25044
        styleSheetLoader.load(stylesheetUrl, resolve, reject);
25045
        editor.on('remove', function () {
25046
          return styleSheetLoader.unload(stylesheetUrl);
25047
        });
597 daniel-mar 25048
      });
25049
    };
637 daniel-mar 25050
    var loadUiSkins = function (editor, skinUrl) {
25051
      var skinUiCss = skinUrl + '/skin.min.css';
25052
      return loadStylesheet(editor, skinUiCss, editor.ui.styleSheetLoader);
597 daniel-mar 25053
    };
637 daniel-mar 25054
    var loadShadowDomUiSkins = function (editor, skinUrl) {
25055
      var isInShadowRoot$1 = isInShadowRoot(SugarElement.fromDom(editor.getElement()));
25056
      if (isInShadowRoot$1) {
25057
        var shadowDomSkinCss = skinUrl + '/skin.shadowdom.min.css';
679 daniel-mar 25058
        return loadStylesheet(editor, shadowDomSkinCss, global$b.DOM.styleSheetLoader);
637 daniel-mar 25059
      } else {
679 daniel-mar 25060
        return global$c.resolve();
637 daniel-mar 25061
      }
597 daniel-mar 25062
    };
637 daniel-mar 25063
    var loadSkin = function (isInline, editor) {
25064
      var skinUrl = getSkinUrl(editor);
25065
      if (skinUrl) {
25066
        editor.contentCSS.push(skinUrl + (isInline ? '/content.inline' : '/content') + '.min.css');
597 daniel-mar 25067
      }
637 daniel-mar 25068
      if (isSkinDisabled(editor) === false && isString(skinUrl)) {
679 daniel-mar 25069
        global$c.all([
637 daniel-mar 25070
          loadUiSkins(editor, skinUrl),
25071
          loadShadowDomUiSkins(editor, skinUrl)
25072
        ]).then(fireSkinLoaded(editor), fireSkinLoadError(editor, 'Skin could not be loaded'));
597 daniel-mar 25073
      } else {
637 daniel-mar 25074
        fireSkinLoaded(editor)();
597 daniel-mar 25075
      }
25076
    };
637 daniel-mar 25077
    var iframe = curry(loadSkin, false);
25078
    var inline = curry(loadSkin, true);
597 daniel-mar 25079
 
637 daniel-mar 25080
    var onSetupFormatToggle = function (editor, name) {
25081
      return function (api) {
25082
        var boundCallback = unbindable();
25083
        var init = function () {
25084
          api.setActive(editor.formatter.match(name));
25085
          var binding = editor.formatter.formatChanged(name, api.setActive);
25086
          boundCallback.set(binding);
25087
        };
25088
        editor.initialized ? init() : editor.once('init', init);
25089
        return function () {
25090
          editor.off('init', init);
25091
          boundCallback.clear();
25092
        };
597 daniel-mar 25093
      };
25094
    };
637 daniel-mar 25095
    var onSetupEvent = function (editor, event, f) {
25096
      return function (api) {
25097
        var handleEvent = function () {
25098
          return f(api);
597 daniel-mar 25099
        };
637 daniel-mar 25100
        var init = function () {
25101
          f(api);
25102
          editor.on(event, handleEvent);
597 daniel-mar 25103
        };
637 daniel-mar 25104
        editor.initialized ? init() : editor.once('init', init);
25105
        return function () {
25106
          editor.off('init', init);
25107
          editor.off(event, handleEvent);
25108
        };
25109
      };
597 daniel-mar 25110
    };
637 daniel-mar 25111
    var onActionToggleFormat$1 = function (editor) {
25112
      return function (rawItem) {
25113
        return function () {
25114
          editor.undoManager.transact(function () {
25115
            editor.focus();
25116
            editor.execCommand('mceToggleFormat', false, rawItem.format);
597 daniel-mar 25117
          });
25118
        };
25119
      };
25120
    };
637 daniel-mar 25121
    var onActionExecCommand = function (editor, command) {
25122
      return function () {
25123
        return editor.execCommand(command);
597 daniel-mar 25124
      };
25125
    };
25126
 
25127
    var generateSelectItems = function (_editor, backstage, spec) {
25128
      var generateItem = function (rawItem, response, disabled, value) {
25129
        var translatedText = backstage.shared.providers.translate(rawItem.title);
25130
        if (rawItem.type === 'separator') {
25131
          return Optional.some({
25132
            type: 'separator',
25133
            text: translatedText
25134
          });
25135
        } else if (rawItem.type === 'submenu') {
637 daniel-mar 25136
          var items = bind$3(rawItem.getStyleItems(), function (si) {
597 daniel-mar 25137
            return validate(si, response, value);
25138
          });
25139
          if (response === 0 && items.length <= 0) {
25140
            return Optional.none();
25141
          } else {
25142
            return Optional.some({
25143
              type: 'nestedmenuitem',
25144
              text: translatedText,
25145
              disabled: items.length <= 0,
25146
              getSubmenuItems: function () {
637 daniel-mar 25147
                return bind$3(rawItem.getStyleItems(), function (si) {
597 daniel-mar 25148
                  return validate(si, response, value);
25149
                });
25150
              }
25151
            });
25152
          }
25153
        } else {
25154
          return Optional.some(__assign({
25155
            type: 'togglemenuitem',
25156
            text: translatedText,
25157
            icon: rawItem.icon,
25158
            active: rawItem.isSelected(value),
25159
            disabled: disabled,
25160
            onAction: spec.onAction(rawItem)
25161
          }, rawItem.getStylePreview().fold(function () {
25162
            return {};
25163
          }, function (preview) {
25164
            return { meta: { style: preview } };
25165
          })));
25166
        }
25167
      };
25168
      var validate = function (item, response, value) {
25169
        var invalid = item.type === 'formatter' && spec.isInvalid(item);
25170
        if (response === 0) {
25171
          return invalid ? [] : generateItem(item, response, false, value).toArray();
25172
        } else {
25173
          return generateItem(item, response, invalid, value).toArray();
25174
        }
25175
      };
25176
      var validateItems = function (preItems) {
25177
        var value = spec.getCurrentValue();
25178
        var response = spec.shouldHide ? 0 : 1;
637 daniel-mar 25179
        return bind$3(preItems, function (item) {
597 daniel-mar 25180
          return validate(item, response, value);
25181
        });
25182
      };
25183
      var getFetch = function (backstage, getStyleItems) {
25184
        return function (comp, callback) {
25185
          var preItems = getStyleItems();
25186
          var items = validateItems(preItems);
637 daniel-mar 25187
          var menu = build(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, false);
597 daniel-mar 25188
          callback(menu);
25189
        };
25190
      };
25191
      return {
25192
        validateItems: validateItems,
25193
        getFetch: getFetch
25194
      };
25195
    };
25196
    var createMenuItems = function (editor, backstage, spec) {
25197
      var dataset = spec.dataset;
25198
      var getStyleItems = dataset.type === 'basic' ? function () {
637 daniel-mar 25199
        return map$2(dataset.data, function (d) {
597 daniel-mar 25200
          return processBasic(d, spec.isSelectedFor, spec.getPreviewFor);
25201
        });
25202
      } : dataset.getData;
25203
      return {
25204
        items: generateSelectItems(editor, backstage, spec),
25205
        getStyleItems: getStyleItems
25206
      };
25207
    };
25208
    var createSelectButton = function (editor, backstage, spec) {
25209
      var _a = createMenuItems(editor, backstage, spec), items = _a.items, getStyleItems = _a.getStyleItems;
25210
      var getApi = function (comp) {
637 daniel-mar 25211
        return { getComponent: constant$1(comp) };
597 daniel-mar 25212
      };
637 daniel-mar 25213
      var onSetup = onSetupEvent(editor, 'NodeChange', function (api) {
25214
        var comp = api.getComponent();
25215
        spec.updateText(comp);
25216
      });
597 daniel-mar 25217
      return renderCommonDropdown({
637 daniel-mar 25218
        text: spec.icon.isSome() ? Optional.none() : spec.text,
597 daniel-mar 25219
        icon: spec.icon,
25220
        tooltip: Optional.from(spec.tooltip),
25221
        role: Optional.none(),
25222
        fetch: items.getFetch(backstage, getStyleItems),
25223
        onSetup: onSetup,
25224
        getApi: getApi,
25225
        columns: 1,
25226
        presets: 'normal',
25227
        classes: spec.icon.isSome() ? [] : ['bespoke'],
25228
        dropdownBehaviours: []
25229
      }, 'tox-tbtn', backstage.shared);
25230
    };
25231
 
25232
    var process = function (rawFormats) {
637 daniel-mar 25233
      return map$2(rawFormats, function (item) {
597 daniel-mar 25234
        var title = item, format = item;
25235
        var values = item.split('=');
25236
        if (values.length > 1) {
25237
          title = values[0];
25238
          format = values[1];
25239
        }
25240
        return {
25241
          title: title,
25242
          format: format
25243
        };
25244
      });
25245
    };
25246
    var buildBasicStaticDataset = function (data) {
25247
      return {
25248
        type: 'basic',
25249
        data: data
25250
      };
25251
    };
25252
    var Delimiter;
25253
    (function (Delimiter) {
25254
      Delimiter[Delimiter['SemiColon'] = 0] = 'SemiColon';
25255
      Delimiter[Delimiter['Space'] = 1] = 'Space';
25256
    }(Delimiter || (Delimiter = {})));
25257
    var split = function (rawFormats, delimiter) {
25258
      if (delimiter === Delimiter.SemiColon) {
25259
        return rawFormats.replace(/;$/, '').split(';');
25260
      } else {
25261
        return rawFormats.split(' ');
25262
      }
25263
    };
25264
    var buildBasicSettingsDataset = function (editor, settingName, defaults, delimiter) {
25265
      var rawFormats = editor.getParam(settingName, defaults, 'string');
25266
      var data = process(split(rawFormats, delimiter));
25267
      return {
25268
        type: 'basic',
25269
        data: data
25270
      };
25271
    };
25272
 
25273
    var alignMenuItems = [
25274
      {
25275
        title: 'Left',
25276
        icon: 'align-left',
25277
        format: 'alignleft',
25278
        command: 'JustifyLeft'
25279
      },
25280
      {
25281
        title: 'Center',
25282
        icon: 'align-center',
25283
        format: 'aligncenter',
25284
        command: 'JustifyCenter'
25285
      },
25286
      {
25287
        title: 'Right',
25288
        icon: 'align-right',
25289
        format: 'alignright',
25290
        command: 'JustifyRight'
25291
      },
25292
      {
25293
        title: 'Justify',
25294
        icon: 'align-justify',
25295
        format: 'alignjustify',
25296
        command: 'JustifyFull'
25297
      }
25298
    ];
637 daniel-mar 25299
    var getSpec$4 = function (editor) {
597 daniel-mar 25300
      var getMatchingValue = function () {
637 daniel-mar 25301
        return find$5(alignMenuItems, function (item) {
597 daniel-mar 25302
          return editor.formatter.match(item.format);
25303
        });
25304
      };
25305
      var isSelectedFor = function (format) {
25306
        return function () {
25307
          return editor.formatter.match(format);
25308
        };
25309
      };
25310
      var getPreviewFor = function (_format) {
637 daniel-mar 25311
        return Optional.none;
597 daniel-mar 25312
      };
25313
      var updateSelectMenuIcon = function (comp) {
25314
        var match = getMatchingValue();
637 daniel-mar 25315
        var alignment = match.fold(constant$1('left'), function (item) {
597 daniel-mar 25316
          return item.title.toLowerCase();
25317
        });
25318
        emitWith(comp, updateMenuIcon, { icon: 'align-' + alignment });
25319
      };
25320
      var dataset = buildBasicStaticDataset(alignMenuItems);
25321
      var onAction = function (rawItem) {
25322
        return function () {
637 daniel-mar 25323
          return find$5(alignMenuItems, function (item) {
597 daniel-mar 25324
            return item.format === rawItem.format;
25325
          }).each(function (item) {
25326
            return editor.execCommand(item.command);
25327
          });
25328
        };
25329
      };
25330
      return {
25331
        tooltip: 'Align',
637 daniel-mar 25332
        text: Optional.none(),
597 daniel-mar 25333
        icon: Optional.some('align-left'),
25334
        isSelectedFor: isSelectedFor,
25335
        getCurrentValue: Optional.none,
25336
        getPreviewFor: getPreviewFor,
25337
        onAction: onAction,
25338
        updateText: updateSelectMenuIcon,
25339
        dataset: dataset,
25340
        shouldHide: false,
25341
        isInvalid: function (item) {
25342
          return !editor.formatter.canApply(item.format);
25343
        }
25344
      };
25345
    };
25346
    var createAlignSelect = function (editor, backstage) {
637 daniel-mar 25347
      return createSelectButton(editor, backstage, getSpec$4(editor));
597 daniel-mar 25348
    };
25349
    var alignSelectMenu = function (editor, backstage) {
637 daniel-mar 25350
      var menuItems = createMenuItems(editor, backstage, getSpec$4(editor));
597 daniel-mar 25351
      editor.ui.registry.addNestedMenuItem('align', {
25352
        text: backstage.shared.providers.translate('Align'),
25353
        getSubmenuItems: function () {
25354
          return menuItems.items.validateItems(menuItems.getStyleItems());
25355
        }
25356
      });
25357
    };
25358
 
25359
    var defaultFontsFormats = 'Andale Mono=andale mono,monospace;' + 'Arial=arial,helvetica,sans-serif;' + 'Arial Black=arial black,sans-serif;' + 'Book Antiqua=book antiqua,palatino,serif;' + 'Comic Sans MS=comic sans ms,sans-serif;' + 'Courier New=courier new,courier,monospace;' + 'Georgia=georgia,palatino,serif;' + 'Helvetica=helvetica,arial,sans-serif;' + 'Impact=impact,sans-serif;' + 'Symbol=symbol;' + 'Tahoma=tahoma,arial,helvetica,sans-serif;' + 'Terminal=terminal,monaco,monospace;' + 'Times New Roman=times new roman,times,serif;' + 'Trebuchet MS=trebuchet ms,geneva,sans-serif;' + 'Verdana=verdana,geneva,sans-serif;' + 'Webdings=webdings;' + 'Wingdings=wingdings,zapf dingbats';
25360
    var systemStackFonts = [
25361
      '-apple-system',
25362
      'Segoe UI',
25363
      'Roboto',
25364
      'Helvetica Neue',
25365
      'sans-serif'
25366
    ];
25367
    var splitFonts = function (fontFamily) {
25368
      var fonts = fontFamily.split(/\s*,\s*/);
637 daniel-mar 25369
      return map$2(fonts, function (font) {
597 daniel-mar 25370
        return font.replace(/^['"]+|['"]+$/g, '');
25371
      });
25372
    };
25373
    var isSystemFontStack = function (fontFamily) {
25374
      var matchesSystemStack = function () {
25375
        var fonts = splitFonts(fontFamily.toLowerCase());
25376
        return forall(systemStackFonts, function (font) {
25377
          return fonts.indexOf(font.toLowerCase()) > -1;
25378
        });
25379
      };
25380
      return fontFamily.indexOf('-apple-system') === 0 && matchesSystemStack();
25381
    };
637 daniel-mar 25382
    var getSpec$3 = function (editor) {
25383
      var systemFont = 'System Font';
597 daniel-mar 25384
      var getMatchingValue = function () {
25385
        var getFirstFont = function (fontFamily) {
25386
          return fontFamily ? splitFonts(fontFamily)[0] : '';
25387
        };
25388
        var fontFamily = editor.queryCommandValue('FontName');
25389
        var items = dataset.data;
25390
        var font = fontFamily ? fontFamily.toLowerCase() : '';
637 daniel-mar 25391
        var matchOpt = find$5(items, function (item) {
597 daniel-mar 25392
          var format = item.format;
25393
          return format.toLowerCase() === font || getFirstFont(format).toLowerCase() === getFirstFont(font).toLowerCase();
25394
        }).orThunk(function () {
637 daniel-mar 25395
          return someIf(isSystemFontStack(font), {
25396
            title: systemFont,
25397
            format: font
25398
          });
597 daniel-mar 25399
        });
25400
        return {
25401
          matchOpt: matchOpt,
25402
          font: fontFamily
25403
        };
25404
      };
25405
      var isSelectedFor = function (item) {
25406
        return function (valueOpt) {
25407
          return valueOpt.exists(function (value) {
25408
            return value.format === item;
25409
          });
25410
        };
25411
      };
25412
      var getCurrentValue = function () {
25413
        var matchOpt = getMatchingValue().matchOpt;
25414
        return matchOpt;
25415
      };
25416
      var getPreviewFor = function (item) {
25417
        return function () {
25418
          return Optional.some({
25419
            tag: 'div',
25420
            styles: item.indexOf('dings') === -1 ? { 'font-family': item } : {}
25421
          });
25422
        };
25423
      };
25424
      var onAction = function (rawItem) {
25425
        return function () {
25426
          editor.undoManager.transact(function () {
25427
            editor.focus();
25428
            editor.execCommand('FontName', false, rawItem.format);
25429
          });
25430
        };
25431
      };
25432
      var updateSelectMenuText = function (comp) {
25433
        var _a = getMatchingValue(), matchOpt = _a.matchOpt, font = _a.font;
637 daniel-mar 25434
        var text = matchOpt.fold(constant$1(font), function (item) {
597 daniel-mar 25435
          return item.title;
25436
        });
25437
        emitWith(comp, updateMenuText, { text: text });
25438
      };
25439
      var dataset = buildBasicSettingsDataset(editor, 'font_formats', defaultFontsFormats, Delimiter.SemiColon);
25440
      return {
25441
        tooltip: 'Fonts',
637 daniel-mar 25442
        text: Optional.some(systemFont),
597 daniel-mar 25443
        icon: Optional.none(),
25444
        isSelectedFor: isSelectedFor,
25445
        getCurrentValue: getCurrentValue,
25446
        getPreviewFor: getPreviewFor,
25447
        onAction: onAction,
25448
        updateText: updateSelectMenuText,
25449
        dataset: dataset,
25450
        shouldHide: false,
25451
        isInvalid: never
25452
      };
25453
    };
25454
    var createFontSelect = function (editor, backstage) {
637 daniel-mar 25455
      return createSelectButton(editor, backstage, getSpec$3(editor));
597 daniel-mar 25456
    };
25457
    var fontSelectMenu = function (editor, backstage) {
637 daniel-mar 25458
      var menuItems = createMenuItems(editor, backstage, getSpec$3(editor));
597 daniel-mar 25459
      editor.ui.registry.addNestedMenuItem('fontformats', {
25460
        text: backstage.shared.providers.translate('Fonts'),
25461
        getSubmenuItems: function () {
25462
          return menuItems.items.validateItems(menuItems.getStyleItems());
25463
        }
25464
      });
25465
    };
25466
 
25467
    var defaultFontsizeFormats = '8pt 10pt 12pt 14pt 18pt 24pt 36pt';
25468
    var legacyFontSizes = {
25469
      '8pt': '1',
25470
      '10pt': '2',
25471
      '12pt': '3',
25472
      '14pt': '4',
25473
      '18pt': '5',
25474
      '24pt': '6',
25475
      '36pt': '7'
25476
    };
25477
    var keywordFontSizes = {
25478
      'xx-small': '7pt',
25479
      'x-small': '8pt',
25480
      'small': '10pt',
25481
      'medium': '12pt',
25482
      'large': '14pt',
25483
      'x-large': '18pt',
25484
      'xx-large': '24pt'
25485
    };
637 daniel-mar 25486
    var round = function (number, precision) {
597 daniel-mar 25487
      var factor = Math.pow(10, precision);
25488
      return Math.round(number * factor) / factor;
25489
    };
25490
    var toPt = function (fontSize, precision) {
25491
      if (/[0-9.]+px$/.test(fontSize)) {
637 daniel-mar 25492
        return round(parseInt(fontSize, 10) * 72 / 96, precision || 0) + 'pt';
597 daniel-mar 25493
      } else {
637 daniel-mar 25494
        return get$e(keywordFontSizes, fontSize).getOr(fontSize);
597 daniel-mar 25495
      }
25496
    };
25497
    var toLegacy = function (fontSize) {
637 daniel-mar 25498
      return get$e(legacyFontSizes, fontSize).getOr('');
597 daniel-mar 25499
    };
25500
    var getSpec$2 = function (editor) {
25501
      var getMatchingValue = function () {
25502
        var matchOpt = Optional.none();
25503
        var items = dataset.data;
25504
        var fontSize = editor.queryCommandValue('FontSize');
25505
        if (fontSize) {
25506
          var _loop_1 = function (precision) {
25507
            var pt = toPt(fontSize, precision);
25508
            var legacy = toLegacy(pt);
637 daniel-mar 25509
            matchOpt = find$5(items, function (item) {
597 daniel-mar 25510
              return item.format === fontSize || item.format === pt || item.format === legacy;
25511
            });
25512
          };
25513
          for (var precision = 3; matchOpt.isNone() && precision >= 0; precision--) {
25514
            _loop_1(precision);
25515
          }
25516
        }
25517
        return {
25518
          matchOpt: matchOpt,
25519
          size: fontSize
25520
        };
25521
      };
25522
      var isSelectedFor = function (item) {
25523
        return function (valueOpt) {
25524
          return valueOpt.exists(function (value) {
25525
            return value.format === item;
25526
          });
25527
        };
25528
      };
25529
      var getCurrentValue = function () {
25530
        var matchOpt = getMatchingValue().matchOpt;
25531
        return matchOpt;
25532
      };
637 daniel-mar 25533
      var getPreviewFor = constant$1(Optional.none);
597 daniel-mar 25534
      var onAction = function (rawItem) {
25535
        return function () {
25536
          editor.undoManager.transact(function () {
25537
            editor.focus();
25538
            editor.execCommand('FontSize', false, rawItem.format);
25539
          });
25540
        };
25541
      };
25542
      var updateSelectMenuText = function (comp) {
25543
        var _a = getMatchingValue(), matchOpt = _a.matchOpt, size = _a.size;
637 daniel-mar 25544
        var text = matchOpt.fold(constant$1(size), function (match) {
597 daniel-mar 25545
          return match.title;
25546
        });
25547
        emitWith(comp, updateMenuText, { text: text });
25548
      };
25549
      var dataset = buildBasicSettingsDataset(editor, 'fontsize_formats', defaultFontsizeFormats, Delimiter.Space);
25550
      return {
25551
        tooltip: 'Font sizes',
637 daniel-mar 25552
        text: Optional.some('12pt'),
597 daniel-mar 25553
        icon: Optional.none(),
25554
        isSelectedFor: isSelectedFor,
25555
        getPreviewFor: getPreviewFor,
25556
        getCurrentValue: getCurrentValue,
25557
        onAction: onAction,
25558
        updateText: updateSelectMenuText,
25559
        dataset: dataset,
25560
        shouldHide: false,
25561
        isInvalid: never
25562
      };
25563
    };
25564
    var createFontsizeSelect = function (editor, backstage) {
25565
      return createSelectButton(editor, backstage, getSpec$2(editor));
25566
    };
25567
    var fontsizeSelectMenu = function (editor, backstage) {
25568
      var menuItems = createMenuItems(editor, backstage, getSpec$2(editor));
25569
      editor.ui.registry.addNestedMenuItem('fontsizes', {
25570
        text: 'Font sizes',
25571
        getSubmenuItems: function () {
25572
          return menuItems.items.validateItems(menuItems.getStyleItems());
25573
        }
25574
      });
25575
    };
25576
 
25577
    var findNearest = function (editor, getStyles) {
25578
      var styles = getStyles();
637 daniel-mar 25579
      var formats = map$2(styles, function (style) {
597 daniel-mar 25580
        return style.format;
25581
      });
25582
      return Optional.from(editor.formatter.closest(formats)).bind(function (fmt) {
637 daniel-mar 25583
        return find$5(styles, function (data) {
597 daniel-mar 25584
          return data.format === fmt;
25585
        });
25586
      }).orThunk(function () {
25587
        return someIf(editor.formatter.match('p'), {
25588
          title: 'Paragraph',
25589
          format: 'p'
25590
        });
25591
      });
25592
    };
25593
 
25594
    var defaultBlocks = 'Paragraph=p;' + 'Heading 1=h1;' + 'Heading 2=h2;' + 'Heading 3=h3;' + 'Heading 4=h4;' + 'Heading 5=h5;' + 'Heading 6=h6;' + 'Preformatted=pre';
637 daniel-mar 25595
    var getSpec$1 = function (editor) {
25596
      var fallbackFormat = 'Paragraph';
597 daniel-mar 25597
      var isSelectedFor = function (format) {
25598
        return function () {
25599
          return editor.formatter.match(format);
25600
        };
25601
      };
25602
      var getPreviewFor = function (format) {
25603
        return function () {
25604
          var fmt = editor.formatter.get(format);
25605
          return Optional.some({
25606
            tag: fmt.length > 0 ? fmt[0].inline || fmt[0].block || 'div' : 'div',
25607
            styles: editor.dom.parseStyle(editor.formatter.getCssText(format))
25608
          });
25609
        };
25610
      };
25611
      var updateSelectMenuText = function (comp) {
25612
        var detectedFormat = findNearest(editor, function () {
25613
          return dataset.data;
25614
        });
637 daniel-mar 25615
        var text = detectedFormat.fold(constant$1(fallbackFormat), function (fmt) {
597 daniel-mar 25616
          return fmt.title;
25617
        });
25618
        emitWith(comp, updateMenuText, { text: text });
25619
      };
25620
      var dataset = buildBasicSettingsDataset(editor, 'block_formats', defaultBlocks, Delimiter.SemiColon);
25621
      return {
25622
        tooltip: 'Blocks',
637 daniel-mar 25623
        text: Optional.some(fallbackFormat),
597 daniel-mar 25624
        icon: Optional.none(),
25625
        isSelectedFor: isSelectedFor,
25626
        getCurrentValue: Optional.none,
25627
        getPreviewFor: getPreviewFor,
637 daniel-mar 25628
        onAction: onActionToggleFormat$1(editor),
597 daniel-mar 25629
        updateText: updateSelectMenuText,
25630
        dataset: dataset,
25631
        shouldHide: false,
25632
        isInvalid: function (item) {
25633
          return !editor.formatter.canApply(item.format);
25634
        }
25635
      };
25636
    };
25637
    var createFormatSelect = function (editor, backstage) {
637 daniel-mar 25638
      return createSelectButton(editor, backstage, getSpec$1(editor));
597 daniel-mar 25639
    };
25640
    var formatSelectMenu = function (editor, backstage) {
637 daniel-mar 25641
      var menuItems = createMenuItems(editor, backstage, getSpec$1(editor));
597 daniel-mar 25642
      editor.ui.registry.addNestedMenuItem('blockformats', {
25643
        text: 'Blocks',
25644
        getSubmenuItems: function () {
25645
          return menuItems.items.validateItems(menuItems.getStyleItems());
25646
        }
25647
      });
25648
    };
25649
 
637 daniel-mar 25650
    var getSpec = function (editor, dataset) {
25651
      var fallbackFormat = 'Paragraph';
597 daniel-mar 25652
      var isSelectedFor = function (format) {
25653
        return function () {
25654
          return editor.formatter.match(format);
25655
        };
25656
      };
25657
      var getPreviewFor = function (format) {
25658
        return function () {
25659
          var fmt = editor.formatter.get(format);
25660
          return fmt !== undefined ? Optional.some({
25661
            tag: fmt.length > 0 ? fmt[0].inline || fmt[0].block || 'div' : 'div',
25662
            styles: editor.dom.parseStyle(editor.formatter.getCssText(format))
25663
          }) : Optional.none();
25664
        };
25665
      };
25666
      var updateSelectMenuText = function (comp) {
25667
        var getFormatItems = function (fmt) {
25668
          var subs = fmt.items;
637 daniel-mar 25669
          return subs !== undefined && subs.length > 0 ? bind$3(subs, getFormatItems) : [{
597 daniel-mar 25670
              title: fmt.title,
25671
              format: fmt.format
25672
            }];
25673
        };
637 daniel-mar 25674
        var flattenedItems = bind$3(getStyleFormats(editor), getFormatItems);
25675
        var detectedFormat = findNearest(editor, constant$1(flattenedItems));
25676
        var text = detectedFormat.fold(constant$1(fallbackFormat), function (fmt) {
597 daniel-mar 25677
          return fmt.title;
25678
        });
25679
        emitWith(comp, updateMenuText, { text: text });
25680
      };
25681
      return {
25682
        tooltip: 'Formats',
637 daniel-mar 25683
        text: Optional.some(fallbackFormat),
597 daniel-mar 25684
        icon: Optional.none(),
25685
        isSelectedFor: isSelectedFor,
25686
        getCurrentValue: Optional.none,
25687
        getPreviewFor: getPreviewFor,
637 daniel-mar 25688
        onAction: onActionToggleFormat$1(editor),
597 daniel-mar 25689
        updateText: updateSelectMenuText,
25690
        shouldHide: editor.getParam('style_formats_autohide', false, 'boolean'),
25691
        isInvalid: function (item) {
25692
          return !editor.formatter.canApply(item.format);
25693
        },
25694
        dataset: dataset
25695
      };
25696
    };
25697
    var createStyleSelect = function (editor, backstage) {
25698
      var dataset = __assign({ type: 'advanced' }, backstage.styleselect);
637 daniel-mar 25699
      return createSelectButton(editor, backstage, getSpec(editor, dataset));
597 daniel-mar 25700
    };
25701
    var styleSelectMenu = function (editor, backstage) {
25702
      var dataset = __assign({ type: 'advanced' }, backstage.styleselect);
637 daniel-mar 25703
      var menuItems = createMenuItems(editor, backstage, getSpec(editor, dataset));
597 daniel-mar 25704
      editor.ui.registry.addNestedMenuItem('formats', {
25705
        text: 'Formats',
25706
        getSubmenuItems: function () {
25707
          return menuItems.items.validateItems(menuItems.getStyleItems());
25708
        }
25709
      });
25710
    };
25711
 
637 daniel-mar 25712
    var events$3 = function (reflectingConfig, reflectingState) {
25713
      var update = function (component, data) {
25714
        reflectingConfig.updateState.each(function (updateState) {
25715
          var newState = updateState(component, data);
25716
          reflectingState.set(newState);
25717
        });
25718
        reflectingConfig.renderComponents.each(function (renderComponents) {
25719
          var newComponents = renderComponents(data, reflectingState.get());
25720
          var newChildren = map$2(newComponents, component.getSystem().build);
25721
          replaceChildren(component, newChildren);
25722
        });
25723
      };
25724
      return derive$2([
25725
        run$1(receive(), function (component, message) {
25726
          var receivingData = message;
25727
          if (!receivingData.universal) {
25728
            var channel = reflectingConfig.channel;
25729
            if (contains$2(receivingData.channels, channel)) {
25730
              update(component, receivingData.data);
25731
            }
25732
          }
25733
        }),
25734
        runOnAttached(function (comp, _se) {
25735
          reflectingConfig.initialData.each(function (rawData) {
25736
            update(comp, rawData);
25737
          });
25738
        })
25739
      ]);
25740
    };
25741
 
25742
    var ActiveReflecting = /*#__PURE__*/Object.freeze({
25743
        __proto__: null,
25744
        events: events$3
25745
    });
25746
 
25747
    var getState = function (component, replaceConfig, reflectState) {
25748
      return reflectState;
25749
    };
25750
 
25751
    var ReflectingApis = /*#__PURE__*/Object.freeze({
25752
        __proto__: null,
25753
        getState: getState
25754
    });
25755
 
25756
    var ReflectingSchema = [
25757
      required$1('channel'),
25758
      option('renderComponents'),
25759
      option('updateState'),
25760
      option('initialData')
25761
    ];
25762
 
25763
    var init$3 = function () {
25764
      var cell = Cell(Optional.none());
25765
      var clear = function () {
25766
        return cell.set(Optional.none());
25767
      };
25768
      var readState = function () {
25769
        return cell.get().getOr('none');
25770
      };
25771
      return {
25772
        readState: readState,
25773
        get: cell.get,
25774
        set: cell.set,
25775
        clear: clear
25776
      };
25777
    };
25778
 
25779
    var ReflectingState = /*#__PURE__*/Object.freeze({
25780
        __proto__: null,
25781
        init: init$3
25782
    });
25783
 
25784
    var Reflecting = create$7({
25785
      fields: ReflectingSchema,
25786
      name: 'reflecting',
25787
      active: ActiveReflecting,
25788
      apis: ReflectingApis,
25789
      state: ReflectingState
25790
    });
25791
 
25792
    var schema$7 = constant$1([
25793
      required$1('toggleClass'),
25794
      required$1('fetch'),
25795
      onStrictHandler('onExecute'),
25796
      defaulted('getHotspot', Optional.some),
25797
      defaulted('getAnchorOverrides', constant$1({})),
25798
      schema$y(),
25799
      onStrictHandler('onItemExecute'),
25800
      option('lazySink'),
25801
      required$1('dom'),
25802
      onHandler('onOpen'),
25803
      field('splitDropdownBehaviours', [
25804
        Coupling,
25805
        Keying,
25806
        Focusing
25807
      ]),
25808
      defaulted('matchWidth', false),
25809
      defaulted('useMinWidth', false),
25810
      defaulted('eventOrder', {}),
25811
      option('role')
25812
    ].concat(sandboxFields()));
25813
    var arrowPart = required({
25814
      factory: Button,
25815
      schema: [required$1('dom')],
25816
      name: 'arrow',
25817
      defaults: function () {
25818
        return { buttonBehaviours: derive$1([Focusing.revoke()]) };
25819
      },
25820
      overrides: function (detail) {
25821
        return {
25822
          dom: {
25823
            tag: 'span',
25824
            attributes: { role: 'presentation' }
25825
          },
25826
          action: function (arrow) {
25827
            arrow.getSystem().getByUid(detail.uid).each(emitExecute);
25828
          },
25829
          buttonBehaviours: derive$1([Toggling.config({
25830
              toggleOnExecute: false,
25831
              toggleClass: detail.toggleClass
25832
            })])
25833
        };
25834
      }
25835
    });
25836
    var buttonPart = required({
25837
      factory: Button,
25838
      schema: [required$1('dom')],
25839
      name: 'button',
25840
      defaults: function () {
25841
        return { buttonBehaviours: derive$1([Focusing.revoke()]) };
25842
      },
25843
      overrides: function (detail) {
25844
        return {
25845
          dom: {
25846
            tag: 'span',
25847
            attributes: { role: 'presentation' }
25848
          },
25849
          action: function (btn) {
25850
            btn.getSystem().getByUid(detail.uid).each(function (splitDropdown) {
25851
              detail.onExecute(splitDropdown, btn);
25852
            });
25853
          }
25854
        };
25855
      }
25856
    });
25857
    var parts$3 = constant$1([
25858
      arrowPart,
25859
      buttonPart,
25860
      optional({
25861
        factory: {
25862
          sketch: function (spec) {
25863
            return {
25864
              uid: spec.uid,
25865
              dom: {
25866
                tag: 'span',
25867
                styles: { display: 'none' },
25868
                attributes: { 'aria-hidden': 'true' },
25869
                innerHtml: spec.text
25870
              }
25871
            };
25872
          }
25873
        },
25874
        schema: [required$1('text')],
25875
        name: 'aria-descriptor'
25876
      }),
25877
      external$1({
25878
        schema: [tieredMenuMarkers()],
25879
        name: 'menu',
25880
        defaults: function (detail) {
25881
          return {
25882
            onExecute: function (tmenu, item) {
25883
              tmenu.getSystem().getByUid(detail.uid).each(function (splitDropdown) {
25884
                detail.onItemExecute(splitDropdown, tmenu, item);
25885
              });
25886
            }
25887
          };
25888
        }
25889
      }),
25890
      partType$1()
25891
    ]);
25892
 
25893
    var factory$5 = function (detail, components, spec, externals) {
25894
      var _a;
25895
      var switchToMenu = function (sandbox) {
25896
        Composing.getCurrent(sandbox).each(function (current) {
25897
          Highlighting.highlightFirst(current);
25898
          Keying.focusIn(current);
25899
        });
25900
      };
25901
      var action = function (component) {
25902
        var onOpenSync = switchToMenu;
25903
        togglePopup(detail, identity$1, component, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop);
25904
      };
25905
      var openMenu = function (comp) {
25906
        action(comp);
25907
        return Optional.some(true);
25908
      };
25909
      var executeOnButton = function (comp) {
25910
        var button = getPartOrDie(comp, detail, 'button');
25911
        emitExecute(button);
25912
        return Optional.some(true);
25913
      };
25914
      var buttonEvents = __assign(__assign({}, derive$2([runOnAttached(function (component, _simulatedEvent) {
25915
          var ariaDescriptor = getPart(component, detail, 'aria-descriptor');
25916
          ariaDescriptor.each(function (descriptor) {
25917
            var descriptorId = generate$6('aria');
679 daniel-mar 25918
            set$8(descriptor.element, 'id', descriptorId);
25919
            set$8(component.element, 'aria-describedby', descriptorId);
637 daniel-mar 25920
          });
25921
        })])), events$a(Optional.some(action)));
25922
      var apis = {
25923
        repositionMenus: function (comp) {
25924
          if (Toggling.isOn(comp)) {
25925
            repositionMenus(comp);
25926
          }
25927
        }
25928
      };
25929
      return {
25930
        uid: detail.uid,
25931
        dom: detail.dom,
25932
        components: components,
25933
        apis: apis,
25934
        eventOrder: __assign(__assign({}, detail.eventOrder), (_a = {}, _a[execute$5()] = [
25935
          'disabling',
25936
          'toggling',
25937
          'alloy.base.behaviour'
25938
        ], _a)),
25939
        events: buttonEvents,
25940
        behaviours: augment(detail.splitDropdownBehaviours, [
25941
          Coupling.config({
25942
            others: {
25943
              sandbox: function (hotspot) {
25944
                var arrow = getPartOrDie(hotspot, detail, 'arrow');
25945
                var extras = {
25946
                  onOpen: function () {
25947
                    Toggling.on(arrow);
25948
                    Toggling.on(hotspot);
25949
                  },
25950
                  onClose: function () {
25951
                    Toggling.off(arrow);
25952
                    Toggling.off(hotspot);
25953
                  }
25954
                };
25955
                return makeSandbox$1(detail, hotspot, extras);
25956
              }
25957
            }
25958
          }),
25959
          Keying.config({
25960
            mode: 'special',
25961
            onSpace: executeOnButton,
25962
            onEnter: executeOnButton,
25963
            onDown: openMenu
25964
          }),
25965
          Focusing.config({}),
25966
          Toggling.config({
25967
            toggleOnExecute: false,
25968
            aria: { mode: 'expanded' }
25969
          })
25970
        ]),
25971
        domModification: {
25972
          attributes: {
25973
            'role': detail.role.getOr('button'),
25974
            'aria-haspopup': true
25975
          }
25976
        }
25977
      };
25978
    };
25979
    var SplitDropdown = composite({
25980
      name: 'SplitDropdown',
25981
      configFields: schema$7(),
25982
      partFields: parts$3(),
25983
      factory: factory$5,
25984
      apis: {
25985
        repositionMenus: function (apis, comp) {
25986
          return apis.repositionMenus(comp);
25987
        }
25988
      }
25989
    });
25990
 
25991
    var getButtonApi = function (component) {
25992
      return {
25993
        isDisabled: function () {
25994
          return Disabling.isDisabled(component);
25995
        },
25996
        setDisabled: function (state) {
25997
          return Disabling.set(component, state);
25998
        }
25999
      };
26000
    };
26001
    var getToggleApi = function (component) {
26002
      return {
26003
        setActive: function (state) {
26004
          Toggling.set(component, state);
26005
        },
26006
        isActive: function () {
26007
          return Toggling.isOn(component);
26008
        },
26009
        isDisabled: function () {
26010
          return Disabling.isDisabled(component);
26011
        },
26012
        setDisabled: function (state) {
26013
          return Disabling.set(component, state);
26014
        }
26015
      };
26016
    };
26017
    var getTooltipAttributes = function (tooltip, providersBackstage) {
26018
      return tooltip.map(function (tooltip) {
26019
        return {
26020
          'aria-label': providersBackstage.translate(tooltip),
26021
          'title': providersBackstage.translate(tooltip)
26022
        };
26023
      }).getOr({});
26024
    };
26025
    var focusButtonEvent = generate$6('focus-button');
26026
    var renderCommonStructure = function (icon, text, tooltip, receiver, behaviours, providersBackstage) {
26027
      var _d;
26028
      return {
26029
        dom: {
26030
          tag: 'button',
26031
          classes: ['tox-tbtn'].concat(text.isSome() ? ['tox-tbtn--select'] : []),
26032
          attributes: getTooltipAttributes(tooltip, providersBackstage)
26033
        },
26034
        components: componentRenderPipeline([
26035
          icon.map(function (iconName) {
26036
            return renderIconFromPack(iconName, providersBackstage.icons);
26037
          }),
26038
          text.map(function (text) {
26039
            return renderLabel$1(text, 'tox-tbtn', providersBackstage);
26040
          })
26041
        ]),
26042
        eventOrder: (_d = {}, _d[mousedown()] = [
26043
          'focusing',
26044
          'alloy.base.behaviour',
26045
          'common-button-display-events'
26046
        ], _d),
26047
        buttonBehaviours: derive$1([
26048
          DisablingConfigs.toolbarButton(providersBackstage.isDisabled),
26049
          receivingConfig(),
26050
          config('common-button-display-events', [run$1(mousedown(), function (button, se) {
26051
              se.event.prevent();
26052
              emit(button, focusButtonEvent);
26053
            })])
26054
        ].concat(receiver.map(function (r) {
26055
          return Reflecting.config({
26056
            channel: r,
26057
            initialData: {
26058
              icon: icon,
26059
              text: text
26060
            },
26061
            renderComponents: function (data, _state) {
26062
              return componentRenderPipeline([
26063
                data.icon.map(function (iconName) {
26064
                  return renderIconFromPack(iconName, providersBackstage.icons);
26065
                }),
26066
                data.text.map(function (text) {
26067
                  return renderLabel$1(text, 'tox-tbtn', providersBackstage);
26068
                })
26069
              ]);
26070
            }
26071
          });
26072
        }).toArray()).concat(behaviours.getOr([])))
26073
      };
26074
    };
26075
    var renderFloatingToolbarButton = function (spec, backstage, identifyButtons, attributes) {
26076
      var sharedBackstage = backstage.shared;
26077
      return FloatingToolbarButton.sketch({
26078
        lazySink: sharedBackstage.getSink,
26079
        fetch: function () {
26080
          return Future.nu(function (resolve) {
26081
            resolve(map$2(identifyButtons(spec.items), renderToolbarGroup));
26082
          });
26083
        },
26084
        markers: { toggledClass: 'tox-tbtn--enabled' },
26085
        parts: {
26086
          button: renderCommonStructure(spec.icon, spec.text, spec.tooltip, Optional.none(), Optional.none(), sharedBackstage.providers),
26087
          toolbar: {
26088
            dom: {
26089
              tag: 'div',
26090
              classes: ['tox-toolbar__overflow'],
26091
              attributes: attributes
26092
            }
26093
          }
26094
        }
26095
      });
26096
    };
26097
    var renderCommonToolbarButton = function (spec, specialisation, providersBackstage) {
26098
      var editorOffCell = Cell(noop);
26099
      var structure = renderCommonStructure(spec.icon, spec.text, spec.tooltip, Optional.none(), Optional.none(), providersBackstage);
26100
      return Button.sketch({
26101
        dom: structure.dom,
26102
        components: structure.components,
26103
        eventOrder: toolbarButtonEventOrder,
26104
        buttonBehaviours: derive$1([
26105
          config('toolbar-button-events', [
26106
            onToolbarButtonExecute({
26107
              onAction: spec.onAction,
26108
              getApi: specialisation.getApi
26109
            }),
26110
            onControlAttached(specialisation, editorOffCell),
26111
            onControlDetached(specialisation, editorOffCell)
26112
          ]),
26113
          DisablingConfigs.toolbarButton(function () {
26114
            return spec.disabled || providersBackstage.isDisabled();
26115
          }),
26116
          receivingConfig()
26117
        ].concat(specialisation.toolbarButtonBehaviours))
26118
      });
26119
    };
26120
    var renderToolbarButton = function (spec, providersBackstage) {
26121
      return renderToolbarButtonWith(spec, providersBackstage, []);
26122
    };
26123
    var renderToolbarButtonWith = function (spec, providersBackstage, bonusEvents) {
26124
      return renderCommonToolbarButton(spec, {
26125
        toolbarButtonBehaviours: [].concat(bonusEvents.length > 0 ? [config('toolbarButtonWith', bonusEvents)] : []),
26126
        getApi: getButtonApi,
26127
        onSetup: spec.onSetup
26128
      }, providersBackstage);
26129
    };
26130
    var renderToolbarToggleButton = function (spec, providersBackstage) {
26131
      return renderToolbarToggleButtonWith(spec, providersBackstage, []);
26132
    };
26133
    var renderToolbarToggleButtonWith = function (spec, providersBackstage, bonusEvents) {
26134
      return deepMerge(renderCommonToolbarButton(spec, {
26135
        toolbarButtonBehaviours: [
26136
          Replacing.config({}),
26137
          Toggling.config({
26138
            toggleClass: 'tox-tbtn--enabled',
26139
            aria: { mode: 'pressed' },
26140
            toggleOnExecute: false
26141
          })
26142
        ].concat(bonusEvents.length > 0 ? [config('toolbarToggleButtonWith', bonusEvents)] : []),
26143
        getApi: getToggleApi,
26144
        onSetup: spec.onSetup
26145
      }, providersBackstage));
26146
    };
26147
    var fetchChoices = function (getApi, spec, providersBackstage) {
26148
      return function (comp) {
26149
        return Future.nu(function (callback) {
26150
          return spec.fetch(callback);
26151
        }).map(function (items) {
26152
          return Optional.from(createTieredDataFrom(deepMerge(createPartialChoiceMenu(generate$6('menu-value'), items, function (value) {
26153
            spec.onItemAction(getApi(comp), value);
26154
          }, spec.columns, spec.presets, ItemResponse$1.CLOSE_ON_EXECUTE, spec.select.getOr(never), providersBackstage), {
26155
            movement: deriveMenuMovement(spec.columns, spec.presets),
26156
            menuBehaviours: SimpleBehaviours.unnamedEvents(spec.columns !== 'auto' ? [] : [runOnAttached(function (comp, _se) {
26157
                detectSize(comp, 4, classForPreset(spec.presets)).each(function (_d) {
26158
                  var numRows = _d.numRows, numColumns = _d.numColumns;
26159
                  Keying.setGridSize(comp, numRows, numColumns);
26160
                });
26161
              })])
26162
          })));
26163
        });
26164
      };
26165
    };
26166
    var renderSplitButton = function (spec, sharedBackstage) {
26167
      var _d;
26168
      var displayChannel = generate$6('channel-update-split-dropdown-display');
26169
      var getApi = function (comp) {
26170
        return {
26171
          isDisabled: function () {
26172
            return Disabling.isDisabled(comp);
26173
          },
26174
          setDisabled: function (state) {
26175
            return Disabling.set(comp, state);
26176
          },
26177
          setIconFill: function (id, value) {
26178
            descendant(comp.element, 'svg path[id="' + id + '"], rect[id="' + id + '"]').each(function (underlinePath) {
679 daniel-mar 26179
              set$8(underlinePath, 'fill', value);
637 daniel-mar 26180
            });
26181
          },
26182
          setIconStroke: function (id, value) {
26183
            descendant(comp.element, 'svg path[id="' + id + '"], rect[id="' + id + '"]').each(function (underlinePath) {
679 daniel-mar 26184
              set$8(underlinePath, 'stroke', value);
637 daniel-mar 26185
            });
26186
          },
26187
          setActive: function (state) {
679 daniel-mar 26188
            set$8(comp.element, 'aria-pressed', state);
637 daniel-mar 26189
            descendant(comp.element, 'span').each(function (button) {
26190
              comp.getSystem().getByDom(button).each(function (buttonComp) {
26191
                return Toggling.set(buttonComp, state);
26192
              });
26193
            });
26194
          },
26195
          isActive: function () {
26196
            return descendant(comp.element, 'span').exists(function (button) {
26197
              return comp.getSystem().getByDom(button).exists(Toggling.isOn);
26198
            });
26199
          }
26200
        };
26201
      };
26202
      var editorOffCell = Cell(noop);
26203
      var specialisation = {
26204
        getApi: getApi,
26205
        onSetup: spec.onSetup
26206
      };
26207
      return SplitDropdown.sketch({
26208
        dom: {
26209
          tag: 'div',
26210
          classes: ['tox-split-button'],
26211
          attributes: __assign({ 'aria-pressed': false }, getTooltipAttributes(spec.tooltip, sharedBackstage.providers))
26212
        },
26213
        onExecute: function (button) {
26214
          spec.onAction(getApi(button));
26215
        },
26216
        onItemExecute: function (_a, _b, _c) {
26217
        },
26218
        splitDropdownBehaviours: derive$1([
26219
          DisablingConfigs.splitButton(sharedBackstage.providers.isDisabled),
26220
          receivingConfig(),
26221
          config('split-dropdown-events', [
26222
            run$1(focusButtonEvent, Focusing.focus),
26223
            onControlAttached(specialisation, editorOffCell),
26224
            onControlDetached(specialisation, editorOffCell)
26225
          ]),
26226
          Unselecting.config({})
26227
        ]),
26228
        eventOrder: (_d = {}, _d[attachedToDom()] = [
26229
          'alloy.base.behaviour',
26230
          'split-dropdown-events'
26231
        ], _d),
26232
        toggleClass: 'tox-tbtn--enabled',
26233
        lazySink: sharedBackstage.getSink,
26234
        fetch: fetchChoices(getApi, spec, sharedBackstage.providers),
26235
        parts: { menu: part(false, spec.columns, spec.presets) },
26236
        components: [
26237
          SplitDropdown.parts.button(renderCommonStructure(spec.icon, spec.text, Optional.none(), Optional.some(displayChannel), Optional.some([Toggling.config({
26238
              toggleClass: 'tox-tbtn--enabled',
26239
              toggleOnExecute: false
26240
            })]), sharedBackstage.providers)),
26241
          SplitDropdown.parts.arrow({
26242
            dom: {
26243
              tag: 'button',
26244
              classes: [
26245
                'tox-tbtn',
26246
                'tox-split-button__chevron'
26247
              ],
26248
              innerHtml: get$1('chevron-down', sharedBackstage.providers.icons)
26249
            },
26250
            buttonBehaviours: derive$1([
26251
              DisablingConfigs.splitButton(sharedBackstage.providers.isDisabled),
26252
              receivingConfig(),
26253
              addFocusableBehaviour()
26254
            ])
26255
          }),
26256
          SplitDropdown.parts['aria-descriptor']({ text: sharedBackstage.providers.translate('To open the popup, press Shift+Enter') })
26257
        ]
26258
      });
26259
    };
26260
 
597 daniel-mar 26261
    var defaultToolbar = [
26262
      {
26263
        name: 'history',
26264
        items: [
26265
          'undo',
26266
          'redo'
26267
        ]
26268
      },
26269
      {
26270
        name: 'styles',
26271
        items: ['styleselect']
26272
      },
26273
      {
26274
        name: 'formatting',
26275
        items: [
26276
          'bold',
26277
          'italic'
26278
        ]
26279
      },
26280
      {
26281
        name: 'alignment',
26282
        items: [
26283
          'alignleft',
26284
          'aligncenter',
26285
          'alignright',
26286
          'alignjustify'
26287
        ]
26288
      },
26289
      {
26290
        name: 'indentation',
26291
        items: [
26292
          'outdent',
26293
          'indent'
26294
        ]
26295
      },
26296
      {
26297
        name: 'permanent pen',
26298
        items: ['permanentpen']
26299
      },
26300
      {
26301
        name: 'comments',
26302
        items: ['addcomment']
26303
      }
26304
    ];
26305
    var renderFromBridge = function (bridgeBuilder, render) {
26306
      return function (spec, extras, editor) {
26307
        var internal = bridgeBuilder(spec).mapError(function (errInfo) {
26308
          return formatError(errInfo);
26309
        }).getOrDie();
26310
        return render(internal, extras, editor);
26311
      };
26312
    };
26313
    var types = {
26314
      button: renderFromBridge(createToolbarButton, function (s, extras) {
26315
        return renderToolbarButton(s, extras.backstage.shared.providers);
26316
      }),
26317
      togglebutton: renderFromBridge(createToggleButton, function (s, extras) {
26318
        return renderToolbarToggleButton(s, extras.backstage.shared.providers);
26319
      }),
26320
      menubutton: renderFromBridge(createMenuButton, function (s, extras) {
26321
        return renderMenuButton(s, 'tox-tbtn', extras.backstage, Optional.none());
26322
      }),
26323
      splitbutton: renderFromBridge(createSplitButton, function (s, extras) {
26324
        return renderSplitButton(s, extras.backstage.shared);
26325
      }),
26326
      grouptoolbarbutton: renderFromBridge(createGroupToolbarButton, function (s, extras, editor) {
26327
        var _a;
26328
        var buttons = editor.ui.registry.getAll().buttons;
26329
        var identify = function (toolbar) {
26330
          return identifyButtons(editor, {
26331
            buttons: buttons,
26332
            toolbar: toolbar,
26333
            allowToolbarGroups: false
26334
          }, extras, Optional.none());
26335
        };
26336
        var attributes = (_a = {}, _a[Attribute] = extras.backstage.shared.header.isPositionedAtTop() ? AttributeValue.TopToBottom : AttributeValue.BottomToTop, _a);
26337
        switch (getToolbarMode(editor)) {
26338
        case ToolbarMode.floating:
26339
          return renderFloatingToolbarButton(s, extras.backstage, identify, attributes);
26340
        default:
26341
          throw new Error('Toolbar groups are only supported when using floating toolbar mode');
26342
        }
26343
      }),
26344
      styleSelectButton: function (editor, extras) {
26345
        return createStyleSelect(editor, extras.backstage);
26346
      },
26347
      fontsizeSelectButton: function (editor, extras) {
26348
        return createFontsizeSelect(editor, extras.backstage);
26349
      },
26350
      fontSelectButton: function (editor, extras) {
26351
        return createFontSelect(editor, extras.backstage);
26352
      },
26353
      formatButton: function (editor, extras) {
26354
        return createFormatSelect(editor, extras.backstage);
26355
      },
26356
      alignMenuButton: function (editor, extras) {
26357
        return createAlignSelect(editor, extras.backstage);
26358
      }
26359
    };
26360
    var extractFrom = function (spec, extras, editor) {
637 daniel-mar 26361
      return get$e(types, spec.type).fold(function () {
597 daniel-mar 26362
        console.error('skipping button defined by', spec);
26363
        return Optional.none();
26364
      }, function (render) {
26365
        return Optional.some(render(spec, extras, editor));
26366
      });
26367
    };
26368
    var bespokeButtons = {
26369
      styleselect: types.styleSelectButton,
26370
      fontsizeselect: types.fontsizeSelectButton,
26371
      fontselect: types.fontSelectButton,
26372
      formatselect: types.formatButton,
26373
      align: types.alignMenuButton
26374
    };
26375
    var removeUnusedDefaults = function (buttons) {
637 daniel-mar 26376
      var filteredItemGroups = map$2(defaultToolbar, function (group) {
26377
        var items = filter$2(group.items, function (subItem) {
26378
          return has$2(buttons, subItem) || has$2(bespokeButtons, subItem);
597 daniel-mar 26379
        });
26380
        return {
26381
          name: group.name,
26382
          items: items
26383
        };
26384
      });
637 daniel-mar 26385
      return filter$2(filteredItemGroups, function (group) {
597 daniel-mar 26386
        return group.items.length > 0;
26387
      });
26388
    };
26389
    var convertStringToolbar = function (strToolbar) {
26390
      var groupsStrings = strToolbar.split('|');
637 daniel-mar 26391
      return map$2(groupsStrings, function (g) {
597 daniel-mar 26392
        return { items: g.trim().split(' ') };
26393
      });
26394
    };
26395
    var isToolbarGroupSettingArray = function (toolbar) {
26396
      return isArrayOf(toolbar, function (t) {
637 daniel-mar 26397
        return has$2(t, 'name') && has$2(t, 'items');
597 daniel-mar 26398
      });
26399
    };
26400
    var createToolbar = function (toolbarConfig) {
26401
      var toolbar = toolbarConfig.toolbar;
26402
      var buttons = toolbarConfig.buttons;
26403
      if (toolbar === false) {
26404
        return [];
26405
      } else if (toolbar === undefined || toolbar === true) {
26406
        return removeUnusedDefaults(buttons);
26407
      } else if (isString(toolbar)) {
26408
        return convertStringToolbar(toolbar);
26409
      } else if (isToolbarGroupSettingArray(toolbar)) {
26410
        return toolbar;
26411
      } else {
26412
        console.error('Toolbar type should be string, string[], boolean or ToolbarGroup[]');
26413
        return [];
26414
      }
26415
    };
26416
    var lookupButton = function (editor, buttons, toolbarItem, allowToolbarGroups, extras, prefixes) {
637 daniel-mar 26417
      return get$e(buttons, toolbarItem.toLowerCase()).orThunk(function () {
597 daniel-mar 26418
        return prefixes.bind(function (ps) {
26419
          return findMap(ps, function (prefix) {
637 daniel-mar 26420
            return get$e(buttons, prefix + toolbarItem.toLowerCase());
597 daniel-mar 26421
          });
26422
        });
26423
      }).fold(function () {
637 daniel-mar 26424
        return get$e(bespokeButtons, toolbarItem.toLowerCase()).map(function (r) {
597 daniel-mar 26425
          return r(editor, extras);
26426
        }).orThunk(function () {
26427
          return Optional.none();
26428
        });
26429
      }, function (spec) {
26430
        if (spec.type === 'grouptoolbarbutton' && !allowToolbarGroups) {
26431
          console.warn('Ignoring the \'' + toolbarItem + '\' toolbar button. Group toolbar buttons are only supported when using floating toolbar mode and cannot be nested.');
26432
          return Optional.none();
26433
        } else {
26434
          return extractFrom(spec, extras, editor);
26435
        }
26436
      });
26437
    };
26438
    var identifyButtons = function (editor, toolbarConfig, extras, prefixes) {
26439
      var toolbarGroups = createToolbar(toolbarConfig);
637 daniel-mar 26440
      var groups = map$2(toolbarGroups, function (group) {
26441
        var items = bind$3(group.items, function (toolbarItem) {
597 daniel-mar 26442
          return toolbarItem.trim().length === 0 ? [] : lookupButton(editor, toolbarConfig.buttons, toolbarItem, toolbarConfig.allowToolbarGroups, extras, prefixes).toArray();
26443
        });
26444
        return {
26445
          title: Optional.from(editor.translate(group.name)),
26446
          items: items
26447
        };
26448
      });
637 daniel-mar 26449
      return filter$2(groups, function (group) {
597 daniel-mar 26450
        return group.items.length > 0;
26451
      });
26452
    };
26453
 
26454
    var setToolbar = function (editor, uiComponents, rawUiConfig, backstage) {
26455
      var comp = uiComponents.outerContainer;
26456
      var toolbarConfig = rawUiConfig.toolbar;
26457
      var toolbarButtonsConfig = rawUiConfig.buttons;
26458
      if (isArrayOf(toolbarConfig, isString)) {
26459
        var toolbars = toolbarConfig.map(function (t) {
26460
          var config = {
26461
            toolbar: t,
26462
            buttons: toolbarButtonsConfig,
26463
            allowToolbarGroups: rawUiConfig.allowToolbarGroups
26464
          };
26465
          return identifyButtons(editor, config, { backstage: backstage }, Optional.none());
26466
        });
26467
        OuterContainer.setToolbars(comp, toolbars);
26468
      } else {
26469
        OuterContainer.setToolbar(comp, identifyButtons(editor, rawUiConfig, { backstage: backstage }, Optional.none()));
26470
      }
26471
    };
26472
 
637 daniel-mar 26473
    var detection = detect$1();
597 daniel-mar 26474
    var isiOS12 = detection.os.isiOS() && detection.os.version.major <= 12;
637 daniel-mar 26475
    var setupEvents$1 = function (editor, uiComponents) {
597 daniel-mar 26476
      var dom = editor.dom;
26477
      var contentWindow = editor.getWin();
26478
      var initialDocEle = editor.getDoc().documentElement;
26479
      var lastWindowDimensions = Cell(SugarPosition(contentWindow.innerWidth, contentWindow.innerHeight));
26480
      var lastDocumentDimensions = Cell(SugarPosition(initialDocEle.offsetWidth, initialDocEle.offsetHeight));
26481
      var resizeWindow = function () {
26482
        var outer = lastWindowDimensions.get();
26483
        if (outer.left !== contentWindow.innerWidth || outer.top !== contentWindow.innerHeight) {
26484
          lastWindowDimensions.set(SugarPosition(contentWindow.innerWidth, contentWindow.innerHeight));
26485
          fireResizeContent(editor);
26486
        }
26487
      };
26488
      var resizeDocument = function () {
26489
        var docEle = editor.getDoc().documentElement;
26490
        var inner = lastDocumentDimensions.get();
26491
        if (inner.left !== docEle.offsetWidth || inner.top !== docEle.offsetHeight) {
26492
          lastDocumentDimensions.set(SugarPosition(docEle.offsetWidth, docEle.offsetHeight));
26493
          fireResizeContent(editor);
26494
        }
26495
      };
26496
      var scroll = function (e) {
26497
        return fireScrollContent(editor, e);
26498
      };
26499
      dom.bind(contentWindow, 'resize', resizeWindow);
26500
      dom.bind(contentWindow, 'scroll', scroll);
637 daniel-mar 26501
      var elementLoad = capture(SugarElement.fromDom(editor.getBody()), 'load', resizeDocument);
597 daniel-mar 26502
      var mothership = uiComponents.uiMothership.element;
26503
      editor.on('hide', function () {
679 daniel-mar 26504
        set$7(mothership, 'display', 'none');
597 daniel-mar 26505
      });
26506
      editor.on('show', function () {
679 daniel-mar 26507
        remove$6(mothership, 'display');
597 daniel-mar 26508
      });
26509
      editor.on('NodeChange', resizeDocument);
26510
      editor.on('remove', function () {
26511
        elementLoad.unbind();
26512
        dom.unbind(contentWindow, 'resize', resizeWindow);
26513
        dom.unbind(contentWindow, 'scroll', scroll);
26514
        contentWindow = null;
26515
      });
26516
    };
26517
    var render$1 = function (editor, uiComponents, rawUiConfig, backstage, args) {
26518
      var lastToolbarWidth = Cell(0);
26519
      var outerContainer = uiComponents.outerContainer;
26520
      iframe(editor);
26521
      var eTargetNode = SugarElement.fromDom(args.targetNode);
26522
      var uiRoot = getContentContainer(getRootNode(eTargetNode));
26523
      attachSystemAfter(eTargetNode, uiComponents.mothership);
26524
      attachSystem(uiRoot, uiComponents.uiMothership);
26525
      editor.on('PostRender', function () {
26526
        setToolbar(editor, uiComponents, rawUiConfig, backstage);
26527
        lastToolbarWidth.set(editor.getWin().innerWidth);
26528
        OuterContainer.setMenubar(outerContainer, identifyMenus(editor, rawUiConfig));
26529
        OuterContainer.setSidebar(outerContainer, rawUiConfig.sidebar);
637 daniel-mar 26530
        setupEvents$1(editor, uiComponents);
597 daniel-mar 26531
      });
26532
      var socket = OuterContainer.getSocket(outerContainer).getOrDie('Could not find expected socket element');
26533
      if (isiOS12) {
637 daniel-mar 26534
        setAll(socket.element, {
597 daniel-mar 26535
          'overflow': 'scroll',
26536
          '-webkit-overflow-scrolling': 'touch'
26537
        });
26538
        var limit = first(function () {
26539
          editor.fire('ScrollContent');
26540
        }, 20);
637 daniel-mar 26541
        var unbinder = bind(socket.element, 'scroll', limit.throttle);
597 daniel-mar 26542
        editor.on('remove', unbinder.unbind);
26543
      }
26544
      setupReadonlyModeSwitch(editor, uiComponents);
26545
      editor.addCommand('ToggleSidebar', function (_ui, value) {
26546
        OuterContainer.toggleSidebar(outerContainer, value);
26547
        editor.fire('ToggleSidebar');
26548
      });
26549
      editor.addQueryValueHandler('ToggleSidebar', function () {
26550
        return OuterContainer.whichSidebar(outerContainer);
26551
      });
26552
      var toolbarMode = getToolbarMode(editor);
26553
      var refreshDrawer = function () {
26554
        OuterContainer.refreshToolbar(uiComponents.outerContainer);
26555
      };
26556
      if (toolbarMode === ToolbarMode.sliding || toolbarMode === ToolbarMode.floating) {
26557
        editor.on('ResizeWindow ResizeEditor ResizeContent', function () {
26558
          var width = editor.getWin().innerWidth;
26559
          if (width !== lastToolbarWidth.get()) {
26560
            refreshDrawer();
26561
            lastToolbarWidth.set(width);
26562
          }
26563
        });
26564
      }
26565
      var api = {
26566
        enable: function () {
26567
          broadcastReadonly(uiComponents, false);
26568
        },
26569
        disable: function () {
26570
          broadcastReadonly(uiComponents, true);
26571
        },
26572
        isDisabled: function () {
26573
          return Disabling.isDisabled(outerContainer);
26574
        }
26575
      };
26576
      return {
26577
        iframeContainer: socket.element.dom,
26578
        editorContainer: outerContainer.element.dom,
26579
        api: api
26580
      };
26581
    };
26582
 
26583
    var Iframe = /*#__PURE__*/Object.freeze({
26584
        __proto__: null,
26585
        render: render$1
26586
    });
26587
 
26588
    var parseToInt = function (val) {
26589
      var re = /^[0-9\.]+(|px)$/i;
26590
      if (re.test('' + val)) {
26591
        return Optional.some(parseInt('' + val, 10));
26592
      }
26593
      return Optional.none();
26594
    };
26595
    var numToPx = function (val) {
26596
      return isNumber(val) ? val + 'px' : val;
26597
    };
26598
    var calcCappedSize = function (size, minSize, maxSize) {
26599
      var minOverride = minSize.filter(function (min) {
26600
        return size < min;
26601
      });
26602
      var maxOverride = maxSize.filter(function (max) {
26603
        return size > max;
26604
      });
26605
      return minOverride.or(maxOverride).getOr(size);
26606
    };
26607
 
637 daniel-mar 26608
    var getHeight = function (editor) {
597 daniel-mar 26609
      var baseHeight = getHeightSetting(editor);
26610
      var minHeight = getMinHeightSetting(editor);
26611
      var maxHeight = getMaxHeightSetting(editor);
26612
      return parseToInt(baseHeight).map(function (height) {
26613
        return calcCappedSize(height, minHeight, maxHeight);
26614
      });
26615
    };
26616
    var getHeightWithFallback = function (editor) {
637 daniel-mar 26617
      var height = getHeight(editor);
597 daniel-mar 26618
      return height.getOr(getHeightSetting(editor));
26619
    };
637 daniel-mar 26620
    var getWidth = function (editor) {
597 daniel-mar 26621
      var baseWidth = getWidthSetting(editor);
26622
      var minWidth = getMinWidthSetting(editor);
26623
      var maxWidth = getMaxWidthSetting(editor);
26624
      return parseToInt(baseWidth).map(function (width) {
26625
        return calcCappedSize(width, minWidth, maxWidth);
26626
      });
26627
    };
26628
    var getWidthWithFallback = function (editor) {
637 daniel-mar 26629
      var width = getWidth(editor);
597 daniel-mar 26630
      return width.getOr(getWidthSetting(editor));
26631
    };
26632
 
26633
    var InlineHeader = function (editor, targetElm, uiComponents, backstage, floatContainer) {
26634
      var uiMothership = uiComponents.uiMothership, outerContainer = uiComponents.outerContainer;
679 daniel-mar 26635
      var DOM = global$b.DOM;
597 daniel-mar 26636
      var useFixedToolbarContainer = useFixedContainer(editor);
26637
      var isSticky = isStickyToolbar(editor);
637 daniel-mar 26638
      var editorMaxWidthOpt = getMaxWidthSetting(editor).or(getWidth(editor));
597 daniel-mar 26639
      var headerBackstage = backstage.shared.header;
26640
      var isPositionedAtTop = headerBackstage.isPositionedAtTop;
26641
      var toolbarMode = getToolbarMode(editor);
26642
      var isSplitToolbar = toolbarMode === ToolbarMode.sliding || toolbarMode === ToolbarMode.floating;
26643
      var visible = Cell(false);
26644
      var isVisible = function () {
26645
        return visible.get() && !editor.removed;
26646
      };
26647
      var calcToolbarOffset = function (toolbar) {
637 daniel-mar 26648
        return isSplitToolbar ? toolbar.fold(constant$1(0), function (tbar) {
679 daniel-mar 26649
          return tbar.components().length > 1 ? get$b(tbar.components()[1].element) : 0;
597 daniel-mar 26650
        }) : 0;
26651
      };
26652
      var calcMode = function (container) {
26653
        switch (getToolbarLocation(editor)) {
26654
        case ToolbarLocation.auto:
26655
          var toolbar_1 = OuterContainer.getToolbar(outerContainer);
26656
          var offset = calcToolbarOffset(toolbar_1);
679 daniel-mar 26657
          var toolbarHeight = get$b(container.element) - offset;
637 daniel-mar 26658
          var targetBounds = box$1(targetElm);
597 daniel-mar 26659
          var roomAtTop = targetBounds.y > toolbarHeight;
26660
          if (roomAtTop) {
26661
            return 'top';
26662
          } else {
26663
            var doc = documentElement(targetElm);
679 daniel-mar 26664
            var docHeight = Math.max(doc.dom.scrollHeight, get$b(doc));
597 daniel-mar 26665
            var roomAtBottom = targetBounds.bottom < docHeight - toolbarHeight;
26666
            if (roomAtBottom) {
26667
              return 'bottom';
26668
            } else {
26669
              var winBounds = win();
26670
              var isRoomAtBottomViewport = winBounds.bottom < targetBounds.bottom - toolbarHeight;
26671
              return isRoomAtBottomViewport ? 'bottom' : 'top';
26672
            }
26673
          }
26674
        case ToolbarLocation.bottom:
26675
          return 'bottom';
26676
        case ToolbarLocation.top:
26677
        default:
26678
          return 'top';
26679
        }
26680
      };
26681
      var setupMode = function (mode) {
26682
        var container = floatContainer.get();
26683
        Docking.setModes(container, [mode]);
26684
        headerBackstage.setDockingMode(mode);
26685
        var verticalDir = isPositionedAtTop() ? AttributeValue.TopToBottom : AttributeValue.BottomToTop;
679 daniel-mar 26686
        set$8(container.element, Attribute, verticalDir);
597 daniel-mar 26687
      };
26688
      var updateChromeWidth = function () {
26689
        var maxWidth = editorMaxWidthOpt.getOrThunk(function () {
679 daniel-mar 26690
          var bodyMargin = parseToInt(get$c(body(), 'margin-left')).getOr(0);
26691
          return get$a(body()) - absolute$3(targetElm).left + bodyMargin;
597 daniel-mar 26692
        });
679 daniel-mar 26693
        set$7(floatContainer.get().element, 'max-width', maxWidth + 'px');
597 daniel-mar 26694
      };
26695
      var updateChromePosition = function () {
26696
        var toolbar = OuterContainer.getToolbar(outerContainer);
26697
        var offset = calcToolbarOffset(toolbar);
637 daniel-mar 26698
        var targetBounds = box$1(targetElm);
679 daniel-mar 26699
        var top = isPositionedAtTop() ? Math.max(targetBounds.y - get$b(floatContainer.get().element) + offset, 0) : targetBounds.bottom;
637 daniel-mar 26700
        setAll(outerContainer.element, {
597 daniel-mar 26701
          position: 'absolute',
26702
          top: Math.round(top) + 'px',
26703
          left: Math.round(targetBounds.x) + 'px'
26704
        });
26705
      };
26706
      var repositionPopups$1 = function () {
26707
        uiMothership.broadcastOn([repositionPopups()], {});
26708
      };
26709
      var updateChromeUi = function (resetDocking) {
26710
        if (resetDocking === void 0) {
26711
          resetDocking = false;
26712
        }
26713
        if (!isVisible()) {
26714
          return;
26715
        }
26716
        if (!useFixedToolbarContainer) {
26717
          updateChromeWidth();
26718
        }
26719
        if (isSplitToolbar) {
26720
          OuterContainer.refreshToolbar(outerContainer);
26721
        }
26722
        if (!useFixedToolbarContainer) {
26723
          updateChromePosition();
26724
        }
26725
        if (isSticky) {
26726
          var floatContainerComp = floatContainer.get();
26727
          resetDocking ? Docking.reset(floatContainerComp) : Docking.refresh(floatContainerComp);
26728
        }
26729
        repositionPopups$1();
26730
      };
26731
      var updateMode = function (updateUi) {
26732
        if (updateUi === void 0) {
26733
          updateUi = true;
26734
        }
26735
        if (useFixedToolbarContainer || !isSticky || !isVisible()) {
26736
          return;
26737
        }
26738
        var currentMode = headerBackstage.getDockingMode();
26739
        var newMode = calcMode(floatContainer.get());
26740
        if (newMode !== currentMode) {
26741
          setupMode(newMode);
26742
          if (updateUi) {
26743
            updateChromeUi(true);
26744
          }
26745
        }
26746
      };
26747
      var show = function () {
26748
        visible.set(true);
679 daniel-mar 26749
        set$7(outerContainer.element, 'display', 'flex');
597 daniel-mar 26750
        DOM.addClass(editor.getBody(), 'mce-edit-focus');
679 daniel-mar 26751
        remove$6(uiMothership.element, 'display');
597 daniel-mar 26752
        updateMode(false);
26753
        updateChromeUi();
26754
      };
26755
      var hide = function () {
26756
        visible.set(false);
26757
        if (uiComponents.outerContainer) {
679 daniel-mar 26758
          set$7(outerContainer.element, 'display', 'none');
597 daniel-mar 26759
          DOM.removeClass(editor.getBody(), 'mce-edit-focus');
26760
        }
679 daniel-mar 26761
        set$7(uiMothership.element, 'display', 'none');
597 daniel-mar 26762
      };
26763
      return {
26764
        isVisible: isVisible,
26765
        isPositionedAtTop: isPositionedAtTop,
26766
        show: show,
26767
        hide: hide,
26768
        update: updateChromeUi,
26769
        updateMode: updateMode,
26770
        repositionPopups: repositionPopups$1
26771
      };
26772
    };
26773
 
26774
    var getTargetPosAndBounds = function (targetElm, isToolbarTop) {
637 daniel-mar 26775
      var bounds = box$1(targetElm);
597 daniel-mar 26776
      return {
26777
        pos: isToolbarTop ? bounds.y : bounds.bottom,
26778
        bounds: bounds
26779
      };
26780
    };
637 daniel-mar 26781
    var setupEvents = function (editor, targetElm, ui, toolbarPersist) {
597 daniel-mar 26782
      var prevPosAndBounds = Cell(getTargetPosAndBounds(targetElm, ui.isPositionedAtTop()));
26783
      var resizeContent = function (e) {
26784
        var _a = getTargetPosAndBounds(targetElm, ui.isPositionedAtTop()), pos = _a.pos, bounds = _a.bounds;
26785
        var _b = prevPosAndBounds.get(), prevPos = _b.pos, prevBounds = _b.bounds;
26786
        var hasResized = bounds.height !== prevBounds.height || bounds.width !== prevBounds.width;
26787
        prevPosAndBounds.set({
26788
          pos: pos,
26789
          bounds: bounds
26790
        });
26791
        if (hasResized) {
26792
          fireResizeContent(editor, e);
26793
        }
26794
        if (ui.isVisible()) {
26795
          if (prevPos !== pos) {
26796
            ui.update(true);
26797
          } else if (hasResized) {
26798
            ui.updateMode();
26799
            ui.repositionPopups();
26800
          }
26801
        }
26802
      };
26803
      if (!toolbarPersist) {
26804
        editor.on('activate', ui.show);
26805
        editor.on('deactivate', ui.hide);
26806
      }
26807
      editor.on('SkinLoaded ResizeWindow', function () {
26808
        return ui.update(true);
26809
      });
26810
      editor.on('NodeChange keydown', function (e) {
679 daniel-mar 26811
        global$f.requestAnimationFrame(function () {
597 daniel-mar 26812
          return resizeContent(e);
26813
        });
26814
      });
26815
      editor.on('ScrollWindow', function () {
26816
        return ui.updateMode();
26817
      });
26818
      var elementLoad = unbindable();
637 daniel-mar 26819
      elementLoad.set(capture(SugarElement.fromDom(editor.getBody()), 'load', resizeContent));
597 daniel-mar 26820
      editor.on('remove', function () {
26821
        elementLoad.clear();
26822
      });
26823
    };
637 daniel-mar 26824
    var render = function (editor, uiComponents, rawUiConfig, backstage, args) {
597 daniel-mar 26825
      var mothership = uiComponents.mothership, uiMothership = uiComponents.uiMothership, outerContainer = uiComponents.outerContainer;
26826
      var floatContainer = Cell(null);
26827
      var targetElm = SugarElement.fromDom(args.targetNode);
26828
      var ui = InlineHeader(editor, targetElm, uiComponents, backstage, floatContainer);
26829
      var toolbarPersist = isToolbarPersist(editor);
26830
      inline(editor);
26831
      var render = function () {
26832
        if (floatContainer.get()) {
26833
          ui.show();
26834
          return;
26835
        }
26836
        floatContainer.set(OuterContainer.getHeader(outerContainer).getOrDie());
26837
        var uiContainer = getUiContainer(editor);
26838
        attachSystem(uiContainer, mothership);
26839
        attachSystem(uiContainer, uiMothership);
26840
        setToolbar(editor, uiComponents, rawUiConfig, backstage);
26841
        OuterContainer.setMenubar(outerContainer, identifyMenus(editor, rawUiConfig));
26842
        ui.show();
637 daniel-mar 26843
        setupEvents(editor, targetElm, ui, toolbarPersist);
597 daniel-mar 26844
        editor.nodeChanged();
26845
      };
637 daniel-mar 26846
      var delayedRender = function () {
679 daniel-mar 26847
        return global$f.setEditorTimeout(editor, render, 0);
637 daniel-mar 26848
      };
597 daniel-mar 26849
      editor.on('show', render);
26850
      editor.on('hide', ui.hide);
26851
      if (!toolbarPersist) {
637 daniel-mar 26852
        editor.on('focus', delayedRender);
597 daniel-mar 26853
        editor.on('blur', ui.hide);
26854
      }
26855
      editor.on('init', function () {
26856
        if (editor.hasFocus() || toolbarPersist) {
637 daniel-mar 26857
          delayedRender();
597 daniel-mar 26858
        }
26859
      });
26860
      setupReadonlyModeSwitch(editor, uiComponents);
26861
      var api = {
26862
        show: function () {
26863
          ui.show();
26864
        },
26865
        hide: function () {
26866
          ui.hide();
26867
        },
26868
        enable: function () {
26869
          broadcastReadonly(uiComponents, false);
26870
        },
26871
        disable: function () {
26872
          broadcastReadonly(uiComponents, true);
26873
        },
26874
        isDisabled: function () {
26875
          return Disabling.isDisabled(outerContainer);
26876
        }
26877
      };
26878
      return {
26879
        editorContainer: outerContainer.element.dom,
26880
        api: api
26881
      };
26882
    };
26883
 
26884
    var Inline = /*#__PURE__*/Object.freeze({
26885
        __proto__: null,
637 daniel-mar 26886
        render: render
597 daniel-mar 26887
    });
26888
 
637 daniel-mar 26889
    var showContextToolbarEvent = 'contexttoolbar-show';
26890
    var hideContextToolbarEvent = 'contexttoolbar-hide';
26891
 
26892
    var getFormApi = function (input) {
26893
      return {
26894
        hide: function () {
26895
          return emit(input, sandboxClose());
26896
        },
26897
        getValue: function () {
26898
          return Representing.getValue(input);
26899
        }
26900
      };
26901
    };
26902
    var runOnExecute = function (memInput, original) {
26903
      return run$1(internalToolbarButtonExecute, function (comp, se) {
26904
        var input = memInput.get(comp);
26905
        var formApi = getFormApi(input);
26906
        original.onAction(formApi, se.event.buttonApi);
26907
      });
26908
    };
26909
    var renderContextButton = function (memInput, button, extras) {
26910
      var _a = button.original; _a.primary; var rest = __rest(_a, ['primary']);
26911
      var bridged = getOrDie(createToolbarButton(__assign(__assign({}, rest), {
26912
        type: 'button',
26913
        onAction: noop
26914
      })));
26915
      return renderToolbarButtonWith(bridged, extras.backstage.shared.providers, [runOnExecute(memInput, button)]);
26916
    };
26917
    var renderContextToggleButton = function (memInput, button, extras) {
26918
      var _a = button.original; _a.primary; var rest = __rest(_a, ['primary']);
26919
      var bridged = getOrDie(createToggleButton(__assign(__assign({}, rest), {
26920
        type: 'togglebutton',
26921
        onAction: noop
26922
      })));
26923
      return renderToolbarToggleButtonWith(bridged, extras.backstage.shared.providers, [runOnExecute(memInput, button)]);
26924
    };
26925
    var generateOne = function (memInput, button, providersBackstage) {
26926
      var extras = { backstage: { shared: { providers: providersBackstage } } };
26927
      if (button.type === 'contextformtogglebutton') {
26928
        return renderContextToggleButton(memInput, button, extras);
26929
      } else {
26930
        return renderContextButton(memInput, button, extras);
26931
      }
26932
    };
26933
    var generate = function (memInput, buttons, providersBackstage) {
26934
      var mementos = map$2(buttons, function (button) {
26935
        return record(generateOne(memInput, button, providersBackstage));
26936
      });
26937
      var asSpecs = function () {
26938
        return map$2(mementos, function (mem) {
26939
          return mem.asSpec();
26940
        });
26941
      };
26942
      var findPrimary = function (compInSystem) {
26943
        return findMap(buttons, function (button, i) {
26944
          if (button.primary) {
26945
            return Optional.from(mementos[i]).bind(function (mem) {
26946
              return mem.getOpt(compInSystem);
26947
            }).filter(not(Disabling.isDisabled));
26948
          } else {
26949
            return Optional.none();
26950
          }
26951
        });
26952
      };
26953
      return {
26954
        asSpecs: asSpecs,
26955
        findPrimary: findPrimary
26956
      };
26957
    };
26958
 
26959
    var buildInitGroups = function (ctx, providers) {
26960
      var inputAttributes = ctx.label.fold(function () {
26961
        return {};
26962
      }, function (label) {
26963
        return { 'aria-label': label };
26964
      });
26965
      var memInput = record(Input.sketch({
26966
        inputClasses: [
26967
          'tox-toolbar-textfield',
26968
          'tox-toolbar-nav-js'
26969
        ],
26970
        data: ctx.initValue(),
26971
        inputAttributes: inputAttributes,
26972
        selectOnFocus: true,
26973
        inputBehaviours: derive$1([Keying.config({
26974
            mode: 'special',
26975
            onEnter: function (input) {
26976
              return commands.findPrimary(input).map(function (primary) {
26977
                emitExecute(primary);
26978
                return true;
26979
              });
26980
            },
26981
            onLeft: function (comp, se) {
26982
              se.cut();
26983
              return Optional.none();
26984
            },
26985
            onRight: function (comp, se) {
26986
              se.cut();
26987
              return Optional.none();
26988
            }
26989
          })])
26990
      }));
26991
      var commands = generate(memInput, ctx.commands, providers);
26992
      return [
26993
        {
26994
          title: Optional.none(),
26995
          items: [memInput.asSpec()]
26996
        },
26997
        {
26998
          title: Optional.none(),
26999
          items: commands.asSpecs()
27000
        }
27001
      ];
27002
    };
27003
    var renderContextForm = function (toolbarType, ctx, providers) {
27004
      return renderToolbar({
27005
        type: toolbarType,
27006
        uid: generate$6('context-toolbar'),
27007
        initGroups: buildInitGroups(ctx, providers),
27008
        onEscape: Optional.none,
27009
        cyclicKeying: true,
27010
        providers: providers
27011
      });
27012
    };
27013
    var ContextForm = {
27014
      renderContextForm: renderContextForm,
27015
      buildInitGroups: buildInitGroups
27016
    };
27017
 
27018
    var isVerticalOverlap = function (a, b, threshold) {
27019
      if (threshold === void 0) {
27020
        threshold = 0.01;
27021
      }
27022
      return b.bottom - a.y >= threshold && a.bottom - b.y >= threshold;
27023
    };
27024
    var getRangeRect = function (rng) {
27025
      var rect = rng.getBoundingClientRect();
27026
      if (rect.height <= 0 && rect.width <= 0) {
27027
        var leaf$1 = leaf(SugarElement.fromDom(rng.startContainer), rng.startOffset).element;
27028
        var elm = isText$1(leaf$1) ? parent(leaf$1) : Optional.some(leaf$1);
27029
        return elm.filter(isElement$2).map(function (e) {
27030
          return e.dom.getBoundingClientRect();
27031
        }).getOr(rect);
27032
      } else {
27033
        return rect;
27034
      }
27035
    };
27036
    var getSelectionBounds = function (editor) {
27037
      var rng = editor.selection.getRng();
27038
      var rect = getRangeRect(rng);
27039
      if (editor.inline) {
679 daniel-mar 27040
        var scroll_1 = get$9();
637 daniel-mar 27041
        return bounds(scroll_1.left + rect.left, scroll_1.top + rect.top, rect.width, rect.height);
27042
      } else {
27043
        var bodyPos = absolute$2(SugarElement.fromDom(editor.getBody()));
27044
        return bounds(bodyPos.x + rect.left, bodyPos.y + rect.top, rect.width, rect.height);
27045
      }
27046
    };
27047
    var getAnchorElementBounds = function (editor, lastElement) {
27048
      return lastElement.filter(inBody).map(absolute$2).getOrThunk(function () {
27049
        return getSelectionBounds(editor);
27050
      });
27051
    };
27052
    var getHorizontalBounds = function (contentAreaBox, viewportBounds, margin) {
27053
      var x = Math.max(contentAreaBox.x + margin, viewportBounds.x);
27054
      var right = Math.min(contentAreaBox.right - margin, viewportBounds.right);
27055
      return {
27056
        x: x,
27057
        width: right - x
27058
      };
27059
    };
27060
    var getVerticalBounds = function (editor, contentAreaBox, viewportBounds, isToolbarLocationTop, toolbarType, margin) {
27061
      var container = SugarElement.fromDom(editor.getContainer());
27062
      var header = descendant(container, '.tox-editor-header').getOr(container);
27063
      var headerBox = box$1(header);
27064
      var isToolbarBelowContentArea = headerBox.y >= contentAreaBox.bottom;
27065
      var isToolbarAbove = isToolbarLocationTop && !isToolbarBelowContentArea;
27066
      if (editor.inline && isToolbarAbove) {
27067
        return {
27068
          y: Math.max(headerBox.bottom + margin, viewportBounds.y),
27069
          bottom: viewportBounds.bottom
27070
        };
27071
      }
27072
      if (editor.inline && !isToolbarAbove) {
27073
        return {
27074
          y: viewportBounds.y,
27075
          bottom: Math.min(headerBox.y - margin, viewportBounds.bottom)
27076
        };
27077
      }
27078
      var containerBounds = toolbarType === 'line' ? box$1(container) : contentAreaBox;
27079
      if (isToolbarAbove) {
27080
        return {
27081
          y: Math.max(headerBox.bottom + margin, viewportBounds.y),
27082
          bottom: Math.min(containerBounds.bottom - margin, viewportBounds.bottom)
27083
        };
27084
      }
27085
      return {
27086
        y: Math.max(containerBounds.y + margin, viewportBounds.y),
27087
        bottom: Math.min(headerBox.y - margin, viewportBounds.bottom)
27088
      };
27089
    };
27090
    var getContextToolbarBounds = function (editor, sharedBackstage, toolbarType, margin) {
27091
      if (margin === void 0) {
27092
        margin = 0;
27093
      }
27094
      var viewportBounds = getBounds$3(window);
27095
      var contentAreaBox = box$1(SugarElement.fromDom(editor.getContentAreaContainer()));
27096
      var toolbarOrMenubarEnabled = isMenubarEnabled(editor) || isToolbarEnabled(editor) || isMultipleToolbars(editor);
27097
      var _a = getHorizontalBounds(contentAreaBox, viewportBounds, margin), x = _a.x, width = _a.width;
27098
      if (editor.inline && !toolbarOrMenubarEnabled) {
27099
        return bounds(x, viewportBounds.y, width, viewportBounds.height);
27100
      } else {
27101
        var isToolbarTop = sharedBackstage.header.isPositionedAtTop();
27102
        var _b = getVerticalBounds(editor, contentAreaBox, viewportBounds, isToolbarTop, toolbarType, margin), y = _b.y, bottom = _b.bottom;
27103
        return bounds(x, y, width, bottom - y);
27104
      }
27105
    };
27106
 
27107
    var bubbleSize$1 = 12;
27108
    var bubbleAlignments$1 = {
27109
      valignCentre: [],
27110
      alignCentre: [],
27111
      alignLeft: ['tox-pop--align-left'],
27112
      alignRight: ['tox-pop--align-right'],
27113
      right: ['tox-pop--right'],
27114
      left: ['tox-pop--left'],
27115
      bottom: ['tox-pop--bottom'],
27116
      top: ['tox-pop--top'],
27117
      inset: ['tox-pop--inset']
27118
    };
27119
    var anchorOverrides = {
27120
      maxHeightFunction: expandable$1(),
27121
      maxWidthFunction: expandable()
27122
    };
27123
    var isEntireElementSelected = function (editor, elem) {
27124
      var rng = editor.selection.getRng();
27125
      var leaf$1 = leaf(SugarElement.fromDom(rng.startContainer), rng.startOffset);
27126
      return rng.startContainer === rng.endContainer && rng.startOffset === rng.endOffset - 1 && eq(leaf$1.element, elem);
27127
    };
27128
    var preservePosition = function (elem, position, f) {
27129
      var currentPosition = getRaw(elem, 'position');
679 daniel-mar 27130
      set$7(elem, 'position', position);
637 daniel-mar 27131
      var result = f(elem);
27132
      currentPosition.each(function (pos) {
679 daniel-mar 27133
        return set$7(elem, 'position', pos);
637 daniel-mar 27134
      });
27135
      return result;
27136
    };
27137
    var shouldUseInsetLayouts = function (position) {
27138
      return position === 'node';
27139
    };
27140
    var determineInsetLayout = function (editor, contextbar, elem, data, bounds) {
27141
      var selectionBounds = getSelectionBounds(editor);
27142
      var isSameAnchorElement = data.lastElement().exists(function (prev) {
27143
        return eq(elem, prev);
27144
      });
27145
      if (isEntireElementSelected(editor, elem)) {
27146
        return isSameAnchorElement ? preserve : north;
27147
      } else if (isSameAnchorElement) {
27148
        return preservePosition(contextbar, data.getMode(), function () {
27149
          var isOverlapping = isVerticalOverlap(selectionBounds, box$1(contextbar));
27150
          return isOverlapping && !data.isReposition() ? flip$2 : preserve;
27151
        });
27152
      } else {
679 daniel-mar 27153
        var yBounds = data.getMode() === 'fixed' ? bounds.y + get$9().top : bounds.y;
27154
        var contextbarHeight = get$b(contextbar) + bubbleSize$1;
637 daniel-mar 27155
        return yBounds + contextbarHeight <= selectionBounds.y ? north : south;
27156
      }
27157
    };
27158
    var getAnchorSpec$2 = function (editor, mobile, data, position) {
27159
      var smartInsetLayout = function (elem) {
27160
        return function (anchor, element, bubbles, placee, bounds) {
27161
          var layout = determineInsetLayout(editor, placee, elem, data, bounds);
27162
          var newAnchor = __assign(__assign({}, anchor), {
27163
            y: bounds.y,
27164
            height: bounds.height
27165
          });
27166
          return __assign(__assign({}, layout(newAnchor, element, bubbles, placee, bounds)), { alwaysFit: true });
27167
        };
27168
      };
27169
      var getInsetLayouts = function (elem) {
27170
        return shouldUseInsetLayouts(position) ? [smartInsetLayout(elem)] : [];
27171
      };
27172
      var desktopAnchorSpecLayouts = {
27173
        onLtr: function (elem) {
27174
          return [
27175
            north$2,
27176
            south$2,
27177
            northeast$2,
27178
            southeast$2,
27179
            northwest$2,
27180
            southwest$2
27181
          ].concat(getInsetLayouts(elem));
27182
        },
27183
        onRtl: function (elem) {
27184
          return [
27185
            north$2,
27186
            south$2,
27187
            northwest$2,
27188
            southwest$2,
27189
            northeast$2,
27190
            southeast$2
27191
          ].concat(getInsetLayouts(elem));
27192
        }
27193
      };
27194
      var mobileAnchorSpecLayouts = {
27195
        onLtr: function (elem) {
27196
          return [
27197
            south$2,
27198
            southeast$2,
27199
            southwest$2,
27200
            northeast$2,
27201
            northwest$2,
27202
            north$2
27203
          ].concat(getInsetLayouts(elem));
27204
        },
27205
        onRtl: function (elem) {
27206
          return [
27207
            south$2,
27208
            southwest$2,
27209
            southeast$2,
27210
            northwest$2,
27211
            northeast$2,
27212
            north$2
27213
          ].concat(getInsetLayouts(elem));
27214
        }
27215
      };
27216
      return mobile ? mobileAnchorSpecLayouts : desktopAnchorSpecLayouts;
27217
    };
27218
    var getAnchorLayout = function (editor, position, isTouch, data) {
27219
      if (position === 'line') {
27220
        return {
27221
          bubble: nu$5(bubbleSize$1, 0, bubbleAlignments$1),
27222
          layouts: {
27223
            onLtr: function () {
27224
              return [east$2];
27225
            },
27226
            onRtl: function () {
27227
              return [west$2];
27228
            }
27229
          },
27230
          overrides: anchorOverrides
27231
        };
27232
      } else {
27233
        return {
27234
          bubble: nu$5(0, bubbleSize$1, bubbleAlignments$1, 1 / bubbleSize$1),
27235
          layouts: getAnchorSpec$2(editor, isTouch, data, position),
27236
          overrides: anchorOverrides
27237
        };
27238
      }
27239
    };
27240
 
27241
    var matchTargetWith = function (elem, candidates) {
27242
      var ctxs = filter$2(candidates, function (toolbarApi) {
27243
        return toolbarApi.predicate(elem.dom);
27244
      });
27245
      var _a = partition$3(ctxs, function (t) {
27246
          return t.type === 'contexttoolbar';
27247
        }), pass = _a.pass, fail = _a.fail;
27248
      return {
27249
        contextToolbars: pass,
27250
        contextForms: fail
27251
      };
27252
    };
27253
    var filterByPositionForStartNode = function (toolbars) {
27254
      if (toolbars.length <= 1) {
27255
        return toolbars;
27256
      } else {
27257
        var doesPositionExist = function (value) {
27258
          return exists(toolbars, function (t) {
27259
            return t.position === value;
27260
          });
27261
        };
27262
        var filterToolbarsByPosition = function (value) {
27263
          return filter$2(toolbars, function (t) {
27264
            return t.position === value;
27265
          });
27266
        };
27267
        var hasSelectionToolbars = doesPositionExist('selection');
27268
        var hasNodeToolbars = doesPositionExist('node');
27269
        if (hasSelectionToolbars || hasNodeToolbars) {
27270
          if (hasNodeToolbars && hasSelectionToolbars) {
27271
            var nodeToolbars = filterToolbarsByPosition('node');
27272
            var selectionToolbars = map$2(filterToolbarsByPosition('selection'), function (t) {
27273
              return __assign(__assign({}, t), { position: 'node' });
27274
            });
27275
            return nodeToolbars.concat(selectionToolbars);
27276
          } else {
27277
            return hasSelectionToolbars ? filterToolbarsByPosition('selection') : filterToolbarsByPosition('node');
27278
          }
27279
        } else {
27280
          return filterToolbarsByPosition('line');
27281
        }
27282
      }
27283
    };
27284
    var filterByPositionForAncestorNode = function (toolbars) {
27285
      if (toolbars.length <= 1) {
27286
        return toolbars;
27287
      } else {
27288
        var findPosition_1 = function (value) {
27289
          return find$5(toolbars, function (t) {
27290
            return t.position === value;
27291
          });
27292
        };
27293
        var basePosition = findPosition_1('selection').orThunk(function () {
27294
          return findPosition_1('node');
27295
        }).orThunk(function () {
27296
          return findPosition_1('line');
27297
        }).map(function (t) {
27298
          return t.position;
27299
        });
27300
        return basePosition.fold(function () {
27301
          return [];
27302
        }, function (pos) {
27303
          return filter$2(toolbars, function (t) {
27304
            return t.position === pos;
27305
          });
27306
        });
27307
      }
27308
    };
27309
    var matchStartNode = function (elem, nodeCandidates, editorCandidates) {
27310
      var nodeMatches = matchTargetWith(elem, nodeCandidates);
27311
      if (nodeMatches.contextForms.length > 0) {
27312
        return Optional.some({
27313
          elem: elem,
27314
          toolbars: [nodeMatches.contextForms[0]]
27315
        });
27316
      } else {
27317
        var editorMatches = matchTargetWith(elem, editorCandidates);
27318
        if (editorMatches.contextForms.length > 0) {
27319
          return Optional.some({
27320
            elem: elem,
27321
            toolbars: [editorMatches.contextForms[0]]
27322
          });
27323
        } else if (nodeMatches.contextToolbars.length > 0 || editorMatches.contextToolbars.length > 0) {
27324
          var toolbars = filterByPositionForStartNode(nodeMatches.contextToolbars.concat(editorMatches.contextToolbars));
27325
          return Optional.some({
27326
            elem: elem,
27327
            toolbars: toolbars
27328
          });
27329
        } else {
27330
          return Optional.none();
27331
        }
27332
      }
27333
    };
27334
    var matchAncestor = function (isRoot, startNode, scopes) {
27335
      if (isRoot(startNode)) {
27336
        return Optional.none();
27337
      } else {
27338
        return ancestor$2(startNode, function (ancestorElem) {
27339
          if (isElement$2(ancestorElem)) {
27340
            var _a = matchTargetWith(ancestorElem, scopes.inNodeScope), contextToolbars = _a.contextToolbars, contextForms = _a.contextForms;
27341
            var toolbars = contextForms.length > 0 ? contextForms : filterByPositionForAncestorNode(contextToolbars);
27342
            return toolbars.length > 0 ? Optional.some({
27343
              elem: ancestorElem,
27344
              toolbars: toolbars
27345
            }) : Optional.none();
27346
          } else {
27347
            return Optional.none();
27348
          }
27349
        }, isRoot);
27350
      }
27351
    };
27352
    var lookup$1 = function (scopes, editor) {
27353
      var rootElem = SugarElement.fromDom(editor.getBody());
27354
      var isRoot = function (elem) {
27355
        return eq(elem, rootElem);
27356
      };
27357
      var isOutsideRoot = function (startNode) {
27358
        return !isRoot(startNode) && !contains(rootElem, startNode);
27359
      };
27360
      var startNode = SugarElement.fromDom(editor.selection.getNode());
27361
      if (isOutsideRoot(startNode)) {
27362
        return Optional.none();
27363
      }
27364
      return matchStartNode(startNode, scopes.inNodeScope, scopes.inEditorScope).orThunk(function () {
27365
        return matchAncestor(isRoot, startNode, scopes);
27366
      });
27367
    };
27368
 
27369
    var categorise = function (contextToolbars, navigate) {
27370
      var forms = {};
27371
      var inNodeScope = [];
27372
      var inEditorScope = [];
27373
      var formNavigators = {};
27374
      var lookupTable = {};
27375
      var registerForm = function (key, toolbarSpec) {
27376
        var contextForm = getOrDie(createContextForm(toolbarSpec));
27377
        forms[key] = contextForm;
27378
        contextForm.launch.map(function (launch) {
27379
          formNavigators['form:' + key + ''] = __assign(__assign({}, toolbarSpec.launch), {
27380
            type: launch.type === 'contextformtogglebutton' ? 'togglebutton' : 'button',
27381
            onAction: function () {
27382
              navigate(contextForm);
27383
            }
27384
          });
27385
        });
27386
        if (contextForm.scope === 'editor') {
27387
          inEditorScope.push(contextForm);
27388
        } else {
27389
          inNodeScope.push(contextForm);
27390
        }
27391
        lookupTable[key] = contextForm;
27392
      };
27393
      var registerToolbar = function (key, toolbarSpec) {
27394
        createContextToolbar(toolbarSpec).each(function (contextToolbar) {
27395
          if (toolbarSpec.scope === 'editor') {
27396
            inEditorScope.push(contextToolbar);
27397
          } else {
27398
            inNodeScope.push(contextToolbar);
27399
          }
27400
          lookupTable[key] = contextToolbar;
27401
        });
27402
      };
27403
      var keys$1 = keys(contextToolbars);
27404
      each$1(keys$1, function (key) {
27405
        var toolbarApi = contextToolbars[key];
27406
        if (toolbarApi.type === 'contextform') {
27407
          registerForm(key, toolbarApi);
27408
        } else if (toolbarApi.type === 'contexttoolbar') {
27409
          registerToolbar(key, toolbarApi);
27410
        }
27411
      });
27412
      return {
27413
        forms: forms,
27414
        inNodeScope: inNodeScope,
27415
        inEditorScope: inEditorScope,
27416
        lookupTable: lookupTable,
27417
        formNavigators: formNavigators
27418
      };
27419
    };
27420
 
27421
    var forwardSlideEvent = generate$6('forward-slide');
27422
    var backSlideEvent = generate$6('backward-slide');
27423
    var changeSlideEvent = generate$6('change-slide-event');
27424
    var resizingClass = 'tox-pop--resizing';
27425
    var renderContextToolbar = function (spec) {
27426
      var stack = Cell([]);
27427
      return InlineView.sketch({
27428
        dom: {
27429
          tag: 'div',
27430
          classes: ['tox-pop']
27431
        },
27432
        fireDismissalEventInstead: { event: 'doNotDismissYet' },
27433
        onShow: function (comp) {
27434
          stack.set([]);
27435
          InlineView.getContent(comp).each(function (c) {
679 daniel-mar 27436
            remove$6(c.element, 'visibility');
637 daniel-mar 27437
          });
679 daniel-mar 27438
          remove$2(comp.element, resizingClass);
27439
          remove$6(comp.element, 'width');
637 daniel-mar 27440
        },
27441
        inlineBehaviours: derive$1([
27442
          config('context-toolbar-events', [
27443
            runOnSource(transitionend(), function (comp, se) {
27444
              if (se.event.raw.propertyName === 'width') {
679 daniel-mar 27445
                remove$2(comp.element, resizingClass);
27446
                remove$6(comp.element, 'width');
637 daniel-mar 27447
              }
27448
            }),
27449
            run$1(changeSlideEvent, function (comp, se) {
27450
              var elem = comp.element;
679 daniel-mar 27451
              remove$6(elem, 'width');
27452
              var currentWidth = get$a(elem);
637 daniel-mar 27453
              InlineView.setContent(comp, se.event.contents);
27454
              add$2(elem, resizingClass);
679 daniel-mar 27455
              var newWidth = get$a(elem);
27456
              set$7(elem, 'width', currentWidth + 'px');
637 daniel-mar 27457
              InlineView.getContent(comp).each(function (newContents) {
27458
                se.event.focus.bind(function (f) {
27459
                  focus$3(f);
27460
                  return search(elem);
27461
                }).orThunk(function () {
27462
                  Keying.focusIn(newContents);
27463
                  return active(getRootNode(elem));
27464
                });
27465
              });
679 daniel-mar 27466
              global$f.setTimeout(function () {
27467
                set$7(comp.element, 'width', newWidth + 'px');
637 daniel-mar 27468
              }, 0);
27469
            }),
27470
            run$1(forwardSlideEvent, function (comp, se) {
27471
              InlineView.getContent(comp).each(function (oldContents) {
27472
                stack.set(stack.get().concat([{
27473
                    bar: oldContents,
27474
                    focus: active(getRootNode(comp.element))
27475
                  }]));
27476
              });
27477
              emitWith(comp, changeSlideEvent, {
27478
                contents: se.event.forwardContents,
27479
                focus: Optional.none()
27480
              });
27481
            }),
27482
            run$1(backSlideEvent, function (comp, _se) {
27483
              last$2(stack.get()).each(function (last) {
27484
                stack.set(stack.get().slice(0, stack.get().length - 1));
27485
                emitWith(comp, changeSlideEvent, {
27486
                  contents: premade(last.bar),
27487
                  focus: last.focus
27488
                });
27489
              });
27490
            })
27491
          ]),
27492
          Keying.config({
27493
            mode: 'special',
27494
            onEscape: function (comp) {
27495
              return last$2(stack.get()).fold(function () {
27496
                return spec.onEscape();
27497
              }, function (_) {
27498
                emit(comp, backSlideEvent);
27499
                return Optional.some(true);
27500
              });
27501
            }
27502
          })
27503
        ]),
27504
        lazySink: function () {
27505
          return Result.value(spec.sink);
27506
        }
27507
      });
27508
    };
27509
 
27510
    var transitionClass = 'tox-pop--transition';
27511
    var register$7 = function (editor, registryContextToolbars, sink, extras) {
27512
      var backstage = extras.backstage;
27513
      var sharedBackstage = backstage.shared;
27514
      var isTouch = detect$1().deviceType.isTouch;
27515
      var lastElement = value$1();
27516
      var lastTrigger = value$1();
27517
      var lastContextPosition = value$1();
27518
      var contextbar = build$1(renderContextToolbar({
27519
        sink: sink,
27520
        onEscape: function () {
27521
          editor.focus();
27522
          return Optional.some(true);
27523
        }
27524
      }));
27525
      var getBounds = function () {
27526
        var position = lastContextPosition.get().getOr('node');
27527
        var margin = shouldUseInsetLayouts(position) ? 1 : 0;
27528
        return getContextToolbarBounds(editor, sharedBackstage, position, margin);
27529
      };
27530
      var canLaunchToolbar = function () {
27531
        return !editor.removed && !(isTouch() && backstage.isContextMenuOpen());
27532
      };
27533
      var isSameLaunchElement = function (elem) {
679 daniel-mar 27534
        return is$1(lift2(elem, lastElement.get(), eq), true);
637 daniel-mar 27535
      };
27536
      var shouldContextToolbarHide = function () {
27537
        if (!canLaunchToolbar()) {
27538
          return true;
27539
        } else {
27540
          var contextToolbarBounds = getBounds();
679 daniel-mar 27541
          var anchorBounds = is$1(lastContextPosition.get(), 'node') ? getAnchorElementBounds(editor, lastElement.get()) : getSelectionBounds(editor);
637 daniel-mar 27542
          return contextToolbarBounds.height <= 0 || !isVerticalOverlap(anchorBounds, contextToolbarBounds);
27543
        }
27544
      };
27545
      var close = function () {
27546
        lastElement.clear();
27547
        lastTrigger.clear();
27548
        lastContextPosition.clear();
27549
        InlineView.hide(contextbar);
27550
      };
27551
      var hideOrRepositionIfNecessary = function () {
27552
        if (InlineView.isOpen(contextbar)) {
27553
          var contextBarEle = contextbar.element;
679 daniel-mar 27554
          remove$6(contextBarEle, 'display');
637 daniel-mar 27555
          if (shouldContextToolbarHide()) {
679 daniel-mar 27556
            set$7(contextBarEle, 'display', 'none');
637 daniel-mar 27557
          } else {
27558
            lastTrigger.set(0);
27559
            InlineView.reposition(contextbar);
27560
          }
27561
        }
27562
      };
27563
      var wrapInPopDialog = function (toolbarSpec) {
27564
        return {
27565
          dom: {
27566
            tag: 'div',
27567
            classes: ['tox-pop__dialog']
27568
          },
27569
          components: [toolbarSpec],
27570
          behaviours: derive$1([
27571
            Keying.config({ mode: 'acyclic' }),
27572
            config('pop-dialog-wrap-events', [
27573
              runOnAttached(function (comp) {
27574
                editor.shortcuts.add('ctrl+F9', 'focus statusbar', function () {
27575
                  return Keying.focusIn(comp);
27576
                });
27577
              }),
27578
              runOnDetached(function (_comp) {
27579
                editor.shortcuts.remove('ctrl+F9');
27580
              })
27581
            ])
27582
          ])
27583
        };
27584
      };
27585
      var getScopes = cached(function () {
27586
        return categorise(registryContextToolbars, function (toolbarApi) {
27587
          var alloySpec = buildToolbar([toolbarApi]);
27588
          emitWith(contextbar, forwardSlideEvent, { forwardContents: wrapInPopDialog(alloySpec) });
27589
        });
27590
      });
27591
      var buildContextToolbarGroups = function (allButtons, ctx) {
27592
        return identifyButtons(editor, {
27593
          buttons: allButtons,
27594
          toolbar: ctx.items,
27595
          allowToolbarGroups: false
27596
        }, extras, Optional.some(['form:']));
27597
      };
27598
      var buildContextFormGroups = function (ctx, providers) {
27599
        return ContextForm.buildInitGroups(ctx, providers);
27600
      };
27601
      var buildToolbar = function (toolbars) {
27602
        var buttons = editor.ui.registry.getAll().buttons;
27603
        var scopes = getScopes();
27604
        var allButtons = __assign(__assign({}, buttons), scopes.formNavigators);
27605
        var toolbarType = getToolbarMode(editor) === ToolbarMode.scrolling ? ToolbarMode.scrolling : ToolbarMode.default;
27606
        var initGroups = flatten(map$2(toolbars, function (ctx) {
27607
          return ctx.type === 'contexttoolbar' ? buildContextToolbarGroups(allButtons, ctx) : buildContextFormGroups(ctx, sharedBackstage.providers);
27608
        }));
27609
        return renderToolbar({
27610
          type: toolbarType,
27611
          uid: generate$6('context-toolbar'),
27612
          initGroups: initGroups,
27613
          onEscape: Optional.none,
27614
          cyclicKeying: true,
27615
          providers: sharedBackstage.providers
27616
        });
27617
      };
27618
      var getAnchor = function (position, element) {
27619
        var anchorage = position === 'node' ? sharedBackstage.anchors.node(element) : sharedBackstage.anchors.cursor();
27620
        var anchorLayout = getAnchorLayout(editor, position, isTouch(), {
27621
          lastElement: lastElement.get,
27622
          isReposition: function () {
679 daniel-mar 27623
            return is$1(lastTrigger.get(), 0);
637 daniel-mar 27624
          },
27625
          getMode: function () {
27626
            return Positioning.getMode(sink);
27627
          }
27628
        });
27629
        return deepMerge(anchorage, anchorLayout);
27630
      };
27631
      var launchContext = function (toolbarApi, elem) {
27632
        launchContextToolbar.cancel();
27633
        if (!canLaunchToolbar()) {
27634
          return;
27635
        }
27636
        var toolbarSpec = buildToolbar(toolbarApi);
27637
        var position = toolbarApi[0].position;
27638
        var anchor = getAnchor(position, elem);
27639
        lastContextPosition.set(position);
27640
        lastTrigger.set(1);
27641
        var contextBarEle = contextbar.element;
679 daniel-mar 27642
        remove$6(contextBarEle, 'display');
637 daniel-mar 27643
        if (!isSameLaunchElement(elem)) {
679 daniel-mar 27644
          remove$2(contextBarEle, transitionClass);
637 daniel-mar 27645
          Positioning.reset(sink, contextbar);
27646
        }
27647
        InlineView.showWithinBounds(contextbar, wrapInPopDialog(toolbarSpec), {
27648
          anchor: anchor,
27649
          transition: {
27650
            classes: [transitionClass],
27651
            mode: 'placement'
27652
          }
27653
        }, function () {
27654
          return Optional.some(getBounds());
27655
        });
27656
        elem.fold(lastElement.clear, lastElement.set);
27657
        if (shouldContextToolbarHide()) {
679 daniel-mar 27658
          set$7(contextBarEle, 'display', 'none');
637 daniel-mar 27659
        }
27660
      };
27661
      var launchContextToolbar = last(function () {
27662
        if (!editor.hasFocus() || editor.removed) {
27663
          return;
27664
        }
27665
        if (has(contextbar.element, transitionClass)) {
27666
          launchContextToolbar.throttle();
27667
        } else {
27668
          var scopes = getScopes();
27669
          lookup$1(scopes, editor).fold(close, function (info) {
27670
            launchContext(info.toolbars, Optional.some(info.elem));
27671
          });
27672
        }
27673
      }, 17);
27674
      editor.on('init', function () {
27675
        editor.on('remove', close);
27676
        editor.on('ScrollContent ScrollWindow ObjectResized ResizeEditor longpress', hideOrRepositionIfNecessary);
27677
        editor.on('click keyup focus SetContent', launchContextToolbar.throttle);
27678
        editor.on(hideContextToolbarEvent, close);
27679
        editor.on(showContextToolbarEvent, function (e) {
27680
          var scopes = getScopes();
27681
          get$e(scopes.lookupTable, e.toolbarKey).each(function (ctx) {
27682
            launchContext([ctx], someIf(e.target !== editor, e.target));
27683
            InlineView.getContent(contextbar).each(Keying.focusIn);
27684
          });
27685
        });
27686
        editor.on('focusout', function (_e) {
679 daniel-mar 27687
          global$f.setEditorTimeout(editor, function () {
637 daniel-mar 27688
            if (search(sink.element).isNone() && search(contextbar.element).isNone()) {
27689
              close();
27690
            }
27691
          }, 0);
27692
        });
27693
        editor.on('SwitchMode', function () {
27694
          if (editor.mode.isReadOnly()) {
27695
            close();
27696
          }
27697
        });
27698
        editor.on('AfterProgressState', function (event) {
27699
          if (event.state) {
27700
            close();
27701
          } else if (editor.hasFocus()) {
27702
            launchContextToolbar.throttle();
27703
          }
27704
        });
27705
        editor.on('NodeChange', function (_e) {
27706
          search(contextbar.element).fold(launchContextToolbar.throttle, noop);
27707
        });
27708
      });
27709
    };
27710
 
27711
    var register$6 = function (editor) {
597 daniel-mar 27712
      var alignToolbarButtons = [
27713
        {
27714
          name: 'alignleft',
27715
          text: 'Align left',
27716
          cmd: 'JustifyLeft',
27717
          icon: 'align-left'
27718
        },
27719
        {
27720
          name: 'aligncenter',
27721
          text: 'Align center',
27722
          cmd: 'JustifyCenter',
27723
          icon: 'align-center'
27724
        },
27725
        {
27726
          name: 'alignright',
27727
          text: 'Align right',
27728
          cmd: 'JustifyRight',
27729
          icon: 'align-right'
27730
        },
27731
        {
27732
          name: 'alignjustify',
27733
          text: 'Justify',
27734
          cmd: 'JustifyFull',
27735
          icon: 'align-justify'
27736
        }
27737
      ];
637 daniel-mar 27738
      each$1(alignToolbarButtons, function (item) {
597 daniel-mar 27739
        editor.ui.registry.addToggleButton(item.name, {
27740
          tooltip: item.text,
27741
          icon: item.icon,
637 daniel-mar 27742
          onAction: onActionExecCommand(editor, item.cmd),
597 daniel-mar 27743
          onSetup: onSetupFormatToggle(editor, item.name)
27744
        });
27745
      });
637 daniel-mar 27746
      editor.ui.registry.addButton('alignnone', {
27747
        tooltip: 'No alignment',
27748
        icon: 'align-none',
27749
        onAction: onActionExecCommand(editor, 'JustifyNone')
597 daniel-mar 27750
      });
27751
    };
27752
 
27753
    var units = {
27754
      unsupportedLength: [
27755
        'em',
27756
        'ex',
27757
        'cap',
27758
        'ch',
27759
        'ic',
27760
        'rem',
27761
        'lh',
27762
        'rlh',
27763
        'vw',
27764
        'vh',
27765
        'vi',
27766
        'vb',
27767
        'vmin',
27768
        'vmax',
27769
        'cm',
27770
        'mm',
27771
        'Q',
27772
        'in',
27773
        'pc',
27774
        'pt',
27775
        'px'
27776
      ],
27777
      fixed: [
27778
        'px',
27779
        'pt'
27780
      ],
27781
      relative: ['%'],
27782
      empty: ['']
27783
    };
27784
    var pattern = function () {
27785
      var decimalDigits = '[0-9]+';
27786
      var signedInteger = '[+-]?' + decimalDigits;
27787
      var exponentPart = '[eE]' + signedInteger;
27788
      var dot = '\\.';
27789
      var opt = function (input) {
27790
        return '(?:' + input + ')?';
27791
      };
27792
      var unsignedDecimalLiteral = [
27793
        'Infinity',
27794
        decimalDigits + dot + opt(decimalDigits) + opt(exponentPart),
27795
        dot + decimalDigits + opt(exponentPart),
27796
        decimalDigits + opt(exponentPart)
27797
      ].join('|');
27798
      var float = '[+-]?(?:' + unsignedDecimalLiteral + ')';
27799
      return new RegExp('^(' + float + ')(.*)$');
27800
    }();
27801
    var isUnit = function (unit, accepted) {
27802
      return exists(accepted, function (acc) {
27803
        return exists(units[acc], function (check) {
27804
          return unit === check;
27805
        });
27806
      });
27807
    };
27808
    var parse = function (input, accepted) {
27809
      var match = Optional.from(pattern.exec(input));
27810
      return match.bind(function (array) {
27811
        var value = Number(array[1]);
27812
        var unitRaw = array[2];
27813
        if (isUnit(unitRaw, accepted)) {
27814
          return Optional.some({
27815
            value: value,
27816
            unit: unitRaw
27817
          });
27818
        } else {
27819
          return Optional.none();
27820
        }
27821
      });
27822
    };
27823
    var normalise = function (input, accepted) {
27824
      return parse(input, accepted).map(function (_a) {
27825
        var value = _a.value, unit = _a.unit;
27826
        return value + unit;
27827
      });
27828
    };
27829
 
637 daniel-mar 27830
    var registerController = function (editor, spec) {
27831
      var getMenuItems = function () {
27832
        var options = spec.getOptions(editor);
27833
        var initial = spec.getCurrent(editor).map(spec.hash);
27834
        var current = value$1();
27835
        return map$2(options, function (value) {
27836
          return {
27837
            type: 'togglemenuitem',
27838
            text: spec.display(value),
27839
            onSetup: function (api) {
27840
              var setActive = function (active) {
27841
                if (active) {
27842
                  current.on(function (oldApi) {
27843
                    return oldApi.setActive(false);
27844
                  });
27845
                  current.set(api);
27846
                }
27847
                api.setActive(active);
27848
              };
679 daniel-mar 27849
              setActive(is$1(initial, spec.hash(value)));
637 daniel-mar 27850
              var unbindWatcher = spec.watcher(editor, value, setActive);
27851
              return function () {
27852
                current.clear();
27853
                unbindWatcher();
27854
              };
27855
            },
27856
            onAction: function () {
27857
              return spec.setCurrent(editor, value);
597 daniel-mar 27858
            }
637 daniel-mar 27859
          };
597 daniel-mar 27860
        });
27861
      };
637 daniel-mar 27862
      editor.ui.registry.addMenuButton(spec.name, {
27863
        tooltip: spec.text,
27864
        icon: spec.icon,
27865
        fetch: function (callback) {
27866
          return callback(getMenuItems());
27867
        },
27868
        onSetup: spec.onToolbarSetup
27869
      });
27870
      editor.ui.registry.addNestedMenuItem(spec.name, {
27871
        type: 'nestedmenuitem',
27872
        text: spec.text,
27873
        getSubmenuItems: getMenuItems,
27874
        onSetup: spec.onMenuSetup
27875
      });
27876
    };
27877
    var lineHeightSpec = {
27878
      name: 'lineheight',
27879
      text: 'Line height',
27880
      icon: 'line-height',
27881
      getOptions: getLineHeightFormats,
27882
      hash: function (input) {
27883
        return normalise(input, [
27884
          'fixed',
27885
          'relative',
27886
          'empty'
27887
        ]).getOr(input);
27888
      },
27889
      display: identity$1,
27890
      watcher: function (editor, value, callback) {
27891
        return editor.formatter.formatChanged('lineheight', callback, false, { value: value }).unbind;
27892
      },
27893
      getCurrent: function (editor) {
27894
        return Optional.from(editor.queryCommandValue('LineHeight'));
27895
      },
27896
      setCurrent: function (editor, value) {
27897
        return editor.execCommand('LineHeight', false, value);
27898
      }
27899
    };
27900
    var languageSpec = function (editor) {
27901
      var settingsOpt = Optional.from(getContentLanguages(editor));
27902
      return settingsOpt.map(function (settings) {
597 daniel-mar 27903
        return {
637 daniel-mar 27904
          name: 'language',
27905
          text: 'Language',
27906
          icon: 'language',
27907
          getOptions: constant$1(settings),
27908
          hash: function (input) {
27909
            return isUndefined(input.customCode) ? input.code : input.code + '/' + input.customCode;
597 daniel-mar 27910
          },
637 daniel-mar 27911
          display: function (input) {
27912
            return input.title;
27913
          },
27914
          watcher: function (editor, value, callback) {
27915
            return editor.formatter.formatChanged('lang', callback, false, {
27916
              value: value.code,
27917
              customValue: value.customCode
27918
            }).unbind;
27919
          },
27920
          getCurrent: function (editor) {
27921
            var node = SugarElement.fromDom(editor.selection.getNode());
27922
            return closest$4(node, function (n) {
27923
              return Optional.some(n).filter(isElement$2).bind(function (ele) {
27924
                var codeOpt = getOpt(ele, 'lang');
27925
                return codeOpt.map(function (code) {
27926
                  var customCode = getOpt(ele, 'data-mce-lang').getOrUndefined();
27927
                  return {
27928
                    code: code,
27929
                    customCode: customCode,
27930
                    title: ''
27931
                  };
27932
                });
27933
              });
27934
            });
27935
          },
27936
          setCurrent: function (editor, lang) {
27937
            return editor.execCommand('Lang', false, lang);
27938
          },
27939
          onToolbarSetup: function (api) {
27940
            var unbinder = unbindable();
27941
            api.setActive(editor.formatter.match('lang', {}, undefined, true));
27942
            unbinder.set(editor.formatter.formatChanged('lang', api.setActive, true));
27943
            return unbinder.clear;
597 daniel-mar 27944
          }
27945
        };
27946
      });
27947
    };
637 daniel-mar 27948
    var register$5 = function (editor) {
27949
      registerController(editor, lineHeightSpec);
27950
      languageSpec(editor).each(function (spec) {
27951
        return registerController(editor, spec);
597 daniel-mar 27952
      });
27953
    };
637 daniel-mar 27954
 
27955
    var register$4 = function (editor, backstage) {
27956
      alignSelectMenu(editor, backstage);
27957
      fontSelectMenu(editor, backstage);
27958
      styleSelectMenu(editor, backstage);
27959
      formatSelectMenu(editor, backstage);
27960
      fontsizeSelectMenu(editor, backstage);
27961
    };
27962
 
27963
    var onSetupOutdentState = function (editor) {
27964
      return onSetupEvent(editor, 'NodeChange', function (api) {
27965
        api.setDisabled(!editor.queryCommandState('outdent'));
597 daniel-mar 27966
      });
27967
    };
637 daniel-mar 27968
    var registerButtons$2 = function (editor) {
27969
      editor.ui.registry.addButton('outdent', {
27970
        tooltip: 'Decrease indent',
27971
        icon: 'outdent',
27972
        onSetup: onSetupOutdentState(editor),
27973
        onAction: onActionExecCommand(editor, 'outdent')
27974
      });
27975
      editor.ui.registry.addButton('indent', {
27976
        tooltip: 'Increase indent',
27977
        icon: 'indent',
27978
        onAction: onActionExecCommand(editor, 'indent')
27979
      });
597 daniel-mar 27980
    };
637 daniel-mar 27981
    var register$3 = function (editor) {
27982
      registerButtons$2(editor);
27983
    };
597 daniel-mar 27984
 
637 daniel-mar 27985
    var onActionToggleFormat = function (editor, fmt) {
597 daniel-mar 27986
      return function () {
27987
        editor.execCommand('mceToggleFormat', false, fmt);
27988
      };
27989
    };
27990
    var registerFormatButtons = function (editor) {
679 daniel-mar 27991
      global$5.each([
597 daniel-mar 27992
        {
27993
          name: 'bold',
27994
          text: 'Bold',
27995
          icon: 'bold'
27996
        },
27997
        {
27998
          name: 'italic',
27999
          text: 'Italic',
28000
          icon: 'italic'
28001
        },
28002
        {
28003
          name: 'underline',
28004
          text: 'Underline',
28005
          icon: 'underline'
28006
        },
28007
        {
28008
          name: 'strikethrough',
28009
          text: 'Strikethrough',
28010
          icon: 'strike-through'
28011
        },
28012
        {
28013
          name: 'subscript',
28014
          text: 'Subscript',
28015
          icon: 'subscript'
28016
        },
28017
        {
28018
          name: 'superscript',
28019
          text: 'Superscript',
28020
          icon: 'superscript'
28021
        }
28022
      ], function (btn, _idx) {
28023
        editor.ui.registry.addToggleButton(btn.name, {
28024
          tooltip: btn.text,
28025
          icon: btn.icon,
28026
          onSetup: onSetupFormatToggle(editor, btn.name),
637 daniel-mar 28027
          onAction: onActionToggleFormat(editor, btn.name)
597 daniel-mar 28028
        });
28029
      });
28030
      for (var i = 1; i <= 6; i++) {
28031
        var name_1 = 'h' + i;
28032
        editor.ui.registry.addToggleButton(name_1, {
28033
          text: name_1.toUpperCase(),
28034
          tooltip: 'Heading ' + i,
28035
          onSetup: onSetupFormatToggle(editor, name_1),
637 daniel-mar 28036
          onAction: onActionToggleFormat(editor, name_1)
597 daniel-mar 28037
        });
28038
      }
28039
    };
28040
    var registerCommandButtons = function (editor) {
679 daniel-mar 28041
      global$5.each([
597 daniel-mar 28042
        {
28043
          name: 'cut',
28044
          text: 'Cut',
28045
          action: 'Cut',
28046
          icon: 'cut'
28047
        },
28048
        {
28049
          name: 'copy',
28050
          text: 'Copy',
28051
          action: 'Copy',
28052
          icon: 'copy'
28053
        },
28054
        {
28055
          name: 'paste',
28056
          text: 'Paste',
28057
          action: 'Paste',
28058
          icon: 'paste'
28059
        },
28060
        {
28061
          name: 'help',
28062
          text: 'Help',
28063
          action: 'mceHelp',
28064
          icon: 'help'
28065
        },
28066
        {
28067
          name: 'selectall',
28068
          text: 'Select all',
28069
          action: 'SelectAll',
28070
          icon: 'select-all'
28071
        },
28072
        {
28073
          name: 'newdocument',
28074
          text: 'New document',
28075
          action: 'mceNewDocument',
28076
          icon: 'new-document'
28077
        },
28078
        {
28079
          name: 'removeformat',
28080
          text: 'Clear formatting',
28081
          action: 'RemoveFormat',
28082
          icon: 'remove-formatting'
28083
        },
28084
        {
28085
          name: 'remove',
28086
          text: 'Remove',
28087
          action: 'Delete',
28088
          icon: 'remove'
28089
        }
28090
      ], function (btn) {
28091
        editor.ui.registry.addButton(btn.name, {
28092
          tooltip: btn.text,
28093
          icon: btn.icon,
637 daniel-mar 28094
          onAction: onActionExecCommand(editor, btn.action)
597 daniel-mar 28095
        });
28096
      });
28097
    };
28098
    var registerCommandToggleButtons = function (editor) {
679 daniel-mar 28099
      global$5.each([{
597 daniel-mar 28100
          name: 'blockquote',
28101
          text: 'Blockquote',
28102
          action: 'mceBlockQuote',
28103
          icon: 'quote'
28104
        }], function (btn) {
28105
        editor.ui.registry.addToggleButton(btn.name, {
28106
          tooltip: btn.text,
28107
          icon: btn.icon,
637 daniel-mar 28108
          onAction: onActionExecCommand(editor, btn.action),
597 daniel-mar 28109
          onSetup: onSetupFormatToggle(editor, btn.name)
28110
        });
28111
      });
28112
    };
637 daniel-mar 28113
    var registerButtons$1 = function (editor) {
597 daniel-mar 28114
      registerFormatButtons(editor);
28115
      registerCommandButtons(editor);
28116
      registerCommandToggleButtons(editor);
28117
    };
637 daniel-mar 28118
    var registerMenuItems$2 = function (editor) {
679 daniel-mar 28119
      global$5.each([
597 daniel-mar 28120
        {
28121
          name: 'bold',
28122
          text: 'Bold',
28123
          action: 'Bold',
28124
          icon: 'bold',
28125
          shortcut: 'Meta+B'
28126
        },
28127
        {
28128
          name: 'italic',
28129
          text: 'Italic',
28130
          action: 'Italic',
28131
          icon: 'italic',
28132
          shortcut: 'Meta+I'
28133
        },
28134
        {
28135
          name: 'underline',
28136
          text: 'Underline',
28137
          action: 'Underline',
28138
          icon: 'underline',
28139
          shortcut: 'Meta+U'
28140
        },
28141
        {
28142
          name: 'strikethrough',
28143
          text: 'Strikethrough',
28144
          action: 'Strikethrough',
28145
          icon: 'strike-through',
28146
          shortcut: ''
28147
        },
28148
        {
28149
          name: 'subscript',
28150
          text: 'Subscript',
28151
          action: 'Subscript',
28152
          icon: 'subscript',
28153
          shortcut: ''
28154
        },
28155
        {
28156
          name: 'superscript',
28157
          text: 'Superscript',
28158
          action: 'Superscript',
28159
          icon: 'superscript',
28160
          shortcut: ''
28161
        },
28162
        {
28163
          name: 'removeformat',
28164
          text: 'Clear formatting',
28165
          action: 'RemoveFormat',
28166
          icon: 'remove-formatting',
28167
          shortcut: ''
28168
        },
28169
        {
28170
          name: 'newdocument',
28171
          text: 'New document',
28172
          action: 'mceNewDocument',
28173
          icon: 'new-document',
28174
          shortcut: ''
28175
        },
28176
        {
28177
          name: 'cut',
28178
          text: 'Cut',
28179
          action: 'Cut',
28180
          icon: 'cut',
28181
          shortcut: 'Meta+X'
28182
        },
28183
        {
28184
          name: 'copy',
28185
          text: 'Copy',
28186
          action: 'Copy',
28187
          icon: 'copy',
28188
          shortcut: 'Meta+C'
28189
        },
28190
        {
28191
          name: 'paste',
28192
          text: 'Paste',
28193
          action: 'Paste',
28194
          icon: 'paste',
28195
          shortcut: 'Meta+V'
28196
        },
28197
        {
28198
          name: 'selectall',
28199
          text: 'Select all',
28200
          action: 'SelectAll',
28201
          icon: 'select-all',
28202
          shortcut: 'Meta+A'
28203
        }
28204
      ], function (btn) {
28205
        editor.ui.registry.addMenuItem(btn.name, {
28206
          text: btn.text,
28207
          icon: btn.icon,
28208
          shortcut: btn.shortcut,
637 daniel-mar 28209
          onAction: onActionExecCommand(editor, btn.action)
597 daniel-mar 28210
        });
28211
      });
28212
      editor.ui.registry.addMenuItem('codeformat', {
28213
        text: 'Code',
28214
        icon: 'sourcecode',
637 daniel-mar 28215
        onAction: onActionToggleFormat(editor, 'code')
597 daniel-mar 28216
      });
28217
    };
637 daniel-mar 28218
    var register$2 = function (editor) {
28219
      registerButtons$1(editor);
28220
      registerMenuItems$2(editor);
597 daniel-mar 28221
    };
28222
 
637 daniel-mar 28223
    var onSetupUndoRedoState = function (editor, type) {
28224
      return onSetupEvent(editor, 'Undo Redo AddUndo TypingUndo ClearUndos SwitchMode', function (api) {
28225
        api.setDisabled(editor.mode.isReadOnly() || !editor.undoManager[type]());
28226
      });
597 daniel-mar 28227
    };
637 daniel-mar 28228
    var registerMenuItems$1 = function (editor) {
597 daniel-mar 28229
      editor.ui.registry.addMenuItem('undo', {
28230
        text: 'Undo',
28231
        icon: 'undo',
28232
        shortcut: 'Meta+Z',
637 daniel-mar 28233
        onSetup: onSetupUndoRedoState(editor, 'hasUndo'),
28234
        onAction: onActionExecCommand(editor, 'undo')
597 daniel-mar 28235
      });
28236
      editor.ui.registry.addMenuItem('redo', {
28237
        text: 'Redo',
28238
        icon: 'redo',
28239
        shortcut: 'Meta+Y',
637 daniel-mar 28240
        onSetup: onSetupUndoRedoState(editor, 'hasRedo'),
28241
        onAction: onActionExecCommand(editor, 'redo')
597 daniel-mar 28242
      });
28243
    };
637 daniel-mar 28244
    var registerButtons = function (editor) {
597 daniel-mar 28245
      editor.ui.registry.addButton('undo', {
28246
        tooltip: 'Undo',
28247
        icon: 'undo',
637 daniel-mar 28248
        disabled: true,
28249
        onSetup: onSetupUndoRedoState(editor, 'hasUndo'),
28250
        onAction: onActionExecCommand(editor, 'undo')
597 daniel-mar 28251
      });
28252
      editor.ui.registry.addButton('redo', {
28253
        tooltip: 'Redo',
28254
        icon: 'redo',
637 daniel-mar 28255
        disabled: true,
28256
        onSetup: onSetupUndoRedoState(editor, 'hasRedo'),
28257
        onAction: onActionExecCommand(editor, 'redo')
597 daniel-mar 28258
      });
28259
    };
637 daniel-mar 28260
    var register$1 = function (editor) {
28261
      registerMenuItems$1(editor);
28262
      registerButtons(editor);
597 daniel-mar 28263
    };
28264
 
637 daniel-mar 28265
    var onSetupVisualAidState = function (editor) {
28266
      return onSetupEvent(editor, 'VisualAid', function (api) {
28267
        api.setActive(editor.hasVisual);
28268
      });
597 daniel-mar 28269
    };
637 daniel-mar 28270
    var registerMenuItems = function (editor) {
597 daniel-mar 28271
      editor.ui.registry.addToggleMenuItem('visualaid', {
28272
        text: 'Visual aids',
637 daniel-mar 28273
        onSetup: onSetupVisualAidState(editor),
28274
        onAction: onActionExecCommand(editor, 'mceToggleVisualAid')
597 daniel-mar 28275
      });
28276
    };
28277
    var registerToolbarButton = function (editor) {
28278
      editor.ui.registry.addButton('visualaid', {
28279
        tooltip: 'Visual aids',
28280
        text: 'Visual aids',
637 daniel-mar 28281
        onAction: onActionExecCommand(editor, 'mceToggleVisualAid')
597 daniel-mar 28282
      });
28283
    };
637 daniel-mar 28284
    var register = function (editor) {
597 daniel-mar 28285
      registerToolbarButton(editor);
637 daniel-mar 28286
      registerMenuItems(editor);
597 daniel-mar 28287
    };
28288
 
637 daniel-mar 28289
    var setup$6 = function (editor, backstage) {
28290
      register$6(editor);
28291
      register$2(editor);
28292
      register$4(editor, backstage);
28293
      register$1(editor);
28294
      register$a(editor);
28295
      register(editor);
28296
      register$3(editor);
597 daniel-mar 28297
      register$5(editor);
28298
    };
28299
 
637 daniel-mar 28300
    var nu = function (x, y) {
597 daniel-mar 28301
      return {
637 daniel-mar 28302
        type: 'makeshift',
597 daniel-mar 28303
        x: x,
28304
        y: y
28305
      };
28306
    };
637 daniel-mar 28307
    var transpose = function (pos, dx, dy) {
28308
      return nu(pos.x + dx, pos.y + dy);
597 daniel-mar 28309
    };
637 daniel-mar 28310
    var isTouchEvent = function (e) {
597 daniel-mar 28311
      return e.type === 'longpress' || e.type.indexOf('touch') === 0;
28312
    };
28313
    var fromPageXY = function (e) {
637 daniel-mar 28314
      if (isTouchEvent(e)) {
597 daniel-mar 28315
        var touch = e.touches[0];
637 daniel-mar 28316
        return nu(touch.pageX, touch.pageY);
597 daniel-mar 28317
      } else {
637 daniel-mar 28318
        return nu(e.pageX, e.pageY);
597 daniel-mar 28319
      }
28320
    };
28321
    var fromClientXY = function (e) {
637 daniel-mar 28322
      if (isTouchEvent(e)) {
597 daniel-mar 28323
        var touch = e.touches[0];
637 daniel-mar 28324
        return nu(touch.clientX, touch.clientY);
597 daniel-mar 28325
      } else {
637 daniel-mar 28326
        return nu(e.clientX, e.clientY);
597 daniel-mar 28327
      }
28328
    };
28329
    var transposeContentAreaContainer = function (element, pos) {
679 daniel-mar 28330
      var containerPos = global$b.DOM.getPos(element);
637 daniel-mar 28331
      return transpose(pos, containerPos.x, containerPos.y);
597 daniel-mar 28332
    };
28333
    var getPointAnchor = function (editor, e) {
28334
      if (e.type === 'contextmenu' || e.type === 'longpress') {
28335
        if (editor.inline) {
28336
          return fromPageXY(e);
28337
        } else {
28338
          return transposeContentAreaContainer(editor.getContentAreaContainer(), fromClientXY(e));
28339
        }
28340
      } else {
28341
        return getSelectionAnchor(editor);
28342
      }
28343
    };
28344
    var getSelectionAnchor = function (editor) {
28345
      return {
637 daniel-mar 28346
        type: 'selection',
597 daniel-mar 28347
        root: SugarElement.fromDom(editor.selection.getNode())
28348
      };
28349
    };
637 daniel-mar 28350
    var getNodeAnchor = function (editor) {
597 daniel-mar 28351
      return {
637 daniel-mar 28352
        type: 'node',
597 daniel-mar 28353
        node: Optional.some(SugarElement.fromDom(editor.selection.getNode())),
28354
        root: SugarElement.fromDom(editor.getBody())
28355
      };
28356
    };
637 daniel-mar 28357
    var getAnchorSpec$1 = function (editor, e, anchorType) {
28358
      switch (anchorType) {
28359
      case 'node':
28360
        return getNodeAnchor(editor);
28361
      case 'point':
28362
        return getPointAnchor(editor, e);
28363
      case 'selection':
28364
        return getSelectionAnchor(editor);
28365
      }
28366
    };
597 daniel-mar 28367
 
637 daniel-mar 28368
    var initAndShow$1 = function (editor, e, buildMenu, backstage, contextmenu, anchorType) {
597 daniel-mar 28369
      var items = buildMenu();
637 daniel-mar 28370
      var anchorSpec = getAnchorSpec$1(editor, e, anchorType);
28371
      build(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, false).map(function (menuData) {
597 daniel-mar 28372
        e.preventDefault();
637 daniel-mar 28373
        InlineView.showMenuAt(contextmenu, { anchor: anchorSpec }, {
28374
          menu: { markers: markers('normal') },
597 daniel-mar 28375
          data: menuData
28376
        });
28377
      });
28378
    };
28379
 
28380
    var layouts = {
28381
      onLtr: function () {
28382
        return [
637 daniel-mar 28383
          south$2,
28384
          southeast$2,
28385
          southwest$2,
28386
          northeast$2,
28387
          northwest$2,
28388
          north$2,
28389
          north,
28390
          south,
28391
          northeast,
28392
          southeast,
28393
          northwest,
28394
          southwest
597 daniel-mar 28395
        ];
28396
      },
28397
      onRtl: function () {
28398
        return [
637 daniel-mar 28399
          south$2,
28400
          southwest$2,
28401
          southeast$2,
28402
          northwest$2,
28403
          northeast$2,
28404
          north$2,
28405
          north,
28406
          south,
28407
          northwest,
28408
          southwest,
28409
          northeast,
28410
          southeast
597 daniel-mar 28411
        ];
28412
      }
28413
    };
637 daniel-mar 28414
    var bubbleSize = 12;
28415
    var bubbleAlignments = {
597 daniel-mar 28416
      valignCentre: [],
28417
      alignCentre: [],
28418
      alignLeft: ['tox-pop--align-left'],
28419
      alignRight: ['tox-pop--align-right'],
28420
      right: ['tox-pop--right'],
28421
      left: ['tox-pop--left'],
28422
      bottom: ['tox-pop--bottom'],
28423
      top: ['tox-pop--top']
28424
    };
28425
    var isTouchWithinSelection = function (editor, e) {
28426
      var selection = editor.selection;
28427
      if (selection.isCollapsed() || e.touches.length < 1) {
28428
        return false;
28429
      } else {
28430
        var touch_1 = e.touches[0];
28431
        var rng = selection.getRng();
637 daniel-mar 28432
        var rngRectOpt = getFirstRect(editor.getWin(), SimSelection.domRange(rng));
597 daniel-mar 28433
        return rngRectOpt.exists(function (rngRect) {
28434
          return rngRect.left <= touch_1.clientX && rngRect.right >= touch_1.clientX && rngRect.top <= touch_1.clientY && rngRect.bottom >= touch_1.clientY;
28435
        });
28436
      }
28437
    };
28438
    var setupiOSOverrides = function (editor) {
28439
      var originalSelection = editor.selection.getRng();
28440
      var selectionReset = function () {
679 daniel-mar 28441
        global$f.setEditorTimeout(editor, function () {
597 daniel-mar 28442
          editor.selection.setRng(originalSelection);
28443
        }, 10);
28444
        unbindEventListeners();
28445
      };
28446
      editor.once('touchend', selectionReset);
28447
      var preventMousedown = function (e) {
28448
        e.preventDefault();
28449
        e.stopImmediatePropagation();
28450
      };
28451
      editor.on('mousedown', preventMousedown, true);
28452
      var clearSelectionReset = function () {
28453
        return unbindEventListeners();
28454
      };
28455
      editor.once('longpresscancel', clearSelectionReset);
28456
      var unbindEventListeners = function () {
28457
        editor.off('touchend', selectionReset);
28458
        editor.off('longpresscancel', clearSelectionReset);
28459
        editor.off('mousedown', preventMousedown);
28460
      };
28461
    };
637 daniel-mar 28462
    var getAnchorSpec = function (editor, e, anchorType) {
28463
      var anchorSpec = getAnchorSpec$1(editor, e, anchorType);
28464
      var bubbleYOffset = anchorType === 'point' ? bubbleSize : 0;
28465
      return __assign({
28466
        bubble: nu$5(0, bubbleYOffset, bubbleAlignments),
28467
        layouts: layouts,
28468
        overrides: {
28469
          maxWidthFunction: expandable(),
28470
          maxHeightFunction: expandable$1()
28471
        }
28472
      }, anchorSpec);
28473
    };
28474
    var show = function (editor, e, items, backstage, contextmenu, anchorType, highlightImmediately) {
28475
      var anchorSpec = getAnchorSpec(editor, e, anchorType);
28476
      build(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, true).map(function (menuData) {
597 daniel-mar 28477
        e.preventDefault();
637 daniel-mar 28478
        InlineView.showMenuWithinBounds(contextmenu, { anchor: anchorSpec }, {
597 daniel-mar 28479
          menu: {
637 daniel-mar 28480
            markers: markers('normal'),
597 daniel-mar 28481
            highlightImmediately: highlightImmediately
28482
          },
28483
          data: menuData,
28484
          type: 'horizontal'
28485
        }, function () {
637 daniel-mar 28486
          return Optional.some(getContextToolbarBounds(editor, backstage.shared, anchorType === 'node' ? 'node' : 'selection'));
597 daniel-mar 28487
        });
28488
        editor.fire(hideContextToolbarEvent);
28489
      });
28490
    };
637 daniel-mar 28491
    var initAndShow = function (editor, e, buildMenu, backstage, contextmenu, anchorType) {
28492
      var detection = detect$1();
597 daniel-mar 28493
      var isiOS = detection.os.isiOS();
28494
      var isOSX = detection.os.isOSX();
28495
      var isAndroid = detection.os.isAndroid();
28496
      var isTouch = detection.deviceType.isTouch();
28497
      var shouldHighlightImmediately = function () {
28498
        return !(isAndroid || isiOS || isOSX && isTouch);
28499
      };
28500
      var open = function () {
28501
        var items = buildMenu();
637 daniel-mar 28502
        show(editor, e, items, backstage, contextmenu, anchorType, shouldHighlightImmediately());
597 daniel-mar 28503
      };
637 daniel-mar 28504
      if ((isOSX || isiOS) && anchorType !== 'node') {
597 daniel-mar 28505
        var openiOS_1 = function () {
28506
          setupiOSOverrides(editor);
28507
          open();
28508
        };
28509
        if (isTouchWithinSelection(editor, e)) {
28510
          openiOS_1();
28511
        } else {
28512
          editor.once('selectionchange', openiOS_1);
28513
          editor.once('touchend', function () {
28514
            return editor.off('selectionchange', openiOS_1);
28515
          });
28516
        }
28517
      } else {
28518
        open();
28519
      }
28520
    };
28521
 
28522
    var patchPipeConfig = function (config) {
28523
      return typeof config === 'string' ? config.split(/[ ,]/) : config;
28524
    };
28525
    var shouldNeverUseNative = function (editor) {
28526
      return editor.getParam('contextmenu_never_use_native', false, 'boolean');
28527
    };
28528
    var getMenuItems = function (editor, name, defaultItems) {
28529
      var contextMenus = editor.ui.registry.getAll().contextMenus;
28530
      return Optional.from(editor.getParam(name)).map(patchPipeConfig).getOrThunk(function () {
637 daniel-mar 28531
        return filter$2(patchPipeConfig(defaultItems), function (item) {
28532
          return has$2(contextMenus, item);
597 daniel-mar 28533
        });
28534
      });
28535
    };
28536
    var isContextMenuDisabled = function (editor) {
28537
      return editor.getParam('contextmenu') === false;
28538
    };
28539
    var getContextMenu = function (editor) {
28540
      return getMenuItems(editor, 'contextmenu', 'link linkchecker image imagetools table spellchecker configurepermanentpen');
28541
    };
28542
    var getAvoidOverlapSelector = function (editor) {
28543
      return editor.getParam('contextmenu_avoid_overlap', '', 'string');
28544
    };
28545
 
637 daniel-mar 28546
    var isSeparator = function (item) {
597 daniel-mar 28547
      return isString(item) ? item === '|' : item.type === 'separator';
28548
    };
637 daniel-mar 28549
    var separator = { type: 'separator' };
597 daniel-mar 28550
    var makeContextItem = function (item) {
28551
      var commonMenuItem = function (item) {
28552
        return {
28553
          text: item.text,
28554
          icon: item.icon,
28555
          disabled: item.disabled,
28556
          shortcut: item.shortcut
28557
        };
28558
      };
28559
      if (isString(item)) {
28560
        return item;
28561
      } else {
28562
        switch (item.type) {
28563
        case 'separator':
637 daniel-mar 28564
          return separator;
597 daniel-mar 28565
        case 'submenu':
28566
          return __assign(__assign({ type: 'nestedmenuitem' }, commonMenuItem(item)), {
28567
            getSubmenuItems: function () {
28568
              var items = item.getSubmenuItems();
28569
              if (isString(items)) {
28570
                return items;
28571
              } else {
637 daniel-mar 28572
                return map$2(items, makeContextItem);
597 daniel-mar 28573
              }
28574
            }
28575
          });
28576
        default:
28577
          return __assign(__assign({ type: 'menuitem' }, commonMenuItem(item)), { onAction: noarg(item.onAction) });
28578
        }
28579
      }
28580
    };
28581
    var addContextMenuGroup = function (xs, groupItems) {
28582
      if (groupItems.length === 0) {
28583
        return xs;
28584
      }
637 daniel-mar 28585
      var lastMenuItem = last$2(xs).filter(function (item) {
28586
        return !isSeparator(item);
597 daniel-mar 28587
      });
28588
      var before = lastMenuItem.fold(function () {
28589
        return [];
28590
      }, function (_) {
637 daniel-mar 28591
        return [separator];
597 daniel-mar 28592
      });
637 daniel-mar 28593
      return xs.concat(before).concat(groupItems).concat([separator]);
597 daniel-mar 28594
    };
28595
    var generateContextMenu = function (contextMenus, menuConfig, selectedElement) {
28596
      var sections = foldl(menuConfig, function (acc, name) {
637 daniel-mar 28597
        return get$e(contextMenus, name.toLowerCase()).map(function (menu) {
597 daniel-mar 28598
          var items = menu.update(selectedElement);
28599
          if (isString(items)) {
28600
            return addContextMenuGroup(acc, items.split(' '));
28601
          } else if (items.length > 0) {
637 daniel-mar 28602
            var allItems = map$2(items, makeContextItem);
597 daniel-mar 28603
            return addContextMenuGroup(acc, allItems);
28604
          } else {
28605
            return acc;
28606
          }
28607
        }).getOrThunk(function () {
28608
          return acc.concat([name]);
28609
        });
28610
      }, []);
637 daniel-mar 28611
      if (sections.length > 0 && isSeparator(sections[sections.length - 1])) {
597 daniel-mar 28612
        sections.pop();
28613
      }
28614
      return sections;
28615
    };
28616
    var isNativeOverrideKeyEvent = function (editor, e) {
28617
      return e.ctrlKey && !shouldNeverUseNative(editor);
28618
    };
28619
    var isTriggeredByKeyboard = function (editor, e) {
28620
      return e.type !== 'longpress' && (e.button !== 2 || e.target === editor.getBody() && e.pointerType === '');
28621
    };
28622
    var getSelectedElement = function (editor, e) {
28623
      return isTriggeredByKeyboard(editor, e) ? editor.selection.getStart(true) : e.target;
28624
    };
637 daniel-mar 28625
    var getAnchorType = function (editor, e) {
597 daniel-mar 28626
      var selector = getAvoidOverlapSelector(editor);
637 daniel-mar 28627
      var anchorType = isTriggeredByKeyboard(editor, e) ? 'selection' : 'point';
28628
      if (isNotEmpty(selector)) {
597 daniel-mar 28629
        var target = getSelectedElement(editor, e);
637 daniel-mar 28630
        var selectorExists = closest(SugarElement.fromDom(target), selector);
28631
        return selectorExists ? 'node' : anchorType;
597 daniel-mar 28632
      } else {
637 daniel-mar 28633
        return anchorType;
597 daniel-mar 28634
      }
28635
    };
637 daniel-mar 28636
    var setup$5 = function (editor, lazySink, backstage) {
28637
      var detection = detect$1();
597 daniel-mar 28638
      var isTouch = detection.deviceType.isTouch;
28639
      var contextmenu = build$1(InlineView.sketch({
28640
        dom: { tag: 'div' },
28641
        lazySink: lazySink,
28642
        onEscape: function () {
28643
          return editor.focus();
28644
        },
28645
        onShow: function () {
28646
          return backstage.setContextMenuState(true);
28647
        },
28648
        onHide: function () {
28649
          return backstage.setContextMenuState(false);
28650
        },
28651
        fireDismissalEventInstead: {},
637 daniel-mar 28652
        inlineBehaviours: derive$1([config('dismissContextMenu', [run$1(dismissRequested(), function (comp, _se) {
597 daniel-mar 28653
              Sandboxing.close(comp);
28654
              editor.focus();
28655
            })])])
28656
      }));
28657
      var hideContextMenu = function (_e) {
28658
        return InlineView.hide(contextmenu);
28659
      };
28660
      var showContextMenu = function (e) {
28661
        if (shouldNeverUseNative(editor)) {
28662
          e.preventDefault();
28663
        }
28664
        if (isNativeOverrideKeyEvent(editor, e) || isContextMenuDisabled(editor)) {
28665
          return;
28666
        }
637 daniel-mar 28667
        var anchorType = getAnchorType(editor, e);
597 daniel-mar 28668
        var buildMenu = function () {
28669
          var selectedElement = getSelectedElement(editor, e);
28670
          var registry = editor.ui.registry.getAll();
28671
          var menuConfig = getContextMenu(editor);
28672
          return generateContextMenu(registry.contextMenus, menuConfig, selectedElement);
28673
        };
637 daniel-mar 28674
        var initAndShow$2 = isTouch() ? initAndShow : initAndShow$1;
28675
        initAndShow$2(editor, e, buildMenu, backstage, contextmenu, anchorType);
597 daniel-mar 28676
      };
28677
      editor.on('init', function () {
28678
        var hideEvents = 'ResizeEditor ScrollContent ScrollWindow longpresscancel' + (isTouch() ? '' : ' ResizeWindow');
28679
        editor.on(hideEvents, hideContextMenu);
28680
        editor.on('longpress contextmenu', showContextMenu);
28681
      });
28682
    };
28683
 
637 daniel-mar 28684
    var adt = Adt.generate([
597 daniel-mar 28685
      {
28686
        offset: [
28687
          'x',
28688
          'y'
28689
        ]
28690
      },
28691
      {
28692
        absolute: [
28693
          'x',
28694
          'y'
28695
        ]
28696
      },
28697
      {
28698
        fixed: [
28699
          'x',
28700
          'y'
28701
        ]
28702
      }
28703
    ]);
28704
    var subtract = function (change) {
28705
      return function (point) {
28706
        return point.translate(-change.left, -change.top);
28707
      };
28708
    };
637 daniel-mar 28709
    var add = function (change) {
597 daniel-mar 28710
      return function (point) {
28711
        return point.translate(change.left, change.top);
28712
      };
28713
    };
637 daniel-mar 28714
    var transform = function (changes) {
597 daniel-mar 28715
      return function (x, y) {
28716
        return foldl(changes, function (rest, f) {
28717
          return f(rest);
28718
        }, SugarPosition(x, y));
28719
      };
28720
    };
28721
    var asFixed = function (coord, scroll, origin) {
637 daniel-mar 28722
      return coord.fold(transform([
28723
        add(origin),
597 daniel-mar 28724
        subtract(scroll)
637 daniel-mar 28725
      ]), transform([subtract(scroll)]), transform([]));
597 daniel-mar 28726
    };
28727
    var asAbsolute = function (coord, scroll, origin) {
637 daniel-mar 28728
      return coord.fold(transform([add(origin)]), transform([]), transform([add(scroll)]));
597 daniel-mar 28729
    };
28730
    var asOffset = function (coord, scroll, origin) {
637 daniel-mar 28731
      return coord.fold(transform([]), transform([subtract(origin)]), transform([
28732
        add(scroll),
597 daniel-mar 28733
        subtract(origin)
28734
      ]));
28735
    };
28736
    var withinRange = function (coord1, coord2, xRange, yRange, scroll, origin) {
28737
      var a1 = asAbsolute(coord1, scroll, origin);
28738
      var a2 = asAbsolute(coord2, scroll, origin);
28739
      return Math.abs(a1.left - a2.left) <= xRange && Math.abs(a1.top - a2.top) <= yRange;
28740
    };
28741
    var getDeltas = function (coord1, coord2, xRange, yRange, scroll, origin) {
28742
      var a1 = asAbsolute(coord1, scroll, origin);
28743
      var a2 = asAbsolute(coord2, scroll, origin);
28744
      var left = Math.abs(a1.left - a2.left);
28745
      var top = Math.abs(a1.top - a2.top);
28746
      return SugarPosition(left, top);
28747
    };
28748
    var toStyles = function (coord, scroll, origin) {
28749
      var stylesOpt = coord.fold(function (x, y) {
28750
        return {
28751
          position: Optional.some('absolute'),
28752
          left: Optional.some(x + 'px'),
28753
          top: Optional.some(y + 'px')
28754
        };
28755
      }, function (x, y) {
28756
        return {
28757
          position: Optional.some('absolute'),
28758
          left: Optional.some(x - origin.left + 'px'),
28759
          top: Optional.some(y - origin.top + 'px')
28760
        };
28761
      }, function (x, y) {
28762
        return {
28763
          position: Optional.some('fixed'),
28764
          left: Optional.some(x + 'px'),
28765
          top: Optional.some(y + 'px')
28766
        };
28767
      });
28768
      return __assign({
28769
        right: Optional.none(),
28770
        bottom: Optional.none()
28771
      }, stylesOpt);
28772
    };
637 daniel-mar 28773
    var translate = function (coord, deltaX, deltaY) {
597 daniel-mar 28774
      return coord.fold(function (x, y) {
28775
        return offset(x + deltaX, y + deltaY);
28776
      }, function (x, y) {
637 daniel-mar 28777
        return absolute(x + deltaX, y + deltaY);
597 daniel-mar 28778
      }, function (x, y) {
637 daniel-mar 28779
        return fixed(x + deltaX, y + deltaY);
597 daniel-mar 28780
      });
28781
    };
28782
    var absorb = function (partialCoord, originalCoord, scroll, origin) {
28783
      var absorbOne = function (stencil, nu) {
28784
        return function (optX, optY) {
28785
          var original = stencil(originalCoord, scroll, origin);
28786
          return nu(optX.getOr(original.left), optY.getOr(original.top));
28787
        };
28788
      };
637 daniel-mar 28789
      return partialCoord.fold(absorbOne(asOffset, offset), absorbOne(asAbsolute, absolute), absorbOne(asFixed, fixed));
597 daniel-mar 28790
    };
637 daniel-mar 28791
    var offset = adt.offset;
28792
    var absolute = adt.absolute;
28793
    var fixed = adt.fixed;
597 daniel-mar 28794
 
28795
    var parseAttrToInt = function (element, name) {
679 daniel-mar 28796
      var value = get$d(element, name);
597 daniel-mar 28797
      return isUndefined(value) ? NaN : parseInt(value, 10);
28798
    };
637 daniel-mar 28799
    var get = function (component, snapsInfo) {
597 daniel-mar 28800
      var element = component.element;
28801
      var x = parseAttrToInt(element, snapsInfo.leftAttr);
28802
      var y = parseAttrToInt(element, snapsInfo.topAttr);
28803
      return isNaN(x) || isNaN(y) ? Optional.none() : Optional.some(SugarPosition(x, y));
28804
    };
637 daniel-mar 28805
    var set = function (component, snapsInfo, pt) {
597 daniel-mar 28806
      var element = component.element;
679 daniel-mar 28807
      set$8(element, snapsInfo.leftAttr, pt.left + 'px');
28808
      set$8(element, snapsInfo.topAttr, pt.top + 'px');
597 daniel-mar 28809
    };
28810
    var clear = function (component, snapsInfo) {
28811
      var element = component.element;
679 daniel-mar 28812
      remove$7(element, snapsInfo.leftAttr);
28813
      remove$7(element, snapsInfo.topAttr);
597 daniel-mar 28814
    };
28815
 
28816
    var getCoords = function (component, snapInfo, coord, delta) {
637 daniel-mar 28817
      return get(component, snapInfo).fold(function () {
597 daniel-mar 28818
        return coord;
637 daniel-mar 28819
      }, function (fixed$1) {
28820
        return fixed(fixed$1.left + delta.left, fixed$1.top + delta.top);
597 daniel-mar 28821
      });
28822
    };
28823
    var moveOrSnap = function (component, snapInfo, coord, delta, scroll, origin) {
28824
      var newCoord = getCoords(component, snapInfo, coord, delta);
28825
      var snap = snapInfo.mustSnap ? findClosestSnap(component, snapInfo, newCoord, scroll, origin) : findSnap(component, snapInfo, newCoord, scroll, origin);
28826
      var fixedCoord = asFixed(newCoord, scroll, origin);
637 daniel-mar 28827
      set(component, snapInfo, fixedCoord);
597 daniel-mar 28828
      return snap.fold(function () {
28829
        return {
637 daniel-mar 28830
          coord: fixed(fixedCoord.left, fixedCoord.top),
597 daniel-mar 28831
          extra: Optional.none()
28832
        };
28833
      }, function (spanned) {
28834
        return {
28835
          coord: spanned.output,
28836
          extra: spanned.extra
28837
        };
28838
      });
28839
    };
28840
    var stopDrag = function (component, snapInfo) {
28841
      clear(component, snapInfo);
28842
    };
28843
    var findMatchingSnap = function (snaps, newCoord, scroll, origin) {
28844
      return findMap(snaps, function (snap) {
28845
        var sensor = snap.sensor;
28846
        var inRange = withinRange(newCoord, sensor, snap.range.left, snap.range.top, scroll, origin);
28847
        return inRange ? Optional.some({
28848
          output: absorb(snap.output, newCoord, scroll, origin),
28849
          extra: snap.extra
28850
        }) : Optional.none();
28851
      });
28852
    };
28853
    var findClosestSnap = function (component, snapInfo, newCoord, scroll, origin) {
28854
      var snaps = snapInfo.getSnapPoints(component);
28855
      var matchSnap = findMatchingSnap(snaps, newCoord, scroll, origin);
28856
      return matchSnap.orThunk(function () {
28857
        var bestSnap = foldl(snaps, function (acc, snap) {
28858
          var sensor = snap.sensor;
28859
          var deltas = getDeltas(newCoord, sensor, snap.range.left, snap.range.top, scroll, origin);
28860
          return acc.deltas.fold(function () {
28861
            return {
28862
              deltas: Optional.some(deltas),
28863
              snap: Optional.some(snap)
28864
            };
28865
          }, function (bestDeltas) {
28866
            var currAvg = (deltas.left + deltas.top) / 2;
28867
            var bestAvg = (bestDeltas.left + bestDeltas.top) / 2;
28868
            if (currAvg <= bestAvg) {
28869
              return {
28870
                deltas: Optional.some(deltas),
28871
                snap: Optional.some(snap)
28872
              };
28873
            } else {
28874
              return acc;
28875
            }
28876
          });
28877
        }, {
28878
          deltas: Optional.none(),
28879
          snap: Optional.none()
28880
        });
28881
        return bestSnap.snap.map(function (snap) {
28882
          return {
28883
            output: absorb(snap.output, newCoord, scroll, origin),
28884
            extra: snap.extra
28885
          };
28886
        });
28887
      });
28888
    };
28889
    var findSnap = function (component, snapInfo, newCoord, scroll, origin) {
28890
      var snaps = snapInfo.getSnapPoints(component);
28891
      return findMatchingSnap(snaps, newCoord, scroll, origin);
28892
    };
637 daniel-mar 28893
    var snapTo$1 = function (snap, scroll, origin) {
597 daniel-mar 28894
      return {
28895
        coord: absorb(snap.output, snap.output, scroll, origin),
28896
        extra: snap.extra
28897
      };
28898
    };
28899
 
637 daniel-mar 28900
    var snapTo = function (component, dragConfig, _state, snap) {
597 daniel-mar 28901
      var target = dragConfig.getTarget(component.element);
28902
      if (dragConfig.repositionTarget) {
637 daniel-mar 28903
        var doc = owner$4(component.element);
679 daniel-mar 28904
        var scroll_1 = get$9(doc);
597 daniel-mar 28905
        var origin_1 = getOrigin(target);
637 daniel-mar 28906
        var snapPin = snapTo$1(snap, scroll_1, origin_1);
597 daniel-mar 28907
        var styles = toStyles(snapPin.coord, scroll_1, origin_1);
28908
        setOptions(target, styles);
28909
      }
28910
    };
28911
 
28912
    var DraggingApis = /*#__PURE__*/Object.freeze({
28913
        __proto__: null,
637 daniel-mar 28914
        snapTo: snapTo
597 daniel-mar 28915
    });
28916
 
28917
    var initialAttribute = 'data-initial-z-index';
28918
    var resetZIndex = function (blocker) {
637 daniel-mar 28919
      parent(blocker.element).filter(isElement$2).each(function (root) {
597 daniel-mar 28920
        getOpt(root, initialAttribute).fold(function () {
679 daniel-mar 28921
          return remove$6(root, 'z-index');
597 daniel-mar 28922
        }, function (zIndex) {
679 daniel-mar 28923
          return set$7(root, 'z-index', zIndex);
597 daniel-mar 28924
        });
679 daniel-mar 28925
        remove$7(root, initialAttribute);
597 daniel-mar 28926
      });
28927
    };
28928
    var changeZIndex = function (blocker) {
637 daniel-mar 28929
      parent(blocker.element).filter(isElement$2).each(function (root) {
597 daniel-mar 28930
        getRaw(root, 'z-index').each(function (zindex) {
679 daniel-mar 28931
          set$8(root, initialAttribute, zindex);
597 daniel-mar 28932
        });
679 daniel-mar 28933
        set$7(root, 'z-index', get$c(blocker.element, 'z-index'));
597 daniel-mar 28934
      });
28935
    };
28936
    var instigate = function (anyComponent, blocker) {
28937
      anyComponent.getSystem().addToGui(blocker);
28938
      changeZIndex(blocker);
28939
    };
28940
    var discard = function (blocker) {
28941
      resetZIndex(blocker);
28942
      blocker.getSystem().removeFromGui(blocker);
28943
    };
28944
    var createComponent = function (component, blockerClass, blockerEvents) {
28945
      return component.getSystem().build(Container.sketch({
28946
        dom: {
28947
          styles: {
28948
            'left': '0px',
28949
            'top': '0px',
28950
            'width': '100%',
28951
            'height': '100%',
28952
            'position': 'fixed',
28953
            'z-index': '1000000000000000'
28954
          },
28955
          classes: [blockerClass]
28956
        },
28957
        events: blockerEvents
28958
      }));
28959
    };
28960
 
28961
    var SnapSchema = optionObjOf('snaps', [
637 daniel-mar 28962
      required$1('getSnapPoints'),
597 daniel-mar 28963
      onHandler('onSensor'),
637 daniel-mar 28964
      required$1('leftAttr'),
28965
      required$1('topAttr'),
28966
      defaulted('lazyViewport', win),
28967
      defaulted('mustSnap', false)
597 daniel-mar 28968
    ]);
28969
 
637 daniel-mar 28970
    var schema$6 = [
28971
      defaulted('useFixed', never),
28972
      required$1('blockerClass'),
28973
      defaulted('getTarget', identity$1),
28974
      defaulted('onDrag', noop),
28975
      defaulted('repositionTarget', true),
28976
      defaulted('onDrop', noop),
597 daniel-mar 28977
      defaultedFunction('getBounds', win),
28978
      SnapSchema
28979
    ];
28980
 
28981
    var getCurrentCoord = function (target) {
28982
      return lift3(getRaw(target, 'left'), getRaw(target, 'top'), getRaw(target, 'position'), function (left, top, position) {
637 daniel-mar 28983
        var nu = position === 'fixed' ? fixed : offset;
597 daniel-mar 28984
        return nu(parseInt(left, 10), parseInt(top, 10));
28985
      }).getOrThunk(function () {
637 daniel-mar 28986
        var location = absolute$3(target);
28987
        return absolute(location.left, location.top);
597 daniel-mar 28988
      });
28989
    };
28990
    var clampCoords = function (component, coords, scroll, origin, startData) {
28991
      var bounds = startData.bounds;
28992
      var absoluteCoord = asAbsolute(coords, scroll, origin);
637 daniel-mar 28993
      var newX = clamp$1(absoluteCoord.left, bounds.x, bounds.x + bounds.width - startData.width);
28994
      var newY = clamp$1(absoluteCoord.top, bounds.y, bounds.y + bounds.height - startData.height);
28995
      var newCoords = absolute(newX, newY);
597 daniel-mar 28996
      return coords.fold(function () {
28997
        var offset$1 = asOffset(newCoords, scroll, origin);
28998
        return offset(offset$1.left, offset$1.top);
637 daniel-mar 28999
      }, constant$1(newCoords), function () {
29000
        var fixed$1 = asFixed(newCoords, scroll, origin);
29001
        return fixed(fixed$1.left, fixed$1.top);
597 daniel-mar 29002
      });
29003
    };
29004
    var calcNewCoord = function (component, optSnaps, currentCoord, scroll, origin, delta, startData) {
29005
      var newCoord = optSnaps.fold(function () {
637 daniel-mar 29006
        var translated = translate(currentCoord, delta.left, delta.top);
597 daniel-mar 29007
        var fixedCoord = asFixed(translated, scroll, origin);
637 daniel-mar 29008
        return fixed(fixedCoord.left, fixedCoord.top);
597 daniel-mar 29009
      }, function (snapInfo) {
29010
        var snapping = moveOrSnap(component, snapInfo, currentCoord, delta, scroll, origin);
29011
        snapping.extra.each(function (extra) {
29012
          snapInfo.onSensor(component, extra);
29013
        });
29014
        return snapping.coord;
29015
      });
29016
      return clampCoords(component, newCoord, scroll, origin, startData);
29017
    };
29018
    var dragBy = function (component, dragConfig, startData, delta) {
29019
      var target = dragConfig.getTarget(component.element);
29020
      if (dragConfig.repositionTarget) {
637 daniel-mar 29021
        var doc = owner$4(component.element);
679 daniel-mar 29022
        var scroll_1 = get$9(doc);
597 daniel-mar 29023
        var origin_1 = getOrigin(target);
29024
        var currentCoord = getCurrentCoord(target);
29025
        var newCoord = calcNewCoord(component, dragConfig.snaps, currentCoord, scroll_1, origin_1, delta, startData);
29026
        var styles = toStyles(newCoord, scroll_1, origin_1);
29027
        setOptions(target, styles);
29028
      }
29029
      dragConfig.onDrag(component, target, delta);
29030
    };
29031
 
29032
    var calcStartData = function (dragConfig, comp) {
29033
      return {
29034
        bounds: dragConfig.getBounds(),
679 daniel-mar 29035
        height: getOuter$2(comp.element),
29036
        width: getOuter$1(comp.element)
597 daniel-mar 29037
      };
29038
    };
637 daniel-mar 29039
    var move = function (component, dragConfig, dragState, dragMode, event) {
597 daniel-mar 29040
      var delta = dragState.update(dragMode, event);
29041
      var dragStartData = dragState.getStartData().getOrThunk(function () {
29042
        return calcStartData(dragConfig, component);
29043
      });
29044
      delta.each(function (dlt) {
29045
        dragBy(component, dragConfig, dragStartData, dlt);
29046
      });
29047
    };
29048
    var stop = function (component, blocker, dragConfig, dragState) {
29049
      blocker.each(discard);
29050
      dragConfig.snaps.each(function (snapInfo) {
29051
        stopDrag(component, snapInfo);
29052
      });
29053
      var target = dragConfig.getTarget(component.element);
29054
      dragState.reset();
29055
      dragConfig.onDrop(component, target);
29056
    };
29057
    var handlers = function (events) {
29058
      return function (dragConfig, dragState) {
29059
        var updateStartState = function (comp) {
29060
          dragState.setStartData(calcStartData(dragConfig, comp));
29061
        };
637 daniel-mar 29062
        return derive$2(__spreadArray([run$1(windowScroll(), function (comp) {
597 daniel-mar 29063
            dragState.getStartData().each(function () {
29064
              return updateStartState(comp);
29065
            });
679 daniel-mar 29066
          })], events(dragConfig, dragState, updateStartState), true));
597 daniel-mar 29067
      };
29068
    };
29069
 
637 daniel-mar 29070
    var init$2 = function (dragApi) {
29071
      return derive$2([
29072
        run$1(mousedown(), dragApi.forceDrop),
29073
        run$1(mouseup(), dragApi.drop),
29074
        run$1(mousemove(), function (comp, simulatedEvent) {
597 daniel-mar 29075
          dragApi.move(simulatedEvent.event);
29076
        }),
637 daniel-mar 29077
        run$1(mouseout(), dragApi.delayDrop)
597 daniel-mar 29078
      ]);
29079
    };
29080
 
29081
    var getData$1 = function (event) {
29082
      return Optional.from(SugarPosition(event.x, event.y));
29083
    };
29084
    var getDelta$1 = function (old, nu) {
29085
      return SugarPosition(nu.left - old.left, nu.top - old.top);
29086
    };
29087
 
29088
    var MouseData = /*#__PURE__*/Object.freeze({
29089
        __proto__: null,
29090
        getData: getData$1,
29091
        getDelta: getDelta$1
29092
    });
29093
 
637 daniel-mar 29094
    var events$2 = function (dragConfig, dragState, updateStartState) {
29095
      return [run$1(mousedown(), function (component, simulatedEvent) {
597 daniel-mar 29096
          var raw = simulatedEvent.event.raw;
29097
          if (raw.button !== 0) {
29098
            return;
29099
          }
29100
          simulatedEvent.stop();
29101
          var stop$1 = function () {
29102
            return stop(component, Optional.some(blocker), dragConfig, dragState);
29103
          };
29104
          var delayDrop = DelayedFunction(stop$1, 200);
29105
          var dragApi = {
29106
            drop: stop$1,
29107
            delayDrop: delayDrop.schedule,
29108
            forceDrop: stop$1,
29109
            move: function (event) {
29110
              delayDrop.cancel();
637 daniel-mar 29111
              move(component, dragConfig, dragState, MouseData, event);
597 daniel-mar 29112
            }
29113
          };
637 daniel-mar 29114
          var blocker = createComponent(component, dragConfig.blockerClass, init$2(dragApi));
597 daniel-mar 29115
          var start = function () {
29116
            updateStartState(component);
29117
            instigate(component, blocker);
29118
          };
29119
          start();
29120
        })];
29121
    };
679 daniel-mar 29122
    var schema$5 = __spreadArray(__spreadArray([], schema$6, true), [output$1('dragger', { handlers: handlers(events$2) })], false);
597 daniel-mar 29123
 
637 daniel-mar 29124
    var init$1 = function (dragApi) {
29125
      return derive$2([
29126
        run$1(touchstart(), dragApi.forceDrop),
29127
        run$1(touchend(), dragApi.drop),
29128
        run$1(touchcancel(), dragApi.drop),
29129
        run$1(touchmove(), function (comp, simulatedEvent) {
597 daniel-mar 29130
          dragApi.move(simulatedEvent.event);
29131
        })
29132
      ]);
29133
    };
29134
 
29135
    var getDataFrom = function (touches) {
29136
      var touch = touches[0];
29137
      return Optional.some(SugarPosition(touch.clientX, touch.clientY));
29138
    };
637 daniel-mar 29139
    var getData = function (event) {
597 daniel-mar 29140
      var raw = event.raw;
29141
      var touches = raw.touches;
29142
      return touches.length === 1 ? getDataFrom(touches) : Optional.none();
29143
    };
637 daniel-mar 29144
    var getDelta = function (old, nu) {
597 daniel-mar 29145
      return SugarPosition(nu.left - old.left, nu.top - old.top);
29146
    };
29147
 
29148
    var TouchData = /*#__PURE__*/Object.freeze({
29149
        __proto__: null,
637 daniel-mar 29150
        getData: getData,
29151
        getDelta: getDelta
597 daniel-mar 29152
    });
29153
 
637 daniel-mar 29154
    var events$1 = function (dragConfig, dragState, updateStartState) {
29155
      var blockerSingleton = value$1();
29156
      var stopBlocking = function (component) {
29157
        stop(component, blockerSingleton.get(), dragConfig, dragState);
29158
        blockerSingleton.clear();
29159
      };
597 daniel-mar 29160
      return [
637 daniel-mar 29161
        run$1(touchstart(), function (component, simulatedEvent) {
597 daniel-mar 29162
          simulatedEvent.stop();
637 daniel-mar 29163
          var stop = function () {
29164
            return stopBlocking(component);
597 daniel-mar 29165
          };
29166
          var dragApi = {
637 daniel-mar 29167
            drop: stop,
597 daniel-mar 29168
            delayDrop: noop,
637 daniel-mar 29169
            forceDrop: stop,
597 daniel-mar 29170
            move: function (event) {
637 daniel-mar 29171
              move(component, dragConfig, dragState, TouchData, event);
597 daniel-mar 29172
            }
29173
          };
637 daniel-mar 29174
          var blocker = createComponent(component, dragConfig.blockerClass, init$1(dragApi));
29175
          blockerSingleton.set(blocker);
597 daniel-mar 29176
          var start = function () {
29177
            updateStartState(component);
29178
            instigate(component, blocker);
29179
          };
29180
          start();
29181
        }),
637 daniel-mar 29182
        run$1(touchmove(), function (component, simulatedEvent) {
597 daniel-mar 29183
          simulatedEvent.stop();
637 daniel-mar 29184
          move(component, dragConfig, dragState, TouchData, simulatedEvent.event);
597 daniel-mar 29185
        }),
637 daniel-mar 29186
        run$1(touchend(), function (component, simulatedEvent) {
597 daniel-mar 29187
          simulatedEvent.stop();
637 daniel-mar 29188
          stopBlocking(component);
597 daniel-mar 29189
        }),
637 daniel-mar 29190
        run$1(touchcancel(), stopBlocking)
597 daniel-mar 29191
      ];
29192
    };
679 daniel-mar 29193
    var schema$4 = __spreadArray(__spreadArray([], schema$6, true), [output$1('dragger', { handlers: handlers(events$1) })], false);
597 daniel-mar 29194
 
637 daniel-mar 29195
    var events = function (dragConfig, dragState, updateStartState) {
679 daniel-mar 29196
      return __spreadArray(__spreadArray([], events$2(dragConfig, dragState, updateStartState), true), events$1(dragConfig, dragState, updateStartState), true);
597 daniel-mar 29197
    };
679 daniel-mar 29198
    var schema$3 = __spreadArray(__spreadArray([], schema$6, true), [output$1('dragger', { handlers: handlers(events) })], false);
597 daniel-mar 29199
 
637 daniel-mar 29200
    var mouse = schema$5;
29201
    var touch = schema$4;
29202
    var mouseOrTouch = schema$3;
597 daniel-mar 29203
 
29204
    var DraggingBranches = /*#__PURE__*/Object.freeze({
29205
        __proto__: null,
29206
        mouse: mouse,
29207
        touch: touch,
29208
        mouseOrTouch: mouseOrTouch
29209
    });
29210
 
637 daniel-mar 29211
    var init = function () {
597 daniel-mar 29212
      var previous = Optional.none();
29213
      var startData = Optional.none();
29214
      var reset = function () {
29215
        previous = Optional.none();
29216
        startData = Optional.none();
29217
      };
29218
      var calculateDelta = function (mode, nu) {
29219
        var result = previous.map(function (old) {
29220
          return mode.getDelta(old, nu);
29221
        });
29222
        previous = Optional.some(nu);
29223
        return result;
29224
      };
29225
      var update = function (mode, dragEvent) {
29226
        return mode.getData(dragEvent).bind(function (nuData) {
29227
          return calculateDelta(mode, nuData);
29228
        });
29229
      };
29230
      var setStartData = function (data) {
29231
        startData = Optional.some(data);
29232
      };
29233
      var getStartData = function () {
29234
        return startData;
29235
      };
637 daniel-mar 29236
      var readState = constant$1({});
29237
      return nu$8({
597 daniel-mar 29238
        readState: readState,
29239
        reset: reset,
29240
        update: update,
29241
        getStartData: getStartData,
29242
        setStartData: setStartData
29243
      });
29244
    };
29245
 
29246
    var DragState = /*#__PURE__*/Object.freeze({
29247
        __proto__: null,
637 daniel-mar 29248
        init: init
597 daniel-mar 29249
    });
29250
 
637 daniel-mar 29251
    var Dragging = createModes({
597 daniel-mar 29252
      branchKey: 'mode',
29253
      branches: DraggingBranches,
29254
      name: 'dragging',
29255
      active: {
29256
        events: function (dragConfig, dragState) {
29257
          var dragger = dragConfig.dragger;
29258
          return dragger.handlers(dragConfig, dragState);
29259
        }
29260
      },
29261
      extra: {
29262
        snap: function (sConfig) {
29263
          return {
29264
            sensor: sConfig.sensor,
29265
            range: sConfig.range,
29266
            output: sConfig.output,
29267
            extra: Optional.from(sConfig.extra)
29268
          };
29269
        }
29270
      },
29271
      state: DragState,
29272
      apis: DraggingApis
29273
    });
29274
 
29275
    var snapWidth = 40;
29276
    var snapOffset = snapWidth / 2;
29277
    var calcSnap = function (selectorOpt, td, x, y, width, height) {
29278
      return selectorOpt.fold(function () {
29279
        return Dragging.snap({
637 daniel-mar 29280
          sensor: absolute(x - snapOffset, y - snapOffset),
597 daniel-mar 29281
          range: SugarPosition(width, height),
637 daniel-mar 29282
          output: absolute(Optional.some(x), Optional.some(y)),
597 daniel-mar 29283
          extra: { td: td }
29284
        });
29285
      }, function (selectorHandle) {
29286
        var sensorLeft = x - snapOffset;
29287
        var sensorTop = y - snapOffset;
29288
        var sensorWidth = snapWidth;
29289
        var sensorHeight = snapWidth;
29290
        var rect = selectorHandle.element.dom.getBoundingClientRect();
29291
        return Dragging.snap({
637 daniel-mar 29292
          sensor: absolute(sensorLeft, sensorTop),
597 daniel-mar 29293
          range: SugarPosition(sensorWidth, sensorHeight),
637 daniel-mar 29294
          output: absolute(Optional.some(x - rect.width / 2), Optional.some(y - rect.height / 2)),
597 daniel-mar 29295
          extra: { td: td }
29296
        });
29297
      });
29298
    };
29299
    var getSnapsConfig = function (getSnapPoints, cell, onChange) {
29300
      var isSameCell = function (cellOpt, td) {
29301
        return cellOpt.exists(function (currentTd) {
637 daniel-mar 29302
          return eq(currentTd, td);
597 daniel-mar 29303
        });
29304
      };
29305
      return {
29306
        getSnapPoints: getSnapPoints,
29307
        leftAttr: 'data-drag-left',
29308
        topAttr: 'data-drag-top',
29309
        onSensor: function (component, extra) {
29310
          var td = extra.td;
29311
          if (!isSameCell(cell.get(), td)) {
637 daniel-mar 29312
            cell.set(td);
597 daniel-mar 29313
            onChange(td);
29314
          }
29315
        },
29316
        mustSnap: true
29317
      };
29318
    };
29319
    var createSelector = function (snaps) {
29320
      return record(Button.sketch({
29321
        dom: {
29322
          tag: 'div',
29323
          classes: ['tox-selector']
29324
        },
29325
        buttonBehaviours: derive$1([
29326
          Dragging.config({
29327
            mode: 'mouseOrTouch',
29328
            blockerClass: 'blocker',
29329
            snaps: snaps
29330
          }),
29331
          Unselecting.config({})
29332
        ]),
29333
        eventOrder: {
29334
          mousedown: [
29335
            'dragging',
29336
            'alloy.base.behaviour'
29337
          ],
29338
          touchstart: [
29339
            'dragging',
29340
            'alloy.base.behaviour'
29341
          ]
29342
        }
29343
      }));
29344
    };
637 daniel-mar 29345
    var setup$4 = function (editor, sink) {
597 daniel-mar 29346
      var tlTds = Cell([]);
29347
      var brTds = Cell([]);
29348
      var isVisible = Cell(false);
637 daniel-mar 29349
      var startCell = value$1();
29350
      var finishCell = value$1();
597 daniel-mar 29351
      var getTopLeftSnap = function (td) {
637 daniel-mar 29352
        var box = absolute$2(td);
597 daniel-mar 29353
        return calcSnap(memTopLeft.getOpt(sink), td, box.x, box.y, box.width, box.height);
29354
      };
29355
      var getTopLeftSnaps = function () {
637 daniel-mar 29356
        return map$2(tlTds.get(), function (td) {
597 daniel-mar 29357
          return getTopLeftSnap(td);
29358
        });
29359
      };
29360
      var getBottomRightSnap = function (td) {
637 daniel-mar 29361
        var box = absolute$2(td);
597 daniel-mar 29362
        return calcSnap(memBottomRight.getOpt(sink), td, box.right, box.bottom, box.width, box.height);
29363
      };
29364
      var getBottomRightSnaps = function () {
637 daniel-mar 29365
        return map$2(brTds.get(), function (td) {
597 daniel-mar 29366
          return getBottomRightSnap(td);
29367
        });
29368
      };
29369
      var topLeftSnaps = getSnapsConfig(getTopLeftSnaps, startCell, function (start) {
29370
        finishCell.get().each(function (finish) {
29371
          editor.fire('TableSelectorChange', {
29372
            start: start,
29373
            finish: finish
29374
          });
29375
        });
29376
      });
29377
      var bottomRightSnaps = getSnapsConfig(getBottomRightSnaps, finishCell, function (finish) {
29378
        startCell.get().each(function (start) {
29379
          editor.fire('TableSelectorChange', {
29380
            start: start,
29381
            finish: finish
29382
          });
29383
        });
29384
      });
29385
      var memTopLeft = createSelector(topLeftSnaps);
29386
      var memBottomRight = createSelector(bottomRightSnaps);
29387
      var topLeft = build$1(memTopLeft.asSpec());
29388
      var bottomRight = build$1(memBottomRight.asSpec());
29389
      var showOrHideHandle = function (selector, cell, isAbove, isBelow) {
29390
        var cellRect = cell.dom.getBoundingClientRect();
679 daniel-mar 29391
        remove$6(selector.element, 'display');
597 daniel-mar 29392
        var viewportHeight = defaultView(SugarElement.fromDom(editor.getBody())).dom.innerHeight;
29393
        var aboveViewport = isAbove(cellRect);
29394
        var belowViewport = isBelow(cellRect, viewportHeight);
29395
        if (aboveViewport || belowViewport) {
679 daniel-mar 29396
          set$7(selector.element, 'display', 'none');
597 daniel-mar 29397
        }
29398
      };
29399
      var snapTo = function (selector, cell, getSnapConfig, pos) {
29400
        var snap = getSnapConfig(cell);
29401
        Dragging.snapTo(selector, snap);
29402
        var isAbove = function (rect) {
29403
          return rect[pos] < 0;
29404
        };
29405
        var isBelow = function (rect, viewportHeight) {
29406
          return rect[pos] > viewportHeight;
29407
        };
29408
        showOrHideHandle(selector, cell, isAbove, isBelow);
29409
      };
29410
      var snapTopLeft = function (cell) {
29411
        return snapTo(topLeft, cell, getTopLeftSnap, 'top');
29412
      };
29413
      var snapLastTopLeft = function () {
29414
        return startCell.get().each(snapTopLeft);
29415
      };
29416
      var snapBottomRight = function (cell) {
29417
        return snapTo(bottomRight, cell, getBottomRightSnap, 'bottom');
29418
      };
29419
      var snapLastBottomRight = function () {
29420
        return finishCell.get().each(snapBottomRight);
29421
      };
637 daniel-mar 29422
      if (detect$1().deviceType.isTouch()) {
597 daniel-mar 29423
        editor.on('TableSelectionChange', function (e) {
29424
          if (!isVisible.get()) {
637 daniel-mar 29425
            attach(sink, topLeft);
29426
            attach(sink, bottomRight);
597 daniel-mar 29427
            isVisible.set(true);
29428
          }
637 daniel-mar 29429
          startCell.set(e.start);
29430
          finishCell.set(e.finish);
597 daniel-mar 29431
          e.otherCells.each(function (otherCells) {
29432
            tlTds.set(otherCells.upOrLeftCells);
29433
            brTds.set(otherCells.downOrRightCells);
29434
            snapTopLeft(e.start);
29435
            snapBottomRight(e.finish);
29436
          });
29437
        });
29438
        editor.on('ResizeEditor ResizeWindow ScrollContent', function () {
29439
          snapLastTopLeft();
29440
          snapLastBottomRight();
29441
        });
29442
        editor.on('TableSelectionClear', function () {
29443
          if (isVisible.get()) {
29444
            detach(topLeft);
29445
            detach(bottomRight);
29446
            isVisible.set(false);
29447
          }
637 daniel-mar 29448
          startCell.clear();
29449
          finishCell.clear();
597 daniel-mar 29450
        });
29451
      }
29452
    };
29453
 
637 daniel-mar 29454
    var isHidden = function (elm) {
597 daniel-mar 29455
      if (elm.nodeType === 1) {
29456
        if (elm.nodeName === 'BR' || !!elm.getAttribute('data-mce-bogus')) {
29457
          return true;
29458
        }
29459
        if (elm.getAttribute('data-mce-type') === 'bookmark') {
29460
          return true;
29461
        }
29462
      }
29463
      return false;
29464
    };
29465
    var renderElementPath = function (editor, settings, providersBackstage) {
29466
      if (!settings.delimiter) {
29467
        settings.delimiter = '\xBB';
29468
      }
29469
      var getDataPath = function (data) {
29470
        var parts = data || [];
637 daniel-mar 29471
        var newPathElements = map$2(parts, function (part, index) {
597 daniel-mar 29472
          return Button.sketch({
29473
            dom: {
29474
              tag: 'div',
29475
              classes: ['tox-statusbar__path-item'],
29476
              attributes: {
29477
                'role': 'button',
29478
                'data-index': index,
29479
                'tab-index': -1,
29480
                'aria-level': index + 1
29481
              },
29482
              innerHtml: part.name
29483
            },
29484
            action: function (_btn) {
29485
              editor.focus();
29486
              editor.selection.select(part.element);
29487
              editor.nodeChanged();
29488
            },
29489
            buttonBehaviours: derive$1([
29490
              DisablingConfigs.button(providersBackstage.isDisabled),
29491
              receivingConfig()
29492
            ])
29493
          });
29494
        });
29495
        var divider = {
29496
          dom: {
29497
            tag: 'div',
29498
            classes: ['tox-statusbar__path-divider'],
29499
            attributes: { 'aria-hidden': true },
29500
            innerHtml: ' ' + settings.delimiter + ' '
29501
          }
29502
        };
29503
        return foldl(newPathElements.slice(1), function (acc, element) {
29504
          var newAcc = acc;
29505
          newAcc.push(divider);
29506
          newAcc.push(element);
29507
          return newAcc;
29508
        }, [newPathElements[0]]);
29509
      };
29510
      var updatePath = function (parents) {
29511
        var newPath = [];
29512
        var i = parents.length;
29513
        while (i-- > 0) {
29514
          var parent_1 = parents[i];
637 daniel-mar 29515
          if (parent_1.nodeType === 1 && !isHidden(parent_1)) {
597 daniel-mar 29516
            var args = editor.fire('ResolveName', {
29517
              name: parent_1.nodeName.toLowerCase(),
29518
              target: parent_1
29519
            });
29520
            if (!args.isDefaultPrevented()) {
29521
              newPath.push({
29522
                name: args.name,
29523
                element: parent_1
29524
              });
29525
            }
29526
            if (args.isPropagationStopped()) {
29527
              break;
29528
            }
29529
          }
29530
        }
29531
        return newPath;
29532
      };
29533
      return {
29534
        dom: {
29535
          tag: 'div',
29536
          classes: ['tox-statusbar__path'],
29537
          attributes: { role: 'navigation' }
29538
        },
29539
        behaviours: derive$1([
29540
          Keying.config({
29541
            mode: 'flow',
29542
            selector: 'div[role=button]'
29543
          }),
29544
          Disabling.config({ disabled: providersBackstage.isDisabled }),
29545
          receivingConfig(),
29546
          Tabstopping.config({}),
29547
          Replacing.config({}),
29548
          config('elementPathEvents', [runOnAttached(function (comp, _e) {
29549
              editor.shortcuts.add('alt+F11', 'focus statusbar elementpath', function () {
29550
                return Keying.focusIn(comp);
29551
              });
29552
              editor.on('NodeChange', function (e) {
29553
                var newPath = updatePath(e.parents);
29554
                if (newPath.length > 0) {
29555
                  Replacing.set(comp, getDataPath(newPath));
29556
                } else {
29557
                  Replacing.set(comp, []);
29558
                }
29559
              });
29560
            })])
29561
        ]),
29562
        components: []
29563
      };
29564
    };
29565
 
29566
    var ResizeTypes;
29567
    (function (ResizeTypes) {
29568
      ResizeTypes[ResizeTypes['None'] = 0] = 'None';
29569
      ResizeTypes[ResizeTypes['Both'] = 1] = 'Both';
29570
      ResizeTypes[ResizeTypes['Vertical'] = 2] = 'Vertical';
29571
    }(ResizeTypes || (ResizeTypes = {})));
29572
    var getDimensions = function (editor, deltas, resizeType, originalHeight, originalWidth) {
29573
      var dimensions = {};
29574
      dimensions.height = calcCappedSize(originalHeight + deltas.top, getMinHeightSetting(editor), getMaxHeightSetting(editor));
29575
      if (resizeType === ResizeTypes.Both) {
29576
        dimensions.width = calcCappedSize(originalWidth + deltas.left, getMinWidthSetting(editor), getMaxWidthSetting(editor));
29577
      }
29578
      return dimensions;
29579
    };
637 daniel-mar 29580
    var resize = function (editor, deltas, resizeType) {
597 daniel-mar 29581
      var container = SugarElement.fromDom(editor.getContainer());
679 daniel-mar 29582
      var dimensions = getDimensions(editor, deltas, resizeType, get$b(container), get$a(container));
637 daniel-mar 29583
      each(dimensions, function (val, dim) {
679 daniel-mar 29584
        return set$7(container, dim, numToPx(val));
597 daniel-mar 29585
      });
29586
      fireResizeEditor(editor);
29587
    };
29588
 
29589
    var getResizeType = function (editor) {
29590
      var fallback = !editor.hasPlugin('autoresize');
29591
      var resize = editor.getParam('resize', fallback);
29592
      if (resize === false) {
29593
        return ResizeTypes.None;
29594
      } else if (resize === 'both') {
29595
        return ResizeTypes.Both;
29596
      } else {
29597
        return ResizeTypes.Vertical;
29598
      }
29599
    };
29600
    var keyboardHandler = function (editor, resizeType, x, y) {
29601
      var scale = 20;
29602
      var delta = SugarPosition(x * scale, y * scale);
637 daniel-mar 29603
      resize(editor, delta, resizeType);
597 daniel-mar 29604
      return Optional.some(true);
29605
    };
29606
    var renderResizeHandler = function (editor, providersBackstage) {
29607
      var resizeType = getResizeType(editor);
29608
      if (resizeType === ResizeTypes.None) {
29609
        return Optional.none();
29610
      }
637 daniel-mar 29611
      return Optional.some(render$3('resize-handle', {
29612
        tag: 'div',
29613
        classes: ['tox-statusbar__resize-handle'],
29614
        attributes: { title: providersBackstage.translate('Resize') },
29615
        behaviours: [
597 daniel-mar 29616
          Dragging.config({
29617
            mode: 'mouse',
29618
            repositionTarget: false,
29619
            onDrag: function (_comp, _target, delta) {
637 daniel-mar 29620
              return resize(editor, delta, resizeType);
597 daniel-mar 29621
            },
29622
            blockerClass: 'tox-blocker'
29623
          }),
29624
          Keying.config({
29625
            mode: 'special',
29626
            onLeft: function () {
29627
              return keyboardHandler(editor, resizeType, -1, 0);
29628
            },
29629
            onRight: function () {
29630
              return keyboardHandler(editor, resizeType, 1, 0);
29631
            },
29632
            onUp: function () {
29633
              return keyboardHandler(editor, resizeType, 0, -1);
29634
            },
29635
            onDown: function () {
29636
              return keyboardHandler(editor, resizeType, 0, 1);
29637
            }
29638
          }),
29639
          Tabstopping.config({}),
29640
          Focusing.config({})
637 daniel-mar 29641
        ]
29642
      }, providersBackstage.icons));
597 daniel-mar 29643
    };
29644
 
29645
    var renderWordCount = function (editor, providersBackstage) {
29646
      var _a;
29647
      var replaceCountText = function (comp, count, mode) {
29648
        return Replacing.set(comp, [text(providersBackstage.translate([
29649
            '{0} ' + mode,
29650
            count[mode]
29651
          ]))]);
29652
      };
29653
      return Button.sketch({
29654
        dom: {
29655
          tag: 'button',
29656
          classes: ['tox-statusbar__wordcount']
29657
        },
29658
        components: [],
29659
        buttonBehaviours: derive$1([
29660
          DisablingConfigs.button(providersBackstage.isDisabled),
29661
          receivingConfig(),
29662
          Tabstopping.config({}),
29663
          Replacing.config({}),
29664
          Representing.config({
29665
            store: {
29666
              mode: 'memory',
29667
              initialValue: {
29668
                mode: 'words',
29669
                count: {
29670
                  words: 0,
29671
                  characters: 0
29672
                }
29673
              }
29674
            }
29675
          }),
29676
          config('wordcount-events', [
637 daniel-mar 29677
            runOnExecute$1(function (comp) {
597 daniel-mar 29678
              var currentVal = Representing.getValue(comp);
29679
              var newMode = currentVal.mode === 'words' ? 'characters' : 'words';
29680
              Representing.setValue(comp, {
29681
                mode: newMode,
29682
                count: currentVal.count
29683
              });
29684
              replaceCountText(comp, currentVal.count, newMode);
29685
            }),
29686
            runOnAttached(function (comp) {
29687
              editor.on('wordCountUpdate', function (e) {
29688
                var mode = Representing.getValue(comp).mode;
29689
                Representing.setValue(comp, {
29690
                  mode: mode,
29691
                  count: e.wordCount
29692
                });
29693
                replaceCountText(comp, e.wordCount, mode);
29694
              });
29695
            })
29696
          ])
29697
        ]),
637 daniel-mar 29698
        eventOrder: (_a = {}, _a[execute$5()] = [
597 daniel-mar 29699
          'disabling',
29700
          'alloy.base.behaviour',
29701
          'wordcount-events'
29702
        ], _a)
29703
      });
29704
    };
29705
 
29706
    var renderStatusbar = function (editor, providersBackstage) {
29707
      var renderBranding = function () {
679 daniel-mar 29708
        var label = global$e.translate([
597 daniel-mar 29709
          'Powered by {0}',
29710
          'Tiny'
29711
        ]);
29712
        var linkHtml = '<a href="https://www.tiny.cloud/?utm_campaign=editor_referral&amp;utm_medium=poweredby&amp;utm_source=tinymce&amp;utm_content=v5" rel="noopener" target="_blank" tabindex="-1" aria-label="' + label + '">' + label + '</a>';
29713
        return {
29714
          dom: {
29715
            tag: 'span',
29716
            classes: ['tox-statusbar__branding'],
29717
            innerHtml: linkHtml
29718
          }
29719
        };
29720
      };
29721
      var getTextComponents = function () {
29722
        var components = [];
29723
        if (editor.getParam('elementpath', true, 'boolean')) {
29724
          components.push(renderElementPath(editor, {}, providersBackstage));
29725
        }
29726
        if (editor.hasPlugin('wordcount')) {
29727
          components.push(renderWordCount(editor, providersBackstage));
29728
        }
29729
        if (editor.getParam('branding', true, 'boolean')) {
29730
          components.push(renderBranding());
29731
        }
29732
        if (components.length > 0) {
29733
          return [{
29734
              dom: {
29735
                tag: 'div',
29736
                classes: ['tox-statusbar__text-container']
29737
              },
29738
              components: components
29739
            }];
29740
        }
29741
        return [];
29742
      };
29743
      var getComponents = function () {
29744
        var components = getTextComponents();
29745
        var resizeHandler = renderResizeHandler(editor, providersBackstage);
29746
        return components.concat(resizeHandler.toArray());
29747
      };
29748
      return {
29749
        dom: {
29750
          tag: 'div',
29751
          classes: ['tox-statusbar']
29752
        },
29753
        components: getComponents()
29754
      };
29755
    };
29756
 
637 daniel-mar 29757
    var setup$3 = function (editor) {
597 daniel-mar 29758
      var _a;
29759
      var isInline = editor.inline;
29760
      var mode = isInline ? Inline : Iframe;
29761
      var header = isStickyToolbar(editor) ? StickyHeader : StaticHeader;
29762
      var lazyOuterContainer = Optional.none();
637 daniel-mar 29763
      var platform = detect$1();
597 daniel-mar 29764
      var isIE = platform.browser.isIE();
29765
      var platformClasses = isIE ? ['tox-platform-ie'] : [];
29766
      var isTouch = platform.deviceType.isTouch();
29767
      var touchPlatformClass = 'tox-platform-touch';
29768
      var deviceClasses = isTouch ? [touchPlatformClass] : [];
29769
      var isToolbarBottom = isToolbarLocationBottom(editor);
29770
      var uiContainer = getUiContainer(editor);
679 daniel-mar 29771
      var dirAttributes = global$e.isRtl() ? { attributes: { dir: 'rtl' } } : {};
597 daniel-mar 29772
      var verticalDirAttributes = { attributes: (_a = {}, _a[Attribute] = isToolbarBottom ? AttributeValue.BottomToTop : AttributeValue.TopToBottom, _a) };
29773
      var lazyHeader = function () {
29774
        return lazyOuterContainer.bind(OuterContainer.getHeader);
29775
      };
29776
      var isHeaderDocked = function () {
29777
        return header.isDocked(lazyHeader);
29778
      };
29779
      var resizeUiMothership = function () {
679 daniel-mar 29780
        set$7(uiMothership.element, 'width', document.body.clientWidth + 'px');
597 daniel-mar 29781
      };
29782
      var makeSinkDefinition = function () {
679 daniel-mar 29783
        var isGridUiContainer = eq(body(), uiContainer) && get$c(uiContainer, 'display') === 'grid';
597 daniel-mar 29784
        var sinkSpec = {
29785
          dom: __assign({
29786
            tag: 'div',
29787
            classes: [
29788
              'tox',
29789
              'tox-silver-sink',
29790
              'tox-tinymce-aux'
29791
            ].concat(platformClasses).concat(deviceClasses)
29792
          }, dirAttributes),
29793
          behaviours: derive$1([Positioning.config({
29794
              useFixed: function () {
29795
                return isHeaderDocked();
29796
              }
29797
            })])
29798
        };
29799
        var reactiveWidthSpec = {
29800
          dom: { styles: { width: document.body.clientWidth + 'px' } },
637 daniel-mar 29801
          events: derive$2([run$1(windowResize(), resizeUiMothership)])
597 daniel-mar 29802
        };
29803
        return deepMerge(sinkSpec, isGridUiContainer ? reactiveWidthSpec : {});
29804
      };
29805
      var sink = build$1(makeSinkDefinition());
29806
      var lazySink = function () {
29807
        return Result.value(sink);
29808
      };
29809
      var memAnchorBar = record({
29810
        dom: {
29811
          tag: 'div',
29812
          classes: ['tox-anchorbar']
29813
        }
29814
      });
29815
      var lazyAnchorBar = function () {
29816
        return lazyOuterContainer.bind(function (container) {
29817
          return memAnchorBar.getOpt(container);
29818
        }).getOrDie('Could not find a anchor bar element');
29819
      };
29820
      var lazyToolbar = function () {
29821
        return lazyOuterContainer.bind(function (container) {
29822
          return OuterContainer.getToolbar(container);
29823
        }).getOrDie('Could not find more toolbar element');
29824
      };
29825
      var lazyThrobber = function () {
29826
        return lazyOuterContainer.bind(function (container) {
29827
          return OuterContainer.getThrobber(container);
29828
        }).getOrDie('Could not find throbber element');
29829
      };
637 daniel-mar 29830
      var backstage = init$7(sink, editor, lazyAnchorBar);
597 daniel-mar 29831
      var partMenubar = OuterContainer.parts.menubar({
29832
        dom: {
29833
          tag: 'div',
29834
          classes: ['tox-menubar']
29835
        },
29836
        backstage: backstage,
29837
        onEscape: function () {
29838
          editor.focus();
29839
        }
29840
      });
29841
      var toolbarMode = getToolbarMode(editor);
29842
      var partToolbar = OuterContainer.parts.toolbar(__assign({
29843
        dom: {
29844
          tag: 'div',
29845
          classes: ['tox-toolbar']
29846
        },
29847
        getSink: lazySink,
29848
        providers: backstage.shared.providers,
29849
        onEscape: function () {
29850
          editor.focus();
29851
        },
29852
        type: toolbarMode,
29853
        lazyToolbar: lazyToolbar,
29854
        lazyHeader: function () {
29855
          return lazyHeader().getOrDie('Could not find header element');
29856
        }
29857
      }, verticalDirAttributes));
29858
      var partMultipleToolbar = OuterContainer.parts['multiple-toolbar']({
29859
        dom: {
29860
          tag: 'div',
29861
          classes: ['tox-toolbar-overlord']
29862
        },
29863
        providers: backstage.shared.providers,
29864
        onEscape: function () {
29865
          editor.focus();
29866
        },
29867
        type: toolbarMode
29868
      });
29869
      var partSocket = OuterContainer.parts.socket({
29870
        dom: {
29871
          tag: 'div',
29872
          classes: ['tox-edit-area']
29873
        }
29874
      });
29875
      var partSidebar = OuterContainer.parts.sidebar({
29876
        dom: {
29877
          tag: 'div',
29878
          classes: ['tox-sidebar']
29879
        }
29880
      });
29881
      var partThrobber = OuterContainer.parts.throbber({
29882
        dom: {
29883
          tag: 'div',
29884
          classes: ['tox-throbber']
29885
        },
29886
        backstage: backstage
29887
      });
29888
      var sb = editor.getParam('statusbar', true, 'boolean');
29889
      var statusbar = sb && !isInline ? Optional.some(renderStatusbar(editor, backstage.shared.providers)) : Optional.none();
29890
      var socketSidebarContainer = {
29891
        dom: {
29892
          tag: 'div',
29893
          classes: ['tox-sidebar-wrap']
29894
        },
29895
        components: [
29896
          partSocket,
29897
          partSidebar
29898
        ]
29899
      };
29900
      var hasMultipleToolbar = isMultipleToolbars(editor);
29901
      var hasToolbar = isToolbarEnabled(editor);
29902
      var hasMenubar = isMenubarEnabled(editor);
29903
      var getPartToolbar = function () {
29904
        if (hasMultipleToolbar) {
29905
          return [partMultipleToolbar];
29906
        } else if (hasToolbar) {
29907
          return [partToolbar];
29908
        } else {
29909
          return [];
29910
        }
29911
      };
29912
      var partHeader = OuterContainer.parts.header({
29913
        dom: __assign({
29914
          tag: 'div',
29915
          classes: ['tox-editor-header']
29916
        }, verticalDirAttributes),
29917
        components: flatten([
29918
          hasMenubar ? [partMenubar] : [],
29919
          getPartToolbar(),
29920
          useFixedContainer(editor) ? [] : [memAnchorBar.asSpec()]
29921
        ]),
29922
        sticky: isStickyToolbar(editor),
29923
        editor: editor,
29924
        sharedBackstage: backstage.shared
29925
      });
29926
      var editorComponents = flatten([
29927
        isToolbarBottom ? [] : [partHeader],
29928
        isInline ? [] : [socketSidebarContainer],
29929
        isToolbarBottom ? [partHeader] : []
29930
      ]);
29931
      var editorContainer = {
29932
        dom: {
29933
          tag: 'div',
29934
          classes: ['tox-editor-container']
29935
        },
29936
        components: editorComponents
29937
      };
29938
      var containerComponents = flatten([
29939
        [editorContainer],
29940
        isInline ? [] : statusbar.toArray(),
29941
        [partThrobber]
29942
      ]);
29943
      var isHidden = isDistractionFree(editor);
679 daniel-mar 29944
      var attributes = __assign(__assign({ role: 'application' }, global$e.isRtl() ? { dir: 'rtl' } : {}), isHidden ? { 'aria-hidden': 'true' } : {});
597 daniel-mar 29945
      var outerContainer = build$1(OuterContainer.sketch({
29946
        dom: {
29947
          tag: 'div',
29948
          classes: [
29949
            'tox',
29950
            'tox-tinymce'
29951
          ].concat(isInline ? ['tox-tinymce-inline'] : []).concat(isToolbarBottom ? ['tox-tinymce--toolbar-bottom'] : []).concat(deviceClasses).concat(platformClasses),
29952
          styles: __assign({ visibility: 'hidden' }, isHidden ? {
29953
            opacity: '0',
29954
            border: '0'
29955
          } : {}),
29956
          attributes: attributes
29957
        },
29958
        components: containerComponents,
29959
        behaviours: derive$1([
29960
          receivingConfig(),
29961
          Disabling.config({ disableClass: 'tox-tinymce--disabled' }),
29962
          Keying.config({
29963
            mode: 'cyclic',
29964
            selector: '.tox-menubar, .tox-toolbar, .tox-toolbar__primary, .tox-toolbar__overflow--open, .tox-sidebar__overflow--open, .tox-statusbar__path, .tox-statusbar__wordcount, .tox-statusbar__branding a, .tox-statusbar__resize-handle'
29965
          })
29966
        ])
29967
      }));
29968
      lazyOuterContainer = Optional.some(outerContainer);
29969
      editor.shortcuts.add('alt+F9', 'focus menubar', function () {
29970
        OuterContainer.focusMenubar(outerContainer);
29971
      });
29972
      editor.shortcuts.add('alt+F10', 'focus toolbar', function () {
29973
        OuterContainer.focusToolbar(outerContainer);
29974
      });
29975
      editor.addCommand('ToggleToolbarDrawer', function () {
29976
        OuterContainer.toggleToolbarDrawer(outerContainer);
29977
      });
29978
      editor.addQueryStateHandler('ToggleToolbarDrawer', function () {
29979
        return OuterContainer.isToolbarDrawerToggled(outerContainer);
29980
      });
29981
      var mothership = takeover(outerContainer);
29982
      var uiMothership = takeover(sink);
637 daniel-mar 29983
      setup$b(editor, mothership, uiMothership);
597 daniel-mar 29984
      var getUi = function () {
29985
        var channels = {
29986
          broadcastAll: uiMothership.broadcast,
29987
          broadcastOn: uiMothership.broadcastOn,
29988
          register: noop
29989
        };
29990
        return { channels: channels };
29991
      };
29992
      var setEditorSize = function () {
29993
        var parsedHeight = numToPx(getHeightWithFallback(editor));
29994
        var parsedWidth = numToPx(getWidthWithFallback(editor));
29995
        if (!editor.inline) {
29996
          if (isValidValue('div', 'width', parsedWidth)) {
679 daniel-mar 29997
            set$7(outerContainer.element, 'width', parsedWidth);
597 daniel-mar 29998
          }
29999
          if (isValidValue('div', 'height', parsedHeight)) {
679 daniel-mar 30000
            set$7(outerContainer.element, 'height', parsedHeight);
597 daniel-mar 30001
          } else {
679 daniel-mar 30002
            set$7(outerContainer.element, 'height', '200px');
597 daniel-mar 30003
          }
30004
        }
30005
        return parsedHeight;
30006
      };
30007
      var renderUI = function () {
30008
        header.setup(editor, backstage.shared, lazyHeader);
637 daniel-mar 30009
        setup$6(editor, backstage);
30010
        setup$5(editor, lazySink, backstage);
30011
        setup$8(editor);
597 daniel-mar 30012
        setup$7(editor, lazyThrobber, backstage.shared);
679 daniel-mar 30013
        map$1(getToolbarGroups(editor), function (toolbarGroupButtonConfig, name) {
597 daniel-mar 30014
          editor.ui.registry.addGroupToolbarButton(name, toolbarGroupButtonConfig);
30015
        });
30016
        var _a = editor.ui.registry.getAll(), buttons = _a.buttons, menuItems = _a.menuItems, contextToolbars = _a.contextToolbars, sidebars = _a.sidebars;
30017
        var toolbarOpt = getMultipleToolbarsSetting(editor);
30018
        var rawUiConfig = {
30019
          menuItems: menuItems,
30020
          menus: getMenus(editor),
30021
          menubar: getMenubar(editor),
30022
          toolbar: toolbarOpt.getOrThunk(function () {
30023
            return getToolbar(editor);
30024
          }),
30025
          allowToolbarGroups: toolbarMode === ToolbarMode.floating,
30026
          buttons: buttons,
30027
          sidebar: sidebars
30028
        };
637 daniel-mar 30029
        register$7(editor, contextToolbars, sink, { backstage: backstage });
30030
        setup$4(editor, sink);
597 daniel-mar 30031
        var elm = editor.getElement();
30032
        var height = setEditorSize();
30033
        var uiComponents = {
30034
          mothership: mothership,
30035
          uiMothership: uiMothership,
30036
          outerContainer: outerContainer
30037
        };
30038
        var args = {
30039
          targetNode: elm,
30040
          height: height
30041
        };
30042
        return mode.render(editor, uiComponents, rawUiConfig, backstage, args);
30043
      };
30044
      return {
30045
        mothership: mothership,
30046
        uiMothership: uiMothership,
30047
        backstage: backstage,
30048
        renderUI: renderUI,
30049
        getUi: getUi
30050
      };
30051
    };
30052
 
30053
    var describedBy = function (describedElement, describeElement) {
679 daniel-mar 30054
      var describeId = Optional.from(get$d(describedElement, 'id')).fold(function () {
637 daniel-mar 30055
        var id = generate$6('dialog-describe');
679 daniel-mar 30056
        set$8(describeElement, 'id', id);
597 daniel-mar 30057
        return id;
637 daniel-mar 30058
      }, identity$1);
679 daniel-mar 30059
      set$8(describedElement, 'aria-describedby', describeId);
597 daniel-mar 30060
    };
30061
 
30062
    var labelledBy = function (labelledElement, labelElement) {
30063
      var labelId = getOpt(labelledElement, 'id').fold(function () {
637 daniel-mar 30064
        var id = generate$6('dialog-label');
679 daniel-mar 30065
        set$8(labelElement, 'id', id);
597 daniel-mar 30066
        return id;
637 daniel-mar 30067
      }, identity$1);
679 daniel-mar 30068
      set$8(labelledElement, 'aria-labelledby', labelId);
597 daniel-mar 30069
    };
30070
 
637 daniel-mar 30071
    var schema$2 = constant$1([
30072
      required$1('lazySink'),
597 daniel-mar 30073
      option('dragBlockClass'),
30074
      defaultedFunction('getBounds', win),
637 daniel-mar 30075
      defaulted('useTabstopAt', always),
30076
      defaulted('eventOrder', {}),
30077
      field('modalBehaviours', [Keying]),
597 daniel-mar 30078
      onKeyboardHandler('onExecute'),
30079
      onStrictKeyboardHandler('onEscape')
30080
    ]);
637 daniel-mar 30081
    var basic = { sketch: identity$1 };
30082
    var parts$2 = constant$1([
597 daniel-mar 30083
      optional({
30084
        name: 'draghandle',
30085
        overrides: function (detail, spec) {
30086
          return {
30087
            behaviours: derive$1([Dragging.config({
30088
                mode: 'mouse',
30089
                getTarget: function (handle) {
637 daniel-mar 30090
                  return ancestor(handle, '[role="dialog"]').getOr(handle);
597 daniel-mar 30091
                },
30092
                blockerClass: detail.dragBlockClass.getOrDie(new Error('The drag blocker class was not specified for a dialog with a drag handle: \n' + JSON.stringify(spec, null, 2)).message),
30093
                getBounds: detail.getDragBounds
30094
              })])
30095
          };
30096
        }
30097
      }),
30098
      required({
637 daniel-mar 30099
        schema: [required$1('dom')],
597 daniel-mar 30100
        name: 'title'
30101
      }),
30102
      required({
30103
        factory: basic,
637 daniel-mar 30104
        schema: [required$1('dom')],
597 daniel-mar 30105
        name: 'close'
30106
      }),
30107
      required({
30108
        factory: basic,
637 daniel-mar 30109
        schema: [required$1('dom')],
597 daniel-mar 30110
        name: 'body'
30111
      }),
30112
      optional({
30113
        factory: basic,
637 daniel-mar 30114
        schema: [required$1('dom')],
597 daniel-mar 30115
        name: 'footer'
30116
      }),
30117
      external$1({
30118
        factory: {
30119
          sketch: function (spec, detail) {
30120
            return __assign(__assign({}, spec), {
30121
              dom: detail.dom,
30122
              components: detail.components
30123
            });
30124
          }
30125
        },
30126
        schema: [
637 daniel-mar 30127
          defaulted('dom', {
597 daniel-mar 30128
            tag: 'div',
30129
            styles: {
30130
              position: 'fixed',
30131
              left: '0px',
30132
              top: '0px',
30133
              right: '0px',
30134
              bottom: '0px'
30135
            }
30136
          }),
637 daniel-mar 30137
          defaulted('components', [])
597 daniel-mar 30138
        ],
30139
        name: 'blocker'
30140
      })
30141
    ]);
30142
 
637 daniel-mar 30143
    var factory$4 = function (detail, components, spec, externals) {
597 daniel-mar 30144
      var _a;
637 daniel-mar 30145
      var dialogComp = value$1();
597 daniel-mar 30146
      var showDialog = function (dialog) {
637 daniel-mar 30147
        dialogComp.set(dialog);
597 daniel-mar 30148
        var sink = detail.lazySink(dialog).getOrDie();
30149
        var externalBlocker = externals.blocker();
30150
        var blocker = sink.getSystem().build(__assign(__assign({}, externalBlocker), {
637 daniel-mar 30151
          components: externalBlocker.components.concat([premade(dialog)]),
597 daniel-mar 30152
          behaviours: derive$1([
30153
            Focusing.config({}),
30154
            config('dialog-blocker-events', [runOnSource(focusin(), function () {
30155
                Keying.focusIn(dialog);
30156
              })])
30157
          ])
30158
        }));
637 daniel-mar 30159
        attach(sink, blocker);
597 daniel-mar 30160
        Keying.focusIn(dialog);
30161
      };
30162
      var hideDialog = function (dialog) {
637 daniel-mar 30163
        dialogComp.clear();
597 daniel-mar 30164
        parent(dialog.element).each(function (blockerDom) {
30165
          dialog.getSystem().getByDom(blockerDom).each(function (blocker) {
30166
            detach(blocker);
30167
          });
30168
        });
30169
      };
30170
      var getDialogBody = function (dialog) {
30171
        return getPartOrDie(dialog, detail, 'body');
30172
      };
30173
      var getDialogFooter = function (dialog) {
30174
        return getPartOrDie(dialog, detail, 'footer');
30175
      };
30176
      var setBusy = function (dialog, getBusySpec) {
30177
        Blocking.block(dialog, getBusySpec);
30178
      };
30179
      var setIdle = function (dialog) {
30180
        Blocking.unblock(dialog);
30181
      };
637 daniel-mar 30182
      var modalEventsId = generate$6('modal-events');
597 daniel-mar 30183
      var eventOrder = __assign(__assign({}, detail.eventOrder), (_a = {}, _a[attachedToDom()] = [modalEventsId].concat(detail.eventOrder['alloy.system.attached'] || []), _a));
30184
      return {
30185
        uid: detail.uid,
30186
        dom: detail.dom,
30187
        components: components,
30188
        apis: {
30189
          show: showDialog,
30190
          hide: hideDialog,
30191
          getBody: getDialogBody,
30192
          getFooter: getDialogFooter,
30193
          setIdle: setIdle,
30194
          setBusy: setBusy
30195
        },
30196
        eventOrder: eventOrder,
30197
        domModification: {
30198
          attributes: {
30199
            'role': 'dialog',
30200
            'aria-modal': 'true'
30201
          }
30202
        },
30203
        behaviours: augment(detail.modalBehaviours, [
30204
          Replacing.config({}),
30205
          Keying.config({
30206
            mode: 'cyclic',
30207
            onEnter: detail.onExecute,
30208
            onEscape: detail.onEscape,
30209
            useTabstopAt: detail.useTabstopAt
30210
          }),
30211
          Blocking.config({ getRoot: dialogComp.get }),
30212
          config(modalEventsId, [runOnAttached(function (c) {
30213
              labelledBy(c.element, getPartOrDie(c, detail, 'title').element);
30214
              describedBy(c.element, getPartOrDie(c, detail, 'body').element);
30215
            })])
30216
        ])
30217
      };
30218
    };
637 daniel-mar 30219
    var ModalDialog = composite({
597 daniel-mar 30220
      name: 'ModalDialog',
637 daniel-mar 30221
      configFields: schema$2(),
30222
      partFields: parts$2(),
30223
      factory: factory$4,
597 daniel-mar 30224
      apis: {
30225
        show: function (apis, dialog) {
30226
          apis.show(dialog);
30227
        },
30228
        hide: function (apis, dialog) {
30229
          apis.hide(dialog);
30230
        },
30231
        getBody: function (apis, dialog) {
30232
          return apis.getBody(dialog);
30233
        },
30234
        getFooter: function (apis, dialog) {
30235
          return apis.getFooter(dialog);
30236
        },
30237
        setBusy: function (apis, dialog, getBusySpec) {
30238
          apis.setBusy(dialog, getBusySpec);
30239
        },
30240
        setIdle: function (apis, dialog) {
30241
          apis.setIdle(dialog);
30242
        }
30243
      }
30244
    });
30245
 
30246
    var dialogToggleMenuItemSchema = objOf([
637 daniel-mar 30247
      requiredString('type'),
30248
      requiredString('name')
597 daniel-mar 30249
    ].concat(commonMenuItemFields));
30250
    var dialogToggleMenuItemDataProcessor = boolean;
30251
 
30252
    var baseFooterButtonFields = [
637 daniel-mar 30253
      field$1('name', 'name', defaultedThunk(function () {
30254
        return generate$6('button-name');
597 daniel-mar 30255
      }), string),
30256
      optionString('icon'),
30257
      defaultedStringEnum('align', 'end', [
30258
        'start',
30259
        'end'
30260
      ]),
30261
      defaultedBoolean('primary', false),
30262
      defaultedBoolean('disabled', false)
30263
    ];
679 daniel-mar 30264
    var dialogFooterButtonFields = __spreadArray(__spreadArray([], baseFooterButtonFields, true), [requiredString('text')], false);
637 daniel-mar 30265
    var normalFooterButtonFields = __spreadArray([requiredStringEnum('type', [
597 daniel-mar 30266
        'submit',
30267
        'cancel',
30268
        'custom'
679 daniel-mar 30269
      ])], dialogFooterButtonFields, true);
637 daniel-mar 30270
    var menuFooterButtonFields = __spreadArray([
30271
      requiredStringEnum('type', ['menu']),
597 daniel-mar 30272
      optionString('text'),
30273
      optionString('tooltip'),
30274
      optionString('icon'),
637 daniel-mar 30275
      requiredArrayOf('items', dialogToggleMenuItemSchema)
679 daniel-mar 30276
    ], baseFooterButtonFields, true);
597 daniel-mar 30277
    var dialogFooterButtonSchema = choose$1('type', {
30278
      submit: normalFooterButtonFields,
30279
      cancel: normalFooterButtonFields,
30280
      custom: normalFooterButtonFields,
30281
      menu: menuFooterButtonFields
30282
    });
30283
 
30284
    var alertBannerFields = [
637 daniel-mar 30285
      requiredString('type'),
30286
      requiredString('text'),
30287
      requiredStringEnum('level', [
597 daniel-mar 30288
        'info',
30289
        'warn',
30290
        'error',
30291
        'success'
30292
      ]),
637 daniel-mar 30293
      requiredString('icon'),
30294
      defaulted('url', '')
597 daniel-mar 30295
    ];
30296
    var alertBannerSchema = objOf(alertBannerFields);
30297
 
30298
    var createBarFields = function (itemsField) {
30299
      return [
637 daniel-mar 30300
        requiredString('type'),
597 daniel-mar 30301
        itemsField
30302
      ];
30303
    };
30304
 
30305
    var buttonFields = [
637 daniel-mar 30306
      requiredString('type'),
30307
      requiredString('text'),
597 daniel-mar 30308
      defaultedBoolean('disabled', false),
30309
      defaultedBoolean('primary', false),
637 daniel-mar 30310
      field$1('name', 'name', defaultedThunk(function () {
30311
        return generate$6('button-name');
597 daniel-mar 30312
      }), string),
30313
      optionString('icon'),
30314
      defaultedBoolean('borderless', false)
30315
    ];
30316
    var buttonSchema = objOf(buttonFields);
30317
 
30318
    var checkboxFields = [
637 daniel-mar 30319
      requiredString('type'),
30320
      requiredString('name'),
30321
      requiredString('label'),
597 daniel-mar 30322
      defaultedBoolean('disabled', false)
30323
    ];
30324
    var checkboxSchema = objOf(checkboxFields);
30325
    var checkboxDataProcessor = boolean;
30326
 
30327
    var formComponentFields = [
637 daniel-mar 30328
      requiredString('type'),
30329
      requiredString('name')
597 daniel-mar 30330
    ];
30331
    var formComponentWithLabelFields = formComponentFields.concat([optionString('label')]);
30332
 
637 daniel-mar 30333
    var collectionFields = formComponentWithLabelFields.concat([defaulted('columns', 'auto')]);
597 daniel-mar 30334
    var collectionSchema = objOf(collectionFields);
637 daniel-mar 30335
    var collectionDataProcessor = arrOfObj([
30336
      requiredString('value'),
30337
      requiredString('text'),
30338
      requiredString('icon')
597 daniel-mar 30339
    ]);
30340
 
30341
    var colorInputFields = formComponentWithLabelFields;
30342
    var colorInputSchema = objOf(colorInputFields);
30343
    var colorInputDataProcessor = string;
30344
 
30345
    var colorPickerFields = formComponentWithLabelFields;
30346
    var colorPickerSchema = objOf(colorPickerFields);
30347
    var colorPickerDataProcessor = string;
30348
 
30349
    var customEditorFields = formComponentFields.concat([
30350
      defaultedString('tag', 'textarea'),
637 daniel-mar 30351
      requiredString('scriptId'),
30352
      requiredString('scriptUrl'),
597 daniel-mar 30353
      defaultedPostMsg('settings', undefined)
30354
    ]);
30355
    var customEditorFieldsOld = formComponentFields.concat([
30356
      defaultedString('tag', 'textarea'),
637 daniel-mar 30357
      requiredFunction('init')
597 daniel-mar 30358
    ]);
30359
    var customEditorSchema = valueOf(function (v) {
30360
      return asRaw('customeditor.old', objOfOnly(customEditorFieldsOld), v).orThunk(function () {
30361
        return asRaw('customeditor.new', objOfOnly(customEditorFields), v);
30362
      });
30363
    });
30364
    var customEditorDataProcessor = string;
30365
 
30366
    var dropZoneFields = formComponentWithLabelFields;
30367
    var dropZoneSchema = objOf(dropZoneFields);
30368
    var dropZoneDataProcessor = arrOfVal();
30369
 
30370
    var createGridFields = function (itemsField) {
30371
      return [
637 daniel-mar 30372
        requiredString('type'),
30373
        requiredNumber('columns'),
597 daniel-mar 30374
        itemsField
30375
      ];
30376
    };
30377
 
30378
    var htmlPanelFields = [
637 daniel-mar 30379
      requiredString('type'),
30380
      requiredString('html'),
597 daniel-mar 30381
      defaultedStringEnum('presets', 'presentation', [
30382
        'presentation',
30383
        'document'
30384
      ])
30385
    ];
30386
    var htmlPanelSchema = objOf(htmlPanelFields);
30387
 
30388
    var iframeFields = formComponentWithLabelFields.concat([defaultedBoolean('sandboxed', true)]);
30389
    var iframeSchema = objOf(iframeFields);
30390
    var iframeDataProcessor = string;
30391
 
637 daniel-mar 30392
    var imageToolsFields = formComponentWithLabelFields.concat([requiredOf('currentState', objOf([
30393
        required$1('blob'),
30394
        requiredString('url')
597 daniel-mar 30395
      ]))]);
30396
    var imageToolsSchema = objOf(imageToolsFields);
30397
 
30398
    var inputFields = formComponentWithLabelFields.concat([
30399
      optionString('inputMode'),
30400
      optionString('placeholder'),
30401
      defaultedBoolean('maximized', false),
30402
      defaultedBoolean('disabled', false)
30403
    ]);
30404
    var inputSchema = objOf(inputFields);
30405
    var inputDataProcessor = string;
30406
 
30407
    var createLabelFields = function (itemsField) {
30408
      return [
637 daniel-mar 30409
        requiredString('type'),
30410
        requiredString('label'),
597 daniel-mar 30411
        itemsField
30412
      ];
30413
    };
30414
 
30415
    var listBoxSingleItemFields = [
637 daniel-mar 30416
      requiredString('text'),
30417
      requiredString('value')
597 daniel-mar 30418
    ];
30419
    var listBoxNestedItemFields = [
637 daniel-mar 30420
      requiredString('text'),
30421
      requiredArrayOf('items', thunkOf('items', function () {
597 daniel-mar 30422
        return listBoxItemSchema;
30423
      }))
30424
    ];
30425
    var listBoxItemSchema = oneOf([
30426
      objOf(listBoxSingleItemFields),
30427
      objOf(listBoxNestedItemFields)
30428
    ]);
30429
    var listBoxFields = formComponentWithLabelFields.concat([
637 daniel-mar 30430
      requiredArrayOf('items', listBoxItemSchema),
597 daniel-mar 30431
      defaultedBoolean('disabled', false)
30432
    ]);
30433
    var listBoxSchema = objOf(listBoxFields);
30434
    var listBoxDataProcessor = string;
30435
 
30436
    var selectBoxFields = formComponentWithLabelFields.concat([
637 daniel-mar 30437
      requiredArrayOfObj('items', [
30438
        requiredString('text'),
30439
        requiredString('value')
597 daniel-mar 30440
      ]),
30441
      defaultedNumber('size', 1),
30442
      defaultedBoolean('disabled', false)
30443
    ]);
30444
    var selectBoxSchema = objOf(selectBoxFields);
30445
    var selectBoxDataProcessor = string;
30446
 
30447
    var sizeInputFields = formComponentWithLabelFields.concat([
30448
      defaultedBoolean('constrain', true),
30449
      defaultedBoolean('disabled', false)
30450
    ]);
30451
    var sizeInputSchema = objOf(sizeInputFields);
30452
    var sizeInputDataProcessor = objOf([
637 daniel-mar 30453
      requiredString('width'),
30454
      requiredString('height')
597 daniel-mar 30455
    ]);
30456
 
30457
    var tableFields = [
637 daniel-mar 30458
      requiredString('type'),
30459
      requiredArrayOf('header', string),
30460
      requiredArrayOf('cells', arrOf(string))
597 daniel-mar 30461
    ];
30462
    var tableSchema = objOf(tableFields);
30463
 
30464
    var textAreaFields = formComponentWithLabelFields.concat([
30465
      optionString('placeholder'),
30466
      defaultedBoolean('maximized', false),
30467
      defaultedBoolean('disabled', false)
30468
    ]);
30469
    var textAreaSchema = objOf(textAreaFields);
30470
    var textAreaDataProcessor = string;
30471
 
30472
    var urlInputFields = formComponentWithLabelFields.concat([
30473
      defaultedStringEnum('filetype', 'file', [
30474
        'image',
30475
        'media',
30476
        'file'
30477
      ]),
637 daniel-mar 30478
      defaulted('disabled', false)
597 daniel-mar 30479
    ]);
30480
    var urlInputSchema = objOf(urlInputFields);
30481
    var urlInputDataProcessor = objOf([
637 daniel-mar 30482
      requiredString('value'),
30483
      defaulted('meta', {})
597 daniel-mar 30484
    ]);
30485
 
30486
    var createItemsField = function (name) {
637 daniel-mar 30487
      return field$1('items', 'items', required$2(), arrOf(valueOf(function (v) {
30488
        return asRaw('Checking item of ' + name, itemSchema, v).fold(function (sErr) {
597 daniel-mar 30489
          return Result.error(formatError(sErr));
30490
        }, function (passValue) {
30491
          return Result.value(passValue);
30492
        });
30493
      })));
30494
    };
637 daniel-mar 30495
    var itemSchema = valueThunk(function () {
30496
      return choose$2('type', {
597 daniel-mar 30497
        alertbanner: alertBannerSchema,
30498
        bar: objOf(createBarFields(createItemsField('bar'))),
30499
        button: buttonSchema,
30500
        checkbox: checkboxSchema,
30501
        colorinput: colorInputSchema,
30502
        colorpicker: colorPickerSchema,
30503
        dropzone: dropZoneSchema,
30504
        grid: objOf(createGridFields(createItemsField('grid'))),
30505
        iframe: iframeSchema,
30506
        input: inputSchema,
30507
        listbox: listBoxSchema,
30508
        selectbox: selectBoxSchema,
30509
        sizeinput: sizeInputSchema,
30510
        textarea: textAreaSchema,
30511
        urlinput: urlInputSchema,
30512
        customeditor: customEditorSchema,
30513
        htmlpanel: htmlPanelSchema,
30514
        imagetools: imageToolsSchema,
30515
        collection: collectionSchema,
30516
        label: objOf(createLabelFields(createItemsField('label'))),
30517
        table: tableSchema,
30518
        panel: panelSchema
30519
      });
30520
    });
30521
    var panelFields = [
637 daniel-mar 30522
      requiredString('type'),
30523
      defaulted('classes', []),
30524
      requiredArrayOf('items', itemSchema)
597 daniel-mar 30525
    ];
30526
    var panelSchema = objOf(panelFields);
30527
 
30528
    var tabFields = [
637 daniel-mar 30529
      field$1('name', 'name', defaultedThunk(function () {
30530
        return generate$6('tab-name');
597 daniel-mar 30531
      }), string),
637 daniel-mar 30532
      requiredString('title'),
30533
      requiredArrayOf('items', itemSchema)
597 daniel-mar 30534
    ];
30535
    var tabPanelFields = [
637 daniel-mar 30536
      requiredString('type'),
30537
      requiredArrayOfObj('tabs', tabFields)
597 daniel-mar 30538
    ];
30539
    var tabPanelSchema = objOf(tabPanelFields);
30540
 
30541
    var dialogButtonFields = dialogFooterButtonFields;
30542
    var dialogButtonSchema = dialogFooterButtonSchema;
30543
    var dialogSchema = objOf([
637 daniel-mar 30544
      requiredString('title'),
30545
      requiredOf('body', choose$2('type', {
597 daniel-mar 30546
        panel: panelSchema,
30547
        tabpanel: tabPanelSchema
30548
      })),
30549
      defaultedString('size', 'normal'),
637 daniel-mar 30550
      requiredArrayOf('buttons', dialogButtonSchema),
30551
      defaulted('initialData', {}),
597 daniel-mar 30552
      defaultedFunction('onAction', noop),
30553
      defaultedFunction('onChange', noop),
30554
      defaultedFunction('onSubmit', noop),
30555
      defaultedFunction('onClose', noop),
30556
      defaultedFunction('onCancel', noop),
637 daniel-mar 30557
      defaulted('onTabChange', noop)
597 daniel-mar 30558
    ]);
30559
    var createDialog = function (spec) {
30560
      return asRaw('dialog', dialogSchema, spec);
30561
    };
30562
 
637 daniel-mar 30563
    var urlDialogButtonSchema = objOf(__spreadArray([requiredStringEnum('type', [
597 daniel-mar 30564
        'cancel',
30565
        'custom'
679 daniel-mar 30566
      ])], dialogButtonFields, true));
597 daniel-mar 30567
    var urlDialogSchema = objOf([
637 daniel-mar 30568
      requiredString('title'),
30569
      requiredString('url'),
597 daniel-mar 30570
      optionNumber('height'),
30571
      optionNumber('width'),
30572
      optionArrayOf('buttons', urlDialogButtonSchema),
30573
      defaultedFunction('onAction', noop),
30574
      defaultedFunction('onCancel', noop),
30575
      defaultedFunction('onClose', noop),
30576
      defaultedFunction('onMessage', noop)
30577
    ]);
30578
    var createUrlDialog = function (spec) {
30579
      return asRaw('dialog', urlDialogSchema, spec);
30580
    };
30581
 
30582
    var getAllObjects = function (obj) {
30583
      if (isObject(obj)) {
637 daniel-mar 30584
        return [obj].concat(bind$3(values(obj), getAllObjects));
597 daniel-mar 30585
      } else if (isArray(obj)) {
637 daniel-mar 30586
        return bind$3(obj, getAllObjects);
597 daniel-mar 30587
      } else {
30588
        return [];
30589
      }
30590
    };
30591
 
30592
    var isNamedItem = function (obj) {
30593
      return isString(obj.type) && isString(obj.name);
30594
    };
30595
    var dataProcessors = {
30596
      checkbox: checkboxDataProcessor,
30597
      colorinput: colorInputDataProcessor,
30598
      colorpicker: colorPickerDataProcessor,
30599
      dropzone: dropZoneDataProcessor,
30600
      input: inputDataProcessor,
30601
      iframe: iframeDataProcessor,
30602
      sizeinput: sizeInputDataProcessor,
30603
      selectbox: selectBoxDataProcessor,
30604
      listbox: listBoxDataProcessor,
30605
      size: sizeInputDataProcessor,
30606
      textarea: textAreaDataProcessor,
30607
      urlinput: urlInputDataProcessor,
30608
      customeditor: customEditorDataProcessor,
30609
      collection: collectionDataProcessor,
30610
      togglemenuitem: dialogToggleMenuItemDataProcessor
30611
    };
30612
    var getDataProcessor = function (item) {
30613
      return Optional.from(dataProcessors[item.type]);
30614
    };
30615
    var getNamedItems = function (structure) {
637 daniel-mar 30616
      return filter$2(getAllObjects(structure), isNamedItem);
597 daniel-mar 30617
    };
30618
 
30619
    var createDataValidator = function (structure) {
30620
      var namedItems = getNamedItems(structure);
637 daniel-mar 30621
      var fields = bind$3(namedItems, function (item) {
597 daniel-mar 30622
        return getDataProcessor(item).fold(function () {
30623
          return [];
30624
        }, function (schema) {
637 daniel-mar 30625
          return [requiredOf(item.name, schema)];
597 daniel-mar 30626
        });
30627
      });
30628
      return objOf(fields);
30629
    };
30630
 
637 daniel-mar 30631
    var extract = function (structure) {
597 daniel-mar 30632
      var internalDialog = getOrDie(createDialog(structure));
30633
      var dataValidator = createDataValidator(structure);
30634
      var initialData = structure.initialData;
30635
      return {
30636
        internalDialog: internalDialog,
30637
        dataValidator: dataValidator,
30638
        initialData: initialData
30639
      };
30640
    };
30641
    var DialogManager = {
30642
      open: function (factory, structure) {
637 daniel-mar 30643
        var extraction = extract(structure);
597 daniel-mar 30644
        return factory(extraction.internalDialog, extraction.initialData, extraction.dataValidator);
30645
      },
30646
      openUrl: function (factory, structure) {
30647
        var internalDialog = getOrDie(createUrlDialog(structure));
30648
        return factory(internalDialog);
30649
      },
30650
      redial: function (structure) {
637 daniel-mar 30651
        return extract(structure);
597 daniel-mar 30652
      }
30653
    };
30654
 
30655
    var toValidValues = function (values) {
30656
      var errors = [];
30657
      var result = {};
637 daniel-mar 30658
      each(values, function (value, name) {
597 daniel-mar 30659
        value.fold(function () {
30660
          errors.push(name);
30661
        }, function (v) {
30662
          result[name] = v;
30663
        });
30664
      });
30665
      return errors.length > 0 ? Result.error(errors) : Result.value(result);
30666
    };
30667
 
30668
    var renderBodyPanel = function (spec, backstage) {
30669
      var memForm = record(Form.sketch(function (parts) {
30670
        return {
30671
          dom: {
30672
            tag: 'div',
30673
            classes: ['tox-form'].concat(spec.classes)
30674
          },
637 daniel-mar 30675
          components: map$2(spec.items, function (item) {
597 daniel-mar 30676
            return interpretInForm(parts, item, backstage);
30677
          })
30678
        };
30679
      }));
30680
      return {
30681
        dom: {
30682
          tag: 'div',
30683
          classes: ['tox-dialog__body']
30684
        },
30685
        components: [{
30686
            dom: {
30687
              tag: 'div',
30688
              classes: ['tox-dialog__body-content']
30689
            },
30690
            components: [memForm.asSpec()]
30691
          }],
30692
        behaviours: derive$1([
30693
          Keying.config({
30694
            mode: 'acyclic',
30695
            useTabstopAt: not(isPseudoStop)
30696
          }),
30697
          ComposingConfigs.memento(memForm),
30698
          RepresentingConfigs.memento(memForm, {
30699
            postprocess: function (formValue) {
30700
              return toValidValues(formValue).fold(function (err) {
30701
                console.error(err);
30702
                return {};
637 daniel-mar 30703
              }, identity$1);
597 daniel-mar 30704
            }
30705
          })
30706
        ])
30707
      };
30708
    };
30709
 
637 daniel-mar 30710
    var factory$3 = function (detail, _spec) {
597 daniel-mar 30711
      return {
30712
        uid: detail.uid,
30713
        dom: detail.dom,
30714
        components: detail.components,
637 daniel-mar 30715
        events: events$a(detail.action),
597 daniel-mar 30716
        behaviours: augment(detail.tabButtonBehaviours, [
30717
          Focusing.config({}),
30718
          Keying.config({
30719
            mode: 'execution',
30720
            useSpace: true,
30721
            useEnter: true
30722
          }),
30723
          Representing.config({
30724
            store: {
30725
              mode: 'memory',
30726
              initialValue: detail.value
30727
            }
30728
          })
30729
        ]),
30730
        domModification: detail.domModification
30731
      };
30732
    };
637 daniel-mar 30733
    var TabButton = single({
597 daniel-mar 30734
      name: 'TabButton',
30735
      configFields: [
637 daniel-mar 30736
        defaulted('uid', undefined),
30737
        required$1('value'),
30738
        field$1('dom', 'dom', mergeWithThunk(function () {
597 daniel-mar 30739
          return {
30740
            attributes: {
30741
              'role': 'tab',
637 daniel-mar 30742
              'id': generate$6('aria'),
597 daniel-mar 30743
              'aria-selected': 'false'
30744
            }
30745
          };
637 daniel-mar 30746
        }), anyValue()),
597 daniel-mar 30747
        option('action'),
637 daniel-mar 30748
        defaulted('domModification', {}),
30749
        field('tabButtonBehaviours', [
597 daniel-mar 30750
          Focusing,
30751
          Keying,
30752
          Representing
30753
        ]),
637 daniel-mar 30754
        required$1('view')
597 daniel-mar 30755
      ],
637 daniel-mar 30756
      factory: factory$3
597 daniel-mar 30757
    });
30758
 
637 daniel-mar 30759
    var schema$1 = constant$1([
30760
      required$1('tabs'),
30761
      required$1('dom'),
30762
      defaulted('clickToDismiss', false),
30763
      field('tabbarBehaviours', [
597 daniel-mar 30764
        Highlighting,
30765
        Keying
30766
      ]),
637 daniel-mar 30767
      markers$1([
597 daniel-mar 30768
        'tabClass',
30769
        'selectedClass'
30770
      ])
30771
    ]);
30772
    var tabsPart = group({
30773
      factory: TabButton,
30774
      name: 'tabs',
30775
      unit: 'tab',
30776
      overrides: function (barDetail) {
30777
        var dismissTab$1 = function (tabbar, button) {
30778
          Highlighting.dehighlight(tabbar, button);
30779
          emitWith(tabbar, dismissTab(), {
30780
            tabbar: tabbar,
30781
            button: button
30782
          });
30783
        };
30784
        var changeTab$1 = function (tabbar, button) {
30785
          Highlighting.highlight(tabbar, button);
30786
          emitWith(tabbar, changeTab(), {
30787
            tabbar: tabbar,
30788
            button: button
30789
          });
30790
        };
30791
        return {
30792
          action: function (button) {
30793
            var tabbar = button.getSystem().getByUid(barDetail.uid).getOrDie();
30794
            var activeButton = Highlighting.isHighlighted(tabbar, button);
30795
            var response = function () {
30796
              if (activeButton && barDetail.clickToDismiss) {
30797
                return dismissTab$1;
30798
              } else if (!activeButton) {
30799
                return changeTab$1;
30800
              } else {
30801
                return noop;
30802
              }
30803
            }();
30804
            response(tabbar, button);
30805
          },
30806
          domModification: { classes: [barDetail.markers.tabClass] }
30807
        };
30808
      }
30809
    });
637 daniel-mar 30810
    var parts$1 = constant$1([tabsPart]);
597 daniel-mar 30811
 
637 daniel-mar 30812
    var factory$2 = function (detail, components, _spec, _externals) {
597 daniel-mar 30813
      return {
30814
        'uid': detail.uid,
30815
        'dom': detail.dom,
30816
        components: components,
30817
        'debug.sketcher': 'Tabbar',
30818
        'domModification': { attributes: { role: 'tablist' } },
30819
        'behaviours': augment(detail.tabbarBehaviours, [
30820
          Highlighting.config({
30821
            highlightClass: detail.markers.selectedClass,
30822
            itemClass: detail.markers.tabClass,
30823
            onHighlight: function (tabbar, tab) {
679 daniel-mar 30824
              set$8(tab.element, 'aria-selected', 'true');
597 daniel-mar 30825
            },
30826
            onDehighlight: function (tabbar, tab) {
679 daniel-mar 30827
              set$8(tab.element, 'aria-selected', 'false');
597 daniel-mar 30828
            }
30829
          }),
30830
          Keying.config({
30831
            mode: 'flow',
30832
            getInitial: function (tabbar) {
30833
              return Highlighting.getHighlighted(tabbar).map(function (tab) {
30834
                return tab.element;
30835
              });
30836
            },
30837
            selector: '.' + detail.markers.tabClass,
30838
            executeOnMove: true
30839
          })
30840
        ])
30841
      };
30842
    };
637 daniel-mar 30843
    var Tabbar = composite({
597 daniel-mar 30844
      name: 'Tabbar',
637 daniel-mar 30845
      configFields: schema$1(),
30846
      partFields: parts$1(),
30847
      factory: factory$2
597 daniel-mar 30848
    });
30849
 
637 daniel-mar 30850
    var factory$1 = function (detail, _spec) {
597 daniel-mar 30851
      return {
30852
        uid: detail.uid,
30853
        dom: detail.dom,
30854
        behaviours: augment(detail.tabviewBehaviours, [Replacing.config({})]),
30855
        domModification: { attributes: { role: 'tabpanel' } }
30856
      };
30857
    };
637 daniel-mar 30858
    var Tabview = single({
597 daniel-mar 30859
      name: 'Tabview',
637 daniel-mar 30860
      configFields: [field('tabviewBehaviours', [Replacing])],
30861
      factory: factory$1
597 daniel-mar 30862
    });
30863
 
637 daniel-mar 30864
    var schema = constant$1([
30865
      defaulted('selectFirst', true),
597 daniel-mar 30866
      onHandler('onChangeTab'),
30867
      onHandler('onDismissTab'),
637 daniel-mar 30868
      defaulted('tabs', []),
30869
      field('tabSectionBehaviours', [])
597 daniel-mar 30870
    ]);
30871
    var barPart = required({
30872
      factory: Tabbar,
30873
      schema: [
637 daniel-mar 30874
        required$1('dom'),
30875
        requiredObjOf('markers', [
30876
          required$1('tabClass'),
30877
          required$1('selectedClass')
597 daniel-mar 30878
        ])
30879
      ],
30880
      name: 'tabbar',
30881
      defaults: function (detail) {
30882
        return { tabs: detail.tabs };
30883
      }
30884
    });
30885
    var viewPart = required({
30886
      factory: Tabview,
30887
      name: 'tabview'
30888
    });
637 daniel-mar 30889
    var parts = constant$1([
597 daniel-mar 30890
      barPart,
30891
      viewPart
30892
    ]);
30893
 
637 daniel-mar 30894
    var factory = function (detail, components, _spec, _externals) {
597 daniel-mar 30895
      var changeTab$1 = function (button) {
30896
        var tabValue = Representing.getValue(button);
30897
        getPart(button, detail, 'tabview').each(function (tabview) {
637 daniel-mar 30898
          var tabWithValue = find$5(detail.tabs, function (t) {
597 daniel-mar 30899
            return t.value === tabValue;
30900
          });
30901
          tabWithValue.each(function (tabData) {
30902
            var panel = tabData.view();
30903
            getOpt(button.element, 'id').each(function (id) {
679 daniel-mar 30904
              set$8(tabview.element, 'aria-labelledby', id);
597 daniel-mar 30905
            });
30906
            Replacing.set(tabview, panel);
30907
            detail.onChangeTab(tabview, button, panel);
30908
          });
30909
        });
30910
      };
30911
      var changeTabBy = function (section, byPred) {
30912
        getPart(section, detail, 'tabbar').each(function (tabbar) {
30913
          byPred(tabbar).each(emitExecute);
30914
        });
30915
      };
30916
      return {
30917
        uid: detail.uid,
30918
        dom: detail.dom,
30919
        components: components,
637 daniel-mar 30920
        behaviours: get$2(detail.tabSectionBehaviours),
30921
        events: derive$2(flatten([
597 daniel-mar 30922
          detail.selectFirst ? [runOnAttached(function (section, _simulatedEvent) {
30923
              changeTabBy(section, Highlighting.getFirst);
30924
            })] : [],
30925
          [
637 daniel-mar 30926
            run$1(changeTab(), function (section, simulatedEvent) {
597 daniel-mar 30927
              var button = simulatedEvent.event.button;
30928
              changeTab$1(button);
30929
            }),
637 daniel-mar 30930
            run$1(dismissTab(), function (section, simulatedEvent) {
597 daniel-mar 30931
              var button = simulatedEvent.event.button;
30932
              detail.onDismissTab(section, button);
30933
            })
30934
          ]
30935
        ])),
30936
        apis: {
30937
          getViewItems: function (section) {
30938
            return getPart(section, detail, 'tabview').map(function (tabview) {
30939
              return Replacing.contents(tabview);
30940
            }).getOr([]);
30941
          },
30942
          showTab: function (section, tabKey) {
30943
            var getTabIfNotActive = function (tabbar) {
30944
              var candidates = Highlighting.getCandidates(tabbar);
637 daniel-mar 30945
              var optTab = find$5(candidates, function (c) {
597 daniel-mar 30946
                return Representing.getValue(c) === tabKey;
30947
              });
30948
              return optTab.filter(function (tab) {
30949
                return !Highlighting.isHighlighted(tabbar, tab);
30950
              });
30951
            };
30952
            changeTabBy(section, getTabIfNotActive);
30953
          }
30954
        }
30955
      };
30956
    };
637 daniel-mar 30957
    var TabSection = composite({
597 daniel-mar 30958
      name: 'TabSection',
637 daniel-mar 30959
      configFields: schema(),
30960
      partFields: parts(),
30961
      factory: factory,
597 daniel-mar 30962
      apis: {
30963
        getViewItems: function (apis, component) {
30964
          return apis.getViewItems(component);
30965
        },
30966
        showTab: function (apis, component, tabKey) {
30967
          apis.showTab(component, tabKey);
30968
        }
30969
      }
30970
    });
30971
 
30972
    var measureHeights = function (allTabs, tabview, tabviewComp) {
637 daniel-mar 30973
      return map$2(allTabs, function (_tab, i) {
597 daniel-mar 30974
        Replacing.set(tabviewComp, allTabs[i].view());
30975
        var rect = tabview.dom.getBoundingClientRect();
30976
        Replacing.set(tabviewComp, []);
30977
        return rect.height;
30978
      });
30979
    };
30980
    var getMaxHeight = function (heights) {
30981
      return head(sort(heights, function (a, b) {
30982
        if (a > b) {
30983
          return -1;
30984
        } else if (a < b) {
30985
          return +1;
30986
        } else {
30987
          return 0;
30988
        }
30989
      }));
30990
    };
30991
    var getMaxTabviewHeight = function (dialog, tabview, tablist) {
30992
      var documentElement$1 = documentElement(dialog).dom;
637 daniel-mar 30993
      var rootElm = ancestor(dialog, '.tox-dialog-wrap').getOr(dialog);
679 daniel-mar 30994
      var isFixed = get$c(rootElm, 'position') === 'fixed';
597 daniel-mar 30995
      var maxHeight;
30996
      if (isFixed) {
30997
        maxHeight = Math.max(documentElement$1.clientHeight, window.innerHeight);
30998
      } else {
30999
        maxHeight = Math.max(documentElement$1.offsetHeight, documentElement$1.scrollHeight);
31000
      }
679 daniel-mar 31001
      var tabviewHeight = get$b(tabview);
31002
      var isTabListBeside = tabview.dom.offsetLeft >= tablist.dom.offsetLeft + get$a(tablist);
31003
      var currentTabHeight = isTabListBeside ? Math.max(get$b(tablist), tabviewHeight) : tabviewHeight;
31004
      var dialogTopMargin = parseInt(get$c(dialog, 'margin-top'), 10) || 0;
31005
      var dialogBottomMargin = parseInt(get$c(dialog, 'margin-bottom'), 10) || 0;
31006
      var dialogHeight = get$b(dialog) + dialogTopMargin + dialogBottomMargin;
597 daniel-mar 31007
      var chromeHeight = dialogHeight - currentTabHeight;
31008
      return maxHeight - chromeHeight;
31009
    };
31010
    var showTab = function (allTabs, comp) {
31011
      head(allTabs).each(function (tab) {
31012
        return TabSection.showTab(comp, tab.value);
31013
      });
31014
    };
31015
    var setTabviewHeight = function (tabview, height) {
679 daniel-mar 31016
      set$7(tabview, 'height', height + 'px');
637 daniel-mar 31017
      if (!detect$1().browser.isIE()) {
679 daniel-mar 31018
        set$7(tabview, 'flex-basis', height + 'px');
597 daniel-mar 31019
      } else {
679 daniel-mar 31020
        remove$6(tabview, 'flex-basis');
597 daniel-mar 31021
      }
31022
    };
31023
    var updateTabviewHeight = function (dialogBody, tabview, maxTabHeight) {
637 daniel-mar 31024
      ancestor(dialogBody, '[role="dialog"]').each(function (dialog) {
31025
        descendant(dialog, '[role="tablist"]').each(function (tablist) {
597 daniel-mar 31026
          maxTabHeight.get().map(function (height) {
679 daniel-mar 31027
            set$7(tabview, 'height', '0');
31028
            set$7(tabview, 'flex-basis', '0');
597 daniel-mar 31029
            return Math.min(height, getMaxTabviewHeight(dialog, tabview, tablist));
31030
          }).each(function (height) {
31031
            setTabviewHeight(tabview, height);
31032
          });
31033
        });
31034
      });
31035
    };
31036
    var getTabview = function (dialog) {
637 daniel-mar 31037
      return descendant(dialog, '[role="tabpanel"]');
597 daniel-mar 31038
    };
31039
    var setMode = function (allTabs) {
31040
      var smartTabHeight = function () {
637 daniel-mar 31041
        var maxTabHeight = value$1();
597 daniel-mar 31042
        var extraEvents = [
31043
          runOnAttached(function (comp) {
31044
            var dialog = comp.element;
31045
            getTabview(dialog).each(function (tabview) {
679 daniel-mar 31046
              set$7(tabview, 'visibility', 'hidden');
597 daniel-mar 31047
              comp.getSystem().getByDom(tabview).toOptional().each(function (tabviewComp) {
31048
                var heights = measureHeights(allTabs, tabview, tabviewComp);
31049
                var maxTabHeightOpt = getMaxHeight(heights);
637 daniel-mar 31050
                maxTabHeightOpt.fold(maxTabHeight.clear, maxTabHeight.set);
597 daniel-mar 31051
              });
31052
              updateTabviewHeight(dialog, tabview, maxTabHeight);
679 daniel-mar 31053
              remove$6(tabview, 'visibility');
597 daniel-mar 31054
              showTab(allTabs, comp);
679 daniel-mar 31055
              global$f.requestAnimationFrame(function () {
597 daniel-mar 31056
                updateTabviewHeight(dialog, tabview, maxTabHeight);
31057
              });
31058
            });
31059
          }),
637 daniel-mar 31060
          run$1(windowResize(), function (comp) {
597 daniel-mar 31061
            var dialog = comp.element;
31062
            getTabview(dialog).each(function (tabview) {
31063
              updateTabviewHeight(dialog, tabview, maxTabHeight);
31064
            });
31065
          }),
637 daniel-mar 31066
          run$1(formResizeEvent, function (comp, _se) {
597 daniel-mar 31067
            var dialog = comp.element;
31068
            getTabview(dialog).each(function (tabview) {
31069
              var oldFocus = active(getRootNode(tabview));
679 daniel-mar 31070
              set$7(tabview, 'visibility', 'hidden');
597 daniel-mar 31071
              var oldHeight = getRaw(tabview, 'height').map(function (h) {
31072
                return parseInt(h, 10);
31073
              });
679 daniel-mar 31074
              remove$6(tabview, 'height');
31075
              remove$6(tabview, 'flex-basis');
597 daniel-mar 31076
              var newHeight = tabview.dom.getBoundingClientRect().height;
31077
              var hasGrown = oldHeight.forall(function (h) {
31078
                return newHeight > h;
31079
              });
31080
              if (hasGrown) {
637 daniel-mar 31081
                maxTabHeight.set(newHeight);
597 daniel-mar 31082
                updateTabviewHeight(dialog, tabview, maxTabHeight);
31083
              } else {
31084
                oldHeight.each(function (h) {
31085
                  setTabviewHeight(tabview, h);
31086
                });
31087
              }
679 daniel-mar 31088
              remove$6(tabview, 'visibility');
637 daniel-mar 31089
              oldFocus.each(focus$3);
597 daniel-mar 31090
            });
31091
          })
31092
        ];
31093
        var selectFirst = false;
31094
        return {
31095
          extraEvents: extraEvents,
31096
          selectFirst: selectFirst
31097
        };
31098
      }();
31099
      var naiveTabHeight = function () {
31100
        var extraEvents = [];
31101
        var selectFirst = true;
31102
        return {
31103
          extraEvents: extraEvents,
31104
          selectFirst: selectFirst
31105
        };
31106
      }();
31107
      return {
31108
        smartTabHeight: smartTabHeight,
31109
        naiveTabHeight: naiveTabHeight
31110
      };
31111
    };
31112
 
31113
    var SendDataToSectionChannel = 'send-data-to-section';
31114
    var SendDataToViewChannel = 'send-data-to-view';
31115
    var renderTabPanel = function (spec, backstage) {
31116
      var storedValue = Cell({});
31117
      var updateDataWithForm = function (form) {
31118
        var formData = Representing.getValue(form);
31119
        var validData = toValidValues(formData).getOr({});
31120
        var currentData = storedValue.get();
31121
        var newData = deepMerge(currentData, validData);
31122
        storedValue.set(newData);
31123
      };
31124
      var setDataOnForm = function (form) {
31125
        var tabData = storedValue.get();
31126
        Representing.setValue(form, tabData);
31127
      };
31128
      var oldTab = Cell(null);
637 daniel-mar 31129
      var allTabs = map$2(spec.tabs, function (tab) {
597 daniel-mar 31130
        return {
31131
          value: tab.name,
31132
          dom: {
31133
            tag: 'div',
31134
            classes: ['tox-dialog__body-nav-item'],
31135
            innerHtml: backstage.shared.providers.translate(tab.title)
31136
          },
31137
          view: function () {
31138
            return [Form.sketch(function (parts) {
31139
                return {
31140
                  dom: {
31141
                    tag: 'div',
31142
                    classes: ['tox-form']
31143
                  },
637 daniel-mar 31144
                  components: map$2(tab.items, function (item) {
597 daniel-mar 31145
                    return interpretInForm(parts, item, backstage);
31146
                  }),
31147
                  formBehaviours: derive$1([
31148
                    Keying.config({
31149
                      mode: 'acyclic',
31150
                      useTabstopAt: not(isPseudoStop)
31151
                    }),
31152
                    config('TabView.form.events', [
31153
                      runOnAttached(setDataOnForm),
31154
                      runOnDetached(updateDataWithForm)
31155
                    ]),
31156
                    Receiving.config({
637 daniel-mar 31157
                      channels: wrapAll([
597 daniel-mar 31158
                        {
31159
                          key: SendDataToSectionChannel,
31160
                          value: { onReceive: updateDataWithForm }
31161
                        },
31162
                        {
31163
                          key: SendDataToViewChannel,
31164
                          value: { onReceive: setDataOnForm }
31165
                        }
31166
                      ])
31167
                    })
31168
                  ])
31169
                };
31170
              })];
31171
          }
31172
        };
31173
      });
31174
      var tabMode = setMode(allTabs).smartTabHeight;
31175
      return TabSection.sketch({
31176
        dom: {
31177
          tag: 'div',
31178
          classes: ['tox-dialog__body']
31179
        },
31180
        onChangeTab: function (section, button, _viewItems) {
31181
          var name = Representing.getValue(button);
31182
          emitWith(section, formTabChangeEvent, {
31183
            name: name,
31184
            oldName: oldTab.get()
31185
          });
31186
          oldTab.set(name);
31187
        },
31188
        tabs: allTabs,
31189
        components: [
31190
          TabSection.parts.tabbar({
31191
            dom: {
31192
              tag: 'div',
31193
              classes: ['tox-dialog__body-nav']
31194
            },
31195
            components: [Tabbar.parts.tabs({})],
31196
            markers: {
31197
              tabClass: 'tox-tab',
31198
              selectedClass: 'tox-dialog__body-nav-item--active'
31199
            },
31200
            tabbarBehaviours: derive$1([Tabstopping.config({})])
31201
          }),
31202
          TabSection.parts.tabview({
31203
            dom: {
31204
              tag: 'div',
31205
              classes: ['tox-dialog__body-content']
31206
            }
31207
          })
31208
        ],
31209
        selectFirst: tabMode.selectFirst,
31210
        tabSectionBehaviours: derive$1([
31211
          config('tabpanel', tabMode.extraEvents),
31212
          Keying.config({ mode: 'acyclic' }),
31213
          Composing.config({
31214
            find: function (comp) {
31215
              return head(TabSection.getViewItems(comp));
31216
            }
31217
          }),
31218
          Representing.config({
31219
            store: {
31220
              mode: 'manual',
31221
              getValue: function (tsection) {
31222
                tsection.getSystem().broadcastOn([SendDataToSectionChannel], {});
31223
                return storedValue.get();
31224
              },
31225
              setValue: function (tsection, value) {
31226
                storedValue.set(value);
31227
                tsection.getSystem().broadcastOn([SendDataToViewChannel], {});
31228
              }
31229
            }
31230
          })
31231
        ])
31232
      });
31233
    };
31234
 
637 daniel-mar 31235
    var dialogChannel = generate$6('update-dialog');
31236
    var titleChannel = generate$6('update-title');
31237
    var bodyChannel = generate$6('update-body');
31238
    var footerChannel = generate$6('update-footer');
31239
    var bodySendMessageChannel = generate$6('body-send-message');
597 daniel-mar 31240
 
31241
    var renderBody = function (spec, id, backstage, ariaAttrs) {
31242
      var renderComponents = function (incoming) {
31243
        switch (incoming.body.type) {
31244
        case 'tabpanel': {
31245
            return [renderTabPanel(incoming.body, backstage)];
31246
          }
31247
        default: {
31248
            return [renderBodyPanel(incoming.body, backstage)];
31249
          }
31250
        }
31251
      };
31252
      var updateState = function (_comp, incoming) {
31253
        return Optional.some({
31254
          isTabPanel: function () {
31255
            return incoming.body.type === 'tabpanel';
31256
          }
31257
        });
31258
      };
31259
      var ariaAttributes = { 'aria-live': 'polite' };
31260
      return {
31261
        dom: {
31262
          tag: 'div',
31263
          classes: ['tox-dialog__content-js'],
31264
          attributes: __assign(__assign({}, id.map(function (x) {
31265
            return { id: x };
31266
          }).getOr({})), ariaAttrs ? ariaAttributes : {})
31267
        },
31268
        components: [],
31269
        behaviours: derive$1([
31270
          ComposingConfigs.childAt(0),
31271
          Reflecting.config({
31272
            channel: bodyChannel,
31273
            updateState: updateState,
31274
            renderComponents: renderComponents,
31275
            initialData: spec
31276
          })
31277
        ])
31278
      };
31279
    };
31280
    var renderInlineBody = function (spec, contentId, backstage, ariaAttrs) {
31281
      return renderBody(spec, Optional.some(contentId), backstage, ariaAttrs);
31282
    };
31283
    var renderModalBody = function (spec, backstage) {
31284
      var bodySpec = renderBody(spec, Optional.none(), backstage, false);
31285
      return ModalDialog.parts.body(bodySpec);
31286
    };
31287
    var renderIframeBody = function (spec) {
31288
      var bodySpec = {
31289
        dom: {
31290
          tag: 'div',
31291
          classes: ['tox-dialog__content-js']
31292
        },
31293
        components: [{
31294
            dom: {
31295
              tag: 'div',
31296
              classes: ['tox-dialog__body-iframe']
31297
            },
31298
            components: [craft({
31299
                dom: {
31300
                  tag: 'iframe',
31301
                  attributes: { src: spec.url }
31302
                },
31303
                behaviours: derive$1([
31304
                  Tabstopping.config({}),
31305
                  Focusing.config({})
31306
                ])
31307
              })]
31308
          }],
31309
        behaviours: derive$1([Keying.config({
31310
            mode: 'acyclic',
31311
            useTabstopAt: not(isPseudoStop)
31312
          })])
31313
      };
31314
      return ModalDialog.parts.body(bodySpec);
31315
    };
31316
 
679 daniel-mar 31317
    var isTouch = global$9.deviceType.isTouch();
597 daniel-mar 31318
    var hiddenHeader = function (title, close) {
31319
      return {
31320
        dom: {
31321
          tag: 'div',
31322
          styles: { display: 'none' },
31323
          classes: ['tox-dialog__header']
31324
        },
31325
        components: [
31326
          title,
31327
          close
31328
        ]
31329
      };
31330
    };
31331
    var pClose = function (onClose, providersBackstage) {
31332
      return ModalDialog.parts.close(Button.sketch({
31333
        dom: {
31334
          tag: 'button',
31335
          classes: [
31336
            'tox-button',
31337
            'tox-button--icon',
31338
            'tox-button--naked'
31339
          ],
31340
          attributes: {
31341
            'type': 'button',
31342
            'aria-label': providersBackstage.translate('Close')
31343
          }
31344
        },
31345
        action: onClose,
31346
        buttonBehaviours: derive$1([Tabstopping.config({})])
31347
      }));
31348
    };
31349
    var pUntitled = function () {
31350
      return ModalDialog.parts.title({
31351
        dom: {
31352
          tag: 'div',
31353
          classes: ['tox-dialog__title'],
31354
          innerHtml: '',
31355
          styles: { display: 'none' }
31356
        }
31357
      });
31358
    };
31359
    var pBodyMessage = function (message, providersBackstage) {
31360
      return ModalDialog.parts.body({
31361
        dom: {
31362
          tag: 'div',
31363
          classes: ['tox-dialog__body']
31364
        },
31365
        components: [{
31366
            dom: {
31367
              tag: 'div',
31368
              classes: ['tox-dialog__body-content']
31369
            },
637 daniel-mar 31370
            components: [{ dom: fromHtml('<p>' + providersBackstage.translate(message) + '</p>') }]
597 daniel-mar 31371
          }]
31372
      });
31373
    };
31374
    var pFooter = function (buttons) {
31375
      return ModalDialog.parts.footer({
31376
        dom: {
31377
          tag: 'div',
31378
          classes: ['tox-dialog__footer']
31379
        },
31380
        components: buttons
31381
      });
31382
    };
31383
    var pFooterGroup = function (startButtons, endButtons) {
31384
      return [
31385
        Container.sketch({
31386
          dom: {
31387
            tag: 'div',
31388
            classes: ['tox-dialog__footer-start']
31389
          },
31390
          components: startButtons
31391
        }),
31392
        Container.sketch({
31393
          dom: {
31394
            tag: 'div',
31395
            classes: ['tox-dialog__footer-end']
31396
          },
31397
          components: endButtons
31398
        })
31399
      ];
31400
    };
637 daniel-mar 31401
    var renderDialog$1 = function (spec) {
597 daniel-mar 31402
      var _a;
31403
      var dialogClass = 'tox-dialog';
31404
      var blockerClass = dialogClass + '-wrap';
31405
      var blockerBackdropClass = blockerClass + '__backdrop';
31406
      var scrollLockClass = dialogClass + '__disable-scroll';
31407
      return ModalDialog.sketch({
31408
        lazySink: spec.lazySink,
31409
        onEscape: function (comp) {
31410
          spec.onEscape(comp);
31411
          return Optional.some(true);
31412
        },
31413
        useTabstopAt: function (elem) {
31414
          return !isPseudoStop(elem);
31415
        },
31416
        dom: {
31417
          tag: 'div',
31418
          classes: [dialogClass].concat(spec.extraClasses),
31419
          styles: __assign({ position: 'relative' }, spec.extraStyles)
31420
        },
637 daniel-mar 31421
        components: __spreadArray([
597 daniel-mar 31422
          spec.header,
31423
          spec.body
679 daniel-mar 31424
        ], spec.footer.toArray(), true),
597 daniel-mar 31425
        parts: {
31426
          blocker: {
637 daniel-mar 31427
            dom: fromHtml('<div class="' + blockerClass + '"></div>'),
597 daniel-mar 31428
            components: [{
31429
                dom: {
31430
                  tag: 'div',
31431
                  classes: isTouch ? [
31432
                    blockerBackdropClass,
31433
                    blockerBackdropClass + '--opaque'
31434
                  ] : [blockerBackdropClass]
31435
                }
31436
              }]
31437
          }
31438
        },
31439
        dragBlockClass: blockerClass,
637 daniel-mar 31440
        modalBehaviours: derive$1(__spreadArray([
597 daniel-mar 31441
          Focusing.config({}),
31442
          config('dialog-events', spec.dialogEvents.concat([runOnSource(focusin(), function (comp, _se) {
31443
              Keying.focusIn(comp);
31444
            })])),
31445
          config('scroll-lock', [
31446
            runOnAttached(function () {
31447
              add$2(body(), scrollLockClass);
31448
            }),
31449
            runOnDetached(function () {
679 daniel-mar 31450
              remove$2(body(), scrollLockClass);
597 daniel-mar 31451
            })
31452
          ])
679 daniel-mar 31453
        ], spec.extraBehaviours, true)),
637 daniel-mar 31454
        eventOrder: __assign((_a = {}, _a[execute$5()] = ['dialog-events'], _a[attachedToDom()] = [
597 daniel-mar 31455
          'scroll-lock',
31456
          'dialog-events',
31457
          'alloy.base.behaviour'
31458
        ], _a[detachedFromDom()] = [
31459
          'alloy.base.behaviour',
31460
          'dialog-events',
31461
          'scroll-lock'
31462
        ], _a), spec.eventOrder)
31463
      });
31464
    };
31465
 
31466
    var renderClose = function (providersBackstage) {
31467
      return Button.sketch({
31468
        dom: {
31469
          tag: 'button',
31470
          classes: [
31471
            'tox-button',
31472
            'tox-button--icon',
31473
            'tox-button--naked'
31474
          ],
31475
          attributes: {
31476
            'type': 'button',
31477
            'aria-label': providersBackstage.translate('Close'),
31478
            'title': providersBackstage.translate('Close')
31479
          }
31480
        },
637 daniel-mar 31481
        components: [render$3('close', {
31482
            tag: 'div',
31483
            classes: ['tox-icon']
31484
          }, providersBackstage.icons)],
597 daniel-mar 31485
        action: function (comp) {
31486
          emit(comp, formCancelEvent);
31487
        }
31488
      });
31489
    };
31490
    var renderTitle = function (spec, id, providersBackstage) {
31491
      var renderComponents = function (data) {
31492
        return [text(providersBackstage.translate(data.title))];
31493
      };
31494
      return {
31495
        dom: {
31496
          tag: 'div',
31497
          classes: ['tox-dialog__title'],
31498
          attributes: __assign({}, id.map(function (x) {
31499
            return { id: x };
31500
          }).getOr({}))
31501
        },
31502
        components: renderComponents(spec),
31503
        behaviours: derive$1([Reflecting.config({
31504
            channel: titleChannel,
31505
            renderComponents: renderComponents
31506
          })])
31507
      };
31508
    };
31509
    var renderDragHandle = function () {
637 daniel-mar 31510
      return { dom: fromHtml('<div class="tox-dialog__draghandle"></div>') };
597 daniel-mar 31511
    };
31512
    var renderInlineHeader = function (spec, titleId, providersBackstage) {
31513
      return Container.sketch({
637 daniel-mar 31514
        dom: fromHtml('<div class="tox-dialog__header"></div>'),
597 daniel-mar 31515
        components: [
31516
          renderTitle(spec, Optional.some(titleId), providersBackstage),
31517
          renderDragHandle(),
31518
          renderClose(providersBackstage)
31519
        ],
31520
        containerBehaviours: derive$1([Dragging.config({
31521
            mode: 'mouse',
31522
            blockerClass: 'blocker',
31523
            getTarget: function (handle) {
637 daniel-mar 31524
              return closest$1(handle, '[role="dialog"]').getOrDie();
597 daniel-mar 31525
            },
31526
            snaps: {
31527
              getSnapPoints: function () {
31528
                return [];
31529
              },
31530
              leftAttr: 'data-drag-left',
31531
              topAttr: 'data-drag-top'
31532
            }
31533
          })])
31534
      });
31535
    };
31536
    var renderModalHeader = function (spec, providersBackstage) {
31537
      var pTitle = ModalDialog.parts.title(renderTitle(spec, Optional.none(), providersBackstage));
31538
      var pHandle = ModalDialog.parts.draghandle(renderDragHandle());
31539
      var pClose = ModalDialog.parts.close(renderClose(providersBackstage));
31540
      var components = [pTitle].concat(spec.draggable ? [pHandle] : []).concat([pClose]);
31541
      return Container.sketch({
637 daniel-mar 31542
        dom: fromHtml('<div class="tox-dialog__header"></div>'),
597 daniel-mar 31543
        components: components
31544
      });
31545
    };
31546
 
31547
    var getHeader = function (title, backstage) {
31548
      return renderModalHeader({
31549
        title: backstage.shared.providers.translate(title),
31550
        draggable: backstage.dialog.isDraggableModal()
31551
      }, backstage.shared.providers);
31552
    };
31553
    var getBusySpec = function (message, bs, providers) {
31554
      return {
31555
        dom: {
31556
          tag: 'div',
31557
          classes: ['tox-dialog__busy-spinner'],
31558
          attributes: { 'aria-label': providers.translate(message) },
31559
          styles: {
31560
            left: '0px',
31561
            right: '0px',
31562
            bottom: '0px',
31563
            top: '0px',
31564
            position: 'absolute'
31565
          }
31566
        },
31567
        behaviours: bs,
637 daniel-mar 31568
        components: [{ dom: fromHtml('<div class="tox-spinner"><div></div><div></div><div></div></div>') }]
597 daniel-mar 31569
      };
31570
    };
31571
    var getEventExtras = function (lazyDialog, providers, extra) {
31572
      return {
31573
        onClose: function () {
31574
          return extra.closeWindow();
31575
        },
31576
        onBlock: function (blockEvent) {
31577
          ModalDialog.setBusy(lazyDialog(), function (_comp, bs) {
31578
            return getBusySpec(blockEvent.message, bs, providers);
31579
          });
31580
        },
31581
        onUnblock: function () {
31582
          ModalDialog.setIdle(lazyDialog());
31583
        }
31584
      };
31585
    };
31586
    var renderModalDialog = function (spec, initialData, dialogEvents, backstage) {
31587
      var _a;
31588
      var updateState = function (_comp, incoming) {
31589
        return Optional.some(incoming);
31590
      };
637 daniel-mar 31591
      return build$1(renderDialog$1(__assign(__assign({}, spec), {
597 daniel-mar 31592
        lazySink: backstage.shared.getSink,
637 daniel-mar 31593
        extraBehaviours: __spreadArray([
597 daniel-mar 31594
          Reflecting.config({
31595
            channel: dialogChannel,
31596
            updateState: updateState,
31597
            initialData: initialData
31598
          }),
31599
          RepresentingConfigs.memory({})
679 daniel-mar 31600
        ], spec.extraBehaviours, true),
597 daniel-mar 31601
        onEscape: function (comp) {
31602
          emit(comp, formCancelEvent);
31603
        },
31604
        dialogEvents: dialogEvents,
31605
        eventOrder: (_a = {}, _a[receive()] = [
31606
          Reflecting.name(),
31607
          Receiving.name()
31608
        ], _a[attachedToDom()] = [
31609
          'scroll-lock',
31610
          Reflecting.name(),
31611
          'messages',
31612
          'dialog-events',
31613
          'alloy.base.behaviour'
31614
        ], _a[detachedFromDom()] = [
31615
          'alloy.base.behaviour',
31616
          'dialog-events',
31617
          'messages',
31618
          Reflecting.name(),
31619
          'scroll-lock'
31620
        ], _a)
31621
      })));
31622
    };
31623
    var mapMenuButtons = function (buttons) {
31624
      var mapItems = function (button) {
637 daniel-mar 31625
        var items = map$2(button.items, function (item) {
597 daniel-mar 31626
          var cell = Cell(false);
31627
          return __assign(__assign({}, item), { storage: cell });
31628
        });
31629
        return __assign(__assign({}, button), { items: items });
31630
      };
637 daniel-mar 31631
      return map$2(buttons, function (button) {
597 daniel-mar 31632
        if (button.type === 'menu') {
31633
          return mapItems(button);
31634
        }
31635
        return button;
31636
      });
31637
    };
31638
    var extractCellsToObject = function (buttons) {
31639
      return foldl(buttons, function (acc, button) {
31640
        if (button.type === 'menu') {
31641
          var menuButton = button;
31642
          return foldl(menuButton.items, function (innerAcc, item) {
31643
            innerAcc[item.name] = item.storage;
31644
            return innerAcc;
31645
          }, acc);
31646
        }
31647
        return acc;
31648
      }, {});
31649
    };
31650
 
31651
    var initCommonEvents = function (fireApiEvent, extras) {
31652
      return [
637 daniel-mar 31653
        runWithTarget(focusin(), onFocus),
597 daniel-mar 31654
        fireApiEvent(formCloseEvent, function (_api, spec) {
31655
          extras.onClose();
31656
          spec.onClose();
31657
        }),
31658
        fireApiEvent(formCancelEvent, function (api, spec, _event, self) {
31659
          spec.onCancel(api);
31660
          emit(self, formCloseEvent);
31661
        }),
637 daniel-mar 31662
        run$1(formUnblockEvent, function (_c, _se) {
597 daniel-mar 31663
          return extras.onUnblock();
31664
        }),
637 daniel-mar 31665
        run$1(formBlockEvent, function (_c, se) {
597 daniel-mar 31666
          return extras.onBlock(se.event);
31667
        })
31668
      ];
31669
    };
31670
    var initUrlDialog = function (getInstanceApi, extras) {
31671
      var fireApiEvent = function (eventName, f) {
637 daniel-mar 31672
        return run$1(eventName, function (c, se) {
597 daniel-mar 31673
          withSpec(c, function (spec, _c) {
31674
            f(getInstanceApi(), spec, se.event, c);
31675
          });
31676
        });
31677
      };
31678
      var withSpec = function (c, f) {
31679
        Reflecting.getState(c).get().each(function (currentDialog) {
31680
          f(currentDialog, c);
31681
        });
31682
      };
679 daniel-mar 31683
      return __spreadArray(__spreadArray([], initCommonEvents(fireApiEvent, extras), true), [fireApiEvent(formActionEvent, function (api, spec, event) {
597 daniel-mar 31684
          spec.onAction(api, { name: event.name });
679 daniel-mar 31685
        })], false);
597 daniel-mar 31686
    };
31687
    var initDialog = function (getInstanceApi, extras, getSink) {
31688
      var fireApiEvent = function (eventName, f) {
637 daniel-mar 31689
        return run$1(eventName, function (c, se) {
597 daniel-mar 31690
          withSpec(c, function (spec, _c) {
31691
            f(getInstanceApi(), spec, se.event, c);
31692
          });
31693
        });
31694
      };
31695
      var withSpec = function (c, f) {
31696
        Reflecting.getState(c).get().each(function (currentDialogInit) {
31697
          f(currentDialogInit.internalDialog, c);
31698
        });
31699
      };
679 daniel-mar 31700
      return __spreadArray(__spreadArray([], initCommonEvents(fireApiEvent, extras), true), [
597 daniel-mar 31701
        fireApiEvent(formSubmitEvent, function (api, spec) {
31702
          return spec.onSubmit(api);
31703
        }),
31704
        fireApiEvent(formChangeEvent, function (api, spec, event) {
31705
          spec.onChange(api, { name: event.name });
31706
        }),
31707
        fireApiEvent(formActionEvent, function (api, spec, event, component) {
31708
          var focusIn = function () {
31709
            return Keying.focusIn(component);
31710
          };
31711
          var isDisabled = function (focused) {
31712
            return has$1(focused, 'disabled') || getOpt(focused, 'aria-disabled').exists(function (val) {
31713
              return val === 'true';
31714
            });
31715
          };
31716
          var rootNode = getRootNode(component.element);
31717
          var current = active(rootNode);
31718
          spec.onAction(api, {
31719
            name: event.name,
31720
            value: event.value
31721
          });
31722
          active(rootNode).fold(focusIn, function (focused) {
31723
            if (isDisabled(focused)) {
31724
              focusIn();
31725
            } else if (current.exists(function (cur) {
637 daniel-mar 31726
                return contains(focused, cur) && isDisabled(cur);
597 daniel-mar 31727
              })) {
31728
              focusIn();
31729
            } else {
31730
              getSink().toOptional().filter(function (sink) {
637 daniel-mar 31731
                return !contains(sink.element, focused);
597 daniel-mar 31732
              }).each(focusIn);
31733
            }
31734
          });
31735
        }),
31736
        fireApiEvent(formTabChangeEvent, function (api, spec, event) {
31737
          spec.onTabChange(api, {
31738
            newTabName: event.name,
31739
            oldTabName: event.oldName
31740
          });
31741
        }),
31742
        runOnDetached(function (component) {
31743
          var api = getInstanceApi();
31744
          Representing.setValue(component, api.getData());
31745
        })
679 daniel-mar 31746
      ], false);
597 daniel-mar 31747
    };
31748
    var SilverDialogEvents = {
31749
      initUrlDialog: initUrlDialog,
31750
      initDialog: initDialog
31751
    };
31752
 
31753
    var makeButton = function (button, backstage) {
31754
      return renderFooterButton(button, button.type, backstage);
31755
    };
637 daniel-mar 31756
    var lookup = function (compInSystem, footerButtons, buttonName) {
31757
      return find$5(footerButtons, function (button) {
597 daniel-mar 31758
        return button.name === buttonName;
31759
      }).bind(function (memButton) {
31760
        return memButton.memento.getOpt(compInSystem);
31761
      });
31762
    };
31763
    var renderComponents = function (_data, state) {
31764
      var footerButtons = state.map(function (s) {
31765
        return s.footerButtons;
31766
      }).getOr([]);
637 daniel-mar 31767
      var buttonGroups = partition$3(footerButtons, function (button) {
597 daniel-mar 31768
        return button.align === 'start';
31769
      });
31770
      var makeGroup = function (edge, buttons) {
31771
        return Container.sketch({
31772
          dom: {
31773
            tag: 'div',
31774
            classes: ['tox-dialog__footer-' + edge]
31775
          },
637 daniel-mar 31776
          components: map$2(buttons, function (button) {
597 daniel-mar 31777
            return button.memento.asSpec();
31778
          })
31779
        });
31780
      };
31781
      var startButtons = makeGroup('start', buttonGroups.pass);
31782
      var endButtons = makeGroup('end', buttonGroups.fail);
31783
      return [
31784
        startButtons,
31785
        endButtons
31786
      ];
31787
    };
31788
    var renderFooter = function (initSpec, backstage) {
31789
      var updateState = function (_comp, data) {
637 daniel-mar 31790
        var footerButtons = map$2(data.buttons, function (button) {
597 daniel-mar 31791
          var memButton = record(makeButton(button, backstage));
31792
          return {
31793
            name: button.name,
31794
            align: button.align,
31795
            memento: memButton
31796
          };
31797
        });
31798
        var lookupByName = function (compInSystem, buttonName) {
637 daniel-mar 31799
          return lookup(compInSystem, footerButtons, buttonName);
597 daniel-mar 31800
        };
31801
        return Optional.some({
31802
          lookupByName: lookupByName,
31803
          footerButtons: footerButtons
31804
        });
31805
      };
31806
      return {
637 daniel-mar 31807
        dom: fromHtml('<div class="tox-dialog__footer"></div>'),
597 daniel-mar 31808
        components: [],
31809
        behaviours: derive$1([Reflecting.config({
31810
            channel: footerChannel,
31811
            initialData: initSpec,
31812
            updateState: updateState,
31813
            renderComponents: renderComponents
31814
          })])
31815
      };
31816
    };
31817
    var renderInlineFooter = function (initSpec, backstage) {
31818
      return renderFooter(initSpec, backstage);
31819
    };
31820
    var renderModalFooter = function (initSpec, backstage) {
31821
      return ModalDialog.parts.footer(renderFooter(initSpec, backstage));
31822
    };
31823
 
31824
    var getCompByName = function (access, name) {
31825
      var root = access.getRoot();
31826
      if (root.getSystem().isConnected()) {
31827
        var form_1 = Composing.getCurrent(access.getFormWrapper()).getOr(access.getFormWrapper());
31828
        return Form.getField(form_1, name).fold(function () {
31829
          var footer = access.getFooter();
31830
          var footerState = Reflecting.getState(footer);
31831
          return footerState.get().bind(function (f) {
31832
            return f.lookupByName(form_1, name);
31833
          });
31834
        }, function (comp) {
31835
          return Optional.some(comp);
31836
        });
31837
      } else {
31838
        return Optional.none();
31839
      }
31840
    };
637 daniel-mar 31841
    var validateData$1 = function (access, data) {
597 daniel-mar 31842
      var root = access.getRoot();
31843
      return Reflecting.getState(root).get().map(function (dialogState) {
31844
        return getOrDie(asRaw('data', dialogState.dataValidator, data));
31845
      }).getOr(data);
31846
    };
31847
    var getDialogApi = function (access, doRedial, menuItemStates) {
31848
      var withRoot = function (f) {
31849
        var root = access.getRoot();
31850
        if (root.getSystem().isConnected()) {
31851
          f(root);
31852
        }
31853
      };
31854
      var getData = function () {
31855
        var root = access.getRoot();
31856
        var valueComp = root.getSystem().isConnected() ? access.getFormWrapper() : root;
31857
        var representedValues = Representing.getValue(valueComp);
679 daniel-mar 31858
        var menuItemCurrentState = map$1(menuItemStates, function (cell) {
597 daniel-mar 31859
          return cell.get();
31860
        });
31861
        return __assign(__assign({}, representedValues), menuItemCurrentState);
31862
      };
31863
      var setData = function (newData) {
31864
        withRoot(function (_) {
31865
          var prevData = instanceApi.getData();
31866
          var mergedData = __assign(__assign({}, prevData), newData);
637 daniel-mar 31867
          var newInternalData = validateData$1(access, mergedData);
597 daniel-mar 31868
          var form = access.getFormWrapper();
31869
          Representing.setValue(form, newInternalData);
637 daniel-mar 31870
          each(menuItemStates, function (v, k) {
31871
            if (has$2(mergedData, k)) {
597 daniel-mar 31872
              v.set(mergedData[k]);
31873
            }
31874
          });
31875
        });
31876
      };
31877
      var disable = function (name) {
31878
        getCompByName(access, name).each(Disabling.disable);
31879
      };
31880
      var enable = function (name) {
31881
        getCompByName(access, name).each(Disabling.enable);
31882
      };
31883
      var focus = function (name) {
31884
        getCompByName(access, name).each(Focusing.focus);
31885
      };
31886
      var block = function (message) {
31887
        if (!isString(message)) {
31888
          throw new Error('The dialogInstanceAPI.block function should be passed a blocking message of type string as an argument');
31889
        }
31890
        withRoot(function (root) {
31891
          emitWith(root, formBlockEvent, { message: message });
31892
        });
31893
      };
31894
      var unblock = function () {
31895
        withRoot(function (root) {
31896
          emit(root, formUnblockEvent);
31897
        });
31898
      };
31899
      var showTab = function (name) {
31900
        withRoot(function (_) {
31901
          var body = access.getBody();
31902
          var bodyState = Reflecting.getState(body);
31903
          if (bodyState.get().exists(function (b) {
31904
              return b.isTabPanel();
31905
            })) {
31906
            Composing.getCurrent(body).each(function (tabSection) {
31907
              TabSection.showTab(tabSection, name);
31908
            });
31909
          }
31910
        });
31911
      };
31912
      var redial = function (d) {
31913
        withRoot(function (root) {
31914
          var dialogInit = doRedial(d);
31915
          root.getSystem().broadcastOn([dialogChannel], dialogInit);
31916
          root.getSystem().broadcastOn([titleChannel], dialogInit.internalDialog);
31917
          root.getSystem().broadcastOn([bodyChannel], dialogInit.internalDialog);
31918
          root.getSystem().broadcastOn([footerChannel], dialogInit.internalDialog);
31919
          instanceApi.setData(dialogInit.initialData);
31920
        });
31921
      };
31922
      var close = function () {
31923
        withRoot(function (root) {
31924
          emit(root, formCloseEvent);
31925
        });
31926
      };
31927
      var instanceApi = {
31928
        getData: getData,
31929
        setData: setData,
31930
        disable: disable,
31931
        enable: enable,
31932
        focus: focus,
31933
        block: block,
31934
        unblock: unblock,
31935
        showTab: showTab,
31936
        redial: redial,
31937
        close: close
31938
      };
31939
      return instanceApi;
31940
    };
31941
 
31942
    var getDialogSizeClasses = function (size) {
31943
      switch (size) {
31944
      case 'large':
31945
        return ['tox-dialog--width-lg'];
31946
      case 'medium':
31947
        return ['tox-dialog--width-md'];
31948
      default:
31949
        return [];
31950
      }
31951
    };
637 daniel-mar 31952
    var renderDialog = function (dialogInit, extra, backstage) {
597 daniel-mar 31953
      var header = getHeader(dialogInit.internalDialog.title, backstage);
31954
      var body = renderModalBody({ body: dialogInit.internalDialog.body }, backstage);
31955
      var storagedMenuButtons = mapMenuButtons(dialogInit.internalDialog.buttons);
31956
      var objOfCells = extractCellsToObject(storagedMenuButtons);
31957
      var footer = renderModalFooter({ buttons: storagedMenuButtons }, backstage);
31958
      var dialogEvents = SilverDialogEvents.initDialog(function () {
31959
        return instanceApi;
31960
      }, getEventExtras(function () {
31961
        return dialog;
31962
      }, backstage.shared.providers, extra), backstage.shared.getSink);
31963
      var dialogSize = getDialogSizeClasses(dialogInit.internalDialog.size);
31964
      var spec = {
31965
        header: header,
31966
        body: body,
31967
        footer: Optional.some(footer),
31968
        extraClasses: dialogSize,
31969
        extraBehaviours: [],
31970
        extraStyles: {}
31971
      };
31972
      var dialog = renderModalDialog(spec, dialogInit, dialogEvents, backstage);
31973
      var modalAccess = function () {
31974
        var getForm = function () {
31975
          var outerForm = ModalDialog.getBody(dialog);
31976
          return Composing.getCurrent(outerForm).getOr(outerForm);
31977
        };
31978
        return {
637 daniel-mar 31979
          getRoot: constant$1(dialog),
597 daniel-mar 31980
          getBody: function () {
31981
            return ModalDialog.getBody(dialog);
31982
          },
31983
          getFooter: function () {
31984
            return ModalDialog.getFooter(dialog);
31985
          },
31986
          getFormWrapper: getForm
31987
        };
31988
      }();
31989
      var instanceApi = getDialogApi(modalAccess, extra.redial, objOfCells);
31990
      return {
31991
        dialog: dialog,
31992
        instanceApi: instanceApi
31993
      };
31994
    };
31995
 
31996
    var renderInlineDialog = function (dialogInit, extra, backstage, ariaAttrs) {
31997
      var _a, _b;
637 daniel-mar 31998
      var dialogLabelId = generate$6('dialog-label');
31999
      var dialogContentId = generate$6('dialog-content');
597 daniel-mar 32000
      var updateState = function (_comp, incoming) {
32001
        return Optional.some(incoming);
32002
      };
32003
      var memHeader = record(renderInlineHeader({
32004
        title: dialogInit.internalDialog.title,
32005
        draggable: true
32006
      }, dialogLabelId, backstage.shared.providers));
32007
      var memBody = record(renderInlineBody({ body: dialogInit.internalDialog.body }, dialogContentId, backstage, ariaAttrs));
32008
      var storagedMenuButtons = mapMenuButtons(dialogInit.internalDialog.buttons);
32009
      var objOfCells = extractCellsToObject(storagedMenuButtons);
32010
      var memFooter = record(renderInlineFooter({ buttons: storagedMenuButtons }, backstage));
32011
      var dialogEvents = SilverDialogEvents.initDialog(function () {
32012
        return instanceApi;
32013
      }, {
32014
        onBlock: function (event) {
32015
          Blocking.block(dialog, function (_comp, bs) {
32016
            return getBusySpec(event.message, bs, backstage.shared.providers);
32017
          });
32018
        },
32019
        onUnblock: function () {
32020
          Blocking.unblock(dialog);
32021
        },
32022
        onClose: function () {
32023
          return extra.closeWindow();
32024
        }
32025
      }, backstage.shared.getSink);
32026
      var dialog = build$1({
32027
        dom: {
32028
          tag: 'div',
32029
          classes: [
32030
            'tox-dialog',
32031
            'tox-dialog-inline'
32032
          ],
637 daniel-mar 32033
          attributes: (_a = { role: 'dialog' }, _a['aria-labelledby'] = dialogLabelId, _a['aria-describedby'] = dialogContentId, _a)
597 daniel-mar 32034
        },
32035
        eventOrder: (_b = {}, _b[receive()] = [
32036
          Reflecting.name(),
32037
          Receiving.name()
637 daniel-mar 32038
        ], _b[execute$5()] = ['execute-on-form'], _b[attachedToDom()] = [
597 daniel-mar 32039
          'reflecting',
32040
          'execute-on-form'
32041
        ], _b),
32042
        behaviours: derive$1([
32043
          Keying.config({
32044
            mode: 'cyclic',
32045
            onEscape: function (c) {
32046
              emit(c, formCloseEvent);
32047
              return Optional.some(true);
32048
            },
32049
            useTabstopAt: function (elem) {
679 daniel-mar 32050
              return !isPseudoStop(elem) && (name$2(elem) !== 'button' || get$d(elem, 'disabled') !== 'disabled');
597 daniel-mar 32051
            }
32052
          }),
32053
          Reflecting.config({
32054
            channel: dialogChannel,
32055
            updateState: updateState,
32056
            initialData: dialogInit
32057
          }),
32058
          Focusing.config({}),
32059
          config('execute-on-form', dialogEvents.concat([runOnSource(focusin(), function (comp, _se) {
32060
              Keying.focusIn(comp);
32061
            })])),
32062
          Blocking.config({
32063
            getRoot: function () {
32064
              return Optional.some(dialog);
32065
            }
32066
          }),
32067
          Replacing.config({}),
32068
          RepresentingConfigs.memory({})
32069
        ]),
32070
        components: [
32071
          memHeader.asSpec(),
32072
          memBody.asSpec(),
32073
          memFooter.asSpec()
32074
        ]
32075
      });
32076
      var instanceApi = getDialogApi({
637 daniel-mar 32077
        getRoot: constant$1(dialog),
597 daniel-mar 32078
        getFooter: function () {
32079
          return memFooter.get(dialog);
32080
        },
32081
        getBody: function () {
32082
          return memBody.get(dialog);
32083
        },
32084
        getFormWrapper: function () {
32085
          var body = memBody.get(dialog);
32086
          return Composing.getCurrent(body).getOr(body);
32087
        }
32088
      }, extra.redial, objOfCells);
32089
      return {
32090
        dialog: dialog,
32091
        instanceApi: instanceApi
32092
      };
32093
    };
32094
 
637 daniel-mar 32095
    var global$1 = tinymce.util.Tools.resolve('tinymce.util.URI');
597 daniel-mar 32096
 
32097
    var getUrlDialogApi = function (root) {
32098
      var withRoot = function (f) {
32099
        if (root.getSystem().isConnected()) {
32100
          f(root);
32101
        }
32102
      };
32103
      var block = function (message) {
32104
        if (!isString(message)) {
32105
          throw new Error('The urlDialogInstanceAPI.block function should be passed a blocking message of type string as an argument');
32106
        }
32107
        withRoot(function (root) {
32108
          emitWith(root, formBlockEvent, { message: message });
32109
        });
32110
      };
32111
      var unblock = function () {
32112
        withRoot(function (root) {
32113
          emit(root, formUnblockEvent);
32114
        });
32115
      };
32116
      var close = function () {
32117
        withRoot(function (root) {
32118
          emit(root, formCloseEvent);
32119
        });
32120
      };
32121
      var sendMessage = function (data) {
32122
        withRoot(function (root) {
32123
          root.getSystem().broadcastOn([bodySendMessageChannel], data);
32124
        });
32125
      };
32126
      return {
32127
        block: block,
32128
        unblock: unblock,
32129
        close: close,
32130
        sendMessage: sendMessage
32131
      };
32132
    };
32133
 
32134
    var SUPPORTED_MESSAGE_ACTIONS = [
32135
      'insertContent',
32136
      'setContent',
32137
      'execCommand',
32138
      'close',
32139
      'block',
32140
      'unblock'
32141
    ];
32142
    var isSupportedMessage = function (data) {
32143
      return isObject(data) && SUPPORTED_MESSAGE_ACTIONS.indexOf(data.mceAction) !== -1;
32144
    };
32145
    var isCustomMessage = function (data) {
637 daniel-mar 32146
      return !isSupportedMessage(data) && isObject(data) && has$2(data, 'mceAction');
597 daniel-mar 32147
    };
32148
    var handleMessage = function (editor, api, data) {
32149
      switch (data.mceAction) {
32150
      case 'insertContent':
32151
        editor.insertContent(data.content);
32152
        break;
32153
      case 'setContent':
32154
        editor.setContent(data.content);
32155
        break;
32156
      case 'execCommand':
32157
        var ui = isBoolean(data.ui) ? data.ui : false;
32158
        editor.execCommand(data.cmd, ui, data.value);
32159
        break;
32160
      case 'close':
32161
        api.close();
32162
        break;
32163
      case 'block':
32164
        api.block(data.message);
32165
        break;
32166
      case 'unblock':
32167
        api.unblock();
32168
        break;
32169
      }
32170
    };
32171
    var renderUrlDialog = function (internalDialog, extra, editor, backstage) {
32172
      var _a;
32173
      var header = getHeader(internalDialog.title, backstage);
32174
      var body = renderIframeBody(internalDialog);
32175
      var footer = internalDialog.buttons.bind(function (buttons) {
32176
        if (buttons.length === 0) {
32177
          return Optional.none();
32178
        } else {
32179
          return Optional.some(renderModalFooter({ buttons: buttons }, backstage));
32180
        }
32181
      });
32182
      var dialogEvents = SilverDialogEvents.initUrlDialog(function () {
32183
        return instanceApi;
32184
      }, getEventExtras(function () {
32185
        return dialog;
32186
      }, backstage.shared.providers, extra));
32187
      var styles = __assign(__assign({}, internalDialog.height.fold(function () {
32188
        return {};
32189
      }, function (height) {
32190
        return {
32191
          'height': height + 'px',
32192
          'max-height': height + 'px'
32193
        };
32194
      })), internalDialog.width.fold(function () {
32195
        return {};
32196
      }, function (width) {
32197
        return {
32198
          'width': width + 'px',
32199
          'max-width': width + 'px'
32200
        };
32201
      }));
32202
      var classes = internalDialog.width.isNone() && internalDialog.height.isNone() ? ['tox-dialog--width-lg'] : [];
637 daniel-mar 32203
      var iframeUri = new global$1(internalDialog.url, { base_uri: new global$1(window.location.href) });
597 daniel-mar 32204
      var iframeDomain = iframeUri.protocol + '://' + iframeUri.host + (iframeUri.port ? ':' + iframeUri.port : '');
637 daniel-mar 32205
      var messageHandlerUnbinder = unbindable();
597 daniel-mar 32206
      var extraBehaviours = [
32207
        config('messages', [
32208
          runOnAttached(function () {
637 daniel-mar 32209
            var unbind = bind(SugarElement.fromDom(window), 'message', function (e) {
32210
              if (iframeUri.isSameOrigin(new global$1(e.raw.origin))) {
597 daniel-mar 32211
                var data = e.raw.data;
32212
                if (isSupportedMessage(data)) {
32213
                  handleMessage(editor, instanceApi, data);
32214
                } else if (isCustomMessage(data)) {
32215
                  internalDialog.onMessage(instanceApi, data);
32216
                }
32217
              }
32218
            });
637 daniel-mar 32219
            messageHandlerUnbinder.set(unbind);
597 daniel-mar 32220
          }),
637 daniel-mar 32221
          runOnDetached(messageHandlerUnbinder.clear)
597 daniel-mar 32222
        ]),
32223
        Receiving.config({
32224
          channels: (_a = {}, _a[bodySendMessageChannel] = {
32225
            onReceive: function (comp, data) {
637 daniel-mar 32226
              descendant(comp.element, 'iframe').each(function (iframeEle) {
597 daniel-mar 32227
                var iframeWin = iframeEle.dom.contentWindow;
32228
                iframeWin.postMessage(data, iframeDomain);
32229
              });
32230
            }
32231
          }, _a)
32232
        })
32233
      ];
32234
      var spec = {
32235
        header: header,
32236
        body: body,
32237
        footer: footer,
32238
        extraClasses: classes,
32239
        extraBehaviours: extraBehaviours,
32240
        extraStyles: styles
32241
      };
32242
      var dialog = renderModalDialog(spec, internalDialog, dialogEvents, backstage);
32243
      var instanceApi = getUrlDialogApi(dialog);
32244
      return {
32245
        dialog: dialog,
32246
        instanceApi: instanceApi
32247
      };
32248
    };
32249
 
637 daniel-mar 32250
    var setup$2 = function (extras) {
597 daniel-mar 32251
      var sharedBackstage = extras.backstage.shared;
32252
      var open = function (message, callback) {
32253
        var closeDialog = function () {
32254
          ModalDialog.hide(alertDialog);
32255
          callback();
32256
        };
32257
        var memFooterClose = record(renderFooterButton({
32258
          name: 'close-alert',
32259
          text: 'OK',
32260
          primary: true,
32261
          align: 'end',
32262
          disabled: false,
32263
          icon: Optional.none()
32264
        }, 'cancel', extras.backstage));
32265
        var titleSpec = pUntitled();
32266
        var closeSpec = pClose(closeDialog, sharedBackstage.providers);
637 daniel-mar 32267
        var alertDialog = build$1(renderDialog$1({
597 daniel-mar 32268
          lazySink: function () {
32269
            return sharedBackstage.getSink();
32270
          },
32271
          header: hiddenHeader(titleSpec, closeSpec),
32272
          body: pBodyMessage(message, sharedBackstage.providers),
32273
          footer: Optional.some(pFooter(pFooterGroup([], [memFooterClose.asSpec()]))),
32274
          onEscape: closeDialog,
32275
          extraClasses: ['tox-alert-dialog'],
32276
          extraBehaviours: [],
32277
          extraStyles: {},
637 daniel-mar 32278
          dialogEvents: [run$1(formCancelEvent, closeDialog)],
597 daniel-mar 32279
          eventOrder: {}
32280
        }));
32281
        ModalDialog.show(alertDialog);
32282
        var footerCloseButton = memFooterClose.get(alertDialog);
32283
        Focusing.focus(footerCloseButton);
32284
      };
32285
      return { open: open };
32286
    };
32287
 
637 daniel-mar 32288
    var setup$1 = function (extras) {
597 daniel-mar 32289
      var sharedBackstage = extras.backstage.shared;
32290
      var open = function (message, callback) {
32291
        var closeDialog = function (state) {
32292
          ModalDialog.hide(confirmDialog);
32293
          callback(state);
32294
        };
32295
        var memFooterYes = record(renderFooterButton({
32296
          name: 'yes',
32297
          text: 'Yes',
32298
          primary: true,
32299
          align: 'end',
32300
          disabled: false,
32301
          icon: Optional.none()
32302
        }, 'submit', extras.backstage));
32303
        var footerNo = renderFooterButton({
32304
          name: 'no',
32305
          text: 'No',
32306
          primary: false,
32307
          align: 'end',
32308
          disabled: false,
32309
          icon: Optional.none()
32310
        }, 'cancel', extras.backstage);
32311
        var titleSpec = pUntitled();
32312
        var closeSpec = pClose(function () {
32313
          return closeDialog(false);
32314
        }, sharedBackstage.providers);
637 daniel-mar 32315
        var confirmDialog = build$1(renderDialog$1({
597 daniel-mar 32316
          lazySink: function () {
32317
            return sharedBackstage.getSink();
32318
          },
32319
          header: hiddenHeader(titleSpec, closeSpec),
32320
          body: pBodyMessage(message, sharedBackstage.providers),
32321
          footer: Optional.some(pFooter(pFooterGroup([], [
32322
            footerNo,
32323
            memFooterYes.asSpec()
32324
          ]))),
32325
          onEscape: function () {
32326
            return closeDialog(false);
32327
          },
32328
          extraClasses: ['tox-confirm-dialog'],
32329
          extraBehaviours: [],
32330
          extraStyles: {},
32331
          dialogEvents: [
637 daniel-mar 32332
            run$1(formCancelEvent, function () {
597 daniel-mar 32333
              return closeDialog(false);
32334
            }),
637 daniel-mar 32335
            run$1(formSubmitEvent, function () {
597 daniel-mar 32336
              return closeDialog(true);
32337
            })
32338
          ],
32339
          eventOrder: {}
32340
        }));
32341
        ModalDialog.show(confirmDialog);
32342
        var footerYesButton = memFooterYes.get(confirmDialog);
32343
        Focusing.focus(footerYesButton);
32344
      };
32345
      return { open: open };
32346
    };
32347
 
637 daniel-mar 32348
    var validateData = function (data, validator) {
597 daniel-mar 32349
      return getOrDie(asRaw('data', validator, data));
32350
    };
32351
    var isAlertOrConfirmDialog = function (target) {
637 daniel-mar 32352
      return closest(target, '.tox-alert-dialog') || closest(target, '.tox-confirm-dialog');
597 daniel-mar 32353
    };
32354
    var inlineAdditionalBehaviours = function (editor, isStickyToolbar, isToolbarLocationTop) {
32355
      if (isStickyToolbar && isToolbarLocationTop) {
32356
        return [];
32357
      } else {
32358
        return [Docking.config({
32359
            contextual: {
32360
              lazyContext: function () {
637 daniel-mar 32361
                return Optional.some(box$1(SugarElement.fromDom(editor.getContentAreaContainer())));
597 daniel-mar 32362
              },
32363
              fadeInClass: 'tox-dialog-dock-fadein',
32364
              fadeOutClass: 'tox-dialog-dock-fadeout',
32365
              transitionClass: 'tox-dialog-dock-transition'
32366
            },
32367
            modes: ['top']
32368
          })];
32369
      }
32370
    };
637 daniel-mar 32371
    var setup = function (extras) {
597 daniel-mar 32372
      var backstage = extras.backstage;
32373
      var editor = extras.editor;
32374
      var isStickyToolbar$1 = isStickyToolbar(editor);
637 daniel-mar 32375
      var alertDialog = setup$2(extras);
32376
      var confirmDialog = setup$1(extras);
597 daniel-mar 32377
      var open = function (config, params, closeWindow) {
32378
        if (params !== undefined && params.inline === 'toolbar') {
32379
          return openInlineDialog(config, backstage.shared.anchors.inlineDialog(), closeWindow, params.ariaAttrs);
32380
        } else if (params !== undefined && params.inline === 'cursor') {
32381
          return openInlineDialog(config, backstage.shared.anchors.cursor(), closeWindow, params.ariaAttrs);
32382
        } else {
32383
          return openModalDialog(config, closeWindow);
32384
        }
32385
      };
32386
      var openUrl = function (config, closeWindow) {
32387
        return openModalUrlDialog(config, closeWindow);
32388
      };
32389
      var openModalUrlDialog = function (config, closeWindow) {
32390
        var factory = function (contents) {
32391
          var dialog = renderUrlDialog(contents, {
32392
            closeWindow: function () {
32393
              ModalDialog.hide(dialog.dialog);
32394
              closeWindow(dialog.instanceApi);
32395
            }
32396
          }, editor, backstage);
32397
          ModalDialog.show(dialog.dialog);
32398
          return dialog.instanceApi;
32399
        };
32400
        return DialogManager.openUrl(factory, config);
32401
      };
32402
      var openModalDialog = function (config, closeWindow) {
32403
        var factory = function (contents, internalInitialData, dataValidator) {
32404
          var initialData = internalInitialData;
32405
          var dialogInit = {
32406
            dataValidator: dataValidator,
32407
            initialData: initialData,
32408
            internalDialog: contents
32409
          };
637 daniel-mar 32410
          var dialog = renderDialog(dialogInit, {
597 daniel-mar 32411
            redial: DialogManager.redial,
32412
            closeWindow: function () {
32413
              ModalDialog.hide(dialog.dialog);
32414
              closeWindow(dialog.instanceApi);
32415
            }
32416
          }, backstage);
32417
          ModalDialog.show(dialog.dialog);
32418
          dialog.instanceApi.setData(initialData);
32419
          return dialog.instanceApi;
32420
        };
32421
        return DialogManager.open(factory, config);
32422
      };
32423
      var openInlineDialog = function (config$1, anchor, closeWindow, ariaAttrs) {
32424
        var factory = function (contents, internalInitialData, dataValidator) {
637 daniel-mar 32425
          var initialData = validateData(internalInitialData, dataValidator);
32426
          var inlineDialog = value$1();
597 daniel-mar 32427
          var isToolbarLocationTop = backstage.shared.header.isPositionedAtTop();
32428
          var dialogInit = {
32429
            dataValidator: dataValidator,
32430
            initialData: initialData,
32431
            internalDialog: contents
32432
          };
32433
          var refreshDocking = function () {
32434
            return inlineDialog.on(function (dialog) {
32435
              InlineView.reposition(dialog);
32436
              Docking.refresh(dialog);
32437
            });
32438
          };
32439
          var dialogUi = renderInlineDialog(dialogInit, {
32440
            redial: DialogManager.redial,
32441
            closeWindow: function () {
32442
              inlineDialog.on(InlineView.hide);
32443
              editor.off('ResizeEditor', refreshDocking);
32444
              inlineDialog.clear();
32445
              closeWindow(dialogUi.instanceApi);
32446
            }
32447
          }, backstage, ariaAttrs);
32448
          var inlineDialogComp = build$1(InlineView.sketch(__assign(__assign({
32449
            lazySink: backstage.shared.getSink,
32450
            dom: {
32451
              tag: 'div',
32452
              classes: []
32453
            },
32454
            fireDismissalEventInstead: {}
32455
          }, isToolbarLocationTop ? {} : { fireRepositionEventInstead: {} }), {
637 daniel-mar 32456
            inlineBehaviours: derive$1(__spreadArray([config('window-manager-inline-events', [run$1(dismissRequested(), function (_comp, _se) {
597 daniel-mar 32457
                  emit(dialogUi.dialog, formCancelEvent);
679 daniel-mar 32458
                })])], inlineAdditionalBehaviours(editor, isStickyToolbar$1, isToolbarLocationTop), true)),
597 daniel-mar 32459
            isExtraPart: function (_comp, target) {
32460
              return isAlertOrConfirmDialog(target);
32461
            }
32462
          })));
32463
          inlineDialog.set(inlineDialogComp);
637 daniel-mar 32464
          InlineView.showWithin(inlineDialogComp, premade(dialogUi.dialog), { anchor: anchor }, Optional.some(body()));
597 daniel-mar 32465
          if (!isStickyToolbar$1 || !isToolbarLocationTop) {
32466
            Docking.refresh(inlineDialogComp);
32467
            editor.on('ResizeEditor', refreshDocking);
32468
          }
32469
          dialogUi.instanceApi.setData(initialData);
32470
          Keying.focusIn(dialogUi.dialog);
32471
          return dialogUi.instanceApi;
32472
        };
32473
        return DialogManager.open(factory, config$1);
32474
      };
32475
      var confirm = function (message, callback) {
32476
        confirmDialog.open(message, function (state) {
32477
          callback(state);
32478
        });
32479
      };
32480
      var alert = function (message, callback) {
32481
        alertDialog.open(message, function () {
32482
          callback();
32483
        });
32484
      };
32485
      var close = function (instanceApi) {
32486
        instanceApi.close();
32487
      };
32488
      return {
32489
        open: open,
32490
        openUrl: openUrl,
32491
        alert: alert,
32492
        close: close,
32493
        confirm: confirm
32494
      };
32495
    };
32496
 
32497
    function Theme () {
679 daniel-mar 32498
      global$g.add('silver', function (editor) {
637 daniel-mar 32499
        var _a = setup$3(editor), uiMothership = _a.uiMothership, backstage = _a.backstage, renderUI = _a.renderUI, getUi = _a.getUi;
597 daniel-mar 32500
        Autocompleter.register(editor, backstage.shared);
637 daniel-mar 32501
        var windowMgr = setup({
597 daniel-mar 32502
          editor: editor,
32503
          backstage: backstage
32504
        });
32505
        return {
32506
          renderUI: renderUI,
637 daniel-mar 32507
          getWindowManagerImpl: constant$1(windowMgr),
597 daniel-mar 32508
          getNotificationManagerImpl: function () {
32509
            return NotificationManagerImpl(editor, { backstage: backstage }, uiMothership);
32510
          },
32511
          ui: getUi()
32512
        };
32513
      });
32514
    }
32515
 
32516
    Theme();
32517
 
32518
}());