f7cloud_client/apps/text/js/MenuBar-aZwqxDEv.chunk.mjs.map
2026-03-05 13:40:40 +00:00

1 line
179 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":"MenuBar-aZwqxDEv.chunk.mjs","sources":["../node_modules/y-prosemirror/src/plugins/undo-plugin.js","../node_modules/@tiptap/extension-collaboration/dist/index.js","../node_modules/@nextcloud/vue/dist/chunks/NcDialog-DDuqQeT-.mjs","../src/components/Menu/ActionListItem.vue","../src/components/Menu/ActionList.vue","../src/components/Menu/ActionSingle.vue","../src/components/Menu/ToolBarLogic.js","../src/components/Menu/ReadonlyBar.vue","../src/composables/useEditorWidth.ts","../node_modules/@nextcloud/vue/dist/chunks/NcActionCheckbox-D9aQuEYw.mjs","../node_modules/path-normalize/lib/index.js","../src/services/AttachmentResolver.js","../node_modules/@tiptap/extension-node-range/dist/index.js","../node_modules/@tiptap/extension-drag-handle/dist/index.js","../node_modules/@tiptap/extension-drag-handle-vue-2/dist/index.js","../node_modules/vue-material-design-icons/DragVertical.vue","../src/components/Editor/FloatingButtons.vue","../src/components/Editor/ContentContainer.vue","../src/apis/attach.ts","../src/components/Editor/MediaHandler.vue","../src/components/Editor/MainContainer.vue","../src/components/Editor/Wrapper.vue","../src/helpers/platform.js","../src/components/HelpModal.vue","../src/components/Menu/ActionFormattingHelp.vue","../src/components/Menu/CharacterCount.vue","../src/components/Menu/WidthToggle.vue","../src/components/Menu/MenuBar.vue"],"sourcesContent":["import { Plugin } from 'prosemirror-state'\n\nimport { getRelativeSelection } from './sync-plugin.js'\nimport { UndoManager, Item, ContentType, XmlElement, Text } from 'yjs'\nimport { yUndoPluginKey, ySyncPluginKey } from './keys.js'\n\n/**\n * @typedef {Object} UndoPluginState\n * @property {import('yjs').UndoManager} undoManager\n * @property {ReturnType<typeof getRelativeSelection> | null} prevSel\n * @property {boolean} hasUndoOps\n * @property {boolean} hasRedoOps\n */\n\n/**\n * Undo the last user action\n *\n * @param {import('prosemirror-state').EditorState} state\n * @return {boolean} whether a change was undone\n */\nexport const undo = state => yUndoPluginKey.getState(state)?.undoManager?.undo() != null\n\n/**\n * Redo the last user action\n *\n * @param {import('prosemirror-state').EditorState} state\n * @return {boolean} whether a change was undone\n */\nexport const redo = state => yUndoPluginKey.getState(state)?.undoManager?.redo() != null\n\n/**\n * Undo the last user action if there are undo operations available\n * @type {import('prosemirror-state').Command}\n */\nexport const undoCommand = (state, dispatch) => dispatch == null ? yUndoPluginKey.getState(state)?.undoManager?.canUndo() : undo(state)\n\n/**\n * Redo the last user action if there are redo operations available\n * @type {import('prosemirror-state').Command}\n */\nexport const redoCommand = (state, dispatch) => dispatch == null ? yUndoPluginKey.getState(state)?.undoManager?.canRedo() : redo(state)\n\nexport const defaultProtectedNodes = new Set(['paragraph'])\n\n/**\n * @param {import('yjs').Item} item\n * @param {Set<string>} protectedNodes\n * @returns {boolean}\n */\nexport const defaultDeleteFilter = (item, protectedNodes) => !(item instanceof Item) ||\n !(item.content instanceof ContentType) ||\n !(item.content.type instanceof Text ||\n (item.content.type instanceof XmlElement && protectedNodes.has(item.content.type.nodeName))) ||\n item.content.type._length === 0\n\n/**\n * @param {object} [options]\n * @param {Set<string>} [options.protectedNodes]\n * @param {any[]} [options.trackedOrigins]\n * @param {import('yjs').UndoManager | null} [options.undoManager]\n */\nexport const yUndoPlugin = ({ protectedNodes = defaultProtectedNodes, trackedOrigins = [], undoManager = null } = {}) => new Plugin({\n key: yUndoPluginKey,\n state: {\n init: (initargs, state) => {\n // TODO: check if plugin order matches and fix\n const ystate = ySyncPluginKey.getState(state)\n const _undoManager = undoManager || new UndoManager(ystate.type, {\n trackedOrigins: new Set([ySyncPluginKey].concat(trackedOrigins)),\n deleteFilter: (item) => defaultDeleteFilter(item, protectedNodes),\n captureTransaction: tr => tr.meta.get('addToHistory') !== false\n })\n return {\n undoManager: _undoManager,\n prevSel: null,\n hasUndoOps: _undoManager.undoStack.length > 0,\n hasRedoOps: _undoManager.redoStack.length > 0\n }\n },\n apply: (tr, val, oldState, state) => {\n const binding = ySyncPluginKey.getState(state).binding\n const undoManager = val.undoManager\n const hasUndoOps = undoManager.undoStack.length > 0\n const hasRedoOps = undoManager.redoStack.length > 0\n if (binding) {\n return {\n undoManager,\n prevSel: getRelativeSelection(binding, oldState),\n hasUndoOps,\n hasRedoOps\n }\n } else {\n if (hasUndoOps !== val.hasUndoOps || hasRedoOps !== val.hasRedoOps) {\n return Object.assign({}, val, {\n hasUndoOps: undoManager.undoStack.length > 0,\n hasRedoOps: undoManager.redoStack.length > 0\n })\n } else { // nothing changed\n return val\n }\n }\n }\n },\n view: view => {\n const ystate = ySyncPluginKey.getState(view.state)\n const undoManager = yUndoPluginKey.getState(view.state).undoManager\n undoManager.on('stack-item-added', ({ stackItem }) => {\n const binding = ystate.binding\n if (binding) {\n stackItem.meta.set(binding, yUndoPluginKey.getState(view.state).prevSel)\n }\n })\n undoManager.on('stack-item-popped', ({ stackItem }) => {\n const binding = ystate.binding\n if (binding) {\n binding.beforeTransactionSelection = stackItem.meta.get(binding) || binding.beforeTransactionSelection\n }\n })\n return {\n destroy: () => {\n undoManager.destroy()\n }\n }\n }\n})\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { yUndoPluginKey, undo, redo, yUndoPlugin, ySyncPlugin, yXmlFragmentToProsemirrorJSON, ySyncPluginKey } from 'y-prosemirror';\n\n/**\n * This extension allows you to collaborate with others in real-time.\n * @see https://tiptap.dev/api/extensions/collaboration\n */\nconst Collaboration = Extension.create({\n name: 'collaboration',\n priority: 1000,\n addOptions() {\n return {\n document: null,\n field: 'default',\n fragment: null,\n };\n },\n addStorage() {\n return {\n isDisabled: false,\n };\n },\n onCreate() {\n if (this.editor.extensionManager.extensions.find(extension => extension.name === 'history')) {\n console.warn('[tiptap warn]: \"@tiptap/extension-collaboration\" comes with its own history support and is not compatible with \"@tiptap/extension-history\".');\n }\n },\n addCommands() {\n return {\n undo: () => ({ tr, state, dispatch }) => {\n tr.setMeta('preventDispatch', true);\n const undoManager = yUndoPluginKey.getState(state).undoManager;\n if (undoManager.undoStack.length === 0) {\n return false;\n }\n if (!dispatch) {\n return true;\n }\n return undo(state);\n },\n redo: () => ({ tr, state, dispatch }) => {\n tr.setMeta('preventDispatch', true);\n const undoManager = yUndoPluginKey.getState(state).undoManager;\n if (undoManager.redoStack.length === 0) {\n return false;\n }\n if (!dispatch) {\n return true;\n }\n return redo(state);\n },\n };\n },\n addKeyboardShortcuts() {\n return {\n 'Mod-z': () => this.editor.commands.undo(),\n 'Mod-y': () => this.editor.commands.redo(),\n 'Shift-Mod-z': () => this.editor.commands.redo(),\n };\n },\n addProseMirrorPlugins() {\n var _a;\n const fragment = this.options.fragment\n ? this.options.fragment\n : this.options.document.getXmlFragment(this.options.field);\n // Quick fix until there is an official implementation (thanks to @hamflx).\n // See https://github.com/yjs/y-prosemirror/issues/114 and https://github.com/yjs/y-prosemirror/issues/102\n const yUndoPluginInstance = yUndoPlugin(this.options.yUndoOptions);\n const originalUndoPluginView = yUndoPluginInstance.spec.view;\n yUndoPluginInstance.spec.view = (view) => {\n const { undoManager } = yUndoPluginKey.getState(view.state);\n if (undoManager.restore) {\n undoManager.restore();\n undoManager.restore = () => {\n // noop\n };\n }\n const viewRet = originalUndoPluginView ? originalUndoPluginView(view) : undefined;\n return {\n destroy: () => {\n const hasUndoManSelf = undoManager.trackedOrigins.has(undoManager);\n // eslint-disable-next-line no-underscore-dangle\n const observers = undoManager._observers;\n undoManager.restore = () => {\n if (hasUndoManSelf) {\n undoManager.trackedOrigins.add(undoManager);\n }\n undoManager.doc.on('afterTransaction', undoManager.afterTransactionHandler);\n // eslint-disable-next-line no-underscore-dangle\n undoManager._observers = observers;\n };\n if (viewRet === null || viewRet === void 0 ? void 0 : viewRet.destroy) {\n viewRet.destroy();\n }\n },\n };\n };\n const ySyncPluginOptions = {\n ...this.options.ySyncOptions,\n onFirstRender: this.options.onFirstRender,\n };\n const ySyncPluginInstance = ySyncPlugin(fragment, ySyncPluginOptions);\n if (this.editor.options.enableContentCheck) {\n (_a = fragment.doc) === null || _a === void 0 ? void 0 : _a.on('beforeTransaction', () => {\n try {\n const jsonContent = (yXmlFragmentToProsemirrorJSON(fragment));\n if (jsonContent.content.length === 0) {\n return;\n }\n this.editor.schema.nodeFromJSON(jsonContent).check();\n }\n catch (error) {\n this.editor.emit('contentError', {\n error: error,\n editor: this.editor,\n disableCollaboration: () => {\n var _a;\n (_a = fragment.doc) === null || _a === void 0 ? void 0 : _a.destroy();\n this.storage.isDisabled = true;\n },\n });\n // If the content is invalid, return false to prevent the transaction from being applied\n return false;\n }\n });\n }\n return [\n ySyncPluginInstance,\n yUndoPluginInstance,\n // Only add the filterInvalidContent plugin if content checking is enabled\n this.editor.options.enableContentCheck\n && new Plugin({\n key: new PluginKey('filterInvalidContent'),\n filterTransaction: () => {\n var _a;\n // When collaboration is disabled, prevent any sync transactions from being applied\n if (this.storage.isDisabled) {\n // Destroy the Yjs document to prevent any further sync transactions\n (_a = fragment.doc) === null || _a === void 0 ? void 0 : _a.destroy();\n return true;\n }\n return true;\n },\n }),\n ].filter(Boolean);\n },\n});\n\n/**\n * Checks if a transaction was originated from a Yjs change.\n * @param {Transaction} transaction - The transaction to check.\n * @returns {boolean} - True if the transaction was originated from a Yjs change, false otherwise.\n * @example\n * const transaction = new Transaction(doc)\n * const isOrigin = isChangeOrigin(transaction) // returns false\n */\nfunction isChangeOrigin(transaction) {\n return !!transaction.getMeta(ySyncPluginKey);\n}\n\nexport { Collaboration, Collaboration as default, isChangeOrigin };\n//# sourceMappingURL=index.js.map\n","import '../assets/NcDialog-COuFb47k.css';\nimport { useElementSize } from \"@vueuse/core\";\nimport { defineComponent, ref, computed } from \"vue\";\nimport { G as GenRandomId } from \"./GenRandomId-F5ebeBB_.mjs\";\nimport { N as NcDialogButton } from \"./NcDialogButton-P7Ryycqk.mjs\";\nimport NcModal from \"../Components/NcModal.mjs\";\nimport { n as normalizeComponent } from \"./_plugin-vue2_normalizer-DU4iP6Vu.mjs\";\nconst _sfc_main = defineComponent({\n name: \"NcDialog\",\n components: {\n NcDialogButton,\n NcModal\n },\n props: {\n /** Name of the dialog (the heading) */\n name: {\n type: String,\n required: true\n },\n /** Text of the dialog */\n message: {\n type: String,\n default: \"\"\n },\n /** Additional elements to add to the focus trap */\n additionalTrapElements: {\n type: Array,\n validator: (arr) => {\n return Array.isArray(arr) && arr.every((element) => typeof element === \"string\" || element instanceof HTMLElement);\n },\n default: () => []\n },\n /**\n * The element where to mount the dialog, if `null` is passed the dialog is mounted in place\n *\n * @default 'body'\n */\n container: {\n type: String,\n required: false,\n default: \"body\"\n },\n /**\n * Whether the dialog should be shown\n *\n * @default true\n */\n open: {\n type: Boolean,\n // eslint-disable-next-line vue/no-boolean-default\n default: true\n },\n /**\n * Size of the underlying NcModal\n *\n * @default 'small'\n * @type {'small'|'normal'|'large'|'full'}\n */\n size: {\n type: String,\n required: false,\n default: \"small\",\n validator: (value) => typeof value === \"string\" && [\"small\", \"normal\", \"large\", \"full\"].includes(value)\n },\n /**\n * Buttons to display\n *\n * @default []\n */\n buttons: {\n type: Array,\n required: false,\n default: () => [],\n validator: (value) => Array.isArray(value) && value.every((element) => typeof element === \"object\")\n },\n /**\n * Do not show the close button for the dialog.\n *\n * @default false\n */\n noClose: {\n type: Boolean,\n default: false\n },\n /**\n * Set to false to no show a close button on the dialog\n *\n * @deprecated - Use `noClose` instead. Will be removed in v9.\n * @default true\n */\n canClose: {\n type: Boolean,\n // eslint-disable-next-line vue/no-boolean-default\n default: true\n },\n /**\n * Close the dialog if the user clicked outside of the dialog\n * Only relevant if `canClose` is set to true.\n */\n closeOnClickOutside: {\n type: Boolean,\n default: false\n },\n /**\n * Make the dialog wrapper a HTML form element.\n * The buttons will be wrapped within the form so they can be used as submit / reset buttons.\n * Please note that when using the property the `navigation` should not be used.\n */\n isForm: {\n type: Boolean,\n default: false\n },\n /**\n * Declare if hiding the modal should be animated\n *\n * @default false\n */\n outTransition: {\n type: Boolean,\n default: false\n },\n /**\n * Optionally pass additional classes which will be set on the navigation for custom styling\n *\n * @default ''\n * @example\n * ```html\n * <DialogBase :navigation-classes=\"['mydialog-navigation']\"><!-- --></DialogBase>\n * <!-- ... -->\n * <style lang=\"scss\">\n * :deep(.mydialog-navigation) {\n * flex-direction: row-reverse;\n * }\n * </style>\n * ```\n */\n navigationClasses: {\n type: [String, Array, Object],\n required: false,\n default: \"\"\n },\n /**\n * aria-label for the dialog navigation.\n * Use it when you want to provide a more meaningful label than the dialog name.\n *\n * By default, navigation is labeled by the dialog name.\n */\n navigationAriaLabel: {\n type: String,\n required: false,\n default: \"\"\n },\n /**\n * aria-labelledby for the dialog navigation.\n * Use it when you have an implicit navigation label (e.g. a heading).\n *\n * By default, navigation is labeled by the dialog name.\n */\n navigationAriaLabelledby: {\n type: String,\n required: false,\n default: \"\"\n },\n /**\n * Optionally pass additional classes which will be set on the content wrapper for custom styling\n *\n * @default ''\n */\n contentClasses: {\n type: [String, Array, Object],\n required: false,\n default: \"\"\n },\n /**\n * Optionally pass additional classes which will be set on the dialog itself\n * (the default `class` attribute will be set on the modal wrapper)\n *\n * @default ''\n */\n dialogClasses: {\n type: [String, Array, Object],\n required: false,\n default: \"\"\n }\n },\n emits: [\"closing\", \"update:open\", \"submit\"],\n setup(props, { emit, slots }) {\n const wrapper = ref();\n const { width: dialogWidth } = useElementSize(wrapper, { width: 900 });\n const isNavigationCollapsed = computed(() => dialogWidth.value < 876);\n const hasNavigation = computed(() => slots?.navigation !== void 0);\n const navigationId = GenRandomId();\n const navigationAriaLabelAttr = computed(() => props.navigationAriaLabel || void 0);\n const navigationAriaLabelledbyAttr = computed(() => {\n if (props.navigationAriaLabel) {\n return void 0;\n }\n return props.navigationAriaLabelledby || navigationId;\n });\n const dialogElement = ref();\n const dialogTagName = computed(() => props.isForm && !hasNavigation.value ? \"form\" : \"div\");\n const dialogListeners = computed(() => dialogTagName.value === \"form\" ? {\n /**\n * @param {SubmitEvent} event Form submit event\n */\n submit(event) {\n event.preventDefault();\n emit(\"submit\", event);\n },\n /**\n * @param {Event} event Form submit event\n */\n reset(event) {\n event.preventDefault();\n emit(\"reset\", event);\n }\n } : {});\n const showModal = ref(true);\n function handleButtonClose(button, result) {\n if ((button.type === \"submit\" || button.nativeType === \"submit\") && dialogTagName.value === \"form\" && !dialogElement.value.reportValidity()) {\n return;\n }\n handleClosing(result);\n window.setTimeout(() => handleClosed(), 300);\n }\n function handleClosing(result) {\n showModal.value = false;\n emit(\"closing\", result);\n }\n function handleClosed() {\n showModal.value = true;\n emit(\"update:open\", false);\n }\n const modalProps = computed(() => ({\n noClose: props.noClose || !props.canClose,\n container: props.container === void 0 ? \"body\" : props.container,\n // we do not pass the name as we already have the name as the headline\n // name: props.name,\n // But we need to set the correct label id so the dialog is labelled\n labelId: navigationId,\n size: props.size,\n show: props.open && showModal.value,\n outTransition: props.outTransition,\n closeOnClickOutside: props.closeOnClickOutside,\n additionalTrapElements: props.additionalTrapElements\n }));\n return {\n dialogElement,\n dialogListeners,\n dialogTagName,\n handleButtonClose,\n handleClosing,\n handleClosed,\n hasNavigation,\n navigationId,\n navigationAriaLabelAttr,\n navigationAriaLabelledbyAttr,\n isNavigationCollapsed,\n modalProps,\n wrapper\n };\n }\n});\nvar _sfc_render = function render() {\n var _vm = this, _c = _vm._self._c;\n _vm._self._setupProxy;\n return _vm.open ? _c(\"NcModal\", _vm._b({ staticClass: \"dialog__modal\", attrs: { \"enable-slideshow\": false, \"enable-swipe\": false }, on: { \"close\": _vm.handleClosed, \"update:show\": function($event) {\n return _vm.handleClosing();\n } } }, \"NcModal\", _vm.modalProps, false), [_c(\"h2\", { staticClass: \"dialog__name\", attrs: { \"id\": _vm.navigationId }, domProps: { \"textContent\": _vm._s(_vm.name) } }), _c(_vm.dialogTagName, _vm._g({ ref: \"dialogElement\", tag: \"component\", staticClass: \"dialog\", class: _vm.dialogClasses }, _vm.dialogListeners), [_c(\"div\", { ref: \"wrapper\", staticClass: \"dialog__wrapper\", class: { \"dialog__wrapper--collapsed\": _vm.isNavigationCollapsed } }, [_vm.hasNavigation ? _c(\"nav\", { staticClass: \"dialog__navigation\", class: _vm.navigationClasses, attrs: { \"aria-label\": _vm.navigationAriaLabelAttr, \"aria-labelledby\": _vm.navigationAriaLabelledbyAttr } }, [_vm._t(\"navigation\", null, { \"isCollapsed\": _vm.isNavigationCollapsed })], 2) : _vm._e(), _c(\"div\", { staticClass: \"dialog__content\", class: _vm.contentClasses }, [_vm._t(\"default\", function() {\n return [_c(\"p\", { staticClass: \"dialog__text\" }, [_vm._v(\" \" + _vm._s(_vm.message) + \" \")])];\n })], 2)]), _c(\"div\", { staticClass: \"dialog__actions\" }, [_vm._t(\"actions\", function() {\n return _vm._l(_vm.buttons, function(button, idx) {\n return _c(\"NcDialogButton\", _vm._b({ key: idx, on: { \"click\": (_, result) => _vm.handleButtonClose(button, result) } }, \"NcDialogButton\", button, false));\n });\n })], 2)])], 1) : _vm._e();\n};\nvar _sfc_staticRenderFns = [];\nvar __component__ = /* @__PURE__ */ normalizeComponent(\n _sfc_main,\n _sfc_render,\n _sfc_staticRenderFns,\n false,\n null,\n \"66c29e13\"\n);\nconst NcDialog = __component__.exports;\nexport {\n NcDialog as N\n};\n//# sourceMappingURL=NcDialog-DDuqQeT-.mjs.map\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NextcloudVueNcActionButton\n\t\tclass=\"entry-single-action entry-action entry-action-item\"\n\t\t:title=\"listItemTooltip || undefined\"\n\t\t:class=\"state.class\"\n\t\t:disabled=\"state.disabled\"\n\t\t:aria-keyshortcuts=\"keyshortcuts || undefined\"\n\t\t:data-text-action-entry=\"actionEntry.key\"\n\t\t:type=\"state.type\"\n\t\t:model-value=\"state.type !== 'button' ? state.active : undefined\"\n\t\tclose-after-click\n\t\tv-on=\"$listeners\"\n\t\t@click=\"runAction\">\n\t\t<template #icon>\n\t\t\t<component :is=\"icon\" />\n\t\t</template>\n\t\t{{ label }}\n\t</NextcloudVueNcActionButton>\n</template>\n\n<script>\nimport NextcloudVueNcActionButton from '@nextcloud/vue/components/NcActionButton'\nimport { BaseActionEntry } from './BaseActionEntry.js'\n\nexport default {\n\t// This component is used as a direct child of NcActions.\n\t// Even if it actually renders NcActionButton, NcActions cannot see it due to rendering limitations in Vue.\n\t// Though it works in general, NcActions doesn't handle it correctly. See NcActions docs for details.\n\t// Hotfix - rename the component to NcActionButton because it represents and renders it.\n\t// eslint-disable-next-line vue/match-component-file-name\n\tname: 'NcActionButton',\n\n\tcomponents: {\n\t\tNextcloudVueNcActionButton,\n\t},\n\n\textends: BaseActionEntry,\n\n\tmounted() {\n\t\tthis.editor?.on('transaction', () => this.updateState())\n\t},\n\n\tmethods: {\n\t\trunAction() {\n\t\t\tconst { actionEntry } = this\n\n\t\t\tif (actionEntry.click) {\n\t\t\t\tactionEntry.click(this)\n\t\t\t} else {\n\t\t\t\t// Some actions run themselves.\n\t\t\t\t// others still need to have .run() called upon them.\n\t\t\t\tactionEntry.action(this.editor?.chain().focus(), this.editor)?.run()\n\t\t\t}\n\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.$emit('trigged', { ...actionEntry })\n\t\t\t})\n\t\t},\n\t},\n}\n</script>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcActions\n\t\t:title=\"tooltip\"\n\t\tclass=\"entry-list-action entry-action\"\n\t\tv-bind=\"state\"\n\t\t:container=\"menuIDSelector\"\n\t\t:aria-label=\"labelWithSelected\"\n\t\t:type=\"state.active ? 'primary' : 'tertiary'\"\n\t\t:force-menu=\"true\"\n\t\t:data-text-action-entry=\"actionEntry.key\"\n\t\t:data-text-action-active=\"activeKey\"\n\t\t:disabled=\"!isEnabled\"\n\t\t@update:open=\"onOpenChange\">\n\t\t<template #icon>\n\t\t\t<component :is=\"icon\" :key=\"iconKey\" />\n\t\t</template>\n\t\t<template v-for=\"child in children\">\n\t\t\t<NcActionSeparator\n\t\t\t\tv-if=\"child.isSeparator\"\n\t\t\t\t:key=\"`child-${child.key}`\" />\n\t\t\t<ActionListItem\n\t\t\t\tv-else\n\t\t\t\t:key=\"`child-${child.key}`\"\n\t\t\t\t:active=\"currentChild?.key === child.key\"\n\t\t\t\tis-item\n\t\t\t\t:action-entry=\"child\"\n\t\t\t\tv-on=\"$listeners\"\n\t\t\t\t@trigged=\"onTrigger\" />\n\t\t</template>\n\t\t<slot v-bind=\"{ visible }\" name=\"lastAction\" />\n\t</NcActions>\n</template>\n\n<script>\nimport { t } from '@nextcloud/l10n'\nimport NcActions from '@nextcloud/vue/components/NcActions'\nimport NcActionSeparator from '@nextcloud/vue/components/NcActionSeparator'\nimport debounce from 'debounce'\nimport { useOutlineStateMixin } from '../Editor/Wrapper.provider.js'\nimport ActionListItem from './ActionListItem.vue'\nimport { BaseActionEntry } from './BaseActionEntry.js'\nimport { useMenuIDMixin } from './MenuBar.provider.js'\nimport { getActionState, getIsActive } from './utils.js'\n\nexport default {\n\tname: 'ActionList',\n\tcomponents: {\n\t\tNcActions,\n\t\tNcActionSeparator,\n\t\tActionListItem,\n\t},\n\textends: BaseActionEntry,\n\tmixins: [useOutlineStateMixin, useMenuIDMixin],\n\tprops: {\n\t\tforceEnabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\tdata: () => ({\n\t\tvisible: false,\n\t\thasEnabledChild: true,\n\t}),\n\tcomputed: {\n\t\tcurrentChild() {\n\t\t\tconst {\n\t\t\t\tstate,\n\t\t\t\teditor,\n\t\t\t\tactionEntry: { children },\n\t\t\t} = this\n\n\t\t\tif (!state.active) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\treturn children.find((child) => {\n\t\t\t\treturn getIsActive(child, editor)\n\t\t\t})\n\t\t},\n\t\ticon() {\n\t\t\tif (this.currentChild) {\n\t\t\t\treturn this.currentChild.icon\n\t\t\t}\n\n\t\t\treturn this.actionEntry.icon\n\t\t},\n\t\ticonKey() {\n\t\t\treturn `${this.actionEntry.key}/${this.activeKey}`\n\t\t},\n\t\tactiveKey() {\n\t\t\treturn this.currentChild?.key\n\t\t},\n\t\tchildren() {\n\t\t\treturn this.actionEntry.children.filter(({ visible }) => {\n\t\t\t\tif (visible === undefined) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\n\t\t\t\treturn typeof visible === 'function' ? visible(this) : visible\n\t\t\t})\n\t\t},\n\t\tlabelWithSelected() {\n\t\t\tif (this.currentChild) {\n\t\t\t\t// TRANSLATORS: examples - Headings, \"Heading 1\" is selected - Blocks, \"Info callout\" is selected\n\t\t\t\treturn t(\n\t\t\t\t\t'text',\n\t\t\t\t\t'{menuItemName}, \"{selectedSubMenuItemName}\" is selected',\n\t\t\t\t\t{\n\t\t\t\t\t\tmenuItemName: this.actionEntry.label,\n\t\t\t\t\t\tselectedSubMenuItemName: this.currentChild.label,\n\t\t\t\t\t},\n\t\t\t\t)\n\t\t\t}\n\n\t\t\treturn this.actionEntry.label\n\t\t},\n\t\tisEnabled() {\n\t\t\treturn this.forceEnabled || this.hasEnabledChild\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.$_updateState = debounce(this.checkStateOfChildren.bind(this), 50)\n\t\tthis.editor?.on('update', this.$_updateState)\n\t\tthis.editor?.on('selectionUpdate', this.$_updateState)\n\t},\n\tbeforeDestroy() {\n\t\tthis.editor?.off('update', this.$_updateState)\n\t\tthis.editor?.off('selectionUpdate', this.$_updateState)\n\t},\n\tmethods: {\n\t\tonOpenChange(val) {\n\t\t\tthis.visible = val\n\t\t},\n\t\trunAction() {\n\t\t\t// nothing todo\n\t\t},\n\t\tonTrigger(entry) {\n\t\t\tif (entry?.click) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.editor?.chain().focus().run()\n\t\t\tthis.$emit('trigged', entry)\n\t\t},\n\t\tcheckStateOfChildren() {\n\t\t\tthis.hasEnabledChild = this.children.some((child) =>\n\t\t\t\tthis.isChildEnabled(child),\n\t\t\t)\n\t\t},\n\t\tisChildEnabled(child) {\n\t\t\treturn !child.isSeparator && !getActionState(child, this.editor).disabled\n\t\t},\n\t},\n}\n</script>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcButton\n\t\tclass=\"entry-single-action entry-action\"\n\t\t:class=\"state.class\"\n\t\t:disabled=\"state.disabled\"\n\t\t:aria-keyshortcuts=\"keyshortcuts || undefined\"\n\t\t:data-text-action-entry=\"actionEntry.key\"\n\t\t:aria-label=\"label\"\n\t\t:title=\"tooltip\"\n\t\ttype=\"tertiary\"\n\t\t:pressed=\"state.type !== 'button' ? state.active : undefined\"\n\t\tv-on=\"$listeners\"\n\t\t@click=\"runAction\">\n\t\t<template #icon>\n\t\t\t<component :is=\"icon\" />\n\t\t</template>\n\n\t\t<template v-if=\"actionEntry.forceLabel\" #default>\n\t\t\t{{ label }}\n\t\t</template>\n\t</NcButton>\n</template>\n\n<script>\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport { BaseActionEntry } from './BaseActionEntry.js'\n\nexport default {\n\tname: 'ActionSingle',\n\n\tcomponents: {\n\t\tNcButton,\n\t},\n\n\textends: BaseActionEntry,\n\n\tprops: {\n\t\tisItem: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.editor?.on('transaction', () => this.updateState())\n\t},\n\n\tmethods: {\n\t\trunAction() {\n\t\t\tconst { actionEntry } = this\n\n\t\t\tif (actionEntry.click) {\n\t\t\t\tactionEntry.click(this)\n\t\t\t} else {\n\t\t\t\t// Some actions run themselves.\n\t\t\t\t// others still need to have .run() called upon them.\n\t\t\t\tactionEntry.action(this.editor?.chain().focus(), this.editor)?.run()\n\t\t\t}\n\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.$emit('trigged', { ...actionEntry })\n\t\t\t})\n\t\t},\n\t},\n}\n</script>\n","/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { defineComponent } from 'vue'\n\nexport default defineComponent({\n\tdata() {\n\t\treturn {\n\t\t\t/** Current menu entry that has focus */\n\t\t\tactiveMenuEntry: 0,\n\t\t\tentries: [],\n\t\t}\n\t},\n\tcomputed: {\n\t\tvisibleEntries() {\n\t\t\treturn this.entries\n\t\t},\n\t},\n\twatch: {\n\t\tvisibleEntries() {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tif (\n\t\t\t\t\tthis.activeMenuEntry > this.visibleEntries.length\n\t\t\t\t\t|| this.visibleEntries[this.activeMenuEntry]?.disabled\n\t\t\t\t) {\n\t\t\t\t\tthis.setNextMenuEntry()\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\t},\n\tmethods: {\n\t\t/**\n\t\t * Update the disabled state of an menu entry\n\t\t * @param {string} menuKey The key of the menu entry that changed\n\t\t * @param {boolean} state The new disabled state\n\t\t */\n\t\tdisableMenuEntry(menuKey, state) {\n\t\t\tconst index = this.visibleEntries.findIndex(({ key }) => key === menuKey)\n\t\t\tthis.visibleEntries[index].disabled = state\n\t\t\tif (state === false && this.activeMenuEntry === index) {\n\t\t\t\tthis.$nextTick(() => this.setNextMenuEntry())\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Set the active menu entry to the next one (or reset to first)\n\t\t */\n\t\tsetNextMenuEntry() {\n\t\t\t// refs is not reactive so we must check this every time\n\t\t\tconst modulo =\n\t\t\t\tthis.visibleEntries.length + (this.$refs.remainingEntries ? 1 : 0)\n\n\t\t\tdo {\n\t\t\t\tthis.activeMenuEntry = (this.activeMenuEntry + 1) % modulo\n\t\t\t} while (\n\t\t\t\tthis.activeMenuEntry < this.visibleEntries.length\n\t\t\t\t&& this.visibleEntries[this.activeMenuEntry].disabled\n\t\t\t)\n\t\t},\n\t\t/**\n\t\t * Set the active menu entry to the previous one (or reset to last entry (remaining actions))\n\t\t */\n\t\tsetPreviousMenuEntry() {\n\t\t\t// refs is not reactive so we must check this every time\n\t\t\tconst modulo =\n\t\t\t\tthis.visibleEntries.length + (this.$refs.remainingEntries ? 1 : 0)\n\n\t\t\tdo {\n\t\t\t\tconst index = this.activeMenuEntry - 1\n\t\t\t\tthis.activeMenuEntry = ((index % modulo) + modulo) % modulo // needed as JS does not work with negative modulos\n\t\t\t} while (\n\t\t\t\tthis.activeMenuEntry < this.visibleEntries.length\n\t\t\t\t&& this.visibleEntries[this.activeMenuEntry].disabled\n\t\t\t)\n\t\t},\n\n\t\t/**\n\t\t * Handle navigation in toolbar\n\t\t * @param {KeyboardEvent} event The keyup event\n\t\t */\n\t\thandleToolbarNavigation(event) {\n\t\t\tif (event.key === 'ArrowRight') {\n\t\t\t\tthis.setNextMenuEntry()\n\t\t\t} else if (event.key === 'ArrowLeft') {\n\t\t\t\tthis.setPreviousMenuEntry()\n\t\t\t}\n\n\t\t\tif (this.activeMenuEntry === this.visibleEntries.length) {\n\t\t\t\tthis.$refs.remainingEntries?.focusButton?.()\n\t\t\t} else {\n\t\t\t\t// The ref is in no order (ordered by the time they needed to mount), so we need to order them like they are shown on the menu\n\t\t\t\tconst entries = [...this.$refs.menuEntries].sort(\n\t\t\t\t\t(a, b) =>\n\t\t\t\t\t\tthis.visibleEntries.findIndex(\n\t\t\t\t\t\t\t({ key }) => key === a.$vnode.data.key,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t- this.visibleEntries.findIndex(\n\t\t\t\t\t\t\t({ key }) => key === b.$vnode.data.key,\n\t\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tentries[this.activeMenuEntry].focusButton()\n\t\t\t}\n\t\t},\n\t},\n})\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div\n\t\tdata-text-el=\"readonly-bar\"\n\t\tclass=\"text-readonly-bar\"\n\t\t:class=\"{\n\t\t\t'text-readonly-bar--ready': isReady,\n\t\t\t'text-readonly-bar--is-workspace': isRichWorkspace,\n\t\t\t'text-readonly-bar--hide': isHidden,\n\t\t\t'is-mobile': $isMobile,\n\t\t}\">\n\t\t<div\n\t\t\tref=\"menubar\"\n\t\t\trole=\"toolbar\"\n\t\t\tclass=\"text-readonly-bar__entries\"\n\t\t\t:aria-label=\"t('text', 'Editor actions')\">\n\t\t\t<component\n\t\t\t\t:is=\"\n\t\t\t\t\tactionEntry.component\n\t\t\t\t\t\t? actionEntry.component\n\t\t\t\t\t\t: actionEntry.children\n\t\t\t\t\t\t\t? 'ActionList'\n\t\t\t\t\t\t\t: 'ActionSingle'\n\t\t\t\t\"\n\t\t\t\tv-for=\"(actionEntry, index) in visibleEntries\"\n\t\t\t\tref=\"menuEntries\"\n\t\t\t\t:key=\"actionEntry.key\"\n\t\t\t\t:action-entry=\"actionEntry\"\n\t\t\t\t:can-be-focussed=\"activeMenuEntry === index\"\n\t\t\t\t@disabled=\"disableMenuEntry(actionEntry.key, $event)\" />\n\t\t</div>\n\t\t<div class=\"text-readonly-bar__slot\">\n\t\t\t<slot />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { defineComponent } from 'vue'\nimport { OutlineEntries, ReadOnlyEditEntries } from './entries.js'\n\nimport { t } from '@nextcloud/l10n'\nimport { useEditorFlags } from '../../composables/useEditorFlags.ts'\nimport { useIsMobileMixin } from '../Editor.provider.ts'\nimport ActionList from './ActionList.vue'\nimport ActionSingle from './ActionSingle.vue'\nimport ToolBarLogic from './ToolBarLogic.js'\n\nexport default defineComponent({\n\tname: 'ReadonlyBar',\n\n\tcomponents: {\n\t\tActionList,\n\t\tActionSingle,\n\t},\n\n\textends: ToolBarLogic,\n\n\tmixins: [useIsMobileMixin],\n\n\tprops: {\n\t\tisHidden: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\topenReadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\temits: ['update:loaded'],\n\n\tsetup() {\n\t\tconst { isRichWorkspace } = useEditorFlags()\n\t\treturn {\n\t\t\tisRichWorkspace,\n\t\t}\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tentries: this.openReadOnly\n\t\t\t\t? [...ReadOnlyEditEntries, ...OutlineEntries]\n\t\t\t\t: [...OutlineEntries],\n\t\t\tisReady: false,\n\t\t}\n\t},\n\n\tmounted() {\n\t\tthis.$nextTick(() => {\n\t\t\tthis.isReady = true\n\t\t\tthis.$emit('update:loaded', true)\n\t\t})\n\t},\n\n\tmethods: {\n\t\tt,\n\t},\n})\n</script>\n\n<style scoped lang=\"scss\">\n.text-readonly-bar {\n\t--background-blur: blur(10px);\n\tposition: sticky;\n\ttop: 0;\n\tbottom: var(--default-grid-baseline);\n\twidth: 100%;\n\tz-index: 10021; // above modal-header so menubar is always on top\n\tbackground-color: var(--color-main-background-translucent);\n\tbackdrop-filter: var(--background-blur);\n\tmax-height: var(\n\t\t--default-clickable-area\n\t); // important for mobile so that the buttons are always inside the container\n\tborder-bottom: 1px solid var(--color-border);\n\tpadding-block: var(--default-grid-baseline);\n\n\tvisibility: hidden;\n\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\talign-items: center;\n\n\t&.is-mobile {\n\t\tborder-top: 1px solid var(--color-border);\n\t\tborder-bottom: unset;\n\t}\n\n\t&.text-readonly-bar--ready:not(.text-readonly-bar--hide) {\n\t\tvisibility: visible;\n\t\tanimation-name: fadeInDown;\n\t\tanimation-duration: 0.3s;\n\t}\n\n\t&.text-readonly-bar--hide {\n\t\topacity: 0;\n\t\ttransition:\n\t\t\tvisibility 0.2s 0.4s,\n\t\t\topacity 0.2s 0.4s;\n\t}\n\t.text-readonly-bar__entries {\n\t\tdisplay: flex;\n\t\tflex-grow: 1;\n\t\tmargin-left: max(0px, calc((100% - var(--text-editor-max-width)) / 2));\n\t}\n\n\t.text-readonly-bar__slot {\n\t\tjustify-content: flex-end;\n\t\tdisplay: flex;\n\t\tmin-width: max(0px, min(100px, (100% - var(--text-editor-max-width)) / 2));\n\t}\n\n\t&.text-readonly-bar--is-workspace {\n\t\t.text-readonly-bar__entries {\n\t\t\tmargin-left: 0;\n\t\t}\n\t}\n\n\t@media (max-width: 660px) {\n\t\t.text-readonly-bar__entries {\n\t\t\tmargin-left: 0;\n\t\t}\n\t}\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/*\n * Handle the state of the full editor width toggle.\n *\n * If the css variable `--text-editor-max-width` is already set\n * for `document.body` it will be left as is and\n * no toggle will be shown in the text ui.\n * This way the collectives app handles it's per document width setting.\n *\n * Otherwise this composable handles the `is_full_width_editor` initial state.\n * It sets the css variable on the document accordingly.\n * The state is stored in a singleton to preserve and reuse it on the next mount.\n * It is persisted in the user settings across page reloads.\n *\n */\n\nimport axios from '@nextcloud/axios'\nimport { emit, subscribe } from '@nextcloud/event-bus'\nimport { loadState } from '@nextcloud/initial-state'\nimport { generateUrl } from '@nextcloud/router'\nimport {\n\tcomputed,\n\tinject,\n\tprovide,\n\treadonly,\n\tref,\n\twatch,\n\ttype InjectionKey,\n\ttype Ref,\n} from 'vue'\n\n// Keep the current value around when leaving the editor and reopening\nlet valueSingleton = loadState('text', 'is_full_width_editor', false)\n\n// This is either the reactive value of the editor width toggle\n// or null if the width has already been set outside of text.\nexport const editorWidthKey = Symbol('text:editor:width') as InjectionKey<\n\tReadonly<Ref<boolean> | null>\n>\n\n/**\n * Detect if other apps (such as collectives) already configured texts max width.\n *\n * Check if document.body has a css variable `--text-editor-max-width` (either set or inherited).\n * Get the value set by text in the documentElement style.\n * If both values are set and match we assume text is handling the width.\n */\nfunction maxWidthSetOutsideOfText() {\n\tconst alreadySet = getComputedStyle(document.body).getPropertyValue(\n\t\t'--text-editor-max-width',\n\t)\n\tconst setByText = document.documentElement.style.getPropertyValue(\n\t\t'--text-editor-max-width',\n\t)\n\treturn Boolean(alreadySet) && alreadySet !== setByText\n}\n\nexport const provideEditorWidth = () => {\n\t// keep style that is already set - for example by collectives\n\tif (maxWidthSetOutsideOfText()) {\n\t\tprovide(editorWidthKey, null)\n\t\treturn { applyEditorWidth: () => {} }\n\t}\n\tconst isFullWidth = ref(valueSingleton)\n\tprovide(editorWidthKey, readonly(isFullWidth))\n\tsubscribe('text:editor:full-width', ({ value }) => {\n\t\tvalueSingleton = value\n\t\tisFullWidth.value = value\n\t})\n\tconst width = computed(() => (isFullWidth.value ? '100%' : '80ch'))\n\tconst applyEditorWidth = () => {\n\t\tdocument.documentElement.style.setProperty(\n\t\t\t'--text-editor-max-width',\n\t\t\twidth.value,\n\t\t)\n\t}\n\twatch(width, applyEditorWidth)\n\treturn { applyEditorWidth }\n}\n\nexport const useEditorWidth = () => {\n\t// This will be null if the width is already configured outside of text.\n\tconst isFullWidth = inject(editorWidthKey)\n\tif (isFullWidth === null) {\n\t\treturn { canToggleWidth: false }\n\t}\n\tconst setFullWidth = (checked: boolean) => {\n\t\taxios.post(generateUrl('/apps/text/settings'), {\n\t\t\tkey: 'is_full_width_editor',\n\t\t\tvalue: checked ? '1' : '0',\n\t\t})\n\t\temit('text:editor:full-width', { value: checked })\n\t}\n\treturn { canToggleWidth: true, isFullWidth, setFullWidth }\n}\n","import '../assets/NcActionCheckbox-C8I_k6NA.css';\nimport { u as useModelMigration } from \"./useModelMigration-EhAWvqDD.mjs\";\nimport { A as ActionGlobalMixin } from \"./actionGlobal-DqVa7c7G.mjs\";\nimport { G as GenRandomId } from \"./GenRandomId-F5ebeBB_.mjs\";\nimport { n as normalizeComponent } from \"./_plugin-vue2_normalizer-DU4iP6Vu.mjs\";\nconst _sfc_main = {\n name: \"NcActionCheckbox\",\n mixins: [ActionGlobalMixin],\n inject: {\n isInSemanticMenu: {\n from: \"NcActions:isSemanticMenu\",\n default: false\n }\n },\n model: {\n prop: \"modelValue\",\n event: \"update:modelValue\"\n },\n props: {\n /**\n * id attribute of the checkbox element\n */\n id: {\n type: String,\n default: () => \"action-\" + GenRandomId(),\n validator: (id) => id.trim() !== \"\"\n },\n /**\n * Removed in v9 - use `modelValue` (`v-model`) instead\n *\n * @deprecated\n */\n checked: {\n type: Boolean,\n // eslint-disable-next-line vue/no-boolean-default\n default: void 0\n },\n /**\n * checked state of the the checkbox element\n */\n modelValue: {\n type: Boolean,\n default: false\n },\n /**\n * value of the checkbox input\n */\n value: {\n type: [String, Number],\n default: \"\"\n },\n /**\n * disabled state of the checkbox element\n */\n disabled: {\n type: Boolean,\n default: false\n }\n },\n emits: [\n \"change\",\n \"check\",\n \"uncheck\",\n /**\n * Removed in v9 - use `update:modelValue` (`v-model`) instead\n *\n * @deprecated\n */\n \"update:checked\",\n /**\n * Emitted when the checkbox state is changed\n *\n * @type {boolean}\n */\n \"update:modelValue\",\n /** Same as update:modelValue for Vue 2 compatibility */\n \"update:model-value\"\n ],\n setup() {\n const model = useModelMigration(\"checked\", \"update:checked\");\n return {\n model\n };\n },\n computed: {\n /**\n * determines if the action is focusable\n *\n * @return {boolean} is the action focusable ?\n */\n isFocusable() {\n return !this.disabled;\n },\n /**\n * aria-checked attribute for role=\"menuitemcheckbox\"\n *\n * @return {'true'|'false'|undefined} aria-checked value if needed\n */\n ariaChecked() {\n if (this.isInSemanticMenu) {\n return this.model ? \"true\" : \"false\";\n }\n return void 0;\n }\n },\n methods: {\n checkInput() {\n this.$refs.label.click();\n },\n onChange(event) {\n this.model = this.$refs.checkbox.checked;\n this.$emit(\"change\", event);\n if (this.$refs.checkbox.checked) {\n this.$emit(\"check\");\n } else {\n this.$emit(\"uncheck\");\n }\n }\n }\n};\nvar _sfc_render = function render() {\n var _vm = this, _c = _vm._self._c;\n return _c(\"li\", { staticClass: \"action\", class: { \"action--disabled\": _vm.disabled }, attrs: { \"role\": _vm.isInSemanticMenu && \"presentation\" } }, [_c(\"span\", { staticClass: \"action-checkbox\", attrs: { \"role\": _vm.isInSemanticMenu && \"menuitemcheckbox\", \"aria-checked\": _vm.ariaChecked } }, [_c(\"input\", { ref: \"checkbox\", staticClass: \"checkbox action-checkbox__checkbox\", class: { focusable: _vm.isFocusable }, attrs: { \"id\": _vm.id, \"disabled\": _vm.disabled, \"type\": \"checkbox\" }, domProps: { \"checked\": _vm.model, \"value\": _vm.value }, on: { \"keydown\": function($event) {\n if (!$event.type.indexOf(\"key\") && _vm._k($event.keyCode, \"enter\", 13, $event.key, \"Enter\")) return null;\n if ($event.ctrlKey || $event.shiftKey || $event.altKey || $event.metaKey) return null;\n $event.preventDefault();\n return _vm.checkInput.apply(null, arguments);\n }, \"change\": _vm.onChange } }), _c(\"label\", { ref: \"label\", staticClass: \"action-checkbox__label\", attrs: { \"for\": _vm.id } }, [_vm._v(_vm._s(_vm.text))]), _vm._e()], 2)]);\n};\nvar _sfc_staticRenderFns = [];\nvar __component__ = /* @__PURE__ */ normalizeComponent(\n _sfc_main,\n _sfc_render,\n _sfc_staticRenderFns,\n false,\n null,\n \"73edcb0b\"\n);\nconst NcActionCheckbox = __component__.exports;\nexport {\n NcActionCheckbox as N\n};\n//# sourceMappingURL=NcActionCheckbox-D9aQuEYw.mjs.map\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n/* eslint-disable max-depth, max-statements, complexity, max-lines-per-function */\nvar SLASH = 47;\nvar DOT = 46;\nvar assertPath = function assertPath(path) {\n var t = _typeof(path);\n if (t !== 'string') {\n throw new TypeError(\"Expected a string, got a \".concat(t));\n }\n};\n\n// this function is directly from node source\nvar posixNormalize = function posixNormalize(path, allowAboveRoot) {\n var res = '';\n var lastSegmentLength = 0;\n var lastSlash = -1;\n var dots = 0;\n var code;\n for (var i = 0; i <= path.length; ++i) {\n if (i < path.length) {\n code = path.charCodeAt(i);\n } else if (code === SLASH) {\n break;\n } else {\n code = SLASH;\n }\n if (code === SLASH) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n } else if (lastSlash !== i - 1 && dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== DOT || res.charCodeAt(res.length - 2) !== DOT) {\n if (res.length > 2) {\n var lastSlashIndex = res.lastIndexOf('/');\n if (lastSlashIndex !== res.length - 1) {\n if (lastSlashIndex === -1) {\n res = '';\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf('/');\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n } else if (res.length === 2 || res.length === 1) {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0) {\n res += '/..';\n } else {\n res = '..';\n }\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0) {\n res += '/' + path.slice(lastSlash + 1, i);\n } else {\n res = path.slice(lastSlash + 1, i);\n }\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n } else if (code === DOT && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n};\nvar decode = function decode(s) {\n try {\n return decodeURIComponent(s);\n } catch (_unused) {\n return s;\n }\n};\nvar normalize = function normalize(p) {\n assertPath(p);\n var path = p;\n if (path.length === 0) {\n return '.';\n }\n var isAbsolute = path.charCodeAt(0) === SLASH;\n var trailingSeparator = path.charCodeAt(path.length - 1) === SLASH;\n path = decode(path);\n path = posixNormalize(path, !isAbsolute);\n if (path.length === 0 && !isAbsolute) {\n path = '.';\n }\n if (path.length > 0 && trailingSeparator) {\n path += '/';\n }\n if (isAbsolute) {\n return '/' + path;\n }\n return path;\n};\nvar _default = normalize;\nexports[\"default\"] = _default;\nmodule.exports = exports.default;\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateRemoteUrl, generateUrl } from '@nextcloud/router'\nimport pathNormalize from 'path-normalize'\n\nexport default class AttachmentResolver {\n\t#session\n\t#user\n\t#shareToken\n\t#currentDirectory\n\t#documentId\n\t#initAttachmentListPromise\n\t#attachmentList = []\n\n\tconstructor({ session, user, shareToken, currentDirectory, fileId }) {\n\t\tthis.#session = session\n\t\tthis.#user = user\n\t\tthis.#shareToken = shareToken\n\t\tthis.#currentDirectory = currentDirectory\n\t\tthis.#documentId = fileId ?? session.documentId\n\t\tthis.#initAttachmentListPromise = this.#updateAttachmentList()\n\t}\n\n\tasync #updateAttachmentList() {\n\t\tconst response = await axios.post(generateUrl('/apps/text/attachments'), {\n\t\t\tdocumentId: this.#session?.documentId ?? this.#documentId,\n\t\t\tsessionId: this.#session?.id,\n\t\t\tsessionToken: this.#session?.token,\n\t\t\tshareToken: this.#shareToken,\n\t\t})\n\t\tthis.#attachmentList = response.data\n\t}\n\n\t#findAttachment(fileName) {\n\t\treturn this.#attachmentList.find((a) => a.name === fileName)\n\t}\n\n\t/*\n\t * Resolve a given image/attachment src.\n\t * @param { string } src - the original src in the node.\n\t * @param { bool } fallback - fetch again attachmentsList if not found | defaul = true\n\t */\n\tasync resolve(src, fallback = true) {\n\t\tlet attachment\n\n\t\t// Native attachment\n\t\tconst directoryRegexp = /^\\.attachments\\.\\d+\\//\n\t\tif (src.match(directoryRegexp)) {\n\t\t\tconst imageFileName = decodeURIComponent(\n\t\t\t\tsrc.replace(directoryRegexp, '').split('?')[0],\n\t\t\t)\n\n\t\t\t// Wait until attachment list got fetched (initialized by constructor)\n\t\t\tawait this.#initAttachmentListPromise\n\t\t\tattachment = this.#findAttachment(imageFileName)\n\n\t\t\tif (fallback && !attachment) {\n\t\t\t\t// Update attachments list. Needed if attachments gets added to the session\n\t\t\t\tawait this.#updateAttachmentList()\n\t\t\t\tattachment = this.#findAttachment(imageFileName)\n\t\t\t}\n\n\t\t\tif (attachment) {\n\t\t\t\treturn attachment\n\t\t\t}\n\t\t}\n\n\t\t// Direct URLs\n\t\tif (isDirectUrl(src)) {\n\t\t\treturn {\n\t\t\t\tisImage: true,\n\t\t\t\tname: this.#name(src),\n\t\t\t\tpreviewUrl: src,\n\t\t\t\tfullUrl: src,\n\t\t\t}\n\t\t}\n\n\t\t// Fallback: Return DAV url (e.g. for relative paths to images)\n\t\treturn {\n\t\t\tisImage: true,\n\t\t\tname: this.#name(src),\n\t\t\tpreviewUrl: this.#davUrl(src),\n\t\t\tfullUrl: this.#davUrl(src),\n\t\t}\n\t}\n\n\t#name(src) {\n\t\treturn src.split('/').pop()\n\t}\n\n\t#davUrl(src) {\n\t\tif (this.#user) {\n\t\t\tconst uid = this.#user.uid\n\t\t\tconst encoded = this.#filePath(src)\n\t\t\t\t.split('/')\n\t\t\t\t.map(encodeURIComponent)\n\t\t\t\t.join('/')\n\t\t\treturn generateRemoteUrl(`dav/files/${uid}${encoded}`)\n\t\t}\n\n\t\tconst path = this.#filePath(src).split('/')\n\t\tconst basename = path.pop()\n\t\tconst dirname = path.join('/')\n\n\t\treturn generateUrl('/s/{token}/download?path={dirname}&files={basename}', {\n\t\t\ttoken: this.#shareToken,\n\t\t\tbasename,\n\t\t\tdirname,\n\t\t})\n\t}\n\n\t/**\n\t * Return the relativePath to a file specified in the url\n\t *\n\t * @param {string} src - url to extract path from\n\t */\n\t#relativePath(src) {\n\t\treturn decodeURI(src.split('?')[0])\n\t}\n\n\t#filePath(src) {\n\t\tconst f = [this.#currentDirectory, this.#relativePath(src)].join('/')\n\n\t\treturn pathNormalize(f)\n\t}\n}\n\n/**\n * Check if src is a direct URL.\n * Full URLs only work for images on the same Nextcloud instance (due to CORS restrictions).\n *\n * @param {string} src - the url to check\n */\nfunction isDirectUrl(src) {\n\treturn (\n\t\tsrc.startsWith('http://')\n\t\t|| src.startsWith('https://')\n\t\t|| src.startsWith('data:')\n\t)\n}\n","import { Extension } from '@tiptap/core';\nimport { SelectionRange, Selection, Plugin, PluginKey } from '@tiptap/pm/state';\nimport { DecorationSet, Decoration } from '@tiptap/pm/view';\nimport { NodeRange as NodeRange$1 } from '@tiptap/pm/model';\n\nfunction getNodeRangeDecorations(ranges) {\n if (!ranges.length) {\n return DecorationSet.empty;\n }\n const decorations = [];\n const doc = ranges[0].$from.node(0);\n ranges.forEach(range => {\n const pos = range.$from.pos;\n const node = range.$from.nodeAfter;\n if (!node) {\n return;\n }\n decorations.push(Decoration.node(pos, pos + node.nodeSize, {\n class: 'ProseMirror-selectednoderange',\n }));\n });\n return DecorationSet.create(doc, decorations);\n}\n\nfunction getSelectionRanges($from, $to, depth) {\n const ranges = [];\n const doc = $from.node(0);\n // eslint-disable-next-line\n depth = (typeof depth === 'number' && depth >= 0)\n ? depth\n : $from.sameParent($to)\n ? Math.max(0, $from.sharedDepth($to.pos) - 1)\n : $from.sharedDepth($to.pos);\n const nodeRange = new NodeRange$1($from, $to, depth);\n const offset = nodeRange.depth === 0\n ? 0\n : doc.resolve(nodeRange.start).posAtIndex(0);\n nodeRange.parent.forEach((node, pos) => {\n const from = offset + pos;\n const to = from + node.nodeSize;\n if (from < nodeRange.start || from >= nodeRange.end) {\n return;\n }\n const selectionRange = new SelectionRange(doc.resolve(from), doc.resolve(to));\n ranges.push(selectionRange);\n });\n return ranges;\n}\n\nclass NodeRangeBookmark {\n constructor(anchor, head) {\n this.anchor = anchor;\n this.head = head;\n }\n map(mapping) {\n return new NodeRangeBookmark(mapping.map(this.anchor), mapping.map(this.head));\n }\n resolve(doc) {\n const $anchor = doc.resolve(this.anchor);\n const $head = doc.resolve(this.head);\n return new NodeRangeSelection($anchor, $head);\n }\n}\n\nclass NodeRangeSelection extends Selection {\n constructor($anchor, $head, depth, bias = 1) {\n // if there is only a cursor we cant calculate a direction of the selection\n // thats why we adjust the head position by 1 in the desired direction\n const { doc } = $anchor;\n const isCursor = $anchor === $head;\n const isCursorAtEnd = $anchor.pos === doc.content.size && $head.pos === doc.content.size;\n const $correctedHead = isCursor && !isCursorAtEnd\n ? doc.resolve($head.pos + (bias > 0 ? 1 : -1))\n : $head;\n const $correctedAnchor = isCursor && isCursorAtEnd\n ? doc.resolve($anchor.pos - (bias > 0 ? 1 : -1))\n : $anchor;\n const ranges = getSelectionRanges($correctedAnchor.min($correctedHead), $correctedAnchor.max($correctedHead), depth);\n // get the smallest range start position\n // this will become the $anchor\n const $rangeFrom = ($correctedHead.pos >= $anchor.pos)\n ? ranges[0].$from\n : ranges[ranges.length - 1].$to;\n // get the biggest range end position\n // this will become the $head\n const $rangeTo = ($correctedHead.pos >= $anchor.pos)\n ? ranges[ranges.length - 1].$to\n : ranges[0].$from;\n super($rangeFrom, $rangeTo, ranges);\n this.depth = depth;\n }\n // we can safely ignore this TypeScript error: https://github.com/Microsoft/TypeScript/issues/338\n // @ts-ignore\n get $to() {\n return this.ranges[this.ranges.length - 1].$to;\n }\n eq(other) {\n return other instanceof NodeRangeSelection\n && other.$from.pos === this.$from.pos\n && other.$to.pos === this.$to.pos;\n }\n map(doc, mapping) {\n const $anchor = doc.resolve(mapping.map(this.anchor));\n const $head = doc.resolve(mapping.map(this.head));\n return new NodeRangeSelection($anchor, $head);\n }\n toJSON() {\n return {\n type: 'nodeRange',\n anchor: this.anchor,\n head: this.head,\n };\n }\n get isForwards() {\n return this.head >= this.anchor;\n }\n get isBackwards() {\n return !this.isForwards;\n }\n extendBackwards() {\n const { doc } = this.$from;\n if (this.isForwards && this.ranges.length > 1) {\n const ranges = this.ranges.slice(0, -1);\n const $from = ranges[0].$from;\n const $to = ranges[ranges.length - 1].$to;\n return new NodeRangeSelection($from, $to, this.depth);\n }\n const firstRange = this.ranges[0];\n const $from = doc.resolve(Math.max(0, firstRange.$from.pos - 1));\n return new NodeRangeSelection(this.$anchor, $from, this.depth);\n }\n extendForwards() {\n const { doc } = this.$from;\n if (this.isBackwards && this.ranges.length > 1) {\n const ranges = this.ranges.slice(1);\n const $from = ranges[0].$from;\n const $to = ranges[ranges.length - 1].$to;\n return new NodeRangeSelection($to, $from, this.depth);\n }\n const lastRange = this.ranges[this.ranges.length - 1];\n const $to = doc.resolve(Math.min(doc.content.size, lastRange.$to.pos + 1));\n return new NodeRangeSelection(this.$anchor, $to, this.depth);\n }\n static fromJSON(doc, json) {\n return new NodeRangeSelection(doc.resolve(json.anchor), doc.resolve(json.head));\n }\n static create(doc, anchor, head, depth, bias = 1) {\n return new this(doc.resolve(anchor), doc.resolve(head), depth, bias);\n }\n getBookmark() {\n return new NodeRangeBookmark(this.anchor, this.head);\n }\n}\nNodeRangeSelection.prototype.visible = false;\n\nfunction isNodeRangeSelection(value) {\n return value instanceof NodeRangeSelection;\n}\n\nconst NodeRange = Extension.create({\n name: 'nodeRange',\n addOptions() {\n return {\n depth: undefined,\n key: 'Mod',\n };\n },\n addKeyboardShortcuts() {\n return {\n // extend NodeRangeSelection upwards\n 'Shift-ArrowUp': ({ editor }) => {\n const { depth } = this.options;\n const { view, state } = editor;\n const { doc, selection, tr } = state;\n const { anchor, head } = selection;\n if (!isNodeRangeSelection(selection)) {\n const nodeRangeSelection = NodeRangeSelection.create(doc, anchor, head, depth, -1);\n tr.setSelection(nodeRangeSelection);\n view.dispatch(tr);\n return true;\n }\n const nodeRangeSelection = selection.extendBackwards();\n tr.setSelection(nodeRangeSelection);\n view.dispatch(tr);\n return true;\n },\n // extend NodeRangeSelection downwards\n 'Shift-ArrowDown': ({ editor }) => {\n const { depth } = this.options;\n const { view, state } = editor;\n const { doc, selection, tr } = state;\n const { anchor, head } = selection;\n if (!isNodeRangeSelection(selection)) {\n const nodeRangeSelection = NodeRangeSelection.create(doc, anchor, head, depth);\n tr.setSelection(nodeRangeSelection);\n view.dispatch(tr);\n return true;\n }\n const nodeRangeSelection = selection.extendForwards();\n tr.setSelection(nodeRangeSelection);\n view.dispatch(tr);\n return true;\n },\n // add `NodeRangeSelection` to all nodes\n 'Mod-a': ({ editor }) => {\n const { depth } = this.options;\n const { view, state } = editor;\n const { doc, tr } = state;\n const nodeRangeSelection = NodeRangeSelection.create(doc, 0, doc.content.size, depth);\n tr.setSelection(nodeRangeSelection);\n view.dispatch(tr);\n return true;\n },\n };\n },\n onSelectionUpdate() {\n const { selection } = this.editor.state;\n if (isNodeRangeSelection(selection)) {\n this.editor.view.dom.classList.add('ProseMirror-noderangeselection');\n }\n },\n addProseMirrorPlugins() {\n let hideTextSelection = false;\n let activeMouseSelection = false;\n return [\n new Plugin({\n key: new PluginKey('nodeRange'),\n props: {\n attributes: () => {\n if (hideTextSelection) {\n return {\n class: 'ProseMirror-noderangeselection',\n };\n }\n return { class: '' };\n },\n handleDOMEvents: {\n mousedown: (view, event) => {\n const { key } = this.options;\n const isMac = /Mac/.test(navigator.platform);\n const isShift = !!event.shiftKey;\n const isControl = !!event.ctrlKey;\n const isAlt = !!event.altKey;\n const isMeta = !!event.metaKey;\n const isMod = isMac\n ? isMeta\n : isControl;\n if (key === null\n || key === undefined\n || (key === 'Shift' && isShift)\n || (key === 'Control' && isControl)\n || (key === 'Alt' && isAlt)\n || (key === 'Meta' && isMeta)\n || (key === 'Mod' && isMod)) {\n activeMouseSelection = true;\n }\n if (!activeMouseSelection) {\n return false;\n }\n document.addEventListener('mouseup', () => {\n activeMouseSelection = false;\n const { state } = view;\n const { doc, selection, tr } = state;\n const { $anchor, $head } = selection;\n if ($anchor.sameParent($head)) {\n return;\n }\n const nodeRangeSelection = NodeRangeSelection.create(doc, $anchor.pos, $head.pos, this.options.depth);\n tr.setSelection(nodeRangeSelection);\n view.dispatch(tr);\n }, { once: true });\n return false;\n },\n },\n // when selecting some text we want to render some decorations\n // to preview a `NodeRangeSelection`\n decorations: state => {\n const { selection } = state;\n const isNodeRange = isNodeRangeSelection(selection);\n hideTextSelection = false;\n if (!activeMouseSelection) {\n if (!isNodeRange) {\n return null;\n }\n hideTextSelection = true;\n return getNodeRangeDecorations(selection.ranges);\n }\n const { $from, $to } = selection;\n // selection is probably in the same node like a paragraph\n // so we dont render decorations and show\n // a simple text selection instead\n if (!isNodeRange && $from.sameParent($to)) {\n return null;\n }\n // try to calculate some node ranges\n const nodeRanges = getSelectionRanges($from, $to, this.options.depth);\n if (!nodeRanges.length) {\n return null;\n }\n hideTextSelection = true;\n return getNodeRangeDecorations(nodeRanges);\n },\n },\n }),\n ];\n },\n});\n\nexport { NodeRange, NodeRangeSelection, NodeRange as default, getNodeRangeDecorations, getSelectionRanges, isNodeRangeSelection };\n//# sourceMappingURL=index.js.map\n","import { Extension } from '@tiptap/core';\nimport { isChangeOrigin } from '@tiptap/extension-collaboration';\nimport { PluginKey, Plugin } from '@tiptap/pm/state';\nimport tippy from 'tippy.js';\nimport { ySyncPluginKey, absolutePositionToRelativePosition, relativePositionToAbsolutePosition } from 'y-prosemirror';\nimport { getSelectionRanges, NodeRangeSelection } from '@tiptap/extension-node-range';\n\nfunction getCSSText(element) {\n let value = '';\n const style = getComputedStyle(element);\n for (let i = 0; i < style.length; i += 1) {\n value += `${style[i]}:${style.getPropertyValue(style[i])};`;\n }\n return value;\n}\nfunction cloneElement(node) {\n const clonedNode = node.cloneNode(true);\n const sourceElements = [node, ...Array.from(node.getElementsByTagName('*'))];\n const targetElements = [clonedNode, ...Array.from(clonedNode.getElementsByTagName('*'))];\n sourceElements.forEach((sourceElement, index) => {\n targetElements[index].style.cssText = getCSSText(sourceElement);\n });\n return clonedNode;\n}\n\nconst findElementNextToCoords = (options) => {\n const { x, y, direction, editor, } = options;\n let resultElement = null;\n let resultNode = null;\n let pos = null;\n let currentX = x;\n while (resultNode === null && currentX < window.innerWidth && currentX > 0) {\n const allElements = document.elementsFromPoint(currentX, y);\n const prosemirrorIndex = allElements.findIndex(element => element.classList.contains('ProseMirror'));\n const filteredElements = allElements.slice(0, prosemirrorIndex);\n if (filteredElements.length > 0) {\n const target = filteredElements[0];\n resultElement = target;\n pos = editor.view.posAtDOM(target, 0);\n if (pos >= 0) {\n resultNode = editor.state.doc.nodeAt(Math.max(pos - 1, 0));\n if (resultNode === null || resultNode === void 0 ? void 0 : resultNode.isText) {\n resultNode = editor.state.doc.nodeAt(Math.max(pos - 1, 0));\n }\n if (!resultNode) {\n resultNode = editor.state.doc.nodeAt(Math.max(pos, 0));\n }\n break;\n }\n }\n if (direction === 'left') {\n currentX -= 1;\n }\n else {\n currentX += 1;\n }\n }\n return { resultElement, resultNode, pos: pos !== null && pos !== void 0 ? pos : null };\n};\n\nfunction getComputedStyle$1(node, property) {\n const style = window.getComputedStyle(node);\n return style[property];\n}\n\nfunction minMax(value = 0, min = 0, max = 0) {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction getInnerCoords(view, x, y) {\n const paddingLeft = parseInt(getComputedStyle$1(view.dom, 'paddingLeft'), 10);\n const paddingRight = parseInt(getComputedStyle$1(view.dom, 'paddingRight'), 10);\n const borderLeft = parseInt(getComputedStyle$1(view.dom, 'borderLeftWidth'), 10);\n const borderRight = parseInt(getComputedStyle$1(view.dom, 'borderLeftWidth'), 10);\n const bounds = view.dom.getBoundingClientRect();\n const coords = {\n left: minMax(x, bounds.left + paddingLeft + borderLeft, bounds.right - paddingRight - borderRight),\n top: y,\n };\n return coords;\n}\n\nfunction removeNode(node) {\n var _a;\n (_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(node);\n}\n\nfunction getDragHandleRanges(event, editor) {\n const { doc } = editor.view.state;\n const result = findElementNextToCoords({\n editor, x: event.clientX, y: event.clientY, direction: 'right',\n });\n if (!result.resultNode || result.pos === null) {\n return [];\n }\n const x = event.clientX;\n // @ts-ignore\n const coords = getInnerCoords(editor.view, x, event.clientY);\n const posAtCoords = editor.view.posAtCoords(coords);\n if (!posAtCoords) {\n return [];\n }\n const { pos } = posAtCoords;\n const nodeAt = doc.resolve(pos).parent;\n if (!nodeAt) {\n return [];\n }\n const $from = doc.resolve(result.pos);\n const $to = doc.resolve(result.pos + 1);\n return getSelectionRanges($from, $to, 0);\n}\nfunction dragHandler(event, editor) {\n const { view } = editor;\n if (!event.dataTransfer) {\n return;\n }\n const { empty, $from, $to } = view.state.selection;\n const dragHandleRanges = getDragHandleRanges(event, editor);\n const selectionRanges = getSelectionRanges($from, $to, 0);\n const isDragHandleWithinSelection = selectionRanges.some(range => {\n return dragHandleRanges.find(dragHandleRange => {\n return dragHandleRange.$from === range.$from\n && dragHandleRange.$to === range.$to;\n });\n });\n const ranges = empty || !isDragHandleWithinSelection\n ? dragHandleRanges\n : selectionRanges;\n if (!ranges.length) {\n return;\n }\n const { tr } = view.state;\n const wrapper = document.createElement('div');\n const from = ranges[0].$from.pos;\n const to = ranges[ranges.length - 1].$to.pos;\n const selection = NodeRangeSelection.create(view.state.doc, from, to);\n const slice = selection.content();\n ranges.forEach(range => {\n const element = view.nodeDOM(range.$from.pos);\n const clonedElement = cloneElement(element);\n wrapper.append(clonedElement);\n });\n wrapper.style.position = 'absolute';\n wrapper.style.top = '-10000px';\n document.body.append(wrapper);\n event.dataTransfer.clearData();\n event.dataTransfer.setDragImage(wrapper, 0, 0);\n // tell ProseMirror the dragged content\n view.dragging = { slice, move: true };\n tr.setSelection(selection);\n view.dispatch(tr);\n // clean up\n document.addEventListener('drop', () => removeNode(wrapper), { once: true });\n}\n\nconst getOuterNodePos = (doc, pos) => {\n const resolvedPos = doc.resolve(pos);\n const { depth } = resolvedPos;\n if (depth === 0) {\n return pos;\n }\n const a = resolvedPos.pos - resolvedPos.parentOffset;\n return a - 1;\n};\nconst getOuterNode = (doc, pos) => {\n const node = doc.nodeAt(pos);\n const resolvedPos = doc.resolve(pos);\n let { depth } = resolvedPos;\n let parent = node;\n while (depth > 0) {\n const currentNode = resolvedPos.node(depth);\n depth -= 1;\n if (depth === 0) {\n parent = currentNode;\n }\n }\n return parent;\n};\n\nconst getRelativePos = (state, absolutePos) => {\n const ystate = ySyncPluginKey.getState(state);\n if (!ystate) {\n return null;\n }\n return absolutePositionToRelativePosition(absolutePos, ystate.type, ystate.binding.mapping);\n};\nconst getAbsolutePos = (state, relativePos) => {\n const ystate = ySyncPluginKey.getState(state);\n if (!ystate) {\n return -1;\n }\n return (relativePositionToAbsolutePosition(ystate.doc, ystate.type, relativePos, ystate.binding.mapping) || 0);\n};\nconst getOuterDomNode = (view, domNode) => {\n let tmpDomNode = domNode;\n // Traverse to top level node.\n while (tmpDomNode && tmpDomNode.parentNode) {\n if (tmpDomNode.parentNode === view.dom) {\n break;\n }\n tmpDomNode = tmpDomNode.parentNode;\n }\n return tmpDomNode;\n};\nconst dragHandlePluginDefaultKey = new PluginKey('dragHandle');\nconst DragHandlePlugin = ({ pluginKey = dragHandlePluginDefaultKey, element, editor, tippyOptions, onNodeChange, }) => {\n const wrapper = document.createElement('div');\n let popup = null;\n let locked = false;\n let currentNode = null;\n let currentNodePos = -1;\n let currentNodeRelPos;\n element.addEventListener('dragstart', e => {\n // Push this to the end of the event cue\n // Fixes bug where incorrect drag pos is returned if drag handle has position: absolute\n // @ts-ignore\n dragHandler(e, editor);\n setTimeout(() => {\n if (element) {\n element.style.pointerEvents = 'none';\n }\n }, 0);\n });\n element.addEventListener('dragend', () => {\n if (element) {\n element.style.pointerEvents = 'auto';\n }\n });\n return new Plugin({\n key: typeof pluginKey === 'string' ? new PluginKey(pluginKey) : pluginKey,\n state: {\n init() {\n return { locked: false };\n },\n apply(tr, value, oldState, state) {\n const isLocked = tr.getMeta('lockDragHandle');\n const hideDragHandle = tr.getMeta('hideDragHandle');\n if (isLocked !== undefined) {\n locked = isLocked;\n }\n if (hideDragHandle && popup) {\n popup.hide();\n locked = false;\n currentNode = null;\n currentNodePos = -1;\n onNodeChange === null || onNodeChange === void 0 ? void 0 : onNodeChange({ editor, node: null, pos: -1 });\n return value;\n }\n // Something has changed and drag handler is visible…\n if (tr.docChanged && currentNodePos !== -1 && element && popup) {\n // Yjs replaces the entire document on every incoming change and needs a special handling.\n // If change comes from another user …\n if (isChangeOrigin(tr)) {\n // https://discuss.yjs.dev/t/y-prosemirror-mapping-a-single-relative-position-when-doc-changes/851/3\n const newPos = getAbsolutePos(state, currentNodeRelPos);\n if (newPos !== currentNodePos) {\n // Set the new position for our current node.\n currentNodePos = newPos;\n // We will get the outer node with data and position in views update method.\n }\n }\n else {\n // … otherwise use ProseMirror mapping to update the position.\n const newPos = tr.mapping.map(currentNodePos);\n if (newPos !== currentNodePos) {\n // TODO: Remove\n // console.log('Position has changed …', { old: currentNodePos, new: newPos }, tr);\n // Set the new position for our current node.\n currentNodePos = newPos;\n // Memorize relative position to retrieve absolute position in case of collaboration\n currentNodeRelPos = getRelativePos(state, currentNodePos);\n // We will get the outer node with data and position in views update method.\n }\n }\n }\n return value;\n },\n },\n view: view => {\n var _a;\n element.draggable = true;\n element.style.pointerEvents = 'auto';\n (_a = editor.view.dom.parentElement) === null || _a === void 0 ? void 0 : _a.appendChild(wrapper);\n wrapper.appendChild(element);\n wrapper.style.pointerEvents = 'none';\n wrapper.style.position = 'absolute';\n wrapper.style.top = '0';\n wrapper.style.left = '0';\n return {\n update(_, oldState) {\n if (!element) {\n return;\n }\n if (!editor.isEditable) {\n popup === null || popup === void 0 ? void 0 : popup.destroy();\n popup = null;\n return;\n }\n if (!popup) {\n popup = tippy(view.dom, {\n getReferenceClientRect: null,\n interactive: true,\n trigger: 'manual',\n placement: 'left-start',\n hideOnClick: false,\n duration: 100,\n popperOptions: {\n modifiers: [\n { name: 'flip', enabled: false },\n {\n name: 'preventOverflow',\n options: {\n rootBoundary: 'document',\n mainAxis: false,\n },\n },\n ],\n },\n ...tippyOptions,\n appendTo: wrapper,\n content: element,\n });\n }\n // Prevent element being draggend while being open.\n if (locked) {\n element.draggable = false;\n }\n else {\n element.draggable = true;\n }\n // Do not close on updates (e.g. changing padding of a section or collaboration events)\n // popup?.hide();\n // Recalculate popup position if doc has changend and drag handler is visible.\n if (view.state.doc.eq(oldState.doc) || currentNodePos === -1) {\n return;\n }\n // Get domNode from (new) position.\n let domNode = view.nodeDOM(currentNodePos);\n // Since old element could have been wrapped, we need to find\n // the outer node and take its position and node data.\n domNode = getOuterDomNode(view, domNode);\n // Skip if domNode is editor dom.\n if (domNode === view.dom) {\n return;\n }\n // We only want `Element`.\n if ((domNode === null || domNode === void 0 ? void 0 : domNode.nodeType) !== 1) {\n return;\n }\n const domNodePos = view.posAtDOM(domNode, 0);\n const outerNode = getOuterNode(editor.state.doc, domNodePos);\n const outerNodePos = getOuterNodePos(editor.state.doc, domNodePos); // TODO: needed?\n currentNode = outerNode;\n currentNodePos = outerNodePos;\n // Memorize relative position to retrieve absolute position in case of collaboration\n currentNodeRelPos = getRelativePos(view.state, currentNodePos);\n // TODO: Remove\n // console.log('View has updated: callback with new data and repositioning of popup …', {\n // domNode,\n // currentNodePos,\n // currentNode,\n // rect: (domNode as Element).getBoundingClientRect(),\n // });\n onNodeChange === null || onNodeChange === void 0 ? void 0 : onNodeChange({ editor, node: currentNode, pos: currentNodePos });\n // Update Tippys getReferenceClientRect since domNode might have changed.\n popup.setProps({\n getReferenceClientRect: () => domNode.getBoundingClientRect(),\n });\n },\n // TODO: Kills even on hot reload\n destroy() {\n popup === null || popup === void 0 ? void 0 : popup.destroy();\n if (element) {\n removeNode(wrapper);\n }\n },\n };\n },\n props: {\n handleDOMEvents: {\n keydown(view) {\n if (popup && popup.state.isVisible && view.hasFocus()) {\n popup.hide();\n return false;\n }\n return false;\n },\n mouseleave(_view, e) {\n // Do not hide open popup on mouseleave.\n if (locked) {\n return false;\n }\n // If e.target is not inside the wrapper, hide.\n if (e.target && !wrapper.contains(e.relatedTarget)) {\n popup === null || popup === void 0 ? void 0 : popup.hide();\n currentNode = null;\n currentNodePos = -1;\n onNodeChange === null || onNodeChange === void 0 ? void 0 : onNodeChange({ editor, node: null, pos: -1 });\n }\n return false;\n },\n mousemove(view, e) {\n // Do not continue if popup is not initialized or open.\n if (!element || !popup || locked) {\n return false;\n }\n const nodeData = findElementNextToCoords({\n x: e.clientX,\n y: e.clientY,\n direction: 'right',\n editor,\n });\n // Skip if there is no node next to coords\n if (!nodeData.resultElement) {\n return false;\n }\n let domNode = nodeData.resultElement;\n domNode = getOuterDomNode(view, domNode);\n // Skip if domNode is editor dom.\n if (domNode === view.dom) {\n return false;\n }\n // We only want `Element`.\n if ((domNode === null || domNode === void 0 ? void 0 : domNode.nodeType) !== 1) {\n return false;\n }\n const domNodePos = view.posAtDOM(domNode, 0);\n const outerNode = getOuterNode(editor.state.doc, domNodePos);\n if (outerNode !== currentNode) {\n const outerNodePos = getOuterNodePos(editor.state.doc, domNodePos);\n currentNode = outerNode;\n currentNodePos = outerNodePos;\n // Memorize relative position to retrieve absolute position in case of collaboration\n currentNodeRelPos = getRelativePos(view.state, currentNodePos);\n // TODO: Remove\n // console.log('Mousemove with changed node / node data …', {\n // domNode,\n // currentNodePos,\n // currentNode,\n // rect: (domNode as Element).getBoundingClientRect(),\n // });\n onNodeChange === null || onNodeChange === void 0 ? void 0 : onNodeChange({ editor, node: currentNode, pos: currentNodePos });\n // Set nodes clientRect.\n popup.setProps({\n getReferenceClientRect: () => domNode.getBoundingClientRect(),\n });\n popup.show();\n }\n return false;\n },\n },\n },\n });\n};\n\nconst DragHandle = Extension.create({\n name: 'dragHandle',\n addOptions() {\n return {\n render() {\n const element = document.createElement('div');\n element.classList.add('drag-handle');\n return element;\n },\n tippyOptions: {},\n locked: false,\n onNodeChange: () => { return null; },\n };\n },\n addCommands() {\n return {\n lockDragHandle: () => ({ editor }) => {\n this.options.locked = true;\n return editor.commands.setMeta('lockDragHandle', this.options.locked);\n },\n unlockDragHandle: () => ({ editor }) => {\n this.options.locked = false;\n return editor.commands.setMeta('lockDragHandle', this.options.locked);\n },\n toggleDragHandle: () => ({ editor }) => {\n this.options.locked = !this.options.locked;\n return editor.commands.setMeta('lockDragHandle', this.options.locked);\n },\n };\n },\n addProseMirrorPlugins() {\n const element = this.options.render();\n return [\n DragHandlePlugin({\n tippyOptions: this.options.tippyOptions,\n element,\n editor: this.editor,\n onNodeChange: this.options.onNodeChange,\n }),\n ];\n },\n});\n\nexport { DragHandle, DragHandlePlugin, DragHandle as default, dragHandlePluginDefaultKey };\n//# sourceMappingURL=index.js.map\n","import { dragHandlePluginDefaultKey, DragHandlePlugin } from '@tiptap/extension-drag-handle';\nimport Vue from 'vue';\n\nconst DragHandle = Vue.extend({\n name: 'DragHandleVue',\n props: {\n pluginKey: {\n type: [String, Object],\n default: () => dragHandlePluginDefaultKey,\n },\n editor: {\n type: Object,\n required: true,\n },\n tippyOptions: {\n type: Object,\n default: () => ({}),\n },\n onNodeChange: {\n type: Function,\n default: null,\n },\n class: {\n type: String,\n default: 'drag-handle',\n },\n },\n mounted() {\n const { editor, pluginKey, onNodeChange, tippyOptions, } = this.$props;\n editor.registerPlugin(DragHandlePlugin({\n editor,\n element: this.$el,\n pluginKey,\n tippyOptions,\n onNodeChange,\n }));\n },\n // eslint-disable-next-line vue/no-deprecated-destroyed-lifecycle\n beforeDestroy() {\n const { pluginKey, editor } = this.$props;\n editor.unregisterPlugin(pluginKey);\n },\n render(h) {\n return h('div', {\n class: this.class,\n }, this.$slots.default);\n },\n});\n\nexport { DragHandle, DragHandle as default };\n//# sourceMappingURL=index.js.map\n","<template>\n <span v-bind=\"$attrs\"\n :aria-hidden=\"title ? null : 'true'\"\n :aria-label=\"title\"\n class=\"material-design-icon drag-vertical-icon\"\n role=\"img\"\n @click=\"$emit('click', $event)\">\n <svg :fill=\"fillColor\"\n class=\"material-design-icon__svg\"\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\">\n <path d=\"M9,3H11V5H9V3M13,3H15V5H13V3M9,7H11V9H9V7M13,7H15V9H13V7M9,11H11V13H9V11M13,11H15V13H13V11M9,15H11V17H9V15M13,15H15V17H13V15M9,19H11V21H9V19M13,19H15V21H13V19Z\">\n <title v-if=\"title\">{{ title }}</title>\n </path>\n </svg>\n </span>\n</template>\n\n<script>\nexport default {\n name: \"DragVerticalIcon\",\n emits: ['click'],\n props: {\n title: {\n type: String,\n },\n fillColor: {\n type: String,\n default: \"currentColor\"\n },\n size: {\n type: Number,\n default: 24\n }\n }\n}\n</script>","<!--\n - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<DragHandle\n\t\t:editor=\"editor\"\n\t\tclass=\"floating-buttons\"\n\t\t:class=\"{ heading: isHeadingNode }\"\n\t\t:on-node-change=\"onNodeChange\">\n\t\t<NcButton\n\t\t\ttype=\"tertiary-no-background\"\n\t\t\tsize=\"small\"\n\t\t\t:title=\"t('text', 'Insert below')\"\n\t\t\t@click=\"onOpenSmartPicker\">\n\t\t\t<template #icon>\n\t\t\t\t<PlusIcon :size=\"16\" />\n\t\t\t</template>\n\t\t</NcButton>\n\t\t<NcButton\n\t\t\ttype=\"tertiary-no-background\"\n\t\t\tsize=\"small\"\n\t\t\tclass=\"drag-button\"\n\t\t\t:title=\"t('text', 'Click for options, hold to drag')\">\n\t\t\t<template #icon>\n\t\t\t\t<DragVerticalIcon :size=\"16\" />\n\t\t\t</template>\n\t\t</NcButton>\n\t</DragHandle>\n</template>\n\n<script>\nimport { t } from '@nextcloud/l10n'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport { DragHandle } from '@tiptap/extension-drag-handle-vue-2'\nimport DragVerticalIcon from 'vue-material-design-icons/DragVertical.vue'\nimport PlusIcon from 'vue-material-design-icons/Plus.vue'\nimport { useEditor } from '../../composables/useEditor.ts'\n\nexport default {\n\tname: 'FloatingButtons',\n\n\tcomponents: {\n\t\tDragHandle,\n\t\tDragVerticalIcon,\n\t\tNcButton,\n\t\tPlusIcon,\n\t},\n\n\tsetup() {\n\t\tconst { editor } = useEditor()\n\t\treturn { editor }\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tnode: null,\n\t\t\tpos: -1,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tisHeadingNode() {\n\t\t\treturn this.node?.type === this.editor.schema.nodes.heading\n\t\t},\n\t},\n\n\tmethods: {\n\t\tonNodeChange({ node, pos }) {\n\t\t\tthis.node = node\n\t\t\tthis.pos = pos\n\t\t},\n\t\tonOpenSmartPicker() {\n\t\t\tif (!this.node || this.pos === -1) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Node has no children or just text children and no text content\n\t\t\tconst { schema } = this.editor\n\t\t\tconst emptyNode =\n\t\t\t\tthis.node.textContent.trim() === ''\n\t\t\t\t&& (this.node.children.length === 0\n\t\t\t\t\t|| this.node.children.every((n) => n.type === schema.nodes.text))\n\n\t\t\t// Insert at the end of the node\n\t\t\tconst pos = emptyNode ? this.pos + 1 : this.pos + this.node.nodeSize\n\t\t\tthis.editor.chain().insertContentAt(pos, '/').focus().run()\n\t\t},\n\t\tt,\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.floating-buttons {\n\tdisplay: flex;\n\n\t&.heading {\n\t\tmargin-right: 16px;\n\t}\n}\n\n.drag-button {\n\tcursor: grab;\n\n\t:deep(span),\n\t:deep(svg) {\n\t\tcursor: grab !important;\n\t}\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div\n\t\tdata-text-el=\"editor-content-wrapper\"\n\t\tclass=\"content-wrapper text-editor__content-wrapper\"\n\t\t:class=\"{\n\t\t\t'--show-outline': showOutline,\n\t\t}\">\n\t\t<div v-if=\"showOutline\" class=\"text-editor__content-wrapper__left\">\n\t\t\t<EditorOutline />\n\t\t</div>\n\t\t<slot />\n\t\t<FloatingButtons v-if=\"showFloatingButtons\" />\n\t\t<EditorContent\n\t\t\trole=\"document\"\n\t\t\tclass=\"editor__content text-editor__content\"\n\t\t\t:editor=\"editor\" />\n\t\t<div class=\"text-editor__content-wrapper__right\" />\n\t</div>\n</template>\n\n<script>\nimport { useIsMobile } from '@nextcloud/vue/composables/useIsMobile'\nimport { EditorContent } from '@tiptap/vue-2'\nimport { useEditor } from '../../composables/useEditor.ts'\nimport { useEditorFlags } from '../../composables/useEditorFlags.ts'\nimport { useEditorWidth } from '../../composables/useEditorWidth.ts'\nimport EditorOutline from './EditorOutline.vue'\nimport FloatingButtons from './FloatingButtons.vue'\nimport { useOutlineStateMixin } from './Wrapper.provider.js'\n\nexport default {\n\tname: 'ContentContainer',\n\tcomponents: {\n\t\tEditorContent,\n\t\tEditorOutline,\n\t\tFloatingButtons,\n\t},\n\tmixins: [useOutlineStateMixin],\n\tprops: {\n\t\treadOnly: {\n\t\t\ttype: Boolean,\n\t\t\trequired: true,\n\t\t},\n\t},\n\tsetup() {\n\t\tconst isMobile = useIsMobile()\n\t\tconst { editor } = useEditor()\n\t\tconst { isRichEditor, isRichWorkspace } = useEditorFlags()\n\t\tconst { isFullWidth } = useEditorWidth()\n\t\treturn { editor, isMobile, isFullWidth, isRichEditor, isRichWorkspace }\n\t},\n\tcomputed: {\n\t\tshowOutline() {\n\t\t\treturn this.$outlineState.visible\n\t\t},\n\t\tshowFloatingButtons() {\n\t\t\treturn (\n\t\t\t\t!this.readOnly\n\t\t\t\t&& !this.isMobile\n\t\t\t\t&& !this.isFullWidth\n\t\t\t\t&& this.isRichEditor\n\t\t\t\t&& !this.isRichWorkspace\n\t\t\t)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.editor__content {\n\tmax-width: min(var(--text-editor-max-width), calc(100vw - 16px));\n\tmargin: 0 auto;\n\tposition: relative;\n\twidth: 100%;\n\t:deep([contenteditable]) {\n\t\t// drop off obsolete server styles\n\t\tmargin: 0 !important;\n\t}\n}\n\n.text-editor__content-wrapper {\n\t--side-width: calc((100% - var(--text-editor-max-width)) / 2);\n\tdisplay: grid;\n\tgrid-template-columns: 1fr auto;\n\toverflow: auto;\n\tflex: 1;\n\t&.--show-outline {\n\t\tgrid-template-columns: var(--side-width) auto var(--side-width);\n\t}\n\t.text-editor__content-wrapper__left,\n\t.text-editor__content-wrapper__right {\n\t\theight: 100%;\n\t\tposition: relative;\n\t}\n}\n\n.is-rich-workspace {\n\t.text-editor__content-wrapper {\n\t\t--side-width: var(--text-editor-max-width);\n\t\tgrid-template-columns: var(--side-width) auto;\n\t\t.text-editor__content-wrapper__left,\n\t\t.text-editor__content-wrapper__right {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateUrl } from '@nextcloud/router'\nimport { unref, type ShallowRef } from 'vue'\nimport type { Connection } from '../composables/useConnection.js'\n\n/**\n * Upload an attachment to the server.\n * @param connection the active connection.\n * @param file upload this file.\n */\nexport function uploadAttachment(\n\tconnection: ShallowRef<Connection> | Connection,\n\tfile: string | Blob,\n) {\n\tconst {\n\t\tdocumentId,\n\t\tsessionId,\n\t\tsessionToken,\n\t\tshareToken: token,\n\t} = unref(connection)\n\tconst formData = new FormData()\n\tformData.append('file', file)\n\tconst url = generateUrl(`apps/text/attachment/upload?`)\n\treturn axios.post(url, formData, {\n\t\theaders: { 'Content-Type': 'multipart/form-data' },\n\t\tparams: { documentId, sessionId, sessionToken, token },\n\t})\n}\n\n/**\n * Create a new attachment based on the given template\n * @param connection the active connection\n * @param template create the attachment based on this\n * @param template.app app to create the attachment with\n * @param template.extension extension to use\n */\nexport function createAttachment(\n\tconnection: ShallowRef<Connection> | Connection,\n\ttemplate: { app: string; extension: string },\n) {\n\tconst { documentId, sessionId, sessionToken } = unref(connection)\n\tconst url = generateUrl(`apps/text/attachment/create`)\n\treturn axios.post(url, {\n\t\tdocumentId,\n\t\tsessionId,\n\t\tsessionToken,\n\t\tfileName: `${template.app}${template.extension}`,\n\t})\n}\n\n/**\n * Create a new attachment based on the given template\n * @param connection the active connection\n * @param filePath path to the file on the server.\n */\nexport function insertAttachmentFile(\n\tconnection: ShallowRef<Connection> | Connection,\n\tfilePath: string,\n) {\n\tconst { documentId, sessionId, sessionToken } = unref(connection)\n\tconst url = generateUrl(`apps/text/attachment/filepath`)\n\treturn axios.post(url, {\n\t\tdocumentId,\n\t\tsessionId,\n\t\tsessionToken,\n\t\tfilePath,\n\t})\n}\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div\n\t\tclass=\"editor editor-media-handler\"\n\t\tdata-text-el=\"editor-media-handler\"\n\t\t:class=\"{ draggedOver, 'is-mobile': isMobile }\"\n\t\t@image-paste=\"onPaste\"\n\t\t@dragover.prevent.stop=\"setDraggedOver(true, $event)\"\n\t\t@dragleave.prevent.stop=\"setDraggedOver(false, $event)\"\n\t\t@drop.prevent.stop=\"setDraggedOver(false, $event)\"\n\t\t@file-drop=\"onEditorDrop\">\n\t\t<input\n\t\t\tv-show=\"false\"\n\t\t\tref=\"attachmentFileInput\"\n\t\t\tdata-text-el=\"attachment-file-input\"\n\t\t\ttype=\"file\"\n\t\t\taccept=\"*/*\"\n\t\t\tmultiple\n\t\t\t@change=\"onAttachmentUploadFilePicked\" />\n\t\t<slot />\n\t</div>\n</template>\n\n<script>\nimport { getCurrentUser } from '@nextcloud/auth'\nimport { showError } from '@nextcloud/dialogs'\nimport { emit } from '@nextcloud/event-bus'\nimport { generateUrl } from '@nextcloud/router'\nimport { useIsMobile } from '@nextcloud/vue/composables/useIsMobile'\nimport {\n\tcreateAttachment,\n\tinsertAttachmentFile,\n\tuploadAttachment,\n} from '../../apis/attach.ts'\nimport { logger } from '../../helpers/logger.js'\n\nimport { useEditor } from '../../composables/useEditor.ts'\nimport { useFileMixin } from '../Editor.provider.ts'\n\nimport { useConnection } from '../../composables/useConnection.ts'\nimport {\n\tACTION_ATTACHMENT_PROMPT,\n\tACTION_CHOOSE_LOCAL_ATTACHMENT,\n\tACTION_CREATE_ATTACHMENT,\n\tSTATE_UPLOADING,\n} from './MediaHandler.provider.js'\n\nconst getDir = (val) => val.split('/').slice(0, -1).join('/')\n\nexport default {\n\tname: 'MediaHandler',\n\tmixins: [useFileMixin],\n\tprovide() {\n\t\tconst val = {}\n\n\t\tObject.defineProperties(val, {\n\t\t\t[ACTION_ATTACHMENT_PROMPT]: {\n\t\t\t\tget: () => this.showAttachmentPrompt,\n\t\t\t},\n\t\t\t[ACTION_CHOOSE_LOCAL_ATTACHMENT]: {\n\t\t\t\tget: () => this.chooseLocalFile,\n\t\t\t},\n\t\t\t[ACTION_CREATE_ATTACHMENT]: {\n\t\t\t\tget: () => this.createAttachment,\n\t\t\t},\n\t\t\t[STATE_UPLOADING]: {\n\t\t\t\tget: () => this.state,\n\t\t\t},\n\t\t})\n\n\t\treturn val\n\t},\n\tsetup() {\n\t\tconst { connection } = useConnection()\n\t\tconst isMobile = useIsMobile()\n\t\tconst { editor } = useEditor()\n\t\treturn {\n\t\t\tconnection,\n\t\t\teditor,\n\t\t\tisMobile,\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tlastFilePath: null,\n\t\t\tdraggedOver: false,\n\t\t\t// make it reactive to be used inject/provide\n\t\t\tstate: {\n\t\t\t\tisUploadingAttachments: false,\n\t\t\t},\n\t\t}\n\t},\n\tcomputed: {\n\t\tinitialFilePath() {\n\t\t\treturn this.lastFilePath ?? getDir(this.$file?.relativePath ?? '/')\n\t\t},\n\t},\n\tmethods: {\n\t\tsetDraggedOver(val, event) {\n\t\t\tif (event.dataTransfer.types.includes('Files')) {\n\t\t\t\tthis.draggedOver = val\n\t\t\t}\n\t\t},\n\t\tonPaste(e) {\n\t\t\tthis.uploadAttachmentFiles(e.detail.files)\n\t\t},\n\t\tonEditorDrop(e) {\n\t\t\tthis.uploadAttachmentFiles(e.detail.files, e.detail.position)\n\t\t},\n\t\tonAttachmentUploadFilePicked(event) {\n\t\t\tthis.uploadAttachmentFiles(event.target.files)\n\t\t\t// Clear input to ensure that the change event will be emitted if\n\t\t\t// the same file is picked again.\n\t\t\tevent.target.value = ''\n\t\t},\n\t\tchooseLocalFile() {\n\t\t\tthis.$refs.attachmentFileInput.click()\n\t\t},\n\t\tasync uploadAttachmentFiles(files, position = null) {\n\t\t\tif (!files) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.state.isUploadingAttachments = true\n\n\t\t\tconst uploadPromises = [...files].map((file) => {\n\t\t\t\treturn this.uploadAttachmentFile(file, position)\n\t\t\t})\n\n\t\t\treturn Promise.all(uploadPromises)\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tlogger.error('Uploading multiple attachments failed', { error })\n\t\t\t\t\tshowError(t('text', 'Uploading multiple attachments failed.'))\n\t\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.state.isUploadingAttachments = false\n\t\t\t\t})\n\t\t},\n\t\tasync uploadAttachmentFile(file, position = null) {\n\t\t\tthis.state.isUploadingAttachments = true\n\n\t\t\treturn uploadAttachment(this.connection, file)\n\t\t\t\t.then((response) => {\n\t\t\t\t\tthis.insertAttachment(\n\t\t\t\t\t\tresponse.data?.name,\n\t\t\t\t\t\tresponse.data?.id,\n\t\t\t\t\t\tfile.type,\n\t\t\t\t\t\tposition,\n\t\t\t\t\t\tresponse.data?.dirname,\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tlogger.error('Uploading attachment failed', { error })\n\t\t\t\t\tif (error.response?.data.error) {\n\t\t\t\t\t\tshowError(\n\t\t\t\t\t\t\tt('text', 'Uploading attachment failed: {error}', {\n\t\t\t\t\t\t\t\terror: error.response.data.error,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tshowError(t('text', 'Uploading attachment failed.'))\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.state.isUploadingAttachments = false\n\t\t\t\t})\n\t\t},\n\t\tshowAttachmentPrompt() {\n\t\t\tconst currentUser = getCurrentUser()\n\t\t\tif (!currentUser) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tOC.dialogs.filepicker(\n\t\t\t\tt('text', 'Insert an attachment'),\n\t\t\t\t(filePath) => {\n\t\t\t\t\tthis.insertFromPath(filePath)\n\t\t\t\t},\n\t\t\t\tfalse,\n\t\t\t\t[],\n\t\t\t\ttrue,\n\t\t\t\tundefined,\n\t\t\t\tthis.initialFilePath,\n\t\t\t)\n\t\t},\n\t\tinsertFromPath(filePath) {\n\t\t\tthis.lastFilePath = getDir(filePath)\n\n\t\t\tthis.state.isUploadingAttachments = true\n\n\t\t\treturn insertAttachmentFile(this.connection, filePath)\n\t\t\t\t.then((response) => {\n\t\t\t\t\tthis.insertAttachment(\n\t\t\t\t\t\tresponse.data?.name,\n\t\t\t\t\t\tresponse.data?.id,\n\t\t\t\t\t\tresponse.data?.mimetype,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tresponse.data?.dirname,\n\t\t\t\t\t)\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tlogger.error('Failed to insert from Files', { error })\n\t\t\t\t\tshowError(t('text', 'Failed to insert from Files'))\n\t\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.state.isUploadingAttachments = false\n\t\t\t\t})\n\t\t},\n\t\tcreateAttachment(template) {\n\t\t\tthis.state.isUploadingAttachments = true\n\t\t\treturn createAttachment(this.connection, template)\n\t\t\t\t.then((response) => {\n\t\t\t\t\tthis.insertAttachmentPreview(response.data?.id)\n\t\t\t\t})\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tlogger.error('Failed to create attachment', { error })\n\t\t\t\t\tshowError(t('text', 'Failed to create attachment'))\n\t\t\t\t})\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.state.isUploadingAttachments = false\n\t\t\t\t})\n\t\t},\n\t\tinsertAttachmentPreview(fileId) {\n\t\t\tconst url = new URL(generateUrl(`/f/${fileId}`), window.origin)\n\t\t\tconst href = url.href.replaceAll(' ', '%20')\n\t\t\tthis.editor.chain().focus().insertPreview(href).run()\n\t\t},\n\t\tinsertAttachment(name, fileId, mimeType, position = null, dirname = '') {\n\t\t\t// inspired by the fixedEncodeURIComponent function suggested in\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent\n\t\t\tconst src =\n\t\t\t\tdirname\n\t\t\t\t+ '/'\n\t\t\t\t+ encodeURIComponent(name).replace(/[!'()*]/g, (c) => {\n\t\t\t\t\treturn '%' + c.charCodeAt(0).toString(16).toUpperCase()\n\t\t\t\t})\n\t\t\t// simply get rid of brackets to make sure link text is valid\n\t\t\t// as it does not need to be unique and matching the real file name\n\t\t\tconst alt = name.replaceAll(/[[\\]]/g, '')\n\n\t\t\tconst chain = position\n\t\t\t\t? this.editor.chain().focus(position)\n\t\t\t\t: this.editor.chain()\n\n\t\t\tchain.setImage({ src, alt }).run()\n\n\t\t\tconst selection = this.editor.view.state.selection\n\t\t\tif (!selection.empty) {\n\t\t\t\t// If inserted image is first element, it is selected and would get overwritten by\n\t\t\t\t// subsequent editor inserts (see tiptap#3355). So unselect the image by placing\n\t\t\t\t// the cursor at the end of the selection.\n\t\t\t\tthis.editor.commands.focus(selection.to)\n\t\t\t}\n\n\t\t\t// Scroll image into view\n\t\t\tthis.editor.commands.scrollIntoView()\n\n\t\t\t// Store last inserted attachment src to focus it in ImageView.vue\n\t\t\tthis.editor.commands.setMeta('insertedAttachmentSrc', { src })\n\n\t\t\temit('text:image-node:add', null)\n\t\t},\n\t},\n}\n</script>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div class=\"editor\">\n\t\t<MediaHandler v-if=\"$editorUpload\" class=\"text-editor__main\">\n\t\t\t<slot />\n\t\t</MediaHandler>\n\t\t<slot v-else />\n\t</div>\n</template>\n\n<script>\nimport { useEditorUpload } from '../Editor.provider.ts'\nimport MediaHandler from './MediaHandler.vue'\n\nexport default {\n\tname: 'MainContainer',\n\tcomponents: {\n\t\tMediaHandler,\n\t},\n\tmixins: [useEditorUpload],\n}\n</script>\n\n<style scoped lang=\"scss\">\n.text-editor__main,\n.editor {\n\tdisplay: flex;\n\tflex-direction: column;\n\tbackground: var(--color-main-background);\n\tcolor: var(--color-main-text);\n\tbackground-clip: padding-box;\n\tborder-radius: var(--border-radius);\n\tpadding: 0;\n\tposition: relative;\n\twidth: 100%;\n}\n\n.text-editor__main {\n\t&.is-mobile {\n\t\tflex-grow: 1;\n\t\tflex-direction: column-reverse;\n\t}\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div\n\t\tclass=\"text-editor__wrapper\"\n\t\t:class=\"{\n\t\t\t'has-conflicts': isResolvingConflict,\n\t\t\t'is-rich-workspace': isRichWorkspace,\n\t\t\t'is-rich-editor': isRichEditor,\n\t\t}\">\n\t\t<slot />\n\t</div>\n</template>\n\n<script>\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { useEditorFlags } from '../../composables/useEditorFlags.ts'\nimport {\n\tOUTLINE_ACTIONS,\n\tOUTLINE_STATE,\n\tREAD_ONLY_ACTIONS,\n} from './Wrapper.provider.js'\n\nexport default {\n\tname: 'Wrapper',\n\tprovide() {\n\t\tconst val = {}\n\n\t\tObject.defineProperties(val, {\n\t\t\t[OUTLINE_STATE]: {\n\t\t\t\tget: () => this.outline,\n\t\t\t},\n\t\t\t[OUTLINE_ACTIONS]: {\n\t\t\t\tget: () => ({\n\t\t\t\t\ttoggle: this.outlineToggle,\n\t\t\t\t}),\n\t\t\t},\n\t\t\t[READ_ONLY_ACTIONS]: {\n\t\t\t\tget: () => ({\n\t\t\t\t\ttoggle: this.readOnlyToggle,\n\t\t\t\t}),\n\t\t\t},\n\t\t})\n\n\t\treturn val\n\t},\n\n\tprops: {\n\t\tisResolvingConflict: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\thasConnectionIssue: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\tcontentLoaded: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\t\tshowOutlineOutside: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst { isRichEditor, isRichWorkspace } = useEditorFlags()\n\t\treturn { isRichEditor, isRichWorkspace }\n\t},\n\n\tdata: () => ({\n\t\toutline: {\n\t\t\tvisible: false,\n\t\t\tenable: false,\n\t\t},\n\t}),\n\n\tcomputed: {\n\t\tshowOutline() {\n\t\t\treturn this.isAbleToShowOutline ? this.outline.visible : false\n\t\t},\n\t\tisAbleToShowOutline() {\n\t\t\tif (this.isRichWorkspace) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\treturn true\n\t\t},\n\t},\n\n\twatch: {\n\t\tshowOutlineOutside() {\n\t\t\tthis.outline.visible = this.showOutlineOutside\n\t\t},\n\t},\n\n\tmounted() {\n\t\tsubscribe('text:keyboard:outline', this.outlineToggle)\n\t\tthis.outline.enable = this.isAbleToShowOutline\n\n\t\tthis.$watch(\n\t\t\t() => this.isAbleToShowOutline,\n\t\t\t(enable) => {\n\t\t\t\t// make outline state reactive through the provider\n\t\t\t\tObject.assign(this.outline, { enable })\n\t\t\t},\n\t\t)\n\t},\n\n\tbeforeDestroy() {\n\t\tunsubscribe('text:keyboard:outline', this.outlineToggle)\n\t},\n\n\tmethods: {\n\t\toutlineToggle() {\n\t\t\tthis.outline.visible = !this.outline.visible\n\t\t\tthis.$emit('outline-toggled', this.outline.visible)\n\t\t},\n\t\treadOnlyToggle() {\n\t\t\tthis.$emit('read-only-toggled')\n\t\t},\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.text-editor__wrapper {\n\tdisplay: flex;\n\tflex-grow: 1;\n\n\twidth: 100%;\n\n\t.ProseMirror {\n\t\tmargin-top: 0 !important;\n\t}\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/**\n * Check if current platform is a mobile device\n *\n * @return {boolean} whether the platform is a mobile device\n */\nexport function isMobilePlatform() {\n\t// Use client hints if already available\n\tif (navigator?.userAgentData?.mobile !== undefined)\n\t\treturn navigator.userAgentData.mobile\n\n\t// use regex to match userAgent (required for Safari and Firefox in 2022)\n\tconst mobileDevices = [\n\t\t/Android/i,\n\t\t/webOS/i,\n\t\t/iPhone/i,\n\t\t/iPad/i,\n\t\t/iPod/i,\n\t\t/playbook/i,\n\t\t/silk/i,\n\t\t/BlackBerry/i,\n\t\t/Windows Phone/i,\n\t]\n\n\treturn mobileDevices.some((regex) => navigator.userAgent.match(regex))\n}\n","<!--\n - SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcDialog\n\t\tsize=\"large\"\n\t\tdata-text-el=\"formatting-help\"\n\t\t:name=\"t('text', 'Formatting and shortcuts')\"\n\t\t:close-on-click-outside=\"true\"\n\t\t@closing=\"$emit('close')\">\n\t\t<h2>{{ t('text', 'Formatting and shortcuts') }}</h2>\n\t\t<p>{{ t('text', 'Speed up your writing with simple shortcuts.') }}</p>\n\t\t<p v-if=\"!isMobileCached\">\n\t\t\t{{\n\t\t\t\tt(\n\t\t\t\t\t'text',\n\t\t\t\t\t'Just type the Markdown syntax or use keyboard shortcuts from below.',\n\t\t\t\t)\n\t\t\t}}\n\t\t</p>\n\t\t<p v-else>\n\t\t\t{{ t('text', 'Just type the Markdown syntax from below.') }}\n\t\t</p>\n\n\t\t<table>\n\t\t\t<thead>\n\t\t\t\t<tr>\n\t\t\t\t\t<th>{{ t('text', 'Style') }}</th>\n\t\t\t\t\t<th>{{ t('text', 'Syntax') }}</th>\n\t\t\t\t\t<th v-if=\"!isMobileCached\">\n\t\t\t\t\t\t{{ t('text', 'Keyboard shortcuts') }}\n\t\t\t\t\t</th>\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'New paragraph') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<kbd>{{ t('text', 'Enter') }}</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\" />\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Hard line break') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<kbd>{{ t('text', 'Enter') }}</kbd>\n\t\t\t\t\t\t{{ t('text', 'followed by') }}\n\t\t\t\t\t\t<kbd>{{ t('text', 'Backspace') }}</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\">\n\t\t\t\t\t\t<kbd>{{ t('text', 'Shift') }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>{{ t('text', 'Enter') }}</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Bold') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<code>**{{ t('text', 'Bold text') }}**</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\">\n\t\t\t\t\t\t<kbd>{{ ctrlOrModKey }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>B</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Italic') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<code>*{{ t('text', 'Italicized text') }}*</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\">\n\t\t\t\t\t\t<kbd>{{ ctrlOrModKey }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>I</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Strikethrough') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<code>~~{{ t('text', 'Mistaken text') }}~~</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\">\n\t\t\t\t\t\t<kbd>{{ ctrlOrModKey }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>{{ t('text', 'Shift') }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>S</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Underline') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<code>__{{ t('text', 'Underlined text') }}__</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\">\n\t\t\t\t\t\t<kbd>{{ ctrlOrModKey }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>U</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td class=\"ellipsis_top\">\n\t\t\t\t\t\t{{ t('text', 'Heading 1') }}\n\t\t\t\t\t</td>\n\t\t\t\t\t<td class=\"ellipsis_top\">\n\t\t\t\t\t\t<code># {{ t('text', 'Heading level 1') }}</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\" class=\"ellipsis_top\">\n\t\t\t\t\t\t<kbd>{{ ctrlOrModKey }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>{{ t('text', 'Shift') }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>1</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td class=\"noborder ellipsis\">…</td>\n\t\t\t\t\t<td class=\"noborder ellipsis\">…</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\" class=\"ellipsis noborder\">…</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td class=\"noborder ellipsis_bottom\">\n\t\t\t\t\t\t{{ t('text', 'Heading 6') }}\n\t\t\t\t\t</td>\n\t\t\t\t\t<td class=\"noborder ellipsis_bottom\">\n\t\t\t\t\t\t<code>###### {{ t('text', 'Heading level 6') }}</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\" class=\"noborder ellipsis_bottom\">\n\t\t\t\t\t\t<kbd>{{ ctrlOrModKey }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>{{ t('text', 'Shift') }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>6</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Unordered list') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<code>* {{ t('text', 'An item') }}</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\">\n\t\t\t\t\t\t<kbd>{{ ctrlOrModKey }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>{{ t('text', 'Shift') }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>8</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Ordered list') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<code>1. {{ t('text', 'First item') }}</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\">\n\t\t\t\t\t\t<kbd>{{ ctrlOrModKey }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>{{ t('text', 'Shift') }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>7</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Checklist') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<code>* [] {{ t('text', 'To-Do item') }}</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\">\n\t\t\t\t\t\t<kbd>{{ ctrlOrModKey }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>{{ t('text', 'Shift') }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>9</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Blockquote') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<code>> {{ t('text', 'Quoted text') }}</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\">\n\t\t\t\t\t\t<kbd>{{ ctrlOrModKey }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>></kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Code block') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<code>``` {{ t('text', 'Some code') }}</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\" />\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Link') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<code>[Title](https://example.org)</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\">\n\t\t\t\t\t\t<kbd>{{ ctrlOrModKey }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>K</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Insert emoji') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<code>:{{ t('text', 'emoji') }}</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\" />\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Mention someone') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<code>@{{ t('text', 'name') }}</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\" />\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Smart picker') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<code>/{{ t('text', 'something') }}</code>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td v-if=\"!isMobileCached\" />\n\t\t\t\t</tr>\n\t\t\t</tbody>\n\t\t</table>\n\n\t\t<table vif=\"!isMobileCached\">\n\t\t\t<thead>\n\t\t\t\t<tr>\n\t\t\t\t\t<th>{{ t('text', 'Action') }}</th>\n\t\t\t\t\t<th>{{ t('text', 'Keyboard shortcuts') }}</th>\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Undo') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<kbd>{{ ctrlOrModKey }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>Z</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Redo') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<kbd>{{ ctrlOrModKey }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>Y</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{{ t('text', 'Toggle outline') }}</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<kbd>{{ ctrlOrModKey }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>{{ t('text', 'Alt') }}</kbd>\n\t\t\t\t\t\t+\n\t\t\t\t\t\t<kbd>H</kbd>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</tbody>\n\t\t</table>\n\t</NcDialog>\n</template>\n\n<script>\nimport { t } from '@nextcloud/l10n'\nimport NcDialog from '@nextcloud/vue/components/NcDialog'\nimport { isMobilePlatform } from '../helpers/platform.js'\nimport { MODIFIERS, TRANSLATIONS } from './Menu/keys.js'\n\nexport default {\n\tname: 'HelpModal',\n\tcomponents: {\n\t\tNcDialog,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tformatted: {\n\t\t\t\tbold: true,\n\t\t\t\titalic: true,\n\t\t\t\tstrikethrough: true,\n\t\t\t\theading1: true,\n\t\t\t\theading6: true,\n\t\t\t\tunorderdList: true,\n\t\t\t\torderedList: true,\n\t\t\t\tcheckList: true,\n\t\t\t\tblockQuote: true,\n\t\t\t\tcodeBlock: true,\n\t\t\t},\n\t\t\tctrlOrModKey: TRANSLATIONS[MODIFIERS.Mod],\n\t\t}\n\t},\n\tcomputed: {\n\t\tisFormatted() {\n\t\t\treturn (style) => this.formatted[style]\n\t\t},\n\t\t// Cache the output of `isMobilePlatform()`\n\t\tisMobileCached() {\n\t\t\treturn this.isMobilePlatform()\n\t\t},\n\t},\n\tmethods: {\n\t\tt,\n\t\ttoggleFormatted(style) {\n\t\t\tthis.formatted[style] = !this.formatted[style]\n\t\t},\n\t\tisMobilePlatform,\n\t},\n}\n</script>\n\n<style lang=\"scss\" scoped>\ntable {\n\tmargin-top: 24px;\n\tborder-collapse: collapse;\n\twidth: 100%;\n\n\ttbody tr {\n\t\t&:hover,\n\t\t&:focus,\n\t\t&:active {\n\t\t\tbackground-color: transparent !important;\n\t\t}\n\t}\n\n\tthead tr {\n\t\tborder: none;\n\t}\n\n\tth {\n\t\tfont-weight: bold;\n\t\tpadding: 0.75rem 1rem 0.75rem 0;\n\t\tborder-bottom: 2px solid var(--color-background-darker);\n\t}\n\n\ttd {\n\t\tpadding: 0.75rem 1rem 0.75rem 0;\n\t\tborder-top: 1px solid var(--color-background-dark);\n\t\tborder-bottom: unset;\n\n\t\t&.noborder {\n\t\t\tborder-top: unset;\n\t\t}\n\n\t\t&.ellipsis_top {\n\t\t\tpadding-bottom: 0;\n\t\t}\n\n\t\t&.ellipsis {\n\t\t\tpadding-top: 0;\n\t\t\tpadding-bottom: 0;\n\t\t}\n\n\t\t&.ellipsis_bottom {\n\t\t\tpadding-top: 0;\n\t\t}\n\t}\n\n\tkbd {\n\t\tfont-size: smaller;\n\t}\n\n\tcode {\n\t\tpadding: 0.2em 0.4em;\n\t\tfont-size: 90%;\n\t\tbackground-color: var(--color-background-dark);\n\t\tborder-radius: 6px;\n\t}\n}\n\n@import '../css/prosemirror';\n\ndiv.ProseMirror {\n\tdisplay: inline;\n\tmargin-top: unset;\n\tposition: unset;\n\tpadding: unset;\n\tline-height: unset;\n\n\th1,\n\th6 {\n\t\tdisplay: inline;\n\t\tpadding: 0;\n\t\tmargin: 0;\n\t}\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n<template>\n\t<NextcloudVueNcActionButton\n\t\tclose-after-click\n\t\tdata-text-action-entry=\"formatting-help\"\n\t\tv-on=\"$listeners\">\n\t\t<template #icon>\n\t\t\t<Help />\n\t\t</template>\n\t\t{{ t('text', 'Formatting help') }}\n\t</NextcloudVueNcActionButton>\n</template>\n\n<script>\nimport { t } from '@nextcloud/l10n'\nimport NextcloudVueNcActionButton from '@nextcloud/vue/components/NcActionButton'\nimport { defineComponent } from 'vue'\nimport { Help } from '../icons.js'\n\nexport default defineComponent({\n\t// This component is used as a direct child of NcActions.\n\t// Even if it actually renders NcActionButton, NcActions cannot see it due to rendering limitations in Vue.\n\t// Though it works in general, NcActions doesn't handle it correctly. See NcActions docs for details.\n\t// Hotfix - rename the component to NcActionButton because it represents and renders it.\n\t// eslint-disable-next-line vue/match-component-file-name\n\tname: 'NcActionButton',\n\tcomponents: {\n\t\tNextcloudVueNcActionButton,\n\t\tHelp,\n\t},\n\tmethods: {\n\t\tt,\n\t},\n})\n</script>\n","<!--\n - SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcActionText data-text-action-entry=\"character-count\" :name=\"countString\">\n\t\t<template #icon>\n\t\t\t<AlphabeticalVariant />\n\t\t</template>\n\t</NcActionText>\n</template>\n\n<script>\nimport { translatePlural as n } from '@nextcloud/l10n'\nimport NcActionText from '@nextcloud/vue/components/NcActionText'\nimport { defineComponent, ref } from 'vue'\nimport { useEditor } from '../../composables/useEditor.ts'\nimport { AlphabeticalVariant } from '../icons.js'\n\nexport default defineComponent({\n\tname: 'CharacterCount',\n\tcomponents: {\n\t\tAlphabeticalVariant,\n\t\tNcActionText,\n\t},\n\tprops: {\n\t\tvisible: Boolean,\n\t},\n\tsetup() {\n\t\tconst { editor } = useEditor()\n\t\tconst countString = ref('')\n\t\tconst refresh = () => {\n\t\t\tconst { storage, state } = editor\n\t\t\t// characterCount is not reactive so we need this workaround\n\t\t\t// We also need to provide the doc as storage is a singleton in tiptap v2.\n\t\t\t// See ueberdosis/tiptap#6060\n\t\t\tconst wordCount = storage.characterCount.words({ node: state.doc })\n\t\t\tconst charCount = storage.characterCount.characters({ node: state.doc })\n\t\t\tconst words = n('text', '%n word', '%n words', wordCount)\n\t\t\tconst chars = n('text', '%n char', '%n chars', charCount)\n\t\t\tcountString.value = [words, chars].join(', ')\n\t\t\tconsole.debug({ wordCount, charCount, countString: countString.value })\n\t\t}\n\t\treturn { countString, refresh }\n\t},\n\twatch: {\n\t\tvisible: 'refresh',\n\t},\n\tcreated() {\n\t\tthis.refresh()\n\t},\n})\n</script>\n","<!--\n - SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<NcActionCheckbox\n\t\tv-if=\"canToggleWidth\"\n\t\t:checked=\"isFullWidth\"\n\t\t@update:checked=\"setFullWidth\">\n\t\t{{ t('text', 'Full width editor') }}\n\t</NcActionCheckbox>\n</template>\n\n<script setup>\nimport { t } from '@nextcloud/l10n'\nimport NcActionCheckbox from '@nextcloud/vue/components/NcActionCheckbox'\nimport { useEditorWidth } from '../../composables/useEditorWidth.ts'\n\nconst { canToggleWidth, isFullWidth, setFullWidth } = useEditorWidth()\n</script>\n","<!--\n - SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div\n\t\t:id=\"randomID\"\n\t\tclass=\"text-menubar\"\n\t\tdata-text-el=\"menubar\"\n\t\trole=\"region\"\n\t\t:aria-label=\"t('text', 'Editor actions')\"\n\t\t:class=\"{\n\t\t\t'text-menubar--ready': isReady,\n\t\t\t'text-menubar--hide': isHidden,\n\t\t\t'text-menubar--is-workspace': isRichWorkspace,\n\t\t\t'is-mobile': $isMobile,\n\t\t}\">\n\t\t<HelpModal v-if=\"displayHelp\" @close=\"hideHelp\" />\n\n\t\t<div\n\t\t\tv-if=\"isRichEditor\"\n\t\t\tref=\"menubar\"\n\t\t\trole=\"toolbar\"\n\t\t\tclass=\"text-menubar__entries\"\n\t\t\t:aria-label=\"t('text', 'Formatting menu bar')\"\n\t\t\t@keyup.left.stop=\"handleToolbarNavigation\"\n\t\t\t@keyup.right.stop=\"handleToolbarNavigation\">\n\t\t\t<!-- The visible inline actions -->\n\t\t\t<component\n\t\t\t\t:is=\"\n\t\t\t\t\tactionEntry.component\n\t\t\t\t\t\t? actionEntry.component\n\t\t\t\t\t\t: actionEntry.children\n\t\t\t\t\t\t\t? 'ActionList'\n\t\t\t\t\t\t\t: 'ActionSingle'\n\t\t\t\t\"\n\t\t\t\tv-for=\"(actionEntry, index) in visibleEntries\"\n\t\t\t\tref=\"menuEntries\"\n\t\t\t\t:key=\"actionEntry.key\"\n\t\t\t\t:action-entry=\"actionEntry\"\n\t\t\t\t:can-be-focussed=\"activeMenuEntry === index\"\n\t\t\t\t@disabled=\"disableMenuEntry(actionEntry.key, $event)\"\n\t\t\t\t@click=\"activeMenuEntry = index\" />\n\n\t\t\t<!-- The remaining actions -->\n\t\t\t<ActionList\n\t\t\t\tref=\"remainingEntries\"\n\t\t\t\t:action-entry=\"hiddenEntries\"\n\t\t\t\t:can-be-focussed=\"activeMenuEntry === visibleEntries.length\"\n\t\t\t\t:force-enabled=\"true\"\n\t\t\t\t@click=\"activeMenuEntry = 'remain'\">\n\t\t\t\t<template #lastAction=\"{ visible }\">\n\t\t\t\t\t<WidthToggle />\n\t\t\t\t\t<ActionFormattingHelp @click=\"showHelp\" />\n\t\t\t\t\t<NcActionSeparator />\n\t\t\t\t\t<CharacterCount v-bind=\"{ visible }\" />\n\t\t\t\t</template>\n\t\t\t</ActionList>\n\t\t</div>\n\t\t<div class=\"text-menubar__slot\">\n\t\t\t<slot />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport NcActionSeparator from '@nextcloud/vue/components/NcActionSeparator'\nimport { useElementSize } from '@vueuse/core'\nimport { ref } from 'vue'\n\nimport { t } from '@nextcloud/l10n'\nimport { useEditor } from '../../composables/useEditor.ts'\nimport { useEditorFlags } from '../../composables/useEditorFlags.ts'\nimport { useIsMobileMixin } from '../Editor.provider.ts'\nimport HelpModal from '../HelpModal.vue'\nimport { DotsHorizontal } from '../icons.js'\nimport ActionFormattingHelp from './ActionFormattingHelp.vue'\nimport ActionList from './ActionList.vue'\nimport ActionSingle from './ActionSingle.vue'\nimport CharacterCount from './CharacterCount.vue'\nimport { AssistantMenuEntries, MenuEntries, ReadOnlyDoneEntries } from './entries.js'\nimport { MENU_ID } from './MenuBar.provider.js'\nimport ToolBarLogic from './ToolBarLogic.js'\nimport WidthToggle from './WidthToggle.vue'\n\nexport default {\n\tname: 'MenuBar',\n\tcomponents: {\n\t\tActionFormattingHelp,\n\t\tActionList,\n\t\tActionSingle,\n\t\tHelpModal,\n\t\tNcActionSeparator,\n\t\tCharacterCount,\n\t\tWidthToggle,\n\t},\n\textends: ToolBarLogic,\n\tmixins: [useIsMobileMixin],\n\tprovide() {\n\t\tconst val = {}\n\n\t\tObject.defineProperties(val, {\n\t\t\t[MENU_ID]: {\n\t\t\t\tget: () => this.randomID,\n\t\t\t},\n\t\t})\n\n\t\treturn val\n\t},\n\tprops: {\n\t\tisHidden: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t\topenReadOnly: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\t},\n\n\tsetup() {\n\t\tconst editor = useEditor()\n\t\tconst { isPublic, isRichEditor, isRichWorkspace } = useEditorFlags()\n\t\tconst menubar = ref()\n\t\tconst { width } = useElementSize(menubar)\n\t\treturn { editor, isPublic, isRichEditor, isRichWorkspace, menubar, width }\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tentries: (this.openReadOnly\n\t\t\t\t? [...ReadOnlyDoneEntries, ...MenuEntries]\n\t\t\t\t: this.isPublic || this.isRichWorkSpace\n\t\t\t\t\t? [...MenuEntries]\n\t\t\t\t\t: [...MenuEntries, ...AssistantMenuEntries]\n\t\t\t).filter((entry) => !!entry),\n\t\t\trandomID: `menu-bar-${Math.ceil(Math.random() * 10000 + 500).toString(16)}`,\n\t\t\tdisplayHelp: false,\n\t\t\tisReady: false,\n\t\t\tresize: null,\n\t\t}\n\t},\n\tcomputed: {\n\t\tvisibleEntryKeys() {\n\t\t\t// if entry has no priority, we assume it always will be visible (priority: 0)\n\t\t\treturn this.entries\n\t\t\t\t.toSorted((a, b) => (a.priority ?? 0) - (b.priority ?? 0))\n\t\t\t\t.map((e) => e.key)\n\t\t\t\t.slice(0, this.iconsLimit)\n\t\t},\n\t\tvisibleEntries() {\n\t\t\t// only entries from `visibleEntryKeys but in original order\n\t\t\treturn this.entries.filter((entry) => {\n\t\t\t\treturn this.visibleEntryKeys.includes(entry.key)\n\t\t\t})\n\t\t},\n\t\thiddenEntries() {\n\t\t\tconst remainingEntries = this.entries.filter((entry) => {\n\t\t\t\t// reverse logic from visibleEntries\n\t\t\t\treturn !this.visibleEntryKeys.includes(entry.key)\n\t\t\t})\n\t\t\tconst entries = remainingEntries.reduce((acc, entry, index) => {\n\t\t\t\t// If entry has children, merge them into list. Otherwise keep entry itself.\n\t\t\t\tconst children = entry.children ?? [entry]\n\t\t\t\t// If this block has menu entries, it should be separated for better visibility and a11y (menu item radio grouping)\n\t\t\t\tif (children.length > 1) {\n\t\t\t\t\tconst hasPreviousItem = acc.length && !acc.at(-1).isSeparator\n\t\t\t\t\tconst separatorBefore = hasPreviousItem\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tkey: `separator-before-${entry.id}`,\n\t\t\t\t\t\t\t\t\tisSeparator: true,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: []\n\n\t\t\t\t\tconst hasNextItem = index !== remainingEntries.length - 1\n\t\t\t\t\tconst separatorAfter = hasNextItem\n\t\t\t\t\t\t? [{ key: `separator-after-${entry.id}`, isSeparator: true }]\n\t\t\t\t\t\t: []\n\n\t\t\t\t\treturn [\n\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t...separatorBefore,\n\t\t\t\t\t\t...children,\n\t\t\t\t\t\t...separatorAfter,\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t\treturn [...acc, ...children]\n\t\t\t}, [])\n\n\t\t\treturn {\n\t\t\t\tkey: 'remain',\n\t\t\t\tlabel: this.t('text', 'Remaining actions'),\n\t\t\t\ticon: DotsHorizontal,\n\t\t\t\tchildren: entries,\n\t\t\t}\n\t\t},\n\t\ticonWidth() {\n\t\t\tconst style = this.menubar && getComputedStyle(this.menubar)\n\t\t\tconst clickableArea = style?.getPropertyValue('--default-clickable-area')\n\t\t\treturn parseInt(clickableArea) || 34\n\t\t},\n\t\ticonsLimit() {\n\t\t\t// leave some buffer - this is necessary so the bar does not wrap during resizing\n\t\t\tconst spaceToFill = this.width - 4\n\t\t\tconst spacePerSlot = this.$isMobile ? this.iconWidth : this.iconWidth + 2\n\t\t\tconst slots = Math.floor(spaceToFill / spacePerSlot)\n\t\t\t// Leave one slot empty for the three dot menu\n\t\t\treturn slots - 1\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.$nextTick(() => {\n\t\t\tthis.isReady = true\n\t\t\tthis.$emit('update:loaded', true)\n\t\t})\n\t},\n\tmethods: {\n\t\tshowHelp() {\n\t\t\tthis.displayHelp = true\n\t\t},\n\n\t\thideHelp() {\n\t\t\tthis.displayHelp = false\n\t\t},\n\t\tt,\n\t},\n}\n</script>\n\n<style scoped lang=\"scss\">\n.text-menubar {\n\t--background-blur: blur(10px);\n\tposition: sticky;\n\ttop: 0;\n\tbottom: 0;\n\twidth: 100%;\n\tz-index: 10021; // above modal-header so menubar is always on top\n\tbackground-color: var(--color-main-background-translucent);\n\tbackdrop-filter: var(--background-blur);\n\tmax-height: var(\n\t\t--default-clickable-area\n\t); // important for mobile so that the buttons are always inside the container\n\tborder-bottom: 1px solid var(--color-border);\n\tpadding-block: var(--default-grid-baseline);\n\n\tvisibility: hidden;\n\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\talign-items: center;\n\n\t&.is-mobile {\n\t\tborder-top: 1px solid var(--color-border);\n\t\tborder-bottom: unset;\n\t}\n\n\t&.text-menubar--ready:not(.text-menubar--hide) {\n\t\tvisibility: visible;\n\t\tanimation-name: fadeInDown;\n\t\tanimation-duration: 0.3s;\n\t}\n\n\t&.text-menubar--hide {\n\t\topacity: 0;\n\t\ttransition:\n\t\t\tvisibility 0.2s 0.4s,\n\t\t\topacity 0.2s 0.4s;\n\t}\n\t.text-menubar__entries {\n\t\tdisplay: flex;\n\t\tflex-grow: 1;\n\t\tmargin-left: max(0px, calc((100% - var(--text-editor-max-width)) / 2));\n\t}\n\n\t.text-menubar__slot {\n\t\tjustify-content: flex-end;\n\t\tdisplay: flex;\n\t\tmin-width: max(0px, min(100px, (100% - var(--text-editor-max-width)) / 2));\n\t}\n\n\t&.text-menubar--is-workspace {\n\t\t.text-menubar__entries {\n\t\t\tmargin-left: 0;\n\t\t}\n\t}\n\n\t@media (max-width: 660px) {\n\t\t.text-menubar__entries {\n\t\t\tmargin-left: 0;\n\t\t}\n\t}\n}\n</style>\n"],"names":["undo","state","yUndoPluginKey","redo","defaultProtectedNodes","defaultDeleteFilter","item","protectedNodes","Item","ContentType","Text","XmlElement","yUndoPlugin","trackedOrigins","undoManager","Plugin","initargs","ystate","ySyncPluginKey","_undoManager","UndoManager","tr","val","oldState","binding","hasUndoOps","hasRedoOps","getRelativeSelection","view","stackItem","Collaboration","Extension","extension","dispatch","_a","fragment","yUndoPluginInstance","originalUndoPluginView","viewRet","hasUndoManSelf","observers","ySyncPluginOptions","ySyncPluginInstance","ySyncPlugin","jsonContent","yXmlFragmentToProsemirrorJSON","error","PluginKey","isChangeOrigin","transaction","_sfc_main","defineComponent","NcDialogButton","NcModal","arr","element","value","props","emit","slots","wrapper","ref","dialogWidth","useElementSize","isNavigationCollapsed","computed","hasNavigation","navigationId","GenRandomId","navigationAriaLabelAttr","navigationAriaLabelledbyAttr","dialogElement","dialogTagName","dialogListeners","event","showModal","handleButtonClose","button","result","handleClosing","handleClosed","modalProps","_sfc_render","_vm","_c","$event","idx","_","_sfc_staticRenderFns","__component__","normalizeComponent","NcDialog","NextcloudVueNcActionButton","BaseActionEntry","actionEntry","NcActions","NcActionSeparator","ActionListItem","useOutlineStateMixin","useMenuIDMixin","editor","children","child","getIsActive","visible","t","debounce","entry","getActionState","NcButton","ToolBarLogic","menuKey","index","key","modulo","a","b","ActionList","ActionSingle","useIsMobileMixin","isRichWorkspace","useEditorFlags","ReadOnlyEditEntries","OutlineEntries","valueSingleton","loadState","editorWidthKey","maxWidthSetOutsideOfText","alreadySet","setByText","provideEditorWidth","provide","isFullWidth","readonly","subscribe","width","applyEditorWidth","watch","useEditorWidth","inject","checked","axios","generateUrl","ActionGlobalMixin","id","useModelMigration","NcActionCheckbox","exports","_typeof","obj","SLASH","DOT","assertPath","path","posixNormalize","allowAboveRoot","res","lastSegmentLength","lastSlash","dots","code","i","lastSlashIndex","decode","s","normalize","p","isAbsolute","trailingSeparator","_default","module","AttachmentResolver","#session","#user","#shareToken","#currentDirectory","#documentId","#initAttachmentListPromise","#attachmentList","session","user","shareToken","currentDirectory","fileId","#updateAttachmentList","response","#findAttachment","fileName","src","fallback","attachment","directoryRegexp","imageFileName","isDirectUrl","#name","#davUrl","uid","encoded","#filePath","generateRemoteUrl","basename","dirname","#relativePath","f","pathNormalize","getNodeRangeDecorations","ranges","DecorationSet","decorations","doc","range","pos","node","Decoration","getSelectionRanges","$from","$to","depth","nodeRange","NodeRange$1","offset","from","to","selectionRange","SelectionRange","NodeRangeBookmark","anchor","head","mapping","$anchor","$head","NodeRangeSelection","Selection","bias","isCursor","isCursorAtEnd","$correctedHead","$correctedAnchor","$rangeFrom","$rangeTo","other","firstRange","lastRange","json","isNodeRangeSelection","selection","nodeRangeSelection","hideTextSelection","activeMouseSelection","isMac","isShift","isControl","isAlt","isMeta","isMod","isNodeRange","nodeRanges","getCSSText","style","cloneElement","clonedNode","sourceElements","targetElements","sourceElement","findElementNextToCoords","options","x","y","direction","resultElement","resultNode","currentX","allElements","prosemirrorIndex","filteredElements","target","getComputedStyle$1","property","minMax","min","max","getInnerCoords","paddingLeft","paddingRight","borderLeft","borderRight","bounds","removeNode","getDragHandleRanges","coords","posAtCoords","dragHandler","empty","dragHandleRanges","selectionRanges","isDragHandleWithinSelection","dragHandleRange","slice","clonedElement","getOuterNodePos","resolvedPos","getOuterNode","parent","currentNode","getRelativePos","absolutePos","absolutePositionToRelativePosition","getAbsolutePos","relativePos","relativePositionToAbsolutePosition","getOuterDomNode","domNode","tmpDomNode","dragHandlePluginDefaultKey","DragHandlePlugin","pluginKey","tippyOptions","onNodeChange","popup","locked","currentNodePos","currentNodeRelPos","e","isLocked","hideDragHandle","newPos","tippy","domNodePos","outerNode","outerNodePos","_view","nodeData","DragHandle","Vue","h","DragVerticalIcon","PlusIcon","useEditor","schema","n","EditorContent","EditorOutline","FloatingButtons","isMobile","useIsMobile","isRichEditor","uploadAttachment","connection","file","documentId","sessionId","sessionToken","token","unref","formData","url","createAttachment","template","insertAttachmentFile","filePath","getDir","useFileMixin","ACTION_ATTACHMENT_PROMPT","ACTION_CHOOSE_LOCAL_ATTACHMENT","ACTION_CREATE_ATTACHMENT","STATE_UPLOADING","useConnection","files","position","uploadPromises","logger","showError","getCurrentUser","href","name","mimeType","c","alt","MediaHandler","useEditorUpload","OUTLINE_STATE","OUTLINE_ACTIONS","READ_ONLY_ACTIONS","enable","unsubscribe","isMobilePlatform","regex","TRANSLATIONS","MODIFIERS","Help","AlphabeticalVariant","NcActionText","countString","storage","wordCount","charCount","words","chars","canToggleWidth","setFullWidth","ActionFormattingHelp","HelpModal","CharacterCount","WidthToggle","MENU_ID","isPublic","menubar","ReadOnlyDoneEntries","MenuEntries","AssistantMenuEntries","remainingEntries","entries","acc","separatorBefore","separatorAfter","DotsHorizontal","clickableArea","spaceToFill","spacePerSlot"],"mappings":"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","x_google_ignoreList":[0,1,2,9,10,12,13,14,15]}