f7cloud_client/apps/text/js/MenuBar-CAS7O4-V.chunk.mjs.map
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

1 line
79 KiB
Plaintext

{"version":3,"file":"MenuBar-CAS7O4-V.chunk.mjs","sources":["../node_modules/@nextcloud/vue/dist/chunks/NcDialog-8ipQ69_t.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","../node_modules/@nextcloud/vue/dist/chunks/NcActionCheckbox-D9aQuEYw.mjs","../node_modules/path-normalize/lib/index.js","../src/services/AttachmentResolver.js","../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 '../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-CSC8PAz-.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-8ipQ69_t.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","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","/**\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":["_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","state","editor","children","child","getIsActive","visible","t","debounce","val","entry","getActionState","NcButton","ToolBarLogic","menuKey","index","key","modulo","a","b","ActionList","ActionSingle","useIsMobileMixin","isRichWorkspace","useEditorFlags","ReadOnlyEditEntries","OutlineEntries","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","axios","generateUrl","#findAttachment","fileName","src","fallback","attachment","directoryRegexp","imageFileName","isDirectUrl","#name","#davUrl","uid","encoded","#filePath","generateRemoteUrl","basename","dirname","#relativePath","f","pathNormalize","isMobilePlatform","regex","TRANSLATIONS","MODIFIERS","style","Help","AlphabeticalVariant","NcActionText","useEditor","countString","storage","wordCount","charCount","words","n","chars","canToggleWidth","isFullWidth","setFullWidth","useEditorWidth","ActionFormattingHelp","HelpModal","CharacterCount","WidthToggle","MENU_ID","isPublic","isRichEditor","menubar","width","ReadOnlyDoneEntries","MenuEntries","AssistantMenuEntries","e","remainingEntries","entries","acc","separatorBefore","separatorAfter","DotsHorizontal","clickableArea","spaceToFill","spacePerSlot"],"mappings":"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","x_google_ignoreList":[0,6,7]}