/** * 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.7.0 (2021-02-10) */ (function () { 'use strict'; 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 __spreadArrays() { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; } var noop = function () { }; 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 = function (value) { return function () { return value; }; }; var identity = function (x) { return x; }; 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 apply = function (f) { return f(); }; var never = constant(false); var always = constant(true); 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(isiPad), isiPhone: constant(isiPhone), isTablet: constant(isTablet), isPhone: constant(isPhone), isTouch: constant(isTouch), isAndroid: os.isAndroid, isiOS: os.isiOS, isWebView: constant(iOSwebview), isDesktop: constant(isDesktop) }; }; var none = function () { return NONE; }; var NONE = function () { var eq = function (o) { return o.isNone(); }; var call = function (thunk) { return thunk(); }; var id = function (n) { return n; }; var me = { fold: function (n, _s) { return n(); }, is: never, isSome: never, isNone: always, getOr: id, getOrThunk: call, getOrDie: function (msg) { throw new Error(msg || 'error: getOrDie called on none.'); }, getOrNull: constant(null), getOrUndefined: constant(undefined), or: id, orThunk: call, map: none, each: noop, bind: none, exists: never, forall: always, filter: none, equals: eq, equals_: eq, toArray: function () { return []; }, toString: constant('none()') }; return me; }(); var some = function (a) { var constant_a = constant(a); var self = function () { return me; }; var bind = function (f) { return f(a); }; var me = { fold: function (n, s) { return s(a); }, is: function (v) { return a === v; }, 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 + ')'; }, equals: function (o) { return o.is(a); }, equals_: function (o, elementEq) { return o.fold(never, function (b) { return elementEq(a, b); }); } }; return me; }; var from = function (value) { return value === null || value === undefined ? NONE : some(value); }; var Optional = { some: some, none: none, from: from }; 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 = function (type) { return function (value) { return typeOf(value) === type; }; }; var isSimpleType = function (type) { return function (value) { return typeof value === type; }; }; var isString = isType('string'); var isObject = isType('object'); var isArray = isType('array'); var isBoolean = isSimpleType('boolean'); 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 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 contains = 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 map = 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 = 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 filter = 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) { acc = f(acc, x); }); return acc; }; var foldl = function (xs, f, acc) { each(xs, function (x) { acc = f(acc, x); }); 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 = function (xs, pred) { return findUntil(xs, pred, never); }; var findIndex = 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 = function (xs, f) { return flatten(map(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(a1, function (x) { return !contains(a2, x); }); }; var pure = function (x) { return [x]; }; var sort = function (xs, comparator) { var copy = nativeSlice.call(xs, 0); copy.sort(comparator); return copy; }; var get = function (xs, i) { return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); }; var head = function (xs) { return get(xs, 0); }; 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 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$1 = 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(group(1), group(2)); }; var detect = function (versionRegexes, agent) { var cleanedAgent = String(agent).toLowerCase(); if (versionRegexes.length === 0) { return unknown(); } return find$1(versionRegexes, cleanedAgent); }; var unknown = function () { return nu(0, 0); }; var nu = function (major, minor) { return { major: major, minor: minor }; }; var Version = { nu: nu, detect: detect, unknown: unknown }; var detect$1 = function (candidates, userAgent) { var agent = String(userAgent).toLowerCase(); return find(candidates, function (candidate) { return candidate.search(agent); }); }; var detectBrowser = function (browsers, userAgent) { return detect$1(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$1(oses, userAgent).map(function (os) { var version = Version.detect(os.versionRegexes, userAgent); return { current: os.name, version: version }; }); }; var UaString = { detectBrowser: detectBrowser, detectOs: detectOs }; var checkRange = function (str, substr, start) { return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr; }; var supplant = function (str, obj) { var isStringOrNumber = function (a) { var t = typeof a; return t === 'string' || t === 'number'; }; return str.replace(/\$\{([^{}]*)\}/g, function (fullMatch, key) { var value = obj[key]; return isStringOrNumber(value) ? value.toString() : fullMatch; }); }; var contains$1 = function (str, substr) { return str.indexOf(substr) !== -1; }; 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 = blank(/^\s+|\s+$/g); 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', 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(browsers), oses: constant(oses) }; var edge = 'Edge'; var chrome = 'Chrome'; var ie = 'IE'; var opera = 'Opera'; var firefox = 'Firefox'; var safari = 'Safari'; var unknown$1 = function () { return nu$1({ current: undefined, version: Version.unknown() }); }; var nu$1 = 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$1, nu: nu$1, edge: constant(edge), chrome: constant(chrome), ie: constant(ie), opera: constant(opera), firefox: constant(firefox), safari: constant(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$2 = function () { return nu$2({ current: undefined, version: Version.unknown() }); }; var nu$2 = 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$2, nu: nu$2, windows: constant(windows), ios: constant(ios), android: constant(android), linux: constant(linux), osx: constant(osx), solaris: constant(solaris), freebsd: constant(freebsd), chromeos: constant(chromeos) }; var detect$2 = function (userAgent, mediaMatch) { var browsers = PlatformInfo.browsers(); var oses = PlatformInfo.oses(); var browser = UaString.detectBrowser(browsers, userAgent).fold(Browser.unknown, Browser.nu); var os = UaString.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, mediaMatch); }); var detect$3 = function () { return platform(); }; var constant$1 = constant; var touchstart = constant$1('touchstart'); var touchmove = constant$1('touchmove'); var touchend = constant$1('touchend'); var mousedown = constant$1('mousedown'); var mousemove = constant$1('mousemove'); var mouseup = constant$1('mouseup'); var mouseover = constant$1('mouseover'); var keydown = constant$1('keydown'); var keyup = constant$1('keyup'); var input = constant$1('input'); var change = constant$1('change'); var click = constant$1('click'); var transitionend = constant$1('transitionend'); var selectstart = constant$1('selectstart'); var prefixName = function (name) { return constant('alloy.' + name); }; var alloy = { tap: prefixName('tap') }; var focus = prefixName('focus'); var postBlur = prefixName('blur.post'); var postPaste = prefixName('paste.post'); var receive = prefixName('receive'); var execute = prefixName('execute'); var focusItem = prefixName('focus.item'); var tap = alloy.tap; var longpress = prefixName('longpress'); var systemInit = prefixName('system.init'); var attachedToDom = prefixName('system.attached'); var detachedFromDom = prefixName('system.detached'); var focusShifted = prefixName('focusmanager.shifted'); var highlight = prefixName('highlight'); var dehighlight = 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()); }; 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 dispatchFocus = function (component, target) { component.getSystem().triggerFocus(target, component.element); }; var DOCUMENT = 9; var DOCUMENT_FRAGMENT = 11; var ELEMENT = 1; var TEXT = 3; var fromHtml = 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, fromTag: fromTag, fromText: fromText, fromDom: fromDom, fromPoint: fromPoint }; 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 = function (selector, scope) { var base = scope === undefined ? document : scope.dom; return bypassSelector(base) ? [] : map(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 Global = typeof window !== 'undefined' ? window : Function('return this;')(); var name = function (element) { var r = element.dom.nodeName; return r.toLowerCase(); }; var type = function (element) { return element.dom.nodeType; }; var isType$1 = function (t) { return function (element) { return type(element) === t; }; }; var isElement = isType$1(ELEMENT); var isText = isType$1(TEXT); var isDocument = isType$1(DOCUMENT); var isDocumentFragment = isType$1(DOCUMENT_FRAGMENT); var owner = function (element) { return SugarElement.fromDom(element.dom.ownerDocument); }; var documentOrOwner = function (dos) { return isDocument(dos) ? dos : owner(dos); }; 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 parents = function (element, isRoot) { var stop = isFunction(isRoot) ? isRoot : never; var dom = element.dom; var ret = []; while (dom.parentNode !== null && dom.parentNode !== undefined) { var rawParent = dom.parentNode; var p = SugarElement.fromDom(rawParent); ret.push(p); if (stop(p) === true) { break; } else { dom = rawParent; } } return ret; }; var siblings = function (element) { var filterSelf = function (elements) { return filter(elements, function (x) { return !eq(element, x); }); }; return parent(element).map(children).map(filterSelf).getOr([]); }; var nextSibling = function (element) { return Optional.from(element.dom.nextSibling).map(SugarElement.fromDom); }; var children = function (element) { return map(element.dom.childNodes, SugarElement.fromDom); }; var child = function (element, index) { var cs = element.dom.childNodes; return Optional.from(cs[index]).map(SugarElement.fromDom); }; var firstChild = function (element) { return child(element, 0); }; var before = function (marker, element) { var parent$1 = parent(marker); parent$1.each(function (v) { v.dom.insertBefore(element.dom, marker.dom); }); }; var after = function (marker, element) { var sibling = nextSibling(marker); sibling.fold(function () { var parent$1 = parent(marker); parent$1.each(function (v) { append(v, element); }); }, function (v) { before(v, element); }); }; var prepend = function (parent, element) { var firstChild$1 = firstChild(parent); firstChild$1.fold(function () { append(parent, element); }, function (v) { parent.dom.insertBefore(element.dom, v.dom); }); }; var append = function (parent, element) { parent.dom.appendChild(element.dom); }; var appendAt = function (parent, element, index) { child(parent, index).fold(function () { append(parent, element); }, function (v) { before(v, element); }); }; var append$1 = function (parent, elements) { each(elements, function (x) { append(parent, x); }); }; var empty = function (element) { element.dom.textContent = ''; each(children(element), function (rogue) { remove(rogue); }); }; var remove = function (element) { var dom = element.dom; if (dom.parentNode !== null) { dom.parentNode.removeChild(dom); } }; var isShadowRoot = function (dos) { return isDocumentFragment(dos) && isNonNullable(dos.dom.host); }; var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode); var isSupported = constant(supported); var getRootNode = supported ? function (e) { return SugarElement.fromDom(e.dom.getRootNode()); } : documentOrOwner; 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(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(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 fireDetaching = function (component) { emit(component, detachedFromDom()); var children = component.components(); each(children, fireDetaching); }; var fireAttaching = function (component) { var children = component.components(); each(children, fireAttaching); emit(component, attachedToDom()); }; var attach = function (parent, child) { append(parent.element, child.element); }; var detachChildren = function (component) { each(component.components(), function (childComp) { return remove(childComp.element); }); empty(component.element); component.syncComponents(); }; var replaceChildren = function (component, newChildren) { var subs = component.components(); detachChildren(component); var deleted = difference(subs, newChildren); each(deleted, function (comp) { fireDetaching(comp); component.getSystem().removeFromWorld(comp); }); each(newChildren, function (childComp) { if (!childComp.getSystem().isConnected()) { component.getSystem().addToWorld(childComp); attach(component, childComp); if (inBody(component.element)) { fireAttaching(childComp); } } else { attach(component, childComp); } component.syncComponents(); }); }; var attach$1 = function (parent, child) { attachWith(parent, child, append); }; 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(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 attachSystemAfter = function (element, guiSystem) { attachSystemWith(element, guiSystem, after); }; var attachSystemWith = function (element, guiSystem, inserter) { inserter(element, guiSystem.element); var children$1 = children(guiSystem.element); each(children$1, function (child) { guiSystem.getByDom(child).each(fireAttaching); }); }; var detachSystem = function (guiSystem) { var children$1 = children(guiSystem.element); each(children$1, function (child) { guiSystem.getByDom(child).each(fireDetaching); }); remove(guiSystem.element); }; var keys = Object.keys; var hasOwnProperty = Object.hasOwnProperty; var each$1 = 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$1(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$1(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$1(obj, function (value, name) { r.push(f(value, name)); }); return r; }; var find$2 = 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, function (v) { return v; }); }; var get$1 = function (obj, key) { return has(obj, key) ? Optional.from(obj[key]) : Optional.none(); }; var has = function (obj, key) { return hasOwnProperty.call(obj, key); }; var hasNonNullableKey = function (obj, key) { return has(obj, key) && obj[key] !== undefined && obj[key] !== null; }; 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 = function (element, key, value) { rawSet(element.dom, key, value); }; var setAll = function (element, attrs) { var dom = element.dom; each$1(attrs, function (v, k) { rawSet(dom, k, v); }); }; var get$2 = function (element, key) { var v = element.dom.getAttribute(key); return v === null ? undefined : v; }; var getOpt = function (element, key) { return Optional.from(get$2(element, key)); }; var has$1 = function (element, key) { var dom = element.dom; return dom && dom.hasAttribute ? dom.hasAttribute(key) : false; }; var remove$1 = function (element, key) { element.dom.removeAttribute(key); }; var read = function (element, attr) { var value = get$2(element, attr); return value === undefined || value === '' ? [] : value.split(' '); }; var add = function (element, attr, id) { var old = read(element, attr); var nu = old.concat([id]); set(element, attr, nu.join(' ')); return true; }; var remove$2 = function (element, attr, id) { var nu = filter(read(element, attr), function (v) { return v !== id; }); if (nu.length > 0) { set(element, attr, nu.join(' ')); } else { remove$1(element, attr); } return false; }; var supports = function (element) { return element.dom.classList !== undefined; }; var get$3 = function (element) { return read(element, 'class'); }; var add$1 = function (element, clazz) { return add(element, 'class', clazz); }; var remove$3 = function (element, clazz) { return remove$2(element, 'class', clazz); }; var add$2 = function (element, clazz) { if (supports(element)) { element.dom.classList.add(clazz); } else { add$1(element, clazz); } }; var cleanClass = function (element) { var classList = supports(element) ? element.dom.classList : get$3(element); if (classList.length === 0) { remove$1(element, 'class'); } }; var remove$4 = function (element, clazz) { if (supports(element)) { var classList = element.dom.classList; classList.remove(clazz); } else { remove$3(element, clazz); } cleanClass(element); }; var has$2 = function (element, clazz) { return supports(element) && element.dom.classList.contains(clazz); }; var swap = function (element, addCls, removeCls) { remove$4(element, removeCls); add$2(element, addCls); }; var toAlpha = function (component, swapConfig, _swapState) { swap(component.element, swapConfig.alpha, swapConfig.omega); }; var toOmega = function (component, swapConfig, _swapState) { swap(component.element, swapConfig.omega, swapConfig.alpha); }; var clear = function (component, swapConfig, _swapState) { remove$4(component.element, swapConfig.alpha); remove$4(component.element, swapConfig.omega); }; var isAlpha = function (component, swapConfig, _swapState) { return has$2(component.element, swapConfig.alpha); }; var isOmega = function (component, swapConfig, _swapState) { return has$2(component.element, swapConfig.omega); }; var SwapApis = /*#__PURE__*/Object.freeze({ __proto__: null, toAlpha: toAlpha, toOmega: toOmega, isAlpha: isAlpha, isOmega: isOmega, clear: clear }); var value = function (o) { var is = function (v) { return o === v; }; var or = function (_opt) { return value(o); }; var orThunk = function (_f) { return value(o); }; var map = function (f) { return value(f(o)); }; var mapError = function (_f) { return value(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 { is: is, isValue: always, isError: never, getOr: constant(o), getOrThunk: constant(o), getOrDie: constant(o), or: or, orThunk: orThunk, fold: fold, map: map, mapError: mapError, each: each, bind: bind, exists: exists, forall: forall, toOptional: toOptional }; }; var error = function (message) { var getOrThunk = function (f) { return f(); }; var getOrDie = function () { return die(String(message))(); }; var or = function (opt) { return opt; }; var orThunk = function (f) { return f(); }; var map = function (_f) { return error(message); }; var mapError = function (f) { return error(f(message)); }; var bind = function (_f) { return error(message); }; var fold = function (onError, _) { return onError(message); }; return { is: never, isValue: never, isError: always, getOr: identity, 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(err); }, value); }; var Result = { value: value, error: error, fromOption: fromOption }; var SimpleResultType; (function (SimpleResultType) { SimpleResultType[SimpleResultType['Error'] = 0] = 'Error'; SimpleResultType[SimpleResultType['Value'] = 1] = 'Value'; }(SimpleResultType || (SimpleResultType = {}))); var fold = function (res, onError, onValue) { return res.stype === SimpleResultType.Error ? onError(res.serror) : onValue(res.svalue); }; var partition = function (results) { var values = []; var errors = []; each(results, function (obj) { fold(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$2 = 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 = function (res) { return fold(res, Result.error, Result.value); }; var fromResult = function (res) { return res.fold(serror, svalue); }; var SimpleResult = { fromResult: fromResult, toResult: toResult, svalue: svalue, partition: partition, serror: serror, bind: bind$1, bindError: bindError, map: map$2, mapError: mapError, fold: fold }; var generate = 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(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(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 }; var hasOwnProperty$1 = Object.prototype.hasOwnProperty; var shallow = 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 (hasOwnProperty$1.call(curObject, key)) { ret[key] = merger(ret[key], curObject[key]); } } } return ret; }; }; var deepMerge = baseMerge(deep); var merge = baseMerge(shallow); var adt = Adt.generate([ { strict: [] }, { defaultedThunk: ['fallbackThunk'] }, { asOption: [] }, { asDefaultedOptionThunk: ['fallbackThunk'] }, { mergeWithThunk: ['baseThunk'] } ]); var defaulted = function (fallback) { return adt.defaultedThunk(constant(fallback)); }; var mergeWith = function (base) { return adt.mergeWithThunk(constant(base)); }; var strict = adt.strict; var asOption = adt.asOption; var defaultedThunk = adt.defaultedThunk; var asDefaultedOptionThunk = adt.asDefaultedOptionThunk; var mergeWithThunk = adt.mergeWithThunk; var comparison = Adt.generate([ { bothErrors: [ 'error1', 'error2' ] }, { firstError: [ 'error1', 'value2' ] }, { secondError: [ 'value1', 'error2' ] }, { bothValues: [ 'value1', 'value2' ] } ]); var partition$1 = function (results) { var errors = []; var values = []; each(results, function (result) { result.fold(function (err) { errors.push(err); }, function (value) { values.push(value); }); }); return { errors: errors, values: values }; }; var exclude = function (obj, fields) { var r = {}; each$1(obj, function (v, k) { if (!contains(fields, k)) { r[k] = v; } }); return r; }; var wrap = function (key, value) { var _a; return _a = {}, _a[key] = value, _a; }; var wrapAll = function (keyvalues) { var r = {}; each(keyvalues, function (kv) { r[kv.key] = kv.value; }); return r; }; var exclude$1 = function (obj, fields) { return exclude(obj, fields); }; var wrap$1 = function (key, value) { return wrap(key, value); }; var wrapAll$1 = function (keyvalues) { return wrapAll(keyvalues); }; var mergeValues = function (values, base) { return values.length === 0 ? Result.value(base) : Result.value(deepMerge(base, merge.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 mergeValues$1 = function (values, base) { return values.length > 0 ? SimpleResult.svalue(deepMerge(base, merge.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: function () { return '... (only showing first ten failures)'; } }]) : errors; return map(es, function (e) { return 'Failed path: (' + e.path.join(' > ') + ')\n' + e.getErrorInfo(); }); }; var nu$3 = function (path, getErrorInfo) { return SimpleResult.serror([{ path: path, getErrorInfo: getErrorInfo }]); }; var missingStrict = function (path, key, obj) { return nu$3(path, function () { return 'Could not find valid *strict* value for "' + key + '" in ' + formatObj(obj); }); }; var missingKey = function (path, key) { return nu$3(path, function () { return 'Choice schema did not contain choice key: "' + key + '"'; }); }; var missingBranch = function (path, branches, branch) { return nu$3(path, function () { return 'The chosen schema: "' + branch + '" did not exist in branches: ' + formatObj(branches); }); }; var unsupportedFields = function (path, unsupported) { return nu$3(path, function () { return 'There are unsupported fields: [' + unsupported.join(', ') + '] specified'; }); }; var custom = function (path, err) { return nu$3(path, function () { return err; }); }; var adt$1 = Adt.generate([ { field: [ 'key', 'okey', 'presence', 'prop' ] }, { state: [ 'okey', 'instantiator' ] } ]); var strictAccess = function (path, obj, key) { return get$1(obj, key).fold(function () { return missingStrict(path, key, obj); }, SimpleResult.svalue); }; var fallbackAccess = function (obj, key, fallbackThunk) { var v = get$1(obj, key).fold(function () { return fallbackThunk(obj); }, identity); return SimpleResult.svalue(v); }; var optionAccess = function (obj, key) { return SimpleResult.svalue(get$1(obj, key)); }; var optionDefaultedAccess = function (obj, key, fallback) { var opt = get$1(obj, key).map(function (val) { return val === true ? fallback(obj) : val; }); return SimpleResult.svalue(opt); }; var cExtractOne = function (path, obj, field, strength) { return field.fold(function (key, okey, presence, prop) { var bundle = function (av) { var result = prop.extract(path.concat([key]), strength, av); return SimpleResult.map(result, function (res) { return wrap(okey, strength(res)); }); }; var bundleAsOption = function (optValue) { return optValue.fold(function () { var outcome = wrap(okey, strength(Optional.none())); return SimpleResult.svalue(outcome); }, function (ov) { var result = prop.extract(path.concat([key]), strength, ov); return SimpleResult.map(result, function (res) { return wrap(okey, strength(Optional.some(res))); }); }); }; return function () { return presence.fold(function () { return SimpleResult.bind(strictAccess(path, obj, key), bundle); }, function (fallbackThunk) { return SimpleResult.bind(fallbackAccess(obj, key, fallbackThunk), bundle); }, function () { return SimpleResult.bind(optionAccess(obj, key), bundleAsOption); }, function (fallbackThunk) { return SimpleResult.bind(optionDefaultedAccess(obj, key, fallbackThunk), bundleAsOption); }, function (baseThunk) { var base = baseThunk(obj); var result = SimpleResult.map(fallbackAccess(obj, key, constant({})), function (v) { return deepMerge(base, v); }); return SimpleResult.bind(result, bundle); }); }(); }, function (okey, instantiator) { var state = instantiator(obj); return SimpleResult.svalue(wrap(okey, strength(state))); }); }; var cExtract = function (path, obj, fields, strength) { var results = map(fields, function (field) { return cExtractOne(path, obj, field, strength); }); return ResultCombine.consolidateObj(results, {}); }; var value$1 = function (validator) { var extract = function (path, strength, val) { return SimpleResult.bindError(validator(val, strength), function (err) { return custom(path, err); }); }; var toString = function () { return 'val'; }; return { extract: extract, toString: toString }; }; var getSetKeys = function (obj) { return keys(filter$1(obj, function (value) { return value !== undefined && value !== null; })); }; var objOfOnly = function (fields) { var delegate = objOf(fields); var fieldNames = foldr(fields, function (acc, f) { return f.fold(function (key) { return deepMerge(acc, wrap$1(key, true)); }, constant(acc)); }, {}); var extract = function (path, strength, o) { var keys = isBoolean(o) ? [] : getSetKeys(o); var extra = filter(keys, function (k) { return !hasNonNullableKey(fieldNames, k); }); return extra.length === 0 ? delegate.extract(path, strength, o) : unsupportedFields(path, extra); }; return { extract: extract, toString: delegate.toString }; }; var objOf = function (fields) { var extract = function (path, strength, o) { return cExtract(path, o, fields, strength); }; var toString = function () { var fieldStrings = map(fields, function (field) { return field.fold(function (key, okey, presence, prop) { return key + ' -> ' + prop.toString(); }, function (okey, _instantiator) { return 'state(' + okey + ')'; }); }); return 'obj{\n' + fieldStrings.join('\n') + '}'; }; return { extract: extract, toString: toString }; }; var arrOf = function (prop) { var extract = function (path, strength, array) { var results = map(array, function (a, i) { return prop.extract(path.concat(['[' + i + ']']), strength, a); }); return ResultCombine.consolidateArr(results); }; var toString = function () { return 'array(' + prop.toString() + ')'; }; return { extract: extract, toString: toString }; }; var setOf = function (validator, prop) { var validateKeys = function (path, keys) { return arrOf(value$1(validator)).extract(path, identity, keys); }; var extract = function (path, strength, o) { var keys$1 = keys(o); var validatedKeys = validateKeys(path, keys$1); return SimpleResult.bind(validatedKeys, function (validKeys) { var schema = map(validKeys, function (vk) { return adt$1.field(vk, vk, strict(), prop); }); return objOf(schema).extract(path, strength, o); }); }; var toString = function () { return 'setOf(' + prop.toString() + ')'; }; return { extract: extract, toString: toString }; }; var anyValue = constant(value$1(SimpleResult.svalue)); var state = adt$1.state; var field = adt$1.field; var chooseFrom = function (path, strength, input, branches, ch) { var fields = get$1(branches, ch); return fields.fold(function () { return missingBranch(path, branches, ch); }, function (vp) { return vp.extract(path.concat(['branch: ' + ch]), strength, input); }); }; var choose = function (key, branches) { var extract = function (path, strength, input) { var choice = get$1(input, key); return choice.fold(function () { return missingKey(path, key); }, function (chosen) { return chooseFrom(path, strength, input, branches, chosen); }); }; var toString = function () { return 'chooseOn(' + key + '). Possible values: ' + keys(branches); }; return { extract: extract, toString: toString }; }; var _anyValue = value$1(SimpleResult.svalue); var valueOf = function (validator) { return value$1(function (v) { return validator(v).fold(SimpleResult.serror, SimpleResult.svalue); }); }; var setOf$1 = function (validator, prop) { return setOf(function (v) { return SimpleResult.fromResult(validator(v)); }, prop); }; var extract = function (label, prop, strength, obj) { var res = prop.extract([label], strength, obj); return SimpleResult.mapError(res, function (errs) { return { input: obj, errors: errs }; }); }; var asRaw = function (label, prop, obj) { return SimpleResult.toResult(extract(label, prop, identity, obj)); }; var getOrDie = function (extraction) { return extraction.fold(function (errInfo) { throw new Error(formatError(errInfo)); }, identity); }; var asRawOrDie = 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(key, map$1(branches, objOf)); }; var anyValue$1 = constant(_anyValue); var typedValue = function (validator, expectedType) { return value$1(function (a) { var actualType = typeof a; return validator(a) ? SimpleResult.svalue(a) : SimpleResult.serror('Expected type: ' + expectedType + ' but got: ' + actualType); }); }; var functionProcessor = typedValue(isFunction, 'function'); var strict$1 = function (key) { return field(key, key, strict(), anyValue()); }; var strictOf = function (key, schema) { return field(key, key, strict(), schema); }; var strictFunction = function (key) { return strictOf(key, functionProcessor); }; var forbid = function (key, message) { return field(key, key, asOption(), value$1(function (_v) { return SimpleResult.serror('The field: ' + key + ' is forbidden. ' + message); })); }; var strictObjOf = function (key, objSchema) { return field(key, key, strict(), objOf(objSchema)); }; var option = function (key) { return field(key, key, asOption(), anyValue()); }; var optionOf = function (key, schema) { return field(key, key, asOption(), schema); }; var optionObjOf = function (key, objSchema) { return optionOf(key, objOf(objSchema)); }; var optionObjOfOnly = function (key, objSchema) { return optionOf(key, objOfOnly(objSchema)); }; var defaulted$1 = function (key, fallback) { return field(key, key, defaulted(fallback), anyValue()); }; var defaultedOf = function (key, fallback, schema) { return field(key, key, defaulted(fallback), schema); }; var defaultedFunction = function (key, fallback) { return defaultedOf(key, fallback, functionProcessor); }; var defaultedObjOf = function (key, fallback, objSchema) { return defaultedOf(key, fallback, objOf(objSchema)); }; var state$1 = function (okey, instantiator) { return state(okey, instantiator); }; var SwapSchema = [ strict$1('alpha'), strict$1('omega') ]; var ensureIsRoot = function (isRoot) { return isFunction(isRoot) ? isRoot : never; }; var ancestor = 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 = function (scope, transform, isRoot) { var current = transform(scope); var stop = ensureIsRoot(isRoot); return current.orThunk(function () { return stop(scope) ? Optional.none() : ancestor(scope, transform, stop); }); }; var isSource = function (component, simulatedEvent) { return eq(component.element, simulatedEvent.event.target); }; var nu$4 = 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 asRawOrDie('Extracting event.handler', objOfOnly([ defaulted$1('can', always), defaulted$1('abort', never), defaulted$1('run', noop) ]), parts); }; var all$1 = 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$1 = function (handler) { return isFunction(handler) ? { can: always, abort: never, run: handler } : handler; }; var fuse = function (handlers) { var can = all$1(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(handlers, function (handler) { handler.run.apply(undefined, args); }); }; return nu$4({ can: can, abort: abort, run: run }); }; var derive = function (configs) { return wrapAll$1(configs); }; var abort = function (name, predicate) { return { key: name, value: nu$4({ abort: predicate }) }; }; var can = function (name, predicate) { return { key: name, value: nu$4({ can: predicate }) }; }; var run = function (name, handler) { return { key: name, value: nu$4({ run: handler }) }; }; var runActionExtra = function (name, action, extra) { return { key: name, value: nu$4({ run: function (component, simulatedEvent) { action.apply(undefined, [ component, simulatedEvent ].concat(extra)); } }) }; }; var runOnName = function (name) { return function (handler) { return run(name, handler); }; }; var runOnSourceName = function (name) { return function (handler) { return { key: name, value: nu$4({ run: function (component, simulatedEvent) { if (isSource(component, simulatedEvent)) { handler(component, simulatedEvent); } } }) }; }; }; var redirectToUid = function (name, uid) { return run(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 cutter = function (name) { return run(name, function (component, simulatedEvent) { simulatedEvent.cut(); }); }; var stopper = function (name) { return run(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 = runOnName(execute()); 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(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 nu$5 = function (s) { return { classes: s.classes !== undefined ? s.classes : [], attributes: s.attributes !== undefined ? s.attributes : {}, styles: s.styles !== undefined ? s.styles : {} }; }; var merge$1 = 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 executeEvent = function (bConfig, bState, executor) { return runOnExecute(function (component) { executor(component, bConfig, bState); }); }; var loadEvent = function (bConfig, bState, f) { return runOnInit(function (component, _simulatedEvent) { f(component, bConfig, bState); }); }; var create = 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 = 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(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(name + '-config', configSchema, spec); return { key: name, value: { config: prepared, me: me, configAsRaw: cached(function () { return asRawOrDie(name + '-config', configSchema, spec); }), initialConfig: spec, state: state } }; }, schema: constant(schemaSchema), exhibit: function (info, base) { return getConfig(info).bind(function (behaviourInfo) { return get$1(active, 'exhibit').map(function (exhibitor) { return exhibitor(base, behaviourInfo.config, behaviourInfo.state); }); }).getOr(nu$5({})); }, name: constant(name), handlers: function (info) { return getConfig(info).map(function (behaviourInfo) { var getEvents = get$1(active, 'events').getOr(function () { return {}; }); return getEvents(behaviourInfo.config, behaviourInfo.state); }).getOr({}); } }); return me; }; var NoState = { init: function () { return nu$6({ readState: function () { return 'No State required'; } }); } }; var nu$6 = function (spec) { return spec; }; var derive$1 = function (capabilities) { return wrapAll$1(capabilities); }; var simpleSchema = objOfOnly([ strict$1('fields'), strict$1('name'), defaulted$1('active', {}), defaulted$1('apis', {}), defaulted$1('state', NoState), defaulted$1('extra', {}) ]); var create$1 = function (data) { var value = asRawOrDie('Creating behaviour: ' + data.name, simpleSchema, data); return create(value.fields, value.name, value.active, value.apis, value.extra, value.state); }; var modeSchema = objOfOnly([ strict$1('branchKey'), strict$1('branches'), strict$1('name'), defaulted$1('active', {}), defaulted$1('apis', {}), defaulted$1('state', NoState), defaulted$1('extra', {}) ]); var createModes$1 = function (data) { var value = asRawOrDie('Creating behaviour: ' + data.name, modeSchema, data); return createModes(choose$1(value.branchKey, value.branches), value.name, value.active, value.apis, value.extra, value.state); }; var revoke = constant(undefined); var Swapping = create$1({ fields: SwapSchema, name: 'swapping', apis: SwapApis }); var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; return { get: get, set: set }; }; var getDocument = function () { return SugarElement.fromDom(document); }; var focus$1 = function (element) { return element.dom.focus(); }; var blur = 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 global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); var global$2 = tinymce.util.Tools.resolve('tinymce.ThemeManager'); var openLink = function (target) { var link = document.createElement('a'); link.target = '_blank'; link.href = target.href; link.rel = 'noreferrer noopener'; var nuEvt = document.createEvent('MouseEvents'); nuEvt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); document.body.appendChild(link); link.dispatchEvent(nuEvt); document.body.removeChild(link); }; var DefaultStyleFormats = [ { title: 'Headings', items: [ { title: 'Heading 1', format: 'h1' }, { title: 'Heading 2', format: 'h2' }, { title: 'Heading 3', format: 'h3' }, { title: 'Heading 4', format: 'h4' }, { title: 'Heading 5', format: 'h5' }, { title: 'Heading 6', format: 'h6' } ] }, { title: 'Inline', items: [ { title: 'Bold', icon: 'bold', format: 'bold' }, { title: 'Italic', icon: 'italic', format: 'italic' }, { title: 'Underline', icon: 'underline', format: 'underline' }, { title: 'Strikethrough', icon: 'strikethrough', format: 'strikethrough' }, { title: 'Superscript', icon: 'superscript', format: 'superscript' }, { title: 'Subscript', icon: 'subscript', format: 'subscript' }, { title: 'Code', icon: 'code', format: 'code' } ] }, { title: 'Blocks', items: [ { title: 'Paragraph', format: 'p' }, { title: 'Blockquote', format: 'blockquote' }, { title: 'Div', format: 'div' }, { title: 'Pre', format: 'pre' } ] }, { title: 'Alignment', items: [ { title: 'Left', icon: 'alignleft', format: 'alignleft' }, { title: 'Center', icon: 'aligncenter', format: 'aligncenter' }, { title: 'Right', icon: 'alignright', format: 'alignright' }, { title: 'Justify', icon: 'alignjustify', format: 'alignjustify' } ] } ]; var defaults = [ 'undo', 'bold', 'italic', 'link', 'image', 'bullist', 'styleselect' ]; var isSkinDisabled = function (editor) { return editor.getParam('skin') === false; }; var readOnlyOnInit = function (_editor) { return false; }; var getToolbar = function (editor) { return editor.getParam('toolbar', defaults, 'array'); }; var getStyleFormats = function (editor) { return editor.getParam('style_formats', DefaultStyleFormats, 'array'); }; var getSkinUrl = function (editor) { return editor.getParam('skin_url'); }; var formatChanged = 'formatChanged'; var orientationChanged = 'orientationChanged'; var dropupDismissed = 'dropupDismissed'; 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$4 = function (element) { return element.dom.innerHTML; }; var set$1 = function (element, content) { var owner$1 = owner(element); var docDom = owner$1.dom; var fragment = SugarElement.fromDom(docDom.createDocumentFragment()); var contentElements = fromHtml$1(content, docDom); append$1(fragment, contentElements); empty(element); append(element, fragment); }; var getOuter = function (element) { var container = SugarElement.fromTag('div'); var clone = SugarElement.fromDom(element.dom.cloneNode(true)); append(container, clone); return get$4(container); }; var clone = function (original, isDeep) { return SugarElement.fromDom(original.dom.cloneNode(isDeep)); }; var shallow$1 = function (original) { return clone(original, false); }; var getHtml = function (element) { if (isShadowRoot(element)) { return '#shadow-root'; } else { var clone = shallow$1(element); return getOuter(clone); } }; var element = function (elem) { return getHtml(elem); }; var chooseChannels = function (channels, message) { return message.universal ? channels : filter(channels, function (ch) { return contains(message.channels, ch); }); }; var events = function (receiveConfig) { return derive([run(receive(), function (component, message) { var channelMap = receiveConfig.channels; var channels = keys(channelMap); var receivingData = message; var targetChannels = chooseChannels(channels, receivingData); each(targetChannels, function (ch) { var channelInfo = channelMap[ch]; var channelSchema = channelInfo.schema; var data = asRawOrDie('channel[' + ch + '] data\nReceiver: ' + element(component.element), channelSchema, receivingData.data); channelInfo.onReceive(component, data); }); })]); }; var ActiveReceiving = /*#__PURE__*/Object.freeze({ __proto__: null, events: events }); var unknown$3 = '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([ 'mousemove', 'mouseover', 'mouseout', systemInit() ], eventName)) { return; } console.log(eventName, { event: eventName, time: finishTime - startTime, target: initialTarget.dom, sequence: map(sequence, function (s) { if (!contains([ '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$1(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(lines, function (line) { return line.indexOf('alloy') > 0 && !exists(path, function (p) { return line.indexOf(p) > -1; }); }).getOr(unknown$3); } else { return unknown$3; } }; 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(ignoreEvent); var menuFields = constant([ strict$1('menu'), strict$1('selectedMenu') ]); var itemFields = constant([ strict$1('item'), strict$1('selectedItem') ]); var schema = constant(objOf(itemFields().concat(menuFields()))); var itemSchema = constant(objOf(itemFields())); var _initSize = strictObjOf('initSize', [ strict$1('numColumns'), strict$1('numRows') ]); var itemMarkers = function () { return strictOf('markers', itemSchema()); }; var tieredMenuMarkers = function () { return strictObjOf('markers', [strict$1('backgroundMenu')].concat(menuFields()).concat(itemFields())); }; var markers = function (required) { return strictObjOf('markers', map(required, strict$1)); }; var onPresenceHandler = function (label, fieldName, presence) { var trace = getTrace(); return field(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(noop)); }; var onKeyboardHandler = function (fieldName) { return onPresenceHandler('onKeyboardHandler', fieldName, defaulted(Optional.none)); }; var onStrictHandler = function (fieldName) { return onPresenceHandler('onHandler', fieldName, strict()); }; var onStrictKeyboardHandler = function (fieldName) { return onPresenceHandler('onKeyboardHandler', fieldName, strict()); }; var output = function (name, value) { return state$1(name, constant(value)); }; var snapshot = function (name) { return state$1(name, identity); }; var initSize = constant(_initSize); var ReceivingSchema = [strictOf('channels', setOf$1(Result.value, objOfOnly([ onStrictHandler('onReceive'), defaulted$1('schema', anyValue$1()) ])))]; var Receiving = create$1({ fields: ReceivingSchema, name: 'receiving', active: ActiveReceiving }); 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$4(component.element, toggleClass); } }); }; var toggle = function (component, toggleConfig, toggleState) { set$2(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$2 = 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$2(component, toggleConfig, toggleState, toggleConfig.selected); }; var ToggleApis = /*#__PURE__*/Object.freeze({ __proto__: null, onLoad: onLoad, toggle: toggle, isOn: isOn, on: on, off: off, set: set$2 }); var exhibit = function () { return nu$5({}); }; var events$1 = function (toggleConfig, toggleState) { var execute = executeEvent(toggleConfig, toggleState, toggle); var load = loadEvent(toggleConfig, toggleState, onLoad); return derive(flatten([ toggleConfig.toggleOnExecute ? [execute] : [], [load] ])); }; var ActiveToggle = /*#__PURE__*/Object.freeze({ __proto__: null, exhibit: exhibit, events: events$1 }); var updatePressed = function (component, ariaInfo, status) { set(component.element, 'aria-pressed', status); if (ariaInfo.syncWithExpanded) { updateExpanded(component, ariaInfo, status); } }; var updateSelected = function (component, ariaInfo, status) { set(component.element, 'aria-selected', status); }; var updateChecked = function (component, ariaInfo, status) { set(component.element, 'aria-checked', status); }; var updateExpanded = function (component, ariaInfo, status) { set(component.element, 'aria-expanded', status); }; var ToggleSchema = [ defaulted$1('selected', false), option('toggleClass'), defaulted$1('toggleOnExecute', true), defaultedOf('aria', { mode: 'none' }, choose$1('mode', { pressed: [ defaulted$1('syncWithExpanded', false), output('update', updatePressed) ], checked: [output('update', updateChecked)], expanded: [output('update', updateExpanded)], selected: [output('update', updateSelected)], none: [output('update', noop)] })) ]; var Toggling = create$1({ fields: ToggleSchema, name: 'toggling', active: ActiveToggle, apis: ToggleApis, state: SetupBehaviourCellState(false) }); var format = function (command, update) { return Receiving.config({ channels: wrap$1(formatChanged, { onReceive: function (button, data) { if (data.command === command) { update(button, data.state); } } }) }); }; var orientation = function (onReceive) { return Receiving.config({ channels: wrap$1(orientationChanged, { onReceive: onReceive }) }); }; var receive$1 = function (channel, onReceive) { return { key: channel, value: { onReceive: onReceive } }; }; var prefix = 'tinymce-mobile'; var resolve = function (p) { return prefix + '-' + p; }; var pointerEvents = function () { var onClick = function (component, simulatedEvent) { simulatedEvent.stop(); emitExecute(component); }; return [ run(click(), onClick), run(tap(), onClick), cutter(touchstart()), cutter(mousedown()) ]; }; var events$2 = function (optAction) { var executeHandler = function (action) { return runOnExecute(function (component, simulatedEvent) { action(component); simulatedEvent.stop(); }); }; return derive(flatten([ optAction.map(executeHandler).toArray(), pointerEvents() ])); }; var focus$2 = function (component, focusConfig) { if (!focusConfig.ignore) { focus$1(component.element); focusConfig.onFocus(component); } }; var blur$1 = function (component, focusConfig) { if (!focusConfig.ignore) { blur(component.element); } }; var isFocused = function (component) { return hasFocus(component.element); }; var FocusApis = /*#__PURE__*/Object.freeze({ __proto__: null, focus: focus$2, blur: blur$1, isFocused: isFocused }); var exhibit$1 = function (base, focusConfig) { var mod = focusConfig.ignore ? {} : { attributes: { tabindex: '-1' } }; return nu$5(mod); }; var events$3 = function (focusConfig) { return derive([run(focus(), function (component, simulatedEvent) { focus$2(component, focusConfig); simulatedEvent.stop(); })].concat(focusConfig.stopMousedown ? [run(mousedown(), function (_, simulatedEvent) { simulatedEvent.event.prevent(); })] : [])); }; var ActiveFocus = /*#__PURE__*/Object.freeze({ __proto__: null, exhibit: exhibit$1, events: events$3 }); var FocusSchema = [ onHandler('onFocus'), defaulted$1('stopMousedown', false), defaulted$1('ignore', false) ]; var Focusing = create$1({ fields: FocusSchema, name: 'focusing', active: ActiveFocus, apis: FocusApis }); var isSupported$1 = function (dom) { return dom.style !== undefined && isFunction(dom.style.getPropertyValue); }; 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$3 = function (element, property, value) { var dom = element.dom; internalSet(dom, property, value); }; var setAll$1 = function (element, css) { var dom = element.dom; each$1(css, function (v, k) { internalSet(dom, k, v); }); }; var get$5 = 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 remove$5 = function (element, property) { var dom = element.dom; internalRemove(dom, property); if (getOpt(element, 'style').map(trim).is('')) { remove$1(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$5(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$5(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 = Dimension('height', function (element) { var dom = element.dom; return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight; }); var get$6 = function (element) { return api.get(element); }; var ancestors = function (scope, predicate, isRoot) { return filter(parents(scope, isRoot), predicate); }; var siblings$1 = function (scope, predicate) { return filter(siblings(scope), predicate); }; var all$2 = function (selector) { return all(selector); }; var ancestors$1 = function (scope, selector, isRoot) { return ancestors(scope, function (e) { return is(e, selector); }, isRoot); }; var siblings$2 = function (scope, selector) { return siblings$1(scope, function (e) { return is(e, selector); }); }; var descendants = function (scope, selector) { return all(selector, scope); }; 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$1 = function (scope, predicate, isRoot) { var is = function (s, test) { return test(s); }; return ClosestOrAncestor(is, ancestor$1, scope, predicate, isRoot); }; var descendant = 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 first = function (selector) { return one(selector); }; var ancestor$2 = function (scope, selector, isRoot) { return ancestor$1(scope, function (e) { return is(e, selector); }, isRoot); }; var descendant$1 = function (scope, selector) { return one(selector, scope); }; var closest$2 = function (scope, selector, isRoot) { var is$1 = function (element, selector) { return is(element, selector); }; return ClosestOrAncestor(is$1, ancestor$2, scope, selector, isRoot); }; 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(before.concat(after), predicate); }; var tryPrev = function (values, index, predicate) { var before = reverse(values.slice(0, index)); return find(before, predicate); }; var cycleNext = function (values, index, predicate) { var before = values.slice(0, index); var after = values.slice(index + 1); return find(after.concat(before), predicate); }; var tryNext = function (values, index, predicate) { var after = values.slice(index + 1); return find(after, predicate); }; var inSet = function (keys) { return function (event) { var raw = event.raw; return contains(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$2 = function (transitions, event) { var transition = find(transitions, function (t) { return t.matches(event); }); return transition.map(function (t) { return t.classification; }); }; 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 = function (value, min, max) { return Math.min(Math.max(value, min), max); }; 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 someIf = function (b, a) { return b ? Optional.some(a) : Optional.none(); }; var dehighlightAllExcept = function (component, hConfig, hState, skip) { var highlighted = descendants(component.element, '.' + hConfig.highlightClass); each(highlighted, function (h) { if (!exists(skip, function (skipComp) { return skipComp.element === h; })) { remove$4(h, hConfig.highlightClass); component.getSystem().getByDom(h).each(function (target) { hConfig.onDehighlight(component, target); emit(target, dehighlight()); }); } }); }; var dehighlightAll = function (component, hConfig, hState) { return dehighlightAllExcept(component, hConfig, hState, []); }; var dehighlight$1 = function (component, hConfig, hState, target) { if (isHighlighted(component, hConfig, hState, target)) { remove$4(target.element, hConfig.highlightClass); hConfig.onDehighlight(component, target); emit(target, dehighlight()); } }; var highlight$1 = 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()); } }; var highlightFirst = function (component, hConfig, hState) { getFirst(component, hConfig).each(function (firstComp) { highlight$1(component, hConfig, hState, firstComp); }); }; var highlightLast = function (component, hConfig, hState) { getLast(component, hConfig).each(function (lastComp) { highlight$1(component, hConfig, hState, lastComp); }); }; var highlightAt = function (component, hConfig, hState, index) { getByIndex(component, hConfig, hState, index).fold(function (err) { throw err; }, function (firstComp) { highlight$1(component, hConfig, hState, firstComp); }); }; var highlightBy = function (component, hConfig, hState, predicate) { var candidates = getCandidates(component, hConfig); var targetComp = find(candidates, predicate); targetComp.each(function (c) { highlight$1(component, hConfig, hState, c); }); }; var isHighlighted = function (component, hConfig, hState, queryTarget) { return has$2(queryTarget.element, hConfig.highlightClass); }; var getHighlighted = function (component, hConfig, _hState) { return descendant$1(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$1(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 = function (component, hConfig, hState, delta) { var items = descendants(component.element, '.' + hConfig.itemClass); var current = findIndex(items, function (item) { return has$2(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(component, hConfig, hState, -1); }; var getNext = function (component, hConfig, hState) { return getDelta(component, hConfig, hState, +1); }; var getCandidates = function (component, hConfig, _hState) { var items = descendants(component.element, '.' + hConfig.itemClass); return cat(map(items, function (i) { return component.getSystem().getByDom(i).toOptional(); })); }; var HighlightApis = /*#__PURE__*/Object.freeze({ __proto__: null, dehighlightAll: dehighlightAll, dehighlight: dehighlight$1, highlight: highlight$1, highlightFirst: highlightFirst, highlightLast: highlightLast, highlightAt: highlightAt, highlightBy: highlightBy, isHighlighted: isHighlighted, getHighlighted: getHighlighted, getFirst: getFirst, getLast: getLast, getPrevious: getPrevious, getNext: getNext, getCandidates: getCandidates }); var HighlightSchema = [ strict$1('highlightClass'), strict$1('itemClass'), onHandler('onHighlight'), onHandler('onDehighlight') ]; var Highlighting = create$1({ fields: HighlightSchema, name: 'highlighting', apis: HighlightApis }); 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 = 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$1('focusManager', dom()), defaultedOf('focusInside', 'onFocus', valueOf(function (val) { return contains([ 'onFocus', 'onEnterOrSpace', 'onApi' ], val) ? Result.value(val) : Result.error('Invalid value for focusInside'); })), output('handler', me), output('state', stateInit), output('sendFocusIn', optFocusIn) ]); }; var processKey = function (component, simulatedEvent, getRules, keyingConfig, keyingState) { var rules = getRules(component, simulatedEvent, keyingConfig, keyingState); return choose$2(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(focus(), 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(keydown(), function (component, simulatedEvent) { processKey(component, simulatedEvent, getKeydownRules, keyingConfig, keyingState).fold(function () { tryGoInsideComponent(component, simulatedEvent); }, function (_) { simulatedEvent.stop(); }); }), run(keyup(), function (component, simulatedEvent) { processKey(component, simulatedEvent, getKeyupRules, keyingConfig, keyingState).each(function (_) { simulatedEvent.stop(); }); }) ]; return derive(onFocusHandler.toArray().concat(keyboardEvents)); }; var me = { schema: schema, processKey: processKey, toEvents: toEvents }; return me; }; var create$2 = function (cyclicField) { var schema = [ option('onEscape'), option('onEnter'), defaulted$1('selector', '[data-alloy-tabstop="true"]:not(:disabled)'), defaulted$1('firstTabstop', 0), defaulted$1('useTabstopAt', always), option('visibilitySelector') ].concat([cyclicField]); var isVisible = function (tabbingConfig, element) { var target = tabbingConfig.visibilitySelector.bind(function (sel) { return closest$2(element, sel); }).getOr(element); return get$6(target) > 0; }; var findInitial = function (component, tabbingConfig) { var tabstops = descendants(component.element, tabbingConfig.selector); var visibles = filter(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$2(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(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([ rule(and([ isShift, inSet(TAB) ]), goBackwards), rule(inSet(TAB), goForwards), rule(inSet(ESCAPE), exit), rule(and([ isNotShift, inSet(ENTER) ]), execute) ]); var getKeyupRules = constant([]); return typical(schema, NoState.init, getKeydownRules, getKeyupRules, function () { return Optional.some(focusIn); }); }; var AcyclicType = create$2(state$1('cyclic', never)); var CyclicType = create$2(state$1('cyclic', always)); var inside = function (target) { return name(target) === 'input' && get$2(target, 'type') !== 'radio' || name(target) === 'textarea'; }; var doDefaultExecute = function (component, _simulatedEvent, focused) { dispatch(component, focused, execute()); 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$1 = [ defaulted$1('execute', defaultExecute), defaulted$1('useSpace', false), defaulted$1('useEnter', true), defaulted$1('useControlEnter', false), defaulted$1('useDown', false) ]; var execute$1 = function (component, simulatedEvent, executeConfig) { return executeConfig.execute(component, simulatedEvent, component.element); }; var getKeydownRules = 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$1)].concat(executeConfig.useControlEnter ? [rule(and([ isControl, inSet(ENTER) ]), execute$1)] : []); }; var getKeyupRules = function (component, _simulatedEvent, executeConfig, _executeState) { return executeConfig.useSpace && !inside(component.element) ? [rule(inSet(SPACE), stopEventForFirefox)] : []; }; var ExecutionType = typical(schema$1, NoState.init, getKeydownRules, getKeyupRules, function () { return Optional.none(); }); var flatgrid = function () { var dimensions = Cell(Optional.none()); var setGridSize = function (numRows, numColumns) { dimensions.set(Optional.some({ 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$6({ 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 = function (spec) { return spec.state(spec); }; var KeyingState = /*#__PURE__*/Object.freeze({ __proto__: null, flatgrid: flatgrid, init: init }); var onDirection = function (isLtr, isRtl) { return function (element) { return getDirection(element) === 'rtl' ? isRtl : isLtr; }; }; var getDirection = function (element) { return get$5(element, 'direction') === 'rtl' ? 'rtl' : 'ltr'; }; var useH = function (movement) { return function (component, simulatedEvent, config, state) { var move = movement(component.element); return use(move, component, simulatedEvent, config, state); }; }; var west = function (moveLeft, moveRight) { var movement = onDirection(moveLeft, moveRight); return useH(movement); }; var east = 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 = useV; var south = useV; var move = useV; var isHidden = function (dom) { return dom.offsetWidth <= 0 && dom.offsetHeight <= 0; }; var isVisible = function (element) { return !isHidden(element.dom); }; var locate = function (candidates, predicate) { return findIndex(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(candidates, isVisible); return locate(visible, predicate); }; var findIndex$1 = function (elements, target) { return findIndex(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 = 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 = 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(oldColumn, 0, colsInRow - 1); return Optional.some({ row: newRow, column: newCol }); }); }; var cycleRight = function (values, index, numRows, numCols) { return cycleHorizontal(values, index, numRows, numCols, +1); }; var cycleLeft = function (values, index, numRows, numCols) { return cycleHorizontal(values, index, numRows, numCols, -1); }; var cycleUp = function (values, index, numRows, numCols) { return cycleVertical(values, index, numRows, numCols, -1); }; var cycleDown = function (values, index, numRows, numCols) { return cycleVertical(values, index, numRows, numCols, +1); }; var schema$2 = [ strict$1('selector'), defaulted$1('execute', defaultExecute), onKeyboardHandler('onEscape'), defaulted$1('captureTab', false), initSize() ]; var focusIn = function (component, gridConfig, _gridState) { descendant$1(component.element, gridConfig.selector).each(function (first) { gridConfig.focusManager.set(component, first); }); }; var findCurrent = function (component, gridConfig) { return gridConfig.focusManager.get(component).bind(function (elem) { return closest$2(elem, gridConfig.selector); }); }; var execute$2 = function (component, simulatedEvent, gridConfig, _gridState) { return findCurrent(component, gridConfig).bind(function (focused) { return gridConfig.execute(component, simulatedEvent, focused); }); }; var doMove = 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 = function (component, simulatedEvent, gridConfig) { return gridConfig.onEscape(component, simulatedEvent); }; var moveLeft = doMove(cycleLeft); var moveRight = doMove(cycleRight); var moveNorth = doMove(cycleUp); var moveSouth = doMove(cycleDown); var getKeydownRules$1 = constant([ rule(inSet(LEFT), west(moveLeft, moveRight)), rule(inSet(RIGHT), east(moveLeft, moveRight)), rule(inSet(UP), north(moveNorth)), rule(inSet(DOWN), south(moveSouth)), rule(and([ isShift, inSet(TAB) ]), handleTab), rule(and([ isNotShift, inSet(TAB) ]), handleTab), rule(inSet(ESCAPE), doEscape), rule(inSet(SPACE.concat(ENTER)), execute$2) ]); var getKeyupRules$1 = constant([rule(inSet(SPACE), stopEventForFirefox)]); var FlatgridType = typical(schema$2, flatgrid, getKeydownRules$1, getKeyupRules$1, function () { return Optional.some(focusIn); }); var horizontal = function (container, selector, current, delta) { var isDisabledButton = function (candidate) { return name(candidate) === 'button' && get$2(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$3 = [ strict$1('selector'), defaulted$1('getInitial', Optional.none), defaulted$1('execute', defaultExecute), onKeyboardHandler('onEscape'), defaulted$1('executeOnMove', false), defaulted$1('allowVertical', true) ]; var findCurrent$1 = function (component, flowConfig) { return flowConfig.focusManager.get(component).bind(function (elem) { return closest$2(elem, flowConfig.selector); }); }; var execute$3 = function (component, simulatedEvent, flowConfig) { return findCurrent$1(component, flowConfig).bind(function (focused) { return flowConfig.execute(component, simulatedEvent, focused); }); }; var focusIn$1 = function (component, flowConfig, _state) { flowConfig.getInitial(component).orThunk(function () { return descendant$1(component.element, flowConfig.selector); }).each(function (first) { flowConfig.focusManager.set(component, first); }); }; var moveLeft$1 = function (element, focused, info) { return horizontal(element, info.selector, focused, -1); }; var moveRight$1 = 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$3(component, simulatedEvent, flowConfig) : Optional.some(true); }); }; }; var doEscape$1 = function (component, simulatedEvent, flowConfig) { return flowConfig.onEscape(component, simulatedEvent); }; var getKeydownRules$2 = 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(moveLeft$1, moveRight$1))), rule(inSet(eastMovers), doMove$1(east(moveLeft$1, moveRight$1))), rule(inSet(ENTER), execute$3), rule(inSet(SPACE), execute$3), rule(inSet(ESCAPE), doEscape$1) ]; }; var getKeyupRules$2 = constant([rule(inSet(SPACE), stopEventForFirefox)]); var FlowType = typical(schema$3, NoState.init, getKeydownRules$2, getKeyupRules$2, function () { return Optional.some(focusIn$1); }); 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$1 = 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$1 = function (matrix, colIndex, startRow, deltaRow) { var nextRowIndex = cycleBy(startRow, deltaRow, 0, matrix.length - 1); var colsInNextRow = matrix[nextRowIndex].length; var nextColIndex = clamp(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(startCol + deltaCol, 0, colsInRow - 1); return toCell(matrix, rowIndex, newColIndex); }; var moveVertical = function (matrix, colIndex, startRow, deltaRow) { var nextRowIndex = clamp(startRow + deltaRow, 0, matrix.length - 1); var colsInNextRow = matrix[nextRowIndex].length; var nextColIndex = clamp(colIndex, 0, colsInNextRow - 1); return toCell(matrix, nextRowIndex, nextColIndex); }; var cycleRight$1 = function (matrix, startRow, startCol) { return cycleHorizontal$1(matrix, startRow, startCol, +1); }; var cycleLeft$1 = function (matrix, startRow, startCol) { return cycleHorizontal$1(matrix, startRow, startCol, -1); }; var cycleUp$1 = function (matrix, startRow, startCol) { return cycleVertical$1(matrix, startCol, startRow, -1); }; var cycleDown$1 = function (matrix, startRow, startCol) { return cycleVertical$1(matrix, startCol, startRow, +1); }; var moveLeft$2 = function (matrix, startRow, startCol) { return moveHorizontal(matrix, startRow, startCol, -1); }; var moveRight$2 = function (matrix, startRow, startCol) { return moveHorizontal(matrix, startRow, startCol, +1); }; var moveUp = function (matrix, startRow, startCol) { return moveVertical(matrix, startCol, startRow, -1); }; var moveDown = function (matrix, startRow, startCol) { return moveVertical(matrix, startCol, startRow, +1); }; var schema$4 = [ strictObjOf('selectors', [ strict$1('row'), strict$1('cell') ]), defaulted$1('cycles', true), defaulted$1('previousSelector', Optional.none), defaulted$1('execute', defaultExecute) ]; var focusIn$2 = function (component, matrixConfig, _state) { var focused = matrixConfig.previousSelector(component).orThunk(function () { var selectors = matrixConfig.selectors; return descendant$1(component.element, selectors.cell); }); focused.each(function (cell) { matrixConfig.focusManager.set(component, cell); }); }; var execute$4 = function (component, simulatedEvent, matrixConfig) { return search(component.element).bind(function (focused) { return matrixConfig.execute(component, simulatedEvent, focused); }); }; var toMatrix = function (rows, matrixConfig) { return map(rows, function (row) { return descendants(row, matrixConfig.selectors.cell); }); }; var doMove$2 = function (ifCycle, ifMove) { return function (element, focused, matrixConfig) { var move = matrixConfig.cycles ? ifCycle : ifMove; return closest$2(focused, matrixConfig.selectors.row).bind(function (inRow) { var cellsInRow = descendants(inRow, matrixConfig.selectors.cell); return findIndex$1(cellsInRow, focused).bind(function (colIndex) { var allRows = descendants(element, matrixConfig.selectors.row); return findIndex$1(allRows, inRow).bind(function (rowIndex) { var matrix = toMatrix(allRows, matrixConfig); return move(matrix, rowIndex, colIndex).map(function (next) { return next.cell; }); }); }); }); }; }; var moveLeft$3 = doMove$2(cycleLeft$1, moveLeft$2); var moveRight$3 = doMove$2(cycleRight$1, moveRight$2); var moveNorth$1 = doMove$2(cycleUp$1, moveUp); var moveSouth$1 = doMove$2(cycleDown$1, moveDown); var getKeydownRules$3 = constant([ rule(inSet(LEFT), west(moveLeft$3, moveRight$3)), rule(inSet(RIGHT), east(moveLeft$3, moveRight$3)), rule(inSet(UP), north(moveNorth$1)), rule(inSet(DOWN), south(moveSouth$1)), rule(inSet(SPACE.concat(ENTER)), execute$4) ]); var getKeyupRules$3 = constant([rule(inSet(SPACE), stopEventForFirefox)]); var MatrixType = typical(schema$4, NoState.init, getKeydownRules$3, getKeyupRules$3, function () { return Optional.some(focusIn$2); }); var schema$5 = [ strict$1('selector'), defaulted$1('execute', defaultExecute), defaulted$1('moveOnTab', false) ]; var execute$5 = function (component, simulatedEvent, menuConfig) { return menuConfig.focusManager.get(component).bind(function (focused) { return menuConfig.execute(component, simulatedEvent, focused); }); }; var focusIn$3 = function (component, menuConfig, _state) { descendant$1(component.element, menuConfig.selector).each(function (first) { menuConfig.focusManager.set(component, first); }); }; var moveUp$1 = function (element, focused, info) { return horizontal(element, info.selector, focused, -1); }; var moveDown$1 = function (element, focused, info) { return horizontal(element, info.selector, focused, +1); }; var fireShiftTab = function (component, simulatedEvent, menuConfig, menuState) { return menuConfig.moveOnTab ? move(moveUp$1)(component, simulatedEvent, menuConfig, menuState) : Optional.none(); }; var fireTab = function (component, simulatedEvent, menuConfig, menuState) { return menuConfig.moveOnTab ? move(moveDown$1)(component, simulatedEvent, menuConfig, menuState) : Optional.none(); }; var getKeydownRules$4 = constant([ rule(inSet(UP), move(moveUp$1)), rule(inSet(DOWN), move(moveDown$1)), rule(and([ isShift, inSet(TAB) ]), fireShiftTab), rule(and([ isNotShift, inSet(TAB) ]), fireTab), rule(inSet(ENTER), execute$5), rule(inSet(SPACE), execute$5) ]); var getKeyupRules$4 = constant([rule(inSet(SPACE), stopEventForFirefox)]); var MenuType = typical(schema$5, NoState.init, getKeydownRules$4, getKeyupRules$4, function () { return Optional.some(focusIn$3); }); var schema$6 = [ onKeyboardHandler('onSpace'), onKeyboardHandler('onEnter'), onKeyboardHandler('onShiftEnter'), onKeyboardHandler('onLeft'), onKeyboardHandler('onRight'), onKeyboardHandler('onTab'), onKeyboardHandler('onShiftTab'), onKeyboardHandler('onUp'), onKeyboardHandler('onDown'), onKeyboardHandler('onEscape'), defaulted$1('stopSpaceKeyup', false), option('focusIn') ]; var getKeydownRules$5 = 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$5 = function (component, simulatedEvent, specialInfo) { return specialInfo.stopSpaceKeyup ? [rule(inSet(SPACE), stopEventForFirefox)] : []; }; var SpecialType = typical(schema$6, NoState.init, getKeydownRules$5, getKeyupRules$5, function (specialInfo) { return specialInfo.focusIn; }); var acyclic = AcyclicType.schema(); var cyclic = CyclicType.schema(); var flow = FlowType.schema(); var flatgrid$1 = 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$1, matrix: matrix, execution: execution, menu: menu, special: special }); var isFlatgridState = function (keyState) { return hasNonNullableKey(keyState, 'setGridSize'); }; var Keying = createModes$1({ 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 field$1 = function (name, forbidden) { return defaultedObjOf(name, {}, map(forbidden, function (f) { return forbid(f.name(), 'Cannot configure ' + f.name() + ' for ' + name); }).concat([state$1('dump', identity)])); }; var get$7 = function (data) { return data.dump; }; var augment = function (data, original) { return __assign(__assign({}, data.dump), derive$1(original)); }; var SketchBehaviours = { field: field$1, augment: augment, get: get$7 }; var _placeholder = 'placeholder'; var adt$2 = Adt.generate([ { single: [ 'required', 'valueThunk' ] }, { multiple: [ 'required', 'valueThunks' ] } ]); var isSubstituted = function (spec) { return has(spec, 'uiType'); }; var subPlaceholder = function (owner, detail, compSpec, placeholders) { if (owner.exists(function (o) { return o !== compSpec.owner; })) { return adt$2.single(true, constant(compSpec)); } return get$1(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$2.single(false, constant(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$1(value, 'components').getOr([]); var substituted = bind(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); return preprocessor(values); } else { return valuesThunk(detail); } }); }; var substituteAll = function (owner, detail, components, placeholders) { return bind(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(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$1(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 = adt$2.single; var multiple = adt$2.multiple; var placeholder = constant(_placeholder); var unique = 0; var generate$1 = 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 adt$3 = Adt.generate([ { required: ['data'] }, { external: ['data'] }, { optional: ['data'] }, { group: ['data'] } ]); var fFactory = defaulted$1('factory', { sketch: identity }); var fSchema = defaulted$1('schema', []); var fName = strict$1('name'); var fPname = field('pname', 'pname', defaultedThunk(function (typeSpec) { return ''; }), anyValue$1()); var fGroupSchema = state$1('schema', function () { return [option('preprocess')]; }); var fDefaults = defaulted$1('defaults', constant({})); var fOverrides = defaulted$1('overrides', constant({})); 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, strict$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 convert = function (adtConstructor, partSchema) { return function (spec) { var data = asRawOrDie('Converting part type', partSchema, spec); return adtConstructor(data); }; }; var required = convert(adt$3.required, requiredSpec); var external = convert(adt$3.external, externalSpec); var optional = convert(adt$3.optional, optionalSpec); var group = convert(adt$3.group, groupSpec); var original = constant('entirety'); 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(parts, function (part) { part.fold(function (data) { internals[data.pname] = single(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(data.factory.sketch(combine(detail, data, partSpec[original()]), partSpec)); }, function (data) { internals[data.pname] = single(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(units, function (u) { return data.factory.sketch(deepMerge(data.defaults(detail, u, _partValidated), u, data.overrides(detail, u))); }); }); }); }); return { internals: constant(internals), externals: constant(externals) }; }; var generate$2 = function (owner, parts) { var r = {}; each(parts, function (part) { asNamedPart(part).each(function (np) { var g = doGenerateOne(owner, np.pname); r[np.name] = function (config) { var validated = asRawOrDie('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 = function (owner, pname, config) { return { uiType: placeholder(), owner: owner, name: pname, config: config, validated: {} }; }; var schemas = function (parts) { return bind(parts, function (part) { return part.fold(Optional.none, Optional.some, Optional.none, Optional.none).map(function (data) { return strictObjOf(data.name, data.schema.concat([snapshot(original())])); }).toArray(); }); }; var names = function (parts) { return map(parts, name$1); }; var substitutes = function (owner, detail, parts) { return subs(owner, detail, parts); }; var components = 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 getAllParts = function (component, detail) { var system = component.getSystem(); return map$1(detail.partUids, function (pUid, _k) { return constant(system.getByUid(pUid)); }); }; var defaultUids = function (baseUid, partTypes) { var partNames = names(partTypes); return wrapAll$1(map(partNames, function (pn) { return { key: pn, value: baseUid + '-' + pn }; })); }; var defaultUidsSchema = function (partTypes) { return field('partUids', 'partUids', mergeWithThunk(function (spec) { return defaultUids(spec.uid, partTypes); }), anyValue$1()); }; var premadeTag = generate$1('alloy-premade'); var premade = function (comp) { return wrap$1(premadeTag, comp); }; var getPremade = function (spec) { return get$1(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, __spreadArrays([ component.getApis(), component ], rest)); }, f); }; var prefix$1 = constant('alloy-id-'); var idAttr = constant('data-alloy-id'); var prefix$2 = prefix$1(); var idAttr$1 = idAttr(); var write = function (label, elem) { var id = generate$1(prefix$2 + label); writeOnly(elem, id); return id; }; var writeOnly = function (elem, uid) { Object.defineProperty(elem.dom, idAttr$1, { value: uid, writable: true }); }; var read$2 = function (elem) { var id = isElement(elem) ? elem.dom[idAttr$1] : null; return Optional.from(id); }; var generate$3 = function (prefix) { return generate$1(prefix); }; var base = function (partSchemas, partUidsSchemas) { var ps = partSchemas.length > 0 ? [strictObjOf('parts', partSchemas)] : []; return ps.concat([ strict$1('uid'), defaulted$1('dom', {}), defaulted$1('components', []), snapshot('originalSpec'), defaulted$1('debug.sketcher', {}) ]).concat(partUidsSchemas); }; var asRawOrDie$1 = function (label, schema, spec, partSchemas, partUidsSchemas) { var baseS = base(partSchemas, partUidsSchemas); return asRawOrDie(label + ' [SpecSchema]', objOfOnly(baseS.concat(schema)), spec); }; var single$1 = function (owner, schema, factory, spec) { var specWithUid = supplyUid(spec); var detail = asRawOrDie$1(owner, schema, specWithUid, [], []); return factory(detail, specWithUid); }; var composite = function (owner, schema, partTypes, factory, spec) { var specWithUid = supplyUid(spec); var partSchemas = schemas(partTypes); var partUidsSchema = defaultUidsSchema(partTypes); var detail = asRawOrDie$1(owner, schema, specWithUid, partSchemas, [partUidsSchema]); var subs = substitutes(owner, detail, partTypes); var components$1 = components(owner, detail, subs.internals()); return factory(detail, components$1, specWithUid, subs.externals()); }; var hasUid = function (spec) { return has(spec, 'uid'); }; var supplyUid = function (spec) { return hasUid(spec) ? spec : __assign(__assign({}, spec), { uid: generate$3('uid') }); }; var isSketchSpec = function (spec) { return spec.uid !== undefined; }; var singleSchema = objOfOnly([ strict$1('name'), strict$1('factory'), strict$1('configFields'), defaulted$1('apis', {}), defaulted$1('extraApis', {}) ]); var compositeSchema = objOfOnly([ strict$1('name'), strict$1('factory'), strict$1('configFields'), strict$1('partFields'), defaulted$1('apis', {}), defaulted$1('extraApis', {}) ]); var single$2 = function (rawConfig) { var config = asRawOrDie('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$1 = function (rawConfig) { var config = asRawOrDie('Sketcher for ' + rawConfig.name, compositeSchema, rawConfig); var sketch = function (spec) { return composite(config.name, config.configFields, config.partFields, config.factory, spec); }; var parts = generate$2(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 factory = function (detail) { var events = events$2(detail.action); var tag = detail.dom.tag; var lookupAttr = function (attr) { return get$1(detail.dom, 'attributes').bind(function (attrs) { return get$1(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$2({ name: 'Button', factory: factory, configFields: [ defaulted$1('uid', undefined), strict$1('dom'), defaulted$1('components', []), SketchBehaviours.field('buttonBehaviours', [ Focusing, Keying ]), option('action'), option('role'), defaulted$1('eventOrder', {}) ] }); var exhibit$2 = function () { return nu$5({ styles: { '-webkit-user-select': 'none', 'user-select': 'none', '-ms-user-select': 'none', '-moz-user-select': '-moz-none' }, attributes: { unselectable: 'on' } }); }; var events$4 = function () { return derive([abort(selectstart(), always)]); }; var ActiveUnselecting = /*#__PURE__*/Object.freeze({ __proto__: null, events: events$4, exhibit: exhibit$2 }); var Unselecting = create$1({ fields: [], name: 'unselecting', active: ActiveUnselecting }); 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$2 = 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$4(elem) }; return __assign({ tag: name(elem), classes: classes, attributes: attrs }, contents); }; var dom$1 = function (rawHtml) { var html = supplant(rawHtml, { prefix: prefix }); return fromHtml$2(html); }; var spec = function (rawHtml) { return { dom: dom$1(rawHtml) }; }; var forToolbarCommand = function (editor, command) { return forToolbar(command, function () { editor.execCommand(command); }, {}, editor); }; var getToggleBehaviours = function (command) { return derive$1([ Toggling.config({ toggleClass: resolve('toolbar-button-selected'), toggleOnExecute: false, aria: { mode: 'pressed' } }), format(command, function (button, status) { var toggle = status ? Toggling.on : Toggling.off; toggle(button); }) ]); }; var forToolbarStateCommand = function (editor, command) { var extraBehaviours = getToggleBehaviours(command); return forToolbar(command, function () { editor.execCommand(command); }, extraBehaviours, editor); }; var forToolbarStateAction = function (editor, clazz, command, action) { var extraBehaviours = getToggleBehaviours(command); return forToolbar(clazz, action, extraBehaviours, editor); }; var getToolbarIconButton = function (clazz, editor) { var icons = editor.ui.registry.getAll().icons; var optOxideIcon = Optional.from(icons[clazz]); return optOxideIcon.fold(function () { return dom$1(''); }, function (icon) { return dom$1('' + icon + ''); }); }; var forToolbar = function (clazz, action, extraBehaviours, editor) { return Button.sketch({ dom: getToolbarIconButton(clazz, editor), action: action, buttonBehaviours: deepMerge(derive$1([Unselecting.config({})]), extraBehaviours) }); }; var labelPart = optional({ schema: [strict$1('dom')], name: 'label' }); var edgePart = function (name) { return optional({ name: '' + name + '-edge', overrides: function (detail) { var action = detail.model.manager.edgeActions[name]; return action.fold(function () { return {}; }, function (a) { return { events: derive([ runActionExtra(touchstart(), function (comp, se, d) { return a(comp, d); }, [detail]), runActionExtra(mousedown(), function (comp, se, d) { return a(comp, d); }, [detail]), runActionExtra(mousemove(), function (comp, se, det) { if (det.mouseIsDown.get()) { a(comp, det); } }, [detail]) ]) }; }); } }); }; var tlEdgePart = edgePart('top-left'); var tedgePart = edgePart('top'); var trEdgePart = edgePart('top-right'); var redgePart = edgePart('right'); var brEdgePart = edgePart('bottom-right'); var bedgePart = edgePart('bottom'); var blEdgePart = edgePart('bottom-left'); var ledgePart = edgePart('left'); var thumbPart = required({ name: 'thumb', defaults: constant({ dom: { styles: { position: 'absolute' } } }), overrides: function (detail) { return { events: derive([ redirectToPart(touchstart(), detail, 'spectrum'), redirectToPart(touchmove(), detail, 'spectrum'), redirectToPart(touchend(), detail, 'spectrum'), redirectToPart(mousedown(), detail, 'spectrum'), redirectToPart(mousemove(), detail, 'spectrum'), redirectToPart(mouseup(), detail, 'spectrum') ]) }; } }); var spectrumPart = required({ schema: [state$1('mouseIsDown', function () { return Cell(false); })], name: 'spectrum', overrides: function (detail) { var modelDetail = detail.model; var model = modelDetail.manager; var setValueFrom = function (component, simulatedEvent) { return model.getValueFromEvent(simulatedEvent).map(function (value) { return model.setValueFrom(component, detail, value); }); }; return { behaviours: derive$1([ Keying.config({ mode: 'special', onLeft: function (spectrum) { return model.onLeft(spectrum, detail); }, onRight: function (spectrum) { return model.onRight(spectrum, detail); }, onUp: function (spectrum) { return model.onUp(spectrum, detail); }, onDown: function (spectrum) { return model.onDown(spectrum, detail); } }), Focusing.config({}) ]), events: derive([ run(touchstart(), setValueFrom), run(touchmove(), setValueFrom), run(mousedown(), setValueFrom), run(mousemove(), function (spectrum, se) { if (detail.mouseIsDown.get()) { setValueFrom(spectrum, se); } }) ]) }; } }); var SliderParts = [ labelPart, ledgePart, redgePart, tedgePart, bedgePart, tlEdgePart, trEdgePart, blEdgePart, brEdgePart, thumbPart, spectrumPart ]; var onLoad$1 = function (component, repConfig, repState) { repConfig.store.manager.onLoad(component, repConfig, repState); }; var onUnload = function (component, repConfig, repState) { repConfig.store.manager.onUnload(component, repConfig, repState); }; var setValue = function (component, repConfig, repState, data) { repConfig.store.manager.setValue(component, repConfig, repState, data); }; var getValue = function (component, repConfig, repState) { return repConfig.store.manager.getValue(component, repConfig, repState); }; var getState = function (component, repConfig, repState) { return repState; }; var RepresentApis = /*#__PURE__*/Object.freeze({ __proto__: null, onLoad: onLoad$1, onUnload: onUnload, setValue: setValue, getValue: getValue, getState: getState }); var events$5 = function (repConfig, repState) { var es = repConfig.resetOnDom ? [ runOnAttached(function (comp, _se) { onLoad$1(comp, repConfig, repState); }), runOnDetached(function (comp, _se) { onUnload(comp, repConfig, repState); }) ] : [loadEvent(repConfig, repState, onLoad$1)]; return derive(es); }; var ActiveRepresenting = /*#__PURE__*/Object.freeze({ __proto__: null, events: events$5 }); var memory = 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$6({ set: data.set, get: data.get, isNotSet: isNotSet, clear: clear, readState: readState }); }; var manual = function () { var readState = noop; return nu$6({ 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$1(dataByValue.get(), itemString).orThunk(function () { return get$1(dataByText.get(), itemString); }); }; var update = function (items) { var currentDataByValue = dataByValue.get(); var currentDataByText = dataByText.get(); var newDataByValue = {}; var newDataByText = {}; each(items, function (item) { newDataByValue[item.value] = item; get$1(item, 'meta').each(function (meta) { get$1(meta, 'text').each(function (text) { newDataByText[text] = item; }); }); }); dataByValue.set(__assign(__assign({}, currentDataByValue), newDataByValue)); dataByText.set(__assign(__assign({}, currentDataByText), newDataByText)); }; return nu$6({ readState: readState, lookup: lookup, update: update, clear: clear }); }; var init$1 = function (spec) { return spec.store.manager.state(spec); }; var RepresentState = /*#__PURE__*/Object.freeze({ __proto__: null, memory: memory, dataset: dataset, manual: manual, init: init$1 }); var setValue$1 = function (component, repConfig, repState, data) { var store = repConfig.store; repState.update([data]); store.setValue(component, data); repConfig.onSetValue(component, data); }; var getValue$1 = function (component, repConfig, repState) { var store = repConfig.store; var key = store.getDataKey(component); return repState.lookup(key).fold(function () { return store.getFallbackEntry(key); }, function (data) { return data; }); }; var onLoad$2 = function (component, repConfig, repState) { var store = repConfig.store; store.initialValue.each(function (data) { setValue$1(component, repConfig, repState, data); }); }; var onUnload$1 = function (component, repConfig, repState) { repState.clear(); }; var DatasetStore = [ option('initialValue'), strict$1('getFallbackEntry'), strict$1('getDataKey'), strict$1('setValue'), output('manager', { setValue: setValue$1, getValue: getValue$1, onLoad: onLoad$2, onUnload: onUnload$1, state: dataset }) ]; var getValue$2 = function (component, repConfig, _repState) { return repConfig.store.getValue(component); }; var setValue$2 = 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 = [ strict$1('getValue'), defaulted$1('setValue', noop), option('initialValue'), output('manager', { setValue: setValue$2, getValue: getValue$2, onLoad: onLoad$3, onUnload: noop, state: NoState.init }) ]; var setValue$3 = function (component, repConfig, repState, data) { repState.set(data); repConfig.onSetValue(component, data); }; var getValue$3 = function (component, repConfig, repState) { return repState.get(); }; var onLoad$4 = function (component, repConfig, repState) { repConfig.store.initialValue.each(function (initVal) { if (repState.isNotSet()) { repState.set(initVal); } }); }; var onUnload$2 = function (component, repConfig, repState) { repState.clear(); }; var MemoryStore = [ option('initialValue'), output('manager', { setValue: setValue$3, getValue: getValue$3, onLoad: onLoad$4, onUnload: onUnload$2, state: memory }) ]; var RepresentSchema = [ defaultedOf('store', { mode: 'memory' }, choose$1('mode', { memory: MemoryStore, manual: ManualStore, dataset: DatasetStore })), onHandler('onSetValue'), defaulted$1('resetOnDom', false) ]; var Representing = create$1({ 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 api$1 = Dimension('width', function (element) { return element.dom.offsetWidth; }); var set$4 = function (element, h) { return api$1.set(element, h); }; var get$8 = function (element) { return api$1.get(element); }; var r = function (left, top) { var translate = function (x, y) { return r(left + x, top + y); }; return { left: left, top: top, translate: translate }; }; var SugarPosition = r; var _sliderChangeEvent = 'slider.change.value'; var sliderChangeEvent = constant(_sliderChangeEvent); var isTouchEvent = function (evt) { return evt.type.indexOf('touch') !== -1; }; var getEventSource = function (simulatedEvent) { var evt = simulatedEvent.event.raw; if (isTouchEvent(evt)) { var touchEvent = evt; return touchEvent.touches !== undefined && touchEvent.touches.length === 1 ? Optional.some(touchEvent.touches[0]).map(function (t) { return SugarPosition(t.clientX, t.clientY); }) : Optional.none(); } else { var mouseEvent = evt; return mouseEvent.clientX !== undefined ? Optional.some(mouseEvent).map(function (me) { return SugarPosition(me.clientX, me.clientY); }) : Optional.none(); } }; var t = 'top', r$1 = 'right', b = 'bottom', l = 'left'; var minX = function (detail) { return detail.model.minX; }; var minY = function (detail) { return detail.model.minY; }; var min1X = function (detail) { return detail.model.minX - 1; }; var min1Y = function (detail) { return detail.model.minY - 1; }; var maxX = function (detail) { return detail.model.maxX; }; var maxY = function (detail) { return detail.model.maxY; }; var max1X = function (detail) { return detail.model.maxX + 1; }; var max1Y = function (detail) { return detail.model.maxY + 1; }; var range = function (detail, max, min) { return max(detail) - min(detail); }; var xRange = function (detail) { return range(detail, maxX, minX); }; var yRange = function (detail) { return range(detail, maxY, minY); }; var halfX = function (detail) { return xRange(detail) / 2; }; var halfY = function (detail) { return yRange(detail) / 2; }; var step = function (detail) { return detail.stepSize; }; var snap = function (detail) { return detail.snapToGrid; }; var snapStart = function (detail) { return detail.snapStart; }; var rounded = function (detail) { return detail.rounded; }; var hasEdge = function (detail, edgeName) { return detail[edgeName + '-edge'] !== undefined; }; var hasLEdge = function (detail) { return hasEdge(detail, l); }; var hasREdge = function (detail) { return hasEdge(detail, r$1); }; var hasTEdge = function (detail) { return hasEdge(detail, t); }; var hasBEdge = function (detail) { return hasEdge(detail, b); }; var currentValue = function (detail) { return detail.model.value.get(); }; var xValue = function (x) { return { x: x }; }; var yValue = function (y) { return { y: y }; }; var xyValue = function (x, y) { return { x: x, y: y }; }; var fireSliderChange = function (component, value) { emitWith(component, sliderChangeEvent(), { value: value }); }; var setToTLEdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(min1X(detail), min1Y(detail))); }; var setToTEdge = function (edge, detail) { fireSliderChange(edge, yValue(min1Y(detail))); }; var setToTEdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(halfX(detail), min1Y(detail))); }; var setToTREdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(max1X(detail), min1Y(detail))); }; var setToREdge = function (edge, detail) { fireSliderChange(edge, xValue(max1X(detail))); }; var setToREdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(max1X(detail), halfY(detail))); }; var setToBREdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(max1X(detail), max1Y(detail))); }; var setToBEdge = function (edge, detail) { fireSliderChange(edge, yValue(max1Y(detail))); }; var setToBEdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(halfX(detail), max1Y(detail))); }; var setToBLEdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(min1X(detail), max1Y(detail))); }; var setToLEdge = function (edge, detail) { fireSliderChange(edge, xValue(min1X(detail))); }; var setToLEdgeXY = function (edge, detail) { fireSliderChange(edge, xyValue(min1X(detail), halfY(detail))); }; var reduceBy = function (value, min, max, step) { if (value < min) { return value; } else if (value > max) { return max; } else if (value === min) { return min - 1; } else { return Math.max(min, value - step); } }; var increaseBy = function (value, min, max, step) { if (value > max) { return value; } else if (value < min) { return min; } else if (value === max) { return max + 1; } else { return Math.min(max, value + step); } }; var capValue = function (value, min, max) { return Math.max(min, Math.min(max, value)); }; var snapValueOf = function (value, min, max, step, snapStart) { return snapStart.fold(function () { var initValue = value - min; var extraValue = Math.round(initValue / step) * step; return capValue(min + extraValue, min - 1, max + 1); }, function (start) { var remainder = (value - start) % step; var adjustment = Math.round(remainder / step); var rawSteps = Math.floor((value - start) / step); var maxSteps = Math.floor((max - start) / step); var numSteps = Math.min(maxSteps, rawSteps + adjustment); var r = start + numSteps * step; return Math.max(start, r); }); }; var findOffsetOf = function (value, min, max) { return Math.min(max, Math.max(value, min)) - min; }; var findValueOf = function (args) { var min = args.min, max = args.max, range = args.range, value = args.value, step = args.step, snap = args.snap, snapStart = args.snapStart, rounded = args.rounded, hasMinEdge = args.hasMinEdge, hasMaxEdge = args.hasMaxEdge, minBound = args.minBound, maxBound = args.maxBound, screenRange = args.screenRange; var capMin = hasMinEdge ? min - 1 : min; var capMax = hasMaxEdge ? max + 1 : max; if (value < minBound) { return capMin; } else if (value > maxBound) { return capMax; } else { var offset = findOffsetOf(value, minBound, maxBound); var newValue = capValue(offset / screenRange * range + min, capMin, capMax); if (snap && newValue >= min && newValue <= max) { return snapValueOf(newValue, min, max, step, snapStart); } else if (rounded) { return Math.round(newValue); } else { return newValue; } } }; var findOffsetOfValue = function (args) { var min = args.min, max = args.max, range = args.range, value = args.value, hasMinEdge = args.hasMinEdge, hasMaxEdge = args.hasMaxEdge, maxBound = args.maxBound, maxOffset = args.maxOffset, centerMinEdge = args.centerMinEdge, centerMaxEdge = args.centerMaxEdge; if (value < min) { return hasMinEdge ? 0 : centerMinEdge; } else if (value > max) { return hasMaxEdge ? maxBound : centerMaxEdge; } else { return (value - min) / range * maxOffset; } }; var top = 'top', right = 'right', bottom = 'bottom', left = 'left', width = 'width', height = 'height'; var getBounds = function (component) { return component.element.dom.getBoundingClientRect(); }; var getBoundsProperty = function (bounds, property) { return bounds[property]; }; var getMinXBounds = function (component) { var bounds = getBounds(component); return getBoundsProperty(bounds, left); }; var getMaxXBounds = function (component) { var bounds = getBounds(component); return getBoundsProperty(bounds, right); }; var getMinYBounds = function (component) { var bounds = getBounds(component); return getBoundsProperty(bounds, top); }; var getMaxYBounds = function (component) { var bounds = getBounds(component); return getBoundsProperty(bounds, bottom); }; var getXScreenRange = function (component) { var bounds = getBounds(component); return getBoundsProperty(bounds, width); }; var getYScreenRange = function (component) { var bounds = getBounds(component); return getBoundsProperty(bounds, height); }; var getCenterOffsetOf = function (componentMinEdge, componentMaxEdge, spectrumMinEdge) { return (componentMinEdge + componentMaxEdge) / 2 - spectrumMinEdge; }; var getXCenterOffSetOf = function (component, spectrum) { var componentBounds = getBounds(component); var spectrumBounds = getBounds(spectrum); var componentMinEdge = getBoundsProperty(componentBounds, left); var componentMaxEdge = getBoundsProperty(componentBounds, right); var spectrumMinEdge = getBoundsProperty(spectrumBounds, left); return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge); }; var getYCenterOffSetOf = function (component, spectrum) { var componentBounds = getBounds(component); var spectrumBounds = getBounds(spectrum); var componentMinEdge = getBoundsProperty(componentBounds, top); var componentMaxEdge = getBoundsProperty(componentBounds, bottom); var spectrumMinEdge = getBoundsProperty(spectrumBounds, top); return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge); }; var fireSliderChange$1 = function (spectrum, value) { emitWith(spectrum, sliderChangeEvent(), { value: value }); }; var sliderValue = function (x) { return { x: x }; }; var findValueOfOffset = function (spectrum, detail, left) { var args = { min: minX(detail), max: maxX(detail), range: xRange(detail), value: left, step: step(detail), snap: snap(detail), snapStart: snapStart(detail), rounded: rounded(detail), hasMinEdge: hasLEdge(detail), hasMaxEdge: hasREdge(detail), minBound: getMinXBounds(spectrum), maxBound: getMaxXBounds(spectrum), screenRange: getXScreenRange(spectrum) }; return findValueOf(args); }; var setValueFrom = function (spectrum, detail, value) { var xValue = findValueOfOffset(spectrum, detail, value); var sliderVal = sliderValue(xValue); fireSliderChange$1(spectrum, sliderVal); return xValue; }; var setToMin = function (spectrum, detail) { var min = minX(detail); fireSliderChange$1(spectrum, sliderValue(min)); }; var setToMax = function (spectrum, detail) { var max = maxX(detail); fireSliderChange$1(spectrum, sliderValue(max)); }; var moveBy = function (direction, spectrum, detail) { var f = direction > 0 ? increaseBy : reduceBy; var xValue = f(currentValue(detail).x, minX(detail), maxX(detail), step(detail)); fireSliderChange$1(spectrum, sliderValue(xValue)); return Optional.some(xValue); }; var handleMovement = function (direction) { return function (spectrum, detail) { return moveBy(direction, spectrum, detail).map(always); }; }; var getValueFromEvent = function (simulatedEvent) { var pos = getEventSource(simulatedEvent); return pos.map(function (p) { return p.left; }); }; var findOffsetOfValue$1 = function (spectrum, detail, value, minEdge, maxEdge) { var minOffset = 0; var maxOffset = getXScreenRange(spectrum); var centerMinEdge = minEdge.bind(function (edge) { return Optional.some(getXCenterOffSetOf(edge, spectrum)); }).getOr(minOffset); var centerMaxEdge = maxEdge.bind(function (edge) { return Optional.some(getXCenterOffSetOf(edge, spectrum)); }).getOr(maxOffset); var args = { min: minX(detail), max: maxX(detail), range: xRange(detail), value: value, hasMinEdge: hasLEdge(detail), hasMaxEdge: hasREdge(detail), minBound: getMinXBounds(spectrum), minOffset: minOffset, maxBound: getMaxXBounds(spectrum), maxOffset: maxOffset, centerMinEdge: centerMinEdge, centerMaxEdge: centerMaxEdge }; return findOffsetOfValue(args); }; var findPositionOfValue = function (slider, spectrum, value, minEdge, maxEdge, detail) { var offset = findOffsetOfValue$1(spectrum, detail, value, minEdge, maxEdge); return getMinXBounds(spectrum) - getMinXBounds(slider) + offset; }; var setPositionFromValue = function (slider, thumb, detail, edges) { var value = currentValue(detail); var pos = findPositionOfValue(slider, edges.getSpectrum(slider), value.x, edges.getLeftEdge(slider), edges.getRightEdge(slider), detail); var thumbRadius = get$8(thumb.element) / 2; set$3(thumb.element, 'left', pos - thumbRadius + 'px'); }; var onLeft = handleMovement(-1); var onRight = handleMovement(1); var onUp = Optional.none; var onDown = Optional.none; var edgeActions = { 'top-left': Optional.none(), 'top': Optional.none(), 'top-right': Optional.none(), 'right': Optional.some(setToREdge), 'bottom-right': Optional.none(), 'bottom': Optional.none(), 'bottom-left': Optional.none(), 'left': Optional.some(setToLEdge) }; var HorizontalModel = /*#__PURE__*/Object.freeze({ __proto__: null, setValueFrom: setValueFrom, setToMin: setToMin, setToMax: setToMax, findValueOfOffset: findValueOfOffset, getValueFromEvent: getValueFromEvent, findPositionOfValue: findPositionOfValue, setPositionFromValue: setPositionFromValue, onLeft: onLeft, onRight: onRight, onUp: onUp, onDown: onDown, edgeActions: edgeActions }); var fireSliderChange$2 = function (spectrum, value) { emitWith(spectrum, sliderChangeEvent(), { value: value }); }; var sliderValue$1 = function (y) { return { y: y }; }; var findValueOfOffset$1 = function (spectrum, detail, top) { var args = { min: minY(detail), max: maxY(detail), range: yRange(detail), value: top, step: step(detail), snap: snap(detail), snapStart: snapStart(detail), rounded: rounded(detail), hasMinEdge: hasTEdge(detail), hasMaxEdge: hasBEdge(detail), minBound: getMinYBounds(spectrum), maxBound: getMaxYBounds(spectrum), screenRange: getYScreenRange(spectrum) }; return findValueOf(args); }; var setValueFrom$1 = function (spectrum, detail, value) { var yValue = findValueOfOffset$1(spectrum, detail, value); var sliderVal = sliderValue$1(yValue); fireSliderChange$2(spectrum, sliderVal); return yValue; }; var setToMin$1 = function (spectrum, detail) { var min = minY(detail); fireSliderChange$2(spectrum, sliderValue$1(min)); }; var setToMax$1 = function (spectrum, detail) { var max = maxY(detail); fireSliderChange$2(spectrum, sliderValue$1(max)); }; var moveBy$1 = function (direction, spectrum, detail) { var f = direction > 0 ? increaseBy : reduceBy; var yValue = f(currentValue(detail).y, minY(detail), maxY(detail), step(detail)); fireSliderChange$2(spectrum, sliderValue$1(yValue)); return Optional.some(yValue); }; var handleMovement$1 = function (direction) { return function (spectrum, detail) { return moveBy$1(direction, spectrum, detail).map(always); }; }; var getValueFromEvent$1 = function (simulatedEvent) { var pos = getEventSource(simulatedEvent); return pos.map(function (p) { return p.top; }); }; var findOffsetOfValue$2 = function (spectrum, detail, value, minEdge, maxEdge) { var minOffset = 0; var maxOffset = getYScreenRange(spectrum); var centerMinEdge = minEdge.bind(function (edge) { return Optional.some(getYCenterOffSetOf(edge, spectrum)); }).getOr(minOffset); var centerMaxEdge = maxEdge.bind(function (edge) { return Optional.some(getYCenterOffSetOf(edge, spectrum)); }).getOr(maxOffset); var args = { min: minY(detail), max: maxY(detail), range: yRange(detail), value: value, hasMinEdge: hasTEdge(detail), hasMaxEdge: hasBEdge(detail), minBound: getMinYBounds(spectrum), minOffset: minOffset, maxBound: getMaxYBounds(spectrum), maxOffset: maxOffset, centerMinEdge: centerMinEdge, centerMaxEdge: centerMaxEdge }; return findOffsetOfValue(args); }; var findPositionOfValue$1 = function (slider, spectrum, value, minEdge, maxEdge, detail) { var offset = findOffsetOfValue$2(spectrum, detail, value, minEdge, maxEdge); return getMinYBounds(spectrum) - getMinYBounds(slider) + offset; }; var setPositionFromValue$1 = function (slider, thumb, detail, edges) { var value = currentValue(detail); var pos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.y, edges.getTopEdge(slider), edges.getBottomEdge(slider), detail); var thumbRadius = get$6(thumb.element) / 2; set$3(thumb.element, 'top', pos - thumbRadius + 'px'); }; var onLeft$1 = Optional.none; var onRight$1 = Optional.none; var onUp$1 = handleMovement$1(-1); var onDown$1 = handleMovement$1(1); var edgeActions$1 = { 'top-left': Optional.none(), 'top': Optional.some(setToTEdge), 'top-right': Optional.none(), 'right': Optional.none(), 'bottom-right': Optional.none(), 'bottom': Optional.some(setToBEdge), 'bottom-left': Optional.none(), 'left': Optional.none() }; var VerticalModel = /*#__PURE__*/Object.freeze({ __proto__: null, setValueFrom: setValueFrom$1, setToMin: setToMin$1, setToMax: setToMax$1, findValueOfOffset: findValueOfOffset$1, getValueFromEvent: getValueFromEvent$1, findPositionOfValue: findPositionOfValue$1, setPositionFromValue: setPositionFromValue$1, onLeft: onLeft$1, onRight: onRight$1, onUp: onUp$1, onDown: onDown$1, edgeActions: edgeActions$1 }); var fireSliderChange$3 = function (spectrum, value) { emitWith(spectrum, sliderChangeEvent(), { value: value }); }; var sliderValue$2 = function (x, y) { return { x: x, y: y }; }; var setValueFrom$2 = function (spectrum, detail, value) { var xValue = findValueOfOffset(spectrum, detail, value.left); var yValue = findValueOfOffset$1(spectrum, detail, value.top); var val = sliderValue$2(xValue, yValue); fireSliderChange$3(spectrum, val); return val; }; var moveBy$2 = function (direction, isVerticalMovement, spectrum, detail) { var f = direction > 0 ? increaseBy : reduceBy; var xValue = isVerticalMovement ? currentValue(detail).x : f(currentValue(detail).x, minX(detail), maxX(detail), step(detail)); var yValue = !isVerticalMovement ? currentValue(detail).y : f(currentValue(detail).y, minY(detail), maxY(detail), step(detail)); fireSliderChange$3(spectrum, sliderValue$2(xValue, yValue)); return Optional.some(xValue); }; var handleMovement$2 = function (direction, isVerticalMovement) { return function (spectrum, detail) { return moveBy$2(direction, isVerticalMovement, spectrum, detail).map(always); }; }; var setToMin$2 = function (spectrum, detail) { var mX = minX(detail); var mY = minY(detail); fireSliderChange$3(spectrum, sliderValue$2(mX, mY)); }; var setToMax$2 = function (spectrum, detail) { var mX = maxX(detail); var mY = maxY(detail); fireSliderChange$3(spectrum, sliderValue$2(mX, mY)); }; var getValueFromEvent$2 = function (simulatedEvent) { return getEventSource(simulatedEvent); }; var setPositionFromValue$2 = function (slider, thumb, detail, edges) { var value = currentValue(detail); var xPos = findPositionOfValue(slider, edges.getSpectrum(slider), value.x, edges.getLeftEdge(slider), edges.getRightEdge(slider), detail); var yPos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.y, edges.getTopEdge(slider), edges.getBottomEdge(slider), detail); var thumbXRadius = get$8(thumb.element) / 2; var thumbYRadius = get$6(thumb.element) / 2; set$3(thumb.element, 'left', xPos - thumbXRadius + 'px'); set$3(thumb.element, 'top', yPos - thumbYRadius + 'px'); }; var onLeft$2 = handleMovement$2(-1, false); var onRight$2 = handleMovement$2(1, false); var onUp$2 = handleMovement$2(-1, true); var onDown$2 = handleMovement$2(1, true); var edgeActions$2 = { 'top-left': Optional.some(setToTLEdgeXY), 'top': Optional.some(setToTEdgeXY), 'top-right': Optional.some(setToTREdgeXY), 'right': Optional.some(setToREdgeXY), 'bottom-right': Optional.some(setToBREdgeXY), 'bottom': Optional.some(setToBEdgeXY), 'bottom-left': Optional.some(setToBLEdgeXY), 'left': Optional.some(setToLEdgeXY) }; var TwoDModel = /*#__PURE__*/Object.freeze({ __proto__: null, setValueFrom: setValueFrom$2, setToMin: setToMin$2, setToMax: setToMax$2, getValueFromEvent: getValueFromEvent$2, setPositionFromValue: setPositionFromValue$2, onLeft: onLeft$2, onRight: onRight$2, onUp: onUp$2, onDown: onDown$2, edgeActions: edgeActions$2 }); var SliderSchema = [ defaulted$1('stepSize', 1), defaulted$1('onChange', noop), defaulted$1('onChoose', noop), defaulted$1('onInit', noop), defaulted$1('onDragStart', noop), defaulted$1('onDragEnd', noop), defaulted$1('snapToGrid', false), defaulted$1('rounded', true), option('snapStart'), strictOf('model', choose$1('mode', { x: [ defaulted$1('minX', 0), defaulted$1('maxX', 100), state$1('value', function (spec) { return Cell(spec.mode.minX); }), strict$1('getInitialValue'), output('manager', HorizontalModel) ], y: [ defaulted$1('minY', 0), defaulted$1('maxY', 100), state$1('value', function (spec) { return Cell(spec.mode.minY); }), strict$1('getInitialValue'), output('manager', VerticalModel) ], xy: [ defaulted$1('minX', 0), defaulted$1('maxX', 100), defaulted$1('minY', 0), defaulted$1('maxY', 100), state$1('value', function (spec) { return Cell({ x: spec.mode.minX, y: spec.mode.minY }); }), strict$1('getInitialValue'), output('manager', TwoDModel) ] })), field$1('sliderBehaviours', [ Keying, Representing ]), state$1('mouseIsDown', function () { return Cell(false); }) ]; var mouseReleased = constant('mouse.released'); var sketch = function (detail, components, _spec, _externals) { var _a; var getThumb = function (component) { return getPartOrDie(component, detail, 'thumb'); }; var getSpectrum = function (component) { return getPartOrDie(component, detail, 'spectrum'); }; var getLeftEdge = function (component) { return getPart(component, detail, 'left-edge'); }; var getRightEdge = function (component) { return getPart(component, detail, 'right-edge'); }; var getTopEdge = function (component) { return getPart(component, detail, 'top-edge'); }; var getBottomEdge = function (component) { return getPart(component, detail, 'bottom-edge'); }; var modelDetail = detail.model; var model = modelDetail.manager; var refresh = function (slider, thumb) { model.setPositionFromValue(slider, thumb, detail, { getLeftEdge: getLeftEdge, getRightEdge: getRightEdge, getTopEdge: getTopEdge, getBottomEdge: getBottomEdge, getSpectrum: getSpectrum }); }; var changeValue = function (slider, newValue) { modelDetail.value.set(newValue); var thumb = getThumb(slider); refresh(slider, thumb); detail.onChange(slider, thumb, newValue); return Optional.some(true); }; var resetToMin = function (slider) { model.setToMin(slider, detail); }; var resetToMax = function (slider) { model.setToMax(slider, detail); }; var choose = function (slider) { var fireOnChoose = function () { getPart(slider, detail, 'thumb').each(function (thumb) { var value = modelDetail.value.get(); detail.onChoose(slider, thumb, value); }); }; var wasDown = detail.mouseIsDown.get(); detail.mouseIsDown.set(false); if (wasDown) { fireOnChoose(); } }; var onDragStart = function (slider, simulatedEvent) { simulatedEvent.stop(); detail.mouseIsDown.set(true); detail.onDragStart(slider, getThumb(slider)); }; var onDragEnd = function (slider, simulatedEvent) { simulatedEvent.stop(); detail.onDragEnd(slider, getThumb(slider)); choose(slider); }; return { uid: detail.uid, dom: detail.dom, components: components, behaviours: augment(detail.sliderBehaviours, [ Keying.config({ mode: 'special', focusIn: function (slider) { return getPart(slider, detail, 'spectrum').map(Keying.focusIn).map(always); } }), Representing.config({ store: { mode: 'manual', getValue: function (_) { return modelDetail.value.get(); } } }), Receiving.config({ channels: (_a = {}, _a[mouseReleased()] = { onReceive: choose }, _a) }) ]), events: derive([ run(sliderChangeEvent(), function (slider, simulatedEvent) { changeValue(slider, simulatedEvent.event.value); }), runOnAttached(function (slider, _simulatedEvent) { var getInitial = modelDetail.getInitialValue(); modelDetail.value.set(getInitial); var thumb = getThumb(slider); refresh(slider, thumb); var spectrum = getSpectrum(slider); detail.onInit(slider, thumb, spectrum, modelDetail.value.get()); }), run(touchstart(), onDragStart), run(touchend(), onDragEnd), run(mousedown(), onDragStart), run(mouseup(), onDragEnd) ]), apis: { resetToMin: resetToMin, resetToMax: resetToMax, changeValue: changeValue, refresh: refresh }, domModification: { styles: { position: 'relative' } } }; }; var Slider = composite$1({ name: 'Slider', configFields: SliderSchema, partFields: SliderParts, factory: sketch, apis: { resetToMin: function (apis, slider) { apis.resetToMin(slider); }, resetToMax: function (apis, slider) { apis.resetToMax(slider); }, refresh: function (apis, slider) { apis.refresh(slider); } } }); var button = function (realm, clazz, makeItems, editor) { return forToolbar(clazz, function () { var items = makeItems(); realm.setContextToolbar([{ label: clazz + ' group', items: items }]); }, {}, editor); }; var BLACK = -1; var makeSlider = function (spec$1) { var getColor = function (hue) { if (hue < 0) { return 'black'; } else if (hue > 360) { return 'white'; } else { return 'hsl(' + hue + ', 100%, 50%)'; } }; var onInit = function (slider, thumb, spectrum, value) { var color = getColor(value.x()); set$3(thumb.element, 'background-color', color); }; var onChange = function (slider, thumb, value) { var color = getColor(value.x()); set$3(thumb.element, 'background-color', color); spec$1.onChange(slider, thumb, color); }; return Slider.sketch({ dom: dom$1('
'), components: [ Slider.parts['left-edge'](spec('
')), Slider.parts.spectrum({ dom: dom$1('
'), components: [spec('
')], behaviours: derive$1([Toggling.config({ toggleClass: resolve('thumb-active') })]) }), Slider.parts['right-edge'](spec('
')), Slider.parts.thumb({ dom: dom$1('
'), behaviours: derive$1([Toggling.config({ toggleClass: resolve('thumb-active') })]) }) ], onChange: onChange, onDragStart: function (slider, thumb) { Toggling.on(thumb); }, onDragEnd: function (slider, thumb) { Toggling.off(thumb); }, onInit: onInit, stepSize: 10, model: { mode: 'x', minX: 0, maxX: 360, getInitialValue: function () { return { x: spec$1.getInitialValue() }; } }, sliderBehaviours: derive$1([orientation(Slider.refresh)]) }); }; var makeItems = function (spec) { return [makeSlider(spec)]; }; var sketch$1 = function (realm, editor) { var spec = { onChange: function (slider, thumb, color) { editor.undoManager.transact(function () { editor.formatter.apply('forecolor', { value: color }); editor.nodeChanged(); }); }, getInitialValue: function () { return BLACK; } }; return button(realm, 'color-levels', function () { return makeItems(spec); }, editor); }; var candidatesArray = [ '9px', '10px', '11px', '12px', '14px', '16px', '18px', '20px', '24px', '32px', '36px' ]; var defaultSize = 'medium'; var defaultIndex = 2; var indexToSize = function (index) { return Optional.from(candidatesArray[index]); }; var sizeToIndex = function (size) { return findIndex(candidatesArray, function (v) { return v === size; }); }; var getRawOrComputed = function (isRoot, rawStart) { var optStart = isElement(rawStart) ? Optional.some(rawStart) : parent(rawStart).filter(isElement); return optStart.map(function (start) { var inline = closest$1(start, function (elem) { return getRaw(elem, 'font-size').isSome(); }, isRoot).bind(function (elem) { return getRaw(elem, 'font-size'); }); return inline.getOrThunk(function () { return get$5(start, 'font-size'); }); }).getOr(''); }; var getSize = function (editor) { var node = editor.selection.getStart(); var elem = SugarElement.fromDom(node); var root = SugarElement.fromDom(editor.getBody()); var isRoot = function (e) { return eq(root, e); }; var elemSize = getRawOrComputed(isRoot, elem); return find(candidatesArray, function (size) { return elemSize === size; }).getOr(defaultSize); }; var applySize = function (editor, value) { var currentValue = getSize(editor); if (currentValue !== value) { editor.execCommand('fontSize', false, value); } }; var get$9 = function (editor) { var size = getSize(editor); return sizeToIndex(size).getOr(defaultIndex); }; var apply$1 = function (editor, index) { indexToSize(index).each(function (size) { applySize(editor, size); }); }; var candidates = constant(candidatesArray); var schema$7 = objOfOnly([ strict$1('getInitialValue'), strict$1('onChange'), strict$1('category'), strict$1('sizes') ]); var sketch$2 = function (rawSpec) { var spec$1 = asRawOrDie('SizeSlider', schema$7, rawSpec); var isValidValue = function (valueIndex) { return valueIndex >= 0 && valueIndex < spec$1.sizes.length; }; var onChange = function (slider, thumb, valueIndex) { var index = valueIndex.x(); if (isValidValue(index)) { spec$1.onChange(index); } }; return Slider.sketch({ dom: { tag: 'div', classes: [ resolve('slider-' + spec$1.category + '-size-container'), resolve('slider'), resolve('slider-size-container') ] }, onChange: onChange, onDragStart: function (slider, thumb) { Toggling.on(thumb); }, onDragEnd: function (slider, thumb) { Toggling.off(thumb); }, model: { mode: 'x', minX: 0, maxX: spec$1.sizes.length - 1, getInitialValue: function () { return { x: spec$1.getInitialValue() }; } }, stepSize: 1, snapToGrid: true, sliderBehaviours: derive$1([orientation(Slider.refresh)]), components: [ Slider.parts.spectrum({ dom: dom$1('
'), components: [spec('
')] }), Slider.parts.thumb({ dom: dom$1('
'), behaviours: derive$1([Toggling.config({ toggleClass: resolve('thumb-active') })]) }) ] }); }; var sizes = candidates(); var makeSlider$1 = function (spec) { return sketch$2({ onChange: spec.onChange, sizes: sizes, category: 'font', getInitialValue: spec.getInitialValue }); }; var makeItems$1 = function (spec$1) { return [ spec(''), makeSlider$1(spec$1), spec('') ]; }; var sketch$3 = function (realm, editor) { var spec = { onChange: function (value) { apply$1(editor, value); }, getInitialValue: function () { return get$9(editor); } }; return button(realm, 'font-size', function () { return makeItems$1(spec); }, editor); }; var record = function (spec) { var uid = isSketchSpec(spec) && hasNonNullableKey(spec, 'uid') ? spec.uid : generate$3('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 }; }; var promise = function () { var Promise = function (fn) { if (typeof this !== 'object') { throw new TypeError('Promises must be constructed via new'); } if (typeof fn !== 'function') { throw new TypeError('not a function'); } this._state = null; this._value = null; this._deferreds = []; doResolve(fn, bind(resolve, this), bind(reject, this)); }; var anyWindow = window; var asap = Promise.immediateFn || typeof anyWindow.setImmediate === 'function' && anyWindow.setImmediate || function (fn) { return setTimeout(fn, 1); }; var bind = function (fn, thisArg) { return function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } return fn.apply(thisArg, args); }; }; var isArray = Array.isArray || function (value) { return Object.prototype.toString.call(value) === '[object Array]'; }; function handle(deferred) { var me = this; if (this._state === null) { this._deferreds.push(deferred); return; } asap(function () { var cb = me._state ? deferred.onFulfilled : deferred.onRejected; if (cb === null) { (me._state ? deferred.resolve : deferred.reject)(me._value); return; } var ret; try { ret = cb(me._value); } catch (e) { deferred.reject(e); return; } deferred.resolve(ret); }); } function resolve(newValue) { try { if (newValue === this) { throw new TypeError('A promise cannot be resolved with itself.'); } if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { var then = newValue.then; if (typeof then === 'function') { doResolve(bind(then, newValue), bind(resolve, this), bind(reject, this)); return; } } this._state = true; this._value = newValue; finale.call(this); } catch (e) { reject.call(this, e); } } function reject(newValue) { this._state = false; this._value = newValue; finale.call(this); } function finale() { for (var _i = 0, _a = this._deferreds; _i < _a.length; _i++) { var deferred = _a[_i]; handle.call(this, deferred); } this._deferreds = []; } function Handler(onFulfilled, onRejected, resolve, reject) { this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; this.onRejected = typeof onRejected === 'function' ? onRejected : null; this.resolve = resolve; this.reject = reject; } var doResolve = function (fn, onFulfilled, onRejected) { var done = false; try { fn(function (value) { if (done) { return; } done = true; onFulfilled(value); }, function (reason) { if (done) { return; } done = true; onRejected(reason); }); } catch (ex) { if (done) { return; } done = true; onRejected(ex); } }; Promise.prototype.catch = function (onRejected) { return this.then(null, onRejected); }; Promise.prototype.then = function (onFulfilled, onRejected) { var me = this; return new Promise(function (resolve, reject) { handle.call(me, new Handler(onFulfilled, onRejected, resolve, reject)); }); }; Promise.all = function () { var values = []; for (var _i = 0; _i < arguments.length; _i++) { values[_i] = arguments[_i]; } var args = Array.prototype.slice.call(values.length === 1 && isArray(values[0]) ? values[0] : values); return new Promise(function (resolve, reject) { if (args.length === 0) { return resolve([]); } var remaining = args.length; var res = function (i, val) { try { if (val && (typeof val === 'object' || typeof val === 'function')) { var then = val.then; if (typeof then === 'function') { then.call(val, function (val) { res(i, val); }, reject); return; } } args[i] = val; if (--remaining === 0) { resolve(args); } } catch (ex) { reject(ex); } }; for (var i = 0; i < args.length; i++) { res(i, args[i]); } }); }; Promise.resolve = function (value) { if (value && typeof value === 'object' && value.constructor === Promise) { return value; } return new Promise(function (resolve) { resolve(value); }); }; Promise.reject = function (reason) { return new Promise(function (resolve, reject) { reject(reason); }); }; Promise.race = function (values) { return new Promise(function (resolve, reject) { for (var _i = 0, values_1 = values; _i < values_1.length; _i++) { var value = values_1[_i]; value.then(resolve, reject); } }); }; return Promise; }; var Promise = window.Promise ? window.Promise : promise(); var blobToDataUri = function (blob) { return new Promise(function (resolve) { var reader = new FileReader(); reader.onloadend = function () { resolve(reader.result); }; reader.readAsDataURL(blob); }); }; var blobToBase64 = function (blob) { return blobToDataUri(blob).then(function (dataUri) { return dataUri.split(',')[1]; }); }; var blobToBase64$1 = function (blob) { return blobToBase64(blob); }; var addImage = function (editor, blob) { blobToBase64$1(blob).then(function (base64) { editor.undoManager.transact(function () { var cache = editor.editorUpload.blobCache; var info = cache.create(generate$1('mceu'), blob, base64); cache.add(info); var img = editor.dom.createHTML('img', { src: info.blobUri() }); editor.insertContent(img); }); }); }; var extractBlob = function (simulatedEvent) { var event = simulatedEvent.event.raw; var files = event.target.files || event.dataTransfer.files; return Optional.from(files[0]); }; var sketch$4 = function (editor) { var pickerDom = { tag: 'input', attributes: { accept: 'image/*', type: 'file', title: '' }, styles: { visibility: 'hidden', position: 'absolute' } }; var memPicker = record({ dom: pickerDom, events: derive([ cutter(click()), run(change(), function (picker, simulatedEvent) { extractBlob(simulatedEvent).each(function (blob) { addImage(editor, blob); }); }) ]) }); return Button.sketch({ dom: getToolbarIconButton('image', editor), components: [memPicker.asSpec()], action: function (button) { var picker = memPicker.get(button); picker.element.dom.click(); } }); }; var get$a = function (element) { return element.dom.textContent; }; var set$5 = function (element, value) { element.dom.textContent = value; }; var isNotEmpty = function (val) { return val.length > 0; }; var defaultToEmpty = function (str) { return str === undefined || str === null ? '' : str; }; var noLink = function (editor) { var text = editor.selection.getContent({ format: 'text' }); return { url: '', text: text, title: '', target: '', link: Optional.none() }; }; var fromLink = function (link) { var text = get$a(link); var url = get$2(link, 'href'); var title = get$2(link, 'title'); var target = get$2(link, 'target'); return { url: defaultToEmpty(url), text: text !== url ? defaultToEmpty(text) : '', title: defaultToEmpty(title), target: defaultToEmpty(target), link: Optional.some(link) }; }; var getInfo = function (editor) { return query(editor).fold(function () { return noLink(editor); }, function (link) { return fromLink(link); }); }; var wasSimple = function (link) { var prevHref = get$2(link, 'href'); var prevText = get$a(link); return prevHref === prevText; }; var getTextToApply = function (link, url, info) { return info.text.toOptional().filter(isNotEmpty).fold(function () { return wasSimple(link) ? Optional.some(url) : Optional.none(); }, Optional.some); }; var unlinkIfRequired = function (editor, info) { var activeLink = info.link.bind(identity); activeLink.each(function (_link) { editor.execCommand('unlink'); }); }; var getAttrs$1 = function (url, info) { var attrs = {}; attrs.href = url; info.title.toOptional().filter(isNotEmpty).each(function (title) { attrs.title = title; }); info.target.toOptional().filter(isNotEmpty).each(function (target) { attrs.target = target; }); return attrs; }; var applyInfo = function (editor, info) { info.url.toOptional().filter(isNotEmpty).fold(function () { unlinkIfRequired(editor, info); }, function (url) { var attrs = getAttrs$1(url, info); var activeLink = info.link.bind(identity); activeLink.fold(function () { var text = info.text.toOptional().filter(isNotEmpty).getOr(url); editor.insertContent(editor.dom.createHTML('a', attrs, editor.dom.encode(text))); }, function (link) { var text = getTextToApply(link, url, info); setAll(link, attrs); text.each(function (newText) { set$5(link, newText); }); }); }); }; var query = function (editor) { var start = SugarElement.fromDom(editor.selection.getStart()); return closest$2(start, 'a'); }; var platform$1 = detect$3(); var preserve = function (f, editor) { var rng = editor.selection.getRng(); f(); editor.selection.setRng(rng); }; var forAndroid = function (editor, f) { var wrapper = platform$1.os.isAndroid() ? preserve : apply; wrapper(f, editor); }; var events$6 = function (name, eventHandlers) { var events = derive(eventHandlers); return create$1({ fields: [strict$1('enabled')], name: name, active: { events: constant(events) } }); }; var config = function (name, eventHandlers) { var me = events$6(name, eventHandlers); return { key: name, value: { config: {}, me: me, configAsRaw: constant({}), initialConfig: {}, state: NoState } }; }; var getCurrent = function (component, composeConfig, _composeState) { return composeConfig.find(component); }; var ComposeApis = /*#__PURE__*/Object.freeze({ __proto__: null, getCurrent: getCurrent }); var ComposeSchema = [strict$1('find')]; var Composing = create$1({ fields: ComposeSchema, name: 'composing', apis: ComposeApis }); var factory$1 = function (detail) { var _a = detail.dom, attributes = _a.attributes, domWithoutAttributes = __rest(_a, ['attributes']); return { uid: detail.uid, dom: __assign({ tag: 'div', attributes: __assign({ role: 'presentation' }, attributes) }, domWithoutAttributes), components: detail.components, behaviours: get$7(detail.containerBehaviours), events: detail.events, domModification: detail.domModification, eventOrder: detail.eventOrder }; }; var Container = single$2({ name: 'Container', factory: factory$1, configFields: [ defaulted$1('components', []), field$1('containerBehaviours', []), defaulted$1('events', {}), defaulted$1('domModification', {}), defaulted$1('eventOrder', {}) ] }); var factory$2 = function (detail) { return { uid: detail.uid, dom: detail.dom, behaviours: SketchBehaviours.augment(detail.dataBehaviours, [ Representing.config({ store: { mode: 'memory', initialValue: detail.getInitialValue() } }), Composing.config({ find: Optional.some }) ]), events: derive([runOnAttached(function (component, _simulatedEvent) { Representing.setValue(component, detail.getInitialValue()); })]) }; }; var DataField = single$2({ name: 'DataField', factory: factory$2, configFields: [ strict$1('uid'), strict$1('dom'), strict$1('getInitialValue'), SketchBehaviours.field('dataBehaviours', [ Representing, Composing ]) ] }); var get$b = function (element) { return element.dom.value; }; var set$6 = function (element, value) { if (value === undefined) { throw new Error('Value.set was undefined'); } element.dom.value = value; }; var schema$8 = constant([ option('data'), defaulted$1('inputAttributes', {}), defaulted$1('inputStyles', {}), defaulted$1('tag', 'input'), defaulted$1('inputClasses', []), onHandler('onSetValue'), defaulted$1('styles', {}), defaulted$1('eventOrder', {}), field$1('inputBehaviours', [ Representing, Focusing ]), defaulted$1('selectOnFocus', true) ]); var focusBehaviours = function (detail) { return derive$1([Focusing.config({ onFocus: !detail.selectOnFocus ? noop : function (component) { var input = component.element; var value = get$b(input); input.dom.setSelectionRange(0, value.length); } })]); }; var behaviours = function (detail) { return __assign(__assign({}, focusBehaviours(detail)), augment(detail.inputBehaviours, [Representing.config({ store: __assign(__assign({ mode: 'manual' }, detail.data.map(function (data) { return { initialValue: data }; }).getOr({})), { getValue: function (input) { return get$b(input.element); }, setValue: function (input, data) { var current = get$b(input.element); if (current !== data) { set$6(input.element, data); } } }), onSetValue: detail.onSetValue })])); }; var dom$2 = function (detail) { return { tag: detail.tag, attributes: __assign({ type: 'text' }, detail.inputAttributes), styles: detail.inputStyles, classes: detail.inputClasses }; }; var factory$3 = function (detail, _spec) { return { uid: detail.uid, dom: dom$2(detail), components: [], behaviours: behaviours(detail), eventOrder: detail.eventOrder }; }; var Input = single$2({ name: 'Input', configFields: schema$8(), factory: factory$3 }); var exhibit$3 = function (base, tabConfig) { return nu$5({ attributes: wrapAll$1([{ key: tabConfig.tabAttr, value: 'true' }]) }); }; var ActiveTabstopping = /*#__PURE__*/Object.freeze({ __proto__: null, exhibit: exhibit$3 }); var TabstopSchema = [defaulted$1('tabAttr', 'data-alloy-tabstop')]; var Tabstopping = create$1({ fields: TabstopSchema, name: 'tabstopping', active: ActiveTabstopping }); var global$3 = tinymce.util.Tools.resolve('tinymce.util.I18n'); var clearInputBehaviour = 'input-clearing'; var field$2 = function (name, placeholder) { var inputSpec = record(Input.sketch({ inputAttributes: { placeholder: global$3.translate(placeholder) }, onSetValue: function (input$1, _data) { emit(input$1, input()); }, inputBehaviours: derive$1([ Composing.config({ find: Optional.some }), Tabstopping.config({}), Keying.config({ mode: 'execution' }) ]), selectOnFocus: false })); var buttonSpec = record(Button.sketch({ dom: dom$1(''), action: function (button) { var input = inputSpec.get(button); Representing.setValue(input, ''); } })); return { name: name, spec: Container.sketch({ dom: dom$1('
'), components: [ inputSpec.asSpec(), buttonSpec.asSpec() ], containerBehaviours: derive$1([ Toggling.config({ toggleClass: resolve('input-container-empty') }), Composing.config({ find: function (comp) { return Optional.some(inputSpec.get(comp)); } }), config(clearInputBehaviour, [run(input(), function (iContainer) { var input = inputSpec.get(iContainer); var val = Representing.getValue(input); var f = val.length > 0 ? Toggling.off : Toggling.on; f(iContainer); })]) ]) }) }; }; var hidden = function (name) { return { name: name, spec: DataField.sketch({ dom: { tag: 'span', styles: { display: 'none' } }, getInitialValue: function () { return Optional.none(); } }) }; }; var nativeDisabled = [ 'input', 'button', 'textarea', 'select' ]; var onLoad$5 = function (component, disableConfig, disableState) { var f = disableConfig.disabled() ? disable : enable; f(component, disableConfig); }; var hasNative = function (component, config) { return config.useNative === true && contains(nativeDisabled, name(component.element)); }; var nativeIsDisabled = function (component) { return has$1(component.element, 'disabled'); }; var nativeDisable = function (component) { set(component.element, 'disabled', 'disabled'); }; var nativeEnable = function (component) { remove$1(component.element, 'disabled'); }; var ariaIsDisabled = function (component) { return get$2(component.element, 'aria-disabled') === 'true'; }; var ariaDisable = function (component) { set(component.element, 'aria-disabled', 'true'); }; var ariaEnable = function (component) { set(component.element, 'aria-disabled', 'false'); }; var disable = 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 = function (component, disableConfig, _disableState) { disableConfig.disableClass.each(function (disableClass) { remove$4(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$7 = function (component, disableConfig, disableState, disabled) { var f = disabled ? disable : enable; f(component, disableConfig); }; var DisableApis = /*#__PURE__*/Object.freeze({ __proto__: null, enable: enable, disable: disable, isDisabled: isDisabled, onLoad: onLoad$5, set: set$7 }); var exhibit$4 = function (base, disableConfig) { return nu$5({ classes: disableConfig.disabled() ? disableConfig.disableClass.toArray() : [] }); }; var events$7 = function (disableConfig, disableState) { return derive([ abort(execute(), function (component, _simulatedEvent) { return isDisabled(component, disableConfig); }), loadEvent(disableConfig, disableState, onLoad$5) ]); }; var ActiveDisable = /*#__PURE__*/Object.freeze({ __proto__: null, exhibit: exhibit$4, events: events$7 }); var DisableSchema = [ defaultedFunction('disabled', never), defaulted$1('useNative', true), option('disableClass'), onHandler('onDisabled'), onHandler('onEnabled') ]; var Disabling = create$1({ fields: DisableSchema, name: 'disabling', active: ActiveDisable, apis: DisableApis }); var owner$1 = 'form'; var schema$9 = [field$1('formBehaviours', [Representing])]; var getPartName = function (name) { return ''; }; var sketch$5 = function (fSpec) { var parts = function () { var record = []; var field = function (name, config) { record.push(name); return generateOne(owner$1, getPartName(name), config); }; return { field: field, record: function () { return record; } }; }(); var spec = fSpec(parts); var partNames = parts.record(); var fieldParts = map(partNames, function (n) { return required({ name: n, pname: getPartName(n) }); }); return composite(owner$1, schema$9, fieldParts, make, spec); }; var toResult$1 = function (o, e) { return o.fold(function () { return Result.error(e); }, Result.value); }; var make = function (detail, components) { return { uid: detail.uid, dom: detail.dom, components: components, behaviours: augment(detail.formBehaviours, [Representing.config({ store: { mode: 'manual', getValue: function (form) { var resPs = getAllParts(form, detail); return map$1(resPs, function (resPThunk, pName) { return resPThunk().bind(function (v) { var opt = Composing.getCurrent(v); return toResult$1(opt, new Error('Cannot find a current component to extract the value from for form part \'' + pName + '\': ' + element(v.element))); }).map(Representing.getValue); }); }, setValue: function (form, values) { each$1(values, function (newValue, key) { getPart(form, detail, key).each(function (wrapper) { Composing.getCurrent(wrapper).each(function (field) { Representing.setValue(field, newValue); }); }); }); } } })]), apis: { getField: function (form, key) { return getPart(form, detail, key).bind(Composing.getCurrent); } } }; }; var Form = { getField: makeApi(function (apis, component, key) { return apis.getField(component, key); }), sketch: sketch$5 }; var api$2 = function () { var subject = Cell(Optional.none()); var revoke = function () { return subject.get().each(function (s) { return s.destroy(); }); }; var clear = function () { revoke(); subject.set(Optional.none()); }; var set = function (s) { revoke(); subject.set(Optional.some(s)); }; var run = function (f) { return subject.get().each(f); }; var isSet = function () { return subject.get().isSome(); }; return { clear: clear, isSet: isSet, set: set, run: run }; }; var value$2 = function () { var subject = Cell(Optional.none()); var clear = function () { return subject.set(Optional.none()); }; var set = function (s) { return subject.set(Optional.some(s)); }; var isSet = function () { return subject.get().isSome(); }; var on = function (f) { return subject.get().each(f); }; return { clear: clear, set: set, isSet: isSet, on: on }; }; var SWIPING_LEFT = 1; var SWIPING_RIGHT = -1; var SWIPING_NONE = 0; var init$2 = function (xValue) { return { xValue: xValue, points: [] }; }; var move$1 = function (model, xValue) { if (xValue === model.xValue) { return model; } var currentDirection = xValue - model.xValue > 0 ? SWIPING_LEFT : SWIPING_RIGHT; var newPoint = { direction: currentDirection, xValue: xValue }; var priorPoints = function () { if (model.points.length === 0) { return []; } else { var prev = model.points[model.points.length - 1]; return prev.direction === currentDirection ? model.points.slice(0, model.points.length - 1) : model.points; } }(); return { xValue: xValue, points: priorPoints.concat([newPoint]) }; }; var complete = function (model) { if (model.points.length === 0) { return SWIPING_NONE; } else { var firstDirection = model.points[0].direction; var lastDirection = model.points[model.points.length - 1].direction; return firstDirection === SWIPING_RIGHT && lastDirection === SWIPING_RIGHT ? SWIPING_RIGHT : firstDirection === SWIPING_LEFT && lastDirection === SWIPING_LEFT ? SWIPING_LEFT : SWIPING_NONE; } }; var sketch$6 = function (rawSpec) { var navigateEvent = 'navigateEvent'; var wrapperAdhocEvents = 'serializer-wrapper-events'; var formAdhocEvents = 'form-events'; var schema = objOf([ strict$1('fields'), defaulted$1('maxFieldIndex', rawSpec.fields.length - 1), strict$1('onExecute'), strict$1('getInitialValue'), state$1('state', function () { return { dialogSwipeState: value$2(), currentScreen: Cell(0) }; }) ]); var spec$1 = asRawOrDie('SerialisedDialog', schema, rawSpec); var navigationButton = function (direction, directionName, enabled) { return Button.sketch({ dom: dom$1(''), action: function (button) { emitWith(button, navigateEvent, { direction: direction }); }, buttonBehaviours: derive$1([Disabling.config({ disableClass: resolve('toolbar-navigation-disabled'), disabled: function () { return !enabled; } })]) }); }; var reposition = function (dialog, message) { descendant$1(dialog.element, '.' + resolve('serialised-dialog-chain')).each(function (parent) { set$3(parent, 'left', -spec$1.state.currentScreen.get() * message.width + 'px'); }); }; var navigate = function (dialog, direction) { var screens = descendants(dialog.element, '.' + resolve('serialised-dialog-screen')); descendant$1(dialog.element, '.' + resolve('serialised-dialog-chain')).each(function (parent) { if (spec$1.state.currentScreen.get() + direction >= 0 && spec$1.state.currentScreen.get() + direction < screens.length) { getRaw(parent, 'left').each(function (left) { var currentLeft = parseInt(left, 10); var w = get$8(screens[0]); set$3(parent, 'left', currentLeft - direction * w + 'px'); }); spec$1.state.currentScreen.set(spec$1.state.currentScreen.get() + direction); } }); }; var focusInput = function (dialog) { var inputs = descendants(dialog.element, 'input'); var optInput = Optional.from(inputs[spec$1.state.currentScreen.get()]); optInput.each(function (input) { dialog.getSystem().getByDom(input).each(function (inputComp) { dispatchFocus(dialog, inputComp.element); }); }); var dotitems = memDots.get(dialog); Highlighting.highlightAt(dotitems, spec$1.state.currentScreen.get()); }; var resetState = function () { spec$1.state.currentScreen.set(0); spec$1.state.dialogSwipeState.clear(); }; var memForm = record(Form.sketch(function (parts) { return { dom: dom$1('
'), components: [Container.sketch({ dom: dom$1('
'), components: map(spec$1.fields, function (field, i) { return i <= spec$1.maxFieldIndex ? Container.sketch({ dom: dom$1('
'), components: [ navigationButton(-1, 'previous', i > 0), parts.field(field.name, field.spec), navigationButton(+1, 'next', i < spec$1.maxFieldIndex) ] }) : parts.field(field.name, field.spec); }) })], formBehaviours: derive$1([ orientation(function (dialog, message) { reposition(dialog, message); }), Keying.config({ mode: 'special', focusIn: function (dialog, _specialInfo) { focusInput(dialog); }, onTab: function (dialog, _specialInfo) { navigate(dialog, +1); return Optional.some(true); }, onShiftTab: function (dialog, _specialInfo) { navigate(dialog, -1); return Optional.some(true); } }), config(formAdhocEvents, [ runOnAttached(function (dialog, _simulatedEvent) { resetState(); var dotitems = memDots.get(dialog); Highlighting.highlightFirst(dotitems); spec$1.getInitialValue(dialog).each(function (v) { Representing.setValue(dialog, v); }); }), runOnExecute(spec$1.onExecute), run(transitionend(), function (dialog, simulatedEvent) { var event = simulatedEvent.event; if (event.raw.propertyName === 'left') { focusInput(dialog); } }), run(navigateEvent, function (dialog, simulatedEvent) { var event = simulatedEvent.event; var direction = event.direction; navigate(dialog, direction); }) ]) ]) }; })); var memDots = record({ dom: dom$1('
'), behaviours: derive$1([Highlighting.config({ highlightClass: resolve('dot-active'), itemClass: resolve('dot-item') })]), components: bind(spec$1.fields, function (_f, i) { return i <= spec$1.maxFieldIndex ? [spec('
')] : []; }) }); return { dom: dom$1('
'), components: [ memForm.asSpec(), memDots.asSpec() ], behaviours: derive$1([ Keying.config({ mode: 'special', focusIn: function (wrapper) { var form = memForm.get(wrapper); Keying.focusIn(form); } }), config(wrapperAdhocEvents, [ run(touchstart(), function (_wrapper, simulatedEvent) { var event = simulatedEvent.event; spec$1.state.dialogSwipeState.set(init$2(event.raw.touches[0].clientX)); }), run(touchmove(), function (_wrapper, simulatedEvent) { var event = simulatedEvent.event; spec$1.state.dialogSwipeState.on(function (state) { simulatedEvent.event.prevent(); spec$1.state.dialogSwipeState.set(move$1(state, event.raw.touches[0].clientX)); }); }), run(touchend(), function (wrapper, _simulatedEvent) { spec$1.state.dialogSwipeState.on(function (state) { var dialog = memForm.get(wrapper); var direction = -1 * complete(state); navigate(dialog, direction); }); }) ]) ]) }; }; var getGroups = cached(function (realm, editor) { return [{ label: 'the link group', items: [sketch$6({ fields: [ field$2('url', 'Type or paste URL'), field$2('text', 'Link text'), field$2('title', 'Link title'), field$2('target', 'Link target'), hidden('link') ], maxFieldIndex: [ 'url', 'text', 'title', 'target' ].length - 1, getInitialValue: function () { return Optional.some(getInfo(editor)); }, onExecute: function (dialog, _simulatedEvent) { var info = Representing.getValue(dialog); applyInfo(editor, info); realm.restoreToolbar(); editor.focus(); } })] }]; }); var sketch$7 = function (realm, editor) { return forToolbarStateAction(editor, 'link', 'link', function () { var groups = getGroups(realm, editor); realm.setContextToolbar(groups); forAndroid(editor, function () { realm.focusToolbar(); }); query(editor).each(function (link) { editor.selection.select(link.dom); }); }); }; var isRecursive = function (component, originator, target) { return eq(originator, component.element) && !eq(originator, target); }; var events$8 = derive([can(focus(), function (component, simulatedEvent) { var event = simulatedEvent.event; var originator = event.originator; var target = event.target; if (isRecursive(component, originator, target)) { console.warn(focus() + ' did not get interpreted by the desired target. ' + '\nOriginator: ' + element(originator) + '\nTarget: ' + element(target) + '\nCheck the ' + focus() + ' event handlers'); return false; } else { return true; } })]); var DefaultEvents = /*#__PURE__*/Object.freeze({ __proto__: null, events: events$8 }); var make$1 = identity; var NoContextApi = function (getComp) { var fail = function (event) { return function () { throw new Error('The component must be in a context to send: ' + event + (getComp ? '\n' + element(getComp().element) + ' is not in context.' : '')); }; }; return { debugInfo: constant('fake'), triggerEvent: fail('triggerEvent'), triggerFocus: fail('triggerFocus'), triggerEscape: fail('triggerEscape'), build: fail('build'), addToWorld: fail('addToWorld'), removeFromWorld: fail('removeFromWorld'), addToGui: fail('addToGui'), removeFromGui: fail('removeFromGui'), getByUid: fail('getByUid'), getByDom: fail('getByDom'), broadcast: fail('broadcast'), broadcastOn: fail('broadcastOn'), broadcastEvent: fail('broadcastEvent'), isConnected: never }; }; var singleton = NoContextApi(); var generateFrom = function (spec, all) { var schema = map(all, function (a) { return optionObjOf(a.name(), [ strict$1('config'), defaulted$1('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)); }, function (v) { return v; }); 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 function () { return output; }; }) }; }; var getBehaviours = function (bData) { return bData.list; }; var getData = function (bData) { return bData.data; }; var byInnerKey = function (data, tuple) { var r = {}; each$1(data, function (detail, key) { each$1(detail, function (value, indexKey) { var chain = get$1(r, indexKey).getOr([]); r[indexKey] = chain.concat([tuple(key, value)]); }); }); return r; }; var combine$1 = function (info, baseMod, behaviours, base) { var modsByBehaviour = __assign({}, baseMod); each(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$5({ 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(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$2 = function (info, eventOrder, behaviours, base) { var byEventName = groupByEvents(info, behaviours, base); return combineGroups(byEventName, eventOrder); }; var assemble = function (rawHandler) { var handler = read$1(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(tuples, function (c) { return c.name; }), null, 2)]); }; var fuse$1 = 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(sortedTuples, function (tuple) { return tuple.handler; }); return fuse(handlers); }); } }; var combineGroups = function (byEventName, eventOrder) { var r = mapToArray(byEventName, function (tuples, eventName) { var combined = tuples.length === 1 ? Result.value(tuples[0].handler) : fuse$1(tuples, eventOrder, eventName); return combined.map(function (handler) { var assembled = assemble(handler); var purpose = tuples.length > 1 ? filter(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 baseBehaviour = 'alloy.base.behaviour'; var toInfo = function (spec) { var _a; return asRaw('custom.definition', objOf([ field('dom', 'dom', strict(), objOf([ strict$1('tag'), defaulted$1('styles', {}), defaulted$1('classes', []), defaulted$1('attributes', {}), option('value'), option('innerHtml') ])), strict$1('components'), strict$1('uid'), defaulted$1('events', {}), defaulted$1('apis', {}), field('eventOrder', 'eventOrder', mergeWith((_a = {}, _a[execute()] = [ 'disabling', baseBehaviour, 'toggling', 'typeaheadevents' ], _a[focus()] = [ baseBehaviour, 'focusing', 'keying' ], _a[systemInit()] = [ baseBehaviour, 'disabling', 'toggling', 'representing' ], _a[input()] = [ baseBehaviour, 'representing', 'streaming', 'invalidating' ], _a[detachedFromDom()] = [ baseBehaviour, 'representing', 'item-events', 'tooltipping' ], _a[mousedown()] = [ 'focusing', baseBehaviour, 'item-type-events' ], _a[touchstart()] = [ 'focusing', baseBehaviour, 'item-type-events' ], _a[mouseover()] = [ 'item-type-events', 'tooltipping' ], _a[receive()] = [ 'receiving', 'reflecting', 'tooltipping' ], _a)), anyValue$1()), option('domModification') ]), spec); }; var toDefinition = function (detail) { return __assign(__assign({}, detail.dom), { uid: detail.uid, domChildren: map(detail.components, function (comp) { return comp.element; }) }); }; var toModification = function (detail) { return detail.domModification.fold(function () { return nu$5({}); }, nu$5); }; var toEvents = function (info) { return info.events; }; var add$3 = function (element, classes) { each(classes, function (x) { add$2(element, x); }); }; var remove$6 = function (element, classes) { each(classes, function (x) { remove$4(element, x); }); }; var renderToDom = function (definition) { var subject = SugarElement.fromTag(definition.tag); setAll(subject, definition.attributes); add$3(subject, definition.classes); setAll$1(subject, definition.styles); definition.innerHtml.each(function (html) { return set$1(subject, html); }); var children = definition.domChildren; append$1(subject, children); definition.value.each(function (value) { set$6(subject, value); }); if (!definition.uid) { debugger; } writeOnly(subject, definition.uid); return subject; }; var getBehaviours$1 = function (spec) { var behaviours = get$1(spec, 'behaviours').getOr({}); var keys$1 = filter(keys(behaviours), function (k) { return behaviours[k] !== undefined; }); return map(keys$1, function (k) { return behaviours[k].me; }); }; var generateFrom$1 = function (spec, all) { return generateFrom(spec, all); }; var generate$4 = function (spec) { var all = getBehaviours$1(spec); return generateFrom$1(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$1(bData, baseModification, bList, definition) : infoModification; return merge$1(definition, modification); }; var getEvents = function (info, bList, bData) { var baseEvents = { 'alloy.base.behaviour': toEvents(info) }; return combine$2(bData, info.eventOrder, bList, baseEvents).getOrDie(); }; var build = function (spec) { var getMe = function () { return me; }; var systemApi = Cell(singleton); var info = getOrDie(toInfo(spec)); var bBlob = generate$4(spec); var bList = getBehaviours(bBlob); var bData = getData(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(children$1, function (child) { return systemApi.get().getByDom(child).fold(function () { return []; }, function (c) { return [c]; }); }); 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 = { 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$1(spec, 'components').getOr([]); return map(components, build$1); }; var buildFromSpec = function (userSpec) { var _a = make$1(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(completeSpec)); }; var text = function (textContent) { var element = SugarElement.fromText(textContent); return external$1({ element: element }); }; var external$1 = function (spec) { var extSpec = asRawOrDie('external.component', objOfOnly([ strict$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; })); }; extSpec.uid.each(function (uid) { writeOnly(extSpec.element, uid); }); var me = { getSystem: systemApi.get, config: Optional.none, hasConfigured: never, connect: connect, disconnect: disconnect, getApis: function () { return {}; }, element: extSpec.element, spec: spec, readState: constant('No state'), syncComponents: noop, components: constant([]), events: {} }; return premade(me); }; var uids = generate$3; var build$1 = function (spec) { return getPremade(spec).fold(function () { var userSpecWithUid = spec.hasOwnProperty('uid') ? spec : __assign({ uid: uids('') }, spec); return buildFromSpec(userSpecWithUid).getOrDie(); }, function (prebuilt) { return prebuilt; }); }; var premade$1 = premade; 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 = function (item) { emitWith(item, focusEvent, { item: item }); }; var hover = constant(hoverEvent); var focus$3 = constant(focusEvent); var builder = 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(component); } }), Keying.config({ mode: 'execution' }), Representing.config({ store: { mode: 'memory', initialValue: detail.data } }), config('item-type-events', __spreadArrays(pointerEvents(), [ run(mouseover(), onHover), run(focusItem(), Focusing.focus) ])) ]), components: detail.components, eventOrder: detail.eventOrder }; }; var schema$a = [ strict$1('data'), strict$1('components'), strict$1('dom'), defaulted$1('hasSubmenu', false), option('toggling'), SketchBehaviours.field('itemBehaviours', [ Toggling, Focusing, Keying, Representing ]), defaulted$1('ignoreFocus', false), defaulted$1('domModification', {}), output('builder', builder), defaulted$1('eventOrder', {}) ]; var builder$1 = function (detail) { return { dom: detail.dom, components: detail.components, events: derive([stopper(focusItem())]) }; }; var schema$b = [ strict$1('dom'), strict$1('components'), output('builder', builder$1) ]; var owner$2 = constant('item-widget'); var parts = constant([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$2 = function (detail) { var subs = substitutes(owner$2(), detail, parts()); var components$1 = components(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$1, domModification: detail.domModification, events: derive([ runOnExecute(function (component, simulatedEvent) { focusWidget(component).each(function (_widget) { simulatedEvent.stop(); }); }), run(mouseover(), onHover), run(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(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$c = [ strict$1('uid'), strict$1('data'), strict$1('components'), strict$1('dom'), defaulted$1('autofocus', false), defaulted$1('ignoreFocus', false), SketchBehaviours.field('widgetBehaviours', [ Representing, Focusing, Keying ]), defaulted$1('domModification', {}), defaultUidsSchema(parts()), output('builder', builder$2) ]; var itemSchema$1 = choose$1('type', { widget: schema$c, item: schema$a, separator: schema$b }); 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$1 = constant([group({ factory: { sketch: function (spec) { var itemInfo = asRawOrDie('menu.spec item', itemSchema$1, spec); return itemInfo.builder(itemInfo); } }, name: 'items', unit: 'item', defaults: function (detail, u) { return u.hasOwnProperty('uid') ? u : __assign(__assign({}, u), { uid: generate$3('item') }); }, overrides: function (detail, u) { return { type: u.type, ignoreFocus: detail.fakeFocus, domModification: { classes: [detail.markers.item] } }; } })]); var schema$d = constant([ strict$1('value'), strict$1('items'), strict$1('dom'), strict$1('components'), defaulted$1('eventOrder', {}), field$1('menuBehaviours', [ Highlighting, Representing, Composing, Keying ]), defaultedOf('movement', { mode: 'menu', moveOnTab: true }, choose$1('mode', { grid: [ initSize(), output('config', configureGrid) ], matrix: [ output('config', configureMatrix), strict$1('rowSelector') ], menu: [ defaulted$1('moveOnTab', true), output('config', configureMenu) ] })), itemMarkers(), defaulted$1('fakeFocus', false), defaulted$1('focusManager', dom()), onHandler('onHighlight') ]); var focus$4 = constant('alloy.menu-focus'); var make$2 = 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([ run(focus$3(), function (menu, simulatedEvent) { var event = simulatedEvent.event; menu.getSystem().getByDom(event.target).each(function (item) { Highlighting.highlight(menu, item); simulatedEvent.stop(); emitWith(menu, focus$4(), { menu: menu, item: item }); }); }), run(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$1({ name: 'Menu', configFields: schema$d(), partFields: parts$1(), factory: make$2 }); 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(container, hasFocus); }); var result = f(container); refocus.each(function (oldFocus) { active(dos).filter(function (newFocus) { return eq(newFocus, oldFocus); }).fold(function () { focus$1(oldFocus); }, noop); }); return result; }; var set$8 = function (component, replaceConfig, replaceState, data) { preserve$1(function () { var newChildren = map(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$2 = function (component, replaceConfig, replaceState, appendee) { insert(component, replaceConfig, append, appendee); }; var prepend$1 = function (component, replaceConfig, replaceState, prependee) { insert(component, replaceConfig, prepend, prependee); }; var remove$7 = function (component, replaceConfig, replaceState, removee) { var children = contents(component); var foundChild = find(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$7(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(children, replaceePred).bind(function (replaceeIndex) { return replaceAt(component, replaceConfig, replaceState, replaceeIndex, replacer); }); }; var ReplaceApis = /*#__PURE__*/Object.freeze({ __proto__: null, append: append$2, prepend: prepend$1, remove: remove$7, replaceAt: replaceAt, replaceBy: replaceBy, set: set$8, contents: contents }); var Replacing = create$1({ fields: [], name: 'replacing', apis: ReplaceApis }); var transpose = function (obj) { return tupleMap(obj, function (v, k) { return { k: v, v: k }; }); }; var trace = function (items, byItem, byMenu, finish) { return get$1(byMenu, finish).bind(function (triggerItem) { return get$1(items, triggerItem).bind(function (triggerMenu) { var rest = trace(items, byItem, byMenu, triggerMenu); return Optional.some([triggerMenu].concat(rest)); }); }).getOr([]); }; var generate$5 = function (menus, expansions) { var items = {}; each$1(menus, function (menuItems, menu) { each(menuItems, function (item) { items[item] = menu; }); }); var byItem = expansions; var byMenu = transpose(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$1(menuPaths, menu).getOr([menu]); }); }; var init$3 = function () { var expansions = Cell({}); var menus = Cell({}); var paths = Cell({}); var primary = Cell(Optional.none()); var directory = Cell({}); var clear = function () { expansions.set({}); menus.set({}); paths.set({}); primary.set(Optional.none()); }; 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(Optional.some(sPrimary)); expansions.set(sExpansions); menus.set(sMenus); directory.set(dir); var sPaths = generate$5(dir, sExpansions); paths.set(sPaths); }; var getTriggeringItem = function (menuValue) { return find$2(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(lookupItem(itemValue).toArray(), function (menuValue) { return getPreparedMenu(menuValue).isSome(); }); return get$1(paths.get(), itemValue).bind(function (path) { var revPath = reverse(extraPath.concat(path)); var triggers = bind(revPath, function (menuValue, menuIndex) { return getTriggerData(menuValue, getItemByValue, revPath.slice(0, menuIndex + 1)).fold(function () { return primary.get().is(menuValue) ? [] : [Optional.none()]; }, function (data) { return [Optional.some(data)]; }); }); return sequence(triggers); }); }; var expand = function (itemValue) { return get$1(expansions.get(), itemValue).map(function (menu) { var current = get$1(paths.get(), itemValue).getOr([]); return [menu].concat(current); }); }; var collapse = function (itemValue) { return get$1(paths.get(), itemValue).bind(function (path) { return path.length > 1 ? Optional.some(path.slice(1)) : Optional.none(); }); }; var refresh = function (itemValue) { return get$1(paths.get(), itemValue); }; var getPreparedMenu = function (menuValue) { return lookupMenu(menuValue).bind(extractPreparedMenu); }; var lookupMenu = function (menuValue) { return get$1(menus.get(), menuValue); }; var lookupItem = function (itemValue) { return get$1(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$3, extractPreparedMenu: extractPreparedMenu }; var make$3 = function (detail, _rawUiSpec) { var submenuParentItems = Cell(Optional.none()); 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() })); }; 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(candidates, function (c) { return getItemValue(c) === itemValue; }); }); }; var toDirectory = function (_container) { return map$1(detail.data.menus, function (data, _menuName) { return bind(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(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(others, function (o) { remove$6(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(items, function (i) { return get$2(i, 'aria-haspopup') === 'true'; }); each(parentItems, function (i) { container.getSystem().getByDom(i).each(function (itemComp) { var key = getItemValue(itemComp); r[key] = itemComp; }); }); submenuParentItems.set(Optional.some(r)); return r; }); }; var updateAriaExpansions = function (container, path) { var parentItems = getSubmenuParents(container); each$1(parentItems, function (v, k) { var expanded = contains(path, k); set(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(rest, function (r) { add$2(r.element, detail.markers.backgroundMenu); }); if (!inBody(activeMenu.element)) { Replacing.append(container, premade$1(activeMenu)); } remove$6(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; } 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$1(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$2(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([ run(focus$4(), 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(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$1(primary)); detail.onOpenMenu(container, primary); if (detail.highlightImmediately) { setActiveMenu(container, primary); } }); }) ].concat(detail.navigateOnHover ? [run(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$2(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(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 = constant('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$1 = function (text) { return { value: generate$1(collapseItem()), meta: { text: text } }; }; var tieredMenu = single$2({ name: 'TieredMenu', configFields: [ onStrictKeyboardHandler('onExecute'), onStrictKeyboardHandler('onEscape'), onStrictHandler('onOpenMenu'), onStrictHandler('onOpenSubmenu'), onHandler('onRepositionMenu'), onHandler('onCollapseMenu'), defaulted$1('highlightImmediately', true), strictObjOf('data', [ strict$1('primary'), strict$1('menus'), strict$1('expansions') ]), defaulted$1('fakeFocus', false), onHandler('onHighlight'), onHandler('onHover'), tieredMenuMarkers(), strict$1('dom'), defaulted$1('navigateOnHover', true), defaulted$1('stayInDom', false), field$1('tmenuBehaviours', [ Keying, Highlighting, Composing, Replacing ]), defaulted$1('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$3, extraApis: { tieredData: tieredData, singleData: singleData, collapseItem: collapseItem$1 } }); var findRoute = function (component, transConfig, transState, route) { return get$1(transConfig.routes, route.start).bind(function (sConfig) { return get$1(sConfig, route.destination); }); }; var getTransition = function (comp, transConfig, transState) { var route = getCurrentRoute(comp, transConfig); return route.bind(function (r) { return getTransitionOf(comp, transConfig, transState, r); }); }; var getTransitionOf = function (comp, transConfig, transState, route) { return findRoute(comp, transConfig, transState, route).bind(function (r) { return r.transition.map(function (t) { return { transition: t, route: r }; }); }); }; var disableTransition = function (comp, transConfig, transState) { getTransition(comp, transConfig, transState).each(function (routeTransition) { var t = routeTransition.transition; remove$4(comp.element, t.transitionClass); remove$1(comp.element, transConfig.destinationAttr); }); }; var getNewRoute = function (comp, transConfig, transState, destination) { return { start: get$2(comp.element, transConfig.stateAttr), destination: destination }; }; var getCurrentRoute = function (comp, transConfig, _transState) { var el = comp.element; return getOpt(el, transConfig.destinationAttr).map(function (destination) { return { start: get$2(comp.element, transConfig.stateAttr), destination: destination }; }); }; var jumpTo = function (comp, transConfig, transState, destination) { disableTransition(comp, transConfig, transState); if (has$1(comp.element, transConfig.stateAttr) && get$2(comp.element, transConfig.stateAttr) !== destination) { transConfig.onFinish(comp, destination); } set(comp.element, transConfig.stateAttr, destination); }; var fasttrack = function (comp, transConfig, _transState, _destination) { if (has$1(comp.element, transConfig.destinationAttr)) { getOpt(comp.element, transConfig.destinationAttr).each(function (destination) { set(comp.element, transConfig.stateAttr, destination); }); remove$1(comp.element, transConfig.destinationAttr); } }; var progressTo = function (comp, transConfig, transState, destination) { fasttrack(comp, transConfig); var route = getNewRoute(comp, transConfig, transState, destination); getTransitionOf(comp, transConfig, transState, route).fold(function () { jumpTo(comp, transConfig, transState, destination); }, function (routeTransition) { disableTransition(comp, transConfig, transState); var t = routeTransition.transition; add$2(comp.element, t.transitionClass); set(comp.element, transConfig.destinationAttr, destination); }); }; var getState$1 = function (comp, transConfig, _transState) { return getOpt(comp.element, transConfig.stateAttr); }; var TransitionApis = /*#__PURE__*/Object.freeze({ __proto__: null, findRoute: findRoute, disableTransition: disableTransition, getCurrentRoute: getCurrentRoute, jumpTo: jumpTo, progressTo: progressTo, getState: getState$1 }); var events$9 = function (transConfig, transState) { return derive([ run(transitionend(), function (component, simulatedEvent) { var raw = simulatedEvent.event.raw; getCurrentRoute(component, transConfig).each(function (route) { findRoute(component, transConfig, transState, route).each(function (rInfo) { rInfo.transition.each(function (rTransition) { if (raw.propertyName === rTransition.property) { jumpTo(component, transConfig, transState, route.destination); transConfig.onTransition(component, route); } }); }); }); }), runOnAttached(function (comp, _se) { jumpTo(comp, transConfig, transState, transConfig.initialState); }) ]); }; var ActiveTransitioning = /*#__PURE__*/Object.freeze({ __proto__: null, events: events$9 }); var TransitionSchema = [ defaulted$1('destinationAttr', 'data-transitioning-destination'), defaulted$1('stateAttr', 'data-transitioning-state'), strict$1('initialState'), onHandler('onTransition'), onHandler('onFinish'), strictOf('routes', setOf$1(Result.value, setOf$1(Result.value, objOfOnly([optionObjOfOnly('transition', [ strict$1('property'), strict$1('transitionClass') ])])))) ]; var createRoutes = function (routes) { var r = {}; each$1(routes, function (v, k) { var waypoints = k.split('<->'); r[waypoints[0]] = wrap$1(waypoints[1], v); r[waypoints[1]] = wrap$1(waypoints[0], v); }); return r; }; var createBistate = function (first, second, transitions) { return wrapAll$1([ { key: first, value: wrap$1(second, transitions) }, { key: second, value: wrap$1(first, transitions) } ]); }; var createTristate = function (first, second, third, transitions) { return wrapAll$1([ { key: first, value: wrapAll$1([ { key: second, value: transitions }, { key: third, value: transitions } ]) }, { key: second, value: wrapAll$1([ { key: first, value: transitions }, { key: third, value: transitions } ]) }, { key: third, value: wrapAll$1([ { key: first, value: transitions }, { key: second, value: transitions } ]) } ]); }; var Transitioning = create$1({ fields: TransitionSchema, name: 'transitioning', active: ActiveTransitioning, apis: TransitionApis, extra: { createRoutes: createRoutes, createBistate: createBistate, createTristate: createTristate } }); var scrollableStyle = resolve('scrollable'); var register = function (element) { add$2(element, scrollableStyle); }; var deregister = function (element) { remove$4(element, scrollableStyle); }; var scrollable = scrollableStyle; var getValue$4 = function (item) { return get$1(item, 'format').getOr(item.title); }; var convert$1 = function (formats, memMenuThunk) { var mainMenu = makeMenu('Styles', [].concat(map(formats.items, function (k) { return makeItem(getValue$4(k), k.title, k.isSelected(), k.getPreview(), hasNonNullableKey(formats.expansions, getValue$4(k))); })), memMenuThunk, false); var submenus = map$1(formats.menus, function (menuItems, menuName) { var items = map(menuItems, function (item) { return makeItem(getValue$4(item), item.title, item.isSelected !== undefined ? item.isSelected() : false, item.getPreview !== undefined ? item.getPreview() : '', hasNonNullableKey(formats.expansions, getValue$4(item))); }); return makeMenu(menuName, items, memMenuThunk, true); }); var menus = deepMerge(submenus, wrap$1('styles', mainMenu)); var tmenu = tieredMenu.tieredData('styles', menus, formats.expansions); return { tmenu: tmenu }; }; var makeItem = function (value, text, selected, preview, isMenu) { return { data: { value: value, text: text }, type: 'item', dom: { tag: 'div', classes: isMenu ? [resolve('styles-item-is-menu')] : [] }, toggling: { toggleOnExecute: false, toggleClass: resolve('format-matches'), selected: selected }, itemBehaviours: derive$1(isMenu ? [] : [format(value, function (comp, status) { var toggle = status ? Toggling.on : Toggling.off; toggle(comp); })]), components: [{ dom: { tag: 'div', attributes: { style: preview }, innerHtml: text } }] }; }; var makeMenu = function (value, items, memMenuThunk, collapsable) { return { value: value, dom: { tag: 'div' }, components: [ Button.sketch({ dom: { tag: 'div', classes: [resolve('styles-collapser')] }, components: collapsable ? [ { dom: { tag: 'span', classes: [resolve('styles-collapse-icon')] } }, text(value) ] : [text(value)], action: function (item) { if (collapsable) { var comp = memMenuThunk().get(item); tieredMenu.collapseMenu(comp); } } }), { dom: { tag: 'div', classes: [resolve('styles-menu-items-container')] }, components: [Menu.parts.items({})], behaviours: derive$1([config('adhoc-scrollable-menu', [ runOnAttached(function (component, _simulatedEvent) { set$3(component.element, 'overflow-y', 'auto'); set$3(component.element, '-webkit-overflow-scrolling', 'touch'); register(component.element); }), runOnDetached(function (component) { remove$5(component.element, 'overflow-y'); remove$5(component.element, '-webkit-overflow-scrolling'); deregister(component.element); }) ])]) } ], items: items, menuBehaviours: derive$1([Transitioning.config({ initialState: 'after', routes: Transitioning.createTristate('before', 'current', 'after', { transition: { property: 'transform', transitionClass: 'transitioning' } }) })]) }; }; var sketch$8 = function (settings) { var dataset = convert$1(settings.formats, function () { return memMenu; }); var memMenu = record(tieredMenu.sketch({ dom: { tag: 'div', classes: [resolve('styles-menu')] }, components: [], fakeFocus: true, stayInDom: true, onExecute: function (_tmenu, item) { var v = Representing.getValue(item); settings.handle(item, v.value); return Optional.none(); }, onEscape: function () { return Optional.none(); }, onOpenMenu: function (container, menu) { var w = get$8(container.element); set$4(menu.element, w); Transitioning.jumpTo(menu, 'current'); }, onOpenSubmenu: function (container, item, submenu) { var w = get$8(container.element); var menu = ancestor$2(item.element, '[role="menu"]').getOrDie('hacky'); var menuComp = container.getSystem().getByDom(menu).getOrDie(); set$4(submenu.element, w); Transitioning.progressTo(menuComp, 'before'); Transitioning.jumpTo(submenu, 'after'); Transitioning.progressTo(submenu, 'current'); }, onCollapseMenu: function (container, item, menu) { var submenu = ancestor$2(item.element, '[role="menu"]').getOrDie('hacky'); var submenuComp = container.getSystem().getByDom(submenu).getOrDie(); Transitioning.progressTo(submenuComp, 'after'); Transitioning.progressTo(menu, 'current'); }, navigateOnHover: false, highlightImmediately: true, data: dataset.tmenu, markers: { backgroundMenu: resolve('styles-background-menu'), menu: resolve('styles-menu'), selectedMenu: resolve('styles-selected-menu'), item: resolve('styles-item'), selectedItem: resolve('styles-selected-item') } })); return memMenu.asSpec(); }; var getFromExpandingItem = function (item) { var newItem = deepMerge(exclude$1(item, ['items']), { menu: true }); var rest = expand(item.items); var newMenus = deepMerge(rest.menus, wrap$1(item.title, rest.items)); var newExpansions = deepMerge(rest.expansions, wrap$1(item.title, item.title)); return { item: newItem, menus: newMenus, expansions: newExpansions }; }; var getFromItem = function (item) { return hasNonNullableKey(item, 'items') ? getFromExpandingItem(item) : { item: item, menus: {}, expansions: {} }; }; var expand = function (items) { return foldr(items, function (acc, item) { var newData = getFromItem(item); return { menus: deepMerge(acc.menus, newData.menus), items: [newData.item].concat(acc.items), expansions: deepMerge(acc.expansions, newData.expansions) }; }, { menus: {}, expansions: {}, items: [] }); }; var register$1 = function (editor) { var isSelectedFor = function (format) { return function () { return editor.formatter.match(format); }; }; var getPreview = function (format) { return function () { return editor.formatter.getCssText(format); }; }; var enrichSupported = function (item) { return deepMerge(item, { isSelected: isSelectedFor(item.format), getPreview: getPreview(item.format) }); }; var enrichMenu = function (item) { return deepMerge(item, { isSelected: never, getPreview: constant('') }); }; var enrichCustom = function (item) { var formatName = generate$1(item.title); var newItem = deepMerge(item, { format: formatName, isSelected: isSelectedFor(formatName), getPreview: getPreview(formatName) }); editor.formatter.register(formatName, newItem); return newItem; }; var doEnrich = function (items) { return map(items, function (item) { if (hasNonNullableKey(item, 'items')) { var newItems = doEnrich(item.items); return deepMerge(enrichMenu(item), { items: newItems }); } else if (hasNonNullableKey(item, 'format')) { return enrichSupported(item); } else { return enrichCustom(item); } }); }; return doEnrich(getStyleFormats(editor)); }; var prune = function (editor, formats) { var doPrune = function (items) { return bind(items, function (item) { if (item.items !== undefined) { var newItems = doPrune(item.items); return newItems.length > 0 ? [item] : []; } else { var keep = hasNonNullableKey(item, 'format') ? editor.formatter.canApply(item.format) : true; return keep ? [item] : []; } }); }; var prunedItems = doPrune(formats); return expand(prunedItems); }; var ui = function (editor, formats, onDone) { var pruned = prune(editor, formats); return sketch$8({ formats: pruned, handle: function (item, value) { editor.undoManager.transact(function () { if (Toggling.isOn(item)) { editor.formatter.remove(value); } else { editor.formatter.apply(value); } }); onDone(); } }); }; var extract$1 = function (rawToolbar) { var toolbar = rawToolbar.replace(/\|/g, ' ').trim(); return toolbar.length > 0 ? toolbar.split(/\s+/) : []; }; var identifyFromArray = function (toolbar) { return bind(toolbar, function (item) { return isArray(item) ? identifyFromArray(item) : extract$1(item); }); }; var identify = function (editor) { var toolbar = getToolbar(editor); return isArray(toolbar) ? identifyFromArray(toolbar) : extract$1(toolbar); }; var setup = function (realm, editor) { var commandSketch = function (name) { return function () { return forToolbarCommand(editor, name); }; }; var stateCommandSketch = function (name) { return function () { return forToolbarStateCommand(editor, name); }; }; var actionSketch = function (name, query, action) { return function () { return forToolbarStateAction(editor, name, query, action); }; }; var undo = commandSketch('undo'); var redo = commandSketch('redo'); var bold = stateCommandSketch('bold'); var italic = stateCommandSketch('italic'); var underline = stateCommandSketch('underline'); var removeformat = commandSketch('removeformat'); var link = function () { return sketch$7(realm, editor); }; var unlink = actionSketch('unlink', 'link', function () { editor.execCommand('unlink', null, false); }); var image = function () { return sketch$4(editor); }; var bullist = actionSketch('unordered-list', 'ul', function () { editor.execCommand('InsertUnorderedList', null, false); }); var numlist = actionSketch('ordered-list', 'ol', function () { editor.execCommand('InsertOrderedList', null, false); }); var fontsizeselect = function () { return sketch$3(realm, editor); }; var forecolor = function () { return sketch$1(realm, editor); }; var styleFormats = register$1(editor); var styleFormatsMenu = function () { return ui(editor, styleFormats, function () { editor.fire('scrollIntoView'); }); }; var styleselect = function () { return forToolbar('style-formats', function (button) { editor.fire('toReading'); realm.dropup.appear(styleFormatsMenu, Toggling.on, button); }, derive$1([ Toggling.config({ toggleClass: resolve('toolbar-button-selected'), toggleOnExecute: false, aria: { mode: 'pressed' } }), Receiving.config({ channels: wrapAll$1([ receive$1(orientationChanged, Toggling.off), receive$1(dropupDismissed, Toggling.off) ]) }) ]), editor); }; var feature = function (prereq, sketch) { return { isSupported: function () { var buttons = editor.ui.registry.getAll().buttons; return prereq.forall(function (p) { return hasNonNullableKey(buttons, p); }); }, sketch: sketch }; }; return { undo: feature(Optional.none(), undo), redo: feature(Optional.none(), redo), bold: feature(Optional.none(), bold), italic: feature(Optional.none(), italic), underline: feature(Optional.none(), underline), removeformat: feature(Optional.none(), removeformat), link: feature(Optional.none(), link), unlink: feature(Optional.none(), unlink), image: feature(Optional.none(), image), bullist: feature(Optional.some('bullist'), bullist), numlist: feature(Optional.some('numlist'), numlist), fontsizeselect: feature(Optional.none(), fontsizeselect), forecolor: feature(Optional.none(), forecolor), styleselect: feature(Optional.none(), styleselect) }; }; var detect$4 = function (editor, features) { var itemNames = identify(editor); var present = {}; return bind(itemNames, function (iName) { var r = !hasNonNullableKey(present, iName) && hasNonNullableKey(features, iName) && features[iName].isSupported() ? [features[iName].sketch()] : []; present[iName] = true; return r; }); }; 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 = 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(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 = 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 filter$2 = always; var bind$3 = function (element, event, handler) { return bind$2(element, event, filter$2, handler); }; var capture$1 = function (element, event, handler) { return capture(element, event, filter$2, handler); }; var global$4 = tinymce.util.Tools.resolve('tinymce.util.Delay'); var INTERVAL = 50; var INSURANCE = 1000 / INTERVAL; var get$c = function (outerWindow) { var isPortrait = outerWindow.matchMedia('(orientation: portrait)').matches; return { isPortrait: constant(isPortrait) }; }; var getActualWidth = function (outerWindow) { var isIos = detect$3().os.isiOS(); var isPortrait = get$c(outerWindow).isPortrait(); return isIos && !isPortrait ? outerWindow.screen.height : outerWindow.screen.width; }; var onChange = function (outerWindow, listeners) { var win = SugarElement.fromDom(outerWindow); var poller = null; var change = function () { global$4.clearInterval(poller); var orientation = get$c(outerWindow); listeners.onChange(orientation); onAdjustment(function () { listeners.onReady(orientation); }); }; var orientationHandle = bind$3(win, 'orientationchange', change); var onAdjustment = function (f) { global$4.clearInterval(poller); var flag = outerWindow.innerHeight; var insurance = 0; poller = global$4.setInterval(function () { if (flag !== outerWindow.innerHeight) { global$4.clearInterval(poller); f(Optional.some(outerWindow.innerHeight)); } else if (insurance > INSURANCE) { global$4.clearInterval(poller); f(Optional.none()); } insurance++; }, INTERVAL); }; var destroy = function () { orientationHandle.unbind(); }; return { onAdjustment: onAdjustment, destroy: destroy }; }; 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 = 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 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(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; } }); }; var ltr = adt$4.ltr; var rtl = adt$4.rtl; var create$3 = function (start, soffset, finish, foffset) { return { start: start, soffset: soffset, finish: finish, foffset: foffset }; }; var SimRange = { create: create$3 }; 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$3 = NodeValue(isText, 'text'); var getOption = function (element) { return api$3.getOption(element); }; var getEnd = function (element) { return name(element) === 'img' ? 1 : getOption(element).fold(function () { return children(element).length; }, function (v) { return v.length; }); }; var adt$5 = Adt.generate([ { before: ['element'] }, { on: [ 'element', 'offset' ] }, { after: ['element'] } ]); var cata = function (subject, onBefore, onOn, onAfter) { return subject.fold(onBefore, onOn, onAfter); }; var getStart = function (situ) { return situ.fold(identity, identity, identity); }; var before$1 = adt$5.before; var on$1 = adt$5.on; var after$1 = adt$5.after; var Situ = { before: before$1, on: on$1, after: after$1, cata: cata, getStart: getStart }; var adt$6 = Adt.generate([ { domRange: ['rng'] }, { relative: [ 'startSitu', 'finishSitu' ] }, { exact: [ 'start', 'soffset', 'finish', 'foffset' ] } ]); var exactFromRange = function (simRange) { return adt$6.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset); }; var getStart$1 = 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$6.domRange; var relative = adt$6.relative; var exact = adt$6.exact; var getWin = function (selection) { var start = getStart$1(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 beforeSpecial = function (element, offset) { var name$1 = name(element); if ('input' === name$1) { return Situ.after(element); } else if (!contains([ 'br', 'img' ], name$1)) { return Situ.on(element, offset); } else { return offset === 0 ? Situ.before(element) : Situ.after(element); } }; var preprocessExact = function (start, soffset, finish, foffset) { var startSitu = beforeSpecial(start, soffset); var finishSitu = beforeSpecial(finish, foffset); return SimSelection.relative(startSitu, finishSitu); }; var makeRange = function (start, soffset, finish, foffset) { var doc = owner(start); var rng = doc.dom.createRange(); rng.setStart(start.dom, soffset); rng.setEnd(finish.dom, foffset); return rng; }; var after$2 = 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 doSetNativeRange = function (win, rng) { getNativeSelection(win).each(function (selection) { selection.removeAllRanges(); selection.addRange(rng); }); }; var doSetRange = function (win, start, soffset, finish, foffset) { var rng = exactToNative(win, start, soffset, finish, foffset); doSetNativeRange(win, rng); }; var setLegacyRtlRange = function (win, selection, start, soffset, finish, foffset) { selection.collapse(start.dom, soffset); selection.extend(finish.dom, foffset); }; var setRangeFromRelative = function (win, relative) { return diagnose(win, relative).match({ ltr: function (start, soffset, finish, foffset) { doSetRange(win, start, soffset, finish, foffset); }, rtl: function (start, soffset, finish, foffset) { getNativeSelection(win).each(function (selection) { if (selection.setBaseAndExtent) { selection.setBaseAndExtent(start.dom, soffset, finish.dom, foffset); } else if (selection.extend) { try { setLegacyRtlRange(win, selection, start, soffset, finish, foffset); } catch (e) { doSetRange(win, finish, foffset, start, soffset); } } else { doSetRange(win, finish, foffset, start, soffset); } }); } }); }; var setExact = function (win, start, soffset, finish, foffset) { var relative = preprocessExact(start, soffset, finish, foffset); setRangeFromRelative(win, relative); }; 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$2(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 get$d = function (win) { return getExact(win).map(function (range) { return SimSelection.exact(range.start, range.soffset, range.finish, range.foffset); }); }; var getFirstRect$1 = function (win, selection) { var rng = asLtrRange(win, selection); return getFirstRect(rng); }; var clear$1 = function (win) { getNativeSelection(win).each(function (selection) { return selection.removeAllRanges(); }); }; var getBodyFromFrame = function (frame) { return Optional.some(SugarElement.fromDom(frame.dom.contentWindow.document.body)); }; var getDocFromFrame = function (frame) { return Optional.some(SugarElement.fromDom(frame.dom.contentWindow.document)); }; var getWinFromFrame = function (frame) { return Optional.from(frame.dom.contentWindow); }; var getSelectionFromFrame = function (frame) { var optWin = getWinFromFrame(frame); return optWin.bind(getExact); }; var getFrame = function (editor) { return editor.getFrame(); }; var getOrDerive = function (name, f) { return function (editor) { var g = editor[name].getOrThunk(function () { var frame = getFrame(editor); return function () { return f(frame); }; }); return g(); }; }; var getOrListen = function (editor, doc, name, type) { return editor[name].getOrThunk(function () { return function (handler) { return bind$3(doc, type, handler); }; }); }; var getActiveApi = function (editor) { var frame = getFrame(editor); var tryFallbackBox = function (win) { var isCollapsed = function (sel) { return eq(sel.start, sel.finish) && sel.soffset === sel.foffset; }; var toStartRect = function (sel) { var rect = sel.start.dom.getBoundingClientRect(); return rect.width > 0 || rect.height > 0 ? Optional.some(rect) : Optional.none(); }; return getExact(win).filter(isCollapsed).bind(toStartRect); }; return getBodyFromFrame(frame).bind(function (body) { return getDocFromFrame(frame).bind(function (doc) { return getWinFromFrame(frame).map(function (win) { var html = SugarElement.fromDom(doc.dom.documentElement); var getCursorBox = editor.getCursorBox.getOrThunk(function () { return function () { return get$d(win).bind(function (sel) { return getFirstRect$1(win, sel).orThunk(function () { return tryFallbackBox(win); }); }); }; }); var setSelection = editor.setSelection.getOrThunk(function () { return function (start, soffset, finish, foffset) { setExact(win, start, soffset, finish, foffset); }; }); var clearSelection = editor.clearSelection.getOrThunk(function () { return function () { clear$1(win); }; }); return { body: body, doc: doc, win: win, html: html, getSelection: curry(getSelectionFromFrame, frame), setSelection: setSelection, clearSelection: clearSelection, frame: frame, onKeyup: getOrListen(editor, doc, 'onKeyup', 'keyup'), onNodeChanged: getOrListen(editor, doc, 'onNodeChanged', 'SelectionChange'), onDomChanged: editor.onDomChanged, onScrollToCursor: editor.onScrollToCursor, onScrollToElement: editor.onScrollToElement, onToReading: editor.onToReading, onToEditing: editor.onToEditing, onToolbarScrollStart: editor.onToolbarScrollStart, onTouchContent: editor.onTouchContent, onTapContent: editor.onTapContent, onTouchToolstrip: editor.onTouchToolstrip, getCursorBox: getCursorBox }; }); }); }); }; var getWin$1 = getOrDerive('getWin', getWinFromFrame); var tag = function () { var head = first('head').getOrDie(); var nu = function () { var meta = SugarElement.fromTag('meta'); set(meta, 'name', 'viewport'); append(head, meta); return meta; }; var element = first('meta[name="viewport"]').getOrThunk(nu); var backup = get$2(element, 'content'); var maximize = function () { set(element, 'content', 'width=device-width, initial-scale=1.0, user-scalable=no, maximum-scale=1.0'); }; var restore = function () { if (backup !== undefined && backup !== null && backup.length > 0) { set(element, 'content', backup); } else { set(element, 'content', 'user-scalable=yes'); } }; return { maximize: maximize, restore: restore }; }; var attr = 'data-ephox-mobile-fullscreen-style'; var siblingStyles = 'display:none!important;'; var ancestorPosition = 'position:absolute!important;'; var ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;'; var bgFallback = 'background-color:rgb(255,255,255)!important;'; var isAndroid = detect$3().os.isAndroid(); var matchColor = function (editorBody) { var color = get$5(editorBody, 'background-color'); return color !== undefined && color !== '' ? 'background-color:' + color + '!important' : bgFallback; }; var clobberStyles = function (container, editorBody) { var gatherSiblings = function (element) { return siblings$2(element, '*'); }; var clobber = function (clobberStyle) { return function (element) { var styles = get$2(element, 'style'); var backup = styles === undefined ? 'no-styles' : styles.trim(); if (backup === clobberStyle) { return; } else { set(element, attr, backup); set(element, 'style', clobberStyle); } }; }; var ancestors = ancestors$1(container, '*'); var siblings = bind(ancestors, gatherSiblings); var bgColor = matchColor(editorBody); each(siblings, clobber(siblingStyles)); each(ancestors, clobber(ancestorPosition + ancestorStyles + bgColor)); var containerStyles = isAndroid === true ? '' : ancestorPosition; clobber(containerStyles + ancestorStyles + bgColor)(container); }; var restoreStyles = function () { var clobberedEls = all$2('[' + attr + ']'); each(clobberedEls, function (element) { var restore = get$2(element, attr); if (restore !== 'no-styles') { set(element, 'style', restore); } else { remove$1(element, 'style'); } remove$1(element, attr); }); }; var DelayedFunction = function (fun, delay) { var ref = null; var schedule = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } ref = setTimeout(function () { fun.apply(null, args); ref = null; }, delay); }; var cancel = function () { if (ref !== null) { clearTimeout(ref); ref = null; } }; return { cancel: cancel, schedule: schedule }; }; var SIGNIFICANT_MOVE = 5; var LONGPRESS_DELAY = 400; var getTouch = function (event) { var raw = event.raw; if (raw.touches === undefined || raw.touches.length !== 1) { return Optional.none(); } return Optional.some(raw.touches[0]); }; var isFarEnough = function (touch, data) { var distX = Math.abs(touch.clientX - data.x); var distY = Math.abs(touch.clientY - data.y); return distX > SIGNIFICANT_MOVE || distY > SIGNIFICANT_MOVE; }; var monitor = function (settings) { var startData = Cell(Optional.none()); var longpressFired = Cell(false); var longpress$1 = DelayedFunction(function (event) { settings.triggerEvent(longpress(), event); longpressFired.set(true); }, LONGPRESS_DELAY); var handleTouchstart = function (event) { getTouch(event).each(function (touch) { longpress$1.cancel(); var data = { x: touch.clientX, y: touch.clientY, target: event.target }; longpress$1.schedule(event); longpressFired.set(false); startData.set(Optional.some(data)); }); return Optional.none(); }; var handleTouchmove = function (event) { longpress$1.cancel(); getTouch(event).each(function (touch) { startData.get().each(function (data) { if (isFarEnough(touch, data)) { startData.set(Optional.none()); } }); }); return Optional.none(); }; var handleTouchend = function (event) { longpress$1.cancel(); var isSame = function (data) { return eq(data.target, event.target); }; return startData.get().filter(isSame).map(function (_data) { if (longpressFired.get()) { event.prevent(); return false; } else { return settings.triggerEvent(tap(), event); } }); }; var handlers = wrapAll$1([ { key: touchstart(), value: handleTouchstart }, { key: touchmove(), value: handleTouchmove }, { key: touchend(), value: handleTouchend } ]); var fireIfReady = function (event, type) { return get$1(handlers, type).bind(function (handler) { return handler(event); }); }; return { fireIfReady: fireIfReady }; }; var monitor$1 = function (editorApi) { var tapEvent = monitor({ triggerEvent: function (type, evt) { editorApi.onTapContent(evt); } }); var onTouchend = function () { return bind$3(editorApi.body, 'touchend', function (evt) { tapEvent.fireIfReady(evt, 'touchend'); }); }; var onTouchmove = function () { return bind$3(editorApi.body, 'touchmove', function (evt) { tapEvent.fireIfReady(evt, 'touchmove'); }); }; var fireTouchstart = function (evt) { tapEvent.fireIfReady(evt, 'touchstart'); }; return { fireTouchstart: fireTouchstart, onTouchend: onTouchend, onTouchmove: onTouchmove }; }; var isAndroid6 = detect$3().os.version.major >= 6; var initEvents = function (editorApi, toolstrip, alloy) { var tapping = monitor$1(editorApi); var outerDoc = owner(toolstrip); var isRanged = function (sel) { return !eq(sel.start, sel.finish) || sel.soffset !== sel.foffset; }; var hasRangeInUi = function () { return active(outerDoc).filter(function (input) { return name(input) === 'input'; }).exists(function (input) { return input.dom.selectionStart !== input.dom.selectionEnd; }); }; var updateMargin = function () { var rangeInContent = editorApi.doc.dom.hasFocus() && editorApi.getSelection().exists(isRanged); alloy.getByDom(toolstrip).each((rangeInContent || hasRangeInUi()) === true ? Toggling.on : Toggling.off); }; var listeners = [ bind$3(editorApi.body, 'touchstart', function (evt) { editorApi.onTouchContent(); tapping.fireTouchstart(evt); }), tapping.onTouchmove(), tapping.onTouchend(), bind$3(toolstrip, 'touchstart', function (_evt) { editorApi.onTouchToolstrip(); }), editorApi.onToReading(function () { blur(editorApi.body); }), editorApi.onToEditing(noop), editorApi.onScrollToCursor(function (tinyEvent) { tinyEvent.preventDefault(); editorApi.getCursorBox().each(function (bounds) { var cWin = editorApi.win; var isOutside = bounds.top > cWin.innerHeight || bounds.bottom > cWin.innerHeight; var cScrollBy = isOutside ? bounds.bottom - cWin.innerHeight + 50 : 0; if (cScrollBy !== 0) { cWin.scrollTo(cWin.pageXOffset, cWin.pageYOffset + cScrollBy); } }); }) ].concat(isAndroid6 === true ? [] : [ bind$3(SugarElement.fromDom(editorApi.win), 'blur', function () { alloy.getByDom(toolstrip).each(Toggling.off); }), bind$3(outerDoc, 'select', updateMargin), bind$3(editorApi.doc, 'selectionchange', updateMargin) ]); var destroy = function () { each(listeners, function (l) { l.unbind(); }); }; return { destroy: destroy }; }; var safeParse = function (element, attribute) { var parsed = parseInt(get$2(element, attribute), 10); return isNaN(parsed) ? 0 : parsed; }; var COLLAPSED_WIDTH = 2; var collapsedRect = function (rect) { return __assign(__assign({}, rect), { width: COLLAPSED_WIDTH }); }; var toRect$1 = function (rawRect) { return { left: rawRect.left, top: rawRect.top, right: rawRect.right, bottom: rawRect.bottom, width: rawRect.width, height: rawRect.height }; }; var getRectsFromRange = function (range) { if (!range.collapsed) { return map(range.getClientRects(), toRect$1); } else { var start_1 = SugarElement.fromDom(range.startContainer); return parent(start_1).bind(function (parent) { var selection = SimSelection.exact(start_1, range.startOffset, parent, getEnd(parent)); var optRect = getFirstRect$1(range.startContainer.ownerDocument.defaultView, selection); return optRect.map(collapsedRect).map(pure); }).getOr([]); } }; var getRectangles = function (cWin) { var sel = cWin.getSelection(); return sel !== undefined && sel.rangeCount > 0 ? getRectsFromRange(sel.getRangeAt(0)) : []; }; var autocompleteHack = function () { return function (f) { global$4.setTimeout(function () { f(); }, 0); }; }; var resume = function (cWin) { cWin.focus(); var iBody = SugarElement.fromDom(cWin.document.body); var inInput = active().exists(function (elem) { return contains([ 'input', 'textarea' ], name(elem)); }); var transaction = inInput ? autocompleteHack() : apply; transaction(function () { active().each(blur); focus$1(iBody); }); }; var EXTRA_SPACING = 50; var data = 'data-' + resolve('last-outer-height'); var setLastHeight = function (cBody, value) { set(cBody, data, value); }; var getLastHeight = function (cBody) { return safeParse(cBody, data); }; var getBoundsFrom = function (rect) { return { top: rect.top, bottom: rect.top + rect.height }; }; var getBounds$1 = function (cWin) { var rects = getRectangles(cWin); return rects.length > 0 ? Optional.some(rects[0]).map(getBoundsFrom) : Optional.none(); }; var findDelta = function (outerWindow, cBody) { var last = getLastHeight(cBody); var current = outerWindow.innerHeight; return last > current ? Optional.some(last - current) : Optional.none(); }; var calculate = function (cWin, bounds, delta) { var isOutside = bounds.top > cWin.innerHeight || bounds.bottom > cWin.innerHeight; return isOutside ? Math.min(delta, bounds.bottom - cWin.innerHeight + EXTRA_SPACING) : 0; }; var setup$1 = function (outerWindow, cWin) { var cBody = SugarElement.fromDom(cWin.document.body); var toEditing = function () { resume(cWin); }; var onResize = bind$3(SugarElement.fromDom(outerWindow), 'resize', function () { findDelta(outerWindow, cBody).each(function (delta) { getBounds$1(cWin).each(function (bounds) { var cScrollBy = calculate(cWin, bounds, delta); if (cScrollBy !== 0) { cWin.scrollTo(cWin.pageXOffset, cWin.pageYOffset + cScrollBy); } }); }); setLastHeight(cBody, outerWindow.innerHeight); }); setLastHeight(cBody, outerWindow.innerHeight); var destroy = function () { onResize.unbind(); }; return { toEditing: toEditing, destroy: destroy }; }; var create$4 = function (platform, mask) { var meta = tag(); var androidApi = api$2(); var androidEvents = api$2(); var enter = function () { mask.hide(); add$2(platform.container, resolve('fullscreen-maximized')); add$2(platform.container, resolve('android-maximized')); meta.maximize(); add$2(platform.body, resolve('android-scroll-reload')); androidApi.set(setup$1(platform.win, getWin$1(platform.editor).getOrDie('no'))); getActiveApi(platform.editor).each(function (editorApi) { clobberStyles(platform.container, editorApi.body); androidEvents.set(initEvents(editorApi, platform.toolstrip, platform.alloy)); }); }; var exit = function () { meta.restore(); mask.show(); remove$4(platform.container, resolve('fullscreen-maximized')); remove$4(platform.container, resolve('android-maximized')); restoreStyles(); remove$4(platform.body, resolve('android-scroll-reload')); androidEvents.clear(); androidApi.clear(); }; return { enter: enter, exit: exit }; }; var first$1 = function (fn, rate) { var timer = null; var cancel = function () { if (timer !== null) { clearTimeout(timer); timer = null; } }; var throttle = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (timer === null) { timer = setTimeout(function () { fn.apply(null, args); timer = null; }, rate); } }; return { cancel: cancel, throttle: throttle }; }; var last = function (fn, rate) { var timer = null; var cancel = function () { if (timer !== null) { clearTimeout(timer); timer = null; } }; var throttle = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (timer !== null) { clearTimeout(timer); } timer = setTimeout(function () { fn.apply(null, args); timer = null; }, rate); }; return { cancel: cancel, throttle: throttle }; }; var sketch$9 = function (onView, _translate) { var memIcon = record(Container.sketch({ dom: dom$1(''), containerBehaviours: derive$1([Toggling.config({ toggleClass: resolve('mask-tap-icon-selected'), toggleOnExecute: false })]) })); var onViewThrottle = first$1(onView, 200); return Container.sketch({ dom: dom$1('
'), components: [Container.sketch({ dom: dom$1('
'), components: [Button.sketch({ dom: dom$1('
'), components: [memIcon.asSpec()], action: function (_button) { onViewThrottle.throttle(); }, buttonBehaviours: derive$1([Toggling.config({ toggleClass: resolve('mask-tap-icon-selected') })]) })] })] }); }; var unbindNoop = constant({ unbind: noop }); var MobileSchema = objOf([ strictObjOf('editor', [ strict$1('getFrame'), option('getBody'), option('getDoc'), option('getWin'), option('getSelection'), option('setSelection'), option('clearSelection'), option('cursorSaver'), option('onKeyup'), option('onNodeChanged'), option('getCursorBox'), strict$1('onDomChanged'), defaulted$1('onTouchContent', noop), defaulted$1('onTapContent', noop), defaulted$1('onTouchToolstrip', noop), defaulted$1('onScrollToCursor', unbindNoop), defaulted$1('onScrollToElement', unbindNoop), defaulted$1('onToEditing', unbindNoop), defaulted$1('onToReading', unbindNoop), defaulted$1('onToolbarScrollStart', identity) ]), strict$1('socket'), strict$1('toolstrip'), strict$1('dropup'), strict$1('toolbar'), strict$1('container'), strict$1('alloy'), state$1('win', function (spec) { return owner(spec.socket).dom.defaultView; }), state$1('body', function (spec) { return SugarElement.fromDom(spec.socket.dom.ownerDocument.body); }), defaulted$1('translate', identity), defaulted$1('setReadOnly', noop), defaulted$1('readOnlyOnInit', always) ]); var produce = function (raw) { var mobile = asRawOrDie('Getting AndroidWebapp schema', MobileSchema, raw); set$3(mobile.toolstrip, 'width', '100%'); var onTap = function () { mobile.setReadOnly(mobile.readOnlyOnInit()); mode.enter(); }; var mask = build$1(sketch$9(onTap, mobile.translate)); mobile.alloy.add(mask); var maskApi = { show: function () { mobile.alloy.add(mask); }, hide: function () { mobile.alloy.remove(mask); } }; append(mobile.container, mask.element); var mode = create$4(mobile, maskApi); return { setReadOnly: mobile.setReadOnly, refreshStructure: noop, enter: mode.enter, exit: mode.exit, destroy: noop }; }; var schema$e = constant([ strict$1('dom'), defaulted$1('shell', true), field$1('toolbarBehaviours', [Replacing]) ]); var enhanceGroups = function () { return { behaviours: derive$1([Replacing.config({})]) }; }; var parts$2 = constant([optional({ name: 'groups', overrides: enhanceGroups })]); var factory$4 = function (detail, components, _spec, _externals) { var setGroups = function (toolbar, groups) { getGroupContainer(toolbar).fold(function () { console.error('Toolbar was defined to not be a shell, but no groups container was specified in components'); throw new Error('Toolbar was defined to not be a shell, but no groups container was specified in components'); }, function (container) { Replacing.set(container, groups); }); }; var getGroupContainer = function (component) { return detail.shell ? Optional.some(component) : getPart(component, detail, 'groups'); }; var extra = detail.shell ? { behaviours: [Replacing.config({})], components: [] } : { behaviours: [], components: components }; return { uid: detail.uid, dom: detail.dom, components: extra.components, behaviours: augment(detail.toolbarBehaviours, extra.behaviours), apis: { setGroups: setGroups }, domModification: { attributes: { role: 'group' } } }; }; var Toolbar = composite$1({ name: 'Toolbar', configFields: schema$e(), partFields: parts$2(), factory: factory$4, apis: { setGroups: function (apis, toolbar, groups) { apis.setGroups(toolbar, groups); } } }); var schema$f = constant([ strict$1('items'), markers(['itemSelector']), field$1('tgroupBehaviours', [Keying]) ]); var parts$3 = constant([group({ name: 'items', unit: 'item' })]); var factory$5 = function (detail, components, _spec, _externals) { return { uid: detail.uid, dom: detail.dom, components: components, behaviours: augment(detail.tgroupBehaviours, [Keying.config({ mode: 'flow', selector: detail.markers.itemSelector })]), domModification: { attributes: { role: 'toolbar' } } }; }; var ToolbarGroup = composite$1({ name: 'ToolbarGroup', configFields: schema$f(), partFields: parts$3(), factory: factory$5 }); var dataHorizontal = 'data-' + resolve('horizontal-scroll'); var canScrollVertically = function (container) { container.dom.scrollTop = 1; var result = container.dom.scrollTop !== 0; container.dom.scrollTop = 0; return result; }; var canScrollHorizontally = function (container) { container.dom.scrollLeft = 1; var result = container.dom.scrollLeft !== 0; container.dom.scrollLeft = 0; return result; }; var hasVerticalScroll = function (container) { return container.dom.scrollTop > 0 || canScrollVertically(container); }; var hasHorizontalScroll = function (container) { return container.dom.scrollLeft > 0 || canScrollHorizontally(container); }; var markAsHorizontal = function (container) { set(container, dataHorizontal, 'true'); }; var hasScroll = function (container) { return get$2(container, dataHorizontal) === 'true' ? hasHorizontalScroll(container) : hasVerticalScroll(container); }; var exclusive = function (scope, selector) { return bind$3(scope, 'touchmove', function (event) { closest$2(event.target, selector).filter(hasScroll).fold(function () { event.prevent(); }, noop); }); }; var ScrollingToolbar = function () { var makeGroup = function (gSpec) { var scrollClass = gSpec.scrollable === true ? '${prefix}-toolbar-scrollable-group' : ''; return { dom: dom$1('
'), tgroupBehaviours: derive$1([config('adhoc-scrollable-toolbar', gSpec.scrollable === true ? [runOnInit(function (component, _simulatedEvent) { set$3(component.element, 'overflow-x', 'auto'); markAsHorizontal(component.element); register(component.element); })] : [])]), components: [Container.sketch({ components: [ToolbarGroup.parts.items({})] })], markers: { itemSelector: '.' + resolve('toolbar-group-item') }, items: gSpec.items }; }; var toolbar = build$1(Toolbar.sketch({ dom: dom$1('
'), components: [Toolbar.parts.groups({})], toolbarBehaviours: derive$1([ Toggling.config({ toggleClass: resolve('context-toolbar'), toggleOnExecute: false, aria: { mode: 'none' } }), Keying.config({ mode: 'cyclic' }) ]), shell: true })); var wrapper = build$1(Container.sketch({ dom: { classes: [resolve('toolstrip')] }, components: [premade$1(toolbar)], containerBehaviours: derive$1([Toggling.config({ toggleClass: resolve('android-selection-context-toolbar'), toggleOnExecute: false })]) })); var resetGroups = function () { Toolbar.setGroups(toolbar, initGroups.get()); Toggling.off(toolbar); }; var initGroups = Cell([]); var setGroups = function (gs) { initGroups.set(gs); resetGroups(); }; var createGroups = function (gs) { return map(gs, compose(ToolbarGroup.sketch, makeGroup)); }; var refresh = function () { }; var setContextToolbar = function (gs) { Toggling.on(toolbar); Toolbar.setGroups(toolbar, gs); }; var restoreToolbar = function () { if (Toggling.isOn(toolbar)) { resetGroups(); } }; var focus = function () { Keying.focusIn(toolbar); }; return { wrapper: wrapper, toolbar: toolbar, createGroups: createGroups, setGroups: setGroups, setContextToolbar: setContextToolbar, restoreToolbar: restoreToolbar, refresh: refresh, focus: focus }; }; var makeEditSwitch = function (webapp) { return build$1(Button.sketch({ dom: dom$1('
'), action: function () { webapp.run(function (w) { w.setReadOnly(false); }); } })); }; var makeSocket = function () { return build$1(Container.sketch({ dom: dom$1('
'), components: [], containerBehaviours: derive$1([Replacing.config({})]) })); }; var showEdit = function (socket, switchToEdit) { Replacing.append(socket, premade$1(switchToEdit)); }; var hideEdit = function (socket, switchToEdit) { Replacing.remove(socket, switchToEdit); }; var updateMode = function (socket, switchToEdit, readOnly, root) { var swap = readOnly === true ? Swapping.toAlpha : Swapping.toOmega; swap(root); var f = readOnly ? showEdit : hideEdit; f(socket, switchToEdit); }; var getAnimationRoot = function (component, slideConfig) { return slideConfig.getAnimationRoot.fold(function () { return component.element; }, function (get) { return get(component); }); }; var getDimensionProperty = function (slideConfig) { return slideConfig.dimension.property; }; var getDimension = function (slideConfig, elem) { return slideConfig.dimension.getDimension(elem); }; var disableTransitions = function (component, slideConfig) { var root = getAnimationRoot(component, slideConfig); remove$6(root, [ slideConfig.shrinkingClass, slideConfig.growingClass ]); }; var setShrunk = function (component, slideConfig) { remove$4(component.element, slideConfig.openClass); add$2(component.element, slideConfig.closedClass); set$3(component.element, getDimensionProperty(slideConfig), '0px'); reflow(component.element); }; var setGrown = function (component, slideConfig) { remove$4(component.element, slideConfig.closedClass); add$2(component.element, slideConfig.openClass); remove$5(component.element, getDimensionProperty(slideConfig)); }; var doImmediateShrink = function (component, slideConfig, slideState, _calculatedSize) { slideState.setCollapsed(); set$3(component.element, getDimensionProperty(slideConfig), getDimension(slideConfig, component.element)); reflow(component.element); disableTransitions(component, slideConfig); setShrunk(component, slideConfig); slideConfig.onStartShrink(component); slideConfig.onShrunk(component); }; var doStartShrink = function (component, slideConfig, slideState, calculatedSize) { var size = calculatedSize.getOrThunk(function () { return getDimension(slideConfig, component.element); }); slideState.setCollapsed(); set$3(component.element, getDimensionProperty(slideConfig), size); reflow(component.element); var root = getAnimationRoot(component, slideConfig); remove$4(root, slideConfig.growingClass); add$2(root, slideConfig.shrinkingClass); setShrunk(component, slideConfig); slideConfig.onStartShrink(component); }; var doStartSmartShrink = function (component, slideConfig, slideState) { var size = getDimension(slideConfig, component.element); var shrinker = size === '0px' ? doImmediateShrink : doStartShrink; shrinker(component, slideConfig, slideState, Optional.some(size)); }; var doStartGrow = function (component, slideConfig, slideState) { var root = getAnimationRoot(component, slideConfig); var wasShrinking = has$2(root, slideConfig.shrinkingClass); var beforeSize = getDimension(slideConfig, component.element); setGrown(component, slideConfig); var fullSize = getDimension(slideConfig, component.element); var startPartialGrow = function () { set$3(component.element, getDimensionProperty(slideConfig), beforeSize); reflow(component.element); }; var startCompleteGrow = function () { setShrunk(component, slideConfig); }; var setStartSize = wasShrinking ? startPartialGrow : startCompleteGrow; setStartSize(); remove$4(root, slideConfig.shrinkingClass); add$2(root, slideConfig.growingClass); setGrown(component, slideConfig); set$3(component.element, getDimensionProperty(slideConfig), fullSize); slideState.setExpanded(); slideConfig.onStartGrow(component); }; var refresh = function (component, slideConfig, slideState) { if (slideState.isExpanded()) { remove$5(component.element, getDimensionProperty(slideConfig)); var fullSize = getDimension(slideConfig, component.element); set$3(component.element, getDimensionProperty(slideConfig), fullSize); } }; var grow = function (component, slideConfig, slideState) { if (!slideState.isExpanded()) { doStartGrow(component, slideConfig, slideState); } }; var shrink = function (component, slideConfig, slideState) { if (slideState.isExpanded()) { doStartSmartShrink(component, slideConfig, slideState); } }; var immediateShrink = function (component, slideConfig, slideState) { if (slideState.isExpanded()) { doImmediateShrink(component, slideConfig, slideState, Optional.none()); } }; var hasGrown = function (component, slideConfig, slideState) { return slideState.isExpanded(); }; var hasShrunk = function (component, slideConfig, slideState) { return slideState.isCollapsed(); }; var isGrowing = function (component, slideConfig, _slideState) { var root = getAnimationRoot(component, slideConfig); return has$2(root, slideConfig.growingClass) === true; }; var isShrinking = function (component, slideConfig, _slideState) { var root = getAnimationRoot(component, slideConfig); return has$2(root, slideConfig.shrinkingClass) === true; }; var isTransitioning = function (component, slideConfig, slideState) { return isGrowing(component, slideConfig) || isShrinking(component, slideConfig); }; var toggleGrow = function (component, slideConfig, slideState) { var f = slideState.isExpanded() ? doStartSmartShrink : doStartGrow; f(component, slideConfig, slideState); }; var SlidingApis = /*#__PURE__*/Object.freeze({ __proto__: null, refresh: refresh, grow: grow, shrink: shrink, immediateShrink: immediateShrink, hasGrown: hasGrown, hasShrunk: hasShrunk, isGrowing: isGrowing, isShrinking: isShrinking, isTransitioning: isTransitioning, toggleGrow: toggleGrow, disableTransitions: disableTransitions }); var exhibit$5 = function (base, slideConfig, _slideState) { var expanded = slideConfig.expanded; return expanded ? nu$5({ classes: [slideConfig.openClass], styles: {} }) : nu$5({ classes: [slideConfig.closedClass], styles: wrap$1(slideConfig.dimension.property, '0px') }); }; var events$a = function (slideConfig, slideState) { return derive([runOnSource(transitionend(), function (component, simulatedEvent) { var raw = simulatedEvent.event.raw; if (raw.propertyName === slideConfig.dimension.property) { disableTransitions(component, slideConfig); if (slideState.isExpanded()) { remove$5(component.element, slideConfig.dimension.property); } var notify = slideState.isExpanded() ? slideConfig.onGrown : slideConfig.onShrunk; notify(component); } })]); }; var ActiveSliding = /*#__PURE__*/Object.freeze({ __proto__: null, exhibit: exhibit$5, events: events$a }); var SlidingSchema = [ strict$1('closedClass'), strict$1('openClass'), strict$1('shrinkingClass'), strict$1('growingClass'), option('getAnimationRoot'), onHandler('onShrunk'), onHandler('onStartShrink'), onHandler('onGrown'), onHandler('onStartGrow'), defaulted$1('expanded', false), strictOf('dimension', choose$1('property', { width: [ output('property', 'width'), output('getDimension', function (elem) { return get$8(elem) + 'px'; }) ], height: [ output('property', 'height'), output('getDimension', function (elem) { return get$6(elem) + 'px'; }) ] })) ]; var init$4 = function (spec) { var state = Cell(spec.expanded); var readState = function () { return 'expanded: ' + state.get(); }; return nu$6({ isExpanded: function () { return state.get() === true; }, isCollapsed: function () { return state.get() === false; }, setCollapsed: curry(state.set, false), setExpanded: curry(state.set, true), readState: readState }); }; var SlidingState = /*#__PURE__*/Object.freeze({ __proto__: null, init: init$4 }); var Sliding = create$1({ fields: SlidingSchema, name: 'sliding', active: ActiveSliding, apis: SlidingApis, state: SlidingState }); var build$2 = function (refresh, scrollIntoView) { var dropup = build$1(Container.sketch({ dom: { tag: 'div', classes: [resolve('dropup')] }, components: [], containerBehaviours: derive$1([ Replacing.config({}), Sliding.config({ closedClass: resolve('dropup-closed'), openClass: resolve('dropup-open'), shrinkingClass: resolve('dropup-shrinking'), growingClass: resolve('dropup-growing'), dimension: { property: 'height' }, onShrunk: function (component) { refresh(); scrollIntoView(); Replacing.set(component, []); }, onGrown: function (_component) { refresh(); scrollIntoView(); } }), orientation(function (_component, _data) { disappear(noop); }) ]) })); var appear = function (menu, update, component) { if (Sliding.hasShrunk(dropup) === true && Sliding.isTransitioning(dropup) === false) { window.requestAnimationFrame(function () { update(component); Replacing.set(dropup, [menu()]); Sliding.grow(dropup); }); } }; var disappear = function (onReadyToShrink) { window.requestAnimationFrame(function () { onReadyToShrink(); Sliding.shrink(dropup); }); }; return { appear: appear, disappear: disappear, component: dropup, element: dropup.element }; }; var closest$3 = function (scope, selector, isRoot) { return closest$2(scope, selector, isRoot).isSome(); }; var isDangerous = function (event) { var keyEv = event.raw; return keyEv.which === BACKSPACE[0] && !contains([ 'input', 'textarea' ], name(event.target)) && !closest$3(event.target, '[contenteditable="true"]'); }; var isFirefox = function () { return detect$3().browser.isFirefox(); }; var settingsSchema = objOfOnly([ strictFunction('triggerEvent'), defaulted$1('stopBackspace', true) ]); var bindFocus = function (container, handler) { if (isFirefox()) { return capture$1(container, 'focus', handler); } else { return bind$3(container, 'focusin', handler); } }; var bindBlur = function (container, handler) { if (isFirefox()) { return capture$1(container, 'blur', handler); } else { return bind$3(container, 'focusout', handler); } }; var setup$2 = function (container, rawSettings) { var settings = asRawOrDie('Getting GUI events settings', settingsSchema, rawSettings); var pointerEvents = [ 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'gesturestart', 'mousedown', 'mouseup', 'mouseover', 'mousemove', 'mouseout', 'click' ]; var tapEvent = monitor(settings); var simpleEvents = map(pointerEvents.concat([ 'selectstart', 'input', 'contextmenu', 'change', 'transitionend', 'drag', 'dragstart', 'dragend', 'dragenter', 'dragleave', 'dragover', 'drop', 'keyup' ]), function (type) { return bind$3(container, type, function (event) { tapEvent.fireIfReady(event, type).each(function (tapStopped) { if (tapStopped) { event.kill(); } }); var stopped = settings.triggerEvent(type, event); if (stopped) { event.kill(); } }); }); var pasteTimeout = Cell(Optional.none()); var onPaste = bind$3(container, 'paste', function (event) { tapEvent.fireIfReady(event, 'paste').each(function (tapStopped) { if (tapStopped) { event.kill(); } }); var stopped = settings.triggerEvent('paste', event); if (stopped) { event.kill(); } pasteTimeout.set(Optional.some(setTimeout(function () { settings.triggerEvent(postPaste(), event); }, 0))); }); var onKeydown = bind$3(container, 'keydown', function (event) { var stopped = settings.triggerEvent('keydown', event); if (stopped) { event.kill(); } else if (settings.stopBackspace === true && isDangerous(event)) { event.prevent(); } }); var onFocusIn = bindFocus(container, function (event) { var stopped = settings.triggerEvent('focusin', event); if (stopped) { event.kill(); } }); var focusoutTimeout = Cell(Optional.none()); var onFocusOut = bindBlur(container, function (event) { var stopped = settings.triggerEvent('focusout', event); if (stopped) { event.kill(); } focusoutTimeout.set(Optional.some(setTimeout(function () { settings.triggerEvent(postBlur(), event); }, 0))); }); var unbind = function () { each(simpleEvents, function (e) { e.unbind(); }); onKeydown.unbind(); onFocusIn.unbind(); onFocusOut.unbind(); onPaste.unbind(); pasteTimeout.get().each(clearTimeout); focusoutTimeout.get().each(clearTimeout); }; return { unbind: unbind }; }; var derive$2 = function (rawEvent, rawTarget) { var source = get$1(rawEvent, 'target').getOr(rawTarget); return Cell(source); }; var fromSource = function (event, source) { var stopper = Cell(false); var cutter = Cell(false); var stop = function () { stopper.set(true); }; var cut = function () { cutter.set(true); }; return { stop: stop, cut: cut, isStopped: stopper.get, isCut: cutter.get, event: event, setSource: source.set, getSource: source.get }; }; var fromExternal = function (event) { var stopper = Cell(false); var stop = function () { stopper.set(true); }; return { stop: stop, cut: noop, isStopped: stopper.get, isCut: never, event: event, setSource: die('Cannot set source of a broadcasted event'), getSource: die('Cannot get source of a broadcasted event') }; }; var adt$7 = Adt.generate([ { stopped: [] }, { resume: ['element'] }, { complete: [] } ]); var doTriggerHandler = function (lookup, eventType, rawEvent, target, source, logger) { var handler = lookup(eventType, target); var simulatedEvent = fromSource(rawEvent, source); return handler.fold(function () { logger.logEventNoHandlers(eventType, target); return adt$7.complete(); }, function (handlerInfo) { var descHandler = handlerInfo.descHandler; var eventHandler = getCurried(descHandler); eventHandler(simulatedEvent); if (simulatedEvent.isStopped()) { logger.logEventStopped(eventType, handlerInfo.element, descHandler.purpose); return adt$7.stopped(); } else if (simulatedEvent.isCut()) { logger.logEventCut(eventType, handlerInfo.element, descHandler.purpose); return adt$7.complete(); } else { return parent(handlerInfo.element).fold(function () { logger.logNoParent(eventType, handlerInfo.element, descHandler.purpose); return adt$7.complete(); }, function (parent) { logger.logEventResponse(eventType, handlerInfo.element, descHandler.purpose); return adt$7.resume(parent); }); } }); }; var doTriggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, source, logger) { return doTriggerHandler(lookup, eventType, rawEvent, rawTarget, source, logger).fold(always, function (parent) { return doTriggerOnUntilStopped(lookup, eventType, rawEvent, parent, source, logger); }, never); }; var triggerHandler = function (lookup, eventType, rawEvent, target, logger) { var source = derive$2(rawEvent, target); return doTriggerHandler(lookup, eventType, rawEvent, target, source, logger); }; var broadcast = function (listeners, rawEvent, _logger) { var simulatedEvent = fromExternal(rawEvent); each(listeners, function (listener) { var descHandler = listener.descHandler; var handler = getCurried(descHandler); handler(simulatedEvent); }); return simulatedEvent.isStopped(); }; var triggerUntilStopped = function (lookup, eventType, rawEvent, logger) { return triggerOnUntilStopped(lookup, eventType, rawEvent, rawEvent.target, logger); }; var triggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, logger) { var source = derive$2(rawEvent, rawTarget); return doTriggerOnUntilStopped(lookup, eventType, rawEvent, rawTarget, source, logger); }; var eventHandler = function (element, descHandler) { return { element: element, descHandler: descHandler }; }; var broadcastHandler = function (id, handler) { return { id: id, descHandler: handler }; }; var EventRegistry = function () { var registry = {}; var registerId = function (extraArgs, id, events) { each$1(events, function (v, k) { var handlers = registry[k] !== undefined ? registry[k] : {}; handlers[id] = curryArgs(v, extraArgs); registry[k] = handlers; }); }; var findHandler = function (handlers, elem) { return read$2(elem).fold(function () { return Optional.none(); }, function (id) { return handlers.bind(function (h) { return get$1(h, id); }).map(function (descHandler) { return eventHandler(elem, descHandler); }); }); }; var filterByType = function (type) { return get$1(registry, type).map(function (handlers) { return mapToArray(handlers, function (f, id) { return broadcastHandler(id, f); }); }).getOr([]); }; var find = function (isAboveRoot, type, target) { var handlers = get$1(registry, type); return closest(target, function (elem) { return findHandler(handlers, elem); }, isAboveRoot); }; var unregisterId = function (id) { each$1(registry, function (handlersById, _eventName) { if (handlersById.hasOwnProperty(id)) { delete handlersById[id]; } }); }; return { registerId: registerId, unregisterId: unregisterId, filterByType: filterByType, find: find }; }; var Registry = function () { var events = EventRegistry(); var components = {}; var readOrTag = function (component) { var elem = component.element; return read$2(elem).fold(function () { return write('uid-', component.element); }, function (uid) { return uid; }); }; var failOnDuplicate = function (component, tagId) { var conflict = components[tagId]; if (conflict === component) { unregister(component); } else { throw new Error('The tagId "' + tagId + '" is already used by: ' + element(conflict.element) + '\nCannot use it for: ' + element(component.element) + '\n' + 'The conflicting element is' + (inBody(conflict.element) ? ' ' : ' not ') + 'already in the DOM'); } }; var register = function (component) { var tagId = readOrTag(component); if (hasNonNullableKey(components, tagId)) { failOnDuplicate(component, tagId); } var extraArgs = [component]; events.registerId(extraArgs, tagId, component.events); components[tagId] = component; }; var unregister = function (component) { read$2(component.element).each(function (tagId) { delete components[tagId]; events.unregisterId(tagId); }); }; var filter = function (type) { return events.filterByType(type); }; var find = function (isAboveRoot, type, target) { return events.find(isAboveRoot, type, target); }; var getById = function (id) { return get$1(components, id); }; return { find: find, filter: filter, register: register, unregister: unregister, getById: getById }; }; var takeover = function (root) { var isAboveRoot = function (el) { return parent(root.element).fold(always, function (parent) { return eq(el, parent); }); }; var registry = Registry(); var lookup = function (eventName, target) { return registry.find(isAboveRoot, eventName, target); }; var domEvents = setup$2(root.element, { triggerEvent: function (eventName, event) { return monitorEvent(eventName, event.target, function (logger) { return triggerUntilStopped(lookup, eventName, event, logger); }); } }); var systemApi = { debugInfo: constant('real'), triggerEvent: function (eventName, target, data) { monitorEvent(eventName, target, function (logger) { return triggerOnUntilStopped(lookup, eventName, data, target, logger); }); }, triggerFocus: function (target, originator) { read$2(target).fold(function () { focus$1(target); }, function (_alloyId) { monitorEvent(focus(), target, function (logger) { triggerHandler(lookup, focus(), { originator: originator, kill: noop, prevent: noop, target: target }, target, logger); return false; }); }); }, triggerEscape: function (comp, simulatedEvent) { systemApi.triggerEvent('keydown', comp.element, simulatedEvent.event); }, getByUid: function (uid) { return getByUid(uid); }, getByDom: function (elem) { return getByDom(elem); }, build: build$1, addToGui: function (c) { add(c); }, removeFromGui: function (c) { remove$1(c); }, addToWorld: function (c) { addToWorld(c); }, removeFromWorld: function (c) { removeFromWorld(c); }, broadcast: function (message) { broadcast$1(message); }, broadcastOn: function (channels, message) { broadcastOn(channels, message); }, broadcastEvent: function (eventName, event) { broadcastEvent(eventName, event); }, isConnected: always }; var addToWorld = function (component) { component.connect(systemApi); if (!isText(component.element)) { registry.register(component); each(component.components(), addToWorld); systemApi.triggerEvent(systemInit(), component.element, { target: component.element }); } }; var removeFromWorld = function (component) { if (!isText(component.element)) { each(component.components(), removeFromWorld); registry.unregister(component); } component.disconnect(); }; var add = function (component) { attach$1(root, component); }; var remove$1 = function (component) { detach(component); }; var destroy = function () { domEvents.unbind(); remove(root.element); }; var broadcastData = function (data) { var receivers = registry.filter(receive()); each(receivers, function (receiver) { var descHandler = receiver.descHandler; var handler = getCurried(descHandler); handler(data); }); }; var broadcast$1 = function (message) { broadcastData({ universal: true, data: message }); }; var broadcastOn = function (channels, message) { broadcastData({ universal: false, channels: channels, data: message }); }; var broadcastEvent = function (eventName, event) { var listeners = registry.filter(eventName); return broadcast(listeners, event); }; var getByUid = function (uid) { return registry.getById(uid).fold(function () { return Result.error(new Error('Could not find component with uid: "' + uid + '" in system.')); }, Result.value); }; var getByDom = function (elem) { var uid = read$2(elem).getOr('not found'); return getByUid(uid); }; addToWorld(root); return { root: root, element: root.element, destroy: destroy, add: add, remove: remove$1, getByUid: getByUid, getByDom: getByDom, addToWorld: addToWorld, removeFromWorld: removeFromWorld, broadcast: broadcast$1, broadcastOn: broadcastOn, broadcastEvent: broadcastEvent }; }; var READ_ONLY_MODE_CLASS = resolve('readonly-mode'); var EDIT_MODE_CLASS = resolve('edit-mode'); function OuterContainer (spec) { var root = build$1(Container.sketch({ dom: { classes: [resolve('outer-container')].concat(spec.classes) }, containerBehaviours: derive$1([Swapping.config({ alpha: READ_ONLY_MODE_CLASS, omega: EDIT_MODE_CLASS })]) })); return takeover(root); } function AndroidRealm (scrollIntoView) { var alloy = OuterContainer({ classes: [resolve('android-container')] }); var toolbar = ScrollingToolbar(); var webapp = api$2(); var switchToEdit = makeEditSwitch(webapp); var socket = makeSocket(); var dropup = build$2(noop, scrollIntoView); alloy.add(toolbar.wrapper); alloy.add(socket); alloy.add(dropup.component); var setToolbarGroups = function (rawGroups) { var groups = toolbar.createGroups(rawGroups); toolbar.setGroups(groups); }; var setContextToolbar = function (rawGroups) { var groups = toolbar.createGroups(rawGroups); toolbar.setContextToolbar(groups); }; var focusToolbar = function () { toolbar.focus(); }; var restoreToolbar = function () { toolbar.restoreToolbar(); }; var init = function (spec) { webapp.set(produce(spec)); }; var exit = function () { webapp.run(function (w) { w.exit(); Replacing.remove(socket, switchToEdit); }); }; var updateMode$1 = function (readOnly) { updateMode(socket, switchToEdit, readOnly, alloy.root); }; return { system: alloy, element: alloy.element, init: init, exit: exit, setToolbarGroups: setToolbarGroups, setContextToolbar: setContextToolbar, focusToolbar: focusToolbar, restoreToolbar: restoreToolbar, updateMode: updateMode$1, socket: socket, dropup: dropup }; } var input$1 = function (parent, operation) { var input = SugarElement.fromTag('input'); setAll$1(input, { opacity: '0', position: 'absolute', top: '-1000px', left: '-1000px' }); append(parent, input); focus$1(input); operation(input); remove(input); }; var refresh$1 = function (winScope) { var sel = winScope.getSelection(); if (sel.rangeCount > 0) { var br = sel.getRangeAt(0); var r = winScope.document.createRange(); r.setStart(br.startContainer, br.startOffset); r.setEnd(br.endContainer, br.endOffset); sel.removeAllRanges(); sel.addRange(r); } }; var resume$1 = function (cWin, frame) { active().each(function (active) { if (!eq(active, frame)) { blur(active); } }); cWin.focus(); focus$1(SugarElement.fromDom(cWin.document.body)); refresh$1(cWin); }; var stubborn = function (outerBody, cWin, page, frame) { var toEditing = function () { resume$1(cWin, frame); }; var toReading = function () { input$1(outerBody, blur); }; var captureInput = bind$3(page, 'keydown', function (evt) { if (!contains([ 'input', 'textarea' ], name(evt.target))) { toEditing(); } }); var onToolbarTouch = noop; var destroy = function () { captureInput.unbind(); }; return { toReading: toReading, toEditing: toEditing, onToolbarTouch: onToolbarTouch, destroy: destroy }; }; var initEvents$1 = function (editorApi, iosApi, toolstrip, socket, _dropup) { var saveSelectionFirst = function () { iosApi.run(function (api) { api.highlightSelection(); }); }; var refreshIosSelection = function () { iosApi.run(function (api) { api.refreshSelection(); }); }; var scrollToY = function (yTop, height) { var y = yTop - socket.dom.scrollTop; iosApi.run(function (api) { api.scrollIntoView(y, y + height); }); }; var scrollToElement = function (_target) { scrollToY(iosApi, socket); }; var scrollToCursor = function () { editorApi.getCursorBox().each(function (box) { scrollToY(box.top, box.height); }); }; var clearSelection = function () { iosApi.run(function (api) { api.clearSelection(); }); }; var clearAndRefresh = function () { clearSelection(); refreshThrottle.throttle(); }; var refreshView = function () { scrollToCursor(); iosApi.run(function (api) { api.syncHeight(); }); }; var reposition = function () { var toolbarHeight = get$6(toolstrip); iosApi.run(function (api) { api.setViewportOffset(toolbarHeight); }); refreshIosSelection(); refreshView(); }; var toEditing = function () { iosApi.run(function (api) { api.toEditing(); }); }; var toReading = function () { iosApi.run(function (api) { api.toReading(); }); }; var onToolbarTouch = function (event) { iosApi.run(function (api) { api.onToolbarTouch(event); }); }; var tapping = monitor$1(editorApi); var refreshThrottle = last(refreshView, 300); var listeners = [ editorApi.onKeyup(clearAndRefresh), editorApi.onNodeChanged(refreshIosSelection), editorApi.onDomChanged(refreshThrottle.throttle), editorApi.onDomChanged(refreshIosSelection), editorApi.onScrollToCursor(function (tinyEvent) { tinyEvent.preventDefault(); refreshThrottle.throttle(); }), editorApi.onScrollToElement(function (event) { scrollToElement(event.element); }), editorApi.onToEditing(toEditing), editorApi.onToReading(toReading), bind$3(editorApi.doc, 'touchend', function (touchEvent) { if (eq(editorApi.html, touchEvent.target) || eq(editorApi.body, touchEvent.target)) ; }), bind$3(toolstrip, 'transitionend', function (transitionEvent) { if (transitionEvent.raw.propertyName === 'height') { reposition(); } }), capture$1(toolstrip, 'touchstart', function (touchEvent) { saveSelectionFirst(); onToolbarTouch(touchEvent); editorApi.onTouchToolstrip(); }), bind$3(editorApi.body, 'touchstart', function (evt) { clearSelection(); editorApi.onTouchContent(); tapping.fireTouchstart(evt); }), tapping.onTouchmove(), tapping.onTouchend(), bind$3(editorApi.body, 'click', function (event) { event.kill(); }), bind$3(toolstrip, 'touchmove', function () { editorApi.onToolbarScrollStart(); }) ]; var destroy = function () { each(listeners, function (l) { l.unbind(); }); }; return { destroy: destroy }; }; function FakeSelection (win, frame) { var doc = win.document; var container = SugarElement.fromTag('div'); add$2(container, resolve('unfocused-selections')); append(SugarElement.fromDom(doc.documentElement), container); var onTouch = bind$3(container, 'touchstart', function (event) { event.prevent(); resume$1(win, frame); clear(); }); var make = function (rectangle) { var span = SugarElement.fromTag('span'); add$3(span, [ resolve('layer-editor'), resolve('unfocused-selection') ]); setAll$1(span, { left: rectangle.left + 'px', top: rectangle.top + 'px', width: rectangle.width + 'px', height: rectangle.height + 'px' }); return span; }; var update = function () { clear(); var rectangles = getRectangles(win); var spans = map(rectangles, make); append$1(container, spans); }; var clear = function () { empty(container); }; var destroy = function () { onTouch.unbind(); remove(container); }; var isActive = function () { return children(container).length > 0; }; return { update: update, isActive: isActive, destroy: destroy, clear: clear }; } var exports$1 = {}, module = { exports: exports$1 }; (function (define, exports, module, require) { (function (f) { if (typeof exports === 'object' && typeof module !== 'undefined') { module.exports = f(); } else if (typeof define === 'function' && define.amd) { define([], f); } else { var g; if (typeof window !== 'undefined') { g = window; } else if (typeof global !== 'undefined') { g = global; } else if (typeof self !== 'undefined') { g = self; } else { g = this; } g.EphoxContactWrapper = f(); } }(function () { return function () { function r(e, n, t) { function o(i, f) { if (!n[i]) { if (!e[i]) { var c = 'function' == typeof require && require; if (!f && c) return c(i, !0); if (u) return u(i, !0); var a = new Error('Cannot find module \'' + i + '\''); throw a.code = 'MODULE_NOT_FOUND', a; } var p = n[i] = { exports: {} }; e[i][0].call(p.exports, function (r) { var n = e[i][1][r]; return o(n || r); }, p, p.exports, r, e, n, t); } return n[i].exports; } for (var u = 'function' == typeof require && require, i = 0; i < t.length; i++) o(t[i]); return o; } return r; }()({ 1: [ function (require, module, exports) { var process = module.exports = {}; var cachedSetTimeout; var cachedClearTimeout; function defaultSetTimout() { throw new Error('setTimeout has not been defined'); } function defaultClearTimeout() { throw new Error('clearTimeout has not been defined'); } (function () { try { if (typeof setTimeout === 'function') { cachedSetTimeout = setTimeout; } else { cachedSetTimeout = defaultSetTimout; } } catch (e) { cachedSetTimeout = defaultSetTimout; } try { if (typeof clearTimeout === 'function') { cachedClearTimeout = clearTimeout; } else { cachedClearTimeout = defaultClearTimeout; } } catch (e) { cachedClearTimeout = defaultClearTimeout; } }()); function runTimeout(fun) { if (cachedSetTimeout === setTimeout) { return setTimeout(fun, 0); } if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { cachedSetTimeout = setTimeout; return setTimeout(fun, 0); } try { return cachedSetTimeout(fun, 0); } catch (e) { try { return cachedSetTimeout.call(null, fun, 0); } catch (e) { return cachedSetTimeout.call(this, fun, 0); } } } function runClearTimeout(marker) { if (cachedClearTimeout === clearTimeout) { return clearTimeout(marker); } if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { cachedClearTimeout = clearTimeout; return clearTimeout(marker); } try { return cachedClearTimeout(marker); } catch (e) { try { return cachedClearTimeout.call(null, marker); } catch (e) { return cachedClearTimeout.call(this, marker); } } } var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { if (!draining || !currentQueue) { return; } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; while (len) { currentQueue = queue; queue = []; while (++queueIndex < len) { if (currentQueue) { currentQueue[queueIndex].run(); } } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; runClearTimeout(timeout); } process.nextTick = function (fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { runTimeout(drainQueue); } }; function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; process.versions = {}; function noop() { } process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.prependListener = noop; process.prependOnceListener = noop; process.listeners = function (name) { return []; }; process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/'; }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function () { return 0; }; }, {} ], 2: [ function (require, module, exports) { (function (setImmediate) { (function (root) { var setTimeoutFunc = setTimeout; function noop() { } function bind(fn, thisArg) { return function () { fn.apply(thisArg, arguments); }; } function Promise(fn) { if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); if (typeof fn !== 'function') throw new TypeError('not a function'); this._state = 0; this._handled = false; this._value = undefined; this._deferreds = []; doResolve(fn, this); } function handle(self, deferred) { while (self._state === 3) { self = self._value; } if (self._state === 0) { self._deferreds.push(deferred); return; } self._handled = true; Promise._immediateFn(function () { var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; if (cb === null) { (self._state === 1 ? resolve : reject)(deferred.promise, self._value); return; } var ret; try { ret = cb(self._value); } catch (e) { reject(deferred.promise, e); return; } resolve(deferred.promise, ret); }); } function resolve(self, newValue) { try { if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.'); if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { var then = newValue.then; if (newValue instanceof Promise) { self._state = 3; self._value = newValue; finale(self); return; } else if (typeof then === 'function') { doResolve(bind(then, newValue), self); return; } } self._state = 1; self._value = newValue; finale(self); } catch (e) { reject(self, e); } } function reject(self, newValue) { self._state = 2; self._value = newValue; finale(self); } function finale(self) { if (self._state === 2 && self._deferreds.length === 0) { Promise._immediateFn(function () { if (!self._handled) { Promise._unhandledRejectionFn(self._value); } }); } for (var i = 0, len = self._deferreds.length; i < len; i++) { handle(self, self._deferreds[i]); } self._deferreds = null; } function Handler(onFulfilled, onRejected, promise) { this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; this.onRejected = typeof onRejected === 'function' ? onRejected : null; this.promise = promise; } function doResolve(fn, self) { var done = false; try { fn(function (value) { if (done) return; done = true; resolve(self, value); }, function (reason) { if (done) return; done = true; reject(self, reason); }); } catch (ex) { if (done) return; done = true; reject(self, ex); } } Promise.prototype['catch'] = function (onRejected) { return this.then(null, onRejected); }; Promise.prototype.then = function (onFulfilled, onRejected) { var prom = new this.constructor(noop); handle(this, new Handler(onFulfilled, onRejected, prom)); return prom; }; Promise.all = function (arr) { var args = Array.prototype.slice.call(arr); return new Promise(function (resolve, reject) { if (args.length === 0) return resolve([]); var remaining = args.length; function res(i, val) { try { if (val && (typeof val === 'object' || typeof val === 'function')) { var then = val.then; if (typeof then === 'function') { then.call(val, function (val) { res(i, val); }, reject); return; } } args[i] = val; if (--remaining === 0) { resolve(args); } } catch (ex) { reject(ex); } } for (var i = 0; i < args.length; i++) { res(i, args[i]); } }); }; Promise.resolve = function (value) { if (value && typeof value === 'object' && value.constructor === Promise) { return value; } return new Promise(function (resolve) { resolve(value); }); }; Promise.reject = function (value) { return new Promise(function (resolve, reject) { reject(value); }); }; Promise.race = function (values) { return new Promise(function (resolve, reject) { for (var i = 0, len = values.length; i < len; i++) { values[i].then(resolve, reject); } }); }; Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) { setImmediate(fn); } : function (fn) { setTimeoutFunc(fn, 0); }; Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { if (typeof console !== 'undefined' && console) { console.warn('Possible Unhandled Promise Rejection:', err); } }; Promise._setImmediateFn = function _setImmediateFn(fn) { Promise._immediateFn = fn; }; Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) { Promise._unhandledRejectionFn = fn; }; if (typeof module !== 'undefined' && module.exports) { module.exports = Promise; } else if (!root.Promise) { root.Promise = Promise; } }(this)); }.call(this, require('timers').setImmediate)); }, { 'timers': 3 } ], 3: [ function (require, module, exports) { (function (setImmediate, clearImmediate) { var nextTick = require('process/browser.js').nextTick; var apply = Function.prototype.apply; var slice = Array.prototype.slice; var immediateIds = {}; var nextImmediateId = 0; exports.setTimeout = function () { return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); }; exports.setInterval = function () { return new Timeout(apply.call(setInterval, window, arguments), clearInterval); }; exports.clearTimeout = exports.clearInterval = function (timeout) { timeout.close(); }; function Timeout(id, clearFn) { this._id = id; this._clearFn = clearFn; } Timeout.prototype.unref = Timeout.prototype.ref = function () { }; Timeout.prototype.close = function () { this._clearFn.call(window, this._id); }; exports.enroll = function (item, msecs) { clearTimeout(item._idleTimeoutId); item._idleTimeout = msecs; }; exports.unenroll = function (item) { clearTimeout(item._idleTimeoutId); item._idleTimeout = -1; }; exports._unrefActive = exports.active = function (item) { clearTimeout(item._idleTimeoutId); var msecs = item._idleTimeout; if (msecs >= 0) { item._idleTimeoutId = setTimeout(function onTimeout() { if (item._onTimeout) item._onTimeout(); }, msecs); } }; exports.setImmediate = typeof setImmediate === 'function' ? setImmediate : function (fn) { var id = nextImmediateId++; var args = arguments.length < 2 ? false : slice.call(arguments, 1); immediateIds[id] = true; nextTick(function onNextTick() { if (immediateIds[id]) { if (args) { fn.apply(null, args); } else { fn.call(null); } exports.clearImmediate(id); } }); return id; }; exports.clearImmediate = typeof clearImmediate === 'function' ? clearImmediate : function (id) { delete immediateIds[id]; }; }.call(this, require('timers').setImmediate, require('timers').clearImmediate)); }, { 'process/browser.js': 1, 'timers': 3 } ], 4: [ function (require, module, exports) { var promisePolyfill = require('promise-polyfill'); var Global = function () { if (typeof window !== 'undefined') { return window; } else { return Function('return this;')(); } }(); module.exports = { boltExport: Global.Promise || promisePolyfill }; }, { 'promise-polyfill': 2 } ] }, {}, [4])(4); })); }(undefined, exports$1, module, undefined)); var Promise$1 = module.exports.boltExport; var nu$7 = function (baseFn) { var data = Optional.none(); var callbacks = []; var map = function (f) { return nu$7(function (nCallback) { get(function (data) { nCallback(f(data)); }); }); }; var get = function (nCallback) { if (isReady()) { call(nCallback); } else { callbacks.push(nCallback); } }; var set = function (x) { if (!isReady()) { data = Optional.some(x); run(callbacks); callbacks = []; } }; var isReady = function () { return data.isSome(); }; var run = function (cbs) { each(cbs, call); }; var call = function (cb) { data.each(function (x) { setTimeout(function () { cb(x); }, 0); }); }; baseFn(set); return { get: get, map: map, isReady: isReady }; }; var pure$1 = function (a) { return nu$7(function (callback) { callback(a); }); }; var LazyValue = { nu: nu$7, pure: pure$1 }; var errorReporter = function (err) { setTimeout(function () { throw err; }, 0); }; var make$4 = function (run) { var get = function (callback) { run().then(callback, errorReporter); }; var map = function (fab) { return make$4(function () { return run().then(fab); }); }; var bind = function (aFutureB) { return make$4(function () { return run().then(function (v) { return aFutureB(v).toPromise(); }); }); }; var anonBind = function (futureB) { return make$4(function () { return run().then(function () { return futureB.toPromise(); }); }); }; var toLazy = function () { return LazyValue.nu(get); }; var toCached = function () { var cache = null; return make$4(function () { if (cache === null) { cache = run(); } return cache; }); }; var toPromise = run; return { map: map, bind: bind, anonBind: anonBind, toLazy: toLazy, toCached: toCached, toPromise: toPromise, get: get }; }; var nu$8 = function (baseFn) { return make$4(function () { return new Promise$1(baseFn); }); }; var pure$2 = function (a) { return make$4(function () { return Promise$1.resolve(a); }); }; var Future = { nu: nu$8, pure: pure$2 }; var adjust = function (value, destination, amount) { if (Math.abs(value - destination) <= amount) { return Optional.none(); } else if (value < destination) { return Optional.some(value + amount); } else { return Optional.some(value - amount); } }; var create$5 = function () { var interval = null; var animate = function (getCurrent, destination, amount, increment, doFinish, rate) { var finished = false; var finish = function (v) { finished = true; doFinish(v); }; global$4.clearInterval(interval); var abort = function (v) { global$4.clearInterval(interval); finish(v); }; interval = global$4.setInterval(function () { var value = getCurrent(); adjust(value, destination, amount).fold(function () { global$4.clearInterval(interval); finish(destination); }, function (s) { increment(s, abort); if (!finished) { var newValue = getCurrent(); if (newValue !== s || Math.abs(newValue - destination) > Math.abs(value - destination)) { global$4.clearInterval(interval); finish(destination); } } }); }, rate); }; return { animate: animate }; }; var findDevice = function (deviceWidth, deviceHeight) { var devices = [ { width: 320, height: 480, keyboard: { portrait: 300, landscape: 240 } }, { width: 320, height: 568, keyboard: { portrait: 300, landscape: 240 } }, { width: 375, height: 667, keyboard: { portrait: 305, landscape: 240 } }, { width: 414, height: 736, keyboard: { portrait: 320, landscape: 240 } }, { width: 768, height: 1024, keyboard: { portrait: 320, landscape: 400 } }, { width: 1024, height: 1366, keyboard: { portrait: 380, landscape: 460 } } ]; return findMap(devices, function (device) { return someIf(deviceWidth <= device.width && deviceHeight <= device.height, device.keyboard); }).getOr({ portrait: deviceHeight / 5, landscape: deviceWidth / 4 }); }; var softKeyboardLimits = function (outerWindow) { return findDevice(outerWindow.screen.width, outerWindow.screen.height); }; var accountableKeyboardHeight = function (outerWindow) { var portrait = get$c(outerWindow).isPortrait(); var limits = softKeyboardLimits(outerWindow); var keyboard = portrait ? limits.portrait : limits.landscape; var visualScreenHeight = portrait ? outerWindow.screen.height : outerWindow.screen.width; return visualScreenHeight - outerWindow.innerHeight > keyboard ? 0 : keyboard; }; var getGreenzone = function (socket, dropup) { var outerWindow = owner(socket).dom.defaultView; var viewportHeight = get$6(socket) + get$6(dropup); var acc = accountableKeyboardHeight(outerWindow); return viewportHeight - acc; }; var updatePadding = function (contentBody, socket, dropup) { var greenzoneHeight = getGreenzone(socket, dropup); var deltaHeight = get$6(socket) + get$6(dropup) - greenzoneHeight; set$3(contentBody, 'padding-bottom', deltaHeight + 'px'); }; var fixture = Adt.generate([ { fixed: [ 'element', 'property', 'offsetY' ] }, { scroller: [ 'element', 'offsetY' ] } ]); var yFixedData = 'data-' + resolve('position-y-fixed'); var yFixedProperty = 'data-' + resolve('y-property'); var yScrollingData = 'data-' + resolve('scrolling'); var windowSizeData = 'data-' + resolve('last-window-height'); var getYFixedData = function (element) { return safeParse(element, yFixedData); }; var getYFixedProperty = function (element) { return get$2(element, yFixedProperty); }; var getLastWindowSize = function (element) { return safeParse(element, windowSizeData); }; var classifyFixed = function (element, offsetY) { var prop = getYFixedProperty(element); return fixture.fixed(element, prop, offsetY); }; var classifyScrolling = function (element, offsetY) { return fixture.scroller(element, offsetY); }; var classify = function (element) { var offsetY = getYFixedData(element); var classifier = get$2(element, yScrollingData) === 'true' ? classifyScrolling : classifyFixed; return classifier(element, offsetY); }; var findFixtures = function (container) { var candidates = descendants(container, '[' + yFixedData + ']'); return map(candidates, classify); }; var takeoverToolbar = function (toolbar) { var oldToolbarStyle = get$2(toolbar, 'style'); setAll$1(toolbar, { position: 'absolute', top: '0px' }); set(toolbar, yFixedData, '0px'); set(toolbar, yFixedProperty, 'top'); var restore = function () { set(toolbar, 'style', oldToolbarStyle || ''); remove$1(toolbar, yFixedData); remove$1(toolbar, yFixedProperty); }; return { restore: restore }; }; var takeoverViewport = function (toolbarHeight, height, viewport) { var oldViewportStyle = get$2(viewport, 'style'); register(viewport); setAll$1(viewport, { position: 'absolute', height: height + 'px', width: '100%', top: toolbarHeight + 'px' }); set(viewport, yFixedData, toolbarHeight + 'px'); set(viewport, yScrollingData, 'true'); set(viewport, yFixedProperty, 'top'); var restore = function () { deregister(viewport); set(viewport, 'style', oldViewportStyle || ''); remove$1(viewport, yFixedData); remove$1(viewport, yScrollingData); remove$1(viewport, yFixedProperty); }; return { restore: restore }; }; var takeoverDropup = function (dropup) { var oldDropupStyle = get$2(dropup, 'style'); setAll$1(dropup, { position: 'absolute', bottom: '0px' }); set(dropup, yFixedData, '0px'); set(dropup, yFixedProperty, 'bottom'); var restore = function () { set(dropup, 'style', oldDropupStyle || ''); remove$1(dropup, yFixedData); remove$1(dropup, yFixedProperty); }; return { restore: restore }; }; var deriveViewportHeight = function (viewport, toolbarHeight, dropupHeight) { var outerWindow = owner(viewport).dom.defaultView; var winH = outerWindow.innerHeight; set(viewport, windowSizeData, winH + 'px'); return winH - toolbarHeight - dropupHeight; }; var takeover$1 = function (viewport, contentBody, toolbar, dropup) { var outerWindow = owner(viewport).dom.defaultView; var toolbarSetup = takeoverToolbar(toolbar); var toolbarHeight = get$6(toolbar); var dropupHeight = get$6(dropup); var viewportHeight = deriveViewportHeight(viewport, toolbarHeight, dropupHeight); var viewportSetup = takeoverViewport(toolbarHeight, viewportHeight, viewport); var dropupSetup = takeoverDropup(dropup); var isActive = true; var restore = function () { isActive = false; toolbarSetup.restore(); viewportSetup.restore(); dropupSetup.restore(); }; var isExpanding = function () { var currentWinHeight = outerWindow.innerHeight; var lastWinHeight = getLastWindowSize(viewport); return currentWinHeight > lastWinHeight; }; var refresh = function () { if (isActive) { var newToolbarHeight = get$6(toolbar); var dropupHeight_1 = get$6(dropup); var newHeight = deriveViewportHeight(viewport, newToolbarHeight, dropupHeight_1); set(viewport, yFixedData, newToolbarHeight + 'px'); set$3(viewport, 'height', newHeight + 'px'); updatePadding(contentBody, viewport, dropup); } }; var setViewportOffset = function (newYOffset) { var offsetPx = newYOffset + 'px'; set(viewport, yFixedData, offsetPx); refresh(); }; updatePadding(contentBody, viewport, dropup); return { setViewportOffset: setViewportOffset, isExpanding: isExpanding, isShrinking: not(isExpanding), refresh: refresh, restore: restore }; }; var animator = create$5(); var ANIMATION_STEP = 15; var NUM_TOP_ANIMATION_FRAMES = 10; var ANIMATION_RATE = 10; var lastScroll = 'data-' + resolve('last-scroll-top'); var getTop = function (element) { var raw = getRaw(element, 'top').getOr('0'); return parseInt(raw, 10); }; var getScrollTop = function (element) { return parseInt(element.dom.scrollTop, 10); }; var moveScrollAndTop = function (element, destination, finalTop) { return Future.nu(function (callback) { var getCurrent = curry(getScrollTop, element); var update = function (newScroll) { element.dom.scrollTop = newScroll; set$3(element, 'top', getTop(element) + ANIMATION_STEP + 'px'); }; var finish = function () { element.dom.scrollTop = destination; set$3(element, 'top', finalTop + 'px'); callback(destination); }; animator.animate(getCurrent, destination, ANIMATION_STEP, update, finish, ANIMATION_RATE); }); }; var moveOnlyScroll = function (element, destination) { return Future.nu(function (callback) { var getCurrent = curry(getScrollTop, element); set(element, lastScroll, getCurrent()); var update = function (newScroll, abort) { var previous = safeParse(element, lastScroll); if (previous !== element.dom.scrollTop) { abort(element.dom.scrollTop); } else { element.dom.scrollTop = newScroll; set(element, lastScroll, newScroll); } }; var finish = function () { element.dom.scrollTop = destination; set(element, lastScroll, destination); callback(destination); }; var distance = Math.abs(destination - getCurrent()); var step = Math.ceil(distance / NUM_TOP_ANIMATION_FRAMES); animator.animate(getCurrent, destination, step, update, finish, ANIMATION_RATE); }); }; var moveOnlyTop = function (element, destination) { return Future.nu(function (callback) { var getCurrent = curry(getTop, element); var update = function (newTop) { set$3(element, 'top', newTop + 'px'); }; var finish = function () { update(destination); callback(destination); }; var distance = Math.abs(destination - getCurrent()); var step = Math.ceil(distance / NUM_TOP_ANIMATION_FRAMES); animator.animate(getCurrent, destination, step, update, finish, ANIMATION_RATE); }); }; var updateTop = function (element, amount) { var newTop = amount + getYFixedData(element) + 'px'; set$3(element, 'top', newTop); }; var moveWindowScroll = function (toolbar, viewport, destY) { var outerWindow = owner(toolbar).dom.defaultView; return Future.nu(function (callback) { updateTop(toolbar, destY); updateTop(viewport, destY); outerWindow.scrollTo(0, destY); callback(destY); }); }; function BackgroundActivity (doAction) { var action = Cell(LazyValue.pure({})); var start = function (value) { var future = LazyValue.nu(function (callback) { return doAction(value).get(callback); }); action.set(future); }; var idle = function (g) { action.get().get(function () { g(); }); }; return { start: start, idle: idle }; } var scrollIntoView = function (cWin, socket, dropup, top, bottom) { var greenzone = getGreenzone(socket, dropup); var refreshCursor = curry(refresh$1, cWin); if (top > greenzone || bottom > greenzone) { moveOnlyScroll(socket, socket.dom.scrollTop - greenzone + bottom).get(refreshCursor); } else if (top < 0) { moveOnlyScroll(socket, socket.dom.scrollTop + top).get(refreshCursor); } else ; }; var par = function (asyncValues, nu) { return nu(function (callback) { var r = []; var count = 0; var cb = function (i) { return function (value) { r[i] = value; count++; if (count >= asyncValues.length) { callback(r); } }; }; if (asyncValues.length === 0) { callback([]); } else { each(asyncValues, function (asyncValue, i) { asyncValue.get(cb(i)); }); } }); }; var par$1 = function (futures) { return par(futures, Future.nu); }; var updateFixed = function (element, property, winY, offsetY) { var destination = winY + offsetY; set$3(element, property, destination + 'px'); return Future.pure(offsetY); }; var updateScrollingFixed = function (element, winY, offsetY) { var destTop = winY + offsetY; var oldProp = getRaw(element, 'top').getOr(offsetY); var delta = destTop - parseInt(oldProp, 10); var destScroll = element.dom.scrollTop + delta; return moveScrollAndTop(element, destScroll, destTop); }; var updateFixture = function (fixture, winY) { return fixture.fold(function (element, property, offsetY) { return updateFixed(element, property, winY, offsetY); }, function (element, offsetY) { return updateScrollingFixed(element, winY, offsetY); }); }; var updatePositions = function (container, winY) { var fixtures = findFixtures(container); var updates = map(fixtures, function (fixture) { return updateFixture(fixture, winY); }); return par$1(updates); }; var VIEW_MARGIN = 5; var register$2 = function (toolstrip, socket, container, outerWindow, structure, cWin) { var scroller = BackgroundActivity(function (y) { return moveWindowScroll(toolstrip, socket, y); }); var scrollBounds = function () { var rects = getRectangles(cWin); return Optional.from(rects[0]).bind(function (rect) { var viewTop = rect.top - socket.dom.scrollTop; var outside = viewTop > outerWindow.innerHeight + VIEW_MARGIN || viewTop < -VIEW_MARGIN; return outside ? Optional.some({ top: viewTop, bottom: viewTop + rect.height }) : Optional.none(); }); }; var scrollThrottle = last(function () { scroller.idle(function () { updatePositions(container, outerWindow.pageYOffset).get(function () { var extraScroll = scrollBounds(); extraScroll.each(function (extra) { socket.dom.scrollTop = socket.dom.scrollTop + extra.top; }); scroller.start(0); structure.refresh(); }); }); }, 1000); var onScroll = bind$3(SugarElement.fromDom(outerWindow), 'scroll', function () { if (outerWindow.pageYOffset < 0) { return; } scrollThrottle.throttle(); }); updatePositions(container, outerWindow.pageYOffset).get(identity); return { unbind: onScroll.unbind }; }; var setup$3 = function (bag) { var cWin = bag.cWin; var ceBody = bag.ceBody; var socket = bag.socket; var toolstrip = bag.toolstrip; var contentElement = bag.contentElement; var keyboardType = bag.keyboardType; var outerWindow = bag.outerWindow; var dropup = bag.dropup; var outerBody = bag.outerBody; var structure = takeover$1(socket, ceBody, toolstrip, dropup); var keyboardModel = keyboardType(outerBody, cWin, body(), contentElement); var toEditing = function () { keyboardModel.toEditing(); clearSelection(); }; var toReading = function () { keyboardModel.toReading(); }; var onToolbarTouch = function (_event) { keyboardModel.onToolbarTouch(); }; var onOrientation = onChange(outerWindow, { onChange: noop, onReady: structure.refresh }); onOrientation.onAdjustment(function () { structure.refresh(); }); var onResize = bind$3(SugarElement.fromDom(outerWindow), 'resize', function () { if (structure.isExpanding()) { structure.refresh(); } }); var onScroll = register$2(toolstrip, socket, outerBody, outerWindow, structure, cWin); var unfocusedSelection = FakeSelection(cWin, contentElement); var refreshSelection = function () { if (unfocusedSelection.isActive()) { unfocusedSelection.update(); } }; var highlightSelection = function () { unfocusedSelection.update(); }; var clearSelection = function () { unfocusedSelection.clear(); }; var scrollIntoView$1 = function (top, bottom) { scrollIntoView(cWin, socket, dropup, top, bottom); }; var syncHeight = function () { set$3(contentElement, 'height', contentElement.dom.contentWindow.document.body.scrollHeight + 'px'); }; var setViewportOffset = function (newYOffset) { structure.setViewportOffset(newYOffset); moveOnlyTop(socket, newYOffset).get(identity); }; var destroy = function () { structure.restore(); onOrientation.destroy(); onScroll.unbind(); onResize.unbind(); keyboardModel.destroy(); unfocusedSelection.destroy(); input$1(body(), blur); }; return { toEditing: toEditing, toReading: toReading, onToolbarTouch: onToolbarTouch, refreshSelection: refreshSelection, clearSelection: clearSelection, highlightSelection: highlightSelection, scrollIntoView: scrollIntoView$1, updateToolbarPadding: noop, setViewportOffset: setViewportOffset, syncHeight: syncHeight, refreshStructure: structure.refresh, destroy: destroy }; }; var create$6 = function (platform, mask) { var meta = tag(); var priorState = value$2(); var scrollEvents = value$2(); var iosApi = api$2(); var iosEvents = api$2(); var enter = function () { mask.hide(); var doc = SugarElement.fromDom(document); getActiveApi(platform.editor).each(function (editorApi) { priorState.set({ socketHeight: getRaw(platform.socket, 'height'), iframeHeight: getRaw(editorApi.frame, 'height'), outerScroll: document.body.scrollTop }); scrollEvents.set({ exclusives: exclusive(doc, '.' + scrollable) }); add$2(platform.container, resolve('fullscreen-maximized')); clobberStyles(platform.container, editorApi.body); meta.maximize(); set$3(platform.socket, 'overflow', 'scroll'); set$3(platform.socket, '-webkit-overflow-scrolling', 'touch'); focus$1(editorApi.body); iosApi.set(setup$3({ cWin: editorApi.win, ceBody: editorApi.body, socket: platform.socket, toolstrip: platform.toolstrip, dropup: platform.dropup.element, contentElement: editorApi.frame, outerBody: platform.body, outerWindow: platform.win, keyboardType: stubborn })); iosApi.run(function (api) { api.syncHeight(); }); iosEvents.set(initEvents$1(editorApi, iosApi, platform.toolstrip, platform.socket, platform.dropup)); }); }; var exit = function () { meta.restore(); iosEvents.clear(); iosApi.clear(); mask.show(); priorState.on(function (s) { s.socketHeight.each(function (h) { set$3(platform.socket, 'height', h); }); s.iframeHeight.each(function (h) { set$3(platform.editor.getFrame(), 'height', h); }); document.body.scrollTop = s.scrollTop; }); priorState.clear(); scrollEvents.on(function (s) { s.exclusives.unbind(); }); scrollEvents.clear(); remove$4(platform.container, resolve('fullscreen-maximized')); restoreStyles(); deregister(platform.toolbar); remove$5(platform.socket, 'overflow'); remove$5(platform.socket, '-webkit-overflow-scrolling'); blur(platform.editor.getFrame()); getActiveApi(platform.editor).each(function (editorApi) { editorApi.clearSelection(); }); }; var refreshStructure = function () { iosApi.run(function (api) { api.refreshStructure(); }); }; return { enter: enter, refreshStructure: refreshStructure, exit: exit }; }; var produce$1 = function (raw) { var mobile = asRawOrDie('Getting IosWebapp schema', MobileSchema, raw); set$3(mobile.toolstrip, 'width', '100%'); set$3(mobile.container, 'position', 'relative'); var onView = function () { mobile.setReadOnly(mobile.readOnlyOnInit()); mode.enter(); }; var mask = build$1(sketch$9(onView, mobile.translate)); mobile.alloy.add(mask); var maskApi = { show: function () { mobile.alloy.add(mask); }, hide: function () { mobile.alloy.remove(mask); } }; var mode = create$6(mobile, maskApi); return { setReadOnly: mobile.setReadOnly, refreshStructure: mode.refreshStructure, enter: mode.enter, exit: mode.exit, destroy: noop }; }; function IosRealm (scrollIntoView) { var alloy = OuterContainer({ classes: [resolve('ios-container')] }); var toolbar = ScrollingToolbar(); var webapp = api$2(); var switchToEdit = makeEditSwitch(webapp); var socket = makeSocket(); var dropup = build$2(function () { webapp.run(function (w) { w.refreshStructure(); }); }, scrollIntoView); alloy.add(toolbar.wrapper); alloy.add(socket); alloy.add(dropup.component); var setToolbarGroups = function (rawGroups) { var groups = toolbar.createGroups(rawGroups); toolbar.setGroups(groups); }; var setContextToolbar = function (rawGroups) { var groups = toolbar.createGroups(rawGroups); toolbar.setContextToolbar(groups); }; var focusToolbar = function () { toolbar.focus(); }; var restoreToolbar = function () { toolbar.restoreToolbar(); }; var init = function (spec) { webapp.set(produce$1(spec)); }; var exit = function () { webapp.run(function (w) { Replacing.remove(socket, switchToEdit); w.exit(); }); }; var updateMode$1 = function (readOnly) { updateMode(socket, switchToEdit, readOnly, alloy.root); }; return { system: alloy, element: alloy.element, init: init, exit: exit, setToolbarGroups: setToolbarGroups, setContextToolbar: setContextToolbar, focusToolbar: focusToolbar, restoreToolbar: restoreToolbar, updateMode: updateMode$1, socket: socket, dropup: dropup }; } var global$5 = tinymce.util.Tools.resolve('tinymce.EditorManager'); var derive$3 = function (editor) { var base = Optional.from(getSkinUrl(editor)).fold(function () { return global$5.baseURL + '/skins/ui/oxide'; }, function (url) { return url; }); return { content: base + '/content.mobile.min.css', ui: base + '/skin.mobile.min.css' }; }; var fireChange = function (realm, command, state) { realm.system.broadcastOn([formatChanged], { command: command, state: state }); }; var init$5 = function (realm, editor) { var allFormats = keys(editor.formatter.get()); each(allFormats, function (command) { editor.formatter.formatChanged(command, function (state) { fireChange(realm, command, state); }); }); each([ 'ul', 'ol' ], function (command) { editor.selection.selectorChanged(command, function (state, _data) { fireChange(realm, command, state); }); }); }; var fireSkinLoaded = function (editor) { return function () { var done = function () { editor._skinLoaded = true; editor.fire('SkinLoaded'); }; if (editor.initialized) { done(); } else { editor.on('init', done); } }; }; var READING = 'toReading'; var EDITING = 'toEditing'; var renderMobileTheme = function (editor) { var renderUI = function () { var targetNode = editor.getElement(); var cssUrls = derive$3(editor); if (isSkinDisabled(editor) === false) { var styleSheetLoader_1 = global$1.DOM.styleSheetLoader; editor.contentCSS.push(cssUrls.content); styleSheetLoader_1.load(cssUrls.ui, fireSkinLoaded(editor)); editor.on('remove', function () { return styleSheetLoader_1.unload(cssUrls.ui); }); } else { fireSkinLoaded(editor)(); } var doScrollIntoView = function () { editor.fire('ScrollIntoView'); }; var realm = detect$3().os.isAndroid() ? AndroidRealm(doScrollIntoView) : IosRealm(doScrollIntoView); var original = SugarElement.fromDom(targetNode); attachSystemAfter(original, realm.system); var findFocusIn = function (elem) { return search(elem).bind(function (focused) { return realm.system.getByDom(focused).toOptional(); }); }; var outerWindow = targetNode.ownerDocument.defaultView; var orientation = onChange(outerWindow, { onChange: function () { var alloy = realm.system; alloy.broadcastOn([orientationChanged], { width: getActualWidth(outerWindow) }); }, onReady: noop }); var setReadOnly = function (dynamicGroup, readOnlyGroups, mainGroups, ro) { if (ro === false) { editor.selection.collapse(); } var toolbars = configureToolbar(dynamicGroup, readOnlyGroups, mainGroups); realm.setToolbarGroups(ro === true ? toolbars.readOnly : toolbars.main); editor.setMode(ro === true ? 'readonly' : 'design'); editor.fire(ro === true ? READING : EDITING); realm.updateMode(ro); }; var configureToolbar = function (dynamicGroup, readOnlyGroups, mainGroups) { var dynamic = dynamicGroup.get(); var toolbars = { readOnly: dynamic.backToMask.concat(readOnlyGroups.get()), main: dynamic.backToMask.concat(mainGroups.get()) }; return toolbars; }; var bindHandler = function (label, handler) { editor.on(label, handler); return { unbind: function () { editor.off(label); } }; }; editor.on('init', function () { realm.init({ editor: { getFrame: function () { return SugarElement.fromDom(editor.contentAreaContainer.querySelector('iframe')); }, onDomChanged: function () { return { unbind: noop }; }, onToReading: function (handler) { return bindHandler(READING, handler); }, onToEditing: function (handler) { return bindHandler(EDITING, handler); }, onScrollToCursor: function (handler) { editor.on('ScrollIntoView', function (tinyEvent) { handler(tinyEvent); }); var unbind = function () { editor.off('ScrollIntoView'); orientation.destroy(); }; return { unbind: unbind }; }, onTouchToolstrip: function () { hideDropup(); }, onTouchContent: function () { var toolbar = SugarElement.fromDom(editor.editorContainer.querySelector('.' + resolve('toolbar'))); findFocusIn(toolbar).each(emitExecute); realm.restoreToolbar(); hideDropup(); }, onTapContent: function (evt) { var target = evt.target; if (name(target) === 'img') { editor.selection.select(target.dom); evt.kill(); } else if (name(target) === 'a') { var component = realm.system.getByDom(SugarElement.fromDom(editor.editorContainer)); component.each(function (container) { if (Swapping.isAlpha(container)) { openLink(target.dom); } }); } } }, container: SugarElement.fromDom(editor.editorContainer), socket: SugarElement.fromDom(editor.contentAreaContainer), toolstrip: SugarElement.fromDom(editor.editorContainer.querySelector('.' + resolve('toolstrip'))), toolbar: SugarElement.fromDom(editor.editorContainer.querySelector('.' + resolve('toolbar'))), dropup: realm.dropup, alloy: realm.system, translate: noop, setReadOnly: function (ro) { setReadOnly(dynamicGroup, readOnlyGroups, mainGroups, ro); }, readOnlyOnInit: function () { return readOnlyOnInit(); } }); var hideDropup = function () { realm.dropup.disappear(function () { realm.system.broadcastOn([dropupDismissed], {}); }); }; var backToMaskGroup = { label: 'The first group', scrollable: false, items: [forToolbar('back', function () { editor.selection.collapse(); realm.exit(); }, {}, editor)] }; var backToReadOnlyGroup = { label: 'Back to read only', scrollable: false, items: [forToolbar('readonly-back', function () { setReadOnly(dynamicGroup, readOnlyGroups, mainGroups, true); }, {}, editor)] }; var readOnlyGroup = { label: 'The read only mode group', scrollable: true, items: [] }; var features = setup(realm, editor); var items = detect$4(editor, features); var actionGroup = { label: 'the action group', scrollable: true, items: items }; var extraGroup = { label: 'The extra group', scrollable: false, items: [] }; var mainGroups = Cell([ actionGroup, extraGroup ]); var readOnlyGroups = Cell([ readOnlyGroup, extraGroup ]); var dynamicGroup = Cell({ backToMask: [backToMaskGroup], backToReadOnly: [backToReadOnlyGroup] }); init$5(realm, editor); }); editor.on('remove', function () { realm.exit(); }); editor.on('detach', function () { detachSystem(realm.system); realm.system.destroy(); }); return { iframeContainer: realm.socket.element.dom, editorContainer: realm.element.dom }; }; return { getNotificationManagerImpl: function () { return { open: constant({ progressBar: { value: noop }, close: noop, text: noop, getEl: constant(null), moveTo: noop, moveRel: noop, settings: {} }), close: noop, reposition: noop, getArgs: constant({}) }; }, renderUI: renderUI }; }; function Theme () { global$2.add('mobile', renderMobileTheme); } Theme(); }());