/** * Copyright (c) Tiny Technologies, Inc. All rights reserved. * Licensed under the LGPL or a commercial license. * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ * * Version: 5.10.9 (2023-11-15) */ (function () { 'use strict'; var typeOf = function (x) { var t = typeof x; if (x === null) { return 'null'; } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { return 'array'; } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { return 'string'; } else { return t; } }; var isType$1 = function (type) { return function (value) { return typeOf(value) === type; }; }; var isSimpleType = function (type) { return function (value) { return typeof value === type; }; }; var eq$1 = function (t) { return function (a) { return t === a; }; }; var isString = isType$1('string'); var isObject = isType$1('object'); var isArray = isType$1('array'); var isNull = eq$1(null); var isBoolean = isSimpleType('boolean'); var isUndefined = eq$1(undefined); var isNullable = function (a) { return a === null || a === undefined; }; var isNonNullable = function (a) { return !isNullable(a); }; var isFunction = isSimpleType('function'); var isNumber = isSimpleType('number'); var isArrayOf = function (value, pred) { if (isArray(value)) { for (var i = 0, len = value.length; i < len; ++i) { if (!pred(value[i])) { return false; } } return true; } return false; }; var noop = function () { }; var noarg = function (f) { return function () { return f(); }; }; var compose = function (fa, fb) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return fa(fb.apply(null, args)); }; }; var compose1 = function (fbc, fab) { return function (a) { return fbc(fab(a)); }; }; var constant$1 = function (value) { return function () { return value; }; }; var identity$1 = function (x) { return x; }; var tripleEquals = function (a, b) { return a === b; }; function curry(fn) { var initialArgs = []; for (var _i = 1; _i < arguments.length; _i++) { initialArgs[_i - 1] = arguments[_i]; } return function () { var restArgs = []; for (var _i = 0; _i < arguments.length; _i++) { restArgs[_i] = arguments[_i]; } var all = initialArgs.concat(restArgs); return fn.apply(null, all); }; } var not = function (f) { return function (t) { return !f(t); }; }; var die = function (msg) { return function () { throw new Error(msg); }; }; var never = constant$1(false); var always = constant$1(true); var global$g = tinymce.util.Tools.resolve('tinymce.ThemeManager'); var __assign = function () { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function __rest(s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === 'function') for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; } function __spreadArray(to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); } var none = function () { return NONE; }; var NONE = function () { var call = function (thunk) { return thunk(); }; var id = identity$1; var me = { fold: function (n, _s) { return n(); }, isSome: never, isNone: always, getOr: id, getOrThunk: call, getOrDie: function (msg) { throw new Error(msg || 'error: getOrDie called on none.'); }, getOrNull: constant$1(null), getOrUndefined: constant$1(undefined), or: id, orThunk: call, map: none, each: noop, bind: none, exists: never, forall: always, filter: function () { return none(); }, toArray: function () { return []; }, toString: constant$1('none()') }; return me; }(); var some = function (a) { var constant_a = constant$1(a); var self = function () { return me; }; var bind = function (f) { return f(a); }; var me = { fold: function (n, s) { return s(a); }, isSome: always, isNone: never, getOr: constant_a, getOrThunk: constant_a, getOrDie: constant_a, getOrNull: constant_a, getOrUndefined: constant_a, or: self, orThunk: self, map: function (f) { return some(f(a)); }, each: function (f) { f(a); }, bind: bind, exists: bind, forall: bind, filter: function (f) { return f(a) ? me : NONE; }, toArray: function () { return [a]; }, toString: function () { return 'some(' + a + ')'; } }; return me; }; var from$1 = function (value) { return value === null || value === undefined ? NONE : some(value); }; var Optional = { some: some, none: none, from: from$1 }; var nativeSlice = Array.prototype.slice; var nativeIndexOf = Array.prototype.indexOf; var nativePush = Array.prototype.push; var rawIndexOf = function (ts, t) { return nativeIndexOf.call(ts, t); }; var indexOf = function (xs, x) { var r = rawIndexOf(xs, x); return r === -1 ? Optional.none() : Optional.some(r); }; var contains$2 = function (xs, x) { return rawIndexOf(xs, x) > -1; }; var exists = function (xs, pred) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i)) { return true; } } return false; }; var range$2 = function (num, f) { var r = []; for (var i = 0; i < num; i++) { r.push(f(i)); } return r; }; var chunk$1 = function (array, size) { var r = []; for (var i = 0; i < array.length; i += size) { var s = nativeSlice.call(array, i, i + size); r.push(s); } return r; }; var map$2 = function (xs, f) { var len = xs.length; var r = new Array(len); for (var i = 0; i < len; i++) { var x = xs[i]; r[i] = f(x, i); } return r; }; var each$1 = function (xs, f) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; f(x, i); } }; var eachr = function (xs, f) { for (var i = xs.length - 1; i >= 0; i--) { var x = xs[i]; f(x, i); } }; var partition$3 = function (xs, pred) { var pass = []; var fail = []; for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; var arr = pred(x, i) ? pass : fail; arr.push(x); } return { pass: pass, fail: fail }; }; var filter$2 = function (xs, pred) { var r = []; for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i)) { r.push(x); } } return r; }; var foldr = function (xs, f, acc) { eachr(xs, function (x, i) { acc = f(acc, x, i); }); return acc; }; var foldl = function (xs, f, acc) { each$1(xs, function (x, i) { acc = f(acc, x, i); }); return acc; }; var findUntil = function (xs, pred, until) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i)) { return Optional.some(x); } else if (until(x, i)) { break; } } return Optional.none(); }; var find$5 = function (xs, pred) { return findUntil(xs, pred, never); }; var findIndex$1 = function (xs, pred) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i)) { return Optional.some(i); } } return Optional.none(); }; var flatten = function (xs) { var r = []; for (var i = 0, len = xs.length; i < len; ++i) { if (!isArray(xs[i])) { throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); } nativePush.apply(r, xs[i]); } return r; }; var bind$3 = function (xs, f) { return flatten(map$2(xs, f)); }; var forall = function (xs, pred) { for (var i = 0, len = xs.length; i < len; ++i) { var x = xs[i]; if (pred(x, i) !== true) { return false; } } return true; }; var reverse = function (xs) { var r = nativeSlice.call(xs, 0); r.reverse(); return r; }; var difference = function (a1, a2) { return filter$2(a1, function (x) { return !contains$2(a2, x); }); }; var mapToObject = function (xs, f) { var r = {}; for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; r[String(x)] = f(x, i); } return r; }; var pure$2 = function (x) { return [x]; }; var sort = function (xs, comparator) { var copy = nativeSlice.call(xs, 0); copy.sort(comparator); return copy; }; var get$f = function (xs, i) { return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); }; var head = function (xs) { return get$f(xs, 0); }; var last$2 = function (xs) { return get$f(xs, xs.length - 1); }; var from = isFunction(Array.from) ? Array.from : function (x) { return nativeSlice.call(x); }; var findMap = function (arr, f) { for (var i = 0; i < arr.length; i++) { var r = f(arr[i], i); if (r.isSome()) { return r; } } return Optional.none(); }; var keys = Object.keys; var hasOwnProperty$1 = Object.hasOwnProperty; var each = function (obj, f) { var props = keys(obj); for (var k = 0, len = props.length; k < len; k++) { var i = props[k]; var x = obj[i]; f(x, i); } }; var map$1 = function (obj, f) { return tupleMap(obj, function (x, i) { return { k: i, v: f(x, i) }; }); }; var tupleMap = function (obj, f) { var r = {}; each(obj, function (x, i) { var tuple = f(x, i); r[tuple.k] = tuple.v; }); return r; }; var objAcc = function (r) { return function (x, i) { r[i] = x; }; }; var internalFilter = function (obj, pred, onTrue, onFalse) { var r = {}; each(obj, function (x, i) { (pred(x, i) ? onTrue : onFalse)(x, i); }); return r; }; var filter$1 = function (obj, pred) { var t = {}; internalFilter(obj, pred, objAcc(t), noop); return t; }; var mapToArray = function (obj, f) { var r = []; each(obj, function (value, name) { r.push(f(value, name)); }); return r; }; var find$4 = function (obj, pred) { var props = keys(obj); for (var k = 0, len = props.length; k < len; k++) { var i = props[k]; var x = obj[i]; if (pred(x, i, obj)) { return Optional.some(x); } } return Optional.none(); }; var values = function (obj) { return mapToArray(obj, identity$1); }; var get$e = function (obj, key) { return has$2(obj, key) ? Optional.from(obj[key]) : Optional.none(); }; var has$2 = function (obj, key) { return hasOwnProperty$1.call(obj, key); }; var hasNonNullableKey = function (obj, key) { return has$2(obj, key) && obj[key] !== undefined && obj[key] !== null; }; var is$1 = function (lhs, rhs, comparator) { if (comparator === void 0) { comparator = tripleEquals; } return lhs.exists(function (left) { return comparator(left, rhs); }); }; var equals = function (lhs, rhs, comparator) { if (comparator === void 0) { comparator = tripleEquals; } return lift2(lhs, rhs, comparator).getOr(lhs.isNone() && rhs.isNone()); }; var cat = function (arr) { var r = []; var push = function (x) { r.push(x); }; for (var i = 0; i < arr.length; i++) { arr[i].each(push); } return r; }; var sequence = function (arr) { var r = []; for (var i = 0; i < arr.length; i++) { var x = arr[i]; if (x.isSome()) { r.push(x.getOrDie()); } else { return Optional.none(); } } return Optional.some(r); }; var lift2 = function (oa, ob, f) { return oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none(); }; var lift3 = function (oa, ob, oc, f) { return oa.isSome() && ob.isSome() && oc.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie(), oc.getOrDie())) : Optional.none(); }; var mapFrom = function (a, f) { return a !== undefined && a !== null ? Optional.some(f(a)) : Optional.none(); }; var someIf = function (b, a) { return b ? Optional.some(a) : Optional.none(); }; var addToEnd = function (str, suffix) { return str + suffix; }; var removeFromStart = function (str, numChars) { return str.substring(numChars); }; var checkRange = function (str, substr, start) { return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr; }; var removeLeading = function (str, prefix) { return startsWith(str, prefix) ? removeFromStart(str, prefix.length) : str; }; var ensureTrailing = function (str, suffix) { return endsWith(str, suffix) ? str : addToEnd(str, suffix); }; var contains$1 = function (str, substr) { return str.indexOf(substr) !== -1; }; var startsWith = function (str, prefix) { return checkRange(str, prefix, 0); }; var endsWith = function (str, suffix) { return checkRange(str, suffix, str.length - suffix.length); }; var blank = function (r) { return function (s) { return s.replace(r, ''); }; }; var trim$1 = blank(/^\s+|\s+$/g); var isNotEmpty = function (s) { return s.length > 0; }; var isEmpty = function (s) { return !isNotEmpty(s); }; var isSupported$1 = function (dom) { return dom.style !== undefined && isFunction(dom.style.getPropertyValue); }; var fromHtml$2 = function (html, scope) { var doc = scope || document; var div = doc.createElement('div'); div.innerHTML = html; if (!div.hasChildNodes() || div.childNodes.length > 1) { console.error('HTML does not have a single root node', html); throw new Error('HTML must have a single root node'); } return fromDom(div.childNodes[0]); }; var fromTag = function (tag, scope) { var doc = scope || document; var node = doc.createElement(tag); return fromDom(node); }; var fromText = function (text, scope) { var doc = scope || document; var node = doc.createTextNode(text); return fromDom(node); }; var fromDom = function (node) { if (node === null || node === undefined) { throw new Error('Node cannot be null or undefined'); } return { dom: node }; }; var fromPoint = function (docElm, x, y) { return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); }; var SugarElement = { fromHtml: fromHtml$2, fromTag: fromTag, fromText: fromText, fromDom: fromDom, fromPoint: fromPoint }; typeof window !== 'undefined' ? window : Function('return this;')(); var DOCUMENT = 9; var DOCUMENT_FRAGMENT = 11; var ELEMENT = 1; var TEXT = 3; var name$2 = function (element) { var r = element.dom.nodeName; return r.toLowerCase(); }; var type = function (element) { return element.dom.nodeType; }; var isType = function (t) { return function (element) { return type(element) === t; }; }; var isElement$2 = isType(ELEMENT); var isText$1 = isType(TEXT); var isDocument = isType(DOCUMENT); var isDocumentFragment = isType(DOCUMENT_FRAGMENT); var cached = function (f) { var called = false; var r; return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (!called) { called = true; r = f.apply(null, args); } return r; }; }; var DeviceType = function (os, browser, userAgent, mediaMatch) { var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true; var isiPhone = os.isiOS() && !isiPad; var isMobile = os.isiOS() || os.isAndroid(); var isTouch = isMobile || mediaMatch('(pointer:coarse)'); var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)'); var isPhone = isiPhone || isMobile && !isTablet; var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false; var isDesktop = !isPhone && !isTablet && !iOSwebview; return { isiPad: constant$1(isiPad), isiPhone: constant$1(isiPhone), isTablet: constant$1(isTablet), isPhone: constant$1(isPhone), isTouch: constant$1(isTouch), isAndroid: os.isAndroid, isiOS: os.isiOS, isWebView: constant$1(iOSwebview), isDesktop: constant$1(isDesktop) }; }; var firstMatch = function (regexes, s) { for (var i = 0; i < regexes.length; i++) { var x = regexes[i]; if (x.test(s)) { return x; } } return undefined; }; var find$3 = function (regexes, agent) { var r = firstMatch(regexes, agent); if (!r) { return { major: 0, minor: 0 }; } var group = function (i) { return Number(agent.replace(r, '$' + i)); }; return nu$d(group(1), group(2)); }; var detect$4 = function (versionRegexes, agent) { var cleanedAgent = String(agent).toLowerCase(); if (versionRegexes.length === 0) { return unknown$3(); } return find$3(versionRegexes, cleanedAgent); }; var unknown$3 = function () { return nu$d(0, 0); }; var nu$d = function (major, minor) { return { major: major, minor: minor }; }; var Version = { nu: nu$d, detect: detect$4, unknown: unknown$3 }; var detectBrowser$1 = function (browsers, userAgentData) { return findMap(userAgentData.brands, function (uaBrand) { var lcBrand = uaBrand.brand.toLowerCase(); return find$5(browsers, function (browser) { var _a; return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase()); }).map(function (info) { return { current: info.name, version: Version.nu(parseInt(uaBrand.version, 10), 0) }; }); }); }; var detect$3 = function (candidates, userAgent) { var agent = String(userAgent).toLowerCase(); return find$5(candidates, function (candidate) { return candidate.search(agent); }); }; var detectBrowser = function (browsers, userAgent) { return detect$3(browsers, userAgent).map(function (browser) { var version = Version.detect(browser.versionRegexes, userAgent); return { current: browser.name, version: version }; }); }; var detectOs = function (oses, userAgent) { return detect$3(oses, userAgent).map(function (os) { var version = Version.detect(os.versionRegexes, userAgent); return { current: os.name, version: version }; }); }; var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; var checkContains = function (target) { return function (uastring) { return contains$1(uastring, target); }; }; var browsers = [ { name: 'Edge', versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], search: function (uastring) { return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit'); } }, { name: 'Chrome', brand: 'Chromium', versionRegexes: [ /.*?chrome\/([0-9]+)\.([0-9]+).*/, normalVersionRegex ], search: function (uastring) { return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe'); } }, { name: 'IE', versionRegexes: [ /.*?msie\ ?([0-9]+)\.([0-9]+).*/, /.*?rv:([0-9]+)\.([0-9]+).*/ ], search: function (uastring) { return contains$1(uastring, 'msie') || contains$1(uastring, 'trident'); } }, { name: 'Opera', versionRegexes: [ normalVersionRegex, /.*?opera\/([0-9]+)\.([0-9]+).*/ ], search: checkContains('opera') }, { name: 'Firefox', versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/], search: checkContains('firefox') }, { name: 'Safari', versionRegexes: [ normalVersionRegex, /.*?cpu os ([0-9]+)_([0-9]+).*/ ], search: function (uastring) { return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit'); } } ]; var oses = [ { name: 'Windows', search: checkContains('win'), versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/] }, { name: 'iOS', search: function (uastring) { return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad'); }, versionRegexes: [ /.*?version\/\ ?([0-9]+)\.([0-9]+).*/, /.*cpu os ([0-9]+)_([0-9]+).*/, /.*cpu iphone os ([0-9]+)_([0-9]+).*/ ] }, { name: 'Android', search: checkContains('android'), versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/] }, { name: 'OSX', search: checkContains('mac os x'), versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/] }, { name: 'Linux', search: checkContains('linux'), versionRegexes: [] }, { name: 'Solaris', search: checkContains('sunos'), versionRegexes: [] }, { name: 'FreeBSD', search: checkContains('freebsd'), versionRegexes: [] }, { name: 'ChromeOS', search: checkContains('cros'), versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/] } ]; var PlatformInfo = { browsers: constant$1(browsers), oses: constant$1(oses) }; var edge = 'Edge'; var chrome = 'Chrome'; var ie = 'IE'; var opera = 'Opera'; var firefox = 'Firefox'; var safari = 'Safari'; var unknown$2 = function () { return nu$c({ current: undefined, version: Version.unknown() }); }; var nu$c = function (info) { var current = info.current; var version = info.version; var isBrowser = function (name) { return function () { return current === name; }; }; return { current: current, version: version, isEdge: isBrowser(edge), isChrome: isBrowser(chrome), isIE: isBrowser(ie), isOpera: isBrowser(opera), isFirefox: isBrowser(firefox), isSafari: isBrowser(safari) }; }; var Browser = { unknown: unknown$2, nu: nu$c, edge: constant$1(edge), chrome: constant$1(chrome), ie: constant$1(ie), opera: constant$1(opera), firefox: constant$1(firefox), safari: constant$1(safari) }; var windows = 'Windows'; var ios = 'iOS'; var android = 'Android'; var linux = 'Linux'; var osx = 'OSX'; var solaris = 'Solaris'; var freebsd = 'FreeBSD'; var chromeos = 'ChromeOS'; var unknown$1 = function () { return nu$b({ current: undefined, version: Version.unknown() }); }; var nu$b = function (info) { var current = info.current; var version = info.version; var isOS = function (name) { return function () { return current === name; }; }; return { current: current, version: version, isWindows: isOS(windows), isiOS: isOS(ios), isAndroid: isOS(android), isOSX: isOS(osx), isLinux: isOS(linux), isSolaris: isOS(solaris), isFreeBSD: isOS(freebsd), isChromeOS: isOS(chromeos) }; }; var OperatingSystem = { unknown: unknown$1, nu: nu$b, windows: constant$1(windows), ios: constant$1(ios), android: constant$1(android), linux: constant$1(linux), osx: constant$1(osx), solaris: constant$1(solaris), freebsd: constant$1(freebsd), chromeos: constant$1(chromeos) }; var detect$2 = function (userAgent, userAgentDataOpt, mediaMatch) { var browsers = PlatformInfo.browsers(); var oses = PlatformInfo.oses(); var browser = userAgentDataOpt.bind(function (userAgentData) { return detectBrowser$1(browsers, userAgentData); }).orThunk(function () { return detectBrowser(browsers, userAgent); }).fold(Browser.unknown, Browser.nu); var os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu); var deviceType = DeviceType(os, browser, userAgent, mediaMatch); return { browser: browser, os: os, deviceType: deviceType }; }; var PlatformDetection = { detect: detect$2 }; var mediaMatch = function (query) { return window.matchMedia(query).matches; }; var platform = cached(function () { return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch); }); var detect$1 = function () { return platform(); }; var compareDocumentPosition = function (a, b, match) { return (a.compareDocumentPosition(b) & match) !== 0; }; var documentPositionContainedBy = function (a, b) { return compareDocumentPosition(a, b, Node.DOCUMENT_POSITION_CONTAINED_BY); }; var is = function (element, selector) { var dom = element.dom; if (dom.nodeType !== ELEMENT) { return false; } else { var elem = dom; if (elem.matches !== undefined) { return elem.matches(selector); } else if (elem.msMatchesSelector !== undefined) { return elem.msMatchesSelector(selector); } else if (elem.webkitMatchesSelector !== undefined) { return elem.webkitMatchesSelector(selector); } else if (elem.mozMatchesSelector !== undefined) { return elem.mozMatchesSelector(selector); } else { throw new Error('Browser lacks native selectors'); } } }; var bypassSelector = function (dom) { return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0; }; var all$3 = function (selector, scope) { var base = scope === undefined ? document : scope.dom; return bypassSelector(base) ? [] : map$2(base.querySelectorAll(selector), SugarElement.fromDom); }; var one = function (selector, scope) { var base = scope === undefined ? document : scope.dom; return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom); }; var eq = function (e1, e2) { return e1.dom === e2.dom; }; var regularContains = function (e1, e2) { var d1 = e1.dom; var d2 = e2.dom; return d1 === d2 ? false : d1.contains(d2); }; var ieContains = function (e1, e2) { return documentPositionContainedBy(e1.dom, e2.dom); }; var contains = function (e1, e2) { return detect$1().browser.isIE() ? ieContains(e1, e2) : regularContains(e1, e2); }; var owner$4 = function (element) { return SugarElement.fromDom(element.dom.ownerDocument); }; var documentOrOwner = function (dos) { return isDocument(dos) ? dos : owner$4(dos); }; var documentElement = function (element) { return SugarElement.fromDom(documentOrOwner(element).dom.documentElement); }; var defaultView = function (element) { return SugarElement.fromDom(documentOrOwner(element).dom.defaultView); }; var parent = function (element) { return Optional.from(element.dom.parentNode).map(SugarElement.fromDom); }; var parentNode = function (element) { return parent(element); }; var offsetParent = function (element) { return Optional.from(element.dom.offsetParent).map(SugarElement.fromDom); }; var nextSibling = function (element) { return Optional.from(element.dom.nextSibling).map(SugarElement.fromDom); }; var children = function (element) { return map$2(element.dom.childNodes, SugarElement.fromDom); }; var child$2 = function (element, index) { var cs = element.dom.childNodes; return Optional.from(cs[index]).map(SugarElement.fromDom); }; var firstChild = function (element) { return child$2(element, 0); }; var spot = function (element, offset) { return { element: element, offset: offset }; }; var leaf = function (element, offset) { var cs = children(element); return cs.length > 0 && offset < cs.length ? spot(cs[offset], 0) : spot(element, offset); }; var isShadowRoot = function (dos) { return isDocumentFragment(dos) && isNonNullable(dos.dom.host); }; var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); var isSupported = constant$1(supported); var getRootNode = supported ? function (e) { return SugarElement.fromDom(e.dom.getRootNode()); } : documentOrOwner; var getContentContainer = function (dos) { return isShadowRoot(dos) ? dos : SugarElement.fromDom(documentOrOwner(dos).dom.body); }; var isInShadowRoot = function (e) { return getShadowRoot(e).isSome(); }; var getShadowRoot = function (e) { var r = getRootNode(e); return isShadowRoot(r) ? Optional.some(r) : Optional.none(); }; var getShadowHost = function (e) { return SugarElement.fromDom(e.dom.host); }; var getOriginalEventTarget = function (event) { if (isSupported() && isNonNullable(event.target)) { var el = SugarElement.fromDom(event.target); if (isElement$2(el) && isOpenShadowHost(el)) { if (event.composed && event.composedPath) { var composedPath = event.composedPath(); if (composedPath) { return head(composedPath); } } } } return Optional.from(event.target); }; var isOpenShadowHost = function (element) { return isNonNullable(element.dom.shadowRoot); }; var inBody = function (element) { var dom = isText$1(element) ? element.dom.parentNode : element.dom; if (dom === undefined || dom === null || dom.ownerDocument === null) { return false; } var doc = dom.ownerDocument; return getShadowRoot(SugarElement.fromDom(dom)).fold(function () { return doc.body.contains(dom); }, compose1(inBody, getShadowHost)); }; var body = function () { return getBody(SugarElement.fromDom(document)); }; var getBody = function (doc) { var b = doc.dom.body; if (b === null || b === undefined) { throw new Error('Body is not available yet'); } return SugarElement.fromDom(b); }; var rawSet = function (dom, key, value) { if (isString(value) || isBoolean(value) || isNumber(value)) { dom.setAttribute(key, value + ''); } else { console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom); throw new Error('Attribute value was not simple'); } }; var set$8 = function (element, key, value) { rawSet(element.dom, key, value); }; var setAll$1 = function (element, attrs) { var dom = element.dom; each(attrs, function (v, k) { rawSet(dom, k, v); }); }; var get$d = function (element, key) { var v = element.dom.getAttribute(key); return v === null ? undefined : v; }; var getOpt = function (element, key) { return Optional.from(get$d(element, key)); }; var has$1 = function (element, key) { var dom = element.dom; return dom && dom.hasAttribute ? dom.hasAttribute(key) : false; }; var remove$7 = function (element, key) { element.dom.removeAttribute(key); }; var internalSet = function (dom, property, value) { if (!isString(value)) { console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom); throw new Error('CSS value must be a string: ' + value); } if (isSupported$1(dom)) { dom.style.setProperty(property, value); } }; var internalRemove = function (dom, property) { if (isSupported$1(dom)) { dom.style.removeProperty(property); } }; var set$7 = function (element, property, value) { var dom = element.dom; internalSet(dom, property, value); }; var setAll = function (element, css) { var dom = element.dom; each(css, function (v, k) { internalSet(dom, k, v); }); }; var setOptions = function (element, css) { var dom = element.dom; each(css, function (v, k) { v.fold(function () { internalRemove(dom, k); }, function (value) { internalSet(dom, k, value); }); }); }; var get$c = function (element, property) { var dom = element.dom; var styles = window.getComputedStyle(dom); var r = styles.getPropertyValue(property); return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r; }; var getUnsafeProperty = function (dom, property) { return isSupported$1(dom) ? dom.style.getPropertyValue(property) : ''; }; var getRaw = function (element, property) { var dom = element.dom; var raw = getUnsafeProperty(dom, property); return Optional.from(raw).filter(function (r) { return r.length > 0; }); }; var getAllRaw = function (element) { var css = {}; var dom = element.dom; if (isSupported$1(dom)) { for (var i = 0; i < dom.style.length; i++) { var ruleName = dom.style.item(i); css[ruleName] = dom.style[ruleName]; } } return css; }; var isValidValue = function (tag, property, value) { var element = SugarElement.fromTag(tag); set$7(element, property, value); var style = getRaw(element, property); return style.isSome(); }; var remove$6 = function (element, property) { var dom = element.dom; internalRemove(dom, property); if (is$1(getOpt(element, 'style').map(trim$1), '')) { remove$7(element, 'style'); } }; var reflow = function (e) { return e.dom.offsetWidth; }; var Dimension = function (name, getOffset) { var set = function (element, h) { if (!isNumber(h) && !h.match(/^[0-9]+$/)) { throw new Error(name + '.set accepts only positive integer values. Value was ' + h); } var dom = element.dom; if (isSupported$1(dom)) { dom.style[name] = h + 'px'; } }; var get = function (element) { var r = getOffset(element); if (r <= 0 || r === null) { var css = get$c(element, name); return parseFloat(css) || 0; } return r; }; var getOuter = get; var aggregate = function (element, properties) { return foldl(properties, function (acc, property) { var val = get$c(element, property); var value = val === undefined ? 0 : parseInt(val, 10); return isNaN(value) ? acc : acc + value; }, 0); }; var max = function (element, value, properties) { var cumulativeInclusions = aggregate(element, properties); var absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0; return absoluteMax; }; return { set: set, get: get, getOuter: getOuter, aggregate: aggregate, max: max }; }; var api$3 = Dimension('height', function (element) { var dom = element.dom; return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight; }); var get$b = function (element) { return api$3.get(element); }; var getOuter$2 = function (element) { return api$3.getOuter(element); }; var setMax$1 = function (element, value) { var inclusions = [ 'margin-top', 'border-top-width', 'padding-top', 'padding-bottom', 'border-bottom-width', 'margin-bottom' ]; var absMax = api$3.max(element, value, inclusions); set$7(element, 'max-height', absMax + 'px'); }; var r$1 = function (left, top) { var translate = function (x, y) { return r$1(left + x, top + y); }; return { left: left, top: top, translate: translate }; }; var SugarPosition = r$1; var boxPosition = function (dom) { var box = dom.getBoundingClientRect(); return SugarPosition(box.left, box.top); }; var firstDefinedOrZero = function (a, b) { if (a !== undefined) { return a; } else { return b !== undefined ? b : 0; } }; var absolute$3 = function (element) { var doc = element.dom.ownerDocument; var body = doc.body; var win = doc.defaultView; var html = doc.documentElement; if (body === element.dom) { return SugarPosition(body.offsetLeft, body.offsetTop); } var scrollTop = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageYOffset, html.scrollTop); var scrollLeft = firstDefinedOrZero(win === null || win === void 0 ? void 0 : win.pageXOffset, html.scrollLeft); var clientTop = firstDefinedOrZero(html.clientTop, body.clientTop); var clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft); return viewport$1(element).translate(scrollLeft - clientLeft, scrollTop - clientTop); }; var viewport$1 = function (element) { var dom = element.dom; var doc = dom.ownerDocument; var body = doc.body; if (body === dom) { return SugarPosition(body.offsetLeft, body.offsetTop); } if (!inBody(element)) { return SugarPosition(0, 0); } return boxPosition(dom); }; var api$2 = Dimension('width', function (element) { return element.dom.offsetWidth; }); var set$6 = function (element, h) { return api$2.set(element, h); }; var get$a = function (element) { return api$2.get(element); }; var getOuter$1 = function (element) { return api$2.getOuter(element); }; var setMax = function (element, value) { var inclusions = [ 'margin-left', 'border-left-width', 'padding-left', 'padding-right', 'border-right-width', 'margin-right' ]; var absMax = api$2.max(element, value, inclusions); set$7(element, 'max-width', absMax + 'px'); }; var mkEvent = function (target, x, y, stop, prevent, kill, raw) { return { target: target, x: x, y: y, stop: stop, prevent: prevent, kill: kill, raw: raw }; }; var fromRawEvent$1 = function (rawEvent) { var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target)); var stop = function () { return rawEvent.stopPropagation(); }; var prevent = function () { return rawEvent.preventDefault(); }; var kill = compose(prevent, stop); return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent); }; var handle = function (filter, handler) { return function (rawEvent) { if (filter(rawEvent)) { handler(fromRawEvent$1(rawEvent)); } }; }; var binder = function (element, event, filter, handler, useCapture) { var wrapped = handle(filter, handler); element.dom.addEventListener(event, wrapped, useCapture); return { unbind: curry(unbind, element, event, wrapped, useCapture) }; }; var bind$2 = function (element, event, filter, handler) { return binder(element, event, filter, handler, false); }; var capture$1 = function (element, event, filter, handler) { return binder(element, event, filter, handler, true); }; var unbind = function (element, event, handler, useCapture) { element.dom.removeEventListener(event, handler, useCapture); }; var before$2 = function (marker, element) { var parent$1 = parent(marker); parent$1.each(function (v) { v.dom.insertBefore(element.dom, marker.dom); }); }; var after$2 = function (marker, element) { var sibling = nextSibling(marker); sibling.fold(function () { var parent$1 = parent(marker); parent$1.each(function (v) { append$2(v, element); }); }, function (v) { before$2(v, element); }); }; var prepend$1 = function (parent, element) { var firstChild$1 = firstChild(parent); firstChild$1.fold(function () { append$2(parent, element); }, function (v) { parent.dom.insertBefore(element.dom, v.dom); }); }; var append$2 = function (parent, element) { parent.dom.appendChild(element.dom); }; var appendAt = function (parent, element, index) { child$2(parent, index).fold(function () { append$2(parent, element); }, function (v) { before$2(v, element); }); }; var before$1 = function (marker, elements) { each$1(elements, function (x) { before$2(marker, x); }); }; var append$1 = function (parent, elements) { each$1(elements, function (x) { append$2(parent, x); }); }; var empty = function (element) { element.dom.textContent = ''; each$1(children(element), function (rogue) { remove$5(rogue); }); }; var remove$5 = function (element) { var dom = element.dom; if (dom.parentNode !== null) { dom.parentNode.removeChild(dom); } }; var unwrap = function (wrapper) { var children$1 = children(wrapper); if (children$1.length > 0) { before$1(wrapper, children$1); } remove$5(wrapper); }; var get$9 = function (_DOC) { var doc = _DOC !== undefined ? _DOC.dom : document; var x = doc.body.scrollLeft || doc.documentElement.scrollLeft; var y = doc.body.scrollTop || doc.documentElement.scrollTop; return SugarPosition(x, y); }; var to = function (x, y, _DOC) { var doc = _DOC !== undefined ? _DOC.dom : document; var win = doc.defaultView; if (win) { win.scrollTo(x, y); } }; var get$8 = function (_win) { var win = _win === undefined ? window : _win; if (detect$1().browser.isFirefox()) { return Optional.none(); } else { return Optional.from(win['visualViewport']); } }; var bounds$1 = function (x, y, width, height) { return { x: x, y: y, width: width, height: height, right: x + width, bottom: y + height }; }; var getBounds$3 = function (_win) { var win = _win === undefined ? window : _win; var doc = win.document; var scroll = get$9(SugarElement.fromDom(doc)); return get$8(win).fold(function () { var html = win.document.documentElement; var width = html.clientWidth; var height = html.clientHeight; return bounds$1(scroll.left, scroll.top, width, height); }, function (visualViewport) { return bounds$1(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height); }); }; var walkUp = function (navigation, doc) { var frame = navigation.view(doc); return frame.fold(constant$1([]), function (f) { var parent = navigation.owner(f); var rest = walkUp(navigation, parent); return [f].concat(rest); }); }; var pathTo = function (element, navigation) { var d = navigation.owner(element); var paths = walkUp(navigation, d); return Optional.some(paths); }; var view = function (doc) { var _a; var element = doc.dom === document ? Optional.none() : Optional.from((_a = doc.dom.defaultView) === null || _a === void 0 ? void 0 : _a.frameElement); return element.map(SugarElement.fromDom); }; var owner$3 = function (element) { return owner$4(element); }; var Navigation = /*#__PURE__*/Object.freeze({ __proto__: null, view: view, owner: owner$3 }); var find$2 = function (element) { var doc = SugarElement.fromDom(document); var scroll = get$9(doc); var path = pathTo(element, Navigation); return path.fold(curry(absolute$3, element), function (frames) { var offset = viewport$1(element); var r = foldr(frames, function (b, a) { var loc = viewport$1(a); return { left: b.left + loc.left, top: b.top + loc.top }; }, { left: 0, top: 0 }); return SugarPosition(r.left + offset.left + scroll.left, r.top + offset.top + scroll.top); }); }; var pointed = function (point, width, height) { return { point: point, width: width, height: height }; }; var rect = function (x, y, width, height) { return { x: x, y: y, width: width, height: height }; }; var bounds = function (x, y, width, height) { return { x: x, y: y, width: width, height: height, right: x + width, bottom: y + height }; }; var box$1 = function (element) { var xy = absolute$3(element); var w = getOuter$1(element); var h = getOuter$2(element); return bounds(xy.left, xy.top, w, h); }; var absolute$2 = function (element) { var position = find$2(element); var width = getOuter$1(element); var height = getOuter$2(element); return bounds(position.left, position.top, width, height); }; var win = function () { return getBounds$3(window); }; var value$3 = function (o) { var or = function (_opt) { return value$3(o); }; var orThunk = function (_f) { return value$3(o); }; var map = function (f) { return value$3(f(o)); }; var mapError = function (_f) { return value$3(o); }; var each = function (f) { f(o); }; var bind = function (f) { return f(o); }; var fold = function (_, onValue) { return onValue(o); }; var exists = function (f) { return f(o); }; var forall = function (f) { return f(o); }; var toOptional = function () { return Optional.some(o); }; return { isValue: always, isError: never, getOr: constant$1(o), getOrThunk: constant$1(o), getOrDie: constant$1(o), or: or, orThunk: orThunk, fold: fold, map: map, mapError: mapError, each: each, bind: bind, exists: exists, forall: forall, toOptional: toOptional }; }; var error$1 = function (message) { var getOrThunk = function (f) { return f(); }; var getOrDie = function () { return die(String(message))(); }; var or = identity$1; var orThunk = function (f) { return f(); }; var map = function (_f) { return error$1(message); }; var mapError = function (f) { return error$1(f(message)); }; var bind = function (_f) { return error$1(message); }; var fold = function (onError, _) { return onError(message); }; return { isValue: never, isError: always, getOr: identity$1, getOrThunk: getOrThunk, getOrDie: getOrDie, or: or, orThunk: orThunk, fold: fold, map: map, mapError: mapError, each: noop, bind: bind, exists: never, forall: always, toOptional: Optional.none }; }; var fromOption = function (opt, err) { return opt.fold(function () { return error$1(err); }, value$3); }; var Result = { value: value$3, error: error$1, fromOption: fromOption }; var SimpleResultType; (function (SimpleResultType) { SimpleResultType[SimpleResultType['Error'] = 0] = 'Error'; SimpleResultType[SimpleResultType['Value'] = 1] = 'Value'; }(SimpleResultType || (SimpleResultType = {}))); var fold$1 = function (res, onError, onValue) { return res.stype === SimpleResultType.Error ? onError(res.serror) : onValue(res.svalue); }; var partition$2 = function (results) { var values = []; var errors = []; each$1(results, function (obj) { fold$1(obj, function (err) { return errors.push(err); }, function (val) { return values.push(val); }); }); return { values: values, errors: errors }; }; var mapError = function (res, f) { if (res.stype === SimpleResultType.Error) { return { stype: SimpleResultType.Error, serror: f(res.serror) }; } else { return res; } }; var map = function (res, f) { if (res.stype === SimpleResultType.Value) { return { stype: SimpleResultType.Value, svalue: f(res.svalue) }; } else { return res; } }; var bind$1 = function (res, f) { if (res.stype === SimpleResultType.Value) { return f(res.svalue); } else { return res; } }; var bindError = function (res, f) { if (res.stype === SimpleResultType.Error) { return f(res.serror); } else { return res; } }; var svalue = function (v) { return { stype: SimpleResultType.Value, svalue: v }; }; var serror = function (e) { return { stype: SimpleResultType.Error, serror: e }; }; var toResult$1 = function (res) { return fold$1(res, Result.error, Result.value); }; var fromResult$1 = function (res) { return res.fold(serror, svalue); }; var SimpleResult = { fromResult: fromResult$1, toResult: toResult$1, svalue: svalue, partition: partition$2, serror: serror, bind: bind$1, bindError: bindError, map: map, mapError: mapError, fold: fold$1 }; var field$2 = function (key, newKey, presence, prop) { return { tag: 'field', key: key, newKey: newKey, presence: presence, prop: prop }; }; var customField$1 = function (newKey, instantiator) { return { tag: 'custom', newKey: newKey, instantiator: instantiator }; }; var fold = function (value, ifField, ifCustom) { switch (value.tag) { case 'field': return ifField(value.key, value.newKey, value.presence, value.prop); case 'custom': return ifCustom(value.newKey, value.instantiator); } }; var shallow$1 = function (old, nu) { return nu; }; var deep = function (old, nu) { var bothObjects = isObject(old) && isObject(nu); return bothObjects ? deepMerge(old, nu) : nu; }; var baseMerge = function (merger) { return function () { var objects = []; for (var _i = 0; _i < arguments.length; _i++) { objects[_i] = arguments[_i]; } if (objects.length === 0) { throw new Error('Can\'t merge zero objects'); } var ret = {}; for (var j = 0; j < objects.length; j++) { var curObject = objects[j]; for (var key in curObject) { if (has$2(curObject, key)) { ret[key] = merger(ret[key], curObject[key]); } } } return ret; }; }; var deepMerge = baseMerge(deep); var merge$1 = baseMerge(shallow$1); var required$2 = function () { return { tag: 'required', process: {} }; }; var defaultedThunk = function (fallbackThunk) { return { tag: 'defaultedThunk', process: fallbackThunk }; }; var defaulted$1 = function (fallback) { return defaultedThunk(constant$1(fallback)); }; var asOption = function () { return { tag: 'option', process: {} }; }; var mergeWithThunk = function (baseThunk) { return { tag: 'mergeWithThunk', process: baseThunk }; }; var mergeWith = function (base) { return mergeWithThunk(constant$1(base)); }; var mergeValues$1 = function (values, base) { return values.length > 0 ? SimpleResult.svalue(deepMerge(base, merge$1.apply(undefined, values))) : SimpleResult.svalue(base); }; var mergeErrors$1 = function (errors) { return compose(SimpleResult.serror, flatten)(errors); }; var consolidateObj = function (objects, base) { var partition = SimpleResult.partition(objects); return partition.errors.length > 0 ? mergeErrors$1(partition.errors) : mergeValues$1(partition.values, base); }; var consolidateArr = function (objects) { var partitions = SimpleResult.partition(objects); return partitions.errors.length > 0 ? mergeErrors$1(partitions.errors) : SimpleResult.svalue(partitions.values); }; var ResultCombine = { consolidateObj: consolidateObj, consolidateArr: consolidateArr }; var formatObj = function (input) { return isObject(input) && keys(input).length > 100 ? ' removed due to size' : JSON.stringify(input, null, 2); }; var formatErrors = function (errors) { var es = errors.length > 10 ? errors.slice(0, 10).concat([{ path: [], getErrorInfo: constant$1('... (only showing first ten failures)') }]) : errors; return map$2(es, function (e) { return 'Failed path: (' + e.path.join(' > ') + ')\n' + e.getErrorInfo(); }); }; var nu$a = function (path, getErrorInfo) { return SimpleResult.serror([{ path: path, getErrorInfo: getErrorInfo }]); }; var missingRequired = function (path, key, obj) { return nu$a(path, function () { return 'Could not find valid *required* value for "' + key + '" in ' + formatObj(obj); }); }; var missingKey = function (path, key) { return nu$a(path, function () { return 'Choice schema did not contain choice key: "' + key + '"'; }); }; var missingBranch = function (path, branches, branch) { return nu$a(path, function () { return 'The chosen schema: "' + branch + '" did not exist in branches: ' + formatObj(branches); }); }; var unsupportedFields = function (path, unsupported) { return nu$a(path, function () { return 'There are unsupported fields: [' + unsupported.join(', ') + '] specified'; }); }; var custom = function (path, err) { return nu$a(path, constant$1(err)); }; var value$2 = function (validator) { var extract = function (path, val) { return SimpleResult.bindError(validator(val), function (err) { return custom(path, err); }); }; var toString = constant$1('val'); return { extract: extract, toString: toString }; }; var anyValue$1 = value$2(SimpleResult.svalue); var requiredAccess = function (path, obj, key, bundle) { return get$e(obj, key).fold(function () { return missingRequired(path, key, obj); }, bundle); }; var fallbackAccess = function (obj, key, fallback, bundle) { var v = get$e(obj, key).getOrThunk(function () { return fallback(obj); }); return bundle(v); }; var optionAccess = function (obj, key, bundle) { return bundle(get$e(obj, key)); }; var optionDefaultedAccess = function (obj, key, fallback, bundle) { var opt = get$e(obj, key).map(function (val) { return val === true ? fallback(obj) : val; }); return bundle(opt); }; var extractField = function (field, path, obj, key, prop) { var bundle = function (av) { return prop.extract(path.concat([key]), av); }; var bundleAsOption = function (optValue) { return optValue.fold(function () { return SimpleResult.svalue(Optional.none()); }, function (ov) { var result = prop.extract(path.concat([key]), ov); return SimpleResult.map(result, Optional.some); }); }; switch (field.tag) { case 'required': return requiredAccess(path, obj, key, bundle); case 'defaultedThunk': return fallbackAccess(obj, key, field.process, bundle); case 'option': return optionAccess(obj, key, bundleAsOption); case 'defaultedOptionThunk': return optionDefaultedAccess(obj, key, field.process, bundleAsOption); case 'mergeWithThunk': { return fallbackAccess(obj, key, constant$1({}), function (v) { var result = deepMerge(field.process(obj), v); return bundle(result); }); } } }; var extractFields = function (path, obj, fields) { var success = {}; var errors = []; for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) { var field = fields_1[_i]; fold(field, function (key, newKey, presence, prop) { var result = extractField(presence, path, obj, key, prop); SimpleResult.fold(result, function (err) { errors.push.apply(errors, err); }, function (res) { success[newKey] = res; }); }, function (newKey, instantiator) { success[newKey] = instantiator(obj); }); } return errors.length > 0 ? SimpleResult.serror(errors) : SimpleResult.svalue(success); }; var valueThunk = function (getDelegate) { var extract = function (path, val) { return getDelegate().extract(path, val); }; var toString = function () { return getDelegate().toString(); }; return { extract: extract, toString: toString }; }; var getSetKeys = function (obj) { return keys(filter$1(obj, isNonNullable)); }; var objOfOnly = function (fields) { var delegate = objOf(fields); var fieldNames = foldr(fields, function (acc, value) { return fold(value, function (key) { var _a; return deepMerge(acc, (_a = {}, _a[key] = true, _a)); }, constant$1(acc)); }, {}); var extract = function (path, o) { var keys = isBoolean(o) ? [] : getSetKeys(o); var extra = filter$2(keys, function (k) { return !hasNonNullableKey(fieldNames, k); }); return extra.length === 0 ? delegate.extract(path, o) : unsupportedFields(path, extra); }; return { extract: extract, toString: delegate.toString }; }; var objOf = function (values) { var extract = function (path, o) { return extractFields(path, o, values); }; var toString = function () { var fieldStrings = map$2(values, function (value) { return fold(value, function (key, _okey, _presence, prop) { return key + ' -> ' + prop.toString(); }, function (newKey, _instantiator) { return 'state(' + newKey + ')'; }); }); return 'obj{\n' + fieldStrings.join('\n') + '}'; }; return { extract: extract, toString: toString }; }; var arrOf = function (prop) { var extract = function (path, array) { var results = map$2(array, function (a, i) { return prop.extract(path.concat(['[' + i + ']']), a); }); return ResultCombine.consolidateArr(results); }; var toString = function () { return 'array(' + prop.toString() + ')'; }; return { extract: extract, toString: toString }; }; var oneOf = function (props) { var extract = function (path, val) { var errors = []; for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { var prop = props_1[_i]; var res = prop.extract(path, val); if (res.stype === SimpleResultType.Value) { return res; } errors.push(res); } return ResultCombine.consolidateArr(errors); }; var toString = function () { return 'oneOf(' + map$2(props, function (prop) { return prop.toString(); }).join(', ') + ')'; }; return { extract: extract, toString: toString }; }; var setOf$1 = function (validator, prop) { var validateKeys = function (path, keys) { return arrOf(value$2(validator)).extract(path, keys); }; var extract = function (path, o) { var keys$1 = keys(o); var validatedKeys = validateKeys(path, keys$1); return SimpleResult.bind(validatedKeys, function (validKeys) { var schema = map$2(validKeys, function (vk) { return field$2(vk, vk, required$2(), prop); }); return objOf(schema).extract(path, o); }); }; var toString = function () { return 'setOf(' + prop.toString() + ')'; }; return { extract: extract, toString: toString }; }; var thunk = function (_desc, processor) { var getP = cached(processor); var extract = function (path, val) { return getP().extract(path, val); }; var toString = function () { return getP().toString(); }; return { extract: extract, toString: toString }; }; var arrOfObj = compose(arrOf, objOf); var anyValue = constant$1(anyValue$1); var typedValue = function (validator, expectedType) { return value$2(function (a) { var actualType = typeof a; return validator(a) ? SimpleResult.svalue(a) : SimpleResult.serror('Expected type: ' + expectedType + ' but got: ' + actualType); }); }; var number = typedValue(isNumber, 'number'); var string = typedValue(isString, 'string'); var boolean = typedValue(isBoolean, 'boolean'); var functionProcessor = typedValue(isFunction, 'function'); var isPostMessageable = function (val) { if (Object(val) !== val) { return true; } switch ({}.toString.call(val).slice(8, -1)) { case 'Boolean': case 'Number': case 'String': case 'Date': case 'RegExp': case 'Blob': case 'FileList': case 'ImageData': case 'ImageBitmap': case 'ArrayBuffer': return true; case 'Array': case 'Object': return Object.keys(val).every(function (prop) { return isPostMessageable(val[prop]); }); default: return false; } }; var postMessageable = value$2(function (a) { if (isPostMessageable(a)) { return SimpleResult.svalue(a); } else { return SimpleResult.serror('Expected value to be acceptable for sending via postMessage'); } }); var chooseFrom = function (path, input, branches, ch) { var fields = get$e(branches, ch); return fields.fold(function () { return missingBranch(path, branches, ch); }, function (vp) { return vp.extract(path.concat(['branch: ' + ch]), input); }); }; var choose$2 = function (key, branches) { var extract = function (path, input) { var choice = get$e(input, key); return choice.fold(function () { return missingKey(path, key); }, function (chosen) { return chooseFrom(path, input, branches, chosen); }); }; var toString = function () { return 'chooseOn(' + key + '). Possible values: ' + keys(branches); }; return { extract: extract, toString: toString }; }; var arrOfVal = function () { return arrOf(anyValue$1); }; var valueOf = function (validator) { return value$2(function (v) { return validator(v).fold(SimpleResult.serror, SimpleResult.svalue); }); }; var setOf = function (validator, prop) { return setOf$1(function (v) { return SimpleResult.fromResult(validator(v)); }, prop); }; var extractValue = function (label, prop, obj) { var res = prop.extract([label], obj); return SimpleResult.mapError(res, function (errs) { return { input: obj, errors: errs }; }); }; var asRaw = function (label, prop, obj) { return SimpleResult.toResult(extractValue(label, prop, obj)); }; var getOrDie = function (extraction) { return extraction.fold(function (errInfo) { throw new Error(formatError(errInfo)); }, identity$1); }; var asRawOrDie$1 = function (label, prop, obj) { return getOrDie(asRaw(label, prop, obj)); }; var formatError = function (errInfo) { return 'Errors: \n' + formatErrors(errInfo.errors).join('\n') + '\n\nInput object: ' + formatObj(errInfo.input); }; var choose$1 = function (key, branches) { return choose$2(key, map$1(branches, objOf)); }; var thunkOf = function (desc, schema) { return thunk(desc, schema); }; var field$1 = field$2; var customField = customField$1; var validateEnum = function (values) { return valueOf(function (value) { return contains$2(values, value) ? Result.value(value) : Result.error('Unsupported value: "' + value + '", choose one of "' + values.join(', ') + '".'); }); }; var required$1 = function (key) { return field$1(key, key, required$2(), anyValue()); }; var requiredOf = function (key, schema) { return field$1(key, key, required$2(), schema); }; var requiredNumber = function (key) { return requiredOf(key, number); }; var requiredString = function (key) { return requiredOf(key, string); }; var requiredStringEnum = function (key, values) { return field$1(key, key, required$2(), validateEnum(values)); }; var requiredBoolean = function (key) { return requiredOf(key, boolean); }; var requiredFunction = function (key) { return requiredOf(key, functionProcessor); }; var forbid = function (key, message) { return field$1(key, key, asOption(), value$2(function (_v) { return SimpleResult.serror('The field: ' + key + ' is forbidden. ' + message); })); }; var requiredObjOf = function (key, objSchema) { return field$1(key, key, required$2(), objOf(objSchema)); }; var requiredArrayOfObj = function (key, objFields) { return field$1(key, key, required$2(), arrOfObj(objFields)); }; var requiredArrayOf = function (key, schema) { return field$1(key, key, required$2(), arrOf(schema)); }; var option = function (key) { return field$1(key, key, asOption(), anyValue()); }; var optionOf = function (key, schema) { return field$1(key, key, asOption(), schema); }; var optionNumber = function (key) { return optionOf(key, number); }; var optionString = function (key) { return optionOf(key, string); }; var optionFunction = function (key) { return optionOf(key, functionProcessor); }; var optionArrayOf = function (key, schema) { return optionOf(key, arrOf(schema)); }; var optionObjOf = function (key, objSchema) { return optionOf(key, objOf(objSchema)); }; var optionObjOfOnly = function (key, objSchema) { return optionOf(key, objOfOnly(objSchema)); }; var defaulted = function (key, fallback) { return field$1(key, key, defaulted$1(fallback), anyValue()); }; var defaultedOf = function (key, fallback, schema) { return field$1(key, key, defaulted$1(fallback), schema); }; var defaultedNumber = function (key, fallback) { return defaultedOf(key, fallback, number); }; var defaultedString = function (key, fallback) { return defaultedOf(key, fallback, string); }; var defaultedStringEnum = function (key, fallback, values) { return defaultedOf(key, fallback, validateEnum(values)); }; var defaultedBoolean = function (key, fallback) { return defaultedOf(key, fallback, boolean); }; var defaultedFunction = function (key, fallback) { return defaultedOf(key, fallback, functionProcessor); }; var defaultedPostMsg = function (key, fallback) { return defaultedOf(key, fallback, postMessageable); }; var defaultedArrayOf = function (key, fallback, schema) { return defaultedOf(key, fallback, arrOf(schema)); }; var defaultedObjOf = function (key, fallback, objSchema) { return defaultedOf(key, fallback, objOf(objSchema)); }; var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; return { get: get, set: set }; }; var generate$7 = function (cases) { if (!isArray(cases)) { throw new Error('cases must be an array'); } if (cases.length === 0) { throw new Error('there must be at least one case'); } var constructors = []; var adt = {}; each$1(cases, function (acase, count) { var keys$1 = keys(acase); if (keys$1.length !== 1) { throw new Error('one and only one name per case'); } var key = keys$1[0]; var value = acase[key]; if (adt[key] !== undefined) { throw new Error('duplicate key detected:' + key); } else if (key === 'cata') { throw new Error('cannot have a case named cata (sorry)'); } else if (!isArray(value)) { throw new Error('case arguments must be an array'); } constructors.push(key); adt[key] = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var argLength = args.length; if (argLength !== value.length) { throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength); } var match = function (branches) { var branchKeys = keys(branches); if (constructors.length !== branchKeys.length) { throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(',')); } var allReqd = forall(constructors, function (reqKey) { return contains$2(branchKeys, reqKey); }); if (!allReqd) { throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', ')); } return branches[key].apply(null, args); }; return { fold: function () { var foldArgs = []; for (var _i = 0; _i < arguments.length; _i++) { foldArgs[_i] = arguments[_i]; } if (foldArgs.length !== cases.length) { throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length); } var target = foldArgs[count]; return target.apply(null, args); }, match: match, log: function (label) { console.log(label, { constructors: constructors, constructor: key, params: args }); } }; }; }); return adt; }; var Adt = { generate: generate$7 }; Adt.generate([ { bothErrors: [ 'error1', 'error2' ] }, { firstError: [ 'error1', 'value2' ] }, { secondError: [ 'value1', 'error2' ] }, { bothValues: [ 'value1', 'value2' ] } ]); var partition$1 = function (results) { var errors = []; var values = []; each$1(results, function (result) { result.fold(function (err) { errors.push(err); }, function (value) { values.push(value); }); }); return { errors: errors, values: values }; }; var exclude$1 = function (obj, fields) { var r = {}; each(obj, function (v, k) { if (!contains$2(fields, k)) { r[k] = v; } }); return r; }; var wrap$2 = function (key, value) { var _a; return _a = {}, _a[key] = value, _a; }; var wrapAll$1 = function (keyvalues) { var r = {}; each$1(keyvalues, function (kv) { r[kv.key] = kv.value; }); return r; }; var exclude = function (obj, fields) { return exclude$1(obj, fields); }; var wrap$1 = function (key, value) { return wrap$2(key, value); }; var wrapAll = function (keyvalues) { return wrapAll$1(keyvalues); }; var mergeValues = function (values, base) { return values.length === 0 ? Result.value(base) : Result.value(deepMerge(base, merge$1.apply(undefined, values))); }; var mergeErrors = function (errors) { return Result.error(flatten(errors)); }; var consolidate = function (objs, base) { var partitions = partition$1(objs); return partitions.errors.length > 0 ? mergeErrors(partitions.errors) : mergeValues(partitions.values, base); }; var ensureIsRoot = function (isRoot) { return isFunction(isRoot) ? isRoot : never; }; var ancestor$2 = function (scope, transform, isRoot) { var element = scope.dom; var stop = ensureIsRoot(isRoot); while (element.parentNode) { element = element.parentNode; var el = SugarElement.fromDom(element); var transformed = transform(el); if (transformed.isSome()) { return transformed; } else if (stop(el)) { break; } } return Optional.none(); }; var closest$4 = function (scope, transform, isRoot) { var current = transform(scope); var stop = ensureIsRoot(isRoot); return current.orThunk(function () { return stop(scope) ? Optional.none() : ancestor$2(scope, transform, stop); }); }; var isSource = function (component, simulatedEvent) { return eq(component.element, simulatedEvent.event.target); }; var defaultEventHandler = { can: always, abort: never, run: noop }; var nu$9 = function (parts) { if (!hasNonNullableKey(parts, 'can') && !hasNonNullableKey(parts, 'abort') && !hasNonNullableKey(parts, 'run')) { throw new Error('EventHandler defined by: ' + JSON.stringify(parts, null, 2) + ' does not have can, abort, or run!'); } return __assign(__assign({}, defaultEventHandler), parts); }; var all$2 = function (handlers, f) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return foldl(handlers, function (acc, handler) { return acc && f(handler).apply(undefined, args); }, true); }; }; var any = function (handlers, f) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return foldl(handlers, function (acc, handler) { return acc || f(handler).apply(undefined, args); }, false); }; }; var read$2 = function (handler) { return isFunction(handler) ? { can: always, abort: never, run: handler } : handler; }; var fuse$1 = function (handlers) { var can = all$2(handlers, function (handler) { return handler.can; }); var abort = any(handlers, function (handler) { return handler.abort; }); var run = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } each$1(handlers, function (handler) { handler.run.apply(undefined, args); }); }; return { can: can, abort: abort, run: run }; }; var constant = constant$1; var touchstart = constant('touchstart'); var touchmove = constant('touchmove'); var touchend = constant('touchend'); var touchcancel = constant('touchcancel'); var mousedown = constant('mousedown'); var mousemove = constant('mousemove'); var mouseout = constant('mouseout'); var mouseup = constant('mouseup'); var mouseover = constant('mouseover'); var focusin = constant('focusin'); var focusout = constant('focusout'); var keydown = constant('keydown'); var keyup = constant('keyup'); var input = constant('input'); var change = constant('change'); var click = constant('click'); var transitioncancel = constant('transitioncancel'); var transitionend = constant('transitionend'); var transitionstart = constant('transitionstart'); var selectstart = constant('selectstart'); var prefixName = function (name) { return constant$1('alloy.' + name); }; var alloy = { tap: prefixName('tap') }; var focus$4 = prefixName('focus'); var postBlur = prefixName('blur.post'); var postPaste = prefixName('paste.post'); var receive = prefixName('receive'); var execute$5 = prefixName('execute'); var focusItem = prefixName('focus.item'); var tap = alloy.tap; var longpress = prefixName('longpress'); var sandboxClose = prefixName('sandbox.close'); var typeaheadCancel = prefixName('typeahead.cancel'); var systemInit = prefixName('system.init'); var documentTouchmove = prefixName('system.touchmove'); var documentTouchend = prefixName('system.touchend'); var windowScroll = prefixName('system.scroll'); var windowResize = prefixName('system.resize'); var attachedToDom = prefixName('system.attached'); var detachedFromDom = prefixName('system.detached'); var dismissRequested = prefixName('system.dismissRequested'); var repositionRequested = prefixName('system.repositionRequested'); var focusShifted = prefixName('focusmanager.shifted'); var slotVisibility = prefixName('slotcontainer.visibility'); var changeTab = prefixName('change.tab'); var dismissTab = prefixName('dismiss.tab'); var highlight$1 = prefixName('highlight'); var dehighlight$1 = prefixName('dehighlight'); var emit = function (component, event) { dispatchWith(component, component.element, event, {}); }; var emitWith = function (component, event, properties) { dispatchWith(component, component.element, event, properties); }; var emitExecute = function (component) { emit(component, execute$5()); }; var dispatch = function (component, target, event) { dispatchWith(component, target, event, {}); }; var dispatchWith = function (component, target, event, properties) { var data = __assign({ target: target }, properties); component.getSystem().triggerEvent(event, target, data); }; var dispatchEvent = function (component, target, event, simulatedEvent) { component.getSystem().triggerEvent(event, target, simulatedEvent.event); }; var derive$2 = function (configs) { return wrapAll(configs); }; var abort = function (name, predicate) { return { key: name, value: nu$9({ abort: predicate }) }; }; var can = function (name, predicate) { return { key: name, value: nu$9({ can: predicate }) }; }; var preventDefault = function (name) { return { key: name, value: nu$9({ run: function (component, simulatedEvent) { simulatedEvent.event.prevent(); } }) }; }; var run$1 = function (name, handler) { return { key: name, value: nu$9({ run: handler }) }; }; var runActionExtra = function (name, action, extra) { return { key: name, value: nu$9({ run: function (component, simulatedEvent) { action.apply(undefined, [ component, simulatedEvent ].concat(extra)); } }) }; }; var runOnName = function (name) { return function (handler) { return run$1(name, handler); }; }; var runOnSourceName = function (name) { return function (handler) { return { key: name, value: nu$9({ run: function (component, simulatedEvent) { if (isSource(component, simulatedEvent)) { handler(component, simulatedEvent); } } }) }; }; }; var redirectToUid = function (name, uid) { return run$1(name, function (component, simulatedEvent) { component.getSystem().getByUid(uid).each(function (redirectee) { dispatchEvent(redirectee, redirectee.element, name, simulatedEvent); }); }); }; var redirectToPart = function (name, detail, partName) { var uid = detail.partUids[partName]; return redirectToUid(name, uid); }; var runWithTarget = function (name, f) { return run$1(name, function (component, simulatedEvent) { var ev = simulatedEvent.event; var target = component.getSystem().getByDom(ev.target).getOrThunk(function () { var closest = closest$4(ev.target, function (el) { return component.getSystem().getByDom(el).toOptional(); }, never); return closest.getOr(component); }); f(component, target, simulatedEvent); }); }; var cutter = function (name) { return run$1(name, function (component, simulatedEvent) { simulatedEvent.cut(); }); }; var stopper = function (name) { return run$1(name, function (component, simulatedEvent) { simulatedEvent.stop(); }); }; var runOnSource = function (name, f) { return runOnSourceName(name)(f); }; var runOnAttached = runOnSourceName(attachedToDom()); var runOnDetached = runOnSourceName(detachedFromDom()); var runOnInit = runOnSourceName(systemInit()); var runOnExecute$1 = runOnName(execute$5()); var fromHtml$1 = function (html, scope) { var doc = scope || document; var div = doc.createElement('div'); div.innerHTML = html; return children(SugarElement.fromDom(div)); }; var get$7 = function (element) { return element.dom.innerHTML; }; var set$5 = function (element, content) { var owner = owner$4(element); var docDom = owner.dom; var fragment = SugarElement.fromDom(docDom.createDocumentFragment()); var contentElements = fromHtml$1(content, docDom); append$1(fragment, contentElements); empty(element); append$2(element, fragment); }; var getOuter = function (element) { var container = SugarElement.fromTag('div'); var clone = SugarElement.fromDom(element.dom.cloneNode(true)); append$2(container, clone); return get$7(container); }; var clone$2 = function (original, isDeep) { return SugarElement.fromDom(original.dom.cloneNode(isDeep)); }; var shallow = function (original) { return clone$2(original, false); }; var getHtml = function (element) { if (isShadowRoot(element)) { return '#shadow-root'; } else { var clone = shallow(element); return getOuter(clone); } }; var element = function (elem) { return getHtml(elem); }; var isRecursive = function (component, originator, target) { return eq(originator, component.element) && !eq(originator, target); }; var events$i = derive$2([can(focus$4(), function (component, simulatedEvent) { var event = simulatedEvent.event; var originator = event.originator; var target = event.target; if (isRecursive(component, originator, target)) { console.warn(focus$4() + ' did not get interpreted by the desired target. ' + '\nOriginator: ' + element(originator) + '\nTarget: ' + element(target) + '\nCheck the ' + focus$4() + ' event handlers'); return false; } else { return true; } })]); var DefaultEvents = /*#__PURE__*/Object.freeze({ __proto__: null, events: events$i }); var unique = 0; var generate$6 = function (prefix) { var date = new Date(); var time = date.getTime(); var random = Math.floor(Math.random() * 1000000000); unique++; return prefix + '_' + random + unique + String(time); }; var prefix$1 = constant$1('alloy-id-'); var idAttr$1 = constant$1('data-alloy-id'); var prefix = prefix$1(); var idAttr = idAttr$1(); var write = function (label, elem) { var id = generate$6(prefix + label); writeOnly(elem, id); return id; }; var writeOnly = function (elem, uid) { Object.defineProperty(elem.dom, idAttr, { value: uid, writable: true }); }; var read$1 = function (elem) { var id = isElement$2(elem) ? elem.dom[idAttr] : null; return Optional.from(id); }; var generate$5 = function (prefix) { return generate$6(prefix); }; var make$8 = identity$1; var NoContextApi = function (getComp) { var getMessage = function (event) { return 'The component must be in a context to execute: ' + event + (getComp ? '\n' + element(getComp().element) + ' is not in context.' : ''); }; var fail = function (event) { return function () { throw new Error(getMessage(event)); }; }; var warn = function (event) { return function () { console.warn(getMessage(event)); }; }; return { debugInfo: constant$1('fake'), triggerEvent: warn('triggerEvent'), triggerFocus: warn('triggerFocus'), triggerEscape: warn('triggerEscape'), broadcast: warn('broadcast'), broadcastOn: warn('broadcastOn'), broadcastEvent: warn('broadcastEvent'), build: fail('build'), addToWorld: fail('addToWorld'), removeFromWorld: fail('removeFromWorld'), addToGui: fail('addToGui'), removeFromGui: fail('removeFromGui'), getByUid: fail('getByUid'), getByDom: fail('getByDom'), isConnected: never }; }; var singleton$1 = NoContextApi(); var markAsBehaviourApi = function (f, apiName, apiFunction) { var delegate = apiFunction.toString(); var endIndex = delegate.indexOf(')') + 1; var openBracketIndex = delegate.indexOf('('); var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/); f.toFunctionAnnotation = function () { return { name: apiName, parameters: cleanParameters(parameters.slice(0, 1).concat(parameters.slice(3))) }; }; return f; }; var cleanParameters = function (parameters) { return map$2(parameters, function (p) { return endsWith(p, '/*') ? p.substring(0, p.length - '/*'.length) : p; }); }; var markAsExtraApi = function (f, extraName) { var delegate = f.toString(); var endIndex = delegate.indexOf(')') + 1; var openBracketIndex = delegate.indexOf('('); var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/); f.toFunctionAnnotation = function () { return { name: extraName, parameters: cleanParameters(parameters) }; }; return f; }; var markAsSketchApi = function (f, apiFunction) { var delegate = apiFunction.toString(); var endIndex = delegate.indexOf(')') + 1; var openBracketIndex = delegate.indexOf('('); var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/); f.toFunctionAnnotation = function () { return { name: 'OVERRIDE', parameters: cleanParameters(parameters.slice(1)) }; }; return f; }; var premadeTag = generate$6('alloy-premade'); var premade$1 = function (comp) { return wrap$1(premadeTag, comp); }; var getPremade = function (spec) { return get$e(spec, premadeTag); }; var makeApi = function (f) { return markAsSketchApi(function (component) { var rest = []; for (var _i = 1; _i < arguments.length; _i++) { rest[_i - 1] = arguments[_i]; } return f.apply(void 0, __spreadArray([ component.getApis(), component ], rest, false)); }, f); }; var NoState = { init: function () { return nu$8({ readState: constant$1('No State required') }); } }; var nu$8 = function (spec) { return spec; }; var generateFrom$1 = function (spec, all) { var schema = map$2(all, function (a) { return optionObjOf(a.name(), [ required$1('config'), defaulted('state', NoState) ]); }); var validated = asRaw('component.behaviours', objOf(schema), spec.behaviours).fold(function (errInfo) { throw new Error(formatError(errInfo) + '\nComplete spec:\n' + JSON.stringify(spec, null, 2)); }, identity$1); return { list: all, data: map$1(validated, function (optBlobThunk) { var output = optBlobThunk.map(function (blob) { return { config: blob.config, state: blob.state.init(blob.config) }; }); return constant$1(output); }) }; }; var getBehaviours$3 = function (bData) { return bData.list; }; var getData$2 = function (bData) { return bData.data; }; var byInnerKey = function (data, tuple) { var r = {}; each(data, function (detail, key) { each(detail, function (value, indexKey) { var chain = get$e(r, indexKey).getOr([]); r[indexKey] = chain.concat([tuple(key, value)]); }); }); return r; }; var nu$7 = function (s) { return { classes: isUndefined(s.classes) ? [] : s.classes, attributes: isUndefined(s.attributes) ? {} : s.attributes, styles: isUndefined(s.styles) ? {} : s.styles }; }; var merge = function (defnA, mod) { return __assign(__assign({}, defnA), { attributes: __assign(__assign({}, defnA.attributes), mod.attributes), styles: __assign(__assign({}, defnA.styles), mod.styles), classes: defnA.classes.concat(mod.classes) }); }; var combine$2 = function (info, baseMod, behaviours, base) { var modsByBehaviour = __assign({}, baseMod); each$1(behaviours, function (behaviour) { modsByBehaviour[behaviour.name()] = behaviour.exhibit(info, base); }); var byAspect = byInnerKey(modsByBehaviour, function (name, modification) { return { name: name, modification: modification }; }); var combineObjects = function (objects) { return foldr(objects, function (b, a) { return __assign(__assign({}, a.modification), b); }, {}); }; var combinedClasses = foldr(byAspect.classes, function (b, a) { return a.modification.concat(b); }, []); var combinedAttributes = combineObjects(byAspect.attributes); var combinedStyles = combineObjects(byAspect.styles); return nu$7({ classes: combinedClasses, attributes: combinedAttributes, styles: combinedStyles }); }; var sortKeys = function (label, keyName, array, order) { try { var sorted = sort(array, function (a, b) { var aKey = a[keyName]; var bKey = b[keyName]; var aIndex = order.indexOf(aKey); var bIndex = order.indexOf(bKey); if (aIndex === -1) { throw new Error('The ordering for ' + label + ' does not have an entry for ' + aKey + '.\nOrder specified: ' + JSON.stringify(order, null, 2)); } if (bIndex === -1) { throw new Error('The ordering for ' + label + ' does not have an entry for ' + bKey + '.\nOrder specified: ' + JSON.stringify(order, null, 2)); } if (aIndex < bIndex) { return -1; } else if (bIndex < aIndex) { return 1; } else { return 0; } }); return Result.value(sorted); } catch (err) { return Result.error([err]); } }; var uncurried = function (handler, purpose) { return { handler: handler, purpose: purpose }; }; var curried = function (handler, purpose) { return { cHandler: handler, purpose: purpose }; }; var curryArgs = function (descHandler, extraArgs) { return curried(curry.apply(undefined, [descHandler.handler].concat(extraArgs)), descHandler.purpose); }; var getCurried = function (descHandler) { return descHandler.cHandler; }; var behaviourTuple = function (name, handler) { return { name: name, handler: handler }; }; var nameToHandlers = function (behaviours, info) { var r = {}; each$1(behaviours, function (behaviour) { r[behaviour.name()] = behaviour.handlers(info); }); return r; }; var groupByEvents = function (info, behaviours, base) { var behaviourEvents = __assign(__assign({}, base), nameToHandlers(behaviours, info)); return byInnerKey(behaviourEvents, behaviourTuple); }; var combine$1 = function (info, eventOrder, behaviours, base) { var byEventName = groupByEvents(info, behaviours, base); return combineGroups(byEventName, eventOrder); }; var assemble = function (rawHandler) { var handler = read$2(rawHandler); return function (component, simulatedEvent) { var rest = []; for (var _i = 2; _i < arguments.length; _i++) { rest[_i - 2] = arguments[_i]; } var args = [ component, simulatedEvent ].concat(rest); if (handler.abort.apply(undefined, args)) { simulatedEvent.stop(); } else if (handler.can.apply(undefined, args)) { handler.run.apply(undefined, args); } }; }; var missingOrderError = function (eventName, tuples) { 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) { return c.name; }), null, 2)]); }; var fuse = function (tuples, eventOrder, eventName) { var order = eventOrder[eventName]; if (!order) { return missingOrderError(eventName, tuples); } else { return sortKeys('Event: ' + eventName, 'name', tuples, order).map(function (sortedTuples) { var handlers = map$2(sortedTuples, function (tuple) { return tuple.handler; }); return fuse$1(handlers); }); } }; var combineGroups = function (byEventName, eventOrder) { var r = mapToArray(byEventName, function (tuples, eventName) { var combined = tuples.length === 1 ? Result.value(tuples[0].handler) : fuse(tuples, eventOrder, eventName); return combined.map(function (handler) { var assembled = assemble(handler); var purpose = tuples.length > 1 ? filter$2(eventOrder[eventName], function (o) { return exists(tuples, function (t) { return t.name === o; }); }).join(' > ') : tuples[0].name; return wrap$1(eventName, uncurried(assembled, purpose)); }); }); return consolidate(r, {}); }; var _a$2; var baseBehaviour = 'alloy.base.behaviour'; var schema$z = objOf([ field$1('dom', 'dom', required$2(), objOf([ required$1('tag'), defaulted('styles', {}), defaulted('classes', []), defaulted('attributes', {}), option('value'), option('innerHtml') ])), required$1('components'), required$1('uid'), defaulted('events', {}), defaulted('apis', {}), field$1('eventOrder', 'eventOrder', mergeWith((_a$2 = {}, _a$2[execute$5()] = [ 'disabling', baseBehaviour, 'toggling', 'typeaheadevents' ], _a$2[focus$4()] = [ baseBehaviour, 'focusing', 'keying' ], _a$2[systemInit()] = [ baseBehaviour, 'disabling', 'toggling', 'representing' ], _a$2[input()] = [ baseBehaviour, 'representing', 'streaming', 'invalidating' ], _a$2[detachedFromDom()] = [ baseBehaviour, 'representing', 'item-events', 'tooltipping' ], _a$2[mousedown()] = [ 'focusing', baseBehaviour, 'item-type-events' ], _a$2[touchstart()] = [ 'focusing', baseBehaviour, 'item-type-events' ], _a$2[mouseover()] = [ 'item-type-events', 'tooltipping' ], _a$2[receive()] = [ 'receiving', 'reflecting', 'tooltipping' ], _a$2)), anyValue()), option('domModification') ]); var toInfo = function (spec) { return asRaw('custom.definition', schema$z, spec); }; var toDefinition = function (detail) { return __assign(__assign({}, detail.dom), { uid: detail.uid, domChildren: map$2(detail.components, function (comp) { return comp.element; }) }); }; var toModification = function (detail) { return detail.domModification.fold(function () { return nu$7({}); }, nu$7); }; var toEvents = function (info) { return info.events; }; var read = function (element, attr) { var value = get$d(element, attr); return value === undefined || value === '' ? [] : value.split(' '); }; var add$4 = function (element, attr, id) { var old = read(element, attr); var nu = old.concat([id]); set$8(element, attr, nu.join(' ')); return true; }; var remove$4 = function (element, attr, id) { var nu = filter$2(read(element, attr), function (v) { return v !== id; }); if (nu.length > 0) { set$8(element, attr, nu.join(' ')); } else { remove$7(element, attr); } return false; }; var supports = function (element) { return element.dom.classList !== undefined; }; var get$6 = function (element) { return read(element, 'class'); }; var add$3 = function (element, clazz) { return add$4(element, 'class', clazz); }; var remove$3 = function (element, clazz) { return remove$4(element, 'class', clazz); }; var add$2 = function (element, clazz) { if (supports(element)) { element.dom.classList.add(clazz); } else { add$3(element, clazz); } }; var cleanClass = function (element) { var classList = supports(element) ? element.dom.classList : get$6(element); if (classList.length === 0) { remove$7(element, 'class'); } }; var remove$2 = function (element, clazz) { if (supports(element)) { var classList = element.dom.classList; classList.remove(clazz); } else { remove$3(element, clazz); } cleanClass(element); }; var has = function (element, clazz) { return supports(element) && element.dom.classList.contains(clazz); }; var add$1 = function (element, classes) { each$1(classes, function (x) { add$2(element, x); }); }; var remove$1 = function (element, classes) { each$1(classes, function (x) { remove$2(element, x); }); }; var hasAll = function (element, classes) { return forall(classes, function (clazz) { return has(element, clazz); }); }; var get$5 = function (element) { return element.dom.value; }; var set$4 = function (element, value) { if (value === undefined) { throw new Error('Value.set was undefined'); } element.dom.value = value; }; var renderToDom = function (definition) { var subject = SugarElement.fromTag(definition.tag); setAll$1(subject, definition.attributes); add$1(subject, definition.classes); setAll(subject, definition.styles); definition.innerHtml.each(function (html) { return set$5(subject, html); }); var children = definition.domChildren; append$1(subject, children); definition.value.each(function (value) { set$4(subject, value); }); if (!definition.uid) { debugger; } writeOnly(subject, definition.uid); return subject; }; var getBehaviours$2 = function (spec) { var behaviours = get$e(spec, 'behaviours').getOr({}); return bind$3(keys(behaviours), function (name) { var behaviour = behaviours[name]; return isNonNullable(behaviour) ? [behaviour.me] : []; }); }; var generateFrom = function (spec, all) { return generateFrom$1(spec, all); }; var generate$4 = function (spec) { var all = getBehaviours$2(spec); return generateFrom(spec, all); }; var getDomDefinition = function (info, bList, bData) { var definition = toDefinition(info); var infoModification = toModification(info); var baseModification = { 'alloy.base.modification': infoModification }; var modification = bList.length > 0 ? combine$2(bData, baseModification, bList, definition) : infoModification; return merge(definition, modification); }; var getEvents = function (info, bList, bData) { var baseEvents = { 'alloy.base.behaviour': toEvents(info) }; return combine$1(bData, info.eventOrder, bList, baseEvents).getOrDie(); }; var build$2 = function (spec) { var getMe = function () { return me; }; var systemApi = Cell(singleton$1); var info = getOrDie(toInfo(spec)); var bBlob = generate$4(spec); var bList = getBehaviours$3(bBlob); var bData = getData$2(bBlob); var modDefinition = getDomDefinition(info, bList, bData); var item = renderToDom(modDefinition); var events = getEvents(info, bList, bData); var subcomponents = Cell(info.components); var connect = function (newApi) { systemApi.set(newApi); }; var disconnect = function () { systemApi.set(NoContextApi(getMe)); }; var syncComponents = function () { var children$1 = children(item); var subs = bind$3(children$1, function (child) { return systemApi.get().getByDom(child).fold(function () { return []; }, pure$2); }); subcomponents.set(subs); }; var config = function (behaviour) { var b = bData; var f = isFunction(b[behaviour.name()]) ? b[behaviour.name()] : function () { throw new Error('Could not find ' + behaviour.name() + ' in ' + JSON.stringify(spec, null, 2)); }; return f(); }; var hasConfigured = function (behaviour) { return isFunction(bData[behaviour.name()]); }; var getApis = function () { return info.apis; }; var readState = function (behaviourName) { return bData[behaviourName]().map(function (b) { return b.state.readState(); }).getOr('not enabled'); }; var me = { uid: spec.uid, getSystem: systemApi.get, config: config, hasConfigured: hasConfigured, spec: spec, readState: readState, getApis: getApis, connect: connect, disconnect: disconnect, element: item, syncComponents: syncComponents, components: subcomponents.get, events: events }; return me; }; var buildSubcomponents = function (spec) { var components = get$e(spec, 'components').getOr([]); return map$2(components, build$1); }; var buildFromSpec = function (userSpec) { var _a = make$8(userSpec), specEvents = _a.events, spec = __rest(_a, ['events']); var components = buildSubcomponents(spec); var completeSpec = __assign(__assign({}, spec), { events: __assign(__assign({}, DefaultEvents), specEvents), components: components }); return Result.value(build$2(completeSpec)); }; var text$1 = function (textContent) { var element = SugarElement.fromText(textContent); return external$2({ element: element }); }; var external$2 = function (spec) { var extSpec = asRawOrDie$1('external.component', objOfOnly([ required$1('element'), option('uid') ]), spec); var systemApi = Cell(NoContextApi()); var connect = function (newApi) { systemApi.set(newApi); }; var disconnect = function () { systemApi.set(NoContextApi(function () { return me; })); }; var uid = extSpec.uid.getOrThunk(function () { return generate$5('external'); }); writeOnly(extSpec.element, uid); var me = { uid: uid, getSystem: systemApi.get, config: Optional.none, hasConfigured: never, connect: connect, disconnect: disconnect, getApis: function () { return {}; }, element: extSpec.element, spec: spec, readState: constant$1('No state'), syncComponents: noop, components: constant$1([]), events: {} }; return premade$1(me); }; var uids = generate$5; var isSketchSpec$1 = function (spec) { return has$2(spec, 'uid'); }; var build$1 = function (spec) { return getPremade(spec).getOrThunk(function () { var userSpecWithUid = isSketchSpec$1(spec) ? spec : __assign({ uid: uids('') }, spec); return buildFromSpec(userSpecWithUid).getOrDie(); }); }; var premade = premade$1; function ClosestOrAncestor (is, ancestor, scope, a, isRoot) { if (is(scope, a)) { return Optional.some(scope); } else if (isFunction(isRoot) && isRoot(scope)) { return Optional.none(); } else { return ancestor(scope, a, isRoot); } } var ancestor$1 = function (scope, predicate, isRoot) { var element = scope.dom; var stop = isFunction(isRoot) ? isRoot : never; while (element.parentNode) { element = element.parentNode; var el = SugarElement.fromDom(element); if (predicate(el)) { return Optional.some(el); } else if (stop(el)) { break; } } return Optional.none(); }; var closest$3 = function (scope, predicate, isRoot) { var is = function (s, test) { return test(s); }; return ClosestOrAncestor(is, ancestor$1, scope, predicate, isRoot); }; var child$1 = function (scope, predicate) { var pred = function (node) { return predicate(SugarElement.fromDom(node)); }; var result = find$5(scope.dom.childNodes, pred); return result.map(SugarElement.fromDom); }; var descendant$1 = function (scope, predicate) { var descend = function (node) { for (var i = 0; i < node.childNodes.length; i++) { var child_1 = SugarElement.fromDom(node.childNodes[i]); if (predicate(child_1)) { return Optional.some(child_1); } var res = descend(node.childNodes[i]); if (res.isSome()) { return res; } } return Optional.none(); }; return descend(scope.dom); }; var closest$2 = function (scope, predicate, isRoot) { return closest$3(scope, predicate, isRoot).isSome(); }; var ancestor = function (scope, selector, isRoot) { return ancestor$1(scope, function (e) { return is(e, selector); }, isRoot); }; var child = function (scope, selector) { return child$1(scope, function (e) { return is(e, selector); }); }; var descendant = function (scope, selector) { return one(selector, scope); }; var closest$1 = function (scope, selector, isRoot) { var is$1 = function (element, selector) { return is(element, selector); }; return ClosestOrAncestor(is$1, ancestor, scope, selector, isRoot); }; var find$1 = function (queryElem) { var dependent = closest$3(queryElem, function (elem) { if (!isElement$2(elem)) { return false; } var id = get$d(elem, 'id'); return id !== undefined && id.indexOf('aria-owns') > -1; }); return dependent.bind(function (dep) { var id = get$d(dep, 'id'); var dos = getRootNode(dep); return descendant(dos, '[aria-owns="' + id + '"]'); }); }; var manager = function () { var ariaId = generate$6('aria-owns'); var link = function (elem) { set$8(elem, 'aria-owns', ariaId); }; var unlink = function (elem) { remove$7(elem, 'aria-owns'); }; return { id: ariaId, link: link, unlink: unlink }; }; var isAriaPartOf = function (component, queryElem) { return find$1(queryElem).exists(function (owner) { return isPartOf$1(component, owner); }); }; var isPartOf$1 = function (component, queryElem) { return closest$2(queryElem, function (el) { return eq(el, component.element); }, never) || isAriaPartOf(component, queryElem); }; var unknown = 'unknown'; var EventConfiguration; (function (EventConfiguration) { EventConfiguration[EventConfiguration['STOP'] = 0] = 'STOP'; EventConfiguration[EventConfiguration['NORMAL'] = 1] = 'NORMAL'; EventConfiguration[EventConfiguration['LOGGING'] = 2] = 'LOGGING'; }(EventConfiguration || (EventConfiguration = {}))); var eventConfig = Cell({}); var makeEventLogger = function (eventName, initialTarget) { var sequence = []; var startTime = new Date().getTime(); return { logEventCut: function (_name, target, purpose) { sequence.push({ outcome: 'cut', target: target, purpose: purpose }); }, logEventStopped: function (_name, target, purpose) { sequence.push({ outcome: 'stopped', target: target, purpose: purpose }); }, logNoParent: function (_name, target, purpose) { sequence.push({ outcome: 'no-parent', target: target, purpose: purpose }); }, logEventNoHandlers: function (_name, target) { sequence.push({ outcome: 'no-handlers-left', target: target }); }, logEventResponse: function (_name, target, purpose) { sequence.push({ outcome: 'response', purpose: purpose, target: target }); }, write: function () { var finishTime = new Date().getTime(); if (contains$2([ 'mousemove', 'mouseover', 'mouseout', systemInit() ], eventName)) { return; } console.log(eventName, { event: eventName, time: finishTime - startTime, target: initialTarget.dom, sequence: map$2(sequence, function (s) { if (!contains$2([ 'cut', 'stopped', 'response' ], s.outcome)) { return s.outcome; } else { return '{' + s.purpose + '} ' + s.outcome + ' at (' + element(s.target) + ')'; } }) }); } }; }; var processEvent = function (eventName, initialTarget, f) { var status = get$e(eventConfig.get(), eventName).orThunk(function () { var patterns = keys(eventConfig.get()); return findMap(patterns, function (p) { return eventName.indexOf(p) > -1 ? Optional.some(eventConfig.get()[p]) : Optional.none(); }); }).getOr(EventConfiguration.NORMAL); switch (status) { case EventConfiguration.NORMAL: return f(noLogger()); case EventConfiguration.LOGGING: { var logger = makeEventLogger(eventName, initialTarget); var output = f(logger); logger.write(); return output; } case EventConfiguration.STOP: return true; } }; var path = [ 'alloy/data/Fields', 'alloy/debugging/Debugging' ]; var getTrace = function () { var err = new Error(); if (err.stack !== undefined) { var lines = err.stack.split('\n'); return find$5(lines, function (line) { return line.indexOf('alloy') > 0 && !exists(path, function (p) { return line.indexOf(p) > -1; }); }).getOr(unknown); } else { return unknown; } }; var ignoreEvent = { logEventCut: noop, logEventStopped: noop, logNoParent: noop, logEventNoHandlers: noop, logEventResponse: noop, write: noop }; var monitorEvent = function (eventName, initialTarget, f) { return processEvent(eventName, initialTarget, f); }; var noLogger = constant$1(ignoreEvent); var menuFields = constant$1([ required$1('menu'), required$1('selectedMenu') ]); var itemFields = constant$1([ required$1('item'), required$1('selectedItem') ]); constant$1(objOf(itemFields().concat(menuFields()))); var itemSchema$3 = constant$1(objOf(itemFields())); var _initSize = requiredObjOf('initSize', [ required$1('numColumns'), required$1('numRows') ]); var itemMarkers = function () { return requiredOf('markers', itemSchema$3()); }; var tieredMenuMarkers = function () { return requiredObjOf('markers', [required$1('backgroundMenu')].concat(menuFields()).concat(itemFields())); }; var markers$1 = function (required) { return requiredObjOf('markers', map$2(required, required$1)); }; var onPresenceHandler = function (label, fieldName, presence) { getTrace(); return field$1(fieldName, fieldName, presence, valueOf(function (f) { return Result.value(function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return f.apply(undefined, args); }); })); }; var onHandler = function (fieldName) { return onPresenceHandler('onHandler', fieldName, defaulted$1(noop)); }; var onKeyboardHandler = function (fieldName) { return onPresenceHandler('onKeyboardHandler', fieldName, defaulted$1(Optional.none)); }; var onStrictHandler = function (fieldName) { return onPresenceHandler('onHandler', fieldName, required$2()); }; var onStrictKeyboardHandler = function (fieldName) { return onPresenceHandler('onKeyboardHandler', fieldName, required$2()); }; var output$1 = function (name, value) { return customField(name, constant$1(value)); }; var snapshot = function (name) { return customField(name, identity$1); }; var initSize = constant$1(_initSize); var nu$6 = function (x, y, bubble, direction, placement, boundsRestriction, labelPrefix, alwaysFit) { if (alwaysFit === void 0) { alwaysFit = false; } return { x: x, y: y, bubble: bubble, direction: direction, placement: placement, restriction: boundsRestriction, label: labelPrefix + '-' + placement, alwaysFit: alwaysFit }; }; var adt$a = Adt.generate([ { southeast: [] }, { southwest: [] }, { northeast: [] }, { northwest: [] }, { south: [] }, { north: [] }, { east: [] }, { west: [] } ]); var cata$2 = function (subject, southeast, southwest, northeast, northwest, south, north, east, west) { return subject.fold(southeast, southwest, northeast, northwest, south, north, east, west); }; var cataVertical = function (subject, south, middle, north) { return subject.fold(south, south, north, north, south, north, middle, middle); }; var cataHorizontal = function (subject, east, middle, west) { return subject.fold(east, west, east, west, middle, middle, east, west); }; var southeast$3 = adt$a.southeast; var southwest$3 = adt$a.southwest; var northeast$3 = adt$a.northeast; var northwest$3 = adt$a.northwest; var south$3 = adt$a.south; var north$3 = adt$a.north; var east$3 = adt$a.east; var west$3 = adt$a.west; var cycleBy = function (value, delta, min, max) { var r = value + delta; if (r > max) { return min; } else if (r < min) { return max; } else { return r; } }; var clamp$1 = function (value, min, max) { return Math.min(Math.max(value, min), max); }; var getRestriction = function (anchor, restriction) { switch (restriction) { case 1: return anchor.x; case 0: return anchor.x + anchor.width; case 2: return anchor.y; case 3: return anchor.y + anchor.height; } }; var boundsRestriction = function (anchor, restrictions) { return mapToObject([ 'left', 'right', 'top', 'bottom' ], function (dir) { return get$e(restrictions, dir).map(function (restriction) { return getRestriction(anchor, restriction); }); }); }; var adjustBounds = function (bounds$1, restriction, bubbleOffset) { var applyRestriction = function (dir, current) { return restriction[dir].map(function (pos) { var isVerticalAxis = dir === 'top' || dir === 'bottom'; var offset = isVerticalAxis ? bubbleOffset.top : bubbleOffset.left; var comparator = dir === 'left' || dir === 'top' ? Math.max : Math.min; var newPos = comparator(pos, current) + offset; return isVerticalAxis ? clamp$1(newPos, bounds$1.y, bounds$1.bottom) : clamp$1(newPos, bounds$1.x, bounds$1.right); }).getOr(current); }; var adjustedLeft = applyRestriction('left', bounds$1.x); var adjustedTop = applyRestriction('top', bounds$1.y); var adjustedRight = applyRestriction('right', bounds$1.right); var adjustedBottom = applyRestriction('bottom', bounds$1.bottom); return bounds(adjustedLeft, adjustedTop, adjustedRight - adjustedLeft, adjustedBottom - adjustedTop); }; var labelPrefix$2 = 'layout'; var eastX$1 = function (anchor) { return anchor.x; }; var middleX$1 = function (anchor, element) { return anchor.x + anchor.width / 2 - element.width / 2; }; var westX$1 = function (anchor, element) { return anchor.x + anchor.width - element.width; }; var northY$2 = function (anchor, element) { return anchor.y - element.height; }; var southY$2 = function (anchor) { return anchor.y + anchor.height; }; var centreY$1 = function (anchor, element) { return anchor.y + anchor.height / 2 - element.height / 2; }; var eastEdgeX$1 = function (anchor) { return anchor.x + anchor.width; }; var westEdgeX$1 = function (anchor, element) { return anchor.x - element.width; }; var southeast$2 = function (anchor, element, bubbles) { return nu$6(eastX$1(anchor), southY$2(anchor), bubbles.southeast(), southeast$3(), 'southeast', boundsRestriction(anchor, { left: 1, top: 3 }), labelPrefix$2); }; var southwest$2 = function (anchor, element, bubbles) { return nu$6(westX$1(anchor, element), southY$2(anchor), bubbles.southwest(), southwest$3(), 'southwest', boundsRestriction(anchor, { right: 0, top: 3 }), labelPrefix$2); }; var northeast$2 = function (anchor, element, bubbles) { return nu$6(eastX$1(anchor), northY$2(anchor, element), bubbles.northeast(), northeast$3(), 'northeast', boundsRestriction(anchor, { left: 1, bottom: 2 }), labelPrefix$2); }; var northwest$2 = function (anchor, element, bubbles) { return nu$6(westX$1(anchor, element), northY$2(anchor, element), bubbles.northwest(), northwest$3(), 'northwest', boundsRestriction(anchor, { right: 0, bottom: 2 }), labelPrefix$2); }; var north$2 = function (anchor, element, bubbles) { return nu$6(middleX$1(anchor, element), northY$2(anchor, element), bubbles.north(), north$3(), 'north', boundsRestriction(anchor, { bottom: 2 }), labelPrefix$2); }; var south$2 = function (anchor, element, bubbles) { return nu$6(middleX$1(anchor, element), southY$2(anchor), bubbles.south(), south$3(), 'south', boundsRestriction(anchor, { top: 3 }), labelPrefix$2); }; var east$2 = function (anchor, element, bubbles) { return nu$6(eastEdgeX$1(anchor), centreY$1(anchor, element), bubbles.east(), east$3(), 'east', boundsRestriction(anchor, { left: 0 }), labelPrefix$2); }; var west$2 = function (anchor, element, bubbles) { return nu$6(westEdgeX$1(anchor, element), centreY$1(anchor, element), bubbles.west(), west$3(), 'west', boundsRestriction(anchor, { right: 1 }), labelPrefix$2); }; var all$1 = function () { return [ southeast$2, southwest$2, northeast$2, northwest$2, south$2, north$2, east$2, west$2 ]; }; var allRtl$1 = function () { return [ southwest$2, southeast$2, northwest$2, northeast$2, south$2, north$2, east$2, west$2 ]; }; var aboveOrBelow = function () { return [ northeast$2, northwest$2, southeast$2, southwest$2, north$2, south$2 ]; }; var aboveOrBelowRtl = function () { return [ northwest$2, northeast$2, southwest$2, southeast$2, north$2, south$2 ]; }; var belowOrAbove = function () { return [ southeast$2, southwest$2, northeast$2, northwest$2, south$2, north$2 ]; }; var belowOrAboveRtl = function () { return [ southwest$2, southeast$2, northwest$2, northeast$2, south$2, north$2 ]; }; var chooseChannels = function (channels, message) { return message.universal ? channels : filter$2(channels, function (ch) { return contains$2(message.channels, ch); }); }; var events$h = function (receiveConfig) { return derive$2([run$1(receive(), function (component, message) { var channelMap = receiveConfig.channels; var channels = keys(channelMap); var receivingData = message; var targetChannels = chooseChannels(channels, receivingData); each$1(targetChannels, function (ch) { var channelInfo = channelMap[ch]; var channelSchema = channelInfo.schema; var data = asRawOrDie$1('channel[' + ch + '] data\nReceiver: ' + element(component.element), channelSchema, receivingData.data); channelInfo.onReceive(component, data); }); })]); }; var ActiveReceiving = /*#__PURE__*/Object.freeze({ __proto__: null, events: events$h }); var ReceivingSchema = [requiredOf('channels', setOf(Result.value, objOfOnly([ onStrictHandler('onReceive'), defaulted('schema', anyValue()) ])))]; var executeEvent = function (bConfig, bState, executor) { return runOnExecute$1(function (component) { executor(component, bConfig, bState); }); }; var loadEvent = function (bConfig, bState, f) { return runOnInit(function (component, _simulatedEvent) { f(component, bConfig, bState); }); }; var create$9 = function (schema, name, active, apis, extra, state) { var configSchema = objOfOnly(schema); var schemaSchema = optionObjOf(name, [optionObjOfOnly('config', schema)]); return doCreate(configSchema, schemaSchema, name, active, apis, extra, state); }; var createModes$1 = function (modes, name, active, apis, extra, state) { var configSchema = modes; var schemaSchema = optionObjOf(name, [optionOf('config', modes)]); return doCreate(configSchema, schemaSchema, name, active, apis, extra, state); }; var wrapApi = function (bName, apiFunction, apiName) { var f = function (component) { var rest = []; for (var _i = 1; _i < arguments.length; _i++) { rest[_i - 1] = arguments[_i]; } var args = [component].concat(rest); return component.config({ name: constant$1(bName) }).fold(function () { throw new Error('We could not find any behaviour configuration for: ' + bName + '. Using API: ' + apiName); }, function (info) { var rest = Array.prototype.slice.call(args, 1); return apiFunction.apply(undefined, [ component, info.config, info.state ].concat(rest)); }); }; return markAsBehaviourApi(f, apiName, apiFunction); }; var revokeBehaviour = function (name) { return { key: name, value: undefined }; }; var doCreate = function (configSchema, schemaSchema, name, active, apis, extra, state) { var getConfig = function (info) { return hasNonNullableKey(info, name) ? info[name]() : Optional.none(); }; var wrappedApis = map$1(apis, function (apiF, apiName) { return wrapApi(name, apiF, apiName); }); var wrappedExtra = map$1(extra, function (extraF, extraName) { return markAsExtraApi(extraF, extraName); }); var me = __assign(__assign(__assign({}, wrappedExtra), wrappedApis), { revoke: curry(revokeBehaviour, name), config: function (spec) { var prepared = asRawOrDie$1(name + '-config', configSchema, spec); return { key: name, value: { config: prepared, me: me, configAsRaw: cached(function () { return asRawOrDie$1(name + '-config', configSchema, spec); }), initialConfig: spec, state: state } }; }, schema: constant$1(schemaSchema), exhibit: function (info, base) { return lift2(getConfig(info), get$e(active, 'exhibit'), function (behaviourInfo, exhibitor) { return exhibitor(base, behaviourInfo.config, behaviourInfo.state); }).getOrThunk(function () { return nu$7({}); }); }, name: constant$1(name), handlers: function (info) { return getConfig(info).map(function (behaviourInfo) { var getEvents = get$e(active, 'events').getOr(function () { return {}; }); return getEvents(behaviourInfo.config, behaviourInfo.state); }).getOr({}); } }); return me; }; var derive$1 = function (capabilities) { return wrapAll(capabilities); }; var simpleSchema = objOfOnly([ required$1('fields'), required$1('name'), defaulted('active', {}), defaulted('apis', {}), defaulted('state', NoState), defaulted('extra', {}) ]); var create$8 = function (data) { var value = asRawOrDie$1('Creating behaviour: ' + data.name, simpleSchema, data); return create$9(value.fields, value.name, value.active, value.apis, value.extra, value.state); }; var modeSchema = objOfOnly([ required$1('branchKey'), required$1('branches'), required$1('name'), defaulted('active', {}), defaulted('apis', {}), defaulted('state', NoState), defaulted('extra', {}) ]); var createModes = function (data) { var value = asRawOrDie$1('Creating behaviour: ' + data.name, modeSchema, data); return createModes$1(choose$1(value.branchKey, value.branches), value.name, value.active, value.apis, value.extra, value.state); }; var revoke = constant$1(undefined); var Receiving = create$8({ fields: ReceivingSchema, name: 'receiving', active: ActiveReceiving }); var exhibit$6 = function (base, posConfig) { return nu$7({ classes: [], styles: posConfig.useFixed() ? {} : { position: 'relative' } }); }; var ActivePosition = /*#__PURE__*/Object.freeze({ __proto__: null, exhibit: exhibit$6 }); var getDocument = function () { return SugarElement.fromDom(document); }; var focus$3 = function (element) { return element.dom.focus(); }; var blur$1 = function (element) { return element.dom.blur(); }; var hasFocus = function (element) { var root = getRootNode(element).dom; return element.dom === root.activeElement; }; var active = function (root) { if (root === void 0) { root = getDocument(); } return Optional.from(root.dom.activeElement).map(SugarElement.fromDom); }; var search = function (element) { return active(getRootNode(element)).filter(function (e) { return element.dom.contains(e.dom); }); }; var preserve$1 = function (f, container) { var dos = getRootNode(container); var refocus = active(dos).bind(function (focused) { var hasFocus = function (elem) { return eq(focused, elem); }; return hasFocus(container) ? Optional.some(container) : descendant$1(container, hasFocus); }); var result = f(container); refocus.each(function (oldFocus) { active(dos).filter(function (newFocus) { return eq(newFocus, oldFocus); }).fold(function () { focus$3(oldFocus); }, noop); }); return result; }; var NuPositionCss = function (position, left, top, right, bottom) { var toPx = function (num) { return num + 'px'; }; return { position: position, left: left.map(toPx), top: top.map(toPx), right: right.map(toPx), bottom: bottom.map(toPx) }; }; var toOptions = function (position) { return __assign(__assign({}, position), { position: Optional.some(position.position) }); }; var applyPositionCss = function (element, position) { setOptions(element, toOptions(position)); }; var adt$9 = Adt.generate([ { none: [] }, { relative: [ 'x', 'y', 'width', 'height' ] }, { fixed: [ 'x', 'y', 'width', 'height' ] } ]); var positionWithDirection = function (posName, decision, x, y, width, height) { var decisionRect = decision.rect; var decisionX = decisionRect.x - x; var decisionY = decisionRect.y - y; var decisionWidth = decisionRect.width; var decisionHeight = decisionRect.height; var decisionRight = width - (decisionX + decisionWidth); var decisionBottom = height - (decisionY + decisionHeight); var left = Optional.some(decisionX); var top = Optional.some(decisionY); var right = Optional.some(decisionRight); var bottom = Optional.some(decisionBottom); var none = Optional.none(); return cata$2(decision.direction, function () { return NuPositionCss(posName, left, top, none, none); }, function () { return NuPositionCss(posName, none, top, right, none); }, function () { return NuPositionCss(posName, left, none, none, bottom); }, function () { return NuPositionCss(posName, none, none, right, bottom); }, function () { return NuPositionCss(posName, left, top, none, none); }, function () { return NuPositionCss(posName, left, none, none, bottom); }, function () { return NuPositionCss(posName, left, top, none, none); }, function () { return NuPositionCss(posName, none, top, right, none); }); }; var reposition = function (origin, decision) { return origin.fold(function () { var decisionRect = decision.rect; return NuPositionCss('absolute', Optional.some(decisionRect.x), Optional.some(decisionRect.y), Optional.none(), Optional.none()); }, function (x, y, width, height) { return positionWithDirection('absolute', decision, x, y, width, height); }, function (x, y, width, height) { return positionWithDirection('fixed', decision, x, y, width, height); }); }; var toBox = function (origin, element) { var rel = curry(find$2, element); var position = origin.fold(rel, rel, function () { var scroll = get$9(); return find$2(element).translate(-scroll.left, -scroll.top); }); var width = getOuter$1(element); var height = getOuter$2(element); return bounds(position.left, position.top, width, height); }; var viewport = function (origin, getBounds) { return getBounds.fold(function () { return origin.fold(win, win, bounds); }, function (b) { return origin.fold(b, b, function () { var bounds$1 = b(); var pos = translate$2(origin, bounds$1.x, bounds$1.y); return bounds(pos.left, pos.top, bounds$1.width, bounds$1.height); }); }); }; var translate$2 = function (origin, x, y) { var pos = SugarPosition(x, y); var removeScroll = function () { var outerScroll = get$9(); return pos.translate(-outerScroll.left, -outerScroll.top); }; return origin.fold(constant$1(pos), constant$1(pos), removeScroll); }; var cata$1 = function (subject, onNone, onRelative, onFixed) { return subject.fold(onNone, onRelative, onFixed); }; adt$9.none; var relative$1 = adt$9.relative; var fixed$1 = adt$9.fixed; var anchor = function (anchorBox, origin) { return { anchorBox: anchorBox, origin: origin }; }; var box = function (anchorBox, origin) { return anchor(anchorBox, origin); }; var placementAttribute = 'data-alloy-placement'; var setPlacement$1 = function (element, placement) { set$8(element, placementAttribute, placement); }; var getPlacement = function (element) { return getOpt(element, placementAttribute); }; var reset$2 = function (element) { return remove$7(element, placementAttribute); }; var adt$8 = Adt.generate([ { fit: ['reposition'] }, { nofit: [ 'reposition', 'visibleW', 'visibleH', 'isVisible' ] } ]); var determinePosition = function (box, bounds) { var boundsX = bounds.x, boundsY = bounds.y, boundsRight = bounds.right, boundsBottom = bounds.bottom; var x = box.x, y = box.y, right = box.right, bottom = box.bottom, width = box.width, height = box.height; var xInBounds = x >= boundsX && x <= boundsRight; var yInBounds = y >= boundsY && y <= boundsBottom; var originInBounds = xInBounds && yInBounds; var rightInBounds = right <= boundsRight && right >= boundsX; var bottomInBounds = bottom <= boundsBottom && bottom >= boundsY; var sizeInBounds = rightInBounds && bottomInBounds; var visibleW = Math.min(width, x >= boundsX ? boundsRight - x : right - boundsX); var visibleH = Math.min(height, y >= boundsY ? boundsBottom - y : bottom - boundsY); return { originInBounds: originInBounds, sizeInBounds: sizeInBounds, visibleW: visibleW, visibleH: visibleH }; }; var calcReposition = function (box, bounds$1) { var boundsX = bounds$1.x, boundsY = bounds$1.y, boundsRight = bounds$1.right, boundsBottom = bounds$1.bottom; var x = box.x, y = box.y, width = box.width, height = box.height; var maxX = Math.max(boundsX, boundsRight - width); var maxY = Math.max(boundsY, boundsBottom - height); var restrictedX = clamp$1(x, boundsX, maxX); var restrictedY = clamp$1(y, boundsY, maxY); var restrictedWidth = Math.min(restrictedX + width, boundsRight) - restrictedX; var restrictedHeight = Math.min(restrictedY + height, boundsBottom) - restrictedY; return bounds(restrictedX, restrictedY, restrictedWidth, restrictedHeight); }; var calcMaxSizes = function (direction, box, bounds) { var upAvailable = constant$1(box.bottom - bounds.y); var downAvailable = constant$1(bounds.bottom - box.y); var maxHeight = cataVertical(direction, downAvailable, downAvailable, upAvailable); var westAvailable = constant$1(box.right - bounds.x); var eastAvailable = constant$1(bounds.right - box.x); var maxWidth = cataHorizontal(direction, eastAvailable, eastAvailable, westAvailable); return { maxWidth: maxWidth, maxHeight: maxHeight }; }; var attempt = function (candidate, width, height, bounds$1) { var bubble = candidate.bubble; var bubbleOffset = bubble.offset; var adjustedBounds = adjustBounds(bounds$1, candidate.restriction, bubbleOffset); var newX = candidate.x + bubbleOffset.left; var newY = candidate.y + bubbleOffset.top; var box = bounds(newX, newY, width, height); var _a = determinePosition(box, adjustedBounds), originInBounds = _a.originInBounds, sizeInBounds = _a.sizeInBounds, visibleW = _a.visibleW, visibleH = _a.visibleH; var fits = originInBounds && sizeInBounds; var fittedBox = fits ? box : calcReposition(box, adjustedBounds); var isPartlyVisible = fittedBox.width > 0 && fittedBox.height > 0; var _b = calcMaxSizes(candidate.direction, fittedBox, bounds$1), maxWidth = _b.maxWidth, maxHeight = _b.maxHeight; var reposition = { rect: fittedBox, maxHeight: maxHeight, maxWidth: maxWidth, direction: candidate.direction, placement: candidate.placement, classes: { on: bubble.classesOn, off: bubble.classesOff }, layout: candidate.label, testY: newY }; return fits || candidate.alwaysFit ? adt$8.fit(reposition) : adt$8.nofit(reposition, visibleW, visibleH, isPartlyVisible); }; var attempts = function (element, candidates, anchorBox, elementBox, bubbles, bounds) { var panelWidth = elementBox.width; var panelHeight = elementBox.height; var attemptBestFit = function (layout, reposition, visibleW, visibleH, isVisible) { var next = layout(anchorBox, elementBox, bubbles, element, bounds); var attemptLayout = attempt(next, panelWidth, panelHeight, bounds); return attemptLayout.fold(constant$1(attemptLayout), function (newReposition, newVisibleW, newVisibleH, newIsVisible) { var improved = isVisible === newIsVisible ? newVisibleH > visibleH || newVisibleW > visibleW : !isVisible && newIsVisible; return improved ? attemptLayout : adt$8.nofit(reposition, visibleW, visibleH, isVisible); }); }; var abc = foldl(candidates, function (b, a) { var bestNext = curry(attemptBestFit, a); return b.fold(constant$1(b), bestNext); }, adt$8.nofit({ rect: anchorBox, maxHeight: elementBox.height, maxWidth: elementBox.width, direction: southeast$3(), placement: 'southeast', classes: { on: [], off: [] }, layout: 'none', testY: anchorBox.y }, -1, -1, false)); return abc.fold(identity$1, identity$1); }; var singleton = function (doRevoke) { var subject = Cell(Optional.none()); var revoke = function () { return subject.get().each(doRevoke); }; var clear = function () { revoke(); subject.set(Optional.none()); }; var isSet = function () { return subject.get().isSome(); }; var get = function () { return subject.get(); }; var set = function (s) { revoke(); subject.set(Optional.some(s)); }; return { clear: clear, isSet: isSet, get: get, set: set }; }; var destroyable = function () { return singleton(function (s) { return s.destroy(); }); }; var unbindable = function () { return singleton(function (s) { return s.unbind(); }); }; var api$1 = function () { var subject = destroyable(); var run = function (f) { return subject.get().each(f); }; return __assign(__assign({}, subject), { run: run }); }; var value$1 = function () { var subject = singleton(noop); var on = function (f) { return subject.get().each(f); }; return __assign(__assign({}, subject), { on: on }); }; var filter = always; var bind = function (element, event, handler) { return bind$2(element, event, filter, handler); }; var capture = function (element, event, handler) { return capture$1(element, event, filter, handler); }; var fromRawEvent = fromRawEvent$1; var properties = [ 'top', 'bottom', 'right', 'left' ]; var timerAttr = 'data-alloy-transition-timer'; var isTransitioning$1 = function (element, transition) { return hasAll(element, transition.classes); }; var shouldApplyTransitionCss = function (transition, decision, lastPlacement) { return lastPlacement.exists(function (placer) { var mode = transition.mode; return mode === 'all' ? true : placer[mode] !== decision[mode]; }); }; var hasChanges = function (position, intermediate) { var round = function (value) { return parseFloat(value).toFixed(3); }; return find$4(intermediate, function (value, key) { var newValue = position[key].map(round); var val = value.map(round); return !equals(newValue, val); }).isSome(); }; var getTransitionDuration = function (element) { var get = function (name) { var style = get$c(element, name); var times = isString(style) ? style.split(/\s*,\s*/) : []; return filter$2(times, isNotEmpty); }; var parse = function (value) { if (isString(value) && /^[\d.]+/.test(value)) { var num = parseFloat(value); return endsWith(value, 'ms') ? num : num * 1000; } else { return 0; } }; var delay = get('transition-delay'); var duration = get('transition-duration'); return foldl(duration, function (acc, dur, i) { var time = parse(delay[i]) + parse(dur); return Math.max(acc, time); }, 0); }; var setupTransitionListeners = function (element, transition) { var transitionEnd = unbindable(); var transitionCancel = unbindable(); var timer; var isSourceTransition = function (e) { var _a; var pseudoElement = (_a = e.raw.pseudoElement) !== null && _a !== void 0 ? _a : ''; return eq(e.target, element) && isEmpty(pseudoElement) && contains$2(properties, e.raw.propertyName); }; var transitionDone = function (e) { if (isNullable(e) || isSourceTransition(e)) { transitionEnd.clear(); transitionCancel.clear(); var type = e === null || e === void 0 ? void 0 : e.raw.type; if (isNullable(type) || type === transitionend()) { clearTimeout(timer); remove$7(element, timerAttr); remove$1(element, transition.classes); } } }; var transitionStarted = function () { transitionEnd.set(bind(element, transitionend(), transitionDone)); transitionCancel.set(bind(element, transitioncancel(), transitionDone)); }; if ('ontransitionstart' in element.dom) { var transitionStart_1 = bind(element, transitionstart(), function (e) { if (isSourceTransition(e)) { transitionStart_1.unbind(); transitionStarted(); } }); } else { transitionStarted(); } var duration = getTransitionDuration(element); requestAnimationFrame(function () { timer = setTimeout(transitionDone, duration + 17); set$8(element, timerAttr, timer); }); }; var startTransitioning = function (element, transition) { add$1(element, transition.classes); getOpt(element, timerAttr).each(function (timerId) { clearTimeout(parseInt(timerId, 10)); remove$7(element, timerAttr); }); setupTransitionListeners(element, transition); }; var applyTransitionCss = function (element, origin, position, transition, decision, lastPlacement) { var shouldTransition = shouldApplyTransitionCss(transition, decision, lastPlacement); if (shouldTransition || isTransitioning$1(element, transition)) { set$7(element, 'position', position.position); var rect = toBox(origin, element); var intermediatePosition_1 = reposition(origin, __assign(__assign({}, decision), { rect: rect })); var intermediateCssOptions = mapToObject(properties, function (prop) { return intermediatePosition_1[prop]; }); if (hasChanges(position, intermediateCssOptions)) { setOptions(element, intermediateCssOptions); if (shouldTransition) { startTransitioning(element, transition); } reflow(element); } } else { remove$1(element, transition.classes); } }; var elementSize = function (p) { return { width: getOuter$1(p), height: getOuter$2(p) }; }; var layout = function (anchorBox, element, bubbles, options) { remove$6(element, 'max-height'); remove$6(element, 'max-width'); var elementBox = elementSize(element); return attempts(element, options.preference, anchorBox, elementBox, bubbles, options.bounds); }; var setClasses = function (element, decision) { var classInfo = decision.classes; remove$1(element, classInfo.off); add$1(element, classInfo.on); }; var setHeight = function (element, decision, options) { var maxHeightFunction = options.maxHeightFunction; maxHeightFunction(element, decision.maxHeight); }; var setWidth = function (element, decision, options) { var maxWidthFunction = options.maxWidthFunction; maxWidthFunction(element, decision.maxWidth); }; var position$2 = function (element, decision, options) { var positionCss = reposition(options.origin, decision); options.transition.each(function (transition) { applyTransitionCss(element, options.origin, positionCss, transition, decision, options.lastPlacement); }); applyPositionCss(element, positionCss); }; var setPlacement = function (element, decision) { setPlacement$1(element, decision.placement); }; var setMaxHeight = function (element, maxHeight) { setMax$1(element, Math.floor(maxHeight)); }; var anchored = constant$1(function (element, available) { setMaxHeight(element, available); setAll(element, { 'overflow-x': 'hidden', 'overflow-y': 'auto' }); }); var expandable$1 = constant$1(function (element, available) { setMaxHeight(element, available); }); var defaultOr = function (options, key, dephault) { return options[key] === undefined ? dephault : options[key]; }; var simple = function (anchor, element, bubble, layouts, lastPlacement, getBounds, overrideOptions, transition) { var maxHeightFunction = defaultOr(overrideOptions, 'maxHeightFunction', anchored()); var maxWidthFunction = defaultOr(overrideOptions, 'maxWidthFunction', noop); var anchorBox = anchor.anchorBox; var origin = anchor.origin; var options = { bounds: viewport(origin, getBounds), origin: origin, preference: layouts, maxHeightFunction: maxHeightFunction, maxWidthFunction: maxWidthFunction, lastPlacement: lastPlacement, transition: transition }; return go(anchorBox, element, bubble, options); }; var go = function (anchorBox, element, bubble, options) { var decision = layout(anchorBox, element, bubble, options); position$2(element, decision, options); setPlacement(element, decision); setClasses(element, decision); setHeight(element, decision, options); setWidth(element, decision, options); return { layout: decision.layout, placement: decision.placement }; }; var allAlignments = [ 'valignCentre', 'alignLeft', 'alignRight', 'alignCentre', 'top', 'bottom', 'left', 'right', 'inset' ]; var nu$5 = function (xOffset, yOffset, classes, insetModifier) { if (insetModifier === void 0) { insetModifier = 1; } var insetXOffset = xOffset * insetModifier; var insetYOffset = yOffset * insetModifier; var getClasses = function (prop) { return get$e(classes, prop).getOr([]); }; var make = function (xDelta, yDelta, alignmentsOn) { var alignmentsOff = difference(allAlignments, alignmentsOn); return { offset: SugarPosition(xDelta, yDelta), classesOn: bind$3(alignmentsOn, getClasses), classesOff: bind$3(alignmentsOff, getClasses) }; }; return { southeast: function () { return make(-xOffset, yOffset, [ 'top', 'alignLeft' ]); }, southwest: function () { return make(xOffset, yOffset, [ 'top', 'alignRight' ]); }, south: function () { return make(-xOffset / 2, yOffset, [ 'top', 'alignCentre' ]); }, northeast: function () { return make(-xOffset, -yOffset, [ 'bottom', 'alignLeft' ]); }, northwest: function () { return make(xOffset, -yOffset, [ 'bottom', 'alignRight' ]); }, north: function () { return make(-xOffset / 2, -yOffset, [ 'bottom', 'alignCentre' ]); }, east: function () { return make(xOffset, -yOffset / 2, [ 'valignCentre', 'left' ]); }, west: function () { return make(-xOffset, -yOffset / 2, [ 'valignCentre', 'right' ]); }, insetNortheast: function () { return make(insetXOffset, insetYOffset, [ 'top', 'alignLeft', 'inset' ]); }, insetNorthwest: function () { return make(-insetXOffset, insetYOffset, [ 'top', 'alignRight', 'inset' ]); }, insetNorth: function () { return make(-insetXOffset / 2, insetYOffset, [ 'top', 'alignCentre', 'inset' ]); }, insetSoutheast: function () { return make(insetXOffset, -insetYOffset, [ 'bottom', 'alignLeft', 'inset' ]); }, insetSouthwest: function () { return make(-insetXOffset, -insetYOffset, [ 'bottom', 'alignRight', 'inset' ]); }, insetSouth: function () { return make(-insetXOffset / 2, -insetYOffset, [ 'bottom', 'alignCentre', 'inset' ]); }, insetEast: function () { return make(-insetXOffset, -insetYOffset / 2, [ 'valignCentre', 'right', 'inset' ]); }, insetWest: function () { return make(insetXOffset, -insetYOffset / 2, [ 'valignCentre', 'left', 'inset' ]); } }; }; var fallback = function () { return nu$5(0, 0, {}); }; var nu$4 = identity$1; var onDirection = function (isLtr, isRtl) { return function (element) { return getDirection(element) === 'rtl' ? isRtl : isLtr; }; }; var getDirection = function (element) { return get$c(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; }; var AttributeValue; (function (AttributeValue) { AttributeValue['TopToBottom'] = 'toptobottom'; AttributeValue['BottomToTop'] = 'bottomtotop'; }(AttributeValue || (AttributeValue = {}))); var Attribute = 'data-alloy-vertical-dir'; var isBottomToTopDir = function (el) { return closest$2(el, function (current) { return isElement$2(current) && get$d(current, 'data-alloy-vertical-dir') === AttributeValue.BottomToTop; }); }; var schema$y = function () { return optionObjOf('layouts', [ required$1('onLtr'), required$1('onRtl'), option('onBottomLtr'), option('onBottomRtl') ]); }; var get$4 = function (elem, info, defaultLtr, defaultRtl, defaultBottomLtr, defaultBottomRtl, dirElement) { var isBottomToTop = dirElement.map(isBottomToTopDir).getOr(false); var customLtr = info.layouts.map(function (ls) { return ls.onLtr(elem); }); var customRtl = info.layouts.map(function (ls) { return ls.onRtl(elem); }); var ltr = isBottomToTop ? info.layouts.bind(function (ls) { return ls.onBottomLtr.map(function (f) { return f(elem); }); }).or(customLtr).getOr(defaultBottomLtr) : customLtr.getOr(defaultLtr); var rtl = isBottomToTop ? info.layouts.bind(function (ls) { return ls.onBottomRtl.map(function (f) { return f(elem); }); }).or(customRtl).getOr(defaultBottomRtl) : customRtl.getOr(defaultRtl); var f = onDirection(ltr, rtl); return f(elem); }; var placement$4 = function (component, anchorInfo, origin) { var hotspot = anchorInfo.hotspot; var anchorBox = toBox(origin, hotspot.element); var layouts = get$4(component.element, anchorInfo, belowOrAbove(), belowOrAboveRtl(), aboveOrBelow(), aboveOrBelowRtl(), Optional.some(anchorInfo.hotspot.element)); return Optional.some(nu$4({ anchorBox: anchorBox, bubble: anchorInfo.bubble.getOr(fallback()), overrides: anchorInfo.overrides, layouts: layouts, placer: Optional.none() })); }; var HotspotAnchor = [ required$1('hotspot'), option('bubble'), defaulted('overrides', {}), schema$y(), output$1('placement', placement$4) ]; var placement$3 = function (component, anchorInfo, origin) { var pos = translate$2(origin, anchorInfo.x, anchorInfo.y); var anchorBox = bounds(pos.left, pos.top, anchorInfo.width, anchorInfo.height); var layouts = get$4(component.element, anchorInfo, all$1(), allRtl$1(), all$1(), allRtl$1(), Optional.none()); return Optional.some(nu$4({ anchorBox: anchorBox, bubble: anchorInfo.bubble, overrides: anchorInfo.overrides, layouts: layouts, placer: Optional.none() })); }; var MakeshiftAnchor = [ required$1('x'), required$1('y'), defaulted('height', 0), defaulted('width', 0), defaulted('bubble', fallback()), defaulted('overrides', {}), schema$y(), output$1('placement', placement$3) ]; var adt$7 = Adt.generate([ { screen: ['point'] }, { absolute: [ 'point', 'scrollLeft', 'scrollTop' ] } ]); var toFixed = function (pos) { return pos.fold(identity$1, function (point, scrollLeft, scrollTop) { return point.translate(-scrollLeft, -scrollTop); }); }; var toAbsolute = function (pos) { return pos.fold(identity$1, identity$1); }; var sum = function (points) { return foldl(points, function (b, a) { return b.translate(a.left, a.top); }, SugarPosition(0, 0)); }; var sumAsFixed = function (positions) { var points = map$2(positions, toFixed); return sum(points); }; var sumAsAbsolute = function (positions) { var points = map$2(positions, toAbsolute); return sum(points); }; var screen = adt$7.screen; var absolute$1 = adt$7.absolute; var getOffset = function (component, origin, anchorInfo) { var win = defaultView(anchorInfo.root).dom; var hasSameOwner = function (frame) { var frameOwner = owner$4(frame); var compOwner = owner$4(component.element); return eq(frameOwner, compOwner); }; return Optional.from(win.frameElement).map(SugarElement.fromDom).filter(hasSameOwner).map(absolute$3); }; var getRootPoint = function (component, origin, anchorInfo) { var doc = owner$4(component.element); var outerScroll = get$9(doc); var offset = getOffset(component, origin, anchorInfo).getOr(outerScroll); return absolute$1(offset, outerScroll.left, outerScroll.top); }; var getBox = function (left, top, width, height) { var point = screen(SugarPosition(left, top)); return Optional.some(pointed(point, width, height)); }; var calcNewAnchor = function (optBox, rootPoint, anchorInfo, origin, elem) { return optBox.map(function (box) { var points = [ rootPoint, box.point ]; var topLeft = cata$1(origin, function () { return sumAsAbsolute(points); }, function () { return sumAsAbsolute(points); }, function () { return sumAsFixed(points); }); var anchorBox = rect(topLeft.left, topLeft.top, box.width, box.height); var layoutsLtr = anchorInfo.showAbove ? aboveOrBelow() : belowOrAbove(); var layoutsRtl = anchorInfo.showAbove ? aboveOrBelowRtl() : belowOrAboveRtl(); var layouts = get$4(elem, anchorInfo, layoutsLtr, layoutsRtl, layoutsLtr, layoutsRtl, Optional.none()); return nu$4({ anchorBox: anchorBox, bubble: anchorInfo.bubble.getOr(fallback()), overrides: anchorInfo.overrides, layouts: layouts, placer: Optional.none() }); }); }; var placement$2 = function (component, anchorInfo, origin) { var rootPoint = getRootPoint(component, origin, anchorInfo); return anchorInfo.node.filter(inBody).bind(function (target) { var rect = target.dom.getBoundingClientRect(); var nodeBox = getBox(rect.left, rect.top, rect.width, rect.height); var elem = anchorInfo.node.getOr(component.element); return calcNewAnchor(nodeBox, rootPoint, anchorInfo, origin, elem); }); }; var NodeAnchor = [ required$1('node'), required$1('root'), option('bubble'), schema$y(), defaulted('overrides', {}), defaulted('showAbove', false), output$1('placement', placement$2) ]; var zeroWidth = '\uFEFF'; var nbsp = '\xA0'; var create$7 = function (start, soffset, finish, foffset) { return { start: start, soffset: soffset, finish: finish, foffset: foffset }; }; var SimRange = { create: create$7 }; var adt$6 = Adt.generate([ { before: ['element'] }, { on: [ 'element', 'offset' ] }, { after: ['element'] } ]); var cata = function (subject, onBefore, onOn, onAfter) { return subject.fold(onBefore, onOn, onAfter); }; var getStart$1 = function (situ) { return situ.fold(identity$1, identity$1, identity$1); }; var before = adt$6.before; var on$1 = adt$6.on; var after$1 = adt$6.after; var Situ = { before: before, on: on$1, after: after$1, cata: cata, getStart: getStart$1 }; var adt$5 = Adt.generate([ { domRange: ['rng'] }, { relative: [ 'startSitu', 'finishSitu' ] }, { exact: [ 'start', 'soffset', 'finish', 'foffset' ] } ]); var exactFromRange = function (simRange) { return adt$5.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset); }; var getStart = function (selection) { return selection.match({ domRange: function (rng) { return SugarElement.fromDom(rng.startContainer); }, relative: function (startSitu, _finishSitu) { return Situ.getStart(startSitu); }, exact: function (start, _soffset, _finish, _foffset) { return start; } }); }; var domRange = adt$5.domRange; var relative = adt$5.relative; var exact = adt$5.exact; var getWin = function (selection) { var start = getStart(selection); return defaultView(start); }; var range$1 = SimRange.create; var SimSelection = { domRange: domRange, relative: relative, exact: exact, exactFromRange: exactFromRange, getWin: getWin, range: range$1 }; var setStart = function (rng, situ) { situ.fold(function (e) { rng.setStartBefore(e.dom); }, function (e, o) { rng.setStart(e.dom, o); }, function (e) { rng.setStartAfter(e.dom); }); }; var setFinish = function (rng, situ) { situ.fold(function (e) { rng.setEndBefore(e.dom); }, function (e, o) { rng.setEnd(e.dom, o); }, function (e) { rng.setEndAfter(e.dom); }); }; var relativeToNative = function (win, startSitu, finishSitu) { var range = win.document.createRange(); setStart(range, startSitu); setFinish(range, finishSitu); return range; }; var exactToNative = function (win, start, soffset, finish, foffset) { var rng = win.document.createRange(); rng.setStart(start.dom, soffset); rng.setEnd(finish.dom, foffset); return rng; }; var toRect = function (rect) { return { left: rect.left, top: rect.top, right: rect.right, bottom: rect.bottom, width: rect.width, height: rect.height }; }; var getFirstRect$1 = function (rng) { var rects = rng.getClientRects(); var rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect(); return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect) : Optional.none(); }; var getBounds$2 = function (rng) { var rect = rng.getBoundingClientRect(); return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect) : Optional.none(); }; var adt$4 = Adt.generate([ { ltr: [ 'start', 'soffset', 'finish', 'foffset' ] }, { rtl: [ 'start', 'soffset', 'finish', 'foffset' ] } ]); var fromRange = function (win, type, range) { return type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset); }; var getRanges = function (win, selection) { return selection.match({ domRange: function (rng) { return { ltr: constant$1(rng), rtl: Optional.none }; }, relative: function (startSitu, finishSitu) { return { ltr: cached(function () { return relativeToNative(win, startSitu, finishSitu); }), rtl: cached(function () { return Optional.some(relativeToNative(win, finishSitu, startSitu)); }) }; }, exact: function (start, soffset, finish, foffset) { return { ltr: cached(function () { return exactToNative(win, start, soffset, finish, foffset); }), rtl: cached(function () { return Optional.some(exactToNative(win, finish, foffset, start, soffset)); }) }; } }); }; var doDiagnose = function (win, ranges) { var rng = ranges.ltr(); if (rng.collapsed) { var reversed = ranges.rtl().filter(function (rev) { return rev.collapsed === false; }); return reversed.map(function (rev) { return adt$4.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset); }).getOrThunk(function () { return fromRange(win, adt$4.ltr, rng); }); } else { return fromRange(win, adt$4.ltr, rng); } }; var diagnose = function (win, selection) { var ranges = getRanges(win, selection); return doDiagnose(win, ranges); }; var asLtrRange = function (win, selection) { var diagnosis = diagnose(win, selection); return diagnosis.match({ ltr: function (start, soffset, finish, foffset) { var rng = win.document.createRange(); rng.setStart(start.dom, soffset); rng.setEnd(finish.dom, foffset); return rng; }, rtl: function (start, soffset, finish, foffset) { var rng = win.document.createRange(); rng.setStart(finish.dom, foffset); rng.setEnd(start.dom, soffset); return rng; } }); }; adt$4.ltr; adt$4.rtl; var NodeValue = function (is, name) { var get = function (element) { if (!is(element)) { throw new Error('Can only get ' + name + ' value of a ' + name + ' node'); } return getOption(element).getOr(''); }; var getOption = function (element) { return is(element) ? Optional.from(element.dom.nodeValue) : Optional.none(); }; var set = function (element, value) { if (!is(element)) { throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node'); } element.dom.nodeValue = value; }; return { get: get, getOption: getOption, set: set }; }; var api = NodeValue(isText$1, 'text'); var get$3 = function (element) { return api.get(element); }; var getOption = function (element) { return api.getOption(element); }; var getEnd = function (element) { return name$2(element) === 'img' ? 1 : getOption(element).fold(function () { return children(element).length; }, function (v) { return v.length; }); }; var isTextNodeWithCursorPosition = function (el) { return getOption(el).filter(function (text) { return text.trim().length !== 0 || text.indexOf(nbsp) > -1; }).isSome(); }; var elementsWithCursorPosition = [ 'img', 'br' ]; var isCursorPosition = function (elem) { var hasCursorPosition = isTextNodeWithCursorPosition(elem); return hasCursorPosition || contains$2(elementsWithCursorPosition, name$2(elem)); }; var last$1 = function (element) { return descendantRtl(element, isCursorPosition); }; var descendantRtl = function (scope, predicate) { var descend = function (element) { var children$1 = children(element); for (var i = children$1.length - 1; i >= 0; i--) { var child = children$1[i]; if (predicate(child)) { return Optional.some(child); } var res = descend(child); if (res.isSome()) { return res; } } return Optional.none(); }; return descend(scope); }; var descendants = function (scope, selector) { return all$3(selector, scope); }; var makeRange = function (start, soffset, finish, foffset) { var doc = owner$4(start); var rng = doc.dom.createRange(); rng.setStart(start.dom, soffset); rng.setEnd(finish.dom, foffset); return rng; }; var after = function (start, soffset, finish, foffset) { var r = makeRange(start, soffset, finish, foffset); var same = eq(start, finish) && soffset === foffset; return r.collapsed && !same; }; var getNativeSelection = function (win) { return Optional.from(win.getSelection()); }; var readRange = function (selection) { if (selection.rangeCount > 0) { var firstRng = selection.getRangeAt(0); var lastRng = selection.getRangeAt(selection.rangeCount - 1); return Optional.some(SimRange.create(SugarElement.fromDom(firstRng.startContainer), firstRng.startOffset, SugarElement.fromDom(lastRng.endContainer), lastRng.endOffset)); } else { return Optional.none(); } }; var doGetExact = function (selection) { if (selection.anchorNode === null || selection.focusNode === null) { return readRange(selection); } else { var anchor = SugarElement.fromDom(selection.anchorNode); var focus_1 = SugarElement.fromDom(selection.focusNode); return after(anchor, selection.anchorOffset, focus_1, selection.focusOffset) ? Optional.some(SimRange.create(anchor, selection.anchorOffset, focus_1, selection.focusOffset)) : readRange(selection); } }; var getExact = function (win) { return getNativeSelection(win).filter(function (sel) { return sel.rangeCount > 0; }).bind(doGetExact); }; var getFirstRect = function (win, selection) { var rng = asLtrRange(win, selection); return getFirstRect$1(rng); }; var getBounds$1 = function (win, selection) { var rng = asLtrRange(win, selection); return getBounds$2(rng); }; var point$1 = function (element, offset) { return { element: element, offset: offset }; }; var descendOnce$1 = function (element, offset) { var children$1 = children(element); if (children$1.length === 0) { return point$1(element, offset); } else if (offset < children$1.length) { return point$1(children$1[offset], 0); } else { var last = children$1[children$1.length - 1]; var len = isText$1(last) ? get$3(last).length : children(last).length; return point$1(last, len); } }; var descendOnce = function (element, offset) { return isText$1(element) ? point$1(element, offset) : descendOnce$1(element, offset); }; var getAnchorSelection = function (win, anchorInfo) { var getSelection = anchorInfo.getSelection.getOrThunk(function () { return function () { return getExact(win); }; }); return getSelection().map(function (sel) { var modStart = descendOnce(sel.start, sel.soffset); var modFinish = descendOnce(sel.finish, sel.foffset); return SimSelection.range(modStart.element, modStart.offset, modFinish.element, modFinish.offset); }); }; var placement$1 = function (component, anchorInfo, origin) { var win = defaultView(anchorInfo.root).dom; var rootPoint = getRootPoint(component, origin, anchorInfo); var selectionBox = getAnchorSelection(win, anchorInfo).bind(function (sel) { var optRect = getBounds$1(win, SimSelection.exactFromRange(sel)).orThunk(function () { var x = SugarElement.fromText(zeroWidth); before$2(sel.start, x); var rect = getFirstRect(win, SimSelection.exact(x, 0, x, 1)); remove$5(x); return rect; }); return optRect.bind(function (rawRect) { return getBox(rawRect.left, rawRect.top, rawRect.width, rawRect.height); }); }); var targetElement = getAnchorSelection(win, anchorInfo).bind(function (sel) { return isElement$2(sel.start) ? Optional.some(sel.start) : parentNode(sel.start); }); var elem = targetElement.getOr(component.element); return calcNewAnchor(selectionBox, rootPoint, anchorInfo, origin, elem); }; var SelectionAnchor = [ option('getSelection'), required$1('root'), option('bubble'), schema$y(), defaulted('overrides', {}), defaulted('showAbove', false), output$1('placement', placement$1) ]; var labelPrefix$1 = 'link-layout'; var eastX = function (anchor) { return anchor.x + anchor.width; }; var westX = function (anchor, element) { return anchor.x - element.width; }; var northY$1 = function (anchor, element) { return anchor.y - element.height + anchor.height; }; var southY$1 = function (anchor) { return anchor.y; }; var southeast$1 = function (anchor, element, bubbles) { return nu$6(eastX(anchor), southY$1(anchor), bubbles.southeast(), southeast$3(), 'southeast', boundsRestriction(anchor, { left: 0, top: 2 }), labelPrefix$1); }; var southwest$1 = function (anchor, element, bubbles) { return nu$6(westX(anchor, element), southY$1(anchor), bubbles.southwest(), southwest$3(), 'southwest', boundsRestriction(anchor, { right: 1, top: 2 }), labelPrefix$1); }; var northeast$1 = function (anchor, element, bubbles) { return nu$6(eastX(anchor), northY$1(anchor, element), bubbles.northeast(), northeast$3(), 'northeast', boundsRestriction(anchor, { left: 0, bottom: 3 }), labelPrefix$1); }; var northwest$1 = function (anchor, element, bubbles) { return nu$6(westX(anchor, element), northY$1(anchor, element), bubbles.northwest(), northwest$3(), 'northwest', boundsRestriction(anchor, { right: 1, bottom: 3 }), labelPrefix$1); }; var all = function () { return [ southeast$1, southwest$1, northeast$1, northwest$1 ]; }; var allRtl = function () { return [ southwest$1, southeast$1, northwest$1, northeast$1 ]; }; var placement = function (component, submenuInfo, origin) { var anchorBox = toBox(origin, submenuInfo.item.element); var layouts = get$4(component.element, submenuInfo, all(), allRtl(), all(), allRtl(), Optional.none()); return Optional.some(nu$4({ anchorBox: anchorBox, bubble: fallback(), overrides: submenuInfo.overrides, layouts: layouts, placer: Optional.none() })); }; var SubmenuAnchor = [ required$1('item'), schema$y(), defaulted('overrides', {}), output$1('placement', placement) ]; var AnchorSchema = choose$1('type', { selection: SelectionAnchor, node: NodeAnchor, hotspot: HotspotAnchor, submenu: SubmenuAnchor, makeshift: MakeshiftAnchor }); var TransitionSchema = [ requiredArrayOf('classes', string), defaultedStringEnum('mode', 'all', [ 'all', 'layout', 'placement' ]) ]; var PositionSchema = [ defaulted('useFixed', never), option('getBounds') ]; var PlacementSchema = [ requiredOf('anchor', AnchorSchema), optionObjOf('transition', TransitionSchema) ]; var getFixedOrigin = function () { var html = document.documentElement; return fixed$1(0, 0, html.clientWidth, html.clientHeight); }; var getRelativeOrigin = function (component) { var position = absolute$3(component.element); var bounds = component.element.dom.getBoundingClientRect(); return relative$1(position.left, position.top, bounds.width, bounds.height); }; var place = function (component, origin, anchoring, getBounds, placee, lastPlace, transition) { var anchor = box(anchoring.anchorBox, origin); return simple(anchor, placee.element, anchoring.bubble, anchoring.layouts, lastPlace, getBounds, anchoring.overrides, transition); }; var position$1 = function (component, posConfig, posState, placee, placementSpec) { positionWithin(component, posConfig, posState, placee, placementSpec, Optional.none()); }; var positionWithin = function (component, posConfig, posState, placee, placementSpec, boxElement) { var boundsBox = boxElement.map(box$1); return positionWithinBounds(component, posConfig, posState, placee, placementSpec, boundsBox); }; var positionWithinBounds = function (component, posConfig, posState, placee, placementSpec, bounds) { var placeeDetail = asRawOrDie$1('placement.info', objOf(PlacementSchema), placementSpec); var anchorage = placeeDetail.anchor; var element = placee.element; var placeeState = posState.get(placee.uid); preserve$1(function () { set$7(element, 'position', 'fixed'); var oldVisibility = getRaw(element, 'visibility'); set$7(element, 'visibility', 'hidden'); var origin = posConfig.useFixed() ? getFixedOrigin() : getRelativeOrigin(component); var placer = anchorage.placement; var getBounds = bounds.map(constant$1).or(posConfig.getBounds); placer(component, anchorage, origin).each(function (anchoring) { var doPlace = anchoring.placer.getOr(place); var newState = doPlace(component, origin, anchoring, getBounds, placee, placeeState, placeeDetail.transition); posState.set(placee.uid, newState); }); oldVisibility.fold(function () { remove$6(element, 'visibility'); }, function (vis) { set$7(element, 'visibility', vis); }); if (getRaw(element, 'left').isNone() && getRaw(element, 'top').isNone() && getRaw(element, 'right').isNone() && getRaw(element, 'bottom').isNone() && is$1(getRaw(element, 'position'), 'fixed')) { remove$6(element, 'position'); } }, element); }; var getMode = function (component, pConfig, _pState) { return pConfig.useFixed() ? 'fixed' : 'absolute'; }; var reset$1 = function (component, pConfig, posState, placee) { var element = placee.element; each$1([ 'position', 'left', 'right', 'top', 'bottom' ], function (prop) { return remove$6(element, prop); }); reset$2(element); posState.clear(placee.uid); }; var PositionApis = /*#__PURE__*/Object.freeze({ __proto__: null, position: position$1, positionWithin: positionWithin, positionWithinBounds: positionWithinBounds, getMode: getMode, reset: reset$1 }); var init$g = function () { var state = {}; var set = function (id, data) { state[id] = data; }; var get = function (id) { return get$e(state, id); }; var clear = function (id) { if (isNonNullable(id)) { delete state[id]; } else { state = {}; } }; return nu$8({ readState: function () { return state; }, clear: clear, set: set, get: get }); }; var PositioningState = /*#__PURE__*/Object.freeze({ __proto__: null, init: init$g }); var Positioning = create$8({ fields: PositionSchema, name: 'positioning', active: ActivePosition, apis: PositionApis, state: PositioningState }); var fireDetaching = function (component) { emit(component, detachedFromDom()); var children = component.components(); each$1(children, fireDetaching); }; var fireAttaching = function (component) { var children = component.components(); each$1(children, fireAttaching); emit(component, attachedToDom()); }; var attach$1 = function (parent, child) { append$2(parent.element, child.element); }; var detachChildren$1 = function (component) { each$1(component.components(), function (childComp) { return remove$5(childComp.element); }); empty(component.element); component.syncComponents(); }; var replaceChildren = function (component, newChildren) { var subs = component.components(); detachChildren$1(component); var deleted = difference(subs, newChildren); each$1(deleted, function (comp) { fireDetaching(comp); component.getSystem().removeFromWorld(comp); }); each$1(newChildren, function (childComp) { if (!childComp.getSystem().isConnected()) { component.getSystem().addToWorld(childComp); attach$1(component, childComp); if (inBody(component.element)) { fireAttaching(childComp); } } else { attach$1(component, childComp); } component.syncComponents(); }); }; var attach = function (parent, child) { attachWith(parent, child, append$2); }; var attachWith = function (parent, child, insertion) { parent.getSystem().addToWorld(child); insertion(parent.element, child.element); if (inBody(parent.element)) { fireAttaching(child); } parent.syncComponents(); }; var doDetach = function (component) { fireDetaching(component); remove$5(component.element); component.getSystem().removeFromWorld(component); }; var detach = function (component) { var parent$1 = parent(component.element).bind(function (p) { return component.getSystem().getByDom(p).toOptional(); }); doDetach(component); parent$1.each(function (p) { p.syncComponents(); }); }; var detachChildren = function (component) { var subs = component.components(); each$1(subs, doDetach); empty(component.element); component.syncComponents(); }; var attachSystem = function (element, guiSystem) { attachSystemWith(element, guiSystem, append$2); }; var attachSystemAfter = function (element, guiSystem) { attachSystemWith(element, guiSystem, after$2); }; var attachSystemWith = function (element, guiSystem, inserter) { inserter(element, guiSystem.element); var children$1 = children(guiSystem.element); each$1(children$1, function (child) { guiSystem.getByDom(child).each(fireAttaching); }); }; var detachSystem = function (guiSystem) { var children$1 = children(guiSystem.element); each$1(children$1, function (child) { guiSystem.getByDom(child).each(fireDetaching); }); remove$5(guiSystem.element); }; var rebuild = function (sandbox, sConfig, sState, data) { sState.get().each(function (_data) { detachChildren(sandbox); }); var point = sConfig.getAttachPoint(sandbox); attach(point, sandbox); var built = sandbox.getSystem().build(data); attach(sandbox, built); sState.set(built); return built; }; var open$1 = function (sandbox, sConfig, sState, data) { var newState = rebuild(sandbox, sConfig, sState, data); sConfig.onOpen(sandbox, newState); return newState; }; var setContent = function (sandbox, sConfig, sState, data) { return sState.get().map(function () { return rebuild(sandbox, sConfig, sState, data); }); }; var openWhileCloaked = function (sandbox, sConfig, sState, data, transaction) { cloak(sandbox, sConfig); open$1(sandbox, sConfig, sState, data); transaction(); decloak(sandbox, sConfig); }; var close$1 = function (sandbox, sConfig, sState) { sState.get().each(function (data) { detachChildren(sandbox); detach(sandbox); sConfig.onClose(sandbox, data); sState.clear(); }); }; var isOpen$1 = function (_sandbox, _sConfig, sState) { return sState.isOpen(); }; var isPartOf = function (sandbox, sConfig, sState, queryElem) { return isOpen$1(sandbox, sConfig, sState) && sState.get().exists(function (data) { return sConfig.isPartOf(sandbox, data, queryElem); }); }; var getState$2 = function (_sandbox, _sConfig, sState) { return sState.get(); }; var store = function (sandbox, cssKey, attr, newValue) { getRaw(sandbox.element, cssKey).fold(function () { remove$7(sandbox.element, attr); }, function (v) { set$8(sandbox.element, attr, v); }); set$7(sandbox.element, cssKey, newValue); }; var restore = function (sandbox, cssKey, attr) { getOpt(sandbox.element, attr).fold(function () { return remove$6(sandbox.element, cssKey); }, function (oldValue) { return set$7(sandbox.element, cssKey, oldValue); }); }; var cloak = function (sandbox, sConfig, _sState) { var sink = sConfig.getAttachPoint(sandbox); set$7(sandbox.element, 'position', Positioning.getMode(sink)); store(sandbox, 'visibility', sConfig.cloakVisibilityAttr, 'hidden'); }; var hasPosition = function (element) { return exists([ 'top', 'left', 'right', 'bottom' ], function (pos) { return getRaw(element, pos).isSome(); }); }; var decloak = function (sandbox, sConfig, _sState) { if (!hasPosition(sandbox.element)) { remove$6(sandbox.element, 'position'); } restore(sandbox, 'visibility', sConfig.cloakVisibilityAttr); }; var SandboxApis = /*#__PURE__*/Object.freeze({ __proto__: null, cloak: cloak, decloak: decloak, open: open$1, openWhileCloaked: openWhileCloaked, close: close$1, isOpen: isOpen$1, isPartOf: isPartOf, getState: getState$2, setContent: setContent }); var events$g = function (sandboxConfig, sandboxState) { return derive$2([run$1(sandboxClose(), function (sandbox, _simulatedEvent) { close$1(sandbox, sandboxConfig, sandboxState); })]); }; var ActiveSandbox = /*#__PURE__*/Object.freeze({ __proto__: null, events: events$g }); var SandboxSchema = [ onHandler('onOpen'), onHandler('onClose'), required$1('isPartOf'), required$1('getAttachPoint'), defaulted('cloakVisibilityAttr', 'data-precloak-visibility') ]; var init$f = function () { var contents = value$1(); var readState = constant$1('not-implemented'); return nu$8({ readState: readState, isOpen: contents.isSet, clear: contents.clear, set: contents.set, get: contents.get }); }; var SandboxState = /*#__PURE__*/Object.freeze({ __proto__: null, init: init$f }); var Sandboxing = create$8({ fields: SandboxSchema, name: 'sandboxing', active: ActiveSandbox, apis: SandboxApis, state: SandboxState }); var dismissPopups = constant$1('dismiss.popups'); var repositionPopups = constant$1('reposition.popups'); var mouseReleased = constant$1('mouse.released'); var schema$x = objOfOnly([ defaulted('isExtraPart', never), optionObjOf('fireEventInstead', [defaulted('event', dismissRequested())]) ]); var receivingChannel$1 = function (rawSpec) { var _a; var detail = asRawOrDie$1('Dismissal', schema$x, rawSpec); return _a = {}, _a[dismissPopups()] = { schema: objOfOnly([required$1('target')]), onReceive: function (sandbox, data) { if (Sandboxing.isOpen(sandbox)) { var isPart = Sandboxing.isPartOf(sandbox, data.target) || detail.isExtraPart(sandbox, data.target); if (!isPart) { detail.fireEventInstead.fold(function () { return Sandboxing.close(sandbox); }, function (fe) { return emit(sandbox, fe.event); }); } } } }, _a; }; var schema$w = objOfOnly([ optionObjOf('fireEventInstead', [defaulted('event', repositionRequested())]), requiredFunction('doReposition') ]); var receivingChannel = function (rawSpec) { var _a; var detail = asRawOrDie$1('Reposition', schema$w, rawSpec); return _a = {}, _a[repositionPopups()] = { onReceive: function (sandbox) { if (Sandboxing.isOpen(sandbox)) { detail.fireEventInstead.fold(function () { return detail.doReposition(sandbox); }, function (fe) { return emit(sandbox, fe.event); }); } } }, _a; }; var onLoad$5 = function (component, repConfig, repState) { repConfig.store.manager.onLoad(component, repConfig, repState); }; var onUnload$2 = function (component, repConfig, repState) { repConfig.store.manager.onUnload(component, repConfig, repState); }; var setValue$3 = function (component, repConfig, repState, data) { repConfig.store.manager.setValue(component, repConfig, repState, data); }; var getValue$3 = function (component, repConfig, repState) { return repConfig.store.manager.getValue(component, repConfig, repState); }; var getState$1 = function (component, repConfig, repState) { return repState; }; var RepresentApis = /*#__PURE__*/Object.freeze({ __proto__: null, onLoad: onLoad$5, onUnload: onUnload$2, setValue: setValue$3, getValue: getValue$3, getState: getState$1 }); var events$f = function (repConfig, repState) { var es = repConfig.resetOnDom ? [ runOnAttached(function (comp, _se) { onLoad$5(comp, repConfig, repState); }), runOnDetached(function (comp, _se) { onUnload$2(comp, repConfig, repState); }) ] : [loadEvent(repConfig, repState, onLoad$5)]; return derive$2(es); }; var ActiveRepresenting = /*#__PURE__*/Object.freeze({ __proto__: null, events: events$f }); var memory$1 = function () { var data = Cell(null); var readState = function () { return { mode: 'memory', value: data.get() }; }; var isNotSet = function () { return data.get() === null; }; var clear = function () { data.set(null); }; return nu$8({ set: data.set, get: data.get, isNotSet: isNotSet, clear: clear, readState: readState }); }; var manual = function () { var readState = noop; return nu$8({ readState: readState }); }; var dataset = function () { var dataByValue = Cell({}); var dataByText = Cell({}); var readState = function () { return { mode: 'dataset', dataByValue: dataByValue.get(), dataByText: dataByText.get() }; }; var clear = function () { dataByValue.set({}); dataByText.set({}); }; var lookup = function (itemString) { return get$e(dataByValue.get(), itemString).orThunk(function () { return get$e(dataByText.get(), itemString); }); }; var update = function (items) { var currentDataByValue = dataByValue.get(); var currentDataByText = dataByText.get(); var newDataByValue = {}; var newDataByText = {}; each$1(items, function (item) { newDataByValue[item.value] = item; get$e(item, 'meta').each(function (meta) { get$e(meta, 'text').each(function (text) { newDataByText[text] = item; }); }); }); dataByValue.set(__assign(__assign({}, currentDataByValue), newDataByValue)); dataByText.set(__assign(__assign({}, currentDataByText), newDataByText)); }; return nu$8({ readState: readState, lookup: lookup, update: update, clear: clear }); }; var init$e = function (spec) { return spec.store.manager.state(spec); }; var RepresentState = /*#__PURE__*/Object.freeze({ __proto__: null, memory: memory$1, dataset: dataset, manual: manual, init: init$e }); var setValue$2 = function (component, repConfig, repState, data) { var store = repConfig.store; repState.update([data]); store.setValue(component, data); repConfig.onSetValue(component, data); }; var getValue$2 = function (component, repConfig, repState) { var store = repConfig.store; var key = store.getDataKey(component); return repState.lookup(key).getOrThunk(function () { return store.getFallbackEntry(key); }); }; var onLoad$4 = function (component, repConfig, repState) { var store = repConfig.store; store.initialValue.each(function (data) { setValue$2(component, repConfig, repState, data); }); }; var onUnload$1 = function (component, repConfig, repState) { repState.clear(); }; var DatasetStore = [ option('initialValue'), required$1('getFallbackEntry'), required$1('getDataKey'), required$1('setValue'), output$1('manager', { setValue: setValue$2, getValue: getValue$2, onLoad: onLoad$4, onUnload: onUnload$1, state: dataset }) ]; var getValue$1 = function (component, repConfig, _repState) { return repConfig.store.getValue(component); }; var setValue$1 = function (component, repConfig, _repState, data) { repConfig.store.setValue(component, data); repConfig.onSetValue(component, data); }; var onLoad$3 = function (component, repConfig, _repState) { repConfig.store.initialValue.each(function (data) { repConfig.store.setValue(component, data); }); }; var ManualStore = [ required$1('getValue'), defaulted('setValue', noop), option('initialValue'), output$1('manager', { setValue: setValue$1, getValue: getValue$1, onLoad: onLoad$3, onUnload: noop, state: NoState.init }) ]; var setValue = function (component, repConfig, repState, data) { repState.set(data); repConfig.onSetValue(component, data); }; var getValue = function (component, repConfig, repState) { return repState.get(); }; var onLoad$2 = function (component, repConfig, repState) { repConfig.store.initialValue.each(function (initVal) { if (repState.isNotSet()) { repState.set(initVal); } }); }; var onUnload = function (component, repConfig, repState) { repState.clear(); }; var MemoryStore = [ option('initialValue'), output$1('manager', { setValue: setValue, getValue: getValue, onLoad: onLoad$2, onUnload: onUnload, state: memory$1 }) ]; var RepresentSchema = [ defaultedOf('store', { mode: 'memory' }, choose$1('mode', { memory: MemoryStore, manual: ManualStore, dataset: DatasetStore })), onHandler('onSetValue'), defaulted('resetOnDom', false) ]; var Representing = create$8({ fields: RepresentSchema, name: 'representing', active: ActiveRepresenting, apis: RepresentApis, extra: { setValueFrom: function (component, source) { var value = Representing.getValue(source); Representing.setValue(component, value); } }, state: RepresentState }); var field = function (name, forbidden) { return defaultedObjOf(name, {}, map$2(forbidden, function (f) { return forbid(f.name(), 'Cannot configure ' + f.name() + ' for ' + name); }).concat([customField('dump', identity$1)])); }; var get$2 = function (data) { return data.dump; }; var augment = function (data, original) { return __assign(__assign({}, derive$1(original)), data.dump); }; var SketchBehaviours = { field: field, augment: augment, get: get$2 }; var _placeholder = 'placeholder'; var adt$3 = Adt.generate([ { single: [ 'required', 'valueThunk' ] }, { multiple: [ 'required', 'valueThunks' ] } ]); var isSubstituted = function (spec) { return has$2(spec, 'uiType'); }; var subPlaceholder = function (owner, detail, compSpec, placeholders) { if (owner.exists(function (o) { return o !== compSpec.owner; })) { return adt$3.single(true, constant$1(compSpec)); } return get$e(placeholders, compSpec.name).fold(function () { throw new Error('Unknown placeholder component: ' + compSpec.name + '\nKnown: [' + keys(placeholders) + ']\nNamespace: ' + owner.getOr('none') + '\nSpec: ' + JSON.stringify(compSpec, null, 2)); }, function (newSpec) { return newSpec.replace(); }); }; var scan = function (owner, detail, compSpec, placeholders) { if (isSubstituted(compSpec) && compSpec.uiType === _placeholder) { return subPlaceholder(owner, detail, compSpec, placeholders); } else { return adt$3.single(false, constant$1(compSpec)); } }; var substitute = function (owner, detail, compSpec, placeholders) { var base = scan(owner, detail, compSpec, placeholders); return base.fold(function (req, valueThunk) { var value = isSubstituted(compSpec) ? valueThunk(detail, compSpec.config, compSpec.validated) : valueThunk(detail); var childSpecs = get$e(value, 'components').getOr([]); var substituted = bind$3(childSpecs, function (c) { return substitute(owner, detail, c, placeholders); }); return [__assign(__assign({}, value), { components: substituted })]; }, function (req, valuesThunk) { if (isSubstituted(compSpec)) { var values = valuesThunk(detail, compSpec.config, compSpec.validated); var preprocessor = compSpec.validated.preprocess.getOr(identity$1); return preprocessor(values); } else { return valuesThunk(detail); } }); }; var substituteAll = function (owner, detail, components, placeholders) { return bind$3(components, function (c) { return substitute(owner, detail, c, placeholders); }); }; var oneReplace = function (label, replacements) { var called = false; var used = function () { return called; }; var replace = function () { if (called) { throw new Error('Trying to use the same placeholder more than once: ' + label); } called = true; return replacements; }; var required = function () { return replacements.fold(function (req, _) { return req; }, function (req, _) { return req; }); }; return { name: constant$1(label), required: required, used: used, replace: replace }; }; var substitutePlaces = function (owner, detail, components, placeholders) { var ps = map$1(placeholders, function (ph, name) { return oneReplace(name, ph); }); var outcome = substituteAll(owner, detail, components, ps); each(ps, function (p) { if (p.used() === false && p.required()) { throw new Error('Placeholder: ' + p.name() + ' was not found in components list\nNamespace: ' + owner.getOr('none') + '\nComponents: ' + JSON.stringify(detail.components, null, 2)); } }); return outcome; }; var single$2 = adt$3.single; var multiple = adt$3.multiple; var placeholder = constant$1(_placeholder); var adt$2 = Adt.generate([ { required: ['data'] }, { external: ['data'] }, { optional: ['data'] }, { group: ['data'] } ]); var fFactory = defaulted('factory', { sketch: identity$1 }); var fSchema = defaulted('schema', []); var fName = required$1('name'); var fPname = field$1('pname', 'pname', defaultedThunk(function (typeSpec) { return ''; }), anyValue()); var fGroupSchema = customField('schema', function () { return [option('preprocess')]; }); var fDefaults = defaulted('defaults', constant$1({})); var fOverrides = defaulted('overrides', constant$1({})); var requiredSpec = objOf([ fFactory, fSchema, fName, fPname, fDefaults, fOverrides ]); var externalSpec = objOf([ fFactory, fSchema, fName, fDefaults, fOverrides ]); var optionalSpec = objOf([ fFactory, fSchema, fName, fPname, fDefaults, fOverrides ]); var groupSpec = objOf([ fFactory, fGroupSchema, fName, required$1('unit'), fPname, fDefaults, fOverrides ]); var asNamedPart = function (part) { return part.fold(Optional.some, Optional.none, Optional.some, Optional.some); }; var name$1 = function (part) { var get = function (data) { return data.name; }; return part.fold(get, get, get, get); }; var asCommon = function (part) { return part.fold(identity$1, identity$1, identity$1, identity$1); }; var convert = function (adtConstructor, partSchema) { return function (spec) { var data = asRawOrDie$1('Converting part type', partSchema, spec); return adtConstructor(data); }; }; var required = convert(adt$2.required, requiredSpec); var external$1 = convert(adt$2.external, externalSpec); var optional = convert(adt$2.optional, optionalSpec); var group = convert(adt$2.group, groupSpec); var original = constant$1('entirety'); var PartType = /*#__PURE__*/Object.freeze({ __proto__: null, required: required, external: external$1, optional: optional, group: group, asNamedPart: asNamedPart, name: name$1, asCommon: asCommon, original: original }); var combine = function (detail, data, partSpec, partValidated) { return deepMerge(data.defaults(detail, partSpec, partValidated), partSpec, { uid: detail.partUids[data.name] }, data.overrides(detail, partSpec, partValidated)); }; var subs = function (owner, detail, parts) { var internals = {}; var externals = {}; each$1(parts, function (part) { part.fold(function (data) { internals[data.pname] = single$2(true, function (detail, partSpec, partValidated) { return data.factory.sketch(combine(detail, data, partSpec, partValidated)); }); }, function (data) { var partSpec = detail.parts[data.name]; externals[data.name] = constant$1(data.factory.sketch(combine(detail, data, partSpec[original()]), partSpec)); }, function (data) { internals[data.pname] = single$2(false, function (detail, partSpec, partValidated) { return data.factory.sketch(combine(detail, data, partSpec, partValidated)); }); }, function (data) { internals[data.pname] = multiple(true, function (detail, _partSpec, _partValidated) { var units = detail[data.name]; return map$2(units, function (u) { return data.factory.sketch(deepMerge(data.defaults(detail, u, _partValidated), u, data.overrides(detail, u))); }); }); }); }); return { internals: constant$1(internals), externals: constant$1(externals) }; }; var generate$3 = function (owner, parts) { var r = {}; each$1(parts, function (part) { asNamedPart(part).each(function (np) { var g = doGenerateOne(owner, np.pname); r[np.name] = function (config) { var validated = asRawOrDie$1('Part: ' + np.name + ' in ' + owner, objOf(np.schema), config); return __assign(__assign({}, g), { config: config, validated: validated }); }; }); }); return r; }; var doGenerateOne = function (owner, pname) { return { uiType: placeholder(), owner: owner, name: pname }; }; var generateOne$1 = function (owner, pname, config) { return { uiType: placeholder(), owner: owner, name: pname, config: config, validated: {} }; }; var schemas = function (parts) { return bind$3(parts, function (part) { return part.fold(Optional.none, Optional.some, Optional.none, Optional.none).map(function (data) { return requiredObjOf(data.name, data.schema.concat([snapshot(original())])); }).toArray(); }); }; var names = function (parts) { return map$2(parts, name$1); }; var substitutes = function (owner, detail, parts) { return subs(owner, detail, parts); }; var components$1 = function (owner, detail, internals) { return substitutePlaces(Optional.some(owner), detail, detail.components, internals); }; var getPart = function (component, detail, partKey) { var uid = detail.partUids[partKey]; return component.getSystem().getByUid(uid).toOptional(); }; var getPartOrDie = function (component, detail, partKey) { return getPart(component, detail, partKey).getOrDie('Could not find part: ' + partKey); }; var getParts = function (component, detail, partKeys) { var r = {}; var uids = detail.partUids; var system = component.getSystem(); each$1(partKeys, function (pk) { r[pk] = constant$1(system.getByUid(uids[pk])); }); return r; }; var getAllParts = function (component, detail) { var system = component.getSystem(); return map$1(detail.partUids, function (pUid, _k) { return constant$1(system.getByUid(pUid)); }); }; var getAllPartNames = function (detail) { return keys(detail.partUids); }; var getPartsOrDie = function (component, detail, partKeys) { var r = {}; var uids = detail.partUids; var system = component.getSystem(); each$1(partKeys, function (pk) { r[pk] = constant$1(system.getByUid(uids[pk]).getOrDie()); }); return r; }; var defaultUids = function (baseUid, partTypes) { var partNames = names(partTypes); return wrapAll(map$2(partNames, function (pn) { return { key: pn, value: baseUid + '-' + pn }; })); }; var defaultUidsSchema = function (partTypes) { return field$1('partUids', 'partUids', mergeWithThunk(function (spec) { return defaultUids(spec.uid, partTypes); }), anyValue()); }; var AlloyParts = /*#__PURE__*/Object.freeze({ __proto__: null, generate: generate$3, generateOne: generateOne$1, schemas: schemas, names: names, substitutes: substitutes, components: components$1, defaultUids: defaultUids, defaultUidsSchema: defaultUidsSchema, getAllParts: getAllParts, getAllPartNames: getAllPartNames, getPart: getPart, getPartOrDie: getPartOrDie, getParts: getParts, getPartsOrDie: getPartsOrDie }); var base = function (partSchemas, partUidsSchemas) { var ps = partSchemas.length > 0 ? [requiredObjOf('parts', partSchemas)] : []; return ps.concat([ required$1('uid'), defaulted('dom', {}), defaulted('components', []), snapshot('originalSpec'), defaulted('debug.sketcher', {}) ]).concat(partUidsSchemas); }; var asRawOrDie = function (label, schema, spec, partSchemas, partUidsSchemas) { var baseS = base(partSchemas, partUidsSchemas); return asRawOrDie$1(label + ' [SpecSchema]', objOfOnly(baseS.concat(schema)), spec); }; var single$1 = function (owner, schema, factory, spec) { var specWithUid = supplyUid(spec); var detail = asRawOrDie(owner, schema, specWithUid, [], []); return factory(detail, specWithUid); }; var composite$1 = function (owner, schema, partTypes, factory, spec) { var specWithUid = supplyUid(spec); var partSchemas = schemas(partTypes); var partUidsSchema = defaultUidsSchema(partTypes); var detail = asRawOrDie(owner, schema, specWithUid, partSchemas, [partUidsSchema]); var subs = substitutes(owner, detail, partTypes); var components = components$1(owner, detail, subs.internals()); return factory(detail, components, specWithUid, subs.externals()); }; var hasUid = function (spec) { return has$2(spec, 'uid'); }; var supplyUid = function (spec) { return hasUid(spec) ? spec : __assign(__assign({}, spec), { uid: generate$5('uid') }); }; var isSketchSpec = function (spec) { return spec.uid !== undefined; }; var singleSchema = objOfOnly([ required$1('name'), required$1('factory'), required$1('configFields'), defaulted('apis', {}), defaulted('extraApis', {}) ]); var compositeSchema = objOfOnly([ required$1('name'), required$1('factory'), required$1('configFields'), required$1('partFields'), defaulted('apis', {}), defaulted('extraApis', {}) ]); var single = function (rawConfig) { var config = asRawOrDie$1('Sketcher for ' + rawConfig.name, singleSchema, rawConfig); var sketch = function (spec) { return single$1(config.name, config.configFields, config.factory, spec); }; var apis = map$1(config.apis, makeApi); var extraApis = map$1(config.extraApis, function (f, k) { return markAsExtraApi(f, k); }); return __assign(__assign({ name: config.name, configFields: config.configFields, sketch: sketch }, apis), extraApis); }; var composite = function (rawConfig) { var config = asRawOrDie$1('Sketcher for ' + rawConfig.name, compositeSchema, rawConfig); var sketch = function (spec) { return composite$1(config.name, config.configFields, config.partFields, config.factory, spec); }; var parts = generate$3(config.name, config.partFields); var apis = map$1(config.apis, makeApi); var extraApis = map$1(config.extraApis, function (f, k) { return markAsExtraApi(f, k); }); return __assign(__assign({ name: config.name, partFields: config.partFields, configFields: config.configFields, sketch: sketch, parts: parts }, apis), extraApis); }; var inside = function (target) { return name$2(target) === 'input' && get$d(target, 'type') !== 'radio' || name$2(target) === 'textarea'; }; var getCurrent = function (component, composeConfig, _composeState) { return composeConfig.find(component); }; var ComposeApis = /*#__PURE__*/Object.freeze({ __proto__: null, getCurrent: getCurrent }); var ComposeSchema = [required$1('find')]; var Composing = create$8({ fields: ComposeSchema, name: 'composing', apis: ComposeApis }); var nativeDisabled = [ 'input', 'button', 'textarea', 'select' ]; var onLoad$1 = function (component, disableConfig, disableState) { var f = disableConfig.disabled() ? disable$1 : enable$1; f(component, disableConfig); }; var hasNative = function (component, config) { return config.useNative === true && contains$2(nativeDisabled, name$2(component.element)); }; var nativeIsDisabled = function (component) { return has$1(component.element, 'disabled'); }; var nativeDisable = function (component) { set$8(component.element, 'disabled', 'disabled'); }; var nativeEnable = function (component) { remove$7(component.element, 'disabled'); }; var ariaIsDisabled = function (component) { return get$d(component.element, 'aria-disabled') === 'true'; }; var ariaDisable = function (component) { set$8(component.element, 'aria-disabled', 'true'); }; var ariaEnable = function (component) { set$8(component.element, 'aria-disabled', 'false'); }; var disable$1 = function (component, disableConfig, _disableState) { disableConfig.disableClass.each(function (disableClass) { add$2(component.element, disableClass); }); var f = hasNative(component, disableConfig) ? nativeDisable : ariaDisable; f(component); disableConfig.onDisabled(component); }; var enable$1 = function (component, disableConfig, _disableState) { disableConfig.disableClass.each(function (disableClass) { remove$2(component.element, disableClass); }); var f = hasNative(component, disableConfig) ? nativeEnable : ariaEnable; f(component); disableConfig.onEnabled(component); }; var isDisabled = function (component, disableConfig) { return hasNative(component, disableConfig) ? nativeIsDisabled(component) : ariaIsDisabled(component); }; var set$3 = function (component, disableConfig, disableState, disabled) { var f = disabled ? disable$1 : enable$1; f(component, disableConfig); }; var DisableApis = /*#__PURE__*/Object.freeze({ __proto__: null, enable: enable$1, disable: disable$1, isDisabled: isDisabled, onLoad: onLoad$1, set: set$3 }); var exhibit$5 = function (base, disableConfig) { return nu$7({ classes: disableConfig.disabled() ? disableConfig.disableClass.toArray() : [] }); }; var events$e = function (disableConfig, disableState) { return derive$2([ abort(execute$5(), function (component, _simulatedEvent) { return isDisabled(component, disableConfig); }), loadEvent(disableConfig, disableState, onLoad$1) ]); }; var ActiveDisable = /*#__PURE__*/Object.freeze({ __proto__: null, exhibit: exhibit$5, events: events$e }); var DisableSchema = [ defaultedFunction('disabled', never), defaulted('useNative', true), option('disableClass'), onHandler('onDisabled'), onHandler('onEnabled') ]; var Disabling = create$8({ fields: DisableSchema, name: 'disabling', active: ActiveDisable, apis: DisableApis }); var dehighlightAllExcept = function (component, hConfig, hState, skip) { var highlighted = descendants(component.element, '.' + hConfig.highlightClass); each$1(highlighted, function (h) { if (!exists(skip, function (skipComp) { return skipComp.element === h; })) { remove$2(h, hConfig.highlightClass); component.getSystem().getByDom(h).each(function (target) { hConfig.onDehighlight(component, target); emit(target, dehighlight$1()); }); } }); }; var dehighlightAll = function (component, hConfig, hState) { return dehighlightAllExcept(component, hConfig, hState, []); }; var dehighlight = function (component, hConfig, hState, target) { if (isHighlighted(component, hConfig, hState, target)) { remove$2(target.element, hConfig.highlightClass); hConfig.onDehighlight(component, target); emit(target, dehighlight$1()); } }; var highlight = function (component, hConfig, hState, target) { dehighlightAllExcept(component, hConfig, hState, [target]); if (!isHighlighted(component, hConfig, hState, target)) { add$2(target.element, hConfig.highlightClass); hConfig.onHighlight(component, target); emit(target, highlight$1()); } }; var highlightFirst = function (component, hConfig, hState) { getFirst(component, hConfig).each(function (firstComp) { highlight(component, hConfig, hState, firstComp); }); }; var highlightLast = function (component, hConfig, hState) { getLast(component, hConfig).each(function (lastComp) { highlight(component, hConfig, hState, lastComp); }); }; var highlightAt = function (component, hConfig, hState, index) { getByIndex(component, hConfig, hState, index).fold(function (err) { throw err; }, function (firstComp) { highlight(component, hConfig, hState, firstComp); }); }; var highlightBy = function (component, hConfig, hState, predicate) { var candidates = getCandidates(component, hConfig); var targetComp = find$5(candidates, predicate); targetComp.each(function (c) { highlight(component, hConfig, hState, c); }); }; var isHighlighted = function (component, hConfig, hState, queryTarget) { return has(queryTarget.element, hConfig.highlightClass); }; var getHighlighted = function (component, hConfig, _hState) { return descendant(component.element, '.' + hConfig.highlightClass).bind(function (e) { return component.getSystem().getByDom(e).toOptional(); }); }; var getByIndex = function (component, hConfig, hState, index) { var items = descendants(component.element, '.' + hConfig.itemClass); return Optional.from(items[index]).fold(function () { return Result.error(new Error('No element found with index ' + index)); }, component.getSystem().getByDom); }; var getFirst = function (component, hConfig, _hState) { return descendant(component.element, '.' + hConfig.itemClass).bind(function (e) { return component.getSystem().getByDom(e).toOptional(); }); }; var getLast = function (component, hConfig, _hState) { var items = descendants(component.element, '.' + hConfig.itemClass); var last = items.length > 0 ? Optional.some(items[items.length - 1]) : Optional.none(); return last.bind(function (c) { return component.getSystem().getByDom(c).toOptional(); }); }; var getDelta$2 = function (component, hConfig, hState, delta) { var items = descendants(component.element, '.' + hConfig.itemClass); var current = findIndex$1(items, function (item) { return has(item, hConfig.highlightClass); }); return current.bind(function (selected) { var dest = cycleBy(selected, delta, 0, items.length - 1); return component.getSystem().getByDom(items[dest]).toOptional(); }); }; var getPrevious = function (component, hConfig, hState) { return getDelta$2(component, hConfig, hState, -1); }; var getNext = function (component, hConfig, hState) { return getDelta$2(component, hConfig, hState, +1); }; var getCandidates = function (component, hConfig, _hState) { var items = descendants(component.element, '.' + hConfig.itemClass); return cat(map$2(items, function (i) { return component.getSystem().getByDom(i).toOptional(); })); }; var HighlightApis = /*#__PURE__*/Object.freeze({ __proto__: null, dehighlightAll: dehighlightAll, dehighlight: dehighlight, highlight: highlight, highlightFirst: highlightFirst, highlightLast: highlightLast, highlightAt: highlightAt, highlightBy: highlightBy, isHighlighted: isHighlighted, getHighlighted: getHighlighted, getFirst: getFirst, getLast: getLast, getPrevious: getPrevious, getNext: getNext, getCandidates: getCandidates }); var HighlightSchema = [ required$1('highlightClass'), required$1('itemClass'), onHandler('onHighlight'), onHandler('onDehighlight') ]; var Highlighting = create$8({ fields: HighlightSchema, name: 'highlighting', apis: HighlightApis }); var BACKSPACE = [8]; var TAB = [9]; var ENTER = [13]; var ESCAPE = [27]; var SPACE = [32]; var LEFT = [37]; var UP = [38]; var RIGHT = [39]; var DOWN = [40]; var cyclePrev = function (values, index, predicate) { var before = reverse(values.slice(0, index)); var after = reverse(values.slice(index + 1)); return find$5(before.concat(after), predicate); }; var tryPrev = function (values, index, predicate) { var before = reverse(values.slice(0, index)); return find$5(before, predicate); }; var cycleNext = function (values, index, predicate) { var before = values.slice(0, index); var after = values.slice(index + 1); return find$5(after.concat(before), predicate); }; var tryNext = function (values, index, predicate) { var after = values.slice(index + 1); return find$5(after, predicate); }; var inSet = function (keys) { return function (event) { var raw = event.raw; return contains$2(keys, raw.which); }; }; var and = function (preds) { return function (event) { return forall(preds, function (pred) { return pred(event); }); }; }; var isShift = function (event) { var raw = event.raw; return raw.shiftKey === true; }; var isControl = function (event) { var raw = event.raw; return raw.ctrlKey === true; }; var isNotShift = not(isShift); var rule = function (matches, action) { return { matches: matches, classification: action }; }; var choose = function (transitions, event) { var transition = find$5(transitions, function (t) { return t.matches(event); }); return transition.map(function (t) { return t.classification; }); }; var reportFocusShifting = function (component, prevFocus, newFocus) { var noChange = prevFocus.exists(function (p) { return newFocus.exists(function (n) { return eq(n, p); }); }); if (!noChange) { emitWith(component, focusShifted(), { prevFocus: prevFocus, newFocus: newFocus }); } }; var dom$2 = function () { var get = function (component) { return search(component.element); }; var set = function (component, focusee) { var prevFocus = get(component); component.getSystem().triggerFocus(focusee, component.element); var newFocus = get(component); reportFocusShifting(component, prevFocus, newFocus); }; return { get: get, set: set }; }; var highlights = function () { var get = function (component) { return Highlighting.getHighlighted(component).map(function (item) { return item.element; }); }; var set = function (component, element) { var prevFocus = get(component); component.getSystem().getByDom(element).fold(noop, function (item) { Highlighting.highlight(component, item); }); var newFocus = get(component); reportFocusShifting(component, prevFocus, newFocus); }; return { get: get, set: set }; }; var FocusInsideModes; (function (FocusInsideModes) { FocusInsideModes['OnFocusMode'] = 'onFocus'; FocusInsideModes['OnEnterOrSpaceMode'] = 'onEnterOrSpace'; FocusInsideModes['OnApiMode'] = 'onApi'; }(FocusInsideModes || (FocusInsideModes = {}))); var typical = function (infoSchema, stateInit, getKeydownRules, getKeyupRules, optFocusIn) { var schema = function () { return infoSchema.concat([ defaulted('focusManager', dom$2()), defaultedOf('focusInside', 'onFocus', valueOf(function (val) { return contains$2([ 'onFocus', 'onEnterOrSpace', 'onApi' ], val) ? Result.value(val) : Result.error('Invalid value for focusInside'); })), output$1('handler', me), output$1('state', stateInit), output$1('sendFocusIn', optFocusIn) ]); }; var processKey = function (component, simulatedEvent, getRules, keyingConfig, keyingState) { var rules = getRules(component, simulatedEvent, keyingConfig, keyingState); return choose(rules, simulatedEvent.event).bind(function (rule) { return rule(component, simulatedEvent, keyingConfig, keyingState); }); }; var toEvents = function (keyingConfig, keyingState) { var onFocusHandler = keyingConfig.focusInside !== FocusInsideModes.OnFocusMode ? Optional.none() : optFocusIn(keyingConfig).map(function (focusIn) { return run$1(focus$4(), function (component, simulatedEvent) { focusIn(component, keyingConfig, keyingState); simulatedEvent.stop(); }); }); var tryGoInsideComponent = function (component, simulatedEvent) { var isEnterOrSpace = inSet(SPACE.concat(ENTER))(simulatedEvent.event); if (keyingConfig.focusInside === FocusInsideModes.OnEnterOrSpaceMode && isEnterOrSpace && isSource(component, simulatedEvent)) { optFocusIn(keyingConfig).each(function (focusIn) { focusIn(component, keyingConfig, keyingState); simulatedEvent.stop(); }); } }; var keyboardEvents = [ run$1(keydown(), function (component, simulatedEvent) { processKey(component, simulatedEvent, getKeydownRules, keyingConfig, keyingState).fold(function () { tryGoInsideComponent(component, simulatedEvent); }, function (_) { simulatedEvent.stop(); }); }), run$1(keyup(), function (component, simulatedEvent) { processKey(component, simulatedEvent, getKeyupRules, keyingConfig, keyingState).each(function (_) { simulatedEvent.stop(); }); }) ]; return derive$2(onFocusHandler.toArray().concat(keyboardEvents)); }; var me = { schema: schema, processKey: processKey, toEvents: toEvents }; return me; }; var create$6 = function (cyclicField) { var schema = [ option('onEscape'), option('onEnter'), defaulted('selector', '[data-alloy-tabstop="true"]:not(:disabled)'), defaulted('firstTabstop', 0), defaulted('useTabstopAt', always), option('visibilitySelector') ].concat([cyclicField]); var isVisible = function (tabbingConfig, element) { var target = tabbingConfig.visibilitySelector.bind(function (sel) { return closest$1(element, sel); }).getOr(element); return get$b(target) > 0; }; var findInitial = function (component, tabbingConfig) { var tabstops = descendants(component.element, tabbingConfig.selector); var visibles = filter$2(tabstops, function (elem) { return isVisible(tabbingConfig, elem); }); return Optional.from(visibles[tabbingConfig.firstTabstop]); }; var findCurrent = function (component, tabbingConfig) { return tabbingConfig.focusManager.get(component).bind(function (elem) { return closest$1(elem, tabbingConfig.selector); }); }; var isTabstop = function (tabbingConfig, element) { return isVisible(tabbingConfig, element) && tabbingConfig.useTabstopAt(element); }; var focusIn = function (component, tabbingConfig, _tabbingState) { findInitial(component, tabbingConfig).each(function (target) { tabbingConfig.focusManager.set(component, target); }); }; var goFromTabstop = function (component, tabstops, stopIndex, tabbingConfig, cycle) { return cycle(tabstops, stopIndex, function (elem) { return isTabstop(tabbingConfig, elem); }).fold(function () { return tabbingConfig.cyclic ? Optional.some(true) : Optional.none(); }, function (target) { tabbingConfig.focusManager.set(component, target); return Optional.some(true); }); }; var go = function (component, _simulatedEvent, tabbingConfig, cycle) { var tabstops = descendants(component.element, tabbingConfig.selector); return findCurrent(component, tabbingConfig).bind(function (tabstop) { var optStopIndex = findIndex$1(tabstops, curry(eq, tabstop)); return optStopIndex.bind(function (stopIndex) { return goFromTabstop(component, tabstops, stopIndex, tabbingConfig, cycle); }); }); }; var goBackwards = function (component, simulatedEvent, tabbingConfig) { var navigate = tabbingConfig.cyclic ? cyclePrev : tryPrev; return go(component, simulatedEvent, tabbingConfig, navigate); }; var goForwards = function (component, simulatedEvent, tabbingConfig) { var navigate = tabbingConfig.cyclic ? cycleNext : tryNext; return go(component, simulatedEvent, tabbingConfig, navigate); }; var execute = function (component, simulatedEvent, tabbingConfig) { return tabbingConfig.onEnter.bind(function (f) { return f(component, simulatedEvent); }); }; var exit = function (component, simulatedEvent, tabbingConfig) { return tabbingConfig.onEscape.bind(function (f) { return f(component, simulatedEvent); }); }; var getKeydownRules = constant$1([ rule(and([ isShift, inSet(TAB) ]), goBackwards), rule(inSet(TAB), goForwards), rule(inSet(ESCAPE), exit), rule(and([ isNotShift, inSet(ENTER) ]), execute) ]); var getKeyupRules = constant$1([]); return typical(schema, NoState.init, getKeydownRules, getKeyupRules, function () { return Optional.some(focusIn); }); }; var AcyclicType = create$6(customField('cyclic', never)); var CyclicType = create$6(customField('cyclic', always)); var doDefaultExecute = function (component, _simulatedEvent, focused) { dispatch(component, focused, execute$5()); return Optional.some(true); }; var defaultExecute = function (component, simulatedEvent, focused) { var isComplex = inside(focused) && inSet(SPACE)(simulatedEvent.event); return isComplex ? Optional.none() : doDefaultExecute(component, simulatedEvent, focused); }; var stopEventForFirefox = function (_component, _simulatedEvent) { return Optional.some(true); }; var schema$v = [ defaulted('execute', defaultExecute), defaulted('useSpace', false), defaulted('useEnter', true), defaulted('useControlEnter', false), defaulted('useDown', false) ]; var execute$4 = function (component, simulatedEvent, executeConfig) { return executeConfig.execute(component, simulatedEvent, component.element); }; var getKeydownRules$5 = function (component, _simulatedEvent, executeConfig, _executeState) { var spaceExec = executeConfig.useSpace && !inside(component.element) ? SPACE : []; var enterExec = executeConfig.useEnter ? ENTER : []; var downExec = executeConfig.useDown ? DOWN : []; var execKeys = spaceExec.concat(enterExec).concat(downExec); return [rule(inSet(execKeys), execute$4)].concat(executeConfig.useControlEnter ? [rule(and([ isControl, inSet(ENTER) ]), execute$4)] : []); }; var getKeyupRules$5 = function (component, _simulatedEvent, executeConfig, _executeState) { return executeConfig.useSpace && !inside(component.element) ? [rule(inSet(SPACE), stopEventForFirefox)] : []; }; var ExecutionType = typical(schema$v, NoState.init, getKeydownRules$5, getKeyupRules$5, function () { return Optional.none(); }); var flatgrid$1 = function () { var dimensions = value$1(); var setGridSize = function (numRows, numColumns) { dimensions.set({ numRows: numRows, numColumns: numColumns }); }; var getNumRows = function () { return dimensions.get().map(function (d) { return d.numRows; }); }; var getNumColumns = function () { return dimensions.get().map(function (d) { return d.numColumns; }); }; return nu$8({ readState: function () { return dimensions.get().map(function (d) { return { numRows: String(d.numRows), numColumns: String(d.numColumns) }; }).getOr({ numRows: '?', numColumns: '?' }); }, setGridSize: setGridSize, getNumRows: getNumRows, getNumColumns: getNumColumns }); }; var init$d = function (spec) { return spec.state(spec); }; var KeyingState = /*#__PURE__*/Object.freeze({ __proto__: null, flatgrid: flatgrid$1, init: init$d }); var useH = function (movement) { return function (component, simulatedEvent, config, state) { var move = movement(component.element); return use(move, component, simulatedEvent, config, state); }; }; var west$1 = function (moveLeft, moveRight) { var movement = onDirection(moveLeft, moveRight); return useH(movement); }; var east$1 = function (moveLeft, moveRight) { var movement = onDirection(moveRight, moveLeft); return useH(movement); }; var useV = function (move) { return function (component, simulatedEvent, config, state) { return use(move, component, simulatedEvent, config, state); }; }; var use = function (move, component, simulatedEvent, config, state) { var outcome = config.focusManager.get(component).bind(function (focused) { return move(component.element, focused, config, state); }); return outcome.map(function (newFocus) { config.focusManager.set(component, newFocus); return true; }); }; var north$1 = useV; var south$1 = useV; var move$1 = useV; var isHidden$1 = function (dom) { return dom.offsetWidth <= 0 && dom.offsetHeight <= 0; }; var isVisible = function (element) { return !isHidden$1(element.dom); }; var locate = function (candidates, predicate) { return findIndex$1(candidates, predicate).map(function (index) { return { index: index, candidates: candidates }; }); }; var locateVisible = function (container, current, selector) { var predicate = function (x) { return eq(x, current); }; var candidates = descendants(container, selector); var visible = filter$2(candidates, isVisible); return locate(visible, predicate); }; var findIndex = function (elements, target) { return findIndex$1(elements, function (elem) { return eq(target, elem); }); }; var withGrid = function (values, index, numCols, f) { var oldRow = Math.floor(index / numCols); var oldColumn = index % numCols; return f(oldRow, oldColumn).bind(function (address) { var newIndex = address.row * numCols + address.column; return newIndex >= 0 && newIndex < values.length ? Optional.some(values[newIndex]) : Optional.none(); }); }; var cycleHorizontal$1 = function (values, index, numRows, numCols, delta) { return withGrid(values, index, numCols, function (oldRow, oldColumn) { var onLastRow = oldRow === numRows - 1; var colsInRow = onLastRow ? values.length - oldRow * numCols : numCols; var newColumn = cycleBy(oldColumn, delta, 0, colsInRow - 1); return Optional.some({ row: oldRow, column: newColumn }); }); }; var cycleVertical$1 = function (values, index, numRows, numCols, delta) { return withGrid(values, index, numCols, function (oldRow, oldColumn) { var newRow = cycleBy(oldRow, delta, 0, numRows - 1); var onLastRow = newRow === numRows - 1; var colsInRow = onLastRow ? values.length - newRow * numCols : numCols; var newCol = clamp$1(oldColumn, 0, colsInRow - 1); return Optional.some({ row: newRow, column: newCol }); }); }; var cycleRight$1 = function (values, index, numRows, numCols) { return cycleHorizontal$1(values, index, numRows, numCols, +1); }; var cycleLeft$1 = function (values, index, numRows, numCols) { return cycleHorizontal$1(values, index, numRows, numCols, -1); }; var cycleUp$1 = function (values, index, numRows, numCols) { return cycleVertical$1(values, index, numRows, numCols, -1); }; var cycleDown$1 = function (values, index, numRows, numCols) { return cycleVertical$1(values, index, numRows, numCols, +1); }; var schema$u = [ required$1('selector'), defaulted('execute', defaultExecute), onKeyboardHandler('onEscape'), defaulted('captureTab', false), initSize() ]; var focusIn$3 = function (component, gridConfig, _gridState) { descendant(component.element, gridConfig.selector).each(function (first) { gridConfig.focusManager.set(component, first); }); }; var findCurrent$1 = function (component, gridConfig) { return gridConfig.focusManager.get(component).bind(function (elem) { return closest$1(elem, gridConfig.selector); }); }; var execute$3 = function (component, simulatedEvent, gridConfig, _gridState) { return findCurrent$1(component, gridConfig).bind(function (focused) { return gridConfig.execute(component, simulatedEvent, focused); }); }; var doMove$2 = function (cycle) { return function (element, focused, gridConfig, gridState) { return locateVisible(element, focused, gridConfig.selector).bind(function (identified) { return cycle(identified.candidates, identified.index, gridState.getNumRows().getOr(gridConfig.initSize.numRows), gridState.getNumColumns().getOr(gridConfig.initSize.numColumns)); }); }; }; var handleTab = function (_component, _simulatedEvent, gridConfig) { return gridConfig.captureTab ? Optional.some(true) : Optional.none(); }; var doEscape$1 = function (component, simulatedEvent, gridConfig) { return gridConfig.onEscape(component, simulatedEvent); }; var moveLeft$3 = doMove$2(cycleLeft$1); var moveRight$3 = doMove$2(cycleRight$1); var moveNorth$1 = doMove$2(cycleUp$1); var moveSouth$1 = doMove$2(cycleDown$1); var getKeydownRules$4 = constant$1([ rule(inSet(LEFT), west$1(moveLeft$3, moveRight$3)), rule(inSet(RIGHT), east$1(moveLeft$3, moveRight$3)), rule(inSet(UP), north$1(moveNorth$1)), rule(inSet(DOWN), south$1(moveSouth$1)), rule(and([ isShift, inSet(TAB) ]), handleTab), rule(and([ isNotShift, inSet(TAB) ]), handleTab), rule(inSet(ESCAPE), doEscape$1), rule(inSet(SPACE.concat(ENTER)), execute$3) ]); var getKeyupRules$4 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]); var FlatgridType = typical(schema$u, flatgrid$1, getKeydownRules$4, getKeyupRules$4, function () { return Optional.some(focusIn$3); }); var horizontal = function (container, selector, current, delta) { var isDisabledButton = function (candidate) { return name$2(candidate) === 'button' && get$d(candidate, 'disabled') === 'disabled'; }; var tryCycle = function (initial, index, candidates) { var newIndex = cycleBy(index, delta, 0, candidates.length - 1); if (newIndex === initial) { return Optional.none(); } else { return isDisabledButton(candidates[newIndex]) ? tryCycle(initial, newIndex, candidates) : Optional.from(candidates[newIndex]); } }; return locateVisible(container, current, selector).bind(function (identified) { var index = identified.index; var candidates = identified.candidates; return tryCycle(index, index, candidates); }); }; var schema$t = [ required$1('selector'), defaulted('getInitial', Optional.none), defaulted('execute', defaultExecute), onKeyboardHandler('onEscape'), defaulted('executeOnMove', false), defaulted('allowVertical', true) ]; var findCurrent = function (component, flowConfig) { return flowConfig.focusManager.get(component).bind(function (elem) { return closest$1(elem, flowConfig.selector); }); }; var execute$2 = function (component, simulatedEvent, flowConfig) { return findCurrent(component, flowConfig).bind(function (focused) { return flowConfig.execute(component, simulatedEvent, focused); }); }; var focusIn$2 = function (component, flowConfig, _state) { flowConfig.getInitial(component).orThunk(function () { return descendant(component.element, flowConfig.selector); }).each(function (first) { flowConfig.focusManager.set(component, first); }); }; var moveLeft$2 = function (element, focused, info) { return horizontal(element, info.selector, focused, -1); }; var moveRight$2 = function (element, focused, info) { return horizontal(element, info.selector, focused, +1); }; var doMove$1 = function (movement) { return function (component, simulatedEvent, flowConfig, flowState) { return movement(component, simulatedEvent, flowConfig, flowState).bind(function () { return flowConfig.executeOnMove ? execute$2(component, simulatedEvent, flowConfig) : Optional.some(true); }); }; }; var doEscape = function (component, simulatedEvent, flowConfig) { return flowConfig.onEscape(component, simulatedEvent); }; var getKeydownRules$3 = function (_component, _se, flowConfig, _flowState) { var westMovers = LEFT.concat(flowConfig.allowVertical ? UP : []); var eastMovers = RIGHT.concat(flowConfig.allowVertical ? DOWN : []); return [ rule(inSet(westMovers), doMove$1(west$1(moveLeft$2, moveRight$2))), rule(inSet(eastMovers), doMove$1(east$1(moveLeft$2, moveRight$2))), rule(inSet(ENTER), execute$2), rule(inSet(SPACE), execute$2), rule(inSet(ESCAPE), doEscape) ]; }; var getKeyupRules$3 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]); var FlowType = typical(schema$t, NoState.init, getKeydownRules$3, getKeyupRules$3, function () { return Optional.some(focusIn$2); }); var toCell = function (matrix, rowIndex, columnIndex) { return Optional.from(matrix[rowIndex]).bind(function (row) { return Optional.from(row[columnIndex]).map(function (cell) { return { rowIndex: rowIndex, columnIndex: columnIndex, cell: cell }; }); }); }; var cycleHorizontal = function (matrix, rowIndex, startCol, deltaCol) { var row = matrix[rowIndex]; var colsInRow = row.length; var newColIndex = cycleBy(startCol, deltaCol, 0, colsInRow - 1); return toCell(matrix, rowIndex, newColIndex); }; var cycleVertical = function (matrix, colIndex, startRow, deltaRow) { var nextRowIndex = cycleBy(startRow, deltaRow, 0, matrix.length - 1); var colsInNextRow = matrix[nextRowIndex].length; var nextColIndex = clamp$1(colIndex, 0, colsInNextRow - 1); return toCell(matrix, nextRowIndex, nextColIndex); }; var moveHorizontal = function (matrix, rowIndex, startCol, deltaCol) { var row = matrix[rowIndex]; var colsInRow = row.length; var newColIndex = clamp$1(startCol + deltaCol, 0, colsInRow - 1); return toCell(matrix, rowIndex, newColIndex); }; var moveVertical = function (matrix, colIndex, startRow, deltaRow) { var nextRowIndex = clamp$1(startRow + deltaRow, 0, matrix.length - 1); var colsInNextRow = matrix[nextRowIndex].length; var nextColIndex = clamp$1(colIndex, 0, colsInNextRow - 1); return toCell(matrix, nextRowIndex, nextColIndex); }; var cycleRight = function (matrix, startRow, startCol) { return cycleHorizontal(matrix, startRow, startCol, +1); }; var cycleLeft = function (matrix, startRow, startCol) { return cycleHorizontal(matrix, startRow, startCol, -1); }; var cycleUp = function (matrix, startRow, startCol) { return cycleVertical(matrix, startCol, startRow, -1); }; var cycleDown = function (matrix, startRow, startCol) { return cycleVertical(matrix, startCol, startRow, +1); }; var moveLeft$1 = function (matrix, startRow, startCol) { return moveHorizontal(matrix, startRow, startCol, -1); }; var moveRight$1 = function (matrix, startRow, startCol) { return moveHorizontal(matrix, startRow, startCol, +1); }; var moveUp$1 = function (matrix, startRow, startCol) { return moveVertical(matrix, startCol, startRow, -1); }; var moveDown$1 = function (matrix, startRow, startCol) { return moveVertical(matrix, startCol, startRow, +1); }; var schema$s = [ requiredObjOf('selectors', [ required$1('row'), required$1('cell') ]), defaulted('cycles', true), defaulted('previousSelector', Optional.none), defaulted('execute', defaultExecute) ]; var focusIn$1 = function (component, matrixConfig, _state) { var focused = matrixConfig.previousSelector(component).orThunk(function () { var selectors = matrixConfig.selectors; return descendant(component.element, selectors.cell); }); focused.each(function (cell) { matrixConfig.focusManager.set(component, cell); }); }; var execute$1 = function (component, simulatedEvent, matrixConfig) { return search(component.element).bind(function (focused) { return matrixConfig.execute(component, simulatedEvent, focused); }); }; var toMatrix = function (rows, matrixConfig) { return map$2(rows, function (row) { return descendants(row, matrixConfig.selectors.cell); }); }; var doMove = function (ifCycle, ifMove) { return function (element, focused, matrixConfig) { var move = matrixConfig.cycles ? ifCycle : ifMove; return closest$1(focused, matrixConfig.selectors.row).bind(function (inRow) { var cellsInRow = descendants(inRow, matrixConfig.selectors.cell); return findIndex(cellsInRow, focused).bind(function (colIndex) { var allRows = descendants(element, matrixConfig.selectors.row); return findIndex(allRows, inRow).bind(function (rowIndex) { var matrix = toMatrix(allRows, matrixConfig); return move(matrix, rowIndex, colIndex).map(function (next) { return next.cell; }); }); }); }); }; }; var moveLeft = doMove(cycleLeft, moveLeft$1); var moveRight = doMove(cycleRight, moveRight$1); var moveNorth = doMove(cycleUp, moveUp$1); var moveSouth = doMove(cycleDown, moveDown$1); var getKeydownRules$2 = constant$1([ rule(inSet(LEFT), west$1(moveLeft, moveRight)), rule(inSet(RIGHT), east$1(moveLeft, moveRight)), rule(inSet(UP), north$1(moveNorth)), rule(inSet(DOWN), south$1(moveSouth)), rule(inSet(SPACE.concat(ENTER)), execute$1) ]); var getKeyupRules$2 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]); var MatrixType = typical(schema$s, NoState.init, getKeydownRules$2, getKeyupRules$2, function () { return Optional.some(focusIn$1); }); var schema$r = [ required$1('selector'), defaulted('execute', defaultExecute), defaulted('moveOnTab', false) ]; var execute = function (component, simulatedEvent, menuConfig) { return menuConfig.focusManager.get(component).bind(function (focused) { return menuConfig.execute(component, simulatedEvent, focused); }); }; var focusIn = function (component, menuConfig, _state) { descendant(component.element, menuConfig.selector).each(function (first) { menuConfig.focusManager.set(component, first); }); }; var moveUp = function (element, focused, info) { return horizontal(element, info.selector, focused, -1); }; var moveDown = function (element, focused, info) { return horizontal(element, info.selector, focused, +1); }; var fireShiftTab = function (component, simulatedEvent, menuConfig, menuState) { return menuConfig.moveOnTab ? move$1(moveUp)(component, simulatedEvent, menuConfig, menuState) : Optional.none(); }; var fireTab = function (component, simulatedEvent, menuConfig, menuState) { return menuConfig.moveOnTab ? move$1(moveDown)(component, simulatedEvent, menuConfig, menuState) : Optional.none(); }; var getKeydownRules$1 = constant$1([ rule(inSet(UP), move$1(moveUp)), rule(inSet(DOWN), move$1(moveDown)), rule(and([ isShift, inSet(TAB) ]), fireShiftTab), rule(and([ isNotShift, inSet(TAB) ]), fireTab), rule(inSet(ENTER), execute), rule(inSet(SPACE), execute) ]); var getKeyupRules$1 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]); var MenuType = typical(schema$r, NoState.init, getKeydownRules$1, getKeyupRules$1, function () { return Optional.some(focusIn); }); var schema$q = [ onKeyboardHandler('onSpace'), onKeyboardHandler('onEnter'), onKeyboardHandler('onShiftEnter'), onKeyboardHandler('onLeft'), onKeyboardHandler('onRight'), onKeyboardHandler('onTab'), onKeyboardHandler('onShiftTab'), onKeyboardHandler('onUp'), onKeyboardHandler('onDown'), onKeyboardHandler('onEscape'), defaulted('stopSpaceKeyup', false), option('focusIn') ]; var getKeydownRules = function (component, simulatedEvent, specialInfo) { return [ rule(inSet(SPACE), specialInfo.onSpace), rule(and([ isNotShift, inSet(ENTER) ]), specialInfo.onEnter), rule(and([ isShift, inSet(ENTER) ]), specialInfo.onShiftEnter), rule(and([ isShift, inSet(TAB) ]), specialInfo.onShiftTab), rule(and([ isNotShift, inSet(TAB) ]), specialInfo.onTab), rule(inSet(UP), specialInfo.onUp), rule(inSet(DOWN), specialInfo.onDown), rule(inSet(LEFT), specialInfo.onLeft), rule(inSet(RIGHT), specialInfo.onRight), rule(inSet(SPACE), specialInfo.onSpace), rule(inSet(ESCAPE), specialInfo.onEscape) ]; }; var getKeyupRules = function (component, simulatedEvent, specialInfo) { return specialInfo.stopSpaceKeyup ? [rule(inSet(SPACE), stopEventForFirefox)] : []; }; var SpecialType = typical(schema$q, NoState.init, getKeydownRules, getKeyupRules, function (specialInfo) { return specialInfo.focusIn; }); var acyclic = AcyclicType.schema(); var cyclic = CyclicType.schema(); var flow = FlowType.schema(); var flatgrid = FlatgridType.schema(); var matrix = MatrixType.schema(); var execution = ExecutionType.schema(); var menu = MenuType.schema(); var special = SpecialType.schema(); var KeyboardBranches = /*#__PURE__*/Object.freeze({ __proto__: null, acyclic: acyclic, cyclic: cyclic, flow: flow, flatgrid: flatgrid, matrix: matrix, execution: execution, menu: menu, special: special }); var isFlatgridState = function (keyState) { return hasNonNullableKey(keyState, 'setGridSize'); }; var Keying = createModes({ branchKey: 'mode', branches: KeyboardBranches, name: 'keying', active: { events: function (keyingConfig, keyingState) { var handler = keyingConfig.handler; return handler.toEvents(keyingConfig, keyingState); } }, apis: { focusIn: function (component, keyConfig, keyState) { keyConfig.sendFocusIn(keyConfig).fold(function () { component.getSystem().triggerFocus(component.element, component.element); }, function (sendFocusIn) { sendFocusIn(component, keyConfig, keyState); }); }, setGridSize: function (component, keyConfig, keyState, numRows, numColumns) { if (!isFlatgridState(keyState)) { console.error('Layout does not support setGridSize'); } else { keyState.setGridSize(numRows, numColumns); } } }, state: KeyingState }); var set$2 = function (component, replaceConfig, replaceState, data) { preserve$1(function () { var newChildren = map$2(data, component.getSystem().build); replaceChildren(component, newChildren); }, component.element); }; var insert = function (component, replaceConfig, insertion, childSpec) { var child = component.getSystem().build(childSpec); attachWith(component, child, insertion); }; var append = function (component, replaceConfig, replaceState, appendee) { insert(component, replaceConfig, append$2, appendee); }; var prepend = function (component, replaceConfig, replaceState, prependee) { insert(component, replaceConfig, prepend$1, prependee); }; var remove = function (component, replaceConfig, replaceState, removee) { var children = contents(component); var foundChild = find$5(children, function (child) { return eq(removee.element, child.element); }); foundChild.each(detach); }; var contents = function (component, _replaceConfig) { return component.components(); }; var replaceAt = function (component, replaceConfig, replaceState, replaceeIndex, replacer) { var children = contents(component); return Optional.from(children[replaceeIndex]).map(function (replacee) { remove(component, replaceConfig, replaceState, replacee); replacer.each(function (r) { insert(component, replaceConfig, function (p, c) { appendAt(p, c, replaceeIndex); }, r); }); return replacee; }); }; var replaceBy = function (component, replaceConfig, replaceState, replaceePred, replacer) { var children = contents(component); return findIndex$1(children, replaceePred).bind(function (replaceeIndex) { return replaceAt(component, replaceConfig, replaceState, replaceeIndex, replacer); }); }; var ReplaceApis = /*#__PURE__*/Object.freeze({ __proto__: null, append: append, prepend: prepend, remove: remove, replaceAt: replaceAt, replaceBy: replaceBy, set: set$2, contents: contents }); var Replacing = create$8({ fields: [], name: 'replacing', apis: ReplaceApis }); var events$d = function (name, eventHandlers) { var events = derive$2(eventHandlers); return create$8({ fields: [required$1('enabled')], name: name, active: { events: constant$1(events) } }); }; var config = function (name, eventHandlers) { var me = events$d(name, eventHandlers); return { key: name, value: { config: {}, me: me, configAsRaw: constant$1({}), initialConfig: {}, state: NoState } }; }; var focus$2 = function (component, focusConfig) { if (!focusConfig.ignore) { focus$3(component.element); focusConfig.onFocus(component); } }; var blur = function (component, focusConfig) { if (!focusConfig.ignore) { blur$1(component.element); } }; var isFocused = function (component) { return hasFocus(component.element); }; var FocusApis = /*#__PURE__*/Object.freeze({ __proto__: null, focus: focus$2, blur: blur, isFocused: isFocused }); var exhibit$4 = function (base, focusConfig) { var mod = focusConfig.ignore ? {} : { attributes: { tabindex: '-1' } }; return nu$7(mod); }; var events$c = function (focusConfig) { return derive$2([run$1(focus$4(), function (component, simulatedEvent) { focus$2(component, focusConfig); simulatedEvent.stop(); })].concat(focusConfig.stopMousedown ? [run$1(mousedown(), function (_, simulatedEvent) { simulatedEvent.event.prevent(); })] : [])); }; var ActiveFocus = /*#__PURE__*/Object.freeze({ __proto__: null, exhibit: exhibit$4, events: events$c }); var FocusSchema = [ onHandler('onFocus'), defaulted('stopMousedown', false), defaulted('ignore', false) ]; var Focusing = create$8({ fields: FocusSchema, name: 'focusing', active: ActiveFocus, apis: FocusApis }); var SetupBehaviourCellState = function (initialState) { var init = function () { var cell = Cell(initialState); var get = function () { return cell.get(); }; var set = function (newState) { return cell.set(newState); }; var clear = function () { return cell.set(initialState); }; var readState = function () { return cell.get(); }; return { get: get, set: set, clear: clear, readState: readState }; }; return { init: init }; }; var updateAriaState = function (component, toggleConfig, toggleState) { var ariaInfo = toggleConfig.aria; ariaInfo.update(component, ariaInfo, toggleState.get()); }; var updateClass = function (component, toggleConfig, toggleState) { toggleConfig.toggleClass.each(function (toggleClass) { if (toggleState.get()) { add$2(component.element, toggleClass); } else { remove$2(component.element, toggleClass); } }); }; var toggle$2 = function (component, toggleConfig, toggleState) { set$1(component, toggleConfig, toggleState, !toggleState.get()); }; var on = function (component, toggleConfig, toggleState) { toggleState.set(true); updateClass(component, toggleConfig, toggleState); updateAriaState(component, toggleConfig, toggleState); }; var off = function (component, toggleConfig, toggleState) { toggleState.set(false); updateClass(component, toggleConfig, toggleState); updateAriaState(component, toggleConfig, toggleState); }; var set$1 = function (component, toggleConfig, toggleState, state) { var action = state ? on : off; action(component, toggleConfig, toggleState); }; var isOn = function (component, toggleConfig, toggleState) { return toggleState.get(); }; var onLoad = function (component, toggleConfig, toggleState) { set$1(component, toggleConfig, toggleState, toggleConfig.selected); }; var ToggleApis = /*#__PURE__*/Object.freeze({ __proto__: null, onLoad: onLoad, toggle: toggle$2, isOn: isOn, on: on, off: off, set: set$1 }); var exhibit$3 = function () { return nu$7({}); }; var events$b = function (toggleConfig, toggleState) { var execute = executeEvent(toggleConfig, toggleState, toggle$2); var load = loadEvent(toggleConfig, toggleState, onLoad); return derive$2(flatten([ toggleConfig.toggleOnExecute ? [execute] : [], [load] ])); }; var ActiveToggle = /*#__PURE__*/Object.freeze({ __proto__: null, exhibit: exhibit$3, events: events$b }); var updatePressed = function (component, ariaInfo, status) { set$8(component.element, 'aria-pressed', status); if (ariaInfo.syncWithExpanded) { updateExpanded(component, ariaInfo, status); } }; var updateSelected = function (component, ariaInfo, status) { set$8(component.element, 'aria-selected', status); }; var updateChecked = function (component, ariaInfo, status) { set$8(component.element, 'aria-checked', status); }; var updateExpanded = function (component, ariaInfo, status) { set$8(component.element, 'aria-expanded', status); }; var ToggleSchema = [ defaulted('selected', false), option('toggleClass'), defaulted('toggleOnExecute', true), defaultedOf('aria', { mode: 'none' }, choose$1('mode', { pressed: [ defaulted('syncWithExpanded', false), output$1('update', updatePressed) ], checked: [output$1('update', updateChecked)], expanded: [output$1('update', updateExpanded)], selected: [output$1('update', updateSelected)], none: [output$1('update', noop)] })) ]; var Toggling = create$8({ fields: ToggleSchema, name: 'toggling', active: ActiveToggle, apis: ToggleApis, state: SetupBehaviourCellState(false) }); var pointerEvents = function () { var onClick = function (component, simulatedEvent) { simulatedEvent.stop(); emitExecute(component); }; return [ run$1(click(), onClick), run$1(tap(), onClick), cutter(touchstart()), cutter(mousedown()) ]; }; var events$a = function (optAction) { var executeHandler = function (action) { return runOnExecute$1(function (component, simulatedEvent) { action(component); simulatedEvent.stop(); }); }; return derive$2(flatten([ optAction.map(executeHandler).toArray(), pointerEvents() ])); }; var hoverEvent = 'alloy.item-hover'; var focusEvent = 'alloy.item-focus'; var onHover = function (item) { if (search(item.element).isNone() || Focusing.isFocused(item)) { if (!Focusing.isFocused(item)) { Focusing.focus(item); } emitWith(item, hoverEvent, { item: item }); } }; var onFocus$1 = function (item) { emitWith(item, focusEvent, { item: item }); }; var hover = constant$1(hoverEvent); var focus$1 = constant$1(focusEvent); var builder$2 = function (detail) { return { dom: detail.dom, 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 } : {}) }), behaviours: SketchBehaviours.augment(detail.itemBehaviours, [ detail.toggling.fold(Toggling.revoke, function (tConfig) { return Toggling.config(__assign({ aria: { mode: 'checked' } }, tConfig)); }), Focusing.config({ ignore: detail.ignoreFocus, stopMousedown: detail.ignoreFocus, onFocus: function (component) { onFocus$1(component); } }), Keying.config({ mode: 'execution' }), Representing.config({ store: { mode: 'memory', initialValue: detail.data } }), config('item-type-events', __spreadArray(__spreadArray([], pointerEvents(), true), [ run$1(mouseover(), onHover), run$1(focusItem(), Focusing.focus) ], false)) ]), components: detail.components, eventOrder: detail.eventOrder }; }; var schema$p = [ required$1('data'), required$1('components'), required$1('dom'), defaulted('hasSubmenu', false), option('toggling'), SketchBehaviours.field('itemBehaviours', [ Toggling, Focusing, Keying, Representing ]), defaulted('ignoreFocus', false), defaulted('domModification', {}), output$1('builder', builder$2), defaulted('eventOrder', {}) ]; var builder$1 = function (detail) { return { dom: detail.dom, components: detail.components, events: derive$2([stopper(focusItem())]) }; }; var schema$o = [ required$1('dom'), required$1('components'), output$1('builder', builder$1) ]; var owner$2 = constant$1('item-widget'); var parts$h = constant$1([required({ name: 'widget', overrides: function (detail) { return { behaviours: derive$1([Representing.config({ store: { mode: 'manual', getValue: function (_component) { return detail.data; }, setValue: noop } })]) }; } })]); var builder = function (detail) { var subs = substitutes(owner$2(), detail, parts$h()); var components = components$1(owner$2(), detail, subs.internals()); var focusWidget = function (component) { return getPart(component, detail, 'widget').map(function (widget) { Keying.focusIn(widget); return widget; }); }; var onHorizontalArrow = function (component, simulatedEvent) { return inside(simulatedEvent.event.target) ? Optional.none() : function () { if (detail.autofocus) { simulatedEvent.setSource(component.element); return Optional.none(); } else { return Optional.none(); } }(); }; return { dom: detail.dom, components: components, domModification: detail.domModification, events: derive$2([ runOnExecute$1(function (component, simulatedEvent) { focusWidget(component).each(function (_widget) { simulatedEvent.stop(); }); }), run$1(mouseover(), onHover), run$1(focusItem(), function (component, _simulatedEvent) { if (detail.autofocus) { focusWidget(component); } else { Focusing.focus(component); } }) ]), behaviours: SketchBehaviours.augment(detail.widgetBehaviours, [ Representing.config({ store: { mode: 'memory', initialValue: detail.data } }), Focusing.config({ ignore: detail.ignoreFocus, onFocus: function (component) { onFocus$1(component); } }), Keying.config({ mode: 'special', focusIn: detail.autofocus ? function (component) { focusWidget(component); } : revoke(), onLeft: onHorizontalArrow, onRight: onHorizontalArrow, onEscape: function (component, simulatedEvent) { if (!Focusing.isFocused(component) && !detail.autofocus) { Focusing.focus(component); return Optional.some(true); } else if (detail.autofocus) { simulatedEvent.setSource(component.element); return Optional.none(); } else { return Optional.none(); } } }) ]) }; }; var schema$n = [ required$1('uid'), required$1('data'), required$1('components'), required$1('dom'), defaulted('autofocus', false), defaulted('ignoreFocus', false), SketchBehaviours.field('widgetBehaviours', [ Representing, Focusing, Keying ]), defaulted('domModification', {}), defaultUidsSchema(parts$h()), output$1('builder', builder) ]; var itemSchema$2 = choose$1('type', { widget: schema$n, item: schema$p, separator: schema$o }); var configureGrid = function (detail, movementInfo) { return { mode: 'flatgrid', selector: '.' + detail.markers.item, initSize: { numColumns: movementInfo.initSize.numColumns, numRows: movementInfo.initSize.numRows }, focusManager: detail.focusManager }; }; var configureMatrix = function (detail, movementInfo) { return { mode: 'matrix', selectors: { row: movementInfo.rowSelector, cell: '.' + detail.markers.item }, focusManager: detail.focusManager }; }; var configureMenu = function (detail, movementInfo) { return { mode: 'menu', selector: '.' + detail.markers.item, moveOnTab: movementInfo.moveOnTab, focusManager: detail.focusManager }; }; var parts$g = constant$1([group({ factory: { sketch: function (spec) { var itemInfo = asRawOrDie$1('menu.spec item', itemSchema$2, spec); return itemInfo.builder(itemInfo); } }, name: 'items', unit: 'item', defaults: function (detail, u) { return has$2(u, 'uid') ? u : __assign(__assign({}, u), { uid: generate$5('item') }); }, overrides: function (detail, u) { return { type: u.type, ignoreFocus: detail.fakeFocus, domModification: { classes: [detail.markers.item] } }; } })]); var schema$m = constant$1([ required$1('value'), required$1('items'), required$1('dom'), required$1('components'), defaulted('eventOrder', {}), field('menuBehaviours', [ Highlighting, Representing, Composing, Keying ]), defaultedOf('movement', { mode: 'menu', moveOnTab: true }, choose$1('mode', { grid: [ initSize(), output$1('config', configureGrid) ], matrix: [ output$1('config', configureMatrix), required$1('rowSelector') ], menu: [ defaulted('moveOnTab', true), output$1('config', configureMenu) ] })), itemMarkers(), defaulted('fakeFocus', false), defaulted('focusManager', dom$2()), onHandler('onHighlight') ]); var focus = constant$1('alloy.menu-focus'); var make$7 = function (detail, components, _spec, _externals) { return { uid: detail.uid, dom: detail.dom, markers: detail.markers, behaviours: augment(detail.menuBehaviours, [ Highlighting.config({ highlightClass: detail.markers.selectedItem, itemClass: detail.markers.item, onHighlight: detail.onHighlight }), Representing.config({ store: { mode: 'memory', initialValue: detail.value } }), Composing.config({ find: Optional.some }), Keying.config(detail.movement.config(detail, detail.movement)) ]), events: derive$2([ run$1(focus$1(), function (menu, simulatedEvent) { var event = simulatedEvent.event; menu.getSystem().getByDom(event.target).each(function (item) { Highlighting.highlight(menu, item); simulatedEvent.stop(); emitWith(menu, focus(), { menu: menu, item: item }); }); }), run$1(hover(), function (menu, simulatedEvent) { var item = simulatedEvent.event.item; Highlighting.highlight(menu, item); }) ]), components: components, eventOrder: detail.eventOrder, domModification: { attributes: { role: 'menu' } } }; }; var Menu = composite({ name: 'Menu', configFields: schema$m(), partFields: parts$g(), factory: make$7 }); var transpose$1 = function (obj) { return tupleMap(obj, function (v, k) { return { k: v, v: k }; }); }; var trace = function (items, byItem, byMenu, finish) { return get$e(byMenu, finish).bind(function (triggerItem) { return get$e(items, triggerItem).bind(function (triggerMenu) { var rest = trace(items, byItem, byMenu, triggerMenu); return Optional.some([triggerMenu].concat(rest)); }); }).getOr([]); }; var generate$2 = function (menus, expansions) { var items = {}; each(menus, function (menuItems, menu) { each$1(menuItems, function (item) { items[item] = menu; }); }); var byItem = expansions; var byMenu = transpose$1(expansions); var menuPaths = map$1(byMenu, function (_triggerItem, submenu) { return [submenu].concat(trace(items, byItem, byMenu, submenu)); }); return map$1(items, function (menu) { return get$e(menuPaths, menu).getOr([menu]); }); }; var init$c = function () { var expansions = Cell({}); var menus = Cell({}); var paths = Cell({}); var primary = value$1(); var directory = Cell({}); var clear = function () { expansions.set({}); menus.set({}); paths.set({}); primary.clear(); }; var isClear = function () { return primary.get().isNone(); }; var setMenuBuilt = function (menuName, built) { var _a; menus.set(__assign(__assign({}, menus.get()), (_a = {}, _a[menuName] = { type: 'prepared', menu: built }, _a))); }; var setContents = function (sPrimary, sMenus, sExpansions, dir) { primary.set(sPrimary); expansions.set(sExpansions); menus.set(sMenus); directory.set(dir); var sPaths = generate$2(dir, sExpansions); paths.set(sPaths); }; var getTriggeringItem = function (menuValue) { return find$4(expansions.get(), function (v, _k) { return v === menuValue; }); }; var getTriggerData = function (menuValue, getItemByValue, path) { return getPreparedMenu(menuValue).bind(function (menu) { return getTriggeringItem(menuValue).bind(function (triggeringItemValue) { return getItemByValue(triggeringItemValue).map(function (triggeredItem) { return { triggeredMenu: menu, triggeringItem: triggeredItem, triggeringPath: path }; }); }); }); }; var getTriggeringPath = function (itemValue, getItemByValue) { var extraPath = filter$2(lookupItem(itemValue).toArray(), function (menuValue) { return getPreparedMenu(menuValue).isSome(); }); return get$e(paths.get(), itemValue).bind(function (path) { var revPath = reverse(extraPath.concat(path)); var triggers = bind$3(revPath, function (menuValue, menuIndex) { return getTriggerData(menuValue, getItemByValue, revPath.slice(0, menuIndex + 1)).fold(function () { return is$1(primary.get(), menuValue) ? [] : [Optional.none()]; }, function (data) { return [Optional.some(data)]; }); }); return sequence(triggers); }); }; var expand = function (itemValue) { return get$e(expansions.get(), itemValue).map(function (menu) { var current = get$e(paths.get(), itemValue).getOr([]); return [menu].concat(current); }); }; var collapse = function (itemValue) { return get$e(paths.get(), itemValue).bind(function (path) { return path.length > 1 ? Optional.some(path.slice(1)) : Optional.none(); }); }; var refresh = function (itemValue) { return get$e(paths.get(), itemValue); }; var getPreparedMenu = function (menuValue) { return lookupMenu(menuValue).bind(extractPreparedMenu); }; var lookupMenu = function (menuValue) { return get$e(menus.get(), menuValue); }; var lookupItem = function (itemValue) { return get$e(expansions.get(), itemValue); }; var otherMenus = function (path) { var menuValues = directory.get(); return difference(keys(menuValues), path); }; var getPrimary = function () { return primary.get().bind(getPreparedMenu); }; var getMenus = function () { return menus.get(); }; return { setMenuBuilt: setMenuBuilt, setContents: setContents, expand: expand, refresh: refresh, collapse: collapse, lookupMenu: lookupMenu, lookupItem: lookupItem, otherMenus: otherMenus, getPrimary: getPrimary, getMenus: getMenus, clear: clear, isClear: isClear, getTriggeringPath: getTriggeringPath }; }; var extractPreparedMenu = function (prep) { return prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none(); }; var LayeredState = { init: init$c, extractPreparedMenu: extractPreparedMenu }; var make$6 = function (detail, _rawUiSpec) { var submenuParentItems = value$1(); var buildMenus = function (container, primaryName, menus) { return map$1(menus, function (spec, name) { var makeSketch = function () { return Menu.sketch(__assign(__assign({}, spec), { value: name, markers: detail.markers, fakeFocus: detail.fakeFocus, onHighlight: detail.onHighlight, focusManager: detail.fakeFocus ? highlights() : dom$2() })); }; return name === primaryName ? { type: 'prepared', menu: container.getSystem().build(makeSketch()) } : { type: 'notbuilt', nbMenu: makeSketch }; }); }; var layeredState = LayeredState.init(); var setup = function (container) { var componentMap = buildMenus(container, detail.data.primary, detail.data.menus); var directory = toDirectory(); layeredState.setContents(detail.data.primary, componentMap, detail.data.expansions, directory); return layeredState.getPrimary(); }; var getItemValue = function (item) { return Representing.getValue(item).value; }; var getItemByValue = function (_container, menus, itemValue) { return findMap(menus, function (menu) { if (!menu.getSystem().isConnected()) { return Optional.none(); } var candidates = Highlighting.getCandidates(menu); return find$5(candidates, function (c) { return getItemValue(c) === itemValue; }); }); }; var toDirectory = function (_container) { return map$1(detail.data.menus, function (data, _menuName) { return bind$3(data.items, function (item) { return item.type === 'separator' ? [] : [item.data.value]; }); }); }; var setActiveMenu = function (container, menu) { Highlighting.highlight(container, menu); Highlighting.getHighlighted(menu).orThunk(function () { return Highlighting.getFirst(menu); }).each(function (item) { dispatch(container, item.element, focusItem()); }); }; var getMenus = function (state, menuValues) { return cat(map$2(menuValues, function (mv) { return state.lookupMenu(mv).bind(function (prep) { return prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none(); }); })); }; var closeOthers = function (container, state, path) { var others = getMenus(state, state.otherMenus(path)); each$1(others, function (o) { remove$1(o.element, [detail.markers.backgroundMenu]); if (!detail.stayInDom) { Replacing.remove(container, o); } }); }; var getSubmenuParents = function (container) { return submenuParentItems.get().getOrThunk(function () { var r = {}; var items = descendants(container.element, '.' + detail.markers.item); var parentItems = filter$2(items, function (i) { return get$d(i, 'aria-haspopup') === 'true'; }); each$1(parentItems, function (i) { container.getSystem().getByDom(i).each(function (itemComp) { var key = getItemValue(itemComp); r[key] = itemComp; }); }); submenuParentItems.set(r); return r; }); }; var updateAriaExpansions = function (container, path) { var parentItems = getSubmenuParents(container); each(parentItems, function (v, k) { var expanded = contains$2(path, k); set$8(v.element, 'aria-expanded', expanded); }); }; var updateMenuPath = function (container, state, path) { return Optional.from(path[0]).bind(function (latestMenuName) { return state.lookupMenu(latestMenuName).bind(function (menuPrep) { if (menuPrep.type === 'notbuilt') { return Optional.none(); } else { var activeMenu = menuPrep.menu; var rest = getMenus(state, path.slice(1)); each$1(rest, function (r) { add$2(r.element, detail.markers.backgroundMenu); }); if (!inBody(activeMenu.element)) { Replacing.append(container, premade(activeMenu)); } remove$1(activeMenu.element, [detail.markers.backgroundMenu]); setActiveMenu(container, activeMenu); closeOthers(container, state, path); return Optional.some(activeMenu); } }); }); }; var ExpandHighlightDecision; (function (ExpandHighlightDecision) { ExpandHighlightDecision[ExpandHighlightDecision['HighlightSubmenu'] = 0] = 'HighlightSubmenu'; ExpandHighlightDecision[ExpandHighlightDecision['HighlightParent'] = 1] = 'HighlightParent'; }(ExpandHighlightDecision || (ExpandHighlightDecision = {}))); var buildIfRequired = function (container, menuName, menuPrep) { if (menuPrep.type === 'notbuilt') { var menu = container.getSystem().build(menuPrep.nbMenu()); layeredState.setMenuBuilt(menuName, menu); return menu; } else { return menuPrep.menu; } }; var expandRight = function (container, item, decision) { if (decision === void 0) { decision = ExpandHighlightDecision.HighlightSubmenu; } if (item.hasConfigured(Disabling) && Disabling.isDisabled(item)) { return Optional.some(item); } else { var value = getItemValue(item); return layeredState.expand(value).bind(function (path) { updateAriaExpansions(container, path); return Optional.from(path[0]).bind(function (menuName) { return layeredState.lookupMenu(menuName).bind(function (activeMenuPrep) { var activeMenu = buildIfRequired(container, menuName, activeMenuPrep); if (!inBody(activeMenu.element)) { Replacing.append(container, premade(activeMenu)); } detail.onOpenSubmenu(container, item, activeMenu, reverse(path)); if (decision === ExpandHighlightDecision.HighlightSubmenu) { Highlighting.highlightFirst(activeMenu); return updateMenuPath(container, layeredState, path); } else { Highlighting.dehighlightAll(activeMenu); return Optional.some(item); } }); }); }); } }; var collapseLeft = function (container, item) { var value = getItemValue(item); return layeredState.collapse(value).bind(function (path) { updateAriaExpansions(container, path); return updateMenuPath(container, layeredState, path).map(function (activeMenu) { detail.onCollapseMenu(container, item, activeMenu); return activeMenu; }); }); }; var updateView = function (container, item) { var value = getItemValue(item); return layeredState.refresh(value).bind(function (path) { updateAriaExpansions(container, path); return updateMenuPath(container, layeredState, path); }); }; var onRight = function (container, item) { return inside(item.element) ? Optional.none() : expandRight(container, item, ExpandHighlightDecision.HighlightSubmenu); }; var onLeft = function (container, item) { return inside(item.element) ? Optional.none() : collapseLeft(container, item); }; var onEscape = function (container, item) { return collapseLeft(container, item).orThunk(function () { return detail.onEscape(container, item).map(function () { return container; }); }); }; var keyOnItem = function (f) { return function (container, simulatedEvent) { return closest$1(simulatedEvent.getSource(), '.' + detail.markers.item).bind(function (target) { return container.getSystem().getByDom(target).toOptional().bind(function (item) { return f(container, item).map(always); }); }); }; }; var events = derive$2([ run$1(focus(), function (sandbox, simulatedEvent) { var item = simulatedEvent.event.item; layeredState.lookupItem(getItemValue(item)).each(function () { var menu = simulatedEvent.event.menu; Highlighting.highlight(sandbox, menu); var value = getItemValue(simulatedEvent.event.item); layeredState.refresh(value).each(function (path) { return closeOthers(sandbox, layeredState, path); }); }); }), runOnExecute$1(function (component, simulatedEvent) { var target = simulatedEvent.event.target; component.getSystem().getByDom(target).each(function (item) { var itemValue = getItemValue(item); if (itemValue.indexOf('collapse-item') === 0) { collapseLeft(component, item); } expandRight(component, item, ExpandHighlightDecision.HighlightSubmenu).fold(function () { detail.onExecute(component, item); }, noop); }); }), runOnAttached(function (container, _simulatedEvent) { setup(container).each(function (primary) { Replacing.append(container, premade(primary)); detail.onOpenMenu(container, primary); if (detail.highlightImmediately) { setActiveMenu(container, primary); } }); }) ].concat(detail.navigateOnHover ? [run$1(hover(), function (sandbox, simulatedEvent) { var item = simulatedEvent.event.item; updateView(sandbox, item); expandRight(sandbox, item, ExpandHighlightDecision.HighlightParent); detail.onHover(sandbox, item); })] : [])); var getActiveItem = function (container) { return Highlighting.getHighlighted(container).bind(Highlighting.getHighlighted); }; var collapseMenuApi = function (container) { getActiveItem(container).each(function (currentItem) { collapseLeft(container, currentItem); }); }; var highlightPrimary = function (container) { layeredState.getPrimary().each(function (primary) { setActiveMenu(container, primary); }); }; var extractMenuFromContainer = function (container) { return Optional.from(container.components()[0]).filter(function (comp) { return get$d(comp.element, 'role') === 'menu'; }); }; var repositionMenus = function (container) { var maybeActivePrimary = layeredState.getPrimary().bind(function (primary) { return getActiveItem(container).bind(function (currentItem) { var itemValue = getItemValue(currentItem); var allMenus = values(layeredState.getMenus()); var preparedMenus = cat(map$2(allMenus, LayeredState.extractPreparedMenu)); return layeredState.getTriggeringPath(itemValue, function (v) { return getItemByValue(container, preparedMenus, v); }); }).map(function (triggeringPath) { return { primary: primary, triggeringPath: triggeringPath }; }); }); maybeActivePrimary.fold(function () { extractMenuFromContainer(container).each(function (primaryMenu) { detail.onRepositionMenu(container, primaryMenu, []); }); }, function (_a) { var primary = _a.primary, triggeringPath = _a.triggeringPath; detail.onRepositionMenu(container, primary, triggeringPath); }); }; var apis = { collapseMenu: collapseMenuApi, highlightPrimary: highlightPrimary, repositionMenus: repositionMenus }; return { uid: detail.uid, dom: detail.dom, markers: detail.markers, behaviours: augment(detail.tmenuBehaviours, [ Keying.config({ mode: 'special', onRight: keyOnItem(onRight), onLeft: keyOnItem(onLeft), onEscape: keyOnItem(onEscape), focusIn: function (container, _keyInfo) { layeredState.getPrimary().each(function (primary) { dispatch(container, primary.element, focusItem()); }); } }), Highlighting.config({ highlightClass: detail.markers.selectedMenu, itemClass: detail.markers.menu }), Composing.config({ find: function (container) { return Highlighting.getHighlighted(container); } }), Replacing.config({}) ]), eventOrder: detail.eventOrder, apis: apis, events: events }; }; var collapseItem$1 = constant$1('collapse-item'); var tieredData = function (primary, menus, expansions) { return { primary: primary, menus: menus, expansions: expansions }; }; var singleData = function (name, menu) { return { primary: name, menus: wrap$1(name, menu), expansions: {} }; }; var collapseItem = function (text) { return { value: generate$6(collapseItem$1()), meta: { text: text } }; }; var tieredMenu = single({ name: 'TieredMenu', configFields: [ onStrictKeyboardHandler('onExecute'), onStrictKeyboardHandler('onEscape'), onStrictHandler('onOpenMenu'), onStrictHandler('onOpenSubmenu'), onHandler('onRepositionMenu'), onHandler('onCollapseMenu'), defaulted('highlightImmediately', true), requiredObjOf('data', [ required$1('primary'), required$1('menus'), required$1('expansions') ]), defaulted('fakeFocus', false), onHandler('onHighlight'), onHandler('onHover'), tieredMenuMarkers(), required$1('dom'), defaulted('navigateOnHover', true), defaulted('stayInDom', false), field('tmenuBehaviours', [ Keying, Highlighting, Composing, Replacing ]), defaulted('eventOrder', {}) ], apis: { collapseMenu: function (apis, tmenu) { apis.collapseMenu(tmenu); }, highlightPrimary: function (apis, tmenu) { apis.highlightPrimary(tmenu); }, repositionMenus: function (apis, tmenu) { apis.repositionMenus(tmenu); } }, factory: make$6, extraApis: { tieredData: tieredData, singleData: singleData, collapseItem: collapseItem } }); var makeMenu = function (detail, menuSandbox, placementSpec, menuSpec, getBounds) { var lazySink = function () { return detail.lazySink(menuSandbox); }; var layouts = menuSpec.type === 'horizontal' ? { layouts: { onLtr: function () { return belowOrAbove(); }, onRtl: function () { return belowOrAboveRtl(); } } } : {}; var isFirstTierSubmenu = function (triggeringPaths) { return triggeringPaths.length === 2; }; var getSubmenuLayouts = function (triggeringPaths) { return isFirstTierSubmenu(triggeringPaths) ? layouts : {}; }; return tieredMenu.sketch({ dom: { tag: 'div' }, data: menuSpec.data, markers: menuSpec.menu.markers, highlightImmediately: menuSpec.menu.highlightImmediately, onEscape: function () { Sandboxing.close(menuSandbox); detail.onEscape.map(function (handler) { return handler(menuSandbox); }); return Optional.some(true); }, onExecute: function () { return Optional.some(true); }, onOpenMenu: function (tmenu, menu) { Positioning.positionWithinBounds(lazySink().getOrDie(), menu, placementSpec, getBounds()); }, onOpenSubmenu: function (tmenu, item, submenu, triggeringPaths) { var sink = lazySink().getOrDie(); Positioning.position(sink, submenu, { anchor: __assign({ type: 'submenu', item: item }, getSubmenuLayouts(triggeringPaths)) }); }, onRepositionMenu: function (tmenu, primaryMenu, submenuTriggers) { var sink = lazySink().getOrDie(); Positioning.positionWithinBounds(sink, primaryMenu, placementSpec, getBounds()); each$1(submenuTriggers, function (st) { var submenuLayouts = getSubmenuLayouts(st.triggeringPath); Positioning.position(sink, st.triggeredMenu, { anchor: __assign({ type: 'submenu', item: st.triggeringItem }, submenuLayouts) }); }); } }); }; var factory$m = function (detail, spec) { var isPartOfRelated = function (sandbox, queryElem) { var related = detail.getRelated(sandbox); return related.exists(function (rel) { return isPartOf$1(rel, queryElem); }); }; var setContent = function (sandbox, thing) { Sandboxing.setContent(sandbox, thing); }; var showAt = function (sandbox, thing, placementSpec) { showWithin(sandbox, thing, placementSpec, Optional.none()); }; var showWithin = function (sandbox, thing, placementSpec, boxElement) { showWithinBounds(sandbox, thing, placementSpec, function () { return boxElement.map(function (elem) { return box$1(elem); }); }); }; var showWithinBounds = function (sandbox, thing, placementSpec, getBounds) { var sink = detail.lazySink(sandbox).getOrDie(); Sandboxing.openWhileCloaked(sandbox, thing, function () { return Positioning.positionWithinBounds(sink, sandbox, placementSpec, getBounds()); }); Representing.setValue(sandbox, Optional.some({ mode: 'position', config: placementSpec, getBounds: getBounds })); }; var showMenuAt = function (sandbox, placementSpec, menuSpec) { showMenuWithinBounds(sandbox, placementSpec, menuSpec, Optional.none); }; var showMenuWithinBounds = function (sandbox, placementSpec, menuSpec, getBounds) { var menu = makeMenu(detail, sandbox, placementSpec, menuSpec, getBounds); Sandboxing.open(sandbox, menu); Representing.setValue(sandbox, Optional.some({ mode: 'menu', menu: menu })); }; var hide = function (sandbox) { if (Sandboxing.isOpen(sandbox)) { Representing.setValue(sandbox, Optional.none()); Sandboxing.close(sandbox); } }; var getContent = function (sandbox) { return Sandboxing.getState(sandbox); }; var reposition = function (sandbox) { if (Sandboxing.isOpen(sandbox)) { Representing.getValue(sandbox).each(function (state) { switch (state.mode) { case 'menu': Sandboxing.getState(sandbox).each(tieredMenu.repositionMenus); break; case 'position': var sink = detail.lazySink(sandbox).getOrDie(); Positioning.positionWithinBounds(sink, sandbox, state.config, state.getBounds()); break; } }); } }; var apis = { setContent: setContent, showAt: showAt, showWithin: showWithin, showWithinBounds: showWithinBounds, showMenuAt: showMenuAt, showMenuWithinBounds: showMenuWithinBounds, hide: hide, getContent: getContent, reposition: reposition, isOpen: Sandboxing.isOpen }; return { uid: detail.uid, dom: detail.dom, behaviours: augment(detail.inlineBehaviours, [ Sandboxing.config({ isPartOf: function (sandbox, data, queryElem) { return isPartOf$1(data, queryElem) || isPartOfRelated(sandbox, queryElem); }, getAttachPoint: function (sandbox) { return detail.lazySink(sandbox).getOrDie(); }, onOpen: function (sandbox) { detail.onShow(sandbox); }, onClose: function (sandbox) { detail.onHide(sandbox); } }), Representing.config({ store: { mode: 'memory', initialValue: Optional.none() } }), Receiving.config({ channels: __assign(__assign({}, receivingChannel$1(__assign({ isExtraPart: spec.isExtraPart }, detail.fireDismissalEventInstead.map(function (fe) { return { fireEventInstead: { event: fe.event } }; }).getOr({})))), receivingChannel(__assign(__assign({}, detail.fireRepositionEventInstead.map(function (fe) { return { fireEventInstead: { event: fe.event } }; }).getOr({})), { doReposition: reposition }))) }) ]), eventOrder: detail.eventOrder, apis: apis }; }; var InlineView = single({ name: 'InlineView', configFields: [ required$1('lazySink'), onHandler('onShow'), onHandler('onHide'), optionFunction('onEscape'), field('inlineBehaviours', [ Sandboxing, Representing, Receiving ]), optionObjOf('fireDismissalEventInstead', [defaulted('event', dismissRequested())]), optionObjOf('fireRepositionEventInstead', [defaulted('event', repositionRequested())]), defaulted('getRelated', Optional.none), defaulted('isExtraPart', never), defaulted('eventOrder', Optional.none) ], factory: factory$m, apis: { showAt: function (apis, component, anchor, thing) { apis.showAt(component, anchor, thing); }, showWithin: function (apis, component, anchor, thing, boxElement) { apis.showWithin(component, anchor, thing, boxElement); }, showWithinBounds: function (apis, component, anchor, thing, bounds) { apis.showWithinBounds(component, anchor, thing, bounds); }, showMenuAt: function (apis, component, anchor, menuSpec) { apis.showMenuAt(component, anchor, menuSpec); }, showMenuWithinBounds: function (apis, component, anchor, menuSpec, bounds) { apis.showMenuWithinBounds(component, anchor, menuSpec, bounds); }, hide: function (apis, component) { apis.hide(component); }, isOpen: function (apis, component) { return apis.isOpen(component); }, getContent: function (apis, component) { return apis.getContent(component); }, setContent: function (apis, component, thing) { apis.setContent(component, thing); }, reposition: function (apis, component) { apis.reposition(component); } } }); var labelPrefix = 'layout-inset'; var westEdgeX = function (anchor) { return anchor.x; }; var middleX = function (anchor, element) { return anchor.x + anchor.width / 2 - element.width / 2; }; var eastEdgeX = function (anchor, element) { return anchor.x + anchor.width - element.width; }; var northY = function (anchor) { return anchor.y; }; var southY = function (anchor, element) { return anchor.y + anchor.height - element.height; }; var centreY = function (anchor, element) { return anchor.y + anchor.height / 2 - element.height / 2; }; var southwest = function (anchor, element, bubbles) { return nu$6(eastEdgeX(anchor, element), southY(anchor, element), bubbles.insetSouthwest(), northwest$3(), 'southwest', boundsRestriction(anchor, { right: 0, bottom: 3 }), labelPrefix); }; var southeast = function (anchor, element, bubbles) { return nu$6(westEdgeX(anchor), southY(anchor, element), bubbles.insetSoutheast(), northeast$3(), 'southeast', boundsRestriction(anchor, { left: 1, bottom: 3 }), labelPrefix); }; var northwest = function (anchor, element, bubbles) { return nu$6(eastEdgeX(anchor, element), northY(anchor), bubbles.insetNorthwest(), southwest$3(), 'northwest', boundsRestriction(anchor, { right: 0, top: 2 }), labelPrefix); }; var northeast = function (anchor, element, bubbles) { return nu$6(westEdgeX(anchor), northY(anchor), bubbles.insetNortheast(), southeast$3(), 'northeast', boundsRestriction(anchor, { left: 1, top: 2 }), labelPrefix); }; var north = function (anchor, element, bubbles) { return nu$6(middleX(anchor, element), northY(anchor), bubbles.insetNorth(), south$3(), 'north', boundsRestriction(anchor, { top: 2 }), labelPrefix); }; var south = function (anchor, element, bubbles) { return nu$6(middleX(anchor, element), southY(anchor, element), bubbles.insetSouth(), north$3(), 'south', boundsRestriction(anchor, { bottom: 3 }), labelPrefix); }; var east = function (anchor, element, bubbles) { return nu$6(eastEdgeX(anchor, element), centreY(anchor, element), bubbles.insetEast(), west$3(), 'east', boundsRestriction(anchor, { right: 0 }), labelPrefix); }; var west = function (anchor, element, bubbles) { return nu$6(westEdgeX(anchor), centreY(anchor, element), bubbles.insetWest(), east$3(), 'west', boundsRestriction(anchor, { left: 1 }), labelPrefix); }; var lookupPreserveLayout = function (lastPlacement) { switch (lastPlacement) { case 'north': return north; case 'northeast': return northeast; case 'northwest': return northwest; case 'south': return south; case 'southeast': return southeast; case 'southwest': return southwest; case 'east': return east; case 'west': return west; } }; var preserve = function (anchor, element, bubbles, placee, bounds) { var layout = getPlacement(placee).map(lookupPreserveLayout).getOr(north); return layout(anchor, element, bubbles, placee, bounds); }; var lookupFlippedLayout = function (lastPlacement) { switch (lastPlacement) { case 'north': return south; case 'northeast': return southeast; case 'northwest': return southwest; case 'south': return north; case 'southeast': return northeast; case 'southwest': return northwest; case 'east': return west; case 'west': return east; } }; var flip$2 = function (anchor, element, bubbles, placee, bounds) { var layout = getPlacement(placee).map(lookupFlippedLayout).getOr(north); return layout(anchor, element, bubbles, placee, bounds); }; var global$f = tinymce.util.Tools.resolve('tinymce.util.Delay'); var factory$l = function (detail) { var events = events$a(detail.action); var tag = detail.dom.tag; var lookupAttr = function (attr) { return get$e(detail.dom, 'attributes').bind(function (attrs) { return get$e(attrs, attr); }); }; var getModAttributes = function () { if (tag === 'button') { var type = lookupAttr('type').getOr('button'); var roleAttrs = lookupAttr('role').map(function (role) { return { role: role }; }).getOr({}); return __assign({ type: type }, roleAttrs); } else { var role = lookupAttr('role').getOr('button'); return { role: role }; } }; return { uid: detail.uid, dom: detail.dom, components: detail.components, events: events, behaviours: SketchBehaviours.augment(detail.buttonBehaviours, [ Focusing.config({}), Keying.config({ mode: 'execution', useSpace: true, useEnter: true }) ]), domModification: { attributes: getModAttributes() }, eventOrder: detail.eventOrder }; }; var Button = single({ name: 'Button', factory: factory$l, configFields: [ defaulted('uid', undefined), required$1('dom'), defaulted('components', []), SketchBehaviours.field('buttonBehaviours', [ Focusing, Keying ]), option('action'), option('role'), defaulted('eventOrder', {}) ] }); var getAttrs = function (elem) { var attributes = elem.dom.attributes !== undefined ? elem.dom.attributes : []; return foldl(attributes, function (b, attr) { var _a; if (attr.name === 'class') { return b; } else { return __assign(__assign({}, b), (_a = {}, _a[attr.name] = attr.value, _a)); } }, {}); }; var getClasses = function (elem) { return Array.prototype.slice.call(elem.dom.classList, 0); }; var fromHtml = function (html) { var elem = SugarElement.fromHtml(html); var children$1 = children(elem); var attrs = getAttrs(elem); var classes = getClasses(elem); var contents = children$1.length === 0 ? {} : { innerHtml: get$7(elem) }; return __assign({ tag: name$2(elem), classes: classes, attributes: attrs }, contents); }; var record = function (spec) { var uid = isSketchSpec(spec) && hasNonNullableKey(spec, 'uid') ? spec.uid : generate$5('memento'); var get = function (anyInSystem) { return anyInSystem.getSystem().getByUid(uid).getOrDie(); }; var getOpt = function (anyInSystem) { return anyInSystem.getSystem().getByUid(uid).toOptional(); }; var asSpec = function () { return __assign(__assign({}, spec), { uid: uid }); }; return { get: get, getOpt: getOpt, asSpec: asSpec }; }; function _typeof(obj) { '@babel/helpers - typeof'; return _typeof = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && 'function' == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? 'symbol' : typeof obj; }, _typeof(obj); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _isNativeReflectConstruct() { if (typeof Reflect === 'undefined' || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === 'function') return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () { })); return true; } catch (e) { return false; } } function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _iterableToArray(iter) { if (typeof Symbol !== 'undefined' && iter[Symbol.iterator] != null || iter['@@iterator'] != null) return Array.from(iter); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === 'string') return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === 'Object' && o.constructor) n = o.constructor.name; if (n === 'Map' || n === 'Set') return Array.from(o); if (n === 'Arguments' || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _nonIterableSpread() { throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); } var hasOwnProperty = Object.hasOwnProperty, setPrototypeOf = Object.setPrototypeOf, isFrozen = Object.isFrozen, getPrototypeOf = Object.getPrototypeOf, getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; var freeze = Object.freeze, seal = Object.seal, create$5 = Object.create; var _ref = typeof Reflect !== 'undefined' && Reflect, apply$1 = _ref.apply, construct = _ref.construct; if (!apply$1) { apply$1 = function apply(fun, thisValue, args) { return fun.apply(thisValue, args); }; } if (!freeze) { freeze = function freeze(x) { return x; }; } if (!seal) { seal = function seal(x) { return x; }; } if (!construct) { construct = function construct(Func, args) { return _construct(Func, _toConsumableArray(args)); }; } var arrayForEach = unapply(Array.prototype.forEach); var arrayPop = unapply(Array.prototype.pop); var arrayPush = unapply(Array.prototype.push); var stringToLowerCase = unapply(String.prototype.toLowerCase); var stringMatch = unapply(String.prototype.match); var stringReplace = unapply(String.prototype.replace); var stringIndexOf = unapply(String.prototype.indexOf); var stringTrim = unapply(String.prototype.trim); var regExpTest = unapply(RegExp.prototype.test); var typeErrorCreate = unconstruct(TypeError); function unapply(func) { return function (thisArg) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } return apply$1(func, thisArg, args); }; } function unconstruct(func) { return function () { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } return construct(func, args); }; } function addToSet(set, array) { if (setPrototypeOf) { setPrototypeOf(set, null); } var l = array.length; while (l--) { var element = array[l]; if (typeof element === 'string') { var lcElement = stringToLowerCase(element); if (lcElement !== element) { if (!isFrozen(array)) { array[l] = lcElement; } element = lcElement; } } set[element] = true; } return set; } function clone$1(object) { var newObject = create$5(null); var property; for (property in object) { if (apply$1(hasOwnProperty, object, [property])) { newObject[property] = object[property]; } } return newObject; } function lookupGetter(object, prop) { while (object !== null) { var desc = getOwnPropertyDescriptor(object, prop); if (desc) { if (desc.get) { return unapply(desc.get); } if (typeof desc.value === 'function') { return unapply(desc.value); } } object = getPrototypeOf(object); } function fallbackValue(element) { console.warn('fallback value for', element); return null; } return fallbackValue; } var html$1 = freeze([ 'a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr' ]); var svg$1 = freeze([ 'svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern' ]); var svgFilters = freeze([ 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence' ]); var svgDisallowed = freeze([ 'animate', 'color-profile', 'cursor', 'discard', 'fedropshadow', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use' ]); var mathMl$1 = freeze([ 'math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover' ]); var mathMlDisallowed = freeze([ 'maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none' ]); var text = freeze(['#text']); var html = freeze([ 'accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'xmlns', 'slot' ]); var svg = freeze([ 'accent-height', 'accumulate', 'additive', 'alignment-baseline', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan' ]); var mathMl = freeze([ 'accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns' ]); var xml = freeze([ 'xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink' ]); var MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); var ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm); var DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/); var ARIA_ATTR = seal(/^aria-[\-\w]+$/); var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i); var IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i); var ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g); var DOCTYPE_NAME = seal(/^html$/i); var getGlobal = function getGlobal() { return typeof window === 'undefined' ? null : window; }; var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) { if (_typeof(trustedTypes) !== 'object' || typeof trustedTypes.createPolicy !== 'function') { return null; } var suffix = null; var ATTR_NAME = 'data-tt-policy-suffix'; if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) { suffix = document.currentScript.getAttribute(ATTR_NAME); } var policyName = 'dompurify' + (suffix ? '#' + suffix : ''); try { return trustedTypes.createPolicy(policyName, { createHTML: function createHTML(html) { return html; } }); } catch (_) { console.warn('TrustedTypes policy ' + policyName + ' could not be created.'); return null; } }; function createDOMPurify() { var window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal(); var DOMPurify = function DOMPurify(root) { return createDOMPurify(root); }; DOMPurify.version = '2.3.8'; DOMPurify.removed = []; if (!window || !window.document || window.document.nodeType !== 9) { DOMPurify.isSupported = false; return DOMPurify; } var originalDocument = window.document; var document = window.document; var DocumentFragment = window.DocumentFragment, HTMLTemplateElement = window.HTMLTemplateElement, Node = window.Node, Element = window.Element, NodeFilter = window.NodeFilter, _window$NamedNodeMap = window.NamedNodeMap, NamedNodeMap = _window$NamedNodeMap === void 0 ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap, HTMLFormElement = window.HTMLFormElement, DOMParser = window.DOMParser, trustedTypes = window.trustedTypes; var ElementPrototype = Element.prototype; var cloneNode = lookupGetter(ElementPrototype, 'cloneNode'); var getNextSibling = lookupGetter(ElementPrototype, 'nextSibling'); var getChildNodes = lookupGetter(ElementPrototype, 'childNodes'); var getParentNode = lookupGetter(ElementPrototype, 'parentNode'); if (typeof HTMLTemplateElement === 'function') { var template = document.createElement('template'); if (template.content && template.content.ownerDocument) { document = template.content.ownerDocument; } } var trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument); var emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : ''; var _document = document, implementation = _document.implementation, createNodeIterator = _document.createNodeIterator, createDocumentFragment = _document.createDocumentFragment, getElementsByTagName = _document.getElementsByTagName; var importNode = originalDocument.importNode; var documentMode = {}; try { documentMode = clone$1(document).documentMode ? document.documentMode : {}; } catch (_) { } var hooks = {}; DOMPurify.isSupported = typeof getParentNode === 'function' && implementation && typeof implementation.createHTMLDocument !== 'undefined' && documentMode !== 9; var MUSTACHE_EXPR$1 = MUSTACHE_EXPR, ERB_EXPR$1 = ERB_EXPR, DATA_ATTR$1 = DATA_ATTR, ARIA_ATTR$1 = ARIA_ATTR, IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA, ATTR_WHITESPACE$1 = ATTR_WHITESPACE; var IS_ALLOWED_URI$1 = IS_ALLOWED_URI; var ALLOWED_TAGS = null; var DEFAULT_ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray(html$1), _toConsumableArray(svg$1), _toConsumableArray(svgFilters), _toConsumableArray(mathMl$1), _toConsumableArray(text))); var ALLOWED_ATTR = null; var DEFAULT_ALLOWED_ATTR = addToSet({}, [].concat(_toConsumableArray(html), _toConsumableArray(svg), _toConsumableArray(mathMl), _toConsumableArray(xml))); var CUSTOM_ELEMENT_HANDLING = Object.seal(Object.create(null, { tagNameCheck: { writable: true, configurable: false, enumerable: true, value: null }, attributeNameCheck: { writable: true, configurable: false, enumerable: true, value: null }, allowCustomizedBuiltInElements: { writable: true, configurable: false, enumerable: true, value: false } })); var FORBID_TAGS = null; var FORBID_ATTR = null; var ALLOW_ARIA_ATTR = true; var ALLOW_DATA_ATTR = true; var ALLOW_UNKNOWN_PROTOCOLS = false; var SAFE_FOR_TEMPLATES = false; var WHOLE_DOCUMENT = false; var SET_CONFIG = false; var FORCE_BODY = false; var RETURN_DOM = false; var RETURN_DOM_FRAGMENT = false; var RETURN_TRUSTED_TYPE = false; var SANITIZE_DOM = true; var KEEP_CONTENT = true; var IN_PLACE = false; var USE_PROFILES = {}; var FORBID_CONTENTS = null; var DEFAULT_FORBID_CONTENTS = addToSet({}, [ 'annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp' ]); var DATA_URI_TAGS = null; var DEFAULT_DATA_URI_TAGS = addToSet({}, [ 'audio', 'video', 'img', 'source', 'image', 'track' ]); var URI_SAFE_ATTRIBUTES = null; var DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, [ 'alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns' ]); var MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML'; var SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'; var NAMESPACE = HTML_NAMESPACE; var IS_EMPTY_INPUT = false; var PARSER_MEDIA_TYPE; var SUPPORTED_PARSER_MEDIA_TYPES = [ 'application/xhtml+xml', 'text/html' ]; var DEFAULT_PARSER_MEDIA_TYPE = 'text/html'; var transformCaseFunc; var CONFIG = null; var formElement = document.createElement('form'); var isRegexOrFunction = function isRegexOrFunction(testValue) { return testValue instanceof RegExp || testValue instanceof Function; }; var _parseConfig = function _parseConfig(cfg) { if (CONFIG && CONFIG === cfg) { return; } if (!cfg || _typeof(cfg) !== 'object') { cfg = {}; } cfg = clone$1(cfg); ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS) : DEFAULT_ALLOWED_TAGS; ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR) : DEFAULT_ALLOWED_ATTR; URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone$1(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR) : DEFAULT_URI_SAFE_ATTRIBUTES; DATA_URI_TAGS = 'ADD_DATA_URI_TAGS' in cfg ? addToSet(clone$1(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS) : DEFAULT_DATA_URI_TAGS; FORBID_CONTENTS = 'FORBID_CONTENTS' in cfg ? addToSet({}, cfg.FORBID_CONTENTS) : DEFAULT_FORBID_CONTENTS; FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS) : {}; FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR) : {}; USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false; ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; RETURN_DOM = cfg.RETURN_DOM || false; RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; FORCE_BODY = cfg.FORCE_BODY || false; SANITIZE_DOM = cfg.SANITIZE_DOM !== false; KEEP_CONTENT = cfg.KEEP_CONTENT !== false; IN_PLACE = cfg.IN_PLACE || false; IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI$1; NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE; if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) { CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck; } if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) { CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck; } if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') { CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements; } PARSER_MEDIA_TYPE = SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? PARSER_MEDIA_TYPE = DEFAULT_PARSER_MEDIA_TYPE : PARSER_MEDIA_TYPE = cfg.PARSER_MEDIA_TYPE; transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? function (x) { return x; } : stringToLowerCase; if (SAFE_FOR_TEMPLATES) { ALLOW_DATA_ATTR = false; } if (RETURN_DOM_FRAGMENT) { RETURN_DOM = true; } if (USE_PROFILES) { ALLOWED_TAGS = addToSet({}, _toConsumableArray(text)); ALLOWED_ATTR = []; if (USE_PROFILES.html === true) { addToSet(ALLOWED_TAGS, html$1); addToSet(ALLOWED_ATTR, html); } if (USE_PROFILES.svg === true) { addToSet(ALLOWED_TAGS, svg$1); addToSet(ALLOWED_ATTR, svg); addToSet(ALLOWED_ATTR, xml); } if (USE_PROFILES.svgFilters === true) { addToSet(ALLOWED_TAGS, svgFilters); addToSet(ALLOWED_ATTR, svg); addToSet(ALLOWED_ATTR, xml); } if (USE_PROFILES.mathMl === true) { addToSet(ALLOWED_TAGS, mathMl$1); addToSet(ALLOWED_ATTR, mathMl); addToSet(ALLOWED_ATTR, xml); } } if (cfg.ADD_TAGS) { if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) { ALLOWED_TAGS = clone$1(ALLOWED_TAGS); } addToSet(ALLOWED_TAGS, cfg.ADD_TAGS); } if (cfg.ADD_ATTR) { if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) { ALLOWED_ATTR = clone$1(ALLOWED_ATTR); } addToSet(ALLOWED_ATTR, cfg.ADD_ATTR); } if (cfg.ADD_URI_SAFE_ATTR) { addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR); } if (cfg.FORBID_CONTENTS) { if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) { FORBID_CONTENTS = clone$1(FORBID_CONTENTS); } addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS); } if (KEEP_CONTENT) { ALLOWED_TAGS['#text'] = true; } if (WHOLE_DOCUMENT) { addToSet(ALLOWED_TAGS, [ 'html', 'head', 'body' ]); } if (ALLOWED_TAGS.table) { addToSet(ALLOWED_TAGS, ['tbody']); delete FORBID_TAGS.tbody; } if (freeze) { freeze(cfg); } CONFIG = cfg; }; var MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, [ 'mi', 'mo', 'mn', 'ms', 'mtext' ]); var HTML_INTEGRATION_POINTS = addToSet({}, [ 'foreignobject', 'desc', 'title', 'annotation-xml' ]); var COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, [ 'title', 'style', 'font', 'a', 'script' ]); var ALL_SVG_TAGS = addToSet({}, svg$1); addToSet(ALL_SVG_TAGS, svgFilters); addToSet(ALL_SVG_TAGS, svgDisallowed); var ALL_MATHML_TAGS = addToSet({}, mathMl$1); addToSet(ALL_MATHML_TAGS, mathMlDisallowed); var _checkValidNamespace = function _checkValidNamespace(element) { var parent = getParentNode(element); if (!parent || !parent.tagName) { parent = { namespaceURI: HTML_NAMESPACE, tagName: 'template' }; } var tagName = stringToLowerCase(element.tagName); var parentTagName = stringToLowerCase(parent.tagName); if (element.namespaceURI === SVG_NAMESPACE) { if (parent.namespaceURI === HTML_NAMESPACE) { return tagName === 'svg'; } if (parent.namespaceURI === MATHML_NAMESPACE) { return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]); } return Boolean(ALL_SVG_TAGS[tagName]); } if (element.namespaceURI === MATHML_NAMESPACE) { if (parent.namespaceURI === HTML_NAMESPACE) { return tagName === 'math'; } if (parent.namespaceURI === SVG_NAMESPACE) { return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName]; } return Boolean(ALL_MATHML_TAGS[tagName]); } if (element.namespaceURI === HTML_NAMESPACE) { if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) { return false; } if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) { return false; } return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]); } return false; }; var _forceRemove = function _forceRemove(node) { arrayPush(DOMPurify.removed, { element: node }); try { node.parentNode.removeChild(node); } catch (_) { try { node.outerHTML = emptyHTML; } catch (_) { node.remove(); } } }; var _removeAttribute = function _removeAttribute(name, node) { try { arrayPush(DOMPurify.removed, { attribute: node.getAttributeNode(name), from: node }); } catch (_) { arrayPush(DOMPurify.removed, { attribute: null, from: node }); } node.removeAttribute(name); if (name === 'is' && !ALLOWED_ATTR[name]) { if (RETURN_DOM || RETURN_DOM_FRAGMENT) { try { _forceRemove(node); } catch (_) { } } else { try { node.setAttribute(name, ''); } catch (_) { } } } }; var _initDocument = function _initDocument(dirty) { var doc; var leadingWhitespace; if (FORCE_BODY) { dirty = '' + dirty; } else { var matches = stringMatch(dirty, /^[\r\n\t ]+/); leadingWhitespace = matches && matches[0]; } if (PARSER_MEDIA_TYPE === 'application/xhtml+xml') { dirty = '' + dirty + ''; } var dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty; if (NAMESPACE === HTML_NAMESPACE) { try { doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE); } catch (_) { } } if (!doc || !doc.documentElement) { doc = implementation.createDocument(NAMESPACE, 'template', null); try { doc.documentElement.innerHTML = IS_EMPTY_INPUT ? '' : dirtyPayload; } catch (_) { } } var body = doc.body || doc.documentElement; if (dirty && leadingWhitespace) { body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null); } if (NAMESPACE === HTML_NAMESPACE) { return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0]; } return WHOLE_DOCUMENT ? doc.documentElement : body; }; var _createIterator = function _createIterator(root) { return createNodeIterator.call(root.ownerDocument || root, root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, null, false); }; var _isClobbered = function _isClobbered(elm) { return elm instanceof HTMLFormElement && (typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string' || typeof elm.insertBefore !== 'function'); }; var _isNode = function _isNode(object) { return _typeof(Node) === 'object' ? object instanceof Node : object && _typeof(object) === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string'; }; var _executeHook = function _executeHook(entryPoint, currentNode, data) { if (!hooks[entryPoint]) { return; } arrayForEach(hooks[entryPoint], function (hook) { hook.call(DOMPurify, currentNode, data, CONFIG); }); }; var _sanitizeElements = function _sanitizeElements(currentNode) { var content; _executeHook('beforeSanitizeElements', currentNode, null); if (_isClobbered(currentNode)) { _forceRemove(currentNode); return true; } if (regExpTest(/[\u0080-\uFFFF]/, currentNode.nodeName)) { _forceRemove(currentNode); return true; } var tagName = transformCaseFunc(currentNode.nodeName); _executeHook('uponSanitizeElement', currentNode, { tagName: tagName, allowedTags: ALLOWED_TAGS }); if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && (!_isNode(currentNode.content) || !_isNode(currentNode.content.firstElementChild)) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) { _forceRemove(currentNode); return true; } if (tagName === 'select' && regExpTest(/