{"version":3,"sources":["libs/galaxy/nav/src/services/nav-control.service.ts","libs/galaxy/nav/src/components/nav-item/nav-item.component.ts","libs/galaxy/nav/src/components/nav-item/nav-item.component.html","libs/galaxy/nav/src/nav.component.ts","libs/galaxy/nav/src/nav.component.html","libs/galaxy/nav/src/components/nav-panel/nav-panel.component.ts","libs/galaxy/nav/src/components/nav-panel/nav-panel.component.html","libs/galaxy/nav/src/directives/nav-header.directive.ts","libs/galaxy/nav/src/directives/nav-footer.directive.ts","libs/galaxy/nav/src/nav.module.ts","libs/galaxy/nav/public_api.ts","libs/galaxy/nav/index.ts","node_modules/tinymce/icons/default/icons.js","node_modules/tinymce/icons/default/index.js","node_modules/tinymce/themes/silver/theme.js","node_modules/tinymce/themes/silver/index.js","libs/galaxy/rich-text-editor/src/rich-text-editor.component.ts","libs/galaxy/rich-text-editor/src/rich-text-editor.component.html","libs/galaxy/rich-text-editor/src/rich-text-editor.module.ts","libs/galaxy/rich-text-editor/public_api.ts","libs/galaxy/rich-text-editor/index.ts","libs/galaxy/utility/country-codes/src/country-options.ts","libs/galaxy/utility/country-codes/src/country-code.service.ts","libs/galaxy/utility/country-codes/public_api.ts","libs/galaxy/utility/country-codes/index.ts","node_modules/ngx-mat-select-search/fesm2020/ngx-mat-select-search.mjs","node_modules/@uiowa/digit-only/fesm2020/uiowa-digit-only.mjs"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class GalaxyNavControlService {\n readonly isOpen = signal(true);\n readonly navIsClosedForThisPage = signal(false);\n\n toggle(): void {\n this.isOpen.update((isOpen) => !isOpen);\n }\n\n open(): void {\n this.isOpen.set(true);\n }\n\n close(): void {\n this.isOpen.set(false);\n }\n\n closeForThisPage(): void {\n this.close();\n this.navIsClosedForThisPage.set(true);\n }\n\n undoCloseForThisPage(): void {\n this.open();\n this.navIsClosedForThisPage.set(false);\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport { MatRippleModule } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { RouterModule } from '@angular/router';\n\n@Component({\n imports: [RouterModule, MatIconModule, NgTemplateOutlet, MatRippleModule],\n selector: 'glxy-nav-item',\n templateUrl: './nav-item.component.html',\n styleUrls: ['./nav-item.component.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class GalaxyNavItemComponent {\n @HostBinding('class') class = 'glxy-nav-item';\n\n /** Material icon name, or custom SVG icon **/\n @Input() icon?: string;\n\n /** Route for the nav item to use with routerLink **/\n @Input() route?: string;\n\n /** Or use an href for the nav item **/\n @Input() href?: string;\n\n /** Optionally specify a target for the href link **/\n @Input() target?: string;\n\n /** Optional query params for the route **/\n @Input() queryParams: unknown;\n\n /** If your icon is a custom SVG **/\n @Input({ transform: booleanAttribute }) isSvg = false;\n\n /** If the nav item should show active state only when it's an exact match **/\n @Input({ transform: booleanAttribute }) activeExactRoute = false;\n}\n","@if (route) {\n \n
' + sanitizeHtmlString(detail.translationProvider(detail.text)) + '
'),\n behaviours: derive$1([Replacing.config({})])\n });\n var renderPercentBar = function (percent) {\n return {\n dom: {\n tag: 'div',\n classes: ['tox-bar'],\n attributes: {\n style: 'width: ' + percent + '%'\n }\n }\n };\n };\n var renderPercentText = function (percent) {\n return {\n dom: {\n tag: 'div',\n classes: ['tox-text'],\n innerHtml: percent + '%'\n }\n };\n };\n var memBannerProgress = record({\n dom: {\n tag: 'div',\n classes: detail.progress ? ['tox-progress-bar', 'tox-progress-indicator'] : ['tox-progress-bar']\n },\n components: [{\n dom: {\n tag: 'div',\n classes: ['tox-bar-container']\n },\n components: [renderPercentBar(0)]\n }, renderPercentText(0)],\n behaviours: derive$1([Replacing.config({})])\n });\n var updateProgress = function (comp, percent) {\n if (comp.getSystem().isConnected()) {\n memBannerProgress.getOpt(comp).each(function (progress) {\n Replacing.set(progress, [{\n dom: {\n tag: 'div',\n classes: ['tox-bar-container']\n },\n components: [renderPercentBar(percent)]\n }, renderPercentText(percent)]);\n });\n }\n };\n var updateText = function (comp, text) {\n if (comp.getSystem().isConnected()) {\n var banner = memBannerText.get(comp);\n Replacing.set(banner, [text$1(text)]);\n }\n };\n var apis = {\n updateProgress: updateProgress,\n updateText: updateText\n };\n var iconChoices = flatten([detail.icon.toArray(), detail.level.toArray(), detail.level.bind(function (level) {\n return Optional.from(notificationIconMap[level]);\n }).toArray()]);\n var memButton = record(Button.sketch({\n dom: {\n tag: 'button',\n classes: ['tox-notification__dismiss', 'tox-button', 'tox-button--naked', 'tox-button--icon']\n },\n components: [render$3('close', {\n tag: 'div',\n classes: ['tox-icon'],\n attributes: {\n 'aria-label': detail.translationProvider('Close')\n }\n }, detail.iconProvider)],\n action: function (comp) {\n detail.onAction(comp);\n }\n }));\n var notificationIconSpec = renderFirst(iconChoices, {\n tag: 'div',\n classes: ['tox-notification__icon']\n }, detail.iconProvider);\n var notificationBodySpec = {\n dom: {\n tag: 'div',\n classes: ['tox-notification__body']\n },\n components: [memBannerText.asSpec()],\n behaviours: derive$1([Replacing.config({})])\n };\n var components = [notificationIconSpec, notificationBodySpec];\n return {\n uid: detail.uid,\n dom: {\n tag: 'div',\n attributes: {\n role: 'alert'\n },\n classes: detail.level.map(function (level) {\n return ['tox-notification', 'tox-notification--in', 'tox-notification--' + level];\n }).getOr(['tox-notification', 'tox-notification--in'])\n },\n behaviours: derive$1([Focusing.config({}), config('notification-events', [run$1(focusin(), function (comp) {\n memButton.getOpt(comp).each(Focusing.focus);\n })])]),\n components: components.concat(detail.progress ? [memBannerProgress.asSpec()] : []).concat(!detail.closeButton ? [] : [memButton.asSpec()]),\n apis: apis\n };\n };\n var Notification = single({\n name: 'Notification',\n factory: factory$k,\n configFields: [option('level'), required$1('progress'), required$1('icon'), required$1('onAction'), required$1('text'), required$1('iconProvider'), required$1('translationProvider'), defaultedBoolean('closeButton', true)],\n apis: {\n updateProgress: function (apis, comp, percent) {\n apis.updateProgress(comp, percent);\n },\n updateText: function (apis, comp, text) {\n apis.updateText(comp, text);\n }\n }\n });\n function NotificationManagerImpl(editor, extras, uiMothership) {\n var sharedBackstage = extras.backstage.shared;\n var getLayoutDirection = function (rel) {\n switch (rel) {\n case 'bc-bc':\n return south;\n case 'tc-tc':\n return north;\n case 'tc-bc':\n return north$2;\n case 'bc-tc':\n default:\n return south$2;\n }\n };\n var reposition = function (notifications) {\n if (notifications.length > 0) {\n each$1(notifications, function (notification, index) {\n if (index === 0) {\n notification.moveRel(null, 'banner');\n } else {\n notification.moveRel(notifications[index - 1].getEl(), 'bc-tc');\n }\n });\n }\n };\n var open = function (settings, closeCallback) {\n var hideCloseButton = !settings.closeButton && settings.timeout && (settings.timeout > 0 || settings.timeout < 0);\n var close = function () {\n closeCallback();\n InlineView.hide(notificationWrapper);\n };\n var notification = build$1(Notification.sketch({\n text: settings.text,\n level: contains$2(['success', 'error', 'warning', 'warn', 'info'], settings.type) ? settings.type : undefined,\n progress: settings.progressBar === true,\n icon: Optional.from(settings.icon),\n closeButton: !hideCloseButton,\n onAction: close,\n iconProvider: sharedBackstage.providers.icons,\n translationProvider: sharedBackstage.providers.translate\n }));\n var notificationWrapper = build$1(InlineView.sketch(__assign({\n dom: {\n tag: 'div',\n classes: ['tox-notifications-container']\n },\n lazySink: sharedBackstage.getSink,\n fireDismissalEventInstead: {}\n }, sharedBackstage.header.isPositionedAtTop() ? {} : {\n fireRepositionEventInstead: {}\n })));\n uiMothership.add(notificationWrapper);\n if (settings.timeout > 0) {\n global$f.setTimeout(function () {\n close();\n }, settings.timeout);\n }\n var getBounds = function () {\n var contentArea = box$1(SugarElement.fromDom(editor.getContentAreaContainer()));\n var win$1 = win();\n var x = clamp$1(win$1.x, contentArea.x, contentArea.right);\n var y = clamp$1(win$1.y, contentArea.y, contentArea.bottom);\n var right = Math.max(contentArea.right, win$1.right);\n var bottom = Math.max(contentArea.bottom, win$1.bottom);\n return Optional.some(bounds(x, y, right - x, bottom - y));\n };\n return {\n close: close,\n moveTo: function (x, y) {\n InlineView.showAt(notificationWrapper, premade(notification), {\n anchor: {\n type: 'makeshift',\n x: x,\n y: y\n }\n });\n },\n moveRel: function (element, rel) {\n var notificationSpec = premade(notification);\n var anchorOverrides = {\n maxHeightFunction: expandable$1()\n };\n if (rel !== 'banner' && isNonNullable(element)) {\n var layoutDirection_1 = getLayoutDirection(rel);\n var nodeAnchor = {\n type: 'node',\n root: body(),\n node: Optional.some(SugarElement.fromDom(element)),\n overrides: anchorOverrides,\n layouts: {\n onRtl: function () {\n return [layoutDirection_1];\n },\n onLtr: function () {\n return [layoutDirection_1];\n }\n }\n };\n InlineView.showWithinBounds(notificationWrapper, notificationSpec, {\n anchor: nodeAnchor\n }, getBounds);\n } else {\n var anchor = __assign(__assign({}, sharedBackstage.anchors.banner()), {\n overrides: anchorOverrides\n });\n InlineView.showWithinBounds(notificationWrapper, notificationSpec, {\n anchor: anchor\n }, getBounds);\n }\n },\n text: function (nuText) {\n Notification.updateText(notification, nuText);\n },\n settings: settings,\n getEl: function () {\n return notification.element.dom;\n },\n progressBar: {\n value: function (percent) {\n Notification.updateProgress(notification, percent);\n }\n }\n };\n };\n var close = function (notification) {\n notification.close();\n };\n var getArgs = function (notification) {\n return notification.settings;\n };\n return {\n open: open,\n close: close,\n reposition: reposition,\n getArgs: getArgs\n };\n }\n var first = function (fn, rate) {\n var timer = null;\n var cancel = function () {\n if (!isNull(timer)) {\n clearTimeout(timer);\n timer = null;\n }\n };\n var throttle = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (isNull(timer)) {\n timer = setTimeout(function () {\n timer = null;\n fn.apply(null, args);\n }, rate);\n }\n };\n return {\n cancel: cancel,\n throttle: throttle\n };\n };\n var last = function (fn, rate) {\n var timer = null;\n var cancel = function () {\n if (!isNull(timer)) {\n clearTimeout(timer);\n timer = null;\n }\n };\n var throttle = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n cancel();\n timer = setTimeout(function () {\n timer = null;\n fn.apply(null, args);\n }, rate);\n };\n return {\n cancel: cancel,\n throttle: throttle\n };\n };\n var global$d = tinymce.util.Tools.resolve('tinymce.dom.TextSeeker');\n var isBoundary = function (dom, node) {\n return dom.isBlock(node) || contains$2(['BR', 'IMG', 'HR', 'INPUT'], node.nodeName) || dom.getContentEditable(node) === 'false';\n };\n var repeatLeft = function (dom, node, offset, process, rootNode) {\n var search = global$d(dom, function (node) {\n return isBoundary(dom, node);\n });\n return Optional.from(search.backwards(node, offset, process, rootNode));\n };\n var autocompleteSelector = '[data-mce-autocompleter]';\n var create$4 = function (editor, range) {\n return detect(SugarElement.fromDom(editor.selection.getNode())).getOrThunk(function () {\n var wrapper = SugarElement.fromHtml('', editor.getDoc());\n append$2(wrapper, SugarElement.fromDom(range.extractContents()));\n range.insertNode(wrapper.dom);\n parent(wrapper).each(function (elm) {\n return elm.dom.normalize();\n });\n last$1(wrapper).map(function (last) {\n editor.selection.setCursorLocation(last.dom, getEnd(last));\n });\n return wrapper;\n });\n };\n var detect = function (elm) {\n return closest$1(elm, autocompleteSelector);\n };\n var isValidTextRange = function (rng) {\n return rng.collapsed && rng.startContainer.nodeType === 3;\n };\n var getText = function (rng) {\n return rng.toString().replace(/\\u00A0/g, ' ').replace(/\\uFEFF/g, '');\n };\n var isWhitespace = function (chr) {\n return chr !== '' && ' \\xA0\\f\\n\\r\\t\\x0B'.indexOf(chr) !== -1;\n };\n var stripTriggerChar = function (text, triggerCh) {\n return text.substring(triggerCh.length);\n };\n var findChar = function (text, index, ch) {\n var i;\n for (i = index - 1; i >= 0; i--) {\n var char = text.charAt(i);\n if (isWhitespace(char)) {\n return Optional.none();\n }\n if (char === ch) {\n break;\n }\n }\n return Optional.some(i);\n };\n var findStart = function (dom, initRange, ch, minChars) {\n if (minChars === void 0) {\n minChars = 0;\n }\n if (!isValidTextRange(initRange)) {\n return Optional.none();\n }\n var findTriggerChIndex = function (element, offset, text) {\n return findChar(text, offset, ch).getOr(offset);\n };\n var root = dom.getParent(initRange.startContainer, dom.isBlock) || dom.getRoot();\n return repeatLeft(dom, initRange.startContainer, initRange.startOffset, findTriggerChIndex, root).bind(function (spot) {\n var range = initRange.cloneRange();\n range.setStart(spot.container, spot.offset);\n range.setEnd(initRange.endContainer, initRange.endOffset);\n if (range.collapsed) {\n return Optional.none();\n }\n var text = getText(range);\n var triggerCharIndex = text.lastIndexOf(ch);\n if (triggerCharIndex !== 0 || stripTriggerChar(text, ch).length < minChars) {\n return Optional.none();\n } else {\n return Optional.some({\n text: stripTriggerChar(text, ch),\n range: range,\n triggerChar: ch\n });\n }\n });\n };\n var getContext = function (dom, initRange, ch, minChars) {\n if (minChars === void 0) {\n minChars = 0;\n }\n return detect(SugarElement.fromDom(initRange.startContainer)).fold(function () {\n return findStart(dom, initRange, ch, minChars);\n }, function (elm) {\n var range = dom.createRng();\n range.selectNode(elm.dom);\n var text = getText(range);\n return Optional.some({\n range: range,\n text: stripTriggerChar(text, ch),\n triggerChar: ch\n });\n });\n };\n var setup$e = function (api, editor) {\n editor.on('keypress compositionend', api.onKeypress.throttle);\n editor.on('remove', api.onKeypress.cancel);\n var redirectKeyToItem = function (item, e) {\n emitWith(item, keydown(), {\n raw: e\n });\n };\n editor.on('keydown', function (e) {\n var getItem = function () {\n return api.getView().bind(Highlighting.getHighlighted);\n };\n if (e.which === 8) {\n api.onKeypress.throttle(e);\n }\n if (api.isActive()) {\n if (e.which === 27) {\n api.cancelIfNecessary();\n }\n if (api.isMenuOpen()) {\n if (e.which === 13) {\n getItem().each(emitExecute);\n e.preventDefault();\n } else if (e.which === 40) {\n getItem().fold(function () {\n api.getView().each(Highlighting.highlightFirst);\n }, function (item) {\n redirectKeyToItem(item, e);\n });\n e.preventDefault();\n e.stopImmediatePropagation();\n } else if (e.which === 37 || e.which === 38 || e.which === 39) {\n getItem().each(function (item) {\n redirectKeyToItem(item, e);\n e.preventDefault();\n e.stopImmediatePropagation();\n });\n }\n } else {\n if (e.which === 13 || e.which === 38 || e.which === 40) {\n api.cancelIfNecessary();\n }\n }\n }\n });\n editor.on('NodeChange', function (e) {\n if (api.isActive() && !api.isProcessingAction() && detect(SugarElement.fromDom(e.element)).isNone()) {\n api.cancelIfNecessary();\n }\n });\n };\n var AutocompleterEditorEvents = {\n setup: setup$e\n };\n var global$c = tinymce.util.Tools.resolve('tinymce.util.Promise');\n var point = function (container, offset) {\n return {\n container: container,\n offset: offset\n };\n };\n var isText = function (node) {\n return node.nodeType === TEXT;\n };\n var isElement$1 = function (node) {\n return node.nodeType === ELEMENT;\n };\n var toLast = function (node) {\n if (isText(node)) {\n return point(node, node.data.length);\n } else {\n var children = node.childNodes;\n return children.length > 0 ? toLast(children[children.length - 1]) : point(node, children.length);\n }\n };\n var toLeaf = function (node, offset) {\n var children = node.childNodes;\n if (children.length > 0 && offset < children.length) {\n return toLeaf(children[offset], 0);\n } else if (children.length > 0 && isElement$1(node) && children.length === offset) {\n return toLast(children[children.length - 1]);\n } else {\n return point(node, offset);\n }\n };\n var isPreviousCharContent = function (dom, leaf) {\n return repeatLeft(dom, leaf.container, leaf.offset, function (element, offset) {\n return offset === 0 ? -1 : offset;\n }, dom.getRoot()).filter(function (spot) {\n var char = spot.container.data.charAt(spot.offset - 1);\n return !isWhitespace(char);\n }).isSome();\n };\n var isStartOfWord = function (dom) {\n return function (rng) {\n var leaf = toLeaf(rng.startContainer, rng.startOffset);\n return !isPreviousCharContent(dom, leaf);\n };\n };\n var getTriggerContext = function (dom, initRange, database) {\n return findMap(database.triggerChars, function (ch) {\n return getContext(dom, initRange, ch);\n });\n };\n var lookup$2 = function (editor, getDatabase) {\n var database = getDatabase();\n var rng = editor.selection.getRng();\n return getTriggerContext(editor.dom, rng, database).bind(function (context) {\n return lookupWithContext(editor, getDatabase, context);\n });\n };\n var lookupWithContext = function (editor, getDatabase, context, fetchOptions) {\n if (fetchOptions === void 0) {\n fetchOptions = {};\n }\n var database = getDatabase();\n var rng = editor.selection.getRng();\n var startText = rng.startContainer.nodeValue;\n var autocompleters = filter$2(database.lookupByChar(context.triggerChar), function (autocompleter) {\n return context.text.length >= autocompleter.minChars && autocompleter.matches.getOrThunk(function () {\n return isStartOfWord(editor.dom);\n })(context.range, startText, context.text);\n });\n if (autocompleters.length === 0) {\n return Optional.none();\n }\n var lookupData = global$c.all(map$2(autocompleters, function (ac) {\n var fetchResult = ac.fetch(context.text, ac.maxResults, fetchOptions);\n return fetchResult.then(function (results) {\n return {\n matchText: context.text,\n items: results,\n columns: ac.columns,\n onAction: ac.onAction,\n highlightOn: ac.highlightOn\n };\n });\n }));\n return Optional.some({\n lookupData: lookupData,\n context: context\n });\n };\n var separatorMenuItemSchema = objOf([requiredString('type'), optionString('text')]);\n var createSeparatorMenuItem = function (spec) {\n return asRaw('separatormenuitem', separatorMenuItemSchema, spec);\n };\n var autocompleterItemSchema = objOf([defaulted('type', 'autocompleteitem'), defaulted('active', false), defaulted('disabled', false), defaulted('meta', {}), requiredString('value'), optionString('text'), optionString('icon')]);\n var autocompleterSchema = objOf([requiredString('type'), requiredString('ch'), defaultedNumber('minChars', 1), defaulted('columns', 1), defaultedNumber('maxResults', 10), optionFunction('matches'), requiredFunction('fetch'), requiredFunction('onAction'), defaultedArrayOf('highlightOn', [], string)]);\n var createSeparatorItem = function (spec) {\n return asRaw('Autocompleter.Separator', separatorMenuItemSchema, spec);\n };\n var createAutocompleterItem = function (spec) {\n return asRaw('Autocompleter.Item', autocompleterItemSchema, spec);\n };\n var createAutocompleter = function (spec) {\n return asRaw('Autocompleter', autocompleterSchema, spec);\n };\n var baseToolbarButtonFields = [defaultedBoolean('disabled', false), optionString('tooltip'), optionString('icon'), optionString('text'), defaultedFunction('onSetup', function () {\n return noop;\n })];\n var toolbarButtonSchema = objOf([requiredString('type'), requiredFunction('onAction')].concat(baseToolbarButtonFields));\n var createToolbarButton = function (spec) {\n return asRaw('toolbarbutton', toolbarButtonSchema, spec);\n };\n var baseToolbarToggleButtonFields = [defaultedBoolean('active', false)].concat(baseToolbarButtonFields);\n var toggleButtonSchema = objOf(baseToolbarToggleButtonFields.concat([requiredString('type'), requiredFunction('onAction')]));\n var createToggleButton = function (spec) {\n return asRaw('ToggleButton', toggleButtonSchema, spec);\n };\n var contextBarFields = [defaultedFunction('predicate', never), defaultedStringEnum('scope', 'node', ['node', 'editor']), defaultedStringEnum('position', 'selection', ['node', 'selection', 'line'])];\n var contextButtonFields = baseToolbarButtonFields.concat([defaulted('type', 'contextformbutton'), defaulted('primary', false), requiredFunction('onAction'), customField('original', identity$1)]);\n var contextToggleButtonFields = baseToolbarToggleButtonFields.concat([defaulted('type', 'contextformbutton'), defaulted('primary', false), requiredFunction('onAction'), customField('original', identity$1)]);\n var launchButtonFields = baseToolbarButtonFields.concat([defaulted('type', 'contextformbutton')]);\n var launchToggleButtonFields = baseToolbarToggleButtonFields.concat([defaulted('type', 'contextformtogglebutton')]);\n var toggleOrNormal = choose$1('type', {\n contextformbutton: contextButtonFields,\n contextformtogglebutton: contextToggleButtonFields\n });\n var contextFormSchema = objOf([defaulted('type', 'contextform'), defaultedFunction('initValue', constant$1('')), optionString('label'), requiredArrayOf('commands', toggleOrNormal), optionOf('launch', choose$1('type', {\n contextformbutton: launchButtonFields,\n contextformtogglebutton: launchToggleButtonFields\n }))].concat(contextBarFields));\n var createContextForm = function (spec) {\n return asRaw('ContextForm', contextFormSchema, spec);\n };\n var contextToolbarSchema = objOf([defaulted('type', 'contexttoolbar'), requiredString('items')].concat(contextBarFields));\n var createContextToolbar = function (spec) {\n return asRaw('ContextToolbar', contextToolbarSchema, spec);\n };\n var stringArray = function (a) {\n var all = {};\n each$1(a, function (key) {\n all[key] = {};\n });\n return keys(all);\n };\n var register$b = function (editor) {\n var popups = editor.ui.registry.getAll().popups;\n var dataset = map$1(popups, function (popup) {\n return createAutocompleter(popup).fold(function (err) {\n throw new Error(formatError(err));\n }, identity$1);\n });\n var triggerChars = stringArray(mapToArray(dataset, function (v) {\n return v.ch;\n }));\n var datasetValues = values(dataset);\n var lookupByChar = function (ch) {\n return filter$2(datasetValues, function (dv) {\n return dv.ch === ch;\n });\n };\n return {\n dataset: dataset,\n triggerChars: triggerChars,\n lookupByChar: lookupByChar\n };\n };\n var ItemResponse = /*#__PURE__*/function (ItemResponse) {\n ItemResponse[ItemResponse['CLOSE_ON_EXECUTE'] = 0] = 'CLOSE_ON_EXECUTE';\n ItemResponse[ItemResponse['BUBBLE_TO_SANDBOX'] = 1] = 'BUBBLE_TO_SANDBOX';\n return ItemResponse;\n }(ItemResponse || {});\n var ItemResponse$1 = ItemResponse;\n var navClass = 'tox-menu-nav__js';\n var selectableClass = 'tox-collection__item';\n var colorClass = 'tox-swatch';\n var presetClasses = {\n normal: navClass,\n color: colorClass\n };\n var tickedClass = 'tox-collection__item--enabled';\n var groupHeadingClass = 'tox-collection__group-heading';\n var iconClass = 'tox-collection__item-icon';\n var textClass = 'tox-collection__item-label';\n var accessoryClass = 'tox-collection__item-accessory';\n var caretClass = 'tox-collection__item-caret';\n var checkmarkClass = 'tox-collection__item-checkmark';\n var activeClass = 'tox-collection__item--active';\n var containerClass = 'tox-collection__item-container';\n var containerColumnClass = 'tox-collection__item-container--column';\n var containerRowClass = 'tox-collection__item-container--row';\n var containerAlignRightClass = 'tox-collection__item-container--align-right';\n var containerAlignLeftClass = 'tox-collection__item-container--align-left';\n var containerValignTopClass = 'tox-collection__item-container--valign-top';\n var containerValignMiddleClass = 'tox-collection__item-container--valign-middle';\n var containerValignBottomClass = 'tox-collection__item-container--valign-bottom';\n var classForPreset = function (presets) {\n return get$e(presetClasses, presets).getOr(navClass);\n };\n var forMenu = function (presets) {\n if (presets === 'color') {\n return 'tox-swatches';\n } else {\n return 'tox-menu';\n }\n };\n var classes = function (presets) {\n return {\n backgroundMenu: 'tox-background-menu',\n selectedMenu: 'tox-selected-menu',\n selectedItem: 'tox-collection__item--active',\n hasIcons: 'tox-menu--has-icons',\n menu: forMenu(presets),\n tieredMenu: 'tox-tiered-menu'\n };\n };\n var markers = function (presets) {\n var menuClasses = classes(presets);\n return {\n backgroundMenu: menuClasses.backgroundMenu,\n selectedMenu: menuClasses.selectedMenu,\n menu: menuClasses.menu,\n selectedItem: menuClasses.selectedItem,\n item: classForPreset(presets)\n };\n };\n var dom$1 = function (hasIcons, columns, presets) {\n var menuClasses = classes(presets);\n return {\n tag: 'div',\n classes: flatten([[menuClasses.menu, 'tox-menu-' + columns + '-column'], hasIcons ? [menuClasses.hasIcons] : []])\n };\n };\n var components = [Menu.parts.items({})];\n var part = function (hasIcons, columns, presets) {\n var menuClasses = classes(presets);\n var d = {\n tag: 'div',\n classes: flatten([[menuClasses.tieredMenu]])\n };\n return {\n dom: d,\n markers: markers(presets)\n };\n };\n var chunk = function (rowDom, numColumns) {\n return function (items) {\n var chunks = chunk$1(items, numColumns);\n return map$2(chunks, function (c) {\n return {\n dom: rowDom,\n components: c\n };\n });\n };\n };\n var forSwatch = function (columns) {\n return {\n dom: {\n tag: 'div',\n classes: ['tox-menu', 'tox-swatches-menu']\n },\n components: [{\n dom: {\n tag: 'div',\n classes: ['tox-swatches']\n },\n components: [Menu.parts.items({\n preprocess: columns !== 'auto' ? chunk({\n tag: 'div',\n classes: ['tox-swatches__row']\n }, columns) : identity$1\n })]\n }]\n };\n };\n var forToolbar = function (columns) {\n return {\n dom: {\n tag: 'div',\n classes: ['tox-menu', 'tox-collection', 'tox-collection--toolbar', 'tox-collection--toolbar-lg']\n },\n components: [Menu.parts.items({\n preprocess: chunk({\n tag: 'div',\n classes: ['tox-collection__group']\n }, columns)\n })]\n };\n };\n var preprocessCollection = function (items, isSeparator) {\n var allSplits = [];\n var currentSplit = [];\n each$1(items, function (item, i) {\n if (isSeparator(item, i)) {\n if (currentSplit.length > 0) {\n allSplits.push(currentSplit);\n }\n currentSplit = [];\n if (has$2(item.dom, 'innerHtml')) {\n currentSplit.push(item);\n }\n } else {\n currentSplit.push(item);\n }\n });\n if (currentSplit.length > 0) {\n allSplits.push(currentSplit);\n }\n return map$2(allSplits, function (s) {\n return {\n dom: {\n tag: 'div',\n classes: ['tox-collection__group']\n },\n components: s\n };\n });\n };\n var forCollection = function (columns, initItems, _hasIcons) {\n return {\n dom: {\n tag: 'div',\n classes: ['tox-menu', 'tox-collection'].concat(columns === 1 ? ['tox-collection--list'] : ['tox-collection--grid'])\n },\n components: [Menu.parts.items({\n preprocess: function (items) {\n if (columns !== 'auto' && columns > 1) {\n return chunk({\n tag: 'div',\n classes: ['tox-collection__group']\n }, columns)(items);\n } else {\n return preprocessCollection(items, function (_item, i) {\n return initItems[i].type === 'separator';\n });\n }\n }\n })]\n };\n };\n var forHorizontalCollection = function (initItems, _hasIcons) {\n return {\n dom: {\n tag: 'div',\n classes: ['tox-collection', 'tox-collection--horizontal']\n },\n components: [Menu.parts.items({\n preprocess: function (items) {\n return preprocessCollection(items, function (_item, i) {\n return initItems[i].type === 'separator';\n });\n }\n })]\n };\n };\n var menuHasIcons = function (xs) {\n return exists(xs, function (item) {\n return 'icon' in item && item.icon !== undefined;\n });\n };\n var handleError = function (error) {\n console.error(formatError(error));\n console.log(error);\n return Optional.none();\n };\n var createHorizontalPartialMenuWithAlloyItems = function (value, _hasIcons, items, _columns, _presets) {\n var structure = forHorizontalCollection(items);\n return {\n value: value,\n dom: structure.dom,\n components: structure.components,\n items: items\n };\n };\n var createPartialMenuWithAlloyItems = function (value, hasIcons, items, columns, presets) {\n if (presets === 'color') {\n var structure = forSwatch(columns);\n return {\n value: value,\n dom: structure.dom,\n components: structure.components,\n items: items\n };\n }\n if (presets === 'normal' && columns === 'auto') {\n var structure = forCollection(columns, items);\n return {\n value: value,\n dom: structure.dom,\n components: structure.components,\n items: items\n };\n }\n if (presets === 'normal' && columns === 1) {\n var structure = forCollection(1, items);\n return {\n value: value,\n dom: structure.dom,\n components: structure.components,\n items: items\n };\n }\n if (presets === 'normal') {\n var structure = forCollection(columns, items);\n return {\n value: value,\n dom: structure.dom,\n components: structure.components,\n items: items\n };\n }\n if (presets === 'listpreview' && columns !== 'auto') {\n var structure = forToolbar(columns);\n return {\n value: value,\n dom: structure.dom,\n components: structure.components,\n items: items\n };\n }\n return {\n value: value,\n dom: dom$1(hasIcons, columns, presets),\n components: components,\n items: items\n };\n };\n var cardImageFields = [requiredString('type'), requiredString('src'), optionString('alt'), defaultedArrayOf('classes', [], string)];\n var cardImageSchema = objOf(cardImageFields);\n var cardTextFields = [requiredString('type'), requiredString('text'), optionString('name'), defaultedArrayOf('classes', ['tox-collection__item-label'], string)];\n var cardTextSchema = objOf(cardTextFields);\n var itemSchema$1 = valueThunk(function () {\n return choose$2('type', {\n cardimage: cardImageSchema,\n cardtext: cardTextSchema,\n cardcontainer: cardContainerSchema\n });\n });\n var cardContainerSchema = objOf([requiredString('type'), defaultedString('direction', 'horizontal'), defaultedString('align', 'left'), defaultedString('valign', 'middle'), requiredArrayOf('items', itemSchema$1)]);\n var commonMenuItemFields = [defaultedBoolean('disabled', false), optionString('text'), optionString('shortcut'), field$1('value', 'value', defaultedThunk(function () {\n return generate$6('menuitem-value');\n }), anyValue()), defaulted('meta', {})];\n var cardMenuItemSchema = objOf([requiredString('type'), optionString('label'), requiredArrayOf('items', itemSchema$1), defaultedFunction('onSetup', function () {\n return noop;\n }), defaultedFunction('onAction', noop)].concat(commonMenuItemFields));\n var createCardMenuItem = function (spec) {\n return asRaw('cardmenuitem', cardMenuItemSchema, spec);\n };\n var choiceMenuItemSchema = objOf([requiredString('type'), defaultedBoolean('active', false), optionString('icon')].concat(commonMenuItemFields));\n var createChoiceMenuItem = function (spec) {\n return asRaw('choicemenuitem', choiceMenuItemSchema, spec);\n };\n var baseFields = [requiredString('type'), requiredString('fancytype'), defaultedFunction('onAction', noop)];\n var insertTableFields = [defaulted('initData', {})].concat(baseFields);\n var colorSwatchFields = [defaultedObjOf('initData', {}, [defaultedBoolean('allowCustomColors', true), optionArrayOf('colors', anyValue())])].concat(baseFields);\n var fancyMenuItemSchema = choose$1('fancytype', {\n inserttable: insertTableFields,\n colorswatch: colorSwatchFields\n });\n var createFancyMenuItem = function (spec) {\n return asRaw('fancymenuitem', fancyMenuItemSchema, spec);\n };\n var menuItemSchema = objOf([requiredString('type'), defaultedFunction('onSetup', function () {\n return noop;\n }), defaultedFunction('onAction', noop), optionString('icon')].concat(commonMenuItemFields));\n var createMenuItem = function (spec) {\n return asRaw('menuitem', menuItemSchema, spec);\n };\n var nestedMenuItemSchema = objOf([requiredString('type'), requiredFunction('getSubmenuItems'), defaultedFunction('onSetup', function () {\n return noop;\n }), optionString('icon')].concat(commonMenuItemFields));\n var createNestedMenuItem = function (spec) {\n return asRaw('nestedmenuitem', nestedMenuItemSchema, spec);\n };\n var toggleMenuItemSchema = objOf([requiredString('type'), optionString('icon'), defaultedBoolean('active', false), defaultedFunction('onSetup', function () {\n return noop;\n }), requiredFunction('onAction')].concat(commonMenuItemFields));\n var createToggleMenuItem = function (spec) {\n return asRaw('togglemenuitem', toggleMenuItemSchema, spec);\n };\n var detectSize = function (comp, margin, selectorClass) {\n var descendants$1 = descendants(comp.element, '.' + selectorClass);\n if (descendants$1.length > 0) {\n var columnLength = findIndex$1(descendants$1, function (c) {\n var thisTop = c.dom.getBoundingClientRect().top;\n var cTop = descendants$1[0].dom.getBoundingClientRect().top;\n return Math.abs(thisTop - cTop) > margin;\n }).getOr(descendants$1.length);\n return Optional.some({\n numColumns: columnLength,\n numRows: Math.ceil(descendants$1.length / columnLength)\n });\n } else {\n return Optional.none();\n }\n };\n var namedEvents = function (name, handlers) {\n return derive$1([config(name, handlers)]);\n };\n var unnamedEvents = function (handlers) {\n return namedEvents(generate$6('unnamed-events'), handlers);\n };\n var SimpleBehaviours = {\n namedEvents: namedEvents,\n unnamedEvents: unnamedEvents\n };\n var ExclusivityChannel = generate$6('tooltip.exclusive');\n var ShowTooltipEvent = generate$6('tooltip.show');\n var HideTooltipEvent = generate$6('tooltip.hide');\n var hideAllExclusive = function (component, _tConfig, _tState) {\n component.getSystem().broadcastOn([ExclusivityChannel], {});\n };\n var setComponents = function (component, tConfig, tState, specs) {\n tState.getTooltip().each(function (tooltip) {\n if (tooltip.getSystem().isConnected()) {\n Replacing.set(tooltip, specs);\n }\n });\n };\n var TooltippingApis = /*#__PURE__*/Object.freeze({\n __proto__: null,\n hideAllExclusive: hideAllExclusive,\n setComponents: setComponents\n });\n var events$9 = function (tooltipConfig, state) {\n var hide = function (comp) {\n state.getTooltip().each(function (p) {\n detach(p);\n tooltipConfig.onHide(comp, p);\n state.clearTooltip();\n });\n state.clearTimer();\n };\n var show = function (comp) {\n if (!state.isShowing()) {\n hideAllExclusive(comp);\n var sink = tooltipConfig.lazySink(comp).getOrDie();\n var popup = comp.getSystem().build({\n dom: tooltipConfig.tooltipDom,\n components: tooltipConfig.tooltipComponents,\n events: derive$2(tooltipConfig.mode === 'normal' ? [run$1(mouseover(), function (_) {\n emit(comp, ShowTooltipEvent);\n }), run$1(mouseout(), function (_) {\n emit(comp, HideTooltipEvent);\n })] : []),\n behaviours: derive$1([Replacing.config({})])\n });\n state.setTooltip(popup);\n attach(sink, popup);\n tooltipConfig.onShow(comp, popup);\n Positioning.position(sink, popup, {\n anchor: tooltipConfig.anchor(comp)\n });\n }\n };\n return derive$2(flatten([[run$1(ShowTooltipEvent, function (comp) {\n state.resetTimer(function () {\n show(comp);\n }, tooltipConfig.delay);\n }), run$1(HideTooltipEvent, function (comp) {\n state.resetTimer(function () {\n hide(comp);\n }, tooltipConfig.delay);\n }), run$1(receive(), function (comp, message) {\n var receivingData = message;\n if (!receivingData.universal) {\n if (contains$2(receivingData.channels, ExclusivityChannel)) {\n hide(comp);\n }\n }\n }), runOnDetached(function (comp) {\n hide(comp);\n })], tooltipConfig.mode === 'normal' ? [run$1(focusin(), function (comp) {\n emit(comp, ShowTooltipEvent);\n }), run$1(postBlur(), function (comp) {\n emit(comp, HideTooltipEvent);\n }), run$1(mouseover(), function (comp) {\n emit(comp, ShowTooltipEvent);\n }), run$1(mouseout(), function (comp) {\n emit(comp, HideTooltipEvent);\n })] : [run$1(highlight$1(), function (comp, _se) {\n emit(comp, ShowTooltipEvent);\n }), run$1(dehighlight$1(), function (comp) {\n emit(comp, HideTooltipEvent);\n })]]));\n };\n var ActiveTooltipping = /*#__PURE__*/Object.freeze({\n __proto__: null,\n events: events$9\n });\n var TooltippingSchema = [required$1('lazySink'), required$1('tooltipDom'), defaulted('exclusive', true), defaulted('tooltipComponents', []), defaulted('delay', 300), defaultedStringEnum('mode', 'normal', ['normal', 'follow-highlight']), defaulted('anchor', function (comp) {\n return {\n type: 'hotspot',\n hotspot: comp,\n layouts: {\n onLtr: constant$1([south$2, north$2, southeast$2, northeast$2, southwest$2, northwest$2]),\n onRtl: constant$1([south$2, north$2, southeast$2, northeast$2, southwest$2, northwest$2])\n }\n };\n }), onHandler('onHide'), onHandler('onShow')];\n var init$b = function () {\n var timer = value$1();\n var popup = value$1();\n var clearTimer = function () {\n timer.on(clearTimeout);\n };\n var resetTimer = function (f, delay) {\n clearTimer();\n timer.set(setTimeout(f, delay));\n };\n var readState = constant$1('not-implemented');\n return nu$8({\n getTooltip: popup.get,\n isShowing: popup.isSet,\n setTooltip: popup.set,\n clearTooltip: popup.clear,\n clearTimer: clearTimer,\n resetTimer: resetTimer,\n readState: readState\n });\n };\n var TooltippingState = /*#__PURE__*/Object.freeze({\n __proto__: null,\n init: init$b\n });\n var Tooltipping = create$8({\n fields: TooltippingSchema,\n name: 'tooltipping',\n active: ActiveTooltipping,\n state: TooltippingState,\n apis: TooltippingApis\n });\n var escape = function (text) {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n };\n var global$b = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');\n var global$a = tinymce.util.Tools.resolve('tinymce.EditorManager');\n var getSkinUrl = function (editor) {\n var skin = editor.getParam('skin');\n var skinUrl = editor.getParam('skin_url');\n if (skin !== false) {\n var skinName = skin ? skin : 'oxide';\n if (skinUrl) {\n skinUrl = editor.documentBaseURI.toAbsolute(skinUrl);\n } else {\n skinUrl = global$a.baseURL + '/skins/ui/' + skinName;\n }\n }\n return skinUrl;\n };\n var isReadOnly = function (editor) {\n return editor.getParam('readonly', false, 'boolean');\n };\n var isSkinDisabled = function (editor) {\n return editor.getParam('skin') === false;\n };\n var getHeightSetting = function (editor) {\n return editor.getParam('height', Math.max(editor.getElement().offsetHeight, 200));\n };\n var getWidthSetting = function (editor) {\n return editor.getParam('width', global$b.DOM.getStyle(editor.getElement(), 'width'));\n };\n var getMinWidthSetting = function (editor) {\n return Optional.from(editor.getParam('min_width')).filter(isNumber);\n };\n var getMinHeightSetting = function (editor) {\n return Optional.from(editor.getParam('min_height')).filter(isNumber);\n };\n var getMaxWidthSetting = function (editor) {\n return Optional.from(editor.getParam('max_width')).filter(isNumber);\n };\n var getMaxHeightSetting = function (editor) {\n return Optional.from(editor.getParam('max_height')).filter(isNumber);\n };\n var getUserStyleFormats = function (editor) {\n return Optional.from(editor.getParam('style_formats')).filter(isArray);\n };\n var isMergeStyleFormats = function (editor) {\n return editor.getParam('style_formats_merge', false, 'boolean');\n };\n var getLineHeightFormats = function (editor) {\n return editor.getParam('lineheight_formats', '1 1.1 1.2 1.3 1.4 1.5 2', 'string').split(' ');\n };\n var getContentLanguages = function (editor) {\n return editor.getParam('content_langs', undefined, 'array');\n };\n var getRemovedMenuItems = function (editor) {\n return editor.getParam('removed_menuitems', '');\n };\n var isMenubarEnabled = function (editor) {\n return editor.getParam('menubar', true, 'boolean') !== false;\n };\n var isToolbarEnabled = function (editor) {\n var toolbar = editor.getParam('toolbar', true);\n var isToolbarTrue = toolbar === true;\n var isToolbarString = isString(toolbar);\n var isToolbarObjectArray = isArray(toolbar) && toolbar.length > 0;\n return !isMultipleToolbars(editor) && (isToolbarObjectArray || isToolbarString || isToolbarTrue);\n };\n var getMultipleToolbarsSetting = function (editor) {\n var toolbars = range$2(9, function (num) {\n return editor.getParam('toolbar' + (num + 1), false, 'string');\n });\n var toolbarArray = filter$2(toolbars, function (toolbar) {\n return typeof toolbar === 'string';\n });\n return toolbarArray.length > 0 ? Optional.some(toolbarArray) : Optional.none();\n };\n var isMultipleToolbars = function (editor) {\n return getMultipleToolbarsSetting(editor).fold(function () {\n var toolbar = editor.getParam('toolbar', [], 'string[]');\n return toolbar.length > 0;\n }, always);\n };\n var ToolbarMode = /*#__PURE__*/function (ToolbarMode) {\n ToolbarMode['default'] = 'wrap';\n ToolbarMode['floating'] = 'floating';\n ToolbarMode['sliding'] = 'sliding';\n ToolbarMode['scrolling'] = 'scrolling';\n return ToolbarMode;\n }(ToolbarMode || {});\n var getToolbarMode = function (editor) {\n return editor.getParam('toolbar_mode', '', 'string');\n };\n var ToolbarLocation = /*#__PURE__*/function (ToolbarLocation) {\n ToolbarLocation['auto'] = 'auto';\n ToolbarLocation['top'] = 'top';\n ToolbarLocation['bottom'] = 'bottom';\n return ToolbarLocation;\n }(ToolbarLocation || {});\n var getToolbarGroups = function (editor) {\n return editor.getParam('toolbar_groups', {}, 'object');\n };\n var getToolbarLocation = function (editor) {\n return editor.getParam('toolbar_location', ToolbarLocation.auto, 'string');\n };\n var isToolbarLocationBottom = function (editor) {\n return getToolbarLocation(editor) === ToolbarLocation.bottom;\n };\n var fixedContainerSelector = function (editor) {\n return editor.getParam('fixed_toolbar_container', '', 'string');\n };\n var fixedToolbarContainerTarget = function (editor) {\n return editor.getParam('fixed_toolbar_container_target');\n };\n var isToolbarPersist = function (editor) {\n return editor.getParam('toolbar_persist', false, 'boolean');\n };\n var fixedContainerTarget = function (editor) {\n if (!editor.inline) {\n return Optional.none();\n }\n var selector = fixedContainerSelector(editor);\n if (selector.length > 0) {\n return descendant(body(), selector);\n }\n var element = fixedToolbarContainerTarget(editor);\n if (isNonNullable(element)) {\n return Optional.some(SugarElement.fromDom(element));\n }\n return Optional.none();\n };\n var useFixedContainer = function (editor) {\n return editor.inline && fixedContainerTarget(editor).isSome();\n };\n var getUiContainer = function (editor) {\n var fixedContainer = fixedContainerTarget(editor);\n return fixedContainer.getOrThunk(function () {\n return getContentContainer(getRootNode(SugarElement.fromDom(editor.getElement())));\n });\n };\n var isDistractionFree = function (editor) {\n return editor.inline && !isMenubarEnabled(editor) && !isToolbarEnabled(editor) && !isMultipleToolbars(editor);\n };\n var isStickyToolbar = function (editor) {\n var isStickyToolbar = editor.getParam('toolbar_sticky', false, 'boolean');\n return (isStickyToolbar || editor.inline) && !useFixedContainer(editor) && !isDistractionFree(editor);\n };\n var getStickyToolbarOffset = function (editor) {\n return editor.getParam('toolbar_sticky_offset', 0, 'number');\n };\n var isDraggableModal$1 = function (editor) {\n return editor.getParam('draggable_modal', false, 'boolean');\n };\n var getMenus = function (editor) {\n var menu = editor.getParam('menu');\n if (menu) {\n return map$1(menu, function (menu) {\n return __assign(__assign({}, menu), {\n items: menu.items\n });\n });\n } else {\n return {};\n }\n };\n var getMenubar = function (editor) {\n return editor.getParam('menubar');\n };\n var getToolbar = function (editor) {\n return editor.getParam('toolbar', true);\n };\n var getFilePickerCallback = function (editor) {\n return editor.getParam('file_picker_callback');\n };\n var getFilePickerTypes = function (editor) {\n return editor.getParam('file_picker_types');\n };\n var getFileBrowserCallbackTypes = function (editor) {\n return editor.getParam('file_browser_callback_types');\n };\n var noTypeaheadUrls = function (editor) {\n return editor.getParam('typeahead_urls') === false;\n };\n var getAnchorTop = function (editor) {\n return editor.getParam('anchor_top', '#top');\n };\n var getAnchorBottom = function (editor) {\n return editor.getParam('anchor_bottom', '#bottom');\n };\n var getFilePickerValidatorHandler = function (editor) {\n var handler = editor.getParam('file_picker_validator_handler', undefined, 'function');\n if (handler === undefined) {\n return editor.getParam('filepicker_validator_handler', undefined, 'function');\n } else {\n return handler;\n }\n };\n var ReadOnlyChannel = 'silver.readonly';\n var ReadOnlyDataSchema = objOf([requiredBoolean('readonly')]);\n var broadcastReadonly = function (uiComponents, readonly) {\n var outerContainer = uiComponents.outerContainer;\n var target = outerContainer.element;\n if (readonly) {\n uiComponents.mothership.broadcastOn([dismissPopups()], {\n target: target\n });\n uiComponents.uiMothership.broadcastOn([dismissPopups()], {\n target: target\n });\n }\n uiComponents.mothership.broadcastOn([ReadOnlyChannel], {\n readonly: readonly\n });\n uiComponents.uiMothership.broadcastOn([ReadOnlyChannel], {\n readonly: readonly\n });\n };\n var setupReadonlyModeSwitch = function (editor, uiComponents) {\n editor.on('init', function () {\n if (editor.mode.isReadOnly()) {\n broadcastReadonly(uiComponents, true);\n }\n });\n editor.on('SwitchMode', function () {\n return broadcastReadonly(uiComponents, editor.mode.isReadOnly());\n });\n if (isReadOnly(editor)) {\n editor.setMode('readonly');\n }\n };\n var receivingConfig = function () {\n var _a;\n return Receiving.config({\n channels: (_a = {}, _a[ReadOnlyChannel] = {\n schema: ReadOnlyDataSchema,\n onReceive: function (comp, data) {\n Disabling.set(comp, data.readonly);\n }\n }, _a)\n });\n };\n var item = function (disabled) {\n return Disabling.config({\n disabled: disabled,\n disableClass: 'tox-collection__item--state-disabled'\n });\n };\n var button = function (disabled) {\n return Disabling.config({\n disabled: disabled\n });\n };\n var splitButton = function (disabled) {\n return Disabling.config({\n disabled: disabled,\n disableClass: 'tox-tbtn--disabled'\n });\n };\n var toolbarButton = function (disabled) {\n return Disabling.config({\n disabled: disabled,\n disableClass: 'tox-tbtn--disabled',\n useNative: false\n });\n };\n var DisablingConfigs = {\n item: item,\n button: button,\n splitButton: splitButton,\n toolbarButton: toolbarButton\n };\n var runWithApi = function (info, comp) {\n var api = info.getApi(comp);\n return function (f) {\n f(api);\n };\n };\n var onControlAttached = function (info, editorOffCell) {\n return runOnAttached(function (comp) {\n var run = runWithApi(info, comp);\n run(function (api) {\n var onDestroy = info.onSetup(api);\n if (isFunction(onDestroy)) {\n editorOffCell.set(onDestroy);\n }\n });\n });\n };\n var onControlDetached = function (getApi, editorOffCell) {\n return runOnDetached(function (comp) {\n return runWithApi(getApi, comp)(editorOffCell.get());\n });\n };\n var _a$1;\n var onMenuItemExecute = function (info, itemResponse) {\n return runOnExecute$1(function (comp, simulatedEvent) {\n runWithApi(info, comp)(info.onAction);\n if (!info.triggersSubmenu && itemResponse === ItemResponse$1.CLOSE_ON_EXECUTE) {\n emit(comp, sandboxClose());\n simulatedEvent.stop();\n }\n });\n };\n var menuItemEventOrder = (_a$1 = {}, _a$1[execute$5()] = ['disabling', 'alloy.base.behaviour', 'toggling', 'item-events'], _a$1);\n var componentRenderPipeline = cat;\n var renderCommonItem = function (spec, structure, itemResponse, providersbackstage) {\n var editorOffCell = Cell(noop);\n return {\n type: 'item',\n dom: structure.dom,\n components: componentRenderPipeline(structure.optComponents),\n data: spec.data,\n eventOrder: menuItemEventOrder,\n hasSubmenu: spec.triggersSubmenu,\n itemBehaviours: derive$1([config('item-events', [onMenuItemExecute(spec, itemResponse), onControlAttached(spec, editorOffCell), onControlDetached(spec, editorOffCell)]), DisablingConfigs.item(function () {\n return spec.disabled || providersbackstage.isDisabled();\n }), receivingConfig(), Replacing.config({})].concat(spec.itemBehaviours))\n };\n };\n var buildData = function (source) {\n return {\n value: source.value,\n meta: __assign({\n text: source.text.getOr('')\n }, source.meta)\n };\n };\n var global$9 = tinymce.util.Tools.resolve('tinymce.Env');\n var convertText = function (source) {\n var mac = {\n alt: '⌥',\n ctrl: '⌃',\n shift: '⇧',\n meta: '⌘',\n access: '⌃⌥'\n };\n var other = {\n meta: 'Ctrl',\n access: 'Shift+Alt'\n };\n var replace = global$9.mac ? mac : other;\n var shortcut = source.split('+');\n var updated = map$2(shortcut, function (segment) {\n var search = segment.toLowerCase().trim();\n return has$2(replace, search) ? replace[search] : segment;\n });\n return global$9.mac ? updated.join('') : updated.join('+');\n };\n var renderIcon$1 = function (name, icons, classes) {\n if (classes === void 0) {\n classes = [iconClass];\n }\n return render$3(name, {\n tag: 'div',\n classes: classes\n }, icons);\n };\n var renderText = function (text) {\n return {\n dom: {\n tag: 'div',\n classes: [textClass]\n },\n components: [text$1(global$e.translate(text))]\n };\n };\n var renderHtml = function (html, classes) {\n return {\n dom: {\n tag: 'div',\n classes: classes,\n innerHtml: html\n }\n };\n };\n var renderStyledText = function (style, text) {\n return {\n dom: {\n tag: 'div',\n classes: [textClass]\n },\n components: [{\n dom: {\n tag: style.tag,\n styles: style.styles\n },\n components: [text$1(global$e.translate(text))]\n }]\n };\n };\n var renderShortcut = function (shortcut) {\n return {\n dom: {\n tag: 'div',\n classes: [accessoryClass],\n innerHtml: convertText(shortcut)\n }\n };\n };\n var renderCheckmark = function (icons) {\n return renderIcon$1('checkmark', icons, [checkmarkClass]);\n };\n var renderSubmenuCaret = function (icons) {\n return renderIcon$1('chevron-right', icons, [caretClass]);\n };\n var renderDownwardsCaret = function (icons) {\n return renderIcon$1('chevron-down', icons, [caretClass]);\n };\n var renderContainer = function (container, components) {\n var directionClass = container.direction === 'vertical' ? containerColumnClass : containerRowClass;\n var alignClass = container.align === 'left' ? containerAlignLeftClass : containerAlignRightClass;\n var getValignClass = function () {\n switch (container.valign) {\n case 'top':\n return containerValignTopClass;\n case 'middle':\n return containerValignMiddleClass;\n case 'bottom':\n return containerValignBottomClass;\n }\n };\n return {\n dom: {\n tag: 'div',\n classes: [containerClass, directionClass, alignClass, getValignClass()]\n },\n components: components\n };\n };\n var renderImage = function (src, classes, alt) {\n return {\n dom: {\n tag: 'img',\n classes: classes,\n attributes: {\n src: src,\n alt: alt.getOr('')\n }\n }\n };\n };\n var renderColorStructure = function (item, providerBackstage, fallbackIcon) {\n var colorPickerCommand = 'custom';\n var removeColorCommand = 'remove';\n var itemText = item.ariaLabel;\n var itemValue = item.value;\n var iconSvg = item.iconContent.map(function (name) {\n return getOr(name, providerBackstage.icons, fallbackIcon);\n });\n var getDom = function () {\n var common = colorClass;\n var icon = iconSvg.getOr('');\n var attributes = itemText.map(function (text) {\n return {\n title: providerBackstage.translate(text)\n };\n }).getOr({});\n var baseDom = {\n tag: 'div',\n attributes: attributes,\n classes: [common]\n };\n if (itemValue === colorPickerCommand) {\n return __assign(__assign({}, baseDom), {\n tag: 'button',\n classes: __spreadArray(__spreadArray([], baseDom.classes, true), ['tox-swatches__picker-btn'], false),\n innerHtml: icon\n });\n } else if (itemValue === removeColorCommand) {\n return __assign(__assign({}, baseDom), {\n classes: __spreadArray(__spreadArray([], baseDom.classes, true), ['tox-swatch--remove'], false),\n innerHtml: icon\n });\n } else {\n return __assign(__assign({}, baseDom), {\n attributes: __assign(__assign({}, baseDom.attributes), {\n 'data-mce-color': itemValue\n }),\n styles: {\n 'background-color': itemValue\n }\n });\n }\n };\n return {\n dom: getDom(),\n optComponents: []\n };\n };\n var renderItemDomStructure = function (ariaLabel) {\n var domTitle = ariaLabel.map(function (label) {\n return {\n attributes: {\n title: global$e.translate(label)\n }\n };\n }).getOr({});\n return __assign({\n tag: 'div',\n classes: [navClass, selectableClass]\n }, domTitle);\n };\n var renderNormalItemStructure = function (info, providersBackstage, renderIcons, fallbackIcon) {\n var iconSpec = {\n tag: 'div',\n classes: [iconClass]\n };\n var renderIcon = function (iconName) {\n return render$3(iconName, iconSpec, providersBackstage.icons, fallbackIcon);\n };\n var renderEmptyIcon = function () {\n return Optional.some({\n dom: iconSpec\n });\n };\n var leftIcon = renderIcons ? info.iconContent.map(renderIcon).orThunk(renderEmptyIcon) : Optional.none();\n var checkmark = info.checkMark;\n var textRender = Optional.from(info.meta).fold(function () {\n return renderText;\n }, function (meta) {\n return has$2(meta, 'style') ? curry(renderStyledText, meta.style) : renderText;\n });\n var content = info.htmlContent.fold(function () {\n return info.textContent.map(textRender);\n }, function (html) {\n return Optional.some(renderHtml(html, [textClass]));\n });\n var menuItem = {\n dom: renderItemDomStructure(info.ariaLabel),\n optComponents: [leftIcon, content, info.shortcutContent.map(renderShortcut), checkmark, info.caret]\n };\n return menuItem;\n };\n var renderItemStructure = function (info, providersBackstage, renderIcons, fallbackIcon) {\n if (fallbackIcon === void 0) {\n fallbackIcon = Optional.none();\n }\n if (info.presets === 'color') {\n return renderColorStructure(info, providersBackstage, fallbackIcon);\n } else {\n return renderNormalItemStructure(info, providersBackstage, renderIcons, fallbackIcon);\n }\n };\n var tooltipBehaviour = function (meta, sharedBackstage) {\n return get$e(meta, 'tooltipWorker').map(function (tooltipWorker) {\n return [Tooltipping.config({\n lazySink: sharedBackstage.getSink,\n tooltipDom: {\n tag: 'div',\n classes: ['tox-tooltip-worker-container']\n },\n tooltipComponents: [],\n anchor: function (comp) {\n return {\n type: 'submenu',\n item: comp,\n overrides: {\n maxHeightFunction: expandable$1\n }\n };\n },\n mode: 'follow-highlight',\n onShow: function (component, _tooltip) {\n tooltipWorker(function (elm) {\n Tooltipping.setComponents(component, [external$2({\n element: SugarElement.fromDom(elm)\n })]);\n });\n }\n })];\n }).getOr([]);\n };\n var encodeText = function (text) {\n return global$b.DOM.encode(text);\n };\n var replaceText = function (text, matchText) {\n var translated = global$e.translate(text);\n var encoded = encodeText(translated);\n if (matchText.length > 0) {\n var escapedMatchRegex = new RegExp(escape(matchText), 'gi');\n return encoded.replace(escapedMatchRegex, function (match) {\n return '' + match + '';\n });\n } else {\n return encoded;\n }\n };\n var renderAutocompleteItem = function (spec, matchText, useText, presets, onItemValueHandler, itemResponse, sharedBackstage, renderIcons) {\n if (renderIcons === void 0) {\n renderIcons = true;\n }\n var structure = renderItemStructure({\n presets: presets,\n textContent: Optional.none(),\n htmlContent: useText ? spec.text.map(function (text) {\n return replaceText(text, matchText);\n }) : Optional.none(),\n ariaLabel: spec.text,\n iconContent: spec.icon,\n shortcutContent: Optional.none(),\n checkMark: Optional.none(),\n caret: Optional.none(),\n value: spec.value\n }, sharedBackstage.providers, renderIcons, spec.icon);\n return renderCommonItem({\n data: buildData(spec),\n disabled: spec.disabled,\n getApi: constant$1({}),\n onAction: function (_api) {\n return onItemValueHandler(spec.value, spec.meta);\n },\n onSetup: constant$1(noop),\n triggersSubmenu: false,\n itemBehaviours: tooltipBehaviour(spec.meta, sharedBackstage)\n }, structure, itemResponse, sharedBackstage.providers);\n };\n var render$2 = function (items, extras) {\n return map$2(items, function (item) {\n switch (item.type) {\n case 'cardcontainer':\n return renderContainer(item, render$2(item.items, extras));\n case 'cardimage':\n return renderImage(item.src, item.classes, item.alt);\n case 'cardtext':\n var shouldHighlight = item.name.exists(function (name) {\n return contains$2(extras.cardText.highlightOn, name);\n });\n var matchText = shouldHighlight ? Optional.from(extras.cardText.matchText).getOr('') : '';\n return renderHtml(replaceText(item.text, matchText), item.classes);\n }\n });\n };\n var renderCardMenuItem = function (spec, itemResponse, sharedBackstage, extras) {\n var getApi = function (component) {\n return {\n isDisabled: function () {\n return Disabling.isDisabled(component);\n },\n setDisabled: function (state) {\n Disabling.set(component, state);\n each$1(descendants(component.element, '*'), function (elm) {\n component.getSystem().getByDom(elm).each(function (comp) {\n if (comp.hasConfigured(Disabling)) {\n Disabling.set(comp, state);\n }\n });\n });\n }\n };\n };\n var structure = {\n dom: renderItemDomStructure(spec.label),\n optComponents: [Optional.some({\n dom: {\n tag: 'div',\n classes: [containerClass, containerRowClass]\n },\n components: render$2(spec.items, extras)\n })]\n };\n return renderCommonItem({\n data: buildData(__assign({\n text: Optional.none()\n }, spec)),\n disabled: spec.disabled,\n getApi: getApi,\n onAction: spec.onAction,\n onSetup: spec.onSetup,\n triggersSubmenu: false,\n itemBehaviours: Optional.from(extras.itemBehaviours).getOr([])\n }, structure, itemResponse, sharedBackstage.providers);\n };\n var renderChoiceItem = function (spec, useText, presets, onItemValueHandler, isSelected, itemResponse, providersBackstage, renderIcons) {\n if (renderIcons === void 0) {\n renderIcons = true;\n }\n var getApi = function (component) {\n return {\n setActive: function (state) {\n Toggling.set(component, state);\n },\n isActive: function () {\n return Toggling.isOn(component);\n },\n isDisabled: function () {\n return Disabling.isDisabled(component);\n },\n setDisabled: function (state) {\n return Disabling.set(component, state);\n }\n };\n };\n var structure = renderItemStructure({\n presets: presets,\n textContent: useText ? spec.text : Optional.none(),\n htmlContent: Optional.none(),\n ariaLabel: spec.text,\n iconContent: spec.icon,\n shortcutContent: useText ? spec.shortcut : Optional.none(),\n checkMark: useText ? Optional.some(renderCheckmark(providersBackstage.icons)) : Optional.none(),\n caret: Optional.none(),\n value: spec.value\n }, providersBackstage, renderIcons);\n return deepMerge(renderCommonItem({\n data: buildData(spec),\n disabled: spec.disabled,\n getApi: getApi,\n onAction: function (_api) {\n return onItemValueHandler(spec.value);\n },\n onSetup: function (api) {\n api.setActive(isSelected);\n return noop;\n },\n triggersSubmenu: false,\n itemBehaviours: []\n }, structure, itemResponse, providersBackstage), {\n toggling: {\n toggleClass: tickedClass,\n toggleOnExecute: false,\n selected: spec.active\n }\n });\n };\n var parts$f = generate$3(owner$2(), parts$h());\n var hexColour = function (value) {\n return {\n value: value\n };\n };\n var shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n var longformRegex = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i;\n var isHexString = function (hex) {\n return shorthandRegex.test(hex) || longformRegex.test(hex);\n };\n var normalizeHex = function (hex) {\n return removeLeading(hex, '#').toUpperCase();\n };\n var fromString$1 = function (hex) {\n return isHexString(hex) ? Optional.some({\n value: normalizeHex(hex)\n }) : Optional.none();\n };\n var getLongForm = function (hex) {\n var hexString = hex.value.replace(shorthandRegex, function (m, r, g, b) {\n return r + r + g + g + b + b;\n });\n return {\n value: hexString\n };\n };\n var extractValues = function (hex) {\n var longForm = getLongForm(hex);\n var splitForm = longformRegex.exec(longForm.value);\n return splitForm === null ? ['FFFFFF', 'FF', 'FF', 'FF'] : splitForm;\n };\n var toHex = function (component) {\n var hex = component.toString(16);\n return (hex.length === 1 ? '0' + hex : hex).toUpperCase();\n };\n var fromRgba = function (rgbaColour) {\n var value = toHex(rgbaColour.red) + toHex(rgbaColour.green) + toHex(rgbaColour.blue);\n return hexColour(value);\n };\n var min = Math.min;\n var max = Math.max;\n var round$1 = Math.round;\n var rgbRegex = /^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/;\n var rgbaRegex = /^rgba\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*(\\d?(?:\\.\\d+)?)\\)/;\n var rgbaColour = function (red, green, blue, alpha) {\n return {\n red: red,\n green: green,\n blue: blue,\n alpha: alpha\n };\n };\n var isRgbaComponent = function (value) {\n var num = parseInt(value, 10);\n return num.toString() === value && num >= 0 && num <= 255;\n };\n var fromHsv = function (hsv) {\n var r;\n var g;\n var b;\n var hue = (hsv.hue || 0) % 360;\n var saturation = hsv.saturation / 100;\n var brightness = hsv.value / 100;\n saturation = max(0, min(saturation, 1));\n brightness = max(0, min(brightness, 1));\n if (saturation === 0) {\n r = g = b = round$1(255 * brightness);\n return rgbaColour(r, g, b, 1);\n }\n var side = hue / 60;\n var chroma = brightness * saturation;\n var x = chroma * (1 - Math.abs(side % 2 - 1));\n var match = brightness - chroma;\n switch (Math.floor(side)) {\n case 0:\n r = chroma;\n g = x;\n b = 0;\n break;\n case 1:\n r = x;\n g = chroma;\n b = 0;\n break;\n case 2:\n r = 0;\n g = chroma;\n b = x;\n break;\n case 3:\n r = 0;\n g = x;\n b = chroma;\n break;\n case 4:\n r = x;\n g = 0;\n b = chroma;\n break;\n case 5:\n r = chroma;\n g = 0;\n b = x;\n break;\n default:\n r = g = b = 0;\n }\n r = round$1(255 * (r + match));\n g = round$1(255 * (g + match));\n b = round$1(255 * (b + match));\n return rgbaColour(r, g, b, 1);\n };\n var fromHex = function (hexColour) {\n var result = extractValues(hexColour);\n var red = parseInt(result[1], 16);\n var green = parseInt(result[2], 16);\n var blue = parseInt(result[3], 16);\n return rgbaColour(red, green, blue, 1);\n };\n var fromStringValues = function (red, green, blue, alpha) {\n var r = parseInt(red, 10);\n var g = parseInt(green, 10);\n var b = parseInt(blue, 10);\n var a = parseFloat(alpha);\n return rgbaColour(r, g, b, a);\n };\n var fromString = function (rgbaString) {\n if (rgbaString === 'transparent') {\n return Optional.some(rgbaColour(0, 0, 0, 0));\n }\n var rgbMatch = rgbRegex.exec(rgbaString);\n if (rgbMatch !== null) {\n return Optional.some(fromStringValues(rgbMatch[1], rgbMatch[2], rgbMatch[3], '1'));\n }\n var rgbaMatch = rgbaRegex.exec(rgbaString);\n if (rgbaMatch !== null) {\n return Optional.some(fromStringValues(rgbaMatch[1], rgbaMatch[2], rgbaMatch[3], rgbaMatch[4]));\n }\n return Optional.none();\n };\n var toString = function (rgba) {\n return 'rgba(' + rgba.red + ',' + rgba.green + ',' + rgba.blue + ',' + rgba.alpha + ')';\n };\n var red = rgbaColour(255, 0, 0, 1);\n var fireSkinLoaded$1 = function (editor) {\n return editor.fire('SkinLoaded');\n };\n var fireSkinLoadError$1 = function (editor, error) {\n return editor.fire('SkinLoadError', error);\n };\n var fireResizeEditor = function (editor) {\n return editor.fire('ResizeEditor');\n };\n var fireResizeContent = function (editor, e) {\n return editor.fire('ResizeContent', e);\n };\n var fireScrollContent = function (editor, e) {\n return editor.fire('ScrollContent', e);\n };\n var fireTextColorChange = function (editor, data) {\n return editor.fire('TextColorChange', data);\n };\n var hsvColour = function (hue, saturation, value) {\n return {\n hue: hue,\n saturation: saturation,\n value: value\n };\n };\n var fromRgb = function (rgbaColour) {\n var h = 0;\n var s = 0;\n var v = 0;\n var r = rgbaColour.red / 255;\n var g = rgbaColour.green / 255;\n var b = rgbaColour.blue / 255;\n var minRGB = Math.min(r, Math.min(g, b));\n var maxRGB = Math.max(r, Math.max(g, b));\n if (minRGB === maxRGB) {\n v = minRGB;\n return hsvColour(0, 0, v * 100);\n }\n var d = r === minRGB ? g - b : b === minRGB ? r - g : b - r;\n h = r === minRGB ? 3 : b === minRGB ? 1 : 5;\n h = 60 * (h - d / (maxRGB - minRGB));\n s = (maxRGB - minRGB) / maxRGB;\n v = maxRGB;\n return hsvColour(Math.round(h), Math.round(s * 100), Math.round(v * 100));\n };\n var hexToHsv = function (hex) {\n return fromRgb(fromHex(hex));\n };\n var hsvToHex = function (hsv) {\n return fromRgba(fromHsv(hsv));\n };\n var anyToHex = function (color) {\n return fromString$1(color).orThunk(function () {\n return fromString(color).map(fromRgba);\n }).getOrThunk(function () {\n var canvas = document.createElement('canvas');\n canvas.height = 1;\n canvas.width = 1;\n var canvasContext = canvas.getContext('2d');\n canvasContext.clearRect(0, 0, canvas.width, canvas.height);\n canvasContext.fillStyle = '#FFFFFF';\n canvasContext.fillStyle = color;\n canvasContext.fillRect(0, 0, 1, 1);\n var rgba = canvasContext.getImageData(0, 0, 1, 1).data;\n var r = rgba[0];\n var g = rgba[1];\n var b = rgba[2];\n var a = rgba[3];\n return fromRgba(rgbaColour(r, g, b, a));\n });\n };\n var global$8 = tinymce.util.Tools.resolve('tinymce.util.LocalStorage');\n var storageName = 'tinymce-custom-colors';\n function ColorCache(max) {\n if (max === void 0) {\n max = 10;\n }\n var storageString = global$8.getItem(storageName);\n var localstorage = isString(storageString) ? JSON.parse(storageString) : [];\n var prune = function (list) {\n var diff = max - list.length;\n return diff < 0 ? list.slice(0, max) : list;\n };\n var cache = prune(localstorage);\n var add = function (key) {\n indexOf(cache, key).each(remove);\n cache.unshift(key);\n if (cache.length > max) {\n cache.pop();\n }\n global$8.setItem(storageName, JSON.stringify(cache));\n };\n var remove = function (idx) {\n cache.splice(idx, 1);\n };\n var state = function () {\n return cache.slice(0);\n };\n return {\n add: add,\n state: state\n };\n }\n var choiceItem = 'choiceitem';\n var defaultColors = [{\n type: choiceItem,\n text: 'Light Green',\n value: '#BFEDD2'\n }, {\n type: choiceItem,\n text: 'Light Yellow',\n value: '#FBEEB8'\n }, {\n type: choiceItem,\n text: 'Light Red',\n value: '#F8CAC6'\n }, {\n type: choiceItem,\n text: 'Light Purple',\n value: '#ECCAFA'\n }, {\n type: choiceItem,\n text: 'Light Blue',\n value: '#C2E0F4'\n }, {\n type: choiceItem,\n text: 'Green',\n value: '#2DC26B'\n }, {\n type: choiceItem,\n text: 'Yellow',\n value: '#F1C40F'\n }, {\n type: choiceItem,\n text: 'Red',\n value: '#E03E2D'\n }, {\n type: choiceItem,\n text: 'Purple',\n value: '#B96AD9'\n }, {\n type: choiceItem,\n text: 'Blue',\n value: '#3598DB'\n }, {\n type: choiceItem,\n text: 'Dark Turquoise',\n value: '#169179'\n }, {\n type: choiceItem,\n text: 'Orange',\n value: '#E67E23'\n }, {\n type: choiceItem,\n text: 'Dark Red',\n value: '#BA372A'\n }, {\n type: choiceItem,\n text: 'Dark Purple',\n value: '#843FA1'\n }, {\n type: choiceItem,\n text: 'Dark Blue',\n value: '#236FA1'\n }, {\n type: choiceItem,\n text: 'Light Gray',\n value: '#ECF0F1'\n }, {\n type: choiceItem,\n text: 'Medium Gray',\n value: '#CED4D9'\n }, {\n type: choiceItem,\n text: 'Gray',\n value: '#95A5A6'\n }, {\n type: choiceItem,\n text: 'Dark Gray',\n value: '#7E8C8D'\n }, {\n type: choiceItem,\n text: 'Navy Blue',\n value: '#34495E'\n }, {\n type: choiceItem,\n text: 'Black',\n value: '#000000'\n }, {\n type: choiceItem,\n text: 'White',\n value: '#ffffff'\n }];\n var colorCache = ColorCache(10);\n var mapColors = function (colorMap) {\n var colors = [];\n for (var i = 0; i < colorMap.length; i += 2) {\n colors.push({\n text: colorMap[i + 1],\n value: '#' + anyToHex(colorMap[i]).value,\n type: 'choiceitem'\n });\n }\n return colors;\n };\n var getColorCols$2 = function (editor, defaultCols) {\n return editor.getParam('color_cols', defaultCols, 'number');\n };\n var hasCustomColors$1 = function (editor) {\n return editor.getParam('custom_colors') !== false;\n };\n var getColorMap = function (editor) {\n return editor.getParam('color_map');\n };\n var getColors$2 = function (editor) {\n var unmapped = getColorMap(editor);\n return unmapped !== undefined ? mapColors(unmapped) : defaultColors;\n };\n var getCurrentColors = function () {\n return map$2(colorCache.state(), function (color) {\n return {\n type: choiceItem,\n text: color,\n value: color\n };\n });\n };\n var addColor = function (color) {\n colorCache.add(color);\n };\n var fallbackColor = '#000000';\n var getCurrentColor = function (editor, format) {\n var color;\n editor.dom.getParents(editor.selection.getStart(), function (elm) {\n var value;\n if (value = elm.style[format === 'forecolor' ? 'color' : 'background-color']) {\n color = color ? color : value;\n }\n });\n return Optional.from(color);\n };\n var applyFormat = function (editor, format, value) {\n editor.undoManager.transact(function () {\n editor.focus();\n editor.formatter.apply(format, {\n value: value\n });\n editor.nodeChanged();\n });\n };\n var removeFormat = function (editor, format) {\n editor.undoManager.transact(function () {\n editor.focus();\n editor.formatter.remove(format, {\n value: null\n }, null, true);\n editor.nodeChanged();\n });\n };\n var registerCommands = function (editor) {\n editor.addCommand('mceApplyTextcolor', function (format, value) {\n applyFormat(editor, format, value);\n });\n editor.addCommand('mceRemoveTextcolor', function (format) {\n removeFormat(editor, format);\n });\n };\n var calcCols = function (colors) {\n return Math.max(5, Math.ceil(Math.sqrt(colors)));\n };\n var getColorCols$1 = function (editor) {\n var colors = getColors$2(editor);\n var defaultCols = calcCols(colors.length);\n return getColorCols$2(editor, defaultCols);\n };\n var getAdditionalColors = function (hasCustom) {\n var type = 'choiceitem';\n var remove = {\n type: type,\n text: 'Remove color',\n icon: 'color-swatch-remove-color',\n value: 'remove'\n };\n var custom = {\n type: type,\n text: 'Custom color',\n icon: 'color-picker',\n value: 'custom'\n };\n return hasCustom ? [remove, custom] : [remove];\n };\n var applyColor = function (editor, format, value, onChoice) {\n if (value === 'custom') {\n var dialog = colorPickerDialog(editor);\n dialog(function (colorOpt) {\n colorOpt.each(function (color) {\n addColor(color);\n editor.execCommand('mceApplyTextcolor', format, color);\n onChoice(color);\n });\n }, fallbackColor);\n } else if (value === 'remove') {\n onChoice('');\n editor.execCommand('mceRemoveTextcolor', format);\n } else {\n onChoice(value);\n editor.execCommand('mceApplyTextcolor', format, value);\n }\n };\n var getColors$1 = function (colors, hasCustom) {\n return colors.concat(getCurrentColors().concat(getAdditionalColors(hasCustom)));\n };\n var getFetch$1 = function (colors, hasCustom) {\n return function (callback) {\n callback(getColors$1(colors, hasCustom));\n };\n };\n var setIconColor = function (splitButtonApi, name, newColor) {\n var id = name === 'forecolor' ? 'tox-icon-text-color__color' : 'tox-icon-highlight-bg-color__color';\n splitButtonApi.setIconFill(id, newColor);\n };\n var registerTextColorButton = function (editor, name, format, tooltip, lastColor) {\n editor.ui.registry.addSplitButton(name, {\n tooltip: tooltip,\n presets: 'color',\n icon: name === 'forecolor' ? 'text-color' : 'highlight-bg-color',\n select: function (value) {\n var optCurrentRgb = getCurrentColor(editor, format);\n return optCurrentRgb.bind(function (currentRgb) {\n return fromString(currentRgb).map(function (rgba) {\n var currentHex = fromRgba(rgba).value;\n return contains$1(value.toLowerCase(), currentHex);\n });\n }).getOr(false);\n },\n columns: getColorCols$1(editor),\n fetch: getFetch$1(getColors$2(editor), hasCustomColors$1(editor)),\n onAction: function (_splitButtonApi) {\n applyColor(editor, format, lastColor.get(), noop);\n },\n onItemAction: function (_splitButtonApi, value) {\n applyColor(editor, format, value, function (newColor) {\n lastColor.set(newColor);\n fireTextColorChange(editor, {\n name: name,\n color: newColor\n });\n });\n },\n onSetup: function (splitButtonApi) {\n setIconColor(splitButtonApi, name, lastColor.get());\n var handler = function (e) {\n if (e.name === name) {\n setIconColor(splitButtonApi, e.name, e.color);\n }\n };\n editor.on('TextColorChange', handler);\n return function () {\n editor.off('TextColorChange', handler);\n };\n }\n });\n };\n var registerTextColorMenuItem = function (editor, name, format, text) {\n editor.ui.registry.addNestedMenuItem(name, {\n text: text,\n icon: name === 'forecolor' ? 'text-color' : 'highlight-bg-color',\n getSubmenuItems: function () {\n return [{\n type: 'fancymenuitem',\n fancytype: 'colorswatch',\n onAction: function (data) {\n applyColor(editor, format, data.value, noop);\n }\n }];\n }\n });\n };\n var colorPickerDialog = function (editor) {\n return function (callback, value) {\n var isValid = false;\n var onSubmit = function (api) {\n var data = api.getData();\n var hex = data.colorpicker;\n if (isValid) {\n callback(Optional.from(hex));\n api.close();\n } else {\n editor.windowManager.alert(editor.translate(['Invalid hex color code: {0}', hex]));\n }\n };\n var onAction = function (_api, details) {\n if (details.name === 'hex-valid') {\n isValid = details.value;\n }\n };\n var initialData = {\n colorpicker: value\n };\n editor.windowManager.open({\n title: 'Color Picker',\n size: 'normal',\n body: {\n type: 'panel',\n items: [{\n type: 'colorpicker',\n name: 'colorpicker',\n label: 'Color'\n }]\n },\n buttons: [{\n type: 'cancel',\n name: 'cancel',\n text: 'Cancel'\n }, {\n type: 'submit',\n name: 'save',\n text: 'Save',\n primary: true\n }],\n initialData: initialData,\n onAction: onAction,\n onSubmit: onSubmit,\n onClose: noop,\n onCancel: function () {\n callback(Optional.none());\n }\n });\n };\n };\n var register$a = function (editor) {\n registerCommands(editor);\n var lastForeColor = Cell(fallbackColor);\n var lastBackColor = Cell(fallbackColor);\n registerTextColorButton(editor, 'forecolor', 'forecolor', 'Text color', lastForeColor);\n registerTextColorButton(editor, 'backcolor', 'hilitecolor', 'Background color', lastBackColor);\n registerTextColorMenuItem(editor, 'forecolor', 'forecolor', 'Text color');\n registerTextColorMenuItem(editor, 'backcolor', 'hilitecolor', 'Background color');\n };\n var createPartialChoiceMenu = function (value, items, onItemValueHandler, columns, presets, itemResponse, select, providersBackstage) {\n var hasIcons = menuHasIcons(items);\n var presetItemTypes = presets !== 'color' ? 'normal' : 'color';\n var alloyItems = createChoiceItems(items, onItemValueHandler, columns, presetItemTypes, itemResponse, select, providersBackstage);\n return createPartialMenuWithAlloyItems(value, hasIcons, alloyItems, columns, presets);\n };\n var createChoiceItems = function (items, onItemValueHandler, columns, itemPresets, itemResponse, select, providersBackstage) {\n return cat(map$2(items, function (item) {\n if (item.type === 'choiceitem') {\n return createChoiceMenuItem(item).fold(handleError, function (d) {\n return Optional.some(renderChoiceItem(d, columns === 1, itemPresets, onItemValueHandler, select(item.value), itemResponse, providersBackstage, menuHasIcons(items)));\n });\n } else {\n return Optional.none();\n }\n }));\n };\n var deriveMenuMovement = function (columns, presets) {\n var menuMarkers = markers(presets);\n if (columns === 1) {\n return {\n mode: 'menu',\n moveOnTab: true\n };\n } else if (columns === 'auto') {\n return {\n mode: 'grid',\n selector: '.' + menuMarkers.item,\n initSize: {\n numColumns: 1,\n numRows: 1\n }\n };\n } else {\n var rowClass = presets === 'color' ? 'tox-swatches__row' : 'tox-collection__group';\n return {\n mode: 'matrix',\n rowSelector: '.' + rowClass\n };\n }\n };\n var deriveCollectionMovement = function (columns, presets) {\n if (columns === 1) {\n return {\n mode: 'menu',\n moveOnTab: false,\n selector: '.tox-collection__item'\n };\n } else if (columns === 'auto') {\n return {\n mode: 'flatgrid',\n selector: '.' + 'tox-collection__item',\n initSize: {\n numColumns: 1,\n numRows: 1\n }\n };\n } else {\n return {\n mode: 'matrix',\n selectors: {\n row: presets === 'color' ? '.tox-swatches__row' : '.tox-collection__group',\n cell: presets === 'color' ? '.' + colorClass : '.' + selectableClass\n }\n };\n }\n };\n var renderColorSwatchItem = function (spec, backstage) {\n var items = getColorItems(spec, backstage);\n var columns = backstage.colorinput.getColorCols();\n var presets = 'color';\n var menuSpec = createPartialChoiceMenu(generate$6('menu-value'), items, function (value) {\n spec.onAction({\n value: value\n });\n }, columns, presets, ItemResponse$1.CLOSE_ON_EXECUTE, never, backstage.shared.providers);\n var widgetSpec = __assign(__assign({}, menuSpec), {\n markers: markers(presets),\n movement: deriveMenuMovement(columns, presets)\n });\n return {\n type: 'widget',\n data: {\n value: generate$6('widget-id')\n },\n dom: {\n tag: 'div',\n classes: ['tox-fancymenuitem']\n },\n autofocus: true,\n components: [parts$f.widget(Menu.sketch(widgetSpec))]\n };\n };\n var getColorItems = function (spec, backstage) {\n var useCustomColors = spec.initData.allowCustomColors && backstage.colorinput.hasCustomColors();\n return spec.initData.colors.fold(function () {\n return getColors$1(backstage.colorinput.getColors(), useCustomColors);\n }, function (colors) {\n return colors.concat(getAdditionalColors(useCustomColors));\n });\n };\n var cellOverEvent = generate$6('cell-over');\n var cellExecuteEvent = generate$6('cell-execute');\n var makeCell = function (row, col, labelId) {\n var _a;\n var emitCellOver = function (c) {\n return emitWith(c, cellOverEvent, {\n row: row,\n col: col\n });\n };\n var emitExecute = function (c) {\n return emitWith(c, cellExecuteEvent, {\n row: row,\n col: col\n });\n };\n var onClick = function (c, se) {\n se.stop();\n emitExecute(c);\n };\n return build$1({\n dom: {\n tag: 'div',\n attributes: (_a = {\n role: 'button'\n }, _a['aria-labelledby'] = labelId, _a)\n },\n behaviours: derive$1([config('insert-table-picker-cell', [run$1(mouseover(), Focusing.focus), run$1(execute$5(), emitExecute), run$1(click(), onClick), run$1(tap(), onClick)]), Toggling.config({\n toggleClass: 'tox-insert-table-picker__selected',\n toggleOnExecute: false\n }), Focusing.config({\n onFocus: emitCellOver\n })])\n });\n };\n var makeCells = function (labelId, numRows, numCols) {\n var cells = [];\n for (var i = 0; i < numRows; i++) {\n var row = [];\n for (var j = 0; j < numCols; j++) {\n row.push(makeCell(i, j, labelId));\n }\n cells.push(row);\n }\n return cells;\n };\n var selectCells = function (cells, selectedRow, selectedColumn, numRows, numColumns) {\n for (var i = 0; i < numRows; i++) {\n for (var j = 0; j < numColumns; j++) {\n Toggling.set(cells[i][j], i <= selectedRow && j <= selectedColumn);\n }\n }\n };\n var makeComponents = function (cells) {\n return bind$3(cells, function (cellRow) {\n return map$2(cellRow, premade);\n });\n };\n var makeLabelText = function (row, col) {\n return text$1(col + 'x' + row);\n };\n var renderInsertTableMenuItem = function (spec) {\n var numRows = 10;\n var numColumns = 10;\n var sizeLabelId = generate$6('size-label');\n var cells = makeCells(sizeLabelId, numRows, numColumns);\n var emptyLabelText = makeLabelText(0, 0);\n var memLabel = record({\n dom: {\n tag: 'span',\n classes: ['tox-insert-table-picker__label'],\n attributes: {\n id: sizeLabelId\n }\n },\n components: [emptyLabelText],\n behaviours: derive$1([Replacing.config({})])\n });\n return {\n type: 'widget',\n data: {\n value: generate$6('widget-id')\n },\n dom: {\n tag: 'div',\n classes: ['tox-fancymenuitem']\n },\n autofocus: true,\n components: [parts$f.widget({\n dom: {\n tag: 'div',\n classes: ['tox-insert-table-picker']\n },\n components: makeComponents(cells).concat(memLabel.asSpec()),\n behaviours: derive$1([config('insert-table-picker', [runOnAttached(function (c) {\n Replacing.set(memLabel.get(c), [emptyLabelText]);\n }), runWithTarget(cellOverEvent, function (c, t, e) {\n var _a = e.event,\n row = _a.row,\n col = _a.col;\n selectCells(cells, row, col, numRows, numColumns);\n Replacing.set(memLabel.get(c), [makeLabelText(row + 1, col + 1)]);\n }), runWithTarget(cellExecuteEvent, function (c, _, e) {\n var _a = e.event,\n row = _a.row,\n col = _a.col;\n spec.onAction({\n numRows: row + 1,\n numColumns: col + 1\n });\n emit(c, sandboxClose());\n })]), Keying.config({\n initSize: {\n numRows: numRows,\n numColumns: numColumns\n },\n mode: 'flatgrid',\n selector: '[role=\"button\"]'\n })])\n })]\n };\n };\n var fancyMenuItems = {\n inserttable: renderInsertTableMenuItem,\n colorswatch: renderColorSwatchItem\n };\n var renderFancyMenuItem = function (spec, backstage) {\n return get$e(fancyMenuItems, spec.fancytype).map(function (render) {\n return render(spec, backstage);\n });\n };\n var renderNestedItem = function (spec, itemResponse, providersBackstage, renderIcons, downwardsCaret) {\n if (renderIcons === void 0) {\n renderIcons = true;\n }\n if (downwardsCaret === void 0) {\n downwardsCaret = false;\n }\n var caret = downwardsCaret ? renderDownwardsCaret(providersBackstage.icons) : renderSubmenuCaret(providersBackstage.icons);\n var getApi = function (component) {\n return {\n isDisabled: function () {\n return Disabling.isDisabled(component);\n },\n setDisabled: function (state) {\n return Disabling.set(component, state);\n }\n };\n };\n var structure = renderItemStructure({\n presets: 'normal',\n iconContent: spec.icon,\n textContent: spec.text,\n htmlContent: Optional.none(),\n ariaLabel: spec.text,\n caret: Optional.some(caret),\n checkMark: Optional.none(),\n shortcutContent: spec.shortcut\n }, providersBackstage, renderIcons);\n return renderCommonItem({\n data: buildData(spec),\n getApi: getApi,\n disabled: spec.disabled,\n onAction: noop,\n onSetup: spec.onSetup,\n triggersSubmenu: true,\n itemBehaviours: []\n }, structure, itemResponse, providersBackstage);\n };\n var renderNormalItem = function (spec, itemResponse, providersBackstage, renderIcons) {\n if (renderIcons === void 0) {\n renderIcons = true;\n }\n var getApi = function (component) {\n return {\n isDisabled: function () {\n return Disabling.isDisabled(component);\n },\n setDisabled: function (state) {\n return Disabling.set(component, state);\n }\n };\n };\n var structure = renderItemStructure({\n presets: 'normal',\n iconContent: spec.icon,\n textContent: spec.text,\n htmlContent: Optional.none(),\n ariaLabel: spec.text,\n caret: Optional.none(),\n checkMark: Optional.none(),\n shortcutContent: spec.shortcut\n }, providersBackstage, renderIcons);\n return renderCommonItem({\n data: buildData(spec),\n getApi: getApi,\n disabled: spec.disabled,\n onAction: spec.onAction,\n onSetup: spec.onSetup,\n triggersSubmenu: false,\n itemBehaviours: []\n }, structure, itemResponse, providersBackstage);\n };\n var renderSeparatorItem = function (spec) {\n var innerHtml = spec.text.fold(function () {\n return {};\n }, function (text) {\n return {\n innerHtml: text\n };\n });\n return {\n type: 'separator',\n dom: __assign({\n tag: 'div',\n classes: [selectableClass, groupHeadingClass]\n }, innerHtml),\n components: []\n };\n };\n var renderToggleMenuItem = function (spec, itemResponse, providersBackstage, renderIcons) {\n if (renderIcons === void 0) {\n renderIcons = true;\n }\n var getApi = function (component) {\n return {\n setActive: function (state) {\n Toggling.set(component, state);\n },\n isActive: function () {\n return Toggling.isOn(component);\n },\n isDisabled: function () {\n return Disabling.isDisabled(component);\n },\n setDisabled: function (state) {\n return Disabling.set(component, state);\n }\n };\n };\n var structure = renderItemStructure({\n iconContent: spec.icon,\n textContent: spec.text,\n htmlContent: Optional.none(),\n ariaLabel: spec.text,\n checkMark: Optional.some(renderCheckmark(providersBackstage.icons)),\n caret: Optional.none(),\n shortcutContent: spec.shortcut,\n presets: 'normal',\n meta: spec.meta\n }, providersBackstage, renderIcons);\n return deepMerge(renderCommonItem({\n data: buildData(spec),\n disabled: spec.disabled,\n getApi: getApi,\n onAction: spec.onAction,\n onSetup: spec.onSetup,\n triggersSubmenu: false,\n itemBehaviours: []\n }, structure, itemResponse, providersBackstage), {\n toggling: {\n toggleClass: tickedClass,\n toggleOnExecute: false,\n selected: spec.active\n }\n });\n };\n var autocomplete = renderAutocompleteItem;\n var separator$3 = renderSeparatorItem;\n var normal = renderNormalItem;\n var nested = renderNestedItem;\n var toggle$1 = renderToggleMenuItem;\n var fancy = renderFancyMenuItem;\n var card = renderCardMenuItem;\n var FocusMode = /*#__PURE__*/function (FocusMode) {\n FocusMode[FocusMode['ContentFocus'] = 0] = 'ContentFocus';\n FocusMode[FocusMode['UiFocus'] = 1] = 'UiFocus';\n return FocusMode;\n }(FocusMode || {});\n var createMenuItemFromBridge = function (item, itemResponse, backstage, menuHasIcons, isHorizontalMenu) {\n var providersBackstage = backstage.shared.providers;\n var parseForHorizontalMenu = function (menuitem) {\n return !isHorizontalMenu ? menuitem : __assign(__assign({}, menuitem), {\n shortcut: Optional.none(),\n icon: menuitem.text.isSome() ? Optional.none() : menuitem.icon\n });\n };\n switch (item.type) {\n case 'menuitem':\n return createMenuItem(item).fold(handleError, function (d) {\n return Optional.some(normal(parseForHorizontalMenu(d), itemResponse, providersBackstage, menuHasIcons));\n });\n case 'nestedmenuitem':\n return createNestedMenuItem(item).fold(handleError, function (d) {\n return Optional.some(nested(parseForHorizontalMenu(d), itemResponse, providersBackstage, menuHasIcons, isHorizontalMenu));\n });\n case 'togglemenuitem':\n return createToggleMenuItem(item).fold(handleError, function (d) {\n return Optional.some(toggle$1(parseForHorizontalMenu(d), itemResponse, providersBackstage, menuHasIcons));\n });\n case 'separator':\n return createSeparatorMenuItem(item).fold(handleError, function (d) {\n return Optional.some(separator$3(d));\n });\n case 'fancymenuitem':\n return createFancyMenuItem(item).fold(handleError, function (d) {\n return fancy(parseForHorizontalMenu(d), backstage);\n });\n default:\n {\n console.error('Unknown item in general menu', item);\n return Optional.none();\n }\n }\n };\n var createAutocompleteItems = function (items, matchText, onItemValueHandler, columns, itemResponse, sharedBackstage, highlightOn) {\n var renderText = columns === 1;\n var renderIcons = !renderText || menuHasIcons(items);\n return cat(map$2(items, function (item) {\n switch (item.type) {\n case 'separator':\n return createSeparatorItem(item).fold(handleError, function (d) {\n return Optional.some(separator$3(d));\n });\n case 'cardmenuitem':\n return createCardMenuItem(item).fold(handleError, function (d) {\n return Optional.some(card(__assign(__assign({}, d), {\n onAction: function (api) {\n d.onAction(api);\n onItemValueHandler(d.value, d.meta);\n }\n }), itemResponse, sharedBackstage, {\n itemBehaviours: tooltipBehaviour(d.meta, sharedBackstage),\n cardText: {\n matchText: matchText,\n highlightOn: highlightOn\n }\n }));\n });\n case 'autocompleteitem':\n default:\n return createAutocompleterItem(item).fold(handleError, function (d) {\n return Optional.some(autocomplete(d, matchText, renderText, 'normal', onItemValueHandler, itemResponse, sharedBackstage, renderIcons));\n });\n }\n }));\n };\n var createPartialMenu = function (value, items, itemResponse, backstage, isHorizontalMenu) {\n var hasIcons = menuHasIcons(items);\n var alloyItems = cat(map$2(items, function (item) {\n var itemHasIcon = function (i) {\n return isHorizontalMenu ? !has$2(i, 'text') : hasIcons;\n };\n var createItem = function (i) {\n return createMenuItemFromBridge(i, itemResponse, backstage, itemHasIcon(i), isHorizontalMenu);\n };\n if (item.type === 'nestedmenuitem' && item.getSubmenuItems().length <= 0) {\n return createItem(__assign(__assign({}, item), {\n disabled: true\n }));\n } else {\n return createItem(item);\n }\n }));\n var createPartial = isHorizontalMenu ? createHorizontalPartialMenuWithAlloyItems : createPartialMenuWithAlloyItems;\n return createPartial(value, hasIcons, alloyItems, 1, 'normal');\n };\n var createTieredDataFrom = function (partialMenu) {\n return tieredMenu.singleData(partialMenu.value, partialMenu);\n };\n var createMenuFrom = function (partialMenu, columns, focusMode, presets) {\n var focusManager = focusMode === FocusMode.ContentFocus ? highlights() : dom$2();\n var movement = deriveMenuMovement(columns, presets);\n var menuMarkers = markers(presets);\n return {\n dom: partialMenu.dom,\n components: partialMenu.components,\n items: partialMenu.items,\n value: partialMenu.value,\n markers: {\n selectedItem: menuMarkers.selectedItem,\n item: menuMarkers.item\n },\n movement: movement,\n fakeFocus: focusMode === FocusMode.ContentFocus,\n focusManager: focusManager,\n menuBehaviours: SimpleBehaviours.unnamedEvents(columns !== 'auto' ? [] : [runOnAttached(function (comp, _se) {\n detectSize(comp, 4, menuMarkers.item).each(function (_a) {\n var numColumns = _a.numColumns,\n numRows = _a.numRows;\n Keying.setGridSize(comp, numRows, numColumns);\n });\n })])\n };\n };\n var register$9 = function (editor, sharedBackstage) {\n var activeAutocompleter = value$1();\n var processingAction = Cell(false);\n var autocompleter = build$1(InlineView.sketch({\n dom: {\n tag: 'div',\n classes: ['tox-autocompleter']\n },\n components: [],\n fireDismissalEventInstead: {},\n inlineBehaviours: derive$1([config('dismissAutocompleter', [run$1(dismissRequested(), function () {\n return cancelIfNecessary();\n })])]),\n lazySink: sharedBackstage.getSink\n }));\n var isMenuOpen = function () {\n return InlineView.isOpen(autocompleter);\n };\n var isActive = function () {\n return activeAutocompleter.get().isSome();\n };\n var hideIfNecessary = function () {\n if (isActive()) {\n InlineView.hide(autocompleter);\n }\n };\n var cancelIfNecessary = function () {\n if (isActive()) {\n var lastElement = activeAutocompleter.get().map(function (ac) {\n return ac.element;\n });\n detect(lastElement.getOr(SugarElement.fromDom(editor.selection.getNode()))).each(unwrap);\n hideIfNecessary();\n activeAutocompleter.clear();\n processingAction.set(false);\n }\n };\n var getAutocompleters = cached(function () {\n return register$b(editor);\n });\n var getCombinedItems = function (triggerChar, matches) {\n var columns = findMap(matches, function (m) {\n return Optional.from(m.columns);\n }).getOr(1);\n return bind$3(matches, function (match) {\n var choices = match.items;\n return createAutocompleteItems(choices, match.matchText, function (itemValue, itemMeta) {\n var nr = editor.selection.getRng();\n getContext(editor.dom, nr, triggerChar).fold(function () {\n return console.error('Lost context. Cursor probably moved');\n }, function (_a) {\n var range = _a.range;\n var autocompleterApi = {\n hide: function () {\n cancelIfNecessary();\n },\n reload: function (fetchOptions) {\n hideIfNecessary();\n load(fetchOptions);\n }\n };\n processingAction.set(true);\n match.onAction(autocompleterApi, range, itemValue, itemMeta);\n processingAction.set(false);\n });\n }, columns, ItemResponse$1.BUBBLE_TO_SANDBOX, sharedBackstage, match.highlightOn);\n });\n };\n var commenceIfNecessary = function (context) {\n if (!isActive()) {\n var wrapper = create$4(editor, context.range);\n activeAutocompleter.set({\n triggerChar: context.triggerChar,\n element: wrapper,\n matchLength: context.text.length\n });\n processingAction.set(false);\n }\n };\n var display = function (ac, context, lookupData, items) {\n ac.matchLength = context.text.length;\n var columns = findMap(lookupData, function (ld) {\n return Optional.from(ld.columns);\n }).getOr(1);\n InlineView.showAt(autocompleter, Menu.sketch(createMenuFrom(createPartialMenuWithAlloyItems('autocompleter-value', true, items, columns, 'normal'), columns, FocusMode.ContentFocus, 'normal')), {\n anchor: {\n type: 'node',\n root: SugarElement.fromDom(editor.getBody()),\n node: Optional.from(ac.element)\n }\n });\n InlineView.getContent(autocompleter).each(Highlighting.highlightFirst);\n };\n var doLookup = function (fetchOptions) {\n return activeAutocompleter.get().map(function (ac) {\n return getContext(editor.dom, editor.selection.getRng(), ac.triggerChar).bind(function (newContext) {\n return lookupWithContext(editor, getAutocompleters, newContext, fetchOptions);\n });\n }).getOrThunk(function () {\n return lookup$2(editor, getAutocompleters);\n });\n };\n var load = function (fetchOptions) {\n doLookup(fetchOptions).fold(cancelIfNecessary, function (lookupInfo) {\n commenceIfNecessary(lookupInfo.context);\n lookupInfo.lookupData.then(function (lookupData) {\n activeAutocompleter.get().map(function (ac) {\n var context = lookupInfo.context;\n if (ac.triggerChar === context.triggerChar) {\n var combinedItems = getCombinedItems(context.triggerChar, lookupData);\n if (combinedItems.length > 0) {\n display(ac, context, lookupData, combinedItems);\n } else if (context.text.length - ac.matchLength >= 10) {\n cancelIfNecessary();\n } else {\n hideIfNecessary();\n }\n }\n });\n });\n });\n };\n var onKeypress = last(function (e) {\n if (e.which === 27) {\n return;\n }\n load();\n }, 50);\n var autocompleterUiApi = {\n onKeypress: onKeypress,\n cancelIfNecessary: cancelIfNecessary,\n isMenuOpen: isMenuOpen,\n isActive: isActive,\n isProcessingAction: processingAction.get,\n getView: function () {\n return InlineView.getContent(autocompleter);\n }\n };\n if (editor.hasPlugin('rtc') === false) {\n AutocompleterEditorEvents.setup(autocompleterUiApi, editor);\n }\n };\n var Autocompleter = {\n register: register$9\n };\n var closest = function (scope, selector, isRoot) {\n return closest$1(scope, selector, isRoot).isSome();\n };\n var DelayedFunction = function (fun, delay) {\n var ref = null;\n var schedule = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n ref = setTimeout(function () {\n fun.apply(null, args);\n ref = null;\n }, delay);\n };\n var cancel = function () {\n if (ref !== null) {\n clearTimeout(ref);\n ref = null;\n }\n };\n return {\n cancel: cancel,\n schedule: schedule\n };\n };\n var SIGNIFICANT_MOVE = 5;\n var LONGPRESS_DELAY = 400;\n var getTouch = function (event) {\n var raw = event.raw;\n if (raw.touches === undefined || raw.touches.length !== 1) {\n return Optional.none();\n }\n return Optional.some(raw.touches[0]);\n };\n var isFarEnough = function (touch, data) {\n var distX = Math.abs(touch.clientX - data.x);\n var distY = Math.abs(touch.clientY - data.y);\n return distX > SIGNIFICANT_MOVE || distY > SIGNIFICANT_MOVE;\n };\n var monitor = function (settings) {\n var startData = value$1();\n var longpressFired = Cell(false);\n var longpress$1 = DelayedFunction(function (event) {\n settings.triggerEvent(longpress(), event);\n longpressFired.set(true);\n }, LONGPRESS_DELAY);\n var handleTouchstart = function (event) {\n getTouch(event).each(function (touch) {\n longpress$1.cancel();\n var data = {\n x: touch.clientX,\n y: touch.clientY,\n target: event.target\n };\n longpress$1.schedule(event);\n longpressFired.set(false);\n startData.set(data);\n });\n return Optional.none();\n };\n var handleTouchmove = function (event) {\n longpress$1.cancel();\n getTouch(event).each(function (touch) {\n startData.on(function (data) {\n if (isFarEnough(touch, data)) {\n startData.clear();\n }\n });\n });\n return Optional.none();\n };\n var handleTouchend = function (event) {\n longpress$1.cancel();\n var isSame = function (data) {\n return eq(data.target, event.target);\n };\n return startData.get().filter(isSame).map(function (_data) {\n if (longpressFired.get()) {\n event.prevent();\n return false;\n } else {\n return settings.triggerEvent(tap(), event);\n }\n });\n };\n var handlers = wrapAll([{\n key: touchstart(),\n value: handleTouchstart\n }, {\n key: touchmove(),\n value: handleTouchmove\n }, {\n key: touchend(),\n value: handleTouchend\n }]);\n var fireIfReady = function (event, type) {\n return get$e(handlers, type).bind(function (handler) {\n return handler(event);\n });\n };\n return {\n fireIfReady: fireIfReady\n };\n };\n var isDangerous = function (event) {\n var keyEv = event.raw;\n return keyEv.which === BACKSPACE[0] && !contains$2(['input', 'textarea'], name$2(event.target)) && !closest(event.target, '[contenteditable=\"true\"]');\n };\n var isFirefox = function () {\n return detect$1().browser.isFirefox();\n };\n var bindFocus = function (container, handler) {\n if (isFirefox()) {\n return capture(container, 'focus', handler);\n } else {\n return bind(container, 'focusin', handler);\n }\n };\n var bindBlur = function (container, handler) {\n if (isFirefox()) {\n return capture(container, 'blur', handler);\n } else {\n return bind(container, 'focusout', handler);\n }\n };\n var setup$d = function (container, rawSettings) {\n var settings = __assign({\n stopBackspace: true\n }, rawSettings);\n var pointerEvents = ['touchstart', 'touchmove', 'touchend', 'touchcancel', 'gesturestart', 'mousedown', 'mouseup', 'mouseover', 'mousemove', 'mouseout', 'click'];\n var tapEvent = monitor(settings);\n var simpleEvents = map$2(pointerEvents.concat(['selectstart', 'input', 'contextmenu', 'change', 'transitionend', 'transitioncancel', 'drag', 'dragstart', 'dragend', 'dragenter', 'dragleave', 'dragover', 'drop', 'keyup']), function (type) {\n return bind(container, type, function (event) {\n tapEvent.fireIfReady(event, type).each(function (tapStopped) {\n if (tapStopped) {\n event.kill();\n }\n });\n var stopped = settings.triggerEvent(type, event);\n if (stopped) {\n event.kill();\n }\n });\n });\n var pasteTimeout = value$1();\n var onPaste = bind(container, 'paste', function (event) {\n tapEvent.fireIfReady(event, 'paste').each(function (tapStopped) {\n if (tapStopped) {\n event.kill();\n }\n });\n var stopped = settings.triggerEvent('paste', event);\n if (stopped) {\n event.kill();\n }\n pasteTimeout.set(setTimeout(function () {\n settings.triggerEvent(postPaste(), event);\n }, 0));\n });\n var onKeydown = bind(container, 'keydown', function (event) {\n var stopped = settings.triggerEvent('keydown', event);\n if (stopped) {\n event.kill();\n } else if (settings.stopBackspace && isDangerous(event)) {\n event.prevent();\n }\n });\n var onFocusIn = bindFocus(container, function (event) {\n var stopped = settings.triggerEvent('focusin', event);\n if (stopped) {\n event.kill();\n }\n });\n var focusoutTimeout = value$1();\n var onFocusOut = bindBlur(container, function (event) {\n var stopped = settings.triggerEvent('focusout', event);\n if (stopped) {\n event.kill();\n }\n focusoutTimeout.set(setTimeout(function () {\n settings.triggerEvent(postBlur(), event);\n }, 0));\n });\n var unbind = function () {\n each$1(simpleEvents, function (e) {\n e.unbind();\n });\n onKeydown.unbind();\n onFocusIn.unbind();\n onFocusOut.unbind();\n onPaste.unbind();\n pasteTimeout.on(clearTimeout);\n focusoutTimeout.on(clearTimeout);\n };\n return {\n unbind: unbind\n };\n };\n var derive = function (rawEvent, rawTarget) {\n var source = get$e(rawEvent, 'target').getOr(rawTarget);\n return Cell(source);\n };\n var fromSource = function (event, source) {\n var stopper = Cell(false);\n var cutter = Cell(false);\n var stop = function () {\n stopper.set(true);\n };\n var cut = function () {\n cutter.set(true);\n };\n return {\n stop: stop,\n cut: cut,\n isStopped: stopper.get,\n isCut: cutter.get,\n event: event,\n setSource: source.set,\n getSource: source.get\n };\n };\n var fromExternal = function (event) {\n var stopper = Cell(false);\n var stop = function () {\n stopper.set(true);\n };\n return {\n stop: stop,\n cut: noop,\n isStopped: stopper.get,\n isCut: never,\n event: event,\n setSource: die('Cannot set source of a broadcasted event'),\n getSource: die('Cannot get source of a broadcasted event')\n };\n };\n var adt$1 = Adt.generate([{\n stopped: []\n }, {\n resume: ['element']\n }, {\n complete: []\n }]);\n var doTriggerHandler = function (lookup, eventType, rawEvent, target, source, logger) {\n var handler = lookup(eventType, target);\n var simulatedEvent = fromSource(rawEvent, source);\n return handler.fold(function () {\n logger.logEventNoHandlers(eventType, target);\n return adt$1.complete();\n }, function (handlerInfo) {\n var descHandler = handlerInfo.descHandler;\n var eventHandler = getCurried(descHandler);\n eventHandler(simulatedEvent);\n if (simulatedEvent.isStopped()) {\n logger.logEventStopped(eventType, handlerInfo.element, descHandler.purpose);\n return adt$1.stopped();\n } else if (simulatedEvent.isCut()) {\n logger.logEventCut(eventType, handlerInfo.element, descHandler.purpose);\n return adt$1.complete();\n } else {\n return parent(handlerInfo.element).fold(function () {\n logger.logNoParent(eventType, handlerInfo.element, descHandler.purpose);\n return adt$1.complete();\n }, function (parent) {\n logger.logEventResponse(eventType, handlerInfo.element, descHandler.purpose);\n return adt$1.resume(parent);\n });\n }\n });\n };\n var doTriggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, source, logger) {\n return doTriggerHandler(lookup, eventType, rawEvent, rawTarget, source, logger).fold(always, function (parent) {\n return doTriggerOnUntilStopped(lookup, eventType, rawEvent, parent, source, logger);\n }, never);\n };\n var triggerHandler = function (lookup, eventType, rawEvent, target, logger) {\n var source = derive(rawEvent, target);\n return doTriggerHandler(lookup, eventType, rawEvent, target, source, logger);\n };\n var broadcast = function (listeners, rawEvent, _logger) {\n var simulatedEvent = fromExternal(rawEvent);\n each$1(listeners, function (listener) {\n var descHandler = listener.descHandler;\n var handler = getCurried(descHandler);\n handler(simulatedEvent);\n });\n return simulatedEvent.isStopped();\n };\n var triggerUntilStopped = function (lookup, eventType, rawEvent, logger) {\n return triggerOnUntilStopped(lookup, eventType, rawEvent, rawEvent.target, logger);\n };\n var triggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, logger) {\n var source = derive(rawEvent, rawTarget);\n return doTriggerOnUntilStopped(lookup, eventType, rawEvent, rawTarget, source, logger);\n };\n var eventHandler = function (element, descHandler) {\n return {\n element: element,\n descHandler: descHandler\n };\n };\n var broadcastHandler = function (id, handler) {\n return {\n id: id,\n descHandler: handler\n };\n };\n var EventRegistry = function () {\n var registry = {};\n var registerId = function (extraArgs, id, events) {\n each(events, function (v, k) {\n var handlers = registry[k] !== undefined ? registry[k] : {};\n handlers[id] = curryArgs(v, extraArgs);\n registry[k] = handlers;\n });\n };\n var findHandler = function (handlers, elem) {\n return read$1(elem).bind(function (id) {\n return get$e(handlers, id);\n }).map(function (descHandler) {\n return eventHandler(elem, descHandler);\n });\n };\n var filterByType = function (type) {\n return get$e(registry, type).map(function (handlers) {\n return mapToArray(handlers, function (f, id) {\n return broadcastHandler(id, f);\n });\n }).getOr([]);\n };\n var find = function (isAboveRoot, type, target) {\n return get$e(registry, type).bind(function (handlers) {\n return closest$4(target, function (elem) {\n return findHandler(handlers, elem);\n }, isAboveRoot);\n });\n };\n var unregisterId = function (id) {\n each(registry, function (handlersById, _eventName) {\n if (has$2(handlersById, id)) {\n delete handlersById[id];\n }\n });\n };\n return {\n registerId: registerId,\n unregisterId: unregisterId,\n filterByType: filterByType,\n find: find\n };\n };\n var Registry = function () {\n var events = EventRegistry();\n var components = {};\n var readOrTag = function (component) {\n var elem = component.element;\n return read$1(elem).getOrThunk(function () {\n return write('uid-', component.element);\n });\n };\n var failOnDuplicate = function (component, tagId) {\n var conflict = components[tagId];\n if (conflict === component) {\n unregister(component);\n } else {\n 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');\n }\n };\n var register = function (component) {\n var tagId = readOrTag(component);\n if (hasNonNullableKey(components, tagId)) {\n failOnDuplicate(component, tagId);\n }\n var extraArgs = [component];\n events.registerId(extraArgs, tagId, component.events);\n components[tagId] = component;\n };\n var unregister = function (component) {\n read$1(component.element).each(function (tagId) {\n delete components[tagId];\n events.unregisterId(tagId);\n });\n };\n var filter = function (type) {\n return events.filterByType(type);\n };\n var find = function (isAboveRoot, type, target) {\n return events.find(isAboveRoot, type, target);\n };\n var getById = function (id) {\n return get$e(components, id);\n };\n return {\n find: find,\n filter: filter,\n register: register,\n unregister: unregister,\n getById: getById\n };\n };\n var factory$j = function (detail) {\n var _a = detail.dom,\n attributes = _a.attributes,\n domWithoutAttributes = __rest(_a, ['attributes']);\n return {\n uid: detail.uid,\n dom: __assign({\n tag: 'div',\n attributes: __assign({\n role: 'presentation'\n }, attributes)\n }, domWithoutAttributes),\n components: detail.components,\n behaviours: get$2(detail.containerBehaviours),\n events: detail.events,\n domModification: detail.domModification,\n eventOrder: detail.eventOrder\n };\n };\n var Container = single({\n name: 'Container',\n factory: factory$j,\n configFields: [defaulted('components', []), field('containerBehaviours', []), defaulted('events', {}), defaulted('domModification', {}), defaulted('eventOrder', {})]\n });\n var takeover = function (root) {\n var isAboveRoot = function (el) {\n return parent(root.element).fold(always, function (parent) {\n return eq(el, parent);\n });\n };\n var registry = Registry();\n var lookup = function (eventName, target) {\n return registry.find(isAboveRoot, eventName, target);\n };\n var domEvents = setup$d(root.element, {\n triggerEvent: function (eventName, event) {\n return monitorEvent(eventName, event.target, function (logger) {\n return triggerUntilStopped(lookup, eventName, event, logger);\n });\n }\n });\n var systemApi = {\n debugInfo: constant$1('real'),\n triggerEvent: function (eventName, target, data) {\n monitorEvent(eventName, target, function (logger) {\n return triggerOnUntilStopped(lookup, eventName, data, target, logger);\n });\n },\n triggerFocus: function (target, originator) {\n read$1(target).fold(function () {\n focus$3(target);\n }, function (_alloyId) {\n monitorEvent(focus$4(), target, function (logger) {\n triggerHandler(lookup, focus$4(), {\n originator: originator,\n kill: noop,\n prevent: noop,\n target: target\n }, target, logger);\n return false;\n });\n });\n },\n triggerEscape: function (comp, simulatedEvent) {\n systemApi.triggerEvent('keydown', comp.element, simulatedEvent.event);\n },\n getByUid: function (uid) {\n return getByUid(uid);\n },\n getByDom: function (elem) {\n return getByDom(elem);\n },\n build: build$1,\n addToGui: function (c) {\n add(c);\n },\n removeFromGui: function (c) {\n remove(c);\n },\n addToWorld: function (c) {\n addToWorld(c);\n },\n removeFromWorld: function (c) {\n removeFromWorld(c);\n },\n broadcast: function (message) {\n broadcast$1(message);\n },\n broadcastOn: function (channels, message) {\n broadcastOn(channels, message);\n },\n broadcastEvent: function (eventName, event) {\n broadcastEvent(eventName, event);\n },\n isConnected: always\n };\n var addToWorld = function (component) {\n component.connect(systemApi);\n if (!isText$1(component.element)) {\n registry.register(component);\n each$1(component.components(), addToWorld);\n systemApi.triggerEvent(systemInit(), component.element, {\n target: component.element\n });\n }\n };\n var removeFromWorld = function (component) {\n if (!isText$1(component.element)) {\n each$1(component.components(), removeFromWorld);\n registry.unregister(component);\n }\n component.disconnect();\n };\n var add = function (component) {\n attach(root, component);\n };\n var remove = function (component) {\n detach(component);\n };\n var destroy = function () {\n domEvents.unbind();\n remove$5(root.element);\n };\n var broadcastData = function (data) {\n var receivers = registry.filter(receive());\n each$1(receivers, function (receiver) {\n var descHandler = receiver.descHandler;\n var handler = getCurried(descHandler);\n handler(data);\n });\n };\n var broadcast$1 = function (message) {\n broadcastData({\n universal: true,\n data: message\n });\n };\n var broadcastOn = function (channels, message) {\n broadcastData({\n universal: false,\n channels: channels,\n data: message\n });\n };\n var broadcastEvent = function (eventName, event) {\n var listeners = registry.filter(eventName);\n return broadcast(listeners, event);\n };\n var getByUid = function (uid) {\n return registry.getById(uid).fold(function () {\n return Result.error(new Error('Could not find component with uid: \"' + uid + '\" in system.'));\n }, Result.value);\n };\n var getByDom = function (elem) {\n var uid = read$1(elem).getOr('not found');\n return getByUid(uid);\n };\n addToWorld(root);\n return {\n root: root,\n element: root.element,\n destroy: destroy,\n add: add,\n remove: remove,\n getByUid: getByUid,\n getByDom: getByDom,\n addToWorld: addToWorld,\n removeFromWorld: removeFromWorld,\n broadcast: broadcast$1,\n broadcastOn: broadcastOn,\n broadcastEvent: broadcastEvent\n };\n };\n var renderBar = function (spec, backstage) {\n return {\n dom: {\n tag: 'div',\n classes: ['tox-bar', 'tox-form__controls-h-stack']\n },\n components: map$2(spec.items, backstage.interpreter)\n };\n };\n var schema$l = constant$1([defaulted('prefix', 'form-field'), field('fieldBehaviours', [Composing, Representing])]);\n var parts$e = constant$1([optional({\n schema: [required$1('dom')],\n name: 'label'\n }), optional({\n factory: {\n sketch: function (spec) {\n return {\n uid: spec.uid,\n dom: {\n tag: 'span',\n styles: {\n display: 'none'\n },\n attributes: {\n 'aria-hidden': 'true'\n },\n innerHtml: spec.text\n }\n };\n }\n },\n schema: [required$1('text')],\n name: 'aria-descriptor'\n }), required({\n factory: {\n sketch: function (spec) {\n var excludeFactory = exclude(spec, ['factory']);\n return spec.factory.sketch(excludeFactory);\n }\n },\n schema: [required$1('factory')],\n name: 'field'\n })]);\n var factory$i = function (detail, components, _spec, _externals) {\n var behaviours = augment(detail.fieldBehaviours, [Composing.config({\n find: function (container) {\n return getPart(container, detail, 'field');\n }\n }), Representing.config({\n store: {\n mode: 'manual',\n getValue: function (field) {\n return Composing.getCurrent(field).bind(Representing.getValue);\n },\n setValue: function (field, value) {\n Composing.getCurrent(field).each(function (current) {\n Representing.setValue(current, value);\n });\n }\n }\n })]);\n var events = derive$2([runOnAttached(function (component, _simulatedEvent) {\n var ps = getParts(component, detail, ['label', 'field', 'aria-descriptor']);\n ps.field().each(function (field) {\n var id = generate$6(detail.prefix);\n ps.label().each(function (label) {\n set$8(label.element, 'for', id);\n set$8(field.element, 'id', id);\n });\n ps['aria-descriptor']().each(function (descriptor) {\n var descriptorId = generate$6(detail.prefix);\n set$8(descriptor.element, 'id', descriptorId);\n set$8(field.element, 'aria-describedby', descriptorId);\n });\n });\n })]);\n var apis = {\n getField: function (container) {\n return getPart(container, detail, 'field');\n },\n getLabel: function (container) {\n return getPart(container, detail, 'label');\n }\n };\n return {\n uid: detail.uid,\n dom: detail.dom,\n components: components,\n behaviours: behaviours,\n events: events,\n apis: apis\n };\n };\n var FormField = composite({\n name: 'FormField',\n configFields: schema$l(),\n partFields: parts$e(),\n factory: factory$i,\n apis: {\n getField: function (apis, comp) {\n return apis.getField(comp);\n },\n getLabel: function (apis, comp) {\n return apis.getLabel(comp);\n }\n }\n });\n var exhibit$2 = function (base, tabConfig) {\n return nu$7({\n attributes: wrapAll([{\n key: tabConfig.tabAttr,\n value: 'true'\n }])\n });\n };\n var ActiveTabstopping = /*#__PURE__*/Object.freeze({\n __proto__: null,\n exhibit: exhibit$2\n });\n var TabstopSchema = [defaulted('tabAttr', 'data-alloy-tabstop')];\n var Tabstopping = create$8({\n fields: TabstopSchema,\n name: 'tabstopping',\n active: ActiveTabstopping\n });\n var global$7 = tinymce.util.Tools.resolve('tinymce.html.Entities');\n var renderFormFieldWith = function (pLabel, pField, extraClasses, extraBehaviours) {\n var spec = renderFormFieldSpecWith(pLabel, pField, extraClasses, extraBehaviours);\n return FormField.sketch(spec);\n };\n var renderFormField = function (pLabel, pField) {\n return renderFormFieldWith(pLabel, pField, [], []);\n };\n var renderFormFieldSpecWith = function (pLabel, pField, extraClasses, extraBehaviours) {\n return {\n dom: renderFormFieldDomWith(extraClasses),\n components: pLabel.toArray().concat([pField]),\n fieldBehaviours: derive$1(extraBehaviours)\n };\n };\n var renderFormFieldDom = function () {\n return renderFormFieldDomWith([]);\n };\n var renderFormFieldDomWith = function (extraClasses) {\n return {\n tag: 'div',\n classes: ['tox-form__group'].concat(extraClasses)\n };\n };\n var renderLabel$2 = function (label, providersBackstage) {\n return FormField.parts.label({\n dom: {\n tag: 'label',\n classes: ['tox-label'],\n innerHtml: providersBackstage.translate(label)\n }\n });\n };\n var formChangeEvent = generate$6('form-component-change');\n var formCloseEvent = generate$6('form-close');\n var formCancelEvent = generate$6('form-cancel');\n var formActionEvent = generate$6('form-action');\n var formSubmitEvent = generate$6('form-submit');\n var formBlockEvent = generate$6('form-block');\n var formUnblockEvent = generate$6('form-unblock');\n var formTabChangeEvent = generate$6('form-tabchange');\n var formResizeEvent = generate$6('form-resize');\n var renderCollection = function (spec, providersBackstage) {\n var _a;\n var pLabel = spec.label.map(function (label) {\n return renderLabel$2(label, providersBackstage);\n });\n var runOnItem = function (f) {\n return function (comp, se) {\n closest$1(se.event.target, '[data-collection-item-value]').each(function (target) {\n f(comp, se, target, get$d(target, 'data-collection-item-value'));\n });\n };\n };\n var setContents = function (comp, items) {\n var htmlLines = map$2(items, function (item) {\n var itemText = global$e.translate(item.text);\n var textContent = spec.columns === 1 ? '' + sanitizeHtmlString(providersBackstage.translate(message)) + '
')\n }]\n }]\n });\n };\n var pFooter = function (buttons) {\n return ModalDialog.parts.footer({\n dom: {\n tag: 'div',\n classes: ['tox-dialog__footer']\n },\n components: buttons\n });\n };\n var pFooterGroup = function (startButtons, endButtons) {\n return [Container.sketch({\n dom: {\n tag: 'div',\n classes: ['tox-dialog__footer-start']\n },\n components: startButtons\n }), Container.sketch({\n dom: {\n tag: 'div',\n classes: ['tox-dialog__footer-end']\n },\n components: endButtons\n })];\n };\n var renderDialog$1 = function (spec) {\n var _a;\n var dialogClass = 'tox-dialog';\n var blockerClass = dialogClass + '-wrap';\n var blockerBackdropClass = blockerClass + '__backdrop';\n var scrollLockClass = dialogClass + '__disable-scroll';\n return ModalDialog.sketch({\n lazySink: spec.lazySink,\n onEscape: function (comp) {\n spec.onEscape(comp);\n return Optional.some(true);\n },\n useTabstopAt: function (elem) {\n return !isPseudoStop(elem);\n },\n dom: {\n tag: 'div',\n classes: [dialogClass].concat(spec.extraClasses),\n styles: __assign({\n position: 'relative'\n }, spec.extraStyles)\n },\n components: __spreadArray([spec.header, spec.body], spec.footer.toArray(), true),\n parts: {\n blocker: {\n dom: fromHtml(''),\n components: [{\n dom: {\n tag: 'div',\n classes: isTouch ? [blockerBackdropClass, blockerBackdropClass + '--opaque'] : [blockerBackdropClass]\n }\n }]\n }\n },\n dragBlockClass: blockerClass,\n modalBehaviours: derive$1(__spreadArray([Focusing.config({}), config('dialog-events', spec.dialogEvents.concat([runOnSource(focusin(), function (comp, _se) {\n Keying.focusIn(comp);\n })])), config('scroll-lock', [runOnAttached(function () {\n add$2(body(), scrollLockClass);\n }), runOnDetached(function () {\n remove$2(body(), scrollLockClass);\n })])], spec.extraBehaviours, true)),\n eventOrder: __assign((_a = {}, _a[execute$5()] = ['dialog-events'], _a[attachedToDom()] = ['scroll-lock', 'dialog-events', 'alloy.base.behaviour'], _a[detachedFromDom()] = ['alloy.base.behaviour', 'dialog-events', 'scroll-lock'], _a), spec.eventOrder)\n });\n };\n var renderClose = function (providersBackstage) {\n return Button.sketch({\n dom: {\n tag: 'button',\n classes: ['tox-button', 'tox-button--icon', 'tox-button--naked'],\n attributes: {\n 'type': 'button',\n 'aria-label': providersBackstage.translate('Close'),\n 'title': providersBackstage.translate('Close')\n }\n },\n components: [render$3('close', {\n tag: 'div',\n classes: ['tox-icon']\n }, providersBackstage.icons)],\n action: function (comp) {\n emit(comp, formCancelEvent);\n }\n });\n };\n var renderTitle = function (spec, id, providersBackstage) {\n var renderComponents = function (data) {\n return [text$1(providersBackstage.translate(data.title))];\n };\n return {\n dom: {\n tag: 'div',\n classes: ['tox-dialog__title'],\n attributes: __assign({}, id.map(function (x) {\n return {\n id: x\n };\n }).getOr({}))\n },\n components: renderComponents(spec),\n behaviours: derive$1([Reflecting.config({\n channel: titleChannel,\n renderComponents: renderComponents\n })])\n };\n };\n var renderDragHandle = function () {\n return {\n dom: fromHtml('')\n };\n };\n var renderInlineHeader = function (spec, titleId, providersBackstage) {\n return Container.sketch({\n dom: fromHtml(''),\n components: [renderTitle(spec, Optional.some(titleId), providersBackstage), renderDragHandle(), renderClose(providersBackstage)],\n containerBehaviours: derive$1([Dragging.config({\n mode: 'mouse',\n blockerClass: 'blocker',\n getTarget: function (handle) {\n return closest$1(handle, '[role=\"dialog\"]').getOrDie();\n },\n snaps: {\n getSnapPoints: function () {\n return [];\n },\n leftAttr: 'data-drag-left',\n topAttr: 'data-drag-top'\n }\n })])\n });\n };\n var renderModalHeader = function (spec, providersBackstage) {\n var pTitle = ModalDialog.parts.title(renderTitle(spec, Optional.none(), providersBackstage));\n var pHandle = ModalDialog.parts.draghandle(renderDragHandle());\n var pClose = ModalDialog.parts.close(renderClose(providersBackstage));\n var components = [pTitle].concat(spec.draggable ? [pHandle] : []).concat([pClose]);\n return Container.sketch({\n dom: fromHtml(''),\n components: components\n });\n };\n var getHeader = function (title, backstage) {\n return renderModalHeader({\n title: backstage.shared.providers.translate(title),\n draggable: backstage.dialog.isDraggableModal()\n }, backstage.shared.providers);\n };\n var getBusySpec = function (message, bs, providers) {\n return {\n dom: {\n tag: 'div',\n classes: ['tox-dialog__busy-spinner'],\n attributes: {\n 'aria-label': providers.translate(message)\n },\n styles: {\n left: '0px',\n right: '0px',\n bottom: '0px',\n top: '0px',\n position: 'absolute'\n }\n },\n behaviours: bs,\n components: [{\n dom: fromHtml('