');
+ });
+ global$c.each(handles, function (handle) {
+ global$e('#' + id, containerElm).append('
');
+ });
+ dragHelpers = global$c.map(handles, createDragHelper);
+ repaint(currentRect);
+ global$e(containerElm).on('focusin focusout', function (e) {
+ global$e(e.target).attr('aria-grabbed', e.type === 'focus' ? 'true' : 'false');
+ });
+ global$e(containerElm).on('keydown', function (e) {
+ var activeHandle;
+ global$c.each(handles, function (handle) {
+ if (e.target.id === id + '-' + handle.name) {
+ activeHandle = handle;
+ return false;
+ }
+ });
+ var moveAndBlock = function (evt, handle, startRect, deltaX, deltaY) {
+ evt.stopPropagation();
+ evt.preventDefault();
+ moveRect(activeHandle, startRect, deltaX, deltaY);
+ };
+ switch (e.keyCode) {
+ case global$g.LEFT:
+ moveAndBlock(e, activeHandle, currentRect, -10, 0);
+ break;
+ case global$g.RIGHT:
+ moveAndBlock(e, activeHandle, currentRect, 10, 0);
+ break;
+ case global$g.UP:
+ moveAndBlock(e, activeHandle, currentRect, 0, -10);
+ break;
+ case global$g.DOWN:
+ moveAndBlock(e, activeHandle, currentRect, 0, 10);
+ break;
+ case global$g.ENTER:
+ case global$g.SPACEBAR:
+ e.preventDefault();
+ action();
+ break;
+ }
+ });
+ };
+ var toggleVisibility = function (state) {
+ var selectors = global$c.map(handles, function (handle) {
+ return '#' + id + '-' + handle.name;
+ }).concat(global$c.map(blockers, function (blocker) {
+ return '#' + id + '-' + blocker;
+ })).join(',');
+ if (state) {
+ global$e(selectors, containerElm).show();
+ } else {
+ global$e(selectors, containerElm).hide();
+ }
+ };
+ var repaint = function (rect) {
+ var updateElementRect = function (name, rect) {
+ if (rect.h < 0) {
+ rect.h = 0;
+ }
+ if (rect.w < 0) {
+ rect.w = 0;
+ }
+ global$e('#' + id + '-' + name, containerElm).css({
+ left: rect.x,
+ top: rect.y,
+ width: rect.w,
+ height: rect.h
+ });
+ };
+ global$c.each(handles, function (handle) {
+ global$e('#' + id + '-' + handle.name, containerElm).css({
+ left: rect.w * handle.xMul + rect.x,
+ top: rect.h * handle.yMul + rect.y
+ });
+ });
+ updateElementRect('top', {
+ x: viewPortRect.x,
+ y: viewPortRect.y,
+ w: viewPortRect.w,
+ h: rect.y - viewPortRect.y
+ });
+ updateElementRect('right', {
+ x: rect.x + rect.w,
+ y: rect.y,
+ w: viewPortRect.w - rect.x - rect.w + viewPortRect.x,
+ h: rect.h
+ });
+ updateElementRect('bottom', {
+ x: viewPortRect.x,
+ y: rect.y + rect.h,
+ w: viewPortRect.w,
+ h: viewPortRect.h - rect.y - rect.h + viewPortRect.y
+ });
+ updateElementRect('left', {
+ x: viewPortRect.x,
+ y: rect.y,
+ w: rect.x - viewPortRect.x,
+ h: rect.h
+ });
+ updateElementRect('move', rect);
+ };
+ var setRect = function (rect) {
+ currentRect = rect;
+ repaint(currentRect);
+ };
+ var setViewPortRect = function (rect) {
+ viewPortRect = rect;
+ repaint(currentRect);
+ };
+ var setInnerRect = function (rect) {
+ setRect(getAbsoluteRect(clampRect, rect));
+ };
+ var setClampRect = function (rect) {
+ clampRect = rect;
+ repaint(currentRect);
+ };
+ var destroy = function () {
+ global$c.each(dragHelpers, function (helper) {
+ helper.destroy();
+ });
+ dragHelpers = [];
+ };
+ render();
+ var instance = global$c.extend({
+ toggleVisibility: toggleVisibility,
+ setClampRect: setClampRect,
+ setRect: setRect,
+ getInnerRect: getInnerRect,
+ setInnerRect: setInnerRect,
+ setViewPortRect: setViewPortRect,
+ destroy: destroy
+ }, global$f);
+ return instance;
+ };
+ var CropRect = { create: create$7 };
+
+ var loadImage = function (image) {
+ return new global$4(function (resolve) {
+ var loaded = function () {
+ image.removeEventListener('load', loaded);
+ resolve(image);
+ };
+ if (image.complete) {
+ resolve(image);
+ } else {
+ image.addEventListener('load', loaded);
+ }
+ });
+ };
+ var renderImagePanel = function (initialUrl) {
+ var memBg = record({
+ dom: {
+ tag: 'div',
+ classes: ['tox-image-tools__image-bg'],
+ attributes: { role: 'presentation' }
+ }
+ });
+ var zoomState = Cell(1);
+ var cropRect = Cell(Optional.none());
+ var rectState = Cell({
+ x: 0,
+ y: 0,
+ w: 1,
+ h: 1
+ });
+ var viewRectState = Cell({
+ x: 0,
+ y: 0,
+ w: 1,
+ h: 1
+ });
+ var repaintImg = function (anyInSystem, img) {
+ memContainer.getOpt(anyInSystem).each(function (panel) {
+ var zoom = zoomState.get();
+ var panelW = get$8(panel.element);
+ var panelH = get$7(panel.element);
+ var width = img.dom.naturalWidth * zoom;
+ var height = img.dom.naturalHeight * zoom;
+ var left = Math.max(0, panelW / 2 - width / 2);
+ var top = Math.max(0, panelH / 2 - height / 2);
+ var css = {
+ left: left.toString() + 'px',
+ top: top.toString() + 'px',
+ width: width.toString() + 'px',
+ height: height.toString() + 'px',
+ position: 'absolute'
+ };
+ setAll$1(img, css);
+ memBg.getOpt(panel).each(function (bg) {
+ setAll$1(bg.element, css);
+ });
+ cropRect.get().each(function (cRect) {
+ var rect = rectState.get();
+ cRect.setRect({
+ x: rect.x * zoom + left,
+ y: rect.y * zoom + top,
+ w: rect.w * zoom,
+ h: rect.h * zoom
+ });
+ cRect.setClampRect({
+ x: left,
+ y: top,
+ w: width,
+ h: height
+ });
+ cRect.setViewPortRect({
+ x: 0,
+ y: 0,
+ w: panelW,
+ h: panelH
+ });
+ });
+ });
+ };
+ var zoomFit = function (anyInSystem, img) {
+ memContainer.getOpt(anyInSystem).each(function (panel) {
+ var panelW = get$8(panel.element);
+ var panelH = get$7(panel.element);
+ var width = img.dom.naturalWidth;
+ var height = img.dom.naturalHeight;
+ var zoom = Math.min(panelW / width, panelH / height);
+ if (zoom >= 1) {
+ zoomState.set(1);
+ } else {
+ zoomState.set(zoom);
+ }
+ });
+ };
+ var updateSrc = function (anyInSystem, url) {
+ var img = SugarElement.fromTag('img');
+ set$1(img, 'src', url);
+ return loadImage(img.dom).then(function () {
+ return memContainer.getOpt(anyInSystem).map(function (panel) {
+ var aImg = external({ element: img });
+ Replacing.replaceAt(panel, 1, Optional.some(aImg));
+ var lastViewRect = viewRectState.get();
+ var viewRect = {
+ x: 0,
+ y: 0,
+ w: img.dom.naturalWidth,
+ h: img.dom.naturalHeight
+ };
+ viewRectState.set(viewRect);
+ var rect = global$d.inflate(viewRect, -20, -20);
+ rectState.set(rect);
+ if (lastViewRect.w !== viewRect.w || lastViewRect.h !== viewRect.h) {
+ zoomFit(panel, img);
+ }
+ repaintImg(panel, img);
+ return img;
+ });
+ });
+ };
+ var zoom = function (anyInSystem, direction) {
+ var currentZoom = zoomState.get();
+ var newZoom = direction > 0 ? Math.min(2, currentZoom + 0.1) : Math.max(0.1, currentZoom - 0.1);
+ zoomState.set(newZoom);
+ memContainer.getOpt(anyInSystem).each(function (panel) {
+ var img = panel.components()[1].element;
+ repaintImg(panel, img);
+ });
+ };
+ var showCrop = function () {
+ cropRect.get().each(function (cRect) {
+ cRect.toggleVisibility(true);
+ });
+ };
+ var hideCrop = function () {
+ cropRect.get().each(function (cRect) {
+ cRect.toggleVisibility(false);
+ });
+ };
+ var getRect = function () {
+ return rectState.get();
+ };
+ var container = Container.sketch({
+ dom: {
+ tag: 'div',
+ classes: ['tox-image-tools__image']
+ },
+ components: [
+ memBg.asSpec(),
+ {
+ dom: {
+ tag: 'img',
+ attributes: { src: initialUrl }
+ }
+ },
+ {
+ dom: { tag: 'div' },
+ behaviours: derive$1([config('image-panel-crop-events', [runOnAttached(function (comp) {
+ memContainer.getOpt(comp).each(function (container) {
+ var el = container.element.dom;
+ var cRect = CropRect.create({
+ x: 10,
+ y: 10,
+ w: 100,
+ h: 100
+ }, {
+ x: 0,
+ y: 0,
+ w: 200,
+ h: 200
+ }, {
+ x: 0,
+ y: 0,
+ w: 200,
+ h: 200
+ }, el, noop);
+ cRect.toggleVisibility(false);
+ cRect.on('updateRect', function (e) {
+ var rect = e.rect;
+ var zoom = zoomState.get();
+ var newRect = {
+ x: Math.round(rect.x / zoom),
+ y: Math.round(rect.y / zoom),
+ w: Math.round(rect.w / zoom),
+ h: Math.round(rect.h / zoom)
+ };
+ rectState.set(newRect);
+ });
+ cropRect.set(Optional.some(cRect));
+ });
+ })])])
+ }
+ ],
+ containerBehaviours: derive$1([
+ Replacing.config({}),
+ config('image-panel-events', [runOnAttached(function (comp) {
+ updateSrc(comp, initialUrl);
+ })])
+ ])
+ });
+ var memContainer = record(container);
+ var getMeasurements = function () {
+ var viewRect = viewRectState.get();
+ return {
+ width: viewRect.w,
+ height: viewRect.h
+ };
+ };
+ return {
+ memContainer: memContainer,
+ updateSrc: updateSrc,
+ zoom: zoom,
+ showCrop: showCrop,
+ hideCrop: hideCrop,
+ getRect: getRect,
+ getMeasurements: getMeasurements
+ };
+ };
+
+ var createButton = function (innerHtml, icon, disabled, action, providersBackstage) {
+ return renderIconButton({
+ name: innerHtml,
+ icon: Optional.some(icon),
+ disabled: disabled,
+ tooltip: Optional.some(innerHtml),
+ primary: false,
+ borderless: false
+ }, action, providersBackstage);
+ };
+ var setButtonEnabled = function (button, enabled) {
+ if (enabled) {
+ Disabling.enable(button);
+ } else {
+ Disabling.disable(button);
+ }
+ };
+ var renderSideBar = function (providersBackstage) {
+ var updateButtonUndoStates = function (anyInSystem, undoEnabled, redoEnabled) {
+ memUndo.getOpt(anyInSystem).each(function (undo) {
+ setButtonEnabled(undo, undoEnabled);
+ });
+ memRedo.getOpt(anyInSystem).each(function (redo) {
+ setButtonEnabled(redo, redoEnabled);
+ });
+ };
+ var memUndo = record(createButton('Undo', 'undo', true, function (button) {
+ emitWith(button, internal.undo(), { direction: 1 });
+ }, providersBackstage));
+ var memRedo = record(createButton('Redo', 'redo', true, function (button) {
+ emitWith(button, internal.redo(), { direction: 1 });
+ }, providersBackstage));
+ var container = Container.sketch({
+ dom: {
+ tag: 'div',
+ classes: [
+ 'tox-image-tools__toolbar',
+ 'tox-image-tools__sidebar'
+ ]
+ },
+ components: [
+ memUndo.asSpec(),
+ memRedo.asSpec(),
+ createButton('Zoom in', 'zoom-in', false, function (button) {
+ emitWith(button, internal.zoom(), { direction: 1 });
+ }, providersBackstage),
+ createButton('Zoom out', 'zoom-out', false, function (button) {
+ emitWith(button, internal.zoom(), { direction: -1 });
+ }, providersBackstage)
+ ]
+ });
+ return {
+ container: container,
+ updateButtonUndoStates: updateButtonUndoStates
+ };
+ };
+
+ function UndoStack () {
+ var data = [];
+ var index = -1;
+ var add = function (state) {
+ var removed = data.splice(++index);
+ data.push(state);
+ return {
+ state: state,
+ removed: removed
+ };
+ };
+ var undo = function () {
+ if (canUndo()) {
+ return data[--index];
+ }
+ };
+ var redo = function () {
+ if (canRedo()) {
+ return data[++index];
+ }
+ };
+ var canUndo = function () {
+ return index > 0;
+ };
+ var canRedo = function () {
+ return index !== -1 && index < data.length - 1;
+ };
+ return {
+ data: data,
+ add: add,
+ undo: undo,
+ redo: redo,
+ canUndo: canUndo,
+ canRedo: canRedo
+ };
+ }
+
+ var makeState = function (initialState) {
+ var blobState = Cell(initialState);
+ var tempState = Cell(Optional.none());
+ var undoStack = UndoStack();
+ undoStack.add(initialState);
+ var getBlobState = function () {
+ return blobState.get();
+ };
+ var setBlobState = function (state) {
+ blobState.set(state);
+ };
+ var getTempState = function () {
+ return tempState.get().fold(function () {
+ return blobState.get();
+ }, function (temp) {
+ return temp;
+ });
+ };
+ var updateTempState = function (blob) {
+ var newTempState = createState(blob);
+ destroyTempState();
+ tempState.set(Optional.some(newTempState));
+ return newTempState.url;
+ };
+ var createState = function (blob) {
+ return {
+ blob: blob,
+ url: URL.createObjectURL(blob)
+ };
+ };
+ var destroyState = function (state) {
+ URL.revokeObjectURL(state.url);
+ };
+ var destroyStates = function (states) {
+ global$c.each(states, destroyState);
+ };
+ var destroyTempState = function () {
+ tempState.get().each(destroyState);
+ tempState.set(Optional.none());
+ };
+ var addBlobState = function (blob) {
+ var newState = createState(blob);
+ setBlobState(newState);
+ var removed = undoStack.add(newState).removed;
+ destroyStates(removed);
+ return newState.url;
+ };
+ var addTempState = function (blob) {
+ var newState = createState(blob);
+ tempState.set(Optional.some(newState));
+ return newState.url;
+ };
+ var applyTempState = function (postApply) {
+ return tempState.get().fold(noop, function (temp) {
+ addBlobState(temp.blob);
+ postApply();
+ });
+ };
+ var undo = function () {
+ var currentState = undoStack.undo();
+ setBlobState(currentState);
+ return currentState.url;
+ };
+ var redo = function () {
+ var currentState = undoStack.redo();
+ setBlobState(currentState);
+ return currentState.url;
+ };
+ var getHistoryStates = function () {
+ var undoEnabled = undoStack.canUndo();
+ var redoEnabled = undoStack.canRedo();
+ return {
+ undoEnabled: undoEnabled,
+ redoEnabled: redoEnabled
+ };
+ };
+ return {
+ getBlobState: getBlobState,
+ setBlobState: setBlobState,
+ addBlobState: addBlobState,
+ getTempState: getTempState,
+ updateTempState: updateTempState,
+ addTempState: addTempState,
+ applyTempState: applyTempState,
+ destroyTempState: destroyTempState,
+ undo: undo,
+ redo: redo,
+ getHistoryStates: getHistoryStates
+ };
+ };
+
+ var renderImageTools = function (detail, providersBackstage) {
+ var state = makeState(detail.currentState);
+ var zoom = function (anyInSystem, simulatedEvent) {
+ var direction = simulatedEvent.event.direction;
+ imagePanel.zoom(anyInSystem, direction);
+ };
+ var updateButtonUndoStates = function (anyInSystem) {
+ var historyStates = state.getHistoryStates();
+ sideBar.updateButtonUndoStates(anyInSystem, historyStates.undoEnabled, historyStates.redoEnabled);
+ emitWith(anyInSystem, external$2.formActionEvent, {
+ name: external$2.saveState(),
+ value: historyStates.undoEnabled
+ });
+ };
+ var disableUndoRedo = function (anyInSystem) {
+ sideBar.updateButtonUndoStates(anyInSystem, false, false);
+ };
+ var undo = function (anyInSystem, _simulatedEvent) {
+ var url = state.undo();
+ updateSrc(anyInSystem, url).then(function (_oImg) {
+ unblock(anyInSystem);
+ updateButtonUndoStates(anyInSystem);
+ });
+ };
+ var redo = function (anyInSystem, _simulatedEvent) {
+ var url = state.redo();
+ updateSrc(anyInSystem, url).then(function (_oImg) {
+ unblock(anyInSystem);
+ updateButtonUndoStates(anyInSystem);
+ });
+ };
+ var imageResultToBlob = function (ir) {
+ return ir.toBlob();
+ };
+ var block = function (anyInSystem) {
+ emitWith(anyInSystem, external$2.formActionEvent, {
+ name: external$2.disable(),
+ value: {}
+ });
+ };
+ var unblock = function (anyInSystem) {
+ editPanel.getApplyButton(anyInSystem).each(function (applyButton) {
+ Disabling.enable(applyButton);
+ });
+ emitWith(anyInSystem, external$2.formActionEvent, {
+ name: external$2.enable(),
+ value: {}
+ });
+ };
+ var updateSrc = function (anyInSystem, src) {
+ block(anyInSystem);
+ return imagePanel.updateSrc(anyInSystem, src);
+ };
+ var blobManipulate = function (anyInSystem, blob, filter, action, swap) {
+ block(anyInSystem);
+ return blobToImageResult(blob).then(filter).then(imageResultToBlob).then(action).then(function (url) {
+ return updateSrc(anyInSystem, url).then(function (oImg) {
+ updateButtonUndoStates(anyInSystem);
+ swap();
+ unblock(anyInSystem);
+ return oImg;
+ });
+ }).catch(function (err) {
+ console.log(err);
+ unblock(anyInSystem);
+ return err;
+ });
+ };
+ var manipulate = function (anyInSystem, filter, swap) {
+ var blob = state.getBlobState().blob;
+ var action = function (blob) {
+ return state.updateTempState(blob);
+ };
+ blobManipulate(anyInSystem, blob, filter, action, swap);
+ };
+ var tempManipulate = function (anyInSystem, filter) {
+ var blob = state.getTempState().blob;
+ var action = function (blob) {
+ return state.addTempState(blob);
+ };
+ blobManipulate(anyInSystem, blob, filter, action, noop);
+ };
+ var manipulateApply = function (anyInSystem, filter, swap) {
+ var blob = state.getBlobState().blob;
+ var action = function (blob) {
+ var url = state.addBlobState(blob);
+ destroyTempState(anyInSystem);
+ return url;
+ };
+ blobManipulate(anyInSystem, blob, filter, action, swap);
+ };
+ var apply = function (anyInSystem, simulatedEvent) {
+ var postApply = function () {
+ destroyTempState(anyInSystem);
+ var swap = simulatedEvent.event.swap;
+ swap();
+ };
+ state.applyTempState(postApply);
+ };
+ var destroyTempState = function (anyInSystem) {
+ var currentUrl = state.getBlobState().url;
+ state.destroyTempState();
+ updateButtonUndoStates(anyInSystem);
+ return currentUrl;
+ };
+ var cancel = function (anyInSystem) {
+ var currentUrl = destroyTempState(anyInSystem);
+ updateSrc(anyInSystem, currentUrl).then(function (_oImg) {
+ unblock(anyInSystem);
+ });
+ };
+ var back = function (anyInSystem, simulatedEvent) {
+ cancel(anyInSystem);
+ var swap = simulatedEvent.event.swap;
+ swap();
+ imagePanel.hideCrop();
+ };
+ var transform = function (anyInSystem, simulatedEvent) {
+ return manipulate(anyInSystem, simulatedEvent.event.transform, noop);
+ };
+ var tempTransform = function (anyInSystem, simulatedEvent) {
+ return tempManipulate(anyInSystem, simulatedEvent.event.transform);
+ };
+ var transformApply = function (anyInSystem, simulatedEvent) {
+ return manipulateApply(anyInSystem, simulatedEvent.event.transform, simulatedEvent.event.swap);
+ };
+ var imagePanel = renderImagePanel(detail.currentState.url);
+ var sideBar = renderSideBar(providersBackstage);
+ var editPanel = renderEditPanel(imagePanel, providersBackstage);
+ var swap = function (anyInSystem, simulatedEvent) {
+ disableUndoRedo(anyInSystem);
+ var transform = simulatedEvent.event.transform;
+ var swap = simulatedEvent.event.swap;
+ transform.fold(function () {
+ swap();
+ }, function (transform) {
+ manipulate(anyInSystem, transform, swap);
+ });
+ };
+ return {
+ dom: {
+ tag: 'div',
+ attributes: { role: 'presentation' }
+ },
+ components: [
+ editPanel.memContainer.asSpec(),
+ imagePanel.memContainer.asSpec(),
+ sideBar.container
+ ],
+ behaviours: derive$1([
+ Representing.config({
+ store: {
+ mode: 'manual',
+ getValue: function () {
+ return state.getBlobState();
+ }
+ }
+ }),
+ config('image-tools-events', [
+ run(internal.undo(), undo),
+ run(internal.redo(), redo),
+ run(internal.zoom(), zoom),
+ run(internal.back(), back),
+ run(internal.apply(), apply),
+ run(internal.transform(), transform),
+ run(internal.tempTransform(), tempTransform),
+ run(internal.transformApply(), transformApply),
+ run(internal.swap(), swap)
+ ]),
+ ComposingConfigs.self()
+ ])
+ };
+ };
+
+ var renderLabel$2 = function (spec, backstageShared) {
+ var label = {
+ dom: {
+ tag: 'label',
+ innerHtml: backstageShared.providers.translate(spec.label),
+ classes: ['tox-label']
+ }
+ };
+ var comps = map(spec.items, backstageShared.interpreter);
+ return {
+ dom: {
+ tag: 'div',
+ classes: ['tox-form__group']
+ },
+ components: [label].concat(comps),
+ behaviours: derive$1([
+ ComposingConfigs.self(),
+ Replacing.config({}),
+ RepresentingConfigs.domHtml(Optional.none()),
+ Keying.config({ mode: 'acyclic' })
+ ])
+ };
+ };
+
+ var isSingleListItem = function (item) {
+ return !has(item, 'items');
+ };
+ var dataAttribute = 'data-value';
+ var fetchItems = function (dropdownComp, name, items, selectedValue) {
+ return map(items, function (item) {
+ if (!isSingleListItem(item)) {
+ return {
+ type: 'nestedmenuitem',
+ text: item.text,
+ getSubmenuItems: function () {
+ return fetchItems(dropdownComp, name, item.items, selectedValue);
+ }
+ };
+ } else {
+ return {
+ type: 'togglemenuitem',
+ text: item.text,
+ value: item.value,
+ active: item.value === selectedValue,
+ onAction: function () {
+ Representing.setValue(dropdownComp, item.value);
+ emitWith(dropdownComp, formChangeEvent, { name: name });
+ Focusing.focus(dropdownComp);
+ }
+ };
+ }
+ });
+ };
+ var findItemByValue = function (items, value) {
+ return findMap(items, function (item) {
+ if (!isSingleListItem(item)) {
+ return findItemByValue(item.items, value);
+ } else {
+ return someIf(item.value === value, item);
+ }
+ });
+ };
+ var renderListBox = function (spec, backstage) {
+ var providersBackstage = backstage.shared.providers;
+ var initialItem = head(spec.items).filter(isSingleListItem);
+ var pLabel = spec.label.map(function (label) {
+ return renderLabel(label, providersBackstage);
+ });
+ var pField = FormField.parts.field({
+ dom: {},
+ factory: {
+ sketch: function (sketchSpec) {
+ return renderCommonDropdown({
+ uid: sketchSpec.uid,
+ text: initialItem.map(function (item) {
+ return item.text;
+ }),
+ icon: Optional.none(),
+ tooltip: spec.label,
+ role: Optional.none(),
+ fetch: function (comp, callback) {
+ var items = fetchItems(comp, spec.name, spec.items, Representing.getValue(comp));
+ callback(build$2(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, false));
+ },
+ onSetup: constant(noop),
+ getApi: constant({}),
+ columns: 1,
+ presets: 'normal',
+ classes: [],
+ dropdownBehaviours: [
+ Tabstopping.config({}),
+ Representing.config({
+ store: {
+ mode: 'manual',
+ initialValue: initialItem.map(function (item) {
+ return item.value;
+ }).getOr(''),
+ getValue: function (comp) {
+ return get$3(comp.element, dataAttribute);
+ },
+ setValue: function (comp, data) {
+ findItemByValue(spec.items, data).each(function (item) {
+ set$1(comp.element, dataAttribute, item.value);
+ emitWith(comp, updateMenuText, { text: item.text });
+ });
+ }
+ }
+ })
+ ]
+ }, 'tox-listbox', backstage.shared);
+ }
+ }
+ });
+ var listBoxWrap = {
+ dom: {
+ tag: 'div',
+ classes: ['tox-listboxfield']
+ },
+ components: [pField]
+ };
+ return FormField.sketch({
+ dom: {
+ tag: 'div',
+ classes: ['tox-form__group']
+ },
+ components: flatten([
+ pLabel.toArray(),
+ [listBoxWrap]
+ ]),
+ fieldBehaviours: derive$1([Disabling.config({
+ disabled: constant(spec.disabled),
+ onDisabled: function (comp) {
+ FormField.getField(comp).each(Disabling.disable);
+ },
+ onEnabled: function (comp) {
+ FormField.getField(comp).each(Disabling.enable);
+ }
+ })])
+ });
+ };
+
+ var renderPanel = function (spec, backstage) {
+ return {
+ dom: {
+ tag: 'div',
+ classes: spec.classes
+ },
+ components: map(spec.items, backstage.shared.interpreter)
+ };
+ };
+
+ var factory$8 = function (detail, _spec) {
+ var options = map(detail.options, function (option) {
+ // console.log(option)
+ return {
+ dom: {
+ tag: 'option',
+ value: option.value,
+ innerHtml: option.text,
+ hmto:option.hmto||null
+ }
+ };
+ });
+ var initialValues = detail.data.map(function (v) {
+ return wrap$1('initialValue', v);
+ }).getOr({});
+ return {
+ uid: detail.uid,
+ dom: {
+ tag: 'select',
+ classes: detail.selectClasses,
+ attributes: detail.selectAttributes
+ },
+ components: options,
+ behaviours: augment(detail.selectBehaviours, [
+ Focusing.config({}),
+ Representing.config({
+ store: __assign({
+ mode: 'manual',
+ getValue: function (select) {
+ return get$6(select.element);
+ },
+ setValue: function (select, newValue) {
+ var found = find(detail.options, function (opt) {
+ return opt.value === newValue;
+ });
+ if (found.isSome()) {
+ set$3(select.element, newValue);
+ }
+ }
+ }, initialValues)
+ })
+ ])
+ };
+ };
+ var HtmlSelect = single$2({
+ name: 'HtmlSelect',
+ configFields: [
+ strict$1('options'),
+ field$1('selectBehaviours', [
+ Focusing,
+ Representing
+ ]),
+ defaulted$1('selectClasses', []),
+ defaulted$1('selectAttributes', {}),
+ option('data')
+ ],
+ factory: factory$8
+ });
+
+ var renderSelectBox = function (spec, providersBackstage) {
+ // console.log(spec)
+ var translatedOptions = map(spec.items, function (item) {
+ return {
+ text: providersBackstage.translate(item.text),
+ value: item.value,
+ hmto:item.hmto
+ };
+ });
+ var pLabel = spec.label.map(function (label) {
+ return renderLabel(label, providersBackstage);
+ });
+ var pField = FormField.parts.field({
+ dom: {},
+ selectAttributes: { size: spec.size },
+ options: translatedOptions,
+ factory: HtmlSelect,
+ selectBehaviours: derive$1([
+ Disabling.config({
+ disabled: function () {
+ return spec.disabled || providersBackstage.isDisabled();
+ }
+ }),
+ Tabstopping.config({}),
+ config('selectbox-change', [run(change(), function (component, _) {
+ emitWith(component, formChangeEvent, { name: spec.name });
+ })])
+ ])
+ });
+ var chevron = spec.size > 1 ? Optional.none() : Optional.some({
+ dom: {
+ tag: 'div',
+ classes: ['tox-selectfield__icon-js'],
+ innerHtml: get$e('chevron-down', providersBackstage.icons)
+ }
+ });
+ var selectWrap = {
+ dom: {
+ tag: 'div',
+ classes: ['tox-selectfield']
+ },
+ components: flatten([
+ [pField],
+ chevron.toArray()
+ ])
+ };
+ return FormField.sketch({
+ dom: {
+ tag: 'div',
+ classes: ['tox-form__group']
+ },
+ components: flatten([
+ pLabel.toArray(),
+ [selectWrap]
+ ]),
+ fieldBehaviours: derive$1([
+ Disabling.config({
+ disabled: function () {
+ return spec.disabled || providersBackstage.isDisabled();
+ },
+ onDisabled: function (comp) {
+ FormField.getField(comp).each(Disabling.disable);
+ },
+ onEnabled: function (comp) {
+ FormField.getField(comp).each(Disabling.enable);
+ }
+ }),
+ receivingConfig()
+ ])
+ });
+ };
+
+ var renderTable = function (spec, providersBackstage) {
+ var renderTh = function (text) {
+ return {
+ dom: {
+ tag: 'th',
+ innerHtml: providersBackstage.translate(text)
+ }
+ };
+ };
+ var renderHeader = function (header) {
+ return {
+ dom: { tag: 'thead' },
+ components: [{
+ dom: { tag: 'tr' },
+ components: map(header, renderTh)
+ }]
+ };
+ };
+ var renderTd = function (text) {
+ return {
+ dom: {
+ tag: 'td',
+ innerHtml: providersBackstage.translate(text)
+ }
+ };
+ };
+ var renderTr = function (row) {
+ return {
+ dom: { tag: 'tr' },
+ components: map(row, renderTd)
+ };
+ };
+ var renderRows = function (rows) {
+ return {
+ dom: { tag: 'tbody' },
+ components: map(rows, renderTr)
+ };
+ };
+ return {
+ dom: {
+ tag: 'table',
+ classes: ['tox-dialog__table']
+ },
+ components: [
+ renderHeader(spec.header),
+ renderRows(spec.cells)
+ ],
+ behaviours: derive$1([
+ Tabstopping.config({}),
+ Focusing.config({})
+ ])
+ };
+ };
+
+ var renderTextField = function (spec, providersBackstage) {
+ var pLabel = spec.label.map(function (label) {
+ return renderLabel(label, providersBackstage);
+ });
+ var baseInputBehaviours = [
+ Disabling.config({
+ disabled: function () {
+ return spec.disabled || providersBackstage.isDisabled();
+ }
+ }),
+ receivingConfig(),
+ Keying.config({
+ mode: 'execution',
+ useEnter: spec.multiline !== true,
+ useControlEnter: spec.multiline === true,
+ execute: function (comp) {
+ emit(comp, formSubmitEvent);
+ return Optional.some(true);
+ }
+ }),
+ config('textfield-change', [
+ run(input(), function (component, _) {
+ emitWith(component, formChangeEvent, { name: spec.name });
+ }),
+ run(postPaste(), function (component, _) {
+ emitWith(component, formChangeEvent, { name: spec.name });
+ })
+ ]),
+ Tabstopping.config({})
+ ];
+ var validatingBehaviours = spec.validation.map(function (vl) {
+ return Invalidating.config({
+ getRoot: function (input) {
+ return parent(input.element);
+ },
+ invalidClass: 'tox-invalid',
+ validator: {
+ validate: function (input) {
+ var v = Representing.getValue(input);
+ var result = vl.validator(v);
+ return Future.pure(result === true ? Result.value(v) : Result.error(result));
+ },
+ validateOnLoad: vl.validateOnLoad
+ }
+ });
+ }).toArray();
+ var placeholder = spec.placeholder.fold(constant({}), function (p) {
+ return { placeholder: providersBackstage.translate(p) };
+ });
+ var inputMode = spec.inputMode.fold(constant({}), function (mode) {
+ return { inputmode: mode };
+ });
+ var inputAttributes = __assign(__assign({}, placeholder), inputMode);
+ var pField = FormField.parts.field({
+ tag: spec.multiline === true ? 'textarea' : 'input',
+ inputAttributes: inputAttributes,
+ inputClasses: spec.classname,
+ inputBehaviours: derive$1(flatten([
+ baseInputBehaviours,
+ validatingBehaviours
+ ])),
+ selectOnFocus: false,
+ factory: Input
+ });
+ var extraClasses = spec.flex ? ['tox-form__group--stretched'] : [];
+ var extraClasses2 = extraClasses.concat(spec.maximized ? ['tox-form-group--maximize'] : []);
+ var extraBehaviours = [
+ Disabling.config({
+ disabled: function () {
+ return spec.disabled || providersBackstage.isDisabled();
+ },
+ onDisabled: function (comp) {
+ FormField.getField(comp).each(Disabling.disable);
+ },
+ onEnabled: function (comp) {
+ FormField.getField(comp).each(Disabling.enable);
+ }
+ }),
+ receivingConfig()
+ ];
+ return renderFormFieldWith(pLabel, pField, extraClasses2, extraBehaviours);
+ };
+ var renderInput = function (spec, providersBackstage) {
+ // console.log(spec)
+ return renderTextField({
+ name: spec.name,
+ multiline: false,
+ label: spec.label,
+ inputMode: spec.inputMode,
+ placeholder: spec.placeholder,
+ hmfor:spec.hmfor,
+ flex: false,
+ disabled: spec.disabled,
+ classname: ['tox-textfield',spec.class],
+ validation: Optional.none(),
+ maximized: spec.maximized
+ }, providersBackstage);
+ };
+ var renderTextarea = function (spec, providersBackstage) {
+ return renderTextField({
+ name: spec.name,
+ multiline: true,
+ label: spec.label,
+ inputMode: Optional.none(),
+ placeholder: spec.placeholder,
+ flex: true,
+ disabled: spec.disabled,
+ classname: 'tox-textarea',
+ validation: Optional.none(),
+ maximized: spec.maximized
+ }, providersBackstage);
+ };
+
+ var events$c = function (streamConfig, streamState) {
+ var streams = streamConfig.stream.streams;
+ var processor = streams.setup(streamConfig, streamState);
+ return derive([
+ run(streamConfig.event, processor),
+ runOnDetached(function () {
+ return streamState.cancel();
+ })
+ ].concat(streamConfig.cancelEvent.map(function (e) {
+ return [run(e, function () {
+ return streamState.cancel();
+ })];
+ }).getOr([])));
+ };
+
+ var ActiveStreaming = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ events: events$c
+ });
+
+ var throttle = function (_config) {
+ var state = Cell(null);
+ var readState = function () {
+ return { timer: state.get() !== null ? 'set' : 'unset' };
+ };
+ var setTimer = function (t) {
+ state.set(t);
+ };
+ var cancel = function () {
+ var t = state.get();
+ if (t !== null) {
+ t.cancel();
+ }
+ };
+ return nu$5({
+ readState: readState,
+ setTimer: setTimer,
+ cancel: cancel
+ });
+ };
+ var init$6 = function (spec) {
+ return spec.stream.streams.state(spec);
+ };
+
+ var StreamingState = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ throttle: throttle,
+ init: init$6
+ });
+
+ var setup$2 = function (streamInfo, streamState) {
+ var sInfo = streamInfo.stream;
+ var throttler = last$2(streamInfo.onStream, sInfo.delay);
+ streamState.setTimer(throttler);
+ return function (component, simulatedEvent) {
+ throttler.throttle(component, simulatedEvent);
+ if (sInfo.stopEvent) {
+ simulatedEvent.stop();
+ }
+ };
+ };
+ var StreamingSchema = [
+ strictOf('stream', choose$1('mode', {
+ throttle: [
+ strict$1('delay'),
+ defaulted$1('stopEvent', true),
+ output('streams', {
+ setup: setup$2,
+ state: throttle
+ })
+ ]
+ })),
+ defaulted$1('event', 'input'),
+ option('cancelEvent'),
+ onStrictHandler('onStream')
+ ];
+
+ var Streaming = create$1({
+ fields: StreamingSchema,
+ name: 'streaming',
+ active: ActiveStreaming,
+ state: StreamingState
+ });
+
+ var setValueFromItem = function (model, input, item) {
+ var itemData = Representing.getValue(item);
+ Representing.setValue(input, itemData);
+ setCursorAtEnd(input);
+ };
+ var setSelectionOn = function (input, f) {
+ var el = input.element;
+ var value = get$6(el);
+ var node = el.dom;
+ if (get$3(el, 'type') !== 'number') {
+ f(node, value);
+ }
+ };
+ var setCursorAtEnd = function (input) {
+ setSelectionOn(input, function (node, value) {
+ return node.setSelectionRange(value.length, value.length);
+ });
+ };
+ var setSelectionToEnd = function (input, startOffset) {
+ setSelectionOn(input, function (node, value) {
+ return node.setSelectionRange(startOffset, value.length);
+ });
+ };
+ var attemptSelectOver = function (model, input, item) {
+ if (!model.selectsOver) {
+ return Optional.none();
+ } else {
+ var currentValue = Representing.getValue(input);
+ var inputDisplay_1 = model.getDisplayText(currentValue);
+ var itemValue = Representing.getValue(item);
+ var itemDisplay = model.getDisplayText(itemValue);
+ return itemDisplay.indexOf(inputDisplay_1) === 0 ? Optional.some(function () {
+ setValueFromItem(model, input, item);
+ setSelectionToEnd(input, inputDisplay_1.length);
+ }) : Optional.none();
+ }
+ };
+
+ var itemExecute = constant('alloy.typeahead.itemexecute');
+
+ var make$5 = function (detail, components, spec, externals) {
+ var navigateList = function (comp, simulatedEvent, highlighter) {
+ detail.previewing.set(false);
+ var sandbox = Coupling.getCoupled(comp, 'sandbox');
+ if (Sandboxing.isOpen(sandbox)) {
+ Composing.getCurrent(sandbox).each(function (menu) {
+ Highlighting.getHighlighted(menu).fold(function () {
+ highlighter(menu);
+ }, function () {
+ dispatchEvent(sandbox, menu.element, 'keydown', simulatedEvent);
+ });
+ });
+ } else {
+ var onOpenSync = function (sandbox) {
+ Composing.getCurrent(sandbox).each(highlighter);
+ };
+ open$1(detail, mapFetch(comp), comp, sandbox, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop);
+ }
+ };
+ var focusBehaviours$1 = focusBehaviours(detail);
+ var mapFetch = function (comp) {
+ return function (tdata) {
+ return tdata.map(function (data) {
+ var menus = values(data.menus);
+ var items = bind(menus, function (menu) {
+ return filter(menu.items, function (item) {
+ return item.type === 'item';
+ });
+ });
+ var repState = Representing.getState(comp);
+ repState.update(map(items, function (item) {
+ return item.data;
+ }));
+ return data;
+ });
+ };
+ };
+ var behaviours = [
+ Focusing.config({}),
+ Representing.config({
+ onSetValue: detail.onSetValue,
+ store: __assign({
+ mode: 'dataset',
+ getDataKey: function (comp) {
+ return get$6(comp.element);
+ },
+ getFallbackEntry: function (itemString) {
+ return {
+ value: itemString,
+ meta: {}
+ };
+ },
+ setValue: function (comp, data) {
+ set$3(comp.element, detail.model.getDisplayText(data));
+ }
+ }, detail.initialData.map(function (d) {
+ return wrap$1('initialValue', d);
+ }).getOr({}))
+ }),
+ Streaming.config({
+ stream: {
+ mode: 'throttle',
+ delay: detail.responseTime,
+ stopEvent: false
+ },
+ onStream: function (component, _simulatedEvent) {
+ var sandbox = Coupling.getCoupled(component, 'sandbox');
+ var focusInInput = Focusing.isFocused(component);
+ if (focusInInput) {
+ if (get$6(component.element).length >= detail.minChars) {
+ var previousValue_1 = Composing.getCurrent(sandbox).bind(function (menu) {
+ return Highlighting.getHighlighted(menu).map(Representing.getValue);
+ });
+ detail.previewing.set(true);
+ var onOpenSync = function (_sandbox) {
+ Composing.getCurrent(sandbox).each(function (menu) {
+ previousValue_1.fold(function () {
+ if (detail.model.selectsOver) {
+ Highlighting.highlightFirst(menu);
+ }
+ }, function (pv) {
+ Highlighting.highlightBy(menu, function (item) {
+ var itemData = Representing.getValue(item);
+ return itemData.value === pv.value;
+ });
+ Highlighting.getHighlighted(menu).orThunk(function () {
+ Highlighting.highlightFirst(menu);
+ return Optional.none();
+ });
+ });
+ });
+ };
+ open$1(detail, mapFetch(component), component, sandbox, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop);
+ }
+ }
+ },
+ cancelEvent: typeaheadCancel()
+ }),
+ Keying.config({
+ mode: 'special',
+ onDown: function (comp, simulatedEvent) {
+ navigateList(comp, simulatedEvent, Highlighting.highlightFirst);
+ return Optional.some(true);
+ },
+ onEscape: function (comp) {
+ var sandbox = Coupling.getCoupled(comp, 'sandbox');
+ if (Sandboxing.isOpen(sandbox)) {
+ Sandboxing.close(sandbox);
+ return Optional.some(true);
+ }
+ return Optional.none();
+ },
+ onUp: function (comp, simulatedEvent) {
+ navigateList(comp, simulatedEvent, Highlighting.highlightLast);
+ return Optional.some(true);
+ },
+ onEnter: function (comp) {
+ var sandbox = Coupling.getCoupled(comp, 'sandbox');
+ var sandboxIsOpen = Sandboxing.isOpen(sandbox);
+ if (sandboxIsOpen && !detail.previewing.get()) {
+ return Composing.getCurrent(sandbox).bind(function (menu) {
+ return Highlighting.getHighlighted(menu);
+ }).map(function (item) {
+ emitWith(comp, itemExecute(), { item: item });
+ return true;
+ });
+ } else {
+ var currentValue = Representing.getValue(comp);
+ emit(comp, typeaheadCancel());
+ detail.onExecute(sandbox, comp, currentValue);
+ if (sandboxIsOpen) {
+ Sandboxing.close(sandbox);
+ }
+ return Optional.some(true);
+ }
+ }
+ }),
+ Toggling.config({
+ toggleClass: detail.markers.openClass,
+ aria: { mode: 'expanded' }
+ }),
+ Coupling.config({
+ others: {
+ sandbox: function (hotspot) {
+ return makeSandbox(detail, hotspot, {
+ onOpen: function () {
+ return Toggling.on(hotspot);
+ },
+ onClose: function () {
+ return Toggling.off(hotspot);
+ }
+ });
+ }
+ }
+ }),
+ config('typeaheadevents', [
+ runOnExecute(function (comp) {
+ var onOpenSync = noop;
+ togglePopup(detail, mapFetch(comp), comp, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop);
+ }),
+ run(itemExecute(), function (comp, se) {
+ var sandbox = Coupling.getCoupled(comp, 'sandbox');
+ setValueFromItem(detail.model, comp, se.event.item);
+ emit(comp, typeaheadCancel());
+ detail.onItemExecute(comp, sandbox, se.event.item, Representing.getValue(comp));
+ Sandboxing.close(sandbox);
+ setCursorAtEnd(comp);
+ })
+ ].concat(detail.dismissOnBlur ? [run(postBlur(), function (typeahead) {
+ var sandbox = Coupling.getCoupled(typeahead, 'sandbox');
+ if (search(sandbox.element).isNone()) {
+ Sandboxing.close(sandbox);
+ }
+ })] : []))
+ ];
+ return {
+ uid: detail.uid,
+ dom: dom$2(deepMerge(detail, {
+ inputAttributes: {
+ 'role': 'combobox',
+ 'aria-autocomplete': 'list',
+ 'aria-haspopup': 'true'
+ }
+ })),
+ behaviours: __assign(__assign({}, focusBehaviours$1), augment(detail.typeaheadBehaviours, behaviours)),
+ eventOrder: detail.eventOrder
+ };
+ };
+
+ var schema$j = constant([
+ option('lazySink'),
+ strict$1('fetch'),
+ defaulted$1('minChars', 5),
+ defaulted$1('responseTime', 1000),
+ onHandler('onOpen'),
+ defaulted$1('getHotspot', Optional.some),
+ defaulted$1('getAnchorOverrides', constant({})),
+ defaulted$1('layouts', Optional.none()),
+ defaulted$1('eventOrder', {}),
+ defaultedObjOf('model', {}, [
+ defaulted$1('getDisplayText', function (itemData) {
+ return itemData.meta !== undefined && itemData.meta.text !== undefined ? itemData.meta.text : itemData.value;
+ }),
+ defaulted$1('selectsOver', true),
+ defaulted$1('populateFromBrowse', true)
+ ]),
+ onHandler('onSetValue'),
+ onKeyboardHandler('onExecute'),
+ onHandler('onItemExecute'),
+ defaulted$1('inputClasses', []),
+ defaulted$1('inputAttributes', {}),
+ defaulted$1('inputStyles', {}),
+ defaulted$1('matchWidth', true),
+ defaulted$1('useMinWidth', false),
+ defaulted$1('dismissOnBlur', true),
+ markers(['openClass']),
+ option('initialData'),
+ field$1('typeaheadBehaviours', [
+ Focusing,
+ Representing,
+ Streaming,
+ Keying,
+ Toggling,
+ Coupling
+ ]),
+ state$1('previewing', function () {
+ return Cell(true);
+ })
+ ].concat(schema$f()).concat(sandboxFields()));
+ var parts$6 = constant([external$1({
+ schema: [tieredMenuMarkers()],
+ name: 'menu',
+ overrides: function (detail) {
+ return {
+ fakeFocus: true,
+ onHighlight: function (menu, item) {
+ if (!detail.previewing.get()) {
+ menu.getSystem().getByUid(detail.uid).each(function (input) {
+ if (detail.model.populateFromBrowse) {
+ setValueFromItem(detail.model, input, item);
+ }
+ });
+ } else {
+ menu.getSystem().getByUid(detail.uid).each(function (input) {
+ attemptSelectOver(detail.model, input, item).fold(function () {
+ return Highlighting.dehighlight(menu, item);
+ }, function (fn) {
+ return fn();
+ });
+ });
+ }
+ detail.previewing.set(false);
+ },
+ onExecute: function (menu, item) {
+ return menu.getSystem().getByUid(detail.uid).toOptional().map(function (typeahead) {
+ emitWith(typeahead, itemExecute(), { item: item });
+ return true;
+ });
+ },
+ onHover: function (menu, item) {
+ detail.previewing.set(false);
+ menu.getSystem().getByUid(detail.uid).each(function (input) {
+ if (detail.model.populateFromBrowse) {
+ setValueFromItem(detail.model, input, item);
+ }
+ });
+ }
+ };
+ }
+ })]);
+
+ var Typeahead = composite$1({
+ name: 'Typeahead',
+ configFields: schema$j(),
+ partFields: parts$6(),
+ factory: make$5
+ });
+
+ var wrap$2 = function (delegate) {
+ var toCached = function () {
+ return wrap$2(delegate.toCached());
+ };
+ var bindFuture = function (f) {
+ return wrap$2(delegate.bind(function (resA) {
+ return resA.fold(function (err) {
+ return Future.pure(Result.error(err));
+ }, function (a) {
+ return f(a);
+ });
+ }));
+ };
+ var bindResult = function (f) {
+ return wrap$2(delegate.map(function (resA) {
+ return resA.bind(f);
+ }));
+ };
+ var mapResult = function (f) {
+ return wrap$2(delegate.map(function (resA) {
+ return resA.map(f);
+ }));
+ };
+ var mapError = function (f) {
+ return wrap$2(delegate.map(function (resA) {
+ return resA.mapError(f);
+ }));
+ };
+ var foldResult = function (whenError, whenValue) {
+ return delegate.map(function (res) {
+ return res.fold(whenError, whenValue);
+ });
+ };
+ var withTimeout = function (timeout, errorThunk) {
+ return wrap$2(Future.nu(function (callback) {
+ var timedOut = false;
+ var timer = setTimeout(function () {
+ timedOut = true;
+ callback(Result.error(errorThunk()));
+ }, timeout);
+ delegate.get(function (result) {
+ if (!timedOut) {
+ clearTimeout(timer);
+ callback(result);
+ }
+ });
+ }));
+ };
+ return __assign(__assign({}, delegate), {
+ toCached: toCached,
+ bindFuture: bindFuture,
+ bindResult: bindResult,
+ mapResult: mapResult,
+ mapError: mapError,
+ foldResult: foldResult,
+ withTimeout: withTimeout
+ });
+ };
+ var nu$c = function (worker) {
+ return wrap$2(Future.nu(worker));
+ };
+ var value$2 = function (value) {
+ return wrap$2(Future.pure(Result.value(value)));
+ };
+ var error$1 = function (error) {
+ return wrap$2(Future.pure(Result.error(error)));
+ };
+ var fromResult$1 = function (result) {
+ return wrap$2(Future.pure(result));
+ };
+ var fromFuture = function (future) {
+ return wrap$2(future.map(Result.value));
+ };
+ var fromPromise = function (promise) {
+ return nu$c(function (completer) {
+ promise.then(function (value) {
+ completer(Result.value(value));
+ }, function (error) {
+ completer(Result.error(error));
+ });
+ });
+ };
+ var FutureResult = {
+ nu: nu$c,
+ wrap: wrap$2,
+ pure: value$2,
+ value: value$2,
+ error: error$1,
+ fromResult: fromResult$1,
+ fromFuture: fromFuture,
+ fromPromise: fromPromise
+ };
+
+ var separator$2 = { type: 'separator' };
+ var toMenuItem = function (target) {
+ return {
+ type: 'menuitem',
+ value: target.url,
+ text: target.title,
+ meta: { attach: target.attach },
+ onAction: noop
+ };
+ };
+ var staticMenuItem = function (title, url) {
+ return {
+ type: 'menuitem',
+ value: url,
+ text: title,
+ meta: { attach: undefined },
+ onAction: noop
+ };
+ };
+ var toMenuItems = function (targets) {
+ return map(targets, toMenuItem);
+ };
+ var filterLinkTargets = function (type, targets) {
+ return filter(targets, function (target) {
+ return target.type === type;
+ });
+ };
+ var filteredTargets = function (type, targets) {
+ return toMenuItems(filterLinkTargets(type, targets));
+ };
+ var headerTargets = function (linkInfo) {
+ return filteredTargets('header', linkInfo.targets);
+ };
+ var anchorTargets = function (linkInfo) {
+ return filteredTargets('anchor', linkInfo.targets);
+ };
+ var anchorTargetTop = function (linkInfo) {
+ return Optional.from(linkInfo.anchorTop).map(function (url) {
+ return staticMenuItem('
', url);
+ }).toArray();
+ };
+ var anchorTargetBottom = function (linkInfo) {
+ return Optional.from(linkInfo.anchorBottom).map(function (url) {
+ return staticMenuItem('', url);
+ }).toArray();
+ };
+ var historyTargets = function (history) {
+ return map(history, function (url) {
+ return staticMenuItem(url, url);
+ });
+ };
+ var joinMenuLists = function (items) {
+ return foldl(items, function (a, b) {
+ var bothEmpty = a.length === 0 || b.length === 0;
+ return bothEmpty ? a.concat(b) : a.concat(separator$2, b);
+ }, []);
+ };
+ var filterByQuery = function (term, menuItems) {
+ var lowerCaseTerm = term.toLowerCase();
+ return filter(menuItems, function (item) {
+ var text = item.meta !== undefined && item.meta.text !== undefined ? item.meta.text : item.text;
+ return contains$1(text.toLowerCase(), lowerCaseTerm) || contains$1(item.value.toLowerCase(), lowerCaseTerm);
+ });
+ };
+
+ var getItems = function (fileType, input, urlBackstage) {
+ var urlInputValue = Representing.getValue(input);
+ var term = urlInputValue.meta.text !== undefined ? urlInputValue.meta.text : urlInputValue.value;
+ var info = urlBackstage.getLinkInformation();
+ return info.fold(function () {
+ return [];
+ }, function (linkInfo) {
+ var history = filterByQuery(term, historyTargets(urlBackstage.getHistory(fileType)));
+ return fileType === 'file' ? joinMenuLists([
+ history,
+ filterByQuery(term, headerTargets(linkInfo)),
+ filterByQuery(term, flatten([
+ anchorTargetTop(linkInfo),
+ anchorTargets(linkInfo),
+ anchorTargetBottom(linkInfo)
+ ]))
+ ]) : history;
+ });
+ };
+ var errorId = generate$1('aria-invalid');
+ var renderUrlInput = function (spec, backstage, urlBackstage) {
+ var _a;
+ var providersBackstage = backstage.shared.providers;
+ var updateHistory = function (component) {
+ var urlEntry = Representing.getValue(component);
+ urlBackstage.addToHistory(urlEntry.value, spec.filetype);
+ };
+ var pField = FormField.parts.field({
+ factory: Typeahead,
+ dismissOnBlur: true,
+ inputClasses: ['tox-textfield'],
+ sandboxClasses: ['tox-dialog__popups'],
+ inputAttributes: {
+ 'aria-errormessage': errorId,
+ 'type': 'url'
+ },
+ minChars: 0,
+ responseTime: 0,
+ fetch: function (input) {
+ var items = getItems(spec.filetype, input, urlBackstage);
+ var tdata = build$2(items, ItemResponse$1.BUBBLE_TO_SANDBOX, backstage, false);
+ return Future.pure(tdata);
+ },
+ getHotspot: function (comp) {
+ return memUrlBox.getOpt(comp);
+ },
+ onSetValue: function (comp, _newValue) {
+ if (comp.hasConfigured(Invalidating)) {
+ Invalidating.run(comp).get(noop);
+ }
+ },
+ typeaheadBehaviours: derive$1(flatten([
+ urlBackstage.getValidationHandler().map(function (handler) {
+ return Invalidating.config({
+ getRoot: function (comp) {
+ return parent(comp.element);
+ },
+ invalidClass: 'tox-control-wrap--status-invalid',
+ notify: {
+ onInvalid: function (comp, err) {
+ memInvalidIcon.getOpt(comp).each(function (invalidComp) {
+ set$1(invalidComp.element, 'title', providersBackstage.translate(err));
+ });
+ }
+ },
+ validator: {
+ validate: function (input) {
+ var urlEntry = Representing.getValue(input);
+ return FutureResult.nu(function (completer) {
+ handler({
+ type: spec.filetype,
+ url: urlEntry.value
+ }, function (validation) {
+ if (validation.status === 'invalid') {
+ var err = Result.error(validation.message);
+ completer(err);
+ } else {
+ var val = Result.value(validation.message);
+ completer(val);
+ }
+ });
+ });
+ },
+ validateOnLoad: false
+ }
+ });
+ }).toArray(),
+ [
+ Disabling.config({
+ disabled: function () {
+ return spec.disabled || providersBackstage.isDisabled();
+ }
+ }),
+ Tabstopping.config({}),
+ config('urlinput-events', flatten([
+ spec.filetype === 'file' ? [run(input(), function (comp) {
+ emitWith(comp, formChangeEvent, { name: spec.name });
+ })] : [],
+ [
+ run(change(), function (comp) {
+ emitWith(comp, formChangeEvent, { name: spec.name });
+ updateHistory(comp);
+ }),
+ run(postPaste(), function (comp) {
+ emitWith(comp, formChangeEvent, { name: spec.name });
+ updateHistory(comp);
+ })
+ ]
+ ]))
+ ]
+ ])),
+ eventOrder: (_a = {}, _a[input()] = [
+ 'streaming',
+ 'urlinput-events',
+ 'invalidating'
+ ], _a),
+ model: {
+ getDisplayText: function (itemData) {
+ return itemData.value;
+ },
+ selectsOver: false,
+ populateFromBrowse: false
+ },
+ markers: { openClass: 'tox-textfield--popup-open' },
+ lazySink: backstage.shared.getSink,
+ parts: { menu: part(false, 1, 'normal') },
+ onExecute: function (_menu, component, _entry) {
+ emitWith(component, formSubmitEvent, {});
+ },
+ onItemExecute: function (typeahead, _sandbox, _item, _value) {
+ updateHistory(typeahead);
+ emitWith(typeahead, formChangeEvent, { name: spec.name });
+ }
+ });
+ var pLabel = spec.label.map(function (label) {
+ return renderLabel(label, providersBackstage);
+ });
+ var makeIcon = function (name, errId, icon, label) {
+ if (icon === void 0) {
+ icon = name;
+ }
+ if (label === void 0) {
+ label = name;
+ }
+ return {
+ dom: {
+ tag: 'div',
+ classes: [
+ 'tox-icon',
+ 'tox-control-wrap__status-icon-' + name
+ ],
+ innerHtml: get$e(icon, providersBackstage.icons),
+ attributes: __assign({
+ 'title': providersBackstage.translate(label),
+ 'aria-live': 'polite'
+ }, errId.fold(function () {
+ return {};
+ }, function (id) {
+ return { id: id };
+ }))
+ }
+ };
+ };
+ var memInvalidIcon = record(makeIcon('invalid', Optional.some(errorId), 'warning'));
+ var memStatus = record({
+ dom: {
+ tag: 'div',
+ classes: ['tox-control-wrap__status-icon-wrap']
+ },
+ components: [memInvalidIcon.asSpec()]
+ });
+ var optUrlPicker = urlBackstage.getUrlPicker(spec.filetype);
+ var browseUrlEvent = generate$1('browser.url.event');
+ var memUrlBox = record({
+ dom: {
+ tag: 'div',
+ classes: ['tox-control-wrap']
+ },
+ components: [
+ pField,
+ memStatus.asSpec()
+ ],
+ behaviours: derive$1([Disabling.config({
+ disabled: function () {
+ return spec.disabled || providersBackstage.isDisabled();
+ }
+ })])
+ });
+ var memUrlPickerButton = record(renderButton({
+ name: spec.name,
+ icon: Optional.some('browse'),
+ text: spec.label.getOr(''),
+ disabled: spec.disabled,
+ primary: false,
+ borderless: true
+ }, function (component) {
+ return emit(component, browseUrlEvent);
+ }, providersBackstage, [], ['tox-browse-url']));
+ var controlHWrapper = function () {
+ return {
+ dom: {
+ tag: 'div',
+ classes: ['tox-form__controls-h-stack']
+ },
+ components: flatten([
+ [memUrlBox.asSpec()],
+ optUrlPicker.map(function () {
+ return memUrlPickerButton.asSpec();
+ }).toArray()
+ ])
+ };
+ };
+ var openUrlPicker = function (comp) {
+ Composing.getCurrent(comp).each(function (field) {
+ var componentData = Representing.getValue(field);
+ var urlData = __assign({ fieldname: spec.name }, componentData);
+ optUrlPicker.each(function (picker) {
+ picker(urlData).get(function (chosenData) {
+ Representing.setValue(field, chosenData);
+ emitWith(comp, formChangeEvent, { name: spec.name });
+ });
+ });
+ });
+ };
+ return FormField.sketch({
+ dom: renderFormFieldDom(),
+ components: pLabel.toArray().concat([controlHWrapper()]),
+ fieldBehaviours: derive$1([
+ Disabling.config({
+ disabled: function () {
+ return spec.disabled || providersBackstage.isDisabled();
+ },
+ onDisabled: function (comp) {
+ FormField.getField(comp).each(Disabling.disable);
+ memUrlPickerButton.getOpt(comp).each(Disabling.disable);
+ },
+ onEnabled: function (comp) {
+ FormField.getField(comp).each(Disabling.enable);
+ memUrlPickerButton.getOpt(comp).each(Disabling.enable);
+ }
+ }),
+ receivingConfig(),
+ config('url-input-events', [run(browseUrlEvent, openUrlPicker)])
+ ])
+ });
+ };
+
+ var renderAlertBanner = function (spec, providersBackstage) {
+ return Container.sketch({
+ dom: {
+ tag: 'div',
+ attributes: { role: 'alert' },
+ classes: [
+ 'tox-notification',
+ 'tox-notification--in',
+ 'tox-notification--' + spec.level
+ ]
+ },
+ components: [
+ {
+ dom: {
+ tag: 'div',
+ classes: ['tox-notification__icon']
+ },
+ components: [Button.sketch({
+ dom: {
+ tag: 'button',
+ classes: [
+ 'tox-button',
+ 'tox-button--naked',
+ 'tox-button--icon'
+ ],
+ innerHtml: get$e(spec.icon, providersBackstage.icons),
+ attributes: { title: providersBackstage.translate(spec.iconTooltip) }
+ },
+ action: function (comp) {
+ emitWith(comp, formActionEvent, {
+ name: 'alert-banner',
+ value: spec.url
+ });
+ }
+ })]
+ },
+ {
+ dom: {
+ tag: 'div',
+ classes: ['tox-notification__body'],
+ innerHtml: providersBackstage.translate(spec.text)
+ }
+ }
+ ]
+ });
+ };
+
+ var renderCheckbox = function (spec, providerBackstage) {
+ var repBehaviour = Representing.config({
+ store: {
+ mode: 'manual',
+ getValue: function (comp) {
+ var el = comp.element.dom;
+ return el.checked;
+ },
+ setValue: function (comp, value) {
+ var el = comp.element.dom;
+ el.checked = value;
+ }
+ }
+ });
+ var toggleCheckboxHandler = function (comp) {
+ comp.element.dom.click();
+ return Optional.some(true);
+ };
+ var pField = FormField.parts.field({
+ factory: { sketch: identity },
+ dom: {
+ tag: 'input',
+ classes: ['tox-checkbox__input'],
+ attributes: { type: 'checkbox' }
+ },
+ behaviours: derive$1([
+ ComposingConfigs.self(),
+ Disabling.config({
+ disabled: function () {
+ return spec.disabled || providerBackstage.isDisabled();
+ }
+ }),
+ Tabstopping.config({}),
+ Focusing.config({}),
+ repBehaviour,
+ Keying.config({
+ mode: 'special',
+ onEnter: toggleCheckboxHandler,
+ onSpace: toggleCheckboxHandler,
+ stopSpaceKeyup: true
+ }),
+ config('checkbox-events', [run(change(), function (component, _) {
+ emitWith(component, formChangeEvent, { name: spec.name });
+ })])
+ ])
+ });
+ var pLabel = FormField.parts.label({
+ dom: {
+ tag: 'span',
+ classes: ['tox-checkbox__label'],
+ innerHtml: providerBackstage.translate(spec.label)
+ },
+ behaviours: derive$1([Unselecting.config({})])
+ });
+ var makeIcon = function (className) {
+ var iconName = className === 'checked' ? 'selected' : 'unselected';
+ return {
+ dom: {
+ tag: 'span',
+ classes: [
+ 'tox-icon',
+ 'tox-checkbox-icon__' + className
+ ],
+ innerHtml: get$e(iconName, providerBackstage.icons)
+ }
+ };
+ };
+ var memIcons = record({
+ dom: {
+ tag: 'div',
+ classes: ['tox-checkbox__icons']
+ },
+ components: [
+ makeIcon('checked'),
+ makeIcon('unchecked')
+ ]
+ });
+ return FormField.sketch({
+ dom: {
+ tag: 'label',
+ classes: ['tox-checkbox']
+ },
+ components: [
+ pField,
+ memIcons.asSpec(),
+ pLabel
+ ],
+ fieldBehaviours: derive$1([
+ Disabling.config({
+ disabled: function () {
+ return spec.disabled || providerBackstage.isDisabled();
+ },
+ disableClass: 'tox-checkbox--disabled',
+ onDisabled: function (comp) {
+ FormField.getField(comp).each(Disabling.disable);
+ },
+ onEnabled: function (comp) {
+ FormField.getField(comp).each(Disabling.enable);
+ }
+ }),
+ receivingConfig()
+ ])
+ });
+ };
+
+ var renderHtmlPanel = function (spec) {
+ if (spec.presets === 'presentation') {
+ return Container.sketch({
+ dom: {
+ tag: 'div',
+ classes: ['tox-form__group'],
+ innerHtml: spec.html
+ }
+ });
+ } else {
+ return Container.sketch({
+ dom: {
+ tag: 'div',
+ classes: ['tox-form__group'],
+ innerHtml: spec.html,
+ attributes: { role: 'document' }
+ },
+ containerBehaviours: derive$1([
+ Tabstopping.config({}),
+ Focusing.config({})
+ ])
+ });
+ }
+ };
+
+ var make$6 = function (render) {
+ return function (parts, spec, backstage) {
+ return get$1(spec, 'name').fold(function () {
+ return render(spec, backstage);
+ }, function (fieldName) {
+ return parts.field(fieldName, render(spec, backstage));
+ });
+ };
+ };
+ var makeIframe = function (render) {
+ return function (parts, spec, backstage) {
+ var iframeSpec = deepMerge(spec, { source: 'dynamic' });
+ return make$6(render)(parts, iframeSpec, backstage);
+ };
+ };
+ var factories = {
+ bar: make$6(function (spec, backstage) {
+ return renderBar(spec, backstage.shared);
+ }),
+ collection: make$6(function (spec, backstage) {
+ return renderCollection(spec, backstage.shared.providers);
+ }),
+ alertbanner: make$6(function (spec, backstage) {
+ return renderAlertBanner(spec, backstage.shared.providers);
+ }),
+ input: make$6(function (spec, backstage) {
+ return renderInput(spec, backstage.shared.providers);
+ }),
+ textarea: make$6(function (spec, backstage) {
+ return renderTextarea(spec, backstage.shared.providers);
+ }),
+ label: make$6(function (spec, backstage) {
+ return renderLabel$2(spec, backstage.shared);
+ }),
+ iframe: makeIframe(function (spec, backstage) {
+ return renderIFrame(spec, backstage.shared.providers);
+ }),
+ button: make$6(function (spec, backstage) {
+ return renderDialogButton(spec, backstage.shared.providers);
+ }),
+ checkbox: make$6(function (spec, backstage) {
+ return renderCheckbox(spec, backstage.shared.providers);
+ }),
+ colorinput: make$6(function (spec, backstage) {
+ return renderColorInput(spec, backstage.shared, backstage.colorinput);
+ }),
+ colorpicker: make$6(renderColorPicker),
+ dropzone: make$6(function (spec, backstage) {
+ return renderDropZone(spec, backstage.shared.providers);
+ }),
+ grid: make$6(function (spec, backstage) {
+ return renderGrid(spec, backstage.shared);
+ }),
+ listbox: make$6(function (spec, backstage) {
+ return renderListBox(spec, backstage);
+ }),
+ selectbox: make$6(function (spec, backstage) {
+ return renderSelectBox(spec, backstage.shared.providers);
+ }),
+ sizeinput: make$6(function (spec, backstage) {
+ return renderSizeInput(spec, backstage.shared.providers);
+ }),
+ urlinput: make$6(function (spec, backstage) {
+ return renderUrlInput(spec, backstage, backstage.urlinput);
+ }),
+ customeditor: make$6(renderCustomEditor),
+ htmlpanel: make$6(renderHtmlPanel),
+ imagetools: make$6(function (spec, backstage) {
+ return renderImageTools(spec, backstage.shared.providers);
+ }),
+ table: make$6(function (spec, backstage) {
+ return renderTable(spec, backstage.shared.providers);
+ }),
+ panel: make$6(function (spec, backstage) {
+ return renderPanel(spec, backstage);
+ })
+ };
+ var noFormParts = {
+ field: function (_name, spec) {
+ return spec;
+ }
+ };
+ var interpretInForm = function (parts, spec, oldBackstage) {
+ var newBackstage = deepMerge(oldBackstage, {
+ shared: {
+ interpreter: function (childSpec) {
+ return interpretParts(parts, childSpec, newBackstage);
+ }
+ }
+ });
+ return interpretParts(parts, spec, newBackstage);
+ };
+ var interpretParts = function (parts, spec, backstage) {
+ return get$1(factories, spec.type).fold(function () {
+ console.error('Unknown factory type "' + spec.type + '", defaulting to container: ', spec);
+ return spec;
+ }, function (factory) {
+ return factory(parts, spec, backstage);
+ });
+ };
+ var interpretWithoutForm = function (spec, backstage) {
+ var parts = noFormParts;
+ return interpretParts(parts, spec, backstage);
+ };
+
+ var bubbleAlignments = {
+ valignCentre: [],
+ alignCentre: [],
+ alignLeft: [],
+ alignRight: [],
+ right: [],
+ left: [],
+ bottom: [],
+ top: []
+ };
+ var getInlineDialogAnchor = function (contentAreaElement, lazyAnchorbar, lazyUseEditableAreaAnchor) {
+ var bubble = nu$8(-12, 12, bubbleAlignments);
+ var overrides = { maxHeightFunction: expandable() };
+ var editableAreaAnchor = function () {
+ return {
+ anchor: 'node',
+ root: getContentContainer(contentAreaElement()),
+ node: Optional.from(contentAreaElement()),
+ bubble: bubble,
+ layouts: {
+ onRtl: function () {
+ return [northwest$3];
+ },
+ onLtr: function () {
+ return [northeast$3];
+ }
+ },
+ overrides: overrides
+ };
+ };
+ var standardAnchor = function () {
+ return {
+ anchor: 'hotspot',
+ hotspot: lazyAnchorbar(),
+ bubble: bubble,
+ layouts: {
+ onRtl: function () {
+ return [southeast$1];
+ },
+ onLtr: function () {
+ return [southwest$1];
+ }
+ },
+ overrides: overrides
+ };
+ };
+ return function () {
+ return lazyUseEditableAreaAnchor() ? editableAreaAnchor() : standardAnchor();
+ };
+ };
+ var getBannerAnchor = function (contentAreaElement, lazyAnchorbar, lazyUseEditableAreaAnchor) {
+ var editableAreaAnchor = function () {
+ return {
+ anchor: 'node',
+ root: getContentContainer(contentAreaElement()),
+ node: Optional.from(contentAreaElement()),
+ layouts: {
+ onRtl: function () {
+ return [north$3];
+ },
+ onLtr: function () {
+ return [north$3];
+ }
+ }
+ };
+ };
+ var standardAnchor = function () {
+ return {
+ anchor: 'hotspot',
+ hotspot: lazyAnchorbar(),
+ layouts: {
+ onRtl: function () {
+ return [south$1];
+ },
+ onLtr: function () {
+ return [south$1];
+ }
+ }
+ };
+ };
+ return function () {
+ return lazyUseEditableAreaAnchor() ? editableAreaAnchor() : standardAnchor();
+ };
+ };
+ var getCursorAnchor = function (editor, bodyElement) {
+ return function () {
+ return {
+ anchor: 'selection',
+ root: bodyElement(),
+ getSelection: function () {
+ var rng = editor.selection.getRng();
+ return Optional.some(SimSelection.range(SugarElement.fromDom(rng.startContainer), rng.startOffset, SugarElement.fromDom(rng.endContainer), rng.endOffset));
+ }
+ };
+ };
+ };
+ var getNodeAnchor = function (bodyElement) {
+ return function (element) {
+ return {
+ anchor: 'node',
+ root: bodyElement(),
+ node: element
+ };
+ };
+ };
+ var getAnchors = function (editor, lazyAnchorbar, isToolbarTop) {
+ var useFixedToolbarContainer = useFixedContainer(editor);
+ var bodyElement = function () {
+ return SugarElement.fromDom(editor.getBody());
+ };
+ var contentAreaElement = function () {
+ return SugarElement.fromDom(editor.getContentAreaContainer());
+ };
+ var lazyUseEditableAreaAnchor = function () {
+ return useFixedToolbarContainer || !isToolbarTop();
+ };
+ return {
+ inlineDialog: getInlineDialogAnchor(contentAreaElement, lazyAnchorbar, lazyUseEditableAreaAnchor),
+ banner: getBannerAnchor(contentAreaElement, lazyAnchorbar, lazyUseEditableAreaAnchor),
+ cursor: getCursorAnchor(editor, bodyElement),
+ node: getNodeAnchor(bodyElement)
+ };
+ };
+
+ var colorPicker = function (editor) {
+ return function (callback, value) {
+ var dialog = colorPickerDialog(editor);
+ dialog(callback, value);
+ };
+ };
+ var hasCustomColors$1 = function (editor) {
+ return function () {
+ return hasCustomColors(editor);
+ };
+ };
+ var getColors$2 = function (editor) {
+ return function () {
+ return getColors(editor);
+ };
+ };
+ var getColorCols$2 = function (editor) {
+ return function () {
+ return getColorCols$1(editor);
+ };
+ };
+ var ColorInputBackstage = function (editor) {
+ return {
+ colorPicker: colorPicker(editor),
+ hasCustomColors: hasCustomColors$1(editor),
+ getColors: getColors$2(editor),
+ getColorCols: getColorCols$2(editor)
+ };
+ };
+
+ var isDraggableModal$1 = function (editor) {
+ return function () {
+ return isDraggableModal(editor);
+ };
+ };
+ var DialogBackstage = function (editor) {
+ return { isDraggableModal: isDraggableModal$1(editor) };
+ };
+
+ var HeaderBackstage = function (editor) {
+ var mode = Cell(isToolbarLocationBottom(editor) ? 'bottom' : 'top');
+ return {
+ isPositionedAtTop: function () {
+ return mode.get() === 'top';
+ },
+ getDockingMode: mode.get,
+ setDockingMode: mode.set
+ };
+ };
+
+ var defaultStyleFormats = [
+ {
+ title: 'Headings',
+ items: [
+ {
+ title: 'Heading 1',
+ format: 'h1'
+ },
+ {
+ title: 'Heading 2',
+ format: 'h2'
+ },
+ {
+ title: 'Heading 3',
+ format: 'h3'
+ },
+ {
+ title: 'Heading 4',
+ format: 'h4'
+ },
+ {
+ title: 'Heading 5',
+ format: 'h5'
+ },
+ {
+ title: 'Heading 6',
+ format: 'h6'
+ }
+ ]
+ },
+ {
+ title: 'Inline',
+ items: [
+ {
+ title: 'Bold',
+ format: 'bold'
+ },
+ {
+ title: 'Italic',
+ format: 'italic'
+ },
+ {
+ title: 'Underline',
+ format: 'underline'
+ },
+ {
+ title: 'Strikethrough',
+ format: 'strikethrough'
+ },
+ {
+ title: 'Superscript',
+ format: 'superscript'
+ },
+ {
+ title: 'Subscript',
+ format: 'subscript'
+ },
+ {
+ title: 'Code',
+ format: 'code'
+ }
+ ]
+ },
+ {
+ title: 'Blocks',
+ items: [
+ {
+ title: 'Paragraph',
+ format: 'p'
+ },
+ {
+ title: 'Blockquote',
+ format: 'blockquote'
+ },
+ {
+ title: 'Div',
+ format: 'div'
+ },
+ {
+ title: 'Pre',
+ format: 'pre'
+ }
+ ]
+ },
+ {
+ title: 'Align',
+ items: [
+ {
+ title: 'Left',
+ format: 'alignleft'
+ },
+ {
+ title: 'Center',
+ format: 'aligncenter'
+ },
+ {
+ title: 'Right',
+ format: 'alignright'
+ },
+ {
+ title: 'Justify',
+ format: 'alignjustify'
+ }
+ ]
+ }
+ ];
+ var isNestedFormat = function (format) {
+ return has(format, 'items');
+ };
+ var isBlockFormat = function (format) {
+ return has(format, 'block');
+ };
+ var isInlineFormat = function (format) {
+ return has(format, 'inline');
+ };
+ var isSelectorFormat = function (format) {
+ return has(format, 'selector');
+ };
+ var mapFormats = function (userFormats) {
+ return foldl(userFormats, function (acc, fmt) {
+ if (isNestedFormat(fmt)) {
+ var result = mapFormats(fmt.items);
+ return {
+ customFormats: acc.customFormats.concat(result.customFormats),
+ formats: acc.formats.concat([{
+ title: fmt.title,
+ items: result.formats
+ }])
+ };
+ } else if (isInlineFormat(fmt) || isBlockFormat(fmt) || isSelectorFormat(fmt)) {
+ var formatName = isString(fmt.name) ? fmt.name : fmt.title.toLowerCase();
+ var formatNameWithPrefix = 'custom-' + formatName;
+ return {
+ customFormats: acc.customFormats.concat([{
+ name: formatNameWithPrefix,
+ format: fmt
+ }]),
+ formats: acc.formats.concat([{
+ title: fmt.title,
+ format: formatNameWithPrefix,
+ icon: fmt.icon
+ }])
+ };
+ } else {
+ return __assign(__assign({}, acc), { formats: acc.formats.concat(fmt) });
+ }
+ }, {
+ customFormats: [],
+ formats: []
+ });
+ };
+ var registerCustomFormats = function (editor, userFormats) {
+ var result = mapFormats(userFormats);
+ var registerFormats = function (customFormats) {
+ each(customFormats, function (fmt) {
+ if (!editor.formatter.has(fmt.name)) {
+ editor.formatter.register(fmt.name, fmt.format);
+ }
+ });
+ };
+ if (editor.formatter) {
+ registerFormats(result.customFormats);
+ } else {
+ editor.on('init', function () {
+ registerFormats(result.customFormats);
+ });
+ }
+ return result.formats;
+ };
+ var getStyleFormats = function (editor) {
+ return getUserStyleFormats(editor).map(function (userFormats) {
+ var registeredUserFormats = registerCustomFormats(editor, userFormats);
+ return isMergeStyleFormats(editor) ? defaultStyleFormats.concat(registeredUserFormats) : registeredUserFormats;
+ }).getOr(defaultStyleFormats);
+ };
+
+ var processBasic = function (item, isSelectedFor, getPreviewFor) {
+ var formatterSpec = {
+ type: 'formatter',
+ isSelected: isSelectedFor(item.format),
+ getStylePreview: getPreviewFor(item.format)
+ };
+ return deepMerge(item, formatterSpec);
+ };
+ var register$3 = function (editor, formats, isSelectedFor, getPreviewFor) {
+ var enrichSupported = function (item) {
+ return processBasic(item, isSelectedFor, getPreviewFor);
+ };
+ var enrichMenu = function (item) {
+ var submenuSpec = { type: 'submenu' };
+ return deepMerge(item, submenuSpec);
+ };
+ var enrichCustom = function (item) {
+ var formatName = isString(item.name) ? item.name : generate$1(item.title);
+ var formatNameWithPrefix = 'custom-' + formatName;
+ var customSpec = {
+ type: 'formatter',
+ format: formatNameWithPrefix,
+ isSelected: isSelectedFor(formatNameWithPrefix),
+ getStylePreview: getPreviewFor(formatNameWithPrefix)
+ };
+ var newItem = deepMerge(item, customSpec);
+ editor.formatter.register(formatName, newItem);
+ return newItem;
+ };
+ var doEnrich = function (items) {
+ return map(items, function (item) {
+ var keys$1 = keys(item);
+ if (hasNonNullableKey(item, 'items')) {
+ var newItems_1 = doEnrich(item.items);
+ return deepMerge(enrichMenu(item), {
+ getStyleItems: function () {
+ return newItems_1;
+ }
+ });
+ } else if (hasNonNullableKey(item, 'format')) {
+ return enrichSupported(item);
+ } else if (keys$1.length === 1 && contains(keys$1, 'title')) {
+ return deepMerge(item, { type: 'separator' });
+ } else {
+ return enrichCustom(item);
+ }
+ });
+ };
+ return doEnrich(formats);
+ };
+
+ var init$7 = function (editor) {
+ var isSelectedFor = function (format) {
+ return function () {
+ return editor.formatter.match(format);
+ };
+ };
+ var getPreviewFor = function (format) {
+ return function () {
+ var fmt = editor.formatter.get(format);
+ return fmt !== undefined ? Optional.some({
+ tag: fmt.length > 0 ? fmt[0].inline || fmt[0].block || 'div' : 'div',
+ styles: editor.dom.parseStyle(editor.formatter.getCssText(format))
+ }) : Optional.none();
+ };
+ };
+ var flatten = function (fmt) {
+ var subs = fmt.items;
+ return subs !== undefined && subs.length > 0 ? bind(subs, flatten) : [fmt.format];
+ };
+ var settingsFormats = Cell([]);
+ var settingsFlattenedFormats = Cell([]);
+ var eventsFormats = Cell([]);
+ var eventsFlattenedFormats = Cell([]);
+ var replaceSettings = Cell(false);
+ editor.on('PreInit', function (_e) {
+ var formats = getStyleFormats(editor);
+ var enriched = register$3(editor, formats, isSelectedFor, getPreviewFor);
+ settingsFormats.set(enriched);
+ settingsFlattenedFormats.set(bind(enriched, flatten));
+ });
+ editor.on('addStyleModifications', function (e) {
+ var modifications = register$3(editor, e.items, isSelectedFor, getPreviewFor);
+ eventsFormats.set(modifications);
+ replaceSettings.set(e.replace);
+ eventsFlattenedFormats.set(bind(modifications, flatten));
+ });
+ var getData = function () {
+ var fromSettings = replaceSettings.get() ? [] : settingsFormats.get();
+ var fromEvents = eventsFormats.get();
+ return fromSettings.concat(fromEvents);
+ };
+ var getFlattenedKeys = function () {
+ var fromSettings = replaceSettings.get() ? [] : settingsFlattenedFormats.get();
+ var fromEvents = eventsFlattenedFormats.get();
+ return fromSettings.concat(fromEvents);
+ };
+ return {
+ getData: getData,
+ getFlattenedKeys: getFlattenedKeys
+ };
+ };
+
+ var isElement$2 = function (node) {
+ return isNonNullable(node) && node.nodeType === 1;
+ };
+ var trim$1 = global$c.trim;
+ var hasContentEditableState = function (value) {
+ return function (node) {
+ if (isElement$2(node)) {
+ if (node.contentEditable === value) {
+ return true;
+ }
+ if (node.getAttribute('data-mce-contenteditable') === value) {
+ return true;
+ }
+ }
+ return false;
+ };
+ };
+ var isContentEditableTrue = hasContentEditableState('true');
+ var isContentEditableFalse = hasContentEditableState('false');
+ var create$8 = function (type, title, url, level, attach) {
+ return {
+ type: type,
+ title: title,
+ url: url,
+ level: level,
+ attach: attach
+ };
+ };
+ var isChildOfContentEditableTrue = function (node) {
+ while (node = node.parentNode) {
+ var value = node.contentEditable;
+ if (value && value !== 'inherit') {
+ return isContentEditableTrue(node);
+ }
+ }
+ return false;
+ };
+ var select = function (selector, root) {
+ return map(descendants(SugarElement.fromDom(root), selector), function (element) {
+ return element.dom;
+ });
+ };
+ var getElementText = function (elm) {
+ return elm.innerText || elm.textContent;
+ };
+ var getOrGenerateId = function (elm) {
+ return elm.id ? elm.id : generate$1('h');
+ };
+ var isAnchor = function (elm) {
+ return elm && elm.nodeName === 'A' && (elm.id || elm.name) !== undefined;
+ };
+ var isValidAnchor = function (elm) {
+ return isAnchor(elm) && isEditable(elm);
+ };
+ var isHeader = function (elm) {
+ return elm && /^(H[1-6])$/.test(elm.nodeName);
+ };
+ var isEditable = function (elm) {
+ return isChildOfContentEditableTrue(elm) && !isContentEditableFalse(elm);
+ };
+ var isValidHeader = function (elm) {
+ return isHeader(elm) && isEditable(elm);
+ };
+ var getLevel = function (elm) {
+ return isHeader(elm) ? parseInt(elm.nodeName.substr(1), 10) : 0;
+ };
+ var headerTarget = function (elm) {
+ var headerId = getOrGenerateId(elm);
+ var attach = function () {
+ elm.id = headerId;
+ };
+ return create$8('header', getElementText(elm), '#' + headerId, getLevel(elm), attach);
+ };
+ var anchorTarget = function (elm) {
+ var anchorId = elm.id || elm.name;
+ var anchorText = getElementText(elm);
+ return create$8('anchor', anchorText ? anchorText : '#' + anchorId, '#' + anchorId, 0, noop);
+ };
+ var getHeaderTargets = function (elms) {
+ return map(filter(elms, isValidHeader), headerTarget);
+ };
+ var getAnchorTargets = function (elms) {
+ return map(filter(elms, isValidAnchor), anchorTarget);
+ };
+ var getTargetElements = function (elm) {
+ var elms = select('h1,h2,h3,h4,h5,h6,a:not([href])', elm);
+ return elms;
+ };
+ var hasTitle = function (target) {
+ return trim$1(target.title).length > 0;
+ };
+ var find$5 = function (elm) {
+ var elms = getTargetElements(elm);
+ return filter(getHeaderTargets(elms).concat(getAnchorTargets(elms)), hasTitle);
+ };
+ var LinkTargets = { find: find$5 };
+
+ var STORAGE_KEY = 'tinymce-url-history';
+ var HISTORY_LENGTH = 5;
+ var isHttpUrl = function (url) {
+ return isString(url) && /^https?/.test(url);
+ };
+ var isArrayOfUrl = function (a) {
+ return isArray(a) && a.length <= HISTORY_LENGTH && forall(a, isHttpUrl);
+ };
+ var isRecordOfUrlArray = function (r) {
+ return isObject(r) && find$1(r, function (value) {
+ return !isArrayOfUrl(value);
+ }).isNone();
+ };
+ var getAllHistory = function () {
+ var unparsedHistory = global$9.getItem(STORAGE_KEY);
+ if (unparsedHistory === null) {
+ return {};
+ }
+ var history;
+ try {
+ history = JSON.parse(unparsedHistory);
+ } catch (e) {
+ if (e instanceof SyntaxError) {
+ console.log('Local storage ' + STORAGE_KEY + ' was not valid JSON', e);
+ return {};
+ }
+ throw e;
+ }
+ if (!isRecordOfUrlArray(history)) {
+ console.log('Local storage ' + STORAGE_KEY + ' was not valid format', history);
+ return {};
+ }
+ return history;
+ };
+ var setAllHistory = function (history) {
+ if (!isRecordOfUrlArray(history)) {
+ throw new Error('Bad format for history:\n' + JSON.stringify(history));
+ }
+ global$9.setItem(STORAGE_KEY, JSON.stringify(history));
+ };
+ var getHistory = function (fileType) {
+ var history = getAllHistory();
+ return Object.prototype.hasOwnProperty.call(history, fileType) ? history[fileType] : [];
+ };
+ var addToHistory = function (url, fileType) {
+ if (!isHttpUrl(url)) {
+ return;
+ }
+ var history = getAllHistory();
+ var items = Object.prototype.hasOwnProperty.call(history, fileType) ? history[fileType] : [];
+ var itemsWithoutUrl = filter(items, function (item) {
+ return item !== url;
+ });
+ history[fileType] = [url].concat(itemsWithoutUrl).slice(0, HISTORY_LENGTH);
+ setAllHistory(history);
+ };
+
+ var isTruthy = function (value) {
+ return !!value;
+ };
+ var makeMap = function (value) {
+ return map$2(global$c.makeMap(value, /[, ]/), isTruthy);
+ };
+ var getPicker = function (editor) {
+ return Optional.from(getFilePickerCallback(editor)).filter(isFunction);
+ };
+ var getPickerTypes = function (editor) {
+ var optFileTypes = Optional.some(getFilePickerTypes(editor)).filter(isTruthy);
+ var optLegacyTypes = Optional.some(getFileBrowserCallbackTypes(editor)).filter(isTruthy);
+ var optTypes = optFileTypes.or(optLegacyTypes).map(makeMap);
+ return getPicker(editor).fold(never, function (_picker) {
+ return optTypes.fold(always, function (types) {
+ return keys(types).length > 0 ? types : false;
+ });
+ });
+ };
+ var getPickerSetting = function (editor, filetype) {
+ var pickerTypes = getPickerTypes(editor);
+ if (isBoolean(pickerTypes)) {
+ return pickerTypes ? getPicker(editor) : Optional.none();
+ } else {
+ return pickerTypes[filetype] ? getPicker(editor) : Optional.none();
+ }
+ };
+ var getUrlPicker = function (editor, filetype) {
+ return getPickerSetting(editor, filetype).map(function (picker) {
+ return function (entry) {
+ return Future.nu(function (completer) {
+ var handler = function (value, meta) {
+ if (!isString(value)) {
+ throw new Error('Expected value to be string');
+ }
+ if (meta !== undefined && !isObject(meta)) {
+ throw new Error('Expected meta to be a object');
+ }
+ var r = {
+ value: value,
+ meta: meta
+ };
+ completer(r);
+ };
+ var meta = __assign({
+ filetype: filetype,
+ fieldname: entry.fieldname
+ }, Optional.from(entry.meta).getOr({}));
+ picker.call(editor, handler, entry.value, meta);
+ });
+ };
+ });
+ };
+ var getTextSetting = function (value) {
+ return Optional.from(value).filter(isString).getOrUndefined();
+ };
+ var getLinkInformation = function (editor) {
+ if (noTypeaheadUrls(editor)) {
+ return Optional.none();
+ }
+ return Optional.some({
+ targets: LinkTargets.find(editor.getBody()),
+ anchorTop: getTextSetting(getAnchorTop(editor)),
+ anchorBottom: getTextSetting(getAnchorBottom(editor))
+ });
+ };
+ var getValidationHandler = function (editor) {
+ return Optional.from(getFilePickerValidatorHandler(editor));
+ };
+ var UrlInputBackstage = function (editor) {
+ return {
+ getHistory: getHistory,
+ addToHistory: addToHistory,
+ getLinkInformation: function () {
+ return getLinkInformation(editor);
+ },
+ getValidationHandler: function () {
+ return getValidationHandler(editor);
+ },
+ getUrlPicker: function (filetype) {
+ return getUrlPicker(editor, filetype);
+ }
+ };
+ };
+
+ var init$8 = function (sink, editor, lazyAnchorbar) {
+ var contextMenuState = Cell(false);
+ var toolbar = HeaderBackstage(editor);
+ var backstage = {
+ shared: {
+ providers: {
+ icons: function () {
+ return editor.ui.registry.getAll().icons;
+ },
+ menuItems: function () {
+ return editor.ui.registry.getAll().menuItems;
+ },
+ translate: global$6.translate,
+ isDisabled: function () {
+ return editor.mode.isReadOnly() || editor.ui.isDisabled();
+ },
+ getSetting: editor.getParam.bind(editor)
+ },
+ interpreter: function (s) {
+ return interpretWithoutForm(s, backstage);
+ },
+ anchors: getAnchors(editor, lazyAnchorbar, toolbar.isPositionedAtTop),
+ header: toolbar,
+ getSink: function () {
+ return Result.value(sink);
+ }
+ },
+ urlinput: UrlInputBackstage(editor),
+ styleselect: init$7(editor),
+ colorinput: ColorInputBackstage(editor),
+ dialog: DialogBackstage(editor),
+ isContextMenuOpen: function () {
+ return contextMenuState.get();
+ },
+ setContextMenuState: function (state) {
+ return contextMenuState.set(state);
+ }
+ };
+ return backstage;
+ };
+
+ var expandable$1 = constant(function (element, available) {
+ setMax$1(element, Math.floor(available));
+ });
+
+ var showContextToolbarEvent = 'contexttoolbar-show';
+ var hideContextToolbarEvent = 'contexttoolbar-hide';
+
+ var schema$k = constant([
+ strict$1('dom'),
+ defaulted$1('shell', true),
+ field$1('toolbarBehaviours', [Replacing])
+ ]);
+ var enhanceGroups = function () {
+ return { behaviours: derive$1([Replacing.config({})]) };
+ };
+ var parts$7 = constant([optional({
+ name: 'groups',
+ overrides: enhanceGroups
+ })]);
+
+ var factory$9 = function (detail, components, _spec, _externals) {
+ var setGroups = function (toolbar, groups) {
+ getGroupContainer(toolbar).fold(function () {
+ console.error('Toolbar was defined to not be a shell, but no groups container was specified in components');
+ throw new Error('Toolbar was defined to not be a shell, but no groups container was specified in components');
+ }, function (container) {
+ Replacing.set(container, groups);
+ });
+ };
+ var getGroupContainer = function (component) {
+ return detail.shell ? Optional.some(component) : getPart(component, detail, 'groups');
+ };
+ var extra = detail.shell ? {
+ behaviours: [Replacing.config({})],
+ components: []
+ } : {
+ behaviours: [],
+ components: components
+ };
+ return {
+ uid: detail.uid,
+ dom: detail.dom,
+ components: extra.components,
+ behaviours: augment(detail.toolbarBehaviours, extra.behaviours),
+ apis: { setGroups: setGroups },
+ domModification: { attributes: { role: 'group' } }
+ };
+ };
+ var Toolbar = composite$1({
+ name: 'Toolbar',
+ configFields: schema$k(),
+ partFields: parts$7(),
+ factory: factory$9,
+ apis: {
+ setGroups: function (apis, toolbar, groups) {
+ apis.setGroups(toolbar, groups);
+ }
+ }
+ });
+
+ var generate$6 = function (xs, f) {
+ var init = {
+ len: 0,
+ list: []
+ };
+ var r = foldl(xs, function (b, a) {
+ var value = f(a, b.len);
+ return value.fold(constant(b), function (v) {
+ return {
+ len: v.finish,
+ list: b.list.concat([v])
+ };
+ });
+ }, init);
+ return r.list;
+ };
+
+ var output$1 = function (within, extra, withinWidth) {
+ return {
+ within: within,
+ extra: extra,
+ withinWidth: withinWidth
+ };
+ };
+ var apportion = function (units, total, len) {
+ var parray = generate$6(units, function (unit, current) {
+ var width = len(unit);
+ return Optional.some({
+ element: unit,
+ start: current,
+ finish: current + width,
+ width: width
+ });
+ });
+ var within = filter(parray, function (unit) {
+ return unit.finish <= total;
+ });
+ var withinWidth = foldr(within, function (acc, el) {
+ return acc + el.width;
+ }, 0);
+ var extra = parray.slice(within.length);
+ return {
+ within: within,
+ extra: extra,
+ withinWidth: withinWidth
+ };
+ };
+ var toUnit = function (parray) {
+ return map(parray, function (unit) {
+ return unit.element;
+ });
+ };
+ var fitLast = function (within, extra, withinWidth) {
+ var fits = toUnit(within.concat(extra));
+ return output$1(fits, [], withinWidth);
+ };
+ var overflow = function (within, extra, overflower, withinWidth) {
+ var fits = toUnit(within).concat([overflower]);
+ return output$1(fits, toUnit(extra), withinWidth);
+ };
+ var fitAll = function (within, extra, withinWidth) {
+ return output$1(toUnit(within), [], withinWidth);
+ };
+ var tryFit = function (total, units, len) {
+ var divide = apportion(units, total, len);
+ return divide.extra.length === 0 ? Optional.some(divide) : Optional.none();
+ };
+ var partition$3 = function (total, units, len, overflower) {
+ var divide = tryFit(total, units, len).getOrThunk(function () {
+ return apportion(units, total - len(overflower), len);
+ });
+ var within = divide.within;
+ var extra = divide.extra;
+ var withinWidth = divide.withinWidth;
+ if (extra.length === 1 && extra[0].width <= len(overflower)) {
+ return fitLast(within, extra, withinWidth);
+ } else if (extra.length >= 1) {
+ return overflow(within, extra, overflower, withinWidth);
+ } else {
+ return fitAll(within, extra, withinWidth);
+ }
+ };
+
+ var setGroups = function (toolbar, storedGroups) {
+ var bGroups = map(storedGroups, function (g) {
+ return premade$1(g);
+ });
+ Toolbar.setGroups(toolbar, bGroups);
+ };
+ var findFocusedComp = function (comps) {
+ return findMap(comps, function (comp) {
+ return search(comp.element).bind(function (focusedElm) {
+ return comp.getSystem().getByDom(focusedElm).toOptional();
+ });
+ });
+ };
+ var refresh = function (toolbar, detail, setOverflow) {
+ var primary = getPartOrDie(toolbar, detail, 'primary');
+ var overflowGroup = Coupling.getCoupled(toolbar, 'overflowGroup');
+ set$2(primary.element, 'visibility', 'hidden');
+ var groups = detail.builtGroups.get().concat([overflowGroup]);
+ var focusedComp = findFocusedComp(groups);
+ setOverflow([]);
+ setGroups(primary, groups);
+ var availableWidth = get$8(primary.element);
+ var overflows = partition$3(availableWidth, detail.builtGroups.get(), function (comp) {
+ return get$8(comp.element);
+ }, overflowGroup);
+ if (overflows.extra.length === 0) {
+ Replacing.remove(primary, overflowGroup);
+ setOverflow([]);
+ } else {
+ setGroups(primary, overflows.within);
+ setOverflow(overflows.extra);
+ }
+ remove$6(primary.element, 'visibility');
+ reflow(primary.element);
+ focusedComp.each(Focusing.focus);
+ };
+
+ var schema$l = constant([
+ field$1('splitToolbarBehaviours', [Coupling]),
+ state$1('builtGroups', function () {
+ return Cell([]);
+ })
+ ]);
+
+ var schema$m = constant([
+ markers(['overflowToggledClass']),
+ optionFunction('getOverflowBounds'),
+ strict$1('lazySink'),
+ state$1('overflowGroups', function () {
+ return Cell([]);
+ })
+ ].concat(schema$l()));
+ var parts$8 = constant([
+ required({
+ factory: Toolbar,
+ schema: schema$k(),
+ name: 'primary'
+ }),
+ external$1({
+ schema: schema$k(),
+ name: 'overflow'
+ }),
+ external$1({ name: 'overflow-button' }),
+ external$1({ name: 'overflow-group' })
+ ]);
+
+ var schema$n = constant([
+ markers(['toggledClass']),
+ strict$1('lazySink'),
+ strictFunction('fetch'),
+ optionFunction('getBounds'),
+ optionObjOf('fireDismissalEventInstead', [defaulted$1('event', dismissRequested())]),
+ schema$1()
+ ]);
+ var parts$9 = constant([
+ external$1({
+ name: 'button',
+ overrides: function (detail) {
+ return {
+ dom: { attributes: { 'aria-haspopup': 'true' } },
+ buttonBehaviours: derive$1([Toggling.config({
+ toggleClass: detail.markers.toggledClass,
+ aria: { mode: 'expanded' },
+ toggleOnExecute: false
+ })])
+ };
+ }
+ }),
+ external$1({
+ factory: Toolbar,
+ schema: schema$k(),
+ name: 'toolbar',
+ overrides: function (detail) {
+ return {
+ toolbarBehaviours: derive$1([Keying.config({
+ mode: 'cyclic',
+ onEscape: function (comp) {
+ getPart(comp, detail, 'button').each(Focusing.focus);
+ return Optional.none();
+ }
+ })])
+ };
+ }
+ })
+ ]);
+
+ var toggle$2 = function (button, externals) {
+ var toolbarSandbox = Coupling.getCoupled(button, 'toolbarSandbox');
+ if (Sandboxing.isOpen(toolbarSandbox)) {
+ Sandboxing.close(toolbarSandbox);
+ } else {
+ Sandboxing.open(toolbarSandbox, externals.toolbar());
+ }
+ };
+ var position$2 = function (button, toolbar, detail, layouts) {
+ var bounds = detail.getBounds.map(function (bounder) {
+ return bounder();
+ });
+ var sink = detail.lazySink(button).getOrDie();
+ Positioning.positionWithinBounds(sink, {
+ anchor: 'hotspot',
+ hotspot: button,
+ layouts: layouts,
+ overrides: { maxWidthFunction: expandable$1() }
+ }, toolbar, bounds);
+ };
+ var setGroups$1 = function (button, toolbar, detail, layouts, groups) {
+ Toolbar.setGroups(toolbar, groups);
+ position$2(button, toolbar, detail, layouts);
+ Toggling.on(button);
+ };
+ var makeSandbox$1 = function (button, spec, detail) {
+ var ariaOwner = manager();
+ var onOpen = function (sandbox, toolbar) {
+ detail.fetch().get(function (groups) {
+ setGroups$1(button, toolbar, detail, spec.layouts, groups);
+ ariaOwner.link(button.element);
+ Keying.focusIn(toolbar);
+ });
+ };
+ var onClose = function () {
+ Toggling.off(button);
+ Focusing.focus(button);
+ ariaOwner.unlink(button.element);
+ };
+ return {
+ dom: {
+ tag: 'div',
+ attributes: { id: ariaOwner.id }
+ },
+ behaviours: derive$1([
+ Keying.config({
+ mode: 'special',
+ onEscape: function (comp) {
+ Sandboxing.close(comp);
+ return Optional.some(true);
+ }
+ }),
+ Sandboxing.config({
+ onOpen: onOpen,
+ onClose: onClose,
+ isPartOf: function (container, data, queryElem) {
+ return isPartOf(data, queryElem) || isPartOf(button, queryElem);
+ },
+ getAttachPoint: function () {
+ return detail.lazySink(button).getOrDie();
+ }
+ }),
+ Receiving.config({
+ channels: __assign(__assign({}, receivingChannel(__assign({ isExtraPart: never }, detail.fireDismissalEventInstead.map(function (fe) {
+ return { fireEventInstead: { event: fe.event } };
+ }).getOr({})))), receivingChannel$1({
+ doReposition: function () {
+ Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox')).each(function (toolbar) {
+ position$2(button, toolbar, detail, spec.layouts);
+ });
+ }
+ }))
+ })
+ ])
+ };
+ };
+ var factory$a = function (detail, components, spec, externals) {
+ return __assign(__assign({}, Button.sketch(__assign(__assign({}, externals.button()), {
+ action: function (button) {
+ toggle$2(button, externals);
+ },
+ buttonBehaviours: SketchBehaviours.augment({ dump: externals.button().buttonBehaviours }, [Coupling.config({
+ others: {
+ toolbarSandbox: function (button) {
+ return makeSandbox$1(button, spec, detail);
+ }
+ }
+ })])
+ }))), {
+ apis: {
+ setGroups: function (button, groups) {
+ Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox')).each(function (toolbar) {
+ setGroups$1(button, toolbar, detail, spec.layouts, groups);
+ });
+ },
+ reposition: function (button) {
+ Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox')).each(function (toolbar) {
+ position$2(button, toolbar, detail, spec.layouts);
+ });
+ },
+ toggle: function (button) {
+ toggle$2(button, externals);
+ },
+ getToolbar: function (button) {
+ return Sandboxing.getState(Coupling.getCoupled(button, 'toolbarSandbox'));
+ },
+ isOpen: function (button) {
+ return Sandboxing.isOpen(Coupling.getCoupled(button, 'toolbarSandbox'));
+ }
+ }
+ });
+ };
+ var FloatingToolbarButton = composite$1({
+ name: 'FloatingToolbarButton',
+ factory: factory$a,
+ configFields: schema$n(),
+ partFields: parts$9(),
+ apis: {
+ setGroups: function (apis, button, groups) {
+ apis.setGroups(button, groups);
+ },
+ reposition: function (apis, button) {
+ apis.reposition(button);
+ },
+ toggle: function (apis, button) {
+ apis.toggle(button);
+ },
+ getToolbar: function (apis, button) {
+ return apis.getToolbar(button);
+ },
+ isOpen: function (apis, button) {
+ return apis.isOpen(button);
+ }
+ }
+ });
+
+ var schema$o = constant([
+ strict$1('items'),
+ markers(['itemSelector']),
+ field$1('tgroupBehaviours', [Keying])
+ ]);
+ var parts$a = constant([group({
+ name: 'items',
+ unit: 'item'
+ })]);
+
+ var factory$b = function (detail, components, _spec, _externals) {
+ return {
+ uid: detail.uid,
+ dom: detail.dom,
+ components: components,
+ behaviours: augment(detail.tgroupBehaviours, [Keying.config({
+ mode: 'flow',
+ selector: detail.markers.itemSelector
+ })]),
+ domModification: { attributes: { role: 'toolbar' } }
+ };
+ };
+ var ToolbarGroup = composite$1({
+ name: 'ToolbarGroup',
+ configFields: schema$o(),
+ partFields: parts$a(),
+ factory: factory$b
+ });
+
+ var buildGroups = function (comps) {
+ return map(comps, function (g) {
+ return premade$1(g);
+ });
+ };
+ var refresh$1 = function (toolbar, memFloatingToolbarButton, detail) {
+ refresh(toolbar, detail, function (overflowGroups) {
+ detail.overflowGroups.set(overflowGroups);
+ memFloatingToolbarButton.getOpt(toolbar).each(function (floatingToolbarButton) {
+ FloatingToolbarButton.setGroups(floatingToolbarButton, buildGroups(overflowGroups));
+ });
+ });
+ };
+ var factory$c = function (detail, components, spec, externals) {
+ var memFloatingToolbarButton = record(FloatingToolbarButton.sketch({
+ fetch: function () {
+ return Future.nu(function (resolve) {
+ resolve(buildGroups(detail.overflowGroups.get()));
+ });
+ },
+ layouts: {
+ onLtr: function () {
+ return [
+ southwest$1,
+ southeast$1
+ ];
+ },
+ onRtl: function () {
+ return [
+ southeast$1,
+ southwest$1
+ ];
+ },
+ onBottomLtr: function () {
+ return [
+ northwest$1,
+ northeast$1
+ ];
+ },
+ onBottomRtl: function () {
+ return [
+ northeast$1,
+ northwest$1
+ ];
+ }
+ },
+ getBounds: spec.getOverflowBounds,
+ lazySink: detail.lazySink,
+ fireDismissalEventInstead: {},
+ markers: { toggledClass: detail.markers.overflowToggledClass },
+ parts: {
+ button: externals['overflow-button'](),
+ toolbar: externals.overflow()
+ }
+ }));
+ return {
+ uid: detail.uid,
+ dom: detail.dom,
+ components: components,
+ behaviours: augment(detail.splitToolbarBehaviours, [Coupling.config({
+ others: {
+ overflowGroup: function () {
+ return ToolbarGroup.sketch(__assign(__assign({}, externals['overflow-group']()), { items: [memFloatingToolbarButton.asSpec()] }));
+ }
+ }
+ })]),
+ apis: {
+ setGroups: function (toolbar, groups) {
+ detail.builtGroups.set(map(groups, toolbar.getSystem().build));
+ refresh$1(toolbar, memFloatingToolbarButton, detail);
+ },
+ refresh: function (toolbar) {
+ return refresh$1(toolbar, memFloatingToolbarButton, detail);
+ },
+ toggle: function (toolbar) {
+ memFloatingToolbarButton.getOpt(toolbar).each(function (floatingToolbarButton) {
+ FloatingToolbarButton.toggle(floatingToolbarButton);
+ });
+ },
+ isOpen: function (toolbar) {
+ return memFloatingToolbarButton.getOpt(toolbar).map(FloatingToolbarButton.isOpen).getOr(false);
+ },
+ reposition: function (toolbar) {
+ memFloatingToolbarButton.getOpt(toolbar).each(function (floatingToolbarButton) {
+ FloatingToolbarButton.reposition(floatingToolbarButton);
+ });
+ },
+ getOverflow: function (toolbar) {
+ return memFloatingToolbarButton.getOpt(toolbar).bind(FloatingToolbarButton.getToolbar);
+ }
+ },
+ domModification: { attributes: { role: 'group' } }
+ };
+ };
+ var SplitFloatingToolbar = composite$1({
+ name: 'SplitFloatingToolbar',
+ configFields: schema$m(),
+ partFields: parts$8(),
+ factory: factory$c,
+ apis: {
+ setGroups: function (apis, toolbar, groups) {
+ apis.setGroups(toolbar, groups);
+ },
+ refresh: function (apis, toolbar) {
+ apis.refresh(toolbar);
+ },
+ reposition: function (apis, toolbar) {
+ apis.reposition(toolbar);
+ },
+ toggle: function (apis, toolbar) {
+ apis.toggle(toolbar);
+ },
+ isOpen: function (apis, toolbar) {
+ return apis.isOpen(toolbar);
+ },
+ getOverflow: function (apis, toolbar) {
+ return apis.getOverflow(toolbar);
+ }
+ }
+ });
+
+ var getAnimationRoot = function (component, slideConfig) {
+ return slideConfig.getAnimationRoot.fold(function () {
+ return component.element;
+ }, function (get) {
+ return get(component);
+ });
+ };
+
+ var getDimensionProperty = function (slideConfig) {
+ return slideConfig.dimension.property;
+ };
+ var getDimension = function (slideConfig, elem) {
+ return slideConfig.dimension.getDimension(elem);
+ };
+ var disableTransitions = function (component, slideConfig) {
+ var root = getAnimationRoot(component, slideConfig);
+ remove$5(root, [
+ slideConfig.shrinkingClass,
+ slideConfig.growingClass
+ ]);
+ };
+ var setShrunk = function (component, slideConfig) {
+ remove$4(component.element, slideConfig.openClass);
+ add$2(component.element, slideConfig.closedClass);
+ set$2(component.element, getDimensionProperty(slideConfig), '0px');
+ reflow(component.element);
+ };
+ var setGrown = function (component, slideConfig) {
+ remove$4(component.element, slideConfig.closedClass);
+ add$2(component.element, slideConfig.openClass);
+ remove$6(component.element, getDimensionProperty(slideConfig));
+ };
+ var doImmediateShrink = function (component, slideConfig, slideState, _calculatedSize) {
+ slideState.setCollapsed();
+ set$2(component.element, getDimensionProperty(slideConfig), getDimension(slideConfig, component.element));
+ reflow(component.element);
+ disableTransitions(component, slideConfig);
+ setShrunk(component, slideConfig);
+ slideConfig.onStartShrink(component);
+ slideConfig.onShrunk(component);
+ };
+ var doStartShrink = function (component, slideConfig, slideState, calculatedSize) {
+ var size = calculatedSize.getOrThunk(function () {
+ return getDimension(slideConfig, component.element);
+ });
+ slideState.setCollapsed();
+ set$2(component.element, getDimensionProperty(slideConfig), size);
+ reflow(component.element);
+ var root = getAnimationRoot(component, slideConfig);
+ remove$4(root, slideConfig.growingClass);
+ add$2(root, slideConfig.shrinkingClass);
+ setShrunk(component, slideConfig);
+ slideConfig.onStartShrink(component);
+ };
+ var doStartSmartShrink = function (component, slideConfig, slideState) {
+ var size = getDimension(slideConfig, component.element);
+ var shrinker = size === '0px' ? doImmediateShrink : doStartShrink;
+ shrinker(component, slideConfig, slideState, Optional.some(size));
+ };
+ var doStartGrow = function (component, slideConfig, slideState) {
+ var root = getAnimationRoot(component, slideConfig);
+ var wasShrinking = has$2(root, slideConfig.shrinkingClass);
+ var beforeSize = getDimension(slideConfig, component.element);
+ setGrown(component, slideConfig);
+ var fullSize = getDimension(slideConfig, component.element);
+ var startPartialGrow = function () {
+ set$2(component.element, getDimensionProperty(slideConfig), beforeSize);
+ reflow(component.element);
+ };
+ var startCompleteGrow = function () {
+ setShrunk(component, slideConfig);
+ };
+ var setStartSize = wasShrinking ? startPartialGrow : startCompleteGrow;
+ setStartSize();
+ remove$4(root, slideConfig.shrinkingClass);
+ add$2(root, slideConfig.growingClass);
+ setGrown(component, slideConfig);
+ set$2(component.element, getDimensionProperty(slideConfig), fullSize);
+ slideState.setExpanded();
+ slideConfig.onStartGrow(component);
+ };
+ var refresh$2 = function (component, slideConfig, slideState) {
+ if (slideState.isExpanded()) {
+ remove$6(component.element, getDimensionProperty(slideConfig));
+ var fullSize = getDimension(slideConfig, component.element);
+ set$2(component.element, getDimensionProperty(slideConfig), fullSize);
+ }
+ };
+ var grow = function (component, slideConfig, slideState) {
+ if (!slideState.isExpanded()) {
+ doStartGrow(component, slideConfig, slideState);
+ }
+ };
+ var shrink = function (component, slideConfig, slideState) {
+ if (slideState.isExpanded()) {
+ doStartSmartShrink(component, slideConfig, slideState);
+ }
+ };
+ var immediateShrink = function (component, slideConfig, slideState) {
+ if (slideState.isExpanded()) {
+ doImmediateShrink(component, slideConfig, slideState, Optional.none());
+ }
+ };
+ var hasGrown = function (component, slideConfig, slideState) {
+ return slideState.isExpanded();
+ };
+ var hasShrunk = function (component, slideConfig, slideState) {
+ return slideState.isCollapsed();
+ };
+ var isGrowing = function (component, slideConfig, _slideState) {
+ var root = getAnimationRoot(component, slideConfig);
+ return has$2(root, slideConfig.growingClass) === true;
+ };
+ var isShrinking = function (component, slideConfig, _slideState) {
+ var root = getAnimationRoot(component, slideConfig);
+ return has$2(root, slideConfig.shrinkingClass) === true;
+ };
+ var isTransitioning = function (component, slideConfig, slideState) {
+ return isGrowing(component, slideConfig) || isShrinking(component, slideConfig);
+ };
+ var toggleGrow = function (component, slideConfig, slideState) {
+ var f = slideState.isExpanded() ? doStartSmartShrink : doStartGrow;
+ f(component, slideConfig, slideState);
+ };
+
+ var SlidingApis = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ refresh: refresh$2,
+ grow: grow,
+ shrink: shrink,
+ immediateShrink: immediateShrink,
+ hasGrown: hasGrown,
+ hasShrunk: hasShrunk,
+ isGrowing: isGrowing,
+ isShrinking: isShrinking,
+ isTransitioning: isTransitioning,
+ toggleGrow: toggleGrow,
+ disableTransitions: disableTransitions
+ });
+
+ var exhibit$6 = function (base, slideConfig, _slideState) {
+ var expanded = slideConfig.expanded;
+ return expanded ? nu$6({
+ classes: [slideConfig.openClass],
+ styles: {}
+ }) : nu$6({
+ classes: [slideConfig.closedClass],
+ styles: wrap$1(slideConfig.dimension.property, '0px')
+ });
+ };
+ var events$d = function (slideConfig, slideState) {
+ return derive([runOnSource(transitionend(), function (component, simulatedEvent) {
+ var raw = simulatedEvent.event.raw;
+ if (raw.propertyName === slideConfig.dimension.property) {
+ disableTransitions(component, slideConfig);
+ if (slideState.isExpanded()) {
+ remove$6(component.element, slideConfig.dimension.property);
+ }
+ var notify = slideState.isExpanded() ? slideConfig.onGrown : slideConfig.onShrunk;
+ notify(component);
+ }
+ })]);
+ };
+
+ var ActiveSliding = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ exhibit: exhibit$6,
+ events: events$d
+ });
+
+ var SlidingSchema = [
+ strict$1('closedClass'),
+ strict$1('openClass'),
+ strict$1('shrinkingClass'),
+ strict$1('growingClass'),
+ option('getAnimationRoot'),
+ onHandler('onShrunk'),
+ onHandler('onStartShrink'),
+ onHandler('onGrown'),
+ onHandler('onStartGrow'),
+ defaulted$1('expanded', false),
+ strictOf('dimension', choose$1('property', {
+ width: [
+ output('property', 'width'),
+ output('getDimension', function (elem) {
+ return get$8(elem) + 'px';
+ })
+ ],
+ height: [
+ output('property', 'height'),
+ output('getDimension', function (elem) {
+ return get$7(elem) + 'px';
+ })
+ ]
+ }))
+ ];
+
+ var init$9 = function (spec) {
+ var state = Cell(spec.expanded);
+ var readState = function () {
+ return 'expanded: ' + state.get();
+ };
+ return nu$5({
+ isExpanded: function () {
+ return state.get() === true;
+ },
+ isCollapsed: function () {
+ return state.get() === false;
+ },
+ setCollapsed: curry(state.set, false),
+ setExpanded: curry(state.set, true),
+ readState: readState
+ });
+ };
+
+ var SlidingState = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ init: init$9
+ });
+
+ var Sliding = create$1({
+ fields: SlidingSchema,
+ name: 'sliding',
+ active: ActiveSliding,
+ apis: SlidingApis,
+ state: SlidingState
+ });
+
+ var schema$p = constant([
+ markers([
+ 'closedClass',
+ 'openClass',
+ 'shrinkingClass',
+ 'growingClass',
+ 'overflowToggledClass'
+ ]),
+ onHandler('onOpened'),
+ onHandler('onClosed')
+ ].concat(schema$l()));
+ var parts$b = constant([
+ required({
+ factory: Toolbar,
+ schema: schema$k(),
+ name: 'primary'
+ }),
+ required({
+ factory: Toolbar,
+ schema: schema$k(),
+ name: 'overflow',
+ overrides: function (detail) {
+ return {
+ toolbarBehaviours: derive$1([
+ Sliding.config({
+ dimension: { property: 'height' },
+ closedClass: detail.markers.closedClass,
+ openClass: detail.markers.openClass,
+ shrinkingClass: detail.markers.shrinkingClass,
+ growingClass: detail.markers.growingClass,
+ onShrunk: function (comp) {
+ getPart(comp, detail, 'overflow-button').each(function (button) {
+ Toggling.off(button);
+ Focusing.focus(button);
+ });
+ detail.onClosed(comp);
+ },
+ onGrown: function (comp) {
+ Keying.focusIn(comp);
+ detail.onOpened(comp);
+ },
+ onStartGrow: function (comp) {
+ getPart(comp, detail, 'overflow-button').each(Toggling.on);
+ }
+ }),
+ Keying.config({
+ mode: 'acyclic',
+ onEscape: function (comp) {
+ getPart(comp, detail, 'overflow-button').each(Focusing.focus);
+ return Optional.some(true);
+ }
+ })
+ ])
+ };
+ }
+ }),
+ external$1({
+ name: 'overflow-button',
+ overrides: function (detail) {
+ return {
+ buttonBehaviours: derive$1([Toggling.config({
+ toggleClass: detail.markers.overflowToggledClass,
+ aria: { mode: 'pressed' },
+ toggleOnExecute: false
+ })])
+ };
+ }
+ }),
+ external$1({ name: 'overflow-group' })
+ ]);
+
+ var isOpen$1 = function (toolbar, detail) {
+ return getPart(toolbar, detail, 'overflow').map(Sliding.hasGrown).getOr(false);
+ };
+ var toggleToolbar = function (toolbar, detail) {
+ getPart(toolbar, detail, 'overflow-button').bind(function () {
+ return getPart(toolbar, detail, 'overflow');
+ }).each(function (overf) {
+ refresh$3(toolbar, detail);
+ Sliding.toggleGrow(overf);
+ });
+ };
+ var refresh$3 = function (toolbar, detail) {
+ getPart(toolbar, detail, 'overflow').each(function (overflow) {
+ refresh(toolbar, detail, function (groups) {
+ var builtGroups = map(groups, function (g) {
+ return premade$1(g);
+ });
+ Toolbar.setGroups(overflow, builtGroups);
+ });
+ getPart(toolbar, detail, 'overflow-button').each(function (button) {
+ if (Sliding.hasGrown(overflow)) {
+ Toggling.on(button);
+ }
+ });
+ Sliding.refresh(overflow);
+ });
+ };
+ var factory$d = function (detail, components, spec, externals) {
+ var toolbarToggleEvent = 'alloy.toolbar.toggle';
+ var doSetGroups = function (toolbar, groups) {
+ var built = map(groups, toolbar.getSystem().build);
+ detail.builtGroups.set(built);
+ };
+ return {
+ uid: detail.uid,
+ dom: detail.dom,
+ components: components,
+ behaviours: augment(detail.splitToolbarBehaviours, [
+ Coupling.config({
+ others: {
+ overflowGroup: function (toolbar) {
+ return ToolbarGroup.sketch(__assign(__assign({}, externals['overflow-group']()), {
+ items: [Button.sketch(__assign(__assign({}, externals['overflow-button']()), {
+ action: function (_button) {
+ emit(toolbar, toolbarToggleEvent);
+ }
+ }))]
+ }));
+ }
+ }
+ }),
+ config('toolbar-toggle-events', [run(toolbarToggleEvent, function (toolbar) {
+ toggleToolbar(toolbar, detail);
+ })])
+ ]),
+ apis: {
+ setGroups: function (toolbar, groups) {
+ doSetGroups(toolbar, groups);
+ refresh$3(toolbar, detail);
+ },
+ refresh: function (toolbar) {
+ return refresh$3(toolbar, detail);
+ },
+ toggle: function (toolbar) {
+ return toggleToolbar(toolbar, detail);
+ },
+ isOpen: function (toolbar) {
+ return isOpen$1(toolbar, detail);
+ }
+ },
+ domModification: { attributes: { role: 'group' } }
+ };
+ };
+ var SplitSlidingToolbar = composite$1({
+ name: 'SplitSlidingToolbar',
+ configFields: schema$p(),
+ partFields: parts$b(),
+ factory: factory$d,
+ apis: {
+ setGroups: function (apis, toolbar, groups) {
+ apis.setGroups(toolbar, groups);
+ },
+ refresh: function (apis, toolbar) {
+ apis.refresh(toolbar);
+ },
+ toggle: function (apis, toolbar) {
+ apis.toggle(toolbar);
+ },
+ isOpen: function (apis, toolbar) {
+ return apis.isOpen(toolbar);
+ }
+ }
+ });
+
+ var toolbarHeightChange = constant(generate$1('toolbar-height-change'));
+
+ var renderToolbarGroupCommon = function (toolbarGroup) {
+ var attributes = toolbarGroup.title.fold(function () {
+ return {};
+ }, function (title) {
+ return { attributes: { title: title } };
+ });
+ return {
+ dom: __assign({
+ tag: 'div',
+ classes: ['tox-toolbar__group']
+ }, attributes),
+ components: [ToolbarGroup.parts.items({})],
+ items: toolbarGroup.items,
+ markers: { itemSelector: '*:not(.tox-split-button) > .tox-tbtn:not([disabled]), ' + '.tox-split-button:not([disabled]), ' + '.tox-toolbar-nav-js:not([disabled])' },
+ tgroupBehaviours: derive$1([
+ Tabstopping.config({}),
+ Focusing.config({})
+ ])
+ };
+ };
+ var renderToolbarGroup = function (toolbarGroup) {
+ return ToolbarGroup.sketch(renderToolbarGroupCommon(toolbarGroup));
+ };
+ var getToolbarbehaviours = function (toolbarSpec, modeName) {
+ var onAttached = runOnAttached(function (component) {
+ var groups = map(toolbarSpec.initGroups, renderToolbarGroup);
+ Toolbar.setGroups(component, groups);
+ });
+ return derive$1([
+ DisablingConfigs.toolbarButton(toolbarSpec.providers.isDisabled),
+ receivingConfig(),
+ Keying.config({
+ mode: modeName,
+ onEscape: toolbarSpec.onEscape,
+ selector: '.tox-toolbar__group'
+ }),
+ config('toolbar-events', [onAttached])
+ ]);
+ };
+ var renderMoreToolbarCommon = function (toolbarSpec) {
+ var modeName = toolbarSpec.cyclicKeying ? 'cyclic' : 'acyclic';
+ return {
+ uid: toolbarSpec.uid,
+ dom: {
+ tag: 'div',
+ classes: ['tox-toolbar-overlord']
+ },
+ parts: {
+ 'overflow-group': renderToolbarGroupCommon({
+ title: Optional.none(),
+ items: []
+ }),
+ 'overflow-button': renderIconButtonSpec({
+ name: 'more',
+ icon: Optional.some('more-drawer'),
+ disabled: false,
+ tooltip: Optional.some('More...'),
+ primary: false,
+ borderless: false
+ }, Optional.none(), toolbarSpec.providers)
+ },
+ splitToolbarBehaviours: getToolbarbehaviours(toolbarSpec, modeName)
+ };
+ };
+ var renderFloatingMoreToolbar = function (toolbarSpec) {
+ var baseSpec = renderMoreToolbarCommon(toolbarSpec);
+ var overflowXOffset = 4;
+ var primary = SplitFloatingToolbar.parts.primary({
+ dom: {
+ tag: 'div',
+ classes: ['tox-toolbar__primary']
+ }
+ });
+ return SplitFloatingToolbar.sketch(__assign(__assign({}, baseSpec), {
+ lazySink: toolbarSpec.getSink,
+ getOverflowBounds: function () {
+ var headerElem = toolbarSpec.moreDrawerData.lazyHeader().element;
+ var headerBounds = absolute$1(headerElem);
+ var docElem = documentElement(headerElem);
+ var docBounds = absolute$1(docElem);
+ var height = Math.max(docElem.dom.scrollHeight, docBounds.height);
+ return bounds$1(headerBounds.x + overflowXOffset, docBounds.y, headerBounds.width - overflowXOffset * 2, height);
+ },
+ parts: __assign(__assign({}, baseSpec.parts), {
+ overflow: {
+ dom: {
+ tag: 'div',
+ classes: ['tox-toolbar__overflow'],
+ attributes: toolbarSpec.attributes
+ }
+ }
+ }),
+ components: [primary],
+ markers: { overflowToggledClass: 'tox-tbtn--enabled' }
+ }));
+ };
+ var renderSlidingMoreToolbar = function (toolbarSpec) {
+ var primary = SplitSlidingToolbar.parts.primary({
+ dom: {
+ tag: 'div',
+ classes: ['tox-toolbar__primary']
+ }
+ });
+ var overflow = SplitSlidingToolbar.parts.overflow({
+ dom: {
+ tag: 'div',
+ classes: ['tox-toolbar__overflow']
+ }
+ });
+ var baseSpec = renderMoreToolbarCommon(toolbarSpec);
+ return SplitSlidingToolbar.sketch(__assign(__assign({}, baseSpec), {
+ components: [
+ primary,
+ overflow
+ ],
+ markers: {
+ openClass: 'tox-toolbar__overflow--open',
+ closedClass: 'tox-toolbar__overflow--closed',
+ growingClass: 'tox-toolbar__overflow--growing',
+ shrinkingClass: 'tox-toolbar__overflow--shrinking',
+ overflowToggledClass: 'tox-tbtn--enabled'
+ },
+ onOpened: function (comp) {
+ comp.getSystem().broadcastOn([toolbarHeightChange()], { type: 'opened' });
+ },
+ onClosed: function (comp) {
+ comp.getSystem().broadcastOn([toolbarHeightChange()], { type: 'closed' });
+ }
+ }));
+ };
+ var renderToolbar = function (toolbarSpec) {
+ var modeName = toolbarSpec.cyclicKeying ? 'cyclic' : 'acyclic';
+ return Toolbar.sketch({
+ uid: toolbarSpec.uid,
+ dom: {
+ tag: 'div',
+ classes: ['tox-toolbar'].concat(toolbarSpec.type === ToolbarMode.scrolling ? ['tox-toolbar--scrolling'] : [])
+ },
+ components: [Toolbar.parts.groups({})],
+ toolbarBehaviours: getToolbarbehaviours(toolbarSpec, modeName)
+ });
+ };
+
+ var groupToolbarButtonSchema = objOf([
+ strictString('type'),
+ strictOf('items', oneOf([
+ arrOfObj$1([
+ strictString('name'),
+ strictArrayOf('items', string)
+ ]),
+ string
+ ]))
+ ].concat(baseToolbarButtonFields));
+ var createGroupToolbarButton = function (spec) {
+ return asRaw('GroupToolbarButton', groupToolbarButtonSchema, spec);
+ };
+
+ var baseMenuButtonFields = [
+ optionString('text'),
+ optionString('tooltip'),
+ optionString('icon'),
+ strictFunction('fetch'),
+ defaultedFunction('onSetup', function () {
+ return noop;
+ })
+ ];
+
+ var MenuButtonSchema = objOf(__spreadArrays([strictString('type')], baseMenuButtonFields));
+ var createMenuButton = function (spec) {
+ return asRaw('menubutton', MenuButtonSchema, spec);
+ };
+
+ var splitButtonSchema = objOf([
+ strictString('type'),
+ optionString('tooltip'),
+ optionString('icon'),
+ optionString('text'),
+ optionFunction('select'),
+ strictFunction('fetch'),
+ defaultedFunction('onSetup', function () {
+ return noop;
+ }),
+ defaultedStringEnum('presets', 'normal', [
+ 'normal',
+ 'color',
+ 'listpreview'
+ ]),
+ defaulted$1('columns', 1),
+ strictFunction('onAction'),
+ strictFunction('onItemAction')
+ ]);
+ var createSplitButton = function (spec) {
+ return asRaw('SplitButton', splitButtonSchema, spec);
+ };
+
+ var events$e = function (reflectingConfig, reflectingState) {
+ var update = function (component, data) {
+ reflectingConfig.updateState.each(function (updateState) {
+ var newState = updateState(component, data);
+ reflectingState.set(newState);
+ });
+ reflectingConfig.renderComponents.each(function (renderComponents) {
+ var newComponents = renderComponents(data, reflectingState.get());
+ var newChildren = map(newComponents, component.getSystem().build);
+ replaceChildren(component, newChildren);
+ });
+ };
+ return derive([
+ run(receive(), function (component, message) {
+ var receivingData = message;
+ if (!receivingData.universal) {
+ var channel = reflectingConfig.channel;
+ if (contains(receivingData.channels, channel)) {
+ update(component, receivingData.data);
+ }
+ }
+ }),
+ runOnAttached(function (comp, _se) {
+ reflectingConfig.initialData.each(function (rawData) {
+ update(comp, rawData);
+ });
+ })
+ ]);
+ };
+
+ var ActiveReflecting = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ events: events$e
+ });
+
+ var getState$2 = function (component, replaceConfig, reflectState) {
+ return reflectState;
+ };
+
+ var ReflectingApis = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ getState: getState$2
+ });
+
+ var ReflectingSchema = [
+ strict$1('channel'),
+ option('renderComponents'),
+ option('updateState'),
+ option('initialData')
+ ];
+
+ var init$a = function () {
+ var cell = Cell(Optional.none());
+ var set = function (optS) {
+ return cell.set(optS);
+ };
+ var clear = function () {
+ return cell.set(Optional.none());
+ };
+ var get = function () {
+ return cell.get();
+ };
+ var readState = function () {
+ return cell.get().fold(function () {
+ return 'none';
+ }, function (x) {
+ return x;
+ });
+ };
+ return {
+ readState: readState,
+ get: get,
+ set: set,
+ clear: clear
+ };
+ };
+
+ var ReflectingState = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ init: init$a
+ });
+
+ var Reflecting = create$1({
+ fields: ReflectingSchema,
+ name: 'reflecting',
+ active: ActiveReflecting,
+ apis: ReflectingApis,
+ state: ReflectingState
+ });
+
+ var schema$q = constant([
+ strict$1('toggleClass'),
+ strict$1('fetch'),
+ onStrictHandler('onExecute'),
+ defaulted$1('getHotspot', Optional.some),
+ defaulted$1('getAnchorOverrides', constant({})),
+ schema$1(),
+ onStrictHandler('onItemExecute'),
+ option('lazySink'),
+ strict$1('dom'),
+ onHandler('onOpen'),
+ field$1('splitDropdownBehaviours', [
+ Coupling,
+ Keying,
+ Focusing
+ ]),
+ defaulted$1('matchWidth', false),
+ defaulted$1('useMinWidth', false),
+ defaulted$1('eventOrder', {}),
+ option('role')
+ ].concat(sandboxFields()));
+ var arrowPart = required({
+ factory: Button,
+ schema: [strict$1('dom')],
+ name: 'arrow',
+ defaults: function () {
+ return { buttonBehaviours: derive$1([Focusing.revoke()]) };
+ },
+ overrides: function (detail) {
+ return {
+ dom: {
+ tag: 'span',
+ attributes: { role: 'presentation' }
+ },
+ action: function (arrow) {
+ arrow.getSystem().getByUid(detail.uid).each(emitExecute);
+ },
+ buttonBehaviours: derive$1([Toggling.config({
+ toggleOnExecute: false,
+ toggleClass: detail.toggleClass
+ })])
+ };
+ }
+ });
+ var buttonPart = required({
+ factory: Button,
+ schema: [strict$1('dom')],
+ name: 'button',
+ defaults: function () {
+ return { buttonBehaviours: derive$1([Focusing.revoke()]) };
+ },
+ overrides: function (detail) {
+ return {
+ dom: {
+ tag: 'span',
+ attributes: { role: 'presentation' }
+ },
+ action: function (btn) {
+ btn.getSystem().getByUid(detail.uid).each(function (splitDropdown) {
+ detail.onExecute(splitDropdown, btn);
+ });
+ }
+ };
+ }
+ });
+ var parts$c = constant([
+ arrowPart,
+ buttonPart,
+ optional({
+ factory: {
+ sketch: function (spec) {
+ return {
+ uid: spec.uid,
+ dom: {
+ tag: 'span',
+ styles: { display: 'none' },
+ attributes: { 'aria-hidden': 'true' },
+ innerHtml: spec.text
+ }
+ };
+ }
+ },
+ schema: [strict$1('text')],
+ name: 'aria-descriptor'
+ }),
+ external$1({
+ schema: [tieredMenuMarkers()],
+ name: 'menu',
+ defaults: function (detail) {
+ return {
+ onExecute: function (tmenu, item) {
+ tmenu.getSystem().getByUid(detail.uid).each(function (splitDropdown) {
+ detail.onItemExecute(splitDropdown, tmenu, item);
+ });
+ }
+ };
+ }
+ }),
+ partType()
+ ]);
+
+ var factory$e = function (detail, components, spec, externals) {
+ var _a;
+ var switchToMenu = function (sandbox) {
+ Composing.getCurrent(sandbox).each(function (current) {
+ Highlighting.highlightFirst(current);
+ Keying.focusIn(current);
+ });
+ };
+ var action = function (component) {
+ var onOpenSync = switchToMenu;
+ togglePopup(detail, function (x) {
+ return x;
+ }, component, externals, onOpenSync, HighlightOnOpen.HighlightFirst).get(noop);
+ };
+ var openMenu = function (comp) {
+ action(comp);
+ return Optional.some(true);
+ };
+ var executeOnButton = function (comp) {
+ var button = getPartOrDie(comp, detail, 'button');
+ emitExecute(button);
+ return Optional.some(true);
+ };
+ var buttonEvents = __assign(__assign({}, derive([runOnAttached(function (component, _simulatedEvent) {
+ var ariaDescriptor = getPart(component, detail, 'aria-descriptor');
+ ariaDescriptor.each(function (descriptor) {
+ var descriptorId = generate$1('aria');
+ set$1(descriptor.element, 'id', descriptorId);
+ set$1(component.element, 'aria-describedby', descriptorId);
+ });
+ })])), events$7(Optional.some(action)));
+ var apis = {
+ repositionMenus: function (comp) {
+ if (Toggling.isOn(comp)) {
+ repositionMenus(comp);
+ }
+ }
+ };
+ return {
+ uid: detail.uid,
+ dom: detail.dom,
+ components: components,
+ apis: apis,
+ eventOrder: __assign(__assign({}, detail.eventOrder), (_a = {}, _a[execute()] = [
+ 'disabling',
+ 'toggling',
+ 'alloy.base.behaviour'
+ ], _a)),
+ events: buttonEvents,
+ behaviours: augment(detail.splitDropdownBehaviours, [
+ Coupling.config({
+ others: {
+ sandbox: function (hotspot) {
+ var arrow = getPartOrDie(hotspot, detail, 'arrow');
+ var extras = {
+ onOpen: function () {
+ Toggling.on(arrow);
+ Toggling.on(hotspot);
+ },
+ onClose: function () {
+ Toggling.off(arrow);
+ Toggling.off(hotspot);
+ }
+ };
+ return makeSandbox(detail, hotspot, extras);
+ }
+ }
+ }),
+ Keying.config({
+ mode: 'special',
+ onSpace: executeOnButton,
+ onEnter: executeOnButton,
+ onDown: openMenu
+ }),
+ Focusing.config({}),
+ Toggling.config({
+ toggleOnExecute: false,
+ aria: { mode: 'expanded' }
+ })
+ ]),
+ domModification: {
+ attributes: {
+ 'role': detail.role.getOr('button'),
+ 'aria-haspopup': true
+ }
+ }
+ };
+ };
+ var SplitDropdown = composite$1({
+ name: 'SplitDropdown',
+ configFields: schema$q(),
+ partFields: parts$c(),
+ factory: factory$e,
+ apis: {
+ repositionMenus: function (apis, comp) {
+ return apis.repositionMenus(comp);
+ }
+ }
+ });
+
+ var getButtonApi = function (component) {
+ return {
+ isDisabled: function () {
+ return Disabling.isDisabled(component);
+ },
+ setDisabled: function (state) {
+ return Disabling.set(component, state);
+ }
+ };
+ };
+ var getToggleApi = function (component) {
+ return {
+ setActive: function (state) {
+ Toggling.set(component, state);
+ },
+ isActive: function () {
+ return Toggling.isOn(component);
+ },
+ isDisabled: function () {
+ return Disabling.isDisabled(component);
+ },
+ setDisabled: function (state) {
+ return Disabling.set(component, state);
+ }
+ };
+ };
+ var getTooltipAttributes = function (tooltip, providersBackstage) {
+ return tooltip.map(function (tooltip) {
+ return {
+ 'aria-label': providersBackstage.translate(tooltip),
+ 'title': providersBackstage.translate(tooltip)
+ };
+ }).getOr({});
+ };
+ var focusButtonEvent = generate$1('focus-button');
+ var rtlIcon$1 = [
+ 'checklist',
+ 'ordered-list'
+ ];
+ var rtlTransform$1 = [
+ 'indent',
+ 'outdent',
+ 'table-insert-column-after',
+ 'table-insert-column-before',
+ 'unordered-list'
+ ];
+ var renderCommonStructure = function (icon, text, tooltip, receiver, behaviours, providersBackstage) {
+ var _d;
+ var getIconName = function (iconName) {
+ return global$6.isRtl() && contains(rtlIcon$1, iconName) ? iconName + '-rtl' : iconName;
+ };
+ var needsRtlClass = global$6.isRtl() && icon.exists(function (name) {
+ return contains(rtlTransform$1, name);
+ });
+ return {
+ dom: {
+ tag: 'button',
+ classes: ['tox-tbtn'].concat(text.isSome() ? ['tox-tbtn--select'] : []).concat(needsRtlClass ? ['tox-tbtn__icon-rtl'] : []),
+ attributes: getTooltipAttributes(tooltip, providersBackstage)
+ },
+ components: componentRenderPipeline([
+ icon.map(function (iconName) {
+ return renderIconFromPack(getIconName(iconName), providersBackstage.icons);
+ }),
+ text.map(function (text) {
+ return renderLabel$1(text, 'tox-tbtn', providersBackstage);
+ })
+ ]),
+ eventOrder: (_d = {}, _d[mousedown()] = [
+ 'focusing',
+ 'alloy.base.behaviour',
+ 'common-button-display-events'
+ ], _d),
+ buttonBehaviours: derive$1([
+ DisablingConfigs.toolbarButton(providersBackstage.isDisabled),
+ receivingConfig(),
+ config('common-button-display-events', [run(mousedown(), function (button, se) {
+ se.event.prevent();
+ emit(button, focusButtonEvent);
+ })])
+ ].concat(receiver.map(function (r) {
+ return Reflecting.config({
+ channel: r,
+ initialData: {
+ icon: icon,
+ text: text
+ },
+ renderComponents: function (data, _state) {
+ return componentRenderPipeline([
+ data.icon.map(function (iconName) {
+ return renderIconFromPack(getIconName(iconName), providersBackstage.icons);
+ }),
+ data.text.map(function (text) {
+ return renderLabel$1(text, 'tox-tbtn', providersBackstage);
+ })
+ ]);
+ }
+ });
+ }).toArray()).concat(behaviours.getOr([])))
+ };
+ };
+ var renderFloatingToolbarButton = function (spec, backstage, identifyButtons, attributes) {
+ var sharedBackstage = backstage.shared;
+ return FloatingToolbarButton.sketch({
+ lazySink: sharedBackstage.getSink,
+ fetch: function () {
+ return Future.nu(function (resolve) {
+ resolve(map(identifyButtons(spec.items), renderToolbarGroup));
+ });
+ },
+ markers: { toggledClass: 'tox-tbtn--enabled' },
+ parts: {
+ button: renderCommonStructure(spec.icon, spec.text, spec.tooltip, Optional.none(), Optional.none(), sharedBackstage.providers),
+ toolbar: {
+ dom: {
+ tag: 'div',
+ classes: ['tox-toolbar__overflow'],
+ attributes: attributes
+ }
+ }
+ }
+ });
+ };
+ var renderCommonToolbarButton = function (spec, specialisation, providersBackstage) {
+ var editorOffCell = Cell(noop);
+ var structure = renderCommonStructure(spec.icon, spec.text, spec.tooltip, Optional.none(), Optional.none(), providersBackstage);
+ return Button.sketch({
+ dom: structure.dom,
+ components: structure.components,
+ eventOrder: toolbarButtonEventOrder,
+ buttonBehaviours: derive$1([
+ config('toolbar-button-events', [
+ onToolbarButtonExecute({
+ onAction: spec.onAction,
+ getApi: specialisation.getApi
+ }),
+ onControlAttached(specialisation, editorOffCell),
+ onControlDetached(specialisation, editorOffCell)
+ ]),
+ DisablingConfigs.toolbarButton(function () {
+ return spec.disabled || providersBackstage.isDisabled();
+ }),
+ receivingConfig()
+ ].concat(specialisation.toolbarButtonBehaviours))
+ });
+ };
+ var renderToolbarButton = function (spec, providersBackstage) {
+ return renderToolbarButtonWith(spec, providersBackstage, []);
+ };
+ var renderToolbarButtonWith = function (spec, providersBackstage, bonusEvents) {
+ return renderCommonToolbarButton(spec, {
+ toolbarButtonBehaviours: [].concat(bonusEvents.length > 0 ? [config('toolbarButtonWith', bonusEvents)] : []),
+ getApi: getButtonApi,
+ onSetup: spec.onSetup
+ }, providersBackstage);
+ };
+ var renderToolbarToggleButton = function (spec, providersBackstage) {
+ return renderToolbarToggleButtonWith(spec, providersBackstage, []);
+ };
+ var renderToolbarToggleButtonWith = function (spec, providersBackstage, bonusEvents) {
+ return deepMerge(renderCommonToolbarButton(spec, {
+ toolbarButtonBehaviours: [
+ Replacing.config({}),
+ Toggling.config({
+ toggleClass: 'tox-tbtn--enabled',
+ aria: { mode: 'pressed' },
+ toggleOnExecute: false
+ })
+ ].concat(bonusEvents.length > 0 ? [config('toolbarToggleButtonWith', bonusEvents)] : []),
+ getApi: getToggleApi,
+ onSetup: spec.onSetup
+ }, providersBackstage));
+ };
+ var fetchChoices = function (getApi, spec, providersBackstage) {
+ return function (comp) {
+ return Future.nu(function (callback) {
+ return spec.fetch(callback);
+ }).map(function (items) {
+ return Optional.from(createTieredDataFrom(deepMerge(createPartialChoiceMenu(generate$1('menu-value'), items, function (value) {
+ spec.onItemAction(getApi(comp), value);
+ }, spec.columns, spec.presets, ItemResponse$1.CLOSE_ON_EXECUTE, spec.select.getOr(never), providersBackstage), {
+ movement: deriveMenuMovement(spec.columns, spec.presets),
+ menuBehaviours: SimpleBehaviours.unnamedEvents(spec.columns !== 'auto' ? [] : [runOnAttached(function (comp, _se) {
+ detectSize(comp, 4, classForPreset(spec.presets)).each(function (_d) {
+ var numRows = _d.numRows, numColumns = _d.numColumns;
+ Keying.setGridSize(comp, numRows, numColumns);
+ });
+ })])
+ })));
+ });
+ };
+ };
+ var renderSplitButton = function (spec, sharedBackstage) {
+ var _d;
+ var displayChannel = generate$1('channel-update-split-dropdown-display');
+ var getApi = function (comp) {
+ return {
+ isDisabled: function () {
+ return Disabling.isDisabled(comp);
+ },
+ setDisabled: function (state) {
+ return Disabling.set(comp, state);
+ },
+ setIconFill: function (id, value) {
+ descendant$1(comp.element, 'svg path[id="' + id + '"], rect[id="' + id + '"]').each(function (underlinePath) {
+ set$1(underlinePath, 'fill', value);
+ });
+ },
+ setIconStroke: function (id, value) {
+ descendant$1(comp.element, 'svg path[id="' + id + '"], rect[id="' + id + '"]').each(function (underlinePath) {
+ set$1(underlinePath, 'stroke', value);
+ });
+ },
+ setActive: function (state) {
+ set$1(comp.element, 'aria-pressed', state);
+ descendant$1(comp.element, 'span').each(function (button) {
+ comp.getSystem().getByDom(button).each(function (buttonComp) {
+ return Toggling.set(buttonComp, state);
+ });
+ });
+ },
+ isActive: function () {
+ return descendant$1(comp.element, 'span').exists(function (button) {
+ return comp.getSystem().getByDom(button).exists(Toggling.isOn);
+ });
+ }
+ };
+ };
+ var editorOffCell = Cell(noop);
+ var specialisation = {
+ getApi: getApi,
+ onSetup: spec.onSetup
+ };
+ return SplitDropdown.sketch({
+ dom: {
+ tag: 'div',
+ classes: ['tox-split-button'],
+ attributes: __assign({ 'aria-pressed': false }, getTooltipAttributes(spec.tooltip, sharedBackstage.providers))
+ },
+ onExecute: function (button) {
+ spec.onAction(getApi(button));
+ },
+ onItemExecute: function (_a, _b, _c) {
+ },
+ splitDropdownBehaviours: derive$1([
+ DisablingConfigs.splitButton(sharedBackstage.providers.isDisabled),
+ receivingConfig(),
+ config('split-dropdown-events', [
+ run(focusButtonEvent, Focusing.focus),
+ onControlAttached(specialisation, editorOffCell),
+ onControlDetached(specialisation, editorOffCell)
+ ]),
+ Unselecting.config({})
+ ]),
+ eventOrder: (_d = {}, _d[attachedToDom()] = [
+ 'alloy.base.behaviour',
+ 'split-dropdown-events'
+ ], _d),
+ toggleClass: 'tox-tbtn--enabled',
+ lazySink: sharedBackstage.getSink,
+ fetch: fetchChoices(getApi, spec, sharedBackstage.providers),
+ parts: { menu: part(false, spec.columns, spec.presets) },
+ components: [
+ SplitDropdown.parts.button(renderCommonStructure(spec.icon, spec.text, Optional.none(), Optional.some(displayChannel), Optional.some([Toggling.config({
+ toggleClass: 'tox-tbtn--enabled',
+ toggleOnExecute: false
+ })]), sharedBackstage.providers)),
+ SplitDropdown.parts.arrow({
+ dom: {
+ tag: 'button',
+ classes: [
+ 'tox-tbtn',
+ 'tox-split-button__chevron'
+ ],
+ innerHtml: get$e('chevron-down', sharedBackstage.providers.icons)
+ },
+ buttonBehaviours: derive$1([
+ DisablingConfigs.splitButton(sharedBackstage.providers.isDisabled),
+ receivingConfig()
+ ])
+ }),
+ SplitDropdown.parts['aria-descriptor']({ text: sharedBackstage.providers.translate('To open the popup, press Shift+Enter') })
+ ]
+ });
+ };
+
+ var getFormApi = function (input) {
+ return {
+ hide: function () {
+ return emit(input, sandboxClose());
+ },
+ getValue: function () {
+ return Representing.getValue(input);
+ }
+ };
+ };
+ var runOnExecute$1 = function (memInput, original) {
+ return run(internalToolbarButtonExecute, function (comp, se) {
+ var input = memInput.get(comp);
+ var formApi = getFormApi(input);
+ original.onAction(formApi, se.event.buttonApi);
+ });
+ };
+ var renderContextButton = function (memInput, button, extras) {
+ var _a = button.original, primary = _a.primary, rest = __rest(_a, ['primary']);
+ var bridged = getOrDie(createToolbarButton(__assign(__assign({}, rest), {
+ type: 'button',
+ onAction: noop
+ })));
+ return renderToolbarButtonWith(bridged, extras.backstage.shared.providers, [runOnExecute$1(memInput, button)]);
+ };
+ var renderContextToggleButton = function (memInput, button, extras) {
+ var _a = button.original, primary = _a.primary, rest = __rest(_a, ['primary']);
+ var bridged = getOrDie(createToggleButton(__assign(__assign({}, rest), {
+ type: 'togglebutton',
+ onAction: noop
+ })));
+ return renderToolbarToggleButtonWith(bridged, extras.backstage.shared.providers, [runOnExecute$1(memInput, button)]);
+ };
+ var generateOne$1 = function (memInput, button, providersBackstage) {
+ var extras = { backstage: { shared: { providers: providersBackstage } } };
+ if (button.type === 'contextformtogglebutton') {
+ return renderContextToggleButton(memInput, button, extras);
+ } else {
+ return renderContextButton(memInput, button, extras);
+ }
+ };
+ var generate$7 = function (memInput, buttons, providersBackstage) {
+ var mementos = map(buttons, function (button) {
+ return record(generateOne$1(memInput, button, providersBackstage));
+ });
+ var asSpecs = function () {
+ return map(mementos, function (mem) {
+ return mem.asSpec();
+ });
+ };
+ var findPrimary = function (compInSystem) {
+ return findMap(buttons, function (button, i) {
+ if (button.primary) {
+ return Optional.from(mementos[i]).bind(function (mem) {
+ return mem.getOpt(compInSystem);
+ }).filter(not(Disabling.isDisabled));
+ } else {
+ return Optional.none();
+ }
+ });
+ };
+ return {
+ asSpecs: asSpecs,
+ findPrimary: findPrimary
+ };
+ };
+
+ var buildInitGroups = function (ctx, providers) {
+ var inputAttributes = ctx.label.fold(function () {
+ return {};
+ }, function (label) {
+ return { 'aria-label': label };
+ });
+ var memInput = record(Input.sketch({
+ inputClasses: [
+ 'tox-toolbar-textfield',
+ 'tox-toolbar-nav-js'
+ ],
+ data: ctx.initValue(),
+ inputAttributes: inputAttributes,
+ selectOnFocus: true,
+ inputBehaviours: derive$1([Keying.config({
+ mode: 'special',
+ onEnter: function (input) {
+ return commands.findPrimary(input).map(function (primary) {
+ emitExecute(primary);
+ return true;
+ });
+ },
+ onLeft: function (comp, se) {
+ se.cut();
+ return Optional.none();
+ },
+ onRight: function (comp, se) {
+ se.cut();
+ return Optional.none();
+ }
+ })])
+ }));
+ var commands = generate$7(memInput, ctx.commands, providers);
+ return [
+ {
+ title: Optional.none(),
+ items: [memInput.asSpec()]
+ },
+ {
+ title: Optional.none(),
+ items: commands.asSpecs()
+ }
+ ];
+ };
+ var renderContextForm = function (toolbarType, ctx, providers) {
+ return renderToolbar({
+ type: toolbarType,
+ uid: generate$1('context-toolbar'),
+ initGroups: buildInitGroups(ctx, providers),
+ onEscape: Optional.none,
+ cyclicKeying: true,
+ providers: providers
+ });
+ };
+ var ContextForm = {
+ renderContextForm: renderContextForm,
+ buildInitGroups: buildInitGroups
+ };
+
+ var getHorizontalBounds = function (contentAreaBox, viewportBounds) {
+ var x = Math.max(viewportBounds.x, contentAreaBox.x);
+ var contentBoxWidth = contentAreaBox.right - x;
+ var maxViewportWidth = viewportBounds.width - (x - viewportBounds.x);
+ var width = Math.min(contentBoxWidth, maxViewportWidth);
+ return {
+ x: x,
+ width: width
+ };
+ };
+ var getVerticalBounds = function (editor, contentAreaBox, viewportBounds, isToolbarLocationTop) {
+ var container = SugarElement.fromDom(editor.getContainer());
+ var header = descendant$1(container, '.tox-editor-header').getOr(container);
+ var headerBox = box(header);
+ var isToolbarBelowContentArea = headerBox.y >= contentAreaBox.bottom;
+ var isToolbarAbove = isToolbarLocationTop && !isToolbarBelowContentArea;
+ if (editor.inline && isToolbarAbove) {
+ return {
+ y: Math.max(headerBox.bottom, viewportBounds.y),
+ bottom: viewportBounds.bottom
+ };
+ }
+ if (editor.inline && !isToolbarAbove) {
+ return {
+ y: viewportBounds.y,
+ bottom: Math.min(headerBox.y, viewportBounds.bottom)
+ };
+ }
+ var containerBounds = box(container);
+ if (isToolbarAbove) {
+ return {
+ y: Math.max(headerBox.bottom, viewportBounds.y),
+ bottom: Math.min(containerBounds.bottom, viewportBounds.bottom)
+ };
+ }
+ return {
+ y: Math.max(containerBounds.y, viewportBounds.y),
+ bottom: Math.min(headerBox.y, viewportBounds.bottom)
+ };
+ };
+ var getContextToolbarBounds = function (editor, sharedBackstage) {
+ var viewportBounds = getBounds(window);
+ var contentAreaBox = box(SugarElement.fromDom(editor.getContentAreaContainer()));
+ var toolbarOrMenubarEnabled = isMenubarEnabled(editor) || isToolbarEnabled(editor) || isMultipleToolbars(editor);
+ var _a = getHorizontalBounds(contentAreaBox, viewportBounds), x = _a.x, width = _a.width;
+ if (editor.inline && !toolbarOrMenubarEnabled) {
+ return bounds$1(x, viewportBounds.y, width, viewportBounds.height);
+ } else {
+ var isToolbarTop = sharedBackstage.header.isPositionedAtTop();
+ var _b = getVerticalBounds(editor, contentAreaBox, viewportBounds, isToolbarTop), y = _b.y, bottom = _b.bottom;
+ return bounds$1(x, y, width, bottom - y);
+ }
+ };
+
+ var matchTargetWith = function (elem, candidates) {
+ var ctxs = filter(candidates, function (toolbarApi) {
+ return toolbarApi.predicate(elem.dom);
+ });
+ var _a = partition(ctxs, function (t) {
+ return t.type === 'contexttoolbar';
+ }), pass = _a.pass, fail = _a.fail;
+ return {
+ contextToolbars: pass,
+ contextForms: fail
+ };
+ };
+ var filterByPositionForStartNode = function (toolbars) {
+ if (toolbars.length <= 1) {
+ return toolbars;
+ } else {
+ var doesPositionExist = function (value) {
+ return exists(toolbars, function (t) {
+ return t.position === value;
+ });
+ };
+ var filterToolbarsByPosition = function (value) {
+ return filter(toolbars, function (t) {
+ return t.position === value;
+ });
+ };
+ var hasSelectionToolbars = doesPositionExist('selection');
+ var hasNodeToolbars = doesPositionExist('node');
+ if (hasSelectionToolbars || hasNodeToolbars) {
+ if (hasNodeToolbars && hasSelectionToolbars) {
+ var nodeToolbars = filterToolbarsByPosition('node');
+ var selectionToolbars = map(filterToolbarsByPosition('selection'), function (t) {
+ return __assign(__assign({}, t), { position: 'node' });
+ });
+ return nodeToolbars.concat(selectionToolbars);
+ } else {
+ return hasSelectionToolbars ? filterToolbarsByPosition('selection') : filterToolbarsByPosition('node');
+ }
+ } else {
+ return filterToolbarsByPosition('line');
+ }
+ }
+ };
+ var filterByPositionForAncestorNode = function (toolbars) {
+ if (toolbars.length <= 1) {
+ return toolbars;
+ } else {
+ var findPosition_1 = function (value) {
+ return find(toolbars, function (t) {
+ return t.position === value;
+ });
+ };
+ var basePosition = findPosition_1('selection').orThunk(function () {
+ return findPosition_1('node');
+ }).orThunk(function () {
+ return findPosition_1('line');
+ }).map(function (t) {
+ return t.position;
+ });
+ return basePosition.fold(function () {
+ return [];
+ }, function (pos) {
+ return filter(toolbars, function (t) {
+ return t.position === pos;
+ });
+ });
+ }
+ };
+ var matchStartNode = function (elem, nodeCandidates, editorCandidates) {
+ var nodeMatches = matchTargetWith(elem, nodeCandidates);
+ if (nodeMatches.contextForms.length > 0) {
+ return Optional.some({
+ elem: elem,
+ toolbars: [nodeMatches.contextForms[0]]
+ });
+ } else {
+ var editorMatches = matchTargetWith(elem, editorCandidates);
+ if (editorMatches.contextForms.length > 0) {
+ return Optional.some({
+ elem: elem,
+ toolbars: [editorMatches.contextForms[0]]
+ });
+ } else if (nodeMatches.contextToolbars.length > 0 || editorMatches.contextToolbars.length > 0) {
+ var toolbars = filterByPositionForStartNode(nodeMatches.contextToolbars.concat(editorMatches.contextToolbars));
+ return Optional.some({
+ elem: elem,
+ toolbars: toolbars
+ });
+ } else {
+ return Optional.none();
+ }
+ }
+ };
+ var matchAncestor = function (isRoot, startNode, scopes) {
+ if (isRoot(startNode)) {
+ return Optional.none();
+ } else {
+ return ancestor(startNode, function (ancestorElem) {
+ var _a = matchTargetWith(ancestorElem, scopes.inNodeScope), contextToolbars = _a.contextToolbars, contextForms = _a.contextForms;
+ var toolbars = contextForms.length > 0 ? contextForms : filterByPositionForAncestorNode(contextToolbars);
+ return toolbars.length > 0 ? Optional.some({
+ elem: ancestorElem,
+ toolbars: toolbars
+ }) : Optional.none();
+ }, isRoot);
+ }
+ };
+ var lookup$1 = function (scopes, editor) {
+ var rootElem = SugarElement.fromDom(editor.getBody());
+ var isRoot = function (elem) {
+ return eq$1(elem, rootElem);
+ };
+ var isOutsideRoot = function (startNode) {
+ return !isRoot(startNode) && !contains$2(rootElem, startNode);
+ };
+ var startNode = SugarElement.fromDom(editor.selection.getNode());
+ if (isOutsideRoot(startNode)) {
+ return Optional.none();
+ }
+ return matchStartNode(startNode, scopes.inNodeScope, scopes.inEditorScope).orThunk(function () {
+ return matchAncestor(isRoot, startNode, scopes);
+ });
+ };
+
+ var categorise = function (contextToolbars, navigate) {
+ var forms = {};
+ var inNodeScope = [];
+ var inEditorScope = [];
+ var formNavigators = {};
+ var lookupTable = {};
+ var registerForm = function (key, toolbarSpec) {
+ var contextForm = getOrDie(createContextForm(toolbarSpec));
+ forms[key] = contextForm;
+ contextForm.launch.map(function (launch) {
+ formNavigators['form:' + key + ''] = __assign(__assign({}, toolbarSpec.launch), {
+ type: launch.type === 'contextformtogglebutton' ? 'togglebutton' : 'button',
+ onAction: function () {
+ navigate(contextForm);
+ }
+ });
+ });
+ if (contextForm.scope === 'editor') {
+ inEditorScope.push(contextForm);
+ } else {
+ inNodeScope.push(contextForm);
+ }
+ lookupTable[key] = contextForm;
+ };
+ var registerToolbar = function (key, toolbarSpec) {
+ createContextToolbar(toolbarSpec).each(function (contextToolbar) {
+ if (toolbarSpec.scope === 'editor') {
+ inEditorScope.push(contextToolbar);
+ } else {
+ inNodeScope.push(contextToolbar);
+ }
+ lookupTable[key] = contextToolbar;
+ });
+ };
+ var keys$1 = keys(contextToolbars);
+ each(keys$1, function (key) {
+ var toolbarApi = contextToolbars[key];
+ if (toolbarApi.type === 'contextform') {
+ registerForm(key, toolbarApi);
+ } else if (toolbarApi.type === 'contexttoolbar') {
+ registerToolbar(key, toolbarApi);
+ }
+ });
+ return {
+ forms: forms,
+ inNodeScope: inNodeScope,
+ inEditorScope: inEditorScope,
+ lookupTable: lookupTable,
+ formNavigators: formNavigators
+ };
+ };
+
+ var forwardSlideEvent = generate$1('forward-slide');
+ var backSlideEvent = generate$1('backward-slide');
+ var changeSlideEvent = generate$1('change-slide-event');
+ var resizingClass = 'tox-pop--resizing';
+ var renderContextToolbar = function (spec) {
+ var stack = Cell([]);
+ return InlineView.sketch({
+ dom: {
+ tag: 'div',
+ classes: ['tox-pop']
+ },
+ fireDismissalEventInstead: { event: 'doNotDismissYet' },
+ onShow: function (comp) {
+ stack.set([]);
+ InlineView.getContent(comp).each(function (c) {
+ remove$6(c.element, 'visibility');
+ });
+ remove$4(comp.element, resizingClass);
+ remove$6(comp.element, 'width');
+ },
+ inlineBehaviours: derive$1([
+ config('context-toolbar-events', [
+ runOnSource(transitionend(), function (comp, _se) {
+ remove$4(comp.element, resizingClass);
+ remove$6(comp.element, 'width');
+ }),
+ run(changeSlideEvent, function (comp, se) {
+ var elem = comp.element;
+ remove$6(elem, 'width');
+ var currentWidth = get$8(elem);
+ InlineView.setContent(comp, se.event.contents);
+ add$2(elem, resizingClass);
+ var newWidth = get$8(elem);
+ set$2(elem, 'width', currentWidth + 'px');
+ InlineView.getContent(comp).each(function (newContents) {
+ se.event.focus.bind(function (f) {
+ focus$1(f);
+ return search(elem);
+ }).orThunk(function () {
+ Keying.focusIn(newContents);
+ return active(getRootNode(elem));
+ });
+ });
+ global$2.setTimeout(function () {
+ set$2(comp.element, 'width', newWidth + 'px');
+ }, 0);
+ }),
+ run(forwardSlideEvent, function (comp, se) {
+ InlineView.getContent(comp).each(function (oldContents) {
+ stack.set(stack.get().concat([{
+ bar: oldContents,
+ focus: active(getRootNode(comp.element))
+ }]));
+ });
+ emitWith(comp, changeSlideEvent, {
+ contents: se.event.forwardContents,
+ focus: Optional.none()
+ });
+ }),
+ run(backSlideEvent, function (comp, _se) {
+ last(stack.get()).each(function (last) {
+ stack.set(stack.get().slice(0, stack.get().length - 1));
+ emitWith(comp, changeSlideEvent, {
+ contents: premade$1(last.bar),
+ focus: last.focus
+ });
+ });
+ })
+ ]),
+ Keying.config({
+ mode: 'special',
+ onEscape: function (comp) {
+ return last(stack.get()).fold(function () {
+ return spec.onEscape();
+ }, function (_) {
+ emit(comp, backSlideEvent);
+ return Optional.some(true);
+ });
+ }
+ })
+ ]),
+ lazySink: function () {
+ return Result.value(spec.sink);
+ }
+ });
+ };
+
+ var generateSelectItems = function (_editor, backstage, spec) {
+ var generateItem = function (rawItem, response, disabled, value) {
+ var translatedText = backstage.shared.providers.translate(rawItem.title);
+ if (rawItem.type === 'separator') {
+ return Optional.some({
+ type: 'separator',
+ text: translatedText
+ });
+ } else if (rawItem.type === 'submenu') {
+ var items = bind(rawItem.getStyleItems(), function (si) {
+ return validate(si, response, value);
+ });
+ if (response === 0 && items.length <= 0) {
+ return Optional.none();
+ } else {
+ return Optional.some({
+ type: 'nestedmenuitem',
+ text: translatedText,
+ disabled: items.length <= 0,
+ getSubmenuItems: function () {
+ return bind(rawItem.getStyleItems(), function (si) {
+ return validate(si, response, value);
+ });
+ }
+ });
+ }
+ } else {
+ return Optional.some(__assign({
+ type: 'togglemenuitem',
+ text: translatedText,
+ icon: rawItem.icon,
+ active: rawItem.isSelected(value),
+ disabled: disabled,
+ onAction: spec.onAction(rawItem)
+ }, rawItem.getStylePreview().fold(function () {
+ return {};
+ }, function (preview) {
+ return { meta: { style: preview } };
+ })));
+ }
+ };
+ var validate = function (item, response, value) {
+ var invalid = item.type === 'formatter' && spec.isInvalid(item);
+ if (response === 0) {
+ return invalid ? [] : generateItem(item, response, false, value).toArray();
+ } else {
+ return generateItem(item, response, invalid, value).toArray();
+ }
+ };
+ var validateItems = function (preItems) {
+ var value = spec.getCurrentValue();
+ var response = spec.shouldHide ? 0 : 1;
+ return bind(preItems, function (item) {
+ return validate(item, response, value);
+ });
+ };
+ var getFetch = function (backstage, getStyleItems) {
+ return function (comp, callback) {
+ var preItems = getStyleItems();
+ var items = validateItems(preItems);
+ var menu = build$2(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, false);
+ callback(menu);
+ };
+ };
+ return {
+ validateItems: validateItems,
+ getFetch: getFetch
+ };
+ };
+ var createMenuItems = function (editor, backstage, spec) {
+ var dataset = spec.dataset;
+ var getStyleItems = dataset.type === 'basic' ? function () {
+ return map(dataset.data, function (d) {
+ return processBasic(d, spec.isSelectedFor, spec.getPreviewFor);
+ });
+ } : dataset.getData;
+ return {
+ items: generateSelectItems(editor, backstage, spec),
+ getStyleItems: getStyleItems
+ };
+ };
+ var createSelectButton = function (editor, backstage, spec) {
+ var _a = createMenuItems(editor, backstage, spec), items = _a.items, getStyleItems = _a.getStyleItems;
+ var getApi = function (comp) {
+ return {
+ getComponent: function () {
+ return comp;
+ }
+ };
+ };
+ var onSetup = function (api) {
+ spec.setInitialValue.each(function (f) {
+ return f(api.getComponent());
+ });
+ return spec.nodeChangeHandler.map(function (f) {
+ var handler = f(api.getComponent());
+ editor.on('NodeChange', handler);
+ return function () {
+ editor.off('NodeChange', handler);
+ };
+ }).getOr(noop);
+ };
+ return renderCommonDropdown({
+ text: spec.icon.isSome() ? Optional.none() : Optional.some(''),
+ icon: spec.icon,
+ tooltip: Optional.from(spec.tooltip),
+ role: Optional.none(),
+ fetch: items.getFetch(backstage, getStyleItems),
+ onSetup: onSetup,
+ getApi: getApi,
+ columns: 1,
+ presets: 'normal',
+ classes: spec.icon.isSome() ? [] : ['bespoke'],
+ dropdownBehaviours: []
+ }, 'tox-tbtn', backstage.shared);
+ };
+
+ var process = function (rawFormats) {
+ return map(rawFormats, function (item) {
+ var title = item, format = item;
+ var values = item.split('=');
+ if (values.length > 1) {
+ title = values[0];
+ format = values[1];
+ }
+ return {
+ title: title,
+ format: format
+ };
+ });
+ };
+ var buildBasicStaticDataset = function (data) {
+ return {
+ type: 'basic',
+ data: data
+ };
+ };
+ var Delimiter;
+ (function (Delimiter) {
+ Delimiter[Delimiter['SemiColon'] = 0] = 'SemiColon';
+ Delimiter[Delimiter['Space'] = 1] = 'Space';
+ }(Delimiter || (Delimiter = {})));
+ var split = function (rawFormats, delimiter) {
+ if (delimiter === Delimiter.SemiColon) {
+ return rawFormats.replace(/;$/, '').split(';');
+ } else {
+ return rawFormats.split(' ');
+ }
+ };
+ var buildBasicSettingsDataset = function (editor, settingName, defaults, delimiter) {
+ var rawFormats = editor.getParam(settingName, defaults, 'string');
+ var data = process(split(rawFormats, delimiter));
+ return {
+ type: 'basic',
+ data: data
+ };
+ };
+
+ var alignMenuItems = [
+ {
+ title: 'Left',
+ icon: 'align-left',
+ format: 'alignleft',
+ command: 'JustifyLeft'
+ },
+ {
+ title: 'Center',
+ icon: 'align-center',
+ format: 'aligncenter',
+ command: 'JustifyCenter'
+ },
+ {
+ title: 'Right',
+ icon: 'align-right',
+ format: 'alignright',
+ command: 'JustifyRight'
+ },
+ {
+ title: 'Justify',
+ icon: 'align-justify',
+ format: 'alignjustify',
+ command: 'JustifyFull'
+ }
+ ];
+ var getSpec = function (editor) {
+ var getMatchingValue = function () {
+ return find(alignMenuItems, function (item) {
+ return editor.formatter.match(item.format);
+ });
+ };
+ var isSelectedFor = function (format) {
+ return function () {
+ return editor.formatter.match(format);
+ };
+ };
+ var getPreviewFor = function (_format) {
+ return function () {
+ return Optional.none();
+ };
+ };
+ var updateSelectMenuIcon = function (comp) {
+ var match = getMatchingValue();
+ var alignment = match.fold(function () {
+ return 'left';
+ }, function (item) {
+ return item.title.toLowerCase();
+ });
+ emitWith(comp, updateMenuIcon, { icon: 'align-' + alignment });
+ };
+ var nodeChangeHandler = Optional.some(function (comp) {
+ return function () {
+ return updateSelectMenuIcon(comp);
+ };
+ });
+ var setInitialValue = Optional.some(function (comp) {
+ return updateSelectMenuIcon(comp);
+ });
+ var dataset = buildBasicStaticDataset(alignMenuItems);
+ var onAction = function (rawItem) {
+ return function () {
+ return find(alignMenuItems, function (item) {
+ return item.format === rawItem.format;
+ }).each(function (item) {
+ return editor.execCommand(item.command);
+ });
+ };
+ };
+ return {
+ tooltip: 'Align',
+ icon: Optional.some('align-left'),
+ isSelectedFor: isSelectedFor,
+ getCurrentValue: Optional.none,
+ getPreviewFor: getPreviewFor,
+ onAction: onAction,
+ setInitialValue: setInitialValue,
+ nodeChangeHandler: nodeChangeHandler,
+ dataset: dataset,
+ shouldHide: false,
+ isInvalid: function (item) {
+ return !editor.formatter.canApply(item.format);
+ }
+ };
+ };
+ var createAlignSelect = function (editor, backstage) {
+ return createSelectButton(editor, backstage, getSpec(editor));
+ };
+ var alignSelectMenu = function (editor, backstage) {
+ var menuItems = createMenuItems(editor, backstage, getSpec(editor));
+ editor.ui.registry.addNestedMenuItem('align', {
+ text: backstage.shared.providers.translate('Align'),
+ getSubmenuItems: function () {
+ return menuItems.items.validateItems(menuItems.getStyleItems());
+ }
+ });
+ };
+
+ var defaultFontsFormats = 'Andale Mono=andale mono,monospace;' + 'Arial=arial,helvetica,sans-serif;' + 'Arial Black=arial black,sans-serif;' + 'Book Antiqua=book antiqua,palatino,serif;' + 'Comic Sans MS=comic sans ms,sans-serif;' + 'Courier New=courier new,courier,monospace;' + 'Georgia=georgia,palatino,serif;' + 'Helvetica=helvetica,arial,sans-serif;' + 'Impact=impact,sans-serif;' + 'Symbol=symbol;' + 'Tahoma=tahoma,arial,helvetica,sans-serif;' + 'Terminal=terminal,monaco,monospace;' + 'Times New Roman=times new roman,times,serif;' + 'Trebuchet MS=trebuchet ms,geneva,sans-serif;' + 'Verdana=verdana,geneva,sans-serif;' + 'Webdings=webdings;' + 'Wingdings=wingdings,zapf dingbats';
+ var systemStackFonts = [
+ '-apple-system',
+ 'Segoe UI',
+ 'Roboto',
+ 'Helvetica Neue',
+ 'sans-serif'
+ ];
+ var splitFonts = function (fontFamily) {
+ var fonts = fontFamily.split(/\s*,\s*/);
+ return map(fonts, function (font) {
+ return font.replace(/^['"]+|['"]+$/g, '');
+ });
+ };
+ var isSystemFontStack = function (fontFamily) {
+ var matchesSystemStack = function () {
+ var fonts = splitFonts(fontFamily.toLowerCase());
+ return forall(systemStackFonts, function (font) {
+ return fonts.indexOf(font.toLowerCase()) > -1;
+ });
+ };
+ return fontFamily.indexOf('-apple-system') === 0 && matchesSystemStack();
+ };
+ var getSpec$1 = function (editor) {
+ var getMatchingValue = function () {
+ var getFirstFont = function (fontFamily) {
+ return fontFamily ? splitFonts(fontFamily)[0] : '';
+ };
+ var fontFamily = editor.queryCommandValue('FontName');
+ var items = dataset.data;
+ var font = fontFamily ? fontFamily.toLowerCase() : '';
+ var matchOpt = find(items, function (item) {
+ var format = item.format;
+ return format.toLowerCase() === font || getFirstFont(format).toLowerCase() === getFirstFont(font).toLowerCase();
+ }).orThunk(function () {
+ if (isSystemFontStack(font)) {
+ return Optional.from({
+ title: 'System Font',
+ format: font
+ });
+ } else {
+ return Optional.none();
+ }
+ });
+ return {
+ matchOpt: matchOpt,
+ font: fontFamily
+ };
+ };
+ var isSelectedFor = function (item) {
+ return function (valueOpt) {
+ return valueOpt.exists(function (value) {
+ return value.format === item;
+ });
+ };
+ };
+ var getCurrentValue = function () {
+ var matchOpt = getMatchingValue().matchOpt;
+ return matchOpt;
+ };
+ var getPreviewFor = function (item) {
+ return function () {
+ return Optional.some({
+ tag: 'div',
+ styles: item.indexOf('dings') === -1 ? { 'font-family': item } : {}
+ });
+ };
+ };
+ var onAction = function (rawItem) {
+ return function () {
+ editor.undoManager.transact(function () {
+ editor.focus();
+ editor.execCommand('FontName', false, rawItem.format);
+ });
+ };
+ };
+ var updateSelectMenuText = function (comp) {
+ var _a = getMatchingValue(), matchOpt = _a.matchOpt, font = _a.font;
+ var text = matchOpt.fold(function () {
+ return font;
+ }, function (item) {
+ return item.title;
+ });
+ emitWith(comp, updateMenuText, { text: text });
+ };
+ var nodeChangeHandler = Optional.some(function (comp) {
+ return function () {
+ return updateSelectMenuText(comp);
+ };
+ });
+ var setInitialValue = Optional.some(function (comp) {
+ return updateSelectMenuText(comp);
+ });
+ var dataset = buildBasicSettingsDataset(editor, 'font_formats', defaultFontsFormats, Delimiter.SemiColon);
+ return {
+ tooltip: 'Fonts',
+ icon: Optional.none(),
+ isSelectedFor: isSelectedFor,
+ getCurrentValue: getCurrentValue,
+ getPreviewFor: getPreviewFor,
+ onAction: onAction,
+ setInitialValue: setInitialValue,
+ nodeChangeHandler: nodeChangeHandler,
+ dataset: dataset,
+ shouldHide: false,
+ isInvalid: never
+ };
+ };
+ var createFontSelect = function (editor, backstage) {
+ return createSelectButton(editor, backstage, getSpec$1(editor));
+ };
+ var fontSelectMenu = function (editor, backstage) {
+ var menuItems = createMenuItems(editor, backstage, getSpec$1(editor));
+ editor.ui.registry.addNestedMenuItem('fontformats', {
+ text: backstage.shared.providers.translate('Fonts'),
+ getSubmenuItems: function () {
+ return menuItems.items.validateItems(menuItems.getStyleItems());
+ }
+ });
+ };
+
+ var defaultFontsizeFormats = '8pt 10pt 12pt 14pt 18pt 24pt 36pt';
+ var legacyFontSizes = {
+ '8pt': '1',
+ '10pt': '2',
+ '12pt': '3',
+ '14pt': '4',
+ '18pt': '5',
+ '24pt': '6',
+ '36pt': '7'
+ };
+ var keywordFontSizes = {
+ 'xx-small': '7pt',
+ 'x-small': '8pt',
+ 'small': '10pt',
+ 'medium': '12pt',
+ 'large': '14pt',
+ 'x-large': '18pt',
+ 'xx-large': '24pt'
+ };
+ var round$1 = function (number, precision) {
+ var factor = Math.pow(10, precision);
+ return Math.round(number * factor) / factor;
+ };
+ var toPt = function (fontSize, precision) {
+ if (/[0-9.]+px$/.test(fontSize)) {
+ return round$1(parseInt(fontSize, 10) * 72 / 96, precision || 0) + 'pt';
+ } else {
+ return get$1(keywordFontSizes, fontSize).getOr(fontSize);
+ }
+ };
+ var toLegacy = function (fontSize) {
+ return get$1(legacyFontSizes, fontSize).getOr('');
+ };
+ var getSpec$2 = function (editor) {
+ var getMatchingValue = function () {
+ var matchOpt = Optional.none();
+ var items = dataset.data;
+ var fontSize = editor.queryCommandValue('FontSize');
+ if (fontSize) {
+ var _loop_1 = function (precision) {
+ var pt = toPt(fontSize, precision);
+ var legacy = toLegacy(pt);
+ matchOpt = find(items, function (item) {
+ return item.format === fontSize || item.format === pt || item.format === legacy;
+ });
+ };
+ for (var precision = 3; matchOpt.isNone() && precision >= 0; precision--) {
+ _loop_1(precision);
+ }
+ }
+ return {
+ matchOpt: matchOpt,
+ size: fontSize
+ };
+ };
+ var isSelectedFor = function (item) {
+ return function (valueOpt) {
+ return valueOpt.exists(function (value) {
+ return value.format === item;
+ });
+ };
+ };
+ var getCurrentValue = function () {
+ var matchOpt = getMatchingValue().matchOpt;
+ return matchOpt;
+ };
+ var getPreviewFor = constant(Optional.none);
+ var onAction = function (rawItem) {
+ return function () {
+ editor.undoManager.transact(function () {
+ editor.focus();
+ editor.execCommand('FontSize', false, rawItem.format);
+ });
+ };
+ };
+ var updateSelectMenuText = function (comp) {
+ var _a = getMatchingValue(), matchOpt = _a.matchOpt, size = _a.size;
+ var text = matchOpt.fold(function () {
+ return size;
+ }, function (match) {
+ return match.title;
+ });
+ emitWith(comp, updateMenuText, { text: text });
+ };
+ var nodeChangeHandler = Optional.some(function (comp) {
+ return function () {
+ return updateSelectMenuText(comp);
+ };
+ });
+ var setInitialValue = Optional.some(function (comp) {
+ return updateSelectMenuText(comp);
+ });
+ var dataset = buildBasicSettingsDataset(editor, 'fontsize_formats', defaultFontsizeFormats, Delimiter.Space);
+ return {
+ tooltip: 'Font sizes',
+ icon: Optional.none(),
+ isSelectedFor: isSelectedFor,
+ getPreviewFor: getPreviewFor,
+ getCurrentValue: getCurrentValue,
+ onAction: onAction,
+ setInitialValue: setInitialValue,
+ nodeChangeHandler: nodeChangeHandler,
+ dataset: dataset,
+ shouldHide: false,
+ isInvalid: never
+ };
+ };
+ var createFontsizeSelect = function (editor, backstage) {
+ return createSelectButton(editor, backstage, getSpec$2(editor));
+ };
+ var fontsizeSelectMenu = function (editor, backstage) {
+ var menuItems = createMenuItems(editor, backstage, getSpec$2(editor));
+ editor.ui.registry.addNestedMenuItem('fontsizes', {
+ text: 'Font sizes',
+ getSubmenuItems: function () {
+ return menuItems.items.validateItems(menuItems.getStyleItems());
+ }
+ });
+ };
+
+ var findNearest = function (editor, getStyles) {
+ var styles = getStyles();
+ var formats = map(styles, function (style) {
+ return style.format;
+ });
+ return Optional.from(editor.formatter.closest(formats)).bind(function (fmt) {
+ return find(styles, function (data) {
+ return data.format === fmt;
+ });
+ }).orThunk(function () {
+ return someIf(editor.formatter.match('p'), {
+ title: 'Paragraph',
+ format: 'p'
+ });
+ });
+ };
+
+ var revocable = function (doRevoke) {
+ var subject = Cell(Optional.none());
+ var revoke = function () {
+ return subject.get().each(doRevoke);
+ };
+ var clear = function () {
+ revoke();
+ subject.set(Optional.none());
+ };
+ var isSet = function () {
+ return subject.get().isSome();
+ };
+ var set = function (s) {
+ revoke();
+ subject.set(Optional.some(s));
+ };
+ return {
+ clear: clear,
+ isSet: isSet,
+ set: set
+ };
+ };
+ var destroyable = function () {
+ return revocable(function (s) {
+ return s.destroy();
+ });
+ };
+ var unbindable = function () {
+ return revocable(function (s) {
+ return s.unbind();
+ });
+ };
+ var value$3 = function () {
+ var subject = Cell(Optional.none());
+ var clear = function () {
+ return subject.set(Optional.none());
+ };
+ var set = function (s) {
+ return subject.set(Optional.some(s));
+ };
+ var isSet = function () {
+ return subject.get().isSome();
+ };
+ var on = function (f) {
+ return subject.get().each(f);
+ };
+ return {
+ clear: clear,
+ set: set,
+ isSet: isSet,
+ on: on
+ };
+ };
+
+ var onSetupFormatToggle = function (editor, name) {
+ return function (api) {
+ var boundCallback = unbindable();
+ var init = function () {
+ api.setActive(editor.formatter.match(name));
+ var binding = editor.formatter.formatChanged(name, api.setActive);
+ boundCallback.set(binding);
+ };
+ editor.initialized ? init() : editor.on('init', init);
+ return boundCallback.clear;
+ };
+ };
+ var onActionToggleFormat = function (editor) {
+ return function (rawItem) {
+ return function () {
+ editor.undoManager.transact(function () {
+ editor.focus();
+ editor.execCommand('mceToggleFormat', false, rawItem.format);
+ });
+ };
+ };
+ };
+
+ var defaultBlocks = 'Paragraph=p;' + 'Heading 1=h1;' + 'Heading 2=h2;' + 'Heading 3=h3;' + 'Heading 4=h4;' + 'Heading 5=h5;' + 'Heading 6=h6;' + 'Preformatted=pre';
+ var getSpec$3 = function (editor) {
+ var isSelectedFor = function (format) {
+ return function () {
+ return editor.formatter.match(format);
+ };
+ };
+ var getPreviewFor = function (format) {
+ return function () {
+ var fmt = editor.formatter.get(format);
+ return Optional.some({
+ tag: fmt.length > 0 ? fmt[0].inline || fmt[0].block || 'div' : 'div',
+ styles: editor.dom.parseStyle(editor.formatter.getCssText(format))
+ });
+ };
+ };
+ var updateSelectMenuText = function (comp) {
+ var detectedFormat = findNearest(editor, function () {
+ return dataset.data;
+ });
+ var text = detectedFormat.fold(function () {
+ return 'Paragraph';
+ }, function (fmt) {
+ return fmt.title;
+ });
+ emitWith(comp, updateMenuText, { text: text });
+ };
+ var nodeChangeHandler = Optional.some(function (comp) {
+ return function () {
+ return updateSelectMenuText(comp);
+ };
+ });
+ var setInitialValue = Optional.some(function (comp) {
+ return updateSelectMenuText(comp);
+ });
+ var dataset = buildBasicSettingsDataset(editor, 'block_formats', defaultBlocks, Delimiter.SemiColon);
+ return {
+ tooltip: 'Blocks',
+ icon: Optional.none(),
+ isSelectedFor: isSelectedFor,
+ getCurrentValue: Optional.none,
+ getPreviewFor: getPreviewFor,
+ onAction: onActionToggleFormat(editor),
+ setInitialValue: setInitialValue,
+ nodeChangeHandler: nodeChangeHandler,
+ dataset: dataset,
+ shouldHide: false,
+ isInvalid: function (item) {
+ return !editor.formatter.canApply(item.format);
+ }
+ };
+ };
+ var createFormatSelect = function (editor, backstage) {
+ return createSelectButton(editor, backstage, getSpec$3(editor));
+ };
+ var formatSelectMenu = function (editor, backstage) {
+ var menuItems = createMenuItems(editor, backstage, getSpec$3(editor));
+ editor.ui.registry.addNestedMenuItem('blockformats', {
+ text: 'Blocks',
+ getSubmenuItems: function () {
+ return menuItems.items.validateItems(menuItems.getStyleItems());
+ }
+ });
+ };
+
+ var getSpec$4 = function (editor, dataset) {
+ var isSelectedFor = function (format) {
+ return function () {
+ return editor.formatter.match(format);
+ };
+ };
+ var getPreviewFor = function (format) {
+ return function () {
+ var fmt = editor.formatter.get(format);
+ return fmt !== undefined ? Optional.some({
+ tag: fmt.length > 0 ? fmt[0].inline || fmt[0].block || 'div' : 'div',
+ styles: editor.dom.parseStyle(editor.formatter.getCssText(format))
+ }) : Optional.none();
+ };
+ };
+ var updateSelectMenuText = function (comp) {
+ var getFormatItems = function (fmt) {
+ var subs = fmt.items;
+ return subs !== undefined && subs.length > 0 ? bind(subs, getFormatItems) : [{
+ title: fmt.title,
+ format: fmt.format
+ }];
+ };
+ var flattenedItems = bind(getStyleFormats(editor), getFormatItems);
+ var detectedFormat = findNearest(editor, function () {
+ return flattenedItems;
+ });
+ var text = detectedFormat.fold(function () {
+ return 'Paragraph';
+ }, function (fmt) {
+ return fmt.title;
+ });
+ emitWith(comp, updateMenuText, { text: text });
+ };
+ var nodeChangeHandler = Optional.some(function (comp) {
+ return function () {
+ return updateSelectMenuText(comp);
+ };
+ });
+ var setInitialValue = Optional.some(function (comp) {
+ return updateSelectMenuText(comp);
+ });
+ return {
+ tooltip: 'Formats',
+ icon: Optional.none(),
+ isSelectedFor: isSelectedFor,
+ getCurrentValue: Optional.none,
+ getPreviewFor: getPreviewFor,
+ onAction: onActionToggleFormat(editor),
+ setInitialValue: setInitialValue,
+ nodeChangeHandler: nodeChangeHandler,
+ shouldHide: editor.getParam('style_formats_autohide', false, 'boolean'),
+ isInvalid: function (item) {
+ return !editor.formatter.canApply(item.format);
+ },
+ dataset: dataset
+ };
+ };
+ var createStyleSelect = function (editor, backstage) {
+ var dataset = __assign({ type: 'advanced' }, backstage.styleselect);
+ return createSelectButton(editor, backstage, getSpec$4(editor, dataset));
+ };
+ var styleSelectMenu = function (editor, backstage) {
+ var dataset = __assign({ type: 'advanced' }, backstage.styleselect);
+ var menuItems = createMenuItems(editor, backstage, getSpec$4(editor, dataset));
+ editor.ui.registry.addNestedMenuItem('formats', {
+ text: 'Formats',
+ getSubmenuItems: function () {
+ return menuItems.items.validateItems(menuItems.getStyleItems());
+ }
+ });
+ };
+
+ var defaultToolbar = [
+ {
+ name: 'history',
+ items: [
+ 'undo',
+ 'redo'
+ ]
+ },
+ {
+ name: 'styles',
+ items: ['styleselect']
+ },
+ {
+ name: 'formatting',
+ items: [
+ 'bold',
+ 'italic'
+ ]
+ },
+ {
+ name: 'alignment',
+ items: [
+ 'alignleft',
+ 'aligncenter',
+ 'alignright',
+ 'alignjustify'
+ ]
+ },
+ {
+ name: 'indentation',
+ items: [
+ 'outdent',
+ 'indent'
+ ]
+ },
+ {
+ name: 'permanent pen',
+ items: ['permanentpen']
+ },
+ {
+ name: 'comments',
+ items: ['addcomment']
+ }
+ ];
+ var renderFromBridge = function (bridgeBuilder, render) {
+ return function (spec, extras, editor) {
+ var internal = bridgeBuilder(spec).mapError(function (errInfo) {
+ return formatError(errInfo);
+ }).getOrDie();
+ return render(internal, extras, editor);
+ };
+ };
+ var types = {
+ button: renderFromBridge(createToolbarButton, function (s, extras) {
+ return renderToolbarButton(s, extras.backstage.shared.providers);
+ }),
+ togglebutton: renderFromBridge(createToggleButton, function (s, extras) {
+ return renderToolbarToggleButton(s, extras.backstage.shared.providers);
+ }),
+ menubutton: renderFromBridge(createMenuButton, function (s, extras) {
+ return renderMenuButton(s, 'tox-tbtn', extras.backstage, Optional.none());
+ }),
+ splitbutton: renderFromBridge(createSplitButton, function (s, extras) {
+ return renderSplitButton(s, extras.backstage.shared);
+ }),
+ grouptoolbarbutton: renderFromBridge(createGroupToolbarButton, function (s, extras, editor) {
+ var _a;
+ var buttons = editor.ui.registry.getAll().buttons;
+ var identify = function (toolbar) {
+ return identifyButtons(editor, {
+ buttons: buttons,
+ toolbar: toolbar,
+ allowToolbarGroups: false
+ }, extras, Optional.none());
+ };
+ var attributes = (_a = {}, _a[Attribute] = extras.backstage.shared.header.isPositionedAtTop() ? AttributeValue.TopToBottom : AttributeValue.BottomToTop, _a);
+ switch (getToolbarMode(editor)) {
+ case ToolbarMode.floating:
+ return renderFloatingToolbarButton(s, extras.backstage, identify, attributes);
+ default:
+ throw new Error('Toolbar groups are only supported when using floating toolbar mode');
+ }
+ }),
+ styleSelectButton: function (editor, extras) {
+ return createStyleSelect(editor, extras.backstage);
+ },
+ fontsizeSelectButton: function (editor, extras) {
+ return createFontsizeSelect(editor, extras.backstage);
+ },
+ fontSelectButton: function (editor, extras) {
+ return createFontSelect(editor, extras.backstage);
+ },
+ formatButton: function (editor, extras) {
+ return createFormatSelect(editor, extras.backstage);
+ },
+ alignMenuButton: function (editor, extras) {
+ return createAlignSelect(editor, extras.backstage);
+ }
+ };
+ var extractFrom = function (spec, extras, editor) {
+ return get$1(types, spec.type).fold(function () {
+ console.error('skipping button defined by', spec);
+ return Optional.none();
+ }, function (render) {
+ return Optional.some(render(spec, extras, editor));
+ });
+ };
+ var bespokeButtons = {
+ styleselect: types.styleSelectButton,
+ fontsizeselect: types.fontsizeSelectButton,
+ fontselect: types.fontSelectButton,
+ formatselect: types.formatButton,
+ align: types.alignMenuButton
+ };
+ var removeUnusedDefaults = function (buttons) {
+ var filteredItemGroups = map(defaultToolbar, function (group) {
+ var items = filter(group.items, function (subItem) {
+ return has(buttons, subItem) || has(bespokeButtons, subItem);
+ });
+ return {
+ name: group.name,
+ items: items
+ };
+ });
+ return filter(filteredItemGroups, function (group) {
+ return group.items.length > 0;
+ });
+ };
+ var convertStringToolbar = function (strToolbar) {
+ var groupsStrings = strToolbar.split('|');
+ return map(groupsStrings, function (g) {
+ return { items: g.trim().split(' ') };
+ });
+ };
+ var isToolbarGroupSettingArray = function (toolbar) {
+ return isArrayOf(toolbar, function (t) {
+ return has(t, 'name') && has(t, 'items');
+ });
+ };
+ var createToolbar = function (toolbarConfig) {
+ var toolbar = toolbarConfig.toolbar;
+ var buttons = toolbarConfig.buttons;
+ if (toolbar === false) {
+ return [];
+ } else if (toolbar === undefined || toolbar === true) {
+ return removeUnusedDefaults(buttons);
+ } else if (isString(toolbar)) {
+ return convertStringToolbar(toolbar);
+ } else if (isToolbarGroupSettingArray(toolbar)) {
+ return toolbar;
+ } else {
+ console.error('Toolbar type should be string, string[], boolean or ToolbarGroup[]');
+ return [];
+ }
+ };
+ var lookupButton = function (editor, buttons, toolbarItem, allowToolbarGroups, extras, prefixes) {
+ return get$1(buttons, toolbarItem.toLowerCase()).orThunk(function () {
+ return prefixes.bind(function (ps) {
+ return findMap(ps, function (prefix) {
+ return get$1(buttons, prefix + toolbarItem.toLowerCase());
+ });
+ });
+ }).fold(function () {
+ return get$1(bespokeButtons, toolbarItem.toLowerCase()).map(function (r) {
+ return r(editor, extras);
+ }).orThunk(function () {
+ return Optional.none();
+ });
+ }, function (spec) {
+ if (spec.type === 'grouptoolbarbutton' && !allowToolbarGroups) {
+ console.warn('Ignoring the \'' + toolbarItem + '\' toolbar button. Group toolbar buttons are only supported when using floating toolbar mode and cannot be nested.');
+ return Optional.none();
+ } else {
+ return extractFrom(spec, extras, editor);
+ }
+ });
+ };
+ var identifyButtons = function (editor, toolbarConfig, extras, prefixes) {
+ var toolbarGroups = createToolbar(toolbarConfig);
+ var groups = map(toolbarGroups, function (group) {
+ var items = bind(group.items, function (toolbarItem) {
+ return toolbarItem.trim().length === 0 ? [] : lookupButton(editor, toolbarConfig.buttons, toolbarItem, toolbarConfig.allowToolbarGroups, extras, prefixes).toArray();
+ });
+ return {
+ title: Optional.from(editor.translate(group.name)),
+ items: items
+ };
+ });
+ return filter(groups, function (group) {
+ return group.items.length > 0;
+ });
+ };
+
+ var bubbleSize = 12;
+ var bubbleAlignments$1 = {
+ valignCentre: [],
+ alignCentre: [],
+ alignLeft: ['tox-pop--align-left'],
+ alignRight: ['tox-pop--align-right'],
+ right: ['tox-pop--right'],
+ left: ['tox-pop--left'],
+ bottom: ['tox-pop--bottom'],
+ top: ['tox-pop--top']
+ };
+ var anchorOverrides = {
+ maxHeightFunction: expandable(),
+ maxWidthFunction: expandable$1()
+ };
+ var desktopAnchorSpecLayouts = {
+ onLtr: function () {
+ return [
+ north$1,
+ south$1,
+ northeast$1,
+ southeast$1,
+ northwest$1,
+ southwest$1,
+ north$3,
+ south$3,
+ northeast$3,
+ southeast$3,
+ northwest$3,
+ southwest$3
+ ];
+ },
+ onRtl: function () {
+ return [
+ north$1,
+ south$1,
+ northwest$1,
+ southwest$1,
+ northeast$1,
+ southeast$1,
+ north$3,
+ south$3,
+ northwest$3,
+ southwest$3,
+ northeast$3,
+ southeast$3
+ ];
+ }
+ };
+ var mobileAnchorSpecLayouts = {
+ onLtr: function () {
+ return [
+ south$1,
+ southeast$1,
+ southwest$1,
+ northeast$1,
+ northwest$1,
+ north$1,
+ north$3,
+ south$3,
+ northeast$3,
+ southeast$3,
+ northwest$3,
+ southwest$3
+ ];
+ },
+ onRtl: function () {
+ return [
+ south$1,
+ southwest$1,
+ southeast$1,
+ northwest$1,
+ northeast$1,
+ north$1,
+ north$3,
+ south$3,
+ northwest$3,
+ southwest$3,
+ northeast$3,
+ southeast$3
+ ];
+ }
+ };
+ var getAnchorLayout = function (position, isTouch) {
+ if (position === 'line') {
+ return {
+ bubble: nu$8(bubbleSize, 0, bubbleAlignments$1),
+ layouts: {
+ onLtr: function () {
+ return [east$1];
+ },
+ onRtl: function () {
+ return [west$1];
+ }
+ },
+ overrides: anchorOverrides
+ };
+ } else {
+ return {
+ bubble: nu$8(0, bubbleSize, bubbleAlignments$1),
+ layouts: isTouch ? mobileAnchorSpecLayouts : desktopAnchorSpecLayouts,
+ overrides: anchorOverrides
+ };
+ }
+ };
+ var register$4 = function (editor, registryContextToolbars, sink, extras) {
+ var isTouch = detect$3().deviceType.isTouch;
+ var contextbar = build$1(renderContextToolbar({
+ sink: sink,
+ onEscape: function () {
+ editor.focus();
+ return Optional.some(true);
+ }
+ }));
+ var getBounds = function () {
+ return getContextToolbarBounds(editor, extras.backstage.shared);
+ };
+ var isRangeOverlapping = function (aTop, aBottom, bTop, bBottom) {
+ return Math.max(aTop, bTop) <= Math.min(aBottom, bBottom);
+ };
+ var getLastElementVerticalBound = function () {
+ var nodeBounds = lastElement.get().filter(function (ele) {
+ return inBody(SugarElement.fromDom(ele));
+ }).map(function (ele) {
+ return ele.getBoundingClientRect();
+ }).getOrThunk(function () {
+ return editor.selection.getRng().getBoundingClientRect();
+ });
+ var diffTop = editor.inline ? get$9().top : absolute$1(SugarElement.fromDom(editor.getBody())).y;
+ return {
+ y: nodeBounds.top + diffTop,
+ bottom: nodeBounds.bottom + diffTop
+ };
+ };
+ var shouldContextToolbarHide = function () {
+ if (isTouch() && extras.backstage.isContextMenuOpen()) {
+ return true;
+ }
+ var lastElementBounds = getLastElementVerticalBound();
+ var contextToolbarBounds = getBounds();
+ return !isRangeOverlapping(lastElementBounds.y, lastElementBounds.bottom, contextToolbarBounds.y, contextToolbarBounds.bottom);
+ };
+ var close = function () {
+ lastAnchor.set(Optional.none());
+ InlineView.hide(contextbar);
+ };
+ var forceHide = function () {
+ InlineView.hide(contextbar);
+ };
+ var hideOrRepositionIfNecessary = function () {
+ lastAnchor.get().each(function (anchor) {
+ var contextBarEle = contextbar.element;
+ remove$6(contextBarEle, 'display');
+ if (shouldContextToolbarHide()) {
+ set$2(contextBarEle, 'display', 'none');
+ } else {
+ Positioning.positionWithinBounds(sink, anchor, contextbar, Optional.some(getBounds()));
+ }
+ });
+ };
+ var lastAnchor = Cell(Optional.none());
+ var lastElement = Cell(Optional.none());
+ var timer = Cell(null);
+ var wrapInPopDialog = function (toolbarSpec) {
+ return {
+ dom: {
+ tag: 'div',
+ classes: ['tox-pop__dialog']
+ },
+ components: [toolbarSpec],
+ behaviours: derive$1([
+ Keying.config({ mode: 'acyclic' }),
+ config('pop-dialog-wrap-events', [
+ runOnAttached(function (comp) {
+ editor.shortcuts.add('ctrl+F9', 'focus statusbar', function () {
+ return Keying.focusIn(comp);
+ });
+ }),
+ runOnDetached(function (_comp) {
+ editor.shortcuts.remove('ctrl+F9');
+ })
+ ])
+ ])
+ };
+ };
+ var getScopes = cached(function () {
+ return categorise(registryContextToolbars, function (toolbarApi) {
+ var alloySpec = buildToolbar([toolbarApi]);
+ emitWith(contextbar, forwardSlideEvent, { forwardContents: wrapInPopDialog(alloySpec) });
+ });
+ });
+ var buildContextToolbarGroups = function (allButtons, ctx) {
+ return identifyButtons(editor, {
+ buttons: allButtons,
+ toolbar: ctx.items,
+ allowToolbarGroups: false
+ }, extras, Optional.some(['form:']));
+ };
+ var buildContextMenuGroups = function (ctx, providers) {
+ return ContextForm.buildInitGroups(ctx, providers);
+ };
+ var buildToolbar = function (toolbars) {
+ var buttons = editor.ui.registry.getAll().buttons;
+ var scopes = getScopes();
+ var allButtons = __assign(__assign({}, buttons), scopes.formNavigators);
+ var toolbarType = getToolbarMode(editor) === ToolbarMode.scrolling ? ToolbarMode.scrolling : ToolbarMode.default;
+ var initGroups = flatten(map(toolbars, function (ctx) {
+ return ctx.type === 'contexttoolbar' ? buildContextToolbarGroups(allButtons, ctx) : buildContextMenuGroups(ctx, extras.backstage.shared.providers);
+ }));
+ return renderToolbar({
+ type: toolbarType,
+ uid: generate$1('context-toolbar'),
+ initGroups: initGroups,
+ onEscape: Optional.none,
+ cyclicKeying: true,
+ providers: extras.backstage.shared.providers
+ });
+ };
+ editor.on(showContextToolbarEvent, function (e) {
+ var scopes = getScopes();
+ get$1(scopes.lookupTable, e.toolbarKey).each(function (ctx) {
+ launchContext([ctx], e.target === editor ? Optional.none() : Optional.some(e));
+ InlineView.getContent(contextbar).each(Keying.focusIn);
+ });
+ });
+ var getAnchor = function (position, element) {
+ var anchorage = position === 'node' ? extras.backstage.shared.anchors.node(element) : extras.backstage.shared.anchors.cursor();
+ return deepMerge(anchorage, getAnchorLayout(position, isTouch()));
+ };
+ var launchContext = function (toolbarApi, elem) {
+ clearTimer();
+ if (isTouch() && extras.backstage.isContextMenuOpen()) {
+ return;
+ }
+ var toolbarSpec = buildToolbar(toolbarApi);
+ var sElem = elem.map(SugarElement.fromDom);
+ var anchor = getAnchor(toolbarApi[0].position, sElem);
+ lastAnchor.set(Optional.some(anchor));
+ lastElement.set(elem);
+ var contextBarEle = contextbar.element;
+ remove$6(contextBarEle, 'display');
+ InlineView.showWithinBounds(contextbar, anchor, wrapInPopDialog(toolbarSpec), function () {
+ return Optional.some(getBounds());
+ });
+ if (shouldContextToolbarHide()) {
+ set$2(contextBarEle, 'display', 'none');
+ }
+ };
+ var launchContextToolbar = function () {
+ if (!editor.hasFocus()) {
+ return;
+ }
+ var scopes = getScopes();
+ lookup$1(scopes, editor).fold(close, function (info) {
+ launchContext(info.toolbars, Optional.some(info.elem.dom));
+ });
+ };
+ var clearTimer = function () {
+ var current = timer.get();
+ if (current !== null) {
+ global$2.clearTimeout(current);
+ timer.set(null);
+ }
+ };
+ var asyncOpen = function () {
+ clearTimer();
+ timer.set(global$2.setEditorTimeout(editor, launchContextToolbar, 0));
+ };
+ editor.on('init', function () {
+ editor.on(hideContextToolbarEvent, forceHide);
+ editor.on('ScrollContent ScrollWindow longpress', hideOrRepositionIfNecessary);
+ editor.on('click keyup focus SetContent ObjectResized ResizeEditor', function () {
+ asyncOpen();
+ });
+ editor.on('focusout', function (_e) {
+ global$2.setEditorTimeout(editor, function () {
+ if (search(sink.element).isNone() && search(contextbar.element).isNone()) {
+ close();
+ }
+ }, 0);
+ });
+ editor.on('SwitchMode', function () {
+ if (editor.mode.isReadOnly()) {
+ close();
+ }
+ });
+ editor.on('AfterProgressState', function (event) {
+ if (event.state) {
+ close();
+ } else if (editor.hasFocus()) {
+ asyncOpen();
+ }
+ });
+ editor.on('NodeChange', function (_e) {
+ search(contextbar.element).fold(asyncOpen, noop);
+ });
+ });
+ };
+
+ var setup$3 = function (editor, mothership, uiMothership) {
+ var broadcastEvent = function (name, evt) {
+ each([
+ mothership,
+ uiMothership
+ ], function (ship) {
+ ship.broadcastEvent(name, evt);
+ });
+ };
+ var broadcastOn = function (channel, message) {
+ each([
+ mothership,
+ uiMothership
+ ], function (ship) {
+ ship.broadcastOn([channel], message);
+ });
+ };
+ var fireDismissPopups = function (evt) {
+ return broadcastOn(dismissPopups(), { target: evt.target });
+ };
+ var onTouchstart = bind$3(SugarElement.fromDom(document), 'touchstart', fireDismissPopups);
+ var onTouchmove = bind$3(SugarElement.fromDom(document), 'touchmove', function (evt) {
+ return broadcastEvent(documentTouchmove(), evt);
+ });
+ var onTouchend = bind$3(SugarElement.fromDom(document), 'touchend', function (evt) {
+ return broadcastEvent(documentTouchend(), evt);
+ });
+ var onMousedown = bind$3(SugarElement.fromDom(document), 'mousedown', fireDismissPopups);
+ var onMouseup = bind$3(SugarElement.fromDom(document), 'mouseup', function (evt) {
+ if (evt.raw.button === 0) {
+ broadcastOn(mouseReleased(), { target: evt.target });
+ }
+ });
+ var onContentClick = function (raw) {
+ return broadcastOn(dismissPopups(), { target: SugarElement.fromDom(raw.target) });
+ };
+ var onContentMouseup = function (raw) {
+ if (raw.button === 0) {
+ broadcastOn(mouseReleased(), { target: SugarElement.fromDom(raw.target) });
+ }
+ };
+ var onWindowScroll = function (evt) {
+ return broadcastEvent(windowScroll(), fromRawEvent$1(evt));
+ };
+ var onWindowResize = function (evt) {
+ broadcastOn(repositionPopups(), {});
+ broadcastEvent(windowResize(), fromRawEvent$1(evt));
+ };
+ var onEditorResize = function () {
+ return broadcastOn(repositionPopups(), {});
+ };
+ var onEditorProgress = function (evt) {
+ if (evt.state) {
+ broadcastOn(dismissPopups(), { target: SugarElement.fromDom(editor.getContainer()) });
+ }
+ };
+ editor.on('PostRender', function () {
+ editor.on('click', onContentClick);
+ editor.on('tap', onContentClick);
+ editor.on('mouseup', onContentMouseup);
+ editor.on('ScrollWindow', onWindowScroll);
+ editor.on('ResizeWindow', onWindowResize);
+ editor.on('ResizeEditor', onEditorResize);
+ editor.on('AfterProgressState', onEditorProgress);
+ });
+ editor.on('remove', function () {
+ editor.off('click', onContentClick);
+ editor.off('tap', onContentClick);
+ editor.off('mouseup', onContentMouseup);
+ editor.off('ScrollWindow', onWindowScroll);
+ editor.off('ResizeWindow', onWindowResize);
+ editor.off('ResizeEditor', onEditorResize);
+ editor.off('AfterProgressState', onEditorProgress);
+ onMousedown.unbind();
+ onTouchstart.unbind();
+ onTouchmove.unbind();
+ onTouchend.unbind();
+ onMouseup.unbind();
+ });
+ editor.on('detach', function () {
+ detachSystem(mothership);
+ detachSystem(uiMothership);
+ mothership.destroy();
+ uiMothership.destroy();
+ });
+ };
+
+ var parts$d = AlloyParts;
+ var partType$1 = PartType;
+
+ var schema$r = constant([
+ defaulted$1('shell', false),
+ strict$1('makeItem'),
+ defaulted$1('setupItem', noop),
+ SketchBehaviours.field('listBehaviours', [Replacing])
+ ]);
+ var customListDetail = function () {
+ return { behaviours: derive$1([Replacing.config({})]) };
+ };
+ var itemsPart = optional({
+ name: 'items',
+ overrides: customListDetail
+ });
+ var parts$e = constant([itemsPart]);
+ var name$2 = constant('CustomList');
+
+ var factory$f = function (detail, components, _spec, _external) {
+ var setItems = function (list, items) {
+ getListContainer(list).fold(function () {
+ console.error('Custom List was defined to not be a shell, but no item container was specified in components');
+ throw new Error('Custom List was defined to not be a shell, but no item container was specified in components');
+ }, function (container) {
+ var itemComps = Replacing.contents(container);
+ var numListsRequired = items.length;
+ var numListsToAdd = numListsRequired - itemComps.length;
+ var itemsToAdd = numListsToAdd > 0 ? range(numListsToAdd, function () {
+ return detail.makeItem();
+ }) : [];
+ var itemsToRemove = itemComps.slice(numListsRequired);
+ each(itemsToRemove, function (item) {
+ return Replacing.remove(container, item);
+ });
+ each(itemsToAdd, function (item) {
+ return Replacing.append(container, item);
+ });
+ var builtLists = Replacing.contents(container);
+ each(builtLists, function (item, i) {
+ detail.setupItem(list, item, items[i], i);
+ });
+ });
+ };
+ var extra = detail.shell ? {
+ behaviours: [Replacing.config({})],
+ components: []
+ } : {
+ behaviours: [],
+ components: components
+ };
+ var getListContainer = function (component) {
+ return detail.shell ? Optional.some(component) : getPart(component, detail, 'items');
+ };
+ return {
+ uid: detail.uid,
+ dom: detail.dom,
+ components: extra.components,
+ behaviours: augment(detail.listBehaviours, extra.behaviours),
+ apis: { setItems: setItems }
+ };
+ };
+ var CustomList = composite$1({
+ name: name$2(),
+ configFields: schema$r(),
+ partFields: parts$e(),
+ factory: factory$f,
+ apis: {
+ setItems: function (apis, list, items) {
+ apis.setItems(list, items);
+ }
+ }
+ });
+
+ var setup$4 = noop;
+ var isDocked = never;
+ var getBehaviours$2 = constant([]);
+
+ var StaticHeader = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ setup: setup$4,
+ isDocked: isDocked,
+ getBehaviours: getBehaviours$2
+ });
+
+ var getOffsetParent = function (element) {
+ var isFixed = getRaw(element, 'position').is('fixed');
+ var offsetParent$1 = isFixed ? Optional.none() : offsetParent(element);
+ return offsetParent$1.orThunk(function () {
+ var marker = SugarElement.fromTag('span');
+ return parent(element).bind(function (parent) {
+ append(parent, marker);
+ var offsetParent$1 = offsetParent(marker);
+ remove(marker);
+ return offsetParent$1;
+ });
+ });
+ };
+ var getOrigin = function (element) {
+ return getOffsetParent(element).map(absolute).getOrThunk(function () {
+ return SugarPosition(0, 0);
+ });
+ };
+
+ var morphAdt = Adt.generate([
+ { static: [] },
+ { absolute: ['positionCss'] },
+ { fixed: ['positionCss'] }
+ ]);
+ var appear = function (component, contextualInfo) {
+ var elem = component.element;
+ add$2(elem, contextualInfo.transitionClass);
+ remove$4(elem, contextualInfo.fadeOutClass);
+ add$2(elem, contextualInfo.fadeInClass);
+ contextualInfo.onShow(component);
+ };
+ var disappear = function (component, contextualInfo) {
+ var elem = component.element;
+ add$2(elem, contextualInfo.transitionClass);
+ remove$4(elem, contextualInfo.fadeInClass);
+ add$2(elem, contextualInfo.fadeOutClass);
+ contextualInfo.onHide(component);
+ };
+ var isPartiallyVisible = function (box, viewport) {
+ return box.y < viewport.bottom && box.bottom > viewport.y;
+ };
+ var isTopCompletelyVisible = function (box, viewport) {
+ return box.y >= viewport.y;
+ };
+ var isBottomCompletelyVisible = function (box, viewport) {
+ return box.bottom <= viewport.bottom;
+ };
+ var isVisibleForModes = function (modes, box, viewport) {
+ return forall(modes, function (mode) {
+ switch (mode) {
+ case 'bottom':
+ return isBottomCompletelyVisible(box, viewport);
+ case 'top':
+ return isTopCompletelyVisible(box, viewport);
+ }
+ });
+ };
+ var getPrior = function (elem, state) {
+ return state.getInitialPosition().map(function (pos) {
+ return bounds$1(pos.bounds.x, pos.bounds.y, get$8(elem), get$7(elem));
+ });
+ };
+ var storePrior = function (elem, box, state) {
+ state.setInitialPosition(Optional.some({
+ style: getAllRaw(elem),
+ position: get$5(elem, 'position') || 'static',
+ bounds: box
+ }));
+ };
+ var revertToOriginal = function (elem, box$1, state) {
+ return state.getInitialPosition().bind(function (position) {
+ state.setInitialPosition(Optional.none());
+ switch (position.position) {
+ case 'static':
+ return Optional.some(morphAdt.static());
+ case 'absolute':
+ var offsetBox_1 = getOffsetParent(elem).map(box).getOrThunk(function () {
+ return box(body());
+ });
+ return Optional.some(morphAdt.absolute(NuPositionCss('absolute', get$1(position.style, 'left').map(function (_left) {
+ return box$1.x - offsetBox_1.x;
+ }), get$1(position.style, 'top').map(function (_top) {
+ return box$1.y - offsetBox_1.y;
+ }), get$1(position.style, 'right').map(function (_right) {
+ return offsetBox_1.right - box$1.right;
+ }), get$1(position.style, 'bottom').map(function (_bottom) {
+ return offsetBox_1.bottom - box$1.bottom;
+ }))));
+ default:
+ return Optional.none();
+ }
+ });
+ };
+ var morphToOriginal = function (elem, viewport, state) {
+ return getPrior(elem, state).filter(function (box) {
+ return isVisibleForModes(state.getModes(), box, viewport);
+ }).bind(function (box) {
+ return revertToOriginal(elem, box, state);
+ });
+ };
+ var morphToFixed = function (elem, viewport, state) {
+ var box$1 = box(elem);
+ if (!isVisibleForModes(state.getModes(), box$1, viewport)) {
+ storePrior(elem, box$1, state);
+ var winBox = win();
+ var left = box$1.x - winBox.x;
+ var top_1 = viewport.y - winBox.y;
+ var bottom = winBox.bottom - viewport.bottom;
+ var isTop = box$1.y <= viewport.y;
+ return Optional.some(morphAdt.fixed(NuPositionCss('fixed', Optional.some(left), isTop ? Optional.some(top_1) : Optional.none(), Optional.none(), !isTop ? Optional.some(bottom) : Optional.none())));
+ } else {
+ return Optional.none();
+ }
+ };
+ var getMorph = function (component, viewport, state) {
+ var elem = component.element;
+ var isDocked = getRaw(elem, 'position').is('fixed');
+ return isDocked ? morphToOriginal(elem, viewport, state) : morphToFixed(elem, viewport, state);
+ };
+ var getMorphToOriginal = function (component, state) {
+ var elem = component.element;
+ return getPrior(elem, state).bind(function (box) {
+ return revertToOriginal(elem, box, state);
+ });
+ };
+
+ var morphToStatic = function (component, config) {
+ each([
+ 'left',
+ 'right',
+ 'top',
+ 'bottom',
+ 'position'
+ ], function (prop) {
+ return remove$6(component.element, prop);
+ });
+ config.onUndocked(component);
+ };
+ var morphToCoord = function (component, config, position) {
+ applyPositionCss(component.element, position);
+ var method = position.position === 'fixed' ? config.onDocked : config.onUndocked;
+ method(component);
+ };
+ var updateVisibility = function (component, config, state, viewport, morphToDocked) {
+ if (morphToDocked === void 0) {
+ morphToDocked = false;
+ }
+ config.contextual.each(function (contextInfo) {
+ contextInfo.lazyContext(component).each(function (box) {
+ var isVisible = isPartiallyVisible(box, viewport);
+ if (isVisible !== state.isVisible()) {
+ state.setVisible(isVisible);
+ if (morphToDocked && !isVisible) {
+ add$3(component.element, [contextInfo.fadeOutClass]);
+ contextInfo.onHide(component);
+ } else {
+ var method = isVisible ? appear : disappear;
+ method(component, contextInfo);
+ }
+ }
+ });
+ });
+ };
+ var refreshInternal = function (component, config, state) {
+ var viewport = config.lazyViewport(component);
+ var isDocked = state.isDocked();
+ if (isDocked) {
+ updateVisibility(component, config, state, viewport);
+ }
+ getMorph(component, viewport, state).each(function (morph) {
+ state.setDocked(!isDocked);
+ morph.fold(function () {
+ return morphToStatic(component, config);
+ }, function (position) {
+ return morphToCoord(component, config, position);
+ }, function (position) {
+ updateVisibility(component, config, state, viewport, true);
+ morphToCoord(component, config, position);
+ });
+ });
+ };
+ var resetInternal = function (component, config, state) {
+ var elem = component.element;
+ state.setDocked(false);
+ getMorphToOriginal(component, state).each(function (morph) {
+ morph.fold(function () {
+ return morphToStatic(component, config);
+ }, function (position) {
+ return morphToCoord(component, config, position);
+ }, noop);
+ });
+ state.setVisible(true);
+ config.contextual.each(function (contextInfo) {
+ remove$5(elem, [
+ contextInfo.fadeInClass,
+ contextInfo.fadeOutClass,
+ contextInfo.transitionClass
+ ]);
+ contextInfo.onShow(component);
+ });
+ refresh$4(component, config, state);
+ };
+ var refresh$4 = function (component, config, state) {
+ if (component.getSystem().isConnected()) {
+ refreshInternal(component, config, state);
+ }
+ };
+ var reset = function (component, config, state) {
+ if (state.isDocked()) {
+ resetInternal(component, config, state);
+ }
+ };
+ var isDocked$1 = function (component, config, state) {
+ return state.isDocked();
+ };
+ var setModes = function (component, config, state, modes) {
+ return state.setModes(modes);
+ };
+ var getModes = function (component, config, state) {
+ return state.getModes();
+ };
+
+ var DockingApis = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ refresh: refresh$4,
+ reset: reset,
+ isDocked: isDocked$1,
+ getModes: getModes,
+ setModes: setModes
+ });
+
+ var events$f = function (dockInfo, dockState) {
+ return derive([
+ runOnSource(transitionend(), function (component, simulatedEvent) {
+ dockInfo.contextual.each(function (contextInfo) {
+ if (has$2(component.element, contextInfo.transitionClass)) {
+ remove$5(component.element, [
+ contextInfo.transitionClass,
+ contextInfo.fadeInClass
+ ]);
+ var notify = dockState.isVisible() ? contextInfo.onShown : contextInfo.onHidden;
+ notify(component);
+ }
+ simulatedEvent.stop();
+ });
+ }),
+ run(windowScroll(), function (component, _) {
+ refresh$4(component, dockInfo, dockState);
+ }),
+ run(windowResize(), function (component, _) {
+ reset(component, dockInfo, dockState);
+ })
+ ]);
+ };
+
+ var ActiveDocking = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ events: events$f
+ });
+
+ var DockingSchema = [
+ optionObjOf('contextual', [
+ strictString('fadeInClass'),
+ strictString('fadeOutClass'),
+ strictString('transitionClass'),
+ strictFunction('lazyContext'),
+ onHandler('onShow'),
+ onHandler('onShown'),
+ onHandler('onHide'),
+ onHandler('onHidden')
+ ]),
+ defaultedFunction('lazyViewport', win),
+ defaultedArrayOf('modes', [
+ 'top',
+ 'bottom'
+ ], string),
+ onHandler('onDocked'),
+ onHandler('onUndocked')
+ ];
+
+ var init$b = function (spec) {
+ var docked = Cell(false);
+ var visible = Cell(true);
+ var initialBounds = Cell(Optional.none());
+ var modes = Cell(spec.modes);
+ var readState = function () {
+ return 'docked: ' + docked.get() + ', visible: ' + visible.get() + ', modes: ' + modes.get().join(',');
+ };
+ return nu$5({
+ isDocked: docked.get,
+ setDocked: docked.set,
+ getInitialPosition: initialBounds.get,
+ setInitialPosition: initialBounds.set,
+ isVisible: visible.get,
+ setVisible: visible.set,
+ getModes: modes.get,
+ setModes: modes.set,
+ readState: readState
+ });
+ };
+
+ var DockingState = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ init: init$b
+ });
+
+ var Docking = create$1({
+ fields: DockingSchema,
+ name: 'docking',
+ active: ActiveDocking,
+ apis: DockingApis,
+ state: DockingState
+ });
+
+ var visibility = {
+ fadeInClass: 'tox-editor-dock-fadein',
+ fadeOutClass: 'tox-editor-dock-fadeout',
+ transitionClass: 'tox-editor-dock-transition'
+ };
+ var editorStickyOnClass = 'tox-tinymce--toolbar-sticky-on';
+ var editorStickyOffClass = 'tox-tinymce--toolbar-sticky-off';
+ var scrollFromBehindHeader = function (e, containerHeader) {
+ var doc = owner(containerHeader);
+ var viewHeight = doc.dom.defaultView.innerHeight;
+ var scrollPos = get$9(doc);
+ var markerElement = SugarElement.fromDom(e.elm);
+ var markerPos = absolute$1(markerElement);
+ var markerHeight = get$7(markerElement);
+ var markerTop = markerPos.y;
+ var markerBottom = markerTop + markerHeight;
+ var editorHeaderPos = absolute(containerHeader);
+ var editorHeaderHeight = get$7(containerHeader);
+ var editorHeaderTop = editorHeaderPos.top;
+ var editorHeaderBottom = editorHeaderTop + editorHeaderHeight;
+ var editorHeaderDockedAtTop = Math.abs(editorHeaderTop - scrollPos.top) < 2;
+ var editorHeaderDockedAtBottom = Math.abs(editorHeaderBottom - (scrollPos.top + viewHeight)) < 2;
+ if (editorHeaderDockedAtTop && markerTop < editorHeaderBottom) {
+ to(scrollPos.left, markerTop - editorHeaderHeight, doc);
+ } else if (editorHeaderDockedAtBottom && markerBottom > editorHeaderTop) {
+ var y = markerTop - viewHeight + markerHeight + editorHeaderHeight;
+ to(scrollPos.left, y, doc);
+ }
+ };
+ var isDockedMode = function (header, mode) {
+ return contains(Docking.getModes(header), mode);
+ };
+ var updateIframeContentFlow = function (header) {
+ var getOccupiedHeight = function (elm) {
+ return getOuter$1(elm) + (parseInt(get$5(elm, 'margin-top'), 10) || 0) + (parseInt(get$5(elm, 'margin-bottom'), 10) || 0);
+ };
+ var elm = header.element;
+ parent(elm).each(function (parentElem) {
+ var padding = 'padding-' + Docking.getModes(header)[0];
+ if (Docking.isDocked(header)) {
+ var parentWidth = get$8(parentElem);
+ set$2(elm, 'width', parentWidth + 'px');
+ set$2(parentElem, padding, getOccupiedHeight(elm) + 'px');
+ } else {
+ remove$6(elm, 'width');
+ remove$6(parentElem, padding);
+ }
+ });
+ };
+ var updateSinkVisibility = function (sinkElem, visible) {
+ if (visible) {
+ remove$4(sinkElem, visibility.fadeOutClass);
+ add$3(sinkElem, [
+ visibility.transitionClass,
+ visibility.fadeInClass
+ ]);
+ } else {
+ remove$4(sinkElem, visibility.fadeInClass);
+ add$3(sinkElem, [
+ visibility.fadeOutClass,
+ visibility.transitionClass
+ ]);
+ }
+ };
+ var updateEditorClasses = function (editor, docked) {
+ var editorContainer = SugarElement.fromDom(editor.getContainer());
+ if (docked) {
+ add$2(editorContainer, editorStickyOnClass);
+ remove$4(editorContainer, editorStickyOffClass);
+ } else {
+ add$2(editorContainer, editorStickyOffClass);
+ remove$4(editorContainer, editorStickyOnClass);
+ }
+ };
+ var restoreFocus = function (headerElem, focusedElem) {
+ var ownerDoc = owner(focusedElem);
+ active(ownerDoc).filter(function (activeElm) {
+ return !eq$1(focusedElem, activeElm);
+ }).filter(function (activeElm) {
+ return eq$1(activeElm, SugarElement.fromDom(ownerDoc.dom.body)) || contains$2(headerElem, activeElm);
+ }).each(function () {
+ return focus$1(focusedElem);
+ });
+ };
+ var findFocusedElem = function (rootElm, lazySink) {
+ return search(rootElm).orThunk(function () {
+ return lazySink().toOptional().bind(function (sink) {
+ return search(sink.element);
+ });
+ });
+ };
+ var setup$5 = function (editor, sharedBackstage, lazyHeader) {
+ if (!editor.inline) {
+ if (!sharedBackstage.header.isPositionedAtTop()) {
+ editor.on('ResizeEditor', function () {
+ lazyHeader().each(Docking.reset);
+ });
+ }
+ editor.on('ResizeWindow ResizeEditor', function () {
+ lazyHeader().each(updateIframeContentFlow);
+ });
+ editor.on('SkinLoaded', function () {
+ lazyHeader().each(function (comp) {
+ Docking.isDocked(comp) ? Docking.reset(comp) : Docking.refresh(comp);
+ });
+ });
+ editor.on('FullscreenStateChanged', function () {
+ lazyHeader().each(Docking.reset);
+ });
+ }
+ editor.on('AfterScrollIntoView', function (e) {
+ lazyHeader().each(function (header) {
+ Docking.refresh(header);
+ var headerElem = header.element;
+ if (isVisible(headerElem)) {
+ scrollFromBehindHeader(e, headerElem);
+ }
+ });
+ });
+ editor.on('PostRender', function () {
+ updateEditorClasses(editor, false);
+ });
+ };
+ var isDocked$2 = function (lazyHeader) {
+ return lazyHeader().map(Docking.isDocked).getOr(false);
+ };
+ var getIframeBehaviours = function () {
+ var _a;
+ return [Receiving.config({ channels: (_a = {}, _a[toolbarHeightChange()] = { onReceive: updateIframeContentFlow }, _a) })];
+ };
+ var getBehaviours$3 = function (editor, sharedBackstage) {
+ var focusedElm = Cell(Optional.none());
+ var lazySink = sharedBackstage.getSink;
+ var runOnSinkElement = function (f) {
+ lazySink().each(function (sink) {
+ return f(sink.element);
+ });
+ };
+ var onDockingSwitch = function (comp) {
+ if (!editor.inline) {
+ updateIframeContentFlow(comp);
+ }
+ updateEditorClasses(editor, Docking.isDocked(comp));
+ comp.getSystem().broadcastOn([repositionPopups()], {});
+ lazySink().each(function (sink) {
+ return sink.getSystem().broadcastOn([repositionPopups()], {});
+ });
+ };
+ var additionalBehaviours = editor.inline ? [] : getIframeBehaviours();
+ return __spreadArrays([
+ Focusing.config({}),
+ Docking.config({
+ contextual: __assign({
+ lazyContext: function (comp) {
+ var headerHeight = getOuter$1(comp.element);
+ var container = editor.inline ? editor.getContentAreaContainer() : editor.getContainer();
+ var box$1 = box(SugarElement.fromDom(container));
+ var boxHeight = box$1.height - headerHeight;
+ var topBound = box$1.y + (isDockedMode(comp, 'top') ? 0 : headerHeight);
+ return Optional.some(bounds$1(box$1.x, topBound, box$1.width, boxHeight));
+ },
+ onShow: function () {
+ runOnSinkElement(function (elem) {
+ return updateSinkVisibility(elem, true);
+ });
+ },
+ onShown: function (comp) {
+ runOnSinkElement(function (elem) {
+ return remove$5(elem, [
+ visibility.transitionClass,
+ visibility.fadeInClass
+ ]);
+ });
+ focusedElm.get().each(function (elem) {
+ restoreFocus(comp.element, elem);
+ focusedElm.set(Optional.none());
+ });
+ },
+ onHide: function (comp) {
+ focusedElm.set(findFocusedElem(comp.element, lazySink));
+ runOnSinkElement(function (elem) {
+ return updateSinkVisibility(elem, false);
+ });
+ },
+ onHidden: function () {
+ runOnSinkElement(function (elem) {
+ return remove$5(elem, [visibility.transitionClass]);
+ });
+ }
+ }, visibility),
+ modes: [sharedBackstage.header.getDockingMode()],
+ onDocked: onDockingSwitch,
+ onUndocked: onDockingSwitch
+ })
+ ], additionalBehaviours);
+ };
+
+ var StickyHeader = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ setup: setup$5,
+ isDocked: isDocked$2,
+ getBehaviours: getBehaviours$3
+ });
+
+ var renderHeader = function (spec) {
+ var editor = spec.editor;
+ var getBehaviours = spec.sticky ? getBehaviours$3 : getBehaviours$2;
+ return {
+ uid: spec.uid,
+ dom: spec.dom,
+ components: spec.components,
+ behaviours: derive$1(getBehaviours(editor, spec.sharedBackstage))
+ };
+ };
+
+ var factory$g = function (detail, spec) {
+ var setMenus = function (comp, menus) {
+ var newMenus = map(menus, function (m) {
+ var buttonSpec = {
+ type: 'menubutton',
+ text: m.text,
+ fetch: function (callback) {
+ callback(m.getItems());
+ }
+ };
+ var internal = createMenuButton(buttonSpec).mapError(function (errInfo) {
+ return formatError(errInfo);
+ }).getOrDie();
+ return renderMenuButton(internal, 'tox-mbtn', spec.backstage, Optional.some('menuitem'));
+ });
+ Replacing.set(comp, newMenus);
+ };
+ var apis = {
+ focus: Keying.focusIn,
+ setMenus: setMenus
+ };
+ return {
+ uid: detail.uid,
+ dom: detail.dom,
+ components: [],
+ behaviours: derive$1([
+ Replacing.config({}),
+ config('menubar-events', [
+ runOnAttached(function (component) {
+ detail.onSetup(component);
+ }),
+ run(mouseover(), function (comp, se) {
+ descendant$1(comp.element, '.' + 'tox-mbtn--active').each(function (activeButton) {
+ closest$3(se.event.target, '.' + 'tox-mbtn').each(function (hoveredButton) {
+ if (!eq$1(activeButton, hoveredButton)) {
+ comp.getSystem().getByDom(activeButton).each(function (activeComp) {
+ comp.getSystem().getByDom(hoveredButton).each(function (hoveredComp) {
+ Dropdown.expand(hoveredComp);
+ Dropdown.close(activeComp);
+ Focusing.focus(hoveredComp);
+ });
+ });
+ }
+ });
+ });
+ }),
+ run(focusShifted(), function (comp, se) {
+ se.event.prevFocus.bind(function (prev) {
+ return comp.getSystem().getByDom(prev).toOptional();
+ }).each(function (prev) {
+ se.event.newFocus.bind(function (nu) {
+ return comp.getSystem().getByDom(nu).toOptional();
+ }).each(function (nu) {
+ if (Dropdown.isOpen(prev)) {
+ Dropdown.expand(nu);
+ Dropdown.close(prev);
+ }
+ });
+ });
+ })
+ ]),
+ Keying.config({
+ mode: 'flow',
+ selector: '.' + 'tox-mbtn',
+ onEscape: function (comp) {
+ detail.onEscape(comp);
+ return Optional.some(true);
+ }
+ }),
+ Tabstopping.config({})
+ ]),
+ apis: apis,
+ domModification: { attributes: { role: 'menubar' } }
+ };
+ };
+ var SilverMenubar = single$2({
+ factory: factory$g,
+ name: 'silver.Menubar',
+ configFields: [
+ strict$1('dom'),
+ strict$1('uid'),
+ strict$1('onEscape'),
+ strict$1('backstage'),
+ defaulted$1('onSetup', noop)
+ ],
+ apis: {
+ focus: function (apis, comp) {
+ apis.focus(comp);
+ },
+ setMenus: function (apis, comp, menus) {
+ apis.setMenus(comp, menus);
+ }
+ }
+ });
+
+ var owner$4 = 'container';
+ var schema$s = [field$1('slotBehaviours', [])];
+ var getPartName$1 = function (name) {
+ return '';
+ };
+ var sketch$2 = function (sSpec) {
+ var parts = function () {
+ var record = [];
+ var slot = function (name, config) {
+ record.push(name);
+ return generateOne(owner$4, getPartName$1(name), config);
+ };
+ return {
+ slot: slot,
+ record: function () {
+ return record;
+ }
+ };
+ }();
+ var spec = sSpec(parts);
+ var partNames = parts.record();
+ var fieldParts = map(partNames, function (n) {
+ return required({
+ name: n,
+ pname: getPartName$1(n)
+ });
+ });
+ return composite(owner$4, schema$s, fieldParts, make$7, spec);
+ };
+ var make$7 = function (detail, components) {
+ var getSlotNames = function (_) {
+ return getAllPartNames(detail);
+ };
+ var getSlot = function (container, key) {
+ return getPart(container, detail, key);
+ };
+ var onSlot = function (f, def) {
+ return function (container, key) {
+ return getPart(container, detail, key).map(function (slot) {
+ return f(slot, key);
+ }).getOr(def);
+ };
+ };
+ var onSlots = function (f) {
+ return function (container, keys) {
+ each(keys, function (key) {
+ return f(container, key);
+ });
+ };
+ };
+ var doShowing = function (comp, _key) {
+ return get$3(comp.element, 'aria-hidden') !== 'true';
+ };
+ var doShow = function (comp, key) {
+ if (!doShowing(comp)) {
+ var element = comp.element;
+ remove$6(element, 'display');
+ remove$1(element, 'aria-hidden');
+ emitWith(comp, slotVisibility(), {
+ name: key,
+ visible: true
+ });
+ }
+ };
+ var doHide = function (comp, key) {
+ if (doShowing(comp)) {
+ var element = comp.element;
+ set$2(element, 'display', 'none');
+ set$1(element, 'aria-hidden', 'true');
+ emitWith(comp, slotVisibility(), {
+ name: key,
+ visible: false
+ });
+ }
+ };
+ var isShowing = onSlot(doShowing, false);
+ var hideSlot = onSlot(doHide);
+ var hideSlots = onSlots(hideSlot);
+ var hideAllSlots = function (container) {
+ return hideSlots(container, getSlotNames());
+ };
+ var showSlot = onSlot(doShow);
+ var apis = {
+ getSlotNames: getSlotNames,
+ getSlot: getSlot,
+ isShowing: isShowing,
+ hideSlot: hideSlot,
+ hideAllSlots: hideAllSlots,
+ showSlot: showSlot
+ };
+ return {
+ uid: detail.uid,
+ dom: detail.dom,
+ components: components,
+ behaviours: get$d(detail.slotBehaviours),
+ apis: apis
+ };
+ };
+ var slotApis = map$2({
+ getSlotNames: function (apis, c) {
+ return apis.getSlotNames(c);
+ },
+ getSlot: function (apis, c, key) {
+ return apis.getSlot(c, key);
+ },
+ isShowing: function (apis, c, key) {
+ return apis.isShowing(c, key);
+ },
+ hideSlot: function (apis, c, key) {
+ return apis.hideSlot(c, key);
+ },
+ hideAllSlots: function (apis, c) {
+ return apis.hideAllSlots(c);
+ },
+ showSlot: function (apis, c, key) {
+ return apis.showSlot(c, key);
+ }
+ }, function (value) {
+ return makeApi(value);
+ });
+ var SlotContainer = __assign(__assign({}, slotApis), { sketch: sketch$2 });
+
+ var sidebarSchema = objOf([
+ optionString('icon'),
+ optionString('tooltip'),
+ defaultedFunction('onShow', noop),
+ defaultedFunction('onHide', noop),
+ defaultedFunction('onSetup', function () {
+ return noop;
+ })
+ ]);
+ var createSidebar = function (spec) {
+ return asRaw('sidebar', sidebarSchema, spec);
+ };
+
+ var setup$6 = function (editor) {
+ var sidebars = editor.ui.registry.getAll().sidebars;
+ each(keys(sidebars), function (name) {
+ var spec = sidebars[name];
+ var isActive = function () {
+ return Optional.from(editor.queryCommandValue('ToggleSidebar')).is(name);
+ };
+ editor.ui.registry.addToggleButton(name, {
+ icon: spec.icon,
+ tooltip: spec.tooltip,
+ onAction: function (buttonApi) {
+ editor.execCommand('ToggleSidebar', false, name);
+ buttonApi.setActive(isActive());
+ },
+ onSetup: function (buttonApi) {
+ var handleToggle = function () {
+ return buttonApi.setActive(isActive());
+ };
+ editor.on('ToggleSidebar', handleToggle);
+ return function () {
+ editor.off('ToggleSidebar', handleToggle);
+ };
+ }
+ });
+ });
+ };
+ var getApi = function (comp) {
+ return {
+ element: function () {
+ return comp.element.dom;
+ }
+ };
+ };
+ var makePanels = function (parts, panelConfigs) {
+ var specs = map(keys(panelConfigs), function (name) {
+ var spec = panelConfigs[name];
+ var bridged = getOrDie(createSidebar(spec));
+ return {
+ name: name,
+ getApi: getApi,
+ onSetup: bridged.onSetup,
+ onShow: bridged.onShow,
+ onHide: bridged.onHide
+ };
+ });
+ return map(specs, function (spec) {
+ var editorOffCell = Cell(noop);
+ return parts.slot(spec.name, {
+ dom: {
+ tag: 'div',
+ classes: ['tox-sidebar__pane']
+ },
+ behaviours: SimpleBehaviours.unnamedEvents([
+ onControlAttached(spec, editorOffCell),
+ onControlDetached(spec, editorOffCell),
+ run(slotVisibility(), function (sidepanel, se) {
+ var data = se.event;
+ var optSidePanelSpec = find(specs, function (config) {
+ return config.name === data.name;
+ });
+ optSidePanelSpec.each(function (sidePanelSpec) {
+ var handler = data.visible ? sidePanelSpec.onShow : sidePanelSpec.onHide;
+ handler(sidePanelSpec.getApi(sidepanel));
+ });
+ })
+ ])
+ });
+ });
+ };
+ var makeSidebar = function (panelConfigs) {
+ return SlotContainer.sketch(function (parts) {
+ return {
+ dom: {
+ tag: 'div',
+ classes: ['tox-sidebar__pane-container']
+ },
+ components: makePanels(parts, panelConfigs),
+ slotBehaviours: SimpleBehaviours.unnamedEvents([runOnAttached(function (slotContainer) {
+ return SlotContainer.hideAllSlots(slotContainer);
+ })])
+ };
+ });
+ };
+ var setSidebar = function (sidebar, panelConfigs) {
+ var optSlider = Composing.getCurrent(sidebar);
+ optSlider.each(function (slider) {
+ return Replacing.set(slider, [makeSidebar(panelConfigs)]);
+ });
+ };
+ var toggleSidebar = function (sidebar, name) {
+ var optSlider = Composing.getCurrent(sidebar);
+ optSlider.each(function (slider) {
+ var optSlotContainer = Composing.getCurrent(slider);
+ optSlotContainer.each(function (slotContainer) {
+ if (Sliding.hasGrown(slider)) {
+ if (SlotContainer.isShowing(slotContainer, name)) {
+ Sliding.shrink(slider);
+ } else {
+ SlotContainer.hideAllSlots(slotContainer);
+ SlotContainer.showSlot(slotContainer, name);
+ }
+ } else {
+ SlotContainer.hideAllSlots(slotContainer);
+ SlotContainer.showSlot(slotContainer, name);
+ Sliding.grow(slider);
+ }
+ });
+ });
+ };
+ var whichSidebar = function (sidebar) {
+ var optSlider = Composing.getCurrent(sidebar);
+ return optSlider.bind(function (slider) {
+ var sidebarOpen = Sliding.isGrowing(slider) || Sliding.hasGrown(slider);
+ if (sidebarOpen) {
+ var optSlotContainer = Composing.getCurrent(slider);
+ return optSlotContainer.bind(function (slotContainer) {
+ return find(SlotContainer.getSlotNames(slotContainer), function (name) {
+ return SlotContainer.isShowing(slotContainer, name);
+ });
+ });
+ } else {
+ return Optional.none();
+ }
+ });
+ };
+ var fixSize = generate$1('FixSizeEvent');
+ var autoSize = generate$1('AutoSizeEvent');
+ var renderSidebar = function (spec) {
+ return {
+ uid: spec.uid,
+ dom: {
+ tag: 'div',
+ classes: ['tox-sidebar'],
+ attributes: { role: 'complementary' }
+ },
+ components: [{
+ dom: {
+ tag: 'div',
+ classes: ['tox-sidebar__slider']
+ },
+ components: [],
+ behaviours: derive$1([
+ Tabstopping.config({}),
+ Focusing.config({}),
+ Sliding.config({
+ dimension: { property: 'width' },
+ closedClass: 'tox-sidebar--sliding-closed',
+ openClass: 'tox-sidebar--sliding-open',
+ shrinkingClass: 'tox-sidebar--sliding-shrinking',
+ growingClass: 'tox-sidebar--sliding-growing',
+ onShrunk: function (slider) {
+ var optSlotContainer = Composing.getCurrent(slider);
+ optSlotContainer.each(SlotContainer.hideAllSlots);
+ emit(slider, autoSize);
+ },
+ onGrown: function (slider) {
+ emit(slider, autoSize);
+ },
+ onStartGrow: function (slider) {
+ emitWith(slider, fixSize, { width: getRaw(slider.element, 'width').getOr('') });
+ },
+ onStartShrink: function (slider) {
+ emitWith(slider, fixSize, { width: get$8(slider.element) + 'px' });
+ }
+ }),
+ Replacing.config({}),
+ Composing.config({
+ find: function (comp) {
+ var children = Replacing.contents(comp);
+ return head(children);
+ }
+ })
+ ])
+ }],
+ behaviours: derive$1([
+ ComposingConfigs.childAt(0),
+ config('sidebar-sliding-events', [
+ run(fixSize, function (comp, se) {
+ set$2(comp.element, 'width', se.event.width);
+ }),
+ run(autoSize, function (comp, _se) {
+ remove$6(comp.element, 'width');
+ })
+ ])
+ ])
+ };
+ };
+
+ var getAttrs = function (elem) {
+ var attributes = elem.dom.attributes !== undefined ? elem.dom.attributes : [];
+ return foldl(attributes, function (b, attr) {
+ var _a;
+ if (attr.name === 'class') {
+ return b;
+ } else {
+ return __assign(__assign({}, b), (_a = {}, _a[attr.name] = attr.value, _a));
+ }
+ }, {});
+ };
+ var getClasses = function (elem) {
+ return Array.prototype.slice.call(elem.dom.classList, 0);
+ };
+ var fromHtml$2 = function (html) {
+ var elem = SugarElement.fromHtml(html);
+ var children$1 = children(elem);
+ var attrs = getAttrs(elem);
+ var classes = getClasses(elem);
+ var contents = children$1.length === 0 ? {} : { innerHtml: get$2(elem) };
+ return __assign({
+ tag: name(elem),
+ classes: classes,
+ attributes: attrs
+ }, contents);
+ };
+
+ var renderSpinner = function (providerBackstage) {
+ return {
+ dom: {
+ tag: 'div',
+ attributes: { 'aria-label': providerBackstage.translate('Loading...') },
+ classes: ['tox-throbber__busy-spinner']
+ },
+ components: [{ dom: fromHtml$2('') }],
+ behaviours: derive$1([
+ Keying.config({
+ mode: 'special',
+ onTab: function () {
+ return Optional.some(true);
+ },
+ onShiftTab: function () {
+ return Optional.some(true);
+ }
+ }),
+ Focusing.config({})
+ ])
+ };
+ };
+ var toggleThrobber = function (comp, state, providerBackstage) {
+ var element = comp.element;
+ if (state === true) {
+ Replacing.set(comp, [renderSpinner(providerBackstage)]);
+ remove$6(element, 'display');
+ remove$1(element, 'aria-hidden');
+ } else {
+ Replacing.set(comp, []);
+ set$2(element, 'display', 'none');
+ set$1(element, 'aria-hidden', 'true');
+ }
+ };
+ var renderThrobber = function (spec) {
+ return {
+ uid: spec.uid,
+ dom: {
+ tag: 'div',
+ attributes: { 'aria-hidden': 'true' },
+ classes: ['tox-throbber'],
+ styles: { display: 'none' }
+ },
+ behaviours: derive$1([Replacing.config({})]),
+ components: []
+ };
+ };
+ var setup$7 = function (editor, lazyThrobber, sharedBackstage) {
+ var throbberState = Cell(false);
+ var timer = Cell(Optional.none());
+ var toggle = function (state) {
+ if (state !== throbberState.get()) {
+ toggleThrobber(lazyThrobber(), state, sharedBackstage.providers);
+ throbberState.set(state);
+ editor.fire('AfterProgressState', { state: state });
+ }
+ };
+ editor.on('ProgressState', function (e) {
+ timer.get().each(global$2.clearTimeout);
+ if (isNumber(e.time)) {
+ var timerId = global$2.setEditorTimeout(editor, function () {
+ return toggle(e.state);
+ }, e.time);
+ timer.set(Optional.some(timerId));
+ } else {
+ toggle(e.state);
+ timer.set(Optional.none());
+ }
+ });
+ };
+
+ var factory$h = function (detail, components, _spec) {
+ var apis = {
+ getSocket: function (comp) {
+ return parts$d.getPart(comp, detail, 'socket');
+ },
+ setSidebar: function (comp, panelConfigs) {
+ parts$d.getPart(comp, detail, 'sidebar').each(function (sidebar) {
+ return setSidebar(sidebar, panelConfigs);
+ });
+ },
+ toggleSidebar: function (comp, name) {
+ parts$d.getPart(comp, detail, 'sidebar').each(function (sidebar) {
+ return toggleSidebar(sidebar, name);
+ });
+ },
+ whichSidebar: function (comp) {
+ return parts$d.getPart(comp, detail, 'sidebar').bind(whichSidebar).getOrNull();
+ },
+ getHeader: function (comp) {
+ return parts$d.getPart(comp, detail, 'header');
+ },
+ getToolbar: function (comp) {
+ return parts$d.getPart(comp, detail, 'toolbar');
+ },
+ setToolbar: function (comp, groups) {
+ parts$d.getPart(comp, detail, 'toolbar').each(function (toolbar) {
+ toolbar.getApis().setGroups(toolbar, groups);
+ });
+ },
+ setToolbars: function (comp, toolbars) {
+ parts$d.getPart(comp, detail, 'multiple-toolbar').each(function (mToolbar) {
+ CustomList.setItems(mToolbar, toolbars);
+ });
+ },
+ refreshToolbar: function (comp) {
+ var toolbar = parts$d.getPart(comp, detail, 'toolbar');
+ toolbar.each(function (toolbar) {
+ return toolbar.getApis().refresh(toolbar);
+ });
+ },
+ toggleToolbarDrawer: function (comp) {
+ parts$d.getPart(comp, detail, 'toolbar').each(function (toolbar) {
+ mapFrom(toolbar.getApis().toggle, function (toggle) {
+ return toggle(toolbar);
+ });
+ });
+ },
+ isToolbarDrawerToggled: function (comp) {
+ return parts$d.getPart(comp, detail, 'toolbar').bind(function (toolbar) {
+ return Optional.from(toolbar.getApis().isOpen).map(function (isOpen) {
+ return isOpen(toolbar);
+ });
+ }).getOr(false);
+ },
+ getThrobber: function (comp) {
+ return parts$d.getPart(comp, detail, 'throbber');
+ },
+ focusToolbar: function (comp) {
+ var optToolbar = parts$d.getPart(comp, detail, 'toolbar').orThunk(function () {
+ return parts$d.getPart(comp, detail, 'multiple-toolbar');
+ });
+ optToolbar.each(function (toolbar) {
+ Keying.focusIn(toolbar);
+ });
+ },
+ setMenubar: function (comp, menus) {
+ parts$d.getPart(comp, detail, 'menubar').each(function (menubar) {
+ SilverMenubar.setMenus(menubar, menus);
+ });
+ },
+ focusMenubar: function (comp) {
+ parts$d.getPart(comp, detail, 'menubar').each(function (menubar) {
+ SilverMenubar.focus(menubar);
+ });
+ }
+ };
+ return {
+ uid: detail.uid,
+ dom: detail.dom,
+ components: components,
+ apis: apis,
+ behaviours: detail.behaviours
+ };
+ };
+ var partMenubar = partType$1.optional({
+ factory: SilverMenubar,
+ name: 'menubar',
+ schema: [strict$1('backstage')]
+ });
+ var toolbarFactory = function (spec) {
+ if (spec.type === ToolbarMode.sliding) {
+ return renderSlidingMoreToolbar;
+ } else if (spec.type === ToolbarMode.floating) {
+ return renderFloatingMoreToolbar;
+ } else {
+ return renderToolbar;
+ }
+ };
+ var partMultipleToolbar = partType$1.optional({
+ factory: {
+ sketch: function (spec) {
+ return CustomList.sketch({
+ uid: spec.uid,
+ dom: spec.dom,
+ listBehaviours: derive$1([Keying.config({
+ mode: 'acyclic',
+ selector: '.tox-toolbar'
+ })]),
+ makeItem: function () {
+ return renderToolbar({
+ type: spec.type,
+ uid: generate$1('multiple-toolbar-item'),
+ cyclicKeying: false,
+ initGroups: [],
+ providers: spec.providers,
+ onEscape: function () {
+ spec.onEscape();
+ return Optional.some(true);
+ }
+ });
+ },
+ setupItem: function (_mToolbar, tc, data, _index) {
+ Toolbar.setGroups(tc, data);
+ },
+ shell: true
+ });
+ }
+ },
+ name: 'multiple-toolbar',
+ schema: [
+ strict$1('dom'),
+ strict$1('onEscape')
+ ]
+ });
+ var partToolbar = partType$1.optional({
+ factory: {
+ sketch: function (spec) {
+ var renderer = toolbarFactory(spec);
+ var toolbarSpec = {
+ type: spec.type,
+ uid: spec.uid,
+ onEscape: function () {
+ spec.onEscape();
+ return Optional.some(true);
+ },
+ cyclicKeying: false,
+ initGroups: [],
+ getSink: spec.getSink,
+ providers: spec.providers,
+ moreDrawerData: {
+ lazyToolbar: spec.lazyToolbar,
+ lazyMoreButton: spec.lazyMoreButton,
+ lazyHeader: spec.lazyHeader
+ },
+ attributes: spec.attributes
+ };
+ return renderer(toolbarSpec);
+ }
+ },
+ name: 'toolbar',
+ schema: [
+ strict$1('dom'),
+ strict$1('onEscape'),
+ strict$1('getSink')
+ ]
+ });
+ var partHeader = partType$1.optional({
+ factory: { sketch: renderHeader },
+ name: 'header',
+ schema: [strict$1('dom')]
+ });
+ var partSocket = partType$1.optional({
+ name: 'socket',
+ schema: [strict$1('dom')]
+ });
+ var partSidebar = partType$1.optional({
+ factory: { sketch: renderSidebar },
+ name: 'sidebar',
+ schema: [strict$1('dom')]
+ });
+ var partThrobber = partType$1.optional({
+ factory: { sketch: renderThrobber },
+ name: 'throbber',
+ schema: [strict$1('dom')]
+ });
+ var OuterContainer = composite$1({
+ name: 'OuterContainer',
+ factory: factory$h,
+ configFields: [
+ strict$1('dom'),
+ strict$1('behaviours')
+ ],
+ partFields: [
+ partHeader,
+ partMenubar,
+ partToolbar,
+ partMultipleToolbar,
+ partSocket,
+ partSidebar,
+ partThrobber
+ ],
+ apis: {
+ getSocket: function (apis, comp) {
+ return apis.getSocket(comp);
+ },
+ setSidebar: function (apis, comp, panelConfigs) {
+ apis.setSidebar(comp, panelConfigs);
+ },
+ toggleSidebar: function (apis, comp, name) {
+ apis.toggleSidebar(comp, name);
+ },
+ whichSidebar: function (apis, comp) {
+ return apis.whichSidebar(comp);
+ },
+ getHeader: function (apis, comp) {
+ return apis.getHeader(comp);
+ },
+ getToolbar: function (apis, comp) {
+ return apis.getToolbar(comp);
+ },
+ setToolbar: function (apis, comp, grps) {
+ var groups = map(grps, function (grp) {
+ return renderToolbarGroup(grp);
+ });
+ apis.setToolbar(comp, groups);
+ },
+ setToolbars: function (apis, comp, ts) {
+ var renderedToolbars = map(ts, function (g) {
+ return map(g, renderToolbarGroup);
+ });
+ apis.setToolbars(comp, renderedToolbars);
+ },
+ refreshToolbar: function (apis, comp) {
+ return apis.refreshToolbar(comp);
+ },
+ toggleToolbarDrawer: function (apis, comp) {
+ apis.toggleToolbarDrawer(comp);
+ },
+ isToolbarDrawerToggled: function (apis, comp) {
+ return apis.isToolbarDrawerToggled(comp);
+ },
+ getThrobber: function (apis, comp) {
+ return apis.getThrobber(comp);
+ },
+ setMenubar: function (apis, comp, menus) {
+ apis.setMenubar(comp, menus);
+ },
+ focusMenubar: function (apis, comp) {
+ apis.focusMenubar(comp);
+ },
+ focusToolbar: function (apis, comp) {
+ apis.focusToolbar(comp);
+ }
+ }
+ });
+
+ var defaultMenubar = 'file edit view insert format tools table help';
+ var defaultMenus = {
+ file: {
+ title: 'File',
+ items: 'newdocument restoredraft | preview | export print | deleteallconversations'
+ },
+ edit: {
+ title: 'Edit',
+ items: 'undo redo | cut copy paste pastetext | selectall | searchreplace'
+ },
+ view: {
+ title: 'View',
+ items: 'code | visualaid visualchars visualblocks | spellchecker | preview fullscreen | showcomments'
+ },
+ insert: {
+ title: 'Insert',
+ items: 'image link media addcomment pageembed template codesample inserttable | charmap emoticons hr | pagebreak nonbreaking anchor toc | insertdatetime'
+ },
+ format: {
+ title: 'Format',
+ items: 'bold italic underline strikethrough superscript subscript codeformat | formats blockformats fontformats fontsizes align lineheight | forecolor backcolor | removeformat'
+ },
+ tools: {
+ title: 'Tools',
+ items: 'spellchecker spellcheckerlanguage | a11ycheck code wordcount'
+ },
+ table: {
+ title: 'Table',
+ items: 'inserttable | cell row column | advtablesort | tableprops deletetable'
+ },
+ help: {
+ title: 'Help',
+ items: 'help'
+ }
+ };
+ var make$8 = function (menu, registry, editor) {
+ var removedMenuItems = getRemovedMenuItems(editor).split(/[ ,]/);
+ return {
+ text: menu.title,
+ getItems: function () {
+ return bind(menu.items, function (i) {
+ var itemName = i.toLowerCase();
+ if (itemName.trim().length === 0) {
+ return [];
+ } else if (exists(removedMenuItems, function (removedMenuItem) {
+ return removedMenuItem === itemName;
+ })) {
+ return [];
+ } else if (itemName === 'separator' || itemName === '|') {
+ return [{ type: 'separator' }];
+ } else if (registry.menuItems[itemName]) {
+ return [registry.menuItems[itemName]];
+ } else {
+ return [];
+ }
+ });
+ }
+ };
+ };
+ var parseItemsString = function (items) {
+ if (typeof items === 'string') {
+ return items.split(' ');
+ }
+ return items;
+ };
+ var identifyMenus = function (editor, registry) {
+ var rawMenuData = __assign(__assign({}, defaultMenus), registry.menus);
+ var userDefinedMenus = keys(registry.menus).length > 0;
+ var menubar = registry.menubar === undefined || registry.menubar === true ? parseItemsString(defaultMenubar) : parseItemsString(registry.menubar === false ? '' : registry.menubar);
+ var validMenus = filter(menubar, function (menuName) {
+ return userDefinedMenus ? registry.menus.hasOwnProperty(menuName) && registry.menus[menuName].hasOwnProperty('items') || defaultMenus.hasOwnProperty(menuName) : defaultMenus.hasOwnProperty(menuName);
+ });
+ var menus = map(validMenus, function (menuName) {
+ var menuData = rawMenuData[menuName];
+ return make$8({
+ title: menuData.title,
+ items: parseItemsString(menuData.items)
+ }, registry, editor);
+ });
+ return filter(menus, function (menu) {
+ var isNotSeparator = function (item) {
+ return item.type !== 'separator';
+ };
+ return menu.getItems().length > 0 && exists(menu.getItems(), isNotSeparator);
+ });
+ };
+
+ var fireSkinLoaded$1 = function (editor) {
+ var done = function () {
+ editor._skinLoaded = true;
+ fireSkinLoaded(editor);
+ };
+ return function () {
+ if (editor.initialized) {
+ done();
+ } else {
+ editor.on('init', done);
+ }
+ };
+ };
+ var fireSkinLoadError$1 = function (editor, err) {
+ return function () {
+ return fireSkinLoadError(editor, { message: err });
+ };
+ };
+
+ var loadStylesheet = function (editor, stylesheetUrl, styleSheetLoader) {
+ return new global$4(function (resolve, reject) {
+ styleSheetLoader.load(stylesheetUrl, resolve, reject);
+ editor.on('remove', function () {
+ return styleSheetLoader.unload(stylesheetUrl);
+ });
+ });
+ };
+ var loadUiSkins = function (editor, skinUrl) {
+ var skinUiCss = skinUrl + '/skin.min.css';
+ return loadStylesheet(editor, skinUiCss, editor.ui.styleSheetLoader);
+ };
+ var loadShadowDomUiSkins = function (editor, skinUrl) {
+ var isInShadowRoot$1 = isInShadowRoot(SugarElement.fromDom(editor.getElement()));
+ if (isInShadowRoot$1) {
+ var shadowDomSkinCss = skinUrl + '/skin.shadowdom.min.css';
+ return loadStylesheet(editor, shadowDomSkinCss, global$5.DOM.styleSheetLoader);
+ } else {
+ return global$4.resolve();
+ }
+ };
+ var loadSkin = function (isInline, editor) {
+ var skinUrl = getSkinUrl(editor);
+ if (skinUrl) {
+ editor.contentCSS.push(skinUrl + (isInline ? '/content.inline' : '/content') + '.min.css');
+ }
+ if (isSkinDisabled(editor) === false && isString(skinUrl)) {
+ global$4.all([
+ loadUiSkins(editor, skinUrl),
+ loadShadowDomUiSkins(editor, skinUrl)
+ ]).then(fireSkinLoaded$1(editor), fireSkinLoadError$1(editor, 'Skin could not be loaded'));
+ } else {
+ fireSkinLoaded$1(editor)();
+ }
+ };
+ var iframe = curry(loadSkin, false);
+ var inline = curry(loadSkin, true);
+
+ var setToolbar = function (editor, uiComponents, rawUiConfig, backstage) {
+ var comp = uiComponents.outerContainer;
+ var toolbarConfig = rawUiConfig.toolbar;
+ var toolbarButtonsConfig = rawUiConfig.buttons;
+ if (isArrayOf(toolbarConfig, isString)) {
+ var toolbars = toolbarConfig.map(function (t) {
+ var config = {
+ toolbar: t,
+ buttons: toolbarButtonsConfig,
+ allowToolbarGroups: rawUiConfig.allowToolbarGroups
+ };
+ return identifyButtons(editor, config, { backstage: backstage }, Optional.none());
+ });
+ OuterContainer.setToolbars(comp, toolbars);
+ } else {
+ OuterContainer.setToolbar(comp, identifyButtons(editor, rawUiConfig, { backstage: backstage }, Optional.none()));
+ }
+ };
+
+ var detection = detect$3();
+ var isiOS12 = detection.os.isiOS() && detection.os.version.major <= 12;
+ var setupEvents = function (editor, uiComponents) {
+ var dom = editor.dom;
+ var contentWindow = editor.getWin();
+ var initialDocEle = editor.getDoc().documentElement;
+ var lastWindowDimensions = Cell(SugarPosition(contentWindow.innerWidth, contentWindow.innerHeight));
+ var lastDocumentDimensions = Cell(SugarPosition(initialDocEle.offsetWidth, initialDocEle.offsetHeight));
+ var resizeWindow = function () {
+ var outer = lastWindowDimensions.get();
+ if (outer.left !== contentWindow.innerWidth || outer.top !== contentWindow.innerHeight) {
+ lastWindowDimensions.set(SugarPosition(contentWindow.innerWidth, contentWindow.innerHeight));
+ fireResizeContent(editor);
+ }
+ };
+ var resizeDocument = function () {
+ var docEle = editor.getDoc().documentElement;
+ var inner = lastDocumentDimensions.get();
+ if (inner.left !== docEle.offsetWidth || inner.top !== docEle.offsetHeight) {
+ lastDocumentDimensions.set(SugarPosition(docEle.offsetWidth, docEle.offsetHeight));
+ fireResizeContent(editor);
+ }
+ };
+ var scroll = function (e) {
+ return fireScrollContent(editor, e);
+ };
+ dom.bind(contentWindow, 'resize', resizeWindow);
+ dom.bind(contentWindow, 'scroll', scroll);
+ var elementLoad = capture$1(SugarElement.fromDom(editor.getBody()), 'load', resizeDocument);
+ var mothership = uiComponents.uiMothership.element;
+ editor.on('hide', function () {
+ set$2(mothership, 'display', 'none');
+ });
+ editor.on('show', function () {
+ remove$6(mothership, 'display');
+ });
+ editor.on('NodeChange', resizeDocument);
+ editor.on('remove', function () {
+ elementLoad.unbind();
+ dom.unbind(contentWindow, 'resize', resizeWindow);
+ dom.unbind(contentWindow, 'scroll', scroll);
+ contentWindow = null;
+ });
+ };
+ var render$1 = function (editor, uiComponents, rawUiConfig, backstage, args) {
+ var lastToolbarWidth = Cell(0);
+ var outerContainer = uiComponents.outerContainer;
+ iframe(editor);
+ var eTargetNode = SugarElement.fromDom(args.targetNode);
+ var uiRoot = getContentContainer(getRootNode(eTargetNode));
+ attachSystemAfter(eTargetNode, uiComponents.mothership);
+ attachSystem(uiRoot, uiComponents.uiMothership);
+ editor.on('PostRender', function () {
+ setToolbar(editor, uiComponents, rawUiConfig, backstage);
+ lastToolbarWidth.set(editor.getWin().innerWidth);
+ OuterContainer.setMenubar(outerContainer, identifyMenus(editor, rawUiConfig));
+ OuterContainer.setSidebar(outerContainer, rawUiConfig.sidebar);
+ setupEvents(editor, uiComponents);
+ });
+ var socket = OuterContainer.getSocket(outerContainer).getOrDie('Could not find expected socket element');
+ if (isiOS12) {
+ setAll$1(socket.element, {
+ 'overflow': 'scroll',
+ '-webkit-overflow-scrolling': 'touch'
+ });
+ var limit = first(function () {
+ editor.fire('ScrollContent');
+ }, 20);
+ var unbinder = bind$3(socket.element, 'scroll', limit.throttle);
+ editor.on('remove', unbinder.unbind);
+ }
+ setupReadonlyModeSwitch(editor, uiComponents);
+ editor.addCommand('ToggleSidebar', function (_ui, value) {
+ OuterContainer.toggleSidebar(outerContainer, value);
+ editor.fire('ToggleSidebar');
+ });
+ editor.addQueryValueHandler('ToggleSidebar', function () {
+ return OuterContainer.whichSidebar(outerContainer);
+ });
+ var toolbarMode = getToolbarMode(editor);
+ var refreshDrawer = function () {
+ OuterContainer.refreshToolbar(uiComponents.outerContainer);
+ };
+ if (toolbarMode === ToolbarMode.sliding || toolbarMode === ToolbarMode.floating) {
+ editor.on('ResizeWindow ResizeEditor ResizeContent', function () {
+ var width = editor.getWin().innerWidth;
+ if (width !== lastToolbarWidth.get()) {
+ refreshDrawer();
+ lastToolbarWidth.set(width);
+ }
+ });
+ }
+ var api = {
+ enable: function () {
+ broadcastReadonly(uiComponents, false);
+ },
+ disable: function () {
+ broadcastReadonly(uiComponents, true);
+ },
+ isDisabled: function () {
+ return Disabling.isDisabled(outerContainer);
+ }
+ };
+ return {
+ iframeContainer: socket.element.dom,
+ editorContainer: outerContainer.element.dom,
+ api: api
+ };
+ };
+
+ var Iframe = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ render: render$1
+ });
+
+ var parseToInt = function (val) {
+ var re = /^[0-9\.]+(|px)$/i;
+ if (re.test('' + val)) {
+ return Optional.some(parseInt('' + val, 10));
+ }
+ return Optional.none();
+ };
+ var numToPx = function (val) {
+ return isNumber(val) ? val + 'px' : val;
+ };
+ var calcCappedSize = function (size, minSize, maxSize) {
+ var minOverride = minSize.filter(function (min) {
+ return size < min;
+ });
+ var maxOverride = maxSize.filter(function (max) {
+ return size > max;
+ });
+ return minOverride.or(maxOverride).getOr(size);
+ };
+
+ var getHeight$1 = function (editor) {
+ var baseHeight = getHeightSetting(editor);
+ var minHeight = getMinHeightSetting(editor);
+ var maxHeight = getMaxHeightSetting(editor);
+ return parseToInt(baseHeight).map(function (height) {
+ return calcCappedSize(height, minHeight, maxHeight);
+ });
+ };
+ var getHeightWithFallback = function (editor) {
+ var height = getHeight$1(editor);
+ return height.getOr(getHeightSetting(editor));
+ };
+ var getWidth$1 = function (editor) {
+ var baseWidth = getWidthSetting(editor);
+ var minWidth = getMinWidthSetting(editor);
+ var maxWidth = getMaxWidthSetting(editor);
+ return parseToInt(baseWidth).map(function (width) {
+ return calcCappedSize(width, minWidth, maxWidth);
+ });
+ };
+ var getWidthWithFallback = function (editor) {
+ var width = getWidth$1(editor);
+ return width.getOr(getWidthSetting(editor));
+ };
+
+ var InlineHeader = function (editor, targetElm, uiComponents, backstage, floatContainer) {
+ var uiMothership = uiComponents.uiMothership, outerContainer = uiComponents.outerContainer;
+ var DOM = global$5.DOM;
+ var useFixedToolbarContainer = useFixedContainer(editor);
+ var isSticky = isStickyToolbar(editor);
+ var editorMaxWidthOpt = getMaxWidthSetting(editor).or(getWidth$1(editor));
+ var headerBackstage = backstage.shared.header;
+ var isPositionedAtTop = headerBackstage.isPositionedAtTop;
+ var toolbarMode = getToolbarMode(editor);
+ var isSplitToolbar = toolbarMode === ToolbarMode.sliding || toolbarMode === ToolbarMode.floating;
+ var visible = Cell(false);
+ var isVisible = function () {
+ return visible.get() && !editor.removed;
+ };
+ var calcToolbarOffset = function (toolbar) {
+ return isSplitToolbar ? toolbar.fold(function () {
+ return 0;
+ }, function (tbar) {
+ return tbar.components().length > 1 ? get$7(tbar.components()[1].element) : 0;
+ }) : 0;
+ };
+ var calcMode = function (container) {
+ switch (getToolbarLocation(editor)) {
+ case ToolbarLocation.auto:
+ var toolbar_1 = OuterContainer.getToolbar(outerContainer);
+ var offset = calcToolbarOffset(toolbar_1);
+ var toolbarHeight = get$7(container.element) - offset;
+ var targetBounds = box(targetElm);
+ var roomAtTop = targetBounds.y > toolbarHeight;
+ if (roomAtTop) {
+ return 'top';
+ } else {
+ var doc = documentElement(targetElm);
+ var docHeight = Math.max(doc.dom.scrollHeight, get$7(doc));
+ var roomAtBottom = targetBounds.bottom < docHeight - toolbarHeight;
+ if (roomAtBottom) {
+ return 'bottom';
+ } else {
+ var winBounds = win();
+ var isRoomAtBottomViewport = winBounds.bottom < targetBounds.bottom - toolbarHeight;
+ return isRoomAtBottomViewport ? 'bottom' : 'top';
+ }
+ }
+ case ToolbarLocation.bottom:
+ return 'bottom';
+ case ToolbarLocation.top:
+ default:
+ return 'top';
+ }
+ };
+ var setupMode = function (mode) {
+ var container = floatContainer.get();
+ Docking.setModes(container, [mode]);
+ headerBackstage.setDockingMode(mode);
+ var verticalDir = isPositionedAtTop() ? AttributeValue.TopToBottom : AttributeValue.BottomToTop;
+ set$1(container.element, Attribute, verticalDir);
+ };
+ var updateChromeWidth = function () {
+ var maxWidth = editorMaxWidthOpt.getOrThunk(function () {
+ var bodyMargin = parseToInt(get$5(body(), 'margin-left')).getOr(0);
+ return get$8(body()) - absolute(targetElm).left + bodyMargin;
+ });
+ set$2(floatContainer.get().element, 'max-width', maxWidth + 'px');
+ };
+ var updateChromePosition = function () {
+ var toolbar = OuterContainer.getToolbar(outerContainer);
+ var offset = calcToolbarOffset(toolbar);
+ var targetBounds = box(targetElm);
+ var top = isPositionedAtTop() ? Math.max(targetBounds.y - get$7(floatContainer.get().element) + offset, 0) : targetBounds.bottom;
+ setAll$1(outerContainer.element, {
+ position: 'absolute',
+ top: Math.round(top) + 'px',
+ left: Math.round(targetBounds.x) + 'px'
+ });
+ };
+ var repositionPopups$1 = function () {
+ uiMothership.broadcastOn([repositionPopups()], {});
+ };
+ var updateChromeUi = function (resetDocking) {
+ if (resetDocking === void 0) {
+ resetDocking = false;
+ }
+ if (!isVisible()) {
+ return;
+ }
+ if (!useFixedToolbarContainer) {
+ updateChromeWidth();
+ }
+ if (isSplitToolbar) {
+ OuterContainer.refreshToolbar(outerContainer);
+ }
+ if (!useFixedToolbarContainer) {
+ updateChromePosition();
+ }
+ if (isSticky) {
+ var floatContainerComp = floatContainer.get();
+ resetDocking ? Docking.reset(floatContainerComp) : Docking.refresh(floatContainerComp);
+ }
+ repositionPopups$1();
+ };
+ var updateMode = function (updateUi) {
+ if (updateUi === void 0) {
+ updateUi = true;
+ }
+ if (useFixedToolbarContainer || !isSticky || !isVisible()) {
+ return;
+ }
+ var currentMode = headerBackstage.getDockingMode();
+ var newMode = calcMode(floatContainer.get());
+ if (newMode !== currentMode) {
+ setupMode(newMode);
+ if (updateUi) {
+ updateChromeUi(true);
+ }
+ }
+ };
+ var show = function () {
+ visible.set(true);
+ set$2(outerContainer.element, 'display', 'flex');
+ DOM.addClass(editor.getBody(), 'mce-edit-focus');
+ remove$6(uiMothership.element, 'display');
+ updateMode(false);
+ updateChromeUi();
+ };
+ var hide = function () {
+ visible.set(false);
+ if (uiComponents.outerContainer) {
+ set$2(outerContainer.element, 'display', 'none');
+ DOM.removeClass(editor.getBody(), 'mce-edit-focus');
+ }
+ set$2(uiMothership.element, 'display', 'none');
+ };
+ return {
+ isVisible: isVisible,
+ isPositionedAtTop: isPositionedAtTop,
+ show: show,
+ hide: hide,
+ update: updateChromeUi,
+ updateMode: updateMode,
+ repositionPopups: repositionPopups$1
+ };
+ };
+
+ var getTargetPosAndBounds = function (targetElm, isToolbarTop) {
+ var bounds = box(targetElm);
+ return {
+ pos: isToolbarTop ? bounds.y : bounds.bottom,
+ bounds: bounds
+ };
+ };
+ var setupEvents$1 = function (editor, targetElm, ui, toolbarPersist) {
+ var prevPosAndBounds = Cell(getTargetPosAndBounds(targetElm, ui.isPositionedAtTop()));
+ var resizeContent = function (e) {
+ var _a = getTargetPosAndBounds(targetElm, ui.isPositionedAtTop()), pos = _a.pos, bounds = _a.bounds;
+ var _b = prevPosAndBounds.get(), prevPos = _b.pos, prevBounds = _b.bounds;
+ var hasResized = bounds.height !== prevBounds.height || bounds.width !== prevBounds.width;
+ prevPosAndBounds.set({
+ pos: pos,
+ bounds: bounds
+ });
+ if (hasResized) {
+ fireResizeContent(editor, e);
+ }
+ if (ui.isVisible()) {
+ if (prevPos !== pos) {
+ ui.update(true);
+ } else if (hasResized) {
+ ui.updateMode();
+ ui.repositionPopups();
+ }
+ }
+ };
+ if (!toolbarPersist) {
+ editor.on('activate', ui.show);
+ editor.on('deactivate', ui.hide);
+ }
+ editor.on('SkinLoaded ResizeWindow', function () {
+ return ui.update(true);
+ });
+ editor.on('NodeChange keydown', function (e) {
+ global$2.requestAnimationFrame(function () {
+ return resizeContent(e);
+ });
+ });
+ editor.on('ScrollWindow', function () {
+ return ui.updateMode();
+ });
+ var elementLoad = unbindable();
+ elementLoad.set(capture$1(SugarElement.fromDom(editor.getBody()), 'load', resizeContent));
+ editor.on('remove', function () {
+ elementLoad.clear();
+ });
+ };
+ var render$2 = function (editor, uiComponents, rawUiConfig, backstage, args) {
+ var mothership = uiComponents.mothership, uiMothership = uiComponents.uiMothership, outerContainer = uiComponents.outerContainer;
+ var floatContainer = Cell(null);
+ var targetElm = SugarElement.fromDom(args.targetNode);
+ var ui = InlineHeader(editor, targetElm, uiComponents, backstage, floatContainer);
+ var toolbarPersist = isToolbarPersist(editor);
+ inline(editor);
+ var render = function () {
+ if (floatContainer.get()) {
+ ui.show();
+ return;
+ }
+ floatContainer.set(OuterContainer.getHeader(outerContainer).getOrDie());
+ var uiContainer = getUiContainer(editor);
+ attachSystem(uiContainer, mothership);
+ attachSystem(uiContainer, uiMothership);
+ setToolbar(editor, uiComponents, rawUiConfig, backstage);
+ OuterContainer.setMenubar(outerContainer, identifyMenus(editor, rawUiConfig));
+ ui.show();
+ setupEvents$1(editor, targetElm, ui, toolbarPersist);
+ editor.nodeChanged();
+ };
+ editor.on('show', render);
+ editor.on('hide', ui.hide);
+ if (!toolbarPersist) {
+ editor.on('focus', render);
+ editor.on('blur', ui.hide);
+ }
+ editor.on('init', function () {
+ if (editor.hasFocus() || toolbarPersist) {
+ render();
+ }
+ });
+ setupReadonlyModeSwitch(editor, uiComponents);
+ var api = {
+ show: function () {
+ ui.show();
+ },
+ hide: function () {
+ ui.hide();
+ },
+ enable: function () {
+ broadcastReadonly(uiComponents, false);
+ },
+ disable: function () {
+ broadcastReadonly(uiComponents, true);
+ },
+ isDisabled: function () {
+ return Disabling.isDisabled(outerContainer);
+ }
+ };
+ return {
+ editorContainer: outerContainer.element.dom,
+ api: api
+ };
+ };
+
+ var Inline = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ render: render$2
+ });
+
+ var register$5 = function (editor) {
+ var alignToolbarButtons = [
+ {
+ name: 'alignleft',
+ text: 'Align left',
+ cmd: 'JustifyLeft',
+ icon: 'align-left'
+ },
+ {
+ name: 'aligncenter',
+ text: 'Align center',
+ cmd: 'JustifyCenter',
+ icon: 'align-center'
+ },
+ {
+ name: 'alignright',
+ text: 'Align right',
+ cmd: 'JustifyRight',
+ icon: 'align-right'
+ },
+ {
+ name: 'alignjustify',
+ text: 'Justify',
+ cmd: 'JustifyFull',
+ icon: 'align-justify'
+ }
+ ];
+ global$c.each(alignToolbarButtons, function (item) {
+ editor.ui.registry.addToggleButton(item.name, {
+ tooltip: item.text,
+ onAction: function () {
+ return editor.execCommand(item.cmd);
+ },
+ icon: item.icon,
+ onSetup: onSetupFormatToggle(editor, item.name)
+ });
+ });
+ var alignNoneToolbarButton = {
+ name: 'alignnone',
+ text: 'No alignment',
+ cmd: 'JustifyNone',
+ icon: 'align-none'
+ };
+ editor.ui.registry.addButton(alignNoneToolbarButton.name, {
+ tooltip: alignNoneToolbarButton.text,
+ onAction: function () {
+ return editor.execCommand(alignNoneToolbarButton.cmd);
+ },
+ icon: alignNoneToolbarButton.icon
+ });
+ };
+
+ var register$6 = function (editor, backstage) {
+ alignSelectMenu(editor, backstage);
+ fontSelectMenu(editor, backstage);
+ styleSelectMenu(editor, backstage);
+ formatSelectMenu(editor, backstage);
+ fontsizeSelectMenu(editor, backstage);
+ };
+
+ var toggleOutdentState = function (api, editor) {
+ api.setDisabled(!editor.queryCommandState('outdent'));
+ var onNodeChange = function () {
+ api.setDisabled(!editor.queryCommandState('outdent'));
+ };
+ editor.on('NodeChange', onNodeChange);
+ return function () {
+ return editor.off('NodeChange', onNodeChange);
+ };
+ };
+ var registerButtons = function (editor) {
+ editor.ui.registry.addButton('outdent', {
+ tooltip: 'Decrease indent',
+ icon: 'outdent',
+ onSetup: function (api) {
+ return toggleOutdentState(api, editor);
+ },
+ onAction: function () {
+ return editor.execCommand('outdent');
+ }
+ });
+ editor.ui.registry.addButton('indent', {
+ tooltip: 'Increase indent',
+ icon: 'indent',
+ onAction: function () {
+ return editor.execCommand('indent');
+ }
+ });
+ };
+ var register$7 = function (editor) {
+ registerButtons(editor);
+ };
+
+ var units = {
+ unsupportedLength: [
+ 'em',
+ 'ex',
+ 'cap',
+ 'ch',
+ 'ic',
+ 'rem',
+ 'lh',
+ 'rlh',
+ 'vw',
+ 'vh',
+ 'vi',
+ 'vb',
+ 'vmin',
+ 'vmax',
+ 'cm',
+ 'mm',
+ 'Q',
+ 'in',
+ 'pc',
+ 'pt',
+ 'px'
+ ],
+ fixed: [
+ 'px',
+ 'pt'
+ ],
+ relative: ['%'],
+ empty: ['']
+ };
+ var pattern = function () {
+ var decimalDigits = '[0-9]+';
+ var signedInteger = '[+-]?' + decimalDigits;
+ var exponentPart = '[eE]' + signedInteger;
+ var dot = '\\.';
+ var opt = function (input) {
+ return '(?:' + input + ')?';
+ };
+ var unsignedDecimalLiteral = [
+ 'Infinity',
+ decimalDigits + dot + opt(decimalDigits) + opt(exponentPart),
+ dot + decimalDigits + opt(exponentPart),
+ decimalDigits + opt(exponentPart)
+ ].join('|');
+ var float = '[+-]?(?:' + unsignedDecimalLiteral + ')';
+ return new RegExp('^(' + float + ')(.*)$');
+ }();
+ var isUnit = function (unit, accepted) {
+ return exists(accepted, function (acc) {
+ return exists(units[acc], function (check) {
+ return unit === check;
+ });
+ });
+ };
+ var parse = function (input, accepted) {
+ var match = Optional.from(pattern.exec(input));
+ return match.bind(function (array) {
+ var value = Number(array[1]);
+ var unitRaw = array[2];
+ if (isUnit(unitRaw, accepted)) {
+ return Optional.some({
+ value: value,
+ unit: unitRaw
+ });
+ } else {
+ return Optional.none();
+ }
+ });
+ };
+ var normalise = function (input, accepted) {
+ return parse(input, accepted).map(function (_a) {
+ var value = _a.value, unit = _a.unit;
+ return value + unit;
+ });
+ };
+
+ var normaliseLineHeight = function (input) {
+ return normalise(input, [
+ 'fixed',
+ 'relative',
+ 'empty'
+ ]).getOr(input);
+ };
+ var getLineHeights = function (editor) {
+ var options = getLineHeightFormats(editor);
+ var apis = new Map();
+ var lastApi = destroyable();
+ var callback = function () {
+ var current = normaliseLineHeight(editor.queryCommandValue('LineHeight'));
+ Optional.from(apis.get(current)).fold(function () {
+ return lastApi.clear();
+ }, function (api) {
+ lastApi.set({
+ destroy: function () {
+ api.setActive(false);
+ }
+ });
+ api.setActive(true);
+ });
+ };
+ editor.on('nodeChange', callback);
+ return map(options, function (value, i) {
+ return {
+ type: 'togglemenuitem',
+ text: value,
+ onSetup: function (api) {
+ apis.set(normaliseLineHeight(value), api);
+ if (i + 1 === options.length) {
+ callback();
+ }
+ return function () {
+ if (i === 0) {
+ editor.off('nodeChange', callback);
+ lastApi.clear();
+ }
+ };
+ },
+ onAction: function () {
+ return editor.execCommand('LineHeight', false, value);
+ }
+ };
+ });
+ };
+ var registerMenuItems = function (editor) {
+ editor.ui.registry.addNestedMenuItem('lineheight', {
+ type: 'nestedmenuitem',
+ text: 'Line height',
+ getSubmenuItems: function () {
+ return getLineHeights(editor);
+ }
+ });
+ };
+ var registerButtons$1 = function (editor) {
+ editor.ui.registry.addMenuButton('lineheight', {
+ tooltip: 'Line height',
+ icon: 'line-height',
+ fetch: function (callback) {
+ return callback(getLineHeights(editor));
+ }
+ });
+ };
+ var register$8 = function (editor) {
+ registerMenuItems(editor);
+ registerButtons$1(editor);
+ };
+
+ var toggleFormat = function (editor, fmt) {
+ return function () {
+ editor.execCommand('mceToggleFormat', false, fmt);
+ };
+ };
+ var registerFormatButtons = function (editor) {
+ global$c.each([
+ {
+ name: 'bold',
+ text: 'Bold',
+ icon: 'bold'
+ },
+ {
+ name: 'italic',
+ text: 'Italic',
+ icon: 'italic'
+ },
+ {
+ name: 'underline',
+ text: 'Underline',
+ icon: 'underline'
+ },
+ {
+ name: 'strikethrough',
+ text: 'Strikethrough',
+ icon: 'strike-through'
+ },
+ {
+ name: 'subscript',
+ text: 'Subscript',
+ icon: 'subscript'
+ },
+ {
+ name: 'superscript',
+ text: 'Superscript',
+ icon: 'superscript'
+ }
+ ], function (btn, _idx) {
+ editor.ui.registry.addToggleButton(btn.name, {
+ tooltip: btn.text,
+ icon: btn.icon,
+ onSetup: onSetupFormatToggle(editor, btn.name),
+ onAction: toggleFormat(editor, btn.name)
+ });
+ });
+ for (var i = 1; i <= 6; i++) {
+ var name_1 = 'h' + i;
+ editor.ui.registry.addToggleButton(name_1, {
+ text: name_1.toUpperCase(),
+ tooltip: 'Heading ' + i,
+ onSetup: onSetupFormatToggle(editor, name_1),
+ onAction: toggleFormat(editor, name_1)
+ });
+ }
+ };
+ var registerCommandButtons = function (editor) {
+ global$c.each([
+ {
+ name: 'cut',
+ text: 'Cut',
+ action: 'Cut',
+ icon: 'cut'
+ },
+ {
+ name: 'copy',
+ text: 'Copy',
+ action: 'Copy',
+ icon: 'copy'
+ },
+ {
+ name: 'paste',
+ text: 'Paste',
+ action: 'Paste',
+ icon: 'paste'
+ },
+ {
+ name: 'help',
+ text: 'Help',
+ action: 'mceHelp',
+ icon: 'help'
+ },
+ {
+ name: 'selectall',
+ text: 'Select all',
+ action: 'SelectAll',
+ icon: 'select-all'
+ },
+ {
+ name: 'newdocument',
+ text: 'New document',
+ action: 'mceNewDocument',
+ icon: 'new-document'
+ },
+ {
+ name: 'removeformat',
+ text: 'Clear formatting',
+ action: 'RemoveFormat',
+ icon: 'remove-formatting'
+ },
+ {
+ name: 'remove',
+ text: 'Remove',
+ action: 'Delete',
+ icon: 'remove'
+ }
+ ], function (btn) {
+ editor.ui.registry.addButton(btn.name, {
+ tooltip: btn.text,
+ icon: btn.icon,
+ onAction: function () {
+ return editor.execCommand(btn.action);
+ }
+ });
+ });
+ };
+ var registerCommandToggleButtons = function (editor) {
+ global$c.each([{
+ name: 'blockquote',
+ text: 'Blockquote',
+ action: 'mceBlockQuote',
+ icon: 'quote'
+ }], function (btn) {
+ editor.ui.registry.addToggleButton(btn.name, {
+ tooltip: btn.text,
+ icon: btn.icon,
+ onAction: function () {
+ return editor.execCommand(btn.action);
+ },
+ onSetup: onSetupFormatToggle(editor, btn.name)
+ });
+ });
+ };
+ var registerButtons$2 = function (editor) {
+ registerFormatButtons(editor);
+ registerCommandButtons(editor);
+ registerCommandToggleButtons(editor);
+ };
+ var registerMenuItems$1 = function (editor) {
+ global$c.each([
+ {
+ name: 'bold',
+ text: 'Bold',
+ action: 'Bold',
+ icon: 'bold',
+ shortcut: 'Meta+B'
+ },
+ {
+ name: 'italic',
+ text: 'Italic',
+ action: 'Italic',
+ icon: 'italic',
+ shortcut: 'Meta+I'
+ },
+ {
+ name: 'underline',
+ text: 'Underline',
+ action: 'Underline',
+ icon: 'underline',
+ shortcut: 'Meta+U'
+ },
+ {
+ name: 'strikethrough',
+ text: 'Strikethrough',
+ action: 'Strikethrough',
+ icon: 'strike-through',
+ shortcut: ''
+ },
+ {
+ name: 'subscript',
+ text: 'Subscript',
+ action: 'Subscript',
+ icon: 'subscript',
+ shortcut: ''
+ },
+ {
+ name: 'superscript',
+ text: 'Superscript',
+ action: 'Superscript',
+ icon: 'superscript',
+ shortcut: ''
+ },
+ {
+ name: 'removeformat',
+ text: 'Clear formatting',
+ action: 'RemoveFormat',
+ icon: 'remove-formatting',
+ shortcut: ''
+ },
+ {
+ name: 'newdocument',
+ text: 'New document',
+ action: 'mceNewDocument',
+ icon: 'new-document',
+ shortcut: ''
+ },
+ {
+ name: 'cut',
+ text: 'Cut',
+ action: 'Cut',
+ icon: 'cut',
+ shortcut: 'Meta+X'
+ },
+ {
+ name: 'copy',
+ text: 'Copy',
+ action: 'Copy',
+ icon: 'copy',
+ shortcut: 'Meta+C'
+ },
+ {
+ name: 'paste',
+ text: 'Paste',
+ action: 'Paste',
+ icon: 'paste',
+ shortcut: 'Meta+V'
+ },
+ {
+ name: 'selectall',
+ text: 'Select all',
+ action: 'SelectAll',
+ icon: 'select-all',
+ shortcut: 'Meta+A'
+ }
+ ], function (btn) {
+ editor.ui.registry.addMenuItem(btn.name, {
+ text: btn.text,
+ icon: btn.icon,
+ shortcut: btn.shortcut,
+ onAction: function () {
+ return editor.execCommand(btn.action);
+ }
+ });
+ });
+ editor.ui.registry.addMenuItem('codeformat', {
+ text: 'Code',
+ icon: 'sourcecode',
+ onAction: toggleFormat(editor, 'code')
+ });
+ };
+ var register$9 = function (editor) {
+ registerButtons$2(editor);
+ registerMenuItems$1(editor);
+ };
+
+ var toggleUndoRedoState = function (api, editor, type) {
+ var checkState = function () {
+ return editor.undoManager ? editor.undoManager[type]() : false;
+ };
+ var onUndoStateChange = function () {
+ api.setDisabled(editor.mode.isReadOnly() || !checkState());
+ };
+ api.setDisabled(!checkState());
+ editor.on('Undo Redo AddUndo TypingUndo ClearUndos SwitchMode', onUndoStateChange);
+ return function () {
+ return editor.off('Undo Redo AddUndo TypingUndo ClearUndos SwitchMode', onUndoStateChange);
+ };
+ };
+ var registerMenuItems$2 = function (editor) {
+ editor.ui.registry.addMenuItem('undo', {
+ text: 'Undo',
+ icon: 'undo',
+ shortcut: 'Meta+Z',
+ onSetup: function (api) {
+ return toggleUndoRedoState(api, editor, 'hasUndo');
+ },
+ onAction: function () {
+ return editor.execCommand('undo');
+ }
+ });
+ editor.ui.registry.addMenuItem('redo', {
+ text: 'Redo',
+ icon: 'redo',
+ shortcut: 'Meta+Y',
+ onSetup: function (api) {
+ return toggleUndoRedoState(api, editor, 'hasRedo');
+ },
+ onAction: function () {
+ return editor.execCommand('redo');
+ }
+ });
+ };
+ var registerButtons$3 = function (editor) {
+ editor.ui.registry.addButton('undo', {
+ tooltip: 'Undo',
+ icon: 'undo',
+ onSetup: function (api) {
+ return toggleUndoRedoState(api, editor, 'hasUndo');
+ },
+ onAction: function () {
+ return editor.execCommand('undo');
+ }
+ });
+ editor.ui.registry.addButton('redo', {
+ tooltip: 'Redo',
+ icon: 'redo',
+ onSetup: function (api) {
+ return toggleUndoRedoState(api, editor, 'hasRedo');
+ },
+ onAction: function () {
+ return editor.execCommand('redo');
+ }
+ });
+ };
+ var register$a = function (editor) {
+ registerMenuItems$2(editor);
+ registerButtons$3(editor);
+ };
+
+ var toggleVisualAidState = function (api, editor) {
+ api.setActive(editor.hasVisual);
+ var onVisualAid = function (e) {
+ api.setActive(e.hasVisual);
+ };
+ editor.on('VisualAid', onVisualAid);
+ return function () {
+ return editor.off('VisualAid', onVisualAid);
+ };
+ };
+ var registerMenuItems$3 = function (editor) {
+ editor.ui.registry.addToggleMenuItem('visualaid', {
+ text: 'Visual aids',
+ onSetup: function (api) {
+ return toggleVisualAidState(api, editor);
+ },
+ onAction: function () {
+ editor.execCommand('mceToggleVisualAid');
+ }
+ });
+ };
+ var registerToolbarButton = function (editor) {
+ editor.ui.registry.addButton('visualaid', {
+ tooltip: 'Visual aids',
+ text: 'Visual aids',
+ onAction: function () {
+ return editor.execCommand('mceToggleVisualAid');
+ }
+ });
+ };
+ var register$b = function (editor) {
+ registerToolbarButton(editor);
+ registerMenuItems$3(editor);
+ };
+
+ var setup$8 = function (editor, backstage) {
+ register$5(editor);
+ register$9(editor);
+ register$6(editor, backstage);
+ register$a(editor);
+ register$1(editor);
+ register$b(editor);
+ register$7(editor);
+ register$8(editor);
+ };
+
+ var nu$d = function (x, y) {
+ return {
+ anchor: 'makeshift',
+ x: x,
+ y: y
+ };
+ };
+ var transpose$1 = function (pos, dx, dy) {
+ return nu$d(pos.x + dx, pos.y + dy);
+ };
+ var isTouchEvent$1 = function (e) {
+ return e.type === 'longpress' || e.type.indexOf('touch') === 0;
+ };
+ var fromPageXY = function (e) {
+ if (isTouchEvent$1(e)) {
+ var touch = e.touches[0];
+ return nu$d(touch.pageX, touch.pageY);
+ } else {
+ return nu$d(e.pageX, e.pageY);
+ }
+ };
+ var fromClientXY = function (e) {
+ if (isTouchEvent$1(e)) {
+ var touch = e.touches[0];
+ return nu$d(touch.clientX, touch.clientY);
+ } else {
+ return nu$d(e.clientX, e.clientY);
+ }
+ };
+ var transposeContentAreaContainer = function (element, pos) {
+ var containerPos = global$5.DOM.getPos(element);
+ return transpose$1(pos, containerPos.x, containerPos.y);
+ };
+ var getPointAnchor = function (editor, e) {
+ if (e.type === 'contextmenu' || e.type === 'longpress') {
+ if (editor.inline) {
+ return fromPageXY(e);
+ } else {
+ return transposeContentAreaContainer(editor.getContentAreaContainer(), fromClientXY(e));
+ }
+ } else {
+ return getSelectionAnchor(editor);
+ }
+ };
+ var getSelectionAnchor = function (editor) {
+ return {
+ anchor: 'selection',
+ root: SugarElement.fromDom(editor.selection.getNode())
+ };
+ };
+ var getNodeAnchor$1 = function (editor) {
+ return {
+ anchor: 'node',
+ node: Optional.some(SugarElement.fromDom(editor.selection.getNode())),
+ root: SugarElement.fromDom(editor.getBody())
+ };
+ };
+
+ var initAndShow = function (editor, e, buildMenu, backstage, contextmenu, useNodeAnchor) {
+ var items = buildMenu();
+ var anchorSpec = useNodeAnchor ? getNodeAnchor$1(editor) : getPointAnchor(editor, e);
+ build$2(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, false).map(function (menuData) {
+ e.preventDefault();
+ InlineView.showMenuAt(contextmenu, anchorSpec, {
+ menu: { markers: markers$1('normal') },
+ data: menuData
+ });
+ });
+ };
+
+ var layouts = {
+ onLtr: function () {
+ return [
+ south$1,
+ southeast$1,
+ southwest$1,
+ northeast$1,
+ northwest$1,
+ north$1,
+ north$3,
+ south$3,
+ northeast$3,
+ southeast$3,
+ northwest$3,
+ southwest$3
+ ];
+ },
+ onRtl: function () {
+ return [
+ south$1,
+ southwest$1,
+ southeast$1,
+ northwest$1,
+ northeast$1,
+ north$1,
+ north$3,
+ south$3,
+ northwest$3,
+ southwest$3,
+ northeast$3,
+ southeast$3
+ ];
+ }
+ };
+ var bubbleSize$1 = 12;
+ var bubbleAlignments$2 = {
+ valignCentre: [],
+ alignCentre: [],
+ alignLeft: ['tox-pop--align-left'],
+ alignRight: ['tox-pop--align-right'],
+ right: ['tox-pop--right'],
+ left: ['tox-pop--left'],
+ bottom: ['tox-pop--bottom'],
+ top: ['tox-pop--top']
+ };
+ var isTouchWithinSelection = function (editor, e) {
+ var selection = editor.selection;
+ if (selection.isCollapsed() || e.touches.length < 1) {
+ return false;
+ } else {
+ var touch_1 = e.touches[0];
+ var rng = selection.getRng();
+ var rngRectOpt = getFirstRect$1(editor.getWin(), SimSelection.domRange(rng));
+ return rngRectOpt.exists(function (rngRect) {
+ return rngRect.left <= touch_1.clientX && rngRect.right >= touch_1.clientX && rngRect.top <= touch_1.clientY && rngRect.bottom >= touch_1.clientY;
+ });
+ }
+ };
+ var getPointAnchorSpec = function (editor, e) {
+ return __assign({
+ bubble: nu$8(0, bubbleSize$1, bubbleAlignments$2),
+ layouts: layouts,
+ overrides: {
+ maxWidthFunction: expandable$1(),
+ maxHeightFunction: expandable()
+ }
+ }, getPointAnchor(editor, e));
+ };
+ var setupiOSOverrides = function (editor) {
+ var originalSelection = editor.selection.getRng();
+ var selectionReset = function () {
+ global$2.setEditorTimeout(editor, function () {
+ editor.selection.setRng(originalSelection);
+ }, 10);
+ unbindEventListeners();
+ };
+ editor.once('touchend', selectionReset);
+ var preventMousedown = function (e) {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ };
+ editor.on('mousedown', preventMousedown, true);
+ var clearSelectionReset = function () {
+ return unbindEventListeners();
+ };
+ editor.once('longpresscancel', clearSelectionReset);
+ var unbindEventListeners = function () {
+ editor.off('touchend', selectionReset);
+ editor.off('longpresscancel', clearSelectionReset);
+ editor.off('mousedown', preventMousedown);
+ };
+ };
+ var show = function (editor, e, items, backstage, contextmenu, useNodeAnchor, highlightImmediately) {
+ var anchorSpec = useNodeAnchor ? getNodeAnchor$1(editor) : getPointAnchorSpec(editor, e);
+ build$2(items, ItemResponse$1.CLOSE_ON_EXECUTE, backstage, true).map(function (menuData) {
+ e.preventDefault();
+ InlineView.showMenuWithinBounds(contextmenu, anchorSpec, {
+ menu: {
+ markers: markers$1('normal'),
+ highlightImmediately: highlightImmediately
+ },
+ data: menuData,
+ type: 'horizontal'
+ }, function () {
+ return Optional.some(getContextToolbarBounds(editor, backstage.shared));
+ });
+ editor.fire(hideContextToolbarEvent);
+ });
+ };
+ var initAndShow$1 = function (editor, e, buildMenu, backstage, contextmenu, useNodeAnchor) {
+ var detection = detect$3();
+ var isiOS = detection.os.isiOS();
+ var isOSX = detection.os.isOSX();
+ var isAndroid = detection.os.isAndroid();
+ var isTouch = detection.deviceType.isTouch();
+ var shouldHighlightImmediately = function () {
+ return !(isAndroid || isiOS || isOSX && isTouch);
+ };
+ var open = function () {
+ var items = buildMenu();
+ show(editor, e, items, backstage, contextmenu, useNodeAnchor, shouldHighlightImmediately());
+ };
+ if ((isOSX || isiOS) && !useNodeAnchor) {
+ var openiOS_1 = function () {
+ setupiOSOverrides(editor);
+ open();
+ };
+ if (isTouchWithinSelection(editor, e)) {
+ openiOS_1();
+ } else {
+ editor.once('selectionchange', openiOS_1);
+ editor.once('touchend', function () {
+ return editor.off('selectionchange', openiOS_1);
+ });
+ }
+ } else {
+ if (isAndroid && !useNodeAnchor) {
+ editor.selection.setCursorLocation(e.target, 0);
+ }
+ open();
+ }
+ };
+
+ var patchPipeConfig = function (config) {
+ return typeof config === 'string' ? config.split(/[ ,]/) : config;
+ };
+ var shouldNeverUseNative = function (editor) {
+ return editor.getParam('contextmenu_never_use_native', false, 'boolean');
+ };
+ var getMenuItems = function (editor, name, defaultItems) {
+ var contextMenus = editor.ui.registry.getAll().contextMenus;
+ return Optional.from(editor.getParam(name)).map(patchPipeConfig).getOrThunk(function () {
+ return filter(patchPipeConfig(defaultItems), function (item) {
+ return has(contextMenus, item);
+ });
+ });
+ };
+ var isContextMenuDisabled = function (editor) {
+ return editor.getParam('contextmenu') === false;
+ };
+ var getContextMenu = function (editor) {
+ return getMenuItems(editor, 'contextmenu', 'link linkchecker image imagetools table spellchecker configurepermanentpen');
+ };
+ var getAvoidOverlapSelector = function (editor) {
+ return editor.getParam('contextmenu_avoid_overlap', '', 'string');
+ };
+
+ var isSeparator$1 = function (item) {
+ return isString(item) ? item === '|' : item.type === 'separator';
+ };
+ var separator$3 = { type: 'separator' };
+ var makeContextItem = function (item) {
+ if (isString(item)) {
+ return item;
+ } else {
+ switch (item.type) {
+ case 'separator':
+ return separator$3;
+ case 'submenu':
+ return {
+ type: 'nestedmenuitem',
+ text: item.text,
+ icon: item.icon,
+ getSubmenuItems: function () {
+ var items = item.getSubmenuItems();
+ if (isString(items)) {
+ return items;
+ } else {
+ return map(items, makeContextItem);
+ }
+ }
+ };
+ default:
+ return {
+ type: 'menuitem',
+ text: item.text,
+ icon: item.icon,
+ onAction: noarg(item.onAction)
+ };
+ }
+ }
+ };
+ var addContextMenuGroup = function (xs, groupItems) {
+ if (groupItems.length === 0) {
+ return xs;
+ }
+ var lastMenuItem = last(xs).filter(function (item) {
+ return !isSeparator$1(item);
+ });
+ var before = lastMenuItem.fold(function () {
+ return [];
+ }, function (_) {
+ return [separator$3];
+ });
+ return xs.concat(before).concat(groupItems).concat([separator$3]);
+ };
+ var generateContextMenu = function (contextMenus, menuConfig, selectedElement) {
+ var sections = foldl(menuConfig, function (acc, name) {
+ if (has(contextMenus, name)) {
+ var items = contextMenus[name].update(selectedElement);
+ if (isString(items)) {
+ return addContextMenuGroup(acc, items.split(' '));
+ } else if (items.length > 0) {
+ var allItems = map(items, makeContextItem);
+ return addContextMenuGroup(acc, allItems);
+ } else {
+ return acc;
+ }
+ } else {
+ return acc.concat([name]);
+ }
+ }, []);
+ if (sections.length > 0 && isSeparator$1(sections[sections.length - 1])) {
+ sections.pop();
+ }
+ return sections;
+ };
+ var isNativeOverrideKeyEvent = function (editor, e) {
+ return e.ctrlKey && !shouldNeverUseNative(editor);
+ };
+ var isTriggeredByKeyboard = function (editor, e) {
+ return e.type !== 'longpress' && (e.button !== 2 || e.target === editor.getBody() && e.pointerType === '');
+ };
+ var getSelectedElement = function (editor, e) {
+ return isTriggeredByKeyboard(editor, e) ? editor.selection.getStart(true) : e.target;
+ };
+ var shouldUseNodeAnchor = function (editor, e) {
+ var selector = getAvoidOverlapSelector(editor);
+ if (isTriggeredByKeyboard(editor, e)) {
+ return true;
+ } else if (selector) {
+ var target = getSelectedElement(editor, e);
+ return closest$4(SugarElement.fromDom(target), selector);
+ } else {
+ return false;
+ }
+ };
+ var setup$9 = function (editor, lazySink, backstage) {
+ var detection = detect$3();
+ var isTouch = detection.deviceType.isTouch;
+ var contextmenu = build$1(InlineView.sketch({
+ dom: { tag: 'div' },
+ lazySink: lazySink,
+ onEscape: function () {
+ return editor.focus();
+ },
+ onShow: function () {
+ return backstage.setContextMenuState(true);
+ },
+ onHide: function () {
+ return backstage.setContextMenuState(false);
+ },
+ fireDismissalEventInstead: {},
+ inlineBehaviours: derive$1([config('dismissContextMenu', [run(dismissRequested(), function (comp, _se) {
+ Sandboxing.close(comp);
+ editor.focus();
+ })])])
+ }));
+ var hideContextMenu = function (_e) {
+ return InlineView.hide(contextmenu);
+ };
+ var showContextMenu = function (e) {
+ if (shouldNeverUseNative(editor)) {
+ e.preventDefault();
+ }
+ if (isNativeOverrideKeyEvent(editor, e) || isContextMenuDisabled(editor)) {
+ return;
+ }
+ var useNodeAnchor = shouldUseNodeAnchor(editor, e);
+ var buildMenu = function () {
+ var selectedElement = getSelectedElement(editor, e);
+ var registry = editor.ui.registry.getAll();
+ var menuConfig = getContextMenu(editor);
+ return generateContextMenu(registry.contextMenus, menuConfig, selectedElement);
+ };
+ var initAndShow$2 = isTouch() ? initAndShow$1 : initAndShow;
+ initAndShow$2(editor, e, buildMenu, backstage, contextmenu, useNodeAnchor);
+ };
+ editor.on('init', function () {
+ var hideEvents = 'ResizeEditor ScrollContent ScrollWindow longpresscancel' + (isTouch() ? '' : ' ResizeWindow');
+ editor.on(hideEvents, hideContextMenu);
+ editor.on('longpress contextmenu', showContextMenu);
+ });
+ };
+
+ var adt$c = Adt.generate([
+ {
+ offset: [
+ 'x',
+ 'y'
+ ]
+ },
+ {
+ absolute: [
+ 'x',
+ 'y'
+ ]
+ },
+ {
+ fixed: [
+ 'x',
+ 'y'
+ ]
+ }
+ ]);
+ var subtract = function (change) {
+ return function (point) {
+ return point.translate(-change.left, -change.top);
+ };
+ };
+ var add$4 = function (change) {
+ return function (point) {
+ return point.translate(change.left, change.top);
+ };
+ };
+ var transform$1 = function (changes) {
+ return function (x, y) {
+ return foldl(changes, function (rest, f) {
+ return f(rest);
+ }, SugarPosition(x, y));
+ };
+ };
+ var asFixed = function (coord, scroll, origin) {
+ return coord.fold(transform$1([
+ add$4(origin),
+ subtract(scroll)
+ ]), transform$1([subtract(scroll)]), transform$1([]));
+ };
+ var asAbsolute = function (coord, scroll, origin) {
+ return coord.fold(transform$1([add$4(origin)]), transform$1([]), transform$1([add$4(scroll)]));
+ };
+ var asOffset = function (coord, scroll, origin) {
+ return coord.fold(transform$1([]), transform$1([subtract(origin)]), transform$1([
+ add$4(scroll),
+ subtract(origin)
+ ]));
+ };
+ var withinRange = function (coord1, coord2, xRange, yRange, scroll, origin) {
+ var a1 = asAbsolute(coord1, scroll, origin);
+ var a2 = asAbsolute(coord2, scroll, origin);
+ return Math.abs(a1.left - a2.left) <= xRange && Math.abs(a1.top - a2.top) <= yRange;
+ };
+ var getDeltas = function (coord1, coord2, xRange, yRange, scroll, origin) {
+ var a1 = asAbsolute(coord1, scroll, origin);
+ var a2 = asAbsolute(coord2, scroll, origin);
+ var left = Math.abs(a1.left - a2.left);
+ var top = Math.abs(a1.top - a2.top);
+ return SugarPosition(left, top);
+ };
+ var toStyles = function (coord, scroll, origin) {
+ var stylesOpt = coord.fold(function (x, y) {
+ return {
+ position: Optional.some('absolute'),
+ left: Optional.some(x + 'px'),
+ top: Optional.some(y + 'px')
+ };
+ }, function (x, y) {
+ return {
+ position: Optional.some('absolute'),
+ left: Optional.some(x - origin.left + 'px'),
+ top: Optional.some(y - origin.top + 'px')
+ };
+ }, function (x, y) {
+ return {
+ position: Optional.some('fixed'),
+ left: Optional.some(x + 'px'),
+ top: Optional.some(y + 'px')
+ };
+ });
+ return __assign({
+ right: Optional.none(),
+ bottom: Optional.none()
+ }, stylesOpt);
+ };
+ var translate$2 = function (coord, deltaX, deltaY) {
+ return coord.fold(function (x, y) {
+ return offset(x + deltaX, y + deltaY);
+ }, function (x, y) {
+ return absolute$3(x + deltaX, y + deltaY);
+ }, function (x, y) {
+ return fixed$1(x + deltaX, y + deltaY);
+ });
+ };
+ var absorb = function (partialCoord, originalCoord, scroll, origin) {
+ var absorbOne = function (stencil, nu) {
+ return function (optX, optY) {
+ var original = stencil(originalCoord, scroll, origin);
+ return nu(optX.getOr(original.left), optY.getOr(original.top));
+ };
+ };
+ return partialCoord.fold(absorbOne(asOffset, offset), absorbOne(asAbsolute, absolute$3), absorbOne(asFixed, fixed$1));
+ };
+ var offset = adt$c.offset;
+ var absolute$3 = adt$c.absolute;
+ var fixed$1 = adt$c.fixed;
+
+ var parseAttrToInt = function (element, name) {
+ var value = get$3(element, name);
+ return isUndefined(value) ? NaN : parseInt(value, 10);
+ };
+ var get$f = function (component, snapsInfo) {
+ var element = component.element;
+ var x = parseAttrToInt(element, snapsInfo.leftAttr);
+ var y = parseAttrToInt(element, snapsInfo.topAttr);
+ return isNaN(x) || isNaN(y) ? Optional.none() : Optional.some(SugarPosition(x, y));
+ };
+ var set$8 = function (component, snapsInfo, pt) {
+ var element = component.element;
+ set$1(element, snapsInfo.leftAttr, pt.left + 'px');
+ set$1(element, snapsInfo.topAttr, pt.top + 'px');
+ };
+ var clear = function (component, snapsInfo) {
+ var element = component.element;
+ remove$1(element, snapsInfo.leftAttr);
+ remove$1(element, snapsInfo.topAttr);
+ };
+
+ var getCoords = function (component, snapInfo, coord, delta) {
+ return get$f(component, snapInfo).fold(function () {
+ return coord;
+ }, function (fixed) {
+ return fixed$1(fixed.left + delta.left, fixed.top + delta.top);
+ });
+ };
+ var moveOrSnap = function (component, snapInfo, coord, delta, scroll, origin) {
+ var newCoord = getCoords(component, snapInfo, coord, delta);
+ var snap = snapInfo.mustSnap ? findClosestSnap(component, snapInfo, newCoord, scroll, origin) : findSnap(component, snapInfo, newCoord, scroll, origin);
+ var fixedCoord = asFixed(newCoord, scroll, origin);
+ set$8(component, snapInfo, fixedCoord);
+ return snap.fold(function () {
+ return {
+ coord: fixed$1(fixedCoord.left, fixedCoord.top),
+ extra: Optional.none()
+ };
+ }, function (spanned) {
+ return {
+ coord: spanned.output,
+ extra: spanned.extra
+ };
+ });
+ };
+ var stopDrag = function (component, snapInfo) {
+ clear(component, snapInfo);
+ };
+ var findMatchingSnap = function (snaps, newCoord, scroll, origin) {
+ return findMap(snaps, function (snap) {
+ var sensor = snap.sensor;
+ var inRange = withinRange(newCoord, sensor, snap.range.left, snap.range.top, scroll, origin);
+ return inRange ? Optional.some({
+ output: absorb(snap.output, newCoord, scroll, origin),
+ extra: snap.extra
+ }) : Optional.none();
+ });
+ };
+ var findClosestSnap = function (component, snapInfo, newCoord, scroll, origin) {
+ var snaps = snapInfo.getSnapPoints(component);
+ var matchSnap = findMatchingSnap(snaps, newCoord, scroll, origin);
+ return matchSnap.orThunk(function () {
+ var bestSnap = foldl(snaps, function (acc, snap) {
+ var sensor = snap.sensor;
+ var deltas = getDeltas(newCoord, sensor, snap.range.left, snap.range.top, scroll, origin);
+ return acc.deltas.fold(function () {
+ return {
+ deltas: Optional.some(deltas),
+ snap: Optional.some(snap)
+ };
+ }, function (bestDeltas) {
+ var currAvg = (deltas.left + deltas.top) / 2;
+ var bestAvg = (bestDeltas.left + bestDeltas.top) / 2;
+ if (currAvg <= bestAvg) {
+ return {
+ deltas: Optional.some(deltas),
+ snap: Optional.some(snap)
+ };
+ } else {
+ return acc;
+ }
+ });
+ }, {
+ deltas: Optional.none(),
+ snap: Optional.none()
+ });
+ return bestSnap.snap.map(function (snap) {
+ return {
+ output: absorb(snap.output, newCoord, scroll, origin),
+ extra: snap.extra
+ };
+ });
+ });
+ };
+ var findSnap = function (component, snapInfo, newCoord, scroll, origin) {
+ var snaps = snapInfo.getSnapPoints(component);
+ return findMatchingSnap(snaps, newCoord, scroll, origin);
+ };
+ var snapTo = function (snap, scroll, origin) {
+ return {
+ coord: absorb(snap.output, snap.output, scroll, origin),
+ extra: snap.extra
+ };
+ };
+
+ var snapTo$1 = function (component, dragConfig, _state, snap) {
+ var target = dragConfig.getTarget(component.element);
+ if (dragConfig.repositionTarget) {
+ var doc = owner(component.element);
+ var scroll_1 = get$9(doc);
+ var origin_1 = getOrigin(target);
+ var snapPin = snapTo(snap, scroll_1, origin_1);
+ var styles = toStyles(snapPin.coord, scroll_1, origin_1);
+ setOptions(target, styles);
+ }
+ };
+
+ var DraggingApis = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ snapTo: snapTo$1
+ });
+
+ var initialAttribute = 'data-initial-z-index';
+ var resetZIndex = function (blocker) {
+ parent(blocker.element).filter(isElement).each(function (root) {
+ getOpt(root, initialAttribute).fold(function () {
+ return remove$6(root, 'z-index');
+ }, function (zIndex) {
+ return set$2(root, 'z-index', zIndex);
+ });
+ remove$1(root, initialAttribute);
+ });
+ };
+ var changeZIndex = function (blocker) {
+ parent(blocker.element).filter(isElement).each(function (root) {
+ getRaw(root, 'z-index').each(function (zindex) {
+ set$1(root, initialAttribute, zindex);
+ });
+ set$2(root, 'z-index', get$5(blocker.element, 'z-index'));
+ });
+ };
+ var instigate = function (anyComponent, blocker) {
+ anyComponent.getSystem().addToGui(blocker);
+ changeZIndex(blocker);
+ };
+ var discard = function (blocker) {
+ resetZIndex(blocker);
+ blocker.getSystem().removeFromGui(blocker);
+ };
+ var createComponent = function (component, blockerClass, blockerEvents) {
+ return component.getSystem().build(Container.sketch({
+ dom: {
+ styles: {
+ 'left': '0px',
+ 'top': '0px',
+ 'width': '100%',
+ 'height': '100%',
+ 'position': 'fixed',
+ 'z-index': '1000000000000000'
+ },
+ classes: [blockerClass]
+ },
+ events: blockerEvents
+ }));
+ };
+
+ var SnapSchema = optionObjOf('snaps', [
+ strict$1('getSnapPoints'),
+ onHandler('onSensor'),
+ strict$1('leftAttr'),
+ strict$1('topAttr'),
+ defaulted$1('lazyViewport', win),
+ defaulted$1('mustSnap', false)
+ ]);
+
+ var schema$t = [
+ defaulted$1('useFixed', never),
+ strict$1('blockerClass'),
+ defaulted$1('getTarget', identity),
+ defaulted$1('onDrag', noop),
+ defaulted$1('repositionTarget', true),
+ defaulted$1('onDrop', noop),
+ defaultedFunction('getBounds', win),
+ SnapSchema
+ ];
+
+ var getCurrentCoord = function (target) {
+ return lift3(getRaw(target, 'left'), getRaw(target, 'top'), getRaw(target, 'position'), function (left, top, position) {
+ var nu = position === 'fixed' ? fixed$1 : offset;
+ return nu(parseInt(left, 10), parseInt(top, 10));
+ }).getOrThunk(function () {
+ var location = absolute(target);
+ return absolute$3(location.left, location.top);
+ });
+ };
+ var clampCoords = function (component, coords, scroll, origin, startData) {
+ var bounds = startData.bounds;
+ var absoluteCoord = asAbsolute(coords, scroll, origin);
+ var newX = clamp(absoluteCoord.left, bounds.x, bounds.x + bounds.width - startData.width);
+ var newY = clamp(absoluteCoord.top, bounds.y, bounds.y + bounds.height - startData.height);
+ var newCoords = absolute$3(newX, newY);
+ return coords.fold(function () {
+ var offset$1 = asOffset(newCoords, scroll, origin);
+ return offset(offset$1.left, offset$1.top);
+ }, function () {
+ return newCoords;
+ }, function () {
+ var fixed = asFixed(newCoords, scroll, origin);
+ return fixed$1(fixed.left, fixed.top);
+ });
+ };
+ var calcNewCoord = function (component, optSnaps, currentCoord, scroll, origin, delta, startData) {
+ var newCoord = optSnaps.fold(function () {
+ var translated = translate$2(currentCoord, delta.left, delta.top);
+ var fixedCoord = asFixed(translated, scroll, origin);
+ return fixed$1(fixedCoord.left, fixedCoord.top);
+ }, function (snapInfo) {
+ var snapping = moveOrSnap(component, snapInfo, currentCoord, delta, scroll, origin);
+ snapping.extra.each(function (extra) {
+ snapInfo.onSensor(component, extra);
+ });
+ return snapping.coord;
+ });
+ return clampCoords(component, newCoord, scroll, origin, startData);
+ };
+ var dragBy = function (component, dragConfig, startData, delta) {
+ var target = dragConfig.getTarget(component.element);
+ if (dragConfig.repositionTarget) {
+ var doc = owner(component.element);
+ var scroll_1 = get$9(doc);
+ var origin_1 = getOrigin(target);
+ var currentCoord = getCurrentCoord(target);
+ var newCoord = calcNewCoord(component, dragConfig.snaps, currentCoord, scroll_1, origin_1, delta, startData);
+ var styles = toStyles(newCoord, scroll_1, origin_1);
+ setOptions(target, styles);
+ }
+ dragConfig.onDrag(component, target, delta);
+ };
+
+ var calcStartData = function (dragConfig, comp) {
+ return {
+ bounds: dragConfig.getBounds(),
+ height: getOuter$1(comp.element),
+ width: getOuter$2(comp.element)
+ };
+ };
+ var move$1 = function (component, dragConfig, dragState, dragMode, event) {
+ var delta = dragState.update(dragMode, event);
+ var dragStartData = dragState.getStartData().getOrThunk(function () {
+ return calcStartData(dragConfig, component);
+ });
+ delta.each(function (dlt) {
+ dragBy(component, dragConfig, dragStartData, dlt);
+ });
+ };
+ var stop = function (component, blocker, dragConfig, dragState) {
+ blocker.each(discard);
+ dragConfig.snaps.each(function (snapInfo) {
+ stopDrag(component, snapInfo);
+ });
+ var target = dragConfig.getTarget(component.element);
+ dragState.reset();
+ dragConfig.onDrop(component, target);
+ };
+ var handlers = function (events) {
+ return function (dragConfig, dragState) {
+ var updateStartState = function (comp) {
+ dragState.setStartData(calcStartData(dragConfig, comp));
+ };
+ return derive(__spreadArrays([run(windowScroll(), function (comp) {
+ dragState.getStartData().each(function () {
+ return updateStartState(comp);
+ });
+ })], events(dragConfig, dragState, updateStartState)));
+ };
+ };
+
+ var init$c = function (dragApi) {
+ return derive([
+ run(mousedown(), dragApi.forceDrop),
+ run(mouseup(), dragApi.drop),
+ run(mousemove(), function (comp, simulatedEvent) {
+ dragApi.move(simulatedEvent.event);
+ }),
+ run(mouseout(), dragApi.delayDrop)
+ ]);
+ };
+
+ var getData$1 = function (event) {
+ return Optional.from(SugarPosition(event.x, event.y));
+ };
+ var getDelta$1 = function (old, nu) {
+ return SugarPosition(nu.left - old.left, nu.top - old.top);
+ };
+
+ var MouseData = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ getData: getData$1,
+ getDelta: getDelta$1
+ });
+
+ var events$g = function (dragConfig, dragState, updateStartState) {
+ return [run(mousedown(), function (component, simulatedEvent) {
+ var raw = simulatedEvent.event.raw;
+ if (raw.button !== 0) {
+ return;
+ }
+ simulatedEvent.stop();
+ var stop$1 = function () {
+ return stop(component, Optional.some(blocker), dragConfig, dragState);
+ };
+ var delayDrop = DelayedFunction(stop$1, 200);
+ var dragApi = {
+ drop: stop$1,
+ delayDrop: delayDrop.schedule,
+ forceDrop: stop$1,
+ move: function (event) {
+ delayDrop.cancel();
+ move$1(component, dragConfig, dragState, MouseData, event);
+ }
+ };
+ var blocker = createComponent(component, dragConfig.blockerClass, init$c(dragApi));
+ var start = function () {
+ updateStartState(component);
+ instigate(component, blocker);
+ };
+ start();
+ })];
+ };
+ var schema$u = __spreadArrays(schema$t, [output('dragger', { handlers: handlers(events$g) })]);
+
+ var init$d = function (dragApi) {
+ return derive([
+ run(touchstart(), dragApi.forceDrop),
+ run(touchend(), dragApi.drop),
+ run(touchcancel(), dragApi.drop),
+ run(touchmove(), function (comp, simulatedEvent) {
+ dragApi.move(simulatedEvent.event);
+ })
+ ]);
+ };
+
+ var getDataFrom = function (touches) {
+ var touch = touches[0];
+ return Optional.some(SugarPosition(touch.clientX, touch.clientY));
+ };
+ var getData$2 = function (event) {
+ var raw = event.raw;
+ var touches = raw.touches;
+ return touches.length === 1 ? getDataFrom(touches) : Optional.none();
+ };
+ var getDelta$2 = function (old, nu) {
+ return SugarPosition(nu.left - old.left, nu.top - old.top);
+ };
+
+ var TouchData = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ getData: getData$2,
+ getDelta: getDelta$2
+ });
+
+ var events$h = function (dragConfig, dragState, updateStartState) {
+ var blockerCell = Cell(Optional.none());
+ return [
+ run(touchstart(), function (component, simulatedEvent) {
+ simulatedEvent.stop();
+ var stop$1 = function () {
+ stop(component, blockerCell.get(), dragConfig, dragState);
+ blockerCell.set(Optional.none());
+ };
+ var dragApi = {
+ drop: stop$1,
+ delayDrop: noop,
+ forceDrop: stop$1,
+ move: function (event) {
+ move$1(component, dragConfig, dragState, TouchData, event);
+ }
+ };
+ var blocker = createComponent(component, dragConfig.blockerClass, init$d(dragApi));
+ blockerCell.set(Optional.some(blocker));
+ var start = function () {
+ updateStartState(component);
+ instigate(component, blocker);
+ };
+ start();
+ }),
+ run(touchmove(), function (component, simulatedEvent) {
+ simulatedEvent.stop();
+ move$1(component, dragConfig, dragState, TouchData, simulatedEvent.event);
+ }),
+ run(touchend(), function (component, simulatedEvent) {
+ simulatedEvent.stop();
+ stop(component, blockerCell.get(), dragConfig, dragState);
+ blockerCell.set(Optional.none());
+ }),
+ run(touchcancel(), function (component) {
+ stop(component, blockerCell.get(), dragConfig, dragState);
+ blockerCell.set(Optional.none());
+ })
+ ];
+ };
+ var schema$v = __spreadArrays(schema$t, [output('dragger', { handlers: handlers(events$h) })]);
+
+ var events$i = function (dragConfig, dragState, updateStartState) {
+ return __spreadArrays(events$g(dragConfig, dragState, updateStartState), events$h(dragConfig, dragState, updateStartState));
+ };
+ var schema$w = __spreadArrays(schema$t, [output('dragger', { handlers: handlers(events$i) })]);
+
+ var mouse = schema$u;
+ var touch = schema$v;
+ var mouseOrTouch = schema$w;
+
+ var DraggingBranches = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ mouse: mouse,
+ touch: touch,
+ mouseOrTouch: mouseOrTouch
+ });
+
+ var init$e = function () {
+ var previous = Optional.none();
+ var startData = Optional.none();
+ var reset = function () {
+ previous = Optional.none();
+ startData = Optional.none();
+ };
+ var calculateDelta = function (mode, nu) {
+ var result = previous.map(function (old) {
+ return mode.getDelta(old, nu);
+ });
+ previous = Optional.some(nu);
+ return result;
+ };
+ var update = function (mode, dragEvent) {
+ return mode.getData(dragEvent).bind(function (nuData) {
+ return calculateDelta(mode, nuData);
+ });
+ };
+ var setStartData = function (data) {
+ startData = Optional.some(data);
+ };
+ var getStartData = function () {
+ return startData;
+ };
+ var readState = constant({});
+ return nu$5({
+ readState: readState,
+ reset: reset,
+ update: update,
+ getStartData: getStartData,
+ setStartData: setStartData
+ });
+ };
+
+ var DragState = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ init: init$e
+ });
+
+ var Dragging = createModes$1({
+ branchKey: 'mode',
+ branches: DraggingBranches,
+ name: 'dragging',
+ active: {
+ events: function (dragConfig, dragState) {
+ var dragger = dragConfig.dragger;
+ return dragger.handlers(dragConfig, dragState);
+ }
+ },
+ extra: {
+ snap: function (sConfig) {
+ return {
+ sensor: sConfig.sensor,
+ range: sConfig.range,
+ output: sConfig.output,
+ extra: Optional.from(sConfig.extra)
+ };
+ }
+ },
+ state: DragState,
+ apis: DraggingApis
+ });
+
+ var snapWidth = 40;
+ var snapOffset = snapWidth / 2;
+ var calcSnap = function (selectorOpt, td, x, y, width, height) {
+ return selectorOpt.fold(function () {
+ return Dragging.snap({
+ sensor: absolute$3(x - snapOffset, y - snapOffset),
+ range: SugarPosition(width, height),
+ output: absolute$3(Optional.some(x), Optional.some(y)),
+ extra: { td: td }
+ });
+ }, function (selectorHandle) {
+ var sensorLeft = x - snapOffset;
+ var sensorTop = y - snapOffset;
+ var sensorWidth = snapWidth;
+ var sensorHeight = snapWidth;
+ var rect = selectorHandle.element.dom.getBoundingClientRect();
+ return Dragging.snap({
+ sensor: absolute$3(sensorLeft, sensorTop),
+ range: SugarPosition(sensorWidth, sensorHeight),
+ output: absolute$3(Optional.some(x - rect.width / 2), Optional.some(y - rect.height / 2)),
+ extra: { td: td }
+ });
+ });
+ };
+ var getSnapsConfig = function (getSnapPoints, cell, onChange) {
+ var isSameCell = function (cellOpt, td) {
+ return cellOpt.exists(function (currentTd) {
+ return eq$1(currentTd, td);
+ });
+ };
+ return {
+ getSnapPoints: getSnapPoints,
+ leftAttr: 'data-drag-left',
+ topAttr: 'data-drag-top',
+ onSensor: function (component, extra) {
+ var td = extra.td;
+ if (!isSameCell(cell.get(), td)) {
+ cell.set(Optional.some(td));
+ onChange(td);
+ }
+ },
+ mustSnap: true
+ };
+ };
+ var createSelector = function (snaps) {
+ return record(Button.sketch({
+ dom: {
+ tag: 'div',
+ classes: ['tox-selector']
+ },
+ buttonBehaviours: derive$1([
+ Dragging.config({
+ mode: 'mouseOrTouch',
+ blockerClass: 'blocker',
+ snaps: snaps
+ }),
+ Unselecting.config({})
+ ]),
+ eventOrder: {
+ mousedown: [
+ 'dragging',
+ 'alloy.base.behaviour'
+ ],
+ touchstart: [
+ 'dragging',
+ 'alloy.base.behaviour'
+ ]
+ }
+ }));
+ };
+ var setup$a = function (editor, sink) {
+ var tlTds = Cell([]);
+ var brTds = Cell([]);
+ var isVisible = Cell(false);
+ var startCell = Cell(Optional.none());
+ var finishCell = Cell(Optional.none());
+ var getTopLeftSnap = function (td) {
+ var box = absolute$1(td);
+ return calcSnap(memTopLeft.getOpt(sink), td, box.x, box.y, box.width, box.height);
+ };
+ var getTopLeftSnaps = function () {
+ return map(tlTds.get(), function (td) {
+ return getTopLeftSnap(td);
+ });
+ };
+ var getBottomRightSnap = function (td) {
+ var box = absolute$1(td);
+ return calcSnap(memBottomRight.getOpt(sink), td, box.right, box.bottom, box.width, box.height);
+ };
+ var getBottomRightSnaps = function () {
+ return map(brTds.get(), function (td) {
+ return getBottomRightSnap(td);
+ });
+ };
+ var topLeftSnaps = getSnapsConfig(getTopLeftSnaps, startCell, function (start) {
+ finishCell.get().each(function (finish) {
+ editor.fire('TableSelectorChange', {
+ start: start,
+ finish: finish
+ });
+ });
+ });
+ var bottomRightSnaps = getSnapsConfig(getBottomRightSnaps, finishCell, function (finish) {
+ startCell.get().each(function (start) {
+ editor.fire('TableSelectorChange', {
+ start: start,
+ finish: finish
+ });
+ });
+ });
+ var memTopLeft = createSelector(topLeftSnaps);
+ var memBottomRight = createSelector(bottomRightSnaps);
+ var topLeft = build$1(memTopLeft.asSpec());
+ var bottomRight = build$1(memBottomRight.asSpec());
+ var showOrHideHandle = function (selector, cell, isAbove, isBelow) {
+ var cellRect = cell.dom.getBoundingClientRect();
+ remove$6(selector.element, 'display');
+ var viewportHeight = defaultView(SugarElement.fromDom(editor.getBody())).dom.innerHeight;
+ var aboveViewport = isAbove(cellRect);
+ var belowViewport = isBelow(cellRect, viewportHeight);
+ if (aboveViewport || belowViewport) {
+ set$2(selector.element, 'display', 'none');
+ }
+ };
+ var snapTo = function (selector, cell, getSnapConfig, pos) {
+ var snap = getSnapConfig(cell);
+ Dragging.snapTo(selector, snap);
+ var isAbove = function (rect) {
+ return rect[pos] < 0;
+ };
+ var isBelow = function (rect, viewportHeight) {
+ return rect[pos] > viewportHeight;
+ };
+ showOrHideHandle(selector, cell, isAbove, isBelow);
+ };
+ var snapTopLeft = function (cell) {
+ return snapTo(topLeft, cell, getTopLeftSnap, 'top');
+ };
+ var snapLastTopLeft = function () {
+ return startCell.get().each(snapTopLeft);
+ };
+ var snapBottomRight = function (cell) {
+ return snapTo(bottomRight, cell, getBottomRightSnap, 'bottom');
+ };
+ var snapLastBottomRight = function () {
+ return finishCell.get().each(snapBottomRight);
+ };
+ if (detect$3().deviceType.isTouch()) {
+ editor.on('TableSelectionChange', function (e) {
+ if (!isVisible.get()) {
+ attach$1(sink, topLeft);
+ attach$1(sink, bottomRight);
+ isVisible.set(true);
+ }
+ startCell.set(Optional.some(e.start));
+ finishCell.set(Optional.some(e.finish));
+ e.otherCells.each(function (otherCells) {
+ tlTds.set(otherCells.upOrLeftCells);
+ brTds.set(otherCells.downOrRightCells);
+ snapTopLeft(e.start);
+ snapBottomRight(e.finish);
+ });
+ });
+ editor.on('ResizeEditor ResizeWindow ScrollContent', function () {
+ snapLastTopLeft();
+ snapLastBottomRight();
+ });
+ editor.on('TableSelectionClear', function () {
+ if (isVisible.get()) {
+ detach(topLeft);
+ detach(bottomRight);
+ isVisible.set(false);
+ }
+ startCell.set(Optional.none());
+ finishCell.set(Optional.none());
+ });
+ }
+ };
+
+ var ResizeTypes;
+ (function (ResizeTypes) {
+ ResizeTypes[ResizeTypes['None'] = 0] = 'None';
+ ResizeTypes[ResizeTypes['Both'] = 1] = 'Both';
+ ResizeTypes[ResizeTypes['Vertical'] = 2] = 'Vertical';
+ }(ResizeTypes || (ResizeTypes = {})));
+ var getDimensions = function (editor, deltas, resizeType, originalHeight, originalWidth) {
+ var dimensions = {};
+ dimensions.height = calcCappedSize(originalHeight + deltas.top, getMinHeightSetting(editor), getMaxHeightSetting(editor));
+ if (resizeType === ResizeTypes.Both) {
+ dimensions.width = calcCappedSize(originalWidth + deltas.left, getMinWidthSetting(editor), getMaxWidthSetting(editor));
+ }
+ return dimensions;
+ };
+ var resize$3 = function (editor, deltas, resizeType) {
+ var container = SugarElement.fromDom(editor.getContainer());
+ var dimensions = getDimensions(editor, deltas, resizeType, get$7(container), get$8(container));
+ each$1(dimensions, function (val, dim) {
+ return set$2(container, dim, numToPx(val));
+ });
+ fireResizeEditor(editor);
+ };
+
+ var isHidden$1 = function (elm) {
+ if (elm.nodeType === 1) {
+ if (elm.nodeName === 'BR' || !!elm.getAttribute('data-mce-bogus')) {
+ return true;
+ }
+ if (elm.getAttribute('data-mce-type') === 'bookmark') {
+ return true;
+ }
+ }
+ return false;
+ };
+ var renderElementPath = function (editor, settings, providersBackstage) {
+ if (!settings.delimiter) {
+ settings.delimiter = '\xBB';
+ }
+ var getDataPath = function (data) {
+ var parts = data || [];
+ var newPathElements = map(parts, function (part, index) {
+ return Button.sketch({
+ dom: {
+ tag: 'div',
+ classes: ['tox-statusbar__path-item'],
+ attributes: {
+ 'role': 'button',
+ 'data-index': index,
+ 'tab-index': -1,
+ 'aria-level': index + 1
+ },
+ innerHtml: part.name
+ },
+ action: function (_btn) {
+ editor.focus();
+ editor.selection.select(part.element);
+ editor.nodeChanged();
+ },
+ buttonBehaviours: derive$1([
+ DisablingConfigs.button(providersBackstage.isDisabled),
+ receivingConfig()
+ ])
+ });
+ });
+ var divider = {
+ dom: {
+ tag: 'div',
+ classes: ['tox-statusbar__path-divider'],
+ attributes: { 'aria-hidden': true },
+ innerHtml: ' ' + settings.delimiter + ' '
+ }
+ };
+ return foldl(newPathElements.slice(1), function (acc, element) {
+ var newAcc = acc;
+ newAcc.push(divider);
+ newAcc.push(element);
+ return newAcc;
+ }, [newPathElements[0]]);
+ };
+ var updatePath = function (parents) {
+ var newPath = [];
+ var i = parents.length;
+ while (i-- > 0) {
+ var parent_1 = parents[i];
+ if (parent_1.nodeType === 1 && !isHidden$1(parent_1)) {
+ var args = editor.fire('ResolveName', {
+ name: parent_1.nodeName.toLowerCase(),
+ target: parent_1
+ });
+ if (!args.isDefaultPrevented()) {
+ newPath.push({
+ name: args.name,
+ element: parent_1
+ });
+ }
+ if (args.isPropagationStopped()) {
+ break;
+ }
+ }
+ }
+ return newPath;
+ };
+ return {
+ dom: {
+ tag: 'div',
+ classes: ['tox-statusbar__path'],
+ attributes: { role: 'navigation' }
+ },
+ behaviours: derive$1([
+ Keying.config({
+ mode: 'flow',
+ selector: 'div[role=button]'
+ }),
+ Disabling.config({ disabled: providersBackstage.isDisabled }),
+ receivingConfig(),
+ Tabstopping.config({}),
+ Replacing.config({}),
+ config('elementPathEvents', [runOnAttached(function (comp, _e) {
+ editor.shortcuts.add('alt+F11', 'focus statusbar elementpath', function () {
+ return Keying.focusIn(comp);
+ });
+ editor.on('NodeChange', function (e) {
+ var newPath = updatePath(e.parents);
+ if (newPath.length > 0) {
+ Replacing.set(comp, getDataPath(newPath));
+ } else {
+ Replacing.set(comp, []);
+ }
+ });
+ })])
+ ]),
+ components: []
+ };
+ };
+
+ var renderWordCount = function (editor, providersBackstage) {
+ var _a;
+ var replaceCountText = function (comp, count, mode) {
+ return Replacing.set(comp, [text(providersBackstage.translate([
+ '{0} ' + mode,
+ count[mode]
+ ]))]);
+ };
+ return Button.sketch({
+ dom: {
+ tag: 'button',
+ classes: ['tox-statusbar__wordcount']
+ },
+ components: [],
+ buttonBehaviours: derive$1([
+ DisablingConfigs.button(providersBackstage.isDisabled),
+ receivingConfig(),
+ Tabstopping.config({}),
+ Replacing.config({}),
+ Representing.config({
+ store: {
+ mode: 'memory',
+ initialValue: {
+ mode: 'words',
+ count: {
+ words: 0,
+ characters: 0
+ }
+ }
+ }
+ }),
+ config('wordcount-events', [
+ runOnExecute(function (comp) {
+ var currentVal = Representing.getValue(comp);
+ var newMode = currentVal.mode === 'words' ? 'characters' : 'words';
+ Representing.setValue(comp, {
+ mode: newMode,
+ count: currentVal.count
+ });
+ replaceCountText(comp, currentVal.count, newMode);
+ }),
+ runOnAttached(function (comp) {
+ editor.on('wordCountUpdate', function (e) {
+ var mode = Representing.getValue(comp).mode;
+ Representing.setValue(comp, {
+ mode: mode,
+ count: e.wordCount
+ });
+ replaceCountText(comp, e.wordCount, mode);
+ });
+ })
+ ])
+ ]),
+ eventOrder: (_a = {}, _a[execute()] = [
+ 'disabling',
+ 'alloy.base.behaviour',
+ 'wordcount-events'
+ ], _a)
+ });
+ };
+
+ var renderStatusbar = function (editor, providersBackstage) {
+ var renderResizeHandlerIcon = function (resizeType) {
+ return {
+ dom: {
+ tag: 'div',
+ classes: ['tox-statusbar__resize-handle'],
+ attributes: {
+ 'title': providersBackstage.translate('Resize'),
+ 'aria-hidden': 'true'
+ },
+ innerHtml: get$e('resize-handle', providersBackstage.icons)
+ },
+ behaviours: derive$1([Dragging.config({
+ mode: 'mouse',
+ repositionTarget: false,
+ onDrag: function (comp, target, delta) {
+ resize$3(editor, delta, resizeType);
+ },
+ blockerClass: 'tox-blocker'
+ })])
+ };
+ };
+ var renderBranding = function () {
+ var label = global$6.translate([
+ 'Powered by {0}',
+ 'Tiny'
+ ]);
+ var linkHtml = '' + label + '';
+ return {
+ dom: {
+ tag: 'span',
+ classes: ['tox-statusbar__branding'],
+ innerHtml: linkHtml
+ }
+ };
+ };
+ var getResizeType = function (editor) {
+ var fallback = !editor.hasPlugin('autoresize');
+ var resize = editor.getParam('resize', fallback);
+ if (resize === false) {
+ return ResizeTypes.None;
+ } else if (resize === 'both') {
+ return ResizeTypes.Both;
+ } else {
+ return ResizeTypes.Vertical;
+ }
+ };
+ var getTextComponents = function () {
+ var components = [];
+ if (editor.getParam('elementpath', true, 'boolean')) {
+ components.push(renderElementPath(editor, {}, providersBackstage));
+ }
+ if (editor.hasPlugin('wordcount')) {
+ components.push(renderWordCount(editor, providersBackstage));
+ }
+ if (editor.getParam('branding', true, 'boolean')) {
+ components.push(renderBranding());
+ }
+ if (components.length > 0) {
+ return [{
+ dom: {
+ tag: 'div',
+ classes: ['tox-statusbar__text-container']
+ },
+ components: components
+ }];
+ }
+ return [];
+ };
+ var getComponents = function () {
+ var components = getTextComponents();
+ var resizeType = getResizeType(editor);
+ if (resizeType !== ResizeTypes.None) {
+ components.push(renderResizeHandlerIcon(resizeType));
+ }
+ return components;
+ };
+ return {
+ dom: {
+ tag: 'div',
+ classes: ['tox-statusbar']
+ },
+ components: getComponents()
+ };
+ };
+
+ var setup$b = function (editor) {
+ var _a;
+ var isInline = editor.inline;
+ var mode = isInline ? Inline : Iframe;
+ var header = isStickyToolbar(editor) ? StickyHeader : StaticHeader;
+ var lazyOuterContainer = Optional.none();
+ var platform = detect$3();
+ var isIE = platform.browser.isIE();
+ var platformClasses = isIE ? ['tox-platform-ie'] : [];
+ var isTouch = platform.deviceType.isTouch();
+ var touchPlatformClass = 'tox-platform-touch';
+ var deviceClasses = isTouch ? [touchPlatformClass] : [];
+ var isToolbarBottom = isToolbarLocationBottom(editor);
+ var uiContainer = getUiContainer(editor);
+ var dirAttributes = global$6.isRtl() ? { attributes: { dir: 'rtl' } } : {};
+ var verticalDirAttributes = { attributes: (_a = {}, _a[Attribute] = isToolbarBottom ? AttributeValue.BottomToTop : AttributeValue.TopToBottom, _a) };
+ var lazyHeader = function () {
+ return lazyOuterContainer.bind(OuterContainer.getHeader);
+ };
+ var isHeaderDocked = function () {
+ return header.isDocked(lazyHeader);
+ };
+ var resizeUiMothership = function () {
+ set$2(uiMothership.element, 'width', document.body.clientWidth + 'px');
+ };
+ var makeSinkDefinition = function () {
+ var isGridUiContainer = eq$1(body(), uiContainer) && get$5(uiContainer, 'display') === 'grid';
+ var sinkSpec = {
+ dom: __assign({
+ tag: 'div',
+ classes: [
+ 'tox',
+ 'tox-silver-sink',
+ 'tox-tinymce-aux'
+ ].concat(platformClasses).concat(deviceClasses)
+ }, dirAttributes),
+ behaviours: derive$1([Positioning.config({
+ useFixed: function () {
+ return isHeaderDocked();
+ }
+ })])
+ };
+ var reactiveWidthSpec = {
+ dom: { styles: { width: document.body.clientWidth + 'px' } },
+ events: derive([run(windowResize(), resizeUiMothership)])
+ };
+ return deepMerge(sinkSpec, isGridUiContainer ? reactiveWidthSpec : {});
+ };
+ var sink = build$1(makeSinkDefinition());
+ var lazySink = function () {
+ return Result.value(sink);
+ };
+ var memAnchorBar = record({
+ dom: {
+ tag: 'div',
+ classes: ['tox-anchorbar']
+ }
+ });
+ var lazyAnchorBar = function () {
+ return lazyOuterContainer.bind(function (container) {
+ return memAnchorBar.getOpt(container);
+ }).getOrDie('Could not find a anchor bar element');
+ };
+ var lazyToolbar = function () {
+ return lazyOuterContainer.bind(function (container) {
+ return OuterContainer.getToolbar(container);
+ }).getOrDie('Could not find more toolbar element');
+ };
+ var lazyThrobber = function () {
+ return lazyOuterContainer.bind(function (container) {
+ return OuterContainer.getThrobber(container);
+ }).getOrDie('Could not find throbber element');
+ };
+ var backstage = init$8(sink, editor, lazyAnchorBar);
+ var partMenubar = OuterContainer.parts.menubar({
+ dom: {
+ tag: 'div',
+ classes: ['tox-menubar']
+ },
+ backstage: backstage,
+ onEscape: function () {
+ editor.focus();
+ }
+ });
+ var toolbarMode = getToolbarMode(editor);
+ var partToolbar = OuterContainer.parts.toolbar(__assign({
+ dom: {
+ tag: 'div',
+ classes: ['tox-toolbar']
+ },
+ getSink: lazySink,
+ providers: backstage.shared.providers,
+ onEscape: function () {
+ editor.focus();
+ },
+ type: toolbarMode,
+ lazyToolbar: lazyToolbar,
+ lazyHeader: function () {
+ return lazyHeader().getOrDie('Could not find header element');
+ }
+ }, verticalDirAttributes));
+ var partMultipleToolbar = OuterContainer.parts['multiple-toolbar']({
+ dom: {
+ tag: 'div',
+ classes: ['tox-toolbar-overlord']
+ },
+ providers: backstage.shared.providers,
+ onEscape: function () {
+ editor.focus();
+ },
+ type: toolbarMode
+ });
+ var partSocket = OuterContainer.parts.socket({
+ dom: {
+ tag: 'div',
+ classes: ['tox-edit-area']
+ }
+ });
+ var partSidebar = OuterContainer.parts.sidebar({
+ dom: {
+ tag: 'div',
+ classes: ['tox-sidebar']
+ }
+ });
+ var partThrobber = OuterContainer.parts.throbber({
+ dom: {
+ tag: 'div',
+ classes: ['tox-throbber']
+ },
+ backstage: backstage
+ });
+ var sb = editor.getParam('statusbar', true, 'boolean');
+ var statusbar = sb && !isInline ? Optional.some(renderStatusbar(editor, backstage.shared.providers)) : Optional.none();
+ var socketSidebarContainer = {
+ dom: {
+ tag: 'div',
+ classes: ['tox-sidebar-wrap']
+ },
+ components: [
+ partSocket,
+ partSidebar
+ ]
+ };
+ var hasMultipleToolbar = isMultipleToolbars(editor);
+ var hasToolbar = isToolbarEnabled(editor);
+ var hasMenubar = isMenubarEnabled(editor);
+ var getPartToolbar = function () {
+ if (hasMultipleToolbar) {
+ return [partMultipleToolbar];
+ } else if (hasToolbar) {
+ return [partToolbar];
+ } else {
+ return [];
+ }
+ };
+ var partHeader = OuterContainer.parts.header({
+ dom: __assign({
+ tag: 'div',
+ classes: ['tox-editor-header']
+ }, verticalDirAttributes),
+ components: flatten([
+ hasMenubar ? [partMenubar] : [],
+ getPartToolbar(),
+ useFixedContainer(editor) ? [] : [memAnchorBar.asSpec()]
+ ]),
+ sticky: isStickyToolbar(editor),
+ editor: editor,
+ sharedBackstage: backstage.shared
+ });
+ var editorComponents = flatten([
+ isToolbarBottom ? [] : [partHeader],
+ isInline ? [] : [socketSidebarContainer],
+ isToolbarBottom ? [partHeader] : []
+ ]);
+ var editorContainer = {
+ dom: {
+ tag: 'div',
+ classes: ['tox-editor-container']
+ },
+ components: editorComponents
+ };
+ var containerComponents = flatten([
+ [editorContainer],
+ isInline ? [] : statusbar.toArray(),
+ [partThrobber]
+ ]);
+ var isHidden = isDistractionFree(editor);
+ var attributes = __assign(__assign({ role: 'application' }, global$6.isRtl() ? { dir: 'rtl' } : {}), isHidden ? { 'aria-hidden': 'true' } : {});
+ var outerContainer = build$1(OuterContainer.sketch({
+ dom: {
+ tag: 'div',
+ classes: [
+ 'tox',
+ 'tox-tinymce'
+ ].concat(isInline ? ['tox-tinymce-inline'] : []).concat(isToolbarBottom ? ['tox-tinymce--toolbar-bottom'] : []).concat(deviceClasses).concat(platformClasses),
+ styles: __assign({ visibility: 'hidden' }, isHidden ? {
+ opacity: '0',
+ border: '0'
+ } : {}),
+ attributes: attributes
+ },
+ components: containerComponents,
+ behaviours: derive$1([
+ receivingConfig(),
+ Disabling.config({ disableClass: 'tox-tinymce--disabled' }),
+ Keying.config({
+ mode: 'cyclic',
+ selector: '.tox-menubar, .tox-toolbar, .tox-toolbar__primary, .tox-toolbar__overflow--open, .tox-sidebar__overflow--open, .tox-statusbar__path, .tox-statusbar__wordcount, .tox-statusbar__branding a'
+ })
+ ])
+ }));
+ lazyOuterContainer = Optional.some(outerContainer);
+ editor.shortcuts.add('alt+F9', 'focus menubar', function () {
+ OuterContainer.focusMenubar(outerContainer);
+ });
+ editor.shortcuts.add('alt+F10', 'focus toolbar', function () {
+ OuterContainer.focusToolbar(outerContainer);
+ });
+ editor.addCommand('ToggleToolbarDrawer', function () {
+ OuterContainer.toggleToolbarDrawer(outerContainer);
+ });
+ editor.addQueryStateHandler('ToggleToolbarDrawer', function () {
+ return OuterContainer.isToolbarDrawerToggled(outerContainer);
+ });
+ var mothership = takeover(outerContainer);
+ var uiMothership = takeover(sink);
+ setup$3(editor, mothership, uiMothership);
+ var getUi = function () {
+ var channels = {
+ broadcastAll: uiMothership.broadcast,
+ broadcastOn: uiMothership.broadcastOn,
+ register: noop
+ };
+ return { channels: channels };
+ };
+ var setEditorSize = function () {
+ var parsedHeight = numToPx(getHeightWithFallback(editor));
+ var parsedWidth = numToPx(getWidthWithFallback(editor));
+ if (!editor.inline) {
+ if (isValidValue('div', 'width', parsedWidth)) {
+ set$2(outerContainer.element, 'width', parsedWidth);
+ }
+ if (isValidValue('div', 'height', parsedHeight)) {
+ set$2(outerContainer.element, 'height', parsedHeight);
+ } else {
+ set$2(outerContainer.element, 'height', '200px');
+ }
+ }
+ return parsedHeight;
+ };
+ var renderUI = function () {
+ header.setup(editor, backstage.shared, lazyHeader);
+ setup$8(editor, backstage);
+ setup$9(editor, lazySink, backstage);
+ setup$6(editor);
+ setup$7(editor, lazyThrobber, backstage.shared);
+ map$2(getToolbarGroups(editor), function (toolbarGroupButtonConfig, name) {
+ editor.ui.registry.addGroupToolbarButton(name, toolbarGroupButtonConfig);
+ });
+ var _a = editor.ui.registry.getAll(), buttons = _a.buttons, menuItems = _a.menuItems, contextToolbars = _a.contextToolbars, sidebars = _a.sidebars;
+ var toolbarOpt = getMultipleToolbarsSetting(editor);
+ var rawUiConfig = {
+ menuItems: menuItems,
+ menus: getMenus(editor),
+ menubar: getMenubar(editor),
+ toolbar: toolbarOpt.getOrThunk(function () {
+ return getToolbar(editor);
+ }),
+ allowToolbarGroups: toolbarMode === ToolbarMode.floating,
+ buttons: buttons,
+ sidebar: sidebars
+ };
+ register$4(editor, contextToolbars, sink, { backstage: backstage });
+ setup$a(editor, sink);
+ var elm = editor.getElement();
+ var height = setEditorSize();
+ var uiComponents = {
+ mothership: mothership,
+ uiMothership: uiMothership,
+ outerContainer: outerContainer
+ };
+ var args = {
+ targetNode: elm,
+ height: height
+ };
+ return mode.render(editor, uiComponents, rawUiConfig, backstage, args);
+ };
+ return {
+ mothership: mothership,
+ uiMothership: uiMothership,
+ backstage: backstage,
+ renderUI: renderUI,
+ getUi: getUi
+ };
+ };
+
+ var describedBy = function (describedElement, describeElement) {
+ var describeId = Optional.from(get$3(describedElement, 'id')).fold(function () {
+ var id = generate$1('dialog-describe');
+ set$1(describeElement, 'id', id);
+ return id;
+ }, identity);
+ set$1(describedElement, 'aria-describedby', describeId);
+ };
+
+ var labelledBy = function (labelledElement, labelElement) {
+ var labelId = getOpt(labelledElement, 'id').fold(function () {
+ var id = generate$1('dialog-label');
+ set$1(labelElement, 'id', id);
+ return id;
+ }, identity);
+ set$1(labelledElement, 'aria-labelledby', labelId);
+ };
+
+ var schema$x = constant([
+ strict$1('lazySink'),
+ option('dragBlockClass'),
+ defaultedFunction('getBounds', win),
+ defaulted$1('useTabstopAt', always),
+ defaulted$1('eventOrder', {}),
+ field$1('modalBehaviours', [Keying]),
+ onKeyboardHandler('onExecute'),
+ onStrictKeyboardHandler('onEscape')
+ ]);
+ var basic = { sketch: identity };
+ var parts$f = constant([
+ optional({
+ name: 'draghandle',
+ overrides: function (detail, spec) {
+ return {
+ behaviours: derive$1([Dragging.config({
+ mode: 'mouse',
+ getTarget: function (handle) {
+ return ancestor$2(handle, '[role="dialog"]').getOr(handle);
+ },
+ blockerClass: detail.dragBlockClass.getOrDie(new Error('The drag blocker class was not specified for a dialog with a drag handle: \n' + JSON.stringify(spec, null, 2)).message),
+ getBounds: detail.getDragBounds
+ })])
+ };
+ }
+ }),
+ required({
+ schema: [strict$1('dom')],
+ name: 'title'
+ }),
+ required({
+ factory: basic,
+ schema: [strict$1('dom')],
+ name: 'close'
+ }),
+ required({
+ factory: basic,
+ schema: [strict$1('dom')],
+ name: 'body'
+ }),
+ optional({
+ factory: basic,
+ schema: [strict$1('dom')],
+ name: 'footer'
+ }),
+ external$1({
+ factory: {
+ sketch: function (spec, detail) {
+ return __assign(__assign({}, spec), {
+ dom: detail.dom,
+ components: detail.components
+ });
+ }
+ },
+ schema: [
+ defaulted$1('dom', {
+ tag: 'div',
+ styles: {
+ position: 'fixed',
+ left: '0px',
+ top: '0px',
+ right: '0px',
+ bottom: '0px'
+ }
+ }),
+ defaulted$1('components', [])
+ ],
+ name: 'blocker'
+ })
+ ]);
+
+ var block = function (component, config, state, getBusySpec) {
+ set$1(component.element, 'aria-busy', true);
+ var root = config.getRoot(component).getOr(component);
+ var blockerBehaviours = derive$1([
+ Keying.config({
+ mode: 'special',
+ onTab: function () {
+ return Optional.some(true);
+ },
+ onShiftTab: function () {
+ return Optional.some(true);
+ }
+ }),
+ Focusing.config({})
+ ]);
+ var blockSpec = getBusySpec(root, blockerBehaviours);
+ var blocker = root.getSystem().build(blockSpec);
+ Replacing.append(root, premade$1(blocker));
+ if (blocker.hasConfigured(Keying)) {
+ Keying.focusIn(blocker);
+ }
+ if (!state.isBlocked()) {
+ config.onBlock(component);
+ }
+ state.blockWith(function () {
+ return Replacing.remove(root, blocker);
+ });
+ };
+ var unblock = function (component, config, state) {
+ remove$1(component.element, 'aria-busy');
+ if (state.isBlocked()) {
+ config.onUnblock(component);
+ }
+ state.clear();
+ };
+
+ var BlockingApis = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ block: block,
+ unblock: unblock
+ });
+
+ var BlockingSchema = [
+ defaultedFunction('getRoot', Optional.none),
+ onHandler('onBlock'),
+ onHandler('onUnblock')
+ ];
+
+ var init$f = function () {
+ var blocker = destroyable();
+ var blockWith = function (destroy) {
+ blocker.set({ destroy: destroy });
+ };
+ return nu$5({
+ readState: blocker.isSet,
+ blockWith: blockWith,
+ clear: blocker.clear,
+ isBlocked: blocker.isSet
+ });
+ };
+
+ var BlockingState = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ init: init$f
+ });
+
+ var Blocking = create$1({
+ fields: BlockingSchema,
+ name: 'blocking',
+ apis: BlockingApis,
+ state: BlockingState
+ });
+
+ var factory$i = function (detail, components, spec, externals) {
+ var _a;
+ var dialogComp = Cell(Optional.none());
+ var showDialog = function (dialog) {
+ dialogComp.set(Optional.some(dialog));
+ var sink = detail.lazySink(dialog).getOrDie();
+ var externalBlocker = externals.blocker();
+ var blocker = sink.getSystem().build(__assign(__assign({}, externalBlocker), {
+ components: externalBlocker.components.concat([premade$1(dialog)]),
+ behaviours: derive$1([
+ Focusing.config({}),
+ config('dialog-blocker-events', [runOnSource(focusin(), function () {
+ Keying.focusIn(dialog);
+ })])
+ ])
+ }));
+ attach$1(sink, blocker);
+ Keying.focusIn(dialog);
+ };
+ var hideDialog = function (dialog) {
+ dialogComp.set(Optional.none());
+ parent(dialog.element).each(function (blockerDom) {
+ dialog.getSystem().getByDom(blockerDom).each(function (blocker) {
+ detach(blocker);
+ });
+ });
+ };
+ var getDialogBody = function (dialog) {
+ return getPartOrDie(dialog, detail, 'body');
+ };
+ var getDialogFooter = function (dialog) {
+ return getPartOrDie(dialog, detail, 'footer');
+ };
+ var setBusy = function (dialog, getBusySpec) {
+ Blocking.block(dialog, getBusySpec);
+ };
+ var setIdle = function (dialog) {
+ Blocking.unblock(dialog);
+ };
+ var modalEventsId = generate$1('modal-events');
+ var eventOrder = __assign(__assign({}, detail.eventOrder), (_a = {}, _a[attachedToDom()] = [modalEventsId].concat(detail.eventOrder['alloy.system.attached'] || []), _a));
+ return {
+ uid: detail.uid,
+ dom: detail.dom,
+ components: components,
+ apis: {
+ show: showDialog,
+ hide: hideDialog,
+ getBody: getDialogBody,
+ getFooter: getDialogFooter,
+ setIdle: setIdle,
+ setBusy: setBusy
+ },
+ eventOrder: eventOrder,
+ domModification: {
+ attributes: {
+ 'role': 'dialog',
+ 'aria-modal': 'true'
+ }
+ },
+ behaviours: augment(detail.modalBehaviours, [
+ Replacing.config({}),
+ Keying.config({
+ mode: 'cyclic',
+ onEnter: detail.onExecute,
+ onEscape: detail.onEscape,
+ useTabstopAt: detail.useTabstopAt
+ }),
+ Blocking.config({ getRoot: dialogComp.get }),
+ config(modalEventsId, [runOnAttached(function (c) {
+ labelledBy(c.element, getPartOrDie(c, detail, 'title').element);
+ describedBy(c.element, getPartOrDie(c, detail, 'body').element);
+ })])
+ ])
+ };
+ };
+ var ModalDialog = composite$1({
+ name: 'ModalDialog',
+ configFields: schema$x(),
+ partFields: parts$f(),
+ factory: factory$i,
+ apis: {
+ show: function (apis, dialog) {
+ apis.show(dialog);
+ },
+ hide: function (apis, dialog) {
+ apis.hide(dialog);
+ },
+ getBody: function (apis, dialog) {
+ return apis.getBody(dialog);
+ },
+ getFooter: function (apis, dialog) {
+ return apis.getFooter(dialog);
+ },
+ setBusy: function (apis, dialog, getBusySpec) {
+ apis.setBusy(dialog, getBusySpec);
+ },
+ setIdle: function (apis, dialog) {
+ apis.setIdle(dialog);
+ }
+ }
+ });
+
+ var dialogToggleMenuItemSchema = objOf([
+ strictString('type'),
+ strictString('name')
+ ].concat(commonMenuItemFields));
+ var dialogToggleMenuItemDataProcessor = boolean;
+
+ var baseFooterButtonFields = [
+ field('name', 'name', defaultedThunk(function () {
+ return generate$1('button-name');
+ }), string),
+ optionString('icon'),
+ defaultedStringEnum('align', 'end', [
+ 'start',
+ 'end'
+ ]),
+ defaultedBoolean('primary', false),
+ defaultedBoolean('disabled', false)
+ ];
+ var dialogFooterButtonFields = __spreadArrays(baseFooterButtonFields, [strictString('text')]);
+ var normalFooterButtonFields = __spreadArrays([strictStringEnum('type', [
+ 'submit',
+ 'cancel',
+ 'custom'
+ ])], dialogFooterButtonFields);
+ var menuFooterButtonFields = __spreadArrays([
+ strictStringEnum('type', ['menu']),
+ optionString('text'),
+ optionString('tooltip'),
+ optionString('icon'),
+ strictArrayOf('items', dialogToggleMenuItemSchema)
+ ], baseFooterButtonFields);
+ var dialogFooterButtonSchema = choose$1('type', {
+ submit: normalFooterButtonFields,
+ cancel: normalFooterButtonFields,
+ custom: normalFooterButtonFields,
+ menu: menuFooterButtonFields
+ });
+
+ var alertBannerFields = [
+ strictString('type'),
+ strictString('text'),
+ strictStringEnum('level', [
+ 'info',
+ 'warn',
+ 'error',
+ 'success'
+ ]),
+ strictString('icon'),
+ defaulted$1('url', '')
+ ];
+ var alertBannerSchema = objOf(alertBannerFields);
+
+ var createBarFields = function (itemsField) {
+ return [
+ strictString('type'),
+ itemsField
+ ];
+ };
+
+ var buttonFields = [
+ strictString('type'),
+ strictString('text'),
+ defaultedBoolean('disabled', false),
+ defaultedBoolean('primary', false),
+ field('name', 'name', defaultedThunk(function () {
+ return generate$1('button-name');
+ }), string),
+ optionString('icon'),
+ defaultedBoolean('borderless', false)
+ ];
+ var buttonSchema = objOf(buttonFields);
+
+ var checkboxFields = [
+ strictString('type'),
+ strictString('name'),
+ strictString('label'),
+ defaultedBoolean('disabled', false)
+ ];
+ var checkboxSchema = objOf(checkboxFields);
+ var checkboxDataProcessor = boolean;
+
+ var formComponentFields = [
+ strictString('type'),
+ strictString('name')
+ ];
+ var formComponentWithLabelFields = formComponentFields.concat([optionString('label')]);
+
+ var collectionFields = formComponentWithLabelFields.concat([defaulted$1('columns', 'auto')]);
+ var collectionSchema = objOf(collectionFields);
+ var collectionDataProcessor = arrOfObj$1([
+ strictString('value'),
+ strictString('text'),
+ strictString('icon')
+ ]);
+
+ var colorInputFields = formComponentWithLabelFields;
+ var colorInputSchema = objOf(colorInputFields);
+ var colorInputDataProcessor = string;
+
+ var colorPickerFields = formComponentWithLabelFields;
+ var colorPickerSchema = objOf(colorPickerFields);
+ var colorPickerDataProcessor = string;
+
+ var customEditorFields = formComponentFields.concat([
+ defaultedString('tag', 'textarea'),
+ strictString('scriptId'),
+ strictString('scriptUrl'),
+ defaultedPostMsg('settings', undefined)
+ ]);
+ var customEditorFieldsOld = formComponentFields.concat([
+ defaultedString('tag', 'textarea'),
+ strictFunction('init')
+ ]);
+ var customEditorSchema = valueOf(function (v) {
+ return asRaw('customeditor.old', objOfOnly(customEditorFieldsOld), v).orThunk(function () {
+ return asRaw('customeditor.new', objOfOnly(customEditorFields), v);
+ });
+ });
+ var customEditorDataProcessor = string;
+
+ var dropZoneFields = formComponentWithLabelFields;
+ var dropZoneSchema = objOf(dropZoneFields);
+ var dropZoneDataProcessor = arrOfVal();
+
+ var createGridFields = function (itemsField) {
+ return [
+ strictString('type'),
+ strictNumber('columns'),
+ itemsField
+ ];
+ };
+
+ var htmlPanelFields = [
+ strictString('type'),
+ strictString('html'),
+ defaultedStringEnum('presets', 'presentation', [
+ 'presentation',
+ 'document'
+ ])
+ ];
+ var htmlPanelSchema = objOf(htmlPanelFields);
+
+ var iframeFields = formComponentWithLabelFields.concat([defaultedBoolean('sandboxed', true)]);
+ var iframeSchema = objOf(iframeFields);
+ var iframeDataProcessor = string;
+
+ var imageToolsFields = formComponentWithLabelFields.concat([strictOf('currentState', objOf([
+ strict$1('blob'),
+ strictString('url')
+ ]))]);
+ var imageToolsSchema = objOf(imageToolsFields);
+
+ var inputFields = formComponentWithLabelFields.concat([
+ optionString('inputMode'),
+ optionString('placeholder'),
+ defaultedString('hmfor',''),
+ defaultedBoolean('maximized', false),
+ defaultedBoolean('disabled', false)
+ ]);
+ var inputSchema = objOf(inputFields);
+ var inputDataProcessor = string;
+
+ var createLabelFields = function (itemsField) {
+ return [
+ strictString('type'),
+ strictString('label'),
+ itemsField
+ ];
+ };
+
+ var listBoxSingleItemFields = [
+ strictString('text'),
+ strictString('value'),
+ defaultedString('hmto','')
+ ];
+ var listBoxNestedItemFields = [
+ strictString('text'),
+ strictArrayOf('items', thunkOf('items', function () {
+ return listBoxItemSchema;
+ }))
+ ];
+ var listBoxItemSchema = oneOf([
+ objOf(listBoxSingleItemFields),
+ objOf(listBoxNestedItemFields)
+ ]);
+ var listBoxFields = formComponentWithLabelFields.concat([
+ strictArrayOf('items', listBoxItemSchema),
+ defaultedBoolean('disabled', false)
+ ]);
+ var listBoxSchema = objOf(listBoxFields);
+ var listBoxDataProcessor = string;
+
+ var selectBoxFields = formComponentWithLabelFields.concat([
+ strictArrayOfObj('items', [
+ strictString('text'),
+ strictString('value'),
+ defaultedString('hmto','')
+ ]),
+ defaultedNumber('size', 1),
+ defaultedBoolean('disabled', false)
+ ]);
+ var selectBoxSchema = objOf(selectBoxFields);
+ var selectBoxDataProcessor = string;
+
+ var sizeInputFields = formComponentWithLabelFields.concat([
+ defaultedBoolean('constrain', true),
+ defaultedBoolean('disabled', false)
+ ]);
+ var sizeInputSchema = objOf(sizeInputFields);
+ var sizeInputDataProcessor = objOf([
+ strictString('width'),
+ strictString('height')
+ ]);
+
+ var tableFields = [
+ strictString('type'),
+ strictArrayOf('header', string),
+ strictArrayOf('cells', arrOf(string))
+ ];
+ var tableSchema = objOf(tableFields);
+
+ var textAreaFields = formComponentWithLabelFields.concat([
+ optionString('placeholder'),
+ defaultedBoolean('maximized', false),
+ defaultedBoolean('disabled', false)
+ ]);
+ var textAreaSchema = objOf(textAreaFields);
+ var textAreaDataProcessor = string;
+
+ var urlInputFields = formComponentWithLabelFields.concat([
+ defaultedStringEnum('filetype', 'file', [
+ 'image',
+ 'media',
+ 'file'
+ ]),
+ defaulted$1('disabled', false)
+ ]);
+ var urlInputSchema = objOf(urlInputFields);
+ var urlInputDataProcessor = objOf([
+ strictString('value'),
+ defaulted$1('meta', {})
+ ]);
+
+ var createItemsField = function (name) {
+ return field('items', 'items', strict(), arrOf(valueOf(function (v) {
+ return asRaw('Checking item of ' + name, itemSchema$3, v).fold(function (sErr) {
+ return Result.error(formatError(sErr));
+ }, function (passValue) {
+ return Result.value(passValue);
+ });
+ })));
+ };
+ var itemSchema$3 = valueThunkOf(function () {
+ return chooseProcessor('type', {
+ alertbanner: alertBannerSchema,
+ bar: objOf(createBarFields(createItemsField('bar'))),
+ button: buttonSchema,
+ checkbox: checkboxSchema,
+ colorinput: colorInputSchema,
+ colorpicker: colorPickerSchema,
+ dropzone: dropZoneSchema,
+ grid: objOf(createGridFields(createItemsField('grid'))),
+ iframe: iframeSchema,
+ input: inputSchema,
+ listbox: listBoxSchema,
+ selectbox: selectBoxSchema,
+ sizeinput: sizeInputSchema,
+ textarea: textAreaSchema,
+ urlinput: urlInputSchema,
+ customeditor: customEditorSchema,
+ htmlpanel: htmlPanelSchema,
+ imagetools: imageToolsSchema,
+ collection: collectionSchema,
+ label: objOf(createLabelFields(createItemsField('label'))),
+ table: tableSchema,
+ panel: panelSchema
+ });
+ });
+ var panelFields = [
+ strictString('type'),
+ defaulted$1('classes', []),
+ strictArrayOf('items', itemSchema$3)
+ ];
+ var panelSchema = objOf(panelFields);
+
+ var tabFields = [
+ field('name', 'name', defaultedThunk(function () {
+ return generate$1('tab-name');
+ }), string),
+ strictString('title'),
+ strictArrayOf('items', itemSchema$3)
+ ];
+ var tabPanelFields = [
+ strictString('type'),
+ strictArrayOfObj('tabs', tabFields)
+ ];
+ var tabPanelSchema = objOf(tabPanelFields);
+
+ var dialogButtonFields = dialogFooterButtonFields;
+ var dialogButtonSchema = dialogFooterButtonSchema;
+ var dialogSchema = objOf([
+ strictString('title'),
+ strictOf('body', chooseProcessor('type', {
+ panel: panelSchema,
+ tabpanel: tabPanelSchema
+ })),
+ defaultedString('size', 'normal'),
+ strictArrayOf('buttons', dialogButtonSchema),
+ defaulted$1('initialData', {}),
+ defaultedFunction('onAction', noop),
+ defaultedFunction('onChange', noop),
+ defaultedFunction('onSubmit', noop),
+ defaultedFunction('onClose', noop),
+ defaultedFunction('onCancel', noop),
+ defaulted$1('onTabChange', noop)
+ ]);
+ var createDialog = function (spec) {
+ return asRaw('dialog', dialogSchema, spec);
+ };
+
+ var urlDialogButtonSchema = objOf(__spreadArrays([strictStringEnum('type', [
+ 'cancel',
+ 'custom'
+ ])], dialogButtonFields));
+ var urlDialogSchema = objOf([
+ strictString('title'),
+ strictString('url'),
+ optionNumber('height'),
+ optionNumber('width'),
+ optionArrayOf('buttons', urlDialogButtonSchema),
+ defaultedFunction('onAction', noop),
+ defaultedFunction('onCancel', noop),
+ defaultedFunction('onClose', noop),
+ defaultedFunction('onMessage', noop)
+ ]);
+ var createUrlDialog = function (spec) {
+ return asRaw('dialog', urlDialogSchema, spec);
+ };
+
+ var getAllObjects = function (obj) {
+ if (isObject(obj)) {
+ return [obj].concat(bind(values(obj), getAllObjects));
+ } else if (isArray(obj)) {
+ return bind(obj, getAllObjects);
+ } else {
+ return [];
+ }
+ };
+
+ var isNamedItem = function (obj) {
+ return isString(obj.type) && isString(obj.name);
+ };
+ var dataProcessors = {
+ checkbox: checkboxDataProcessor,
+ colorinput: colorInputDataProcessor,
+ colorpicker: colorPickerDataProcessor,
+ dropzone: dropZoneDataProcessor,
+ input: inputDataProcessor,
+ iframe: iframeDataProcessor,
+ sizeinput: sizeInputDataProcessor,
+ selectbox: selectBoxDataProcessor,
+ listbox: listBoxDataProcessor,
+ size: sizeInputDataProcessor,
+ textarea: textAreaDataProcessor,
+ urlinput: urlInputDataProcessor,
+ customeditor: customEditorDataProcessor,
+ collection: collectionDataProcessor,
+ togglemenuitem: dialogToggleMenuItemDataProcessor
+ };
+ var getDataProcessor = function (item) {
+ return Optional.from(dataProcessors[item.type]);
+ };
+ var getNamedItems = function (structure) {
+ return filter(getAllObjects(structure), isNamedItem);
+ };
+
+ var createDataValidator = function (structure) {
+ var namedItems = getNamedItems(structure);
+ var fields = bind(namedItems, function (item) {
+ return getDataProcessor(item).fold(function () {
+ return [];
+ }, function (schema) {
+ return [strictOf(item.name, schema)];
+ });
+ });
+ return objOf(fields);
+ };
+
+ var extract$1 = function (structure) {
+ // console.log(structure)
+ var internalDialog = getOrDie(createDialog(structure));
+ var dataValidator = createDataValidator(structure);
+ var initialData = structure.initialData;
+ return {
+ internalDialog: internalDialog,
+ dataValidator: dataValidator,
+ initialData: initialData
+ };
+ };
+ var DialogManager = {
+ open: function (factory, structure) {
+ var extraction = extract$1(structure);
+ return factory(extraction.internalDialog, extraction.initialData, extraction.dataValidator);
+ },
+ openUrl: function (factory, structure) {
+ var internalDialog = getOrDie(createUrlDialog(structure));
+ return factory(internalDialog);
+ },
+ redial: function (structure) {
+ return extract$1(structure);
+ }
+ };
+
+ var toValidValues = function (values) {
+ var errors = [];
+ var result = {};
+ each$1(values, function (value, name) {
+ value.fold(function () {
+ errors.push(name);
+ }, function (v) {
+ result[name] = v;
+ });
+ });
+ return errors.length > 0 ? Result.error(errors) : Result.value(result);
+ };
+
+ var renderBodyPanel = function (spec, backstage) {
+ var memForm = record(Form.sketch(function (parts) {
+ return {
+ dom: {
+ tag: 'div',
+ classes: ['tox-form'].concat(spec.classes)
+ },
+ components: map(spec.items, function (item) {
+ return interpretInForm(parts, item, backstage);
+ })
+ };
+ }));
+ return {
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__body']
+ },
+ components: [{
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__body-content']
+ },
+ components: [memForm.asSpec()]
+ }],
+ behaviours: derive$1([
+ Keying.config({
+ mode: 'acyclic',
+ useTabstopAt: not(isPseudoStop)
+ }),
+ ComposingConfigs.memento(memForm),
+ RepresentingConfigs.memento(memForm, {
+ postprocess: function (formValue) {
+ return toValidValues(formValue).fold(function (err) {
+ console.error(err);
+ return {};
+ }, function (vals) {
+ return vals;
+ });
+ }
+ })
+ ])
+ };
+ };
+
+ var factory$j = function (detail, _spec) {
+ return {
+ uid: detail.uid,
+ dom: detail.dom,
+ components: detail.components,
+ events: events$7(detail.action),
+ behaviours: augment(detail.tabButtonBehaviours, [
+ Focusing.config({}),
+ Keying.config({
+ mode: 'execution',
+ useSpace: true,
+ useEnter: true
+ }),
+ Representing.config({
+ store: {
+ mode: 'memory',
+ initialValue: detail.value
+ }
+ })
+ ]),
+ domModification: detail.domModification
+ };
+ };
+ var TabButton = single$2({
+ name: 'TabButton',
+ configFields: [
+ defaulted$1('uid', undefined),
+ strict$1('value'),
+ field('dom', 'dom', mergeWithThunk(function () {
+ return {
+ attributes: {
+ 'role': 'tab',
+ 'id': generate$1('aria'),
+ 'aria-selected': 'false'
+ }
+ };
+ }), anyValue$1()),
+ option('action'),
+ defaulted$1('domModification', {}),
+ field$1('tabButtonBehaviours', [
+ Focusing,
+ Keying,
+ Representing
+ ]),
+ strict$1('view')
+ ],
+ factory: factory$j
+ });
+
+ var schema$y = constant([
+ strict$1('tabs'),
+ strict$1('dom'),
+ defaulted$1('clickToDismiss', false),
+ field$1('tabbarBehaviours', [
+ Highlighting,
+ Keying
+ ]),
+ markers([
+ 'tabClass',
+ 'selectedClass'
+ ])
+ ]);
+ var tabsPart = group({
+ factory: TabButton,
+ name: 'tabs',
+ unit: 'tab',
+ overrides: function (barDetail) {
+ var dismissTab$1 = function (tabbar, button) {
+ Highlighting.dehighlight(tabbar, button);
+ emitWith(tabbar, dismissTab(), {
+ tabbar: tabbar,
+ button: button
+ });
+ };
+ var changeTab$1 = function (tabbar, button) {
+ Highlighting.highlight(tabbar, button);
+ emitWith(tabbar, changeTab(), {
+ tabbar: tabbar,
+ button: button
+ });
+ };
+ return {
+ action: function (button) {
+ var tabbar = button.getSystem().getByUid(barDetail.uid).getOrDie();
+ var activeButton = Highlighting.isHighlighted(tabbar, button);
+ var response = function () {
+ if (activeButton && barDetail.clickToDismiss) {
+ return dismissTab$1;
+ } else if (!activeButton) {
+ return changeTab$1;
+ } else {
+ return noop;
+ }
+ }();
+ response(tabbar, button);
+ },
+ domModification: { classes: [barDetail.markers.tabClass] }
+ };
+ }
+ });
+ var parts$g = constant([tabsPart]);
+
+ var factory$k = function (detail, components, _spec, _externals) {
+ return {
+ 'uid': detail.uid,
+ 'dom': detail.dom,
+ components: components,
+ 'debug.sketcher': 'Tabbar',
+ 'domModification': { attributes: { role: 'tablist' } },
+ 'behaviours': augment(detail.tabbarBehaviours, [
+ Highlighting.config({
+ highlightClass: detail.markers.selectedClass,
+ itemClass: detail.markers.tabClass,
+ onHighlight: function (tabbar, tab) {
+ set$1(tab.element, 'aria-selected', 'true');
+ },
+ onDehighlight: function (tabbar, tab) {
+ set$1(tab.element, 'aria-selected', 'false');
+ }
+ }),
+ Keying.config({
+ mode: 'flow',
+ getInitial: function (tabbar) {
+ return Highlighting.getHighlighted(tabbar).map(function (tab) {
+ return tab.element;
+ });
+ },
+ selector: '.' + detail.markers.tabClass,
+ executeOnMove: true
+ })
+ ])
+ };
+ };
+ var Tabbar = composite$1({
+ name: 'Tabbar',
+ configFields: schema$y(),
+ partFields: parts$g(),
+ factory: factory$k
+ });
+
+ var factory$l = function (detail, _spec) {
+ return {
+ uid: detail.uid,
+ dom: detail.dom,
+ behaviours: augment(detail.tabviewBehaviours, [Replacing.config({})]),
+ domModification: { attributes: { role: 'tabpanel' } }
+ };
+ };
+ var Tabview = single$2({
+ name: 'Tabview',
+ configFields: [field$1('tabviewBehaviours', [Replacing])],
+ factory: factory$l
+ });
+
+ var schema$z = constant([
+ defaulted$1('selectFirst', true),
+ onHandler('onChangeTab'),
+ onHandler('onDismissTab'),
+ defaulted$1('tabs', []),
+ field$1('tabSectionBehaviours', [])
+ ]);
+ var barPart = required({
+ factory: Tabbar,
+ schema: [
+ strict$1('dom'),
+ strictObjOf('markers', [
+ strict$1('tabClass'),
+ strict$1('selectedClass')
+ ])
+ ],
+ name: 'tabbar',
+ defaults: function (detail) {
+ return { tabs: detail.tabs };
+ }
+ });
+ var viewPart = required({
+ factory: Tabview,
+ name: 'tabview'
+ });
+ var parts$h = constant([
+ barPart,
+ viewPart
+ ]);
+
+ var factory$m = function (detail, components, _spec, _externals) {
+ var changeTab$1 = function (button) {
+ var tabValue = Representing.getValue(button);
+ getPart(button, detail, 'tabview').each(function (tabview) {
+ var tabWithValue = find(detail.tabs, function (t) {
+ return t.value === tabValue;
+ });
+ tabWithValue.each(function (tabData) {
+ var panel = tabData.view();
+ getOpt(button.element, 'id').each(function (id) {
+ set$1(tabview.element, 'aria-labelledby', id);
+ });
+ Replacing.set(tabview, panel);
+ detail.onChangeTab(tabview, button, panel);
+ });
+ });
+ };
+ var changeTabBy = function (section, byPred) {
+ getPart(section, detail, 'tabbar').each(function (tabbar) {
+ byPred(tabbar).each(emitExecute);
+ });
+ };
+ return {
+ uid: detail.uid,
+ dom: detail.dom,
+ components: components,
+ behaviours: get$d(detail.tabSectionBehaviours),
+ events: derive(flatten([
+ detail.selectFirst ? [runOnAttached(function (section, _simulatedEvent) {
+ changeTabBy(section, Highlighting.getFirst);
+ })] : [],
+ [
+ run(changeTab(), function (section, simulatedEvent) {
+ var button = simulatedEvent.event.button;
+ changeTab$1(button);
+ }),
+ run(dismissTab(), function (section, simulatedEvent) {
+ var button = simulatedEvent.event.button;
+ detail.onDismissTab(section, button);
+ })
+ ]
+ ])),
+ apis: {
+ getViewItems: function (section) {
+ return getPart(section, detail, 'tabview').map(function (tabview) {
+ return Replacing.contents(tabview);
+ }).getOr([]);
+ },
+ showTab: function (section, tabKey) {
+ var getTabIfNotActive = function (tabbar) {
+ var candidates = Highlighting.getCandidates(tabbar);
+ var optTab = find(candidates, function (c) {
+ return Representing.getValue(c) === tabKey;
+ });
+ return optTab.filter(function (tab) {
+ return !Highlighting.isHighlighted(tabbar, tab);
+ });
+ };
+ changeTabBy(section, getTabIfNotActive);
+ }
+ }
+ };
+ };
+ var TabSection = composite$1({
+ name: 'TabSection',
+ configFields: schema$z(),
+ partFields: parts$h(),
+ factory: factory$m,
+ apis: {
+ getViewItems: function (apis, component) {
+ return apis.getViewItems(component);
+ },
+ showTab: function (apis, component, tabKey) {
+ apis.showTab(component, tabKey);
+ }
+ }
+ });
+
+ var measureHeights = function (allTabs, tabview, tabviewComp) {
+ return map(allTabs, function (_tab, i) {
+ Replacing.set(tabviewComp, allTabs[i].view());
+ var rect = tabview.dom.getBoundingClientRect();
+ Replacing.set(tabviewComp, []);
+ return rect.height;
+ });
+ };
+ var getMaxHeight = function (heights) {
+ return head(sort(heights, function (a, b) {
+ if (a > b) {
+ return -1;
+ } else if (a < b) {
+ return +1;
+ } else {
+ return 0;
+ }
+ }));
+ };
+ var getMaxTabviewHeight = function (dialog, tabview, tablist) {
+ var documentElement$1 = documentElement(dialog).dom;
+ var rootElm = ancestor$2(dialog, '.tox-dialog-wrap').getOr(dialog);
+ var isFixed = get$5(rootElm, 'position') === 'fixed';
+ var maxHeight;
+ if (isFixed) {
+ maxHeight = Math.max(documentElement$1.clientHeight, window.innerHeight);
+ } else {
+ maxHeight = Math.max(documentElement$1.offsetHeight, documentElement$1.scrollHeight);
+ }
+ var tabviewHeight = get$7(tabview);
+ var isTabListBeside = tabview.dom.offsetLeft >= tablist.dom.offsetLeft + get$8(tablist);
+ var currentTabHeight = isTabListBeside ? Math.max(get$7(tablist), tabviewHeight) : tabviewHeight;
+ var dialogTopMargin = parseInt(get$5(dialog, 'margin-top'), 10) || 0;
+ var dialogBottomMargin = parseInt(get$5(dialog, 'margin-bottom'), 10) || 0;
+ var dialogHeight = get$7(dialog) + dialogTopMargin + dialogBottomMargin;
+ var chromeHeight = dialogHeight - currentTabHeight;
+ return maxHeight - chromeHeight;
+ };
+ var showTab = function (allTabs, comp) {
+ head(allTabs).each(function (tab) {
+ return TabSection.showTab(comp, tab.value);
+ });
+ };
+ var setTabviewHeight = function (tabview, height) {
+ set$2(tabview, 'height', height + 'px');
+ if (!detect$3().browser.isIE()) {
+ set$2(tabview, 'flex-basis', height + 'px');
+ } else {
+ remove$6(tabview, 'flex-basis');
+ }
+ };
+ var updateTabviewHeight = function (dialogBody, tabview, maxTabHeight) {
+ ancestor$2(dialogBody, '[role="dialog"]').each(function (dialog) {
+ descendant$1(dialog, '[role="tablist"]').each(function (tablist) {
+ maxTabHeight.get().map(function (height) {
+ set$2(tabview, 'height', '0');
+ set$2(tabview, 'flex-basis', '0');
+ return Math.min(height, getMaxTabviewHeight(dialog, tabview, tablist));
+ }).each(function (height) {
+ setTabviewHeight(tabview, height);
+ });
+ });
+ });
+ };
+ var getTabview = function (dialog) {
+ return descendant$1(dialog, '[role="tabpanel"]');
+ };
+ var setMode = function (allTabs) {
+ var smartTabHeight = function () {
+ var maxTabHeight = Cell(Optional.none());
+ var extraEvents = [
+ runOnAttached(function (comp) {
+ var dialog = comp.element;
+ getTabview(dialog).each(function (tabview) {
+ set$2(tabview, 'visibility', 'hidden');
+ comp.getSystem().getByDom(tabview).toOptional().each(function (tabviewComp) {
+ var heights = measureHeights(allTabs, tabview, tabviewComp);
+ var maxTabHeightOpt = getMaxHeight(heights);
+ maxTabHeight.set(maxTabHeightOpt);
+ });
+ updateTabviewHeight(dialog, tabview, maxTabHeight);
+ remove$6(tabview, 'visibility');
+ showTab(allTabs, comp);
+ global$2.requestAnimationFrame(function () {
+ updateTabviewHeight(dialog, tabview, maxTabHeight);
+ });
+ });
+ }),
+ run(windowResize(), function (comp) {
+ var dialog = comp.element;
+ getTabview(dialog).each(function (tabview) {
+ updateTabviewHeight(dialog, tabview, maxTabHeight);
+ });
+ }),
+ run(formResizeEvent, function (comp, _se) {
+ var dialog = comp.element;
+ getTabview(dialog).each(function (tabview) {
+ var oldFocus = active(getRootNode(tabview));
+ set$2(tabview, 'visibility', 'hidden');
+ var oldHeight = getRaw(tabview, 'height').map(function (h) {
+ return parseInt(h, 10);
+ });
+ remove$6(tabview, 'height');
+ remove$6(tabview, 'flex-basis');
+ var newHeight = tabview.dom.getBoundingClientRect().height;
+ var hasGrown = oldHeight.forall(function (h) {
+ return newHeight > h;
+ });
+ if (hasGrown) {
+ maxTabHeight.set(Optional.from(newHeight));
+ updateTabviewHeight(dialog, tabview, maxTabHeight);
+ } else {
+ oldHeight.each(function (h) {
+ setTabviewHeight(tabview, h);
+ });
+ }
+ remove$6(tabview, 'visibility');
+ oldFocus.each(focus$1);
+ });
+ })
+ ];
+ var selectFirst = false;
+ return {
+ extraEvents: extraEvents,
+ selectFirst: selectFirst
+ };
+ }();
+ var naiveTabHeight = function () {
+ var extraEvents = [];
+ var selectFirst = true;
+ return {
+ extraEvents: extraEvents,
+ selectFirst: selectFirst
+ };
+ }();
+ return {
+ smartTabHeight: smartTabHeight,
+ naiveTabHeight: naiveTabHeight
+ };
+ };
+
+ var SendDataToSectionChannel = 'send-data-to-section';
+ var SendDataToViewChannel = 'send-data-to-view';
+ var renderTabPanel = function (spec, backstage) {
+ var storedValue = Cell({});
+ var updateDataWithForm = function (form) {
+ var formData = Representing.getValue(form);
+ var validData = toValidValues(formData).getOr({});
+ var currentData = storedValue.get();
+ var newData = deepMerge(currentData, validData);
+ storedValue.set(newData);
+ };
+ var setDataOnForm = function (form) {
+ var tabData = storedValue.get();
+ Representing.setValue(form, tabData);
+ };
+ var oldTab = Cell(null);
+ var allTabs = map(spec.tabs, function (tab) {
+ return {
+ value: tab.name,
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__body-nav-item'],
+ innerHtml: backstage.shared.providers.translate(tab.title)
+ },
+ view: function () {
+ return [Form.sketch(function (parts) {
+ return {
+ dom: {
+ tag: 'div',
+ classes: ['tox-form']
+ },
+ components: map(tab.items, function (item) {
+ return interpretInForm(parts, item, backstage);
+ }),
+ formBehaviours: derive$1([
+ Keying.config({
+ mode: 'acyclic',
+ useTabstopAt: not(isPseudoStop)
+ }),
+ config('TabView.form.events', [
+ runOnAttached(setDataOnForm),
+ runOnDetached(updateDataWithForm)
+ ]),
+ Receiving.config({
+ channels: wrapAll$1([
+ {
+ key: SendDataToSectionChannel,
+ value: { onReceive: updateDataWithForm }
+ },
+ {
+ key: SendDataToViewChannel,
+ value: { onReceive: setDataOnForm }
+ }
+ ])
+ })
+ ])
+ };
+ })];
+ }
+ };
+ });
+ var tabMode = setMode(allTabs).smartTabHeight;
+ return TabSection.sketch({
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__body']
+ },
+ onChangeTab: function (section, button, _viewItems) {
+ var name = Representing.getValue(button);
+ emitWith(section, formTabChangeEvent, {
+ name: name,
+ oldName: oldTab.get()
+ });
+ oldTab.set(name);
+ },
+ tabs: allTabs,
+ components: [
+ TabSection.parts.tabbar({
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__body-nav']
+ },
+ components: [Tabbar.parts.tabs({})],
+ markers: {
+ tabClass: 'tox-tab',
+ selectedClass: 'tox-dialog__body-nav-item--active'
+ },
+ tabbarBehaviours: derive$1([Tabstopping.config({})])
+ }),
+ TabSection.parts.tabview({
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__body-content']
+ }
+ })
+ ],
+ selectFirst: tabMode.selectFirst,
+ tabSectionBehaviours: derive$1([
+ config('tabpanel', tabMode.extraEvents),
+ Keying.config({ mode: 'acyclic' }),
+ Composing.config({
+ find: function (comp) {
+ return head(TabSection.getViewItems(comp));
+ }
+ }),
+ Representing.config({
+ store: {
+ mode: 'manual',
+ getValue: function (tsection) {
+ tsection.getSystem().broadcastOn([SendDataToSectionChannel], {});
+ return storedValue.get();
+ },
+ setValue: function (tsection, value) {
+ storedValue.set(value);
+ tsection.getSystem().broadcastOn([SendDataToViewChannel], {});
+ }
+ }
+ })
+ ])
+ });
+ };
+
+ var dialogChannel = generate$1('update-dialog');
+ var titleChannel = generate$1('update-title');
+ var bodyChannel = generate$1('update-body');
+ var footerChannel = generate$1('update-footer');
+ var bodySendMessageChannel = generate$1('body-send-message');
+
+ var renderBody = function (spec, id, backstage, ariaAttrs) {
+
+ var renderComponents = function (incoming) {
+ switch (incoming.body.type) {
+ case 'tabpanel': {
+ return [renderTabPanel(incoming.body, backstage)];
+ }
+ default: {
+ return [renderBodyPanel(incoming.body, backstage)];
+ }
+ }
+ };
+ var updateState = function (_comp, incoming) {
+ return Optional.some({
+ isTabPanel: function () {
+ return incoming.body.type === 'tabpanel';
+ }
+ });
+ };
+ var ariaAttributes = { 'aria-live': 'polite' };
+ return {
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__content-js'],
+ attributes: __assign(__assign({}, id.map(function (x) {
+ return { id: x };
+ }).getOr({})), ariaAttrs ? ariaAttributes : {})
+ },
+ components: [],
+ behaviours: derive$1([
+ ComposingConfigs.childAt(0),
+ Reflecting.config({
+ channel: bodyChannel,
+ updateState: updateState,
+ renderComponents: renderComponents,
+ initialData: spec
+ })
+ ])
+ };
+ };
+ var renderInlineBody = function (spec, contentId, backstage, ariaAttrs) {
+ return renderBody(spec, Optional.some(contentId), backstage, ariaAttrs);
+ };
+ var renderModalBody = function (spec, backstage) {
+ var bodySpec = renderBody(spec, Optional.none(), backstage, false);
+ return ModalDialog.parts.body(bodySpec);
+ };
+ var renderIframeBody = function (spec) {
+ var bodySpec = {
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__content-js']
+ },
+ components: [{
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__body-iframe']
+ },
+ components: [craft({
+ dom: {
+ tag: 'iframe',
+ attributes: { src: spec.url }
+ },
+ behaviours: derive$1([
+ Tabstopping.config({}),
+ Focusing.config({})
+ ])
+ })]
+ }],
+ behaviours: derive$1([Keying.config({
+ mode: 'acyclic',
+ useTabstopAt: not(isPseudoStop)
+ })])
+ };
+ return ModalDialog.parts.body(bodySpec);
+ };
+
+ var isTouch = global$8.deviceType.isTouch();
+ var hiddenHeader = function (title, close) {
+ return {
+ dom: {
+ tag: 'div',
+ styles: { display: 'none' },
+ classes: ['tox-dialog__header']
+ },
+ components: [
+ title,
+ close
+ ]
+ };
+ };
+ var pClose = function (onClose, providersBackstage) {
+ return ModalDialog.parts.close(Button.sketch({
+ dom: {
+ tag: 'button',
+ classes: [
+ 'tox-button',
+ 'tox-button--icon',
+ 'tox-button--naked'
+ ],
+ attributes: {
+ 'type': 'button',
+ 'aria-label': providersBackstage.translate('Close')
+ }
+ },
+ action: onClose,
+ buttonBehaviours: derive$1([Tabstopping.config({})])
+ }));
+ };
+ var pUntitled = function () {
+ return ModalDialog.parts.title({
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__title'],
+ innerHtml: '',
+ styles: { display: 'none' }
+ }
+ });
+ };
+ var pBodyMessage = function (message, providersBackstage) {
+ return ModalDialog.parts.body({
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__body']
+ },
+ components: [{
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__body-content']
+ },
+ components: [{ dom: fromHtml$2('' + providersBackstage.translate(message) + '
') }]
+ }]
+ });
+ };
+ var pFooter = function (buttons) {
+ return ModalDialog.parts.footer({
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__footer']
+ },
+ components: buttons
+ });
+ };
+ var pFooterGroup = function (startButtons, endButtons) {
+ return [
+ Container.sketch({
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__footer-start']
+ },
+ components: startButtons
+ }),
+ Container.sketch({
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__footer-end']
+ },
+ components: endButtons
+ })
+ ];
+ };
+ var renderDialog = function (spec) {
+ var _a;
+ var dialogClass = 'tox-dialog';
+ var blockerClass = dialogClass + '-wrap';
+ var blockerBackdropClass = blockerClass + '__backdrop';
+ var scrollLockClass = dialogClass + '__disable-scroll';
+ return ModalDialog.sketch({
+ lazySink: spec.lazySink,
+ onEscape: function (comp) {
+ spec.onEscape(comp);
+ return Optional.some(true);
+ },
+ useTabstopAt: function (elem) {
+ return !isPseudoStop(elem);
+ },
+ dom: {
+ tag: 'div',
+ classes: [dialogClass].concat(spec.extraClasses),
+ styles: __assign({ position: 'relative' }, spec.extraStyles)
+ },
+ components: __spreadArrays([
+ spec.header,
+ spec.body
+ ], spec.footer.toArray()),
+ parts: {
+ blocker: {
+ dom: fromHtml$2(''),
+ components: [{
+ dom: {
+ tag: 'div',
+ classes: isTouch ? [
+ blockerBackdropClass,
+ blockerBackdropClass + '--opaque'
+ ] : [blockerBackdropClass]
+ }
+ }]
+ }
+ },
+ dragBlockClass: blockerClass,
+ modalBehaviours: derive$1(__spreadArrays([
+ Focusing.config({}),
+ config('dialog-events', spec.dialogEvents.concat([runOnSource(focusin(), function (comp, _se) {
+ Keying.focusIn(comp);
+ })])),
+ config('scroll-lock', [
+ runOnAttached(function () {
+ add$2(body(), scrollLockClass);
+ }),
+ runOnDetached(function () {
+ remove$4(body(), scrollLockClass);
+ })
+ ])
+ ], spec.extraBehaviours)),
+ eventOrder: __assign((_a = {}, _a[execute()] = ['dialog-events'], _a[attachedToDom()] = [
+ 'scroll-lock',
+ 'dialog-events',
+ 'alloy.base.behaviour'
+ ], _a[detachedFromDom()] = [
+ 'alloy.base.behaviour',
+ 'dialog-events',
+ 'scroll-lock'
+ ], _a), spec.eventOrder)
+ });
+ };
+
+ var renderClose = function (providersBackstage) {
+ return Button.sketch({
+ dom: {
+ tag: 'button',
+ classes: [
+ 'tox-button',
+ 'tox-button--icon',
+ 'tox-button--naked'
+ ],
+ attributes: {
+ 'type': 'button',
+ 'aria-label': providersBackstage.translate('Close'),
+ 'title': providersBackstage.translate('Close')
+ }
+ },
+ components: [{
+ dom: {
+ tag: 'div',
+ classes: ['tox-icon'],
+ innerHtml: get$e('close', providersBackstage.icons)
+ }
+ }],
+ action: function (comp) {
+ emit(comp, formCancelEvent);
+ }
+ });
+ };
+ var renderTitle = function (spec, id, providersBackstage) {
+ var renderComponents = function (data) {
+ return [text(providersBackstage.translate(data.title))];
+ };
+ return {
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__title'],
+ attributes: __assign({}, id.map(function (x) {
+ return { id: x };
+ }).getOr({}))
+ },
+ components: renderComponents(spec),
+ behaviours: derive$1([Reflecting.config({
+ channel: titleChannel,
+ renderComponents: renderComponents
+ })])
+ };
+ };
+ var renderDragHandle = function () {
+ return { dom: fromHtml$2('') };
+ };
+ var renderInlineHeader = function (spec, titleId, providersBackstage) {
+ return Container.sketch({
+ dom: fromHtml$2(''),
+ components: [
+ renderTitle(spec, Optional.some(titleId), providersBackstage),
+ renderDragHandle(),
+ renderClose(providersBackstage)
+ ],
+ containerBehaviours: derive$1([Dragging.config({
+ mode: 'mouse',
+ blockerClass: 'blocker',
+ getTarget: function (handle) {
+ return closest$3(handle, '[role="dialog"]').getOrDie();
+ },
+ snaps: {
+ getSnapPoints: function () {
+ return [];
+ },
+ leftAttr: 'data-drag-left',
+ topAttr: 'data-drag-top'
+ }
+ })])
+ });
+ };
+ var renderModalHeader = function (spec, providersBackstage) {
+ var pTitle = ModalDialog.parts.title(renderTitle(spec, Optional.none(), providersBackstage));
+ var pHandle = ModalDialog.parts.draghandle(renderDragHandle());
+ var pClose = ModalDialog.parts.close(renderClose(providersBackstage));
+ var components = [pTitle].concat(spec.draggable ? [pHandle] : []).concat([pClose]);
+ return Container.sketch({
+ dom: fromHtml$2(''),
+ components: components
+ });
+ };
+
+ var getHeader = function (title, backstage) {
+ return renderModalHeader({
+ title: backstage.shared.providers.translate(title),
+ draggable: backstage.dialog.isDraggableModal()
+ }, backstage.shared.providers);
+ };
+ var getBusySpec = function (message, bs, providers) {
+ return {
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__busy-spinner'],
+ attributes: { 'aria-label': providers.translate(message) },
+ styles: {
+ left: '0px',
+ right: '0px',
+ bottom: '0px',
+ top: '0px',
+ position: 'absolute'
+ }
+ },
+ behaviours: bs,
+ components: [{ dom: fromHtml$2('') }]
+ };
+ };
+ var getEventExtras = function (lazyDialog, providers, extra) {
+ return {
+ onClose: function () {
+ return extra.closeWindow();
+ },
+ onBlock: function (blockEvent) {
+ ModalDialog.setBusy(lazyDialog(), function (_comp, bs) {
+ return getBusySpec(blockEvent.message, bs, providers);
+ });
+ },
+ onUnblock: function () {
+ ModalDialog.setIdle(lazyDialog());
+ }
+ };
+ };
+ var renderModalDialog = function (spec, initialData, dialogEvents, backstage) {
+ var _a;
+ var updateState = function (_comp, incoming) {
+ return Optional.some(incoming);
+ };
+ return build$1(renderDialog(__assign(__assign({}, spec), {
+ lazySink: backstage.shared.getSink,
+ extraBehaviours: __spreadArrays([
+ Reflecting.config({
+ channel: dialogChannel,
+ updateState: updateState,
+ initialData: initialData
+ }),
+ RepresentingConfigs.memory({})
+ ], spec.extraBehaviours),
+ onEscape: function (comp) {
+ emit(comp, formCancelEvent);
+ },
+ dialogEvents: dialogEvents,
+ eventOrder: (_a = {}, _a[receive()] = [
+ Reflecting.name(),
+ Receiving.name()
+ ], _a[attachedToDom()] = [
+ 'scroll-lock',
+ Reflecting.name(),
+ 'messages',
+ 'dialog-events',
+ 'alloy.base.behaviour'
+ ], _a[detachedFromDom()] = [
+ 'alloy.base.behaviour',
+ 'dialog-events',
+ 'messages',
+ Reflecting.name(),
+ 'scroll-lock'
+ ], _a)
+ })));
+ };
+ var mapMenuButtons = function (buttons) {
+ var mapItems = function (button) {
+ var items = map(button.items, function (item) {
+ var cell = Cell(false);
+ return __assign(__assign({}, item), { storage: cell });
+ });
+ return __assign(__assign({}, button), { items: items });
+ };
+ return map(buttons, function (button) {
+ if (button.type === 'menu') {
+ return mapItems(button);
+ }
+ return button;
+ });
+ };
+ var extractCellsToObject = function (buttons) {
+ return foldl(buttons, function (acc, button) {
+ if (button.type === 'menu') {
+ var menuButton = button;
+ return foldl(menuButton.items, function (innerAcc, item) {
+ innerAcc[item.name] = item.storage;
+ return innerAcc;
+ }, acc);
+ }
+ return acc;
+ }, {});
+ };
+
+ var initCommonEvents = function (fireApiEvent, extras) {
+ return [
+ runWithTarget(focusin(), onFocus$1),
+ fireApiEvent(formCloseEvent, function (_api, spec) {
+ extras.onClose();
+ spec.onClose();
+ }),
+ fireApiEvent(formCancelEvent, function (api, spec, _event, self) {
+ spec.onCancel(api);
+ emit(self, formCloseEvent);
+ }),
+ run(formUnblockEvent, function (_c, _se) {
+ return extras.onUnblock();
+ }),
+ run(formBlockEvent, function (_c, se) {
+ return extras.onBlock(se.event);
+ })
+ ];
+ };
+ var initUrlDialog = function (getInstanceApi, extras) {
+ var fireApiEvent = function (eventName, f) {
+ return run(eventName, function (c, se) {
+ withSpec(c, function (spec, _c) {
+ f(getInstanceApi(), spec, se.event, c);
+ });
+ });
+ };
+ var withSpec = function (c, f) {
+ Reflecting.getState(c).get().each(function (currentDialog) {
+ f(currentDialog, c);
+ });
+ };
+ return __spreadArrays(initCommonEvents(fireApiEvent, extras), [fireApiEvent(formActionEvent, function (api, spec, event) {
+ spec.onAction(api, { name: event.name });
+ })]);
+ };
+ var initDialog = function (getInstanceApi, extras, getSink) {
+ var fireApiEvent = function (eventName, f) {
+ return run(eventName, function (c, se) {
+ withSpec(c, function (spec, _c) {
+ f(getInstanceApi(), spec, se.event, c);
+ });
+ });
+ };
+ var withSpec = function (c, f) {
+ Reflecting.getState(c).get().each(function (currentDialogInit) {
+ f(currentDialogInit.internalDialog, c);
+ });
+ };
+ return __spreadArrays(initCommonEvents(fireApiEvent, extras), [
+ fireApiEvent(formSubmitEvent, function (api, spec) {
+ return spec.onSubmit(api);
+ }),
+ fireApiEvent(formChangeEvent, function (api, spec, event) {
+ spec.onChange(api, { name: event.name });
+ }),
+ fireApiEvent(formActionEvent, function (api, spec, event, component) {
+ var focusIn = function () {
+ return Keying.focusIn(component);
+ };
+ var isDisabled = function (focused) {
+ return has$1(focused, 'disabled') || getOpt(focused, 'aria-disabled').exists(function (val) {
+ return val === 'true';
+ });
+ };
+ var rootNode = getRootNode(component.element);
+ var current = active(rootNode);
+ spec.onAction(api, {
+ name: event.name,
+ value: event.value
+ });
+ active(rootNode).fold(focusIn, function (focused) {
+ if (isDisabled(focused)) {
+ focusIn();
+ } else if (current.exists(function (cur) {
+ return contains$2(focused, cur) && isDisabled(cur);
+ })) {
+ focusIn();
+ } else {
+ getSink().toOptional().filter(function (sink) {
+ return !contains$2(sink.element, focused);
+ }).each(focusIn);
+ }
+ });
+ }),
+ fireApiEvent(formTabChangeEvent, function (api, spec, event) {
+ spec.onTabChange(api, {
+ newTabName: event.name,
+ oldTabName: event.oldName
+ });
+ }),
+ runOnDetached(function (component) {
+ var api = getInstanceApi();
+ Representing.setValue(component, api.getData());
+ })
+ ]);
+ };
+ var SilverDialogEvents = {
+ initUrlDialog: initUrlDialog,
+ initDialog: initDialog
+ };
+
+ var makeButton = function (button, backstage) {
+ return renderFooterButton(button, button.type, backstage);
+ };
+ var lookup$2 = function (compInSystem, footerButtons, buttonName) {
+ return find(footerButtons, function (button) {
+ return button.name === buttonName;
+ }).bind(function (memButton) {
+ return memButton.memento.getOpt(compInSystem);
+ });
+ };
+ var renderComponents = function (_data, state) {
+ var footerButtons = state.map(function (s) {
+ return s.footerButtons;
+ }).getOr([]);
+ var buttonGroups = partition(footerButtons, function (button) {
+ return button.align === 'start';
+ });
+ var makeGroup = function (edge, buttons) {
+ return Container.sketch({
+ dom: {
+ tag: 'div',
+ classes: ['tox-dialog__footer-' + edge]
+ },
+ components: map(buttons, function (button) {
+ return button.memento.asSpec();
+ })
+ });
+ };
+ var startButtons = makeGroup('start', buttonGroups.pass);
+ var endButtons = makeGroup('end', buttonGroups.fail);
+ return [
+ startButtons,
+ endButtons
+ ];
+ };
+ var renderFooter = function (initSpec, backstage) {
+ var updateState = function (_comp, data) {
+ var footerButtons = map(data.buttons, function (button) {
+ var memButton = record(makeButton(button, backstage));
+ return {
+ name: button.name,
+ align: button.align,
+ memento: memButton
+ };
+ });
+ var lookupByName = function (compInSystem, buttonName) {
+ return lookup$2(compInSystem, footerButtons, buttonName);
+ };
+ return Optional.some({
+ lookupByName: lookupByName,
+ footerButtons: footerButtons
+ });
+ };
+ return {
+ dom: fromHtml$2(''),
+ components: [],
+ behaviours: derive$1([Reflecting.config({
+ channel: footerChannel,
+ initialData: initSpec,
+ updateState: updateState,
+ renderComponents: renderComponents
+ })])
+ };
+ };
+ var renderInlineFooter = function (initSpec, backstage) {
+ return renderFooter(initSpec, backstage);
+ };
+ var renderModalFooter = function (initSpec, backstage) {
+ return ModalDialog.parts.footer(renderFooter(initSpec, backstage));
+ };
+
+ var getCompByName = function (access, name) {
+ var root = access.getRoot();
+ if (root.getSystem().isConnected()) {
+ var form_1 = Composing.getCurrent(access.getFormWrapper()).getOr(access.getFormWrapper());
+ return Form.getField(form_1, name).fold(function () {
+ var footer = access.getFooter();
+ var footerState = Reflecting.getState(footer);
+ return footerState.get().bind(function (f) {
+ return f.lookupByName(form_1, name);
+ });
+ }, function (comp) {
+ return Optional.some(comp);
+ });
+ } else {
+ return Optional.none();
+ }
+ };
+ var validateData = function (access, data) {
+ var root = access.getRoot();
+ return Reflecting.getState(root).get().map(function (dialogState) {
+ return getOrDie(asRaw('data', dialogState.dataValidator, data));
+ }).getOr(data);
+ };
+ var getDialogApi = function (access, doRedial, menuItemStates) {
+ var withRoot = function (f) {
+ var root = access.getRoot();
+ if (root.getSystem().isConnected()) {
+ f(root);
+ }
+ };
+ var getData = function () {
+ var root = access.getRoot();
+ var valueComp = root.getSystem().isConnected() ? access.getFormWrapper() : root;
+ var representedValues = Representing.getValue(valueComp);
+ var menuItemCurrentState = map$2(menuItemStates, function (cell) {
+ return cell.get();
+ });
+ return __assign(__assign({}, representedValues), menuItemCurrentState);
+ };
+ var setData = function (newData) {
+ withRoot(function (_) {
+ var prevData = instanceApi.getData();
+ var mergedData = __assign(__assign({}, prevData), newData);
+ var newInternalData = validateData(access, mergedData);
+ var form = access.getFormWrapper();
+ Representing.setValue(form, newInternalData);
+ each$1(menuItemStates, function (v, k) {
+ if (has(mergedData, k)) {
+ v.set(mergedData[k]);
+ }
+ });
+ });
+ };
+ var disable = function (name) {
+ getCompByName(access, name).each(Disabling.disable);
+ };
+ var enable = function (name) {
+ getCompByName(access, name).each(Disabling.enable);
+ };
+ var focus = function (name) {
+ getCompByName(access, name).each(Focusing.focus);
+ };
+ var block = function (message) {
+ if (!isString(message)) {
+ throw new Error('The dialogInstanceAPI.block function should be passed a blocking message of type string as an argument');
+ }
+ withRoot(function (root) {
+ emitWith(root, formBlockEvent, { message: message });
+ });
+ };
+ var unblock = function () {
+ withRoot(function (root) {
+ emit(root, formUnblockEvent);
+ });
+ };
+ var showTab = function (name) {
+ withRoot(function (_) {
+ var body = access.getBody();
+ var bodyState = Reflecting.getState(body);
+ if (bodyState.get().exists(function (b) {
+ return b.isTabPanel();
+ })) {
+ Composing.getCurrent(body).each(function (tabSection) {
+ TabSection.showTab(tabSection, name);
+ });
+ }
+ });
+ };
+ var redial = function (d) {
+ withRoot(function (root) {
+ var dialogInit = doRedial(d);
+ root.getSystem().broadcastOn([dialogChannel], dialogInit);
+ root.getSystem().broadcastOn([titleChannel], dialogInit.internalDialog);
+ root.getSystem().broadcastOn([bodyChannel], dialogInit.internalDialog);
+ root.getSystem().broadcastOn([footerChannel], dialogInit.internalDialog);
+ instanceApi.setData(dialogInit.initialData);
+ });
+ };
+ var close = function () {
+ withRoot(function (root) {
+ emit(root, formCloseEvent);
+ });
+ };
+ var instanceApi = {
+ getData: getData,
+ setData: setData,
+ disable: disable,
+ enable: enable,
+ focus: focus,
+ block: block,
+ unblock: unblock,
+ showTab: showTab,
+ redial: redial,
+ close: close
+ };
+ return instanceApi;
+ };
+
+ var getDialogSizeClasses = function (size) {
+ switch (size) {
+ case 'large':
+ return ['tox-dialog--width-lg'];
+ case 'medium':
+ return ['tox-dialog--width-md'];
+ default:
+ return [];
+ }
+ };
+ var renderDialog$1 = function (dialogInit, extra, backstage) {
+ var header = getHeader(dialogInit.internalDialog.title, backstage);
+ var body = renderModalBody({ body: dialogInit.internalDialog.body }, backstage);
+ var storagedMenuButtons = mapMenuButtons(dialogInit.internalDialog.buttons);
+ var objOfCells = extractCellsToObject(storagedMenuButtons);
+ var footer = renderModalFooter({ buttons: storagedMenuButtons }, backstage);
+ var dialogEvents = SilverDialogEvents.initDialog(function () {
+ return instanceApi;
+ }, getEventExtras(function () {
+ return dialog;
+ }, backstage.shared.providers, extra), backstage.shared.getSink);
+ var dialogSize = getDialogSizeClasses(dialogInit.internalDialog.size);
+ var spec = {
+ header: header,
+ body: body,
+ footer: Optional.some(footer),
+ extraClasses: dialogSize,
+ extraBehaviours: [],
+ extraStyles: {}
+ };
+ var dialog = renderModalDialog(spec, dialogInit, dialogEvents, backstage);
+ var modalAccess = function () {
+ var getForm = function () {
+ var outerForm = ModalDialog.getBody(dialog);
+ return Composing.getCurrent(outerForm).getOr(outerForm);
+ };
+ return {
+ getRoot: function () {
+ return dialog;
+ },
+ getBody: function () {
+ return ModalDialog.getBody(dialog);
+ },
+ getFooter: function () {
+ return ModalDialog.getFooter(dialog);
+ },
+ getFormWrapper: getForm
+ };
+ }();
+ var instanceApi = getDialogApi(modalAccess, extra.redial, objOfCells);
+ return {
+ dialog: dialog,
+ instanceApi: instanceApi
+ };
+ };
+
+ var renderInlineDialog = function (dialogInit, extra, backstage, ariaAttrs) {
+ var _a, _b;
+ var dialogLabelId = generate$1('dialog-label');
+ var dialogContentId = generate$1('dialog-content');
+ var updateState = function (_comp, incoming) {
+ return Optional.some(incoming);
+ };
+ var memHeader = record(renderInlineHeader({
+ title: dialogInit.internalDialog.title,
+ draggable: true
+ }, dialogLabelId, backstage.shared.providers));
+ var memBody = record(renderInlineBody({ body: dialogInit.internalDialog.body }, dialogContentId, backstage, ariaAttrs));
+ var storagedMenuButtons = mapMenuButtons(dialogInit.internalDialog.buttons);
+ var objOfCells = extractCellsToObject(storagedMenuButtons);
+ var memFooter = record(renderInlineFooter({ buttons: storagedMenuButtons }, backstage));
+ var dialogEvents = SilverDialogEvents.initDialog(function () {
+ return instanceApi;
+ }, {
+ onBlock: function (event) {
+ Blocking.block(dialog, function (_comp, bs) {
+ return getBusySpec(event.message, bs, backstage.shared.providers);
+ });
+ },
+ onUnblock: function () {
+ Blocking.unblock(dialog);
+ },
+ onClose: function () {
+ return extra.closeWindow();
+ }
+ }, backstage.shared.getSink);
+ var dialog = build$1({
+ dom: {
+ tag: 'div',
+ classes: [
+ 'tox-dialog',
+ 'tox-dialog-inline'
+ ],
+ attributes: (_a = { role: 'dialog' }, _a['aria-labelledby'] = dialogLabelId, _a['aria-describedby'] = '' + dialogContentId, _a)
+ },
+ eventOrder: (_b = {}, _b[receive()] = [
+ Reflecting.name(),
+ Receiving.name()
+ ], _b[execute()] = ['execute-on-form'], _b[attachedToDom()] = [
+ 'reflecting',
+ 'execute-on-form'
+ ], _b),
+ behaviours: derive$1([
+ Keying.config({
+ mode: 'cyclic',
+ onEscape: function (c) {
+ emit(c, formCloseEvent);
+ return Optional.some(true);
+ },
+ useTabstopAt: function (elem) {
+ return !isPseudoStop(elem) && (name(elem) !== 'button' || get$3(elem, 'disabled') !== 'disabled');
+ }
+ }),
+ Reflecting.config({
+ channel: dialogChannel,
+ updateState: updateState,
+ initialData: dialogInit
+ }),
+ Focusing.config({}),
+ config('execute-on-form', dialogEvents.concat([runOnSource(focusin(), function (comp, _se) {
+ Keying.focusIn(comp);
+ })])),
+ Blocking.config({
+ getRoot: function () {
+ return Optional.some(dialog);
+ }
+ }),
+ Replacing.config({}),
+ RepresentingConfigs.memory({})
+ ]),
+ components: [
+ memHeader.asSpec(),
+ memBody.asSpec(),
+ memFooter.asSpec()
+ ]
+ });
+ var instanceApi = getDialogApi({
+ getRoot: function () {
+ return dialog;
+ },
+ getFooter: function () {
+ return memFooter.get(dialog);
+ },
+ getBody: function () {
+ return memBody.get(dialog);
+ },
+ getFormWrapper: function () {
+ var body = memBody.get(dialog);
+ return Composing.getCurrent(body).getOr(body);
+ }
+ }, extra.redial, objOfCells);
+ return {
+ dialog: dialog,
+ instanceApi: instanceApi
+ };
+ };
+
+ var global$h = tinymce.util.Tools.resolve('tinymce.util.URI');
+
+ var getUrlDialogApi = function (root) {
+ var withRoot = function (f) {
+ if (root.getSystem().isConnected()) {
+ f(root);
+ }
+ };
+ var block = function (message) {
+ if (!isString(message)) {
+ throw new Error('The urlDialogInstanceAPI.block function should be passed a blocking message of type string as an argument');
+ }
+ withRoot(function (root) {
+ emitWith(root, formBlockEvent, { message: message });
+ });
+ };
+ var unblock = function () {
+ withRoot(function (root) {
+ emit(root, formUnblockEvent);
+ });
+ };
+ var close = function () {
+ withRoot(function (root) {
+ emit(root, formCloseEvent);
+ });
+ };
+ var sendMessage = function (data) {
+ withRoot(function (root) {
+ root.getSystem().broadcastOn([bodySendMessageChannel], data);
+ });
+ };
+ return {
+ block: block,
+ unblock: unblock,
+ close: close,
+ sendMessage: sendMessage
+ };
+ };
+
+ var SUPPORTED_MESSAGE_ACTIONS = [
+ 'insertContent',
+ 'setContent',
+ 'execCommand',
+ 'close',
+ 'block',
+ 'unblock'
+ ];
+ var isSupportedMessage = function (data) {
+ return isObject(data) && SUPPORTED_MESSAGE_ACTIONS.indexOf(data.mceAction) !== -1;
+ };
+ var isCustomMessage = function (data) {
+ return !isSupportedMessage(data) && isObject(data) && has(data, 'mceAction');
+ };
+ var handleMessage = function (editor, api, data) {
+ switch (data.mceAction) {
+ case 'insertContent':
+ editor.insertContent(data.content);
+ break;
+ case 'setContent':
+ editor.setContent(data.content);
+ break;
+ case 'execCommand':
+ var ui = isBoolean(data.ui) ? data.ui : false;
+ editor.execCommand(data.cmd, ui, data.value);
+ break;
+ case 'close':
+ api.close();
+ break;
+ case 'block':
+ api.block(data.message);
+ break;
+ case 'unblock':
+ api.unblock();
+ break;
+ }
+ };
+ var renderUrlDialog = function (internalDialog, extra, editor, backstage) {
+ var _a;
+ var header = getHeader(internalDialog.title, backstage);
+ var body = renderIframeBody(internalDialog);
+ var footer = internalDialog.buttons.bind(function (buttons) {
+ if (buttons.length === 0) {
+ return Optional.none();
+ } else {
+ return Optional.some(renderModalFooter({ buttons: buttons }, backstage));
+ }
+ });
+ var dialogEvents = SilverDialogEvents.initUrlDialog(function () {
+ return instanceApi;
+ }, getEventExtras(function () {
+ return dialog;
+ }, backstage.shared.providers, extra));
+ var styles = __assign(__assign({}, internalDialog.height.fold(function () {
+ return {};
+ }, function (height) {
+ return {
+ 'height': height + 'px',
+ 'max-height': height + 'px'
+ };
+ })), internalDialog.width.fold(function () {
+ return {};
+ }, function (width) {
+ return {
+ 'width': width + 'px',
+ 'max-width': width + 'px'
+ };
+ }));
+ var classes = internalDialog.width.isNone() && internalDialog.height.isNone() ? ['tox-dialog--width-lg'] : [];
+ var iframeUri = new global$h(internalDialog.url, { base_uri: new global$h(window.location.href) });
+ var iframeDomain = iframeUri.protocol + '://' + iframeUri.host + (iframeUri.port ? ':' + iframeUri.port : '');
+ var messageHandlerUnbinder = Cell(Optional.none());
+ var extraBehaviours = [
+ config('messages', [
+ runOnAttached(function () {
+ var unbind = bind$3(SugarElement.fromDom(window), 'message', function (e) {
+ if (iframeUri.isSameOrigin(new global$h(e.raw.origin))) {
+ var data = e.raw.data;
+ if (isSupportedMessage(data)) {
+ handleMessage(editor, instanceApi, data);
+ } else if (isCustomMessage(data)) {
+ internalDialog.onMessage(instanceApi, data);
+ }
+ }
+ });
+ messageHandlerUnbinder.set(Optional.some(unbind));
+ }),
+ runOnDetached(function () {
+ messageHandlerUnbinder.get().each(function (unbinder) {
+ return unbinder.unbind();
+ });
+ })
+ ]),
+ Receiving.config({
+ channels: (_a = {}, _a[bodySendMessageChannel] = {
+ onReceive: function (comp, data) {
+ descendant$1(comp.element, 'iframe').each(function (iframeEle) {
+ var iframeWin = iframeEle.dom.contentWindow;
+ iframeWin.postMessage(data, iframeDomain);
+ });
+ }
+ }, _a)
+ })
+ ];
+ var spec = {
+ header: header,
+ body: body,
+ footer: footer,
+ extraClasses: classes,
+ extraBehaviours: extraBehaviours,
+ extraStyles: styles
+ };
+ var dialog = renderModalDialog(spec, internalDialog, dialogEvents, backstage);
+ var instanceApi = getUrlDialogApi(dialog);
+ return {
+ dialog: dialog,
+ instanceApi: instanceApi
+ };
+ };
+
+ var setup$c = function (extras) {
+ var sharedBackstage = extras.backstage.shared;
+ var open = function (message, callback) {
+ var closeDialog = function () {
+ ModalDialog.hide(alertDialog);
+ callback();
+ };
+ var memFooterClose = record(renderFooterButton({
+ name: 'close-alert',
+ text: 'OK',
+ primary: true,
+ align: 'end',
+ disabled: false,
+ icon: Optional.none()
+ }, 'cancel', extras.backstage));
+ var titleSpec = pUntitled();
+ var closeSpec = pClose(closeDialog, sharedBackstage.providers);
+ var alertDialog = build$1(renderDialog({
+ lazySink: function () {
+ return sharedBackstage.getSink();
+ },
+ header: hiddenHeader(titleSpec, closeSpec),
+ body: pBodyMessage(message, sharedBackstage.providers),
+ footer: Optional.some(pFooter(pFooterGroup([], [memFooterClose.asSpec()]))),
+ onEscape: closeDialog,
+ extraClasses: ['tox-alert-dialog'],
+ extraBehaviours: [],
+ extraStyles: {},
+ dialogEvents: [run(formCancelEvent, closeDialog)],
+ eventOrder: {}
+ }));
+ ModalDialog.show(alertDialog);
+ var footerCloseButton = memFooterClose.get(alertDialog);
+ Focusing.focus(footerCloseButton);
+ };
+ return { open: open };
+ };
+
+ var setup$d = function (extras) {
+ var sharedBackstage = extras.backstage.shared;
+ var open = function (message, callback) {
+ var closeDialog = function (state) {
+ ModalDialog.hide(confirmDialog);
+ callback(state);
+ };
+ var memFooterYes = record(renderFooterButton({
+ name: 'yes',
+ text: 'Yes',
+ primary: true,
+ align: 'end',
+ disabled: false,
+ icon: Optional.none()
+ }, 'submit', extras.backstage));
+ var footerNo = renderFooterButton({
+ name: 'no',
+ text: 'No',
+ primary: false,
+ align: 'end',
+ disabled: false,
+ icon: Optional.none()
+ }, 'cancel', extras.backstage);
+ var titleSpec = pUntitled();
+ var closeSpec = pClose(function () {
+ return closeDialog(false);
+ }, sharedBackstage.providers);
+ var confirmDialog = build$1(renderDialog({
+ lazySink: function () {
+ return sharedBackstage.getSink();
+ },
+ header: hiddenHeader(titleSpec, closeSpec),
+ body: pBodyMessage(message, sharedBackstage.providers),
+ footer: Optional.some(pFooter(pFooterGroup([], [
+ footerNo,
+ memFooterYes.asSpec()
+ ]))),
+ onEscape: function () {
+ return closeDialog(false);
+ },
+ extraClasses: ['tox-confirm-dialog'],
+ extraBehaviours: [],
+ extraStyles: {},
+ dialogEvents: [
+ run(formCancelEvent, function () {
+ return closeDialog(false);
+ }),
+ run(formSubmitEvent, function () {
+ return closeDialog(true);
+ })
+ ],
+ eventOrder: {}
+ }));
+ ModalDialog.show(confirmDialog);
+ var footerYesButton = memFooterYes.get(confirmDialog);
+ Focusing.focus(footerYesButton);
+ };
+ return { open: open };
+ };
+
+ var validateData$1 = function (data, validator) {
+ return getOrDie(asRaw('data', validator, data));
+ };
+ var isAlertOrConfirmDialog = function (target) {
+ return closest$4(target, '.tox-alert-dialog') || closest$4(target, '.tox-confirm-dialog');
+ };
+ var inlineAdditionalBehaviours = function (editor, isStickyToolbar, isToolbarLocationTop) {
+ if (isStickyToolbar && isToolbarLocationTop) {
+ return [];
+ } else {
+ return [Docking.config({
+ contextual: {
+ lazyContext: function () {
+ return Optional.some(box(SugarElement.fromDom(editor.getContentAreaContainer())));
+ },
+ fadeInClass: 'tox-dialog-dock-fadein',
+ fadeOutClass: 'tox-dialog-dock-fadeout',
+ transitionClass: 'tox-dialog-dock-transition'
+ },
+ modes: ['top']
+ })];
+ }
+ };
+ var setup$e = function (extras) {
+ var backstage = extras.backstage;
+ var editor = extras.editor;
+ var isStickyToolbar$1 = isStickyToolbar(editor);
+ var alertDialog = setup$c(extras);
+ var confirmDialog = setup$d(extras);
+ var open = function (config, params, closeWindow) {
+ if (params !== undefined && params.inline === 'toolbar') {
+ return openInlineDialog(config, backstage.shared.anchors.inlineDialog(), closeWindow, params.ariaAttrs);
+ } else if (params !== undefined && params.inline === 'cursor') {
+ return openInlineDialog(config, backstage.shared.anchors.cursor(), closeWindow, params.ariaAttrs);
+ } else {
+ return openModalDialog(config, closeWindow);
+ }
+ };
+ var openUrl = function (config, closeWindow) {
+ return openModalUrlDialog(config, closeWindow);
+ };
+ var openModalUrlDialog = function (config, closeWindow) {
+ var factory = function (contents) {
+ var dialog = renderUrlDialog(contents, {
+ closeWindow: function () {
+ ModalDialog.hide(dialog.dialog);
+ closeWindow(dialog.instanceApi);
+ }
+ }, editor, backstage);
+ ModalDialog.show(dialog.dialog);
+ return dialog.instanceApi;
+ };
+ return DialogManager.openUrl(factory, config);
+ };
+ var openModalDialog = function (config, closeWindow) {
+ var factory = function (contents, internalInitialData, dataValidator) {
+ var initialData = internalInitialData;
+ var dialogInit = {
+ dataValidator: dataValidator,
+ initialData: initialData,
+ internalDialog: contents
+ };
+ var dialog = renderDialog$1(dialogInit, {
+ redial: DialogManager.redial,
+ closeWindow: function () {
+ ModalDialog.hide(dialog.dialog);
+ closeWindow(dialog.instanceApi);
+ }
+ }, backstage);
+ ModalDialog.show(dialog.dialog);
+ dialog.instanceApi.setData(initialData);
+ return dialog.instanceApi;
+ };
+ return DialogManager.open(factory, config);
+ };
+ var openInlineDialog = function (config$1, anchor, closeWindow, ariaAttrs) {
+ var factory = function (contents, internalInitialData, dataValidator) {
+ var initialData = validateData$1(internalInitialData, dataValidator);
+ var inlineDialog = value$3();
+ var isToolbarLocationTop = backstage.shared.header.isPositionedAtTop();
+ var dialogInit = {
+ dataValidator: dataValidator,
+ initialData: initialData,
+ internalDialog: contents
+ };
+ var refreshDocking = function () {
+ return inlineDialog.on(function (dialog) {
+ InlineView.reposition(dialog);
+ Docking.refresh(dialog);
+ });
+ };
+ var dialogUi = renderInlineDialog(dialogInit, {
+ redial: DialogManager.redial,
+ closeWindow: function () {
+ inlineDialog.on(InlineView.hide);
+ editor.off('ResizeEditor', refreshDocking);
+ inlineDialog.clear();
+ closeWindow(dialogUi.instanceApi);
+ }
+ }, backstage, ariaAttrs);
+ var inlineDialogComp = build$1(InlineView.sketch(__assign(__assign({
+ lazySink: backstage.shared.getSink,
+ dom: {
+ tag: 'div',
+ classes: []
+ },
+ fireDismissalEventInstead: {}
+ }, isToolbarLocationTop ? {} : { fireRepositionEventInstead: {} }), {
+ inlineBehaviours: derive$1(__spreadArrays([config('window-manager-inline-events', [run(dismissRequested(), function (_comp, _se) {
+ emit(dialogUi.dialog, formCancelEvent);
+ })])], inlineAdditionalBehaviours(editor, isStickyToolbar$1, isToolbarLocationTop))),
+ isExtraPart: function (_comp, target) {
+ return isAlertOrConfirmDialog(target);
+ }
+ })));
+ inlineDialog.set(inlineDialogComp);
+ InlineView.showWithin(inlineDialogComp, anchor, premade$1(dialogUi.dialog), Optional.some(body()));
+ if (!isStickyToolbar$1 || !isToolbarLocationTop) {
+ Docking.refresh(inlineDialogComp);
+ editor.on('ResizeEditor', refreshDocking);
+ }
+ dialogUi.instanceApi.setData(initialData);
+ Keying.focusIn(dialogUi.dialog);
+ return dialogUi.instanceApi;
+ };
+ return DialogManager.open(factory, config$1);
+ };
+ var confirm = function (message, callback) {
+ confirmDialog.open(message, function (state) {
+ callback(state);
+ });
+ };
+ var alert = function (message, callback) {
+ alertDialog.open(message, function () {
+ callback();
+ });
+ };
+ var close = function (instanceApi) {
+ instanceApi.close();
+ };
+ return {
+ open: open,
+ openUrl: openUrl,
+ alert: alert,
+ close: close,
+ confirm: confirm
+ };
+ };
+
+ function Theme () {
+ global$1.add('silver', function (editor) {
+ var _a = setup$b(editor), uiMothership = _a.uiMothership, backstage = _a.backstage, renderUI = _a.renderUI, getUi = _a.getUi;
+ Autocompleter.register(editor, backstage.shared);
+ var windowMgr = setup$e({
+ editor: editor,
+ backstage: backstage
+ });
+ return {
+ renderUI: renderUI,
+ getWindowManagerImpl: constant(windowMgr),
+ getNotificationManagerImpl: function () {
+ return NotificationManagerImpl(editor, { backstage: backstage }, uiMothership);
+ },
+ ui: getUi()
+ };
+ });
+ }
+
+ Theme();
+
+}());
diff --git a/src/components/time-line/index.vue b/src/components/time-line/index.vue
new file mode 100644
index 0000000..a487256
--- /dev/null
+++ b/src/components/time-line/index.vue
@@ -0,0 +1,267 @@
+
+
+
+
+
+
+
+
diff --git a/src/filters/index.js b/src/filters/index.js
new file mode 100644
index 0000000..ffd9f8d
--- /dev/null
+++ b/src/filters/index.js
@@ -0,0 +1,46 @@
+
+import { formatDate, getAge, desensitizeField } from '@/utils/index.js'
+
+// --------------------------------------------------【杂项】--------------------------------------------------
+// 性别
+export const f_sex = (val) => {
+ return val ? val.replace('性', '') : ''
+}
+// --------------------------------------------------【日期】--------------------------------------------------
+// 月份日期过滤器
+export const convertDate = (val) => {
+ return formatDate(val, 'MM-DD')
+}
+// 年过滤器
+export const convertYear = (val) => {
+ return formatDate(val, 'MM-DD')
+}
+// 年月日过滤器(xxxx年x月xx日)
+export const dateFilterOne = (val) => {
+ return formatDate(val, 'yyyy年MM月dd日')
+}
+// 年月日过滤器(yyyy-MM-dd)
+export const dateFilterTwo = (val) => {
+ return formatDate(val, 'yyyy-MM-dd')
+}
+// 年月日过滤器(yyyyMMdd)
+export const dateFilterThree = (val) => {
+ return formatDate(val, 'yyyyMMdd')
+}
+// 根据出生日期获取年龄
+export const f_getAge = (val) => {
+ return val ? getAge(val) : ''
+}
+// --------------------------------------------------【脱敏】--------------------------------------------------
+// 身份证号
+export const f_desensitize_idNumber = (val) => {
+ return desensitizeField(val, 6, 4, '********')
+}
+// 联系电话
+export const f_desensitize_phone = (val) => {
+ return desensitizeField(val, 4, 4, '****')
+}
+// 姓名
+export const f_desensitize_name = (val) => {
+ return desensitizeField(val, 1, (val && val.length) > 2 ? 1 : 0)
+}
diff --git a/src/i18n/en-US.js b/src/i18n/en-US.js
new file mode 100644
index 0000000..7b93bb5
--- /dev/null
+++ b/src/i18n/en-US.js
@@ -0,0 +1,508 @@
+const t = {}
+
+t.loading = 'Loading...'
+
+t.brand = {}
+t.brand.lg = 'Subspecialty system'
+t.brand.mini = 'YZK'
+
+t.add = 'Add'
+t.delete = 'Delete'
+t.deleteBatch = 'Delete'
+t.update = 'Edit'
+t.manage = 'Manage'
+t.query = 'Query'
+t.export = 'Export'
+t.handle = 'Action'
+t.confirm = 'Confirm'
+t.cancel = 'Cancel'
+t.clear = 'Clear'
+t.logout = 'Sign Out'
+t.createDate = 'Create Time'
+t.updateDate = 'Update Time'
+t.keyword = 'Keyword'
+t.choose = 'Please Choose'
+t.fileName = 'File Name'
+t.design = 'Online Design'
+t.preview = 'Preview'
+
+t.prompt = {}
+t.prompt.title = 'Prompt'
+t.prompt.info = 'Confirm to carry out [{handle}] operation?'
+t.prompt.success = 'Succeeded'
+t.prompt.failed = 'Failed'
+t.prompt.deleteBatch = 'Please select delete item'
+
+t.validate = {}
+t.validate.required = 'Required field cannot be empty'
+t.validate.format = '{attr} format error'
+
+t.upload = {}
+t.upload.text = 'Drop files here, or Click Upload'
+t.upload.tip = 'Only support {format} format files! '
+t.upload.button = 'Click to upload'
+
+t.datePicker = {}
+t.datePicker.range = 'To'
+t.datePicker.start = 'Start Date'
+t.datePicker.end = 'End Date'
+
+t.fullscreen = {}
+t.fullscreen.prompt = 'Your browser does not support this operation'
+
+t.updatePassword = {}
+t.updatePassword.title = 'Change Password'
+t.updatePassword.username = 'Account'
+t.updatePassword.password = 'Original'
+t.updatePassword.newPassword = 'New Password'
+t.updatePassword.confirmPassword = 'Confirm'
+t.updatePassword.validate = {}
+t.updatePassword.validate.confirmPassword = 'Confirm password is not consistent with new password input'
+
+t.contentTabs = {}
+t.contentTabs.closeCurrent = 'Close Current Tab'
+t.contentTabs.closeOther = 'Close Other Tabs'
+t.contentTabs.closeAll = 'Close All Tabs'
+
+/* pages */
+t.notFound = {}
+t.notFound.desc = 'Sorry! missing on the page you visited...'
+t.notFound.back = 'Previous Page'
+t.notFound.home = 'Home'
+
+t.login = {}
+t.login.title = 'Sign In'
+t.login.username = 'Username'
+t.login.password = 'Password'
+t.login.captcha = 'Verification Code'
+t.login.demo = 'Demo'
+t.login.copyright = 'Renren'
+
+t.home = {}
+t.home.sysInfo = {}
+t.home.sysInfo.name = 'System Name'
+t.home.sysInfo.nameVal = 'renren-security [Enterprise]'
+t.home.sysInfo.version = 'Version Information'
+t.home.sysInfo.versionVal = window.SITE_CONFIG['version']
+t.home.sysInfo.osName = 'Operating System'
+t.home.sysInfo.osVersion = 'System Version'
+t.home.sysInfo.osArch = 'System Architecture'
+t.home.sysInfo.processors = 'CPU Core Count'
+t.home.sysInfo.totalPhysical = 'system Memory'
+t.home.sysInfo.freePhysical = 'Remaining Memory'
+t.home.sysInfo.memoryRate = 'Memory Usage'
+t.home.sysInfo.userLanguage = 'System Language'
+t.home.sysInfo.jvmName = 'JVM Information'
+t.home.sysInfo.javaVersion = 'JVM Version'
+t.home.sysInfo.javaHome = 'JAVA_HOME'
+t.home.sysInfo.userDir = 'Working Directory'
+t.home.sysInfo.javaTotalMemory = 'JVM Occupies Memory'
+t.home.sysInfo.javaFreeMemory = 'JVM Free Memory'
+t.home.sysInfo.javaMaxMemory = 'JVM Max Memory'
+t.home.sysInfo.userName = 'Current User'
+t.home.sysInfo.systemCpuLoad = 'CPU Load'
+t.home.sysInfo.userTimezone = 'System Time Zone'
+
+/* modules */
+t.model = {}
+t.model.name = 'Name'
+t.model.key = 'Information'
+t.model.version = 'Version'
+t.model.createTime = 'Create Time'
+t.model.lastUpdateTime = 'Update Time'
+t.model.design = 'Online Design'
+t.model.deploy = 'Deployment'
+t.model.description = 'Description'
+
+t.process = {}
+t.process.name = 'name'
+t.process.key = 'Identification'
+t.process.deployFile = 'Deploy process file'
+t.process.id = 'Process ID'
+t.process.deploymentId = 'Deployment ID'
+t.process.version = 'Version'
+t.process.resourceName = 'XML'
+t.process.diagramResourceName = 'Image'
+t.process.deploymentTime = 'Deployment Time'
+t.process.active = 'Activate'
+t.process.suspend = 'Hang'
+t.process.convertToModel = 'Convert to model'
+t.process.bizRouteSet = 'Configuring Business Routing'
+t.process.bizRoute = 'Business Routing'
+
+t.running = {}
+t.running.id = 'Instance ID'
+t.running.definitionKey = 'Define Key'
+t.running.processDefinitionId = 'Define ID'
+t.running.processDefinitionName = 'Process Name'
+t.running.activityId = 'Current Link'
+t.running.suspended = 'Whether Hang'
+t.running.suspended0 = 'No'
+t.running.suspended1 = 'Yes'
+
+t.process.createInstance = 'initiation process'
+
+t.news = {}
+t.news.title = 'Title'
+t.news.pubDate = 'Publish Time'
+t.news.createDate = 'Create Time'
+t.news.content = 'Content'
+
+t.schedule = {}
+t.schedule.beanName = 'Bean Name'
+t.schedule.beanNameTips = 'Spring bean name, eg: testTask'
+t.schedule.pauseBatch = 'Pause'
+t.schedule.resumeBatch = 'Recovery'
+t.schedule.runBatch = 'Execution'
+t.schedule.log = 'Log List'
+t.schedule.params = 'Parameters'
+t.schedule.cronExpression = 'Cron Expression'
+t.schedule.cronExpressionTips = 'Example: 0 0 12 * * ?'
+t.schedule.remark = 'Remarks'
+t.schedule.status = 'Status'
+t.schedule.status0 = 'Pause'
+t.schedule.status1 = 'Normal'
+t.schedule.statusLog0 = 'Failed'
+t.schedule.statusLog1 = 'Success'
+t.schedule.pause = 'Pause'
+t.schedule.resume = 'Restore'
+t.schedule.run = 'Execute'
+t.schedule.jobId = 'Task ID'
+t.schedule.times = 'Time-consuming (unit: milliseconds)'
+t.schedule.createDate = 'Execution Time'
+
+t.mail = {}
+t.mail.name = 'Name'
+t.mail.config = 'Mail Configuration'
+t.mail.subject = 'Theme'
+t.mail.createDate = 'Create Time'
+t.mail.send = 'Send Mail'
+t.mail.content = 'Content'
+t.mail.smtp = 'SMTP'
+t.mail.port = 'Port Number'
+t.mail.username = 'Email Account'
+t.mail.password = 'Mailbox Password'
+t.mail.mailTo = 'Recipient'
+t.mail.mailCc = 'Cc'
+t.mail.params = 'Template Parameter'
+t.mail.paramsTips = 'Example: {"code": "123456"}'
+t.mail.templateId = 'Template ID'
+t.mail.status = 'Status'
+t.mail.status0 = 'Send Failed'
+t.mail.status1 = 'Successfully Sent'
+t.mail.mailFrom = 'Sender'
+t.mail.createDate = 'Send Time'
+
+t.sms = {}
+t.sms.mobile = 'Mobile Number'
+t.sms.status = 'Status'
+t.sms.status0 = 'Send Failed'
+t.sms.status1 = 'Successfully Sent'
+t.sms.config = 'SMS Configuration'
+t.sms.send = 'Send SMS'
+t.sms.platform = 'platform Type'
+t.sms.platform1 = 'Alibaba Cloud'
+t.sms.platform2 = 'Tencent Cloud'
+t.sms.params = 'Parameters'
+t.sms.paramsTips = 'eg: {"code": "123456"}'
+t.sms.params1 = 'Parameter 1'
+t.sms.params2 = 'Parameter 2'
+t.sms.params3 = 'Parameter 3'
+t.sms.params4 = 'Parameter 4'
+t.sms.createDate = 'Send Time'
+t.sms.aliyunAccessKeyId = 'Key'
+t.sms.aliyunAccessKeyIdTips = 'Alibaba Cloud AccessKeyId'
+t.sms.aliyunAccessKeySecret = 'Secret'
+t.sms.aliyunAccessKeySecretTips = 'Alibaba Cloud AccessKeySecret'
+t.sms.aliyunSignName = 'SMS Signature'
+t.sms.aliyunTemplateCode = 'SMS Template'
+t.sms.aliyunTemplateCodeTips = 'SMS Template CODE'
+t.sms.qcloudAppId = 'AppId'
+t.sms.qcloudAppIdTips = 'Tencent Cloud AppId'
+t.sms.qcloudAppKey = 'AppKey'
+t.sms.qcloudAppKeyTips = 'Tencent Cloud AppKey'
+t.sms.qcloudSignName = 'SMS Signature'
+t.sms.qcloudTemplateId = 'SMS Template'
+t.sms.qcloudTemplateIdTips = 'SMS template ID'
+
+t.oss = {}
+t.oss.config = 'Cloud Storage Configuration'
+t.oss.upload = 'Upload File'
+t.oss.url = 'URL Address'
+t.oss.createDate = 'Create Time'
+t.oss.type = 'Type'
+t.oss.type1 = 'Seven Cows'
+t.oss.type2 = 'Alibaba Cloud'
+t.oss.type3 = 'Tencent Cloud'
+t.oss.type4 = 'FastDFS'
+t.oss.type5 = 'Local Upload'
+t.oss.qiniuDomain = 'Domain Name'
+t.oss.qiniuDomainTips = 'Seven cattle bound domain name'
+t.oss.qiniuPrefix = 'Path Prefix'
+t.oss.qiniuPrefixTips = 'Do not set default to empty'
+t.oss.qiniuAccessKey = 'AccessKey'
+t.oss.qiniuAccessKeyTips = 'Seven cattle AccessKey'
+t.oss.qiniuSecretKey = 'SecretKey'
+t.oss.qiniuSecretKeyTips = 'Seven Cow SecretKey'
+t.oss.qiniuBucketName = 'Space Name'
+t.oss.qiniuBucketNameTips = 'Seven cattle storage space name'
+t.oss.aliyunDomain = 'Domain Name'
+t.oss.aliyunDomainTips = 'Alibaba Cloud bound domain name, such as: http://cdn.renren.io'
+t.oss.aliyunPrefix = 'Path Prefix'
+t.oss.aliyunPrefixTips = 'Do not set default to empty'
+t.oss.aliyunEndPoint = 'EndPoint'
+t.oss.aliyunEndPointTips = 'Ali Cloud EndPoint'
+t.oss.aliyunAccessKeyId = 'AccessKeyId'
+t.oss.aliyunAccessKeyIdTips = 'Alibaba Cloud AccessKeyId'
+t.oss.aliyunAccessKeySecret = 'AccessKeySecret'
+t.oss.aliyunAccessKeySecretTips = 'Alibaba Cloud AccessKeySecret'
+t.oss.aliyunBucketName = 'BucketName'
+t.oss.aliyunBucketNameTips = 'Alibaba Cloud BucketName'
+t.oss.qcloudDomain = 'Domain Name'
+t.oss.qcloudDomainTips = 'Tencent cloud bound domain name'
+t.oss.qcloudPrefix = 'Path Prefix'
+t.oss.qcloudPrefixTips = 'Do not set default to empty'
+t.oss.qcloudAppId = 'AppId'
+t.oss.qcloudAppIdTips = 'Tencent Cloud AppId'
+t.oss.qcloudSecretId = 'SecretId'
+t.oss.qcloudSecretIdTips = 'Tencent Cloud SecretD'
+t.oss.qcloudSecretKey = 'SecretKey'
+t.oss.qcloudSecretKeyTips = 'Tencent Cloud SecretKey'
+t.oss.qcloudBucketName = 'BucketName'
+t.oss.qcloudBucketNameTips = 'Tencent Cloud BucketName'
+t.oss.qcloudRegion = 'Affiliate'
+t.oss.qcloudRegionTips = 'Please Select'
+t.oss.qcloudRegionBeijing1 = 'Beijing District 1 (North China)'
+t.oss.qcloudRegionBeijing = 'Beijing'
+t.oss.qcloudRegionShanghai = 'Shanghai (East China)'
+t.oss.qcloudRegionGuangzhou = 'Guangzhou (South China)'
+t.oss.qcloudRegionChengdu = 'Chengdu (Southwest)'
+t.oss.qcloudRegionChongqing = 'Chongqing'
+t.oss.qcloudRegionSingapore = 'Singapore'
+t.oss.qcloudRegionHongkong = 'HongKong'
+t.oss.qcloudRegionToronto = 'Toronto'
+t.oss.qcloudRegionFrankfurt = 'Frankfurt'
+t.oss.localDomain = 'Domain Name'
+t.oss.localDomainTips = 'Binded domain name, eg http://cdn.renren.io'
+t.oss.fastdfsDomain = 'Domain Name'
+t.oss.fastdfsDomainTips = 'Binded domain name, eg http://cdn.renren.io'
+t.oss.localPrefix = 'Path Prefix'
+t.oss.localPrefixTips = 'Do not set default to empty'
+t.oss.localPath = 'Storage Directory'
+t.oss.localPathTips = 'eg: D:/upload'
+
+t.dept = {}
+t.dept.name = 'Name'
+t.dept.parentName = 'Superior'
+t.dept.sort = 'Sort'
+t.dept.parentNameDefault = 'Top Department'
+t.dept.chooseerror = 'Please select the department'
+t.dept.title = 'Selection Department'
+
+t.dict = {}
+t.dict.dictName = 'Name'
+t.dict.dictType = 'Type'
+t.dict.dictValue = 'Value'
+t.dict.dictLabel = 'Label'
+t.dict.sort = 'Sort'
+t.dict.remark = 'Remarks'
+t.dict.createDate = 'Create Date'
+
+t.logError = {}
+t.logError.requestUri = 'Request URI'
+t.logError.requestMethod = 'Request Method'
+t.logError.requestParams = 'Request Parameters'
+t.logError.ip = 'IP'
+t.logError.userAgent = 'User Agent'
+t.logError.createDate = 'Create Date'
+t.logError.errorInfo = 'Exception'
+
+t.logLogin = {}
+t.logLogin.creatorName = 'Username'
+t.logLogin.status = 'Status'
+t.logLogin.status0 = 'Failed'
+t.logLogin.status1 = 'Success'
+t.logLogin.status2 = 'Locked'
+t.logLogin.operation = 'User Action'
+t.logLogin.operation0 = 'Login'
+t.logLogin.operation1 = 'Exit'
+t.logLogin.ip = 'IP'
+t.logLogin.userAgent = 'User-Agent'
+t.logLogin.createDate = 'Create Date'
+
+t.logOperation = {}
+t.logOperation.status = 'Status'
+t.logOperation.status0 = 'Failed'
+t.logOperation.status1 = 'Success'
+t.logOperation.creatorName = 'Username'
+t.logOperation.operation = 'User Action'
+t.logOperation.requestUri = 'Request URI'
+t.logOperation.requestMethod = 'Request Mode'
+t.logOperation.requestParams = 'Request Parameters'
+t.logOperation.requestTime = 'Request Duration'
+t.logOperation.ip = 'IP'
+t.logOperation.userAgent = 'User-Agent'
+t.logOperation.createDate = 'Create Date'
+
+t.menu = {}
+t.menu.name = 'Name'
+t.menu.icon = 'Icon'
+t.menu.type = 'Type'
+t.menu.type0 = 'Menu'
+t.menu.type1 = 'Button'
+t.menu.sort = 'Sort'
+t.menu.url = 'Route'
+t.menu.permissions = 'Auth ID'
+t.menu.permissionsTips = 'Multiple separated by commas, such as: sys:menu:save,sys:menu:update'
+t.menu.parentName = 'Superior'
+t.menu.parentNameDefault = 'Top Menu'
+t.menu.resource = 'Auth Resources'
+t.menu.resourceUrl = 'Resource URL'
+t.menu.resourceMethod = 'Request Method'
+t.menu.resourceAddItem = 'Add an Item'
+
+t.params = {}
+t.params.paramCode = 'Code'
+t.params.paramValue = 'Value'
+t.params.remark = 'Remarks'
+
+t.role = {}
+t.role.name = 'Name'
+t.role.remark = 'Remarks'
+t.role.createDate = 'Create Date'
+t.role.menuList = 'Menu Scope'
+t.role.deptList = 'Data Scope'
+
+t.user = {}
+t.user.username = 'Username'
+t.user.deptName = 'Department'
+t.user.email = 'Email'
+t.user.mobile = 'Mobile'
+t.user.status = 'Status'
+t.user.status0 = 'Disable'
+t.user.status1 = 'Enable'
+t.user.createDate = 'Create Date'
+t.user.password = 'Password'
+t.user.confirmPassword = 'Confirm'
+t.user.realName = 'Real Name'
+t.user.gender = 'Gender'
+t.user.gender0 = 'Male'
+t.user.gender1 = 'Female'
+t.user.gender2 = 'Secure'
+t.user.roleIdList = 'Role Config'
+t.user.validate = {}
+t.user.validate.confirmPassword = 'Confirm password is not consistent with password input'
+t.user.select = 'Selecting Users'
+t.user.selecterror = 'Please select a record'
+
+t.correction = {}
+t.correction.post = 'Application post'
+t.correction.entryDate = 'Date of entry'
+t.correction.correctionDate = 'Date of correction'
+t.correction.workContent = 'work content'
+t.correction.achievement = 'Work performance'
+
+t.process.comment = 'Review Opinions'
+t.process.completeTask = 'Pass'
+t.process.rejectTask = 'Refuse'
+t.process.doBackRollback = 'Backward'
+t.process.terminationTask = 'Terminate'
+t.process.entrustTask = 'Delegation'
+t.process.createInstance = 'Initiation Process'
+t.process.instanceId = 'Instance ID'
+t.process.taskId = 'Task ID'
+t.process.days = 'Days'
+t.process.businessKey = 'Business Key'
+t.process.processDefinitionName = 'Process Name'
+t.process.ended = 'End'
+t.process.ended0 = 'Yes'
+t.process.ended1 = 'No'
+t.process.startTime = 'Process Start Time'
+t.process.endTime = 'Process End Time'
+t.process.activityName = 'Current Link'
+t.process.createTime = 'Task Time'
+t.process.assignee = 'Processing Person'
+t.process.viewFlowImage = 'View Flowchart'
+t.process.flowImage = 'Flowchart'
+t.process.processDefinitionVersion = 'Process Version'
+t.process.startUserId = 'Initiator'
+t.process.taskName = 'Task Name'
+t.process.owner = 'Task Owner'
+t.process.claim = 'Signature'
+t.process.routeError = 'Configure business form routing information first'
+t.process.entrustError = 'Please select the client'
+t.process.formURLError = 'Set the URL to save the form'
+t.process.keyError = 'Set up process KEY'
+t.process.formNameError = 'Please set the form name'
+t.process.businessKeyError = 'Business KEY is empty and cannot start process'
+t.process.notExistError = 'No process is queried, please design the process first'
+t.process.circulation = 'Circulation details'
+
+t.task = {}
+t.task.businessKeyError = 'Business KEY is empty and cannot handle task'
+t.task.detailError = 'Business KEY is empty and processing details cannot be viewed'
+t.task.startTime = 'Task Begin Time'
+t.task.endTime = 'Task End Time'
+t.task.durationInSeconds = 'Task Duration (seconds)'
+
+t.region = {}
+t.region.id = 'Region ID'
+t.region.name = 'Region Name'
+t.region.type = 'Region Type'
+t.region.sort = 'Sort'
+t.region.updateDate = 'Update Date'
+t.region.province = 'Province'
+t.region.city = 'City'
+t.region.county = 'County'
+
+t.oss.type6 = 'MinIO'
+t.oss.minioEndPoint = 'EndPoint'
+t.oss.minioEndPointTips = 'MinIO EndPoint'
+t.oss.minioAccessKey = 'AccessKey'
+t.oss.minioAccessKeyTips = 'AccessKey'
+t.oss.minioSecretKey = 'SecretKey'
+t.oss.minioSecretKeyTips = 'SecretKey'
+t.oss.minioBucketName = 'BucketName'
+t.oss.minioBucketNameTips = 'BucketName'
+t.oss.minioPrefix = 'Path prefix'
+t.oss.minioPrefixTips = 'Do not set default to empty'
+
+t.sms.platform3 = 'Seven Cows'
+t.sms.qiniuAccessKey = 'AccessKey'
+t.sms.qiniuAccessKeyTips = 'AccessKey'
+t.sms.qiniuSecretKey = 'SecretKey'
+t.sms.qiniuSecretKeyTips = 'SecretKey'
+t.sms.qiniuTemplateId = 'SMS Template'
+t.sms.qiniuTemplateIdTips = 'SMS Template ID'
+t.sms.smsCode = 'SMS Code'
+t.sms.remark = 'Remarks'
+
+t.notice = {}
+t.notice.title = 'Title'
+t.notice.type = 'Type'
+t.notice.senderName = 'Sender'
+t.notice.senderDate = 'Send Time'
+t.notice.status = 'Status'
+t.notice.status0 = 'Draft'
+t.notice.status1 = 'Sent'
+t.notice.view = 'View'
+t.notice.view1 = 'Notice - View'
+t.notice.view2 = 'My Notice - View'
+t.notice.readStatus = 'Read Status'
+t.notice.readStatus0 = 'Unread'
+t.notice.readStatus1 = 'Read'
+t.notice.content = 'Content'
+t.notice.receiverType = 'Receiver'
+t.notice.receiverType0 = 'All'
+t.notice.receiverType1 = 'Department'
+t.notice.selectDept = 'Select Department'
+t.notice.draft = 'Save Draft'
+t.notice.release = 'Release Notice'
+t.notice.close = 'Close'
+t.notice.receiverName = 'Recipient'
+t.notice.readDate = 'Reading Time'
+t.notice.new = 'There are new notifications'
+t.notice.disconnect = 'Disconnected'
+t.notice.disconnectMessage = 'WebSocket connection has been disconnected, please check the network'
+
+export default t
diff --git a/src/i18n/index.js b/src/i18n/index.js
new file mode 100644
index 0000000..27bb753
--- /dev/null
+++ b/src/i18n/index.js
@@ -0,0 +1,34 @@
+import Vue from 'vue'
+import VueI18n from 'vue-i18n'
+import Cookies from 'js-cookie'
+import zhCNLocale from 'element-ui/lib/locale/lang/zh-CN'
+import zhTWLocale from 'element-ui/lib/locale/lang/zh-TW'
+import enLocale from 'element-ui/lib/locale/lang/en'
+import zhCN from './zh-CN'
+import zhTW from './zh-TW'
+import enUS from './en-US'
+
+Vue.use(VueI18n)
+
+export const messages = {
+ 'zh-CN': {
+ '_lang': '简体中文',
+ ...zhCN,
+ ...zhCNLocale
+ },
+ 'zh-TW': {
+ '_lang': '繁體中文',
+ ...zhTW,
+ ...zhTWLocale
+ },
+ 'en-US': {
+ '_lang': 'English',
+ ...enUS,
+ ...enLocale
+ }
+}
+
+export default new VueI18n({
+ locale: Cookies.get('language') || 'zh-CN',
+ messages
+})
diff --git a/src/i18n/zh-CN.js b/src/i18n/zh-CN.js
new file mode 100644
index 0000000..94e2e20
--- /dev/null
+++ b/src/i18n/zh-CN.js
@@ -0,0 +1,508 @@
+const t = {}
+
+t.loading = '加载中...'
+
+t.brand = {}
+t.brand.lg = '心衰数据系统'
+t.brand.mini = '教学平台'
+
+t.add = '新增'
+t.delete = '删除'
+t.deleteBatch = '删除'
+t.update = '编辑'
+t.query = '查询'
+t.export = '导出'
+t.handle = '操作'
+t.confirm = '确定'
+t.cancel = '取消'
+t.clear = '清除'
+t.close = '关闭'
+t.logout = '退出'
+t.manage = '处理'
+t.createDate = '创建时间'
+t.updateDate = '更新时间'
+t.keyword = '关键字:'
+t.choose = '请选择'
+t.fileName = '文件名'
+t.design = '在线设计'
+t.preview = '预览'
+
+t.prompt = {}
+t.prompt.title = '提示'
+t.prompt.info = '确定进行[{handle}]操作?'
+t.prompt.success = '操作成功'
+t.prompt.failed = '操作失败'
+t.prompt.deleteBatch = '请选择删除项'
+
+t.validate = {}
+t.validate.required = '必填项不能为空'
+t.validate.format = '{attr}格式错误'
+
+t.upload = {}
+t.upload.text = '将文件拖到此处,或点击上传'
+t.upload.tip = '只支持{format}格式文件!'
+t.upload.button = '点击上传'
+
+t.datePicker = {}
+t.datePicker.range = '至'
+t.datePicker.start = '开始日期'
+t.datePicker.end = '结束日期'
+
+t.fullscreen = {}
+t.fullscreen.prompt = '您的浏览器不支持此操作'
+
+t.updatePassword = {}
+t.updatePassword.title = '修改密码'
+t.updatePassword.username = '账号'
+t.updatePassword.password = '原密码'
+t.updatePassword.newPassword = '新密码'
+t.updatePassword.confirmPassword = '确认密码'
+t.updatePassword.validate = {}
+t.updatePassword.validate.confirmPassword = '确认密码与新密码输入不一致'
+
+t.contentTabs = {}
+t.contentTabs.closeCurrent = '关闭当前标签页'
+t.contentTabs.closeOther = '关闭其它标签页'
+t.contentTabs.closeAll = '关闭全部标签页'
+
+/* 页面 */
+t.notFound = {}
+t.notFound.desc = '抱歉!您访问的页面失联啦...'
+t.notFound.back = '上一页'
+t.notFound.home = '首页'
+
+t.login = {}
+t.login.title = '登录'
+t.login.username = '用户名'
+t.login.password = '密码'
+t.login.captcha = '验证码'
+t.login.demo = '在线演示'
+t.login.copyright = '南京慧目'
+
+t.home = {}
+t.home.sysInfo = {}
+t.home.sysInfo.name = '系统名称'
+t.home.sysInfo.nameVal = 'renren-security【企业版】'
+t.home.sysInfo.version = '版本信息'
+t.home.sysInfo.versionVal = window.SITE_CONFIG.version
+t.home.sysInfo.osName = '操作系统'
+t.home.sysInfo.osVersion = '系统版本'
+t.home.sysInfo.osArch = '系统架构'
+t.home.sysInfo.processors = 'CPU核数'
+t.home.sysInfo.totalPhysical = '系统内存'
+t.home.sysInfo.freePhysical = '剩余内存'
+t.home.sysInfo.memoryRate = '内存使用'
+t.home.sysInfo.userLanguage = '系统语言'
+t.home.sysInfo.jvmName = 'JVM信息'
+t.home.sysInfo.javaVersion = 'JVM版本'
+t.home.sysInfo.javaHome = 'JAVA_HOME'
+t.home.sysInfo.userDir = '工作目录'
+t.home.sysInfo.javaTotalMemory = 'JVM占用内存'
+t.home.sysInfo.javaFreeMemory = 'JVM空闲内存'
+t.home.sysInfo.javaMaxMemory = 'JVM最大内存'
+t.home.sysInfo.userName = '当前用户'
+t.home.sysInfo.systemCpuLoad = 'CPU负载'
+t.home.sysInfo.userTimezone = '系统时区'
+
+/* 模块 */
+t.model = {}
+t.model.name = '名称'
+t.model.key = '标识'
+t.model.version = '版本'
+t.model.createTime = '创建时间'
+t.model.lastUpdateTime = '更新时间'
+t.model.design = '在线设计'
+t.model.deploy = '部署'
+t.model.description = '描述'
+
+t.process = {}
+t.process.name = '名称'
+t.process.key = '标识'
+t.process.deployFile = '部署流程文件'
+t.process.id = '流程ID'
+t.process.deploymentId = '部署ID'
+t.process.version = '版本'
+t.process.resourceName = 'XML'
+t.process.diagramResourceName = '图片'
+t.process.deploymentTime = '部署时间'
+t.process.active = '激活'
+t.process.suspend = '挂起'
+t.process.convertToModel = '转换为模型'
+t.process.bizRouteSet = '配置业务路由'
+t.process.bizRoute = '业务路由'
+
+t.running = {}
+t.running.id = '实例ID'
+t.running.definitionKey = '定义Key'
+t.running.processDefinitionId = '定义ID'
+t.running.processDefinitionName = '流程名称'
+t.running.activityId = '当前环节'
+t.running.suspended = '是否挂起'
+t.running.suspended0 = '否'
+t.running.suspended1 = '是'
+
+t.news = {}
+t.news.title = '标题'
+t.news.pubDate = '发布时间'
+t.news.createDate = '创建时间'
+t.news.content = '内容'
+
+t.schedule = {}
+t.schedule.beanName = 'bean名称'
+t.schedule.beanNameTips = 'spring bean名称, 如: testTask'
+t.schedule.pauseBatch = '暂停'
+t.schedule.resumeBatch = '恢复'
+t.schedule.runBatch = '执行'
+t.schedule.log = '日志列表'
+t.schedule.params = '参数'
+t.schedule.cronExpression = 'cron表达式'
+t.schedule.cronExpressionTips = '如: 0 0 12 * * ?'
+t.schedule.remark = '备注'
+t.schedule.status = '状态'
+t.schedule.status0 = '暂停'
+t.schedule.status1 = '正常'
+t.schedule.statusLog0 = '失败'
+t.schedule.statusLog1 = '成功'
+t.schedule.pause = '暂停'
+t.schedule.resume = '恢复'
+t.schedule.run = '执行'
+t.schedule.jobId = '任务ID'
+t.schedule.times = '耗时(单位: 毫秒)'
+t.schedule.createDate = '执行时间'
+
+t.mail = {}
+t.mail.name = '名称'
+t.mail.config = '邮件配置'
+t.mail.subject = '主题'
+t.mail.createDate = '创建时间'
+t.mail.send = '发送邮件'
+t.mail.content = '内容'
+t.mail.smtp = 'SMTP'
+t.mail.port = '端口号'
+t.mail.username = '邮箱账号'
+t.mail.password = '邮箱密码'
+t.mail.mailTo = '收件人'
+t.mail.mailCc = '抄送'
+t.mail.params = '模板参数'
+t.mail.paramsTips = '如:{"code": "123456"}'
+t.mail.templateId = '模版ID'
+t.mail.status = '状态'
+t.mail.status0 = '发送失败'
+t.mail.status1 = '发送成功'
+t.mail.mailFrom = '发送者'
+t.mail.createDate = '发送时间'
+
+t.sms = {}
+t.sms.mobile = '手机号'
+t.sms.status = '状态'
+t.sms.status0 = '发送失败'
+t.sms.status1 = '发送成功'
+t.sms.config = '短信配置'
+t.sms.send = '发送短信'
+t.sms.platform = '平台类型'
+t.sms.platform1 = '阿里云'
+t.sms.platform2 = '腾讯云'
+t.sms.params = '参数'
+t.sms.paramsTips = '如:{"code": "123456"}'
+t.sms.params1 = '参数1'
+t.sms.params2 = '参数2'
+t.sms.params3 = '参数3'
+t.sms.params4 = '参数4'
+t.sms.createDate = '发送时间'
+t.sms.aliyunAccessKeyId = 'Key'
+t.sms.aliyunAccessKeyIdTips = '阿里云AccessKeyId'
+t.sms.aliyunAccessKeySecret = 'Secret'
+t.sms.aliyunAccessKeySecretTips = '阿里云AccessKeySecret'
+t.sms.aliyunSignName = '短信签名'
+t.sms.aliyunTemplateCode = '短信模板'
+t.sms.aliyunTemplateCodeTips = '短信模板CODE'
+t.sms.qcloudAppId = 'AppId'
+t.sms.qcloudAppIdTips = '腾讯云AppId'
+t.sms.qcloudAppKey = 'AppKey'
+t.sms.qcloudAppKeyTips = '腾讯云AppKey'
+t.sms.qcloudSignName = '短信签名'
+t.sms.qcloudTemplateId = '短信模板'
+t.sms.qcloudTemplateIdTips = '短信模板ID'
+
+t.oss = {}
+t.oss.config = '云存储配置'
+t.oss.upload = '上传文件'
+t.oss.url = 'URL地址'
+t.oss.createDate = '创建时间'
+t.oss.type = '类型'
+t.oss.type1 = '七牛'
+t.oss.type2 = '阿里云'
+t.oss.type3 = '腾讯云'
+t.oss.type4 = 'FastDFS'
+t.oss.type5 = '本地上传'
+t.oss.qiniuDomain = '域名'
+t.oss.qiniuDomainTips = '七牛绑定的域名'
+t.oss.qiniuPrefix = '路径前缀'
+t.oss.qiniuPrefixTips = '不设置默认为空'
+t.oss.qiniuAccessKey = 'AccessKey'
+t.oss.qiniuAccessKeyTips = '七牛AccessKey'
+t.oss.qiniuSecretKey = 'SecretKey'
+t.oss.qiniuSecretKeyTips = '七牛SecretKey'
+t.oss.qiniuBucketName = '空间名'
+t.oss.qiniuBucketNameTips = '七牛存储空间名'
+t.oss.aliyunDomain = '域名'
+t.oss.aliyunDomainTips = '阿里云绑定的域名,如:http://cdn.renren.io'
+t.oss.aliyunPrefix = '路径前缀'
+t.oss.aliyunPrefixTips = '不设置默认为空'
+t.oss.aliyunEndPoint = 'EndPoint'
+t.oss.aliyunEndPointTips = '阿里云EndPoint'
+t.oss.aliyunAccessKeyId = 'AccessKeyId'
+t.oss.aliyunAccessKeyIdTips = '阿里云AccessKeyId'
+t.oss.aliyunAccessKeySecret = 'AccessKeySecret'
+t.oss.aliyunAccessKeySecretTips = '阿里云AccessKeySecret'
+t.oss.aliyunBucketName = 'BucketName'
+t.oss.aliyunBucketNameTips = '阿里云BucketName'
+t.oss.qcloudDomain = '域名'
+t.oss.qcloudDomainTips = '腾讯云绑定的域名'
+t.oss.qcloudPrefix = '路径前缀'
+t.oss.qcloudPrefixTips = '不设置默认为空'
+t.oss.qcloudAppId = 'AppId'
+t.oss.qcloudAppIdTips = '腾讯云AppId'
+t.oss.qcloudSecretId = 'SecretId'
+t.oss.qcloudSecretIdTips = '腾讯云SecretId'
+t.oss.qcloudSecretKey = 'SecretKey'
+t.oss.qcloudSecretKeyTips = '腾讯云SecretKey'
+t.oss.qcloudBucketName = 'BucketName'
+t.oss.qcloudBucketNameTips = '腾讯云BucketName'
+t.oss.qcloudRegion = '所属地区'
+t.oss.qcloudRegionTips = '请选择'
+t.oss.qcloudRegionBeijing1 = '北京一区(华北)'
+t.oss.qcloudRegionBeijing = '北京'
+t.oss.qcloudRegionShanghai = '上海(华东)'
+t.oss.qcloudRegionGuangzhou = '广州(华南)'
+t.oss.qcloudRegionChengdu = '成都(西南)'
+t.oss.qcloudRegionChongqing = '重庆'
+t.oss.qcloudRegionSingapore = '新加坡'
+t.oss.qcloudRegionHongkong = '香港'
+t.oss.qcloudRegionToronto = '多伦多'
+t.oss.qcloudRegionFrankfurt = '法兰克福'
+t.oss.localDomain = '域名'
+t.oss.localDomainTips = '绑定的域名,如:http://cdn.renren.io'
+t.oss.fastdfsDomain = '域名'
+t.oss.fastdfsDomainTips = '绑定的域名,如:http://cdn.renren.io'
+t.oss.localPrefix = '路径前缀'
+t.oss.localPrefixTips = '不设置默认为空'
+t.oss.localPath = '存储目录'
+t.oss.localPathTips = '如:D:/upload'
+
+t.dept = {}
+t.dept.name = '名称'
+t.dept.parentName = '上级部门'
+t.dept.sort = '排序'
+t.dept.parentNameDefault = '一级部门'
+t.dept.chooseerror = '请选择部门'
+t.dept.title = '选择部门'
+
+t.dict = {}
+t.dict.dictName = '字典名称'
+t.dict.dictType = '字典类型'
+t.dict.dictLabel = '字典标签'
+t.dict.dictValue = '字典值'
+t.dict.sort = '排序'
+t.dict.remark = '备注'
+t.dict.createDate = '创建时间'
+
+t.logError = {}
+t.logError.requestUri = '请求URI'
+t.logError.requestMethod = '请求方式'
+t.logError.requestParams = '请求参数'
+t.logError.ip = '操作IP'
+t.logError.userAgent = '用户代理'
+t.logError.createDate = '创建时间'
+t.logError.errorInfo = '异常信息'
+
+t.logLogin = {}
+t.logLogin.creatorName = '用户名'
+t.logLogin.status = '状态'
+t.logLogin.status0 = '失败'
+t.logLogin.status1 = '成功'
+t.logLogin.status2 = '账号已锁定'
+t.logLogin.operation = '操作类型'
+t.logLogin.operation0 = '登录'
+t.logLogin.operation1 = '退出'
+t.logLogin.ip = '操作IP'
+t.logLogin.userAgent = 'User-Agent'
+t.logLogin.createDate = '创建时间'
+
+t.logOperation = {}
+t.logOperation.status = '状态'
+t.logOperation.status0 = '失败'
+t.logOperation.status1 = '成功'
+t.logOperation.creatorName = '用户名'
+t.logOperation.operation = '用户操作'
+t.logOperation.requestUri = '请求URI'
+t.logOperation.requestMethod = '请求方式'
+t.logOperation.requestParams = '请求参数'
+t.logOperation.requestTime = '请求时长'
+t.logOperation.ip = '操作IP'
+t.logOperation.userAgent = 'User-Agent'
+t.logOperation.createDate = '创建时间'
+
+t.menu = {}
+t.menu.name = '名称'
+t.menu.icon = '图标'
+t.menu.type = '类型'
+t.menu.type0 = '菜单'
+t.menu.type1 = '按钮'
+t.menu.sort = '排序'
+t.menu.url = '路由'
+t.menu.permissions = '授权标识'
+t.menu.permissionsTips = '多个用逗号分隔,如:sys:menu:save,sys:menu:update'
+t.menu.parentName = '上级菜单'
+t.menu.parentNameDefault = '一级菜单'
+t.menu.resource = '授权资源'
+t.menu.resourceUrl = '资源URL'
+t.menu.resourceMethod = '请求方式'
+t.menu.resourceAddItem = '添加一项'
+
+t.params = {}
+t.params.paramCode = '编码'
+t.params.paramValue = '值'
+t.params.remark = '备注'
+
+t.role = {}
+t.role.name = '角色名称'
+t.role.remark = '备注'
+t.role.createDate = '创建时间'
+t.role.menuList = '菜单授权'
+t.role.deptList = '数据授权'
+t.role.type = '角色类型'
+
+t.user = {}
+t.user.username = '用户名'
+t.user.deptName = '所属部门'
+t.user.email = '邮箱'
+t.user.mobile = '手机号'
+t.user.status = '状态'
+t.user.status0 = '停用'
+t.user.status1 = '正常'
+t.user.createDate = '创建时间'
+t.user.password = '密码'
+t.user.confirmPassword = '确认密码'
+t.user.realName = '真实姓名'
+t.user.gender = '性别'
+t.user.gender0 = '男'
+t.user.gender1 = '女'
+t.user.gender2 = '保密'
+t.user.roleIdList = '角色配置'
+t.user.validate = {}
+t.user.validate.confirmPassword = '确认密码与密码输入不一致'
+t.user.select = '选择用户'
+t.user.selecterror = '请选择一条记录'
+
+t.correction = {}
+t.correction.post = '申请岗位'
+t.correction.entryDate = '入职日期'
+t.correction.correctionDate = '转正日期'
+t.correction.workContent = '工作內容'
+t.correction.achievement = '工作成绩'
+
+t.process.comment = '审核意见'
+t.process.completeTask = '通过'
+t.process.rejectTask = '驳回'
+t.process.doBackRollback = '回退'
+t.process.terminationTask = '终止'
+t.process.entrustTask = '委托'
+t.process.createInstance = '发起流程'
+t.process.instanceId = '流程实例ID'
+t.process.taskId = '任务ID'
+t.process.days = '天数'
+t.process.businessKey = '业务KEY'
+t.process.processDefinitionName = '流程名称'
+t.process.ended = '是否结束'
+t.process.ended0 = '是'
+t.process.ended1 = '否'
+t.process.startTime = '流程开始时间'
+t.process.endTime = '流程结束时间'
+t.process.activityName = '当前环节'
+t.process.createTime = '任务创建时间'
+t.process.assignee = '处理人'
+t.process.viewFlowImage = '查看流程图'
+t.process.flowImage = '流程图'
+t.process.processDefinitionVersion = '流程版本'
+t.process.startUserId = '发起人'
+t.process.taskName = '任务名称'
+t.process.owner = '任务所有人'
+t.process.claim = '签收'
+t.process.routeError = '请先配置业务表单路由信息'
+t.process.entrustError = '请选择委托人'
+t.process.formURLError = '请设置保存表单的URL'
+t.process.keyError = '请设置流程KEY'
+t.process.formNameError = '请设置表单名称'
+t.process.businessKeyError = '业务KEY为空,无法启动流程'
+t.process.notExistError = '没有查询到流程,请先设计流程'
+t.process.circulation = '流转详情'
+
+t.task = {}
+t.task.businessKeyError = '业务KEY为空,无法处理任务'
+t.task.detailError = '业务KEY为空,无法查看处理详情'
+t.task.startTime = '任务开始时间'
+t.task.endTime = '任务结束时间'
+t.task.durationInSeconds = '任务时长(秒)'
+
+t.region = {}
+t.region.id = '区域标识'
+t.region.name = '区域名称'
+t.region.type = '区域类型'
+t.region.sort = '排序'
+t.region.updateDate = '更新时间'
+t.region.province = '省份直辖市'
+t.region.city = '地市'
+t.region.county = '区县'
+
+t.oss.type6 = 'MinIO'
+t.oss.minioEndPoint = 'EndPoint'
+t.oss.minioEndPointTips = 'MinIO EndPoint'
+t.oss.minioAccessKey = 'AccessKey'
+t.oss.minioAccessKeyTips = 'AccessKey'
+t.oss.minioSecretKey = 'SecretKey'
+t.oss.minioSecretKeyTips = 'SecretKey'
+t.oss.minioBucketName = 'BucketName'
+t.oss.minioBucketNameTips = 'BucketName'
+t.oss.minioPrefix = '路径前缀'
+t.oss.minioPrefixTips = '不设置默认为空'
+
+t.sms.platform3 = '七牛'
+t.sms.qiniuAccessKey = 'AccessKey'
+t.sms.qiniuAccessKeyTips = 'AccessKey'
+t.sms.qiniuSecretKey = 'SecretKey'
+t.sms.qiniuSecretKeyTips = 'SecretKey'
+t.sms.qiniuTemplateId = '短信模板'
+t.sms.qiniuTemplateIdTips = '短信模板ID'
+t.sms.smsCode = '短信编码'
+t.sms.remark = '备注'
+
+t.notice = {}
+t.notice.title = '标题'
+t.notice.type = '类型'
+t.notice.senderName = '发送者'
+t.notice.senderDate = '发送时间'
+t.notice.status = '状态'
+t.notice.status0 = '草稿'
+t.notice.status1 = '已发'
+t.notice.view = '查看'
+t.notice.view1 = '通知管理 - 查看'
+t.notice.view2 = '我的通知 - 查看'
+t.notice.readStatus = '阅读状态'
+t.notice.readStatus0 = '未读'
+t.notice.readStatus1 = '已读'
+t.notice.content = '内容'
+t.notice.receiverType = '接收者'
+t.notice.receiverType0 = '全部'
+t.notice.receiverType1 = '部门'
+t.notice.selectDept = '选择部门'
+t.notice.draft = '保存草稿'
+t.notice.release = '发布通知'
+t.notice.close = '关闭'
+t.notice.receiverName = '接收者'
+t.notice.readDate = '阅读时间'
+t.notice.new = '有新通知'
+t.notice.disconnect = '连接断开'
+t.notice.disconnectMessage = 'WebSocket连接已断开,请检查网络'
+
+export default t
diff --git a/src/i18n/zh-TW.js b/src/i18n/zh-TW.js
new file mode 100644
index 0000000..067943d
--- /dev/null
+++ b/src/i18n/zh-TW.js
@@ -0,0 +1,506 @@
+const t = {}
+
+t.loading = '加載中...'
+
+t.brand = {}
+t.brand.lg = '教学平台系统'
+t.brand.mini = '教学平台'
+
+t.add = '新增'
+t.delete = '刪除'
+t.deleteBatch = '刪除'
+t.update = '修改'
+t.query = '查詢'
+t.export = '導出'
+t.handle = '操作'
+t.confirm = '確定'
+t.cancel = '取消'
+t.clear = '清除'
+t.logout = '退出'
+t.manage = '處理'
+t.createDate = '創建時間'
+t.updateDate = '更新時間'
+t.keyword = '關鍵字:'
+t.choose = '請選擇'
+t.fileName = '文件名'
+t.design = '在線設計'
+t.preview = '預覽'
+
+t.prompt = {}
+t.prompt.title = '提示'
+t.prompt.info = '確定進行[{handle}]操作?'
+t.prompt.success = '操作成功'
+t.prompt.failed = '操作失敗'
+t.prompt.deleteBatch = '請選擇刪除項'
+
+t.validate = {}
+t.validate.required = '必填項不能為空'
+t.validate.format = '{attr}格式錯誤'
+
+t.upload = {}
+t.upload.text = '將文件拖到此處,或點擊上傳'
+t.upload.tip = '只支持{format}格式文件! '
+t.upload.button = '點擊上傳'
+
+t.datePicker = {}
+t.datePicker.range = '至'
+t.datePicker.start = '開始日期'
+t.datePicker.end = '結束日期'
+
+t.fullscreen = {}
+t.fullscreen.prompt = '您的瀏覽器不支持此操作'
+
+t.updatePassword = {}
+t.updatePassword.title = '修改密碼'
+t.updatePassword.username = '賬號'
+t.updatePassword.password = '原密碼'
+t.updatePassword.newPassword = '新密碼'
+t.updatePassword.confirmPassword = '確認密碼'
+t.updatePassword.validate = {}
+t.updatePassword.validate.confirmPassword = '確認密碼與新密碼輸入不一致'
+
+t.contentTabs = {}
+t.contentTabs.closeCurrent = '關閉當前標籤頁'
+t.contentTabs.closeOther = '關閉其它標籤頁'
+t.contentTabs.closeAll = '關閉全部標籤頁'
+
+/* 頁面 */
+t.notFound = {}
+t.notFound.desc = '抱歉!您訪問的頁面失聯啦...'
+t.notFound.back = '上一頁'
+t.notFound.home = '首頁'
+
+t.login = {}
+t.login.title = '登錄'
+t.login.username = '用戶名'
+t.login.password = '密碼'
+t.login.captcha = '驗證碼'
+t.login.demo = '在線演示'
+t.login.copyright = '南京慧目'
+
+t.home = {}
+t.home.sysInfo = {}
+t.home.sysInfo.name = '系統名稱'
+t.home.sysInfo.nameVal = 'renren-security【企業版】'
+t.home.sysInfo.version = '版本信息'
+t.home.sysInfo.versionVal = window.SITE_CONFIG['version']
+t.home.sysInfo.osName = '操作系統'
+t.home.sysInfo.osVersion = '系統版本'
+t.home.sysInfo.osArch = '系統架構'
+t.home.sysInfo.processors = 'CPU核數'
+t.home.sysInfo.totalPhysical = '系統內存'
+t.home.sysInfo.freePhysical = '剩餘內存'
+t.home.sysInfo.memoryRate = '内存使用'
+t.home.sysInfo.userLanguage = '系統語言'
+t.home.sysInfo.jvmName = 'JVM信息'
+t.home.sysInfo.javaVersion = 'JVM版本'
+t.home.sysInfo.javaHome = 'JAVA_HOME'
+t.home.sysInfo.userDir = '工作目錄'
+t.home.sysInfo.javaTotalMemory = 'JVM佔用內存'
+t.home.sysInfo.javaFreeMemory = 'JVM空閒內存'
+t.home.sysInfo.javaMaxMemory = 'JVM最大內存'
+t.home.sysInfo.userName = '當前用戶'
+t.home.sysInfo.systemCpuLoad = 'CPU負載'
+t.home.sysInfo.userTimezone = '系統時區'
+
+/* 模塊 */
+t.model = {}
+t.model.name = '名稱'
+t.model.key = '標識'
+t.model.version = '版本'
+t.model.createTime = '創建時間'
+t.model.lastUpdateTime = '更新時間'
+t.model.design = '在線設計'
+t.model.deploy = '部署'
+t.model.description = '描述'
+
+t.process = {}
+t.process.name = '名稱'
+t.process.key = '標識'
+t.process.deployFile = '部署流程文件'
+t.process.id = '流程ID'
+t.process.deploymentId = '部署ID'
+t.process.version = '版本'
+t.process.resourceName = 'XML'
+t.process.diagramResourceName = '圖片'
+t.process.deploymentTime = '部署時間'
+t.process.active = '激活'
+t.process.suspend = '掛起'
+t.process.convertToModel = '轉換為模型'
+t.process.bizRouteSet = '配置業務路由'
+t.process.bizRoute = '業務路由'
+
+t.running = {}
+t.running.id = '實例ID'
+t.running.definitionKey = '定義Key'
+t.running.processDefinitionId = '定義ID'
+t.running.processDefinitionName = '流程名稱'
+t.running.activityId = '當前環節'
+t.running.suspended = '是否掛起'
+t.running.suspended0 = '否'
+t.running.suspended1 = '是'
+
+t.news = {}
+t.news.title = '標題'
+t.news.pubDate = '發佈時間'
+t.news.createDate = '創建時間'
+t.news.content = '內容'
+
+t.schedule = {}
+t.schedule.beanName = 'bean名稱'
+t.schedule.beanNameTips = 'spring bean名稱, 如: testTask'
+t.schedule.pauseBatch = '暫停'
+t.schedule.resumeBatch = '恢復'
+t.schedule.runBatch = '執行'
+t.schedule.log = '日誌列表'
+t.schedule.params = '參數'
+t.schedule.cronExpression = 'cron表達式'
+t.schedule.cronExpressionTips = '如: 0 0 12 * * ?'
+t.schedule.remark = '備註'
+t.schedule.status = '狀態'
+t.schedule.status0 = '暫停'
+t.schedule.status1 = '正常'
+t.schedule.statusLog0 = '失敗'
+t.schedule.statusLog1 = '成功'
+t.schedule.pause = '暫停'
+t.schedule.resume = '恢復'
+t.schedule.run = '執行'
+t.schedule.jobId = '任務ID'
+t.schedule.times = '耗時(單位: 毫秒)'
+t.schedule.createDate = '執行時間'
+
+t.mail = {}
+t.mail.name = '名稱'
+t.mail.config = '郵件配置'
+t.mail.subject = '主題'
+t.mail.createDate = '創建時間'
+t.mail.send = '發送郵件'
+t.mail.content = '內容'
+t.mail.smtp = 'SMTP'
+t.mail.port = '端口號'
+t.mail.username = '郵箱賬號'
+t.mail.password = '郵箱密碼'
+t.mail.mailTo = '收件人'
+t.mail.mailCc = '抄送'
+t.mail.params = '模板參數'
+t.mail.paramsTips = '如:{"code": "123456"}'
+t.mail.templateId = '模版ID'
+t.mail.status = '狀態'
+t.mail.status0 = '發送失敗'
+t.mail.status1 = '發送成功'
+t.mail.mailFrom = '發送者'
+t.mail.createDate = '發送時間'
+
+t.sms = {}
+t.sms.mobile = '手機號'
+t.sms.status = '狀態'
+t.sms.status0 = '發送失敗'
+t.sms.status1 = '發送成功'
+t.sms.config = '短信配置'
+t.sms.send = '發送短信'
+t.sms.platform = '平台類型'
+t.sms.platform1 = '阿里雲'
+t.sms.platform2 = '騰訊雲'
+t.sms.params = '參數'
+t.sms.paramsTips = '如:{"code": "123456"}'
+t.sms.params1 = '參數1'
+t.sms.params2 = '參數2'
+t.sms.params3 = '參數3'
+t.sms.params4 = '參數4'
+t.sms.createDate = '發送時間'
+t.sms.aliyunAccessKeyId = 'Key'
+t.sms.aliyunAccessKeyIdTips = '阿里雲AccessKeyId'
+t.sms.aliyunAccessKeySecret = 'Secret'
+t.sms.aliyunAccessKeySecretTips = '阿里雲AccessKeySecret'
+t.sms.aliyunSignName = '短信簽名'
+t.sms.aliyunTemplateCode = '短信模板'
+t.sms.aliyunTemplateCodeTips = '短信模板CODE'
+t.sms.qcloudAppId = 'AppId'
+t.sms.qcloudAppIdTips = '騰訊雲AppId'
+t.sms.qcloudAppKey = 'AppKey'
+t.sms.qcloudAppKeyTips = '騰訊雲AppKey'
+t.sms.qcloudSignName = '短信簽名'
+t.sms.qcloudTemplateId = '短信模板'
+t.sms.qcloudTemplateIdTips = '短信模板ID'
+
+t.oss = {}
+t.oss.config = '雲存儲配置'
+t.oss.upload = '上傳文件'
+t.oss.url = 'URL地址'
+t.oss.createDate = '創建時間'
+t.oss.type = '類型'
+t.oss.type1 = '七牛'
+t.oss.type2 = '阿里雲'
+t.oss.type3 = '騰訊雲'
+t.oss.type4 = 'FastDFS'
+t.oss.type5 = '本地上傳'
+t.oss.qiniuDomain = '域名'
+t.oss.qiniuDomainTips = '七牛綁定的域名'
+t.oss.qiniuPrefix = '路徑前綴'
+t.oss.qiniuPrefixTips = '不設置默認為空'
+t.oss.qiniuAccessKey = 'AccessKey'
+t.oss.qiniuAccessKeyTips = '七牛AccessKey'
+t.oss.qiniuSecretKey = 'SecretKey'
+t.oss.qiniuSecretKeyTips = '七牛SecretKey'
+t.oss.qiniuBucketName = '空間名'
+t.oss.qiniuBucketNameTips = '七牛存儲空間名'
+t.oss.aliyunDomain = '域名'
+t.oss.aliyunDomainTips = '阿里雲綁定的域名,如:http://cdn.renren.io'
+t.oss.aliyunPrefix = '路徑前綴'
+t.oss.aliyunPrefixTips = '不設置默認為空'
+t.oss.aliyunEndPoint = 'EndPoint'
+t.oss.aliyunEndPointTips = '阿里雲EndPoint'
+t.oss.aliyunAccessKeyId = 'AccessKeyId'
+t.oss.aliyunAccessKeyIdTips = '阿里雲AccessKeyId'
+t.oss.aliyunAccessKeySecret = 'AccessKeySecret'
+t.oss.aliyunAccessKeySecretTips = '阿里雲AccessKeySecret'
+t.oss.aliyunBucketName = 'BucketName'
+t.oss.aliyunBucketNameTips = '阿里雲BucketName'
+t.oss.qcloudDomain = '域名'
+t.oss.qcloudDomainTips = '騰訊雲綁定的域名'
+t.oss.qcloudPrefix = '路徑前綴'
+t.oss.qcloudPrefixTips = '不設置默認為空'
+t.oss.qcloudAppId = 'AppId'
+t.oss.qcloudAppIdTips = '騰訊雲AppId'
+t.oss.qcloudSecretId = 'SecretId'
+t.oss.qcloudSecretIdTips = '騰訊雲SecretId'
+t.oss.qcloudSecretKey = 'SecretKey'
+t.oss.qcloudSecretKeyTips = '騰訊雲SecretKey'
+t.oss.qcloudBucketName = 'BucketName'
+t.oss.qcloudBucketNameTips = '騰訊雲BucketName'
+t.oss.qcloudRegion = '所屬地區'
+t.oss.qcloudRegionTips = '請選擇'
+t.oss.qcloudRegionBeijing1 = '北京一區(華北)'
+t.oss.qcloudRegionBeijing = '北京'
+t.oss.qcloudRegionShanghai = '上海(華東)'
+t.oss.qcloudRegionGuangzhou = '廣州(華南)'
+t.oss.qcloudRegionChengdu = '成都(西南)'
+t.oss.qcloudRegionChongqing = '重慶'
+t.oss.qcloudRegionSingapore = '新加坡'
+t.oss.qcloudRegionHongkong = '香港'
+t.oss.qcloudRegionToronto = '多倫多'
+t.oss.qcloudRegionFrankfurt = '法蘭克福'
+t.oss.localDomain = '域名'
+t.oss.localDomainTips = '綁定的域名,如:http://cdn.renren.io'
+t.oss.fastdfsDomain = '域名'
+t.oss.fastdfsDomainTips = '綁定的域名,如:http://cdn.renren.io'
+t.oss.localPrefix = '路徑前綴'
+t.oss.localPrefixTips = '不設置默認為空'
+t.oss.localPath = '存儲目錄'
+t.oss.localPathTips = '如:D:/upload'
+
+t.dept = {}
+t.dept.name = '名稱'
+t.dept.parentName = '上級部門'
+t.dept.sort = '排序'
+t.dept.parentNameDefault = '一級部門'
+t.dept.chooseerror = '請選擇部門'
+t.dept.title = '選擇部門'
+
+t.dict = {}
+t.dict.dictName = '字典名稱'
+t.dict.dictType = '字典類型'
+t.dict.dictLabel = '字典標籤'
+t.dict.dictValue = '字典值'
+t.dict.sort = '排序'
+t.dict.remark = '備註'
+t.dict.createDate = '創建時間'
+
+t.logError = {}
+t.logError.requestUri = '請求URI'
+t.logError.requestMethod = '請求方式'
+t.logError.requestParams = '請求參數'
+t.logError.ip = '操作IP'
+t.logError.userAgent = '用戶代理'
+t.logError.createDate = '創建時間'
+t.logError.errorInfo = '異常信息'
+
+t.logLogin = {}
+t.logLogin.creatorName = '用戶名'
+t.logLogin.status = '狀態'
+t.logLogin.status0 = '失敗'
+t.logLogin.status1 = '成功'
+t.logLogin.status2 = '賬號已鎖定'
+t.logLogin.operation = '操作類型'
+t.logLogin.operation0 = '登錄'
+t.logLogin.operation1 = '退出'
+t.logLogin.ip = '操作IP'
+t.logLogin.userAgent = 'User-Agent'
+t.logLogin.createDate = '創建時間'
+
+t.logOperation = {}
+t.logOperation.status = '狀態'
+t.logOperation.status0 = '失敗'
+t.logOperation.status1 = '成功'
+t.logOperation.creatorName = '用戶名'
+t.logOperation.operation = '用戶操作'
+t.logOperation.requestUri = '請求URI'
+t.logOperation.requestMethod = '請求方式'
+t.logOperation.requestParams = '請求參數'
+t.logOperation.requestTime = '請求時長'
+t.logOperation.ip = '操作IP'
+t.logOperation.userAgent = 'User-Agent'
+t.logOperation.createDate = '創建時間'
+
+t.menu = {}
+t.menu.name = '名稱'
+t.menu.icon = '圖標'
+t.menu.type = '類型'
+t.menu.type0 = '菜單'
+t.menu.type1 = '按鈕'
+t.menu.sort = '排序'
+t.menu.url = '路由'
+t.menu.permissions = '授權標識'
+t.menu.permissionsTips = '多個用逗號分隔,如:sys:menu:save,sys:menu:update'
+t.menu.parentName = '上級菜單'
+t.menu.parentNameDefault = '一級菜單'
+t.menu.resource = '授權資源'
+t.menu.resourceUrl = '資源URL'
+t.menu.resourceMethod = '請求方式'
+t.menu.resourceAddItem = '添加一項'
+
+t.params = {}
+t.params.paramCode = '編碼'
+t.params.paramValue = '值'
+t.params.remark = '備註'
+
+t.role = {}
+t.role.name = '名稱'
+t.role.remark = '備註'
+t.role.createDate = '創建時間'
+t.role.menuList = '菜單授權'
+t.role.deptList = '數據授權'
+
+t.user = {}
+t.user.username = '用戶名'
+t.user.deptName = '所屬部門'
+t.user.email = '郵箱'
+t.user.mobile = '手機號'
+t.user.status = '狀態'
+t.user.status0 = '停用'
+t.user.status1 = '正常'
+t.user.createDate = '創建時間'
+t.user.password = '密碼'
+t.user.confirmPassword = '確認密碼'
+t.user.realName = '真實姓名'
+t.user.gender = '性別'
+t.user.gender0 = '男'
+t.user.gender1 = '女'
+t.user.gender2 = '保密'
+t.user.roleIdList = '角色配置'
+t.user.validate = {}
+t.user.validate.confirmPassword = '確認密碼與密碼輸入不一致'
+t.user.select = '選擇用戶'
+t.user.selecterror = '請選擇一條記錄'
+
+t.correction = {}
+t.correction.post = '申請崗位'
+t.correction.entryDate = '入職日期'
+t.correction.correctionDate = '轉正日期'
+t.correction.workContent = '工作內容'
+t.correction.achievement = '工作成績'
+
+t.process.comment = '審核意見'
+t.process.completeTask = '通過'
+t.process.rejectTask = '駁回'
+t.process.doBackRollback = '回退'
+t.process.terminationTask = '終止'
+t.process.entrustTask = '委託'
+t.process.createInstance = '發起流程'
+t.process.instanceId = '流程實例ID'
+t.process.taskId = '任務ID'
+t.process.days = '天數'
+t.process.businessKey = '業務KEY'
+t.process.processDefinitionName = '流程名稱'
+t.process.ended = '是否結束'
+t.process.ended0 = '是'
+t.process.ended1 = '否'
+t.process.startTime = '流程開始時間'
+t.process.endTime = '流程結束時間'
+t.process.activityName = '當前環節'
+t.process.createTime = '任務創建時間'
+t.process.assignee = '處理人'
+t.process.viewFlowImage = '查看流程圖'
+t.process.flowImage = '流程圖'
+t.process.processDefinitionVersion = '流程版本'
+t.process.startUserId = '發起人'
+t.process.taskName = '任務名稱'
+t.process.owner = '任務所有人'
+t.process.claim = '簽收'
+t.process.routeError = '請先配置業務表單路由信息'
+t.process.entrustError = '請選擇委託人'
+t.process.formURLError = '請設置保存表單的URL'
+t.process.keyError = '請設置流程KEY'
+t.process.formNameError = '請設置表單名稱'
+t.process.businessKeyError = '業務KEY為空,無法啟動流程'
+t.process.notExistError = '沒有查詢到流程,請先設計流程'
+t.process.circulation = '流轉詳情'
+
+t.task = {}
+t.task.businessKeyError = '業務KEY為空,無法處理任務'
+t.task.detailError = '業務KEY為空,無法查看處理詳情'
+t.task.startTime = '任務開始時間'
+t.task.endTime = '任務結束時間'
+t.task.durationInSeconds = '任務時長 (秒)'
+
+t.region = {}
+t.region.id = '區域標識'
+t.region.name = '區域名稱'
+t.region.type = '區域類型'
+t.region.sort = '排序'
+t.region.updateDate = '更新時間'
+t.region.province = '省份直轄市'
+t.region.city = '地市'
+t.region.county = '區縣'
+
+t.oss.type6 = 'MinIO'
+t.oss.minioEndPoint = 'EndPoint'
+t.oss.minioEndPointTips = 'MinIO EndPoint'
+t.oss.minioAccessKey = 'AccessKey'
+t.oss.minioAccessKeyTips = 'AccessKey'
+t.oss.minioSecretKey = 'SecretKey'
+t.oss.minioSecretKeyTips = 'SecretKey'
+t.oss.minioBucketName = 'BucketName'
+t.oss.minioBucketNameTips = 'BucketName'
+t.oss.minioPrefix = '路徑前綴'
+t.oss.minioPrefixTips = '不設置默認為空'
+
+t.sms.platform3 = '七牛'
+t.sms.qiniuAccessKey = 'AccessKey'
+t.sms.qiniuAccessKeyTips = 'AccessKey'
+t.sms.qiniuSecretKey = 'SecretKey'
+t.sms.qiniuSecretKeyTips = 'SecretKey'
+t.sms.qiniuTemplateId = '短信模板'
+t.sms.qiniuTemplateIdTips = '短信模板ID'
+t.sms.smsCode = '短信編碼'
+t.sms.remark = '備註'
+
+t.notice = {}
+t.notice.title = '標題'
+t.notice.type = '類型'
+t.notice.senderName = '發送者'
+t.notice.senderDate = '發送時間'
+t.notice.status = '狀態'
+t.notice.status0 = '草稿'
+t.notice.status1 = '已發'
+t.notice.view = '查看'
+t.notice.view1 = '通知管理 - 查看'
+t.notice.view2 = '我的通知 - 查看'
+t.notice.readStatus = '閱讀狀態'
+t.notice.readStatus0 = '未讀'
+t.notice.readStatus1 = '已讀'
+t.notice.content = '內容'
+t.notice.receiverType = '接收者'
+t.notice.receiverType0 = '全部'
+t.notice.receiverType1 = '部門'
+t.notice.selectDept = '選擇部門'
+t.notice.draft = '保存草稿'
+t.notice.release = '發布通知'
+t.notice.close = '關閉'
+t.notice.receiverName = '接收者'
+t.notice.readDate = '閱讀時間'
+t.notice.new = '有新通知'
+t.notice.disconnect = '連接斷開'
+t.notice.disconnectMessage = 'WebSocket連接已斷開,請檢查網絡'
+
+export default t
diff --git a/src/icons/iconfont.js b/src/icons/iconfont.js
new file mode 100644
index 0000000..b438d8a
--- /dev/null
+++ b/src/icons/iconfont.js
@@ -0,0 +1 @@
+(function(window){var svgSprite='';var script=function(){var scripts=document.getElementsByTagName("script");return scripts[scripts.length-1]}();var shouldInjectCss=script.getAttribute("data-injectcss");var ready=function(fn){if(document.addEventListener){if(~["complete","loaded","interactive"].indexOf(document.readyState)){setTimeout(fn,0)}else{var loadFn=function(){document.removeEventListener("DOMContentLoaded",loadFn,false);fn()};document.addEventListener("DOMContentLoaded",loadFn,false)}}else if(document.attachEvent){IEContentLoaded(window,fn)}function IEContentLoaded(w,fn){var d=w.document,done=false,init=function(){if(!done){done=true;fn()}};var polling=function(){try{d.documentElement.doScroll("left")}catch(e){setTimeout(polling,50);return}init()};polling();d.onreadystatechange=function(){if(d.readyState=="complete"){d.onreadystatechange=null;init()}}}};var before=function(el,target){target.parentNode.insertBefore(el,target)};var prepend=function(el,target){if(target.firstChild){before(el,target.firstChild)}else{target.appendChild(el)}};function appendSvg(){var div,svg;div=document.createElement("div");div.innerHTML=svgSprite;svgSprite=null;svg=div.getElementsByTagName("svg")[0];if(svg){svg.setAttribute("aria-hidden","true");svg.style.position="absolute";svg.style.width=0;svg.style.height=0;svg.style.overflow="hidden";prepend(svg,document.body)}}if(shouldInjectCss&&!window.__iconfont__svg__cssinject__){window.__iconfont__svg__cssinject__=true;try{document.write("")}catch(e){console&&console.log(e)}}ready(appendSvg)})(window)
\ No newline at end of file
diff --git a/src/icons/index.js b/src/icons/index.js
new file mode 100644
index 0000000..d56cde7
--- /dev/null
+++ b/src/icons/index.js
@@ -0,0 +1,21 @@
+// import './iconfont'
+
+// const svgFiles = require.context('./svg', true, /\.svg$/)
+// svgFiles.keys().map(item => svgFiles(item))
+
+import Vue from 'vue'
+import SvgIcon from '@/components/SvgIcon'// svg component
+import './iconfont'
+
+// register globally
+Vue.component('svg-icon', SvgIcon)
+
+// require.context有三个参数:
+// directory:说明需要检索的目录
+// useSubdirectories:是否检索子目录
+// regExp: 匹配文件的正则表达式
+
+const req = require.context('./svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys().map(requireContext)
+requireAll(req)
+
diff --git a/src/icons/svg/icon-404.svg b/src/icons/svg/icon-404.svg
new file mode 100644
index 0000000..6df5019
--- /dev/null
+++ b/src/icons/svg/icon-404.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-HIS-up.svg b/src/icons/svg/icon-HIS-up.svg
new file mode 100644
index 0000000..32b7a07
--- /dev/null
+++ b/src/icons/svg/icon-HIS-up.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/svg/icon-arrow.svg b/src/icons/svg/icon-arrow.svg
new file mode 100644
index 0000000..415939d
--- /dev/null
+++ b/src/icons/svg/icon-arrow.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/svg/icon-books.svg b/src/icons/svg/icon-books.svg
new file mode 100644
index 0000000..0088e77
--- /dev/null
+++ b/src/icons/svg/icon-books.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/svg/icon-bug.svg b/src/icons/svg/icon-bug.svg
new file mode 100644
index 0000000..05a150d
--- /dev/null
+++ b/src/icons/svg/icon-bug.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-case.svg b/src/icons/svg/icon-case.svg
new file mode 100644
index 0000000..5867c33
--- /dev/null
+++ b/src/icons/svg/icon-case.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/icons/svg/icon-change-film.svg b/src/icons/svg/icon-change-film.svg
new file mode 100644
index 0000000..01d1c6f
--- /dev/null
+++ b/src/icons/svg/icon-change-film.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/svg/icon-change.svg b/src/icons/svg/icon-change.svg
new file mode 100644
index 0000000..daa322c
--- /dev/null
+++ b/src/icons/svg/icon-change.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/icons/svg/icon-chart-pie.svg b/src/icons/svg/icon-chart-pie.svg
new file mode 100644
index 0000000..a3e63ef
--- /dev/null
+++ b/src/icons/svg/icon-chart-pie.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/icons/svg/icon-chart-progressbar.svg b/src/icons/svg/icon-chart-progressbar.svg
new file mode 100644
index 0000000..e0f4c83
--- /dev/null
+++ b/src/icons/svg/icon-chart-progressbar.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/icons/svg/icon-chart.svg b/src/icons/svg/icon-chart.svg
new file mode 100644
index 0000000..27728fb
--- /dev/null
+++ b/src/icons/svg/icon-chart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-clipboard.svg b/src/icons/svg/icon-clipboard.svg
new file mode 100644
index 0000000..90923ff
--- /dev/null
+++ b/src/icons/svg/icon-clipboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-component.svg b/src/icons/svg/icon-component.svg
new file mode 100644
index 0000000..207ada3
--- /dev/null
+++ b/src/icons/svg/icon-component.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-dashboard.svg b/src/icons/svg/icon-dashboard.svg
new file mode 100644
index 0000000..5317d37
--- /dev/null
+++ b/src/icons/svg/icon-dashboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-documentation.svg b/src/icons/svg/icon-documentation.svg
new file mode 100644
index 0000000..7043122
--- /dev/null
+++ b/src/icons/svg/icon-documentation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-drag.svg b/src/icons/svg/icon-drag.svg
new file mode 100644
index 0000000..4185d3c
--- /dev/null
+++ b/src/icons/svg/icon-drag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-edit.svg b/src/icons/svg/icon-edit.svg
new file mode 100644
index 0000000..d26101f
--- /dev/null
+++ b/src/icons/svg/icon-edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-education.svg b/src/icons/svg/icon-education.svg
new file mode 100644
index 0000000..7bfb01d
--- /dev/null
+++ b/src/icons/svg/icon-education.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-email.svg b/src/icons/svg/icon-email.svg
new file mode 100644
index 0000000..74d25e2
--- /dev/null
+++ b/src/icons/svg/icon-email.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-exam-mange.svg b/src/icons/svg/icon-exam-mange.svg
new file mode 100644
index 0000000..aa212f4
--- /dev/null
+++ b/src/icons/svg/icon-exam-mange.svg
@@ -0,0 +1,12 @@
+
diff --git a/src/icons/svg/icon-example.svg b/src/icons/svg/icon-example.svg
new file mode 100644
index 0000000..46f42b5
--- /dev/null
+++ b/src/icons/svg/icon-example.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-excel.svg b/src/icons/svg/icon-excel.svg
new file mode 100644
index 0000000..74d97b8
--- /dev/null
+++ b/src/icons/svg/icon-excel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-exit-fullscreen.svg b/src/icons/svg/icon-exit-fullscreen.svg
new file mode 100644
index 0000000..485c128
--- /dev/null
+++ b/src/icons/svg/icon-exit-fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-export.svg b/src/icons/svg/icon-export.svg
new file mode 100644
index 0000000..400e937
--- /dev/null
+++ b/src/icons/svg/icon-export.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/svg/icon-eye-open.svg b/src/icons/svg/icon-eye-open.svg
new file mode 100644
index 0000000..88dcc98
--- /dev/null
+++ b/src/icons/svg/icon-eye-open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-eye.svg b/src/icons/svg/icon-eye.svg
new file mode 100644
index 0000000..16ed2d8
--- /dev/null
+++ b/src/icons/svg/icon-eye.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-form.svg b/src/icons/svg/icon-form.svg
new file mode 100644
index 0000000..dcbaa18
--- /dev/null
+++ b/src/icons/svg/icon-form.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-fullscreen.svg b/src/icons/svg/icon-fullscreen.svg
new file mode 100644
index 0000000..0e86b6f
--- /dev/null
+++ b/src/icons/svg/icon-fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-guide.svg b/src/icons/svg/icon-guide.svg
new file mode 100644
index 0000000..b271001
--- /dev/null
+++ b/src/icons/svg/icon-guide.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-head-boy.svg b/src/icons/svg/icon-head-boy.svg
new file mode 100644
index 0000000..a82b492
--- /dev/null
+++ b/src/icons/svg/icon-head-boy.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/icons/svg/icon-head-girl.svg b/src/icons/svg/icon-head-girl.svg
new file mode 100644
index 0000000..f593d41
--- /dev/null
+++ b/src/icons/svg/icon-head-girl.svg
@@ -0,0 +1,11 @@
+
diff --git a/src/icons/svg/icon-hospital.svg b/src/icons/svg/icon-hospital.svg
new file mode 100644
index 0000000..7d43c20
--- /dev/null
+++ b/src/icons/svg/icon-hospital.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/svg/icon-icon.svg b/src/icons/svg/icon-icon.svg
new file mode 100644
index 0000000..82be8ee
--- /dev/null
+++ b/src/icons/svg/icon-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-image-tag.svg b/src/icons/svg/icon-image-tag.svg
new file mode 100644
index 0000000..f852d72
--- /dev/null
+++ b/src/icons/svg/icon-image-tag.svg
@@ -0,0 +1,6 @@
+
diff --git a/src/icons/svg/icon-in-patient.svg b/src/icons/svg/icon-in-patient.svg
new file mode 100644
index 0000000..6a4fbf0
--- /dev/null
+++ b/src/icons/svg/icon-in-patient.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-international.svg b/src/icons/svg/icon-international.svg
new file mode 100644
index 0000000..e9b56ee
--- /dev/null
+++ b/src/icons/svg/icon-international.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-jx-logo.svg b/src/icons/svg/icon-jx-logo.svg
new file mode 100644
index 0000000..be463d9
--- /dev/null
+++ b/src/icons/svg/icon-jx-logo.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/svg/icon-language.svg b/src/icons/svg/icon-language.svg
new file mode 100644
index 0000000..0082b57
--- /dev/null
+++ b/src/icons/svg/icon-language.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-lightning.svg b/src/icons/svg/icon-lightning.svg
new file mode 100644
index 0000000..b62cb53
--- /dev/null
+++ b/src/icons/svg/icon-lightning.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/svg/icon-link.svg b/src/icons/svg/icon-link.svg
new file mode 100644
index 0000000..48197ba
--- /dev/null
+++ b/src/icons/svg/icon-link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-list.svg b/src/icons/svg/icon-list.svg
new file mode 100644
index 0000000..20259ed
--- /dev/null
+++ b/src/icons/svg/icon-list.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-lock.svg b/src/icons/svg/icon-lock.svg
new file mode 100644
index 0000000..74fee54
--- /dev/null
+++ b/src/icons/svg/icon-lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-logo.svg b/src/icons/svg/icon-logo.svg
new file mode 100644
index 0000000..afb6823
--- /dev/null
+++ b/src/icons/svg/icon-logo.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/icons/svg/icon-message-two.svg b/src/icons/svg/icon-message-two.svg
new file mode 100644
index 0000000..eaa37f5
--- /dev/null
+++ b/src/icons/svg/icon-message-two.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/svg/icon-message.svg b/src/icons/svg/icon-message.svg
new file mode 100644
index 0000000..14ca817
--- /dev/null
+++ b/src/icons/svg/icon-message.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-money.svg b/src/icons/svg/icon-money.svg
new file mode 100644
index 0000000..c1580de
--- /dev/null
+++ b/src/icons/svg/icon-money.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-nested.svg b/src/icons/svg/icon-nested.svg
new file mode 100644
index 0000000..06713a8
--- /dev/null
+++ b/src/icons/svg/icon-nested.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-new-task.svg b/src/icons/svg/icon-new-task.svg
new file mode 100644
index 0000000..0ce0490
--- /dev/null
+++ b/src/icons/svg/icon-new-task.svg
@@ -0,0 +1,7 @@
+
diff --git a/src/icons/svg/icon-out-patient.svg b/src/icons/svg/icon-out-patient.svg
new file mode 100644
index 0000000..694e852
--- /dev/null
+++ b/src/icons/svg/icon-out-patient.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/svg/icon-pan.svg b/src/icons/svg/icon-pan.svg
new file mode 100644
index 0000000..78ae8d4
--- /dev/null
+++ b/src/icons/svg/icon-pan.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/svg/icon-password.svg b/src/icons/svg/icon-password.svg
new file mode 100644
index 0000000..e291d85
--- /dev/null
+++ b/src/icons/svg/icon-password.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-pdf.svg b/src/icons/svg/icon-pdf.svg
new file mode 100644
index 0000000..957aa0c
--- /dev/null
+++ b/src/icons/svg/icon-pdf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-people.svg b/src/icons/svg/icon-people.svg
new file mode 100644
index 0000000..2bd54ae
--- /dev/null
+++ b/src/icons/svg/icon-people.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-peoples.svg b/src/icons/svg/icon-peoples.svg
new file mode 100644
index 0000000..aab852e
--- /dev/null
+++ b/src/icons/svg/icon-peoples.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-qgy.svg b/src/icons/svg/icon-qgy.svg
new file mode 100644
index 0000000..5b988ec
--- /dev/null
+++ b/src/icons/svg/icon-qgy.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/icons/svg/icon-qq.svg b/src/icons/svg/icon-qq.svg
new file mode 100644
index 0000000..ee13d4e
--- /dev/null
+++ b/src/icons/svg/icon-qq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-referral.svg b/src/icons/svg/icon-referral.svg
new file mode 100644
index 0000000..1552af9
--- /dev/null
+++ b/src/icons/svg/icon-referral.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/svg/icon-repair.svg b/src/icons/svg/icon-repair.svg
new file mode 100644
index 0000000..7051196
--- /dev/null
+++ b/src/icons/svg/icon-repair.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/svg/icon-right-active.svg b/src/icons/svg/icon-right-active.svg
new file mode 100644
index 0000000..cd7355f
--- /dev/null
+++ b/src/icons/svg/icon-right-active.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/svg/icon-right-circle.svg b/src/icons/svg/icon-right-circle.svg
new file mode 100644
index 0000000..b7f57a2
--- /dev/null
+++ b/src/icons/svg/icon-right-circle.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/svg/icon-screen-right.svg b/src/icons/svg/icon-screen-right.svg
new file mode 100644
index 0000000..300bd7d
--- /dev/null
+++ b/src/icons/svg/icon-screen-right.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/svg/icon-screen.svg b/src/icons/svg/icon-screen.svg
new file mode 100644
index 0000000..54c50a5
--- /dev/null
+++ b/src/icons/svg/icon-screen.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/svg/icon-screenTwo.svg b/src/icons/svg/icon-screenTwo.svg
new file mode 100644
index 0000000..8e3c469
--- /dev/null
+++ b/src/icons/svg/icon-screenTwo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-search.svg b/src/icons/svg/icon-search.svg
new file mode 100644
index 0000000..84233dd
--- /dev/null
+++ b/src/icons/svg/icon-search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-setplan.svg b/src/icons/svg/icon-setplan.svg
new file mode 100644
index 0000000..faee90e
--- /dev/null
+++ b/src/icons/svg/icon-setplan.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/icons/svg/icon-shopping.svg b/src/icons/svg/icon-shopping.svg
new file mode 100644
index 0000000..87513e7
--- /dev/null
+++ b/src/icons/svg/icon-shopping.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-size.svg b/src/icons/svg/icon-size.svg
new file mode 100644
index 0000000..ddb25b8
--- /dev/null
+++ b/src/icons/svg/icon-size.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-skill.svg b/src/icons/svg/icon-skill.svg
new file mode 100644
index 0000000..a3b7312
--- /dev/null
+++ b/src/icons/svg/icon-skill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-star.svg b/src/icons/svg/icon-star.svg
new file mode 100644
index 0000000..6cf86e6
--- /dev/null
+++ b/src/icons/svg/icon-star.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-statistics.svg b/src/icons/svg/icon-statistics.svg
new file mode 100644
index 0000000..0692d2d
--- /dev/null
+++ b/src/icons/svg/icon-statistics.svg
@@ -0,0 +1,8 @@
+
diff --git a/src/icons/svg/icon-tab.svg b/src/icons/svg/icon-tab.svg
new file mode 100644
index 0000000..b4b48e4
--- /dev/null
+++ b/src/icons/svg/icon-tab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-table.svg b/src/icons/svg/icon-table.svg
new file mode 100644
index 0000000..0e3dc9d
--- /dev/null
+++ b/src/icons/svg/icon-table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-textbook-flag.svg b/src/icons/svg/icon-textbook-flag.svg
new file mode 100644
index 0000000..0121583
--- /dev/null
+++ b/src/icons/svg/icon-textbook-flag.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/icons/svg/icon-theme.svg b/src/icons/svg/icon-theme.svg
new file mode 100644
index 0000000..5982a2f
--- /dev/null
+++ b/src/icons/svg/icon-theme.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-tree-table.svg b/src/icons/svg/icon-tree-table.svg
new file mode 100644
index 0000000..8aafdb8
--- /dev/null
+++ b/src/icons/svg/icon-tree-table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-tree.svg b/src/icons/svg/icon-tree.svg
new file mode 100644
index 0000000..dd4b7dd
--- /dev/null
+++ b/src/icons/svg/icon-tree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-upload-file.svg b/src/icons/svg/icon-upload-file.svg
new file mode 100644
index 0000000..e6b2831
--- /dev/null
+++ b/src/icons/svg/icon-upload-file.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/icons/svg/icon-user-mange.svg b/src/icons/svg/icon-user-mange.svg
new file mode 100644
index 0000000..0455c65
--- /dev/null
+++ b/src/icons/svg/icon-user-mange.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/icons/svg/icon-user.svg b/src/icons/svg/icon-user.svg
new file mode 100644
index 0000000..0ba0716
--- /dev/null
+++ b/src/icons/svg/icon-user.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-wechat.svg b/src/icons/svg/icon-wechat.svg
new file mode 100644
index 0000000..c586e55
--- /dev/null
+++ b/src/icons/svg/icon-wechat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/svg/icon-ysg.svg b/src/icons/svg/icon-ysg.svg
new file mode 100644
index 0000000..f178118
--- /dev/null
+++ b/src/icons/svg/icon-ysg.svg
@@ -0,0 +1,5 @@
+
diff --git a/src/icons/svg/icon-yzk-login.svg b/src/icons/svg/icon-yzk-login.svg
new file mode 100644
index 0000000..a899b10
--- /dev/null
+++ b/src/icons/svg/icon-yzk-login.svg
@@ -0,0 +1,17 @@
+
diff --git a/src/icons/svg/icon-yzk-login1.svg b/src/icons/svg/icon-yzk-login1.svg
new file mode 100644
index 0000000..0fee7f9
--- /dev/null
+++ b/src/icons/svg/icon-yzk-login1.svg
@@ -0,0 +1,89 @@
+
diff --git a/src/icons/svg/icon-zip.svg b/src/icons/svg/icon-zip.svg
new file mode 100644
index 0000000..f806fc4
--- /dev/null
+++ b/src/icons/svg/icon-zip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/mixins/checked.js b/src/mixins/checked.js
new file mode 100644
index 0000000..495c10f
--- /dev/null
+++ b/src/mixins/checked.js
@@ -0,0 +1,36 @@
+export default {
+ data() {
+ return {}
+ },
+ methods: {
+ // table-checkbox选择项发生变化时会触发该事件
+ handleSelectionChange(val) {
+ if (val.length === this.dataList.length) {
+ this.$refs.checkfooter.cheackAllFooter = true
+ } else {
+ this.$refs.checkfooter.cheackAllFooter = false
+ }
+ this.currentTableList = val
+ },
+ // 全选
+ cheackAllChange(tableRef) {
+ if (this.cheackAllFooter) {
+ this.$parent.$refs[tableRef].toggleAllSelection()
+ } else {
+ this.$parent.$refs[tableRef].clearSelection()
+ }
+ },
+ // 反选
+ cheackReverseClick(tableRef) {
+ this.dataList.forEach((row) => {
+ this.$parent.$refs[tableRef].toggleRowSelection(row)
+ })
+ },
+ // 取消
+ cancelClick(tableRef) {
+ this.cheackAllFooter = false
+ this.cheackReverseFooter = false
+ this.$parent.$refs[tableRef].clearSelection()
+ }
+ }
+}
diff --git a/src/mixins/qgyCRFData.js b/src/mixins/qgyCRFData.js
new file mode 100644
index 0000000..f640c9f
--- /dev/null
+++ b/src/mixins/qgyCRFData.js
@@ -0,0 +1,35 @@
+export default {
+ data() {
+ return {
+ }
+ },
+ methods: {
+ // 青光眼的数据获取不在crf/getFlowForm下的firstVisit中,需要单独调取此接口获取
+ getQgyCRFData() {
+ this.$http.get('/view/out/patient/getVisitOutPatientForHis', {
+ params: {
+ patientIdNumber: this.patientIdNumber,
+ patientId: this.patientId ? this.patientId : '',
+ visitDate: this.realVisitTime ? this.realVisitTime : '',
+ realVisitType: this.realVisitType ? this.realVisitType : ''
+ }
+ })
+ .then(({ data: res }) => {
+ if (res.code !== 0) {
+ return this.$message.error(res.msg)
+ }
+ if (res.data) {
+ setTimeout(() => {
+ if (this.$refs.crfComponent) {
+ const ifr = this.$refs.crfComponent.$el
+ const ifrWin = ifr.contentWindow
+ console.log(ifr.contentWindow)
+ ifrWin.dataFill(res.data)
+ }
+ }, 800)
+ }
+ }).catch(() => { })
+ }
+ }
+}
+
diff --git a/src/mixins/view-module.js b/src/mixins/view-module.js
new file mode 100644
index 0000000..b382508
--- /dev/null
+++ b/src/mixins/view-module.js
@@ -0,0 +1,190 @@
+// import Cookies from 'js-cookie'
+// import qs from 'qs'
+export default {
+ data() {
+ /* eslint-disable */
+ return {
+ // 设置属性
+ mixinViewModuleOptions: {
+ createdIsNeed: true, // 此页面是否在创建时,调用查询数据列表接口?
+ activatedIsNeed: false, // 此页面是否在激活(进入)时,调用查询数据列表接口?
+ getDataListURL: '', // 数据列表接口,API地址
+ getDataListIsPage: false, // 数据列表接口,是否需要分页?
+ deleteURL: '', // 删除接口,API地址
+ deleteIsBatch: false, // 删除接口,是否需要批量?
+ deleteIsBatchKey: 'id', // 删除接口,批量状态下由那个key进行标记操作?比如:pid,uid...
+ exportURL: '' // 导出接口,API地址
+ },
+ // 默认属性
+ dataForm: {}, // 查询条件
+ dataList: [], // 数据列表
+ order: '', // 排序,asc/desc
+ sort: '', // 排序,字段
+ pageNum: 1, // 当前页码
+ pageSize: 10, // 每页数
+ total: 0, // 总条数
+ dataListLoading: false, // 数据列表,loading状态
+ dataListSelections: [], // 数据列表,多选项
+ addOrUpdateVisible: false, // 新增/更新,弹窗visible状态
+ deleteParams: {}
+ }
+ /* eslint-enable */
+ },
+ created() {
+ if (this.mixinViewModuleOptions.createdIsNeed) {
+ this.query()
+ }
+ },
+ activated() {
+ if (this.mixinViewModuleOptions.activatedIsNeed) {
+ this.query()
+ }
+ },
+ methods: {
+ // 获取数据列表
+ query() {
+ this.dataListLoading = true
+ this.mixinViewModuleOptions.getDataListURL ? this.$http.get(
+ this.mixinViewModuleOptions.getDataListURL, {
+ params: {
+ order: this.order,
+ sort: this.sort,
+ pageNum: this.mixinViewModuleOptions.getDataListIsPage ? this.pageNum : null,
+ pageSize: this.mixinViewModuleOptions.getDataListIsPage ? this.pageSize : null,
+ ...this.dataForm
+ }
+ }
+ ).then(({ data: res }) => {
+ this.dataListLoading = false
+ if (res.code !== 0) {
+ this.dataList = []
+ this.total = 0
+ return this.$message.error(res.msg)
+ }
+ this.dataList = this.mixinViewModuleOptions.getDataListIsPage ? res.data.list : res.data
+ this.total = this.mixinViewModuleOptions.getDataListIsPage ? res.data.total : 0
+ }).catch(() => {
+ this.dataListLoading = false
+ }) : ''
+ },
+ // 排序
+ sortChange(data) {
+ this.sort = data.prop
+ this.order = data.order
+ this.pageNum = 1
+ },
+ // 多选
+ dataListSelectionChangeHandle(val) {
+ this.dataListSelections = val
+ },
+ // 分页, 每页条数
+ pageSizeChangeHandle(val) {
+ this.pageNum = 1
+ this.pageSize = val
+ this.query()
+ },
+ // 分页, 当前页
+ pageCurrentChangeHandle(val) {
+ this.pageNum = val
+ this.query()
+ },
+ getDataList() {
+ this.query()
+ },
+ // 新增 / 修改
+ addOrUpdateHandle(id, params, title) {
+ this.addOrUpdateVisible = true
+ this.$nextTick(() => {
+ this.$refs.addOrUpdate.dataForm.id = id
+ this.$refs.addOrUpdate.dataForm.params = params || {}
+ this.$refs.addOrUpdate.dataForm.title = title
+ this.$refs.addOrUpdate.init()
+ })
+ },
+ // 关闭当前窗口
+ closeCurrentTab(data) {
+ var tabName = this.$store.state.contentTabsActiveName
+ this.$store.state.contentTabs = this.$store.state.contentTabs.filter(item => item.name !== tabName)
+ if (this.$store.state.contentTabs.length <= 0) {
+ this.$store.state.sidebarMenuActiveName = this.$store.state.contentTabsActiveName = 'home'
+ return false
+ }
+ if (tabName === this.$store.state.contentTabsActiveName) {
+ this.$router.push({ name: this.$store.state.contentTabs[this.$store.state.contentTabs.length - 1].name })
+ }
+ },
+ // 删除
+ deleteHandle(id, callback) {
+ if (this.mixinViewModuleOptions.deleteIsBatch && !id && this.dataListSelections.length <= 0) {
+ return this.$message({
+ message: this.$t('prompt.deleteBatch'),
+ type: 'warning',
+ duration: 500
+ })
+ }
+ this.$confirm(this.$t('prompt.info', { handle: this.$t('delete') }), this.$t('prompt.title'), {
+ confirmButtonText: this.$t('confirm'),
+ cancelButtonText: this.$t('cancel'),
+ type: 'warning'
+ }).then(() => {
+ (Array.isArray(id) ? this.$http({
+ url: this.mixinViewModuleOptions.deleteURL,
+ method: 'delete',
+ data: id
+ }) : this.$http.delete(this.mixinViewModuleOptions.deleteURL + `/${id}`)).then(({ data: res }) => {
+ if (res.code !== 0) {
+ return this.$message.error(res.msg)
+ }
+ this.$message({
+ message: this.$t('prompt.success'),
+ type: 'success',
+ duration: 500,
+ onClose: () => {
+ callback ? callback() : this.getDataList()
+ }
+ })
+ }).catch(() => {})
+ }).catch(() => {})
+ },
+ // deleteHandle(id, StringParams = 'id') {
+ // if (this.mixinViewModuleOptions.deleteIsBatch && !id && this.dataListSelections.length <= 0) {
+ // return this.$message({
+ // message: this.$t('prompt.deleteBatch'),
+ // type: 'warning',
+ // duration: 500
+ // })
+ // }
+ // this.$confirm(this.$t('prompt.info', { handle: this.$t('delete') }), this.$t('prompt.title'), {
+ // confirmButtonText: this.$t('confirm'),
+ // cancelButtonText: this.$t('cancel'),
+ // type: 'warning'
+ // }).then(async() => {
+ // const { data: res } = await this.$http({
+ // method: 'post',
+ // url: this.mixinViewModuleOptions.deleteURL,
+ // data: this.$qs.stringify({ [StringParams]: id || this.dataListSelections.map(item => item[this.mixinViewModuleOptions.deleteIsBatchKey]),
+ // ...this.deleteParams })
+ // })
+ // if (res.status !== 200) {
+ // return this.$message.error(res.msg)
+ // }
+ // this.$message({
+ // message: res.msg,
+ // type: 'success',
+ // duration: 500,
+ // onClose: () => {
+ // this.query()
+ // }
+ // })
+ // }).catch(() => { })
+ // },
+ // 导出
+ exportHandle() {
+ // var params = qs.stringify({
+ // token: Cookies.get('jxpt-token'),
+ // ...this.dataForm
+ // })
+ // window.location.href = `${window.SITE_CONFIG.apiURL}${this.mixinViewModuleOptions.exportURL}?${params}`
+ }
+ }
+}
diff --git a/src/page-subspecialty/App.vue b/src/page-subspecialty/App.vue
new file mode 100644
index 0000000..95b749f
--- /dev/null
+++ b/src/page-subspecialty/App.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/main.js b/src/page-subspecialty/main.js
new file mode 100644
index 0000000..6d30232
--- /dev/null
+++ b/src/page-subspecialty/main.js
@@ -0,0 +1,99 @@
+// system入口
+import Vue from 'vue'
+import Element from 'element-ui'
+import App from './App.vue'
+import router from './router'
+import store from './store'
+import http from './utils/request'
+import jQuery from 'jquery'
+import 'element-ui/lib/theme-chalk/index.css'
+import '@/icons'
+import '@/assets/scss/aui.scss'
+import '@/assets/scss/reset.scss'
+// import 'vue-waterfall-plugin/dist/vue-waterfall-plugin.css'
+import i18n from '@/i18n'
+import * as filters from '@/filters'
+// import { hasPermission, getDictLabel } from '@/utils'
+
+import cloneDeep from 'lodash/cloneDeep'
+// import 'xe-utils'
+// import VXETable from 'vxe-table'
+// import 'vxe-table/lib/index.css'
+
+// import echarts from 'echarts'
+import moment from 'moment'
+// import VueChatScroll from 'vue-chat-scroll'
+
+import Base64 from '@/utils/base64.js'
+Vue.prototype.$Base64 = Base64
+
+import Print from 'vue-print-nb'
+Vue.use(Print)
+
+import { confirm } from '@/utils/confirm'
+Vue.prototype.$confirmFun = confirm
+
+// import VueDragResize from 'vue-drag-resize'
+// Vue.component('vue-drag-resize', VueDragResize)
+
+import qs from 'qs'
+Vue.prototype.$qs = qs
+
+// 全局监听DOM元素
+import ElementResizeDetectorMaker from 'element-resize-detector'
+Vue.prototype.$erd = ElementResizeDetectorMaker()
+
+moment.locale('zh-cn') // 设置语言 或 moment.lang('zh-cn');
+
+Vue.use(Element, {
+ size: 'default',
+ i18n: (key, value) => i18n.t(key, value)
+})
+
+Object.keys(filters).forEach(key => {
+ Vue.filter(key, filters[key])
+})
+
+// 全局组件
+// Vue.use(VueChatScroll)
+// Vue.use(VXETable)
+
+// DICOM
+// import cornerstone from 'cornerstone-core'
+// import cornerstoneMath from 'cornerstone-math'
+// import cornerstoneTools from 'cornerstone-tools'
+// import Hammer from 'hammerjs'
+// import dicomParser from 'dicom-parser'
+// import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
+// import cornerstoneWebImageLoader from 'cornerstone-web-image-loader'
+//
+// cornerstoneTools.external.cornerstone = cornerstone
+// cornerstoneTools.external.Hammer = Hammer
+// cornerstoneTools.external.cornerstoneMath = cornerstoneMath
+// cornerstoneWADOImageLoader.external.dicomParser = dicomParser
+// cornerstoneWADOImageLoader.external.cornerstoneMath = cornerstoneMath
+// cornerstoneWADOImageLoader.external.cornerstone = cornerstone
+// cornerstoneWebImageLoader.external.cornerstone = cornerstone
+// cornerstone.registerImageLoader('http', cornerstoneWADOImageLoader.loadImage)
+// cornerstone.registerImageLoader('https', cornerstoneWADOImageLoader.loadImage)
+// cornerstone.registerImageLoader('http', cornerstoneWebImageLoader.loadImage)
+// Vue.prototype.$cornerstone = cornerstone
+// Vue.prototype.$cornerstoneTools = cornerstoneTools
+
+// 挂载全局
+Vue.prototype.$http = http
+Vue.prototype.$ = jQuery
+// Vue.prototype.$hasPermission = hasPermission
+// Vue.prototype.$getDictLabel = getDictLabel
+Vue.prototype.$moment = moment
+// Vue.prototype.$echarts = echarts
+
+Vue.config.productionTip = false
+// 保存整站vuex本地储存初始状态
+window.SITE_CONFIG.storeState = cloneDeep(store.state)
+new Vue({
+ i18n,
+ router,
+ store,
+ render: h => h(App)
+}).$mount('#app')
diff --git a/src/page-subspecialty/router/index.js b/src/page-subspecialty/router/index.js
new file mode 100644
index 0000000..41f59f3
--- /dev/null
+++ b/src/page-subspecialty/router/index.js
@@ -0,0 +1,108 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+import Cookies from 'js-cookie'
+
+Vue.use(Router)
+
+const originalPush = Router.prototype.push
+Router.prototype.push = function push(location, onResolve, onReject) {
+ if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject)
+ return originalPush.call(this, location).catch(err => err)
+}
+
+// 页面路由(独立页面)
+export const pageRoutes = [
+ {
+ path: '/404',
+ component: () => import('@/page-subspecialty/views/pages/404'),
+ name: '404',
+ meta: { title: '404未找到' },
+ beforeEnter(to, from, next) {
+ // 拦截处理特殊业务场景
+ // 如果, 重定向路由包含__双下划线, 为临时添加路由
+ if (/__.*/.test(to.redirectedFrom)) {
+ return next(to.redirectedFrom.replace(/__.*/, ''))
+ }
+ next()
+ }
+ },
+ {
+ path: '/login',
+ component: () => import('@/page-subspecialty/views/pages/login'),
+ name: 'login',
+ meta: { title: '登录' }
+ }
+]
+
+// 模块路由(基于主入口布局页面)*8
+export const moduleRoutes = {
+ path: '/',
+ component: () => import('@/page-subspecialty/views/main'),
+ name: 'main',
+ redirect: { name: 'patientManagement' },
+ meta: { title: '首页' },
+ children: [
+ {
+ path: '/iframe',
+ component: null,
+ name: 'iframe',
+ meta: { title: 'iframe', isTab: true }
+ },
+ {
+ path: '/redirect',
+ name: 'redirect',
+ meta: { title: '首页' },
+ component: () => import('@/page-subspecialty/views/redirect')
+ },
+ {
+ path: '/patientManagement',
+ name: 'patientManagement',
+ component: () => import('@/page-subspecialty/views/modules/patientManagement')
+ },
+ {
+ path: '/seeDoctor',
+ name: 'seeDoctor',
+ component: () => import('@/page-subspecialty/views/modules/seeDoctor')
+ },
+ {
+ path: '/setManagement',
+ name: 'setManagement',
+ component: () => import('@/page-subspecialty/views/modules/setManagement')
+ },
+ {
+ path: '/centerManagement',
+ name: 'centerManagement',
+ component: () => import('@/page-subspecialty/views/modules/centre')
+ },
+ {
+ path: '/teamManagement',
+ name: 'teamManagement',
+ component: () => import('@/page-subspecialty/views/modules/team')
+ }
+ ]
+}
+
+const createRouter = () => new Router({
+ mode: 'history',
+ scrollBehavior: () => ({ y: 0 }),
+ routes: pageRoutes.concat(moduleRoutes)
+})
+const router = createRouter()
+
+// [vue-router] Duplicate named routes definition 重复的命名路由定义
+// 动态路由退出再登录会出现警告重复路由
+// 解决方案:在退出时调用resetRouter()方法
+export function resetRouter() {
+ const newRouter = createRouter()
+ router.matcher = newRouter.matcher // reset router
+}
+
+router.beforeEach((to, from, next) => {
+ const token = Cookies.get('token')
+ if (!token && to.path !== '/login') {
+ next('/login')
+ } else {
+ next()
+ }
+})
+export default router
diff --git a/src/page-subspecialty/store/index.js b/src/page-subspecialty/store/index.js
new file mode 100644
index 0000000..4d564c5
--- /dev/null
+++ b/src/page-subspecialty/store/index.js
@@ -0,0 +1,51 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+import cloneDeep from 'lodash/cloneDeep'
+import user from './modules/user'
+
+Vue.use(Vuex)
+
+export default new Vuex.Store({
+ namespaced: true,
+ state: {
+ // 导航条, 布局风格, default(白色) / colorful(鲜艳)
+ navbarLayoutType: 'colorful',
+ // 侧边栏, 布局皮肤, default(白色) / dark(黑色)
+ sidebarLayoutSkin: 'dark',
+ // 侧边栏, 折叠状态
+ sidebarFold: false,
+ // 侧边栏, 菜单
+ sidebarMenuList: [],
+ sidebarMenuActiveName: '',
+ // 内容, 是否需要刷新
+ contentIsNeedRefresh: false,
+ // 内容, 标签页(默认添加首页)
+ contentTabs: [
+ {
+ ...window.SITE_CONFIG.contentTabDefault,
+ name: 'home',
+ title: 'home'
+ }
+ ],
+ defauleActiveIndex: ''
+ },
+ modules: {
+ user
+ },
+ getters: {
+ defauleActiveIndex: state => state.defauleActiveIndex
+ },
+ mutations: {
+ // 重置vuex本地储存状态
+ resetStore(state) {
+ Object.keys(state).forEach((key) => {
+ state[key] = cloneDeep(window.SITE_CONFIG.storeState[key])
+ })
+ },
+ // 设置菜单激活所在位置
+ activeIndexFun(state, id) {
+ state.defauleActiveIndex = id + ''
+ window.localStorage.setItem('defauleActiveIndex', id + '')
+ }
+ }
+})
diff --git a/src/page-subspecialty/store/modules/user.js b/src/page-subspecialty/store/modules/user.js
new file mode 100644
index 0000000..62e9cd0
--- /dev/null
+++ b/src/page-subspecialty/store/modules/user.js
@@ -0,0 +1,12 @@
+export default {
+ state: {
+ id: '',
+ name: '',
+ realName: '',
+ mobile: '',
+ deptId: '',
+ deptName: '',
+ roleIdList: null,
+ superAdmin: 0
+ }
+}
diff --git a/src/page-subspecialty/utils/request.js b/src/page-subspecialty/utils/request.js
new file mode 100644
index 0000000..ad83b1f
--- /dev/null
+++ b/src/page-subspecialty/utils/request.js
@@ -0,0 +1,89 @@
+import axios from 'axios'
+import Cookies from 'js-cookie'
+import qs from 'qs'
+import isPlainObject from 'lodash/isPlainObject'
+import router from '../router'
+import store from '../store'
+/**
+ * 清除登录信息
+ */
+export function clearLoginInfo() {
+ store.commit('resetStore')
+ Cookies.remove('token')
+ window.localStorage.clear()
+ window.SITE_CONFIG['dynamicMenuRoutesHasAdded'] = false
+}
+export function findIndexArray(data, id, indexArray) {
+ const arr = Array.from(indexArray)
+ for (let i = 0, len = data.length; i < len; i++) {
+ arr.push(data[i].id)
+ if (data[i].id === id) {
+ return arr
+ }
+ const children = data[i].children
+ if (children && children.length) {
+ const result = findIndexArray(children, id, arr)
+ if (result.length > 0) return result
+ }
+ arr.pop()
+ }
+ return []
+}
+
+const http = axios.create({
+ baseURL: window.SITE_CONFIG['apiURL'],
+ timeout: 1000 * 180,
+ withCredentials: true
+})
+/**
+ * 请求拦截
+ */
+http.interceptors.request.use(config => {
+ config.headers['Accept-Language'] = Cookies.get('language') || 'zh-CN'
+ config.headers['token'] = Cookies.get('token') || ''
+ config.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
+ // 默认参数
+ var defaults = {}
+ // 防止缓存,GET请求默认带_t参数
+ if (config.method === 'get') {
+ config.params = {
+ ...config.params,
+ ...{ '_t': new Date().getTime() }
+ }
+ }
+ if (isPlainObject(config.params)) {
+ config.params = {
+ ...defaults,
+ ...config.params
+ }
+ }
+ if (isPlainObject(config.data)) {
+ config.data = {
+ ...defaults,
+ ...config.data
+ }
+ if (/^application\/x-www-form-urlencoded/.test(config.headers['content-type'])) {
+ config.data = qs.stringify(config.data)
+ }
+ }
+ return config
+}, error => {
+ return Promise.reject(error)
+})
+
+/**
+ * 响应拦截
+ */
+http.interceptors.response.use(response => {
+ if (response.data.code === 401 || response.data.status === 700) {
+ clearLoginInfo()
+ router.replace({ name: 'login' })
+ return Promise.reject(response.data.msg)
+ }
+ return response
+}, error => {
+ console.error(error)
+ return Promise.reject(error)
+})
+
+export default http
diff --git a/src/page-subspecialty/views/main-content.vue b/src/page-subspecialty/views/main-content.vue
new file mode 100644
index 0000000..433f07a
--- /dev/null
+++ b/src/page-subspecialty/views/main-content.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/main-navbar.vue b/src/page-subspecialty/views/main-navbar.vue
new file mode 100644
index 0000000..5f8ad84
--- /dev/null
+++ b/src/page-subspecialty/views/main-navbar.vue
@@ -0,0 +1,89 @@
+
+
+
+
+
diff --git a/src/page-subspecialty/views/main-sidebar.vue b/src/page-subspecialty/views/main-sidebar.vue
new file mode 100644
index 0000000..53ecfed
--- /dev/null
+++ b/src/page-subspecialty/views/main-sidebar.vue
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/main.vue b/src/page-subspecialty/views/main.vue
new file mode 100644
index 0000000..da68ab9
--- /dev/null
+++ b/src/page-subspecialty/views/main.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/centre/add-edit-centre.vue b/src/page-subspecialty/views/modules/centre/add-edit-centre.vue
new file mode 100644
index 0000000..29e94aa
--- /dev/null
+++ b/src/page-subspecialty/views/modules/centre/add-edit-centre.vue
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('cancel') }}
+ {{ $t('confirm') }}
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/centre/index.vue b/src/page-subspecialty/views/modules/centre/index.vue
new file mode 100644
index 0000000..ceb91eb
--- /dev/null
+++ b/src/page-subspecialty/views/modules/centre/index.vue
@@ -0,0 +1,101 @@
+
+
+
+ 新增中心
+
+
+
+
+
+
+ {{ item.name }}
+
+ {{ item.address }}
+
+
+ 医院代码
+ {{ item.centreCode }}
+
+
+ 人员数量
+ {{ item.userNumber }}人
+
+
+ 创建时间
+ {{ item.createDate }}
+
+
+ 操作
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/patientManagement/index.vue b/src/page-subspecialty/views/modules/patientManagement/index.vue
new file mode 100644
index 0000000..efaf731
--- /dev/null
+++ b/src/page-subspecialty/views/modules/patientManagement/index.vue
@@ -0,0 +1,297 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+ {{ scope.row.inDate ? $options.filters.dateFilterTwo( scope.row.inDate): '- ' }}
+
+
+
+
+ {{ scope.row.patientBirthday ? $options.filters.dateFilterTwo( scope.row.patientBirthday): '- ' }}
+
+
+
+
+
+ 详情
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/patientManagement/patient-add-or-update.vue b/src/page-subspecialty/views/modules/patientManagement/patient-add-or-update.vue
new file mode 100644
index 0000000..785a904
--- /dev/null
+++ b/src/page-subspecialty/views/modules/patientManagement/patient-add-or-update.vue
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('cancel') }}
+ {{ $t('confirm') }}
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/seeDoctor/follow-up/1.vue b/src/page-subspecialty/views/modules/seeDoctor/follow-up/1.vue
new file mode 100644
index 0000000..1ef8034
--- /dev/null
+++ b/src/page-subspecialty/views/modules/seeDoctor/follow-up/1.vue
@@ -0,0 +1,1610 @@
+
+
diff --git a/src/page-subspecialty/views/modules/seeDoctor/follow-up/add-follow-record.vue b/src/page-subspecialty/views/modules/seeDoctor/follow-up/add-follow-record.vue
new file mode 100644
index 0000000..64ec73a
--- /dev/null
+++ b/src/page-subspecialty/views/modules/seeDoctor/follow-up/add-follow-record.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+ {{ $t('cancel') }}
+ {{ $t('confirm') }}
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/seeDoctor/follow-up/index.vue b/src/page-subspecialty/views/modules/seeDoctor/follow-up/index.vue
new file mode 100644
index 0000000..36bf315
--- /dev/null
+++ b/src/page-subspecialty/views/modules/seeDoctor/follow-up/index.vue
@@ -0,0 +1,258 @@
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+

+
+
暂无随访记录
+
你可以点击新增记录按钮,新增随访记录
+
新增记录
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/seeDoctor/index.vue b/src/page-subspecialty/views/modules/seeDoctor/index.vue
new file mode 100644
index 0000000..5337f7f
--- /dev/null
+++ b/src/page-subspecialty/views/modules/seeDoctor/index.vue
@@ -0,0 +1,287 @@
+
+
+
+
+
+
+
+ {{ patientInfoObj.patientName }}
+
+
+
+
+
+
+
+
病案号
+
+
+ {{patientInfoObj.caseId || '-' }}
+
+
+
+
+
年龄
+
+
+ {{ patientInfoObj.patientAge || '-'}}
+
+
+
+
+
性别
+
+
+ {{ patientInfoObj.patientSex || '-'}}
+
+
+
+
+
入院时间
+
+
+ {{ patientInfoObj.inDate ? $options.filters.dateFilterTwo( patientInfoObj.inDate) : '-'}}
+
+
+
+
+
出生日期
+
+
+ {{ patientInfoObj.patientBirthday ? $options.filters.dateFilterTwo(patientInfoObj.patientBirthday) : '-'}}
+
+
+
+
+
身份证号
+
+
+ {{ patientInfoObj.patientIdNumber || '-' }}
+
+
+
+
+
手机号
+
+
+ {{ patientInfoObj.patientPhone || '-'}}
+
+
+
+
+
住址
+
+
+ {{ patientInfoObj.patientAddress || '-'}}
+
+
+
+
+
+
返回上一页
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/seeDoctor/patient-form/index.vue b/src/page-subspecialty/views/modules/seeDoctor/patient-form/index.vue
new file mode 100644
index 0000000..6778f40
--- /dev/null
+++ b/src/page-subspecialty/views/modules/seeDoctor/patient-form/index.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/setManagement/add-or-update.vue b/src/page-subspecialty/views/modules/setManagement/add-or-update.vue
new file mode 100644
index 0000000..967e09d
--- /dev/null
+++ b/src/page-subspecialty/views/modules/setManagement/add-or-update.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('cancel') }}
+ {{ $t('confirm') }}
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/setManagement/index.vue b/src/page-subspecialty/views/modules/setManagement/index.vue
new file mode 100644
index 0000000..5d90c66
--- /dev/null
+++ b/src/page-subspecialty/views/modules/setManagement/index.vue
@@ -0,0 +1,141 @@
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 预览
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/team/edit-password.vue b/src/page-subspecialty/views/modules/team/edit-password.vue
new file mode 100644
index 0000000..4a5b221
--- /dev/null
+++ b/src/page-subspecialty/views/modules/team/edit-password.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('cancel') }}
+ {{ $t('confirm') }}
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/team/index.vue b/src/page-subspecialty/views/modules/team/index.vue
new file mode 100644
index 0000000..e274f85
--- /dev/null
+++ b/src/page-subspecialty/views/modules/team/index.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+
+
+
+
+
+
+ 新增
+
+
+
>
+
+
+
+
+
+
+
+ {{ scope.row.gender === 1 ? '女' :'男' }}
+
+
+
+
+
+
+ {{ item }}
+ 、
+
+
+
+
+
+
+
+ {{ scope.row.flagAdmin==0 ?'系统管理员':(scope.row.flagAdmin==1 ? '医院管理员':scope.row.flagAdmin==2 ? '普通医生' :(scope.row.flagAdmin==3 ? '实习医生' :'')) }}
+
+
+
+
+
+ 编辑
+ 修改密码
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/modules/team/team-add-or-update.vue b/src/page-subspecialty/views/modules/team/team-add-or-update.vue
new file mode 100644
index 0000000..e696f43
--- /dev/null
+++ b/src/page-subspecialty/views/modules/team/team-add-or-update.vue
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 男
+ 女
+ 保密
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 停用
+ 正常
+
+
+
+
+ {{ $t('cancel') }}
+ {{ $t('confirm') }}
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/pages/404.vue b/src/page-subspecialty/views/pages/404.vue
new file mode 100644
index 0000000..69b4b5b
--- /dev/null
+++ b/src/page-subspecialty/views/pages/404.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
400
+
+
+ {{ $t('notFound.back') }}
+ {{ $t('notFound.home') }}
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/pages/identity.vue b/src/page-subspecialty/views/pages/identity.vue
new file mode 100644
index 0000000..bb32622
--- /dev/null
+++ b/src/page-subspecialty/views/pages/identity.vue
@@ -0,0 +1,146 @@
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/pages/login.vue b/src/page-subspecialty/views/pages/login.vue
new file mode 100644
index 0000000..27fae01
--- /dev/null
+++ b/src/page-subspecialty/views/pages/login.vue
@@ -0,0 +1,423 @@
+
+
+
+
+
+
+
+
+
+
+
+
心衰数据系统
+
{{ logintitle }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ codeTitleShow ? '发送验证码' : codeCount+'秒后重新发送' }}
+
+
+
+
+
+
+
+
+
+ {{ codeTitleShow ? '发送验证码' : codeCount+'秒后重新发送' }}
+
+
+
+ {{ logintitle === '注册' ? '注册' : '登录' }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/page-subspecialty/views/redirect.vue b/src/page-subspecialty/views/redirect.vue
new file mode 100644
index 0000000..49c3cdb
--- /dev/null
+++ b/src/page-subspecialty/views/redirect.vue
@@ -0,0 +1,17 @@
+
+
+
+
diff --git a/src/utils/base64.js b/src/utils/base64.js
new file mode 100644
index 0000000..d360cf2
--- /dev/null
+++ b/src/utils/base64.js
@@ -0,0 +1,17 @@
+const Base64 = {
+ // 加密
+ encode(str) {
+ return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
+ function toSolidBytes(match, p1) {
+ return String.fromCharCode('0x' + p1)
+ }))
+ },
+ // 解密
+ decode(str) {
+ // Going backwards: from bytestream, to percent-encoding, to original string.
+ return decodeURIComponent(atob(str).split('').map(function(c) {
+ return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
+ }).join(''))
+ }
+}
+export default Base64
diff --git a/src/utils/confirm.js b/src/utils/confirm.js
new file mode 100644
index 0000000..51f66c2
--- /dev/null
+++ b/src/utils/confirm.js
@@ -0,0 +1,16 @@
+import { MessageBox } from 'element-ui'
+import { Message } from 'element-ui'
+export const confirm = (text) => {
+ text = text.length > 0 ? text : '此操作将永久删除该文件, 是否继续?'
+ return new Promise((resolve, reject) => {
+ MessageBox.confirm(text, '提示', {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: 'warning'
+ }).then((res) => {
+ resolve(res)
+ }).catch(() => {
+ Message.info('已取消删除')
+ })
+ })
+}
diff --git a/src/utils/index.js b/src/utils/index.js
new file mode 100644
index 0000000..f19cf4d
--- /dev/null
+++ b/src/utils/index.js
@@ -0,0 +1,348 @@
+/**
+ * 权限判断
+ * @param {*} key
+ */
+export function hasPermission(key) {
+ // return true
+ return window.SITE_CONFIG['permissions'].indexOf(key) !== -1 || false
+}
+
+/**
+ * 获取字典数据列表
+ * @param dictType 字典类型
+ */
+export function getDictDataList(dictType) {
+ const type = window.SITE_CONFIG['dictList'].find((element) => (element.dictType === dictType))
+ if (type) {
+ return type.dataList
+ } else {
+ return []
+ }
+}
+
+/**
+ * 获取字典名称
+ * @param dictType 字典类型
+ * @param dictValue 字典值
+ */
+export function getDictLabel(dictType, dictValue) {
+ const type = window.SITE_CONFIG['dictList'].find((element) => (element.dictType === dictType))
+ if (type) {
+ const val = type.dataList.find((element) => (element.dictValue === dictValue + ''))
+ if (val) {
+ return val.dictLabel
+ } else {
+ return dictValue
+ }
+ } else {
+ return dictValue
+ }
+}
+
+/**
+ * 获取uuid
+ */
+export function getUUID() {
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
+ return (c === 'x' ? (Math.random() * 16 | 0) : ('r&0x3' | '0x8')).toString(16)
+ })
+}
+
+/**
+ * 获取svg图标(id)列表
+ */
+export function getIconList() {
+ var res = []
+ var list = document.querySelectorAll('svg symbol')
+ for (var i = 0; i < list.length; i++) {
+ res.push(list[i].id)
+ }
+
+ return res
+}
+
+/**
+ * 树形数据转换
+ * @param {*} data
+ * @param {*} id
+ * @param {*} pid
+ */
+export function treeDataTranslate(data, id = 'id', pid = 'pid') {
+ var res = []
+ var temp = {}
+ for (var i = 0; i < data.length; i++) {
+ temp[data[i][id]] = data[i]
+ }
+ for (var k = 0; k < data.length; k++) {
+ if (!temp[data[k][pid]] || data[k][id] === data[k][pid]) {
+ res.push(data[k])
+ continue
+ }
+ if (!temp[data[k][pid]]['children']) {
+ temp[data[k][pid]]['children'] = []
+ }
+ temp[data[k][pid]]['children'].push(data[k])
+ data[k]['_level'] = (temp[data[k][pid]]._level || 0) + 1
+ }
+ return res
+}
+
+/**
+ * 树形数据转换,移除空children
+ * @param {*} data
+ */
+export function treeDataTranslateChildren(data) {
+ // 循环遍历json数据
+ for (var i = 0; i < data.length; i++) {
+ if (data[i].children.length < 1) {
+ // children若为空数组,则将children设为undefined
+ data[i].children = undefined
+ } else {
+ treeDataTranslateChildren(data[i].children)
+ }
+ }
+ return data
+}
+
+// 获取范围内随机数据
+export const genRandom = (min, max) => (Math.random() * (max - min + 1) | 0) + min
+
+/**
+ * Parse the time to string
+ * @param {(Object|string|number)} time 时间戳
+ * @param {string} cFormat
+ * @returns {string}
+ */
+export function parseTime(time, cFormat) {
+ if (arguments.length === 0) {
+ return null
+ }
+ const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
+ let date
+ if (typeof time === 'object') {
+ date = time
+ } else {
+ if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
+ time = parseInt(time)
+ }
+ if ((typeof time === 'number') && (time.toString().length === 10)) {
+ time = time * 1000
+ }
+ date = new Date(time)
+ }
+ const formatObj = {
+ y: date.getFullYear(),
+ m: date.getMonth() + 1,
+ d: date.getDate(),
+ h: date.getHours(),
+ i: date.getMinutes(),
+ s: date.getSeconds(),
+ a: date.getDay()
+ }
+ const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+ let value = formatObj[key]
+ // Note: getDay() returns 0 on Sunday
+ if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
+ if (result.length > 0 && value < 10) {
+ value = '0' + value
+ }
+ return value || 0
+ })
+ return time_str
+}
+
+/**
+ * @param {number} time 时间戳
+ * @param {string} option
+ * @returns {string}
+ */
+export function formatTime(time, option) {
+ if (('' + time).length === 10) {
+ time = parseInt(time) * 1000
+ } else {
+ time = +time
+ }
+ const d = new Date(time)
+ const now = Date.now()
+
+ const diff = (now - d) / 1000
+
+ if (diff < 30) {
+ return '刚刚'
+ } else if (diff < 3600) {
+ // less 1 hour
+ return Math.ceil(diff / 60) + '分钟前'
+ } else if (diff < 3600 * 24) {
+ return Math.ceil(diff / 3600) + '小时前'
+ } else if (diff < 3600 * 24 * 2) {
+ return '1天前'
+ }
+ if (option) {
+ return parseTime(time, option)
+ } else {
+ return (
+ d.getMonth() +
+ 1 +
+ '月' +
+ d.getDate() +
+ '日' +
+ d.getHours() +
+ '时' +
+ d.getMinutes() +
+ '分'
+ )
+ }
+}
+/**
+ * 时间转日期
+ * @param {Date} dateTime
+ * @param {string} formatStr
+ */
+export function formatDate(dateTime, formatStr) {
+ var converted = Date.parse(dateTime)
+ var thisDateTime = new Date(converted)
+ if (thisDateTime) {
+ let str = formatStr
+ const Week = ['日', '一', '二', '三', '四', '五', '六']
+
+ str = str.replace(/yyyy|YYYY/, thisDateTime.getFullYear())
+ str = str.replace(/yy|YY/, (thisDateTime.getYear() % 100) > 9 ? (thisDateTime.getYear() % 100).toString() : '0' + (thisDateTime.getYear() % 100))
+
+ str = str.replace(/MM/, (thisDateTime.getMonth() + 1) > 9 ? (thisDateTime.getMonth() + 1).toString() : '0' + (thisDateTime.getMonth() + 1))
+ str = str.replace(/M/g, thisDateTime.getMonth())
+
+ str = str.replace(/w|W/g, Week[thisDateTime.getDay()])
+
+ str = str.replace(/dd|DD/, thisDateTime.getDate() > 9 ? thisDateTime.getDate().toString() : '0' + thisDateTime.getDate())
+ str = str.replace(/d|D/g, thisDateTime.getDate())
+
+ str = str.replace(/hh|HH/, thisDateTime.getHours() > 9 ? thisDateTime.getHours().toString() : '0' + thisDateTime.getHours())
+ str = str.replace(/h|H/g, thisDateTime.getHours())
+ str = str.replace(/mm/, thisDateTime.getMinutes() > 9 ? thisDateTime.getMinutes().toString() : '0' + thisDateTime.getMinutes())
+ str = str.replace(/m/g, thisDateTime.getMinutes())
+
+ str = str.replace(/ss|SS/, thisDateTime.getSeconds() > 9 ? thisDateTime.getSeconds().toString() : '0' + thisDateTime.getSeconds())
+ str = str.replace(/s|S/g, thisDateTime.getSeconds())
+
+ return str
+ } else { return formatStr }
+}
+
+// 获取时间区间内的所有【月份】列表
+export function getAllDateMonthList(begin, end) {
+ begin = begin.split('-')
+ var res = []
+ var year = +begin[0]
+ var month = +begin[1]
+ var date = new Date(year, month, 0)
+ var endTime = new Date(end).getTime()
+ while (date.getTime() <= endTime) {
+ res.push(year + '-' + month.toString().replace(/^(\d)$/, '0$1'))
+ // 加一天,强制到下一月份
+ date = new Date(date.getTime() + 24 * 60 * 60 * 1000)
+ year = date.getFullYear()
+ month = date.getMonth() + 1
+ date = new Date(year, month, 0)
+ }
+ res.push(end)
+ return res
+}
+
+/**
+* @param strBirthday:指的是出生日期,格式为"1990-01-01"
+*/
+export function getAge(strBirthday) {
+ var returnAge
+ var strBirthdayArr = strBirthday.split('-')
+ var birthYear = strBirthdayArr[0]
+ var birthMonth = strBirthdayArr[1]
+ var birthDay = strBirthdayArr[2]
+ var d = new Date()
+ var nowYear = d.getFullYear()
+ var nowMonth = d.getMonth() + 1
+ var nowDay = d.getDate()
+ if (nowYear === birthYear) {
+ returnAge = 0// 同年 则为0周岁
+ } else {
+ var ageDiff = nowYear - birthYear // 年之差
+ if (ageDiff > 0) {
+ if (nowMonth === birthMonth) {
+ var dayDiff = nowDay - birthDay// 日之差
+ if (dayDiff < 0) {
+ returnAge = ageDiff - 1
+ } else {
+ returnAge = ageDiff
+ }
+ } else {
+ var monthDiff = nowMonth - birthMonth// 月之差
+ if (monthDiff < 0) {
+ returnAge = ageDiff - 1
+ } else {
+ returnAge = ageDiff
+ }
+ }
+ } else {
+ returnAge = -1// 返回-1 表示出生日期输入错误 晚于今天
+ }
+ }
+ return returnAge// 返回周岁年龄
+}
+
+/**
+ * 字段脱敏处理
+ * @param {String} field 未脱敏字段
+ * @param {Int} before 开头未脱敏字符数
+ * @param {Int} after 结尾未脱敏字符数
+ * @return {String} 已脱敏字段
+ */
+export function desensitizeField(field, before = 3, after = 4, middle = '***') {
+ if (!field) { return '' }
+ field = String(field)
+ // 匹配中文、英文、数字
+ const regItem = '[\u4e00-\u9fa5a-zA-Z0-9]'
+ const regExp = `(${regItem}{${before}})${regItem}*(${regItem}{${after}})`
+ const reg = new RegExp(regExp)
+
+ return field.replace(reg, `$1${middle}$2`)
+}
+
+/**
+ * @param {Function} func
+ * @param {number} wait
+ * @param {boolean} immediate
+ * @return {*}
+ */
+export function debounce(func, wait, immediate) {
+ let timeout, args, context, timestamp, result
+
+ const later = function() {
+ // 据上一次触发时间间隔
+ const last = +new Date() - timestamp
+
+ // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
+ if (last < wait && last > 0) {
+ timeout = setTimeout(later, wait - last)
+ } else {
+ timeout = null
+ // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
+ if (!immediate) {
+ result = func.apply(context, args)
+ if (!timeout) context = args = null
+ }
+ }
+ }
+
+ return function(...args) {
+ context = this
+ timestamp = +new Date()
+ const callNow = immediate && !timeout
+ // 如果延时不存在,重新设定延时
+ if (!timeout) timeout = setTimeout(later, wait)
+ if (callNow) {
+ result = func.apply(context, args)
+ context = args = null
+ }
+
+ return result
+ }
+}
diff --git a/src/utils/validate.js b/src/utils/validate.js
new file mode 100644
index 0000000..48ed788
--- /dev/null
+++ b/src/utils/validate.js
@@ -0,0 +1,66 @@
+/**
+ * 邮箱
+ * @param {*} s
+ */
+export function isEmail(s) {
+ return /^([a-zA-Z0-9._-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s)
+}
+
+/**
+ * 手机号码
+ * @param {*} s
+ */
+export function isMobile(s) {
+ if (/0\d{2}-\d{7,8}/.test(s) || /\d{7,8}/.test(s) || /^1[0-9]{10}$/.test(s)) {
+ return true
+ } else {
+ return false
+ }
+}
+
+/**
+ * 身份证号
+ * @param {*} s
+ */
+export function isIDNumber(s) {
+ // 香港 台湾
+ // /^[a-z]{1}\d{8,}$/ig.test(s) || /^[a-z0-9]{1}\d{6,7}[a-z0-9]{1}$/ig
+ if (/^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/.test(s)) {
+ return true
+ } else {
+ return false
+ }
+}
+
+/**
+ * 密码
+ * @param {*} s
+ */
+export function password(s) {
+ return /^[a-zA-Z0-9]{6,18}$/.test(s)
+}
+
+/**
+ * 电话号码
+ * @param {*} s
+ */
+export function isPhone(s) {
+ return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s)
+}
+
+/**
+ * URL地址
+ * @param {*} s
+ */
+export function isURL(s) {
+ return /^http[s]?:\/\/.*/.test(s)
+}
+
+/**
+ * 断字符串是否是https?:|mailto:|tal: 开头的
+ * @param {string} path
+ * @returns {Boolean}
+ */
+export function isExternal(path) {
+ return /^(https?:|mailto:|tel:)/.test(path)
+}
diff --git a/static/css/hmcrf-add.css b/static/css/hmcrf-add.css
new file mode 100644
index 0000000..0063129
--- /dev/null
+++ b/static/css/hmcrf-add.css
@@ -0,0 +1,13 @@
+body {
+ /* 整个body不可点击 */
+ pointer-events: none;
+}
+/* textarea去除右下角拖拽键 */
+textarea {
+ resize:none;
+}
+/* 签名按钮打印时不显示 */
+.hmbutton {
+ display: none;
+}
+
diff --git a/static/css/hmcrf.css b/static/css/hmcrf.css
new file mode 100644
index 0000000..4df4bca
--- /dev/null
+++ b/static/css/hmcrf.css
@@ -0,0 +1,90 @@
+
+ html {
+ height: 100%;
+ }
+
+ body{
+ padding: 0px;
+ margin: 0px;
+ }
+
+ /*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/
+ ::-webkit-scrollbar {
+ width: 6px; /*滚动条宽度*/
+ height: 8px; /*滚动条高度*/
+ background-color: rgb(224, 223, 223,.2);
+}
+
+/*定义滑块 内阴影+圆角*/
+::-webkit-scrollbar-thumb {
+ -webkit-box-shadow: inset 0 0 0px white;
+ background-color: rgb(193, 193, 193); /*滚动条的背景颜色*/
+ border-radius: 30px;
+}
+
+ /* .MsoNormal {
+ display: inline-block;
+ } */
+
+ table {
+ border-collapse: collapse;
+ }
+
+ input ,textarea {
+ margin-right: 2px;
+ border-radius: 2px 2px 0 0;
+ outline: none;
+ background:transparent;
+ }
+
+ .border-1{
+ border:none;
+ border-bottom: 1px solid #767676;
+ border-width: thin;
+ }
+ .border-2{
+ border:revert;
+ border-width: thin;
+ }
+ .border-3{
+ border:none;
+ }
+ textarea {
+ text-align: left !important;
+ max-width: 550px !important;
+ line-height: 18px;
+ margin:0 !important;
+ }
+ .hmselect, .DDDs{
+ width: 110px;
+ padding: 6px;
+ border: 1px solid #d9d9d9;
+ border-radius: 4px;
+ }
+ #work-unit {
+ max-width: 500px !important;
+ }
+ p {
+ margin: 6px 0;
+ }
+ .hmbutton {
+ /* padding: 5px 14px; */
+ border: none;
+ /* background: #409eff; */
+ /* color: #fff; */
+ color: #409eff;
+ cursor: pointer
+ }
+ @media print{
+ /* 避免表格断开 */
+ /* table{
+ page-break-after: avoid;
+ } */
+ /* 避免某行文字断裂 */
+ table{
+ /* page-break-inside: avoid; */
+ }
+ html {
+ zoom: 75%;
+ }
+ }
diff --git a/static/css/skins-tinymce/ui/oxide-dark/content.css b/static/css/skins-tinymce/ui/oxide-dark/content.css
new file mode 100644
index 0000000..a6871c8
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide-dark/content.css
@@ -0,0 +1,714 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ cursor: default;
+ display: inline-block;
+ height: 12px !important;
+ padding: 0 2px;
+ -webkit-user-modify: read-only;
+ -moz-user-modify: read-only;
+ -webkit-user-select: all;
+ -moz-user-select: all;
+ -ms-user-select: all;
+ user-select: all;
+ width: 8px !important;
+}
+.mce-content-body .mce-item-anchor[data-mce-selected] {
+ outline-offset: 1px;
+}
+.tox-comments-visible .tox-comment {
+ background-color: #fff0b7;
+}
+.tox-comments-visible .tox-comment--active {
+ background-color: #ffe168;
+}
+.tox-checklist > li:not(.tox-checklist--hidden) {
+ list-style: none;
+ margin: 0.25em 0;
+}
+.tox-checklist > li:not(.tox-checklist--hidden)::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+ cursor: pointer;
+ height: 1em;
+ margin-left: -1.5em;
+ margin-top: 0.125em;
+ position: absolute;
+ width: 1em;
+}
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+}
+[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
+ margin-left: 0;
+ margin-right: -1.5em;
+}
+/* stylelint-disable */
+/* http://prismjs.com/ */
+/**
+ * Dracula Theme originally by Zeno Rocha [@zenorocha]
+ * https://draculatheme.com/
+ *
+ * Ported for PrismJS by Albert Vallverdu [@byverdu]
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: #f8f8f2;
+ background: none;
+ text-shadow: 0 1px rgba(0, 0, 0, 0.3);
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none;
+}
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: 0.5em 0;
+ overflow: auto;
+ border-radius: 0.3em;
+}
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+ background: #282a36;
+}
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+ padding: 0.1em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: #6272a4;
+}
+.token.punctuation {
+ color: #f8f8f2;
+}
+.namespace {
+ opacity: 0.7;
+}
+.token.property,
+.token.tag,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #ff79c6;
+}
+.token.boolean,
+.token.number {
+ color: #bd93f9;
+}
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #50fa7b;
+}
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string,
+.token.variable {
+ color: #f8f8f2;
+}
+.token.atrule,
+.token.attr-value,
+.token.function,
+.token.class-name {
+ color: #f1fa8c;
+}
+.token.keyword {
+ color: #8be9fd;
+}
+.token.regex,
+.token.important {
+ color: #ffb86c;
+}
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+.token.italic {
+ font-style: italic;
+}
+.token.entity {
+ cursor: help;
+}
+/* stylelint-enable */
+.mce-content-body {
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+.mce-content-body .mce-visual-caret {
+ background-color: black;
+ background-color: currentColor;
+ position: absolute;
+}
+.mce-content-body .mce-visual-caret-hidden {
+ display: none;
+}
+.mce-content-body *[data-mce-caret] {
+ left: -1000px;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ right: auto;
+ top: 0;
+}
+.mce-content-body .mce-offscreen-selection {
+ left: -2000000px;
+ max-width: 1000000px;
+ position: absolute;
+}
+.mce-content-body *[contentEditable=false] {
+ cursor: default;
+}
+.mce-content-body *[contentEditable=true] {
+ cursor: text;
+}
+.tox-cursor-format-painter {
+ cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default;
+}
+.mce-content-body figure.align-left {
+ float: left;
+}
+.mce-content-body figure.align-right {
+ float: right;
+}
+.mce-content-body figure.image.align-center {
+ display: table;
+ margin-left: auto;
+ margin-right: auto;
+}
+.mce-preview-object {
+ border: 1px solid gray;
+ display: inline-block;
+ line-height: 0;
+ margin: 0 2px 0 2px;
+ position: relative;
+}
+.mce-preview-object .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-preview-object[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.mce-object {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ border: 1px dashed #aaa;
+}
+.mce-pagebreak {
+ border: 1px dashed #aaa;
+ cursor: default;
+ display: block;
+ height: 5px;
+ margin-top: 15px;
+ page-break-before: always;
+ width: 100%;
+}
+@media print {
+ .mce-pagebreak {
+ border: 0;
+ }
+}
+.tiny-pageembed .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tiny-pageembed[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.tiny-pageembed {
+ display: inline-block;
+ position: relative;
+}
+.tiny-pageembed--21by9,
+.tiny-pageembed--16by9,
+.tiny-pageembed--4by3,
+.tiny-pageembed--1by1 {
+ display: block;
+ overflow: hidden;
+ padding: 0;
+ position: relative;
+ width: 100%;
+}
+.tiny-pageembed--21by9 {
+ padding-top: 42.857143%;
+}
+.tiny-pageembed--16by9 {
+ padding-top: 56.25%;
+}
+.tiny-pageembed--4by3 {
+ padding-top: 75%;
+}
+.tiny-pageembed--1by1 {
+ padding-top: 100%;
+}
+.tiny-pageembed--21by9 iframe,
+.tiny-pageembed--16by9 iframe,
+.tiny-pageembed--4by3 iframe,
+.tiny-pageembed--1by1 iframe {
+ border: 0;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-content-body[data-mce-placeholder] {
+ position: relative;
+}
+.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ color: rgba(34, 47, 62, 0.7);
+ content: attr(data-mce-placeholder);
+ position: absolute;
+}
+.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ left: 1px;
+}
+.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
+ right: 1px;
+}
+.mce-content-body div.mce-resizehandle {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+ z-index: 10000;
+}
+.mce-content-body div.mce-resizehandle:hover {
+ background-color: #4099ff;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(1) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(2) {
+ cursor: nesw-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(3) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(4) {
+ cursor: nesw-resize;
+}
+.mce-content-body .mce-resize-backdrop {
+ z-index: 10000;
+}
+.mce-content-body .mce-clonedresizable {
+ cursor: default;
+ opacity: 0.5;
+ outline: 1px dashed black;
+ position: absolute;
+ z-index: 10001;
+}
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns th,
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns td {
+ border: 0;
+}
+.mce-content-body .mce-resize-helper {
+ background: #555;
+ background: rgba(0, 0, 0, 0.75);
+ border: 1px;
+ border-radius: 3px;
+ color: white;
+ display: none;
+ font-family: sans-serif;
+ font-size: 12px;
+ line-height: 14px;
+ margin: 5px 10px;
+ padding: 5px;
+ position: absolute;
+ white-space: nowrap;
+ z-index: 10002;
+}
+.tox-rtc-user-selection {
+ position: relative;
+}
+.tox-rtc-user-cursor {
+ bottom: 0;
+ cursor: default;
+ position: absolute;
+ top: 0;
+ width: 2px;
+}
+.tox-rtc-user-cursor::before {
+ background-color: inherit;
+ border-radius: 50%;
+ content: '';
+ display: block;
+ height: 8px;
+ position: absolute;
+ right: -3px;
+ top: -3px;
+ width: 8px;
+}
+.tox-rtc-user-cursor:hover::after {
+ background-color: inherit;
+ border-radius: 100px;
+ box-sizing: border-box;
+ color: #fff;
+ content: attr(data-user);
+ display: block;
+ font-size: 12px;
+ font-weight: bold;
+ left: -5px;
+ min-height: 8px;
+ min-width: 8px;
+ padding: 0 12px;
+ position: absolute;
+ top: -11px;
+ white-space: nowrap;
+ z-index: 1000;
+}
+.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
+ background-color: #2dc26b;
+}
+.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
+ background-color: #e03e2d;
+}
+.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
+ background-color: #f1c40f;
+}
+.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
+ background-color: #3598db;
+}
+.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
+ background-color: #b96ad9;
+}
+.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
+ background-color: #e67e23;
+}
+.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
+ background-color: #aaa69d;
+}
+.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
+ background-color: #f368e0;
+}
+.tox-rtc-remote-image {
+ background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
+ border: 1px solid #ccc;
+ min-height: 240px;
+ min-width: 320px;
+}
+.mce-match-marker {
+ background: #aaa;
+ color: #fff;
+}
+.mce-match-marker-selected {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::-moz-selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-content-body img[data-mce-selected],
+.mce-content-body video[data-mce-selected],
+.mce-content-body audio[data-mce-selected],
+.mce-content-body object[data-mce-selected],
+.mce-content-body embed[data-mce-selected],
+.mce-content-body table[data-mce-selected] {
+ outline: 3px solid #4099ff;
+}
+.mce-content-body hr[data-mce-selected] {
+ outline: 3px solid #4099ff;
+ outline-offset: 1px;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
+ outline: 3px solid #4099ff;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
+ outline: 3px solid #4099ff;
+}
+.mce-content-body *[contentEditable=false][data-mce-selected] {
+ cursor: not-allowed;
+ outline: 3px solid #4099ff;
+}
+.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
+.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
+ outline: none;
+}
+.mce-content-body *[data-mce-selected="inline-boundary"] {
+ background-color: #4099ff;
+}
+.mce-content-body .mce-edit-focus {
+ outline: 3px solid #4099ff;
+}
+.mce-content-body td[data-mce-selected],
+.mce-content-body th[data-mce-selected] {
+ position: relative;
+}
+.mce-content-body td[data-mce-selected]::-moz-selection,
+.mce-content-body th[data-mce-selected]::-moz-selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected]::selection,
+.mce-content-body th[data-mce-selected]::selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected] *,
+.mce-content-body th[data-mce-selected] * {
+ outline: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.mce-content-body td[data-mce-selected]::after,
+.mce-content-body th[data-mce-selected]::after {
+ background-color: rgba(180, 215, 255, 0.7);
+ border: 1px solid transparent;
+ bottom: -1px;
+ content: '';
+ left: -1px;
+ mix-blend-mode: lighten;
+ position: absolute;
+ right: -1px;
+ top: -1px;
+}
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+ .mce-content-body td[data-mce-selected]::after,
+ .mce-content-body th[data-mce-selected]::after {
+ border-color: rgba(0, 84, 180, 0.7);
+ }
+}
+.mce-content-body img::-moz-selection {
+ background: none;
+}
+.mce-content-body img::selection {
+ background: none;
+}
+.ephox-snooker-resizer-bar {
+ background-color: #4099ff;
+ opacity: 0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.ephox-snooker-resizer-cols {
+ cursor: col-resize;
+}
+.ephox-snooker-resizer-rows {
+ cursor: row-resize;
+}
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
+ opacity: 1;
+}
+.mce-spellchecker-word {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+ height: 2rem;
+}
+.mce-spellchecker-grammar {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+}
+.mce-toc {
+ border: 1px solid gray;
+}
+.mce-toc h2 {
+ margin: 4px;
+}
+.mce-toc li {
+ list-style-type: none;
+}
+table[style*="border-width: 0px"],
+.mce-item-table:not([border]),
+.mce-item-table[border="0"],
+table[style*="border-width: 0px"] td,
+.mce-item-table:not([border]) td,
+.mce-item-table[border="0"] td,
+table[style*="border-width: 0px"] th,
+.mce-item-table:not([border]) th,
+.mce-item-table[border="0"] th,
+table[style*="border-width: 0px"] caption,
+.mce-item-table:not([border]) caption,
+.mce-item-table[border="0"] caption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks p,
+.mce-visualblocks h1,
+.mce-visualblocks h2,
+.mce-visualblocks h3,
+.mce-visualblocks h4,
+.mce-visualblocks h5,
+.mce-visualblocks h6,
+.mce-visualblocks div:not([data-mce-bogus]),
+.mce-visualblocks section,
+.mce-visualblocks article,
+.mce-visualblocks blockquote,
+.mce-visualblocks address,
+.mce-visualblocks pre,
+.mce-visualblocks figure,
+.mce-visualblocks figcaption,
+.mce-visualblocks hgroup,
+.mce-visualblocks aside,
+.mce-visualblocks ul,
+.mce-visualblocks ol,
+.mce-visualblocks dl {
+ background-repeat: no-repeat;
+ border: 1px dashed #bbb;
+ margin-left: 3px;
+ padding-top: 10px;
+}
+.mce-visualblocks p {
+ background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
+}
+.mce-visualblocks h1 {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
+}
+.mce-visualblocks h2 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
+}
+.mce-visualblocks h3 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
+}
+.mce-visualblocks h4 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
+}
+.mce-visualblocks h5 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
+}
+.mce-visualblocks h6 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
+}
+.mce-visualblocks div:not([data-mce-bogus]) {
+ background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
+}
+.mce-visualblocks section {
+ background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
+}
+.mce-visualblocks article {
+ background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
+}
+.mce-visualblocks blockquote {
+ background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
+}
+.mce-visualblocks address {
+ background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
+}
+.mce-visualblocks pre {
+ background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
+}
+.mce-visualblocks figure {
+ background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
+}
+.mce-visualblocks figcaption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks hgroup {
+ background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
+}
+.mce-visualblocks aside {
+ background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
+}
+.mce-visualblocks ul {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
+}
+.mce-visualblocks ol {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
+}
+.mce-visualblocks dl {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
+}
+.mce-visualblocks:not([dir=rtl]) p,
+.mce-visualblocks:not([dir=rtl]) h1,
+.mce-visualblocks:not([dir=rtl]) h2,
+.mce-visualblocks:not([dir=rtl]) h3,
+.mce-visualblocks:not([dir=rtl]) h4,
+.mce-visualblocks:not([dir=rtl]) h5,
+.mce-visualblocks:not([dir=rtl]) h6,
+.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),
+.mce-visualblocks:not([dir=rtl]) section,
+.mce-visualblocks:not([dir=rtl]) article,
+.mce-visualblocks:not([dir=rtl]) blockquote,
+.mce-visualblocks:not([dir=rtl]) address,
+.mce-visualblocks:not([dir=rtl]) pre,
+.mce-visualblocks:not([dir=rtl]) figure,
+.mce-visualblocks:not([dir=rtl]) figcaption,
+.mce-visualblocks:not([dir=rtl]) hgroup,
+.mce-visualblocks:not([dir=rtl]) aside,
+.mce-visualblocks:not([dir=rtl]) ul,
+.mce-visualblocks:not([dir=rtl]) ol,
+.mce-visualblocks:not([dir=rtl]) dl {
+ margin-left: 3px;
+}
+.mce-visualblocks[dir=rtl] p,
+.mce-visualblocks[dir=rtl] h1,
+.mce-visualblocks[dir=rtl] h2,
+.mce-visualblocks[dir=rtl] h3,
+.mce-visualblocks[dir=rtl] h4,
+.mce-visualblocks[dir=rtl] h5,
+.mce-visualblocks[dir=rtl] h6,
+.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),
+.mce-visualblocks[dir=rtl] section,
+.mce-visualblocks[dir=rtl] article,
+.mce-visualblocks[dir=rtl] blockquote,
+.mce-visualblocks[dir=rtl] address,
+.mce-visualblocks[dir=rtl] pre,
+.mce-visualblocks[dir=rtl] figure,
+.mce-visualblocks[dir=rtl] figcaption,
+.mce-visualblocks[dir=rtl] hgroup,
+.mce-visualblocks[dir=rtl] aside,
+.mce-visualblocks[dir=rtl] ul,
+.mce-visualblocks[dir=rtl] ol,
+.mce-visualblocks[dir=rtl] dl {
+ background-position-x: right;
+ margin-right: 3px;
+}
+.mce-nbsp,
+.mce-shy {
+ background: #aaa;
+}
+.mce-shy::after {
+ content: '-';
+}
+body {
+ font-family: sans-serif;
+}
+table {
+ border-collapse: collapse;
+}
diff --git a/static/css/skins-tinymce/ui/oxide-dark/content.inline.css b/static/css/skins-tinymce/ui/oxide-dark/content.inline.css
new file mode 100644
index 0000000..df6ed08
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide-dark/content.inline.css
@@ -0,0 +1,726 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ cursor: default;
+ display: inline-block;
+ height: 12px !important;
+ padding: 0 2px;
+ -webkit-user-modify: read-only;
+ -moz-user-modify: read-only;
+ -webkit-user-select: all;
+ -moz-user-select: all;
+ -ms-user-select: all;
+ user-select: all;
+ width: 8px !important;
+}
+.mce-content-body .mce-item-anchor[data-mce-selected] {
+ outline-offset: 1px;
+}
+.tox-comments-visible .tox-comment {
+ background-color: #fff0b7;
+}
+.tox-comments-visible .tox-comment--active {
+ background-color: #ffe168;
+}
+.tox-checklist > li:not(.tox-checklist--hidden) {
+ list-style: none;
+ margin: 0.25em 0;
+}
+.tox-checklist > li:not(.tox-checklist--hidden)::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+ cursor: pointer;
+ height: 1em;
+ margin-left: -1.5em;
+ margin-top: 0.125em;
+ position: absolute;
+ width: 1em;
+}
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+}
+[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
+ margin-left: 0;
+ margin-right: -1.5em;
+}
+/* stylelint-disable */
+/* http://prismjs.com/ */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: black;
+ background: none;
+ text-shadow: 0 1px white;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ font-size: 1em;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none;
+}
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+@media print {
+ code[class*="language-"],
+ pre[class*="language-"] {
+ text-shadow: none;
+ }
+}
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: 0.5em 0;
+ overflow: auto;
+}
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+ background: #f5f2f0;
+}
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+ padding: 0.1em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: slategray;
+}
+.token.punctuation {
+ color: #999;
+}
+.namespace {
+ opacity: 0.7;
+}
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #905;
+}
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #690;
+}
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+ color: #9a6e3a;
+ background: hsla(0, 0%, 100%, 0.5);
+}
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+}
+.token.function,
+.token.class-name {
+ color: #DD4A68;
+}
+.token.regex,
+.token.important,
+.token.variable {
+ color: #e90;
+}
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+.token.italic {
+ font-style: italic;
+}
+.token.entity {
+ cursor: help;
+}
+/* stylelint-enable */
+.mce-content-body {
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+.mce-content-body .mce-visual-caret {
+ background-color: black;
+ background-color: currentColor;
+ position: absolute;
+}
+.mce-content-body .mce-visual-caret-hidden {
+ display: none;
+}
+.mce-content-body *[data-mce-caret] {
+ left: -1000px;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ right: auto;
+ top: 0;
+}
+.mce-content-body .mce-offscreen-selection {
+ left: -2000000px;
+ max-width: 1000000px;
+ position: absolute;
+}
+.mce-content-body *[contentEditable=false] {
+ cursor: default;
+}
+.mce-content-body *[contentEditable=true] {
+ cursor: text;
+}
+.tox-cursor-format-painter {
+ cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default;
+}
+.mce-content-body figure.align-left {
+ float: left;
+}
+.mce-content-body figure.align-right {
+ float: right;
+}
+.mce-content-body figure.image.align-center {
+ display: table;
+ margin-left: auto;
+ margin-right: auto;
+}
+.mce-preview-object {
+ border: 1px solid gray;
+ display: inline-block;
+ line-height: 0;
+ margin: 0 2px 0 2px;
+ position: relative;
+}
+.mce-preview-object .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-preview-object[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.mce-object {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ border: 1px dashed #aaa;
+}
+.mce-pagebreak {
+ border: 1px dashed #aaa;
+ cursor: default;
+ display: block;
+ height: 5px;
+ margin-top: 15px;
+ page-break-before: always;
+ width: 100%;
+}
+@media print {
+ .mce-pagebreak {
+ border: 0;
+ }
+}
+.tiny-pageembed .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tiny-pageembed[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.tiny-pageembed {
+ display: inline-block;
+ position: relative;
+}
+.tiny-pageembed--21by9,
+.tiny-pageembed--16by9,
+.tiny-pageembed--4by3,
+.tiny-pageembed--1by1 {
+ display: block;
+ overflow: hidden;
+ padding: 0;
+ position: relative;
+ width: 100%;
+}
+.tiny-pageembed--21by9 {
+ padding-top: 42.857143%;
+}
+.tiny-pageembed--16by9 {
+ padding-top: 56.25%;
+}
+.tiny-pageembed--4by3 {
+ padding-top: 75%;
+}
+.tiny-pageembed--1by1 {
+ padding-top: 100%;
+}
+.tiny-pageembed--21by9 iframe,
+.tiny-pageembed--16by9 iframe,
+.tiny-pageembed--4by3 iframe,
+.tiny-pageembed--1by1 iframe {
+ border: 0;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-content-body[data-mce-placeholder] {
+ position: relative;
+}
+.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ color: rgba(34, 47, 62, 0.7);
+ content: attr(data-mce-placeholder);
+ position: absolute;
+}
+.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ left: 1px;
+}
+.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
+ right: 1px;
+}
+.mce-content-body div.mce-resizehandle {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+ z-index: 10000;
+}
+.mce-content-body div.mce-resizehandle:hover {
+ background-color: #4099ff;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(1) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(2) {
+ cursor: nesw-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(3) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(4) {
+ cursor: nesw-resize;
+}
+.mce-content-body .mce-resize-backdrop {
+ z-index: 10000;
+}
+.mce-content-body .mce-clonedresizable {
+ cursor: default;
+ opacity: 0.5;
+ outline: 1px dashed black;
+ position: absolute;
+ z-index: 10001;
+}
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns th,
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns td {
+ border: 0;
+}
+.mce-content-body .mce-resize-helper {
+ background: #555;
+ background: rgba(0, 0, 0, 0.75);
+ border: 1px;
+ border-radius: 3px;
+ color: white;
+ display: none;
+ font-family: sans-serif;
+ font-size: 12px;
+ line-height: 14px;
+ margin: 5px 10px;
+ padding: 5px;
+ position: absolute;
+ white-space: nowrap;
+ z-index: 10002;
+}
+.tox-rtc-user-selection {
+ position: relative;
+}
+.tox-rtc-user-cursor {
+ bottom: 0;
+ cursor: default;
+ position: absolute;
+ top: 0;
+ width: 2px;
+}
+.tox-rtc-user-cursor::before {
+ background-color: inherit;
+ border-radius: 50%;
+ content: '';
+ display: block;
+ height: 8px;
+ position: absolute;
+ right: -3px;
+ top: -3px;
+ width: 8px;
+}
+.tox-rtc-user-cursor:hover::after {
+ background-color: inherit;
+ border-radius: 100px;
+ box-sizing: border-box;
+ color: #fff;
+ content: attr(data-user);
+ display: block;
+ font-size: 12px;
+ font-weight: bold;
+ left: -5px;
+ min-height: 8px;
+ min-width: 8px;
+ padding: 0 12px;
+ position: absolute;
+ top: -11px;
+ white-space: nowrap;
+ z-index: 1000;
+}
+.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
+ background-color: #2dc26b;
+}
+.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
+ background-color: #e03e2d;
+}
+.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
+ background-color: #f1c40f;
+}
+.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
+ background-color: #3598db;
+}
+.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
+ background-color: #b96ad9;
+}
+.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
+ background-color: #e67e23;
+}
+.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
+ background-color: #aaa69d;
+}
+.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
+ background-color: #f368e0;
+}
+.tox-rtc-remote-image {
+ background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
+ border: 1px solid #ccc;
+ min-height: 240px;
+ min-width: 320px;
+}
+.mce-match-marker {
+ background: #aaa;
+ color: #fff;
+}
+.mce-match-marker-selected {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::-moz-selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-content-body img[data-mce-selected],
+.mce-content-body video[data-mce-selected],
+.mce-content-body audio[data-mce-selected],
+.mce-content-body object[data-mce-selected],
+.mce-content-body embed[data-mce-selected],
+.mce-content-body table[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body hr[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+ outline-offset: 1px;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false][data-mce-selected] {
+ cursor: not-allowed;
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
+.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
+ outline: none;
+}
+.mce-content-body *[data-mce-selected="inline-boundary"] {
+ background-color: #b4d7ff;
+}
+.mce-content-body .mce-edit-focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body td[data-mce-selected],
+.mce-content-body th[data-mce-selected] {
+ position: relative;
+}
+.mce-content-body td[data-mce-selected]::-moz-selection,
+.mce-content-body th[data-mce-selected]::-moz-selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected]::selection,
+.mce-content-body th[data-mce-selected]::selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected] *,
+.mce-content-body th[data-mce-selected] * {
+ outline: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.mce-content-body td[data-mce-selected]::after,
+.mce-content-body th[data-mce-selected]::after {
+ background-color: rgba(180, 215, 255, 0.7);
+ border: 1px solid rgba(180, 215, 255, 0.7);
+ bottom: -1px;
+ content: '';
+ left: -1px;
+ mix-blend-mode: multiply;
+ position: absolute;
+ right: -1px;
+ top: -1px;
+}
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+ .mce-content-body td[data-mce-selected]::after,
+ .mce-content-body th[data-mce-selected]::after {
+ border-color: rgba(0, 84, 180, 0.7);
+ }
+}
+.mce-content-body img::-moz-selection {
+ background: none;
+}
+.mce-content-body img::selection {
+ background: none;
+}
+.ephox-snooker-resizer-bar {
+ background-color: #b4d7ff;
+ opacity: 0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.ephox-snooker-resizer-cols {
+ cursor: col-resize;
+}
+.ephox-snooker-resizer-rows {
+ cursor: row-resize;
+}
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
+ opacity: 1;
+}
+.mce-spellchecker-word {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+ height: 2rem;
+}
+.mce-spellchecker-grammar {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+}
+.mce-toc {
+ border: 1px solid gray;
+}
+.mce-toc h2 {
+ margin: 4px;
+}
+.mce-toc li {
+ list-style-type: none;
+}
+table[style*="border-width: 0px"],
+.mce-item-table:not([border]),
+.mce-item-table[border="0"],
+table[style*="border-width: 0px"] td,
+.mce-item-table:not([border]) td,
+.mce-item-table[border="0"] td,
+table[style*="border-width: 0px"] th,
+.mce-item-table:not([border]) th,
+.mce-item-table[border="0"] th,
+table[style*="border-width: 0px"] caption,
+.mce-item-table:not([border]) caption,
+.mce-item-table[border="0"] caption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks p,
+.mce-visualblocks h1,
+.mce-visualblocks h2,
+.mce-visualblocks h3,
+.mce-visualblocks h4,
+.mce-visualblocks h5,
+.mce-visualblocks h6,
+.mce-visualblocks div:not([data-mce-bogus]),
+.mce-visualblocks section,
+.mce-visualblocks article,
+.mce-visualblocks blockquote,
+.mce-visualblocks address,
+.mce-visualblocks pre,
+.mce-visualblocks figure,
+.mce-visualblocks figcaption,
+.mce-visualblocks hgroup,
+.mce-visualblocks aside,
+.mce-visualblocks ul,
+.mce-visualblocks ol,
+.mce-visualblocks dl {
+ background-repeat: no-repeat;
+ border: 1px dashed #bbb;
+ margin-left: 3px;
+ padding-top: 10px;
+}
+.mce-visualblocks p {
+ background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
+}
+.mce-visualblocks h1 {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
+}
+.mce-visualblocks h2 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
+}
+.mce-visualblocks h3 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
+}
+.mce-visualblocks h4 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
+}
+.mce-visualblocks h5 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
+}
+.mce-visualblocks h6 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
+}
+.mce-visualblocks div:not([data-mce-bogus]) {
+ background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
+}
+.mce-visualblocks section {
+ background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
+}
+.mce-visualblocks article {
+ background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
+}
+.mce-visualblocks blockquote {
+ background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
+}
+.mce-visualblocks address {
+ background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
+}
+.mce-visualblocks pre {
+ background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
+}
+.mce-visualblocks figure {
+ background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
+}
+.mce-visualblocks figcaption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks hgroup {
+ background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
+}
+.mce-visualblocks aside {
+ background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
+}
+.mce-visualblocks ul {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
+}
+.mce-visualblocks ol {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
+}
+.mce-visualblocks dl {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
+}
+.mce-visualblocks:not([dir=rtl]) p,
+.mce-visualblocks:not([dir=rtl]) h1,
+.mce-visualblocks:not([dir=rtl]) h2,
+.mce-visualblocks:not([dir=rtl]) h3,
+.mce-visualblocks:not([dir=rtl]) h4,
+.mce-visualblocks:not([dir=rtl]) h5,
+.mce-visualblocks:not([dir=rtl]) h6,
+.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),
+.mce-visualblocks:not([dir=rtl]) section,
+.mce-visualblocks:not([dir=rtl]) article,
+.mce-visualblocks:not([dir=rtl]) blockquote,
+.mce-visualblocks:not([dir=rtl]) address,
+.mce-visualblocks:not([dir=rtl]) pre,
+.mce-visualblocks:not([dir=rtl]) figure,
+.mce-visualblocks:not([dir=rtl]) figcaption,
+.mce-visualblocks:not([dir=rtl]) hgroup,
+.mce-visualblocks:not([dir=rtl]) aside,
+.mce-visualblocks:not([dir=rtl]) ul,
+.mce-visualblocks:not([dir=rtl]) ol,
+.mce-visualblocks:not([dir=rtl]) dl {
+ margin-left: 3px;
+}
+.mce-visualblocks[dir=rtl] p,
+.mce-visualblocks[dir=rtl] h1,
+.mce-visualblocks[dir=rtl] h2,
+.mce-visualblocks[dir=rtl] h3,
+.mce-visualblocks[dir=rtl] h4,
+.mce-visualblocks[dir=rtl] h5,
+.mce-visualblocks[dir=rtl] h6,
+.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),
+.mce-visualblocks[dir=rtl] section,
+.mce-visualblocks[dir=rtl] article,
+.mce-visualblocks[dir=rtl] blockquote,
+.mce-visualblocks[dir=rtl] address,
+.mce-visualblocks[dir=rtl] pre,
+.mce-visualblocks[dir=rtl] figure,
+.mce-visualblocks[dir=rtl] figcaption,
+.mce-visualblocks[dir=rtl] hgroup,
+.mce-visualblocks[dir=rtl] aside,
+.mce-visualblocks[dir=rtl] ul,
+.mce-visualblocks[dir=rtl] ol,
+.mce-visualblocks[dir=rtl] dl {
+ background-position-x: right;
+ margin-right: 3px;
+}
+.mce-nbsp,
+.mce-shy {
+ background: #aaa;
+}
+.mce-shy::after {
+ content: '-';
+}
diff --git a/static/css/skins-tinymce/ui/oxide-dark/content.inline.min.css b/static/css/skins-tinymce/ui/oxide-dark/content.inline.min.css
new file mode 100644
index 0000000..0a3d965
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide-dark/content.inline.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:10000}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}
diff --git a/static/css/skins-tinymce/ui/oxide-dark/content.min.css b/static/css/skins-tinymce/ui/oxide-dark/content.min.css
new file mode 100644
index 0000000..0706740
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide-dark/content.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#282a36}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6272a4}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#ff79c6}.token.boolean,.token.number{color:#bd93f9}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#50fa7b}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#f1fa8c}.token.keyword{color:#8be9fd}.token.important,.token.regex{color:#ffb86c}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:10000}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #4099ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #4099ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #4099ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #4099ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #4099ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#4099ff}.mce-content-body .mce-edit-focus{outline:3px solid #4099ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid transparent;bottom:-1px;content:'';left:-1px;mix-blend-mode:lighten;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#4099ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse}
diff --git a/static/css/skins-tinymce/ui/oxide-dark/content.mobile.css b/static/css/skins-tinymce/ui/oxide-dark/content.mobile.css
new file mode 100644
index 0000000..4bdb8ba
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide-dark/content.mobile.css
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection {
+ /* Note: this file is used inside the content, so isn't part of theming */
+ background-color: green;
+ display: inline-block;
+ opacity: 0.5;
+ position: absolute;
+}
+body {
+ -webkit-text-size-adjust: none;
+}
+body img {
+ /* this is related to the content margin */
+ max-width: 96vw;
+}
+body table img {
+ max-width: 95%;
+}
+body {
+ font-family: sans-serif;
+}
+table {
+ border-collapse: collapse;
+}
diff --git a/static/css/skins-tinymce/ui/oxide-dark/content.mobile.min.css b/static/css/skins-tinymce/ui/oxide-dark/content.mobile.min.css
new file mode 100644
index 0000000..35f7dc0
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide-dark/content.mobile.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse}
diff --git a/static/css/skins-tinymce/ui/oxide-dark/fonts/tinymce-mobile.woff b/static/css/skins-tinymce/ui/oxide-dark/fonts/tinymce-mobile.woff
new file mode 100644
index 0000000..1e3be03
Binary files /dev/null and b/static/css/skins-tinymce/ui/oxide-dark/fonts/tinymce-mobile.woff differ
diff --git a/static/css/skins-tinymce/ui/oxide-dark/skin.css b/static/css/skins-tinymce/ui/oxide-dark/skin.css
new file mode 100644
index 0000000..ab40302
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide-dark/skin.css
@@ -0,0 +1,3029 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tox {
+ box-shadow: none;
+ box-sizing: content-box;
+ color: #2A3746;
+ cursor: auto;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: normal;
+ -webkit-tap-highlight-color: transparent;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ vertical-align: initial;
+ white-space: normal;
+}
+.tox *:not(svg):not(rect) {
+ box-sizing: inherit;
+ color: inherit;
+ cursor: inherit;
+ direction: inherit;
+ font-family: inherit;
+ font-size: inherit;
+ font-style: inherit;
+ font-weight: inherit;
+ line-height: inherit;
+ -webkit-tap-highlight-color: inherit;
+ text-align: inherit;
+ text-decoration: inherit;
+ text-shadow: inherit;
+ text-transform: inherit;
+ vertical-align: inherit;
+ white-space: inherit;
+}
+.tox *:not(svg):not(rect) {
+ /* stylelint-disable-line no-duplicate-selectors */
+ background: transparent;
+ border: 0;
+ box-shadow: none;
+ float: none;
+ height: auto;
+ margin: 0;
+ max-width: none;
+ outline: 0;
+ padding: 0;
+ position: static;
+ width: auto;
+}
+.tox:not([dir=rtl]) {
+ direction: ltr;
+ text-align: left;
+}
+.tox[dir=rtl] {
+ direction: rtl;
+ text-align: right;
+}
+.tox-tinymce {
+ border: 1px solid #000000;
+ border-radius: 0;
+ box-shadow: none;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ overflow: hidden;
+ position: relative;
+ visibility: inherit !important;
+}
+.tox-tinymce-inline {
+ border: none;
+ box-shadow: none;
+}
+.tox-tinymce-inline .tox-editor-header {
+ background-color: transparent;
+ border: 1px solid #000000;
+ border-radius: 0;
+ box-shadow: none;
+}
+.tox-tinymce-aux {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ z-index: 1300;
+}
+.tox-tinymce *:focus,
+.tox-tinymce-aux *:focus {
+ outline: none;
+}
+button::-moz-focus-inner {
+ border: 0;
+}
+.tox .accessibility-issue__header {
+ align-items: center;
+ display: flex;
+ margin-bottom: 4px;
+}
+.tox .accessibility-issue__description {
+ align-items: stretch;
+ border: 1px solid #000000;
+ border-radius: 3px;
+ display: flex;
+ justify-content: space-between;
+}
+.tox .accessibility-issue__description > div {
+ padding-bottom: 4px;
+}
+.tox .accessibility-issue__description > div > div {
+ align-items: center;
+ display: flex;
+ margin-bottom: 4px;
+}
+.tox .accessibility-issue__description > *:last-child:not(:only-child) {
+ border-color: #000000;
+ border-style: solid;
+}
+.tox .accessibility-issue__repair {
+ margin-top: 16px;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description {
+ background-color: rgba(32, 122, 183, 0.5);
+ border-color: #207ab7;
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > *:last-child {
+ border-color: #207ab7;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description {
+ background-color: rgba(255, 165, 0, 0.5);
+ border-color: rgba(255, 165, 0, 0.8);
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > *:last-child {
+ border-color: rgba(255, 165, 0, 0.8);
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description {
+ background-color: rgba(204, 0, 0, 0.5);
+ border-color: rgba(204, 0, 0, 0.8);
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > *:last-child {
+ border-color: rgba(204, 0, 0, 0.8);
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description {
+ background-color: rgba(120, 171, 70, 0.5);
+ border-color: rgba(120, 171, 70, 0.8);
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > *:last-child {
+ border-color: rgba(120, 171, 70, 0.8);
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon {
+ color: #fff;
+}
+.tox .tox-dialog__body-content .accessibility-issue__header h1,
+.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 {
+ margin-top: 0;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) {
+ margin-left: auto;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description {
+ padding: 4px 4px 4px 8px;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description > *:last-child {
+ border-left-width: 1px;
+ padding-left: 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) {
+ margin-right: auto;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description {
+ padding: 4px 8px 4px 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description > *:last-child {
+ border-right-width: 1px;
+ padding-right: 4px;
+}
+.tox .tox-anchorbar {
+ display: flex;
+ flex: 0 0 auto;
+}
+.tox .tox-bar {
+ display: flex;
+ flex: 0 0 auto;
+}
+.tox .tox-button {
+ background-color: #207ab7;
+ background-image: none;
+ background-position: 0 0;
+ background-repeat: repeat;
+ border-color: #207ab7;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #fff;
+ cursor: pointer;
+ display: inline-block;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ line-height: 24px;
+ margin: 0;
+ outline: none;
+ padding: 4px 16px;
+ text-align: center;
+ text-decoration: none;
+ text-transform: capitalize;
+ white-space: nowrap;
+}
+.tox .tox-button[disabled] {
+ background-color: #207ab7;
+ background-image: none;
+ border-color: #207ab7;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-button:focus:not(:disabled) {
+ background-color: #1c6ca1;
+ background-image: none;
+ border-color: #1c6ca1;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button:hover:not(:disabled) {
+ background-color: #1c6ca1;
+ background-image: none;
+ border-color: #1c6ca1;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button:active:not(:disabled) {
+ background-color: #185d8c;
+ background-image: none;
+ border-color: #185d8c;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--secondary {
+ background-color: #3d546f;
+ background-image: none;
+ background-position: 0 0;
+ background-repeat: repeat;
+ border-color: #3d546f;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ color: #fff;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ outline: none;
+ padding: 4px 16px;
+ text-decoration: none;
+ text-transform: capitalize;
+}
+.tox .tox-button--secondary[disabled] {
+ background-color: #3d546f;
+ background-image: none;
+ border-color: #3d546f;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-button--secondary:focus:not(:disabled) {
+ background-color: #34485f;
+ background-image: none;
+ border-color: #34485f;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--secondary:hover:not(:disabled) {
+ background-color: #34485f;
+ background-image: none;
+ border-color: #34485f;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--secondary:active:not(:disabled) {
+ background-color: #2b3b4e;
+ background-image: none;
+ border-color: #2b3b4e;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--icon,
+.tox .tox-button.tox-button--icon,
+.tox .tox-button.tox-button--secondary.tox-button--icon {
+ padding: 4px;
+}
+.tox .tox-button--icon .tox-icon svg,
+.tox .tox-button.tox-button--icon .tox-icon svg,
+.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg {
+ display: block;
+ fill: currentColor;
+}
+.tox .tox-button-link {
+ background: 0;
+ border: none;
+ box-sizing: border-box;
+ cursor: pointer;
+ display: inline-block;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ font-weight: normal;
+ line-height: 1.3;
+ margin: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.tox .tox-button-link--sm {
+ font-size: 14px;
+}
+.tox .tox-button--naked {
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: unset;
+ color: #fff;
+}
+.tox .tox-button--naked[disabled] {
+ background-color: #3d546f;
+ border-color: #3d546f;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-button--naked:hover:not(:disabled) {
+ background-color: #34485f;
+ border-color: #34485f;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--naked:focus:not(:disabled) {
+ background-color: #34485f;
+ border-color: #34485f;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--naked:active:not(:disabled) {
+ background-color: #2b3b4e;
+ border-color: #2b3b4e;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--naked .tox-icon svg {
+ fill: currentColor;
+}
+.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) {
+ color: #fff;
+}
+.tox .tox-checkbox {
+ align-items: center;
+ border-radius: 3px;
+ cursor: pointer;
+ display: flex;
+ height: 36px;
+ min-width: 36px;
+}
+.tox .tox-checkbox__input {
+ /* Hide from view but visible to screen readers */
+ height: 1px;
+ overflow: hidden;
+ position: absolute;
+ top: auto;
+ width: 1px;
+}
+.tox .tox-checkbox__icons {
+ align-items: center;
+ border-radius: 3px;
+ box-shadow: 0 0 0 2px transparent;
+ box-sizing: content-box;
+ display: flex;
+ height: 24px;
+ justify-content: center;
+ padding: calc(4px - 1px);
+ width: 24px;
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: block;
+ fill: rgba(255, 255, 255, 0.2);
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ display: none;
+ fill: #207ab7;
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ display: none;
+ fill: #207ab7;
+}
+.tox .tox-checkbox--disabled {
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: none;
+}
+.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ display: block;
+}
+.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: none;
+}
+.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ display: block;
+}
+.tox input.tox-checkbox__input:focus + .tox-checkbox__icons {
+ border-radius: 3px;
+ box-shadow: inset 0 0 0 1px #207ab7;
+ padding: calc(4px - 1px);
+}
+.tox:not([dir=rtl]) .tox-checkbox__label {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-checkbox__input {
+ left: -10000px;
+}
+.tox:not([dir=rtl]) .tox-bar .tox-checkbox {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-checkbox__label {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-checkbox__input {
+ right: -10000px;
+}
+.tox[dir=rtl] .tox-bar .tox-checkbox {
+ margin-right: 4px;
+}
+.tox {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox .tox-collection--toolbar .tox-collection__group {
+ display: flex;
+ padding: 0;
+}
+.tox .tox-collection--grid .tox-collection__group {
+ display: flex;
+ flex-wrap: wrap;
+ max-height: 208px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ padding: 0;
+}
+.tox .tox-collection--list .tox-collection__group {
+ border-bottom-width: 0;
+ border-color: #1a1a1a;
+ border-left-width: 0;
+ border-right-width: 0;
+ border-style: solid;
+ border-top-width: 1px;
+ padding: 4px 0;
+}
+.tox .tox-collection--list .tox-collection__group:first-child {
+ border-top-width: 0;
+}
+.tox .tox-collection__group-heading {
+ background-color: #333333;
+ color: #fff;
+ cursor: default;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: normal;
+ margin-bottom: 4px;
+ margin-top: -4px;
+ padding: 4px 8px;
+ text-transform: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.tox .tox-collection__item {
+ align-items: center;
+ color: #fff;
+ cursor: pointer;
+ display: flex;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.tox .tox-collection--list .tox-collection__item {
+ padding: 4px 8px;
+}
+.tox .tox-collection--toolbar .tox-collection__item {
+ border-radius: 3px;
+ padding: 4px;
+}
+.tox .tox-collection--grid .tox-collection__item {
+ border-radius: 3px;
+ padding: 4px;
+}
+.tox .tox-collection--list .tox-collection__item--enabled {
+ background-color: #2b3b4e;
+ color: #fff;
+}
+.tox .tox-collection--list .tox-collection__item--active {
+ background-color: #4a5562;
+}
+.tox .tox-collection--toolbar .tox-collection__item--enabled {
+ background-color: #757d87;
+ color: #fff;
+}
+.tox .tox-collection--toolbar .tox-collection__item--active {
+ background-color: #4a5562;
+}
+.tox .tox-collection--grid .tox-collection__item--enabled {
+ background-color: #757d87;
+ color: #fff;
+}
+.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ background-color: #4a5562;
+ color: #fff;
+}
+.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ color: #fff;
+}
+.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ color: #fff;
+}
+.tox .tox-collection__item--state-disabled {
+ background-color: transparent;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-collection__item-icon,
+.tox .tox-collection__item-checkmark {
+ align-items: center;
+ display: flex;
+ height: 24px;
+ justify-content: center;
+ width: 24px;
+}
+.tox .tox-collection__item-icon svg,
+.tox .tox-collection__item-checkmark svg {
+ fill: currentColor;
+}
+.tox .tox-collection--toolbar-lg .tox-collection__item-icon {
+ height: 48px;
+ width: 48px;
+}
+.tox .tox-collection__item-label {
+ color: currentColor;
+ display: inline-block;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 24px;
+ text-transform: none;
+ word-break: break-all;
+}
+.tox .tox-collection__item-accessory {
+ color: rgba(255, 255, 255, 0.5);
+ display: inline-block;
+ font-size: 14px;
+ height: 24px;
+ line-height: 24px;
+ text-transform: none;
+}
+.tox .tox-collection__item-caret {
+ align-items: center;
+ display: flex;
+ min-height: 24px;
+}
+.tox .tox-collection__item-caret::after {
+ content: '';
+ font-size: 0;
+ min-height: inherit;
+}
+.tox .tox-collection__item-caret svg {
+ fill: #fff;
+}
+.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg {
+ display: none;
+}
+.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory + .tox-collection__item-checkmark {
+ display: none;
+}
+.tox .tox-collection--horizontal {
+ background-color: #2b3b4e;
+ border: 1px solid #1a1a1a;
+ border-radius: 3px;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: nowrap;
+ margin-bottom: 0;
+ overflow-x: auto;
+ padding: 0;
+}
+.tox .tox-collection--horizontal .tox-collection__group {
+ align-items: center;
+ display: flex;
+ flex-wrap: nowrap;
+ margin: 0;
+ padding: 0 4px;
+}
+.tox .tox-collection--horizontal .tox-collection__item {
+ height: 34px;
+ margin: 2px 0 3px 0;
+ padding: 0 4px;
+}
+.tox .tox-collection--horizontal .tox-collection__item-label {
+ white-space: nowrap;
+}
+.tox .tox-collection--horizontal .tox-collection__item-caret {
+ margin-left: 4px;
+}
+.tox .tox-collection__item-container {
+ display: flex;
+}
+.tox .tox-collection__item-container--row {
+ align-items: center;
+ flex: 1 1 auto;
+ flex-direction: row;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--align-left {
+ margin-right: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--align-right {
+ justify-content: flex-end;
+ margin-left: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top {
+ align-items: flex-start;
+ margin-bottom: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle {
+ align-items: center;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom {
+ align-items: flex-end;
+ margin-top: auto;
+}
+.tox .tox-collection__item-container--column {
+ -ms-grid-row-align: center;
+ align-self: center;
+ flex: 1 1 auto;
+ flex-direction: column;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--align-left {
+ align-items: flex-start;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--align-right {
+ align-items: flex-end;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top {
+ align-self: flex-start;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle {
+ -ms-grid-row-align: center;
+ align-self: center;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom {
+ align-self: flex-end;
+}
+.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) {
+ border-right: 1px solid #000000;
+}
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > *:not(:first-child) {
+ margin-left: 8px;
+}
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-collection__item-accessory {
+ margin-left: 16px;
+ text-align: right;
+}
+.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret {
+ margin-left: 16px;
+}
+.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) {
+ border-left: 1px solid #000000;
+}
+.tox[dir=rtl] .tox-collection--list .tox-collection__item > *:not(:first-child) {
+ margin-right: 8px;
+}
+.tox[dir=rtl] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-collection__item-icon-rtl {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox[dir=rtl] .tox-collection__item-icon-rtl .tox-collection__item-icon svg {
+ transform: rotateY(180deg);
+}
+.tox[dir=rtl] .tox-collection__item-accessory {
+ margin-right: 16px;
+ text-align: left;
+}
+.tox[dir=rtl] .tox-collection .tox-collection__item-caret {
+ margin-right: 16px;
+ transform: rotateY(180deg);
+}
+.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret {
+ margin-right: 4px;
+}
+.tox .tox-color-picker-container {
+ display: flex;
+ flex-direction: row;
+ height: 225px;
+ margin: 0;
+}
+.tox .tox-sv-palette {
+ box-sizing: border-box;
+ display: flex;
+ height: 100%;
+}
+.tox .tox-sv-palette-spectrum {
+ height: 100%;
+}
+.tox .tox-sv-palette,
+.tox .tox-sv-palette-spectrum {
+ width: 225px;
+}
+.tox .tox-sv-palette-thumb {
+ background: none;
+ border: 1px solid black;
+ border-radius: 50%;
+ box-sizing: content-box;
+ height: 12px;
+ position: absolute;
+ width: 12px;
+}
+.tox .tox-sv-palette-inner-thumb {
+ border: 1px solid white;
+ border-radius: 50%;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+}
+.tox .tox-hue-slider {
+ box-sizing: border-box;
+ height: 100%;
+ width: 25px;
+}
+.tox .tox-hue-slider-spectrum {
+ background: linear-gradient(to bottom, #f00, #ff0080, #f0f, #8000ff, #00f, #0080ff, #0ff, #00ff80, #0f0, #80ff00, #ff0, #ff8000, #f00);
+ height: 100%;
+ width: 100%;
+}
+.tox .tox-hue-slider,
+.tox .tox-hue-slider-spectrum {
+ width: 20px;
+}
+.tox .tox-hue-slider-thumb {
+ background: white;
+ border: 1px solid black;
+ box-sizing: content-box;
+ height: 4px;
+ width: 100%;
+}
+.tox .tox-rgb-form {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+.tox .tox-rgb-form div {
+ align-items: center;
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 5px;
+ width: inherit;
+}
+.tox .tox-rgb-form input {
+ width: 6em;
+}
+.tox .tox-rgb-form input.tox-invalid {
+ /* Need !important to override Chrome's focus styling unfortunately */
+ border: 1px solid red !important;
+}
+.tox .tox-rgb-form .tox-rgba-preview {
+ border: 1px solid black;
+ flex-grow: 2;
+ margin-bottom: 0;
+}
+.tox:not([dir=rtl]) .tox-sv-palette {
+ margin-right: 15px;
+}
+.tox:not([dir=rtl]) .tox-hue-slider {
+ margin-right: 15px;
+}
+.tox:not([dir=rtl]) .tox-hue-slider-thumb {
+ margin-left: -1px;
+}
+.tox:not([dir=rtl]) .tox-rgb-form label {
+ margin-right: 0.5em;
+}
+.tox[dir=rtl] .tox-sv-palette {
+ margin-left: 15px;
+}
+.tox[dir=rtl] .tox-hue-slider {
+ margin-left: 15px;
+}
+.tox[dir=rtl] .tox-hue-slider-thumb {
+ margin-right: -1px;
+}
+.tox[dir=rtl] .tox-rgb-form label {
+ margin-left: 0.5em;
+}
+.tox .tox-toolbar .tox-swatches,
+.tox .tox-toolbar__primary .tox-swatches,
+.tox .tox-toolbar__overflow .tox-swatches {
+ margin: 2px 0 3px 4px;
+}
+.tox .tox-collection--list .tox-collection__group .tox-swatches-menu {
+ border: 0;
+ margin: -4px 0;
+}
+.tox .tox-swatches__row {
+ display: flex;
+}
+.tox .tox-swatch {
+ height: 30px;
+ transition: transform 0.15s, box-shadow 0.15s;
+ width: 30px;
+}
+.tox .tox-swatch:hover,
+.tox .tox-swatch:focus {
+ box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset;
+ transform: scale(0.8);
+}
+.tox .tox-swatch--remove {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+}
+.tox .tox-swatch--remove svg path {
+ stroke: #e74c3c;
+}
+.tox .tox-swatches__picker-btn {
+ align-items: center;
+ background-color: transparent;
+ border: 0;
+ cursor: pointer;
+ display: flex;
+ height: 30px;
+ justify-content: center;
+ outline: none;
+ padding: 0;
+ width: 30px;
+}
+.tox .tox-swatches__picker-btn svg {
+ height: 24px;
+ width: 24px;
+}
+.tox .tox-swatches__picker-btn:hover {
+ background: #4a5562;
+}
+.tox:not([dir=rtl]) .tox-swatches__picker-btn {
+ margin-left: auto;
+}
+.tox[dir=rtl] .tox-swatches__picker-btn {
+ margin-right: auto;
+}
+.tox .tox-comment-thread {
+ background: #2b3b4e;
+ position: relative;
+}
+.tox .tox-comment-thread > *:not(:first-child) {
+ margin-top: 8px;
+}
+.tox .tox-comment {
+ background: #2b3b4e;
+ border: 1px solid #000000;
+ border-radius: 3px;
+ box-shadow: 0 4px 8px 0 rgba(42, 55, 70, 0.1);
+ padding: 8px 8px 16px 8px;
+ position: relative;
+}
+.tox .tox-comment__header {
+ align-items: center;
+ color: #fff;
+ display: flex;
+ justify-content: space-between;
+}
+.tox .tox-comment__date {
+ color: rgba(255, 255, 255, 0.5);
+ font-size: 12px;
+}
+.tox .tox-comment__body {
+ color: #fff;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ margin-top: 8px;
+ position: relative;
+ text-transform: initial;
+}
+.tox .tox-comment__body textarea {
+ resize: none;
+ white-space: normal;
+ width: 100%;
+}
+.tox .tox-comment__expander {
+ padding-top: 8px;
+}
+.tox .tox-comment__expander p {
+ color: rgba(255, 255, 255, 0.5);
+ font-size: 14px;
+ font-style: normal;
+}
+.tox .tox-comment__body p {
+ margin: 0;
+}
+.tox .tox-comment__buttonspacing {
+ padding-top: 16px;
+ text-align: center;
+}
+.tox .tox-comment-thread__overlay::after {
+ background: #2b3b4e;
+ bottom: 0;
+ content: "";
+ display: flex;
+ left: 0;
+ opacity: 0.9;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 5;
+}
+.tox .tox-comment__reply {
+ display: flex;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ margin-top: 8px;
+}
+.tox .tox-comment__reply > *:first-child {
+ margin-bottom: 8px;
+ width: 100%;
+}
+.tox .tox-comment__edit {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ margin-top: 16px;
+}
+.tox .tox-comment__gradient::after {
+ background: linear-gradient(rgba(43, 59, 78, 0), #2b3b4e);
+ bottom: 0;
+ content: "";
+ display: block;
+ height: 5em;
+ margin-top: -40px;
+ position: absolute;
+ width: 100%;
+}
+.tox .tox-comment__overlay {
+ background: #2b3b4e;
+ bottom: 0;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ left: 0;
+ opacity: 0.9;
+ position: absolute;
+ right: 0;
+ text-align: center;
+ top: 0;
+ z-index: 5;
+}
+.tox .tox-comment__loading-text {
+ align-items: center;
+ color: #fff;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+}
+.tox .tox-comment__loading-text > div {
+ padding-bottom: 16px;
+}
+.tox .tox-comment__overlaytext {
+ bottom: 0;
+ flex-direction: column;
+ font-size: 14px;
+ left: 0;
+ padding: 1em;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 10;
+}
+.tox .tox-comment__overlaytext p {
+ background-color: #2b3b4e;
+ box-shadow: 0 0 8px 8px #2b3b4e;
+ color: #fff;
+ text-align: center;
+}
+.tox .tox-comment__overlaytext div:nth-of-type(2) {
+ font-size: 0.8em;
+}
+.tox .tox-comment__busy-spinner {
+ align-items: center;
+ background-color: #2b3b4e;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 20;
+}
+.tox .tox-comment__scroll {
+ display: flex;
+ flex-direction: column;
+ flex-shrink: 1;
+ overflow: auto;
+}
+.tox .tox-conversations {
+ margin: 8px;
+}
+.tox:not([dir=rtl]) .tox-comment__edit {
+ margin-left: 8px;
+}
+.tox:not([dir=rtl]) .tox-comment__buttonspacing > *:last-child,
+.tox:not([dir=rtl]) .tox-comment__edit > *:last-child,
+.tox:not([dir=rtl]) .tox-comment__reply > *:last-child {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-comment__edit {
+ margin-right: 8px;
+}
+.tox[dir=rtl] .tox-comment__buttonspacing > *:last-child,
+.tox[dir=rtl] .tox-comment__edit > *:last-child,
+.tox[dir=rtl] .tox-comment__reply > *:last-child {
+ margin-right: 8px;
+}
+.tox .tox-user {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-user__avatar svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-user__name {
+ color: rgba(255, 255, 255, 0.5);
+ font-size: 12px;
+ font-style: normal;
+ font-weight: bold;
+ text-transform: uppercase;
+}
+.tox:not([dir=rtl]) .tox-user__avatar svg {
+ margin-right: 8px;
+}
+.tox:not([dir=rtl]) .tox-user__avatar + .tox-user__name {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-user__avatar svg {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-user__avatar + .tox-user__name {
+ margin-right: 8px;
+}
+.tox .tox-dialog-wrap {
+ align-items: center;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: fixed;
+ right: 0;
+ top: 0;
+ z-index: 1100;
+}
+.tox .tox-dialog-wrap__backdrop {
+ background-color: rgba(34, 47, 62, 0.75);
+ bottom: 0;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 1;
+}
+.tox .tox-dialog-wrap__backdrop--opaque {
+ background-color: #222f3e;
+}
+.tox .tox-dialog {
+ background-color: #2b3b4e;
+ border-color: #000000;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: 0 16px 16px -10px rgba(42, 55, 70, 0.15), 0 0 40px 1px rgba(42, 55, 70, 0.15);
+ display: flex;
+ flex-direction: column;
+ max-height: 100%;
+ max-width: 480px;
+ overflow: hidden;
+ position: relative;
+ width: 95vw;
+ z-index: 2;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog {
+ align-self: flex-start;
+ margin: 8px auto;
+ width: calc(100vw - 16px);
+ }
+}
+.tox .tox-dialog-inline {
+ z-index: 1100;
+}
+.tox .tox-dialog__header {
+ align-items: center;
+ background-color: #2b3b4e;
+ border-bottom: none;
+ color: #fff;
+ display: flex;
+ font-size: 16px;
+ justify-content: space-between;
+ padding: 8px 16px 0 16px;
+ position: relative;
+}
+.tox .tox-dialog__header .tox-button {
+ z-index: 1;
+}
+.tox .tox-dialog__draghandle {
+ cursor: grab;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tox .tox-dialog__draghandle:active {
+ cursor: grabbing;
+}
+.tox .tox-dialog__dismiss {
+ margin-left: auto;
+}
+.tox .tox-dialog__title {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ margin: 0;
+ text-transform: none;
+}
+.tox .tox-dialog__body {
+ color: #fff;
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ min-width: 0;
+ text-align: left;
+ text-transform: none;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog__body {
+ flex-direction: column;
+ }
+}
+.tox .tox-dialog__body-nav {
+ align-items: flex-start;
+ display: flex;
+ flex-direction: column;
+ padding: 16px 16px;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog__body-nav {
+ flex-direction: row;
+ -webkit-overflow-scrolling: touch;
+ overflow-x: auto;
+ padding-bottom: 0;
+ }
+}
+.tox .tox-dialog__body-nav-item {
+ border-bottom: 2px solid transparent;
+ color: rgba(255, 255, 255, 0.5);
+ display: inline-block;
+ font-size: 14px;
+ line-height: 1.3;
+ margin-bottom: 8px;
+ text-decoration: none;
+ white-space: nowrap;
+}
+.tox .tox-dialog__body-nav-item:focus {
+ background-color: rgba(32, 122, 183, 0.1);
+}
+.tox .tox-dialog__body-nav-item--active {
+ border-bottom: 2px solid #207ab7;
+ color: #207ab7;
+}
+.tox .tox-dialog__body-content {
+ box-sizing: border-box;
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ -ms-flex-preferred-size: auto;
+ max-height: 650px;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+ padding: 16px 16px;
+}
+.tox .tox-dialog__body-content > * {
+ margin-bottom: 0;
+ margin-top: 16px;
+}
+.tox .tox-dialog__body-content > *:first-child {
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content > *:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-dialog__body-content > *:only-child {
+ margin-bottom: 0;
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content a {
+ color: #207ab7;
+ cursor: pointer;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content a:hover,
+.tox .tox-dialog__body-content a:focus {
+ color: #185d8c;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content a:active {
+ color: #185d8c;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content svg {
+ fill: #fff;
+}
+.tox .tox-dialog__body-content ul {
+ display: block;
+ list-style-type: disc;
+ margin-bottom: 16px;
+ -webkit-margin-end: 0;
+ margin-inline-end: 0;
+ -webkit-margin-start: 0;
+ margin-inline-start: 0;
+ -webkit-padding-start: 2.5rem;
+ padding-inline-start: 2.5rem;
+}
+.tox .tox-dialog__body-content .tox-form__group h1 {
+ color: #fff;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ margin-bottom: 16px;
+ margin-top: 2rem;
+ text-transform: none;
+}
+.tox .tox-dialog__body-content .tox-form__group h2 {
+ color: #fff;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ margin-bottom: 16px;
+ margin-top: 2rem;
+ text-transform: none;
+}
+.tox .tox-dialog__body-content .tox-form__group p {
+ margin-bottom: 16px;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:first-child,
+.tox .tox-dialog__body-content .tox-form__group h2:first-child,
+.tox .tox-dialog__body-content .tox-form__group p:first-child {
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:last-child,
+.tox .tox-dialog__body-content .tox-form__group h2:last-child,
+.tox .tox-dialog__body-content .tox-form__group p:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:only-child,
+.tox .tox-dialog__body-content .tox-form__group h2:only-child,
+.tox .tox-dialog__body-content .tox-form__group p:only-child {
+ margin-bottom: 0;
+ margin-top: 0;
+}
+.tox .tox-dialog--width-lg {
+ height: 650px;
+ max-width: 1200px;
+}
+.tox .tox-dialog--width-md {
+ max-width: 800px;
+}
+.tox .tox-dialog--width-md .tox-dialog__body-content {
+ overflow: auto;
+}
+.tox .tox-dialog__body-content--centered {
+ text-align: center;
+}
+.tox .tox-dialog__footer {
+ align-items: center;
+ background-color: #2b3b4e;
+ border-top: 1px solid #000000;
+ display: flex;
+ justify-content: space-between;
+ padding: 8px 16px;
+}
+.tox .tox-dialog__footer-start,
+.tox .tox-dialog__footer-end {
+ display: flex;
+}
+.tox .tox-dialog__busy-spinner {
+ align-items: center;
+ background-color: rgba(34, 47, 62, 0.75);
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 3;
+}
+.tox .tox-dialog__table {
+ border-collapse: collapse;
+ width: 100%;
+}
+.tox .tox-dialog__table thead th {
+ font-weight: bold;
+ padding-bottom: 8px;
+}
+.tox .tox-dialog__table tbody tr {
+ border-bottom: 1px solid #000000;
+}
+.tox .tox-dialog__table tbody tr:last-child {
+ border-bottom: none;
+}
+.tox .tox-dialog__table td {
+ padding-bottom: 8px;
+ padding-top: 8px;
+}
+.tox .tox-dialog__popups {
+ position: absolute;
+ width: 100%;
+ z-index: 1100;
+}
+.tox .tox-dialog__body-iframe {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-dialog__body-iframe .tox-navobj {
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) {
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+ height: 100%;
+}
+.tox .tox-dialog-dock-fadeout {
+ opacity: 0;
+ visibility: hidden;
+}
+.tox .tox-dialog-dock-fadein {
+ opacity: 1;
+ visibility: visible;
+}
+.tox .tox-dialog-dock-transition {
+ transition: visibility 0s linear 0.3s, opacity 0.3s ease;
+}
+.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein {
+ transition-delay: 0s;
+}
+.tox.tox-platform-ie {
+ /* IE11 CSS styles go here */
+}
+.tox.tox-platform-ie .tox-dialog-wrap {
+ position: -ms-device-fixed;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav {
+ margin-right: 0;
+ }
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child) {
+ margin-left: 8px;
+ }
+}
+.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start > *,
+.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end > * {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-dialog__body {
+ text-align: right;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav {
+ margin-left: 0;
+ }
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child) {
+ margin-right: 8px;
+ }
+}
+.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start > *,
+.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end > * {
+ margin-right: 8px;
+}
+body.tox-dialog__disable-scroll {
+ overflow: hidden;
+}
+.tox .tox-dropzone-container {
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-dropzone {
+ align-items: center;
+ background: #fff;
+ border: 2px dashed #000000;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ justify-content: center;
+ min-height: 100px;
+ padding: 10px;
+}
+.tox .tox-dropzone p {
+ color: rgba(255, 255, 255, 0.5);
+ margin: 0 0 16px 0;
+}
+.tox .tox-edit-area {
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+ overflow: hidden;
+ position: relative;
+}
+.tox .tox-edit-area__iframe {
+ background-color: #fff;
+ border: 0;
+ box-sizing: border-box;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+ height: 100%;
+ position: absolute;
+ width: 100%;
+}
+.tox.tox-inline-edit-area {
+ border: 1px dotted #000000;
+}
+.tox .tox-editor-container {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ overflow: hidden;
+}
+.tox .tox-editor-header {
+ z-index: 1;
+}
+.tox:not(.tox-tinymce-inline) .tox-editor-header {
+ box-shadow: none;
+ transition: box-shadow 0.5s;
+}
+.tox.tox-tinymce--toolbar-bottom .tox-editor-header,
+.tox.tox-tinymce-inline .tox-editor-header {
+ margin-bottom: -1px;
+}
+.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header {
+ background-color: transparent;
+ box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25);
+}
+.tox-editor-dock-fadeout {
+ opacity: 0;
+ visibility: hidden;
+}
+.tox-editor-dock-fadein {
+ opacity: 1;
+ visibility: visible;
+}
+.tox-editor-dock-transition {
+ transition: visibility 0s linear 0.25s, opacity 0.25s ease;
+}
+.tox-editor-dock-transition.tox-editor-dock-fadein {
+ transition-delay: 0s;
+}
+.tox .tox-control-wrap {
+ flex: 1;
+ position: relative;
+}
+.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,
+.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,
+.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid {
+ display: none;
+}
+.tox .tox-control-wrap svg {
+ display: block;
+}
+.tox .tox-control-wrap__status-icon-wrap {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-control-wrap__status-icon-invalid svg {
+ fill: #c00;
+}
+.tox .tox-control-wrap__status-icon-unknown svg {
+ fill: orange;
+}
+.tox .tox-control-wrap__status-icon-valid svg {
+ fill: green;
+}
+.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,
+.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,
+.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield {
+ padding-right: 32px;
+}
+.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap {
+ right: 4px;
+}
+.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,
+.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,
+.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield {
+ padding-left: 32px;
+}
+.tox[dir=rtl] .tox-control-wrap__status-icon-wrap {
+ left: 4px;
+}
+.tox .tox-autocompleter {
+ max-width: 25em;
+}
+.tox .tox-autocompleter .tox-menu {
+ max-width: 25em;
+}
+.tox .tox-autocompleter .tox-autocompleter-highlight {
+ font-weight: bold;
+}
+.tox .tox-color-input {
+ display: flex;
+ position: relative;
+ z-index: 1;
+}
+.tox .tox-color-input .tox-textfield {
+ z-index: -1;
+}
+.tox .tox-color-input span {
+ border-color: rgba(42, 55, 70, 0.2);
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ height: 24px;
+ position: absolute;
+ top: 6px;
+ width: 24px;
+}
+.tox .tox-color-input span:hover:not([aria-disabled=true]),
+.tox .tox-color-input span:focus:not([aria-disabled=true]) {
+ border-color: #207ab7;
+ cursor: pointer;
+}
+.tox .tox-color-input span::before {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), linear-gradient(-45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%), linear-gradient(-45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%);
+ background-position: 0 0, 0 6px, 6px -6px, -6px 0;
+ background-size: 12px 12px;
+ border: 1px solid #2b3b4e;
+ border-radius: 3px;
+ box-sizing: border-box;
+ content: '';
+ height: 24px;
+ left: -1px;
+ position: absolute;
+ top: -1px;
+ width: 24px;
+ z-index: -1;
+}
+.tox .tox-color-input span[aria-disabled=true] {
+ cursor: not-allowed;
+}
+.tox:not([dir=rtl]) .tox-color-input {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox:not([dir=rtl]) .tox-color-input .tox-textfield {
+ padding-left: 36px;
+}
+.tox:not([dir=rtl]) .tox-color-input span {
+ left: 6px;
+}
+.tox[dir="rtl"] .tox-color-input {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox[dir="rtl"] .tox-color-input .tox-textfield {
+ padding-right: 36px;
+}
+.tox[dir="rtl"] .tox-color-input span {
+ right: 6px;
+}
+.tox .tox-label,
+.tox .tox-toolbar-label {
+ color: rgba(255, 255, 255, 0.5);
+ display: block;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ padding: 0 8px 0 0;
+ text-transform: none;
+ white-space: nowrap;
+}
+.tox .tox-toolbar-label {
+ padding: 0 8px;
+}
+.tox[dir=rtl] .tox-label {
+ padding: 0 0 0 8px;
+}
+.tox .tox-form {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-form__group {
+ box-sizing: border-box;
+ margin-bottom: 4px;
+}
+.tox .tox-form-group--maximize {
+ flex: 1;
+}
+.tox .tox-form__group--error {
+ color: #c00;
+}
+.tox .tox-form__group--collection {
+ display: flex;
+}
+.tox .tox-form__grid {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: space-between;
+}
+.tox .tox-form__grid--2col > .tox-form__group {
+ width: calc(50% - (8px / 2));
+}
+.tox .tox-form__grid--3col > .tox-form__group {
+ width: calc(100% / 3 - (8px / 2));
+}
+.tox .tox-form__grid--4col > .tox-form__group {
+ width: calc(25% - (8px / 2));
+}
+.tox .tox-form__controls-h-stack {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-form__group--inline {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-form__group--stretched {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-form__group--stretched .tox-textarea {
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-form__group--stretched .tox-navobj {
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-form__group--stretched .tox-navobj :nth-child(2) {
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+ height: 100%;
+}
+.tox:not([dir=rtl]) .tox-form__controls-h-stack > *:not(:first-child) {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-form__controls-h-stack > *:not(:first-child) {
+ margin-right: 4px;
+}
+.tox .tox-lock.tox-locked .tox-lock-icon__unlock,
+.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock {
+ display: none;
+}
+.tox .tox-textfield,
+.tox .tox-toolbar-textfield,
+.tox .tox-listboxfield .tox-listbox--select,
+.tox .tox-textarea {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #2b3b4e;
+ border-color: #000000;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #fff;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ margin: 0;
+ min-height: 34px;
+ outline: none;
+ padding: 5px 4.75px;
+ resize: none;
+ width: 100%;
+}
+.tox .tox-textfield[disabled],
+.tox .tox-textarea[disabled] {
+ background-color: #222f3e;
+ color: rgba(255, 255, 255, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-textfield:focus,
+.tox .tox-listboxfield .tox-listbox--select:focus,
+.tox .tox-textarea:focus {
+ background-color: #2b3b4e;
+ border-color: #207ab7;
+ box-shadow: none;
+ outline: none;
+}
+.tox .tox-toolbar-textfield {
+ border-width: 0;
+ margin-bottom: 3px;
+ margin-top: 2px;
+ max-width: 250px;
+}
+.tox .tox-naked-btn {
+ background-color: transparent;
+ border: 0;
+ border-color: transparent;
+ box-shadow: unset;
+ color: #207ab7;
+ cursor: pointer;
+ display: block;
+ margin: 0;
+ padding: 0;
+}
+.tox .tox-naked-btn svg {
+ display: block;
+ fill: #fff;
+}
+.tox:not([dir=rtl]) .tox-toolbar-textfield + * {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-toolbar-textfield + * {
+ margin-right: 4px;
+}
+.tox .tox-listboxfield {
+ cursor: pointer;
+ position: relative;
+}
+.tox .tox-listboxfield .tox-listbox--select[disabled] {
+ background-color: #19232e;
+ color: rgba(255, 255, 255, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-listbox__select-label {
+ cursor: default;
+ flex: 1;
+ margin: 0 4px;
+}
+.tox .tox-listbox__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+}
+.tox .tox-listbox__select-chevron svg {
+ fill: #fff;
+}
+.tox .tox-listboxfield .tox-listbox--select {
+ align-items: center;
+ display: flex;
+}
+.tox:not([dir=rtl]) .tox-listboxfield svg {
+ right: 8px;
+}
+.tox[dir=rtl] .tox-listboxfield svg {
+ left: 8px;
+}
+.tox .tox-selectfield {
+ cursor: pointer;
+ position: relative;
+}
+.tox .tox-selectfield select {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #2b3b4e;
+ border-color: #000000;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #fff;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ margin: 0;
+ min-height: 34px;
+ outline: none;
+ padding: 5px 4.75px;
+ resize: none;
+ width: 100%;
+}
+.tox .tox-selectfield select[disabled] {
+ background-color: #19232e;
+ color: rgba(255, 255, 255, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-selectfield select::-ms-expand {
+ display: none;
+}
+.tox .tox-selectfield select:focus {
+ background-color: #2b3b4e;
+ border-color: #207ab7;
+ box-shadow: none;
+ outline: none;
+}
+.tox .tox-selectfield svg {
+ pointer-events: none;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox:not([dir=rtl]) .tox-selectfield select[size="0"],
+.tox:not([dir=rtl]) .tox-selectfield select[size="1"] {
+ padding-right: 24px;
+}
+.tox:not([dir=rtl]) .tox-selectfield svg {
+ right: 8px;
+}
+.tox[dir=rtl] .tox-selectfield select[size="0"],
+.tox[dir=rtl] .tox-selectfield select[size="1"] {
+ padding-left: 24px;
+}
+.tox[dir=rtl] .tox-selectfield svg {
+ left: 8px;
+}
+.tox .tox-textarea {
+ -webkit-appearance: textarea;
+ -moz-appearance: textarea;
+ appearance: textarea;
+ white-space: pre-wrap;
+}
+.tox-fullscreen {
+ border: 0;
+ height: 100%;
+ left: 0;
+ margin: 0;
+ overflow: hidden;
+ -ms-scroll-chaining: none;
+ overscroll-behavior: none;
+ padding: 0;
+ position: fixed;
+ top: 0;
+ touch-action: pinch-zoom;
+ width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+ display: none;
+}
+.tox.tox-tinymce.tox-fullscreen {
+ background-color: transparent;
+ z-index: 1200;
+}
+.tox-shadowhost.tox-fullscreen {
+ z-index: 1200;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+ z-index: 1201;
+}
+.tox .tox-help__more-link {
+ list-style: none;
+ margin-top: 1em;
+}
+.tox .tox-image-tools {
+ width: 100%;
+}
+.tox .tox-image-tools__toolbar {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+}
+.tox .tox-image-tools__image {
+ background-color: #666;
+ height: 380px;
+ overflow: auto;
+ position: relative;
+ width: 100%;
+}
+.tox .tox-image-tools__image,
+.tox .tox-image-tools__image + .tox-image-tools__toolbar {
+ margin-top: 8px;
+}
+.tox .tox-image-tools__image-bg {
+ background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==);
+}
+.tox .tox-image-tools__toolbar > .tox-spacer {
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-croprect-block {
+ background: black;
+ filter: alpha(opacity=50);
+ opacity: 0.5;
+ position: absolute;
+ zoom: 1;
+}
+.tox .tox-croprect-handle {
+ border: 2px solid white;
+ height: 20px;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 20px;
+}
+.tox .tox-croprect-handle-move {
+ border: 0;
+ cursor: move;
+ position: absolute;
+}
+.tox .tox-croprect-handle-nw {
+ border-width: 2px 0 0 2px;
+ cursor: nw-resize;
+ left: 100px;
+ margin: -2px 0 0 -2px;
+ top: 100px;
+}
+.tox .tox-croprect-handle-ne {
+ border-width: 2px 2px 0 0;
+ cursor: ne-resize;
+ left: 200px;
+ margin: -2px 0 0 -20px;
+ top: 100px;
+}
+.tox .tox-croprect-handle-sw {
+ border-width: 0 0 2px 2px;
+ cursor: sw-resize;
+ left: 100px;
+ margin: -20px 2px 0 -2px;
+ top: 200px;
+}
+.tox .tox-croprect-handle-se {
+ border-width: 0 2px 2px 0;
+ cursor: se-resize;
+ left: 200px;
+ margin: -20px 0 0 -20px;
+ top: 200px;
+}
+.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-slider:not(:first-of-type) {
+ margin-left: 8px;
+}
+.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-button + .tox-slider {
+ margin-left: 32px;
+}
+.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-slider + .tox-button {
+ margin-left: 32px;
+}
+.tox[dir=rtl] .tox-image-tools__toolbar > .tox-slider:not(:first-of-type) {
+ margin-right: 8px;
+}
+.tox[dir=rtl] .tox-image-tools__toolbar > .tox-button + .tox-slider {
+ margin-right: 32px;
+}
+.tox[dir=rtl] .tox-image-tools__toolbar > .tox-slider + .tox-button {
+ margin-right: 32px;
+}
+.tox .tox-insert-table-picker {
+ display: flex;
+ flex-wrap: wrap;
+ width: 170px;
+}
+.tox .tox-insert-table-picker > div {
+ border-color: #000000;
+ border-style: solid;
+ border-width: 0 1px 1px 0;
+ box-sizing: border-box;
+ height: 17px;
+ width: 17px;
+}
+.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker {
+ margin: -4px 0;
+}
+.tox .tox-insert-table-picker .tox-insert-table-picker__selected {
+ background-color: rgba(32, 122, 183, 0.5);
+ border-color: rgba(32, 122, 183, 0.5);
+}
+.tox .tox-insert-table-picker__label {
+ color: #fff;
+ display: block;
+ font-size: 14px;
+ padding: 4px;
+ text-align: center;
+ width: 100%;
+}
+.tox:not([dir=rtl]) {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox:not([dir=rtl]) .tox-insert-table-picker > div:nth-child(10n) {
+ border-right: 0;
+}
+.tox[dir=rtl] {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox[dir=rtl] .tox-insert-table-picker > div:nth-child(10n+1) {
+ border-right: 0;
+}
+.tox {
+ /* stylelint-disable */
+ /* stylelint-enable */
+}
+.tox .tox-menu {
+ background-color: #2b3b4e;
+ border: 1px solid #000000;
+ border-radius: 3px;
+ box-shadow: 0 4px 8px 0 rgba(42, 55, 70, 0.1);
+ display: inline-block;
+ overflow: hidden;
+ vertical-align: top;
+ z-index: 1150;
+}
+.tox .tox-menu.tox-collection.tox-collection--list {
+ padding: 0;
+}
+.tox .tox-menu.tox-collection.tox-collection--toolbar {
+ padding: 4px;
+}
+.tox .tox-menu.tox-collection.tox-collection--grid {
+ padding: 4px;
+}
+.tox .tox-menu__label h1,
+.tox .tox-menu__label h2,
+.tox .tox-menu__label h3,
+.tox .tox-menu__label h4,
+.tox .tox-menu__label h5,
+.tox .tox-menu__label h6,
+.tox .tox-menu__label p,
+.tox .tox-menu__label blockquote,
+.tox .tox-menu__label code {
+ margin: 0;
+}
+.tox .tox-menubar {
+ background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;
+ background-color: #222f3e;
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ padding: 0 4px 0 4px;
+}
+.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar {
+ border-top: 1px solid #000000;
+}
+/* Deprecated. Remove in next major release */
+.tox .tox-mbtn {
+ align-items: center;
+ background: transparent;
+ border: 0;
+ border-radius: 3px;
+ box-shadow: none;
+ color: #fff;
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ height: 34px;
+ justify-content: center;
+ margin: 2px 0 3px 0;
+ outline: none;
+ overflow: hidden;
+ padding: 0 4px;
+ text-transform: none;
+ width: auto;
+}
+.tox .tox-mbtn[disabled] {
+ background-color: transparent;
+ border: 0;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-mbtn:focus:not(:disabled) {
+ background: #4a5562;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-mbtn--active {
+ background: #757d87;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) {
+ background: #4a5562;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-mbtn__select-label {
+ cursor: default;
+ font-weight: normal;
+ margin: 0 4px;
+}
+.tox .tox-mbtn[disabled] .tox-mbtn__select-label {
+ cursor: not-allowed;
+}
+.tox .tox-mbtn__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+ display: none;
+}
+.tox .tox-notification {
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ display: -ms-grid;
+ display: grid;
+ font-size: 14px;
+ font-weight: normal;
+ -ms-grid-columns: minmax(40px, 1fr) auto minmax(40px, 1fr);
+ grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr);
+ margin-top: 4px;
+ opacity: 0;
+ padding: 4px;
+ transition: transform 100ms ease-in, opacity 150ms ease-in;
+}
+.tox .tox-notification p {
+ font-size: 14px;
+ font-weight: normal;
+}
+.tox .tox-notification a {
+ text-decoration: underline;
+}
+.tox .tox-notification--in {
+ opacity: 1;
+}
+.tox .tox-notification--success {
+ background-color: #e4eeda;
+ border-color: #d7e6c8;
+ color: #fff;
+}
+.tox .tox-notification--success p {
+ color: #fff;
+}
+.tox .tox-notification--success a {
+ color: #547831;
+}
+.tox .tox-notification--success svg {
+ fill: #fff;
+}
+.tox .tox-notification--error {
+ background-color: #f8dede;
+ border-color: #f2bfbf;
+ color: #fff;
+}
+.tox .tox-notification--error p {
+ color: #fff;
+}
+.tox .tox-notification--error a {
+ color: #c00;
+}
+.tox .tox-notification--error svg {
+ fill: #fff;
+}
+.tox .tox-notification--warn,
+.tox .tox-notification--warning {
+ background-color: #fffaea;
+ border-color: #ffe89d;
+ color: #fff;
+}
+.tox .tox-notification--warn p,
+.tox .tox-notification--warning p {
+ color: #fff;
+}
+.tox .tox-notification--warn a,
+.tox .tox-notification--warning a {
+ color: #fff;
+}
+.tox .tox-notification--warn svg,
+.tox .tox-notification--warning svg {
+ fill: #fff;
+}
+.tox .tox-notification--info {
+ background-color: #d9edf7;
+ border-color: #779ecb;
+ color: #fff;
+}
+.tox .tox-notification--info p {
+ color: #fff;
+}
+.tox .tox-notification--info a {
+ color: #fff;
+}
+.tox .tox-notification--info svg {
+ fill: #fff;
+}
+.tox .tox-notification__body {
+ -ms-grid-row-align: center;
+ align-self: center;
+ color: #fff;
+ font-size: 14px;
+ -ms-grid-column-span: 1;
+ grid-column-end: 3;
+ -ms-grid-column: 2;
+ grid-column-start: 2;
+ -ms-grid-row-span: 1;
+ grid-row-end: 2;
+ -ms-grid-row: 1;
+ grid-row-start: 1;
+ text-align: center;
+ white-space: normal;
+ word-break: break-all;
+ word-break: break-word;
+}
+.tox .tox-notification__body > * {
+ margin: 0;
+}
+.tox .tox-notification__body > * + * {
+ margin-top: 1rem;
+}
+.tox .tox-notification__icon {
+ -ms-grid-row-align: center;
+ align-self: center;
+ -ms-grid-column-span: 1;
+ grid-column-end: 2;
+ -ms-grid-column: 1;
+ grid-column-start: 1;
+ -ms-grid-row-span: 1;
+ grid-row-end: 2;
+ -ms-grid-row: 1;
+ grid-row-start: 1;
+ -ms-grid-column-align: end;
+ justify-self: end;
+}
+.tox .tox-notification__icon svg {
+ display: block;
+}
+.tox .tox-notification__dismiss {
+ -ms-grid-row-align: start;
+ align-self: start;
+ -ms-grid-column-span: 1;
+ grid-column-end: 4;
+ -ms-grid-column: 3;
+ grid-column-start: 3;
+ -ms-grid-row-span: 1;
+ grid-row-end: 2;
+ -ms-grid-row: 1;
+ grid-row-start: 1;
+ -ms-grid-column-align: end;
+ justify-self: end;
+}
+.tox .tox-notification .tox-progress-bar {
+ -ms-grid-column-span: 3;
+ grid-column-end: 4;
+ -ms-grid-column: 1;
+ grid-column-start: 1;
+ -ms-grid-row-span: 1;
+ grid-row-end: 3;
+ -ms-grid-row: 2;
+ grid-row-start: 2;
+ -ms-grid-column-align: center;
+ justify-self: center;
+}
+.tox .tox-pop {
+ display: inline-block;
+ position: relative;
+}
+.tox .tox-pop--resizing {
+ transition: width 0.1s ease;
+}
+.tox .tox-pop--resizing .tox-toolbar {
+ flex-wrap: nowrap;
+}
+.tox .tox-pop__dialog {
+ background-color: #222f3e;
+ border: 1px solid #000000;
+ border-radius: 3px;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
+ min-width: 0;
+ overflow: hidden;
+}
+.tox .tox-pop__dialog > *:not(.tox-toolbar) {
+ margin: 4px 4px 4px 8px;
+}
+.tox .tox-pop__dialog .tox-toolbar {
+ background-color: transparent;
+ margin-bottom: -1px;
+}
+.tox .tox-pop::before,
+.tox .tox-pop::after {
+ border-style: solid;
+ content: '';
+ display: block;
+ height: 0;
+ position: absolute;
+ width: 0;
+}
+.tox .tox-pop.tox-pop--bottom::before,
+.tox .tox-pop.tox-pop--bottom::after {
+ left: 50%;
+ top: 100%;
+}
+.tox .tox-pop.tox-pop--bottom::after {
+ border-color: #222f3e transparent transparent transparent;
+ border-width: 8px;
+ margin-left: -8px;
+ margin-top: -1px;
+}
+.tox .tox-pop.tox-pop--bottom::before {
+ border-color: #000000 transparent transparent transparent;
+ border-width: 9px;
+ margin-left: -9px;
+}
+.tox .tox-pop.tox-pop--top::before,
+.tox .tox-pop.tox-pop--top::after {
+ left: 50%;
+ top: 0;
+ transform: translateY(-100%);
+}
+.tox .tox-pop.tox-pop--top::after {
+ border-color: transparent transparent #222f3e transparent;
+ border-width: 8px;
+ margin-left: -8px;
+ margin-top: 1px;
+}
+.tox .tox-pop.tox-pop--top::before {
+ border-color: transparent transparent #000000 transparent;
+ border-width: 9px;
+ margin-left: -9px;
+}
+.tox .tox-pop.tox-pop--left::before,
+.tox .tox-pop.tox-pop--left::after {
+ left: 0;
+ top: calc(50% - 1px);
+ transform: translateY(-50%);
+}
+.tox .tox-pop.tox-pop--left::after {
+ border-color: transparent #222f3e transparent transparent;
+ border-width: 8px;
+ margin-left: -15px;
+}
+.tox .tox-pop.tox-pop--left::before {
+ border-color: transparent #000000 transparent transparent;
+ border-width: 10px;
+ margin-left: -19px;
+}
+.tox .tox-pop.tox-pop--right::before,
+.tox .tox-pop.tox-pop--right::after {
+ left: 100%;
+ top: calc(50% + 1px);
+ transform: translateY(-50%);
+}
+.tox .tox-pop.tox-pop--right::after {
+ border-color: transparent transparent transparent #222f3e;
+ border-width: 8px;
+ margin-left: -1px;
+}
+.tox .tox-pop.tox-pop--right::before {
+ border-color: transparent transparent transparent #000000;
+ border-width: 10px;
+ margin-left: -1px;
+}
+.tox .tox-pop.tox-pop--align-left::before,
+.tox .tox-pop.tox-pop--align-left::after {
+ left: 20px;
+}
+.tox .tox-pop.tox-pop--align-right::before,
+.tox .tox-pop.tox-pop--align-right::after {
+ left: calc(100% - 20px);
+}
+.tox .tox-sidebar-wrap {
+ display: flex;
+ flex-direction: row;
+ flex-grow: 1;
+ -ms-flex-preferred-size: 0;
+ min-height: 0;
+}
+.tox .tox-sidebar {
+ background-color: #222f3e;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+}
+.tox .tox-sidebar__slider {
+ display: flex;
+ overflow: hidden;
+}
+.tox .tox-sidebar__pane-container {
+ display: flex;
+}
+.tox .tox-sidebar__pane {
+ display: flex;
+}
+.tox .tox-sidebar--sliding-closed {
+ opacity: 0;
+}
+.tox .tox-sidebar--sliding-open {
+ opacity: 1;
+}
+.tox .tox-sidebar--sliding-growing,
+.tox .tox-sidebar--sliding-shrinking {
+ transition: width 0.5s ease, opacity 0.5s ease;
+}
+.tox .tox-selector {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ display: inline-block;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+}
+.tox.tox-platform-touch .tox-selector {
+ height: 12px;
+ width: 12px;
+}
+.tox .tox-slider {
+ align-items: center;
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+ height: 24px;
+ justify-content: center;
+ position: relative;
+}
+.tox .tox-slider__rail {
+ background-color: transparent;
+ border: 1px solid #000000;
+ border-radius: 3px;
+ height: 10px;
+ min-width: 120px;
+ width: 100%;
+}
+.tox .tox-slider__handle {
+ background-color: #207ab7;
+ border: 2px solid #185d8c;
+ border-radius: 3px;
+ box-shadow: none;
+ height: 24px;
+ left: 50%;
+ position: absolute;
+ top: 50%;
+ transform: translateX(-50%) translateY(-50%);
+ width: 14px;
+}
+.tox .tox-source-code {
+ overflow: auto;
+}
+.tox .tox-spinner {
+ display: flex;
+}
+.tox .tox-spinner > div {
+ animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both;
+ background-color: rgba(255, 255, 255, 0.5);
+ border-radius: 100%;
+ height: 8px;
+ width: 8px;
+}
+.tox .tox-spinner > div:nth-child(1) {
+ animation-delay: -0.32s;
+}
+.tox .tox-spinner > div:nth-child(2) {
+ animation-delay: -0.16s;
+}
+@keyframes tam-bouncing-dots {
+ 0%,
+ 80%,
+ 100% {
+ transform: scale(0);
+ }
+ 40% {
+ transform: scale(1);
+ }
+}
+.tox:not([dir=rtl]) .tox-spinner > div:not(:first-child) {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-spinner > div:not(:first-child) {
+ margin-right: 4px;
+}
+.tox .tox-statusbar {
+ align-items: center;
+ background-color: #222f3e;
+ border-top: 1px solid #000000;
+ color: #fff;
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 12px;
+ font-weight: normal;
+ height: 18px;
+ overflow: hidden;
+ padding: 0 8px;
+ position: relative;
+ text-transform: uppercase;
+}
+.tox .tox-statusbar__text-container {
+ display: flex;
+ flex: 1 1 auto;
+ justify-content: flex-end;
+ overflow: hidden;
+}
+.tox .tox-statusbar__path {
+ display: flex;
+ flex: 1 1 auto;
+ margin-right: auto;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.tox .tox-statusbar__path > * {
+ display: inline;
+ white-space: nowrap;
+}
+.tox .tox-statusbar__wordcount {
+ flex: 0 0 auto;
+ margin-left: 1ch;
+}
+.tox .tox-statusbar a,
+.tox .tox-statusbar__path-item,
+.tox .tox-statusbar__wordcount {
+ color: #fff;
+ text-decoration: none;
+}
+.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]) {
+ cursor: pointer;
+ text-decoration: underline;
+}
+.tox .tox-statusbar__resize-handle {
+ align-items: flex-end;
+ align-self: stretch;
+ cursor: nwse-resize;
+ display: flex;
+ flex: 0 0 auto;
+ justify-content: flex-end;
+ margin-left: auto;
+ margin-right: -8px;
+ padding-left: 1ch;
+}
+.tox .tox-statusbar__resize-handle svg {
+ display: block;
+ fill: #fff;
+}
+.tox:not([dir=rtl]) .tox-statusbar__path > * {
+ margin-right: 4px;
+}
+.tox:not([dir=rtl]) .tox-statusbar__branding {
+ margin-left: 1ch;
+}
+.tox[dir=rtl] .tox-statusbar {
+ flex-direction: row-reverse;
+}
+.tox[dir=rtl] .tox-statusbar__path > * {
+ margin-left: 4px;
+}
+.tox .tox-throbber {
+ z-index: 1299;
+}
+.tox .tox-throbber__busy-spinner {
+ align-items: center;
+ background-color: rgba(34, 47, 62, 0.6);
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+.tox .tox-tbtn {
+ align-items: center;
+ background: transparent;
+ border: 0;
+ border-radius: 3px;
+ box-shadow: none;
+ color: #fff;
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ height: 34px;
+ justify-content: center;
+ margin: 2px 0 3px 0;
+ outline: none;
+ overflow: hidden;
+ padding: 0;
+ text-transform: none;
+ width: 34px;
+}
+.tox .tox-tbtn svg {
+ display: block;
+ fill: #fff;
+}
+.tox .tox-tbtn.tox-tbtn-more {
+ padding-left: 5px;
+ padding-right: 5px;
+ width: inherit;
+}
+.tox .tox-tbtn:focus {
+ background: #4a5562;
+ border: 0;
+ box-shadow: none;
+}
+.tox .tox-tbtn:hover {
+ background: #4a5562;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-tbtn:hover svg {
+ fill: #fff;
+}
+.tox .tox-tbtn:active {
+ background: #757d87;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-tbtn:active svg {
+ fill: #fff;
+}
+.tox .tox-tbtn--disabled,
+.tox .tox-tbtn--disabled:hover,
+.tox .tox-tbtn:disabled,
+.tox .tox-tbtn:disabled:hover {
+ background: transparent;
+ border: 0;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-tbtn--disabled svg,
+.tox .tox-tbtn--disabled:hover svg,
+.tox .tox-tbtn:disabled svg,
+.tox .tox-tbtn:disabled:hover svg {
+ /* stylelint-disable-line no-descending-specificity */
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-tbtn--enabled,
+.tox .tox-tbtn--enabled:hover {
+ background: #757d87;
+ border: 0;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-tbtn--enabled > *,
+.tox .tox-tbtn--enabled:hover > * {
+ transform: none;
+}
+.tox .tox-tbtn--enabled svg,
+.tox .tox-tbtn--enabled:hover svg {
+ /* stylelint-disable-line no-descending-specificity */
+ fill: #fff;
+}
+.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) {
+ color: #fff;
+}
+.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg {
+ fill: #fff;
+}
+.tox .tox-tbtn:active > * {
+ transform: none;
+}
+.tox .tox-tbtn--md {
+ height: 51px;
+ width: 51px;
+}
+.tox .tox-tbtn--lg {
+ flex-direction: column;
+ height: 68px;
+ width: 68px;
+}
+.tox .tox-tbtn--return {
+ -ms-grid-row-align: stretch;
+ align-self: stretch;
+ height: unset;
+ width: 16px;
+}
+.tox .tox-tbtn--labeled {
+ padding: 0 4px;
+ width: unset;
+}
+.tox .tox-tbtn__vlabel {
+ display: block;
+ font-size: 10px;
+ font-weight: normal;
+ letter-spacing: -0.025em;
+ margin-bottom: 4px;
+ white-space: nowrap;
+}
+.tox .tox-tbtn--select {
+ margin: 2px 0 3px 0;
+ padding: 0 4px;
+ width: auto;
+}
+.tox .tox-tbtn__select-label {
+ cursor: default;
+ font-weight: normal;
+ margin: 0 4px;
+}
+.tox .tox-tbtn__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+}
+.tox .tox-tbtn__select-chevron svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-tbtn--bespoke .tox-tbtn__select-label {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ width: 7em;
+}
+.tox .tox-split-button {
+ border: 0;
+ border-radius: 3px;
+ box-sizing: border-box;
+ display: flex;
+ margin: 2px 0 3px 0;
+ overflow: hidden;
+}
+.tox .tox-split-button:hover {
+ box-shadow: 0 0 0 1px #4a5562 inset;
+}
+.tox .tox-split-button:focus {
+ background: #4a5562;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-split-button > * {
+ border-radius: 0;
+}
+.tox .tox-split-button__chevron {
+ width: 16px;
+}
+.tox .tox-split-button__chevron svg {
+ fill: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-split-button .tox-tbtn {
+ margin: 0;
+}
+.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child {
+ width: 30px;
+}
+.tox.tox-platform-touch .tox-split-button__chevron {
+ width: 20px;
+}
+.tox .tox-split-button.tox-tbtn--disabled:hover,
+.tox .tox-split-button.tox-tbtn--disabled:focus,
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus {
+ background: transparent;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+}
+.tox .tox-toolbar-overlord {
+ background-color: #222f3e;
+}
+.tox .tox-toolbar,
+.tox .tox-toolbar__primary,
+.tox .tox-toolbar__overflow {
+ background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;
+ background-color: #222f3e;
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ padding: 0 0;
+}
+.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed {
+ height: 0;
+ opacity: 0;
+ padding-bottom: 0;
+ padding-top: 0;
+ visibility: hidden;
+}
+.tox .tox-toolbar__overflow--growing {
+ transition: height 0.3s ease, opacity 0.2s linear 0.1s;
+}
+.tox .tox-toolbar__overflow--shrinking {
+ transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s;
+}
+.tox .tox-menubar + .tox-toolbar,
+.tox .tox-menubar + .tox-toolbar-overlord .tox-toolbar__primary {
+ border-top: 1px solid #000000;
+ margin-top: -1px;
+}
+.tox .tox-toolbar--scrolling {
+ flex-wrap: nowrap;
+ overflow-x: auto;
+}
+.tox .tox-pop .tox-toolbar {
+ border-width: 0;
+}
+.tox .tox-toolbar--no-divider {
+ background-image: none;
+}
+.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child,
+.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary {
+ border-top: 1px solid #000000;
+}
+.tox.tox-tinymce-aux .tox-toolbar__overflow {
+ background-color: #222f3e;
+ border: 1px solid #000000;
+ border-radius: 3px;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
+}
+.tox[dir=rtl] .tox-tbtn__icon-rtl svg {
+ transform: rotateY(180deg);
+}
+.tox .tox-toolbar__group {
+ align-items: center;
+ display: flex;
+ flex-wrap: wrap;
+ margin: 0 0;
+ padding: 0 4px 0 4px;
+}
+.tox .tox-toolbar__group--pull-right {
+ margin-left: auto;
+}
+.tox .tox-toolbar--scrolling .tox-toolbar__group {
+ flex-shrink: 0;
+ flex-wrap: nowrap;
+}
+.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type) {
+ border-right: 1px solid #000000;
+}
+.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type) {
+ border-left: 1px solid #000000;
+}
+.tox .tox-tooltip {
+ display: inline-block;
+ padding: 8px;
+ position: relative;
+}
+.tox .tox-tooltip__body {
+ background-color: #3d546f;
+ border-radius: 3px;
+ box-shadow: 0 2px 4px rgba(42, 55, 70, 0.3);
+ color: rgba(255, 255, 255, 0.75);
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ padding: 4px 8px;
+ text-transform: none;
+}
+.tox .tox-tooltip__arrow {
+ position: absolute;
+}
+.tox .tox-tooltip--down .tox-tooltip__arrow {
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ border-top: 8px solid #3d546f;
+ bottom: 0;
+ left: 50%;
+ position: absolute;
+ transform: translateX(-50%);
+}
+.tox .tox-tooltip--up .tox-tooltip__arrow {
+ border-bottom: 8px solid #3d546f;
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ left: 50%;
+ position: absolute;
+ top: 0;
+ transform: translateX(-50%);
+}
+.tox .tox-tooltip--right .tox-tooltip__arrow {
+ border-bottom: 8px solid transparent;
+ border-left: 8px solid #3d546f;
+ border-top: 8px solid transparent;
+ position: absolute;
+ right: 0;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-tooltip--left .tox-tooltip__arrow {
+ border-bottom: 8px solid transparent;
+ border-right: 8px solid #3d546f;
+ border-top: 8px solid transparent;
+ left: 0;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-well {
+ border: 1px solid #000000;
+ border-radius: 3px;
+ padding: 8px;
+ width: 100%;
+}
+.tox .tox-well > *:first-child {
+ margin-top: 0;
+}
+.tox .tox-well > *:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-well > *:only-child {
+ margin: 0;
+}
+.tox .tox-custom-editor {
+ border: 1px solid #000000;
+ border-radius: 3px;
+ display: flex;
+ flex: 1;
+ position: relative;
+}
+/* stylelint-disable */
+.tox {
+ /* stylelint-enable */
+}
+.tox .tox-dialog-loading::before {
+ background-color: rgba(0, 0, 0, 0.5);
+ content: "";
+ height: 100%;
+ position: absolute;
+ width: 100%;
+ z-index: 1000;
+}
+.tox .tox-tab {
+ cursor: pointer;
+}
+.tox .tox-dialog__content-js {
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-dialog__body-content .tox-collection {
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-image-tools-edit-panel {
+ height: 60px;
+}
+.tox .tox-image-tools__sidebar {
+ height: 60px;
+}
diff --git a/static/css/skins-tinymce/ui/oxide-dark/skin.min.css b/static/css/skins-tinymce/ui/oxide-dark/skin.min.css
new file mode 100644
index 0000000..776a5af
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide-dark/skin.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tox{box-shadow:none;box-sizing:content-box;color:#2a3746;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #000;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce-inline{border:none;box-shadow:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #000;border-radius:0;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #000;border-radius:3px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#000;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.5);border-color:#207ab7;color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.5);border-color:rgba(255,165,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.5);border-color:rgba(204,0,0,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.8)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.5);border-color:rgba(120,171,70,.8);color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.8)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#fff}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#fff}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#fff}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#207ab7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#207ab7;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:capitalize;white-space:nowrap}.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;border-color:#207ab7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#3d546f;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#3d546f;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;color:#fff;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:capitalize}.tox .tox-button--secondary[disabled]{background-color:#3d546f;background-image:none;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:hover:not(:disabled){background-color:#34485f;background-image:none;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--secondary:active:not(:disabled){background-color:#2b3b4e;background-image:none;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#fff}.tox .tox-button--naked[disabled]{background-color:#3d546f;border-color:#3d546f;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#34485f;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--naked:focus:not(:disabled){background-color:#34485f;border-color:#34485f;box-shadow:none;color:#fff}.tox .tox-button--naked:active:not(:disabled){background-color:#2b3b4e;border-color:#2b3b4e;box-shadow:none;color:#fff}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#fff}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(255,255,255,.2)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(255,255,255,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(255,255,255,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #207ab7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#1a1a1a;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#333;color:#fff;cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:#fff;cursor:pointer;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#2b3b4e;color:#fff}.tox .tox-collection--list .tox-collection__item--active{background-color:#4a5562}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#757d87;color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#4a5562}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#757d87;color:#fff}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#4a5562;color:#fff}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#fff}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;-ms-flex-preferred-size:auto;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(255,255,255,.5);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#fff}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#2b3b4e;border:1px solid #1a1a1a;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #000}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #000}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-icon-rtl .tox-collection__item-icon svg{transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#4a5562}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#2b3b4e;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#2b3b4e;border:1px solid #000;border-radius:3px;box-shadow:0 4px 8px 0 rgba(42,55,70,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#fff;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(255,255,255,.5);font-size:12px}.tox .tox-comment__body{color:#fff;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(255,255,255,.5);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#2b3b4e;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(43,59,78,0),#2b3b4e);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#2b3b4e;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#fff;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#2b3b4e;box-shadow:0 0 8px 8px #2b3b4e;color:#fff;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#2b3b4e;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(255,255,255,.5)}.tox .tox-user__name{color:rgba(255,255,255,.5);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(34,47,62,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#222f3e}.tox .tox-dialog{background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(42,55,70,.15),0 0 40px 1px rgba(42,55,70,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#2b3b4e;border-bottom:none;color:#fff;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#fff;display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(255,255,255,.5);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#fff}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#fff;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#fff;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#2b3b4e;border-top:1px solid #000;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(34,47,62,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #000}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #000;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(255,255,255,.5);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #000}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(42,55,70,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(255,255,255,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(255,255,255,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(255,255,255,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #2b3b4e;border-radius:3px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(255,255,255,.5);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#222f3e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#2b3b4e;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#fff}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#fff}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#2b3b4e;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left:32px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#000;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:#fff;display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#2b3b4e;border:1px solid #000;border-radius:3px;box-shadow:0 4px 8px 0 rgba(42,55,70,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color:#222f3e;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #000}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn--active{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;font-size:14px;font-weight:400;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#fff}.tox .tox-notification--success p{color:#fff}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#fff}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#fff}.tox .tox-notification--error p{color:#fff}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#fff}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#fff}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#fff}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#fff}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#fff}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#fff}.tox .tox-notification--info p{color:#fff}.tox .tox-notification--info a{color:#fff}.tox .tox-notification--info svg{fill:#fff}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:#fff;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar{flex-wrap:nowrap}.tox .tox-pop__dialog{background-color:#222f3e;border:1px solid #000;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;position:absolute;width:0}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#222f3e transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#000 transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #222f3e transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #000 transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #222f3e transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #000 transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #222f3e;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #000;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#222f3e;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #000;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(255,255,255,.5);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#222f3e;border-top:1px solid #000;color:#fff;display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:#fff;text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:#fff}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(34,47,62,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#fff;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#fff}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#4a5562;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#4a5562;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:hover svg{fill:#fff}.tox .tox-tbtn:active{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn:active svg{fill:#fff}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#757d87;border:0;box-shadow:none;color:#fff}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#fff}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#fff}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #4a5562 inset}.tox .tox-split-button:focus{background:#4a5562;box-shadow:none;color:#fff}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(255,255,255,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(255,255,255,.5)}.tox .tox-toolbar-overlord{background-color:#222f3e}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e;background-color:#222f3e;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #000;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #000}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#222f3e;border:1px solid #000;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox[dir=rtl] .tox-tbtn__icon-rtl svg{transform:rotateY(180deg)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #000}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #000}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#3d546f;border-radius:3px;box-shadow:0 2px 4px rgba(42,55,70,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #3d546f;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #3d546f;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #3d546f;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #3d546f;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #000;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #000;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel{height:60px}.tox .tox-image-tools__sidebar{height:60px}
diff --git a/static/css/skins-tinymce/ui/oxide-dark/skin.mobile.css b/static/css/skins-tinymce/ui/oxide-dark/skin.mobile.css
new file mode 100644
index 0000000..875721a
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide-dark/skin.mobile.css
@@ -0,0 +1,673 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+/* RESET all the things! */
+.tinymce-mobile-outer-container {
+ all: initial;
+ display: block;
+}
+.tinymce-mobile-outer-container * {
+ border: 0;
+ box-sizing: initial;
+ cursor: inherit;
+ float: none;
+ line-height: 1;
+ margin: 0;
+ outline: 0;
+ padding: 0;
+ -webkit-tap-highlight-color: transparent;
+ /* TBIO-3691, stop the gray flicker on touch. */
+ text-shadow: none;
+ white-space: nowrap;
+}
+.tinymce-mobile-icon-arrow-back::before {
+ content: "\e5cd";
+}
+.tinymce-mobile-icon-image::before {
+ content: "\e412";
+}
+.tinymce-mobile-icon-cancel-circle::before {
+ content: "\e5c9";
+}
+.tinymce-mobile-icon-full-dot::before {
+ content: "\e061";
+}
+.tinymce-mobile-icon-align-center::before {
+ content: "\e234";
+}
+.tinymce-mobile-icon-align-left::before {
+ content: "\e236";
+}
+.tinymce-mobile-icon-align-right::before {
+ content: "\e237";
+}
+.tinymce-mobile-icon-bold::before {
+ content: "\e238";
+}
+.tinymce-mobile-icon-italic::before {
+ content: "\e23f";
+}
+.tinymce-mobile-icon-unordered-list::before {
+ content: "\e241";
+}
+.tinymce-mobile-icon-ordered-list::before {
+ content: "\e242";
+}
+.tinymce-mobile-icon-font-size::before {
+ content: "\e245";
+}
+.tinymce-mobile-icon-underline::before {
+ content: "\e249";
+}
+.tinymce-mobile-icon-link::before {
+ content: "\e157";
+}
+.tinymce-mobile-icon-unlink::before {
+ content: "\eca2";
+}
+.tinymce-mobile-icon-color::before {
+ content: "\e891";
+}
+.tinymce-mobile-icon-previous::before {
+ content: "\e314";
+}
+.tinymce-mobile-icon-next::before {
+ content: "\e315";
+}
+.tinymce-mobile-icon-large-font::before,
+.tinymce-mobile-icon-style-formats::before {
+ content: "\e264";
+}
+.tinymce-mobile-icon-undo::before {
+ content: "\e166";
+}
+.tinymce-mobile-icon-redo::before {
+ content: "\e15a";
+}
+.tinymce-mobile-icon-removeformat::before {
+ content: "\e239";
+}
+.tinymce-mobile-icon-small-font::before {
+ content: "\e906";
+}
+.tinymce-mobile-icon-readonly-back::before,
+.tinymce-mobile-format-matches::after {
+ content: "\e5ca";
+}
+.tinymce-mobile-icon-small-heading::before {
+ content: "small";
+}
+.tinymce-mobile-icon-large-heading::before {
+ content: "large";
+}
+.tinymce-mobile-icon-small-heading::before,
+.tinymce-mobile-icon-large-heading::before {
+ font-family: sans-serif;
+ font-size: 80%;
+}
+.tinymce-mobile-mask-edit-icon::before {
+ content: "\e254";
+}
+.tinymce-mobile-icon-back::before {
+ content: "\e5c4";
+}
+.tinymce-mobile-icon-heading::before {
+ /* TODO: Translate */
+ content: "Headings";
+ font-family: sans-serif;
+ font-size: 80%;
+ font-weight: bold;
+}
+.tinymce-mobile-icon-h1::before {
+ content: "H1";
+ font-weight: bold;
+}
+.tinymce-mobile-icon-h2::before {
+ content: "H2";
+ font-weight: bold;
+}
+.tinymce-mobile-icon-h3::before {
+ content: "H3";
+ font-weight: bold;
+}
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ background: rgba(51, 51, 51, 0.5);
+ height: 100%;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container {
+ align-items: center;
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ font-family: sans-serif;
+ font-size: 1em;
+ justify-content: space-between;
+}
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ border-radius: 50%;
+ height: 2.1em;
+ width: 2.1em;
+}
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ flex-direction: column;
+ font-size: 1em;
+}
+@media only screen and (min-device-width:700px) {
+ .tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section {
+ font-size: 1.2em;
+ }
+}
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ border-radius: 50%;
+ height: 2.1em;
+ width: 2.1em;
+ background-color: white;
+ color: #207ab7;
+}
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before {
+ content: "\e900";
+ font-family: 'tinymce-mobile', sans-serif;
+}
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon {
+ z-index: 2;
+}
+.tinymce-mobile-android-container.tinymce-mobile-android-maximized {
+ background: #ffffff;
+ border: none;
+ bottom: 0;
+ display: flex;
+ flex-direction: column;
+ left: 0;
+ position: fixed;
+ right: 0;
+ top: 0;
+}
+.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized) {
+ position: relative;
+}
+.tinymce-mobile-android-container .tinymce-mobile-editor-socket {
+ display: flex;
+ flex-grow: 1;
+}
+.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe {
+ display: flex !important;
+ flex-grow: 1;
+ height: auto !important;
+}
+.tinymce-mobile-android-scroll-reload {
+ overflow: hidden;
+}
+:not(.tinymce-mobile-readonly-mode) > .tinymce-mobile-android-selection-context-toolbar {
+ margin-top: 23px;
+}
+.tinymce-mobile-toolstrip {
+ background: #fff;
+ display: flex;
+ flex: 0 0 auto;
+ z-index: 1;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar {
+ align-items: center;
+ background-color: #fff;
+ border-bottom: 1px solid #cccccc;
+ display: flex;
+ flex: 1;
+ height: 2.5em;
+ width: 100%;
+ /* Make it no larger than the toolstrip, so that it needs to scroll */
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group {
+ align-items: center;
+ display: flex;
+ height: 100%;
+ flex-shrink: 1;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group > div {
+ align-items: center;
+ display: flex;
+ height: 100%;
+ flex: 1;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container {
+ background: #f44336;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group {
+ flex-grow: 1;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item {
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button {
+ align-items: center;
+ display: flex;
+ height: 80%;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected {
+ background: #c8cbcf;
+ color: #cccccc;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type {
+ background: #207ab7;
+ color: #eceff1;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar {
+ /* Note, this file is imported inside .tinymce-mobile-context-toolbar, so that prefix is on everything here. */
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group {
+ align-items: center;
+ display: flex;
+ height: 100%;
+ flex: 1;
+ padding-bottom: 0.4em;
+ padding-top: 0.4em;
+ /* Make any buttons appearing on the left and right display in the centre (e.g. color edges) */
+ /* For widgets like the colour picker, use the whole height */
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog {
+ display: flex;
+ min-height: 1.5em;
+ overflow: hidden;
+ padding-left: 0;
+ padding-right: 0;
+ position: relative;
+ width: 100%;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain {
+ display: flex;
+ height: 100%;
+ transition: left cubic-bezier(0.4, 0, 1, 1) 0.15s;
+ width: 100%;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen {
+ display: flex;
+ flex: 0 0 auto;
+ justify-content: space-between;
+ width: 100%;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input {
+ font-family: Sans-serif;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container {
+ display: flex;
+ flex-grow: 1;
+ position: relative;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x {
+ -ms-grid-row-align: center;
+ align-self: center;
+ background: inherit;
+ border: none;
+ border-radius: 50%;
+ color: #888;
+ font-size: 0.6em;
+ font-weight: bold;
+ height: 100%;
+ padding-right: 2px;
+ position: absolute;
+ right: 0;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x {
+ display: none;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous,
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next {
+ align-items: center;
+ display: flex;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before,
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before {
+ align-items: center;
+ display: flex;
+ font-weight: bold;
+ height: 100%;
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before,
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before {
+ visibility: hidden;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item {
+ color: #cccccc;
+ font-size: 10px;
+ line-height: 10px;
+ margin: 0 2px;
+ padding-top: 3px;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active {
+ color: #c8cbcf;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before {
+ margin-left: 0.5em;
+ margin-right: 0.9em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before {
+ margin-left: 0.9em;
+ margin-right: 0.5em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider {
+ display: flex;
+ flex: 1;
+ margin-left: 0;
+ margin-right: 0;
+ padding: 0.28em 0;
+ position: relative;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container {
+ align-items: center;
+ display: flex;
+ flex-grow: 1;
+ height: 100%;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line {
+ background: #cccccc;
+ display: flex;
+ flex: 1;
+ height: 0.2em;
+ margin-bottom: 0.3em;
+ margin-top: 0.3em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container {
+ padding-left: 2em;
+ padding-right: 2em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container {
+ align-items: center;
+ display: flex;
+ flex-grow: 1;
+ height: 100%;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient {
+ background: linear-gradient(to right, hsl(0, 100%, 50%) 0%, hsl(60, 100%, 50%) 17%, hsl(120, 100%, 50%) 33%, hsl(180, 100%, 50%) 50%, hsl(240, 100%, 50%) 67%, hsl(300, 100%, 50%) 83%, hsl(0, 100%, 50%) 100%);
+ display: flex;
+ flex: 1;
+ height: 0.2em;
+ margin-bottom: 0.3em;
+ margin-top: 0.3em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black {
+ /* Not part of theming */
+ background: black;
+ height: 0.2em;
+ margin-bottom: 0.3em;
+ margin-top: 0.3em;
+ width: 1.2em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white {
+ /* Not part of theming */
+ background: white;
+ height: 0.2em;
+ margin-bottom: 0.3em;
+ margin-top: 0.3em;
+ width: 1.2em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb {
+ /* vertically centering trick (margin: auto, top: 0, bottom: 0). On iOS and Safari, if you leave
+ * out these values, then it shows the thumb at the top of the spectrum. This is probably because it is
+ * absolutely positioned with only a left value, and not a top. Note, on Chrome it seems to be fine without
+ * this approach.
+ */
+ align-items: center;
+ background-clip: padding-box;
+ background-color: #455a64;
+ border: 0.5em solid rgba(136, 136, 136, 0);
+ border-radius: 3em;
+ bottom: 0;
+ color: #fff;
+ display: flex;
+ height: 0.5em;
+ justify-content: center;
+ left: -10px;
+ margin: auto;
+ position: absolute;
+ top: 0;
+ transition: border 120ms cubic-bezier(0.39, 0.58, 0.57, 1);
+ width: 0.5em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active {
+ border: 0.5em solid rgba(136, 136, 136, 0.39);
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group > div {
+ align-items: center;
+ display: flex;
+ height: 100%;
+ flex: 1;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper {
+ flex-direction: column;
+ justify-content: center;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item {
+ align-items: center;
+ display: flex;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog) {
+ height: 100%;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container {
+ display: flex;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input {
+ background: #ffffff;
+ border: none;
+ border-radius: 0;
+ color: #455a64;
+ flex-grow: 1;
+ font-size: 0.85em;
+ padding-bottom: 0.1em;
+ padding-left: 5px;
+ padding-top: 0.1em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder {
+ /* WebKit, Blink, Edge */
+ color: #888;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder {
+ /* WebKit, Blink, Edge */
+ color: #888;
+}
+/* dropup */
+.tinymce-mobile-dropup {
+ background: white;
+ display: flex;
+ overflow: hidden;
+ width: 100%;
+}
+.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking {
+ transition: height 0.3s ease-out;
+}
+.tinymce-mobile-dropup.tinymce-mobile-dropup-growing {
+ transition: height 0.3s ease-in;
+}
+.tinymce-mobile-dropup.tinymce-mobile-dropup-closed {
+ flex-grow: 0;
+}
+.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing) {
+ flex-grow: 1;
+}
+/* TODO min-height for device size and orientation */
+.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {
+ min-height: 200px;
+}
+@media only screen and (orientation: landscape) {
+ .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {
+ min-height: 200px;
+ }
+}
+@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) {
+ .tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {
+ min-height: 150px;
+ }
+}
+/* styles menu */
+.tinymce-mobile-styles-menu {
+ font-family: sans-serif;
+ outline: 4px solid black;
+ overflow: hidden;
+ position: relative;
+ width: 100%;
+}
+.tinymce-mobile-styles-menu [role="menu"] {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ position: absolute;
+ width: 100%;
+}
+.tinymce-mobile-styles-menu [role="menu"].transitioning {
+ transition: transform 0.5s ease-in-out;
+}
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-item {
+ border-bottom: 1px solid #ddd;
+ color: #455a64;
+ cursor: pointer;
+ display: flex;
+ padding: 1em 1em;
+ position: relative;
+}
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before {
+ color: #455a64;
+ content: "\e314";
+ font-family: 'tinymce-mobile', sans-serif;
+}
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after {
+ color: #455a64;
+ content: "\e315";
+ font-family: 'tinymce-mobile', sans-serif;
+ padding-left: 1em;
+ padding-right: 1em;
+ position: absolute;
+ right: 0;
+}
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after {
+ font-family: 'tinymce-mobile', sans-serif;
+ padding-left: 1em;
+ padding-right: 1em;
+ position: absolute;
+ right: 0;
+}
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator,
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser {
+ align-items: center;
+ background: #fff;
+ border-top: #455a64;
+ color: #455a64;
+ display: flex;
+ min-height: 2.5em;
+ padding-left: 1em;
+ padding-right: 1em;
+}
+.tinymce-mobile-styles-menu [data-transitioning-destination="before"][data-transitioning-state],
+.tinymce-mobile-styles-menu [data-transitioning-state="before"] {
+ transform: translate(-100%);
+}
+.tinymce-mobile-styles-menu [data-transitioning-destination="current"][data-transitioning-state],
+.tinymce-mobile-styles-menu [data-transitioning-state="current"] {
+ transform: translate(0%);
+}
+.tinymce-mobile-styles-menu [data-transitioning-destination="after"][data-transitioning-state],
+.tinymce-mobile-styles-menu [data-transitioning-state="after"] {
+ transform: translate(100%);
+}
+@font-face {
+ font-family: 'tinymce-mobile';
+ font-style: normal;
+ font-weight: normal;
+ src: url('fonts/tinymce-mobile.woff?8x92w3') format('woff');
+}
+@media (min-device-width: 700px) {
+ .tinymce-mobile-outer-container,
+ .tinymce-mobile-outer-container input {
+ font-size: 25px;
+ }
+}
+@media (max-device-width: 700px) {
+ .tinymce-mobile-outer-container,
+ .tinymce-mobile-outer-container input {
+ font-size: 18px;
+ }
+}
+.tinymce-mobile-icon {
+ font-family: 'tinymce-mobile', sans-serif;
+}
+.mixin-flex-and-centre {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+}
+.mixin-flex-bar {
+ align-items: center;
+ display: flex;
+ height: 100%;
+}
+.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe {
+ background-color: #fff;
+ width: 100%;
+}
+.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {
+ /* Note, on the iPod touch in landscape, this isn't visible when the navbar appears */
+ background-color: #207ab7;
+ border-radius: 50%;
+ bottom: 1em;
+ color: white;
+ font-size: 1em;
+ height: 2.1em;
+ position: fixed;
+ right: 2em;
+ width: 2.1em;
+ align-items: center;
+ display: flex;
+ justify-content: center;
+}
+@media only screen and (min-device-width:700px) {
+ .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {
+ font-size: 1.2em;
+ }
+}
+.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket {
+ height: 300px;
+ overflow: hidden;
+}
+.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe {
+ height: 100%;
+}
+.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip {
+ display: none;
+}
+/*
+ Note, that if you don't include this (::-webkit-file-upload-button), the toolbar width gets
+ increased and the whole body becomes scrollable. It's important!
+ */
+input[type="file"]::-webkit-file-upload-button {
+ display: none;
+}
+@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) {
+ .tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {
+ bottom: 50%;
+ }
+}
diff --git a/static/css/skins-tinymce/ui/oxide-dark/skin.mobile.min.css b/static/css/skins-tinymce/ui/oxide-dark/skin.mobile.min.css
new file mode 100644
index 0000000..3a45cac
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide-dark/skin.mobile.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tinymce-mobile-outer-container{all:initial;display:block}.tinymce-mobile-outer-container *{border:0;box-sizing:initial;cursor:inherit;float:none;line-height:1;margin:0;outline:0;padding:0;-webkit-tap-highlight-color:transparent;text-shadow:none;white-space:nowrap}.tinymce-mobile-icon-arrow-back::before{content:"\e5cd"}.tinymce-mobile-icon-image::before{content:"\e412"}.tinymce-mobile-icon-cancel-circle::before{content:"\e5c9"}.tinymce-mobile-icon-full-dot::before{content:"\e061"}.tinymce-mobile-icon-align-center::before{content:"\e234"}.tinymce-mobile-icon-align-left::before{content:"\e236"}.tinymce-mobile-icon-align-right::before{content:"\e237"}.tinymce-mobile-icon-bold::before{content:"\e238"}.tinymce-mobile-icon-italic::before{content:"\e23f"}.tinymce-mobile-icon-unordered-list::before{content:"\e241"}.tinymce-mobile-icon-ordered-list::before{content:"\e242"}.tinymce-mobile-icon-font-size::before{content:"\e245"}.tinymce-mobile-icon-underline::before{content:"\e249"}.tinymce-mobile-icon-link::before{content:"\e157"}.tinymce-mobile-icon-unlink::before{content:"\eca2"}.tinymce-mobile-icon-color::before{content:"\e891"}.tinymce-mobile-icon-previous::before{content:"\e314"}.tinymce-mobile-icon-next::before{content:"\e315"}.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content:"\e264"}.tinymce-mobile-icon-undo::before{content:"\e166"}.tinymce-mobile-icon-redo::before{content:"\e15a"}.tinymce-mobile-icon-removeformat::before{content:"\e239"}.tinymce-mobile-icon-small-font::before{content:"\e906"}.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content:"\e5ca"}.tinymce-mobile-icon-small-heading::before{content:"small"}.tinymce-mobile-icon-large-heading::before{content:"large"}.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family:sans-serif;font-size:80%}.tinymce-mobile-mask-edit-icon::before{content:"\e254"}.tinymce-mobile-icon-back::before{content:"\e5c4"}.tinymce-mobile-icon-heading::before{content:"Headings";font-family:sans-serif;font-size:80%;font-weight:700}.tinymce-mobile-icon-h1::before{content:"H1";font-weight:700}.tinymce-mobile-icon-h2::before{content:"H2";font-weight:700}.tinymce-mobile-icon-h3::before{content:"H3";font-weight:700}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{align-items:center;display:flex;justify-content:center;background:rgba(51,51,51,.5);height:100%;position:absolute;top:0;width:100%}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{align-items:center;border-radius:50%;display:flex;flex-direction:column;font-family:sans-serif;font-size:1em;justify-content:space-between}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items:center;display:flex;justify-content:center;flex-direction:column;font-size:1em}@media only screen and (min-device-width:700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size:1.2em}}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em;background-color:#fff;color:#207ab7}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{content:"\e900";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index:2}.tinymce-mobile-android-container.tinymce-mobile-android-maximized{background:#fff;border:none;bottom:0;display:flex;flex-direction:column;left:0;position:fixed;right:0;top:0}.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position:relative}.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display:flex;flex-grow:1}.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display:flex!important;flex-grow:1;height:auto!important}.tinymce-mobile-android-scroll-reload{overflow:hidden}:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top:23px}.tinymce-mobile-toolstrip{background:#fff;display:flex;flex:0 0 auto;z-index:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{align-items:center;background-color:#fff;border-bottom:1px solid #ccc;display:flex;flex:1;height:2.5em;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex-shrink:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background:#f44336}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{align-items:center;display:flex;height:80%;margin-left:2px;margin-right:2px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{background:#c8cbcf;color:#ccc}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{background:#207ab7;color:#eceff1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex:1;padding-bottom:.4em;padding-top:.4em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{display:flex;min-height:1.5em;overflow:hidden;padding-left:0;padding-right:0;position:relative;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display:flex;height:100%;transition:left cubic-bezier(.4,0,1,1) .15s;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display:flex;flex:0 0 auto;justify-content:space-between;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family:Sans-serif}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{display:flex;flex-grow:1;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{-ms-grid-row-align:center;align-self:center;background:inherit;border:none;border-radius:50%;color:#888;font-size:.6em;font-weight:700;height:100%;padding-right:2px;position:absolute;right:0}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display:none}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before{align-items:center;display:flex;font-weight:700;height:100%;padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before{visibility:hidden}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{color:#ccc;font-size:10px;line-height:10px;margin:0 2px;padding-top:3px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color:#c8cbcf}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-left:.5em;margin-right:.9em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-left:.9em;margin-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{display:flex;flex:1;margin-left:0;margin-right:0;padding:.28em 0;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{background:#ccc;display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-left:2em;padding-right:2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{background:linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{background:#000;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{background:#fff;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{align-items:center;background-clip:padding-box;background-color:#455a64;border:.5em solid rgba(136,136,136,0);border-radius:3em;bottom:0;color:#fff;display:flex;height:.5em;justify-content:center;left:-10px;margin:auto;position:absolute;top:0;transition:border 120ms cubic-bezier(.39,.58,.57,1);width:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border:.5em solid rgba(136,136,136,.39)}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction:column;justify-content:center}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{background:#fff;border:none;border-radius:0;color:#455a64;flex-grow:1;font-size:.85em;padding-bottom:.1em;padding-left:5px;padding-top:.1em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color:#888}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color:#888}.tinymce-mobile-dropup{background:#fff;display:flex;overflow:hidden;width:100%}.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition:height .3s ease-out}.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition:height .3s ease-in}.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow:0}.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow:1}.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}@media only screen and (orientation:landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:150px}}.tinymce-mobile-styles-menu{font-family:sans-serif;outline:4px solid #000;overflow:hidden;position:relative;width:100%}.tinymce-mobile-styles-menu [role=menu]{display:flex;flex-direction:column;height:100%;position:absolute;width:100%}.tinymce-mobile-styles-menu [role=menu].transitioning{transition:transform .5s ease-in-out}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{border-bottom:1px solid #ddd;color:#455a64;cursor:pointer;display:flex;padding:1em 1em;position:relative}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{color:#455a64;content:"\e314";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{color:#455a64;content:"\e315";font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{align-items:center;background:#fff;border-top:#455a64;color:#455a64;display:flex;min-height:2.5em;padding-left:1em;padding-right:1em}.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform:translate(-100%)}.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform:translate(0)}.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform:translate(100%)}@font-face{font-family:tinymce-mobile;font-style:normal;font-weight:400;src:url(fonts/tinymce-mobile.woff?8x92w3) format('woff')}@media (min-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:25px}}@media (max-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:18px}}.tinymce-mobile-icon{font-family:tinymce-mobile,sans-serif}.mixin-flex-and-centre{align-items:center;display:flex;justify-content:center}.mixin-flex-bar{align-items:center;display:flex;height:100%}.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{background-color:#fff;width:100%}.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{background-color:#207ab7;border-radius:50%;bottom:1em;color:#fff;font-size:1em;height:2.1em;position:fixed;right:2em;width:2.1em;align-items:center;display:flex;justify-content:center}@media only screen and (min-device-width:700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size:1.2em}}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height:300px;overflow:hidden}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height:100%}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display:none}input[type=file]::-webkit-file-upload-button{display:none}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom:50%}}
diff --git a/static/css/skins-tinymce/ui/oxide-dark/skin.shadowdom.css b/static/css/skins-tinymce/ui/oxide-dark/skin.shadowdom.css
new file mode 100644
index 0000000..715978b
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide-dark/skin.shadowdom.css
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+body.tox-dialog__disable-scroll {
+ overflow: hidden;
+}
+.tox-fullscreen {
+ border: 0;
+ height: 100%;
+ left: 0;
+ margin: 0;
+ overflow: hidden;
+ -ms-scroll-chaining: none;
+ overscroll-behavior: none;
+ padding: 0;
+ position: fixed;
+ top: 0;
+ touch-action: pinch-zoom;
+ width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+ display: none;
+}
+.tox.tox-tinymce.tox-fullscreen {
+ background-color: transparent;
+ z-index: 1200;
+}
+.tox-shadowhost.tox-fullscreen {
+ z-index: 1200;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+ z-index: 1201;
+}
diff --git a/static/css/skins-tinymce/ui/oxide-dark/skin.shadowdom.min.css b/static/css/skins-tinymce/ui/oxide-dark/skin.shadowdom.min.css
new file mode 100644
index 0000000..9ba6e02
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide-dark/skin.shadowdom.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
diff --git a/static/css/skins-tinymce/ui/oxide/content.css b/static/css/skins-tinymce/ui/oxide/content.css
new file mode 100644
index 0000000..efae400
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide/content.css
@@ -0,0 +1,732 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ cursor: default;
+ display: inline-block;
+ height: 12px !important;
+ padding: 0 2px;
+ -webkit-user-modify: read-only;
+ -moz-user-modify: read-only;
+ -webkit-user-select: all;
+ -moz-user-select: all;
+ -ms-user-select: all;
+ user-select: all;
+ width: 8px !important;
+}
+.mce-content-body .mce-item-anchor[data-mce-selected] {
+ outline-offset: 1px;
+}
+.tox-comments-visible .tox-comment {
+ background-color: #fff0b7;
+}
+.tox-comments-visible .tox-comment--active {
+ background-color: #ffe168;
+}
+.tox-checklist > li:not(.tox-checklist--hidden) {
+ list-style: none;
+ margin: 0.25em 0;
+}
+.tox-checklist > li:not(.tox-checklist--hidden)::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+ cursor: pointer;
+ height: 1em;
+ margin-left: -1.5em;
+ margin-top: 0.125em;
+ position: absolute;
+ width: 1em;
+}
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+}
+[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
+ margin-left: 0;
+ margin-right: -1.5em;
+}
+/* stylelint-disable */
+/* http://prismjs.com/ */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: black;
+ background: none;
+ text-shadow: 0 1px white;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ font-size: 1em;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none;
+}
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+@media print {
+ code[class*="language-"],
+ pre[class*="language-"] {
+ text-shadow: none;
+ }
+}
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: 0.5em 0;
+ overflow: auto;
+}
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+ background: #f5f2f0;
+}
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+ padding: 0.1em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: slategray;
+}
+.token.punctuation {
+ color: #999;
+}
+.namespace {
+ opacity: 0.7;
+}
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #905;
+}
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #690;
+}
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+ color: #9a6e3a;
+ background: hsla(0, 0%, 100%, 0.5);
+}
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+}
+.token.function,
+.token.class-name {
+ color: #DD4A68;
+}
+.token.regex,
+.token.important,
+.token.variable {
+ color: #e90;
+}
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+.token.italic {
+ font-style: italic;
+}
+.token.entity {
+ cursor: help;
+}
+/* stylelint-enable */
+.mce-content-body {
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+.mce-content-body .mce-visual-caret {
+ background-color: black;
+ background-color: currentColor;
+ position: absolute;
+}
+.mce-content-body .mce-visual-caret-hidden {
+ display: none;
+}
+.mce-content-body *[data-mce-caret] {
+ left: -1000px;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ right: auto;
+ top: 0;
+}
+.mce-content-body .mce-offscreen-selection {
+ left: -2000000px;
+ max-width: 1000000px;
+ position: absolute;
+}
+.mce-content-body *[contentEditable=false] {
+ cursor: default;
+}
+.mce-content-body *[contentEditable=true] {
+ cursor: text;
+}
+.tox-cursor-format-painter {
+ cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default;
+}
+.mce-content-body figure.align-left {
+ float: left;
+}
+.mce-content-body figure.align-right {
+ float: right;
+}
+.mce-content-body figure.image.align-center {
+ display: table;
+ margin-left: auto;
+ margin-right: auto;
+}
+.mce-preview-object {
+ border: 1px solid gray;
+ display: inline-block;
+ line-height: 0;
+ margin: 0 2px 0 2px;
+ position: relative;
+}
+.mce-preview-object .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-preview-object[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.mce-object {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ border: 1px dashed #aaa;
+}
+.mce-pagebreak {
+ border: 1px dashed #aaa;
+ cursor: default;
+ display: block;
+ height: 5px;
+ margin-top: 15px;
+ page-break-before: always;
+ width: 100%;
+}
+@media print {
+ .mce-pagebreak {
+ border: 0;
+ }
+}
+.tiny-pageembed .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tiny-pageembed[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.tiny-pageembed {
+ display: inline-block;
+ position: relative;
+}
+.tiny-pageembed--21by9,
+.tiny-pageembed--16by9,
+.tiny-pageembed--4by3,
+.tiny-pageembed--1by1 {
+ display: block;
+ overflow: hidden;
+ padding: 0;
+ position: relative;
+ width: 100%;
+}
+.tiny-pageembed--21by9 {
+ padding-top: 42.857143%;
+}
+.tiny-pageembed--16by9 {
+ padding-top: 56.25%;
+}
+.tiny-pageembed--4by3 {
+ padding-top: 75%;
+}
+.tiny-pageembed--1by1 {
+ padding-top: 100%;
+}
+.tiny-pageembed--21by9 iframe,
+.tiny-pageembed--16by9 iframe,
+.tiny-pageembed--4by3 iframe,
+.tiny-pageembed--1by1 iframe {
+ border: 0;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-content-body[data-mce-placeholder] {
+ position: relative;
+}
+.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ color: rgba(34, 47, 62, 0.7);
+ content: attr(data-mce-placeholder);
+ position: absolute;
+}
+.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ left: 1px;
+}
+.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
+ right: 1px;
+}
+.mce-content-body div.mce-resizehandle {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+ z-index: 10000;
+}
+.mce-content-body div.mce-resizehandle:hover {
+ background-color: #4099ff;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(1) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(2) {
+ cursor: nesw-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(3) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(4) {
+ cursor: nesw-resize;
+}
+.mce-content-body .mce-resize-backdrop {
+ z-index: 10000;
+}
+.mce-content-body .mce-clonedresizable {
+ cursor: default;
+ opacity: 0.5;
+ outline: 1px dashed black;
+ position: absolute;
+ z-index: 10001;
+}
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns th,
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns td {
+ border: 0;
+}
+.mce-content-body .mce-resize-helper {
+ background: #555;
+ background: rgba(0, 0, 0, 0.75);
+ border: 1px;
+ border-radius: 3px;
+ color: white;
+ display: none;
+ font-family: sans-serif;
+ font-size: 12px;
+ line-height: 14px;
+ margin: 5px 10px;
+ padding: 5px;
+ position: absolute;
+ white-space: nowrap;
+ z-index: 10002;
+}
+.tox-rtc-user-selection {
+ position: relative;
+}
+.tox-rtc-user-cursor {
+ bottom: 0;
+ cursor: default;
+ position: absolute;
+ top: 0;
+ width: 2px;
+}
+.tox-rtc-user-cursor::before {
+ background-color: inherit;
+ border-radius: 50%;
+ content: '';
+ display: block;
+ height: 8px;
+ position: absolute;
+ right: -3px;
+ top: -3px;
+ width: 8px;
+}
+.tox-rtc-user-cursor:hover::after {
+ background-color: inherit;
+ border-radius: 100px;
+ box-sizing: border-box;
+ color: #fff;
+ content: attr(data-user);
+ display: block;
+ font-size: 12px;
+ font-weight: bold;
+ left: -5px;
+ min-height: 8px;
+ min-width: 8px;
+ padding: 0 12px;
+ position: absolute;
+ top: -11px;
+ white-space: nowrap;
+ z-index: 1000;
+}
+.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
+ background-color: #2dc26b;
+}
+.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
+ background-color: #e03e2d;
+}
+.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
+ background-color: #f1c40f;
+}
+.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
+ background-color: #3598db;
+}
+.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
+ background-color: #b96ad9;
+}
+.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
+ background-color: #e67e23;
+}
+.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
+ background-color: #aaa69d;
+}
+.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
+ background-color: #f368e0;
+}
+.tox-rtc-remote-image {
+ background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
+ border: 1px solid #ccc;
+ min-height: 240px;
+ min-width: 320px;
+}
+.mce-match-marker {
+ background: #aaa;
+ color: #fff;
+}
+.mce-match-marker-selected {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::-moz-selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-content-body img[data-mce-selected],
+.mce-content-body video[data-mce-selected],
+.mce-content-body audio[data-mce-selected],
+.mce-content-body object[data-mce-selected],
+.mce-content-body embed[data-mce-selected],
+.mce-content-body table[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body hr[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+ outline-offset: 1px;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false][data-mce-selected] {
+ cursor: not-allowed;
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
+.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
+ outline: none;
+}
+.mce-content-body *[data-mce-selected="inline-boundary"] {
+ background-color: #b4d7ff;
+}
+.mce-content-body .mce-edit-focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body td[data-mce-selected],
+.mce-content-body th[data-mce-selected] {
+ position: relative;
+}
+.mce-content-body td[data-mce-selected]::-moz-selection,
+.mce-content-body th[data-mce-selected]::-moz-selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected]::selection,
+.mce-content-body th[data-mce-selected]::selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected] *,
+.mce-content-body th[data-mce-selected] * {
+ outline: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.mce-content-body td[data-mce-selected]::after,
+.mce-content-body th[data-mce-selected]::after {
+ background-color: rgba(180, 215, 255, 0.7);
+ border: 1px solid rgba(180, 215, 255, 0.7);
+ bottom: -1px;
+ content: '';
+ left: -1px;
+ mix-blend-mode: multiply;
+ position: absolute;
+ right: -1px;
+ top: -1px;
+}
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+ .mce-content-body td[data-mce-selected]::after,
+ .mce-content-body th[data-mce-selected]::after {
+ border-color: rgba(0, 84, 180, 0.7);
+ }
+}
+.mce-content-body img::-moz-selection {
+ background: none;
+}
+.mce-content-body img::selection {
+ background: none;
+}
+.ephox-snooker-resizer-bar {
+ background-color: #b4d7ff;
+ opacity: 0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.ephox-snooker-resizer-cols {
+ cursor: col-resize;
+}
+.ephox-snooker-resizer-rows {
+ cursor: row-resize;
+}
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
+ opacity: 1;
+}
+.mce-spellchecker-word {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+ height: 2rem;
+}
+.mce-spellchecker-grammar {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+}
+.mce-toc {
+ border: 1px solid gray;
+}
+.mce-toc h2 {
+ margin: 4px;
+}
+.mce-toc li {
+ list-style-type: none;
+}
+table[style*="border-width: 0px"],
+.mce-item-table:not([border]),
+.mce-item-table[border="0"],
+table[style*="border-width: 0px"] td,
+.mce-item-table:not([border]) td,
+.mce-item-table[border="0"] td,
+table[style*="border-width: 0px"] th,
+.mce-item-table:not([border]) th,
+.mce-item-table[border="0"] th,
+table[style*="border-width: 0px"] caption,
+.mce-item-table:not([border]) caption,
+.mce-item-table[border="0"] caption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks p,
+.mce-visualblocks h1,
+.mce-visualblocks h2,
+.mce-visualblocks h3,
+.mce-visualblocks h4,
+.mce-visualblocks h5,
+.mce-visualblocks h6,
+.mce-visualblocks div:not([data-mce-bogus]),
+.mce-visualblocks section,
+.mce-visualblocks article,
+.mce-visualblocks blockquote,
+.mce-visualblocks address,
+.mce-visualblocks pre,
+.mce-visualblocks figure,
+.mce-visualblocks figcaption,
+.mce-visualblocks hgroup,
+.mce-visualblocks aside,
+.mce-visualblocks ul,
+.mce-visualblocks ol,
+.mce-visualblocks dl {
+ background-repeat: no-repeat;
+ border: 1px dashed #bbb;
+ margin-left: 3px;
+ padding-top: 10px;
+}
+.mce-visualblocks p {
+ background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
+}
+.mce-visualblocks h1 {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
+}
+.mce-visualblocks h2 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
+}
+.mce-visualblocks h3 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
+}
+.mce-visualblocks h4 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
+}
+.mce-visualblocks h5 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
+}
+.mce-visualblocks h6 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
+}
+.mce-visualblocks div:not([data-mce-bogus]) {
+ background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
+}
+.mce-visualblocks section {
+ background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
+}
+.mce-visualblocks article {
+ background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
+}
+.mce-visualblocks blockquote {
+ background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
+}
+.mce-visualblocks address {
+ background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
+}
+.mce-visualblocks pre {
+ background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
+}
+.mce-visualblocks figure {
+ background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
+}
+.mce-visualblocks figcaption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks hgroup {
+ background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
+}
+.mce-visualblocks aside {
+ background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
+}
+.mce-visualblocks ul {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
+}
+.mce-visualblocks ol {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
+}
+.mce-visualblocks dl {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
+}
+.mce-visualblocks:not([dir=rtl]) p,
+.mce-visualblocks:not([dir=rtl]) h1,
+.mce-visualblocks:not([dir=rtl]) h2,
+.mce-visualblocks:not([dir=rtl]) h3,
+.mce-visualblocks:not([dir=rtl]) h4,
+.mce-visualblocks:not([dir=rtl]) h5,
+.mce-visualblocks:not([dir=rtl]) h6,
+.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),
+.mce-visualblocks:not([dir=rtl]) section,
+.mce-visualblocks:not([dir=rtl]) article,
+.mce-visualblocks:not([dir=rtl]) blockquote,
+.mce-visualblocks:not([dir=rtl]) address,
+.mce-visualblocks:not([dir=rtl]) pre,
+.mce-visualblocks:not([dir=rtl]) figure,
+.mce-visualblocks:not([dir=rtl]) figcaption,
+.mce-visualblocks:not([dir=rtl]) hgroup,
+.mce-visualblocks:not([dir=rtl]) aside,
+.mce-visualblocks:not([dir=rtl]) ul,
+.mce-visualblocks:not([dir=rtl]) ol,
+.mce-visualblocks:not([dir=rtl]) dl {
+ margin-left: 3px;
+}
+.mce-visualblocks[dir=rtl] p,
+.mce-visualblocks[dir=rtl] h1,
+.mce-visualblocks[dir=rtl] h2,
+.mce-visualblocks[dir=rtl] h3,
+.mce-visualblocks[dir=rtl] h4,
+.mce-visualblocks[dir=rtl] h5,
+.mce-visualblocks[dir=rtl] h6,
+.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),
+.mce-visualblocks[dir=rtl] section,
+.mce-visualblocks[dir=rtl] article,
+.mce-visualblocks[dir=rtl] blockquote,
+.mce-visualblocks[dir=rtl] address,
+.mce-visualblocks[dir=rtl] pre,
+.mce-visualblocks[dir=rtl] figure,
+.mce-visualblocks[dir=rtl] figcaption,
+.mce-visualblocks[dir=rtl] hgroup,
+.mce-visualblocks[dir=rtl] aside,
+.mce-visualblocks[dir=rtl] ul,
+.mce-visualblocks[dir=rtl] ol,
+.mce-visualblocks[dir=rtl] dl {
+ background-position-x: right;
+ margin-right: 3px;
+}
+.mce-nbsp,
+.mce-shy {
+ background: #aaa;
+}
+.mce-shy::after {
+ content: '-';
+}
+body {
+ font-family: sans-serif;
+}
+table {
+ border-collapse: collapse;
+}
diff --git a/static/css/skins-tinymce/ui/oxide/content.inline.css b/static/css/skins-tinymce/ui/oxide/content.inline.css
new file mode 100644
index 0000000..df6ed08
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide/content.inline.css
@@ -0,0 +1,726 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ cursor: default;
+ display: inline-block;
+ height: 12px !important;
+ padding: 0 2px;
+ -webkit-user-modify: read-only;
+ -moz-user-modify: read-only;
+ -webkit-user-select: all;
+ -moz-user-select: all;
+ -ms-user-select: all;
+ user-select: all;
+ width: 8px !important;
+}
+.mce-content-body .mce-item-anchor[data-mce-selected] {
+ outline-offset: 1px;
+}
+.tox-comments-visible .tox-comment {
+ background-color: #fff0b7;
+}
+.tox-comments-visible .tox-comment--active {
+ background-color: #ffe168;
+}
+.tox-checklist > li:not(.tox-checklist--hidden) {
+ list-style: none;
+ margin: 0.25em 0;
+}
+.tox-checklist > li:not(.tox-checklist--hidden)::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+ cursor: pointer;
+ height: 1em;
+ margin-left: -1.5em;
+ margin-top: 0.125em;
+ position: absolute;
+ width: 1em;
+}
+.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before {
+ content: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");
+}
+[dir=rtl] .tox-checklist > li:not(.tox-checklist--hidden)::before {
+ margin-left: 0;
+ margin-right: -1.5em;
+}
+/* stylelint-disable */
+/* http://prismjs.com/ */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+ color: black;
+ background: none;
+ text-shadow: 0 1px white;
+ font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+ font-size: 1em;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+ word-wrap: normal;
+ line-height: 1.5;
+ -moz-tab-size: 4;
+ tab-size: 4;
+ -webkit-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none;
+}
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+@media print {
+ code[class*="language-"],
+ pre[class*="language-"] {
+ text-shadow: none;
+ }
+}
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: 0.5em 0;
+ overflow: auto;
+}
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+ background: #f5f2f0;
+}
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+ padding: 0.1em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: slategray;
+}
+.token.punctuation {
+ color: #999;
+}
+.namespace {
+ opacity: 0.7;
+}
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+ color: #905;
+}
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+ color: #690;
+}
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+ color: #9a6e3a;
+ background: hsla(0, 0%, 100%, 0.5);
+}
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+}
+.token.function,
+.token.class-name {
+ color: #DD4A68;
+}
+.token.regex,
+.token.important,
+.token.variable {
+ color: #e90;
+}
+.token.important,
+.token.bold {
+ font-weight: bold;
+}
+.token.italic {
+ font-style: italic;
+}
+.token.entity {
+ cursor: help;
+}
+/* stylelint-enable */
+.mce-content-body {
+ overflow-wrap: break-word;
+ word-wrap: break-word;
+}
+.mce-content-body .mce-visual-caret {
+ background-color: black;
+ background-color: currentColor;
+ position: absolute;
+}
+.mce-content-body .mce-visual-caret-hidden {
+ display: none;
+}
+.mce-content-body *[data-mce-caret] {
+ left: -1000px;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ right: auto;
+ top: 0;
+}
+.mce-content-body .mce-offscreen-selection {
+ left: -2000000px;
+ max-width: 1000000px;
+ position: absolute;
+}
+.mce-content-body *[contentEditable=false] {
+ cursor: default;
+}
+.mce-content-body *[contentEditable=true] {
+ cursor: text;
+}
+.tox-cursor-format-painter {
+ cursor: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"), default;
+}
+.mce-content-body figure.align-left {
+ float: left;
+}
+.mce-content-body figure.align-right {
+ float: right;
+}
+.mce-content-body figure.image.align-center {
+ display: table;
+ margin-left: auto;
+ margin-right: auto;
+}
+.mce-preview-object {
+ border: 1px solid gray;
+ display: inline-block;
+ line-height: 0;
+ margin: 0 2px 0 2px;
+ position: relative;
+}
+.mce-preview-object .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-preview-object[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.mce-object {
+ background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;
+ border: 1px dashed #aaa;
+}
+.mce-pagebreak {
+ border: 1px dashed #aaa;
+ cursor: default;
+ display: block;
+ height: 5px;
+ margin-top: 15px;
+ page-break-before: always;
+ width: 100%;
+}
+@media print {
+ .mce-pagebreak {
+ border: 0;
+ }
+}
+.tiny-pageembed .mce-shim {
+ background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tiny-pageembed[data-mce-selected="2"] .mce-shim {
+ display: none;
+}
+.tiny-pageembed {
+ display: inline-block;
+ position: relative;
+}
+.tiny-pageembed--21by9,
+.tiny-pageembed--16by9,
+.tiny-pageembed--4by3,
+.tiny-pageembed--1by1 {
+ display: block;
+ overflow: hidden;
+ padding: 0;
+ position: relative;
+ width: 100%;
+}
+.tiny-pageembed--21by9 {
+ padding-top: 42.857143%;
+}
+.tiny-pageembed--16by9 {
+ padding-top: 56.25%;
+}
+.tiny-pageembed--4by3 {
+ padding-top: 75%;
+}
+.tiny-pageembed--1by1 {
+ padding-top: 100%;
+}
+.tiny-pageembed--21by9 iframe,
+.tiny-pageembed--16by9 iframe,
+.tiny-pageembed--4by3 iframe,
+.tiny-pageembed--1by1 iframe {
+ border: 0;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.mce-content-body[data-mce-placeholder] {
+ position: relative;
+}
+.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ color: rgba(34, 47, 62, 0.7);
+ content: attr(data-mce-placeholder);
+ position: absolute;
+}
+.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before {
+ left: 1px;
+}
+.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before {
+ right: 1px;
+}
+.mce-content-body div.mce-resizehandle {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+ z-index: 10000;
+}
+.mce-content-body div.mce-resizehandle:hover {
+ background-color: #4099ff;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(1) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(2) {
+ cursor: nesw-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(3) {
+ cursor: nwse-resize;
+}
+.mce-content-body div.mce-resizehandle:nth-of-type(4) {
+ cursor: nesw-resize;
+}
+.mce-content-body .mce-resize-backdrop {
+ z-index: 10000;
+}
+.mce-content-body .mce-clonedresizable {
+ cursor: default;
+ opacity: 0.5;
+ outline: 1px dashed black;
+ position: absolute;
+ z-index: 10001;
+}
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns th,
+.mce-content-body .mce-clonedresizable.mce-resizetable-columns td {
+ border: 0;
+}
+.mce-content-body .mce-resize-helper {
+ background: #555;
+ background: rgba(0, 0, 0, 0.75);
+ border: 1px;
+ border-radius: 3px;
+ color: white;
+ display: none;
+ font-family: sans-serif;
+ font-size: 12px;
+ line-height: 14px;
+ margin: 5px 10px;
+ padding: 5px;
+ position: absolute;
+ white-space: nowrap;
+ z-index: 10002;
+}
+.tox-rtc-user-selection {
+ position: relative;
+}
+.tox-rtc-user-cursor {
+ bottom: 0;
+ cursor: default;
+ position: absolute;
+ top: 0;
+ width: 2px;
+}
+.tox-rtc-user-cursor::before {
+ background-color: inherit;
+ border-radius: 50%;
+ content: '';
+ display: block;
+ height: 8px;
+ position: absolute;
+ right: -3px;
+ top: -3px;
+ width: 8px;
+}
+.tox-rtc-user-cursor:hover::after {
+ background-color: inherit;
+ border-radius: 100px;
+ box-sizing: border-box;
+ color: #fff;
+ content: attr(data-user);
+ display: block;
+ font-size: 12px;
+ font-weight: bold;
+ left: -5px;
+ min-height: 8px;
+ min-width: 8px;
+ padding: 0 12px;
+ position: absolute;
+ top: -11px;
+ white-space: nowrap;
+ z-index: 1000;
+}
+.tox-rtc-user-selection--1 .tox-rtc-user-cursor {
+ background-color: #2dc26b;
+}
+.tox-rtc-user-selection--2 .tox-rtc-user-cursor {
+ background-color: #e03e2d;
+}
+.tox-rtc-user-selection--3 .tox-rtc-user-cursor {
+ background-color: #f1c40f;
+}
+.tox-rtc-user-selection--4 .tox-rtc-user-cursor {
+ background-color: #3598db;
+}
+.tox-rtc-user-selection--5 .tox-rtc-user-cursor {
+ background-color: #b96ad9;
+}
+.tox-rtc-user-selection--6 .tox-rtc-user-cursor {
+ background-color: #e67e23;
+}
+.tox-rtc-user-selection--7 .tox-rtc-user-cursor {
+ background-color: #aaa69d;
+}
+.tox-rtc-user-selection--8 .tox-rtc-user-cursor {
+ background-color: #f368e0;
+}
+.tox-rtc-remote-image {
+ background: #eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;
+ border: 1px solid #ccc;
+ min-height: 240px;
+ min-width: 320px;
+}
+.mce-match-marker {
+ background: #aaa;
+ color: #fff;
+}
+.mce-match-marker-selected {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::-moz-selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-match-marker-selected::selection {
+ background: #39f;
+ color: #fff;
+}
+.mce-content-body img[data-mce-selected],
+.mce-content-body video[data-mce-selected],
+.mce-content-body audio[data-mce-selected],
+.mce-content-body object[data-mce-selected],
+.mce-content-body embed[data-mce-selected],
+.mce-content-body table[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body hr[data-mce-selected] {
+ outline: 3px solid #b4d7ff;
+ outline-offset: 1px;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body *[contentEditable=false][data-mce-selected] {
+ cursor: not-allowed;
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,
+.mce-content-body.mce-content-readonly *[contentEditable=true]:hover {
+ outline: none;
+}
+.mce-content-body *[data-mce-selected="inline-boundary"] {
+ background-color: #b4d7ff;
+}
+.mce-content-body .mce-edit-focus {
+ outline: 3px solid #b4d7ff;
+}
+.mce-content-body td[data-mce-selected],
+.mce-content-body th[data-mce-selected] {
+ position: relative;
+}
+.mce-content-body td[data-mce-selected]::-moz-selection,
+.mce-content-body th[data-mce-selected]::-moz-selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected]::selection,
+.mce-content-body th[data-mce-selected]::selection {
+ background: none;
+}
+.mce-content-body td[data-mce-selected] *,
+.mce-content-body th[data-mce-selected] * {
+ outline: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.mce-content-body td[data-mce-selected]::after,
+.mce-content-body th[data-mce-selected]::after {
+ background-color: rgba(180, 215, 255, 0.7);
+ border: 1px solid rgba(180, 215, 255, 0.7);
+ bottom: -1px;
+ content: '';
+ left: -1px;
+ mix-blend-mode: multiply;
+ position: absolute;
+ right: -1px;
+ top: -1px;
+}
+@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
+ .mce-content-body td[data-mce-selected]::after,
+ .mce-content-body th[data-mce-selected]::after {
+ border-color: rgba(0, 84, 180, 0.7);
+ }
+}
+.mce-content-body img::-moz-selection {
+ background: none;
+}
+.mce-content-body img::selection {
+ background: none;
+}
+.ephox-snooker-resizer-bar {
+ background-color: #b4d7ff;
+ opacity: 0;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.ephox-snooker-resizer-cols {
+ cursor: col-resize;
+}
+.ephox-snooker-resizer-rows {
+ cursor: row-resize;
+}
+.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging {
+ opacity: 1;
+}
+.mce-spellchecker-word {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+ height: 2rem;
+}
+.mce-spellchecker-grammar {
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");
+ background-position: 0 calc(100% + 1px);
+ background-repeat: repeat-x;
+ background-size: auto 6px;
+ cursor: default;
+}
+.mce-toc {
+ border: 1px solid gray;
+}
+.mce-toc h2 {
+ margin: 4px;
+}
+.mce-toc li {
+ list-style-type: none;
+}
+table[style*="border-width: 0px"],
+.mce-item-table:not([border]),
+.mce-item-table[border="0"],
+table[style*="border-width: 0px"] td,
+.mce-item-table:not([border]) td,
+.mce-item-table[border="0"] td,
+table[style*="border-width: 0px"] th,
+.mce-item-table:not([border]) th,
+.mce-item-table[border="0"] th,
+table[style*="border-width: 0px"] caption,
+.mce-item-table:not([border]) caption,
+.mce-item-table[border="0"] caption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks p,
+.mce-visualblocks h1,
+.mce-visualblocks h2,
+.mce-visualblocks h3,
+.mce-visualblocks h4,
+.mce-visualblocks h5,
+.mce-visualblocks h6,
+.mce-visualblocks div:not([data-mce-bogus]),
+.mce-visualblocks section,
+.mce-visualblocks article,
+.mce-visualblocks blockquote,
+.mce-visualblocks address,
+.mce-visualblocks pre,
+.mce-visualblocks figure,
+.mce-visualblocks figcaption,
+.mce-visualblocks hgroup,
+.mce-visualblocks aside,
+.mce-visualblocks ul,
+.mce-visualblocks ol,
+.mce-visualblocks dl {
+ background-repeat: no-repeat;
+ border: 1px dashed #bbb;
+ margin-left: 3px;
+ padding-top: 10px;
+}
+.mce-visualblocks p {
+ background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
+}
+.mce-visualblocks h1 {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
+}
+.mce-visualblocks h2 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
+}
+.mce-visualblocks h3 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
+}
+.mce-visualblocks h4 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
+}
+.mce-visualblocks h5 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
+}
+.mce-visualblocks h6 {
+ background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
+}
+.mce-visualblocks div:not([data-mce-bogus]) {
+ background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
+}
+.mce-visualblocks section {
+ background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
+}
+.mce-visualblocks article {
+ background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
+}
+.mce-visualblocks blockquote {
+ background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
+}
+.mce-visualblocks address {
+ background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
+}
+.mce-visualblocks pre {
+ background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
+}
+.mce-visualblocks figure {
+ background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
+}
+.mce-visualblocks figcaption {
+ border: 1px dashed #bbb;
+}
+.mce-visualblocks hgroup {
+ background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
+}
+.mce-visualblocks aside {
+ background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
+}
+.mce-visualblocks ul {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==);
+}
+.mce-visualblocks ol {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
+}
+.mce-visualblocks dl {
+ background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
+}
+.mce-visualblocks:not([dir=rtl]) p,
+.mce-visualblocks:not([dir=rtl]) h1,
+.mce-visualblocks:not([dir=rtl]) h2,
+.mce-visualblocks:not([dir=rtl]) h3,
+.mce-visualblocks:not([dir=rtl]) h4,
+.mce-visualblocks:not([dir=rtl]) h5,
+.mce-visualblocks:not([dir=rtl]) h6,
+.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),
+.mce-visualblocks:not([dir=rtl]) section,
+.mce-visualblocks:not([dir=rtl]) article,
+.mce-visualblocks:not([dir=rtl]) blockquote,
+.mce-visualblocks:not([dir=rtl]) address,
+.mce-visualblocks:not([dir=rtl]) pre,
+.mce-visualblocks:not([dir=rtl]) figure,
+.mce-visualblocks:not([dir=rtl]) figcaption,
+.mce-visualblocks:not([dir=rtl]) hgroup,
+.mce-visualblocks:not([dir=rtl]) aside,
+.mce-visualblocks:not([dir=rtl]) ul,
+.mce-visualblocks:not([dir=rtl]) ol,
+.mce-visualblocks:not([dir=rtl]) dl {
+ margin-left: 3px;
+}
+.mce-visualblocks[dir=rtl] p,
+.mce-visualblocks[dir=rtl] h1,
+.mce-visualblocks[dir=rtl] h2,
+.mce-visualblocks[dir=rtl] h3,
+.mce-visualblocks[dir=rtl] h4,
+.mce-visualblocks[dir=rtl] h5,
+.mce-visualblocks[dir=rtl] h6,
+.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),
+.mce-visualblocks[dir=rtl] section,
+.mce-visualblocks[dir=rtl] article,
+.mce-visualblocks[dir=rtl] blockquote,
+.mce-visualblocks[dir=rtl] address,
+.mce-visualblocks[dir=rtl] pre,
+.mce-visualblocks[dir=rtl] figure,
+.mce-visualblocks[dir=rtl] figcaption,
+.mce-visualblocks[dir=rtl] hgroup,
+.mce-visualblocks[dir=rtl] aside,
+.mce-visualblocks[dir=rtl] ul,
+.mce-visualblocks[dir=rtl] ol,
+.mce-visualblocks[dir=rtl] dl {
+ background-position-x: right;
+ margin-right: 3px;
+}
+.mce-nbsp,
+.mce-shy {
+ background: #aaa;
+}
+.mce-shy::after {
+ content: '-';
+}
diff --git a/static/css/skins-tinymce/ui/oxide/content.inline.min.css b/static/css/skins-tinymce/ui/oxide/content.inline.min.css
new file mode 100644
index 0000000..0a3d965
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide/content.inline.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:10000}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}
diff --git a/static/css/skins-tinymce/ui/oxide/content.min.css b/static/css/skins-tinymce/ui/oxide/content.min.css
new file mode 100644
index 0000000..40b3378
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide/content.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.mce-content-body .mce-item-anchor{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;cursor:default;display:inline-block;height:12px!important;padding:0 2px;-webkit-user-modify:read-only;-moz-user-modify:read-only;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;width:8px!important}.mce-content-body .mce-item-anchor[data-mce-selected]{outline-offset:1px}.tox-comments-visible .tox-comment{background-color:#fff0b7}.tox-comments-visible .tox-comment--active{background-color:#ffe168}.tox-checklist>li:not(.tox-checklist--hidden){list-style:none;margin:.25em 0}.tox-checklist>li:not(.tox-checklist--hidden)::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A");cursor:pointer;height:1em;margin-left:-1.5em;margin-top:.125em;position:absolute;width:1em}.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before{content:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A")}[dir=rtl] .tox-checklist>li:not(.tox-checklist--hidden)::before{margin-left:0;margin-right:-1.5em}code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.mce-content-body{overflow-wrap:break-word;word-wrap:break-word}.mce-content-body .mce-visual-caret{background-color:#000;background-color:currentColor;position:absolute}.mce-content-body .mce-visual-caret-hidden{display:none}.mce-content-body [data-mce-caret]{left:-1000px;margin:0;padding:0;position:absolute;right:auto;top:0}.mce-content-body .mce-offscreen-selection{left:-2000000px;max-width:1000000px;position:absolute}.mce-content-body [contentEditable=false]{cursor:default}.mce-content-body [contentEditable=true]{cursor:text}.tox-cursor-format-painter{cursor:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A"),default}.mce-content-body figure.align-left{float:left}.mce-content-body figure.align-right{float:right}.mce-content-body figure.image.align-center{display:table;margin-left:auto;margin-right:auto}.mce-preview-object{border:1px solid gray;display:inline-block;line-height:0;margin:0 2px 0 2px;position:relative}.mce-preview-object .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-object{background:transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center;border:1px dashed #aaa}.mce-pagebreak{border:1px dashed #aaa;cursor:default;display:block;height:5px;margin-top:15px;page-break-before:always;width:100%}@media print{.mce-pagebreak{border:0}}.tiny-pageembed .mce-shim{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);height:100%;left:0;position:absolute;top:0;width:100%}.tiny-pageembed[data-mce-selected="2"] .mce-shim{display:none}.tiny-pageembed{display:inline-block;position:relative}.tiny-pageembed--16by9,.tiny-pageembed--1by1,.tiny-pageembed--21by9,.tiny-pageembed--4by3{display:block;overflow:hidden;padding:0;position:relative;width:100%}.tiny-pageembed--21by9{padding-top:42.857143%}.tiny-pageembed--16by9{padding-top:56.25%}.tiny-pageembed--4by3{padding-top:75%}.tiny-pageembed--1by1{padding-top:100%}.tiny-pageembed--16by9 iframe,.tiny-pageembed--1by1 iframe,.tiny-pageembed--21by9 iframe,.tiny-pageembed--4by3 iframe{border:0;height:100%;left:0;position:absolute;top:0;width:100%}.mce-content-body[data-mce-placeholder]{position:relative}.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before{color:rgba(34,47,62,.7);content:attr(data-mce-placeholder);position:absolute}.mce-content-body:not([dir=rtl])[data-mce-placeholder]:not(.mce-visualblocks)::before{left:1px}.mce-content-body[dir=rtl][data-mce-placeholder]:not(.mce-visualblocks)::before{right:1px}.mce-content-body div.mce-resizehandle{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;height:10px;position:absolute;width:10px;z-index:10000}.mce-content-body div.mce-resizehandle:hover{background-color:#4099ff}.mce-content-body div.mce-resizehandle:nth-of-type(1){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(2){cursor:nesw-resize}.mce-content-body div.mce-resizehandle:nth-of-type(3){cursor:nwse-resize}.mce-content-body div.mce-resizehandle:nth-of-type(4){cursor:nesw-resize}.mce-content-body .mce-resize-backdrop{z-index:10000}.mce-content-body .mce-clonedresizable{cursor:default;opacity:.5;outline:1px dashed #000;position:absolute;z-index:10001}.mce-content-body .mce-clonedresizable.mce-resizetable-columns td,.mce-content-body .mce-clonedresizable.mce-resizetable-columns th{border:0}.mce-content-body .mce-resize-helper{background:#555;background:rgba(0,0,0,.75);border:1px;border-radius:3px;color:#fff;display:none;font-family:sans-serif;font-size:12px;line-height:14px;margin:5px 10px;padding:5px;position:absolute;white-space:nowrap;z-index:10002}.tox-rtc-user-selection{position:relative}.tox-rtc-user-cursor{bottom:0;cursor:default;position:absolute;top:0;width:2px}.tox-rtc-user-cursor::before{background-color:inherit;border-radius:50%;content:'';display:block;height:8px;position:absolute;right:-3px;top:-3px;width:8px}.tox-rtc-user-cursor:hover::after{background-color:inherit;border-radius:100px;box-sizing:border-box;color:#fff;content:attr(data-user);display:block;font-size:12px;font-weight:700;left:-5px;min-height:8px;min-width:8px;padding:0 12px;position:absolute;top:-11px;white-space:nowrap;z-index:1000}.tox-rtc-user-selection--1 .tox-rtc-user-cursor{background-color:#2dc26b}.tox-rtc-user-selection--2 .tox-rtc-user-cursor{background-color:#e03e2d}.tox-rtc-user-selection--3 .tox-rtc-user-cursor{background-color:#f1c40f}.tox-rtc-user-selection--4 .tox-rtc-user-cursor{background-color:#3598db}.tox-rtc-user-selection--5 .tox-rtc-user-cursor{background-color:#b96ad9}.tox-rtc-user-selection--6 .tox-rtc-user-cursor{background-color:#e67e23}.tox-rtc-user-selection--7 .tox-rtc-user-cursor{background-color:#aaa69d}.tox-rtc-user-selection--8 .tox-rtc-user-cursor{background-color:#f368e0}.tox-rtc-remote-image{background:#eaeaea url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A") no-repeat center center;border:1px solid #ccc;min-height:240px;min-width:320px}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-match-marker-selected::-moz-selection{background:#39f;color:#fff}.mce-match-marker-selected::selection{background:#39f;color:#fff}.mce-content-body audio[data-mce-selected],.mce-content-body embed[data-mce-selected],.mce-content-body img[data-mce-selected],.mce-content-body object[data-mce-selected],.mce-content-body table[data-mce-selected],.mce-content-body video[data-mce-selected]{outline:3px solid #b4d7ff}.mce-content-body hr[data-mce-selected]{outline:3px solid #b4d7ff;outline-offset:1px}.mce-content-body [contentEditable=false] [contentEditable=true]:focus{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false] [contentEditable=true]:hover{outline:3px solid #b4d7ff}.mce-content-body [contentEditable=false][data-mce-selected]{cursor:not-allowed;outline:3px solid #b4d7ff}.mce-content-body.mce-content-readonly [contentEditable=true]:focus,.mce-content-body.mce-content-readonly [contentEditable=true]:hover{outline:0}.mce-content-body [data-mce-selected=inline-boundary]{background-color:#b4d7ff}.mce-content-body .mce-edit-focus{outline:3px solid #b4d7ff}.mce-content-body td[data-mce-selected],.mce-content-body th[data-mce-selected]{position:relative}.mce-content-body td[data-mce-selected]::-moz-selection,.mce-content-body th[data-mce-selected]::-moz-selection{background:0 0}.mce-content-body td[data-mce-selected]::selection,.mce-content-body th[data-mce-selected]::selection{background:0 0}.mce-content-body td[data-mce-selected] *,.mce-content-body th[data-mce-selected] *{outline:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{background-color:rgba(180,215,255,.7);border:1px solid rgba(180,215,255,.7);bottom:-1px;content:'';left:-1px;mix-blend-mode:multiply;position:absolute;right:-1px;top:-1px}@media screen and (-ms-high-contrast:active),(-ms-high-contrast:none){.mce-content-body td[data-mce-selected]::after,.mce-content-body th[data-mce-selected]::after{border-color:rgba(0,84,180,.7)}}.mce-content-body img::-moz-selection{background:0 0}.mce-content-body img::selection{background:0 0}.ephox-snooker-resizer-bar{background-color:#b4d7ff;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:1}.mce-spellchecker-word{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default;height:2rem}.mce-spellchecker-grammar{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A");background-position:0 calc(100% + 1px);background-repeat:repeat-x;background-size:auto 6px;cursor:default}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-item-table:not([border]),.mce-item-table:not([border]) caption,.mce-item-table:not([border]) td,.mce-item-table:not([border]) th,.mce-item-table[border="0"],.mce-item-table[border="0"] caption,.mce-item-table[border="0"] td,.mce-item-table[border="0"] th,table[style*="border-width: 0px"],table[style*="border-width: 0px"] caption,table[style*="border-width: 0px"] td,table[style*="border-width: 0px"] th{border:1px dashed #bbb}.mce-visualblocks address,.mce-visualblocks article,.mce-visualblocks aside,.mce-visualblocks blockquote,.mce-visualblocks div:not([data-mce-bogus]),.mce-visualblocks dl,.mce-visualblocks figcaption,.mce-visualblocks figure,.mce-visualblocks h1,.mce-visualblocks h2,.mce-visualblocks h3,.mce-visualblocks h4,.mce-visualblocks h5,.mce-visualblocks h6,.mce-visualblocks hgroup,.mce-visualblocks ol,.mce-visualblocks p,.mce-visualblocks pre,.mce-visualblocks section,.mce-visualblocks ul{background-repeat:no-repeat;border:1px dashed #bbb;margin-left:3px;padding-top:10px}.mce-visualblocks p{background-image:url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}.mce-visualblocks h1{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}.mce-visualblocks h2{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}.mce-visualblocks h3{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}.mce-visualblocks h4{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}.mce-visualblocks h5{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}.mce-visualblocks h6{background-image:url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}.mce-visualblocks div:not([data-mce-bogus]){background-image:url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}.mce-visualblocks section{background-image:url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}.mce-visualblocks article{background-image:url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}.mce-visualblocks blockquote{background-image:url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}.mce-visualblocks address{background-image:url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}.mce-visualblocks pre{background-image:url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}.mce-visualblocks figure{background-image:url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}.mce-visualblocks figcaption{border:1px dashed #bbb}.mce-visualblocks hgroup{background-image:url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}.mce-visualblocks aside{background-image:url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}.mce-visualblocks ul{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)}.mce-visualblocks ol{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==)}.mce-visualblocks dl{background-image:url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==)}.mce-visualblocks:not([dir=rtl]) address,.mce-visualblocks:not([dir=rtl]) article,.mce-visualblocks:not([dir=rtl]) aside,.mce-visualblocks:not([dir=rtl]) blockquote,.mce-visualblocks:not([dir=rtl]) div:not([data-mce-bogus]),.mce-visualblocks:not([dir=rtl]) dl,.mce-visualblocks:not([dir=rtl]) figcaption,.mce-visualblocks:not([dir=rtl]) figure,.mce-visualblocks:not([dir=rtl]) h1,.mce-visualblocks:not([dir=rtl]) h2,.mce-visualblocks:not([dir=rtl]) h3,.mce-visualblocks:not([dir=rtl]) h4,.mce-visualblocks:not([dir=rtl]) h5,.mce-visualblocks:not([dir=rtl]) h6,.mce-visualblocks:not([dir=rtl]) hgroup,.mce-visualblocks:not([dir=rtl]) ol,.mce-visualblocks:not([dir=rtl]) p,.mce-visualblocks:not([dir=rtl]) pre,.mce-visualblocks:not([dir=rtl]) section,.mce-visualblocks:not([dir=rtl]) ul{margin-left:3px}.mce-visualblocks[dir=rtl] address,.mce-visualblocks[dir=rtl] article,.mce-visualblocks[dir=rtl] aside,.mce-visualblocks[dir=rtl] blockquote,.mce-visualblocks[dir=rtl] div:not([data-mce-bogus]),.mce-visualblocks[dir=rtl] dl,.mce-visualblocks[dir=rtl] figcaption,.mce-visualblocks[dir=rtl] figure,.mce-visualblocks[dir=rtl] h1,.mce-visualblocks[dir=rtl] h2,.mce-visualblocks[dir=rtl] h3,.mce-visualblocks[dir=rtl] h4,.mce-visualblocks[dir=rtl] h5,.mce-visualblocks[dir=rtl] h6,.mce-visualblocks[dir=rtl] hgroup,.mce-visualblocks[dir=rtl] ol,.mce-visualblocks[dir=rtl] p,.mce-visualblocks[dir=rtl] pre,.mce-visualblocks[dir=rtl] section,.mce-visualblocks[dir=rtl] ul{background-position-x:right;margin-right:3px}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}body{font-family:sans-serif}table{border-collapse:collapse}
diff --git a/static/css/skins-tinymce/ui/oxide/content.mobile.css b/static/css/skins-tinymce/ui/oxide/content.mobile.css
new file mode 100644
index 0000000..4bdb8ba
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide/content.mobile.css
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection {
+ /* Note: this file is used inside the content, so isn't part of theming */
+ background-color: green;
+ display: inline-block;
+ opacity: 0.5;
+ position: absolute;
+}
+body {
+ -webkit-text-size-adjust: none;
+}
+body img {
+ /* this is related to the content margin */
+ max-width: 96vw;
+}
+body table img {
+ max-width: 95%;
+}
+body {
+ font-family: sans-serif;
+}
+table {
+ border-collapse: collapse;
+}
diff --git a/static/css/skins-tinymce/ui/oxide/content.mobile.min.css b/static/css/skins-tinymce/ui/oxide/content.mobile.min.css
new file mode 100644
index 0000000..35f7dc0
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide/content.mobile.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse}
diff --git a/static/css/skins-tinymce/ui/oxide/fonts/tinymce-mobile.woff b/static/css/skins-tinymce/ui/oxide/fonts/tinymce-mobile.woff
new file mode 100644
index 0000000..1e3be03
Binary files /dev/null and b/static/css/skins-tinymce/ui/oxide/fonts/tinymce-mobile.woff differ
diff --git a/static/css/skins-tinymce/ui/oxide/skin.css b/static/css/skins-tinymce/ui/oxide/skin.css
new file mode 100644
index 0000000..5d1010d
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide/skin.css
@@ -0,0 +1,3029 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tox {
+ box-shadow: none;
+ box-sizing: content-box;
+ color: #222f3e;
+ cursor: auto;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: normal;
+ -webkit-tap-highlight-color: transparent;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ vertical-align: initial;
+ white-space: normal;
+}
+.tox *:not(svg):not(rect) {
+ box-sizing: inherit;
+ color: inherit;
+ cursor: inherit;
+ direction: inherit;
+ font-family: inherit;
+ font-size: inherit;
+ font-style: inherit;
+ font-weight: inherit;
+ line-height: inherit;
+ -webkit-tap-highlight-color: inherit;
+ text-align: inherit;
+ text-decoration: inherit;
+ text-shadow: inherit;
+ text-transform: inherit;
+ vertical-align: inherit;
+ white-space: inherit;
+}
+.tox *:not(svg):not(rect) {
+ /* stylelint-disable-line no-duplicate-selectors */
+ background: transparent;
+ border: 0;
+ box-shadow: none;
+ float: none;
+ height: auto;
+ margin: 0;
+ max-width: none;
+ outline: 0;
+ padding: 0;
+ position: static;
+ width: auto;
+}
+.tox:not([dir=rtl]) {
+ direction: ltr;
+ text-align: left;
+}
+.tox[dir=rtl] {
+ direction: rtl;
+ text-align: right;
+}
+.tox-tinymce {
+ border: 1px solid #cccccc;
+ border-radius: 0;
+ box-shadow: none;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ overflow: hidden;
+ position: relative;
+ visibility: inherit !important;
+}
+.tox-tinymce-inline {
+ border: none;
+ box-shadow: none;
+}
+.tox-tinymce-inline .tox-editor-header {
+ background-color: transparent;
+ border: 1px solid #cccccc;
+ border-radius: 0;
+ box-shadow: none;
+}
+.tox-tinymce-aux {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ z-index: 1300;
+}
+.tox-tinymce *:focus,
+.tox-tinymce-aux *:focus {
+ outline: none;
+}
+button::-moz-focus-inner {
+ border: 0;
+}
+.tox .accessibility-issue__header {
+ align-items: center;
+ display: flex;
+ margin-bottom: 4px;
+}
+.tox .accessibility-issue__description {
+ align-items: stretch;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ display: flex;
+ justify-content: space-between;
+}
+.tox .accessibility-issue__description > div {
+ padding-bottom: 4px;
+}
+.tox .accessibility-issue__description > div > div {
+ align-items: center;
+ display: flex;
+ margin-bottom: 4px;
+}
+.tox .accessibility-issue__description > *:last-child:not(:only-child) {
+ border-color: #cccccc;
+ border-style: solid;
+}
+.tox .accessibility-issue__repair {
+ margin-top: 16px;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description {
+ background-color: rgba(32, 122, 183, 0.1);
+ border-color: rgba(32, 122, 183, 0.4);
+ color: #222f3e;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > *:last-child {
+ border-color: rgba(32, 122, 183, 0.4);
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 {
+ color: #207ab7;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg {
+ fill: #207ab7;
+}
+.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon {
+ color: #207ab7;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description {
+ background-color: rgba(255, 165, 0, 0.1);
+ border-color: rgba(255, 165, 0, 0.5);
+ color: #222f3e;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > *:last-child {
+ border-color: rgba(255, 165, 0, 0.5);
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 {
+ color: #cc8500;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg {
+ fill: #cc8500;
+}
+.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon {
+ color: #cc8500;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description {
+ background-color: rgba(204, 0, 0, 0.1);
+ border-color: rgba(204, 0, 0, 0.4);
+ color: #222f3e;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > *:last-child {
+ border-color: rgba(204, 0, 0, 0.4);
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 {
+ color: #c00;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg {
+ fill: #c00;
+}
+.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon {
+ color: #c00;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description {
+ background-color: rgba(120, 171, 70, 0.1);
+ border-color: rgba(120, 171, 70, 0.4);
+ color: #222f3e;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > *:last-child {
+ border-color: rgba(120, 171, 70, 0.4);
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 {
+ color: #78AB46;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg {
+ fill: #78AB46;
+}
+.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon {
+ color: #78AB46;
+}
+.tox .tox-dialog__body-content .accessibility-issue__header h1,
+.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 {
+ margin-top: 0;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) {
+ margin-left: auto;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description {
+ padding: 4px 4px 4px 8px;
+}
+.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description > *:last-child {
+ border-left-width: 1px;
+ padding-left: 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) {
+ margin-right: auto;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description {
+ padding: 4px 8px 4px 4px;
+}
+.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description > *:last-child {
+ border-right-width: 1px;
+ padding-right: 4px;
+}
+.tox .tox-anchorbar {
+ display: flex;
+ flex: 0 0 auto;
+}
+.tox .tox-bar {
+ display: flex;
+ flex: 0 0 auto;
+}
+.tox .tox-button {
+ background-color: #207ab7;
+ background-image: none;
+ background-position: 0 0;
+ background-repeat: repeat;
+ border-color: #207ab7;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #fff;
+ cursor: pointer;
+ display: inline-block;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ line-height: 24px;
+ margin: 0;
+ outline: none;
+ padding: 4px 16px;
+ text-align: center;
+ text-decoration: none;
+ text-transform: capitalize;
+ white-space: nowrap;
+}
+.tox .tox-button[disabled] {
+ background-color: #207ab7;
+ background-image: none;
+ border-color: #207ab7;
+ box-shadow: none;
+ color: rgba(255, 255, 255, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-button:focus:not(:disabled) {
+ background-color: #1c6ca1;
+ background-image: none;
+ border-color: #1c6ca1;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button:hover:not(:disabled) {
+ background-color: #1c6ca1;
+ background-image: none;
+ border-color: #1c6ca1;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button:active:not(:disabled) {
+ background-color: #185d8c;
+ background-image: none;
+ border-color: #185d8c;
+ box-shadow: none;
+ color: #fff;
+}
+.tox .tox-button--secondary {
+ background-color: #f0f0f0;
+ background-image: none;
+ background-position: 0 0;
+ background-repeat: repeat;
+ border-color: #f0f0f0;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ color: #222f3e;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ outline: none;
+ padding: 4px 16px;
+ text-decoration: none;
+ text-transform: capitalize;
+}
+.tox .tox-button--secondary[disabled] {
+ background-color: #f0f0f0;
+ background-image: none;
+ border-color: #f0f0f0;
+ box-shadow: none;
+ color: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-button--secondary:focus:not(:disabled) {
+ background-color: #e3e3e3;
+ background-image: none;
+ border-color: #e3e3e3;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--secondary:hover:not(:disabled) {
+ background-color: #e3e3e3;
+ background-image: none;
+ border-color: #e3e3e3;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--secondary:active:not(:disabled) {
+ background-color: #d6d6d6;
+ background-image: none;
+ border-color: #d6d6d6;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--icon,
+.tox .tox-button.tox-button--icon,
+.tox .tox-button.tox-button--secondary.tox-button--icon {
+ padding: 4px;
+}
+.tox .tox-button--icon .tox-icon svg,
+.tox .tox-button.tox-button--icon .tox-icon svg,
+.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg {
+ display: block;
+ fill: currentColor;
+}
+.tox .tox-button-link {
+ background: 0;
+ border: none;
+ box-sizing: border-box;
+ cursor: pointer;
+ display: inline-block;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ font-weight: normal;
+ line-height: 1.3;
+ margin: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.tox .tox-button-link--sm {
+ font-size: 14px;
+}
+.tox .tox-button--naked {
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: unset;
+ color: #222f3e;
+}
+.tox .tox-button--naked[disabled] {
+ background-color: #f0f0f0;
+ border-color: #f0f0f0;
+ box-shadow: none;
+ color: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-button--naked:hover:not(:disabled) {
+ background-color: #e3e3e3;
+ border-color: #e3e3e3;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--naked:focus:not(:disabled) {
+ background-color: #e3e3e3;
+ border-color: #e3e3e3;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--naked:active:not(:disabled) {
+ background-color: #d6d6d6;
+ border-color: #d6d6d6;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-button--naked .tox-icon svg {
+ fill: currentColor;
+}
+.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) {
+ color: #222f3e;
+}
+.tox .tox-checkbox {
+ align-items: center;
+ border-radius: 3px;
+ cursor: pointer;
+ display: flex;
+ height: 36px;
+ min-width: 36px;
+}
+.tox .tox-checkbox__input {
+ /* Hide from view but visible to screen readers */
+ height: 1px;
+ overflow: hidden;
+ position: absolute;
+ top: auto;
+ width: 1px;
+}
+.tox .tox-checkbox__icons {
+ align-items: center;
+ border-radius: 3px;
+ box-shadow: 0 0 0 2px transparent;
+ box-sizing: content-box;
+ display: flex;
+ height: 24px;
+ justify-content: center;
+ padding: calc(4px - 1px);
+ width: 24px;
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: block;
+ fill: rgba(34, 47, 62, 0.3);
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ display: none;
+ fill: #207ab7;
+}
+.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ display: none;
+ fill: #207ab7;
+}
+.tox .tox-checkbox--disabled {
+ color: rgba(34, 47, 62, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: none;
+}
+.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg {
+ display: block;
+}
+.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg {
+ display: none;
+}
+.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg {
+ display: block;
+}
+.tox input.tox-checkbox__input:focus + .tox-checkbox__icons {
+ border-radius: 3px;
+ box-shadow: inset 0 0 0 1px #207ab7;
+ padding: calc(4px - 1px);
+}
+.tox:not([dir=rtl]) .tox-checkbox__label {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-checkbox__input {
+ left: -10000px;
+}
+.tox:not([dir=rtl]) .tox-bar .tox-checkbox {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-checkbox__label {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-checkbox__input {
+ right: -10000px;
+}
+.tox[dir=rtl] .tox-bar .tox-checkbox {
+ margin-right: 4px;
+}
+.tox {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox .tox-collection--toolbar .tox-collection__group {
+ display: flex;
+ padding: 0;
+}
+.tox .tox-collection--grid .tox-collection__group {
+ display: flex;
+ flex-wrap: wrap;
+ max-height: 208px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ padding: 0;
+}
+.tox .tox-collection--list .tox-collection__group {
+ border-bottom-width: 0;
+ border-color: #cccccc;
+ border-left-width: 0;
+ border-right-width: 0;
+ border-style: solid;
+ border-top-width: 1px;
+ padding: 4px 0;
+}
+.tox .tox-collection--list .tox-collection__group:first-child {
+ border-top-width: 0;
+}
+.tox .tox-collection__group-heading {
+ background-color: #e6e6e6;
+ color: rgba(34, 47, 62, 0.7);
+ cursor: default;
+ font-size: 12px;
+ font-style: normal;
+ font-weight: normal;
+ margin-bottom: 4px;
+ margin-top: -4px;
+ padding: 4px 8px;
+ text-transform: none;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.tox .tox-collection__item {
+ align-items: center;
+ color: #222f3e;
+ cursor: pointer;
+ display: flex;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.tox .tox-collection--list .tox-collection__item {
+ padding: 4px 8px;
+}
+.tox .tox-collection--toolbar .tox-collection__item {
+ border-radius: 3px;
+ padding: 4px;
+}
+.tox .tox-collection--grid .tox-collection__item {
+ border-radius: 3px;
+ padding: 4px;
+}
+.tox .tox-collection--list .tox-collection__item--enabled {
+ background-color: #fff;
+ color: #222f3e;
+}
+.tox .tox-collection--list .tox-collection__item--active {
+ background-color: #dee0e2;
+}
+.tox .tox-collection--toolbar .tox-collection__item--enabled {
+ background-color: #c8cbcf;
+ color: #222f3e;
+}
+.tox .tox-collection--toolbar .tox-collection__item--active {
+ background-color: #dee0e2;
+}
+.tox .tox-collection--grid .tox-collection__item--enabled {
+ background-color: #c8cbcf;
+ color: #222f3e;
+}
+.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ background-color: #dee0e2;
+ color: #222f3e;
+}
+.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ color: #222f3e;
+}
+.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) {
+ color: #222f3e;
+}
+.tox .tox-collection__item--state-disabled {
+ background-color: transparent;
+ color: rgba(34, 47, 62, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-collection__item-icon,
+.tox .tox-collection__item-checkmark {
+ align-items: center;
+ display: flex;
+ height: 24px;
+ justify-content: center;
+ width: 24px;
+}
+.tox .tox-collection__item-icon svg,
+.tox .tox-collection__item-checkmark svg {
+ fill: currentColor;
+}
+.tox .tox-collection--toolbar-lg .tox-collection__item-icon {
+ height: 48px;
+ width: 48px;
+}
+.tox .tox-collection__item-label {
+ color: currentColor;
+ display: inline-block;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 24px;
+ text-transform: none;
+ word-break: break-all;
+}
+.tox .tox-collection__item-accessory {
+ color: rgba(34, 47, 62, 0.7);
+ display: inline-block;
+ font-size: 14px;
+ height: 24px;
+ line-height: 24px;
+ text-transform: none;
+}
+.tox .tox-collection__item-caret {
+ align-items: center;
+ display: flex;
+ min-height: 24px;
+}
+.tox .tox-collection__item-caret::after {
+ content: '';
+ font-size: 0;
+ min-height: inherit;
+}
+.tox .tox-collection__item-caret svg {
+ fill: #222f3e;
+}
+.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg {
+ display: none;
+}
+.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory + .tox-collection__item-checkmark {
+ display: none;
+}
+.tox .tox-collection--horizontal {
+ background-color: #fff;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: nowrap;
+ margin-bottom: 0;
+ overflow-x: auto;
+ padding: 0;
+}
+.tox .tox-collection--horizontal .tox-collection__group {
+ align-items: center;
+ display: flex;
+ flex-wrap: nowrap;
+ margin: 0;
+ padding: 0 4px;
+}
+.tox .tox-collection--horizontal .tox-collection__item {
+ height: 34px;
+ margin: 2px 0 3px 0;
+ padding: 0 4px;
+}
+.tox .tox-collection--horizontal .tox-collection__item-label {
+ white-space: nowrap;
+}
+.tox .tox-collection--horizontal .tox-collection__item-caret {
+ margin-left: 4px;
+}
+.tox .tox-collection__item-container {
+ display: flex;
+}
+.tox .tox-collection__item-container--row {
+ align-items: center;
+ flex: 1 1 auto;
+ flex-direction: row;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--align-left {
+ margin-right: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--align-right {
+ justify-content: flex-end;
+ margin-left: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top {
+ align-items: flex-start;
+ margin-bottom: auto;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle {
+ align-items: center;
+}
+.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom {
+ align-items: flex-end;
+ margin-top: auto;
+}
+.tox .tox-collection__item-container--column {
+ -ms-grid-row-align: center;
+ align-self: center;
+ flex: 1 1 auto;
+ flex-direction: column;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--align-left {
+ align-items: flex-start;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--align-right {
+ align-items: flex-end;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top {
+ align-self: flex-start;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle {
+ -ms-grid-row-align: center;
+ align-self: center;
+}
+.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom {
+ align-self: flex-end;
+}
+.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) {
+ border-right: 1px solid #cccccc;
+}
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > *:not(:first-child) {
+ margin-left: 8px;
+}
+.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child {
+ margin-left: 4px;
+}
+.tox:not([dir=rtl]) .tox-collection__item-accessory {
+ margin-left: 16px;
+ text-align: right;
+}
+.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret {
+ margin-left: 16px;
+}
+.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) {
+ border-left: 1px solid #cccccc;
+}
+.tox[dir=rtl] .tox-collection--list .tox-collection__item > *:not(:first-child) {
+ margin-right: 8px;
+}
+.tox[dir=rtl] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child {
+ margin-right: 4px;
+}
+.tox[dir=rtl] .tox-collection__item-icon-rtl {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox[dir=rtl] .tox-collection__item-icon-rtl .tox-collection__item-icon svg {
+ transform: rotateY(180deg);
+}
+.tox[dir=rtl] .tox-collection__item-accessory {
+ margin-right: 16px;
+ text-align: left;
+}
+.tox[dir=rtl] .tox-collection .tox-collection__item-caret {
+ margin-right: 16px;
+ transform: rotateY(180deg);
+}
+.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret {
+ margin-right: 4px;
+}
+.tox .tox-color-picker-container {
+ display: flex;
+ flex-direction: row;
+ height: 225px;
+ margin: 0;
+}
+.tox .tox-sv-palette {
+ box-sizing: border-box;
+ display: flex;
+ height: 100%;
+}
+.tox .tox-sv-palette-spectrum {
+ height: 100%;
+}
+.tox .tox-sv-palette,
+.tox .tox-sv-palette-spectrum {
+ width: 225px;
+}
+.tox .tox-sv-palette-thumb {
+ background: none;
+ border: 1px solid black;
+ border-radius: 50%;
+ box-sizing: content-box;
+ height: 12px;
+ position: absolute;
+ width: 12px;
+}
+.tox .tox-sv-palette-inner-thumb {
+ border: 1px solid white;
+ border-radius: 50%;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+}
+.tox .tox-hue-slider {
+ box-sizing: border-box;
+ height: 100%;
+ width: 25px;
+}
+.tox .tox-hue-slider-spectrum {
+ background: linear-gradient(to bottom, #f00, #ff0080, #f0f, #8000ff, #00f, #0080ff, #0ff, #00ff80, #0f0, #80ff00, #ff0, #ff8000, #f00);
+ height: 100%;
+ width: 100%;
+}
+.tox .tox-hue-slider,
+.tox .tox-hue-slider-spectrum {
+ width: 20px;
+}
+.tox .tox-hue-slider-thumb {
+ background: white;
+ border: 1px solid black;
+ box-sizing: content-box;
+ height: 4px;
+ width: 100%;
+}
+.tox .tox-rgb-form {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+.tox .tox-rgb-form div {
+ align-items: center;
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 5px;
+ width: inherit;
+}
+.tox .tox-rgb-form input {
+ width: 6em;
+}
+.tox .tox-rgb-form input.tox-invalid {
+ /* Need !important to override Chrome's focus styling unfortunately */
+ border: 1px solid red !important;
+}
+.tox .tox-rgb-form .tox-rgba-preview {
+ border: 1px solid black;
+ flex-grow: 2;
+ margin-bottom: 0;
+}
+.tox:not([dir=rtl]) .tox-sv-palette {
+ margin-right: 15px;
+}
+.tox:not([dir=rtl]) .tox-hue-slider {
+ margin-right: 15px;
+}
+.tox:not([dir=rtl]) .tox-hue-slider-thumb {
+ margin-left: -1px;
+}
+.tox:not([dir=rtl]) .tox-rgb-form label {
+ margin-right: 0.5em;
+}
+.tox[dir=rtl] .tox-sv-palette {
+ margin-left: 15px;
+}
+.tox[dir=rtl] .tox-hue-slider {
+ margin-left: 15px;
+}
+.tox[dir=rtl] .tox-hue-slider-thumb {
+ margin-right: -1px;
+}
+.tox[dir=rtl] .tox-rgb-form label {
+ margin-left: 0.5em;
+}
+.tox .tox-toolbar .tox-swatches,
+.tox .tox-toolbar__primary .tox-swatches,
+.tox .tox-toolbar__overflow .tox-swatches {
+ margin: 2px 0 3px 4px;
+}
+.tox .tox-collection--list .tox-collection__group .tox-swatches-menu {
+ border: 0;
+ margin: -4px 0;
+}
+.tox .tox-swatches__row {
+ display: flex;
+}
+.tox .tox-swatch {
+ height: 30px;
+ transition: transform 0.15s, box-shadow 0.15s;
+ width: 30px;
+}
+.tox .tox-swatch:hover,
+.tox .tox-swatch:focus {
+ box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset;
+ transform: scale(0.8);
+}
+.tox .tox-swatch--remove {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+}
+.tox .tox-swatch--remove svg path {
+ stroke: #e74c3c;
+}
+.tox .tox-swatches__picker-btn {
+ align-items: center;
+ background-color: transparent;
+ border: 0;
+ cursor: pointer;
+ display: flex;
+ height: 30px;
+ justify-content: center;
+ outline: none;
+ padding: 0;
+ width: 30px;
+}
+.tox .tox-swatches__picker-btn svg {
+ height: 24px;
+ width: 24px;
+}
+.tox .tox-swatches__picker-btn:hover {
+ background: #dee0e2;
+}
+.tox:not([dir=rtl]) .tox-swatches__picker-btn {
+ margin-left: auto;
+}
+.tox[dir=rtl] .tox-swatches__picker-btn {
+ margin-right: auto;
+}
+.tox .tox-comment-thread {
+ background: #fff;
+ position: relative;
+}
+.tox .tox-comment-thread > *:not(:first-child) {
+ margin-top: 8px;
+}
+.tox .tox-comment {
+ background: #fff;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1);
+ padding: 8px 8px 16px 8px;
+ position: relative;
+}
+.tox .tox-comment__header {
+ align-items: center;
+ color: #222f3e;
+ display: flex;
+ justify-content: space-between;
+}
+.tox .tox-comment__date {
+ color: rgba(34, 47, 62, 0.7);
+ font-size: 12px;
+}
+.tox .tox-comment__body {
+ color: #222f3e;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ margin-top: 8px;
+ position: relative;
+ text-transform: initial;
+}
+.tox .tox-comment__body textarea {
+ resize: none;
+ white-space: normal;
+ width: 100%;
+}
+.tox .tox-comment__expander {
+ padding-top: 8px;
+}
+.tox .tox-comment__expander p {
+ color: rgba(34, 47, 62, 0.7);
+ font-size: 14px;
+ font-style: normal;
+}
+.tox .tox-comment__body p {
+ margin: 0;
+}
+.tox .tox-comment__buttonspacing {
+ padding-top: 16px;
+ text-align: center;
+}
+.tox .tox-comment-thread__overlay::after {
+ background: #fff;
+ bottom: 0;
+ content: "";
+ display: flex;
+ left: 0;
+ opacity: 0.9;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 5;
+}
+.tox .tox-comment__reply {
+ display: flex;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ margin-top: 8px;
+}
+.tox .tox-comment__reply > *:first-child {
+ margin-bottom: 8px;
+ width: 100%;
+}
+.tox .tox-comment__edit {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-end;
+ margin-top: 16px;
+}
+.tox .tox-comment__gradient::after {
+ background: linear-gradient(rgba(255, 255, 255, 0), #fff);
+ bottom: 0;
+ content: "";
+ display: block;
+ height: 5em;
+ margin-top: -40px;
+ position: absolute;
+ width: 100%;
+}
+.tox .tox-comment__overlay {
+ background: #fff;
+ bottom: 0;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ left: 0;
+ opacity: 0.9;
+ position: absolute;
+ right: 0;
+ text-align: center;
+ top: 0;
+ z-index: 5;
+}
+.tox .tox-comment__loading-text {
+ align-items: center;
+ color: #222f3e;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+}
+.tox .tox-comment__loading-text > div {
+ padding-bottom: 16px;
+}
+.tox .tox-comment__overlaytext {
+ bottom: 0;
+ flex-direction: column;
+ font-size: 14px;
+ left: 0;
+ padding: 1em;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 10;
+}
+.tox .tox-comment__overlaytext p {
+ background-color: #fff;
+ box-shadow: 0 0 8px 8px #fff;
+ color: #222f3e;
+ text-align: center;
+}
+.tox .tox-comment__overlaytext div:nth-of-type(2) {
+ font-size: 0.8em;
+}
+.tox .tox-comment__busy-spinner {
+ align-items: center;
+ background-color: #fff;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 20;
+}
+.tox .tox-comment__scroll {
+ display: flex;
+ flex-direction: column;
+ flex-shrink: 1;
+ overflow: auto;
+}
+.tox .tox-conversations {
+ margin: 8px;
+}
+.tox:not([dir=rtl]) .tox-comment__edit {
+ margin-left: 8px;
+}
+.tox:not([dir=rtl]) .tox-comment__buttonspacing > *:last-child,
+.tox:not([dir=rtl]) .tox-comment__edit > *:last-child,
+.tox:not([dir=rtl]) .tox-comment__reply > *:last-child {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-comment__edit {
+ margin-right: 8px;
+}
+.tox[dir=rtl] .tox-comment__buttonspacing > *:last-child,
+.tox[dir=rtl] .tox-comment__edit > *:last-child,
+.tox[dir=rtl] .tox-comment__reply > *:last-child {
+ margin-right: 8px;
+}
+.tox .tox-user {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-user__avatar svg {
+ fill: rgba(34, 47, 62, 0.7);
+}
+.tox .tox-user__name {
+ color: rgba(34, 47, 62, 0.7);
+ font-size: 12px;
+ font-style: normal;
+ font-weight: bold;
+ text-transform: uppercase;
+}
+.tox:not([dir=rtl]) .tox-user__avatar svg {
+ margin-right: 8px;
+}
+.tox:not([dir=rtl]) .tox-user__avatar + .tox-user__name {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-user__avatar svg {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-user__avatar + .tox-user__name {
+ margin-right: 8px;
+}
+.tox .tox-dialog-wrap {
+ align-items: center;
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: fixed;
+ right: 0;
+ top: 0;
+ z-index: 1100;
+}
+.tox .tox-dialog-wrap__backdrop {
+ background-color: rgba(255, 255, 255, 0.75);
+ bottom: 0;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 1;
+}
+.tox .tox-dialog-wrap__backdrop--opaque {
+ background-color: #fff;
+}
+.tox .tox-dialog {
+ background-color: #fff;
+ border-color: #cccccc;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: 0 16px 16px -10px rgba(34, 47, 62, 0.15), 0 0 40px 1px rgba(34, 47, 62, 0.15);
+ display: flex;
+ flex-direction: column;
+ max-height: 100%;
+ max-width: 480px;
+ overflow: hidden;
+ position: relative;
+ width: 95vw;
+ z-index: 2;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog {
+ align-self: flex-start;
+ margin: 8px auto;
+ width: calc(100vw - 16px);
+ }
+}
+.tox .tox-dialog-inline {
+ z-index: 1100;
+}
+.tox .tox-dialog__header {
+ align-items: center;
+ background-color: #fff;
+ border-bottom: none;
+ color: #222f3e;
+ display: flex;
+ font-size: 16px;
+ justify-content: space-between;
+ padding: 8px 16px 0 16px;
+ position: relative;
+}
+.tox .tox-dialog__header .tox-button {
+ z-index: 1;
+}
+.tox .tox-dialog__draghandle {
+ cursor: grab;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tox .tox-dialog__draghandle:active {
+ cursor: grabbing;
+}
+.tox .tox-dialog__dismiss {
+ margin-left: auto;
+}
+.tox .tox-dialog__title {
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ margin: 0;
+ text-transform: none;
+}
+.tox .tox-dialog__body {
+ color: #222f3e;
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ min-width: 0;
+ text-align: left;
+ text-transform: none;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog__body {
+ flex-direction: column;
+ }
+}
+.tox .tox-dialog__body-nav {
+ align-items: flex-start;
+ display: flex;
+ flex-direction: column;
+ padding: 16px 16px;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox .tox-dialog__body-nav {
+ flex-direction: row;
+ -webkit-overflow-scrolling: touch;
+ overflow-x: auto;
+ padding-bottom: 0;
+ }
+}
+.tox .tox-dialog__body-nav-item {
+ border-bottom: 2px solid transparent;
+ color: rgba(34, 47, 62, 0.7);
+ display: inline-block;
+ font-size: 14px;
+ line-height: 1.3;
+ margin-bottom: 8px;
+ text-decoration: none;
+ white-space: nowrap;
+}
+.tox .tox-dialog__body-nav-item:focus {
+ background-color: rgba(32, 122, 183, 0.1);
+}
+.tox .tox-dialog__body-nav-item--active {
+ border-bottom: 2px solid #207ab7;
+ color: #207ab7;
+}
+.tox .tox-dialog__body-content {
+ box-sizing: border-box;
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ -ms-flex-preferred-size: auto;
+ max-height: 650px;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+ padding: 16px 16px;
+}
+.tox .tox-dialog__body-content > * {
+ margin-bottom: 0;
+ margin-top: 16px;
+}
+.tox .tox-dialog__body-content > *:first-child {
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content > *:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-dialog__body-content > *:only-child {
+ margin-bottom: 0;
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content a {
+ color: #207ab7;
+ cursor: pointer;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content a:hover,
+.tox .tox-dialog__body-content a:focus {
+ color: #185d8c;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content a:active {
+ color: #185d8c;
+ text-decoration: none;
+}
+.tox .tox-dialog__body-content svg {
+ fill: #222f3e;
+}
+.tox .tox-dialog__body-content ul {
+ display: block;
+ list-style-type: disc;
+ margin-bottom: 16px;
+ -webkit-margin-end: 0;
+ margin-inline-end: 0;
+ -webkit-margin-start: 0;
+ margin-inline-start: 0;
+ -webkit-padding-start: 2.5rem;
+ padding-inline-start: 2.5rem;
+}
+.tox .tox-dialog__body-content .tox-form__group h1 {
+ color: #222f3e;
+ font-size: 20px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ margin-bottom: 16px;
+ margin-top: 2rem;
+ text-transform: none;
+}
+.tox .tox-dialog__body-content .tox-form__group h2 {
+ color: #222f3e;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: bold;
+ letter-spacing: normal;
+ margin-bottom: 16px;
+ margin-top: 2rem;
+ text-transform: none;
+}
+.tox .tox-dialog__body-content .tox-form__group p {
+ margin-bottom: 16px;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:first-child,
+.tox .tox-dialog__body-content .tox-form__group h2:first-child,
+.tox .tox-dialog__body-content .tox-form__group p:first-child {
+ margin-top: 0;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:last-child,
+.tox .tox-dialog__body-content .tox-form__group h2:last-child,
+.tox .tox-dialog__body-content .tox-form__group p:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-dialog__body-content .tox-form__group h1:only-child,
+.tox .tox-dialog__body-content .tox-form__group h2:only-child,
+.tox .tox-dialog__body-content .tox-form__group p:only-child {
+ margin-bottom: 0;
+ margin-top: 0;
+}
+.tox .tox-dialog--width-lg {
+ height: 650px;
+ max-width: 1200px;
+}
+.tox .tox-dialog--width-md {
+ max-width: 800px;
+}
+.tox .tox-dialog--width-md .tox-dialog__body-content {
+ overflow: auto;
+}
+.tox .tox-dialog__body-content--centered {
+ text-align: center;
+}
+.tox .tox-dialog__footer {
+ align-items: center;
+ background-color: #fff;
+ border-top: 1px solid #cccccc;
+ display: flex;
+ justify-content: space-between;
+ padding: 8px 16px;
+}
+.tox .tox-dialog__footer-start,
+.tox .tox-dialog__footer-end {
+ display: flex;
+}
+.tox .tox-dialog__busy-spinner {
+ align-items: center;
+ background-color: rgba(255, 255, 255, 0.75);
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+ z-index: 3;
+}
+.tox .tox-dialog__table {
+ border-collapse: collapse;
+ width: 100%;
+}
+.tox .tox-dialog__table thead th {
+ font-weight: bold;
+ padding-bottom: 8px;
+}
+.tox .tox-dialog__table tbody tr {
+ border-bottom: 1px solid #cccccc;
+}
+.tox .tox-dialog__table tbody tr:last-child {
+ border-bottom: none;
+}
+.tox .tox-dialog__table td {
+ padding-bottom: 8px;
+ padding-top: 8px;
+}
+.tox .tox-dialog__popups {
+ position: absolute;
+ width: 100%;
+ z-index: 1100;
+}
+.tox .tox-dialog__body-iframe {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-dialog__body-iframe .tox-navobj {
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) {
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+ height: 100%;
+}
+.tox .tox-dialog-dock-fadeout {
+ opacity: 0;
+ visibility: hidden;
+}
+.tox .tox-dialog-dock-fadein {
+ opacity: 1;
+ visibility: visible;
+}
+.tox .tox-dialog-dock-transition {
+ transition: visibility 0s linear 0.3s, opacity 0.3s ease;
+}
+.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein {
+ transition-delay: 0s;
+}
+.tox.tox-platform-ie {
+ /* IE11 CSS styles go here */
+}
+.tox.tox-platform-ie .tox-dialog-wrap {
+ position: -ms-device-fixed;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav {
+ margin-right: 0;
+ }
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child) {
+ margin-left: 8px;
+ }
+}
+.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start > *,
+.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end > * {
+ margin-left: 8px;
+}
+.tox[dir=rtl] .tox-dialog__body {
+ text-align: right;
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav {
+ margin-left: 0;
+ }
+}
+@media only screen and (max-width:767px) {
+ body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child) {
+ margin-right: 8px;
+ }
+}
+.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start > *,
+.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end > * {
+ margin-right: 8px;
+}
+body.tox-dialog__disable-scroll {
+ overflow: hidden;
+}
+.tox .tox-dropzone-container {
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-dropzone {
+ align-items: center;
+ background: #fff;
+ border: 2px dashed #cccccc;
+ box-sizing: border-box;
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ justify-content: center;
+ min-height: 100px;
+ padding: 10px;
+}
+.tox .tox-dropzone p {
+ color: rgba(34, 47, 62, 0.7);
+ margin: 0 0 16px 0;
+}
+.tox .tox-edit-area {
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+ overflow: hidden;
+ position: relative;
+}
+.tox .tox-edit-area__iframe {
+ background-color: #fff;
+ border: 0;
+ box-sizing: border-box;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+ height: 100%;
+ position: absolute;
+ width: 100%;
+}
+.tox.tox-inline-edit-area {
+ border: 1px dotted #cccccc;
+}
+.tox .tox-editor-container {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ overflow: hidden;
+}
+.tox .tox-editor-header {
+ z-index: 1;
+}
+.tox:not(.tox-tinymce-inline) .tox-editor-header {
+ box-shadow: none;
+ transition: box-shadow 0.5s;
+}
+.tox.tox-tinymce--toolbar-bottom .tox-editor-header,
+.tox.tox-tinymce-inline .tox-editor-header {
+ margin-bottom: -1px;
+}
+.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header {
+ background-color: transparent;
+ box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25);
+}
+.tox-editor-dock-fadeout {
+ opacity: 0;
+ visibility: hidden;
+}
+.tox-editor-dock-fadein {
+ opacity: 1;
+ visibility: visible;
+}
+.tox-editor-dock-transition {
+ transition: visibility 0s linear 0.25s, opacity 0.25s ease;
+}
+.tox-editor-dock-transition.tox-editor-dock-fadein {
+ transition-delay: 0s;
+}
+.tox .tox-control-wrap {
+ flex: 1;
+ position: relative;
+}
+.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,
+.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,
+.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid {
+ display: none;
+}
+.tox .tox-control-wrap svg {
+ display: block;
+}
+.tox .tox-control-wrap__status-icon-wrap {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-control-wrap__status-icon-invalid svg {
+ fill: #c00;
+}
+.tox .tox-control-wrap__status-icon-unknown svg {
+ fill: orange;
+}
+.tox .tox-control-wrap__status-icon-valid svg {
+ fill: green;
+}
+.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,
+.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,
+.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield {
+ padding-right: 32px;
+}
+.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap {
+ right: 4px;
+}
+.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,
+.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,
+.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield {
+ padding-left: 32px;
+}
+.tox[dir=rtl] .tox-control-wrap__status-icon-wrap {
+ left: 4px;
+}
+.tox .tox-autocompleter {
+ max-width: 25em;
+}
+.tox .tox-autocompleter .tox-menu {
+ max-width: 25em;
+}
+.tox .tox-autocompleter .tox-autocompleter-highlight {
+ font-weight: bold;
+}
+.tox .tox-color-input {
+ display: flex;
+ position: relative;
+ z-index: 1;
+}
+.tox .tox-color-input .tox-textfield {
+ z-index: -1;
+}
+.tox .tox-color-input span {
+ border-color: rgba(34, 47, 62, 0.2);
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ height: 24px;
+ position: absolute;
+ top: 6px;
+ width: 24px;
+}
+.tox .tox-color-input span:hover:not([aria-disabled=true]),
+.tox .tox-color-input span:focus:not([aria-disabled=true]) {
+ border-color: #207ab7;
+ cursor: pointer;
+}
+.tox .tox-color-input span::before {
+ background-image: linear-gradient(45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), linear-gradient(-45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%), linear-gradient(-45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%);
+ background-position: 0 0, 0 6px, 6px -6px, -6px 0;
+ background-size: 12px 12px;
+ border: 1px solid #fff;
+ border-radius: 3px;
+ box-sizing: border-box;
+ content: '';
+ height: 24px;
+ left: -1px;
+ position: absolute;
+ top: -1px;
+ width: 24px;
+ z-index: -1;
+}
+.tox .tox-color-input span[aria-disabled=true] {
+ cursor: not-allowed;
+}
+.tox:not([dir=rtl]) .tox-color-input {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox:not([dir=rtl]) .tox-color-input .tox-textfield {
+ padding-left: 36px;
+}
+.tox:not([dir=rtl]) .tox-color-input span {
+ left: 6px;
+}
+.tox[dir="rtl"] .tox-color-input {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox[dir="rtl"] .tox-color-input .tox-textfield {
+ padding-right: 36px;
+}
+.tox[dir="rtl"] .tox-color-input span {
+ right: 6px;
+}
+.tox .tox-label,
+.tox .tox-toolbar-label {
+ color: rgba(34, 47, 62, 0.7);
+ display: block;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.3;
+ padding: 0 8px 0 0;
+ text-transform: none;
+ white-space: nowrap;
+}
+.tox .tox-toolbar-label {
+ padding: 0 8px;
+}
+.tox[dir=rtl] .tox-label {
+ padding: 0 0 0 8px;
+}
+.tox .tox-form {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-form__group {
+ box-sizing: border-box;
+ margin-bottom: 4px;
+}
+.tox .tox-form-group--maximize {
+ flex: 1;
+}
+.tox .tox-form__group--error {
+ color: #c00;
+}
+.tox .tox-form__group--collection {
+ display: flex;
+}
+.tox .tox-form__grid {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: space-between;
+}
+.tox .tox-form__grid--2col > .tox-form__group {
+ width: calc(50% - (8px / 2));
+}
+.tox .tox-form__grid--3col > .tox-form__group {
+ width: calc(100% / 3 - (8px / 2));
+}
+.tox .tox-form__grid--4col > .tox-form__group {
+ width: calc(25% - (8px / 2));
+}
+.tox .tox-form__controls-h-stack {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-form__group--inline {
+ align-items: center;
+ display: flex;
+}
+.tox .tox-form__group--stretched {
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-form__group--stretched .tox-textarea {
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-form__group--stretched .tox-navobj {
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-form__group--stretched .tox-navobj :nth-child(2) {
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+ height: 100%;
+}
+.tox:not([dir=rtl]) .tox-form__controls-h-stack > *:not(:first-child) {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-form__controls-h-stack > *:not(:first-child) {
+ margin-right: 4px;
+}
+.tox .tox-lock.tox-locked .tox-lock-icon__unlock,
+.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock {
+ display: none;
+}
+.tox .tox-textfield,
+.tox .tox-toolbar-textfield,
+.tox .tox-listboxfield .tox-listbox--select,
+.tox .tox-textarea {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #fff;
+ border-color: #cccccc;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #222f3e;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ margin: 0;
+ min-height: 34px;
+ outline: none;
+ padding: 5px 4.75px;
+ resize: none;
+ width: 100%;
+}
+.tox .tox-textfield[disabled],
+.tox .tox-textarea[disabled] {
+ background-color: #f2f2f2;
+ color: rgba(34, 47, 62, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-textfield:focus,
+.tox .tox-listboxfield .tox-listbox--select:focus,
+.tox .tox-textarea:focus {
+ background-color: #fff;
+ border-color: #207ab7;
+ box-shadow: none;
+ outline: none;
+}
+.tox .tox-toolbar-textfield {
+ border-width: 0;
+ margin-bottom: 3px;
+ margin-top: 2px;
+ max-width: 250px;
+}
+.tox .tox-naked-btn {
+ background-color: transparent;
+ border: 0;
+ border-color: transparent;
+ box-shadow: unset;
+ color: #207ab7;
+ cursor: pointer;
+ display: block;
+ margin: 0;
+ padding: 0;
+}
+.tox .tox-naked-btn svg {
+ display: block;
+ fill: #222f3e;
+}
+.tox:not([dir=rtl]) .tox-toolbar-textfield + * {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-toolbar-textfield + * {
+ margin-right: 4px;
+}
+.tox .tox-listboxfield {
+ cursor: pointer;
+ position: relative;
+}
+.tox .tox-listboxfield .tox-listbox--select[disabled] {
+ background-color: #f2f2f2;
+ color: rgba(34, 47, 62, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-listbox__select-label {
+ cursor: default;
+ flex: 1;
+ margin: 0 4px;
+}
+.tox .tox-listbox__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+}
+.tox .tox-listbox__select-chevron svg {
+ fill: #222f3e;
+}
+.tox .tox-listboxfield .tox-listbox--select {
+ align-items: center;
+ display: flex;
+}
+.tox:not([dir=rtl]) .tox-listboxfield svg {
+ right: 8px;
+}
+.tox[dir=rtl] .tox-listboxfield svg {
+ left: 8px;
+}
+.tox .tox-selectfield {
+ cursor: pointer;
+ position: relative;
+}
+.tox .tox-selectfield select {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ background-color: #fff;
+ border-color: #cccccc;
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ color: #222f3e;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ line-height: 24px;
+ margin: 0;
+ min-height: 34px;
+ outline: none;
+ padding: 5px 4.75px;
+ resize: none;
+ width: 100%;
+}
+.tox .tox-selectfield select[disabled] {
+ background-color: #f2f2f2;
+ color: rgba(34, 47, 62, 0.85);
+ cursor: not-allowed;
+}
+.tox .tox-selectfield select::-ms-expand {
+ display: none;
+}
+.tox .tox-selectfield select:focus {
+ background-color: #fff;
+ border-color: #207ab7;
+ box-shadow: none;
+ outline: none;
+}
+.tox .tox-selectfield svg {
+ pointer-events: none;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox:not([dir=rtl]) .tox-selectfield select[size="0"],
+.tox:not([dir=rtl]) .tox-selectfield select[size="1"] {
+ padding-right: 24px;
+}
+.tox:not([dir=rtl]) .tox-selectfield svg {
+ right: 8px;
+}
+.tox[dir=rtl] .tox-selectfield select[size="0"],
+.tox[dir=rtl] .tox-selectfield select[size="1"] {
+ padding-left: 24px;
+}
+.tox[dir=rtl] .tox-selectfield svg {
+ left: 8px;
+}
+.tox .tox-textarea {
+ -webkit-appearance: textarea;
+ -moz-appearance: textarea;
+ appearance: textarea;
+ white-space: pre-wrap;
+}
+.tox-fullscreen {
+ border: 0;
+ height: 100%;
+ left: 0;
+ margin: 0;
+ overflow: hidden;
+ -ms-scroll-chaining: none;
+ overscroll-behavior: none;
+ padding: 0;
+ position: fixed;
+ top: 0;
+ touch-action: pinch-zoom;
+ width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+ display: none;
+}
+.tox.tox-tinymce.tox-fullscreen {
+ background-color: transparent;
+ z-index: 1200;
+}
+.tox-shadowhost.tox-fullscreen {
+ z-index: 1200;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+ z-index: 1201;
+}
+.tox .tox-help__more-link {
+ list-style: none;
+ margin-top: 1em;
+}
+.tox .tox-image-tools {
+ width: 100%;
+}
+.tox .tox-image-tools__toolbar {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+}
+.tox .tox-image-tools__image {
+ background-color: #666;
+ height: 380px;
+ overflow: auto;
+ position: relative;
+ width: 100%;
+}
+.tox .tox-image-tools__image,
+.tox .tox-image-tools__image + .tox-image-tools__toolbar {
+ margin-top: 8px;
+}
+.tox .tox-image-tools__image-bg {
+ background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==);
+}
+.tox .tox-image-tools__toolbar > .tox-spacer {
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-croprect-block {
+ background: black;
+ filter: alpha(opacity=50);
+ opacity: 0.5;
+ position: absolute;
+ zoom: 1;
+}
+.tox .tox-croprect-handle {
+ border: 2px solid white;
+ height: 20px;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 20px;
+}
+.tox .tox-croprect-handle-move {
+ border: 0;
+ cursor: move;
+ position: absolute;
+}
+.tox .tox-croprect-handle-nw {
+ border-width: 2px 0 0 2px;
+ cursor: nw-resize;
+ left: 100px;
+ margin: -2px 0 0 -2px;
+ top: 100px;
+}
+.tox .tox-croprect-handle-ne {
+ border-width: 2px 2px 0 0;
+ cursor: ne-resize;
+ left: 200px;
+ margin: -2px 0 0 -20px;
+ top: 100px;
+}
+.tox .tox-croprect-handle-sw {
+ border-width: 0 0 2px 2px;
+ cursor: sw-resize;
+ left: 100px;
+ margin: -20px 2px 0 -2px;
+ top: 200px;
+}
+.tox .tox-croprect-handle-se {
+ border-width: 0 2px 2px 0;
+ cursor: se-resize;
+ left: 200px;
+ margin: -20px 0 0 -20px;
+ top: 200px;
+}
+.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-slider:not(:first-of-type) {
+ margin-left: 8px;
+}
+.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-button + .tox-slider {
+ margin-left: 32px;
+}
+.tox:not([dir=rtl]) .tox-image-tools__toolbar > .tox-slider + .tox-button {
+ margin-left: 32px;
+}
+.tox[dir=rtl] .tox-image-tools__toolbar > .tox-slider:not(:first-of-type) {
+ margin-right: 8px;
+}
+.tox[dir=rtl] .tox-image-tools__toolbar > .tox-button + .tox-slider {
+ margin-right: 32px;
+}
+.tox[dir=rtl] .tox-image-tools__toolbar > .tox-slider + .tox-button {
+ margin-right: 32px;
+}
+.tox .tox-insert-table-picker {
+ display: flex;
+ flex-wrap: wrap;
+ width: 170px;
+}
+.tox .tox-insert-table-picker > div {
+ border-color: #cccccc;
+ border-style: solid;
+ border-width: 0 1px 1px 0;
+ box-sizing: border-box;
+ height: 17px;
+ width: 17px;
+}
+.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker {
+ margin: -4px 0;
+}
+.tox .tox-insert-table-picker .tox-insert-table-picker__selected {
+ background-color: rgba(32, 122, 183, 0.5);
+ border-color: rgba(32, 122, 183, 0.5);
+}
+.tox .tox-insert-table-picker__label {
+ color: rgba(34, 47, 62, 0.7);
+ display: block;
+ font-size: 14px;
+ padding: 4px;
+ text-align: center;
+ width: 100%;
+}
+.tox:not([dir=rtl]) {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox:not([dir=rtl]) .tox-insert-table-picker > div:nth-child(10n) {
+ border-right: 0;
+}
+.tox[dir=rtl] {
+ /* stylelint-disable-next-line no-descending-specificity */
+}
+.tox[dir=rtl] .tox-insert-table-picker > div:nth-child(10n+1) {
+ border-right: 0;
+}
+.tox {
+ /* stylelint-disable */
+ /* stylelint-enable */
+}
+.tox .tox-menu {
+ background-color: #fff;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1);
+ display: inline-block;
+ overflow: hidden;
+ vertical-align: top;
+ z-index: 1150;
+}
+.tox .tox-menu.tox-collection.tox-collection--list {
+ padding: 0;
+}
+.tox .tox-menu.tox-collection.tox-collection--toolbar {
+ padding: 4px;
+}
+.tox .tox-menu.tox-collection.tox-collection--grid {
+ padding: 4px;
+}
+.tox .tox-menu__label h1,
+.tox .tox-menu__label h2,
+.tox .tox-menu__label h3,
+.tox .tox-menu__label h4,
+.tox .tox-menu__label h5,
+.tox .tox-menu__label h6,
+.tox .tox-menu__label p,
+.tox .tox-menu__label blockquote,
+.tox .tox-menu__label code {
+ margin: 0;
+}
+.tox .tox-menubar {
+ background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;
+ background-color: #fff;
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ padding: 0 4px 0 4px;
+}
+.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar {
+ border-top: 1px solid #cccccc;
+}
+/* Deprecated. Remove in next major release */
+.tox .tox-mbtn {
+ align-items: center;
+ background: transparent;
+ border: 0;
+ border-radius: 3px;
+ box-shadow: none;
+ color: #222f3e;
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ height: 34px;
+ justify-content: center;
+ margin: 2px 0 3px 0;
+ outline: none;
+ overflow: hidden;
+ padding: 0 4px;
+ text-transform: none;
+ width: auto;
+}
+.tox .tox-mbtn[disabled] {
+ background-color: transparent;
+ border: 0;
+ box-shadow: none;
+ color: rgba(34, 47, 62, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-mbtn:focus:not(:disabled) {
+ background: #dee0e2;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-mbtn--active {
+ background: #c8cbcf;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) {
+ background: #dee0e2;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-mbtn__select-label {
+ cursor: default;
+ font-weight: normal;
+ margin: 0 4px;
+}
+.tox .tox-mbtn[disabled] .tox-mbtn__select-label {
+ cursor: not-allowed;
+}
+.tox .tox-mbtn__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+ display: none;
+}
+.tox .tox-notification {
+ border-radius: 3px;
+ border-style: solid;
+ border-width: 1px;
+ box-shadow: none;
+ box-sizing: border-box;
+ display: -ms-grid;
+ display: grid;
+ font-size: 14px;
+ font-weight: normal;
+ -ms-grid-columns: minmax(40px, 1fr) auto minmax(40px, 1fr);
+ grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr);
+ margin-top: 4px;
+ opacity: 0;
+ padding: 4px;
+ transition: transform 100ms ease-in, opacity 150ms ease-in;
+}
+.tox .tox-notification p {
+ font-size: 14px;
+ font-weight: normal;
+}
+.tox .tox-notification a {
+ text-decoration: underline;
+}
+.tox .tox-notification--in {
+ opacity: 1;
+}
+.tox .tox-notification--success {
+ background-color: #e4eeda;
+ border-color: #d7e6c8;
+ color: #222f3e;
+}
+.tox .tox-notification--success p {
+ color: #222f3e;
+}
+.tox .tox-notification--success a {
+ color: #547831;
+}
+.tox .tox-notification--success svg {
+ fill: #222f3e;
+}
+.tox .tox-notification--error {
+ background-color: #f8dede;
+ border-color: #f2bfbf;
+ color: #222f3e;
+}
+.tox .tox-notification--error p {
+ color: #222f3e;
+}
+.tox .tox-notification--error a {
+ color: #c00;
+}
+.tox .tox-notification--error svg {
+ fill: #222f3e;
+}
+.tox .tox-notification--warn,
+.tox .tox-notification--warning {
+ background-color: #fffaea;
+ border-color: #ffe89d;
+ color: #222f3e;
+}
+.tox .tox-notification--warn p,
+.tox .tox-notification--warning p {
+ color: #222f3e;
+}
+.tox .tox-notification--warn a,
+.tox .tox-notification--warning a {
+ color: #222f3e;
+}
+.tox .tox-notification--warn svg,
+.tox .tox-notification--warning svg {
+ fill: #222f3e;
+}
+.tox .tox-notification--info {
+ background-color: #d9edf7;
+ border-color: #779ecb;
+ color: #222f3e;
+}
+.tox .tox-notification--info p {
+ color: #222f3e;
+}
+.tox .tox-notification--info a {
+ color: #222f3e;
+}
+.tox .tox-notification--info svg {
+ fill: #222f3e;
+}
+.tox .tox-notification__body {
+ -ms-grid-row-align: center;
+ align-self: center;
+ color: #222f3e;
+ font-size: 14px;
+ -ms-grid-column-span: 1;
+ grid-column-end: 3;
+ -ms-grid-column: 2;
+ grid-column-start: 2;
+ -ms-grid-row-span: 1;
+ grid-row-end: 2;
+ -ms-grid-row: 1;
+ grid-row-start: 1;
+ text-align: center;
+ white-space: normal;
+ word-break: break-all;
+ word-break: break-word;
+}
+.tox .tox-notification__body > * {
+ margin: 0;
+}
+.tox .tox-notification__body > * + * {
+ margin-top: 1rem;
+}
+.tox .tox-notification__icon {
+ -ms-grid-row-align: center;
+ align-self: center;
+ -ms-grid-column-span: 1;
+ grid-column-end: 2;
+ -ms-grid-column: 1;
+ grid-column-start: 1;
+ -ms-grid-row-span: 1;
+ grid-row-end: 2;
+ -ms-grid-row: 1;
+ grid-row-start: 1;
+ -ms-grid-column-align: end;
+ justify-self: end;
+}
+.tox .tox-notification__icon svg {
+ display: block;
+}
+.tox .tox-notification__dismiss {
+ -ms-grid-row-align: start;
+ align-self: start;
+ -ms-grid-column-span: 1;
+ grid-column-end: 4;
+ -ms-grid-column: 3;
+ grid-column-start: 3;
+ -ms-grid-row-span: 1;
+ grid-row-end: 2;
+ -ms-grid-row: 1;
+ grid-row-start: 1;
+ -ms-grid-column-align: end;
+ justify-self: end;
+}
+.tox .tox-notification .tox-progress-bar {
+ -ms-grid-column-span: 3;
+ grid-column-end: 4;
+ -ms-grid-column: 1;
+ grid-column-start: 1;
+ -ms-grid-row-span: 1;
+ grid-row-end: 3;
+ -ms-grid-row: 2;
+ grid-row-start: 2;
+ -ms-grid-column-align: center;
+ justify-self: center;
+}
+.tox .tox-pop {
+ display: inline-block;
+ position: relative;
+}
+.tox .tox-pop--resizing {
+ transition: width 0.1s ease;
+}
+.tox .tox-pop--resizing .tox-toolbar {
+ flex-wrap: nowrap;
+}
+.tox .tox-pop__dialog {
+ background-color: #fff;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
+ min-width: 0;
+ overflow: hidden;
+}
+.tox .tox-pop__dialog > *:not(.tox-toolbar) {
+ margin: 4px 4px 4px 8px;
+}
+.tox .tox-pop__dialog .tox-toolbar {
+ background-color: transparent;
+ margin-bottom: -1px;
+}
+.tox .tox-pop::before,
+.tox .tox-pop::after {
+ border-style: solid;
+ content: '';
+ display: block;
+ height: 0;
+ position: absolute;
+ width: 0;
+}
+.tox .tox-pop.tox-pop--bottom::before,
+.tox .tox-pop.tox-pop--bottom::after {
+ left: 50%;
+ top: 100%;
+}
+.tox .tox-pop.tox-pop--bottom::after {
+ border-color: #fff transparent transparent transparent;
+ border-width: 8px;
+ margin-left: -8px;
+ margin-top: -1px;
+}
+.tox .tox-pop.tox-pop--bottom::before {
+ border-color: #cccccc transparent transparent transparent;
+ border-width: 9px;
+ margin-left: -9px;
+}
+.tox .tox-pop.tox-pop--top::before,
+.tox .tox-pop.tox-pop--top::after {
+ left: 50%;
+ top: 0;
+ transform: translateY(-100%);
+}
+.tox .tox-pop.tox-pop--top::after {
+ border-color: transparent transparent #fff transparent;
+ border-width: 8px;
+ margin-left: -8px;
+ margin-top: 1px;
+}
+.tox .tox-pop.tox-pop--top::before {
+ border-color: transparent transparent #cccccc transparent;
+ border-width: 9px;
+ margin-left: -9px;
+}
+.tox .tox-pop.tox-pop--left::before,
+.tox .tox-pop.tox-pop--left::after {
+ left: 0;
+ top: calc(50% - 1px);
+ transform: translateY(-50%);
+}
+.tox .tox-pop.tox-pop--left::after {
+ border-color: transparent #fff transparent transparent;
+ border-width: 8px;
+ margin-left: -15px;
+}
+.tox .tox-pop.tox-pop--left::before {
+ border-color: transparent #cccccc transparent transparent;
+ border-width: 10px;
+ margin-left: -19px;
+}
+.tox .tox-pop.tox-pop--right::before,
+.tox .tox-pop.tox-pop--right::after {
+ left: 100%;
+ top: calc(50% + 1px);
+ transform: translateY(-50%);
+}
+.tox .tox-pop.tox-pop--right::after {
+ border-color: transparent transparent transparent #fff;
+ border-width: 8px;
+ margin-left: -1px;
+}
+.tox .tox-pop.tox-pop--right::before {
+ border-color: transparent transparent transparent #cccccc;
+ border-width: 10px;
+ margin-left: -1px;
+}
+.tox .tox-pop.tox-pop--align-left::before,
+.tox .tox-pop.tox-pop--align-left::after {
+ left: 20px;
+}
+.tox .tox-pop.tox-pop--align-right::before,
+.tox .tox-pop.tox-pop--align-right::after {
+ left: calc(100% - 20px);
+}
+.tox .tox-sidebar-wrap {
+ display: flex;
+ flex-direction: row;
+ flex-grow: 1;
+ -ms-flex-preferred-size: 0;
+ min-height: 0;
+}
+.tox .tox-sidebar {
+ background-color: #fff;
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+}
+.tox .tox-sidebar__slider {
+ display: flex;
+ overflow: hidden;
+}
+.tox .tox-sidebar__pane-container {
+ display: flex;
+}
+.tox .tox-sidebar__pane {
+ display: flex;
+}
+.tox .tox-sidebar--sliding-closed {
+ opacity: 0;
+}
+.tox .tox-sidebar--sliding-open {
+ opacity: 1;
+}
+.tox .tox-sidebar--sliding-growing,
+.tox .tox-sidebar--sliding-shrinking {
+ transition: width 0.5s ease, opacity 0.5s ease;
+}
+.tox .tox-selector {
+ background-color: #4099ff;
+ border-color: #4099ff;
+ border-style: solid;
+ border-width: 1px;
+ box-sizing: border-box;
+ display: inline-block;
+ height: 10px;
+ position: absolute;
+ width: 10px;
+}
+.tox.tox-platform-touch .tox-selector {
+ height: 12px;
+ width: 12px;
+}
+.tox .tox-slider {
+ align-items: center;
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+ height: 24px;
+ justify-content: center;
+ position: relative;
+}
+.tox .tox-slider__rail {
+ background-color: transparent;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ height: 10px;
+ min-width: 120px;
+ width: 100%;
+}
+.tox .tox-slider__handle {
+ background-color: #207ab7;
+ border: 2px solid #185d8c;
+ border-radius: 3px;
+ box-shadow: none;
+ height: 24px;
+ left: 50%;
+ position: absolute;
+ top: 50%;
+ transform: translateX(-50%) translateY(-50%);
+ width: 14px;
+}
+.tox .tox-source-code {
+ overflow: auto;
+}
+.tox .tox-spinner {
+ display: flex;
+}
+.tox .tox-spinner > div {
+ animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both;
+ background-color: rgba(34, 47, 62, 0.7);
+ border-radius: 100%;
+ height: 8px;
+ width: 8px;
+}
+.tox .tox-spinner > div:nth-child(1) {
+ animation-delay: -0.32s;
+}
+.tox .tox-spinner > div:nth-child(2) {
+ animation-delay: -0.16s;
+}
+@keyframes tam-bouncing-dots {
+ 0%,
+ 80%,
+ 100% {
+ transform: scale(0);
+ }
+ 40% {
+ transform: scale(1);
+ }
+}
+.tox:not([dir=rtl]) .tox-spinner > div:not(:first-child) {
+ margin-left: 4px;
+}
+.tox[dir=rtl] .tox-spinner > div:not(:first-child) {
+ margin-right: 4px;
+}
+.tox .tox-statusbar {
+ align-items: center;
+ background-color: #fff;
+ border-top: 1px solid #cccccc;
+ color: rgba(34, 47, 62, 0.7);
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 12px;
+ font-weight: normal;
+ height: 18px;
+ overflow: hidden;
+ padding: 0 8px;
+ position: relative;
+ text-transform: uppercase;
+}
+.tox .tox-statusbar__text-container {
+ display: flex;
+ flex: 1 1 auto;
+ justify-content: flex-end;
+ overflow: hidden;
+}
+.tox .tox-statusbar__path {
+ display: flex;
+ flex: 1 1 auto;
+ margin-right: auto;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.tox .tox-statusbar__path > * {
+ display: inline;
+ white-space: nowrap;
+}
+.tox .tox-statusbar__wordcount {
+ flex: 0 0 auto;
+ margin-left: 1ch;
+}
+.tox .tox-statusbar a,
+.tox .tox-statusbar__path-item,
+.tox .tox-statusbar__wordcount {
+ color: rgba(34, 47, 62, 0.7);
+ text-decoration: none;
+}
+.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),
+.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]) {
+ cursor: pointer;
+ text-decoration: underline;
+}
+.tox .tox-statusbar__resize-handle {
+ align-items: flex-end;
+ align-self: stretch;
+ cursor: nwse-resize;
+ display: flex;
+ flex: 0 0 auto;
+ justify-content: flex-end;
+ margin-left: auto;
+ margin-right: -8px;
+ padding-left: 1ch;
+}
+.tox .tox-statusbar__resize-handle svg {
+ display: block;
+ fill: rgba(34, 47, 62, 0.7);
+}
+.tox:not([dir=rtl]) .tox-statusbar__path > * {
+ margin-right: 4px;
+}
+.tox:not([dir=rtl]) .tox-statusbar__branding {
+ margin-left: 1ch;
+}
+.tox[dir=rtl] .tox-statusbar {
+ flex-direction: row-reverse;
+}
+.tox[dir=rtl] .tox-statusbar__path > * {
+ margin-left: 4px;
+}
+.tox .tox-throbber {
+ z-index: 1299;
+}
+.tox .tox-throbber__busy-spinner {
+ align-items: center;
+ background-color: rgba(255, 255, 255, 0.6);
+ bottom: 0;
+ display: flex;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+.tox .tox-tbtn {
+ align-items: center;
+ background: transparent;
+ border: 0;
+ border-radius: 3px;
+ box-shadow: none;
+ color: #222f3e;
+ display: flex;
+ flex: 0 0 auto;
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ height: 34px;
+ justify-content: center;
+ margin: 2px 0 3px 0;
+ outline: none;
+ overflow: hidden;
+ padding: 0;
+ text-transform: none;
+ width: 34px;
+}
+.tox .tox-tbtn svg {
+ display: block;
+ fill: #222f3e;
+}
+.tox .tox-tbtn.tox-tbtn-more {
+ padding-left: 5px;
+ padding-right: 5px;
+ width: inherit;
+}
+.tox .tox-tbtn:focus {
+ background: #dee0e2;
+ border: 0;
+ box-shadow: none;
+}
+.tox .tox-tbtn:hover {
+ background: #dee0e2;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-tbtn:hover svg {
+ fill: #222f3e;
+}
+.tox .tox-tbtn:active {
+ background: #c8cbcf;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-tbtn:active svg {
+ fill: #222f3e;
+}
+.tox .tox-tbtn--disabled,
+.tox .tox-tbtn--disabled:hover,
+.tox .tox-tbtn:disabled,
+.tox .tox-tbtn:disabled:hover {
+ background: transparent;
+ border: 0;
+ box-shadow: none;
+ color: rgba(34, 47, 62, 0.5);
+ cursor: not-allowed;
+}
+.tox .tox-tbtn--disabled svg,
+.tox .tox-tbtn--disabled:hover svg,
+.tox .tox-tbtn:disabled svg,
+.tox .tox-tbtn:disabled:hover svg {
+ /* stylelint-disable-line no-descending-specificity */
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-tbtn--enabled,
+.tox .tox-tbtn--enabled:hover {
+ background: #c8cbcf;
+ border: 0;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-tbtn--enabled > *,
+.tox .tox-tbtn--enabled:hover > * {
+ transform: none;
+}
+.tox .tox-tbtn--enabled svg,
+.tox .tox-tbtn--enabled:hover svg {
+ /* stylelint-disable-line no-descending-specificity */
+ fill: #222f3e;
+}
+.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) {
+ color: #222f3e;
+}
+.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg {
+ fill: #222f3e;
+}
+.tox .tox-tbtn:active > * {
+ transform: none;
+}
+.tox .tox-tbtn--md {
+ height: 51px;
+ width: 51px;
+}
+.tox .tox-tbtn--lg {
+ flex-direction: column;
+ height: 68px;
+ width: 68px;
+}
+.tox .tox-tbtn--return {
+ -ms-grid-row-align: stretch;
+ align-self: stretch;
+ height: unset;
+ width: 16px;
+}
+.tox .tox-tbtn--labeled {
+ padding: 0 4px;
+ width: unset;
+}
+.tox .tox-tbtn__vlabel {
+ display: block;
+ font-size: 10px;
+ font-weight: normal;
+ letter-spacing: -0.025em;
+ margin-bottom: 4px;
+ white-space: nowrap;
+}
+.tox .tox-tbtn--select {
+ margin: 2px 0 3px 0;
+ padding: 0 4px;
+ width: auto;
+}
+.tox .tox-tbtn__select-label {
+ cursor: default;
+ font-weight: normal;
+ margin: 0 4px;
+}
+.tox .tox-tbtn__select-chevron {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ width: 16px;
+}
+.tox .tox-tbtn__select-chevron svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-tbtn--bespoke .tox-tbtn__select-label {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ width: 7em;
+}
+.tox .tox-split-button {
+ border: 0;
+ border-radius: 3px;
+ box-sizing: border-box;
+ display: flex;
+ margin: 2px 0 3px 0;
+ overflow: hidden;
+}
+.tox .tox-split-button:hover {
+ box-shadow: 0 0 0 1px #dee0e2 inset;
+}
+.tox .tox-split-button:focus {
+ background: #dee0e2;
+ box-shadow: none;
+ color: #222f3e;
+}
+.tox .tox-split-button > * {
+ border-radius: 0;
+}
+.tox .tox-split-button__chevron {
+ width: 16px;
+}
+.tox .tox-split-button__chevron svg {
+ fill: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-split-button .tox-tbtn {
+ margin: 0;
+}
+.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child {
+ width: 30px;
+}
+.tox.tox-platform-touch .tox-split-button__chevron {
+ width: 20px;
+}
+.tox .tox-split-button.tox-tbtn--disabled:hover,
+.tox .tox-split-button.tox-tbtn--disabled:focus,
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,
+.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus {
+ background: transparent;
+ box-shadow: none;
+ color: rgba(34, 47, 62, 0.5);
+}
+.tox .tox-toolbar-overlord {
+ background-color: #fff;
+}
+.tox .tox-toolbar,
+.tox .tox-toolbar__primary,
+.tox .tox-toolbar__overflow {
+ background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;
+ background-color: #fff;
+ display: flex;
+ flex: 0 0 auto;
+ flex-shrink: 0;
+ flex-wrap: wrap;
+ padding: 0 0;
+}
+.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed {
+ height: 0;
+ opacity: 0;
+ padding-bottom: 0;
+ padding-top: 0;
+ visibility: hidden;
+}
+.tox .tox-toolbar__overflow--growing {
+ transition: height 0.3s ease, opacity 0.2s linear 0.1s;
+}
+.tox .tox-toolbar__overflow--shrinking {
+ transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s;
+}
+.tox .tox-menubar + .tox-toolbar,
+.tox .tox-menubar + .tox-toolbar-overlord .tox-toolbar__primary {
+ border-top: 1px solid #cccccc;
+ margin-top: -1px;
+}
+.tox .tox-toolbar--scrolling {
+ flex-wrap: nowrap;
+ overflow-x: auto;
+}
+.tox .tox-pop .tox-toolbar {
+ border-width: 0;
+}
+.tox .tox-toolbar--no-divider {
+ background-image: none;
+}
+.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child,
+.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary {
+ border-top: 1px solid #cccccc;
+}
+.tox.tox-tinymce-aux .tox-toolbar__overflow {
+ background-color: #fff;
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
+}
+.tox[dir=rtl] .tox-tbtn__icon-rtl svg {
+ transform: rotateY(180deg);
+}
+.tox .tox-toolbar__group {
+ align-items: center;
+ display: flex;
+ flex-wrap: wrap;
+ margin: 0 0;
+ padding: 0 4px 0 4px;
+}
+.tox .tox-toolbar__group--pull-right {
+ margin-left: auto;
+}
+.tox .tox-toolbar--scrolling .tox-toolbar__group {
+ flex-shrink: 0;
+ flex-wrap: nowrap;
+}
+.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type) {
+ border-right: 1px solid #cccccc;
+}
+.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type) {
+ border-left: 1px solid #cccccc;
+}
+.tox .tox-tooltip {
+ display: inline-block;
+ padding: 8px;
+ position: relative;
+}
+.tox .tox-tooltip__body {
+ background-color: #222f3e;
+ border-radius: 3px;
+ box-shadow: 0 2px 4px rgba(34, 47, 62, 0.3);
+ color: rgba(255, 255, 255, 0.75);
+ font-size: 14px;
+ font-style: normal;
+ font-weight: normal;
+ padding: 4px 8px;
+ text-transform: none;
+}
+.tox .tox-tooltip__arrow {
+ position: absolute;
+}
+.tox .tox-tooltip--down .tox-tooltip__arrow {
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ border-top: 8px solid #222f3e;
+ bottom: 0;
+ left: 50%;
+ position: absolute;
+ transform: translateX(-50%);
+}
+.tox .tox-tooltip--up .tox-tooltip__arrow {
+ border-bottom: 8px solid #222f3e;
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ left: 50%;
+ position: absolute;
+ top: 0;
+ transform: translateX(-50%);
+}
+.tox .tox-tooltip--right .tox-tooltip__arrow {
+ border-bottom: 8px solid transparent;
+ border-left: 8px solid #222f3e;
+ border-top: 8px solid transparent;
+ position: absolute;
+ right: 0;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-tooltip--left .tox-tooltip__arrow {
+ border-bottom: 8px solid transparent;
+ border-right: 8px solid #222f3e;
+ border-top: 8px solid transparent;
+ left: 0;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.tox .tox-well {
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ padding: 8px;
+ width: 100%;
+}
+.tox .tox-well > *:first-child {
+ margin-top: 0;
+}
+.tox .tox-well > *:last-child {
+ margin-bottom: 0;
+}
+.tox .tox-well > *:only-child {
+ margin: 0;
+}
+.tox .tox-custom-editor {
+ border: 1px solid #cccccc;
+ border-radius: 3px;
+ display: flex;
+ flex: 1;
+ position: relative;
+}
+/* stylelint-disable */
+.tox {
+ /* stylelint-enable */
+}
+.tox .tox-dialog-loading::before {
+ background-color: rgba(0, 0, 0, 0.5);
+ content: "";
+ height: 100%;
+ position: absolute;
+ width: 100%;
+ z-index: 1000;
+}
+.tox .tox-tab {
+ cursor: pointer;
+}
+.tox .tox-dialog__content-js {
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-dialog__body-content .tox-collection {
+ display: flex;
+ flex: 1;
+ -ms-flex-preferred-size: auto;
+}
+.tox .tox-image-tools-edit-panel {
+ height: 60px;
+}
+.tox .tox-image-tools__sidebar {
+ height: 60px;
+}
diff --git a/static/css/skins-tinymce/ui/oxide/skin.min.css b/static/css/skins-tinymce/ui/oxide/skin.min.css
new file mode 100644
index 0000000..13037c1
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide/skin.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tox{box-shadow:none;box-sizing:content-box;color:#222f3e;cursor:auto;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-style:normal;font-weight:400;line-height:normal;-webkit-tap-highlight-color:transparent;text-decoration:none;text-shadow:none;text-transform:none;vertical-align:initial;white-space:normal}.tox :not(svg):not(rect){box-sizing:inherit;color:inherit;cursor:inherit;direction:inherit;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;line-height:inherit;-webkit-tap-highlight-color:inherit;text-align:inherit;text-decoration:inherit;text-shadow:inherit;text-transform:inherit;vertical-align:inherit;white-space:inherit}.tox :not(svg):not(rect){background:0 0;border:0;box-shadow:none;float:none;height:auto;margin:0;max-width:none;outline:0;padding:0;position:static;width:auto}.tox:not([dir=rtl]){direction:ltr;text-align:left}.tox[dir=rtl]{direction:rtl;text-align:right}.tox-tinymce{border:1px solid #ccc;border-radius:0;box-shadow:none;box-sizing:border-box;display:flex;flex-direction:column;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;overflow:hidden;position:relative;visibility:inherit!important}.tox-tinymce-inline{border:none;box-shadow:none}.tox-tinymce-inline .tox-editor-header{background-color:transparent;border:1px solid #ccc;border-radius:0;box-shadow:none}.tox-tinymce-aux{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;z-index:1300}.tox-tinymce :focus,.tox-tinymce-aux :focus{outline:0}button::-moz-focus-inner{border:0}.tox .accessibility-issue__header{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description{align-items:stretch;border:1px solid #ccc;border-radius:3px;display:flex;justify-content:space-between}.tox .accessibility-issue__description>div{padding-bottom:4px}.tox .accessibility-issue__description>div>div{align-items:center;display:flex;margin-bottom:4px}.tox .accessibility-issue__description>:last-child:not(:only-child){border-color:#ccc;border-style:solid}.tox .accessibility-issue__repair{margin-top:16px}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description{background-color:rgba(32,122,183,.1);border-color:rgba(32,122,183,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description>:last-child{border-color:rgba(32,122,183,.4)}.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg{fill:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon{color:#207ab7}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description{background-color:rgba(255,165,0,.1);border-color:rgba(255,165,0,.5);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description>:last-child{border-color:rgba(255,165,0,.5)}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg{fill:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon{color:#cc8500}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description{background-color:rgba(204,0,0,.1);border-color:rgba(204,0,0,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description>:last-child{border-color:rgba(204,0,0,.4)}.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg{fill:#c00}.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon{color:#c00}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description{background-color:rgba(120,171,70,.1);border-color:rgba(120,171,70,.4);color:#222f3e}.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description>:last-child{border-color:rgba(120,171,70,.4)}.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg{fill:#78ab46}.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon{color:#78ab46}.tox .tox-dialog__body-content .accessibility-issue__header h1,.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2{margin-top:0}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-left:4px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-left:auto}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description{padding:4px 4px 4px 8px}.tox:not([dir=rtl]) .tox-dialog__body-content .accessibility-issue__description>:last-child{border-left-width:1px;padding-left:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header .tox-button{margin-right:4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__header>:nth-last-child(2){margin-right:auto}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description{padding:4px 8px 4px 4px}.tox[dir=rtl] .tox-dialog__body-content .accessibility-issue__description>:last-child{border-right-width:1px;padding-right:4px}.tox .tox-anchorbar{display:flex;flex:0 0 auto}.tox .tox-bar{display:flex;flex:0 0 auto}.tox .tox-button{background-color:#207ab7;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#207ab7;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;line-height:24px;margin:0;outline:0;padding:4px 16px;text-align:center;text-decoration:none;text-transform:capitalize;white-space:nowrap}.tox .tox-button[disabled]{background-color:#207ab7;background-image:none;border-color:#207ab7;box-shadow:none;color:rgba(255,255,255,.5);cursor:not-allowed}.tox .tox-button:focus:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:hover:not(:disabled){background-color:#1c6ca1;background-image:none;border-color:#1c6ca1;box-shadow:none;color:#fff}.tox .tox-button:active:not(:disabled){background-color:#185d8c;background-image:none;border-color:#185d8c;box-shadow:none;color:#fff}.tox .tox-button--secondary{background-color:#f0f0f0;background-image:none;background-position:0 0;background-repeat:repeat;border-color:#f0f0f0;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;color:#222f3e;font-size:14px;font-style:normal;font-weight:700;letter-spacing:normal;outline:0;padding:4px 16px;text-decoration:none;text-transform:capitalize}.tox .tox-button--secondary[disabled]{background-color:#f0f0f0;background-image:none;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--secondary:focus:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:hover:not(:disabled){background-color:#e3e3e3;background-image:none;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--secondary:active:not(:disabled){background-color:#d6d6d6;background-image:none;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--icon,.tox .tox-button.tox-button--icon,.tox .tox-button.tox-button--secondary.tox-button--icon{padding:4px}.tox .tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--icon .tox-icon svg,.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg{display:block;fill:currentColor}.tox .tox-button-link{background:0;border:none;box-sizing:border-box;cursor:pointer;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400;line-height:1.3;margin:0;padding:0;white-space:nowrap}.tox .tox-button-link--sm{font-size:14px}.tox .tox-button--naked{background-color:transparent;border-color:transparent;box-shadow:unset;color:#222f3e}.tox .tox-button--naked[disabled]{background-color:#f0f0f0;border-color:#f0f0f0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-button--naked:hover:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:focus:not(:disabled){background-color:#e3e3e3;border-color:#e3e3e3;box-shadow:none;color:#222f3e}.tox .tox-button--naked:active:not(:disabled){background-color:#d6d6d6;border-color:#d6d6d6;box-shadow:none;color:#222f3e}.tox .tox-button--naked .tox-icon svg{fill:currentColor}.tox .tox-button--naked.tox-button--icon:hover:not(:disabled){color:#222f3e}.tox .tox-checkbox{align-items:center;border-radius:3px;cursor:pointer;display:flex;height:36px;min-width:36px}.tox .tox-checkbox__input{height:1px;overflow:hidden;position:absolute;top:auto;width:1px}.tox .tox-checkbox__icons{align-items:center;border-radius:3px;box-shadow:0 0 0 2px transparent;box-sizing:content-box;display:flex;height:24px;justify-content:center;padding:calc(4px - 1px);width:24px}.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:block;fill:rgba(34,47,62,.3)}.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:none;fill:#207ab7}.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg{display:none;fill:#207ab7}.tox .tox-checkbox--disabled{color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg{fill:rgba(34,47,62,.5)}.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{fill:rgba(34,47,62,.5)}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:checked+.tox-checkbox__icons .tox-checkbox-icon__checked svg{display:block}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__unchecked svg{display:none}.tox input.tox-checkbox__input:indeterminate+.tox-checkbox__icons .tox-checkbox-icon__indeterminate svg{display:block}.tox input.tox-checkbox__input:focus+.tox-checkbox__icons{border-radius:3px;box-shadow:inset 0 0 0 1px #207ab7;padding:calc(4px - 1px)}.tox:not([dir=rtl]) .tox-checkbox__label{margin-left:4px}.tox:not([dir=rtl]) .tox-checkbox__input{left:-10000px}.tox:not([dir=rtl]) .tox-bar .tox-checkbox{margin-left:4px}.tox[dir=rtl] .tox-checkbox__label{margin-right:4px}.tox[dir=rtl] .tox-checkbox__input{right:-10000px}.tox[dir=rtl] .tox-bar .tox-checkbox{margin-right:4px}.tox .tox-collection--toolbar .tox-collection__group{display:flex;padding:0}.tox .tox-collection--grid .tox-collection__group{display:flex;flex-wrap:wrap;max-height:208px;overflow-x:hidden;overflow-y:auto;padding:0}.tox .tox-collection--list .tox-collection__group{border-bottom-width:0;border-color:#ccc;border-left-width:0;border-right-width:0;border-style:solid;border-top-width:1px;padding:4px 0}.tox .tox-collection--list .tox-collection__group:first-child{border-top-width:0}.tox .tox-collection__group-heading{background-color:#e6e6e6;color:rgba(34,47,62,.7);cursor:default;font-size:12px;font-style:normal;font-weight:400;margin-bottom:4px;margin-top:-4px;padding:4px 8px;text-transform:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection__item{align-items:center;color:#222f3e;cursor:pointer;display:flex;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tox .tox-collection--list .tox-collection__item{padding:4px 8px}.tox .tox-collection--toolbar .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--grid .tox-collection__item{border-radius:3px;padding:4px}.tox .tox-collection--list .tox-collection__item--enabled{background-color:#fff;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--toolbar .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active{background-color:#dee0e2}.tox .tox-collection--grid .tox-collection__item--enabled{background-color:#c8cbcf;color:#222f3e}.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled){background-color:#dee0e2;color:#222f3e}.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled){color:#222f3e}.tox .tox-collection__item--state-disabled{background-color:transparent;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-collection__item-checkmark,.tox .tox-collection__item-icon{align-items:center;display:flex;height:24px;justify-content:center;width:24px}.tox .tox-collection__item-checkmark svg,.tox .tox-collection__item-icon svg{fill:currentColor}.tox .tox-collection--toolbar-lg .tox-collection__item-icon{height:48px;width:48px}.tox .tox-collection__item-label{color:currentColor;display:inline-block;flex:1;-ms-flex-preferred-size:auto;font-size:14px;font-style:normal;font-weight:400;line-height:24px;text-transform:none;word-break:break-all}.tox .tox-collection__item-accessory{color:rgba(34,47,62,.7);display:inline-block;font-size:14px;height:24px;line-height:24px;text-transform:none}.tox .tox-collection__item-caret{align-items:center;display:flex;min-height:24px}.tox .tox-collection__item-caret::after{content:'';font-size:0;min-height:inherit}.tox .tox-collection__item-caret svg{fill:#222f3e}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-checkmark svg{display:none}.tox .tox-collection--list .tox-collection__item:not(.tox-collection__item--enabled) .tox-collection__item-accessory+.tox-collection__item-checkmark{display:none}.tox .tox-collection--horizontal{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:nowrap;margin-bottom:0;overflow-x:auto;padding:0}.tox .tox-collection--horizontal .tox-collection__group{align-items:center;display:flex;flex-wrap:nowrap;margin:0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item{height:34px;margin:2px 0 3px 0;padding:0 4px}.tox .tox-collection--horizontal .tox-collection__item-label{white-space:nowrap}.tox .tox-collection--horizontal .tox-collection__item-caret{margin-left:4px}.tox .tox-collection__item-container{display:flex}.tox .tox-collection__item-container--row{align-items:center;flex:1 1 auto;flex-direction:row}.tox .tox-collection__item-container--row.tox-collection__item-container--align-left{margin-right:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--align-right{justify-content:flex-end;margin-left:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top{align-items:flex-start;margin-bottom:auto}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle{align-items:center}.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom{align-items:flex-end;margin-top:auto}.tox .tox-collection__item-container--column{-ms-grid-row-align:center;align-self:center;flex:1 1 auto;flex-direction:column}.tox .tox-collection__item-container--column.tox-collection__item-container--align-left{align-items:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--align-right{align-items:flex-end}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top{align-self:flex-start}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle{-ms-grid-row-align:center;align-self:center}.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom{align-self:flex-end}.tox:not([dir=rtl]) .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-right:1px solid #ccc}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>:not(:first-child){margin-left:8px}.tox:not([dir=rtl]) .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-left:4px}.tox:not([dir=rtl]) .tox-collection__item-accessory{margin-left:16px;text-align:right}.tox:not([dir=rtl]) .tox-collection .tox-collection__item-caret{margin-left:16px}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__group:not(:last-of-type){border-left:1px solid #ccc}.tox[dir=rtl] .tox-collection--list .tox-collection__item>:not(:first-child){margin-right:8px}.tox[dir=rtl] .tox-collection--list .tox-collection__item>.tox-collection__item-label:first-child{margin-right:4px}.tox[dir=rtl] .tox-collection__item-icon-rtl .tox-collection__item-icon svg{transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection__item-accessory{margin-right:16px;text-align:left}.tox[dir=rtl] .tox-collection .tox-collection__item-caret{margin-right:16px;transform:rotateY(180deg)}.tox[dir=rtl] .tox-collection--horizontal .tox-collection__item-caret{margin-right:4px}.tox .tox-color-picker-container{display:flex;flex-direction:row;height:225px;margin:0}.tox .tox-sv-palette{box-sizing:border-box;display:flex;height:100%}.tox .tox-sv-palette-spectrum{height:100%}.tox .tox-sv-palette,.tox .tox-sv-palette-spectrum{width:225px}.tox .tox-sv-palette-thumb{background:0 0;border:1px solid #000;border-radius:50%;box-sizing:content-box;height:12px;position:absolute;width:12px}.tox .tox-sv-palette-inner-thumb{border:1px solid #fff;border-radius:50%;height:10px;position:absolute;width:10px}.tox .tox-hue-slider{box-sizing:border-box;height:100%;width:25px}.tox .tox-hue-slider-spectrum{background:linear-gradient(to bottom,red,#ff0080,#f0f,#8000ff,#00f,#0080ff,#0ff,#00ff80,#0f0,#80ff00,#ff0,#ff8000,red);height:100%;width:100%}.tox .tox-hue-slider,.tox .tox-hue-slider-spectrum{width:20px}.tox .tox-hue-slider-thumb{background:#fff;border:1px solid #000;box-sizing:content-box;height:4px;width:100%}.tox .tox-rgb-form{display:flex;flex-direction:column;justify-content:space-between}.tox .tox-rgb-form div{align-items:center;display:flex;justify-content:space-between;margin-bottom:5px;width:inherit}.tox .tox-rgb-form input{width:6em}.tox .tox-rgb-form input.tox-invalid{border:1px solid red!important}.tox .tox-rgb-form .tox-rgba-preview{border:1px solid #000;flex-grow:2;margin-bottom:0}.tox:not([dir=rtl]) .tox-sv-palette{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider{margin-right:15px}.tox:not([dir=rtl]) .tox-hue-slider-thumb{margin-left:-1px}.tox:not([dir=rtl]) .tox-rgb-form label{margin-right:.5em}.tox[dir=rtl] .tox-sv-palette{margin-left:15px}.tox[dir=rtl] .tox-hue-slider{margin-left:15px}.tox[dir=rtl] .tox-hue-slider-thumb{margin-right:-1px}.tox[dir=rtl] .tox-rgb-form label{margin-left:.5em}.tox .tox-toolbar .tox-swatches,.tox .tox-toolbar__overflow .tox-swatches,.tox .tox-toolbar__primary .tox-swatches{margin:2px 0 3px 4px}.tox .tox-collection--list .tox-collection__group .tox-swatches-menu{border:0;margin:-4px 0}.tox .tox-swatches__row{display:flex}.tox .tox-swatch{height:30px;transition:transform .15s,box-shadow .15s;width:30px}.tox .tox-swatch:focus,.tox .tox-swatch:hover{box-shadow:0 0 0 1px rgba(127,127,127,.3) inset;transform:scale(.8)}.tox .tox-swatch--remove{align-items:center;display:flex;justify-content:center}.tox .tox-swatch--remove svg path{stroke:#e74c3c}.tox .tox-swatches__picker-btn{align-items:center;background-color:transparent;border:0;cursor:pointer;display:flex;height:30px;justify-content:center;outline:0;padding:0;width:30px}.tox .tox-swatches__picker-btn svg{height:24px;width:24px}.tox .tox-swatches__picker-btn:hover{background:#dee0e2}.tox:not([dir=rtl]) .tox-swatches__picker-btn{margin-left:auto}.tox[dir=rtl] .tox-swatches__picker-btn{margin-right:auto}.tox .tox-comment-thread{background:#fff;position:relative}.tox .tox-comment-thread>:not(:first-child){margin-top:8px}.tox .tox-comment{background:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);padding:8px 8px 16px 8px;position:relative}.tox .tox-comment__header{align-items:center;color:#222f3e;display:flex;justify-content:space-between}.tox .tox-comment__date{color:rgba(34,47,62,.7);font-size:12px}.tox .tox-comment__body{color:#222f3e;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;margin-top:8px;position:relative;text-transform:initial}.tox .tox-comment__body textarea{resize:none;white-space:normal;width:100%}.tox .tox-comment__expander{padding-top:8px}.tox .tox-comment__expander p{color:rgba(34,47,62,.7);font-size:14px;font-style:normal}.tox .tox-comment__body p{margin:0}.tox .tox-comment__buttonspacing{padding-top:16px;text-align:center}.tox .tox-comment-thread__overlay::after{background:#fff;bottom:0;content:"";display:flex;left:0;opacity:.9;position:absolute;right:0;top:0;z-index:5}.tox .tox-comment__reply{display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;margin-top:8px}.tox .tox-comment__reply>:first-child{margin-bottom:8px;width:100%}.tox .tox-comment__edit{display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:16px}.tox .tox-comment__gradient::after{background:linear-gradient(rgba(255,255,255,0),#fff);bottom:0;content:"";display:block;height:5em;margin-top:-40px;position:absolute;width:100%}.tox .tox-comment__overlay{background:#fff;bottom:0;display:flex;flex-direction:column;flex-grow:1;left:0;opacity:.9;position:absolute;right:0;text-align:center;top:0;z-index:5}.tox .tox-comment__loading-text{align-items:center;color:#222f3e;display:flex;flex-direction:column;position:relative}.tox .tox-comment__loading-text>div{padding-bottom:16px}.tox .tox-comment__overlaytext{bottom:0;flex-direction:column;font-size:14px;left:0;padding:1em;position:absolute;right:0;top:0;z-index:10}.tox .tox-comment__overlaytext p{background-color:#fff;box-shadow:0 0 8px 8px #fff;color:#222f3e;text-align:center}.tox .tox-comment__overlaytext div:nth-of-type(2){font-size:.8em}.tox .tox-comment__busy-spinner{align-items:center;background-color:#fff;bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:20}.tox .tox-comment__scroll{display:flex;flex-direction:column;flex-shrink:1;overflow:auto}.tox .tox-conversations{margin:8px}.tox:not([dir=rtl]) .tox-comment__edit{margin-left:8px}.tox:not([dir=rtl]) .tox-comment__buttonspacing>:last-child,.tox:not([dir=rtl]) .tox-comment__edit>:last-child,.tox:not([dir=rtl]) .tox-comment__reply>:last-child{margin-left:8px}.tox[dir=rtl] .tox-comment__edit{margin-right:8px}.tox[dir=rtl] .tox-comment__buttonspacing>:last-child,.tox[dir=rtl] .tox-comment__edit>:last-child,.tox[dir=rtl] .tox-comment__reply>:last-child{margin-right:8px}.tox .tox-user{align-items:center;display:flex}.tox .tox-user__avatar svg{fill:rgba(34,47,62,.7)}.tox .tox-user__name{color:rgba(34,47,62,.7);font-size:12px;font-style:normal;font-weight:700;text-transform:uppercase}.tox:not([dir=rtl]) .tox-user__avatar svg{margin-right:8px}.tox:not([dir=rtl]) .tox-user__avatar+.tox-user__name{margin-left:8px}.tox[dir=rtl] .tox-user__avatar svg{margin-left:8px}.tox[dir=rtl] .tox-user__avatar+.tox-user__name{margin-right:8px}.tox .tox-dialog-wrap{align-items:center;bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1100}.tox .tox-dialog-wrap__backdrop{background-color:rgba(255,255,255,.75);bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.tox .tox-dialog-wrap__backdrop--opaque{background-color:#fff}.tox .tox-dialog{background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:0 16px 16px -10px rgba(34,47,62,.15),0 0 40px 1px rgba(34,47,62,.15);display:flex;flex-direction:column;max-height:100%;max-width:480px;overflow:hidden;position:relative;width:95vw;z-index:2}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog{align-self:flex-start;margin:8px auto;width:calc(100vw - 16px)}}.tox .tox-dialog-inline{z-index:1100}.tox .tox-dialog__header{align-items:center;background-color:#fff;border-bottom:none;color:#222f3e;display:flex;font-size:16px;justify-content:space-between;padding:8px 16px 0 16px;position:relative}.tox .tox-dialog__header .tox-button{z-index:1}.tox .tox-dialog__draghandle{cursor:grab;height:100%;left:0;position:absolute;top:0;width:100%}.tox .tox-dialog__draghandle:active{cursor:grabbing}.tox .tox-dialog__dismiss{margin-left:auto}.tox .tox-dialog__title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:20px;font-style:normal;font-weight:400;line-height:1.3;margin:0;text-transform:none}.tox .tox-dialog__body{color:#222f3e;display:flex;flex:1;-ms-flex-preferred-size:auto;font-size:16px;font-style:normal;font-weight:400;line-height:1.3;min-width:0;text-align:left;text-transform:none}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body{flex-direction:column}}.tox .tox-dialog__body-nav{align-items:flex-start;display:flex;flex-direction:column;padding:16px 16px}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox .tox-dialog__body-nav{flex-direction:row;-webkit-overflow-scrolling:touch;overflow-x:auto;padding-bottom:0}}.tox .tox-dialog__body-nav-item{border-bottom:2px solid transparent;color:rgba(34,47,62,.7);display:inline-block;font-size:14px;line-height:1.3;margin-bottom:8px;text-decoration:none;white-space:nowrap}.tox .tox-dialog__body-nav-item:focus{background-color:rgba(32,122,183,.1)}.tox .tox-dialog__body-nav-item--active{border-bottom:2px solid #207ab7;color:#207ab7}.tox .tox-dialog__body-content{box-sizing:border-box;display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto;max-height:650px;overflow:auto;-webkit-overflow-scrolling:touch;padding:16px 16px}.tox .tox-dialog__body-content>*{margin-bottom:0;margin-top:16px}.tox .tox-dialog__body-content>:first-child{margin-top:0}.tox .tox-dialog__body-content>:last-child{margin-bottom:0}.tox .tox-dialog__body-content>:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog__body-content a{color:#207ab7;cursor:pointer;text-decoration:none}.tox .tox-dialog__body-content a:focus,.tox .tox-dialog__body-content a:hover{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content a:active{color:#185d8c;text-decoration:none}.tox .tox-dialog__body-content svg{fill:#222f3e}.tox .tox-dialog__body-content ul{display:block;list-style-type:disc;margin-bottom:16px;-webkit-margin-end:0;margin-inline-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-padding-start:2.5rem;padding-inline-start:2.5rem}.tox .tox-dialog__body-content .tox-form__group h1{color:#222f3e;font-size:20px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group h2{color:#222f3e;font-size:16px;font-style:normal;font-weight:700;letter-spacing:normal;margin-bottom:16px;margin-top:2rem;text-transform:none}.tox .tox-dialog__body-content .tox-form__group p{margin-bottom:16px}.tox .tox-dialog__body-content .tox-form__group h1:first-child,.tox .tox-dialog__body-content .tox-form__group h2:first-child,.tox .tox-dialog__body-content .tox-form__group p:first-child{margin-top:0}.tox .tox-dialog__body-content .tox-form__group h1:last-child,.tox .tox-dialog__body-content .tox-form__group h2:last-child,.tox .tox-dialog__body-content .tox-form__group p:last-child{margin-bottom:0}.tox .tox-dialog__body-content .tox-form__group h1:only-child,.tox .tox-dialog__body-content .tox-form__group h2:only-child,.tox .tox-dialog__body-content .tox-form__group p:only-child{margin-bottom:0;margin-top:0}.tox .tox-dialog--width-lg{height:650px;max-width:1200px}.tox .tox-dialog--width-md{max-width:800px}.tox .tox-dialog--width-md .tox-dialog__body-content{overflow:auto}.tox .tox-dialog__body-content--centered{text-align:center}.tox .tox-dialog__footer{align-items:center;background-color:#fff;border-top:1px solid #ccc;display:flex;justify-content:space-between;padding:8px 16px}.tox .tox-dialog__footer-end,.tox .tox-dialog__footer-start{display:flex}.tox .tox-dialog__busy-spinner{align-items:center;background-color:rgba(255,255,255,.75);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0;z-index:3}.tox .tox-dialog__table{border-collapse:collapse;width:100%}.tox .tox-dialog__table thead th{font-weight:700;padding-bottom:8px}.tox .tox-dialog__table tbody tr{border-bottom:1px solid #ccc}.tox .tox-dialog__table tbody tr:last-child{border-bottom:none}.tox .tox-dialog__table td{padding-bottom:8px;padding-top:8px}.tox .tox-dialog__popups{position:absolute;width:100%;z-index:1100}.tox .tox-dialog__body-iframe{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox .tox-dialog-dock-fadeout{opacity:0;visibility:hidden}.tox .tox-dialog-dock-fadein{opacity:1;visibility:visible}.tox .tox-dialog-dock-transition{transition:visibility 0s linear .3s,opacity .3s ease}.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein{transition-delay:0s}.tox.tox-platform-ie .tox-dialog-wrap{position:-ms-device-fixed}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav{margin-right:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox:not([dir=rtl]) .tox-dialog__body-nav-item:not(:first-child){margin-left:8px}}.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-end>*,.tox:not([dir=rtl]) .tox-dialog__footer .tox-dialog__footer-start>*{margin-left:8px}.tox[dir=rtl] .tox-dialog__body{text-align:right}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav{margin-left:0}}@media only screen and (max-width:767px){body:not(.tox-force-desktop) .tox[dir=rtl] .tox-dialog__body-nav-item:not(:first-child){margin-right:8px}}.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-end>*,.tox[dir=rtl] .tox-dialog__footer .tox-dialog__footer-start>*{margin-right:8px}body.tox-dialog__disable-scroll{overflow:hidden}.tox .tox-dropzone-container{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dropzone{align-items:center;background:#fff;border:2px dashed #ccc;box-sizing:border-box;display:flex;flex-direction:column;flex-grow:1;justify-content:center;min-height:100px;padding:10px}.tox .tox-dropzone p{color:rgba(34,47,62,.7);margin:0 0 16px 0}.tox .tox-edit-area{display:flex;flex:1;-ms-flex-preferred-size:auto;overflow:hidden;position:relative}.tox .tox-edit-area__iframe{background-color:#fff;border:0;box-sizing:border-box;flex:1;-ms-flex-preferred-size:auto;height:100%;position:absolute;width:100%}.tox.tox-inline-edit-area{border:1px dotted #ccc}.tox .tox-editor-container{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.tox .tox-editor-header{z-index:1}.tox:not(.tox-tinymce-inline) .tox-editor-header{box-shadow:none;transition:box-shadow .5s}.tox.tox-tinymce--toolbar-bottom .tox-editor-header,.tox.tox-tinymce-inline .tox-editor-header{margin-bottom:-1px}.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header{background-color:transparent;box-shadow:0 4px 4px -3px rgba(0,0,0,.25)}.tox-editor-dock-fadeout{opacity:0;visibility:hidden}.tox-editor-dock-fadein{opacity:1;visibility:visible}.tox-editor-dock-transition{transition:visibility 0s linear .25s,opacity .25s ease}.tox-editor-dock-transition.tox-editor-dock-fadein{transition-delay:0s}.tox .tox-control-wrap{flex:1;position:relative}.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid,.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown,.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid{display:none}.tox .tox-control-wrap svg{display:block}.tox .tox-control-wrap__status-icon-wrap{position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-control-wrap__status-icon-invalid svg{fill:#c00}.tox .tox-control-wrap__status-icon-unknown svg{fill:orange}.tox .tox-control-wrap__status-icon-valid svg{fill:green}.tox:not([dir=rtl]) .tox-control-wrap--status-invalid .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-unknown .tox-textfield,.tox:not([dir=rtl]) .tox-control-wrap--status-valid .tox-textfield{padding-right:32px}.tox:not([dir=rtl]) .tox-control-wrap__status-icon-wrap{right:4px}.tox[dir=rtl] .tox-control-wrap--status-invalid .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-unknown .tox-textfield,.tox[dir=rtl] .tox-control-wrap--status-valid .tox-textfield{padding-left:32px}.tox[dir=rtl] .tox-control-wrap__status-icon-wrap{left:4px}.tox .tox-autocompleter{max-width:25em}.tox .tox-autocompleter .tox-menu{max-width:25em}.tox .tox-autocompleter .tox-autocompleter-highlight{font-weight:700}.tox .tox-color-input{display:flex;position:relative;z-index:1}.tox .tox-color-input .tox-textfield{z-index:-1}.tox .tox-color-input span{border-color:rgba(34,47,62,.2);border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;height:24px;position:absolute;top:6px;width:24px}.tox .tox-color-input span:focus:not([aria-disabled=true]),.tox .tox-color-input span:hover:not([aria-disabled=true]){border-color:#207ab7;cursor:pointer}.tox .tox-color-input span::before{background-image:linear-gradient(45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(-45deg,rgba(0,0,0,.25) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,rgba(0,0,0,.25) 75%),linear-gradient(-45deg,transparent 75%,rgba(0,0,0,.25) 75%);background-position:0 0,0 6px,6px -6px,-6px 0;background-size:12px 12px;border:1px solid #fff;border-radius:3px;box-sizing:border-box;content:'';height:24px;left:-1px;position:absolute;top:-1px;width:24px;z-index:-1}.tox .tox-color-input span[aria-disabled=true]{cursor:not-allowed}.tox:not([dir=rtl]) .tox-color-input .tox-textfield{padding-left:36px}.tox:not([dir=rtl]) .tox-color-input span{left:6px}.tox[dir=rtl] .tox-color-input .tox-textfield{padding-right:36px}.tox[dir=rtl] .tox-color-input span{right:6px}.tox .tox-label,.tox .tox-toolbar-label{color:rgba(34,47,62,.7);display:block;font-size:14px;font-style:normal;font-weight:400;line-height:1.3;padding:0 8px 0 0;text-transform:none;white-space:nowrap}.tox .tox-toolbar-label{padding:0 8px}.tox[dir=rtl] .tox-label{padding:0 0 0 8px}.tox .tox-form{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group{box-sizing:border-box;margin-bottom:4px}.tox .tox-form-group--maximize{flex:1}.tox .tox-form__group--error{color:#c00}.tox .tox-form__group--collection{display:flex}.tox .tox-form__grid{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.tox .tox-form__grid--2col>.tox-form__group{width:calc(50% - (8px / 2))}.tox .tox-form__grid--3col>.tox-form__group{width:calc(100% / 3 - (8px / 2))}.tox .tox-form__grid--4col>.tox-form__group{width:calc(25% - (8px / 2))}.tox .tox-form__controls-h-stack{align-items:center;display:flex}.tox .tox-form__group--inline{align-items:center;display:flex}.tox .tox-form__group--stretched{display:flex;flex:1;flex-direction:column;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-textarea{flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-form__group--stretched .tox-navobj :nth-child(2){flex:1;-ms-flex-preferred-size:auto;height:100%}.tox:not([dir=rtl]) .tox-form__controls-h-stack>:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-form__controls-h-stack>:not(:first-child){margin-right:4px}.tox .tox-lock.tox-locked .tox-lock-icon__unlock,.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock{display:none}.tox .tox-listboxfield .tox-listbox--select,.tox .tox-textarea,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listboxfield .tox-listbox--select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{background-color:#fff;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#222f3e}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-listboxfield{cursor:pointer;position:relative}.tox .tox-listboxfield .tox-listbox--select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-listbox__select-label{cursor:default;flex:1;margin:0 4px}.tox .tox-listbox__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-listbox__select-chevron svg{fill:#222f3e}.tox .tox-listboxfield .tox-listbox--select{align-items:center;display:flex}.tox:not([dir=rtl]) .tox-listboxfield svg{right:8px}.tox[dir=rtl] .tox-listboxfield svg{left:8px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#ccc;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#222f3e;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;min-height:34px;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-selectfield select[disabled]{background-color:#f2f2f2;color:rgba(34,47,62,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield select:focus{background-color:#fff;border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}.tox .tox-help__more-link{list-style:none;margin-top:1em}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background:url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==)}.tox .tox-image-tools__toolbar>.tox-spacer{flex:1;-ms-flex-preferred-size:auto}.tox .tox-croprect-block{background:#000;opacity:.5;position:absolute;zoom:1}.tox .tox-croprect-handle{border:2px solid #fff;height:20px;left:0;position:absolute;top:0;width:20px}.tox .tox-croprect-handle-move{border:0;cursor:move;position:absolute}.tox .tox-croprect-handle-nw{border-width:2px 0 0 2px;cursor:nw-resize;left:100px;margin:-2px 0 0 -2px;top:100px}.tox .tox-croprect-handle-ne{border-width:2px 2px 0 0;cursor:ne-resize;left:200px;margin:-2px 0 0 -20px;top:100px}.tox .tox-croprect-handle-sw{border-width:0 0 2px 2px;cursor:sw-resize;left:100px;margin:-20px 2px 0 -2px;top:200px}.tox .tox-croprect-handle-se{border-width:0 2px 2px 0;cursor:se-resize;left:200px;margin:-20px 0 0 -20px;top:200px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-left:8px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-left:32px}.tox:not([dir=rtl]) .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-left:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider:not(:first-of-type){margin-right:8px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-button+.tox-slider{margin-right:32px}.tox[dir=rtl] .tox-image-tools__toolbar>.tox-slider+.tox-button{margin-right:32px}.tox .tox-insert-table-picker{display:flex;flex-wrap:wrap;width:170px}.tox .tox-insert-table-picker>div{border-color:#ccc;border-style:solid;border-width:0 1px 1px 0;box-sizing:border-box;height:17px;width:17px}.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker{margin:-4px 0}.tox .tox-insert-table-picker .tox-insert-table-picker__selected{background-color:rgba(32,122,183,.5);border-color:rgba(32,122,183,.5)}.tox .tox-insert-table-picker__label{color:rgba(34,47,62,.7);display:block;font-size:14px;padding:4px;text-align:center;width:100%}.tox:not([dir=rtl]) .tox-insert-table-picker>div:nth-child(10n){border-right:0}.tox[dir=rtl] .tox-insert-table-picker>div:nth-child(10n+1){border-right:0}.tox .tox-menu{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 4px 8px 0 rgba(34,47,62,.1);display:inline-block;overflow:hidden;vertical-align:top;z-index:1150}.tox .tox-menu.tox-collection.tox-collection--list{padding:0}.tox .tox-menu.tox-collection.tox-collection--toolbar{padding:4px}.tox .tox-menu.tox-collection.tox-collection--grid{padding:4px}.tox .tox-menu__label blockquote,.tox .tox-menu__label code,.tox .tox-menu__label h1,.tox .tox-menu__label h2,.tox .tox-menu__label h3,.tox .tox-menu__label h4,.tox .tox-menu__label h5,.tox .tox-menu__label h6,.tox .tox-menu__label p{margin:0}.tox .tox-menubar{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 4px 0 4px}.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar{border-top:1px solid #ccc}.tox .tox-mbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0 4px;text-transform:none;width:auto}.tox .tox-mbtn[disabled]{background-color:transparent;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-mbtn:focus:not(:disabled){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn--active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active){background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-mbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-mbtn[disabled] .tox-mbtn__select-label{cursor:not-allowed}.tox .tox-mbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px;display:none}.tox .tox-notification{border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;display:-ms-grid;display:grid;font-size:14px;font-weight:400;-ms-grid-columns:minmax(40px,1fr) auto minmax(40px,1fr);grid-template-columns:minmax(40px,1fr) auto minmax(40px,1fr);margin-top:4px;opacity:0;padding:4px;transition:transform .1s ease-in,opacity 150ms ease-in}.tox .tox-notification p{font-size:14px;font-weight:400}.tox .tox-notification a{text-decoration:underline}.tox .tox-notification--in{opacity:1}.tox .tox-notification--success{background-color:#e4eeda;border-color:#d7e6c8;color:#222f3e}.tox .tox-notification--success p{color:#222f3e}.tox .tox-notification--success a{color:#547831}.tox .tox-notification--success svg{fill:#222f3e}.tox .tox-notification--error{background-color:#f8dede;border-color:#f2bfbf;color:#222f3e}.tox .tox-notification--error p{color:#222f3e}.tox .tox-notification--error a{color:#c00}.tox .tox-notification--error svg{fill:#222f3e}.tox .tox-notification--warn,.tox .tox-notification--warning{background-color:#fffaea;border-color:#ffe89d;color:#222f3e}.tox .tox-notification--warn p,.tox .tox-notification--warning p{color:#222f3e}.tox .tox-notification--warn a,.tox .tox-notification--warning a{color:#222f3e}.tox .tox-notification--warn svg,.tox .tox-notification--warning svg{fill:#222f3e}.tox .tox-notification--info{background-color:#d9edf7;border-color:#779ecb;color:#222f3e}.tox .tox-notification--info p{color:#222f3e}.tox .tox-notification--info a{color:#222f3e}.tox .tox-notification--info svg{fill:#222f3e}.tox .tox-notification__body{-ms-grid-row-align:center;align-self:center;color:#222f3e;font-size:14px;-ms-grid-column-span:1;grid-column-end:3;-ms-grid-column:2;grid-column-start:2;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;text-align:center;white-space:normal;word-break:break-all;word-break:break-word}.tox .tox-notification__body>*{margin:0}.tox .tox-notification__body>*+*{margin-top:1rem}.tox .tox-notification__icon{-ms-grid-row-align:center;align-self:center;-ms-grid-column-span:1;grid-column-end:2;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification__icon svg{display:block}.tox .tox-notification__dismiss{-ms-grid-row-align:start;align-self:start;-ms-grid-column-span:1;grid-column-end:4;-ms-grid-column:3;grid-column-start:3;-ms-grid-row-span:1;grid-row-end:2;-ms-grid-row:1;grid-row-start:1;-ms-grid-column-align:end;justify-self:end}.tox .tox-notification .tox-progress-bar{-ms-grid-column-span:3;grid-column-end:4;-ms-grid-column:1;grid-column-start:1;-ms-grid-row-span:1;grid-row-end:3;-ms-grid-row:2;grid-row-start:2;-ms-grid-column-align:center;justify-self:center}.tox .tox-pop{display:inline-block;position:relative}.tox .tox-pop--resizing{transition:width .1s ease}.tox .tox-pop--resizing .tox-toolbar{flex-wrap:nowrap}.tox .tox-pop__dialog{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15);min-width:0;overflow:hidden}.tox .tox-pop__dialog>:not(.tox-toolbar){margin:4px 4px 4px 8px}.tox .tox-pop__dialog .tox-toolbar{background-color:transparent;margin-bottom:-1px}.tox .tox-pop::after,.tox .tox-pop::before{border-style:solid;content:'';display:block;height:0;position:absolute;width:0}.tox .tox-pop.tox-pop--bottom::after,.tox .tox-pop.tox-pop--bottom::before{left:50%;top:100%}.tox .tox-pop.tox-pop--bottom::after{border-color:#fff transparent transparent transparent;border-width:8px;margin-left:-8px;margin-top:-1px}.tox .tox-pop.tox-pop--bottom::before{border-color:#ccc transparent transparent transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--top::after,.tox .tox-pop.tox-pop--top::before{left:50%;top:0;transform:translateY(-100%)}.tox .tox-pop.tox-pop--top::after{border-color:transparent transparent #fff transparent;border-width:8px;margin-left:-8px;margin-top:1px}.tox .tox-pop.tox-pop--top::before{border-color:transparent transparent #ccc transparent;border-width:9px;margin-left:-9px}.tox .tox-pop.tox-pop--left::after,.tox .tox-pop.tox-pop--left::before{left:0;top:calc(50% - 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--left::after{border-color:transparent #fff transparent transparent;border-width:8px;margin-left:-15px}.tox .tox-pop.tox-pop--left::before{border-color:transparent #ccc transparent transparent;border-width:10px;margin-left:-19px}.tox .tox-pop.tox-pop--right::after,.tox .tox-pop.tox-pop--right::before{left:100%;top:calc(50% + 1px);transform:translateY(-50%)}.tox .tox-pop.tox-pop--right::after{border-color:transparent transparent transparent #fff;border-width:8px;margin-left:-1px}.tox .tox-pop.tox-pop--right::before{border-color:transparent transparent transparent #ccc;border-width:10px;margin-left:-1px}.tox .tox-pop.tox-pop--align-left::after,.tox .tox-pop.tox-pop--align-left::before{left:20px}.tox .tox-pop.tox-pop--align-right::after,.tox .tox-pop.tox-pop--align-right::before{left:calc(100% - 20px)}.tox .tox-sidebar-wrap{display:flex;flex-direction:row;flex-grow:1;-ms-flex-preferred-size:0;min-height:0}.tox .tox-sidebar{background-color:#fff;display:flex;flex-direction:row;justify-content:flex-end}.tox .tox-sidebar__slider{display:flex;overflow:hidden}.tox .tox-sidebar__pane-container{display:flex}.tox .tox-sidebar__pane{display:flex}.tox .tox-sidebar--sliding-closed{opacity:0}.tox .tox-sidebar--sliding-open{opacity:1}.tox .tox-sidebar--sliding-growing,.tox .tox-sidebar--sliding-shrinking{transition:width .5s ease,opacity .5s ease}.tox .tox-selector{background-color:#4099ff;border-color:#4099ff;border-style:solid;border-width:1px;box-sizing:border-box;display:inline-block;height:10px;position:absolute;width:10px}.tox.tox-platform-touch .tox-selector{height:12px;width:12px}.tox .tox-slider{align-items:center;display:flex;flex:1;-ms-flex-preferred-size:auto;height:24px;justify-content:center;position:relative}.tox .tox-slider__rail{background-color:transparent;border:1px solid #ccc;border-radius:3px;height:10px;min-width:120px;width:100%}.tox .tox-slider__handle{background-color:#207ab7;border:2px solid #185d8c;border-radius:3px;box-shadow:none;height:24px;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%);width:14px}.tox .tox-source-code{overflow:auto}.tox .tox-spinner{display:flex}.tox .tox-spinner>div{animation:tam-bouncing-dots 1.5s ease-in-out 0s infinite both;background-color:rgba(34,47,62,.7);border-radius:100%;height:8px;width:8px}.tox .tox-spinner>div:nth-child(1){animation-delay:-.32s}.tox .tox-spinner>div:nth-child(2){animation-delay:-.16s}@keyframes tam-bouncing-dots{0%,100%,80%{transform:scale(0)}40%{transform:scale(1)}}.tox:not([dir=rtl]) .tox-spinner>div:not(:first-child){margin-left:4px}.tox[dir=rtl] .tox-spinner>div:not(:first-child){margin-right:4px}.tox .tox-statusbar{align-items:center;background-color:#fff;border-top:1px solid #ccc;color:rgba(34,47,62,.7);display:flex;flex:0 0 auto;font-size:12px;font-weight:400;height:18px;overflow:hidden;padding:0 8px;position:relative;text-transform:uppercase}.tox .tox-statusbar__text-container{display:flex;flex:1 1 auto;justify-content:flex-end;overflow:hidden}.tox .tox-statusbar__path{display:flex;flex:1 1 auto;margin-right:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tox .tox-statusbar__path>*{display:inline;white-space:nowrap}.tox .tox-statusbar__wordcount{flex:0 0 auto;margin-left:1ch}.tox .tox-statusbar a,.tox .tox-statusbar__path-item,.tox .tox-statusbar__wordcount{color:rgba(34,47,62,.7);text-decoration:none}.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled=true]),.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled=true]){cursor:pointer;text-decoration:underline}.tox .tox-statusbar__resize-handle{align-items:flex-end;align-self:stretch;cursor:nwse-resize;display:flex;flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:-8px;padding-left:1ch}.tox .tox-statusbar__resize-handle svg{display:block;fill:rgba(34,47,62,.7)}.tox:not([dir=rtl]) .tox-statusbar__path>*{margin-right:4px}.tox:not([dir=rtl]) .tox-statusbar__branding{margin-left:1ch}.tox[dir=rtl] .tox-statusbar{flex-direction:row-reverse}.tox[dir=rtl] .tox-statusbar__path>*{margin-left:4px}.tox .tox-throbber{z-index:1299}.tox .tox-throbber__busy-spinner{align-items:center;background-color:rgba(255,255,255,.6);bottom:0;display:flex;justify-content:center;left:0;position:absolute;right:0;top:0}.tox .tox-tbtn{align-items:center;background:0 0;border:0;border-radius:3px;box-shadow:none;color:#222f3e;display:flex;flex:0 0 auto;font-size:14px;font-style:normal;font-weight:400;height:34px;justify-content:center;margin:2px 0 3px 0;outline:0;overflow:hidden;padding:0;text-transform:none;width:34px}.tox .tox-tbtn svg{display:block;fill:#222f3e}.tox .tox-tbtn.tox-tbtn-more{padding-left:5px;padding-right:5px;width:inherit}.tox .tox-tbtn:focus{background:#dee0e2;border:0;box-shadow:none}.tox .tox-tbtn:hover{background:#dee0e2;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:hover svg{fill:#222f3e}.tox .tox-tbtn:active{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn:active svg{fill:#222f3e}.tox .tox-tbtn--disabled,.tox .tox-tbtn--disabled:hover,.tox .tox-tbtn:disabled,.tox .tox-tbtn:disabled:hover{background:0 0;border:0;box-shadow:none;color:rgba(34,47,62,.5);cursor:not-allowed}.tox .tox-tbtn--disabled svg,.tox .tox-tbtn--disabled:hover svg,.tox .tox-tbtn:disabled svg,.tox .tox-tbtn:disabled:hover svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--enabled,.tox .tox-tbtn--enabled:hover{background:#c8cbcf;border:0;box-shadow:none;color:#222f3e}.tox .tox-tbtn--enabled:hover>*,.tox .tox-tbtn--enabled>*{transform:none}.tox .tox-tbtn--enabled svg,.tox .tox-tbtn--enabled:hover svg{fill:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled){color:#222f3e}.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg{fill:#222f3e}.tox .tox-tbtn:active>*{transform:none}.tox .tox-tbtn--md{height:51px;width:51px}.tox .tox-tbtn--lg{flex-direction:column;height:68px;width:68px}.tox .tox-tbtn--return{-ms-grid-row-align:stretch;align-self:stretch;height:unset;width:16px}.tox .tox-tbtn--labeled{padding:0 4px;width:unset}.tox .tox-tbtn__vlabel{display:block;font-size:10px;font-weight:400;letter-spacing:-.025em;margin-bottom:4px;white-space:nowrap}.tox .tox-tbtn--select{margin:2px 0 3px 0;padding:0 4px;width:auto}.tox .tox-tbtn__select-label{cursor:default;font-weight:400;margin:0 4px}.tox .tox-tbtn__select-chevron{align-items:center;display:flex;justify-content:center;width:16px}.tox .tox-tbtn__select-chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-tbtn--bespoke .tox-tbtn__select-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:7em}.tox .tox-split-button{border:0;border-radius:3px;box-sizing:border-box;display:flex;margin:2px 0 3px 0;overflow:hidden}.tox .tox-split-button:hover{box-shadow:0 0 0 1px #dee0e2 inset}.tox .tox-split-button:focus{background:#dee0e2;box-shadow:none;color:#222f3e}.tox .tox-split-button>*{border-radius:0}.tox .tox-split-button__chevron{width:16px}.tox .tox-split-button__chevron svg{fill:rgba(34,47,62,.5)}.tox .tox-split-button .tox-tbtn{margin:0}.tox.tox-platform-touch .tox-split-button .tox-tbtn:first-child{width:30px}.tox.tox-platform-touch .tox-split-button__chevron{width:20px}.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus,.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover,.tox .tox-split-button.tox-tbtn--disabled:focus,.tox .tox-split-button.tox-tbtn--disabled:hover{background:0 0;box-shadow:none;color:rgba(34,47,62,.5)}.tox .tox-toolbar-overlord{background-color:#fff}.tox .tox-toolbar,.tox .tox-toolbar__overflow,.tox .tox-toolbar__primary{background:url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff;background-color:#fff;display:flex;flex:0 0 auto;flex-shrink:0;flex-wrap:wrap;padding:0 0}.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed{height:0;opacity:0;padding-bottom:0;padding-top:0;visibility:hidden}.tox .tox-toolbar__overflow--growing{transition:height .3s ease,opacity .2s linear .1s}.tox .tox-toolbar__overflow--shrinking{transition:opacity .3s ease,height .2s linear .1s,visibility 0s linear .3s}.tox .tox-menubar+.tox-toolbar,.tox .tox-menubar+.tox-toolbar-overlord .tox-toolbar__primary{border-top:1px solid #ccc;margin-top:-1px}.tox .tox-toolbar--scrolling{flex-wrap:nowrap;overflow-x:auto}.tox .tox-pop .tox-toolbar{border-width:0}.tox .tox-toolbar--no-divider{background-image:none}.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar-overlord:first-child .tox-toolbar__primary,.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child{border-top:1px solid #ccc}.tox.tox-tinymce-aux .tox-toolbar__overflow{background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}.tox[dir=rtl] .tox-tbtn__icon-rtl svg{transform:rotateY(180deg)}.tox .tox-toolbar__group{align-items:center;display:flex;flex-wrap:wrap;margin:0 0;padding:0 4px 0 4px}.tox .tox-toolbar__group--pull-right{margin-left:auto}.tox .tox-toolbar--scrolling .tox-toolbar__group{flex-shrink:0;flex-wrap:nowrap}.tox:not([dir=rtl]) .tox-toolbar__group:not(:last-of-type){border-right:1px solid #ccc}.tox[dir=rtl] .tox-toolbar__group:not(:last-of-type){border-left:1px solid #ccc}.tox .tox-tooltip{display:inline-block;padding:8px;position:relative}.tox .tox-tooltip__body{background-color:#222f3e;border-radius:3px;box-shadow:0 2px 4px rgba(34,47,62,.3);color:rgba(255,255,255,.75);font-size:14px;font-style:normal;font-weight:400;padding:4px 8px;text-transform:none}.tox .tox-tooltip__arrow{position:absolute}.tox .tox-tooltip--down .tox-tooltip__arrow{border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #222f3e;bottom:0;left:50%;position:absolute;transform:translateX(-50%)}.tox .tox-tooltip--up .tox-tooltip__arrow{border-bottom:8px solid #222f3e;border-left:8px solid transparent;border-right:8px solid transparent;left:50%;position:absolute;top:0;transform:translateX(-50%)}.tox .tox-tooltip--right .tox-tooltip__arrow{border-bottom:8px solid transparent;border-left:8px solid #222f3e;border-top:8px solid transparent;position:absolute;right:0;top:50%;transform:translateY(-50%)}.tox .tox-tooltip--left .tox-tooltip__arrow{border-bottom:8px solid transparent;border-right:8px solid #222f3e;border-top:8px solid transparent;left:0;position:absolute;top:50%;transform:translateY(-50%)}.tox .tox-well{border:1px solid #ccc;border-radius:3px;padding:8px;width:100%}.tox .tox-well>:first-child{margin-top:0}.tox .tox-well>:last-child{margin-bottom:0}.tox .tox-well>:only-child{margin:0}.tox .tox-custom-editor{border:1px solid #ccc;border-radius:3px;display:flex;flex:1;position:relative}.tox .tox-dialog-loading::before{background-color:rgba(0,0,0,.5);content:"";height:100%;position:absolute;width:100%;z-index:1000}.tox .tox-tab{cursor:pointer}.tox .tox-dialog__content-js{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-dialog__body-content .tox-collection{display:flex;flex:1;-ms-flex-preferred-size:auto}.tox .tox-image-tools-edit-panel{height:60px}.tox .tox-image-tools__sidebar{height:60px}
diff --git a/static/css/skins-tinymce/ui/oxide/skin.mobile.css b/static/css/skins-tinymce/ui/oxide/skin.mobile.css
new file mode 100644
index 0000000..875721a
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide/skin.mobile.css
@@ -0,0 +1,673 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+/* RESET all the things! */
+.tinymce-mobile-outer-container {
+ all: initial;
+ display: block;
+}
+.tinymce-mobile-outer-container * {
+ border: 0;
+ box-sizing: initial;
+ cursor: inherit;
+ float: none;
+ line-height: 1;
+ margin: 0;
+ outline: 0;
+ padding: 0;
+ -webkit-tap-highlight-color: transparent;
+ /* TBIO-3691, stop the gray flicker on touch. */
+ text-shadow: none;
+ white-space: nowrap;
+}
+.tinymce-mobile-icon-arrow-back::before {
+ content: "\e5cd";
+}
+.tinymce-mobile-icon-image::before {
+ content: "\e412";
+}
+.tinymce-mobile-icon-cancel-circle::before {
+ content: "\e5c9";
+}
+.tinymce-mobile-icon-full-dot::before {
+ content: "\e061";
+}
+.tinymce-mobile-icon-align-center::before {
+ content: "\e234";
+}
+.tinymce-mobile-icon-align-left::before {
+ content: "\e236";
+}
+.tinymce-mobile-icon-align-right::before {
+ content: "\e237";
+}
+.tinymce-mobile-icon-bold::before {
+ content: "\e238";
+}
+.tinymce-mobile-icon-italic::before {
+ content: "\e23f";
+}
+.tinymce-mobile-icon-unordered-list::before {
+ content: "\e241";
+}
+.tinymce-mobile-icon-ordered-list::before {
+ content: "\e242";
+}
+.tinymce-mobile-icon-font-size::before {
+ content: "\e245";
+}
+.tinymce-mobile-icon-underline::before {
+ content: "\e249";
+}
+.tinymce-mobile-icon-link::before {
+ content: "\e157";
+}
+.tinymce-mobile-icon-unlink::before {
+ content: "\eca2";
+}
+.tinymce-mobile-icon-color::before {
+ content: "\e891";
+}
+.tinymce-mobile-icon-previous::before {
+ content: "\e314";
+}
+.tinymce-mobile-icon-next::before {
+ content: "\e315";
+}
+.tinymce-mobile-icon-large-font::before,
+.tinymce-mobile-icon-style-formats::before {
+ content: "\e264";
+}
+.tinymce-mobile-icon-undo::before {
+ content: "\e166";
+}
+.tinymce-mobile-icon-redo::before {
+ content: "\e15a";
+}
+.tinymce-mobile-icon-removeformat::before {
+ content: "\e239";
+}
+.tinymce-mobile-icon-small-font::before {
+ content: "\e906";
+}
+.tinymce-mobile-icon-readonly-back::before,
+.tinymce-mobile-format-matches::after {
+ content: "\e5ca";
+}
+.tinymce-mobile-icon-small-heading::before {
+ content: "small";
+}
+.tinymce-mobile-icon-large-heading::before {
+ content: "large";
+}
+.tinymce-mobile-icon-small-heading::before,
+.tinymce-mobile-icon-large-heading::before {
+ font-family: sans-serif;
+ font-size: 80%;
+}
+.tinymce-mobile-mask-edit-icon::before {
+ content: "\e254";
+}
+.tinymce-mobile-icon-back::before {
+ content: "\e5c4";
+}
+.tinymce-mobile-icon-heading::before {
+ /* TODO: Translate */
+ content: "Headings";
+ font-family: sans-serif;
+ font-size: 80%;
+ font-weight: bold;
+}
+.tinymce-mobile-icon-h1::before {
+ content: "H1";
+ font-weight: bold;
+}
+.tinymce-mobile-icon-h2::before {
+ content: "H2";
+ font-weight: bold;
+}
+.tinymce-mobile-icon-h3::before {
+ content: "H3";
+ font-weight: bold;
+}
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ background: rgba(51, 51, 51, 0.5);
+ height: 100%;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container {
+ align-items: center;
+ border-radius: 50%;
+ display: flex;
+ flex-direction: column;
+ font-family: sans-serif;
+ font-size: 1em;
+ justify-content: space-between;
+}
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ border-radius: 50%;
+ height: 2.1em;
+ width: 2.1em;
+}
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ flex-direction: column;
+ font-size: 1em;
+}
+@media only screen and (min-device-width:700px) {
+ .tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section {
+ font-size: 1.2em;
+ }
+}
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+ border-radius: 50%;
+ height: 2.1em;
+ width: 2.1em;
+ background-color: white;
+ color: #207ab7;
+}
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before {
+ content: "\e900";
+ font-family: 'tinymce-mobile', sans-serif;
+}
+.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon {
+ z-index: 2;
+}
+.tinymce-mobile-android-container.tinymce-mobile-android-maximized {
+ background: #ffffff;
+ border: none;
+ bottom: 0;
+ display: flex;
+ flex-direction: column;
+ left: 0;
+ position: fixed;
+ right: 0;
+ top: 0;
+}
+.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized) {
+ position: relative;
+}
+.tinymce-mobile-android-container .tinymce-mobile-editor-socket {
+ display: flex;
+ flex-grow: 1;
+}
+.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe {
+ display: flex !important;
+ flex-grow: 1;
+ height: auto !important;
+}
+.tinymce-mobile-android-scroll-reload {
+ overflow: hidden;
+}
+:not(.tinymce-mobile-readonly-mode) > .tinymce-mobile-android-selection-context-toolbar {
+ margin-top: 23px;
+}
+.tinymce-mobile-toolstrip {
+ background: #fff;
+ display: flex;
+ flex: 0 0 auto;
+ z-index: 1;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar {
+ align-items: center;
+ background-color: #fff;
+ border-bottom: 1px solid #cccccc;
+ display: flex;
+ flex: 1;
+ height: 2.5em;
+ width: 100%;
+ /* Make it no larger than the toolstrip, so that it needs to scroll */
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group {
+ align-items: center;
+ display: flex;
+ height: 100%;
+ flex-shrink: 1;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group > div {
+ align-items: center;
+ display: flex;
+ height: 100%;
+ flex: 1;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container {
+ background: #f44336;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group {
+ flex-grow: 1;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item {
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button {
+ align-items: center;
+ display: flex;
+ height: 80%;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected {
+ background: #c8cbcf;
+ color: #cccccc;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type {
+ background: #207ab7;
+ color: #eceff1;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar {
+ /* Note, this file is imported inside .tinymce-mobile-context-toolbar, so that prefix is on everything here. */
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group {
+ align-items: center;
+ display: flex;
+ height: 100%;
+ flex: 1;
+ padding-bottom: 0.4em;
+ padding-top: 0.4em;
+ /* Make any buttons appearing on the left and right display in the centre (e.g. color edges) */
+ /* For widgets like the colour picker, use the whole height */
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog {
+ display: flex;
+ min-height: 1.5em;
+ overflow: hidden;
+ padding-left: 0;
+ padding-right: 0;
+ position: relative;
+ width: 100%;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain {
+ display: flex;
+ height: 100%;
+ transition: left cubic-bezier(0.4, 0, 1, 1) 0.15s;
+ width: 100%;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen {
+ display: flex;
+ flex: 0 0 auto;
+ justify-content: space-between;
+ width: 100%;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input {
+ font-family: Sans-serif;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container {
+ display: flex;
+ flex-grow: 1;
+ position: relative;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x {
+ -ms-grid-row-align: center;
+ align-self: center;
+ background: inherit;
+ border: none;
+ border-radius: 50%;
+ color: #888;
+ font-size: 0.6em;
+ font-weight: bold;
+ height: 100%;
+ padding-right: 2px;
+ position: absolute;
+ right: 0;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x {
+ display: none;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous,
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next {
+ align-items: center;
+ display: flex;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before,
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before {
+ align-items: center;
+ display: flex;
+ font-weight: bold;
+ height: 100%;
+ padding-left: 0.5em;
+ padding-right: 0.5em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before,
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before {
+ visibility: hidden;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item {
+ color: #cccccc;
+ font-size: 10px;
+ line-height: 10px;
+ margin: 0 2px;
+ padding-top: 3px;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active {
+ color: #c8cbcf;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before {
+ margin-left: 0.5em;
+ margin-right: 0.9em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before {
+ margin-left: 0.9em;
+ margin-right: 0.5em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider {
+ display: flex;
+ flex: 1;
+ margin-left: 0;
+ margin-right: 0;
+ padding: 0.28em 0;
+ position: relative;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container {
+ align-items: center;
+ display: flex;
+ flex-grow: 1;
+ height: 100%;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line {
+ background: #cccccc;
+ display: flex;
+ flex: 1;
+ height: 0.2em;
+ margin-bottom: 0.3em;
+ margin-top: 0.3em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container {
+ padding-left: 2em;
+ padding-right: 2em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container {
+ align-items: center;
+ display: flex;
+ flex-grow: 1;
+ height: 100%;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient {
+ background: linear-gradient(to right, hsl(0, 100%, 50%) 0%, hsl(60, 100%, 50%) 17%, hsl(120, 100%, 50%) 33%, hsl(180, 100%, 50%) 50%, hsl(240, 100%, 50%) 67%, hsl(300, 100%, 50%) 83%, hsl(0, 100%, 50%) 100%);
+ display: flex;
+ flex: 1;
+ height: 0.2em;
+ margin-bottom: 0.3em;
+ margin-top: 0.3em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black {
+ /* Not part of theming */
+ background: black;
+ height: 0.2em;
+ margin-bottom: 0.3em;
+ margin-top: 0.3em;
+ width: 1.2em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white {
+ /* Not part of theming */
+ background: white;
+ height: 0.2em;
+ margin-bottom: 0.3em;
+ margin-top: 0.3em;
+ width: 1.2em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb {
+ /* vertically centering trick (margin: auto, top: 0, bottom: 0). On iOS and Safari, if you leave
+ * out these values, then it shows the thumb at the top of the spectrum. This is probably because it is
+ * absolutely positioned with only a left value, and not a top. Note, on Chrome it seems to be fine without
+ * this approach.
+ */
+ align-items: center;
+ background-clip: padding-box;
+ background-color: #455a64;
+ border: 0.5em solid rgba(136, 136, 136, 0);
+ border-radius: 3em;
+ bottom: 0;
+ color: #fff;
+ display: flex;
+ height: 0.5em;
+ justify-content: center;
+ left: -10px;
+ margin: auto;
+ position: absolute;
+ top: 0;
+ transition: border 120ms cubic-bezier(0.39, 0.58, 0.57, 1);
+ width: 0.5em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active {
+ border: 0.5em solid rgba(136, 136, 136, 0.39);
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group > div {
+ align-items: center;
+ display: flex;
+ height: 100%;
+ flex: 1;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper {
+ flex-direction: column;
+ justify-content: center;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item {
+ align-items: center;
+ display: flex;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog) {
+ height: 100%;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container {
+ display: flex;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input {
+ background: #ffffff;
+ border: none;
+ border-radius: 0;
+ color: #455a64;
+ flex-grow: 1;
+ font-size: 0.85em;
+ padding-bottom: 0.1em;
+ padding-left: 5px;
+ padding-top: 0.1em;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder {
+ /* WebKit, Blink, Edge */
+ color: #888;
+}
+.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder {
+ /* WebKit, Blink, Edge */
+ color: #888;
+}
+/* dropup */
+.tinymce-mobile-dropup {
+ background: white;
+ display: flex;
+ overflow: hidden;
+ width: 100%;
+}
+.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking {
+ transition: height 0.3s ease-out;
+}
+.tinymce-mobile-dropup.tinymce-mobile-dropup-growing {
+ transition: height 0.3s ease-in;
+}
+.tinymce-mobile-dropup.tinymce-mobile-dropup-closed {
+ flex-grow: 0;
+}
+.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing) {
+ flex-grow: 1;
+}
+/* TODO min-height for device size and orientation */
+.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {
+ min-height: 200px;
+}
+@media only screen and (orientation: landscape) {
+ .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {
+ min-height: 200px;
+ }
+}
+@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) {
+ .tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed) {
+ min-height: 150px;
+ }
+}
+/* styles menu */
+.tinymce-mobile-styles-menu {
+ font-family: sans-serif;
+ outline: 4px solid black;
+ overflow: hidden;
+ position: relative;
+ width: 100%;
+}
+.tinymce-mobile-styles-menu [role="menu"] {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ position: absolute;
+ width: 100%;
+}
+.tinymce-mobile-styles-menu [role="menu"].transitioning {
+ transition: transform 0.5s ease-in-out;
+}
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-item {
+ border-bottom: 1px solid #ddd;
+ color: #455a64;
+ cursor: pointer;
+ display: flex;
+ padding: 1em 1em;
+ position: relative;
+}
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before {
+ color: #455a64;
+ content: "\e314";
+ font-family: 'tinymce-mobile', sans-serif;
+}
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after {
+ color: #455a64;
+ content: "\e315";
+ font-family: 'tinymce-mobile', sans-serif;
+ padding-left: 1em;
+ padding-right: 1em;
+ position: absolute;
+ right: 0;
+}
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after {
+ font-family: 'tinymce-mobile', sans-serif;
+ padding-left: 1em;
+ padding-right: 1em;
+ position: absolute;
+ right: 0;
+}
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator,
+.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser {
+ align-items: center;
+ background: #fff;
+ border-top: #455a64;
+ color: #455a64;
+ display: flex;
+ min-height: 2.5em;
+ padding-left: 1em;
+ padding-right: 1em;
+}
+.tinymce-mobile-styles-menu [data-transitioning-destination="before"][data-transitioning-state],
+.tinymce-mobile-styles-menu [data-transitioning-state="before"] {
+ transform: translate(-100%);
+}
+.tinymce-mobile-styles-menu [data-transitioning-destination="current"][data-transitioning-state],
+.tinymce-mobile-styles-menu [data-transitioning-state="current"] {
+ transform: translate(0%);
+}
+.tinymce-mobile-styles-menu [data-transitioning-destination="after"][data-transitioning-state],
+.tinymce-mobile-styles-menu [data-transitioning-state="after"] {
+ transform: translate(100%);
+}
+@font-face {
+ font-family: 'tinymce-mobile';
+ font-style: normal;
+ font-weight: normal;
+ src: url('fonts/tinymce-mobile.woff?8x92w3') format('woff');
+}
+@media (min-device-width: 700px) {
+ .tinymce-mobile-outer-container,
+ .tinymce-mobile-outer-container input {
+ font-size: 25px;
+ }
+}
+@media (max-device-width: 700px) {
+ .tinymce-mobile-outer-container,
+ .tinymce-mobile-outer-container input {
+ font-size: 18px;
+ }
+}
+.tinymce-mobile-icon {
+ font-family: 'tinymce-mobile', sans-serif;
+}
+.mixin-flex-and-centre {
+ align-items: center;
+ display: flex;
+ justify-content: center;
+}
+.mixin-flex-bar {
+ align-items: center;
+ display: flex;
+ height: 100%;
+}
+.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe {
+ background-color: #fff;
+ width: 100%;
+}
+.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {
+ /* Note, on the iPod touch in landscape, this isn't visible when the navbar appears */
+ background-color: #207ab7;
+ border-radius: 50%;
+ bottom: 1em;
+ color: white;
+ font-size: 1em;
+ height: 2.1em;
+ position: fixed;
+ right: 2em;
+ width: 2.1em;
+ align-items: center;
+ display: flex;
+ justify-content: center;
+}
+@media only screen and (min-device-width:700px) {
+ .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {
+ font-size: 1.2em;
+ }
+}
+.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket {
+ height: 300px;
+ overflow: hidden;
+}
+.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe {
+ height: 100%;
+}
+.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip {
+ display: none;
+}
+/*
+ Note, that if you don't include this (::-webkit-file-upload-button), the toolbar width gets
+ increased and the whole body becomes scrollable. It's important!
+ */
+input[type="file"]::-webkit-file-upload-button {
+ display: none;
+}
+@media only screen and (min-device-width : 320px) and (max-device-width : 568px) and (orientation : landscape) {
+ .tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon {
+ bottom: 50%;
+ }
+}
diff --git a/static/css/skins-tinymce/ui/oxide/skin.mobile.min.css b/static/css/skins-tinymce/ui/oxide/skin.mobile.min.css
new file mode 100644
index 0000000..3a45cac
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide/skin.mobile.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+.tinymce-mobile-outer-container{all:initial;display:block}.tinymce-mobile-outer-container *{border:0;box-sizing:initial;cursor:inherit;float:none;line-height:1;margin:0;outline:0;padding:0;-webkit-tap-highlight-color:transparent;text-shadow:none;white-space:nowrap}.tinymce-mobile-icon-arrow-back::before{content:"\e5cd"}.tinymce-mobile-icon-image::before{content:"\e412"}.tinymce-mobile-icon-cancel-circle::before{content:"\e5c9"}.tinymce-mobile-icon-full-dot::before{content:"\e061"}.tinymce-mobile-icon-align-center::before{content:"\e234"}.tinymce-mobile-icon-align-left::before{content:"\e236"}.tinymce-mobile-icon-align-right::before{content:"\e237"}.tinymce-mobile-icon-bold::before{content:"\e238"}.tinymce-mobile-icon-italic::before{content:"\e23f"}.tinymce-mobile-icon-unordered-list::before{content:"\e241"}.tinymce-mobile-icon-ordered-list::before{content:"\e242"}.tinymce-mobile-icon-font-size::before{content:"\e245"}.tinymce-mobile-icon-underline::before{content:"\e249"}.tinymce-mobile-icon-link::before{content:"\e157"}.tinymce-mobile-icon-unlink::before{content:"\eca2"}.tinymce-mobile-icon-color::before{content:"\e891"}.tinymce-mobile-icon-previous::before{content:"\e314"}.tinymce-mobile-icon-next::before{content:"\e315"}.tinymce-mobile-icon-large-font::before,.tinymce-mobile-icon-style-formats::before{content:"\e264"}.tinymce-mobile-icon-undo::before{content:"\e166"}.tinymce-mobile-icon-redo::before{content:"\e15a"}.tinymce-mobile-icon-removeformat::before{content:"\e239"}.tinymce-mobile-icon-small-font::before{content:"\e906"}.tinymce-mobile-format-matches::after,.tinymce-mobile-icon-readonly-back::before{content:"\e5ca"}.tinymce-mobile-icon-small-heading::before{content:"small"}.tinymce-mobile-icon-large-heading::before{content:"large"}.tinymce-mobile-icon-large-heading::before,.tinymce-mobile-icon-small-heading::before{font-family:sans-serif;font-size:80%}.tinymce-mobile-mask-edit-icon::before{content:"\e254"}.tinymce-mobile-icon-back::before{content:"\e5c4"}.tinymce-mobile-icon-heading::before{content:"Headings";font-family:sans-serif;font-size:80%;font-weight:700}.tinymce-mobile-icon-h1::before{content:"H1";font-weight:700}.tinymce-mobile-icon-h2::before{content:"H2";font-weight:700}.tinymce-mobile-icon-h3::before{content:"H3";font-weight:700}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask{align-items:center;display:flex;justify-content:center;background:rgba(51,51,51,.5);height:100%;position:absolute;top:0;width:100%}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container{align-items:center;border-radius:50%;display:flex;flex-direction:column;font-family:sans-serif;font-size:1em;justify-content:space-between}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .mixin-menu-item{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{align-items:center;display:flex;justify-content:center;flex-direction:column;font-size:1em}@media only screen and (min-device-width:700px){.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section{font-size:1.2em}}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon{align-items:center;display:flex;justify-content:center;border-radius:50%;height:2.1em;width:2.1em;background-color:#fff;color:#207ab7}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section .tinymce-mobile-mask-tap-icon::before{content:"\e900";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-outer-container .tinymce-mobile-disabled-mask .tinymce-mobile-content-container .tinymce-mobile-content-tap-section:not(.tinymce-mobile-mask-tap-icon-selected) .tinymce-mobile-mask-tap-icon{z-index:2}.tinymce-mobile-android-container.tinymce-mobile-android-maximized{background:#fff;border:none;bottom:0;display:flex;flex-direction:column;left:0;position:fixed;right:0;top:0}.tinymce-mobile-android-container:not(.tinymce-mobile-android-maximized){position:relative}.tinymce-mobile-android-container .tinymce-mobile-editor-socket{display:flex;flex-grow:1}.tinymce-mobile-android-container .tinymce-mobile-editor-socket iframe{display:flex!important;flex-grow:1;height:auto!important}.tinymce-mobile-android-scroll-reload{overflow:hidden}:not(.tinymce-mobile-readonly-mode)>.tinymce-mobile-android-selection-context-toolbar{margin-top:23px}.tinymce-mobile-toolstrip{background:#fff;display:flex;flex:0 0 auto;z-index:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar{align-items:center;background-color:#fff;border-bottom:1px solid #ccc;display:flex;flex:1;height:2.5em;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex-shrink:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-exit-container{background:#f44336}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group.tinymce-mobile-toolbar-scrollable-group{flex-grow:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button{align-items:center;display:flex;height:80%;margin-left:2px;margin-right:2px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item.tinymce-mobile-toolbar-button.tinymce-mobile-toolbar-button-selected{background:#c8cbcf;color:#ccc}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:first-of-type,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar:not(.tinymce-mobile-context-toolbar) .tinymce-mobile-toolbar-group:last-of-type{background:#207ab7;color:#eceff1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group{align-items:center;display:flex;height:100%;flex:1;padding-bottom:.4em;padding-top:.4em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog{display:flex;min-height:1.5em;overflow:hidden;padding-left:0;padding-right:0;position:relative;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain{display:flex;height:100%;transition:left cubic-bezier(.4,0,1,1) .15s;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen{display:flex;flex:0 0 auto;justify-content:space-between;width:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen input{font-family:Sans-serif}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container{display:flex;flex-grow:1;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container .tinymce-mobile-input-container-x{-ms-grid-row-align:center;align-self:center;background:inherit;border:none;border-radius:50%;color:#888;font-size:.6em;font-weight:700;height:100%;padding-right:2px;position:absolute;right:0}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-input-container.tinymce-mobile-input-container-empty .tinymce-mobile-input-container-x{display:none}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous::before{align-items:center;display:flex;font-weight:700;height:100%;padding-left:.5em;padding-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-next.tinymce-mobile-toolbar-navigation-disabled::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serialised-dialog .tinymce-mobile-serialised-dialog-chain .tinymce-mobile-serialised-dialog-screen .tinymce-mobile-icon-previous.tinymce-mobile-toolbar-navigation-disabled::before{visibility:hidden}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item{color:#ccc;font-size:10px;line-height:10px;margin:0 2px;padding-top:3px}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-item.tinymce-mobile-dot-active{color:#c8cbcf}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-large-heading::before{margin-left:.5em;margin-right:.9em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-font::before,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-icon-small-heading::before{margin-left:.9em;margin-right:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider{display:flex;flex:1;margin-left:0;margin-right:0;padding:.28em 0;position:relative}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-size-container .tinymce-mobile-slider-size-line{background:#ccc;display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container{padding-left:2em;padding-right:2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container{align-items:center;display:flex;flex-grow:1;height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-slider-gradient-container .tinymce-mobile-slider-gradient{background:linear-gradient(to right,red 0,#feff00 17%,#0f0 33%,#00feff 50%,#00f 67%,#ff00fe 83%,red 100%);display:flex;flex:1;height:.2em;margin-bottom:.3em;margin-top:.3em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-black{background:#000;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider.tinymce-mobile-hue-slider-container .tinymce-mobile-hue-slider-white{background:#fff;height:.2em;margin-bottom:.3em;margin-top:.3em;width:1.2em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb{align-items:center;background-clip:padding-box;background-color:#455a64;border:.5em solid rgba(136,136,136,0);border-radius:3em;bottom:0;color:#fff;display:flex;height:.5em;justify-content:center;left:-10px;margin:auto;position:absolute;top:0;transition:border 120ms cubic-bezier(.39,.58,.57,1);width:.5em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-slider .tinymce-mobile-slider-thumb.tinymce-mobile-thumb-active{border:.5em solid rgba(136,136,136,.39)}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper,.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group>div{align-items:center;display:flex;height:100%;flex:1}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-serializer-wrapper{flex-direction:column;justify-content:center}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item{align-items:center;display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-toolbar-group-item:not(.tinymce-mobile-serialised-dialog){height:100%}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group .tinymce-mobile-dot-container{display:flex}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input{background:#fff;border:none;border-radius:0;color:#455a64;flex-grow:1;font-size:.85em;padding-bottom:.1em;padding-left:5px;padding-top:.1em}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::-webkit-input-placeholder{color:#888}.tinymce-mobile-toolstrip .tinymce-mobile-toolbar.tinymce-mobile-context-toolbar .tinymce-mobile-toolbar-group input::placeholder{color:#888}.tinymce-mobile-dropup{background:#fff;display:flex;overflow:hidden;width:100%}.tinymce-mobile-dropup.tinymce-mobile-dropup-shrinking{transition:height .3s ease-out}.tinymce-mobile-dropup.tinymce-mobile-dropup-growing{transition:height .3s ease-in}.tinymce-mobile-dropup.tinymce-mobile-dropup-closed{flex-grow:0}.tinymce-mobile-dropup.tinymce-mobile-dropup-open:not(.tinymce-mobile-dropup-growing){flex-grow:1}.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}@media only screen and (orientation:landscape){.tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:200px}}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-dropup:not(.tinymce-mobile-dropup-closed){min-height:150px}}.tinymce-mobile-styles-menu{font-family:sans-serif;outline:4px solid #000;overflow:hidden;position:relative;width:100%}.tinymce-mobile-styles-menu [role=menu]{display:flex;flex-direction:column;height:100%;position:absolute;width:100%}.tinymce-mobile-styles-menu [role=menu].transitioning{transition:transform .5s ease-in-out}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item{border-bottom:1px solid #ddd;color:#455a64;cursor:pointer;display:flex;padding:1em 1em;position:relative}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser .tinymce-mobile-styles-collapse-icon::before{color:#455a64;content:"\e314";font-family:tinymce-mobile,sans-serif}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-styles-item-is-menu::after{color:#455a64;content:"\e315";font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-item.tinymce-mobile-format-matches::after{font-family:tinymce-mobile,sans-serif;padding-left:1em;padding-right:1em;position:absolute;right:0}.tinymce-mobile-styles-menu .tinymce-mobile-styles-collapser,.tinymce-mobile-styles-menu .tinymce-mobile-styles-separator{align-items:center;background:#fff;border-top:#455a64;color:#455a64;display:flex;min-height:2.5em;padding-left:1em;padding-right:1em}.tinymce-mobile-styles-menu [data-transitioning-destination=before][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=before]{transform:translate(-100%)}.tinymce-mobile-styles-menu [data-transitioning-destination=current][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=current]{transform:translate(0)}.tinymce-mobile-styles-menu [data-transitioning-destination=after][data-transitioning-state],.tinymce-mobile-styles-menu [data-transitioning-state=after]{transform:translate(100%)}@font-face{font-family:tinymce-mobile;font-style:normal;font-weight:400;src:url(fonts/tinymce-mobile.woff?8x92w3) format('woff')}@media (min-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:25px}}@media (max-device-width:700px){.tinymce-mobile-outer-container,.tinymce-mobile-outer-container input{font-size:18px}}.tinymce-mobile-icon{font-family:tinymce-mobile,sans-serif}.mixin-flex-and-centre{align-items:center;display:flex;justify-content:center}.mixin-flex-bar{align-items:center;display:flex;height:100%}.tinymce-mobile-outer-container .tinymce-mobile-editor-socket iframe{background-color:#fff;width:100%}.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{background-color:#207ab7;border-radius:50%;bottom:1em;color:#fff;font-size:1em;height:2.1em;position:fixed;right:2em;width:2.1em;align-items:center;display:flex;justify-content:center}@media only screen and (min-device-width:700px){.tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{font-size:1.2em}}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket{height:300px;overflow:hidden}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-editor-socket iframe{height:100%}.tinymce-mobile-outer-container:not(.tinymce-mobile-fullscreen-maximized) .tinymce-mobile-toolstrip{display:none}input[type=file]::-webkit-file-upload-button{display:none}@media only screen and (min-device-width :320px) and (max-device-width :568px) and (orientation :landscape){.tinymce-mobile-ios-container .tinymce-mobile-editor-socket .tinymce-mobile-mask-edit-icon{bottom:50%}}
diff --git a/static/css/skins-tinymce/ui/oxide/skin.shadowdom.css b/static/css/skins-tinymce/ui/oxide/skin.shadowdom.css
new file mode 100644
index 0000000..715978b
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide/skin.shadowdom.css
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+body.tox-dialog__disable-scroll {
+ overflow: hidden;
+}
+.tox-fullscreen {
+ border: 0;
+ height: 100%;
+ left: 0;
+ margin: 0;
+ overflow: hidden;
+ -ms-scroll-chaining: none;
+ overscroll-behavior: none;
+ padding: 0;
+ position: fixed;
+ top: 0;
+ touch-action: pinch-zoom;
+ width: 100%;
+}
+.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle {
+ display: none;
+}
+.tox.tox-tinymce.tox-fullscreen {
+ background-color: transparent;
+ z-index: 1200;
+}
+.tox-shadowhost.tox-fullscreen {
+ z-index: 1200;
+}
+.tox-fullscreen .tox.tox-tinymce-aux,
+.tox-fullscreen ~ .tox.tox-tinymce-aux {
+ z-index: 1201;
+}
diff --git a/static/css/skins-tinymce/ui/oxide/skin.shadowdom.min.css b/static/css/skins-tinymce/ui/oxide/skin.shadowdom.min.css
new file mode 100644
index 0000000..9ba6e02
--- /dev/null
+++ b/static/css/skins-tinymce/ui/oxide/skin.shadowdom.min.css
@@ -0,0 +1,7 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ */
+body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox.tox-tinymce.tox-fullscreen{background-color:transparent;z-index:1200}.tox-shadowhost.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201}
diff --git a/static/js/hmcrf.js b/static/js/hmcrf.js
new file mode 100644
index 0000000..544eed0
--- /dev/null
+++ b/static/js/hmcrf.js
@@ -0,0 +1,109 @@
+ $(document).ready(function(){
+ $('.hminput ,.hmtextarea').on('change focusout keydown', function() {
+ this.setAttribute('value', this.value)
+ })
+ $('textarea').each(function(index,elm){
+ $(elm).text(elm.getAttribute('value') || '')
+ })
+ const initCRF = function() {
+ // const doc = window.document
+ const laydate = window.laydate
+ $('.hminput').each(function() {
+ const elm = this
+ const hmDataType = elm.getAttribute('data-hm_type')
+
+ // 时间控件
+ if (hmDataType === 'date' || hmDataType === 'datetime' || hmDataType === 'time') {
+ laydate.render({
+ elem: '#' + elm.id,
+ type: hmDataType,
+ done: function(value, date, endDate) {
+ elm.setAttribute('value', value)
+ }
+ })
+ }
+ })
+ $('.hmselect').on('click', function() {
+ this.setAttribute('value', this.value)
+ $(this).find(`option[value='${this.value}']`).attr("selected",'selected');
+ $(this).find(`option[value!='${this.value}']`).each((index, item) => {
+ if (item.value !== this.value) { item.removeAttribute('selected') }
+ })
+ // 把单位赋值给输入框的title
+ const id = $(this)[0].getAttribute('data-hm_id')
+ $(`input[data-hm_id='${id}']`).each((index, item) => {
+ item.setAttribute("title",this.value);
+ })
+
+ })
+
+ $('.DDDs').on('click', function() {
+ this.setAttribute('value', this.value)
+ $(this).find(`option[value='${this.value}']`).attr("selected",'selected');
+ $(this).find(`option[value!='${this.value}']`).each((index, item) => {
+ if (item.value !== this.value) { item.removeAttribute('selected') }
+ })
+ })
+
+ $('.hmcheckbox').on('change', function() {
+ $(this).attr('checked', this.checked)
+ })
+
+ $('.hmradio').on('change', function() {
+ const elm = this
+ $(elm).attr('checked', this.checked)
+ $(`input:radio[name='${this.name}']`).each((index, item) => {
+ if (item.value !== elm.value) { item.removeAttribute('checked') }
+ })
+ // 把单位赋值给输入框的title
+ const id = $(this)[0].getAttribute('data-hm_id')
+ $(`input:text[data-hm_id='${id}']`).each((index, item) => {
+ item.setAttribute("title",this.value);
+ // 给单位radio赋个标记unit
+ $(`input:radio[data-hm_id='${id}']`).each((index, item) => {
+ item.setAttribute("unit",'unit');
+ })
+ })
+ })
+ }
+
+ initCRF()
+ })
+
+ /** 对象数组,对象格式
+ const demo = {
+ both: null,
+ id: '4',
+ name: '眼压',
+ od: '20.3',
+ os: '16',
+ recId: '9379374',
+ time: '2013-04-15 13:27:14'
+ }
+ */
+ function dataFill(itemList){
+ console.log(itemList)
+ itemList ? itemList.forEach(item => {
+ const eyeType=item.both ? '' : ''
+ // data-hm_bd_id--字典表/table/dict/getTableDictTreeForCRF--id
+ // 根据字典表id填充数据
+ // console.log(item.id);
+ // console.log( $(`[data-hm_bd_id='${item.id}']`));
+ $(`[data-hm_bd_id='${item.id}']`).each(function(index,elm){
+ // console.log(elm);
+ if(elm.getAttribute("data-hm_bd_eye_type") === 'od'){
+ $(elm).attr('value',item.od || '')
+ } else if(elm.getAttribute("data-hm_bd_eye_type")==='os'){
+ $(elm).attr('value',item.os || '')
+ } else {
+ $('textarea').each(function(index,elm){
+ $(elm).text(elm.getAttribute('value') || '')
+ $(elm).width(elm.getAttribute('value') ? (elm.getAttribute('value').length * 16) + 'px' : '450px')
+ })
+ $(elm).attr('value',item.value || '')
+ }
+ })
+ }): $('textarea').each(function(index,elm){
+ $(elm).width(elm.getAttribute('value') ? (elm.getAttribute('value').length * 16) + 'px' : '450px')
+ })
+ }
diff --git a/static/js/jquery-3.5.1/jquery.js b/static/js/jquery-3.5.1/jquery.js
new file mode 100644
index 0000000..5093733
--- /dev/null
+++ b/static/js/jquery-3.5.1/jquery.js
@@ -0,0 +1,10872 @@
+/*!
+ * jQuery JavaScript Library v3.5.1
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2020-05-04T22:49Z
+ */
+( function( global, factory ) {
+
+ "use strict";
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var flat = arr.flat ? function( array ) {
+ return arr.flat.call( array );
+} : function( array ) {
+ return arr.concat.apply( [], array );
+};
+
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+var isFunction = function isFunction( obj ) {
+
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML