@harbour-enterprises/superdoc 0.7.4 → 0.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"editor-COjWcxtS.js","sources":["../../src/core/helpers/getMarksFromSelection.js","../../src/core/helpers/findMark.js","../../src/core/helpers/getActiveFormatting.js","../../../../node_modules/rope-sequence/dist/index.js","../../../../node_modules/prosemirror-history/dist/index.js","../../src/core/helpers/getExtensionConfigField.js","../../src/core/utilities/callOrGet.js","../../src/core/Extension.js","../../src/extensions/history/history.js","../../../../node_modules/vite-plugin-node-polyfills/shims/global/dist/index.js","../../../../node_modules/prosemirror-view/dist/index.js","../../../../node_modules/lib0/math.js","../../../../node_modules/lib0/set.js","../../../../node_modules/lib0/string.js","../../../../node_modules/lib0/error.js","../../../../node_modules/lib0/map.js","../../../../node_modules/lib0/object.js","../../../../node_modules/lib0/function.js","../../../../node_modules/lib0/mutex.js","../../../../node_modules/lib0/diff.js","../../../../node_modules/y-prosemirror/src/plugins/keys.js","../../../../node_modules/lib0/random.js","../../../../node_modules/lib0/conditions.js","../../../../node_modules/lib0/storage.js","../../../../node_modules/lib0/environment.js","../../../../node_modules/lib0/dom.js","../../../../node_modules/lib0/eventloop.js","../../../../node_modules/y-prosemirror/src/plugins/sync-plugin.js","../../../../node_modules/y-prosemirror/src/lib.js","../../../../node_modules/y-prosemirror/src/plugins/cursor-plugin.js","../../../../node_modules/y-prosemirror/src/plugins/undo-plugin.js","../../src/core/EventEmitter.js","../../../../node_modules/w3c-keyname/index.js","../../../../node_modules/prosemirror-keymap/dist/index.js","../../src/core/helpers/getNodeType.js","../../src/core/helpers/getMarkType.js","../../src/core/helpers/getSchemaTypeNameByName.js","../../src/core/Attribute.js","../../src/core/utilities/isEmptyObject.js","../../src/core/helpers/cleanSchemaItem.js","../../src/core/Schema.js","../../src/core/helpers/getSchemaTypeByName.js","../../src/core/ExtensionService.js","../../src/core/helpers/chainableEditorState.js","../../src/core/CommandService.js","../../src/core/commands/first.js","../../src/core/commands/command.js","../../src/core/commands/insertTabChar.js","../../src/core/commands/insertTabNode.js","../../src/core/commands/setMeta.js","../../../../node_modules/prosemirror-commands/dist/index.js","../../src/core/helpers/defaultBlockAt.js","../../src/core/commands/splitBlock.js","../../src/core/commands/liftEmptyBlock.js","../../src/core/commands/createParagraphNear.js","../../src/core/commands/newlineInCode.js","../../src/core/commands/exitCode.js","../../src/core/helpers/isTextSelection.js","../../src/core/commands/setMark.js","../../src/core/helpers/getMarkRange.js","../../src/core/commands/unsetMark.js","../../src/core/commands/unsetAllMarks.js","../../src/core/helpers/isMarkActive.js","../../src/core/commands/toggleMark.js","../../src/core/commands/clearNodes.js","../../src/core/commands/setNode.js","../../src/core/helpers/isNodeActive.js","../../src/core/commands/toggleNode.js","../../src/core/commands/selectAll.js","../../src/core/commands/deleteSelection.js","../../src/core/commands/updateAttributes.js","../../src/core/utilities/deleteProps.js","../../src/core/commands/resetAttributes.js","../../src/core/commands/joinUp.js","../../src/core/commands/joinDown.js","../../src/core/commands/joinBackward.js","../../src/core/commands/joinForward.js","../../src/core/commands/selectNodeBackward.js","../../src/core/commands/selectNodeForward.js","../../src/core/commands/selectTextblockStart.js","../../src/core/commands/selectTextblockEnd.js","../../src/core/commands/insertContent.js","../../src/core/helpers/createNodeFromContent.js","../../src/core/helpers/selectionToInsertionEnd.js","../../src/core/commands/insertContentAt.js","../../../../node_modules/prosemirror-schema-list/dist/index.js","../../src/core/commands/wrapInList.js","../../src/core/helpers/findParentNodeClosestToPos.js","../../src/core/helpers/findParentNode.js","../../src/core/helpers/isList.js","../../src/core/commands/toggleList.js","../../src/core/commands/splitListItem.js","../../src/core/commands/sinkListItem.js","../../src/core/commands/liftListItem.js","../../src/core/extensions/commands.js","../../src/core/utilities/isIOS.js","../../src/core/utilities/isMacOS.js","../../src/core/extensions/keymap.js","../../src/core/extensions/editable.js","../../src/core/extensions/editorFocus.js","../../src/core/helpers/createDocument.js","../../src/core/helpers/isActive.js","../../src/extensions/track-changes/trackChangesHelpers/findTrackedMarkBetween.js","../../src/extensions/track-changes/trackChangesHelpers/markInsertion.js","../../src/extensions/track-changes/trackChangesHelpers/markDeletion.js","../../src/core/helpers/generateDocxListAttributes.js","../../src/core/helpers/getMarksBetween.js","../../src/core/helpers/findChildren.js","../../src/core/utilities/minMax.js","../../src/core/helpers/posToDOMRect.js","../../src/core/helpers/isInTable.js","../../src/extensions/track-changes/trackChangesHelpers/documentHelpers.js","../../src/extensions/track-changes/trackChangesHelpers/getTrackChanges.js","../../src/extensions/track-changes/plugins/trackChangesBasePlugin.js","../../src/extensions/track-changes/trackChangesHelpers/replaceStep.js","../../src/extensions/track-changes/trackChangesHelpers/markWrapping.js","../../src/extensions/track-changes/trackChangesHelpers/replaceAroundStep.js","../../src/extensions/track-changes/trackChangesHelpers/addMarkStep.js","../../src/extensions/track-changes/trackChangesHelpers/removeMarkStep.js","../../src/extensions/comment/comments-constants.js","../../src/extensions/comment/comments-helpers.js","../../src/extensions/pagination/pagination-helpers.js","../../src/extensions/comment/comments-plugin.js","../../src/extensions/track-changes/trackChangesHelpers/trackedTransaction.js","../../src/core/migrations/migration_after_0_4_14.js","../../src/core/migrations/index.js","../../src/core/Editor.js","../../src/core/Node.js","../../src/core/Mark.js","../../src/core/utilities/parseSizeUnit.js","../../src/extensions/color/color.js","../../src/extensions/font-family/font-family.js","../../src/extensions/font-size/font-size.js","../../src/extensions/text-align/text-align.js","../../src/extensions/text-indent/text-indent.js","../../src/extensions/line-height/line-height.js","../../src/extensions/format-commands/format-commands.js","../../../../node_modules/prosemirror-dropcursor/dist/index.js","../../src/extensions/dropcursor/dropcursor.js","../../../../node_modules/prosemirror-gapcursor/dist/index.js","../../src/extensions/gapcursor/gapcursor.js","../../src/extensions/collaboration/collaboration.js","../../src/extensions/collaboration-cursor/collaboration-cursor.js","../../src/extensions/document/document.js","../../src/extensions/text/text.js","../../src/extensions/run-item/run-item.js","../../src/extensions/bullet-list/bullet-list.js","../../src/extensions/ordered-list/helpers/orderedListSyncPlugin.js","../../src/extensions/ordered-list/helpers/orderedListMarkerPlugin.js","../../src/extensions/ordered-list/ordered-list.js","../../src/core/helpers/orderedListUtils.js","../../src/extensions/list-item/helpers/styledListMarkerPlugin.js","../../src/extensions/list-item/list-item.js","../../src/extensions/linked-styles/linked-styles.js","../../src/extensions/paragraph/paragraph.js","../../src/extensions/heading/heading.js","../../src/extensions/comment/comment.js","../../src/extensions/comment/comments-marks.js","../../src/extensions/tab/tab.js","../../src/extensions/line-break/line-break.js","../../src/extensions/table/tableHelpers/getColStyleDeclaration.js","../../src/extensions/table/TableView.js","../../src/extensions/table/tableHelpers/createCell.js","../../src/extensions/table/tableHelpers/createTableBorders.js","../../src/extensions/table/tableHelpers/createTable.js","../../src/extensions/table/tableHelpers/createColGroup.js","../../../../node_modules/prosemirror-tables/dist/index.js","../../src/extensions/table/tableHelpers/isCellSelection.js","../../src/extensions/table/tableHelpers/deleteTableWhenSelected.js","../../src/extensions/table-cell/helpers/createCellBorders.js","../../src/extensions/table/table.js","../../src/extensions/table-header/table-header.js","../../src/extensions/table-row/table-row.js","../../src/extensions/table-cell/table-cell.js","../../src/extensions/field-annotation/FieldAnnotationView.js","../../src/extensions/field-annotation/fieldAnnotationHelpers/findRemovedFieldAnnotations.js","../../src/extensions/field-annotation/fieldAnnotationHelpers/trackFieldAnnotationsDeletion.js","../../src/extensions/field-annotation/fieldAnnotationHelpers/getAllFieldAnnotations.js","../../src/extensions/field-annotation/FieldAnnotationPlugin.js","../../src/extensions/field-annotation/fieldAnnotationHelpers/getAllFieldAnnotationsWithRect.js","../../src/extensions/field-annotation/fieldAnnotationHelpers/findFieldAnnotations.js","../../src/extensions/field-annotation/fieldAnnotationHelpers/findFieldAnnotationsByFieldId.js","../../src/extensions/field-annotation/fieldAnnotationHelpers/findFirstFieldAnnotationByFieldId.js","../../src/extensions/field-annotation/fieldAnnotationHelpers/findFieldAnnotationsBetween.js","../../../../node_modules/color2k/dist/index.exports.import.es.mjs","../../src/extensions/field-annotation/field-annotation.js","../../src/extensions/image/imageHelpers/imagePlaceholderPlugin.js","../../src/extensions/image/image.js","../../src/extensions/bookmarks/bookmarks.js","../../src/extensions/mention/mention.js","../../src/extensions/text-style/text-style.js","../../src/extensions/bold/bold.js","../../src/extensions/italic/italic.js","../../src/extensions/underline/underline.js","../../src/extensions/highlight/highlight.js","../../src/extensions/strike/strike.js","../../src/extensions/link/link.js","../../src/extensions/track-changes/track-insert.js","../../src/extensions/track-changes/track-delete.js","../../src/extensions/track-changes/trackChangesHelpers/parseFormatList.js","../../src/extensions/track-changes/track-format.js","../../src/extensions/track-changes/track-changes.js","../../src/extensions/placeholder/placeholder.js","../../../../node_modules/@popperjs/core/lib/enums.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../../../node_modules/@popperjs/core/lib/utils/math.js","../../../../node_modules/@popperjs/core/lib/utils/userAgent.js","../../../../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../../../node_modules/@popperjs/core/lib/utils/within.js","../../../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../../../node_modules/@popperjs/core/lib/utils/debounce.js","../../../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../../../node_modules/@popperjs/core/lib/createPopper.js","../../../../node_modules/@popperjs/core/lib/popper.js","../../../../node_modules/tippy.js/dist/tippy.esm.js","../../src/components/popovers/Mentions.vue","../../src/extensions/popover-plugin/popover-plugin.js","../../src/extensions/pagination/pagination.js","../../src/extensions/index.js"],"sourcesContent":["export function getMarksFromSelection(state) {\n const { from, to, empty } = state.selection;\n const marks = [];\n\n if (empty) {\n if (state.storedMarks) {\n marks.push(...state.storedMarks);\n }\n\n marks.push(...state.selection.$head.marks());\n } else {\n state.doc.nodesBetween(from, to, (node) => {\n marks.push(...node.marks);\n });\n }\n return marks;\n}\n","export const findMark = (state, markType, toArr = false) => {\n const { selection, doc } = state;\n const { $from, $to } = selection;\n\n const fromMark = $from.marks().find((mark) => mark.type === markType);\n const toMark = $to.marks().find((mark) => mark.type === markType);\n\n let markFound;\n const marksFound = [];\n\n doc.nodesBetween($from.pos, $to.pos, (node, from) => {\n if (node.marks) {\n const actualMark = node.marks.find((mark) => mark.type === markType);\n if (actualMark) {\n markFound = {\n from,\n to: from + node.nodeSize,\n attrs: actualMark.attrs,\n contained: !fromMark || !toMark || fromMark === toMark,\n };\n marksFound.push(markFound);\n }\n }\n });\n\n if (toArr) {\n return marksFound;\n }\n\n return markFound;\n};\n","import { getMarksFromSelection } from './getMarksFromSelection.js';\nimport { findMark } from './findMark.js';\n\nexport function getActiveFormatting(editor) {\n const { state } = editor;\n const { selection } = state;\n\n const marks = getMarksFromSelection(state);\n\n const marksToProcess = marks\n .filter((mark) => !['textStyle', 'link'].includes(mark.type.name))\n .map((mark) => ({ name: mark.type.name, attrs: mark.attrs }));\n\n const textStyleMarks = marks.filter((mark) => mark.type.name === 'textStyle');\n marksToProcess.push(...textStyleMarks.flatMap(unwrapTextMarks));\n\n const linkMarkType = state.schema.marks['link'];\n const linkMark = findMark(state, linkMarkType);\n\n if (linkMark) {\n let { from, to, attrs } = linkMark;\n\n if (selection.from >= from && selection.to <= to) {\n marksToProcess.push({ name: 'link', attrs });\n }\n }\n\n const ignoreKeys = ['paragraphSpacing'];\n const attributes = getActiveAttributes(state);\n Object.keys(attributes).forEach((key) => {\n if (ignoreKeys.includes(key)) return;\n const attrs = {};\n attrs[key] = attributes[key];\n marksToProcess.push({ name: key, attrs });\n });\n\n const hasPendingFormatting = !!editor.storage.formatCommands?.storedStyle;\n if (hasPendingFormatting) marksToProcess.push({ name: 'copyFormat', attrs: true });\n return marksToProcess;\n}\n\nfunction unwrapTextMarks(textStyleMark) {\n const processedMarks = [];\n const { attrs } = textStyleMark;\n Object.keys(attrs).forEach((key) => {\n if (!attrs[key]) return;\n processedMarks.push({ name: key, attrs: { [key]: attrs[key] } });\n });\n return processedMarks;\n}\n\nfunction getActiveAttributes(state) {\n try {\n const { from, to, empty } = state.selection;\n const attributes = {};\n const getAttrs = (node) => {\n Object.keys(node.attrs).forEach((key) => {\n const value = node.attrs[key];\n if (value) {\n attributes[key] = value;\n }\n });\n };\n\n let start = from;\n let end = to;\n if (empty) state.doc.nodesBetween(start, end + 1, (node) => getAttrs(node));\n else state.doc.nodesBetween(from, to, (node) => getAttrs(node));\n return attributes;\n } catch (error) {\n return {};\n }\n}\n","var GOOD_LEAF_SIZE = 200;\n\n// :: class<T> A rope sequence is a persistent sequence data structure\n// that supports appending, prepending, and slicing without doing a\n// full copy. It is represented as a mostly-balanced tree.\nvar RopeSequence = function RopeSequence () {};\n\nRopeSequence.prototype.append = function append (other) {\n if (!other.length) { return this }\n other = RopeSequence.from(other);\n\n return (!this.length && other) ||\n (other.length < GOOD_LEAF_SIZE && this.leafAppend(other)) ||\n (this.length < GOOD_LEAF_SIZE && other.leafPrepend(this)) ||\n this.appendInner(other)\n};\n\n// :: (union<[T], RopeSequence<T>>) → RopeSequence<T>\n// Prepend an array or other rope to this one, returning a new rope.\nRopeSequence.prototype.prepend = function prepend (other) {\n if (!other.length) { return this }\n return RopeSequence.from(other).append(this)\n};\n\nRopeSequence.prototype.appendInner = function appendInner (other) {\n return new Append(this, other)\n};\n\n// :: (?number, ?number) → RopeSequence<T>\n// Create a rope repesenting a sub-sequence of this rope.\nRopeSequence.prototype.slice = function slice (from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n if (from >= to) { return RopeSequence.empty }\n return this.sliceInner(Math.max(0, from), Math.min(this.length, to))\n};\n\n// :: (number) → T\n// Retrieve the element at the given position from this rope.\nRopeSequence.prototype.get = function get (i) {\n if (i < 0 || i >= this.length) { return undefined }\n return this.getInner(i)\n};\n\n// :: ((element: T, index: number) → ?bool, ?number, ?number)\n// Call the given function for each element between the given\n// indices. This tends to be more efficient than looping over the\n// indices and calling `get`, because it doesn't have to descend the\n// tree for every element.\nRopeSequence.prototype.forEach = function forEach (f, from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n if (from <= to)\n { this.forEachInner(f, from, to, 0); }\n else\n { this.forEachInvertedInner(f, from, to, 0); }\n};\n\n// :: ((element: T, index: number) → U, ?number, ?number) → [U]\n// Map the given functions over the elements of the rope, producing\n// a flat array.\nRopeSequence.prototype.map = function map (f, from, to) {\n if ( from === void 0 ) from = 0;\n if ( to === void 0 ) to = this.length;\n\n var result = [];\n this.forEach(function (elt, i) { return result.push(f(elt, i)); }, from, to);\n return result\n};\n\n// :: (?union<[T], RopeSequence<T>>) → RopeSequence<T>\n// Create a rope representing the given array, or return the rope\n// itself if a rope was given.\nRopeSequence.from = function from (values) {\n if (values instanceof RopeSequence) { return values }\n return values && values.length ? new Leaf(values) : RopeSequence.empty\n};\n\nvar Leaf = /*@__PURE__*/(function (RopeSequence) {\n function Leaf(values) {\n RopeSequence.call(this);\n this.values = values;\n }\n\n if ( RopeSequence ) Leaf.__proto__ = RopeSequence;\n Leaf.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n Leaf.prototype.constructor = Leaf;\n\n var prototypeAccessors = { length: { configurable: true },depth: { configurable: true } };\n\n Leaf.prototype.flatten = function flatten () {\n return this.values\n };\n\n Leaf.prototype.sliceInner = function sliceInner (from, to) {\n if (from == 0 && to == this.length) { return this }\n return new Leaf(this.values.slice(from, to))\n };\n\n Leaf.prototype.getInner = function getInner (i) {\n return this.values[i]\n };\n\n Leaf.prototype.forEachInner = function forEachInner (f, from, to, start) {\n for (var i = from; i < to; i++)\n { if (f(this.values[i], start + i) === false) { return false } }\n };\n\n Leaf.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n for (var i = from - 1; i >= to; i--)\n { if (f(this.values[i], start + i) === false) { return false } }\n };\n\n Leaf.prototype.leafAppend = function leafAppend (other) {\n if (this.length + other.length <= GOOD_LEAF_SIZE)\n { return new Leaf(this.values.concat(other.flatten())) }\n };\n\n Leaf.prototype.leafPrepend = function leafPrepend (other) {\n if (this.length + other.length <= GOOD_LEAF_SIZE)\n { return new Leaf(other.flatten().concat(this.values)) }\n };\n\n prototypeAccessors.length.get = function () { return this.values.length };\n\n prototypeAccessors.depth.get = function () { return 0 };\n\n Object.defineProperties( Leaf.prototype, prototypeAccessors );\n\n return Leaf;\n}(RopeSequence));\n\n// :: RopeSequence\n// The empty rope sequence.\nRopeSequence.empty = new Leaf([]);\n\nvar Append = /*@__PURE__*/(function (RopeSequence) {\n function Append(left, right) {\n RopeSequence.call(this);\n this.left = left;\n this.right = right;\n this.length = left.length + right.length;\n this.depth = Math.max(left.depth, right.depth) + 1;\n }\n\n if ( RopeSequence ) Append.__proto__ = RopeSequence;\n Append.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n Append.prototype.constructor = Append;\n\n Append.prototype.flatten = function flatten () {\n return this.left.flatten().concat(this.right.flatten())\n };\n\n Append.prototype.getInner = function getInner (i) {\n return i < this.left.length ? this.left.get(i) : this.right.get(i - this.left.length)\n };\n\n Append.prototype.forEachInner = function forEachInner (f, from, to, start) {\n var leftLen = this.left.length;\n if (from < leftLen &&\n this.left.forEachInner(f, from, Math.min(to, leftLen), start) === false)\n { return false }\n if (to > leftLen &&\n this.right.forEachInner(f, Math.max(from - leftLen, 0), Math.min(this.length, to) - leftLen, start + leftLen) === false)\n { return false }\n };\n\n Append.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n var leftLen = this.left.length;\n if (from > leftLen &&\n this.right.forEachInvertedInner(f, from - leftLen, Math.max(to, leftLen) - leftLen, start + leftLen) === false)\n { return false }\n if (to < leftLen &&\n this.left.forEachInvertedInner(f, Math.min(from, leftLen), to, start) === false)\n { return false }\n };\n\n Append.prototype.sliceInner = function sliceInner (from, to) {\n if (from == 0 && to == this.length) { return this }\n var leftLen = this.left.length;\n if (to <= leftLen) { return this.left.slice(from, to) }\n if (from >= leftLen) { return this.right.slice(from - leftLen, to - leftLen) }\n return this.left.slice(from, leftLen).append(this.right.slice(0, to - leftLen))\n };\n\n Append.prototype.leafAppend = function leafAppend (other) {\n var inner = this.right.leafAppend(other);\n if (inner) { return new Append(this.left, inner) }\n };\n\n Append.prototype.leafPrepend = function leafPrepend (other) {\n var inner = this.left.leafPrepend(other);\n if (inner) { return new Append(inner, this.right) }\n };\n\n Append.prototype.appendInner = function appendInner (other) {\n if (this.left.depth >= Math.max(this.right.depth, other.depth) + 1)\n { return new Append(this.left, new Append(this.right, other)) }\n return new Append(this, other)\n };\n\n return Append;\n}(RopeSequence));\n\nexport default RopeSequence;\n","import RopeSequence from 'rope-sequence';\nimport { Mapping } from 'prosemirror-transform';\nimport { PluginKey, Plugin } from 'prosemirror-state';\n\n// ProseMirror's history isn't simply a way to roll back to a previous\n// state, because ProseMirror supports applying changes without adding\n// them to the history (for example during collaboration).\n//\n// To this end, each 'Branch' (one for the undo history and one for\n// the redo history) keeps an array of 'Items', which can optionally\n// hold a step (an actual undoable change), and always hold a position\n// map (which is needed to move changes below them to apply to the\n// current document).\n//\n// An item that has both a step and a selection bookmark is the start\n// of an 'event' — a group of changes that will be undone or redone at\n// once. (It stores only the bookmark, since that way we don't have to\n// provide a document until the selection is actually applied, which\n// is useful when compressing.)\n// Used to schedule history compression\nconst max_empty_items = 500;\nclass Branch {\n constructor(items, eventCount) {\n this.items = items;\n this.eventCount = eventCount;\n }\n // Pop the latest event off the branch's history and apply it\n // to a document transform.\n popEvent(state, preserveItems) {\n if (this.eventCount == 0)\n return null;\n let end = this.items.length;\n for (;; end--) {\n let next = this.items.get(end - 1);\n if (next.selection) {\n --end;\n break;\n }\n }\n let remap, mapFrom;\n if (preserveItems) {\n remap = this.remapping(end, this.items.length);\n mapFrom = remap.maps.length;\n }\n let transform = state.tr;\n let selection, remaining;\n let addAfter = [], addBefore = [];\n this.items.forEach((item, i) => {\n if (!item.step) {\n if (!remap) {\n remap = this.remapping(end, i + 1);\n mapFrom = remap.maps.length;\n }\n mapFrom--;\n addBefore.push(item);\n return;\n }\n if (remap) {\n addBefore.push(new Item(item.map));\n let step = item.step.map(remap.slice(mapFrom)), map;\n if (step && transform.maybeStep(step).doc) {\n map = transform.mapping.maps[transform.mapping.maps.length - 1];\n addAfter.push(new Item(map, undefined, undefined, addAfter.length + addBefore.length));\n }\n mapFrom--;\n if (map)\n remap.appendMap(map, mapFrom);\n }\n else {\n transform.maybeStep(item.step);\n }\n if (item.selection) {\n selection = remap ? item.selection.map(remap.slice(mapFrom)) : item.selection;\n remaining = new Branch(this.items.slice(0, end).append(addBefore.reverse().concat(addAfter)), this.eventCount - 1);\n return false;\n }\n }, this.items.length, 0);\n return { remaining: remaining, transform, selection: selection };\n }\n // Create a new branch with the given transform added.\n addTransform(transform, selection, histOptions, preserveItems) {\n let newItems = [], eventCount = this.eventCount;\n let oldItems = this.items, lastItem = !preserveItems && oldItems.length ? oldItems.get(oldItems.length - 1) : null;\n for (let i = 0; i < transform.steps.length; i++) {\n let step = transform.steps[i].invert(transform.docs[i]);\n let item = new Item(transform.mapping.maps[i], step, selection), merged;\n if (merged = lastItem && lastItem.merge(item)) {\n item = merged;\n if (i)\n newItems.pop();\n else\n oldItems = oldItems.slice(0, oldItems.length - 1);\n }\n newItems.push(item);\n if (selection) {\n eventCount++;\n selection = undefined;\n }\n if (!preserveItems)\n lastItem = item;\n }\n let overflow = eventCount - histOptions.depth;\n if (overflow > DEPTH_OVERFLOW) {\n oldItems = cutOffEvents(oldItems, overflow);\n eventCount -= overflow;\n }\n return new Branch(oldItems.append(newItems), eventCount);\n }\n remapping(from, to) {\n let maps = new Mapping;\n this.items.forEach((item, i) => {\n let mirrorPos = item.mirrorOffset != null && i - item.mirrorOffset >= from\n ? maps.maps.length - item.mirrorOffset : undefined;\n maps.appendMap(item.map, mirrorPos);\n }, from, to);\n return maps;\n }\n addMaps(array) {\n if (this.eventCount == 0)\n return this;\n return new Branch(this.items.append(array.map(map => new Item(map))), this.eventCount);\n }\n // When the collab module receives remote changes, the history has\n // to know about those, so that it can adjust the steps that were\n // rebased on top of the remote changes, and include the position\n // maps for the remote changes in its array of items.\n rebased(rebasedTransform, rebasedCount) {\n if (!this.eventCount)\n return this;\n let rebasedItems = [], start = Math.max(0, this.items.length - rebasedCount);\n let mapping = rebasedTransform.mapping;\n let newUntil = rebasedTransform.steps.length;\n let eventCount = this.eventCount;\n this.items.forEach(item => { if (item.selection)\n eventCount--; }, start);\n let iRebased = rebasedCount;\n this.items.forEach(item => {\n let pos = mapping.getMirror(--iRebased);\n if (pos == null)\n return;\n newUntil = Math.min(newUntil, pos);\n let map = mapping.maps[pos];\n if (item.step) {\n let step = rebasedTransform.steps[pos].invert(rebasedTransform.docs[pos]);\n let selection = item.selection && item.selection.map(mapping.slice(iRebased + 1, pos));\n if (selection)\n eventCount++;\n rebasedItems.push(new Item(map, step, selection));\n }\n else {\n rebasedItems.push(new Item(map));\n }\n }, start);\n let newMaps = [];\n for (let i = rebasedCount; i < newUntil; i++)\n newMaps.push(new Item(mapping.maps[i]));\n let items = this.items.slice(0, start).append(newMaps).append(rebasedItems);\n let branch = new Branch(items, eventCount);\n if (branch.emptyItemCount() > max_empty_items)\n branch = branch.compress(this.items.length - rebasedItems.length);\n return branch;\n }\n emptyItemCount() {\n let count = 0;\n this.items.forEach(item => { if (!item.step)\n count++; });\n return count;\n }\n // Compressing a branch means rewriting it to push the air (map-only\n // items) out. During collaboration, these naturally accumulate\n // because each remote change adds one. The `upto` argument is used\n // to ensure that only the items below a given level are compressed,\n // because `rebased` relies on a clean, untouched set of items in\n // order to associate old items with rebased steps.\n compress(upto = this.items.length) {\n let remap = this.remapping(0, upto), mapFrom = remap.maps.length;\n let items = [], events = 0;\n this.items.forEach((item, i) => {\n if (i >= upto) {\n items.push(item);\n if (item.selection)\n events++;\n }\n else if (item.step) {\n let step = item.step.map(remap.slice(mapFrom)), map = step && step.getMap();\n mapFrom--;\n if (map)\n remap.appendMap(map, mapFrom);\n if (step) {\n let selection = item.selection && item.selection.map(remap.slice(mapFrom));\n if (selection)\n events++;\n let newItem = new Item(map.invert(), step, selection), merged, last = items.length - 1;\n if (merged = items.length && items[last].merge(newItem))\n items[last] = merged;\n else\n items.push(newItem);\n }\n }\n else if (item.map) {\n mapFrom--;\n }\n }, this.items.length, 0);\n return new Branch(RopeSequence.from(items.reverse()), events);\n }\n}\nBranch.empty = new Branch(RopeSequence.empty, 0);\nfunction cutOffEvents(items, n) {\n let cutPoint;\n items.forEach((item, i) => {\n if (item.selection && (n-- == 0)) {\n cutPoint = i;\n return false;\n }\n });\n return items.slice(cutPoint);\n}\nclass Item {\n constructor(\n // The (forward) step map for this item.\n map, \n // The inverted step\n step, \n // If this is non-null, this item is the start of a group, and\n // this selection is the starting selection for the group (the one\n // that was active before the first step was applied)\n selection, \n // If this item is the inverse of a previous mapping on the stack,\n // this points at the inverse's offset\n mirrorOffset) {\n this.map = map;\n this.step = step;\n this.selection = selection;\n this.mirrorOffset = mirrorOffset;\n }\n merge(other) {\n if (this.step && other.step && !other.selection) {\n let step = other.step.merge(this.step);\n if (step)\n return new Item(step.getMap().invert(), step, this.selection);\n }\n }\n}\n// The value of the state field that tracks undo/redo history for that\n// state. Will be stored in the plugin state when the history plugin\n// is active.\nclass HistoryState {\n constructor(done, undone, prevRanges, prevTime, prevComposition) {\n this.done = done;\n this.undone = undone;\n this.prevRanges = prevRanges;\n this.prevTime = prevTime;\n this.prevComposition = prevComposition;\n }\n}\nconst DEPTH_OVERFLOW = 20;\n// Record a transformation in undo history.\nfunction applyTransaction(history, state, tr, options) {\n let historyTr = tr.getMeta(historyKey), rebased;\n if (historyTr)\n return historyTr.historyState;\n if (tr.getMeta(closeHistoryKey))\n history = new HistoryState(history.done, history.undone, null, 0, -1);\n let appended = tr.getMeta(\"appendedTransaction\");\n if (tr.steps.length == 0) {\n return history;\n }\n else if (appended && appended.getMeta(historyKey)) {\n if (appended.getMeta(historyKey).redo)\n return new HistoryState(history.done.addTransform(tr, undefined, options, mustPreserveItems(state)), history.undone, rangesFor(tr.mapping.maps), history.prevTime, history.prevComposition);\n else\n return new HistoryState(history.done, history.undone.addTransform(tr, undefined, options, mustPreserveItems(state)), null, history.prevTime, history.prevComposition);\n }\n else if (tr.getMeta(\"addToHistory\") !== false && !(appended && appended.getMeta(\"addToHistory\") === false)) {\n // Group transforms that occur in quick succession into one event.\n let composition = tr.getMeta(\"composition\");\n let newGroup = history.prevTime == 0 ||\n (!appended && history.prevComposition != composition &&\n (history.prevTime < (tr.time || 0) - options.newGroupDelay || !isAdjacentTo(tr, history.prevRanges)));\n let prevRanges = appended ? mapRanges(history.prevRanges, tr.mapping) : rangesFor(tr.mapping.maps);\n return new HistoryState(history.done.addTransform(tr, newGroup ? state.selection.getBookmark() : undefined, options, mustPreserveItems(state)), Branch.empty, prevRanges, tr.time, composition == null ? history.prevComposition : composition);\n }\n else if (rebased = tr.getMeta(\"rebased\")) {\n // Used by the collab module to tell the history that some of its\n // content has been rebased.\n return new HistoryState(history.done.rebased(tr, rebased), history.undone.rebased(tr, rebased), mapRanges(history.prevRanges, tr.mapping), history.prevTime, history.prevComposition);\n }\n else {\n return new HistoryState(history.done.addMaps(tr.mapping.maps), history.undone.addMaps(tr.mapping.maps), mapRanges(history.prevRanges, tr.mapping), history.prevTime, history.prevComposition);\n }\n}\nfunction isAdjacentTo(transform, prevRanges) {\n if (!prevRanges)\n return false;\n if (!transform.docChanged)\n return true;\n let adjacent = false;\n transform.mapping.maps[0].forEach((start, end) => {\n for (let i = 0; i < prevRanges.length; i += 2)\n if (start <= prevRanges[i + 1] && end >= prevRanges[i])\n adjacent = true;\n });\n return adjacent;\n}\nfunction rangesFor(maps) {\n let result = [];\n for (let i = maps.length - 1; i >= 0 && result.length == 0; i--)\n maps[i].forEach((_from, _to, from, to) => result.push(from, to));\n return result;\n}\nfunction mapRanges(ranges, mapping) {\n if (!ranges)\n return null;\n let result = [];\n for (let i = 0; i < ranges.length; i += 2) {\n let from = mapping.map(ranges[i], 1), to = mapping.map(ranges[i + 1], -1);\n if (from <= to)\n result.push(from, to);\n }\n return result;\n}\n// Apply the latest event from one branch to the document and shift the event\n// onto the other branch.\nfunction histTransaction(history, state, redo) {\n let preserveItems = mustPreserveItems(state);\n let histOptions = historyKey.get(state).spec.config;\n let pop = (redo ? history.undone : history.done).popEvent(state, preserveItems);\n if (!pop)\n return null;\n let selection = pop.selection.resolve(pop.transform.doc);\n let added = (redo ? history.done : history.undone).addTransform(pop.transform, state.selection.getBookmark(), histOptions, preserveItems);\n let newHist = new HistoryState(redo ? added : pop.remaining, redo ? pop.remaining : added, null, 0, -1);\n return pop.transform.setSelection(selection).setMeta(historyKey, { redo, historyState: newHist });\n}\nlet cachedPreserveItems = false, cachedPreserveItemsPlugins = null;\n// Check whether any plugin in the given state has a\n// `historyPreserveItems` property in its spec, in which case we must\n// preserve steps exactly as they came in, so that they can be\n// rebased.\nfunction mustPreserveItems(state) {\n let plugins = state.plugins;\n if (cachedPreserveItemsPlugins != plugins) {\n cachedPreserveItems = false;\n cachedPreserveItemsPlugins = plugins;\n for (let i = 0; i < plugins.length; i++)\n if (plugins[i].spec.historyPreserveItems) {\n cachedPreserveItems = true;\n break;\n }\n }\n return cachedPreserveItems;\n}\n/**\nSet a flag on the given transaction that will prevent further steps\nfrom being appended to an existing history event (so that they\nrequire a separate undo command to undo).\n*/\nfunction closeHistory(tr) {\n return tr.setMeta(closeHistoryKey, true);\n}\nconst historyKey = new PluginKey(\"history\");\nconst closeHistoryKey = new PluginKey(\"closeHistory\");\n/**\nReturns a plugin that enables the undo history for an editor. The\nplugin will track undo and redo stacks, which can be used with the\n[`undo`](https://prosemirror.net/docs/ref/#history.undo) and [`redo`](https://prosemirror.net/docs/ref/#history.redo) commands.\n\nYou can set an `\"addToHistory\"` [metadata\nproperty](https://prosemirror.net/docs/ref/#state.Transaction.setMeta) of `false` on a transaction\nto prevent it from being rolled back by undo.\n*/\nfunction history(config = {}) {\n config = { depth: config.depth || 100,\n newGroupDelay: config.newGroupDelay || 500 };\n return new Plugin({\n key: historyKey,\n state: {\n init() {\n return new HistoryState(Branch.empty, Branch.empty, null, 0, -1);\n },\n apply(tr, hist, state) {\n return applyTransaction(hist, state, tr, config);\n }\n },\n config,\n props: {\n handleDOMEvents: {\n beforeinput(view, e) {\n let inputType = e.inputType;\n let command = inputType == \"historyUndo\" ? undo : inputType == \"historyRedo\" ? redo : null;\n if (!command)\n return false;\n e.preventDefault();\n return command(view.state, view.dispatch);\n }\n }\n }\n });\n}\nfunction buildCommand(redo, scroll) {\n return (state, dispatch) => {\n let hist = historyKey.getState(state);\n if (!hist || (redo ? hist.undone : hist.done).eventCount == 0)\n return false;\n if (dispatch) {\n let tr = histTransaction(hist, state, redo);\n if (tr)\n dispatch(scroll ? tr.scrollIntoView() : tr);\n }\n return true;\n };\n}\n/**\nA command function that undoes the last change, if any.\n*/\nconst undo = buildCommand(false, true);\n/**\nA command function that redoes the last undone change, if any.\n*/\nconst redo = buildCommand(true, true);\n/**\nA command function that undoes the last change. Don't scroll the\nselection into view.\n*/\nconst undoNoScroll = buildCommand(false, false);\n/**\nA command function that redoes the last undone change. Don't\nscroll the selection into view.\n*/\nconst redoNoScroll = buildCommand(true, false);\n/**\nThe amount of undoable events available in a given state.\n*/\nfunction undoDepth(state) {\n let hist = historyKey.getState(state);\n return hist ? hist.done.eventCount : 0;\n}\n/**\nThe amount of redoable events available in a given editor state.\n*/\nfunction redoDepth(state) {\n let hist = historyKey.getState(state);\n return hist ? hist.undone.eventCount : 0;\n}\n\nexport { closeHistory, history, redo, redoDepth, redoNoScroll, undo, undoDepth, undoNoScroll };\n","/**\n * Get extension config field.\n * @param {*} extension The Editor extension.\n * @param {*} field The config field.\n * @param {*} context The context object to bind to function.\n * @returns The config field value.\n */\nexport function getExtensionConfigField(extension, field, context = {}) {\n if (typeof extension.config[field] === 'function') {\n const value = extension.config[field].bind({ ...context });\n return value;\n }\n\n return extension.config[field];\n}\n","/**\n * If \"value\" is a function, then call it and return result.\n * Otherwise it is returned directly.\n * @param value Any value or function.\n * @param context Context to bind to function (Optional).\n * @param props Props for function (Optional).\n */\nexport function callOrGet(value, context = null, ...props) {\n if (typeof value === 'function') {\n if (context) return value.bind(context)(...props);\n return value(...props);\n }\n\n return value;\n}\n","import { getExtensionConfigField } from './helpers/getExtensionConfigField.js';\nimport { callOrGet } from './utilities/callOrGet.js';\n\n/**\n * Extension class is used to create extensions.\n */\nexport class Extension {\n type = 'extension';\n\n name = 'extension';\n\n options;\n\n storage;\n\n config = {\n name: this.name,\n };\n\n constructor(config) {\n this.config = {\n ...this.config,\n ...config,\n };\n\n this.name = this.config.name;\n\n if (this.config.addOptions) {\n this.options = callOrGet(\n getExtensionConfigField(this, 'addOptions', {\n name: this.name,\n }),\n );\n }\n\n this.storage =\n callOrGet(\n getExtensionConfigField(this, 'addStorage', {\n name: this.name,\n options: this.options,\n }),\n ) || {};\n }\n\n /**\n * Static method for creating an extension.\n * @param args Arguments for the constructor.\n */\n static create(...args) {\n return new Extension(...args);\n }\n}\n","import { history, redo as originalRedo, undo as originalUndo } from 'prosemirror-history';\nimport { Extension } from '@core/Extension.js';\n\nexport const History = Extension.create({\n name: 'history',\n\n addOptions() {\n // https://prosemirror.net/docs/ref/#history.history\n return {\n depth: 100,\n newGroupDelay: 500,\n };\n },\n\n addPmPlugins() {\n const historyPlugin = history(this.options);\n return [historyPlugin];\n },\n\n //prettier-ignore\n addCommands() {\n return {\n undo: () => ({ state, dispatch, tr }) => {\n tr.setMeta('inputType', 'historyUndo');\n return originalUndo(state, dispatch);\n },\n redo: () => ({ state, dispatch, tr }) => {\n tr.setMeta('inputType', 'historyRedo');\n return originalRedo(state, dispatch);\n },\n };\n },\n\n addShortcuts() {\n return {\n 'Mod-z': () => this.editor.commands.undo(),\n 'Mod-Shift-z': () => this.editor.commands.redo(),\n 'Mod-y': () => this.editor.commands.redo(),\n };\n },\n});\n","const global = globalThis || void 0 || self;\n\nexport { global as default, global };\n//# sourceMappingURL=index.js.map\n","import { TextSelection, NodeSelection, AllSelection, Selection } from 'prosemirror-state';\nimport { DOMSerializer, Fragment, Mark, Slice, DOMParser } from 'prosemirror-model';\nimport { dropPoint } from 'prosemirror-transform';\n\nconst domIndex = function (node) {\n for (var index = 0;; index++) {\n node = node.previousSibling;\n if (!node)\n return index;\n }\n};\nconst parentNode = function (node) {\n let parent = node.assignedSlot || node.parentNode;\n return parent && parent.nodeType == 11 ? parent.host : parent;\n};\nlet reusedRange = null;\n// Note that this will always return the same range, because DOM range\n// objects are every expensive, and keep slowing down subsequent DOM\n// updates, for some reason.\nconst textRange = function (node, from, to) {\n let range = reusedRange || (reusedRange = document.createRange());\n range.setEnd(node, to == null ? node.nodeValue.length : to);\n range.setStart(node, from || 0);\n return range;\n};\nconst clearReusedRange = function () {\n reusedRange = null;\n};\n// Scans forward and backward through DOM positions equivalent to the\n// given one to see if the two are in the same place (i.e. after a\n// text node vs at the end of that text node)\nconst isEquivalentPosition = function (node, off, targetNode, targetOff) {\n return targetNode && (scanFor(node, off, targetNode, targetOff, -1) ||\n scanFor(node, off, targetNode, targetOff, 1));\n};\nconst atomElements = /^(img|br|input|textarea|hr)$/i;\nfunction scanFor(node, off, targetNode, targetOff, dir) {\n for (;;) {\n if (node == targetNode && off == targetOff)\n return true;\n if (off == (dir < 0 ? 0 : nodeSize(node))) {\n let parent = node.parentNode;\n if (!parent || parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) ||\n node.contentEditable == \"false\")\n return false;\n off = domIndex(node) + (dir < 0 ? 0 : 1);\n node = parent;\n }\n else if (node.nodeType == 1) {\n node = node.childNodes[off + (dir < 0 ? -1 : 0)];\n if (node.contentEditable == \"false\")\n return false;\n off = dir < 0 ? nodeSize(node) : 0;\n }\n else {\n return false;\n }\n }\n}\nfunction nodeSize(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction textNodeBefore$1(node, offset) {\n for (;;) {\n if (node.nodeType == 3 && offset)\n return node;\n if (node.nodeType == 1 && offset > 0) {\n if (node.contentEditable == \"false\")\n return null;\n node = node.childNodes[offset - 1];\n offset = nodeSize(node);\n }\n else if (node.parentNode && !hasBlockDesc(node)) {\n offset = domIndex(node);\n node = node.parentNode;\n }\n else {\n return null;\n }\n }\n}\nfunction textNodeAfter$1(node, offset) {\n for (;;) {\n if (node.nodeType == 3 && offset < node.nodeValue.length)\n return node;\n if (node.nodeType == 1 && offset < node.childNodes.length) {\n if (node.contentEditable == \"false\")\n return null;\n node = node.childNodes[offset];\n offset = 0;\n }\n else if (node.parentNode && !hasBlockDesc(node)) {\n offset = domIndex(node) + 1;\n node = node.parentNode;\n }\n else {\n return null;\n }\n }\n}\nfunction isOnEdge(node, offset, parent) {\n for (let atStart = offset == 0, atEnd = offset == nodeSize(node); atStart || atEnd;) {\n if (node == parent)\n return true;\n let index = domIndex(node);\n node = node.parentNode;\n if (!node)\n return false;\n atStart = atStart && index == 0;\n atEnd = atEnd && index == nodeSize(node);\n }\n}\nfunction hasBlockDesc(dom) {\n let desc;\n for (let cur = dom; cur; cur = cur.parentNode)\n if (desc = cur.pmViewDesc)\n break;\n return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom);\n}\n// Work around Chrome issue https://bugs.chromium.org/p/chromium/issues/detail?id=447523\n// (isCollapsed inappropriately returns true in shadow dom)\nconst selectionCollapsed = function (domSel) {\n return domSel.focusNode && isEquivalentPosition(domSel.focusNode, domSel.focusOffset, domSel.anchorNode, domSel.anchorOffset);\n};\nfunction keyEvent(keyCode, key) {\n let event = document.createEvent(\"Event\");\n event.initEvent(\"keydown\", true, true);\n event.keyCode = keyCode;\n event.key = event.code = key;\n return event;\n}\nfunction deepActiveElement(doc) {\n let elt = doc.activeElement;\n while (elt && elt.shadowRoot)\n elt = elt.shadowRoot.activeElement;\n return elt;\n}\nfunction caretFromPoint(doc, x, y) {\n if (doc.caretPositionFromPoint) {\n try { // Firefox throws for this call in hard-to-predict circumstances (#994)\n let pos = doc.caretPositionFromPoint(x, y);\n // Clip the offset, because Chrome will return a text offset\n // into <input> nodes, which can't be treated as a regular DOM\n // offset\n if (pos)\n return { node: pos.offsetNode, offset: Math.min(nodeSize(pos.offsetNode), pos.offset) };\n }\n catch (_) { }\n }\n if (doc.caretRangeFromPoint) {\n let range = doc.caretRangeFromPoint(x, y);\n if (range)\n return { node: range.startContainer, offset: Math.min(nodeSize(range.startContainer), range.startOffset) };\n }\n}\n\nconst nav = typeof navigator != \"undefined\" ? navigator : null;\nconst doc = typeof document != \"undefined\" ? document : null;\nconst agent = (nav && nav.userAgent) || \"\";\nconst ie_edge = /Edge\\/(\\d+)/.exec(agent);\nconst ie_upto10 = /MSIE \\d/.exec(agent);\nconst ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(agent);\nconst ie = !!(ie_upto10 || ie_11up || ie_edge);\nconst ie_version = ie_upto10 ? document.documentMode : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : 0;\nconst gecko = !ie && /gecko\\/(\\d+)/i.test(agent);\ngecko && +(/Firefox\\/(\\d+)/.exec(agent) || [0, 0])[1];\nconst _chrome = !ie && /Chrome\\/(\\d+)/.exec(agent);\nconst chrome = !!_chrome;\nconst chrome_version = _chrome ? +_chrome[1] : 0;\nconst safari = !ie && !!nav && /Apple Computer/.test(nav.vendor);\n// Is true for both iOS and iPadOS for convenience\nconst ios = safari && (/Mobile\\/\\w+/.test(agent) || !!nav && nav.maxTouchPoints > 2);\nconst mac = ios || (nav ? /Mac/.test(nav.platform) : false);\nconst windows = nav ? /Win/.test(nav.platform) : false;\nconst android = /Android \\d/.test(agent);\nconst webkit = !!doc && \"webkitFontSmoothing\" in doc.documentElement.style;\nconst webkit_version = webkit ? +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1] : 0;\n\nfunction windowRect(doc) {\n let vp = doc.defaultView && doc.defaultView.visualViewport;\n if (vp)\n return {\n left: 0, right: vp.width,\n top: 0, bottom: vp.height\n };\n return { left: 0, right: doc.documentElement.clientWidth,\n top: 0, bottom: doc.documentElement.clientHeight };\n}\nfunction getSide(value, side) {\n return typeof value == \"number\" ? value : value[side];\n}\nfunction clientRect(node) {\n let rect = node.getBoundingClientRect();\n // Adjust for elements with style \"transform: scale()\"\n let scaleX = (rect.width / node.offsetWidth) || 1;\n let scaleY = (rect.height / node.offsetHeight) || 1;\n // Make sure scrollbar width isn't included in the rectangle\n return { left: rect.left, right: rect.left + node.clientWidth * scaleX,\n top: rect.top, bottom: rect.top + node.clientHeight * scaleY };\n}\nfunction scrollRectIntoView(view, rect, startDOM) {\n let scrollThreshold = view.someProp(\"scrollThreshold\") || 0, scrollMargin = view.someProp(\"scrollMargin\") || 5;\n let doc = view.dom.ownerDocument;\n for (let parent = startDOM || view.dom;;) {\n if (!parent)\n break;\n if (parent.nodeType != 1) {\n parent = parentNode(parent);\n continue;\n }\n let elt = parent;\n let atTop = elt == doc.body;\n let bounding = atTop ? windowRect(doc) : clientRect(elt);\n let moveX = 0, moveY = 0;\n if (rect.top < bounding.top + getSide(scrollThreshold, \"top\"))\n moveY = -(bounding.top - rect.top + getSide(scrollMargin, \"top\"));\n else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, \"bottom\"))\n moveY = rect.bottom - rect.top > bounding.bottom - bounding.top\n ? rect.top + getSide(scrollMargin, \"top\") - bounding.top\n : rect.bottom - bounding.bottom + getSide(scrollMargin, \"bottom\");\n if (rect.left < bounding.left + getSide(scrollThreshold, \"left\"))\n moveX = -(bounding.left - rect.left + getSide(scrollMargin, \"left\"));\n else if (rect.right > bounding.right - getSide(scrollThreshold, \"right\"))\n moveX = rect.right - bounding.right + getSide(scrollMargin, \"right\");\n if (moveX || moveY) {\n if (atTop) {\n doc.defaultView.scrollBy(moveX, moveY);\n }\n else {\n let startX = elt.scrollLeft, startY = elt.scrollTop;\n if (moveY)\n elt.scrollTop += moveY;\n if (moveX)\n elt.scrollLeft += moveX;\n let dX = elt.scrollLeft - startX, dY = elt.scrollTop - startY;\n rect = { left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY };\n }\n }\n let pos = atTop ? \"fixed\" : getComputedStyle(parent).position;\n if (/^(fixed|sticky)$/.test(pos))\n break;\n parent = pos == \"absolute\" ? parent.offsetParent : parentNode(parent);\n }\n}\n// Store the scroll position of the editor's parent nodes, along with\n// the top position of an element near the top of the editor, which\n// will be used to make sure the visible viewport remains stable even\n// when the size of the content above changes.\nfunction storeScrollPos(view) {\n let rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top);\n let refDOM, refTop;\n for (let x = (rect.left + rect.right) / 2, y = startY + 1; y < Math.min(innerHeight, rect.bottom); y += 5) {\n let dom = view.root.elementFromPoint(x, y);\n if (!dom || dom == view.dom || !view.dom.contains(dom))\n continue;\n let localRect = dom.getBoundingClientRect();\n if (localRect.top >= startY - 20) {\n refDOM = dom;\n refTop = localRect.top;\n break;\n }\n }\n return { refDOM: refDOM, refTop: refTop, stack: scrollStack(view.dom) };\n}\nfunction scrollStack(dom) {\n let stack = [], doc = dom.ownerDocument;\n for (let cur = dom; cur; cur = parentNode(cur)) {\n stack.push({ dom: cur, top: cur.scrollTop, left: cur.scrollLeft });\n if (dom == doc)\n break;\n }\n return stack;\n}\n// Reset the scroll position of the editor's parent nodes to that what\n// it was before, when storeScrollPos was called.\nfunction resetScrollPos({ refDOM, refTop, stack }) {\n let newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0;\n restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop);\n}\nfunction restoreScrollStack(stack, dTop) {\n for (let i = 0; i < stack.length; i++) {\n let { dom, top, left } = stack[i];\n if (dom.scrollTop != top + dTop)\n dom.scrollTop = top + dTop;\n if (dom.scrollLeft != left)\n dom.scrollLeft = left;\n }\n}\nlet preventScrollSupported = null;\n// Feature-detects support for .focus({preventScroll: true}), and uses\n// a fallback kludge when not supported.\nfunction focusPreventScroll(dom) {\n if (dom.setActive)\n return dom.setActive(); // in IE\n if (preventScrollSupported)\n return dom.focus(preventScrollSupported);\n let stored = scrollStack(dom);\n dom.focus(preventScrollSupported == null ? {\n get preventScroll() {\n preventScrollSupported = { preventScroll: true };\n return true;\n }\n } : undefined);\n if (!preventScrollSupported) {\n preventScrollSupported = false;\n restoreScrollStack(stored, 0);\n }\n}\nfunction findOffsetInNode(node, coords) {\n let closest, dxClosest = 2e8, coordsClosest, offset = 0;\n let rowBot = coords.top, rowTop = coords.top;\n let firstBelow, coordsBelow;\n for (let child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) {\n let rects;\n if (child.nodeType == 1)\n rects = child.getClientRects();\n else if (child.nodeType == 3)\n rects = textRange(child).getClientRects();\n else\n continue;\n for (let i = 0; i < rects.length; i++) {\n let rect = rects[i];\n if (rect.top <= rowBot && rect.bottom >= rowTop) {\n rowBot = Math.max(rect.bottom, rowBot);\n rowTop = Math.min(rect.top, rowTop);\n let dx = rect.left > coords.left ? rect.left - coords.left\n : rect.right < coords.left ? coords.left - rect.right : 0;\n if (dx < dxClosest) {\n closest = child;\n dxClosest = dx;\n coordsClosest = dx && closest.nodeType == 3 ? {\n left: rect.right < coords.left ? rect.right : rect.left,\n top: coords.top\n } : coords;\n if (child.nodeType == 1 && dx)\n offset = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0);\n continue;\n }\n }\n else if (rect.top > coords.top && !firstBelow && rect.left <= coords.left && rect.right >= coords.left) {\n firstBelow = child;\n coordsBelow = { left: Math.max(rect.left, Math.min(rect.right, coords.left)), top: rect.top };\n }\n if (!closest && (coords.left >= rect.right && coords.top >= rect.top ||\n coords.left >= rect.left && coords.top >= rect.bottom))\n offset = childIndex + 1;\n }\n }\n if (!closest && firstBelow) {\n closest = firstBelow;\n coordsClosest = coordsBelow;\n dxClosest = 0;\n }\n if (closest && closest.nodeType == 3)\n return findOffsetInText(closest, coordsClosest);\n if (!closest || (dxClosest && closest.nodeType == 1))\n return { node, offset };\n return findOffsetInNode(closest, coordsClosest);\n}\nfunction findOffsetInText(node, coords) {\n let len = node.nodeValue.length;\n let range = document.createRange();\n for (let i = 0; i < len; i++) {\n range.setEnd(node, i + 1);\n range.setStart(node, i);\n let rect = singleRect(range, 1);\n if (rect.top == rect.bottom)\n continue;\n if (inRect(coords, rect))\n return { node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0) };\n }\n return { node, offset: 0 };\n}\nfunction inRect(coords, rect) {\n return coords.left >= rect.left - 1 && coords.left <= rect.right + 1 &&\n coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1;\n}\nfunction targetKludge(dom, coords) {\n let parent = dom.parentNode;\n if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left)\n return parent;\n return dom;\n}\nfunction posFromElement(view, elt, coords) {\n let { node, offset } = findOffsetInNode(elt, coords), bias = -1;\n if (node.nodeType == 1 && !node.firstChild) {\n let rect = node.getBoundingClientRect();\n bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1;\n }\n return view.docView.posFromDOM(node, offset, bias);\n}\nfunction posFromCaret(view, node, offset, coords) {\n // Browser (in caretPosition/RangeFromPoint) will agressively\n // normalize towards nearby inline nodes. Since we are interested in\n // positions between block nodes too, we first walk up the hierarchy\n // of nodes to see if there are block nodes that the coordinates\n // fall outside of. If so, we take the position before/after that\n // block. If not, we call `posFromDOM` on the raw node/offset.\n let outsideBlock = -1;\n for (let cur = node, sawBlock = false;;) {\n if (cur == view.dom)\n break;\n let desc = view.docView.nearestDesc(cur, true), rect;\n if (!desc)\n return null;\n if (desc.dom.nodeType == 1 && (desc.node.isBlock && desc.parent || !desc.contentDOM) &&\n // Ignore elements with zero-size bounding rectangles\n ((rect = desc.dom.getBoundingClientRect()).width || rect.height)) {\n if (desc.node.isBlock && desc.parent) {\n // Only apply the horizontal test to the innermost block. Vertical for any parent.\n if (!sawBlock && rect.left > coords.left || rect.top > coords.top)\n outsideBlock = desc.posBefore;\n else if (!sawBlock && rect.right < coords.left || rect.bottom < coords.top)\n outsideBlock = desc.posAfter;\n sawBlock = true;\n }\n if (!desc.contentDOM && outsideBlock < 0 && !desc.node.isText) {\n // If we are inside a leaf, return the side of the leaf closer to the coords\n let before = desc.node.isBlock ? coords.top < (rect.top + rect.bottom) / 2\n : coords.left < (rect.left + rect.right) / 2;\n return before ? desc.posBefore : desc.posAfter;\n }\n }\n cur = desc.dom.parentNode;\n }\n return outsideBlock > -1 ? outsideBlock : view.docView.posFromDOM(node, offset, -1);\n}\nfunction elementFromPoint(element, coords, box) {\n let len = element.childNodes.length;\n if (len && box.top < box.bottom) {\n for (let startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI;;) {\n let child = element.childNodes[i];\n if (child.nodeType == 1) {\n let rects = child.getClientRects();\n for (let j = 0; j < rects.length; j++) {\n let rect = rects[j];\n if (inRect(coords, rect))\n return elementFromPoint(child, coords, rect);\n }\n }\n if ((i = (i + 1) % len) == startI)\n break;\n }\n }\n return element;\n}\n// Given an x,y position on the editor, get the position in the document.\nfunction posAtCoords(view, coords) {\n let doc = view.dom.ownerDocument, node, offset = 0;\n let caret = caretFromPoint(doc, coords.left, coords.top);\n if (caret)\n ({ node, offset } = caret);\n let elt = (view.root.elementFromPoint ? view.root : doc)\n .elementFromPoint(coords.left, coords.top);\n let pos;\n if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {\n let box = view.dom.getBoundingClientRect();\n if (!inRect(coords, box))\n return null;\n elt = elementFromPoint(view.dom, coords, box);\n if (!elt)\n return null;\n }\n // Safari's caretRangeFromPoint returns nonsense when on a draggable element\n if (safari) {\n for (let p = elt; node && p; p = parentNode(p))\n if (p.draggable)\n node = undefined;\n }\n elt = targetKludge(elt, coords);\n if (node) {\n if (gecko && node.nodeType == 1) {\n // Firefox will sometimes return offsets into <input> nodes, which\n // have no actual children, from caretPositionFromPoint (#953)\n offset = Math.min(offset, node.childNodes.length);\n // It'll also move the returned position before image nodes,\n // even if those are behind it.\n if (offset < node.childNodes.length) {\n let next = node.childNodes[offset], box;\n if (next.nodeName == \"IMG\" && (box = next.getBoundingClientRect()).right <= coords.left &&\n box.bottom > coords.top)\n offset++;\n }\n }\n let prev;\n // When clicking above the right side of an uneditable node, Chrome will report a cursor position after that node.\n if (webkit && offset && node.nodeType == 1 && (prev = node.childNodes[offset - 1]).nodeType == 1 &&\n prev.contentEditable == \"false\" && prev.getBoundingClientRect().top >= coords.top)\n offset--;\n // Suspiciously specific kludge to work around caret*FromPoint\n // never returning a position at the end of the document\n if (node == view.dom && offset == node.childNodes.length - 1 && node.lastChild.nodeType == 1 &&\n coords.top > node.lastChild.getBoundingClientRect().bottom)\n pos = view.state.doc.content.size;\n // Ignore positions directly after a BR, since caret*FromPoint\n // 'round up' positions that would be more accurately placed\n // before the BR node.\n else if (offset == 0 || node.nodeType != 1 || node.childNodes[offset - 1].nodeName != \"BR\")\n pos = posFromCaret(view, node, offset, coords);\n }\n if (pos == null)\n pos = posFromElement(view, elt, coords);\n let desc = view.docView.nearestDesc(elt, true);\n return { pos, inside: desc ? desc.posAtStart - desc.border : -1 };\n}\nfunction nonZero(rect) {\n return rect.top < rect.bottom || rect.left < rect.right;\n}\nfunction singleRect(target, bias) {\n let rects = target.getClientRects();\n if (rects.length) {\n let first = rects[bias < 0 ? 0 : rects.length - 1];\n if (nonZero(first))\n return first;\n }\n return Array.prototype.find.call(rects, nonZero) || target.getBoundingClientRect();\n}\nconst BIDI = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n// Given a position in the document model, get a bounding box of the\n// character at that position, relative to the window.\nfunction coordsAtPos(view, pos, side) {\n let { node, offset, atom } = view.docView.domFromPos(pos, side < 0 ? -1 : 1);\n let supportEmptyRange = webkit || gecko;\n if (node.nodeType == 3) {\n // These browsers support querying empty text ranges. Prefer that in\n // bidi context or when at the end of a node.\n if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset : offset == node.nodeValue.length))) {\n let rect = singleRect(textRange(node, offset, offset), side);\n // Firefox returns bad results (the position before the space)\n // when querying a position directly after line-broken\n // whitespace. Detect this situation and and kludge around it\n if (gecko && offset && /\\s/.test(node.nodeValue[offset - 1]) && offset < node.nodeValue.length) {\n let rectBefore = singleRect(textRange(node, offset - 1, offset - 1), -1);\n if (rectBefore.top == rect.top) {\n let rectAfter = singleRect(textRange(node, offset, offset + 1), -1);\n if (rectAfter.top != rect.top)\n return flattenV(rectAfter, rectAfter.left < rectBefore.left);\n }\n }\n return rect;\n }\n else {\n let from = offset, to = offset, takeSide = side < 0 ? 1 : -1;\n if (side < 0 && !offset) {\n to++;\n takeSide = -1;\n }\n else if (side >= 0 && offset == node.nodeValue.length) {\n from--;\n takeSide = 1;\n }\n else if (side < 0) {\n from--;\n }\n else {\n to++;\n }\n return flattenV(singleRect(textRange(node, from, to), takeSide), takeSide < 0);\n }\n }\n let $dom = view.state.doc.resolve(pos - (atom || 0));\n // Return a horizontal line in block context\n if (!$dom.parent.inlineContent) {\n if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n let before = node.childNodes[offset - 1];\n if (before.nodeType == 1)\n return flattenH(before.getBoundingClientRect(), false);\n }\n if (atom == null && offset < nodeSize(node)) {\n let after = node.childNodes[offset];\n if (after.nodeType == 1)\n return flattenH(after.getBoundingClientRect(), true);\n }\n return flattenH(node.getBoundingClientRect(), side >= 0);\n }\n // Inline, not in text node (this is not Bidi-safe)\n if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n let before = node.childNodes[offset - 1];\n let target = before.nodeType == 3 ? textRange(before, nodeSize(before) - (supportEmptyRange ? 0 : 1))\n // BR nodes tend to only return the rectangle before them.\n // Only use them if they are the last element in their parent\n : before.nodeType == 1 && (before.nodeName != \"BR\" || !before.nextSibling) ? before : null;\n if (target)\n return flattenV(singleRect(target, 1), false);\n }\n if (atom == null && offset < nodeSize(node)) {\n let after = node.childNodes[offset];\n while (after.pmViewDesc && after.pmViewDesc.ignoreForCoords)\n after = after.nextSibling;\n let target = !after ? null : after.nodeType == 3 ? textRange(after, 0, (supportEmptyRange ? 0 : 1))\n : after.nodeType == 1 ? after : null;\n if (target)\n return flattenV(singleRect(target, -1), true);\n }\n // All else failed, just try to get a rectangle for the target node\n return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0);\n}\nfunction flattenV(rect, left) {\n if (rect.width == 0)\n return rect;\n let x = left ? rect.left : rect.right;\n return { top: rect.top, bottom: rect.bottom, left: x, right: x };\n}\nfunction flattenH(rect, top) {\n if (rect.height == 0)\n return rect;\n let y = top ? rect.top : rect.bottom;\n return { top: y, bottom: y, left: rect.left, right: rect.right };\n}\nfunction withFlushedState(view, state, f) {\n let viewState = view.state, active = view.root.activeElement;\n if (viewState != state)\n view.updateState(state);\n if (active != view.dom)\n view.focus();\n try {\n return f();\n }\n finally {\n if (viewState != state)\n view.updateState(viewState);\n if (active != view.dom && active)\n active.focus();\n }\n}\n// Whether vertical position motion in a given direction\n// from a position would leave a text block.\nfunction endOfTextblockVertical(view, state, dir) {\n let sel = state.selection;\n let $pos = dir == \"up\" ? sel.$from : sel.$to;\n return withFlushedState(view, state, () => {\n let { node: dom } = view.docView.domFromPos($pos.pos, dir == \"up\" ? -1 : 1);\n for (;;) {\n let nearest = view.docView.nearestDesc(dom, true);\n if (!nearest)\n break;\n if (nearest.node.isBlock) {\n dom = nearest.contentDOM || nearest.dom;\n break;\n }\n dom = nearest.dom.parentNode;\n }\n let coords = coordsAtPos(view, $pos.pos, 1);\n for (let child = dom.firstChild; child; child = child.nextSibling) {\n let boxes;\n if (child.nodeType == 1)\n boxes = child.getClientRects();\n else if (child.nodeType == 3)\n boxes = textRange(child, 0, child.nodeValue.length).getClientRects();\n else\n continue;\n for (let i = 0; i < boxes.length; i++) {\n let box = boxes[i];\n if (box.bottom > box.top + 1 &&\n (dir == \"up\" ? coords.top - box.top > (box.bottom - coords.top) * 2\n : box.bottom - coords.bottom > (coords.bottom - box.top) * 2))\n return false;\n }\n }\n return true;\n });\n}\nconst maybeRTL = /[\\u0590-\\u08ac]/;\nfunction endOfTextblockHorizontal(view, state, dir) {\n let { $head } = state.selection;\n if (!$head.parent.isTextblock)\n return false;\n let offset = $head.parentOffset, atStart = !offset, atEnd = offset == $head.parent.content.size;\n let sel = view.domSelection();\n if (!sel)\n return $head.pos == $head.start() || $head.pos == $head.end();\n // If the textblock is all LTR, or the browser doesn't support\n // Selection.modify (Edge), fall back to a primitive approach\n if (!maybeRTL.test($head.parent.textContent) || !sel.modify)\n return dir == \"left\" || dir == \"backward\" ? atStart : atEnd;\n return withFlushedState(view, state, () => {\n // This is a huge hack, but appears to be the best we can\n // currently do: use `Selection.modify` to move the selection by\n // one character, and see if that moves the cursor out of the\n // textblock (or doesn't move it at all, when at the start/end of\n // the document).\n let { focusNode: oldNode, focusOffset: oldOff, anchorNode, anchorOffset } = view.domSelectionRange();\n let oldBidiLevel = sel.caretBidiLevel // Only for Firefox\n ;\n sel.modify(\"move\", dir, \"character\");\n let parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom;\n let { focusNode: newNode, focusOffset: newOff } = view.domSelectionRange();\n let result = newNode && !parentDOM.contains(newNode.nodeType == 1 ? newNode : newNode.parentNode) ||\n (oldNode == newNode && oldOff == newOff);\n // Restore the previous selection\n try {\n sel.collapse(anchorNode, anchorOffset);\n if (oldNode && (oldNode != anchorNode || oldOff != anchorOffset) && sel.extend)\n sel.extend(oldNode, oldOff);\n }\n catch (_) { }\n if (oldBidiLevel != null)\n sel.caretBidiLevel = oldBidiLevel;\n return result;\n });\n}\nlet cachedState = null;\nlet cachedDir = null;\nlet cachedResult = false;\nfunction endOfTextblock(view, state, dir) {\n if (cachedState == state && cachedDir == dir)\n return cachedResult;\n cachedState = state;\n cachedDir = dir;\n return cachedResult = dir == \"up\" || dir == \"down\"\n ? endOfTextblockVertical(view, state, dir)\n : endOfTextblockHorizontal(view, state, dir);\n}\n\n// View descriptions are data structures that describe the DOM that is\n// used to represent the editor's content. They are used for:\n//\n// - Incremental redrawing when the document changes\n//\n// - Figuring out what part of the document a given DOM position\n// corresponds to\n//\n// - Wiring in custom implementations of the editing interface for a\n// given node\n//\n// They form a doubly-linked mutable tree, starting at `view.docView`.\nconst NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3;\n// Superclass for the various kinds of descriptions. Defines their\n// basic structure and shared methods.\nclass ViewDesc {\n constructor(parent, children, dom, \n // This is the node that holds the child views. It may be null for\n // descs that don't have children.\n contentDOM) {\n this.parent = parent;\n this.children = children;\n this.dom = dom;\n this.contentDOM = contentDOM;\n this.dirty = NOT_DIRTY;\n // An expando property on the DOM node provides a link back to its\n // description.\n dom.pmViewDesc = this;\n }\n // Used to check whether a given description corresponds to a\n // widget/mark/node.\n matchesWidget(widget) { return false; }\n matchesMark(mark) { return false; }\n matchesNode(node, outerDeco, innerDeco) { return false; }\n matchesHack(nodeName) { return false; }\n // When parsing in-editor content (in domchange.js), we allow\n // descriptions to determine the parse rules that should be used to\n // parse them.\n parseRule() { return null; }\n // Used by the editor's event handler to ignore events that come\n // from certain descs.\n stopEvent(event) { return false; }\n // The size of the content represented by this desc.\n get size() {\n let size = 0;\n for (let i = 0; i < this.children.length; i++)\n size += this.children[i].size;\n return size;\n }\n // For block nodes, this represents the space taken up by their\n // start/end tokens.\n get border() { return 0; }\n destroy() {\n this.parent = undefined;\n if (this.dom.pmViewDesc == this)\n this.dom.pmViewDesc = undefined;\n for (let i = 0; i < this.children.length; i++)\n this.children[i].destroy();\n }\n posBeforeChild(child) {\n for (let i = 0, pos = this.posAtStart;; i++) {\n let cur = this.children[i];\n if (cur == child)\n return pos;\n pos += cur.size;\n }\n }\n get posBefore() {\n return this.parent.posBeforeChild(this);\n }\n get posAtStart() {\n return this.parent ? this.parent.posBeforeChild(this) + this.border : 0;\n }\n get posAfter() {\n return this.posBefore + this.size;\n }\n get posAtEnd() {\n return this.posAtStart + this.size - 2 * this.border;\n }\n localPosFromDOM(dom, offset, bias) {\n // If the DOM position is in the content, use the child desc after\n // it to figure out a position.\n if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) {\n if (bias < 0) {\n let domBefore, desc;\n if (dom == this.contentDOM) {\n domBefore = dom.childNodes[offset - 1];\n }\n else {\n while (dom.parentNode != this.contentDOM)\n dom = dom.parentNode;\n domBefore = dom.previousSibling;\n }\n while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this))\n domBefore = domBefore.previousSibling;\n return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart;\n }\n else {\n let domAfter, desc;\n if (dom == this.contentDOM) {\n domAfter = dom.childNodes[offset];\n }\n else {\n while (dom.parentNode != this.contentDOM)\n dom = dom.parentNode;\n domAfter = dom.nextSibling;\n }\n while (domAfter && !((desc = domAfter.pmViewDesc) && desc.parent == this))\n domAfter = domAfter.nextSibling;\n return domAfter ? this.posBeforeChild(desc) : this.posAtEnd;\n }\n }\n // Otherwise, use various heuristics, falling back on the bias\n // parameter, to determine whether to return the position at the\n // start or at the end of this view desc.\n let atEnd;\n if (dom == this.dom && this.contentDOM) {\n atEnd = offset > domIndex(this.contentDOM);\n }\n else if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) {\n atEnd = dom.compareDocumentPosition(this.contentDOM) & 2;\n }\n else if (this.dom.firstChild) {\n if (offset == 0)\n for (let search = dom;; search = search.parentNode) {\n if (search == this.dom) {\n atEnd = false;\n break;\n }\n if (search.previousSibling)\n break;\n }\n if (atEnd == null && offset == dom.childNodes.length)\n for (let search = dom;; search = search.parentNode) {\n if (search == this.dom) {\n atEnd = true;\n break;\n }\n if (search.nextSibling)\n break;\n }\n }\n return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart;\n }\n nearestDesc(dom, onlyNodes = false) {\n for (let first = true, cur = dom; cur; cur = cur.parentNode) {\n let desc = this.getDesc(cur), nodeDOM;\n if (desc && (!onlyNodes || desc.node)) {\n // If dom is outside of this desc's nodeDOM, don't count it.\n if (first && (nodeDOM = desc.nodeDOM) &&\n !(nodeDOM.nodeType == 1 ? nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : nodeDOM == dom))\n first = false;\n else\n return desc;\n }\n }\n }\n getDesc(dom) {\n let desc = dom.pmViewDesc;\n for (let cur = desc; cur; cur = cur.parent)\n if (cur == this)\n return desc;\n }\n posFromDOM(dom, offset, bias) {\n for (let scan = dom; scan; scan = scan.parentNode) {\n let desc = this.getDesc(scan);\n if (desc)\n return desc.localPosFromDOM(dom, offset, bias);\n }\n return -1;\n }\n // Find the desc for the node after the given pos, if any. (When a\n // parent node overrode rendering, there might not be one.)\n descAt(pos) {\n for (let i = 0, offset = 0; i < this.children.length; i++) {\n let child = this.children[i], end = offset + child.size;\n if (offset == pos && end != offset) {\n while (!child.border && child.children.length) {\n for (let i = 0; i < child.children.length; i++) {\n let inner = child.children[i];\n if (inner.size) {\n child = inner;\n break;\n }\n }\n }\n return child;\n }\n if (pos < end)\n return child.descAt(pos - offset - child.border);\n offset = end;\n }\n }\n domFromPos(pos, side) {\n if (!this.contentDOM)\n return { node: this.dom, offset: 0, atom: pos + 1 };\n // First find the position in the child array\n let i = 0, offset = 0;\n for (let curPos = 0; i < this.children.length; i++) {\n let child = this.children[i], end = curPos + child.size;\n if (end > pos || child instanceof TrailingHackViewDesc) {\n offset = pos - curPos;\n break;\n }\n curPos = end;\n }\n // If this points into the middle of a child, call through\n if (offset)\n return this.children[i].domFromPos(offset - this.children[i].border, side);\n // Go back if there were any zero-length widgets with side >= 0 before this point\n for (let prev; i && !(prev = this.children[i - 1]).size && prev instanceof WidgetViewDesc && prev.side >= 0; i--) { }\n // Scan towards the first useable node\n if (side <= 0) {\n let prev, enter = true;\n for (;; i--, enter = false) {\n prev = i ? this.children[i - 1] : null;\n if (!prev || prev.dom.parentNode == this.contentDOM)\n break;\n }\n if (prev && side && enter && !prev.border && !prev.domAtom)\n return prev.domFromPos(prev.size, side);\n return { node: this.contentDOM, offset: prev ? domIndex(prev.dom) + 1 : 0 };\n }\n else {\n let next, enter = true;\n for (;; i++, enter = false) {\n next = i < this.children.length ? this.children[i] : null;\n if (!next || next.dom.parentNode == this.contentDOM)\n break;\n }\n if (next && enter && !next.border && !next.domAtom)\n return next.domFromPos(0, side);\n return { node: this.contentDOM, offset: next ? domIndex(next.dom) : this.contentDOM.childNodes.length };\n }\n }\n // Used to find a DOM range in a single parent for a given changed\n // range.\n parseRange(from, to, base = 0) {\n if (this.children.length == 0)\n return { node: this.contentDOM, from, to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length };\n let fromOffset = -1, toOffset = -1;\n for (let offset = base, i = 0;; i++) {\n let child = this.children[i], end = offset + child.size;\n if (fromOffset == -1 && from <= end) {\n let childBase = offset + child.border;\n // FIXME maybe descend mark views to parse a narrower range?\n if (from >= childBase && to <= end - child.border && child.node &&\n child.contentDOM && this.contentDOM.contains(child.contentDOM))\n return child.parseRange(from, to, childBase);\n from = offset;\n for (let j = i; j > 0; j--) {\n let prev = this.children[j - 1];\n if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) {\n fromOffset = domIndex(prev.dom) + 1;\n break;\n }\n from -= prev.size;\n }\n if (fromOffset == -1)\n fromOffset = 0;\n }\n if (fromOffset > -1 && (end > to || i == this.children.length - 1)) {\n to = end;\n for (let j = i + 1; j < this.children.length; j++) {\n let next = this.children[j];\n if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) {\n toOffset = domIndex(next.dom);\n break;\n }\n to += next.size;\n }\n if (toOffset == -1)\n toOffset = this.contentDOM.childNodes.length;\n break;\n }\n offset = end;\n }\n return { node: this.contentDOM, from, to, fromOffset, toOffset };\n }\n emptyChildAt(side) {\n if (this.border || !this.contentDOM || !this.children.length)\n return false;\n let child = this.children[side < 0 ? 0 : this.children.length - 1];\n return child.size == 0 || child.emptyChildAt(side);\n }\n domAfterPos(pos) {\n let { node, offset } = this.domFromPos(pos, 0);\n if (node.nodeType != 1 || offset == node.childNodes.length)\n throw new RangeError(\"No node after pos \" + pos);\n return node.childNodes[offset];\n }\n // View descs are responsible for setting any selection that falls\n // entirely inside of them, so that custom implementations can do\n // custom things with the selection. Note that this falls apart when\n // a selection starts in such a node and ends in another, in which\n // case we just use whatever domFromPos produces as a best effort.\n setSelection(anchor, head, view, force = false) {\n // If the selection falls entirely in a child, give it to that child\n let from = Math.min(anchor, head), to = Math.max(anchor, head);\n for (let i = 0, offset = 0; i < this.children.length; i++) {\n let child = this.children[i], end = offset + child.size;\n if (from > offset && to < end)\n return child.setSelection(anchor - offset - child.border, head - offset - child.border, view, force);\n offset = end;\n }\n let anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1);\n let headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1);\n let domSel = view.root.getSelection();\n let selRange = view.domSelectionRange();\n let brKludge = false;\n // On Firefox, using Selection.collapse to put the cursor after a\n // BR node for some reason doesn't always work (#1073). On Safari,\n // the cursor sometimes inexplicable visually lags behind its\n // reported position in such situations (#1092).\n if ((gecko || safari) && anchor == head) {\n let { node, offset } = anchorDOM;\n if (node.nodeType == 3) {\n brKludge = !!(offset && node.nodeValue[offset - 1] == \"\\n\");\n // Issue #1128\n if (brKludge && offset == node.nodeValue.length) {\n for (let scan = node, after; scan; scan = scan.parentNode) {\n if (after = scan.nextSibling) {\n if (after.nodeName == \"BR\")\n anchorDOM = headDOM = { node: after.parentNode, offset: domIndex(after) + 1 };\n break;\n }\n let desc = scan.pmViewDesc;\n if (desc && desc.node && desc.node.isBlock)\n break;\n }\n }\n }\n else {\n let prev = node.childNodes[offset - 1];\n brKludge = prev && (prev.nodeName == \"BR\" || prev.contentEditable == \"false\");\n }\n }\n // Firefox can act strangely when the selection is in front of an\n // uneditable node. See #1163 and https://bugzilla.mozilla.org/show_bug.cgi?id=1709536\n if (gecko && selRange.focusNode && selRange.focusNode != headDOM.node && selRange.focusNode.nodeType == 1) {\n let after = selRange.focusNode.childNodes[selRange.focusOffset];\n if (after && after.contentEditable == \"false\")\n force = true;\n }\n if (!(force || brKludge && safari) &&\n isEquivalentPosition(anchorDOM.node, anchorDOM.offset, selRange.anchorNode, selRange.anchorOffset) &&\n isEquivalentPosition(headDOM.node, headDOM.offset, selRange.focusNode, selRange.focusOffset))\n return;\n // Selection.extend can be used to create an 'inverted' selection\n // (one where the focus is before the anchor), but not all\n // browsers support it yet.\n let domSelExtended = false;\n if ((domSel.extend || anchor == head) && !brKludge) {\n domSel.collapse(anchorDOM.node, anchorDOM.offset);\n try {\n if (anchor != head)\n domSel.extend(headDOM.node, headDOM.offset);\n domSelExtended = true;\n }\n catch (_) {\n // In some cases with Chrome the selection is empty after calling\n // collapse, even when it should be valid. This appears to be a bug, but\n // it is difficult to isolate. If this happens fallback to the old path\n // without using extend.\n // Similarly, this could crash on Safari if the editor is hidden, and\n // there was no selection.\n }\n }\n if (!domSelExtended) {\n if (anchor > head) {\n let tmp = anchorDOM;\n anchorDOM = headDOM;\n headDOM = tmp;\n }\n let range = document.createRange();\n range.setEnd(headDOM.node, headDOM.offset);\n range.setStart(anchorDOM.node, anchorDOM.offset);\n domSel.removeAllRanges();\n domSel.addRange(range);\n }\n }\n ignoreMutation(mutation) {\n return !this.contentDOM && mutation.type != \"selection\";\n }\n get contentLost() {\n return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM);\n }\n // Remove a subtree of the element tree that has been touched\n // by a DOM change, so that the next update will redraw it.\n markDirty(from, to) {\n for (let offset = 0, i = 0; i < this.children.length; i++) {\n let child = this.children[i], end = offset + child.size;\n if (offset == end ? from <= end && to >= offset : from < end && to > offset) {\n let startInside = offset + child.border, endInside = end - child.border;\n if (from >= startInside && to <= endInside) {\n this.dirty = from == offset || to == end ? CONTENT_DIRTY : CHILD_DIRTY;\n if (from == startInside && to == endInside &&\n (child.contentLost || child.dom.parentNode != this.contentDOM))\n child.dirty = NODE_DIRTY;\n else\n child.markDirty(from - startInside, to - startInside);\n return;\n }\n else {\n child.dirty = child.dom == child.contentDOM && child.dom.parentNode == this.contentDOM && !child.children.length\n ? CONTENT_DIRTY : NODE_DIRTY;\n }\n }\n offset = end;\n }\n this.dirty = CONTENT_DIRTY;\n }\n markParentsDirty() {\n let level = 1;\n for (let node = this.parent; node; node = node.parent, level++) {\n let dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY;\n if (node.dirty < dirty)\n node.dirty = dirty;\n }\n }\n get domAtom() { return false; }\n get ignoreForCoords() { return false; }\n isText(text) { return false; }\n}\n// A widget desc represents a widget decoration, which is a DOM node\n// drawn between the document nodes.\nclass WidgetViewDesc extends ViewDesc {\n constructor(parent, widget, view, pos) {\n let self, dom = widget.type.toDOM;\n if (typeof dom == \"function\")\n dom = dom(view, () => {\n if (!self)\n return pos;\n if (self.parent)\n return self.parent.posBeforeChild(self);\n });\n if (!widget.type.spec.raw) {\n if (dom.nodeType != 1) {\n let wrap = document.createElement(\"span\");\n wrap.appendChild(dom);\n dom = wrap;\n }\n dom.contentEditable = \"false\";\n dom.classList.add(\"ProseMirror-widget\");\n }\n super(parent, [], dom, null);\n this.widget = widget;\n this.widget = widget;\n self = this;\n }\n matchesWidget(widget) {\n return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type);\n }\n parseRule() { return { ignore: true }; }\n stopEvent(event) {\n let stop = this.widget.spec.stopEvent;\n return stop ? stop(event) : false;\n }\n ignoreMutation(mutation) {\n return mutation.type != \"selection\" || this.widget.spec.ignoreSelection;\n }\n destroy() {\n this.widget.type.destroy(this.dom);\n super.destroy();\n }\n get domAtom() { return true; }\n get side() { return this.widget.type.side; }\n}\nclass CompositionViewDesc extends ViewDesc {\n constructor(parent, dom, textDOM, text) {\n super(parent, [], dom, null);\n this.textDOM = textDOM;\n this.text = text;\n }\n get size() { return this.text.length; }\n localPosFromDOM(dom, offset) {\n if (dom != this.textDOM)\n return this.posAtStart + (offset ? this.size : 0);\n return this.posAtStart + offset;\n }\n domFromPos(pos) {\n return { node: this.textDOM, offset: pos };\n }\n ignoreMutation(mut) {\n return mut.type === 'characterData' && mut.target.nodeValue == mut.oldValue;\n }\n}\n// A mark desc represents a mark. May have multiple children,\n// depending on how the mark is split. Note that marks are drawn using\n// a fixed nesting order, for simplicity and predictability, so in\n// some cases they will be split more often than would appear\n// necessary.\nclass MarkViewDesc extends ViewDesc {\n constructor(parent, mark, dom, contentDOM, spec) {\n super(parent, [], dom, contentDOM);\n this.mark = mark;\n this.spec = spec;\n }\n static create(parent, mark, inline, view) {\n let custom = view.nodeViews[mark.type.name];\n let spec = custom && custom(mark, view, inline);\n if (!spec || !spec.dom)\n spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline), null, mark.attrs);\n return new MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom, spec);\n }\n parseRule() {\n if ((this.dirty & NODE_DIRTY) || this.mark.type.spec.reparseInView)\n return null;\n return { mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM };\n }\n matchesMark(mark) { return this.dirty != NODE_DIRTY && this.mark.eq(mark); }\n markDirty(from, to) {\n super.markDirty(from, to);\n // Move dirty info to nearest node view\n if (this.dirty != NOT_DIRTY) {\n let parent = this.parent;\n while (!parent.node)\n parent = parent.parent;\n if (parent.dirty < this.dirty)\n parent.dirty = this.dirty;\n this.dirty = NOT_DIRTY;\n }\n }\n slice(from, to, view) {\n let copy = MarkViewDesc.create(this.parent, this.mark, true, view);\n let nodes = this.children, size = this.size;\n if (to < size)\n nodes = replaceNodes(nodes, to, size, view);\n if (from > 0)\n nodes = replaceNodes(nodes, 0, from, view);\n for (let i = 0; i < nodes.length; i++)\n nodes[i].parent = copy;\n copy.children = nodes;\n return copy;\n }\n ignoreMutation(mutation) {\n return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation);\n }\n destroy() {\n if (this.spec.destroy)\n this.spec.destroy();\n super.destroy();\n }\n}\n// Node view descs are the main, most common type of view desc, and\n// correspond to an actual node in the document. Unlike mark descs,\n// they populate their child array themselves.\nclass NodeViewDesc extends ViewDesc {\n constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos) {\n super(parent, [], dom, contentDOM);\n this.node = node;\n this.outerDeco = outerDeco;\n this.innerDeco = innerDeco;\n this.nodeDOM = nodeDOM;\n }\n // By default, a node is rendered using the `toDOM` method from the\n // node type spec. But client code can use the `nodeViews` spec to\n // supply a custom node view, which can influence various aspects of\n // the way the node works.\n //\n // (Using subclassing for this was intentionally decided against,\n // since it'd require exposing a whole slew of finicky\n // implementation details to the user code that they probably will\n // never need.)\n static create(parent, node, outerDeco, innerDeco, view, pos) {\n let custom = view.nodeViews[node.type.name], descObj;\n let spec = custom && custom(node, view, () => {\n // (This is a function that allows the custom view to find its\n // own position)\n if (!descObj)\n return pos;\n if (descObj.parent)\n return descObj.parent.posBeforeChild(descObj);\n }, outerDeco, innerDeco);\n let dom = spec && spec.dom, contentDOM = spec && spec.contentDOM;\n if (node.isText) {\n if (!dom)\n dom = document.createTextNode(node.text);\n else if (dom.nodeType != 3)\n throw new RangeError(\"Text must be rendered as a DOM text node\");\n }\n else if (!dom) {\n let spec = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node), null, node.attrs);\n ({ dom, contentDOM } = spec);\n }\n if (!contentDOM && !node.isText && dom.nodeName != \"BR\") { // Chrome gets confused by <br contenteditable=false>\n if (!dom.hasAttribute(\"contenteditable\"))\n dom.contentEditable = \"false\";\n if (node.type.spec.draggable)\n dom.draggable = true;\n }\n let nodeDOM = dom;\n dom = applyOuterDeco(dom, outerDeco, node);\n if (spec)\n return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, spec, view, pos + 1);\n else if (node.isText)\n return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view);\n else\n return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, view, pos + 1);\n }\n parseRule() {\n // Experimental kludge to allow opt-in re-parsing of nodes\n if (this.node.type.spec.reparseInView)\n return null;\n // FIXME the assumption that this can always return the current\n // attrs means that if the user somehow manages to change the\n // attrs in the dom, that won't be picked up. Not entirely sure\n // whether this is a problem\n let rule = { node: this.node.type.name, attrs: this.node.attrs };\n if (this.node.type.whitespace == \"pre\")\n rule.preserveWhitespace = \"full\";\n if (!this.contentDOM) {\n rule.getContent = () => this.node.content;\n }\n else if (!this.contentLost) {\n rule.contentElement = this.contentDOM;\n }\n else {\n // Chrome likes to randomly recreate parent nodes when\n // backspacing things. When that happens, this tries to find the\n // new parent.\n for (let i = this.children.length - 1; i >= 0; i--) {\n let child = this.children[i];\n if (this.dom.contains(child.dom.parentNode)) {\n rule.contentElement = child.dom.parentNode;\n break;\n }\n }\n if (!rule.contentElement)\n rule.getContent = () => Fragment.empty;\n }\n return rule;\n }\n matchesNode(node, outerDeco, innerDeco) {\n return this.dirty == NOT_DIRTY && node.eq(this.node) &&\n sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco);\n }\n get size() { return this.node.nodeSize; }\n get border() { return this.node.isLeaf ? 0 : 1; }\n // Syncs `this.children` to match `this.node.content` and the local\n // decorations, possibly introducing nesting for marks. Then, in a\n // separate step, syncs the DOM inside `this.contentDOM` to\n // `this.children`.\n updateChildren(view, pos) {\n let inline = this.node.inlineContent, off = pos;\n let composition = view.composing ? this.localCompositionInfo(view, pos) : null;\n let localComposition = composition && composition.pos > -1 ? composition : null;\n let compositionInChild = composition && composition.pos < 0;\n let updater = new ViewTreeUpdater(this, localComposition && localComposition.node, view);\n iterDeco(this.node, this.innerDeco, (widget, i, insideNode) => {\n if (widget.spec.marks)\n updater.syncToMarks(widget.spec.marks, inline, view);\n else if (widget.type.side >= 0 && !insideNode)\n updater.syncToMarks(i == this.node.childCount ? Mark.none : this.node.child(i).marks, inline, view);\n // If the next node is a desc matching this widget, reuse it,\n // otherwise insert the widget as a new view desc.\n updater.placeWidget(widget, view, off);\n }, (child, outerDeco, innerDeco, i) => {\n // Make sure the wrapping mark descs match the node's marks.\n updater.syncToMarks(child.marks, inline, view);\n // Try several strategies for drawing this node\n let compIndex;\n if (updater.findNodeMatch(child, outerDeco, innerDeco, i)) ;\n else if (compositionInChild && view.state.selection.from > off &&\n view.state.selection.to < off + child.nodeSize &&\n (compIndex = updater.findIndexWithChild(composition.node)) > -1 &&\n updater.updateNodeAt(child, outerDeco, innerDeco, compIndex, view)) ;\n else if (updater.updateNextNode(child, outerDeco, innerDeco, view, i, off)) ;\n else {\n // Add it as a new view\n updater.addNode(child, outerDeco, innerDeco, view, off);\n }\n off += child.nodeSize;\n });\n // Drop all remaining descs after the current position.\n updater.syncToMarks([], inline, view);\n if (this.node.isTextblock)\n updater.addTextblockHacks();\n updater.destroyRest();\n // Sync the DOM if anything changed\n if (updater.changed || this.dirty == CONTENT_DIRTY) {\n // May have to protect focused DOM from being changed if a composition is active\n if (localComposition)\n this.protectLocalComposition(view, localComposition);\n renderDescs(this.contentDOM, this.children, view);\n if (ios)\n iosHacks(this.dom);\n }\n }\n localCompositionInfo(view, pos) {\n // Only do something if both the selection and a focused text node\n // are inside of this node\n let { from, to } = view.state.selection;\n if (!(view.state.selection instanceof TextSelection) || from < pos || to > pos + this.node.content.size)\n return null;\n let textNode = view.input.compositionNode;\n if (!textNode || !this.dom.contains(textNode.parentNode))\n return null;\n if (this.node.inlineContent) {\n // Find the text in the focused node in the node, stop if it's not\n // there (may have been modified through other means, in which\n // case it should overwritten)\n let text = textNode.nodeValue;\n let textPos = findTextInFragment(this.node.content, text, from - pos, to - pos);\n return textPos < 0 ? null : { node: textNode, pos: textPos, text };\n }\n else {\n return { node: textNode, pos: -1, text: \"\" };\n }\n }\n protectLocalComposition(view, { node, pos, text }) {\n // The node is already part of a local view desc, leave it there\n if (this.getDesc(node))\n return;\n // Create a composition view for the orphaned nodes\n let topNode = node;\n for (;; topNode = topNode.parentNode) {\n if (topNode.parentNode == this.contentDOM)\n break;\n while (topNode.previousSibling)\n topNode.parentNode.removeChild(topNode.previousSibling);\n while (topNode.nextSibling)\n topNode.parentNode.removeChild(topNode.nextSibling);\n if (topNode.pmViewDesc)\n topNode.pmViewDesc = undefined;\n }\n let desc = new CompositionViewDesc(this, topNode, node, text);\n view.input.compositionNodes.push(desc);\n // Patch up this.children to contain the composition view\n this.children = replaceNodes(this.children, pos, pos + text.length, view, desc);\n }\n // If this desc must be updated to match the given node decoration,\n // do so and return true.\n update(node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY ||\n !node.sameMarkup(this.node))\n return false;\n this.updateInner(node, outerDeco, innerDeco, view);\n return true;\n }\n updateInner(node, outerDeco, innerDeco, view) {\n this.updateOuterDeco(outerDeco);\n this.node = node;\n this.innerDeco = innerDeco;\n if (this.contentDOM)\n this.updateChildren(view, this.posAtStart);\n this.dirty = NOT_DIRTY;\n }\n updateOuterDeco(outerDeco) {\n if (sameOuterDeco(outerDeco, this.outerDeco))\n return;\n let needsWrap = this.nodeDOM.nodeType != 1;\n let oldDOM = this.dom;\n this.dom = patchOuterDeco(this.dom, this.nodeDOM, computeOuterDeco(this.outerDeco, this.node, needsWrap), computeOuterDeco(outerDeco, this.node, needsWrap));\n if (this.dom != oldDOM) {\n oldDOM.pmViewDesc = undefined;\n this.dom.pmViewDesc = this;\n }\n this.outerDeco = outerDeco;\n }\n // Mark this node as being the selected node.\n selectNode() {\n if (this.nodeDOM.nodeType == 1)\n this.nodeDOM.classList.add(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable)\n this.dom.draggable = true;\n }\n // Remove selected node marking from this node.\n deselectNode() {\n if (this.nodeDOM.nodeType == 1) {\n this.nodeDOM.classList.remove(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable)\n this.dom.removeAttribute(\"draggable\");\n }\n }\n get domAtom() { return this.node.isAtom; }\n}\n// Create a view desc for the top-level document node, to be exported\n// and used by the view class.\nfunction docViewDesc(doc, outerDeco, innerDeco, dom, view) {\n applyOuterDeco(dom, outerDeco, doc);\n let docView = new NodeViewDesc(undefined, doc, outerDeco, innerDeco, dom, dom, dom, view, 0);\n if (docView.contentDOM)\n docView.updateChildren(view, 0);\n return docView;\n}\nclass TextViewDesc extends NodeViewDesc {\n constructor(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) {\n super(parent, node, outerDeco, innerDeco, dom, null, nodeDOM, view, 0);\n }\n parseRule() {\n let skip = this.nodeDOM.parentNode;\n while (skip && skip != this.dom && !skip.pmIsDeco)\n skip = skip.parentNode;\n return { skip: (skip || true) };\n }\n update(node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY || (this.dirty != NOT_DIRTY && !this.inParent()) ||\n !node.sameMarkup(this.node))\n return false;\n this.updateOuterDeco(outerDeco);\n if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) {\n this.nodeDOM.nodeValue = node.text;\n if (view.trackWrites == this.nodeDOM)\n view.trackWrites = null;\n }\n this.node = node;\n this.dirty = NOT_DIRTY;\n return true;\n }\n inParent() {\n let parentDOM = this.parent.contentDOM;\n for (let n = this.nodeDOM; n; n = n.parentNode)\n if (n == parentDOM)\n return true;\n return false;\n }\n domFromPos(pos) {\n return { node: this.nodeDOM, offset: pos };\n }\n localPosFromDOM(dom, offset, bias) {\n if (dom == this.nodeDOM)\n return this.posAtStart + Math.min(offset, this.node.text.length);\n return super.localPosFromDOM(dom, offset, bias);\n }\n ignoreMutation(mutation) {\n return mutation.type != \"characterData\" && mutation.type != \"selection\";\n }\n slice(from, to, view) {\n let node = this.node.cut(from, to), dom = document.createTextNode(node.text);\n return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom, view);\n }\n markDirty(from, to) {\n super.markDirty(from, to);\n if (this.dom != this.nodeDOM && (from == 0 || to == this.nodeDOM.nodeValue.length))\n this.dirty = NODE_DIRTY;\n }\n get domAtom() { return false; }\n isText(text) { return this.node.text == text; }\n}\n// A dummy desc used to tag trailing BR or IMG nodes created to work\n// around contentEditable terribleness.\nclass TrailingHackViewDesc extends ViewDesc {\n parseRule() { return { ignore: true }; }\n matchesHack(nodeName) { return this.dirty == NOT_DIRTY && this.dom.nodeName == nodeName; }\n get domAtom() { return true; }\n get ignoreForCoords() { return this.dom.nodeName == \"IMG\"; }\n}\n// A separate subclass is used for customized node views, so that the\n// extra checks only have to be made for nodes that are actually\n// customized.\nclass CustomNodeViewDesc extends NodeViewDesc {\n constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec, view, pos) {\n super(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos);\n this.spec = spec;\n }\n // A custom `update` method gets to decide whether the update goes\n // through. If it does, and there's a `contentDOM` node, our logic\n // updates the children.\n update(node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY)\n return false;\n if (this.spec.update && (this.node.type == node.type || this.spec.multiType)) {\n let result = this.spec.update(node, outerDeco, innerDeco);\n if (result)\n this.updateInner(node, outerDeco, innerDeco, view);\n return result;\n }\n else if (!this.contentDOM && !node.isLeaf) {\n return false;\n }\n else {\n return super.update(node, outerDeco, innerDeco, view);\n }\n }\n selectNode() {\n this.spec.selectNode ? this.spec.selectNode() : super.selectNode();\n }\n deselectNode() {\n this.spec.deselectNode ? this.spec.deselectNode() : super.deselectNode();\n }\n setSelection(anchor, head, view, force) {\n this.spec.setSelection ? this.spec.setSelection(anchor, head, view.root)\n : super.setSelection(anchor, head, view, force);\n }\n destroy() {\n if (this.spec.destroy)\n this.spec.destroy();\n super.destroy();\n }\n stopEvent(event) {\n return this.spec.stopEvent ? this.spec.stopEvent(event) : false;\n }\n ignoreMutation(mutation) {\n return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation);\n }\n}\n// Sync the content of the given DOM node with the nodes associated\n// with the given array of view descs, recursing into mark descs\n// because this should sync the subtree for a whole node at a time.\nfunction renderDescs(parentDOM, descs, view) {\n let dom = parentDOM.firstChild, written = false;\n for (let i = 0; i < descs.length; i++) {\n let desc = descs[i], childDOM = desc.dom;\n if (childDOM.parentNode == parentDOM) {\n while (childDOM != dom) {\n dom = rm(dom);\n written = true;\n }\n dom = dom.nextSibling;\n }\n else {\n written = true;\n parentDOM.insertBefore(childDOM, dom);\n }\n if (desc instanceof MarkViewDesc) {\n let pos = dom ? dom.previousSibling : parentDOM.lastChild;\n renderDescs(desc.contentDOM, desc.children, view);\n dom = pos ? pos.nextSibling : parentDOM.firstChild;\n }\n }\n while (dom) {\n dom = rm(dom);\n written = true;\n }\n if (written && view.trackWrites == parentDOM)\n view.trackWrites = null;\n}\nconst OuterDecoLevel = function (nodeName) {\n if (nodeName)\n this.nodeName = nodeName;\n};\nOuterDecoLevel.prototype = Object.create(null);\nconst noDeco = [new OuterDecoLevel];\nfunction computeOuterDeco(outerDeco, node, needsWrap) {\n if (outerDeco.length == 0)\n return noDeco;\n let top = needsWrap ? noDeco[0] : new OuterDecoLevel, result = [top];\n for (let i = 0; i < outerDeco.length; i++) {\n let attrs = outerDeco[i].type.attrs;\n if (!attrs)\n continue;\n if (attrs.nodeName)\n result.push(top = new OuterDecoLevel(attrs.nodeName));\n for (let name in attrs) {\n let val = attrs[name];\n if (val == null)\n continue;\n if (needsWrap && result.length == 1)\n result.push(top = new OuterDecoLevel(node.isInline ? \"span\" : \"div\"));\n if (name == \"class\")\n top.class = (top.class ? top.class + \" \" : \"\") + val;\n else if (name == \"style\")\n top.style = (top.style ? top.style + \";\" : \"\") + val;\n else if (name != \"nodeName\")\n top[name] = val;\n }\n }\n return result;\n}\nfunction patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) {\n // Shortcut for trivial case\n if (prevComputed == noDeco && curComputed == noDeco)\n return nodeDOM;\n let curDOM = nodeDOM;\n for (let i = 0; i < curComputed.length; i++) {\n let deco = curComputed[i], prev = prevComputed[i];\n if (i) {\n let parent;\n if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM &&\n (parent = curDOM.parentNode) && parent.nodeName.toLowerCase() == deco.nodeName) {\n curDOM = parent;\n }\n else {\n parent = document.createElement(deco.nodeName);\n parent.pmIsDeco = true;\n parent.appendChild(curDOM);\n prev = noDeco[0];\n curDOM = parent;\n }\n }\n patchAttributes(curDOM, prev || noDeco[0], deco);\n }\n return curDOM;\n}\nfunction patchAttributes(dom, prev, cur) {\n for (let name in prev)\n if (name != \"class\" && name != \"style\" && name != \"nodeName\" && !(name in cur))\n dom.removeAttribute(name);\n for (let name in cur)\n if (name != \"class\" && name != \"style\" && name != \"nodeName\" && cur[name] != prev[name])\n dom.setAttribute(name, cur[name]);\n if (prev.class != cur.class) {\n let prevList = prev.class ? prev.class.split(\" \").filter(Boolean) : [];\n let curList = cur.class ? cur.class.split(\" \").filter(Boolean) : [];\n for (let i = 0; i < prevList.length; i++)\n if (curList.indexOf(prevList[i]) == -1)\n dom.classList.remove(prevList[i]);\n for (let i = 0; i < curList.length; i++)\n if (prevList.indexOf(curList[i]) == -1)\n dom.classList.add(curList[i]);\n if (dom.classList.length == 0)\n dom.removeAttribute(\"class\");\n }\n if (prev.style != cur.style) {\n if (prev.style) {\n let prop = /\\s*([\\w\\-\\xa1-\\uffff]+)\\s*:(?:\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|\\(.*?\\)|[^;])*/g, m;\n while (m = prop.exec(prev.style))\n dom.style.removeProperty(m[1]);\n }\n if (cur.style)\n dom.style.cssText += cur.style;\n }\n}\nfunction applyOuterDeco(dom, deco, node) {\n return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1));\n}\nfunction sameOuterDeco(a, b) {\n if (a.length != b.length)\n return false;\n for (let i = 0; i < a.length; i++)\n if (!a[i].type.eq(b[i].type))\n return false;\n return true;\n}\n// Remove a DOM node and return its next sibling.\nfunction rm(dom) {\n let next = dom.nextSibling;\n dom.parentNode.removeChild(dom);\n return next;\n}\n// Helper class for incrementally updating a tree of mark descs and\n// the widget and node descs inside of them.\nclass ViewTreeUpdater {\n constructor(top, lock, view) {\n this.lock = lock;\n this.view = view;\n // Index into `this.top`'s child array, represents the current\n // update position.\n this.index = 0;\n // When entering a mark, the current top and index are pushed\n // onto this.\n this.stack = [];\n // Tracks whether anything was changed\n this.changed = false;\n this.top = top;\n this.preMatch = preMatch(top.node.content, top);\n }\n // Destroy and remove the children between the given indices in\n // `this.top`.\n destroyBetween(start, end) {\n if (start == end)\n return;\n for (let i = start; i < end; i++)\n this.top.children[i].destroy();\n this.top.children.splice(start, end - start);\n this.changed = true;\n }\n // Destroy all remaining children in `this.top`.\n destroyRest() {\n this.destroyBetween(this.index, this.top.children.length);\n }\n // Sync the current stack of mark descs with the given array of\n // marks, reusing existing mark descs when possible.\n syncToMarks(marks, inline, view) {\n let keep = 0, depth = this.stack.length >> 1;\n let maxKeep = Math.min(depth, marks.length);\n while (keep < maxKeep &&\n (keep == depth - 1 ? this.top : this.stack[(keep + 1) << 1])\n .matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false)\n keep++;\n while (keep < depth) {\n this.destroyRest();\n this.top.dirty = NOT_DIRTY;\n this.index = this.stack.pop();\n this.top = this.stack.pop();\n depth--;\n }\n while (depth < marks.length) {\n this.stack.push(this.top, this.index + 1);\n let found = -1;\n for (let i = this.index; i < Math.min(this.index + 3, this.top.children.length); i++) {\n let next = this.top.children[i];\n if (next.matchesMark(marks[depth]) && !this.isLocked(next.dom)) {\n found = i;\n break;\n }\n }\n if (found > -1) {\n if (found > this.index) {\n this.changed = true;\n this.destroyBetween(this.index, found);\n }\n this.top = this.top.children[this.index];\n }\n else {\n let markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view);\n this.top.children.splice(this.index, 0, markDesc);\n this.top = markDesc;\n this.changed = true;\n }\n this.index = 0;\n depth++;\n }\n }\n // Try to find a node desc matching the given data. Skip over it and\n // return true when successful.\n findNodeMatch(node, outerDeco, innerDeco, index) {\n let found = -1, targetDesc;\n if (index >= this.preMatch.index &&\n (targetDesc = this.preMatch.matches[index - this.preMatch.index]).parent == this.top &&\n targetDesc.matchesNode(node, outerDeco, innerDeco)) {\n found = this.top.children.indexOf(targetDesc, this.index);\n }\n else {\n for (let i = this.index, e = Math.min(this.top.children.length, i + 5); i < e; i++) {\n let child = this.top.children[i];\n if (child.matchesNode(node, outerDeco, innerDeco) && !this.preMatch.matched.has(child)) {\n found = i;\n break;\n }\n }\n }\n if (found < 0)\n return false;\n this.destroyBetween(this.index, found);\n this.index++;\n return true;\n }\n updateNodeAt(node, outerDeco, innerDeco, index, view) {\n let child = this.top.children[index];\n if (child.dirty == NODE_DIRTY && child.dom == child.contentDOM)\n child.dirty = CONTENT_DIRTY;\n if (!child.update(node, outerDeco, innerDeco, view))\n return false;\n this.destroyBetween(this.index, index);\n this.index++;\n return true;\n }\n findIndexWithChild(domNode) {\n for (;;) {\n let parent = domNode.parentNode;\n if (!parent)\n return -1;\n if (parent == this.top.contentDOM) {\n let desc = domNode.pmViewDesc;\n if (desc)\n for (let i = this.index; i < this.top.children.length; i++) {\n if (this.top.children[i] == desc)\n return i;\n }\n return -1;\n }\n domNode = parent;\n }\n }\n // Try to update the next node, if any, to the given data. Checks\n // pre-matches to avoid overwriting nodes that could still be used.\n updateNextNode(node, outerDeco, innerDeco, view, index, pos) {\n for (let i = this.index; i < this.top.children.length; i++) {\n let next = this.top.children[i];\n if (next instanceof NodeViewDesc) {\n let preMatch = this.preMatch.matched.get(next);\n if (preMatch != null && preMatch != index)\n return false;\n let nextDOM = next.dom, updated;\n // Can't update if nextDOM is or contains this.lock, except if\n // it's a text node whose content already matches the new text\n // and whose decorations match the new ones.\n let locked = this.isLocked(nextDOM) &&\n !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text &&\n next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco));\n if (!locked && next.update(node, outerDeco, innerDeco, view)) {\n this.destroyBetween(this.index, i);\n if (next.dom != nextDOM)\n this.changed = true;\n this.index++;\n return true;\n }\n else if (!locked && (updated = this.recreateWrapper(next, node, outerDeco, innerDeco, view, pos))) {\n this.destroyBetween(this.index, i);\n this.top.children[this.index] = updated;\n if (updated.contentDOM) {\n updated.dirty = CONTENT_DIRTY;\n updated.updateChildren(view, pos + 1);\n updated.dirty = NOT_DIRTY;\n }\n this.changed = true;\n this.index++;\n return true;\n }\n break;\n }\n }\n return false;\n }\n // When a node with content is replaced by a different node with\n // identical content, move over its children.\n recreateWrapper(next, node, outerDeco, innerDeco, view, pos) {\n if (next.dirty || node.isAtom || !next.children.length ||\n !next.node.content.eq(node.content) ||\n !sameOuterDeco(outerDeco, next.outerDeco) || !innerDeco.eq(next.innerDeco))\n return null;\n let wrapper = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos);\n if (wrapper.contentDOM) {\n wrapper.children = next.children;\n next.children = [];\n for (let ch of wrapper.children)\n ch.parent = wrapper;\n }\n next.destroy();\n return wrapper;\n }\n // Insert the node as a newly created node desc.\n addNode(node, outerDeco, innerDeco, view, pos) {\n let desc = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos);\n if (desc.contentDOM)\n desc.updateChildren(view, pos + 1);\n this.top.children.splice(this.index++, 0, desc);\n this.changed = true;\n }\n placeWidget(widget, view, pos) {\n let next = this.index < this.top.children.length ? this.top.children[this.index] : null;\n if (next && next.matchesWidget(widget) &&\n (widget == next.widget || !next.widget.type.toDOM.parentNode)) {\n this.index++;\n }\n else {\n let desc = new WidgetViewDesc(this.top, widget, view, pos);\n this.top.children.splice(this.index++, 0, desc);\n this.changed = true;\n }\n }\n // Make sure a textblock looks and behaves correctly in\n // contentEditable.\n addTextblockHacks() {\n let lastChild = this.top.children[this.index - 1], parent = this.top;\n while (lastChild instanceof MarkViewDesc) {\n parent = lastChild;\n lastChild = parent.children[parent.children.length - 1];\n }\n if (!lastChild || // Empty textblock\n !(lastChild instanceof TextViewDesc) ||\n /\\n$/.test(lastChild.node.text) ||\n (this.view.requiresGeckoHackNode && /\\s$/.test(lastChild.node.text))) {\n // Avoid bugs in Safari's cursor drawing (#1165) and Chrome's mouse selection (#1152)\n if ((safari || chrome) && lastChild && lastChild.dom.contentEditable == \"false\")\n this.addHackNode(\"IMG\", parent);\n this.addHackNode(\"BR\", this.top);\n }\n }\n addHackNode(nodeName, parent) {\n if (parent == this.top && this.index < parent.children.length && parent.children[this.index].matchesHack(nodeName)) {\n this.index++;\n }\n else {\n let dom = document.createElement(nodeName);\n if (nodeName == \"IMG\") {\n dom.className = \"ProseMirror-separator\";\n dom.alt = \"\";\n }\n if (nodeName == \"BR\")\n dom.className = \"ProseMirror-trailingBreak\";\n let hack = new TrailingHackViewDesc(this.top, [], dom, null);\n if (parent != this.top)\n parent.children.push(hack);\n else\n parent.children.splice(this.index++, 0, hack);\n this.changed = true;\n }\n }\n isLocked(node) {\n return this.lock && (node == this.lock || node.nodeType == 1 && node.contains(this.lock.parentNode));\n }\n}\n// Iterate from the end of the fragment and array of descs to find\n// directly matching ones, in order to avoid overeagerly reusing those\n// for other nodes. Returns the fragment index of the first node that\n// is part of the sequence of matched nodes at the end of the\n// fragment.\nfunction preMatch(frag, parentDesc) {\n let curDesc = parentDesc, descI = curDesc.children.length;\n let fI = frag.childCount, matched = new Map, matches = [];\n outer: while (fI > 0) {\n let desc;\n for (;;) {\n if (descI) {\n let next = curDesc.children[descI - 1];\n if (next instanceof MarkViewDesc) {\n curDesc = next;\n descI = next.children.length;\n }\n else {\n desc = next;\n descI--;\n break;\n }\n }\n else if (curDesc == parentDesc) {\n break outer;\n }\n else {\n // FIXME\n descI = curDesc.parent.children.indexOf(curDesc);\n curDesc = curDesc.parent;\n }\n }\n let node = desc.node;\n if (!node)\n continue;\n if (node != frag.child(fI - 1))\n break;\n --fI;\n matched.set(desc, fI);\n matches.push(desc);\n }\n return { index: fI, matched, matches: matches.reverse() };\n}\nfunction compareSide(a, b) {\n return a.type.side - b.type.side;\n}\n// This function abstracts iterating over the nodes and decorations in\n// a fragment. Calls `onNode` for each node, with its local and child\n// decorations. Splits text nodes when there is a decoration starting\n// or ending inside of them. Calls `onWidget` for each widget.\nfunction iterDeco(parent, deco, onWidget, onNode) {\n let locals = deco.locals(parent), offset = 0;\n // Simple, cheap variant for when there are no local decorations\n if (locals.length == 0) {\n for (let i = 0; i < parent.childCount; i++) {\n let child = parent.child(i);\n onNode(child, locals, deco.forChild(offset, child), i);\n offset += child.nodeSize;\n }\n return;\n }\n let decoIndex = 0, active = [], restNode = null;\n for (let parentIndex = 0;;) {\n let widget, widgets;\n while (decoIndex < locals.length && locals[decoIndex].to == offset) {\n let next = locals[decoIndex++];\n if (next.widget) {\n if (!widget)\n widget = next;\n else\n (widgets || (widgets = [widget])).push(next);\n }\n }\n if (widget) {\n if (widgets) {\n widgets.sort(compareSide);\n for (let i = 0; i < widgets.length; i++)\n onWidget(widgets[i], parentIndex, !!restNode);\n }\n else {\n onWidget(widget, parentIndex, !!restNode);\n }\n }\n let child, index;\n if (restNode) {\n index = -1;\n child = restNode;\n restNode = null;\n }\n else if (parentIndex < parent.childCount) {\n index = parentIndex;\n child = parent.child(parentIndex++);\n }\n else {\n break;\n }\n for (let i = 0; i < active.length; i++)\n if (active[i].to <= offset)\n active.splice(i--, 1);\n while (decoIndex < locals.length && locals[decoIndex].from <= offset && locals[decoIndex].to > offset)\n active.push(locals[decoIndex++]);\n let end = offset + child.nodeSize;\n if (child.isText) {\n let cutAt = end;\n if (decoIndex < locals.length && locals[decoIndex].from < cutAt)\n cutAt = locals[decoIndex].from;\n for (let i = 0; i < active.length; i++)\n if (active[i].to < cutAt)\n cutAt = active[i].to;\n if (cutAt < end) {\n restNode = child.cut(cutAt - offset);\n child = child.cut(0, cutAt - offset);\n end = cutAt;\n index = -1;\n }\n }\n else {\n while (decoIndex < locals.length && locals[decoIndex].to < end)\n decoIndex++;\n }\n let outerDeco = child.isInline && !child.isLeaf ? active.filter(d => !d.inline) : active.slice();\n onNode(child, outerDeco, deco.forChild(offset, child), index);\n offset = end;\n }\n}\n// List markers in Mobile Safari will mysteriously disappear\n// sometimes. This works around that.\nfunction iosHacks(dom) {\n if (dom.nodeName == \"UL\" || dom.nodeName == \"OL\") {\n let oldCSS = dom.style.cssText;\n dom.style.cssText = oldCSS + \"; list-style: square !important\";\n window.getComputedStyle(dom).listStyle;\n dom.style.cssText = oldCSS;\n }\n}\n// Find a piece of text in an inline fragment, overlapping from-to\nfunction findTextInFragment(frag, text, from, to) {\n for (let i = 0, pos = 0; i < frag.childCount && pos <= to;) {\n let child = frag.child(i++), childStart = pos;\n pos += child.nodeSize;\n if (!child.isText)\n continue;\n let str = child.text;\n while (i < frag.childCount) {\n let next = frag.child(i++);\n pos += next.nodeSize;\n if (!next.isText)\n break;\n str += next.text;\n }\n if (pos >= from) {\n if (pos >= to && str.slice(to - text.length - childStart, to - childStart) == text)\n return to - text.length;\n let found = childStart < to ? str.lastIndexOf(text, to - childStart - 1) : -1;\n if (found >= 0 && found + text.length + childStart >= from)\n return childStart + found;\n if (from == to && str.length >= (to + text.length) - childStart &&\n str.slice(to - childStart, to - childStart + text.length) == text)\n return to;\n }\n }\n return -1;\n}\n// Replace range from-to in an array of view descs with replacement\n// (may be null to just delete). This goes very much against the grain\n// of the rest of this code, which tends to create nodes with the\n// right shape in one go, rather than messing with them after\n// creation, but is necessary in the composition hack.\nfunction replaceNodes(nodes, from, to, view, replacement) {\n let result = [];\n for (let i = 0, off = 0; i < nodes.length; i++) {\n let child = nodes[i], start = off, end = off += child.size;\n if (start >= to || end <= from) {\n result.push(child);\n }\n else {\n if (start < from)\n result.push(child.slice(0, from - start, view));\n if (replacement) {\n result.push(replacement);\n replacement = undefined;\n }\n if (end > to)\n result.push(child.slice(to - start, child.size, view));\n }\n }\n return result;\n}\n\nfunction selectionFromDOM(view, origin = null) {\n let domSel = view.domSelectionRange(), doc = view.state.doc;\n if (!domSel.focusNode)\n return null;\n let nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0;\n let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1);\n if (head < 0)\n return null;\n let $head = doc.resolve(head), anchor, selection;\n if (selectionCollapsed(domSel)) {\n anchor = head;\n while (nearestDesc && !nearestDesc.node)\n nearestDesc = nearestDesc.parent;\n let nearestDescNode = nearestDesc.node;\n if (nearestDesc && nearestDescNode.isAtom && NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent\n && !(nearestDescNode.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {\n let pos = nearestDesc.posBefore;\n selection = new NodeSelection(head == pos ? $head : doc.resolve(pos));\n }\n }\n else {\n if (domSel instanceof view.dom.ownerDocument.defaultView.Selection && domSel.rangeCount > 1) {\n let min = head, max = head;\n for (let i = 0; i < domSel.rangeCount; i++) {\n let range = domSel.getRangeAt(i);\n min = Math.min(min, view.docView.posFromDOM(range.startContainer, range.startOffset, 1));\n max = Math.max(max, view.docView.posFromDOM(range.endContainer, range.endOffset, -1));\n }\n if (min < 0)\n return null;\n [anchor, head] = max == view.state.selection.anchor ? [max, min] : [min, max];\n $head = doc.resolve(head);\n }\n else {\n anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset, 1);\n }\n if (anchor < 0)\n return null;\n }\n let $anchor = doc.resolve(anchor);\n if (!selection) {\n let bias = origin == \"pointer\" || (view.state.selection.head < $head.pos && !inWidget) ? 1 : -1;\n selection = selectionBetween(view, $anchor, $head, bias);\n }\n return selection;\n}\nfunction editorOwnsSelection(view) {\n return view.editable ? view.hasFocus() :\n hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom);\n}\nfunction selectionToDOM(view, force = false) {\n let sel = view.state.selection;\n syncNodeSelection(view, sel);\n if (!editorOwnsSelection(view))\n return;\n // The delayed drag selection causes issues with Cell Selections\n // in Safari. And the drag selection delay is to workarond issues\n // which only present in Chrome.\n if (!force && view.input.mouseDown && view.input.mouseDown.allowDefault && chrome) {\n let domSel = view.domSelectionRange(), curSel = view.domObserver.currentSelection;\n if (domSel.anchorNode && curSel.anchorNode &&\n isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset)) {\n view.input.mouseDown.delayedSelectionSync = true;\n view.domObserver.setCurSelection();\n return;\n }\n }\n view.domObserver.disconnectSelection();\n if (view.cursorWrapper) {\n selectCursorWrapper(view);\n }\n else {\n let { anchor, head } = sel, resetEditableFrom, resetEditableTo;\n if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) {\n if (!sel.$from.parent.inlineContent)\n resetEditableFrom = temporarilyEditableNear(view, sel.from);\n if (!sel.empty && !sel.$from.parent.inlineContent)\n resetEditableTo = temporarilyEditableNear(view, sel.to);\n }\n view.docView.setSelection(anchor, head, view, force);\n if (brokenSelectBetweenUneditable) {\n if (resetEditableFrom)\n resetEditable(resetEditableFrom);\n if (resetEditableTo)\n resetEditable(resetEditableTo);\n }\n if (sel.visible) {\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n }\n else {\n view.dom.classList.add(\"ProseMirror-hideselection\");\n if (\"onselectionchange\" in document)\n removeClassOnSelectionChange(view);\n }\n }\n view.domObserver.setCurSelection();\n view.domObserver.connectSelection();\n}\n// Kludge to work around Webkit not allowing a selection to start/end\n// between non-editable block nodes. We briefly make something\n// editable, set the selection, then set it uneditable again.\nconst brokenSelectBetweenUneditable = safari || chrome && chrome_version < 63;\nfunction temporarilyEditableNear(view, pos) {\n let { node, offset } = view.docView.domFromPos(pos, 0);\n let after = offset < node.childNodes.length ? node.childNodes[offset] : null;\n let before = offset ? node.childNodes[offset - 1] : null;\n if (safari && after && after.contentEditable == \"false\")\n return setEditable(after);\n if ((!after || after.contentEditable == \"false\") &&\n (!before || before.contentEditable == \"false\")) {\n if (after)\n return setEditable(after);\n else if (before)\n return setEditable(before);\n }\n}\nfunction setEditable(element) {\n element.contentEditable = \"true\";\n if (safari && element.draggable) {\n element.draggable = false;\n element.wasDraggable = true;\n }\n return element;\n}\nfunction resetEditable(element) {\n element.contentEditable = \"false\";\n if (element.wasDraggable) {\n element.draggable = true;\n element.wasDraggable = null;\n }\n}\nfunction removeClassOnSelectionChange(view) {\n let doc = view.dom.ownerDocument;\n doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n let domSel = view.domSelectionRange();\n let node = domSel.anchorNode, offset = domSel.anchorOffset;\n doc.addEventListener(\"selectionchange\", view.input.hideSelectionGuard = () => {\n if (domSel.anchorNode != node || domSel.anchorOffset != offset) {\n doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n setTimeout(() => {\n if (!editorOwnsSelection(view) || view.state.selection.visible)\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n }, 20);\n }\n });\n}\nfunction selectCursorWrapper(view) {\n let domSel = view.domSelection(), range = document.createRange();\n if (!domSel)\n return;\n let node = view.cursorWrapper.dom, img = node.nodeName == \"IMG\";\n if (img)\n range.setStart(node.parentNode, domIndex(node) + 1);\n else\n range.setStart(node, 0);\n range.collapse(true);\n domSel.removeAllRanges();\n domSel.addRange(range);\n // Kludge to kill 'control selection' in IE11 when selecting an\n // invisible cursor wrapper, since that would result in those weird\n // resize handles and a selection that considers the absolutely\n // positioned wrapper, rather than the root editable node, the\n // focused element.\n if (!img && !view.state.selection.visible && ie && ie_version <= 11) {\n node.disabled = true;\n node.disabled = false;\n }\n}\nfunction syncNodeSelection(view, sel) {\n if (sel instanceof NodeSelection) {\n let desc = view.docView.descAt(sel.from);\n if (desc != view.lastSelectedViewDesc) {\n clearNodeSelection(view);\n if (desc)\n desc.selectNode();\n view.lastSelectedViewDesc = desc;\n }\n }\n else {\n clearNodeSelection(view);\n }\n}\n// Clear all DOM statefulness of the last node selection.\nfunction clearNodeSelection(view) {\n if (view.lastSelectedViewDesc) {\n if (view.lastSelectedViewDesc.parent)\n view.lastSelectedViewDesc.deselectNode();\n view.lastSelectedViewDesc = undefined;\n }\n}\nfunction selectionBetween(view, $anchor, $head, bias) {\n return view.someProp(\"createSelectionBetween\", f => f(view, $anchor, $head))\n || TextSelection.between($anchor, $head, bias);\n}\nfunction hasFocusAndSelection(view) {\n if (view.editable && !view.hasFocus())\n return false;\n return hasSelection(view);\n}\nfunction hasSelection(view) {\n let sel = view.domSelectionRange();\n if (!sel.anchorNode)\n return false;\n try {\n // Firefox will raise 'permission denied' errors when accessing\n // properties of `sel.anchorNode` when it's in a generated CSS\n // element.\n return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&\n (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode));\n }\n catch (_) {\n return false;\n }\n}\nfunction anchorInRightPlace(view) {\n let anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0);\n let domSel = view.domSelectionRange();\n return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset);\n}\n\nfunction moveSelectionBlock(state, dir) {\n let { $anchor, $head } = state.selection;\n let $side = dir > 0 ? $anchor.max($head) : $anchor.min($head);\n let $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null;\n return $start && Selection.findFrom($start, dir);\n}\nfunction apply(view, sel) {\n view.dispatch(view.state.tr.setSelection(sel).scrollIntoView());\n return true;\n}\nfunction selectHorizontally(view, dir, mods) {\n let sel = view.state.selection;\n if (sel instanceof TextSelection) {\n if (mods.indexOf(\"s\") > -1) {\n let { $head } = sel, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter;\n if (!node || node.isText || !node.isLeaf)\n return false;\n let $newHead = view.state.doc.resolve($head.pos + node.nodeSize * (dir < 0 ? -1 : 1));\n return apply(view, new TextSelection(sel.$anchor, $newHead));\n }\n else if (!sel.empty) {\n return false;\n }\n else if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\")) {\n let next = moveSelectionBlock(view.state, dir);\n if (next && (next instanceof NodeSelection))\n return apply(view, next);\n return false;\n }\n else if (!(mac && mods.indexOf(\"m\") > -1)) {\n let $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc;\n if (!node || node.isText)\n return false;\n let nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos;\n if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM))\n return false;\n if (NodeSelection.isSelectable(node)) {\n return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head));\n }\n else if (webkit) {\n // Chrome and Safari will introduce extra pointless cursor\n // positions around inline uneditable nodes, so we have to\n // take over and move the cursor past them (#937)\n return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize)));\n }\n else {\n return false;\n }\n }\n }\n else if (sel instanceof NodeSelection && sel.node.isInline) {\n return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from));\n }\n else {\n let next = moveSelectionBlock(view.state, dir);\n if (next)\n return apply(view, next);\n return false;\n }\n}\nfunction nodeLen(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction isIgnorable(dom, dir) {\n let desc = dom.pmViewDesc;\n return desc && desc.size == 0 && (dir < 0 || dom.nextSibling || dom.nodeName != \"BR\");\n}\nfunction skipIgnoredNodes(view, dir) {\n return dir < 0 ? skipIgnoredNodesBefore(view) : skipIgnoredNodesAfter(view);\n}\n// Make sure the cursor isn't directly after one or more ignored\n// nodes, which will confuse the browser's cursor motion logic.\nfunction skipIgnoredNodesBefore(view) {\n let sel = view.domSelectionRange();\n let node = sel.focusNode, offset = sel.focusOffset;\n if (!node)\n return;\n let moveNode, moveOffset, force = false;\n // Gecko will do odd things when the selection is directly in front\n // of a non-editable node, so in that case, move it into the next\n // node if possible. Issue prosemirror/prosemirror#832.\n if (gecko && node.nodeType == 1 && offset < nodeLen(node) && isIgnorable(node.childNodes[offset], -1))\n force = true;\n for (;;) {\n if (offset > 0) {\n if (node.nodeType != 1) {\n break;\n }\n else {\n let before = node.childNodes[offset - 1];\n if (isIgnorable(before, -1)) {\n moveNode = node;\n moveOffset = --offset;\n }\n else if (before.nodeType == 3) {\n node = before;\n offset = node.nodeValue.length;\n }\n else\n break;\n }\n }\n else if (isBlockNode(node)) {\n break;\n }\n else {\n let prev = node.previousSibling;\n while (prev && isIgnorable(prev, -1)) {\n moveNode = node.parentNode;\n moveOffset = domIndex(prev);\n prev = prev.previousSibling;\n }\n if (!prev) {\n node = node.parentNode;\n if (node == view.dom)\n break;\n offset = 0;\n }\n else {\n node = prev;\n offset = nodeLen(node);\n }\n }\n }\n if (force)\n setSelFocus(view, node, offset);\n else if (moveNode)\n setSelFocus(view, moveNode, moveOffset);\n}\n// Make sure the cursor isn't directly before one or more ignored\n// nodes.\nfunction skipIgnoredNodesAfter(view) {\n let sel = view.domSelectionRange();\n let node = sel.focusNode, offset = sel.focusOffset;\n if (!node)\n return;\n let len = nodeLen(node);\n let moveNode, moveOffset;\n for (;;) {\n if (offset < len) {\n if (node.nodeType != 1)\n break;\n let after = node.childNodes[offset];\n if (isIgnorable(after, 1)) {\n moveNode = node;\n moveOffset = ++offset;\n }\n else\n break;\n }\n else if (isBlockNode(node)) {\n break;\n }\n else {\n let next = node.nextSibling;\n while (next && isIgnorable(next, 1)) {\n moveNode = next.parentNode;\n moveOffset = domIndex(next) + 1;\n next = next.nextSibling;\n }\n if (!next) {\n node = node.parentNode;\n if (node == view.dom)\n break;\n offset = len = 0;\n }\n else {\n node = next;\n offset = 0;\n len = nodeLen(node);\n }\n }\n }\n if (moveNode)\n setSelFocus(view, moveNode, moveOffset);\n}\nfunction isBlockNode(dom) {\n let desc = dom.pmViewDesc;\n return desc && desc.node && desc.node.isBlock;\n}\nfunction textNodeAfter(node, offset) {\n while (node && offset == node.childNodes.length && !hasBlockDesc(node)) {\n offset = domIndex(node) + 1;\n node = node.parentNode;\n }\n while (node && offset < node.childNodes.length) {\n let next = node.childNodes[offset];\n if (next.nodeType == 3)\n return next;\n if (next.nodeType == 1 && next.contentEditable == \"false\")\n break;\n node = next;\n offset = 0;\n }\n}\nfunction textNodeBefore(node, offset) {\n while (node && !offset && !hasBlockDesc(node)) {\n offset = domIndex(node);\n node = node.parentNode;\n }\n while (node && offset) {\n let next = node.childNodes[offset - 1];\n if (next.nodeType == 3)\n return next;\n if (next.nodeType == 1 && next.contentEditable == \"false\")\n break;\n node = next;\n offset = node.childNodes.length;\n }\n}\nfunction setSelFocus(view, node, offset) {\n if (node.nodeType != 3) {\n let before, after;\n if (after = textNodeAfter(node, offset)) {\n node = after;\n offset = 0;\n }\n else if (before = textNodeBefore(node, offset)) {\n node = before;\n offset = before.nodeValue.length;\n }\n }\n let sel = view.domSelection();\n if (!sel)\n return;\n if (selectionCollapsed(sel)) {\n let range = document.createRange();\n range.setEnd(node, offset);\n range.setStart(node, offset);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n else if (sel.extend) {\n sel.extend(node, offset);\n }\n view.domObserver.setCurSelection();\n let { state } = view;\n // If no state update ends up happening, reset the selection.\n setTimeout(() => {\n if (view.state == state)\n selectionToDOM(view);\n }, 50);\n}\nfunction findDirection(view, pos) {\n let $pos = view.state.doc.resolve(pos);\n if (!(chrome || windows) && $pos.parent.inlineContent) {\n let coords = view.coordsAtPos(pos);\n if (pos > $pos.start()) {\n let before = view.coordsAtPos(pos - 1);\n let mid = (before.top + before.bottom) / 2;\n if (mid > coords.top && mid < coords.bottom && Math.abs(before.left - coords.left) > 1)\n return before.left < coords.left ? \"ltr\" : \"rtl\";\n }\n if (pos < $pos.end()) {\n let after = view.coordsAtPos(pos + 1);\n let mid = (after.top + after.bottom) / 2;\n if (mid > coords.top && mid < coords.bottom && Math.abs(after.left - coords.left) > 1)\n return after.left > coords.left ? \"ltr\" : \"rtl\";\n }\n }\n let computed = getComputedStyle(view.dom).direction;\n return computed == \"rtl\" ? \"rtl\" : \"ltr\";\n}\n// Check whether vertical selection motion would involve node\n// selections. If so, apply it (if not, the result is left to the\n// browser)\nfunction selectVertically(view, dir, mods) {\n let sel = view.state.selection;\n if (sel instanceof TextSelection && !sel.empty || mods.indexOf(\"s\") > -1)\n return false;\n if (mac && mods.indexOf(\"m\") > -1)\n return false;\n let { $from, $to } = sel;\n if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? \"up\" : \"down\")) {\n let next = moveSelectionBlock(view.state, dir);\n if (next && (next instanceof NodeSelection))\n return apply(view, next);\n }\n if (!$from.parent.inlineContent) {\n let side = dir < 0 ? $from : $to;\n let beyond = sel instanceof AllSelection ? Selection.near(side, dir) : Selection.findFrom(side, dir);\n return beyond ? apply(view, beyond) : false;\n }\n return false;\n}\nfunction stopNativeHorizontalDelete(view, dir) {\n if (!(view.state.selection instanceof TextSelection))\n return true;\n let { $head, $anchor, empty } = view.state.selection;\n if (!$head.sameParent($anchor))\n return true;\n if (!empty)\n return false;\n if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\"))\n return true;\n let nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter);\n if (nextNode && !nextNode.isText) {\n let tr = view.state.tr;\n if (dir < 0)\n tr.delete($head.pos - nextNode.nodeSize, $head.pos);\n else\n tr.delete($head.pos, $head.pos + nextNode.nodeSize);\n view.dispatch(tr);\n return true;\n }\n return false;\n}\nfunction switchEditable(view, node, state) {\n view.domObserver.stop();\n node.contentEditable = state;\n view.domObserver.start();\n}\n// Issue #867 / #1090 / https://bugs.chromium.org/p/chromium/issues/detail?id=903821\n// In which Safari (and at some point in the past, Chrome) does really\n// wrong things when the down arrow is pressed when the cursor is\n// directly at the start of a textblock and has an uneditable node\n// after it\nfunction safariDownArrowBug(view) {\n if (!safari || view.state.selection.$head.parentOffset > 0)\n return false;\n let { focusNode, focusOffset } = view.domSelectionRange();\n if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 &&\n focusNode.firstChild && focusNode.firstChild.contentEditable == \"false\") {\n let child = focusNode.firstChild;\n switchEditable(view, child, \"true\");\n setTimeout(() => switchEditable(view, child, \"false\"), 20);\n }\n return false;\n}\n// A backdrop key mapping used to make sure we always suppress keys\n// that have a dangerous default effect, even if the commands they are\n// bound to return false, and to make sure that cursor-motion keys\n// find a cursor (as opposed to a node selection) when pressed. For\n// cursor-motion keys, the code in the handlers also takes care of\n// block selections.\nfunction getMods(event) {\n let result = \"\";\n if (event.ctrlKey)\n result += \"c\";\n if (event.metaKey)\n result += \"m\";\n if (event.altKey)\n result += \"a\";\n if (event.shiftKey)\n result += \"s\";\n return result;\n}\nfunction captureKeyDown(view, event) {\n let code = event.keyCode, mods = getMods(event);\n if (code == 8 || (mac && code == 72 && mods == \"c\")) { // Backspace, Ctrl-h on Mac\n return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1);\n }\n else if ((code == 46 && !event.shiftKey) || (mac && code == 68 && mods == \"c\")) { // Delete, Ctrl-d on Mac\n return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1);\n }\n else if (code == 13 || code == 27) { // Enter, Esc\n return true;\n }\n else if (code == 37 || (mac && code == 66 && mods == \"c\")) { // Left arrow, Ctrl-b on Mac\n let dir = code == 37 ? (findDirection(view, view.state.selection.from) == \"ltr\" ? -1 : 1) : -1;\n return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir);\n }\n else if (code == 39 || (mac && code == 70 && mods == \"c\")) { // Right arrow, Ctrl-f on Mac\n let dir = code == 39 ? (findDirection(view, view.state.selection.from) == \"ltr\" ? 1 : -1) : 1;\n return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir);\n }\n else if (code == 38 || (mac && code == 80 && mods == \"c\")) { // Up arrow, Ctrl-p on Mac\n return selectVertically(view, -1, mods) || skipIgnoredNodes(view, -1);\n }\n else if (code == 40 || (mac && code == 78 && mods == \"c\")) { // Down arrow, Ctrl-n on Mac\n return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodes(view, 1);\n }\n else if (mods == (mac ? \"m\" : \"c\") &&\n (code == 66 || code == 73 || code == 89 || code == 90)) { // Mod-[biyz]\n return true;\n }\n return false;\n}\n\nfunction serializeForClipboard(view, slice) {\n view.someProp(\"transformCopied\", f => { slice = f(slice, view); });\n let context = [], { content, openStart, openEnd } = slice;\n while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) {\n openStart--;\n openEnd--;\n let node = content.firstChild;\n context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null);\n content = node.content;\n }\n let serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema);\n let doc = detachedDoc(), wrap = doc.createElement(\"div\");\n wrap.appendChild(serializer.serializeFragment(content, { document: doc }));\n let firstChild = wrap.firstChild, needsWrap, wrappers = 0;\n while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n for (let i = needsWrap.length - 1; i >= 0; i--) {\n let wrapper = doc.createElement(needsWrap[i]);\n while (wrap.firstChild)\n wrapper.appendChild(wrap.firstChild);\n wrap.appendChild(wrapper);\n wrappers++;\n }\n firstChild = wrap.firstChild;\n }\n if (firstChild && firstChild.nodeType == 1)\n firstChild.setAttribute(\"data-pm-slice\", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : \"\"} ${JSON.stringify(context)}`);\n let text = view.someProp(\"clipboardTextSerializer\", f => f(slice, view)) ||\n slice.content.textBetween(0, slice.content.size, \"\\n\\n\");\n return { dom: wrap, text, slice };\n}\n// Read a slice of content from the clipboard (or drop data).\nfunction parseFromClipboard(view, text, html, plainText, $context) {\n let inCode = $context.parent.type.spec.code;\n let dom, slice;\n if (!html && !text)\n return null;\n let asText = text && (plainText || inCode || !html);\n if (asText) {\n view.someProp(\"transformPastedText\", f => { text = f(text, inCode || plainText, view); });\n if (inCode)\n return text ? new Slice(Fragment.from(view.state.schema.text(text.replace(/\\r\\n?/g, \"\\n\"))), 0, 0) : Slice.empty;\n let parsed = view.someProp(\"clipboardTextParser\", f => f(text, $context, plainText, view));\n if (parsed) {\n slice = parsed;\n }\n else {\n let marks = $context.marks();\n let { schema } = view.state, serializer = DOMSerializer.fromSchema(schema);\n dom = document.createElement(\"div\");\n text.split(/(?:\\r\\n?|\\n)+/).forEach(block => {\n let p = dom.appendChild(document.createElement(\"p\"));\n if (block)\n p.appendChild(serializer.serializeNode(schema.text(block, marks)));\n });\n }\n }\n else {\n view.someProp(\"transformPastedHTML\", f => { html = f(html, view); });\n dom = readHTML(html);\n if (webkit)\n restoreReplacedSpaces(dom);\n }\n let contextNode = dom && dom.querySelector(\"[data-pm-slice]\");\n let sliceData = contextNode && /^(\\d+) (\\d+)(?: -(\\d+))? (.*)/.exec(contextNode.getAttribute(\"data-pm-slice\") || \"\");\n if (sliceData && sliceData[3])\n for (let i = +sliceData[3]; i > 0; i--) {\n let child = dom.firstChild;\n while (child && child.nodeType != 1)\n child = child.nextSibling;\n if (!child)\n break;\n dom = child;\n }\n if (!slice) {\n let parser = view.someProp(\"clipboardParser\") || view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n slice = parser.parseSlice(dom, {\n preserveWhitespace: !!(asText || sliceData),\n context: $context,\n ruleFromNode(dom) {\n if (dom.nodeName == \"BR\" && !dom.nextSibling &&\n dom.parentNode && !inlineParents.test(dom.parentNode.nodeName))\n return { ignore: true };\n return null;\n }\n });\n }\n if (sliceData) {\n slice = addContext(closeSlice(slice, +sliceData[1], +sliceData[2]), sliceData[4]);\n }\n else { // HTML wasn't created by ProseMirror. Make sure top-level siblings are coherent\n slice = Slice.maxOpen(normalizeSiblings(slice.content, $context), true);\n if (slice.openStart || slice.openEnd) {\n let openStart = 0, openEnd = 0;\n for (let node = slice.content.firstChild; openStart < slice.openStart && !node.type.spec.isolating; openStart++, node = node.firstChild) { }\n for (let node = slice.content.lastChild; openEnd < slice.openEnd && !node.type.spec.isolating; openEnd++, node = node.lastChild) { }\n slice = closeSlice(slice, openStart, openEnd);\n }\n }\n view.someProp(\"transformPasted\", f => { slice = f(slice, view); });\n return slice;\n}\nconst inlineParents = /^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;\n// Takes a slice parsed with parseSlice, which means there hasn't been\n// any content-expression checking done on the top nodes, tries to\n// find a parent node in the current context that might fit the nodes,\n// and if successful, rebuilds the slice so that it fits into that parent.\n//\n// This addresses the problem that Transform.replace expects a\n// coherent slice, and will fail to place a set of siblings that don't\n// fit anywhere in the schema.\nfunction normalizeSiblings(fragment, $context) {\n if (fragment.childCount < 2)\n return fragment;\n for (let d = $context.depth; d >= 0; d--) {\n let parent = $context.node(d);\n let match = parent.contentMatchAt($context.index(d));\n let lastWrap, result = [];\n fragment.forEach(node => {\n if (!result)\n return;\n let wrap = match.findWrapping(node.type), inLast;\n if (!wrap)\n return result = null;\n if (inLast = result.length && lastWrap.length && addToSibling(wrap, lastWrap, node, result[result.length - 1], 0)) {\n result[result.length - 1] = inLast;\n }\n else {\n if (result.length)\n result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length);\n let wrapped = withWrappers(node, wrap);\n result.push(wrapped);\n match = match.matchType(wrapped.type);\n lastWrap = wrap;\n }\n });\n if (result)\n return Fragment.from(result);\n }\n return fragment;\n}\nfunction withWrappers(node, wrap, from = 0) {\n for (let i = wrap.length - 1; i >= from; i--)\n node = wrap[i].create(null, Fragment.from(node));\n return node;\n}\n// Used to group adjacent nodes wrapped in similar parents by\n// normalizeSiblings into the same parent node\nfunction addToSibling(wrap, lastWrap, node, sibling, depth) {\n if (depth < wrap.length && depth < lastWrap.length && wrap[depth] == lastWrap[depth]) {\n let inner = addToSibling(wrap, lastWrap, node, sibling.lastChild, depth + 1);\n if (inner)\n return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner));\n let match = sibling.contentMatchAt(sibling.childCount);\n if (match.matchType(depth == wrap.length - 1 ? node.type : wrap[depth + 1]))\n return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap, depth + 1))));\n }\n}\nfunction closeRight(node, depth) {\n if (depth == 0)\n return node;\n let fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1));\n let fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true);\n return node.copy(fragment.append(fill));\n}\nfunction closeRange(fragment, side, from, to, depth, openEnd) {\n let node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content;\n if (fragment.childCount > 1)\n openEnd = 0;\n if (depth < to - 1)\n inner = closeRange(inner, side, from, to, depth + 1, openEnd);\n if (depth >= from)\n inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, openEnd <= depth).append(inner)\n : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true));\n return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner));\n}\nfunction closeSlice(slice, openStart, openEnd) {\n if (openStart < slice.openStart)\n slice = new Slice(closeRange(slice.content, -1, openStart, slice.openStart, 0, slice.openEnd), openStart, slice.openEnd);\n if (openEnd < slice.openEnd)\n slice = new Slice(closeRange(slice.content, 1, openEnd, slice.openEnd, 0, 0), slice.openStart, openEnd);\n return slice;\n}\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"<td>..</td>\"` the table cells are ignored.\nconst wrapMap = {\n thead: [\"table\"],\n tbody: [\"table\"],\n tfoot: [\"table\"],\n caption: [\"table\"],\n colgroup: [\"table\"],\n col: [\"table\", \"colgroup\"],\n tr: [\"table\", \"tbody\"],\n td: [\"table\", \"tbody\", \"tr\"],\n th: [\"table\", \"tbody\", \"tr\"]\n};\nlet _detachedDoc = null;\nfunction detachedDoc() {\n return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument(\"title\"));\n}\nlet _policy = null;\nfunction maybeWrapTrusted(html) {\n let trustedTypes = window.trustedTypes;\n if (!trustedTypes)\n return html;\n // With the require-trusted-types-for CSP, Chrome will block\n // innerHTML, even on a detached document. This wraps the string in\n // a way that makes the browser allow us to use its parser again.\n if (!_policy)\n _policy = trustedTypes.createPolicy(\"ProseMirrorClipboard\", { createHTML: (s) => s });\n return _policy.createHTML(html);\n}\nfunction readHTML(html) {\n let metas = /^(\\s*<meta [^>]*>)*/.exec(html);\n if (metas)\n html = html.slice(metas[0].length);\n let elt = detachedDoc().createElement(\"div\");\n let firstTag = /<([a-z][^>\\s]+)/i.exec(html), wrap;\n if (wrap = firstTag && wrapMap[firstTag[1].toLowerCase()])\n html = wrap.map(n => \"<\" + n + \">\").join(\"\") + html + wrap.map(n => \"</\" + n + \">\").reverse().join(\"\");\n elt.innerHTML = maybeWrapTrusted(html);\n if (wrap)\n for (let i = 0; i < wrap.length; i++)\n elt = elt.querySelector(wrap[i]) || elt;\n return elt;\n}\n// Webkit browsers do some hard-to-predict replacement of regular\n// spaces with non-breaking spaces when putting content on the\n// clipboard. This tries to convert such non-breaking spaces (which\n// will be wrapped in a plain span on Chrome, a span with class\n// Apple-converted-space on Safari) back to regular spaces.\nfunction restoreReplacedSpaces(dom) {\n let nodes = dom.querySelectorAll(chrome ? \"span:not([class]):not([style])\" : \"span.Apple-converted-space\");\n for (let i = 0; i < nodes.length; i++) {\n let node = nodes[i];\n if (node.childNodes.length == 1 && node.textContent == \"\\u00a0\" && node.parentNode)\n node.parentNode.replaceChild(dom.ownerDocument.createTextNode(\" \"), node);\n }\n}\nfunction addContext(slice, context) {\n if (!slice.size)\n return slice;\n let schema = slice.content.firstChild.type.schema, array;\n try {\n array = JSON.parse(context);\n }\n catch (e) {\n return slice;\n }\n let { content, openStart, openEnd } = slice;\n for (let i = array.length - 2; i >= 0; i -= 2) {\n let type = schema.nodes[array[i]];\n if (!type || type.hasRequiredAttrs())\n break;\n content = Fragment.from(type.create(array[i + 1], content));\n openStart++;\n openEnd++;\n }\n return new Slice(content, openStart, openEnd);\n}\n\n// A collection of DOM events that occur within the editor, and callback functions\n// to invoke when the event fires.\nconst handlers = {};\nconst editHandlers = {};\nconst passiveHandlers = { touchstart: true, touchmove: true };\nclass InputState {\n constructor() {\n this.shiftKey = false;\n this.mouseDown = null;\n this.lastKeyCode = null;\n this.lastKeyCodeTime = 0;\n this.lastClick = { time: 0, x: 0, y: 0, type: \"\" };\n this.lastSelectionOrigin = null;\n this.lastSelectionTime = 0;\n this.lastIOSEnter = 0;\n this.lastIOSEnterFallbackTimeout = -1;\n this.lastFocus = 0;\n this.lastTouch = 0;\n this.lastChromeDelete = 0;\n this.composing = false;\n this.compositionNode = null;\n this.composingTimeout = -1;\n this.compositionNodes = [];\n this.compositionEndedAt = -2e8;\n this.compositionID = 1;\n // Set to a composition ID when there are pending changes at compositionend\n this.compositionPendingChanges = 0;\n this.domChangeCount = 0;\n this.eventHandlers = Object.create(null);\n this.hideSelectionGuard = null;\n }\n}\nfunction initInput(view) {\n for (let event in handlers) {\n let handler = handlers[event];\n view.dom.addEventListener(event, view.input.eventHandlers[event] = (event) => {\n if (eventBelongsToView(view, event) && !runCustomHandler(view, event) &&\n (view.editable || !(event.type in editHandlers)))\n handler(view, event);\n }, passiveHandlers[event] ? { passive: true } : undefined);\n }\n // On Safari, for reasons beyond my understanding, adding an input\n // event handler makes an issue where the composition vanishes when\n // you press enter go away.\n if (safari)\n view.dom.addEventListener(\"input\", () => null);\n ensureListeners(view);\n}\nfunction setSelectionOrigin(view, origin) {\n view.input.lastSelectionOrigin = origin;\n view.input.lastSelectionTime = Date.now();\n}\nfunction destroyInput(view) {\n view.domObserver.stop();\n for (let type in view.input.eventHandlers)\n view.dom.removeEventListener(type, view.input.eventHandlers[type]);\n clearTimeout(view.input.composingTimeout);\n clearTimeout(view.input.lastIOSEnterFallbackTimeout);\n}\nfunction ensureListeners(view) {\n view.someProp(\"handleDOMEvents\", currentHandlers => {\n for (let type in currentHandlers)\n if (!view.input.eventHandlers[type])\n view.dom.addEventListener(type, view.input.eventHandlers[type] = event => runCustomHandler(view, event));\n });\n}\nfunction runCustomHandler(view, event) {\n return view.someProp(\"handleDOMEvents\", handlers => {\n let handler = handlers[event.type];\n return handler ? handler(view, event) || event.defaultPrevented : false;\n });\n}\nfunction eventBelongsToView(view, event) {\n if (!event.bubbles)\n return true;\n if (event.defaultPrevented)\n return false;\n for (let node = event.target; node != view.dom; node = node.parentNode)\n if (!node || node.nodeType == 11 ||\n (node.pmViewDesc && node.pmViewDesc.stopEvent(event)))\n return false;\n return true;\n}\nfunction dispatchEvent(view, event) {\n if (!runCustomHandler(view, event) && handlers[event.type] &&\n (view.editable || !(event.type in editHandlers)))\n handlers[event.type](view, event);\n}\neditHandlers.keydown = (view, _event) => {\n let event = _event;\n view.input.shiftKey = event.keyCode == 16 || event.shiftKey;\n if (inOrNearComposition(view, event))\n return;\n view.input.lastKeyCode = event.keyCode;\n view.input.lastKeyCodeTime = Date.now();\n // Suppress enter key events on Chrome Android, because those tend\n // to be part of a confused sequence of composition events fired,\n // and handling them eagerly tends to corrupt the input.\n if (android && chrome && event.keyCode == 13)\n return;\n if (event.keyCode != 229)\n view.domObserver.forceFlush();\n // On iOS, if we preventDefault enter key presses, the virtual\n // keyboard gets confused. So the hack here is to set a flag that\n // makes the DOM change code recognize that what just happens should\n // be replaced by whatever the Enter key handlers do.\n if (ios && event.keyCode == 13 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n let now = Date.now();\n view.input.lastIOSEnter = now;\n view.input.lastIOSEnterFallbackTimeout = setTimeout(() => {\n if (view.input.lastIOSEnter == now) {\n view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")));\n view.input.lastIOSEnter = 0;\n }\n }, 200);\n }\n else if (view.someProp(\"handleKeyDown\", f => f(view, event)) || captureKeyDown(view, event)) {\n event.preventDefault();\n }\n else {\n setSelectionOrigin(view, \"key\");\n }\n};\neditHandlers.keyup = (view, event) => {\n if (event.keyCode == 16)\n view.input.shiftKey = false;\n};\neditHandlers.keypress = (view, _event) => {\n let event = _event;\n if (inOrNearComposition(view, event) || !event.charCode ||\n event.ctrlKey && !event.altKey || mac && event.metaKey)\n return;\n if (view.someProp(\"handleKeyPress\", f => f(view, event))) {\n event.preventDefault();\n return;\n }\n let sel = view.state.selection;\n if (!(sel instanceof TextSelection) || !sel.$from.sameParent(sel.$to)) {\n let text = String.fromCharCode(event.charCode);\n if (!/[\\r\\n]/.test(text) && !view.someProp(\"handleTextInput\", f => f(view, sel.$from.pos, sel.$to.pos, text)))\n view.dispatch(view.state.tr.insertText(text).scrollIntoView());\n event.preventDefault();\n }\n};\nfunction eventCoords(event) { return { left: event.clientX, top: event.clientY }; }\nfunction isNear(event, click) {\n let dx = click.x - event.clientX, dy = click.y - event.clientY;\n return dx * dx + dy * dy < 100;\n}\nfunction runHandlerOnContext(view, propName, pos, inside, event) {\n if (inside == -1)\n return false;\n let $pos = view.state.doc.resolve(inside);\n for (let i = $pos.depth + 1; i > 0; i--) {\n if (view.someProp(propName, f => i > $pos.depth ? f(view, pos, $pos.nodeAfter, $pos.before(i), event, true)\n : f(view, pos, $pos.node(i), $pos.before(i), event, false)))\n return true;\n }\n return false;\n}\nfunction updateSelection(view, selection, origin) {\n if (!view.focused)\n view.focus();\n if (view.state.selection.eq(selection))\n return;\n let tr = view.state.tr.setSelection(selection);\n if (origin == \"pointer\")\n tr.setMeta(\"pointer\", true);\n view.dispatch(tr);\n}\nfunction selectClickedLeaf(view, inside) {\n if (inside == -1)\n return false;\n let $pos = view.state.doc.resolve(inside), node = $pos.nodeAfter;\n if (node && node.isAtom && NodeSelection.isSelectable(node)) {\n updateSelection(view, new NodeSelection($pos), \"pointer\");\n return true;\n }\n return false;\n}\nfunction selectClickedNode(view, inside) {\n if (inside == -1)\n return false;\n let sel = view.state.selection, selectedNode, selectAt;\n if (sel instanceof NodeSelection)\n selectedNode = sel.node;\n let $pos = view.state.doc.resolve(inside);\n for (let i = $pos.depth + 1; i > 0; i--) {\n let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n if (NodeSelection.isSelectable(node)) {\n if (selectedNode && sel.$from.depth > 0 &&\n i >= sel.$from.depth && $pos.before(sel.$from.depth + 1) == sel.$from.pos)\n selectAt = $pos.before(sel.$from.depth);\n else\n selectAt = $pos.before(i);\n break;\n }\n }\n if (selectAt != null) {\n updateSelection(view, NodeSelection.create(view.state.doc, selectAt), \"pointer\");\n return true;\n }\n else {\n return false;\n }\n}\nfunction handleSingleClick(view, pos, inside, event, selectNode) {\n return runHandlerOnContext(view, \"handleClickOn\", pos, inside, event) ||\n view.someProp(\"handleClick\", f => f(view, pos, event)) ||\n (selectNode ? selectClickedNode(view, inside) : selectClickedLeaf(view, inside));\n}\nfunction handleDoubleClick(view, pos, inside, event) {\n return runHandlerOnContext(view, \"handleDoubleClickOn\", pos, inside, event) ||\n view.someProp(\"handleDoubleClick\", f => f(view, pos, event));\n}\nfunction handleTripleClick(view, pos, inside, event) {\n return runHandlerOnContext(view, \"handleTripleClickOn\", pos, inside, event) ||\n view.someProp(\"handleTripleClick\", f => f(view, pos, event)) ||\n defaultTripleClick(view, inside, event);\n}\nfunction defaultTripleClick(view, inside, event) {\n if (event.button != 0)\n return false;\n let doc = view.state.doc;\n if (inside == -1) {\n if (doc.inlineContent) {\n updateSelection(view, TextSelection.create(doc, 0, doc.content.size), \"pointer\");\n return true;\n }\n return false;\n }\n let $pos = doc.resolve(inside);\n for (let i = $pos.depth + 1; i > 0; i--) {\n let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n let nodePos = $pos.before(i);\n if (node.inlineContent)\n updateSelection(view, TextSelection.create(doc, nodePos + 1, nodePos + 1 + node.content.size), \"pointer\");\n else if (NodeSelection.isSelectable(node))\n updateSelection(view, NodeSelection.create(doc, nodePos), \"pointer\");\n else\n continue;\n return true;\n }\n}\nfunction forceDOMFlush(view) {\n return endComposition(view);\n}\nconst selectNodeModifier = mac ? \"metaKey\" : \"ctrlKey\";\nhandlers.mousedown = (view, _event) => {\n let event = _event;\n view.input.shiftKey = event.shiftKey;\n let flushed = forceDOMFlush(view);\n let now = Date.now(), type = \"singleClick\";\n if (now - view.input.lastClick.time < 500 && isNear(event, view.input.lastClick) && !event[selectNodeModifier]) {\n if (view.input.lastClick.type == \"singleClick\")\n type = \"doubleClick\";\n else if (view.input.lastClick.type == \"doubleClick\")\n type = \"tripleClick\";\n }\n view.input.lastClick = { time: now, x: event.clientX, y: event.clientY, type };\n let pos = view.posAtCoords(eventCoords(event));\n if (!pos)\n return;\n if (type == \"singleClick\") {\n if (view.input.mouseDown)\n view.input.mouseDown.done();\n view.input.mouseDown = new MouseDown(view, pos, event, !!flushed);\n }\n else if ((type == \"doubleClick\" ? handleDoubleClick : handleTripleClick)(view, pos.pos, pos.inside, event)) {\n event.preventDefault();\n }\n else {\n setSelectionOrigin(view, \"pointer\");\n }\n};\nclass MouseDown {\n constructor(view, pos, event, flushed) {\n this.view = view;\n this.pos = pos;\n this.event = event;\n this.flushed = flushed;\n this.delayedSelectionSync = false;\n this.mightDrag = null;\n this.startDoc = view.state.doc;\n this.selectNode = !!event[selectNodeModifier];\n this.allowDefault = event.shiftKey;\n let targetNode, targetPos;\n if (pos.inside > -1) {\n targetNode = view.state.doc.nodeAt(pos.inside);\n targetPos = pos.inside;\n }\n else {\n let $pos = view.state.doc.resolve(pos.pos);\n targetNode = $pos.parent;\n targetPos = $pos.depth ? $pos.before() : 0;\n }\n const target = flushed ? null : event.target;\n const targetDesc = target ? view.docView.nearestDesc(target, true) : null;\n this.target = targetDesc && targetDesc.dom.nodeType == 1 ? targetDesc.dom : null;\n let { selection } = view.state;\n if (event.button == 0 &&\n targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false ||\n selection instanceof NodeSelection && selection.from <= targetPos && selection.to > targetPos)\n this.mightDrag = {\n node: targetNode,\n pos: targetPos,\n addAttr: !!(this.target && !this.target.draggable),\n setUneditable: !!(this.target && gecko && !this.target.hasAttribute(\"contentEditable\"))\n };\n if (this.target && this.mightDrag && (this.mightDrag.addAttr || this.mightDrag.setUneditable)) {\n this.view.domObserver.stop();\n if (this.mightDrag.addAttr)\n this.target.draggable = true;\n if (this.mightDrag.setUneditable)\n setTimeout(() => {\n if (this.view.input.mouseDown == this)\n this.target.setAttribute(\"contentEditable\", \"false\");\n }, 20);\n this.view.domObserver.start();\n }\n view.root.addEventListener(\"mouseup\", this.up = this.up.bind(this));\n view.root.addEventListener(\"mousemove\", this.move = this.move.bind(this));\n setSelectionOrigin(view, \"pointer\");\n }\n done() {\n this.view.root.removeEventListener(\"mouseup\", this.up);\n this.view.root.removeEventListener(\"mousemove\", this.move);\n if (this.mightDrag && this.target) {\n this.view.domObserver.stop();\n if (this.mightDrag.addAttr)\n this.target.removeAttribute(\"draggable\");\n if (this.mightDrag.setUneditable)\n this.target.removeAttribute(\"contentEditable\");\n this.view.domObserver.start();\n }\n if (this.delayedSelectionSync)\n setTimeout(() => selectionToDOM(this.view));\n this.view.input.mouseDown = null;\n }\n up(event) {\n this.done();\n if (!this.view.dom.contains(event.target))\n return;\n let pos = this.pos;\n if (this.view.state.doc != this.startDoc)\n pos = this.view.posAtCoords(eventCoords(event));\n this.updateAllowDefault(event);\n if (this.allowDefault || !pos) {\n setSelectionOrigin(this.view, \"pointer\");\n }\n else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) {\n event.preventDefault();\n }\n else if (event.button == 0 &&\n (this.flushed ||\n // Safari ignores clicks on draggable elements\n (safari && this.mightDrag && !this.mightDrag.node.isAtom) ||\n // Chrome will sometimes treat a node selection as a\n // cursor, but still report that the node is selected\n // when asked through getSelection. You'll then get a\n // situation where clicking at the point where that\n // (hidden) cursor is doesn't change the selection, and\n // thus doesn't get a reaction from ProseMirror. This\n // works around that.\n (chrome && !this.view.state.selection.visible &&\n Math.min(Math.abs(pos.pos - this.view.state.selection.from), Math.abs(pos.pos - this.view.state.selection.to)) <= 2))) {\n updateSelection(this.view, Selection.near(this.view.state.doc.resolve(pos.pos)), \"pointer\");\n event.preventDefault();\n }\n else {\n setSelectionOrigin(this.view, \"pointer\");\n }\n }\n move(event) {\n this.updateAllowDefault(event);\n setSelectionOrigin(this.view, \"pointer\");\n if (event.buttons == 0)\n this.done();\n }\n updateAllowDefault(event) {\n if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||\n Math.abs(this.event.y - event.clientY) > 4))\n this.allowDefault = true;\n }\n}\nhandlers.touchstart = view => {\n view.input.lastTouch = Date.now();\n forceDOMFlush(view);\n setSelectionOrigin(view, \"pointer\");\n};\nhandlers.touchmove = view => {\n view.input.lastTouch = Date.now();\n setSelectionOrigin(view, \"pointer\");\n};\nhandlers.contextmenu = view => forceDOMFlush(view);\nfunction inOrNearComposition(view, event) {\n if (view.composing)\n return true;\n // See https://www.stum.de/2016/06/24/handling-ime-events-in-javascript/.\n // On Japanese input method editors (IMEs), the Enter key is used to confirm character\n // selection. On Safari, when Enter is pressed, compositionend and keydown events are\n // emitted. The keydown event triggers newline insertion, which we don't want.\n // This method returns true if the keydown event should be ignored.\n // We only ignore it once, as pressing Enter a second time *should* insert a newline.\n // Furthermore, the keydown event timestamp must be close to the compositionEndedAt timestamp.\n // This guards against the case where compositionend is triggered without the keyboard\n // (e.g. character confirmation may be done with the mouse), and keydown is triggered\n // afterwards- we wouldn't want to ignore the keydown event in this case.\n if (safari && Math.abs(event.timeStamp - view.input.compositionEndedAt) < 500) {\n view.input.compositionEndedAt = -2e8;\n return true;\n }\n return false;\n}\n// Drop active composition after 5 seconds of inactivity on Android\nconst timeoutComposition = android ? 5000 : -1;\neditHandlers.compositionstart = editHandlers.compositionupdate = view => {\n if (!view.composing) {\n view.domObserver.flush();\n let { state } = view, $pos = state.selection.$to;\n if (state.selection instanceof TextSelection &&\n (state.storedMarks ||\n (!$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some(m => m.type.spec.inclusive === false)))) {\n // Need to wrap the cursor in mark nodes different from the ones in the DOM context\n view.markCursor = view.state.storedMarks || $pos.marks();\n endComposition(view, true);\n view.markCursor = null;\n }\n else {\n endComposition(view, !state.selection.empty);\n // In firefox, if the cursor is after but outside a marked node,\n // the inserted text won't inherit the marks. So this moves it\n // inside if necessary.\n if (gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) {\n let sel = view.domSelectionRange();\n for (let node = sel.focusNode, offset = sel.focusOffset; node && node.nodeType == 1 && offset != 0;) {\n let before = offset < 0 ? node.lastChild : node.childNodes[offset - 1];\n if (!before)\n break;\n if (before.nodeType == 3) {\n let sel = view.domSelection();\n if (sel)\n sel.collapse(before, before.nodeValue.length);\n break;\n }\n else {\n node = before;\n offset = -1;\n }\n }\n }\n }\n view.input.composing = true;\n }\n scheduleComposeEnd(view, timeoutComposition);\n};\neditHandlers.compositionend = (view, event) => {\n if (view.composing) {\n view.input.composing = false;\n view.input.compositionEndedAt = event.timeStamp;\n view.input.compositionPendingChanges = view.domObserver.pendingRecords().length ? view.input.compositionID : 0;\n view.input.compositionNode = null;\n if (view.input.compositionPendingChanges)\n Promise.resolve().then(() => view.domObserver.flush());\n view.input.compositionID++;\n scheduleComposeEnd(view, 20);\n }\n};\nfunction scheduleComposeEnd(view, delay) {\n clearTimeout(view.input.composingTimeout);\n if (delay > -1)\n view.input.composingTimeout = setTimeout(() => endComposition(view), delay);\n}\nfunction clearComposition(view) {\n if (view.composing) {\n view.input.composing = false;\n view.input.compositionEndedAt = timestampFromCustomEvent();\n }\n while (view.input.compositionNodes.length > 0)\n view.input.compositionNodes.pop().markParentsDirty();\n}\nfunction findCompositionNode(view) {\n let sel = view.domSelectionRange();\n if (!sel.focusNode)\n return null;\n let textBefore = textNodeBefore$1(sel.focusNode, sel.focusOffset);\n let textAfter = textNodeAfter$1(sel.focusNode, sel.focusOffset);\n if (textBefore && textAfter && textBefore != textAfter) {\n let descAfter = textAfter.pmViewDesc, lastChanged = view.domObserver.lastChangedTextNode;\n if (textBefore == lastChanged || textAfter == lastChanged)\n return lastChanged;\n if (!descAfter || !descAfter.isText(textAfter.nodeValue)) {\n return textAfter;\n }\n else if (view.input.compositionNode == textAfter) {\n let descBefore = textBefore.pmViewDesc;\n if (!(!descBefore || !descBefore.isText(textBefore.nodeValue)))\n return textAfter;\n }\n }\n return textBefore || textAfter;\n}\nfunction timestampFromCustomEvent() {\n let event = document.createEvent(\"Event\");\n event.initEvent(\"event\", true, true);\n return event.timeStamp;\n}\n/**\n@internal\n*/\nfunction endComposition(view, restarting = false) {\n if (android && view.domObserver.flushingSoon >= 0)\n return;\n view.domObserver.forceFlush();\n clearComposition(view);\n if (restarting || view.docView && view.docView.dirty) {\n let sel = selectionFromDOM(view);\n if (sel && !sel.eq(view.state.selection))\n view.dispatch(view.state.tr.setSelection(sel));\n else if ((view.markCursor || restarting) && !view.state.selection.empty)\n view.dispatch(view.state.tr.deleteSelection());\n else\n view.updateState(view.state);\n return true;\n }\n return false;\n}\nfunction captureCopy(view, dom) {\n // The extra wrapper is somehow necessary on IE/Edge to prevent the\n // content from being mangled when it is put onto the clipboard\n if (!view.dom.parentNode)\n return;\n let wrap = view.dom.parentNode.appendChild(document.createElement(\"div\"));\n wrap.appendChild(dom);\n wrap.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n let sel = getSelection(), range = document.createRange();\n range.selectNodeContents(dom);\n // Done because IE will fire a selectionchange moving the selection\n // to its start when removeAllRanges is called and the editor still\n // has focus (which will mess up the editor's selection state).\n view.dom.blur();\n sel.removeAllRanges();\n sel.addRange(range);\n setTimeout(() => {\n if (wrap.parentNode)\n wrap.parentNode.removeChild(wrap);\n view.focus();\n }, 50);\n}\n// This is very crude, but unfortunately both these browsers _pretend_\n// that they have a clipboard API—all the objects and methods are\n// there, they just don't work, and they are hard to test.\nconst brokenClipboardAPI = (ie && ie_version < 15) ||\n (ios && webkit_version < 604);\nhandlers.copy = editHandlers.cut = (view, _event) => {\n let event = _event;\n let sel = view.state.selection, cut = event.type == \"cut\";\n if (sel.empty)\n return;\n // IE and Edge's clipboard interface is completely broken\n let data = brokenClipboardAPI ? null : event.clipboardData;\n let slice = sel.content(), { dom, text } = serializeForClipboard(view, slice);\n if (data) {\n event.preventDefault();\n data.clearData();\n data.setData(\"text/html\", dom.innerHTML);\n data.setData(\"text/plain\", text);\n }\n else {\n captureCopy(view, dom);\n }\n if (cut)\n view.dispatch(view.state.tr.deleteSelection().scrollIntoView().setMeta(\"uiEvent\", \"cut\"));\n};\nfunction sliceSingleNode(slice) {\n return slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1 ? slice.content.firstChild : null;\n}\nfunction capturePaste(view, event) {\n if (!view.dom.parentNode)\n return;\n let plainText = view.input.shiftKey || view.state.selection.$from.parent.type.spec.code;\n let target = view.dom.parentNode.appendChild(document.createElement(plainText ? \"textarea\" : \"div\"));\n if (!plainText)\n target.contentEditable = \"true\";\n target.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n target.focus();\n let plain = view.input.shiftKey && view.input.lastKeyCode != 45;\n setTimeout(() => {\n view.focus();\n if (target.parentNode)\n target.parentNode.removeChild(target);\n if (plainText)\n doPaste(view, target.value, null, plain, event);\n else\n doPaste(view, target.textContent, target.innerHTML, plain, event);\n }, 50);\n}\nfunction doPaste(view, text, html, preferPlain, event) {\n let slice = parseFromClipboard(view, text, html, preferPlain, view.state.selection.$from);\n if (view.someProp(\"handlePaste\", f => f(view, event, slice || Slice.empty)))\n return true;\n if (!slice)\n return false;\n let singleNode = sliceSingleNode(slice);\n let tr = singleNode\n ? view.state.tr.replaceSelectionWith(singleNode, preferPlain)\n : view.state.tr.replaceSelection(slice);\n view.dispatch(tr.scrollIntoView().setMeta(\"paste\", true).setMeta(\"uiEvent\", \"paste\"));\n return true;\n}\nfunction getText(clipboardData) {\n let text = clipboardData.getData(\"text/plain\") || clipboardData.getData(\"Text\");\n if (text)\n return text;\n let uris = clipboardData.getData(\"text/uri-list\");\n return uris ? uris.replace(/\\r?\\n/g, \" \") : \"\";\n}\neditHandlers.paste = (view, _event) => {\n let event = _event;\n // Handling paste from JavaScript during composition is very poorly\n // handled by browsers, so as a dodgy but preferable kludge, we just\n // let the browser do its native thing there, except on Android,\n // where the editor is almost always composing.\n if (view.composing && !android)\n return;\n let data = brokenClipboardAPI ? null : event.clipboardData;\n let plain = view.input.shiftKey && view.input.lastKeyCode != 45;\n if (data && doPaste(view, getText(data), data.getData(\"text/html\"), plain, event))\n event.preventDefault();\n else\n capturePaste(view, event);\n};\nclass Dragging {\n constructor(slice, move, node) {\n this.slice = slice;\n this.move = move;\n this.node = node;\n }\n}\nconst dragCopyModifier = mac ? \"altKey\" : \"ctrlKey\";\nhandlers.dragstart = (view, _event) => {\n let event = _event;\n let mouseDown = view.input.mouseDown;\n if (mouseDown)\n mouseDown.done();\n if (!event.dataTransfer)\n return;\n let sel = view.state.selection;\n let pos = sel.empty ? null : view.posAtCoords(eventCoords(event));\n let node;\n if (pos && pos.pos >= sel.from && pos.pos <= (sel instanceof NodeSelection ? sel.to - 1 : sel.to)) ;\n else if (mouseDown && mouseDown.mightDrag) {\n node = NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos);\n }\n else if (event.target && event.target.nodeType == 1) {\n let desc = view.docView.nearestDesc(event.target, true);\n if (desc && desc.node.type.spec.draggable && desc != view.docView)\n node = NodeSelection.create(view.state.doc, desc.posBefore);\n }\n let draggedSlice = (node || view.state.selection).content();\n let { dom, text, slice } = serializeForClipboard(view, draggedSlice);\n // Pre-120 Chrome versions clear files when calling `clearData` (#1472)\n if (!event.dataTransfer.files.length || !chrome || chrome_version > 120)\n event.dataTransfer.clearData();\n event.dataTransfer.setData(brokenClipboardAPI ? \"Text\" : \"text/html\", dom.innerHTML);\n // See https://github.com/ProseMirror/prosemirror/issues/1156\n event.dataTransfer.effectAllowed = \"copyMove\";\n if (!brokenClipboardAPI)\n event.dataTransfer.setData(\"text/plain\", text);\n view.dragging = new Dragging(slice, !event[dragCopyModifier], node);\n};\nhandlers.dragend = view => {\n let dragging = view.dragging;\n window.setTimeout(() => {\n if (view.dragging == dragging)\n view.dragging = null;\n }, 50);\n};\neditHandlers.dragover = editHandlers.dragenter = (_, e) => e.preventDefault();\neditHandlers.drop = (view, _event) => {\n let event = _event;\n let dragging = view.dragging;\n view.dragging = null;\n if (!event.dataTransfer)\n return;\n let eventPos = view.posAtCoords(eventCoords(event));\n if (!eventPos)\n return;\n let $mouse = view.state.doc.resolve(eventPos.pos);\n let slice = dragging && dragging.slice;\n if (slice) {\n view.someProp(\"transformPasted\", f => { slice = f(slice, view); });\n }\n else {\n slice = parseFromClipboard(view, getText(event.dataTransfer), brokenClipboardAPI ? null : event.dataTransfer.getData(\"text/html\"), false, $mouse);\n }\n let move = !!(dragging && !event[dragCopyModifier]);\n if (view.someProp(\"handleDrop\", f => f(view, event, slice || Slice.empty, move))) {\n event.preventDefault();\n return;\n }\n if (!slice)\n return;\n event.preventDefault();\n let insertPos = slice ? dropPoint(view.state.doc, $mouse.pos, slice) : $mouse.pos;\n if (insertPos == null)\n insertPos = $mouse.pos;\n let tr = view.state.tr;\n if (move) {\n let { node } = dragging;\n if (node)\n node.replace(tr);\n else\n tr.deleteSelection();\n }\n let pos = tr.mapping.map(insertPos);\n let isNode = slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1;\n let beforeInsert = tr.doc;\n if (isNode)\n tr.replaceRangeWith(pos, pos, slice.content.firstChild);\n else\n tr.replaceRange(pos, pos, slice);\n if (tr.doc.eq(beforeInsert))\n return;\n let $pos = tr.doc.resolve(pos);\n if (isNode && NodeSelection.isSelectable(slice.content.firstChild) &&\n $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice.content.firstChild)) {\n tr.setSelection(new NodeSelection($pos));\n }\n else {\n let end = tr.mapping.map(insertPos);\n tr.mapping.maps[tr.mapping.maps.length - 1].forEach((_from, _to, _newFrom, newTo) => end = newTo);\n tr.setSelection(selectionBetween(view, $pos, tr.doc.resolve(end)));\n }\n view.focus();\n view.dispatch(tr.setMeta(\"uiEvent\", \"drop\"));\n};\nhandlers.focus = view => {\n view.input.lastFocus = Date.now();\n if (!view.focused) {\n view.domObserver.stop();\n view.dom.classList.add(\"ProseMirror-focused\");\n view.domObserver.start();\n view.focused = true;\n setTimeout(() => {\n if (view.docView && view.hasFocus() && !view.domObserver.currentSelection.eq(view.domSelectionRange()))\n selectionToDOM(view);\n }, 20);\n }\n};\nhandlers.blur = (view, _event) => {\n let event = _event;\n if (view.focused) {\n view.domObserver.stop();\n view.dom.classList.remove(\"ProseMirror-focused\");\n view.domObserver.start();\n if (event.relatedTarget && view.dom.contains(event.relatedTarget))\n view.domObserver.currentSelection.clear();\n view.focused = false;\n }\n};\nhandlers.beforeinput = (view, _event) => {\n let event = _event;\n // We should probably do more with beforeinput events, but support\n // is so spotty that I'm still waiting to see where they are going.\n // Very specific hack to deal with backspace sometimes failing on\n // Chrome Android when after an uneditable node.\n if (chrome && android && event.inputType == \"deleteContentBackward\") {\n view.domObserver.flushSoon();\n let { domChangeCount } = view.input;\n setTimeout(() => {\n if (view.input.domChangeCount != domChangeCount)\n return; // Event already had some effect\n // This bug tends to close the virtual keyboard, so we refocus\n view.dom.blur();\n view.focus();\n if (view.someProp(\"handleKeyDown\", f => f(view, keyEvent(8, \"Backspace\"))))\n return;\n let { $cursor } = view.state.selection;\n // Crude approximation of backspace behavior when no command handled it\n if ($cursor && $cursor.pos > 0)\n view.dispatch(view.state.tr.delete($cursor.pos - 1, $cursor.pos).scrollIntoView());\n }, 50);\n }\n};\n// Make sure all handlers get registered\nfor (let prop in editHandlers)\n handlers[prop] = editHandlers[prop];\n\nfunction compareObjs(a, b) {\n if (a == b)\n return true;\n for (let p in a)\n if (a[p] !== b[p])\n return false;\n for (let p in b)\n if (!(p in a))\n return false;\n return true;\n}\nclass WidgetType {\n constructor(toDOM, spec) {\n this.toDOM = toDOM;\n this.spec = spec || noSpec;\n this.side = this.spec.side || 0;\n }\n map(mapping, span, offset, oldOffset) {\n let { pos, deleted } = mapping.mapResult(span.from + oldOffset, this.side < 0 ? -1 : 1);\n return deleted ? null : new Decoration(pos - offset, pos - offset, this);\n }\n valid() { return true; }\n eq(other) {\n return this == other ||\n (other instanceof WidgetType &&\n (this.spec.key && this.spec.key == other.spec.key ||\n this.toDOM == other.toDOM && compareObjs(this.spec, other.spec)));\n }\n destroy(node) {\n if (this.spec.destroy)\n this.spec.destroy(node);\n }\n}\nclass InlineType {\n constructor(attrs, spec) {\n this.attrs = attrs;\n this.spec = spec || noSpec;\n }\n map(mapping, span, offset, oldOffset) {\n let from = mapping.map(span.from + oldOffset, this.spec.inclusiveStart ? -1 : 1) - offset;\n let to = mapping.map(span.to + oldOffset, this.spec.inclusiveEnd ? 1 : -1) - offset;\n return from >= to ? null : new Decoration(from, to, this);\n }\n valid(_, span) { return span.from < span.to; }\n eq(other) {\n return this == other ||\n (other instanceof InlineType && compareObjs(this.attrs, other.attrs) &&\n compareObjs(this.spec, other.spec));\n }\n static is(span) { return span.type instanceof InlineType; }\n destroy() { }\n}\nclass NodeType {\n constructor(attrs, spec) {\n this.attrs = attrs;\n this.spec = spec || noSpec;\n }\n map(mapping, span, offset, oldOffset) {\n let from = mapping.mapResult(span.from + oldOffset, 1);\n if (from.deleted)\n return null;\n let to = mapping.mapResult(span.to + oldOffset, -1);\n if (to.deleted || to.pos <= from.pos)\n return null;\n return new Decoration(from.pos - offset, to.pos - offset, this);\n }\n valid(node, span) {\n let { index, offset } = node.content.findIndex(span.from), child;\n return offset == span.from && !(child = node.child(index)).isText && offset + child.nodeSize == span.to;\n }\n eq(other) {\n return this == other ||\n (other instanceof NodeType && compareObjs(this.attrs, other.attrs) &&\n compareObjs(this.spec, other.spec));\n }\n destroy() { }\n}\n/**\nDecoration objects can be provided to the view through the\n[`decorations` prop](https://prosemirror.net/docs/ref/#view.EditorProps.decorations). They come in\nseveral variants—see the static members of this class for details.\n*/\nclass Decoration {\n /**\n @internal\n */\n constructor(\n /**\n The start position of the decoration.\n */\n from, \n /**\n The end position. Will be the same as `from` for [widget\n decorations](https://prosemirror.net/docs/ref/#view.Decoration^widget).\n */\n to, \n /**\n @internal\n */\n type) {\n this.from = from;\n this.to = to;\n this.type = type;\n }\n /**\n @internal\n */\n copy(from, to) {\n return new Decoration(from, to, this.type);\n }\n /**\n @internal\n */\n eq(other, offset = 0) {\n return this.type.eq(other.type) && this.from + offset == other.from && this.to + offset == other.to;\n }\n /**\n @internal\n */\n map(mapping, offset, oldOffset) {\n return this.type.map(mapping, this, offset, oldOffset);\n }\n /**\n Creates a widget decoration, which is a DOM node that's shown in\n the document at the given position. It is recommended that you\n delay rendering the widget by passing a function that will be\n called when the widget is actually drawn in a view, but you can\n also directly pass a DOM node. `getPos` can be used to find the\n widget's current document position.\n */\n static widget(pos, toDOM, spec) {\n return new Decoration(pos, pos, new WidgetType(toDOM, spec));\n }\n /**\n Creates an inline decoration, which adds the given attributes to\n each inline node between `from` and `to`.\n */\n static inline(from, to, attrs, spec) {\n return new Decoration(from, to, new InlineType(attrs, spec));\n }\n /**\n Creates a node decoration. `from` and `to` should point precisely\n before and after a node in the document. That node, and only that\n node, will receive the given attributes.\n */\n static node(from, to, attrs, spec) {\n return new Decoration(from, to, new NodeType(attrs, spec));\n }\n /**\n The spec provided when creating this decoration. Can be useful\n if you've stored extra information in that object.\n */\n get spec() { return this.type.spec; }\n /**\n @internal\n */\n get inline() { return this.type instanceof InlineType; }\n /**\n @internal\n */\n get widget() { return this.type instanceof WidgetType; }\n}\nconst none = [], noSpec = {};\n/**\nA collection of [decorations](https://prosemirror.net/docs/ref/#view.Decoration), organized in such\na way that the drawing algorithm can efficiently use and compare\nthem. This is a persistent data structure—it is not modified,\nupdates create a new value.\n*/\nclass DecorationSet {\n /**\n @internal\n */\n constructor(local, children) {\n this.local = local.length ? local : none;\n this.children = children.length ? children : none;\n }\n /**\n Create a set of decorations, using the structure of the given\n document. This will consume (modify) the `decorations` array, so\n you must make a copy if you want need to preserve that.\n */\n static create(doc, decorations) {\n return decorations.length ? buildTree(decorations, doc, 0, noSpec) : empty;\n }\n /**\n Find all decorations in this set which touch the given range\n (including decorations that start or end directly at the\n boundaries) and match the given predicate on their spec. When\n `start` and `end` are omitted, all decorations in the set are\n considered. When `predicate` isn't given, all decorations are\n assumed to match.\n */\n find(start, end, predicate) {\n let result = [];\n this.findInner(start == null ? 0 : start, end == null ? 1e9 : end, result, 0, predicate);\n return result;\n }\n findInner(start, end, result, offset, predicate) {\n for (let i = 0; i < this.local.length; i++) {\n let span = this.local[i];\n if (span.from <= end && span.to >= start && (!predicate || predicate(span.spec)))\n result.push(span.copy(span.from + offset, span.to + offset));\n }\n for (let i = 0; i < this.children.length; i += 3) {\n if (this.children[i] < end && this.children[i + 1] > start) {\n let childOff = this.children[i] + 1;\n this.children[i + 2].findInner(start - childOff, end - childOff, result, offset + childOff, predicate);\n }\n }\n }\n /**\n Map the set of decorations in response to a change in the\n document.\n */\n map(mapping, doc, options) {\n if (this == empty || mapping.maps.length == 0)\n return this;\n return this.mapInner(mapping, doc, 0, 0, options || noSpec);\n }\n /**\n @internal\n */\n mapInner(mapping, node, offset, oldOffset, options) {\n let newLocal;\n for (let i = 0; i < this.local.length; i++) {\n let mapped = this.local[i].map(mapping, offset, oldOffset);\n if (mapped && mapped.type.valid(node, mapped))\n (newLocal || (newLocal = [])).push(mapped);\n else if (options.onRemove)\n options.onRemove(this.local[i].spec);\n }\n if (this.children.length)\n return mapChildren(this.children, newLocal || [], mapping, node, offset, oldOffset, options);\n else\n return newLocal ? new DecorationSet(newLocal.sort(byPos), none) : empty;\n }\n /**\n Add the given array of decorations to the ones in the set,\n producing a new set. Consumes the `decorations` array. Needs\n access to the current document to create the appropriate tree\n structure.\n */\n add(doc, decorations) {\n if (!decorations.length)\n return this;\n if (this == empty)\n return DecorationSet.create(doc, decorations);\n return this.addInner(doc, decorations, 0);\n }\n addInner(doc, decorations, offset) {\n let children, childIndex = 0;\n doc.forEach((childNode, childOffset) => {\n let baseOffset = childOffset + offset, found;\n if (!(found = takeSpansForNode(decorations, childNode, baseOffset)))\n return;\n if (!children)\n children = this.children.slice();\n while (childIndex < children.length && children[childIndex] < childOffset)\n childIndex += 3;\n if (children[childIndex] == childOffset)\n children[childIndex + 2] = children[childIndex + 2].addInner(childNode, found, baseOffset + 1);\n else\n children.splice(childIndex, 0, childOffset, childOffset + childNode.nodeSize, buildTree(found, childNode, baseOffset + 1, noSpec));\n childIndex += 3;\n });\n let local = moveSpans(childIndex ? withoutNulls(decorations) : decorations, -offset);\n for (let i = 0; i < local.length; i++)\n if (!local[i].type.valid(doc, local[i]))\n local.splice(i--, 1);\n return new DecorationSet(local.length ? this.local.concat(local).sort(byPos) : this.local, children || this.children);\n }\n /**\n Create a new set that contains the decorations in this set, minus\n the ones in the given array.\n */\n remove(decorations) {\n if (decorations.length == 0 || this == empty)\n return this;\n return this.removeInner(decorations, 0);\n }\n removeInner(decorations, offset) {\n let children = this.children, local = this.local;\n for (let i = 0; i < children.length; i += 3) {\n let found;\n let from = children[i] + offset, to = children[i + 1] + offset;\n for (let j = 0, span; j < decorations.length; j++)\n if (span = decorations[j]) {\n if (span.from > from && span.to < to) {\n decorations[j] = null;\n (found || (found = [])).push(span);\n }\n }\n if (!found)\n continue;\n if (children == this.children)\n children = this.children.slice();\n let removed = children[i + 2].removeInner(found, from + 1);\n if (removed != empty) {\n children[i + 2] = removed;\n }\n else {\n children.splice(i, 3);\n i -= 3;\n }\n }\n if (local.length)\n for (let i = 0, span; i < decorations.length; i++)\n if (span = decorations[i]) {\n for (let j = 0; j < local.length; j++)\n if (local[j].eq(span, offset)) {\n if (local == this.local)\n local = this.local.slice();\n local.splice(j--, 1);\n }\n }\n if (children == this.children && local == this.local)\n return this;\n return local.length || children.length ? new DecorationSet(local, children) : empty;\n }\n forChild(offset, node) {\n if (this == empty)\n return this;\n if (node.isLeaf)\n return DecorationSet.empty;\n let child, local;\n for (let i = 0; i < this.children.length; i += 3)\n if (this.children[i] >= offset) {\n if (this.children[i] == offset)\n child = this.children[i + 2];\n break;\n }\n let start = offset + 1, end = start + node.content.size;\n for (let i = 0; i < this.local.length; i++) {\n let dec = this.local[i];\n if (dec.from < end && dec.to > start && (dec.type instanceof InlineType)) {\n let from = Math.max(start, dec.from) - start, to = Math.min(end, dec.to) - start;\n if (from < to)\n (local || (local = [])).push(dec.copy(from, to));\n }\n }\n if (local) {\n let localSet = new DecorationSet(local.sort(byPos), none);\n return child ? new DecorationGroup([localSet, child]) : localSet;\n }\n return child || empty;\n }\n /**\n @internal\n */\n eq(other) {\n if (this == other)\n return true;\n if (!(other instanceof DecorationSet) ||\n this.local.length != other.local.length ||\n this.children.length != other.children.length)\n return false;\n for (let i = 0; i < this.local.length; i++)\n if (!this.local[i].eq(other.local[i]))\n return false;\n for (let i = 0; i < this.children.length; i += 3)\n if (this.children[i] != other.children[i] ||\n this.children[i + 1] != other.children[i + 1] ||\n !this.children[i + 2].eq(other.children[i + 2]))\n return false;\n return true;\n }\n /**\n @internal\n */\n locals(node) {\n return removeOverlap(this.localsInner(node));\n }\n /**\n @internal\n */\n localsInner(node) {\n if (this == empty)\n return none;\n if (node.inlineContent || !this.local.some(InlineType.is))\n return this.local;\n let result = [];\n for (let i = 0; i < this.local.length; i++) {\n if (!(this.local[i].type instanceof InlineType))\n result.push(this.local[i]);\n }\n return result;\n }\n forEachSet(f) { f(this); }\n}\n/**\nThe empty set of decorations.\n*/\nDecorationSet.empty = new DecorationSet([], []);\n/**\n@internal\n*/\nDecorationSet.removeOverlap = removeOverlap;\nconst empty = DecorationSet.empty;\n// An abstraction that allows the code dealing with decorations to\n// treat multiple DecorationSet objects as if it were a single object\n// with (a subset of) the same interface.\nclass DecorationGroup {\n constructor(members) {\n this.members = members;\n }\n map(mapping, doc) {\n const mappedDecos = this.members.map(member => member.map(mapping, doc, noSpec));\n return DecorationGroup.from(mappedDecos);\n }\n forChild(offset, child) {\n if (child.isLeaf)\n return DecorationSet.empty;\n let found = [];\n for (let i = 0; i < this.members.length; i++) {\n let result = this.members[i].forChild(offset, child);\n if (result == empty)\n continue;\n if (result instanceof DecorationGroup)\n found = found.concat(result.members);\n else\n found.push(result);\n }\n return DecorationGroup.from(found);\n }\n eq(other) {\n if (!(other instanceof DecorationGroup) ||\n other.members.length != this.members.length)\n return false;\n for (let i = 0; i < this.members.length; i++)\n if (!this.members[i].eq(other.members[i]))\n return false;\n return true;\n }\n locals(node) {\n let result, sorted = true;\n for (let i = 0; i < this.members.length; i++) {\n let locals = this.members[i].localsInner(node);\n if (!locals.length)\n continue;\n if (!result) {\n result = locals;\n }\n else {\n if (sorted) {\n result = result.slice();\n sorted = false;\n }\n for (let j = 0; j < locals.length; j++)\n result.push(locals[j]);\n }\n }\n return result ? removeOverlap(sorted ? result : result.sort(byPos)) : none;\n }\n // Create a group for the given array of decoration sets, or return\n // a single set when possible.\n static from(members) {\n switch (members.length) {\n case 0: return empty;\n case 1: return members[0];\n default: return new DecorationGroup(members.every(m => m instanceof DecorationSet) ? members :\n members.reduce((r, m) => r.concat(m instanceof DecorationSet ? m : m.members), []));\n }\n }\n forEachSet(f) {\n for (let i = 0; i < this.members.length; i++)\n this.members[i].forEachSet(f);\n }\n}\nfunction mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, options) {\n let children = oldChildren.slice();\n // Mark the children that are directly touched by changes, and\n // move those that are after the changes.\n for (let i = 0, baseOffset = oldOffset; i < mapping.maps.length; i++) {\n let moved = 0;\n mapping.maps[i].forEach((oldStart, oldEnd, newStart, newEnd) => {\n let dSize = (newEnd - newStart) - (oldEnd - oldStart);\n for (let i = 0; i < children.length; i += 3) {\n let end = children[i + 1];\n if (end < 0 || oldStart > end + baseOffset - moved)\n continue;\n let start = children[i] + baseOffset - moved;\n if (oldEnd >= start) {\n children[i + 1] = oldStart <= start ? -2 : -1;\n }\n else if (oldStart >= baseOffset && dSize) {\n children[i] += dSize;\n children[i + 1] += dSize;\n }\n }\n moved += dSize;\n });\n baseOffset = mapping.maps[i].map(baseOffset, -1);\n }\n // Find the child nodes that still correspond to a single node,\n // recursively call mapInner on them and update their positions.\n let mustRebuild = false;\n for (let i = 0; i < children.length; i += 3)\n if (children[i + 1] < 0) { // Touched nodes\n if (children[i + 1] == -2) {\n mustRebuild = true;\n children[i + 1] = -1;\n continue;\n }\n let from = mapping.map(oldChildren[i] + oldOffset), fromLocal = from - offset;\n if (fromLocal < 0 || fromLocal >= node.content.size) {\n mustRebuild = true;\n continue;\n }\n // Must read oldChildren because children was tagged with -1\n let to = mapping.map(oldChildren[i + 1] + oldOffset, -1), toLocal = to - offset;\n let { index, offset: childOffset } = node.content.findIndex(fromLocal);\n let childNode = node.maybeChild(index);\n if (childNode && childOffset == fromLocal && childOffset + childNode.nodeSize == toLocal) {\n let mapped = children[i + 2]\n .mapInner(mapping, childNode, from + 1, oldChildren[i] + oldOffset + 1, options);\n if (mapped != empty) {\n children[i] = fromLocal;\n children[i + 1] = toLocal;\n children[i + 2] = mapped;\n }\n else {\n children[i + 1] = -2;\n mustRebuild = true;\n }\n }\n else {\n mustRebuild = true;\n }\n }\n // Remaining children must be collected and rebuilt into the appropriate structure\n if (mustRebuild) {\n let decorations = mapAndGatherRemainingDecorations(children, oldChildren, newLocal, mapping, offset, oldOffset, options);\n let built = buildTree(decorations, node, 0, options);\n newLocal = built.local;\n for (let i = 0; i < children.length; i += 3)\n if (children[i + 1] < 0) {\n children.splice(i, 3);\n i -= 3;\n }\n for (let i = 0, j = 0; i < built.children.length; i += 3) {\n let from = built.children[i];\n while (j < children.length && children[j] < from)\n j += 3;\n children.splice(j, 0, built.children[i], built.children[i + 1], built.children[i + 2]);\n }\n }\n return new DecorationSet(newLocal.sort(byPos), children);\n}\nfunction moveSpans(spans, offset) {\n if (!offset || !spans.length)\n return spans;\n let result = [];\n for (let i = 0; i < spans.length; i++) {\n let span = spans[i];\n result.push(new Decoration(span.from + offset, span.to + offset, span.type));\n }\n return result;\n}\nfunction mapAndGatherRemainingDecorations(children, oldChildren, decorations, mapping, offset, oldOffset, options) {\n // Gather all decorations from the remaining marked children\n function gather(set, oldOffset) {\n for (let i = 0; i < set.local.length; i++) {\n let mapped = set.local[i].map(mapping, offset, oldOffset);\n if (mapped)\n decorations.push(mapped);\n else if (options.onRemove)\n options.onRemove(set.local[i].spec);\n }\n for (let i = 0; i < set.children.length; i += 3)\n gather(set.children[i + 2], set.children[i] + oldOffset + 1);\n }\n for (let i = 0; i < children.length; i += 3)\n if (children[i + 1] == -1)\n gather(children[i + 2], oldChildren[i] + oldOffset + 1);\n return decorations;\n}\nfunction takeSpansForNode(spans, node, offset) {\n if (node.isLeaf)\n return null;\n let end = offset + node.nodeSize, found = null;\n for (let i = 0, span; i < spans.length; i++) {\n if ((span = spans[i]) && span.from > offset && span.to < end) {\n (found || (found = [])).push(span);\n spans[i] = null;\n }\n }\n return found;\n}\nfunction withoutNulls(array) {\n let result = [];\n for (let i = 0; i < array.length; i++)\n if (array[i] != null)\n result.push(array[i]);\n return result;\n}\n// Build up a tree that corresponds to a set of decorations. `offset`\n// is a base offset that should be subtracted from the `from` and `to`\n// positions in the spans (so that we don't have to allocate new spans\n// for recursive calls).\nfunction buildTree(spans, node, offset, options) {\n let children = [], hasNulls = false;\n node.forEach((childNode, localStart) => {\n let found = takeSpansForNode(spans, childNode, localStart + offset);\n if (found) {\n hasNulls = true;\n let subtree = buildTree(found, childNode, offset + localStart + 1, options);\n if (subtree != empty)\n children.push(localStart, localStart + childNode.nodeSize, subtree);\n }\n });\n let locals = moveSpans(hasNulls ? withoutNulls(spans) : spans, -offset).sort(byPos);\n for (let i = 0; i < locals.length; i++)\n if (!locals[i].type.valid(node, locals[i])) {\n if (options.onRemove)\n options.onRemove(locals[i].spec);\n locals.splice(i--, 1);\n }\n return locals.length || children.length ? new DecorationSet(locals, children) : empty;\n}\n// Used to sort decorations so that ones with a low start position\n// come first, and within a set with the same start position, those\n// with an smaller end position come first.\nfunction byPos(a, b) {\n return a.from - b.from || a.to - b.to;\n}\n// Scan a sorted array of decorations for partially overlapping spans,\n// and split those so that only fully overlapping spans are left (to\n// make subsequent rendering easier). Will return the input array if\n// no partially overlapping spans are found (the common case).\nfunction removeOverlap(spans) {\n let working = spans;\n for (let i = 0; i < working.length - 1; i++) {\n let span = working[i];\n if (span.from != span.to)\n for (let j = i + 1; j < working.length; j++) {\n let next = working[j];\n if (next.from == span.from) {\n if (next.to != span.to) {\n if (working == spans)\n working = spans.slice();\n // Followed by a partially overlapping larger span. Split that\n // span.\n working[j] = next.copy(next.from, span.to);\n insertAhead(working, j + 1, next.copy(span.to, next.to));\n }\n continue;\n }\n else {\n if (next.from < span.to) {\n if (working == spans)\n working = spans.slice();\n // The end of this one overlaps with a subsequent span. Split\n // this one.\n working[i] = span.copy(span.from, next.from);\n insertAhead(working, j, span.copy(next.from, span.to));\n }\n break;\n }\n }\n }\n return working;\n}\nfunction insertAhead(array, i, deco) {\n while (i < array.length && byPos(deco, array[i]) > 0)\n i++;\n array.splice(i, 0, deco);\n}\n// Get the decorations associated with the current props of a view.\nfunction viewDecorations(view) {\n let found = [];\n view.someProp(\"decorations\", f => {\n let result = f(view.state);\n if (result && result != empty)\n found.push(result);\n });\n if (view.cursorWrapper)\n found.push(DecorationSet.create(view.state.doc, [view.cursorWrapper.deco]));\n return DecorationGroup.from(found);\n}\n\nconst observeOptions = {\n childList: true,\n characterData: true,\n characterDataOldValue: true,\n attributes: true,\n attributeOldValue: true,\n subtree: true\n};\n// IE11 has very broken mutation observers, so we also listen to DOMCharacterDataModified\nconst useCharData = ie && ie_version <= 11;\nclass SelectionState {\n constructor() {\n this.anchorNode = null;\n this.anchorOffset = 0;\n this.focusNode = null;\n this.focusOffset = 0;\n }\n set(sel) {\n this.anchorNode = sel.anchorNode;\n this.anchorOffset = sel.anchorOffset;\n this.focusNode = sel.focusNode;\n this.focusOffset = sel.focusOffset;\n }\n clear() {\n this.anchorNode = this.focusNode = null;\n }\n eq(sel) {\n return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset &&\n sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset;\n }\n}\nclass DOMObserver {\n constructor(view, handleDOMChange) {\n this.view = view;\n this.handleDOMChange = handleDOMChange;\n this.queue = [];\n this.flushingSoon = -1;\n this.observer = null;\n this.currentSelection = new SelectionState;\n this.onCharData = null;\n this.suppressingSelectionUpdates = false;\n this.lastChangedTextNode = null;\n this.observer = window.MutationObserver &&\n new window.MutationObserver(mutations => {\n for (let i = 0; i < mutations.length; i++)\n this.queue.push(mutations[i]);\n // IE11 will sometimes (on backspacing out a single character\n // text node after a BR node) call the observer callback\n // before actually updating the DOM, which will cause\n // ProseMirror to miss the change (see #930)\n if (ie && ie_version <= 11 && mutations.some(m => m.type == \"childList\" && m.removedNodes.length ||\n m.type == \"characterData\" && m.oldValue.length > m.target.nodeValue.length))\n this.flushSoon();\n else\n this.flush();\n });\n if (useCharData) {\n this.onCharData = e => {\n this.queue.push({ target: e.target, type: \"characterData\", oldValue: e.prevValue });\n this.flushSoon();\n };\n }\n this.onSelectionChange = this.onSelectionChange.bind(this);\n }\n flushSoon() {\n if (this.flushingSoon < 0)\n this.flushingSoon = window.setTimeout(() => { this.flushingSoon = -1; this.flush(); }, 20);\n }\n forceFlush() {\n if (this.flushingSoon > -1) {\n window.clearTimeout(this.flushingSoon);\n this.flushingSoon = -1;\n this.flush();\n }\n }\n start() {\n if (this.observer) {\n this.observer.takeRecords();\n this.observer.observe(this.view.dom, observeOptions);\n }\n if (this.onCharData)\n this.view.dom.addEventListener(\"DOMCharacterDataModified\", this.onCharData);\n this.connectSelection();\n }\n stop() {\n if (this.observer) {\n let take = this.observer.takeRecords();\n if (take.length) {\n for (let i = 0; i < take.length; i++)\n this.queue.push(take[i]);\n window.setTimeout(() => this.flush(), 20);\n }\n this.observer.disconnect();\n }\n if (this.onCharData)\n this.view.dom.removeEventListener(\"DOMCharacterDataModified\", this.onCharData);\n this.disconnectSelection();\n }\n connectSelection() {\n this.view.dom.ownerDocument.addEventListener(\"selectionchange\", this.onSelectionChange);\n }\n disconnectSelection() {\n this.view.dom.ownerDocument.removeEventListener(\"selectionchange\", this.onSelectionChange);\n }\n suppressSelectionUpdates() {\n this.suppressingSelectionUpdates = true;\n setTimeout(() => this.suppressingSelectionUpdates = false, 50);\n }\n onSelectionChange() {\n if (!hasFocusAndSelection(this.view))\n return;\n if (this.suppressingSelectionUpdates)\n return selectionToDOM(this.view);\n // Deletions on IE11 fire their events in the wrong order, giving\n // us a selection change event before the DOM changes are\n // reported.\n if (ie && ie_version <= 11 && !this.view.state.selection.empty) {\n let sel = this.view.domSelectionRange();\n // Selection.isCollapsed isn't reliable on IE\n if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset))\n return this.flushSoon();\n }\n this.flush();\n }\n setCurSelection() {\n this.currentSelection.set(this.view.domSelectionRange());\n }\n ignoreSelectionChange(sel) {\n if (!sel.focusNode)\n return true;\n let ancestors = new Set, container;\n for (let scan = sel.focusNode; scan; scan = parentNode(scan))\n ancestors.add(scan);\n for (let scan = sel.anchorNode; scan; scan = parentNode(scan))\n if (ancestors.has(scan)) {\n container = scan;\n break;\n }\n let desc = container && this.view.docView.nearestDesc(container);\n if (desc && desc.ignoreMutation({\n type: \"selection\",\n target: container.nodeType == 3 ? container.parentNode : container\n })) {\n this.setCurSelection();\n return true;\n }\n }\n pendingRecords() {\n if (this.observer)\n for (let mut of this.observer.takeRecords())\n this.queue.push(mut);\n return this.queue;\n }\n flush() {\n let { view } = this;\n if (!view.docView || this.flushingSoon > -1)\n return;\n let mutations = this.pendingRecords();\n if (mutations.length)\n this.queue = [];\n let sel = view.domSelectionRange();\n let newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasFocusAndSelection(view) && !this.ignoreSelectionChange(sel);\n let from = -1, to = -1, typeOver = false, added = [];\n if (view.editable) {\n for (let i = 0; i < mutations.length; i++) {\n let result = this.registerMutation(mutations[i], added);\n if (result) {\n from = from < 0 ? result.from : Math.min(result.from, from);\n to = to < 0 ? result.to : Math.max(result.to, to);\n if (result.typeOver)\n typeOver = true;\n }\n }\n }\n if (gecko && added.length) {\n let brs = added.filter(n => n.nodeName == \"BR\");\n if (brs.length == 2) {\n let [a, b] = brs;\n if (a.parentNode && a.parentNode.parentNode == b.parentNode)\n b.remove();\n else\n a.remove();\n }\n else {\n let { focusNode } = this.currentSelection;\n for (let br of brs) {\n let parent = br.parentNode;\n if (parent && parent.nodeName == \"LI\" && (!focusNode || blockParent(view, focusNode) != parent))\n br.remove();\n }\n }\n }\n let readSel = null;\n // If it looks like the browser has reset the selection to the\n // start of the document after focus, restore the selection from\n // the state\n if (from < 0 && newSel && view.input.lastFocus > Date.now() - 200 &&\n Math.max(view.input.lastTouch, view.input.lastClick.time) < Date.now() - 300 &&\n selectionCollapsed(sel) && (readSel = selectionFromDOM(view)) &&\n readSel.eq(Selection.near(view.state.doc.resolve(0), 1))) {\n view.input.lastFocus = 0;\n selectionToDOM(view);\n this.currentSelection.set(sel);\n view.scrollToSelection();\n }\n else if (from > -1 || newSel) {\n if (from > -1) {\n view.docView.markDirty(from, to);\n checkCSS(view);\n }\n this.handleDOMChange(from, to, typeOver, added);\n if (view.docView && view.docView.dirty)\n view.updateState(view.state);\n else if (!this.currentSelection.eq(sel))\n selectionToDOM(view);\n this.currentSelection.set(sel);\n }\n }\n registerMutation(mut, added) {\n // Ignore mutations inside nodes that were already noted as inserted\n if (added.indexOf(mut.target) > -1)\n return null;\n let desc = this.view.docView.nearestDesc(mut.target);\n if (mut.type == \"attributes\" &&\n (desc == this.view.docView || mut.attributeName == \"contenteditable\" ||\n // Firefox sometimes fires spurious events for null/empty styles\n (mut.attributeName == \"style\" && !mut.oldValue && !mut.target.getAttribute(\"style\"))))\n return null;\n if (!desc || desc.ignoreMutation(mut))\n return null;\n if (mut.type == \"childList\") {\n for (let i = 0; i < mut.addedNodes.length; i++) {\n let node = mut.addedNodes[i];\n added.push(node);\n if (node.nodeType == 3)\n this.lastChangedTextNode = node;\n }\n if (desc.contentDOM && desc.contentDOM != desc.dom && !desc.contentDOM.contains(mut.target))\n return { from: desc.posBefore, to: desc.posAfter };\n let prev = mut.previousSibling, next = mut.nextSibling;\n if (ie && ie_version <= 11 && mut.addedNodes.length) {\n // IE11 gives us incorrect next/prev siblings for some\n // insertions, so if there are added nodes, recompute those\n for (let i = 0; i < mut.addedNodes.length; i++) {\n let { previousSibling, nextSibling } = mut.addedNodes[i];\n if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0)\n prev = previousSibling;\n if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0)\n next = nextSibling;\n }\n }\n let fromOffset = prev && prev.parentNode == mut.target\n ? domIndex(prev) + 1 : 0;\n let from = desc.localPosFromDOM(mut.target, fromOffset, -1);\n let toOffset = next && next.parentNode == mut.target\n ? domIndex(next) : mut.target.childNodes.length;\n let to = desc.localPosFromDOM(mut.target, toOffset, 1);\n return { from, to };\n }\n else if (mut.type == \"attributes\") {\n return { from: desc.posAtStart - desc.border, to: desc.posAtEnd + desc.border };\n }\n else { // \"characterData\"\n this.lastChangedTextNode = mut.target;\n return {\n from: desc.posAtStart,\n to: desc.posAtEnd,\n // An event was generated for a text change that didn't change\n // any text. Mark the dom change to fall back to assuming the\n // selection was typed over with an identical value if it can't\n // find another change.\n typeOver: mut.target.nodeValue == mut.oldValue\n };\n }\n }\n}\nlet cssChecked = new WeakMap();\nlet cssCheckWarned = false;\nfunction checkCSS(view) {\n if (cssChecked.has(view))\n return;\n cssChecked.set(view, null);\n if (['normal', 'nowrap', 'pre-line'].indexOf(getComputedStyle(view.dom).whiteSpace) !== -1) {\n view.requiresGeckoHackNode = gecko;\n if (cssCheckWarned)\n return;\n console[\"warn\"](\"ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.\");\n cssCheckWarned = true;\n }\n}\nfunction rangeToSelectionRange(view, range) {\n let anchorNode = range.startContainer, anchorOffset = range.startOffset;\n let focusNode = range.endContainer, focusOffset = range.endOffset;\n let currentAnchor = view.domAtPos(view.state.selection.anchor);\n // Since such a range doesn't distinguish between anchor and head,\n // use a heuristic that flips it around if its end matches the\n // current anchor.\n if (isEquivalentPosition(currentAnchor.node, currentAnchor.offset, focusNode, focusOffset))\n [anchorNode, anchorOffset, focusNode, focusOffset] = [focusNode, focusOffset, anchorNode, anchorOffset];\n return { anchorNode, anchorOffset, focusNode, focusOffset };\n}\n// Used to work around a Safari Selection/shadow DOM bug\n// Based on https://github.com/codemirror/dev/issues/414 fix\nfunction safariShadowSelectionRange(view, selection) {\n if (selection.getComposedRanges) {\n let range = selection.getComposedRanges(view.root)[0];\n if (range)\n return rangeToSelectionRange(view, range);\n }\n let found;\n function read(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n found = event.getTargetRanges()[0];\n }\n // Because Safari (at least in 2018-2022) doesn't provide regular\n // access to the selection inside a shadowRoot, we have to perform a\n // ridiculous hack to get at it—using `execCommand` to trigger a\n // `beforeInput` event so that we can read the target range from the\n // event.\n view.dom.addEventListener(\"beforeinput\", read, true);\n document.execCommand(\"indent\");\n view.dom.removeEventListener(\"beforeinput\", read, true);\n return found ? rangeToSelectionRange(view, found) : null;\n}\nfunction blockParent(view, node) {\n for (let p = node.parentNode; p && p != view.dom; p = p.parentNode) {\n let desc = view.docView.nearestDesc(p, true);\n if (desc && desc.node.isBlock)\n return p;\n }\n return null;\n}\n\n// Note that all referencing and parsing is done with the\n// start-of-operation selection and document, since that's the one\n// that the DOM represents. If any changes came in in the meantime,\n// the modification is mapped over those before it is applied, in\n// readDOMChange.\nfunction parseBetween(view, from_, to_) {\n let { node: parent, fromOffset, toOffset, from, to } = view.docView.parseRange(from_, to_);\n let domSel = view.domSelectionRange();\n let find;\n let anchor = domSel.anchorNode;\n if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) {\n find = [{ node: anchor, offset: domSel.anchorOffset }];\n if (!selectionCollapsed(domSel))\n find.push({ node: domSel.focusNode, offset: domSel.focusOffset });\n }\n // Work around issue in Chrome where backspacing sometimes replaces\n // the deleted content with a random BR node (issues #799, #831)\n if (chrome && view.input.lastKeyCode === 8) {\n for (let off = toOffset; off > fromOffset; off--) {\n let node = parent.childNodes[off - 1], desc = node.pmViewDesc;\n if (node.nodeName == \"BR\" && !desc) {\n toOffset = off;\n break;\n }\n if (!desc || desc.size)\n break;\n }\n }\n let startDoc = view.state.doc;\n let parser = view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n let $from = startDoc.resolve(from);\n let sel = null, doc = parser.parse(parent, {\n topNode: $from.parent,\n topMatch: $from.parent.contentMatchAt($from.index()),\n topOpen: true,\n from: fromOffset,\n to: toOffset,\n preserveWhitespace: $from.parent.type.whitespace == \"pre\" ? \"full\" : true,\n findPositions: find,\n ruleFromNode,\n context: $from\n });\n if (find && find[0].pos != null) {\n let anchor = find[0].pos, head = find[1] && find[1].pos;\n if (head == null)\n head = anchor;\n sel = { anchor: anchor + from, head: head + from };\n }\n return { doc, sel, from, to };\n}\nfunction ruleFromNode(dom) {\n let desc = dom.pmViewDesc;\n if (desc) {\n return desc.parseRule();\n }\n else if (dom.nodeName == \"BR\" && dom.parentNode) {\n // Safari replaces the list item or table cell with a BR\n // directly in the list node (?!) if you delete the last\n // character in a list item or table cell (#708, #862)\n if (safari && /^(ul|ol)$/i.test(dom.parentNode.nodeName)) {\n let skip = document.createElement(\"div\");\n skip.appendChild(document.createElement(\"li\"));\n return { skip };\n }\n else if (dom.parentNode.lastChild == dom || safari && /^(tr|table)$/i.test(dom.parentNode.nodeName)) {\n return { ignore: true };\n }\n }\n else if (dom.nodeName == \"IMG\" && dom.getAttribute(\"mark-placeholder\")) {\n return { ignore: true };\n }\n return null;\n}\nconst isInline = /^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;\nfunction readDOMChange(view, from, to, typeOver, addedNodes) {\n let compositionID = view.input.compositionPendingChanges || (view.composing ? view.input.compositionID : 0);\n view.input.compositionPendingChanges = 0;\n if (from < 0) {\n let origin = view.input.lastSelectionTime > Date.now() - 50 ? view.input.lastSelectionOrigin : null;\n let newSel = selectionFromDOM(view, origin);\n if (newSel && !view.state.selection.eq(newSel)) {\n if (chrome && android &&\n view.input.lastKeyCode === 13 && Date.now() - 100 < view.input.lastKeyCodeTime &&\n view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\"))))\n return;\n let tr = view.state.tr.setSelection(newSel);\n if (origin == \"pointer\")\n tr.setMeta(\"pointer\", true);\n else if (origin == \"key\")\n tr.scrollIntoView();\n if (compositionID)\n tr.setMeta(\"composition\", compositionID);\n view.dispatch(tr);\n }\n return;\n }\n let $before = view.state.doc.resolve(from);\n let shared = $before.sharedDepth(to);\n from = $before.before(shared + 1);\n to = view.state.doc.resolve(to).after(shared + 1);\n let sel = view.state.selection;\n let parse = parseBetween(view, from, to);\n let doc = view.state.doc, compare = doc.slice(parse.from, parse.to);\n let preferredPos, preferredSide;\n // Prefer anchoring to end when Backspace is pressed\n if (view.input.lastKeyCode === 8 && Date.now() - 100 < view.input.lastKeyCodeTime) {\n preferredPos = view.state.selection.to;\n preferredSide = \"end\";\n }\n else {\n preferredPos = view.state.selection.from;\n preferredSide = \"start\";\n }\n view.input.lastKeyCode = null;\n let change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide);\n if (change)\n view.input.domChangeCount++;\n if ((ios && view.input.lastIOSEnter > Date.now() - 225 || android) &&\n addedNodes.some(n => n.nodeType == 1 && !isInline.test(n.nodeName)) &&\n (!change || change.endA >= change.endB) &&\n view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")))) {\n view.input.lastIOSEnter = 0;\n return;\n }\n if (!change) {\n if (typeOver && sel instanceof TextSelection && !sel.empty && sel.$head.sameParent(sel.$anchor) &&\n !view.composing && !(parse.sel && parse.sel.anchor != parse.sel.head)) {\n change = { start: sel.from, endA: sel.to, endB: sel.to };\n }\n else {\n if (parse.sel) {\n let sel = resolveSelection(view, view.state.doc, parse.sel);\n if (sel && !sel.eq(view.state.selection)) {\n let tr = view.state.tr.setSelection(sel);\n if (compositionID)\n tr.setMeta(\"composition\", compositionID);\n view.dispatch(tr);\n }\n }\n return;\n }\n }\n // Handle the case where overwriting a selection by typing matches\n // the start or end of the selected content, creating a change\n // that's smaller than what was actually overwritten.\n if (view.state.selection.from < view.state.selection.to &&\n change.start == change.endB &&\n view.state.selection instanceof TextSelection) {\n if (change.start > view.state.selection.from && change.start <= view.state.selection.from + 2 &&\n view.state.selection.from >= parse.from) {\n change.start = view.state.selection.from;\n }\n else if (change.endA < view.state.selection.to && change.endA >= view.state.selection.to - 2 &&\n view.state.selection.to <= parse.to) {\n change.endB += (view.state.selection.to - change.endA);\n change.endA = view.state.selection.to;\n }\n }\n // IE11 will insert a non-breaking space _ahead_ of the space after\n // the cursor space when adding a space before another space. When\n // that happened, adjust the change to cover the space instead.\n if (ie && ie_version <= 11 && change.endB == change.start + 1 &&\n change.endA == change.start && change.start > parse.from &&\n parse.doc.textBetween(change.start - parse.from - 1, change.start - parse.from + 1) == \" \\u00a0\") {\n change.start--;\n change.endA--;\n change.endB--;\n }\n let $from = parse.doc.resolveNoCache(change.start - parse.from);\n let $to = parse.doc.resolveNoCache(change.endB - parse.from);\n let $fromA = doc.resolve(change.start);\n let inlineChange = $from.sameParent($to) && $from.parent.inlineContent && $fromA.end() >= change.endA;\n let nextSel;\n // If this looks like the effect of pressing Enter (or was recorded\n // as being an iOS enter press), just dispatch an Enter key instead.\n if (((ios && view.input.lastIOSEnter > Date.now() - 225 &&\n (!inlineChange || addedNodes.some(n => n.nodeName == \"DIV\" || n.nodeName == \"P\"))) ||\n (!inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) &&\n (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&\n nextSel.head == $to.pos)) &&\n view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")))) {\n view.input.lastIOSEnter = 0;\n return;\n }\n // Same for backspace\n if (view.state.selection.anchor > change.start &&\n looksLikeBackspace(doc, change.start, change.endA, $from, $to) &&\n view.someProp(\"handleKeyDown\", f => f(view, keyEvent(8, \"Backspace\")))) {\n if (android && chrome)\n view.domObserver.suppressSelectionUpdates(); // #820\n return;\n }\n // Chrome will occasionally, during composition, delete the\n // entire composition and then immediately insert it again. This is\n // used to detect that situation.\n if (chrome && change.endB == change.start)\n view.input.lastChromeDelete = Date.now();\n // This tries to detect Android virtual keyboard\n // enter-and-pick-suggestion action. That sometimes (see issue\n // #1059) first fires a DOM mutation, before moving the selection to\n // the newly created block. And then, because ProseMirror cleans up\n // the DOM selection, it gives up moving the selection entirely,\n // leaving the cursor in the wrong place. When that happens, we drop\n // the new paragraph from the initial change, and fire a simulated\n // enter key afterwards.\n if (android && !inlineChange && $from.start() != $to.start() && $to.parentOffset == 0 && $from.depth == $to.depth &&\n parse.sel && parse.sel.anchor == parse.sel.head && parse.sel.head == change.endA) {\n change.endB -= 2;\n $to = parse.doc.resolveNoCache(change.endB - parse.from);\n setTimeout(() => {\n view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n }, 20);\n }\n let chFrom = change.start, chTo = change.endA;\n let tr, storedMarks, markChange;\n if (inlineChange) {\n if ($from.pos == $to.pos) { // Deletion\n // IE11 sometimes weirdly moves the DOM selection around after\n // backspacing out the first element in a textblock\n if (ie && ie_version <= 11 && $from.parentOffset == 0) {\n view.domObserver.suppressSelectionUpdates();\n setTimeout(() => selectionToDOM(view), 20);\n }\n tr = view.state.tr.delete(chFrom, chTo);\n storedMarks = doc.resolve(change.start).marksAcross(doc.resolve(change.endA));\n }\n else if ( // Adding or removing a mark\n change.endA == change.endB &&\n (markChange = isMarkChange($from.parent.content.cut($from.parentOffset, $to.parentOffset), $fromA.parent.content.cut($fromA.parentOffset, change.endA - $fromA.start())))) {\n tr = view.state.tr;\n if (markChange.type == \"add\")\n tr.addMark(chFrom, chTo, markChange.mark);\n else\n tr.removeMark(chFrom, chTo, markChange.mark);\n }\n else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) {\n // Both positions in the same text node -- simply insert text\n let text = $from.parent.textBetween($from.parentOffset, $to.parentOffset);\n if (view.someProp(\"handleTextInput\", f => f(view, chFrom, chTo, text)))\n return;\n tr = view.state.tr.insertText(text, chFrom, chTo);\n }\n }\n if (!tr)\n tr = view.state.tr.replace(chFrom, chTo, parse.doc.slice(change.start - parse.from, change.endB - parse.from));\n if (parse.sel) {\n let sel = resolveSelection(view, tr.doc, parse.sel);\n // Chrome will sometimes, during composition, report the\n // selection in the wrong place. If it looks like that is\n // happening, don't update the selection.\n // Edge just doesn't move the cursor forward when you start typing\n // in an empty block or between br nodes.\n if (sel && !(chrome && view.composing && sel.empty &&\n (change.start != change.endB || view.input.lastChromeDelete < Date.now() - 100) &&\n (sel.head == chFrom || sel.head == tr.mapping.map(chTo) - 1) ||\n ie && sel.empty && sel.head == chFrom))\n tr.setSelection(sel);\n }\n if (storedMarks)\n tr.ensureMarks(storedMarks);\n if (compositionID)\n tr.setMeta(\"composition\", compositionID);\n view.dispatch(tr.scrollIntoView());\n}\nfunction resolveSelection(view, doc, parsedSel) {\n if (Math.max(parsedSel.anchor, parsedSel.head) > doc.content.size)\n return null;\n return selectionBetween(view, doc.resolve(parsedSel.anchor), doc.resolve(parsedSel.head));\n}\n// Given two same-length, non-empty fragments of inline content,\n// determine whether the first could be created from the second by\n// removing or adding a single mark type.\nfunction isMarkChange(cur, prev) {\n let curMarks = cur.firstChild.marks, prevMarks = prev.firstChild.marks;\n let added = curMarks, removed = prevMarks, type, mark, update;\n for (let i = 0; i < prevMarks.length; i++)\n added = prevMarks[i].removeFromSet(added);\n for (let i = 0; i < curMarks.length; i++)\n removed = curMarks[i].removeFromSet(removed);\n if (added.length == 1 && removed.length == 0) {\n mark = added[0];\n type = \"add\";\n update = (node) => node.mark(mark.addToSet(node.marks));\n }\n else if (added.length == 0 && removed.length == 1) {\n mark = removed[0];\n type = \"remove\";\n update = (node) => node.mark(mark.removeFromSet(node.marks));\n }\n else {\n return null;\n }\n let updated = [];\n for (let i = 0; i < prev.childCount; i++)\n updated.push(update(prev.child(i)));\n if (Fragment.from(updated).eq(cur))\n return { mark, type };\n}\nfunction looksLikeBackspace(old, start, end, $newStart, $newEnd) {\n if ( // The content must have shrunk\n end - start <= $newEnd.pos - $newStart.pos ||\n // newEnd must point directly at or after the end of the block that newStart points into\n skipClosingAndOpening($newStart, true, false) < $newEnd.pos)\n return false;\n let $start = old.resolve(start);\n // Handle the case where, rather than joining blocks, the change just removed an entire block\n if (!$newStart.parent.isTextblock) {\n let after = $start.nodeAfter;\n return after != null && end == start + after.nodeSize;\n }\n // Start must be at the end of a block\n if ($start.parentOffset < $start.parent.content.size || !$start.parent.isTextblock)\n return false;\n let $next = old.resolve(skipClosingAndOpening($start, true, true));\n // The next textblock must start before end and end near it\n if (!$next.parent.isTextblock || $next.pos > end ||\n skipClosingAndOpening($next, true, false) < end)\n return false;\n // The fragments after the join point must match\n return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content);\n}\nfunction skipClosingAndOpening($pos, fromEnd, mayOpen) {\n let depth = $pos.depth, end = fromEnd ? $pos.end() : $pos.pos;\n while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) {\n depth--;\n end++;\n fromEnd = false;\n }\n if (mayOpen) {\n let next = $pos.node(depth).maybeChild($pos.indexAfter(depth));\n while (next && !next.isLeaf) {\n next = next.firstChild;\n end++;\n }\n }\n return end;\n}\nfunction findDiff(a, b, pos, preferredPos, preferredSide) {\n let start = a.findDiffStart(b, pos);\n if (start == null)\n return null;\n let { a: endA, b: endB } = a.findDiffEnd(b, pos + a.size, pos + b.size);\n if (preferredSide == \"end\") {\n let adjust = Math.max(0, start - Math.min(endA, endB));\n preferredPos -= endA + adjust - start;\n }\n if (endA < start && a.size < b.size) {\n let move = preferredPos <= start && preferredPos >= endA ? start - preferredPos : 0;\n start -= move;\n if (start && start < b.size && isSurrogatePair(b.textBetween(start - 1, start + 1)))\n start += move ? 1 : -1;\n endB = start + (endB - endA);\n endA = start;\n }\n else if (endB < start) {\n let move = preferredPos <= start && preferredPos >= endB ? start - preferredPos : 0;\n start -= move;\n if (start && start < a.size && isSurrogatePair(a.textBetween(start - 1, start + 1)))\n start += move ? 1 : -1;\n endA = start + (endA - endB);\n endB = start;\n }\n return { start, endA, endB };\n}\nfunction isSurrogatePair(str) {\n if (str.length != 2)\n return false;\n let a = str.charCodeAt(0), b = str.charCodeAt(1);\n return a >= 0xDC00 && a <= 0xDFFF && b >= 0xD800 && b <= 0xDBFF;\n}\n\n/**\n@internal\n*/\nconst __parseFromClipboard = parseFromClipboard;\n/**\n@internal\n*/\nconst __endComposition = endComposition;\n/**\nAn editor view manages the DOM structure that represents an\neditable document. Its state and behavior are determined by its\n[props](https://prosemirror.net/docs/ref/#view.DirectEditorProps).\n*/\nclass EditorView {\n /**\n Create a view. `place` may be a DOM node that the editor should\n be appended to, a function that will place it into the document,\n or an object whose `mount` property holds the node to use as the\n document container. If it is `null`, the editor will not be\n added to the document.\n */\n constructor(place, props) {\n this._root = null;\n /**\n @internal\n */\n this.focused = false;\n /**\n Kludge used to work around a Chrome bug @internal\n */\n this.trackWrites = null;\n this.mounted = false;\n /**\n @internal\n */\n this.markCursor = null;\n /**\n @internal\n */\n this.cursorWrapper = null;\n /**\n @internal\n */\n this.lastSelectedViewDesc = undefined;\n /**\n @internal\n */\n this.input = new InputState;\n this.prevDirectPlugins = [];\n this.pluginViews = [];\n /**\n Holds `true` when a hack node is needed in Firefox to prevent the\n [space is eaten issue](https://github.com/ProseMirror/prosemirror/issues/651)\n @internal\n */\n this.requiresGeckoHackNode = false;\n /**\n When editor content is being dragged, this object contains\n information about the dragged slice and whether it is being\n copied or moved. At any other time, it is null.\n */\n this.dragging = null;\n this._props = props;\n this.state = props.state;\n this.directPlugins = props.plugins || [];\n this.directPlugins.forEach(checkStateComponent);\n this.dispatch = this.dispatch.bind(this);\n this.dom = (place && place.mount) || document.createElement(\"div\");\n if (place) {\n if (place.appendChild)\n place.appendChild(this.dom);\n else if (typeof place == \"function\")\n place(this.dom);\n else if (place.mount)\n this.mounted = true;\n }\n this.editable = getEditable(this);\n updateCursorWrapper(this);\n this.nodeViews = buildNodeViews(this);\n this.docView = docViewDesc(this.state.doc, computeDocDeco(this), viewDecorations(this), this.dom, this);\n this.domObserver = new DOMObserver(this, (from, to, typeOver, added) => readDOMChange(this, from, to, typeOver, added));\n this.domObserver.start();\n initInput(this);\n this.updatePluginViews();\n }\n /**\n Holds `true` when a\n [composition](https://w3c.github.io/uievents/#events-compositionevents)\n is active.\n */\n get composing() { return this.input.composing; }\n /**\n The view's current [props](https://prosemirror.net/docs/ref/#view.EditorProps).\n */\n get props() {\n if (this._props.state != this.state) {\n let prev = this._props;\n this._props = {};\n for (let name in prev)\n this._props[name] = prev[name];\n this._props.state = this.state;\n }\n return this._props;\n }\n /**\n Update the view's props. Will immediately cause an update to\n the DOM.\n */\n update(props) {\n if (props.handleDOMEvents != this._props.handleDOMEvents)\n ensureListeners(this);\n let prevProps = this._props;\n this._props = props;\n if (props.plugins) {\n props.plugins.forEach(checkStateComponent);\n this.directPlugins = props.plugins;\n }\n this.updateStateInner(props.state, prevProps);\n }\n /**\n Update the view by updating existing props object with the object\n given as argument. Equivalent to `view.update(Object.assign({},\n view.props, props))`.\n */\n setProps(props) {\n let updated = {};\n for (let name in this._props)\n updated[name] = this._props[name];\n updated.state = this.state;\n for (let name in props)\n updated[name] = props[name];\n this.update(updated);\n }\n /**\n Update the editor's `state` prop, without touching any of the\n other props.\n */\n updateState(state) {\n this.updateStateInner(state, this._props);\n }\n updateStateInner(state, prevProps) {\n var _a;\n let prev = this.state, redraw = false, updateSel = false;\n // When stored marks are added, stop composition, so that they can\n // be displayed.\n if (state.storedMarks && this.composing) {\n clearComposition(this);\n updateSel = true;\n }\n this.state = state;\n let pluginsChanged = prev.plugins != state.plugins || this._props.plugins != prevProps.plugins;\n if (pluginsChanged || this._props.plugins != prevProps.plugins || this._props.nodeViews != prevProps.nodeViews) {\n let nodeViews = buildNodeViews(this);\n if (changedNodeViews(nodeViews, this.nodeViews)) {\n this.nodeViews = nodeViews;\n redraw = true;\n }\n }\n if (pluginsChanged || prevProps.handleDOMEvents != this._props.handleDOMEvents) {\n ensureListeners(this);\n }\n this.editable = getEditable(this);\n updateCursorWrapper(this);\n let innerDeco = viewDecorations(this), outerDeco = computeDocDeco(this);\n let scroll = prev.plugins != state.plugins && !prev.doc.eq(state.doc) ? \"reset\"\n : state.scrollToSelection > prev.scrollToSelection ? \"to selection\" : \"preserve\";\n let updateDoc = redraw || !this.docView.matchesNode(state.doc, outerDeco, innerDeco);\n if (updateDoc || !state.selection.eq(prev.selection))\n updateSel = true;\n let oldScrollPos = scroll == \"preserve\" && updateSel && this.dom.style.overflowAnchor == null && storeScrollPos(this);\n if (updateSel) {\n this.domObserver.stop();\n // Work around an issue in Chrome, IE, and Edge where changing\n // the DOM around an active selection puts it into a broken\n // state where the thing the user sees differs from the\n // selection reported by the Selection object (#710, #973,\n // #1011, #1013, #1035).\n let forceSelUpdate = updateDoc && (ie || chrome) && !this.composing &&\n !prev.selection.empty && !state.selection.empty && selectionContextChanged(prev.selection, state.selection);\n if (updateDoc) {\n // If the node that the selection points into is written to,\n // Chrome sometimes starts misreporting the selection, so this\n // tracks that and forces a selection reset when our update\n // did write to the node.\n let chromeKludge = chrome ? (this.trackWrites = this.domSelectionRange().focusNode) : null;\n if (this.composing)\n this.input.compositionNode = findCompositionNode(this);\n if (redraw || !this.docView.update(state.doc, outerDeco, innerDeco, this)) {\n this.docView.updateOuterDeco(outerDeco);\n this.docView.destroy();\n this.docView = docViewDesc(state.doc, outerDeco, innerDeco, this.dom, this);\n }\n if (chromeKludge && !this.trackWrites)\n forceSelUpdate = true;\n }\n // Work around for an issue where an update arriving right between\n // a DOM selection change and the \"selectionchange\" event for it\n // can cause a spurious DOM selection update, disrupting mouse\n // drag selection.\n if (forceSelUpdate ||\n !(this.input.mouseDown && this.domObserver.currentSelection.eq(this.domSelectionRange()) &&\n anchorInRightPlace(this))) {\n selectionToDOM(this, forceSelUpdate);\n }\n else {\n syncNodeSelection(this, state.selection);\n this.domObserver.setCurSelection();\n }\n this.domObserver.start();\n }\n this.updatePluginViews(prev);\n if (((_a = this.dragging) === null || _a === void 0 ? void 0 : _a.node) && !prev.doc.eq(state.doc))\n this.updateDraggedNode(this.dragging, prev);\n if (scroll == \"reset\") {\n this.dom.scrollTop = 0;\n }\n else if (scroll == \"to selection\") {\n this.scrollToSelection();\n }\n else if (oldScrollPos) {\n resetScrollPos(oldScrollPos);\n }\n }\n /**\n @internal\n */\n scrollToSelection() {\n let startDOM = this.domSelectionRange().focusNode;\n if (!startDOM || !this.dom.contains(startDOM.nodeType == 1 ? startDOM : startDOM.parentNode)) ;\n else if (this.someProp(\"handleScrollToSelection\", f => f(this))) ;\n else if (this.state.selection instanceof NodeSelection) {\n let target = this.docView.domAfterPos(this.state.selection.from);\n if (target.nodeType == 1)\n scrollRectIntoView(this, target.getBoundingClientRect(), startDOM);\n }\n else {\n scrollRectIntoView(this, this.coordsAtPos(this.state.selection.head, 1), startDOM);\n }\n }\n destroyPluginViews() {\n let view;\n while (view = this.pluginViews.pop())\n if (view.destroy)\n view.destroy();\n }\n updatePluginViews(prevState) {\n if (!prevState || prevState.plugins != this.state.plugins || this.directPlugins != this.prevDirectPlugins) {\n this.prevDirectPlugins = this.directPlugins;\n this.destroyPluginViews();\n for (let i = 0; i < this.directPlugins.length; i++) {\n let plugin = this.directPlugins[i];\n if (plugin.spec.view)\n this.pluginViews.push(plugin.spec.view(this));\n }\n for (let i = 0; i < this.state.plugins.length; i++) {\n let plugin = this.state.plugins[i];\n if (plugin.spec.view)\n this.pluginViews.push(plugin.spec.view(this));\n }\n }\n else {\n for (let i = 0; i < this.pluginViews.length; i++) {\n let pluginView = this.pluginViews[i];\n if (pluginView.update)\n pluginView.update(this, prevState);\n }\n }\n }\n updateDraggedNode(dragging, prev) {\n let sel = dragging.node, found = -1;\n if (this.state.doc.nodeAt(sel.from) == sel.node) {\n found = sel.from;\n }\n else {\n let movedPos = sel.from + (this.state.doc.content.size - prev.doc.content.size);\n let moved = movedPos > 0 && this.state.doc.nodeAt(movedPos);\n if (moved == sel.node)\n found = movedPos;\n }\n this.dragging = new Dragging(dragging.slice, dragging.move, found < 0 ? undefined : NodeSelection.create(this.state.doc, found));\n }\n someProp(propName, f) {\n let prop = this._props && this._props[propName], value;\n if (prop != null && (value = f ? f(prop) : prop))\n return value;\n for (let i = 0; i < this.directPlugins.length; i++) {\n let prop = this.directPlugins[i].props[propName];\n if (prop != null && (value = f ? f(prop) : prop))\n return value;\n }\n let plugins = this.state.plugins;\n if (plugins)\n for (let i = 0; i < plugins.length; i++) {\n let prop = plugins[i].props[propName];\n if (prop != null && (value = f ? f(prop) : prop))\n return value;\n }\n }\n /**\n Query whether the view has focus.\n */\n hasFocus() {\n // Work around IE not handling focus correctly if resize handles are shown.\n // If the cursor is inside an element with resize handles, activeElement\n // will be that element instead of this.dom.\n if (ie) {\n // If activeElement is within this.dom, and there are no other elements\n // setting `contenteditable` to false in between, treat it as focused.\n let node = this.root.activeElement;\n if (node == this.dom)\n return true;\n if (!node || !this.dom.contains(node))\n return false;\n while (node && this.dom != node && this.dom.contains(node)) {\n if (node.contentEditable == 'false')\n return false;\n node = node.parentElement;\n }\n return true;\n }\n return this.root.activeElement == this.dom;\n }\n /**\n Focus the editor.\n */\n focus() {\n this.domObserver.stop();\n if (this.editable)\n focusPreventScroll(this.dom);\n selectionToDOM(this);\n this.domObserver.start();\n }\n /**\n Get the document root in which the editor exists. This will\n usually be the top-level `document`, but might be a [shadow\n DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM)\n root if the editor is inside one.\n */\n get root() {\n let cached = this._root;\n if (cached == null)\n for (let search = this.dom.parentNode; search; search = search.parentNode) {\n if (search.nodeType == 9 || (search.nodeType == 11 && search.host)) {\n if (!search.getSelection)\n Object.getPrototypeOf(search).getSelection = () => search.ownerDocument.getSelection();\n return this._root = search;\n }\n }\n return cached || document;\n }\n /**\n When an existing editor view is moved to a new document or\n shadow tree, call this to make it recompute its root.\n */\n updateRoot() {\n this._root = null;\n }\n /**\n Given a pair of viewport coordinates, return the document\n position that corresponds to them. May return null if the given\n coordinates aren't inside of the editor. When an object is\n returned, its `pos` property is the position nearest to the\n coordinates, and its `inside` property holds the position of the\n inner node that the position falls inside of, or -1 if it is at\n the top level, not in any node.\n */\n posAtCoords(coords) {\n return posAtCoords(this, coords);\n }\n /**\n Returns the viewport rectangle at a given document position.\n `left` and `right` will be the same number, as this returns a\n flat cursor-ish rectangle. If the position is between two things\n that aren't directly adjacent, `side` determines which element\n is used. When < 0, the element before the position is used,\n otherwise the element after.\n */\n coordsAtPos(pos, side = 1) {\n return coordsAtPos(this, pos, side);\n }\n /**\n Find the DOM position that corresponds to the given document\n position. When `side` is negative, find the position as close as\n possible to the content before the position. When positive,\n prefer positions close to the content after the position. When\n zero, prefer as shallow a position as possible.\n \n Note that you should **not** mutate the editor's internal DOM,\n only inspect it (and even that is usually not necessary).\n */\n domAtPos(pos, side = 0) {\n return this.docView.domFromPos(pos, side);\n }\n /**\n Find the DOM node that represents the document node after the\n given position. May return `null` when the position doesn't point\n in front of a node or if the node is inside an opaque node view.\n \n This is intended to be able to call things like\n `getBoundingClientRect` on that DOM node. Do **not** mutate the\n editor DOM directly, or add styling this way, since that will be\n immediately overriden by the editor as it redraws the node.\n */\n nodeDOM(pos) {\n let desc = this.docView.descAt(pos);\n return desc ? desc.nodeDOM : null;\n }\n /**\n Find the document position that corresponds to a given DOM\n position. (Whenever possible, it is preferable to inspect the\n document structure directly, rather than poking around in the\n DOM, but sometimes—for example when interpreting an event\n target—you don't have a choice.)\n \n The `bias` parameter can be used to influence which side of a DOM\n node to use when the position is inside a leaf node.\n */\n posAtDOM(node, offset, bias = -1) {\n let pos = this.docView.posFromDOM(node, offset, bias);\n if (pos == null)\n throw new RangeError(\"DOM position not inside the editor\");\n return pos;\n }\n /**\n Find out whether the selection is at the end of a textblock when\n moving in a given direction. When, for example, given `\"left\"`,\n it will return true if moving left from the current cursor\n position would leave that position's parent textblock. Will apply\n to the view's current state by default, but it is possible to\n pass a different state.\n */\n endOfTextblock(dir, state) {\n return endOfTextblock(this, state || this.state, dir);\n }\n /**\n Run the editor's paste logic with the given HTML string. The\n `event`, if given, will be passed to the\n [`handlePaste`](https://prosemirror.net/docs/ref/#view.EditorProps.handlePaste) hook.\n */\n pasteHTML(html, event) {\n return doPaste(this, \"\", html, false, event || new ClipboardEvent(\"paste\"));\n }\n /**\n Run the editor's paste logic with the given plain-text input.\n */\n pasteText(text, event) {\n return doPaste(this, text, null, true, event || new ClipboardEvent(\"paste\"));\n }\n /**\n Serialize the given slice as it would be if it was copied from\n this editor. Returns a DOM element that contains a\n representation of the slice as its children, a textual\n representation, and the transformed slice (which can be\n different from the given input due to hooks like\n [`transformCopied`](https://prosemirror.net/docs/ref/#view.EditorProps.transformCopied)).\n */\n serializeForClipboard(slice) {\n return serializeForClipboard(this, slice);\n }\n /**\n Removes the editor from the DOM and destroys all [node\n views](https://prosemirror.net/docs/ref/#view.NodeView).\n */\n destroy() {\n if (!this.docView)\n return;\n destroyInput(this);\n this.destroyPluginViews();\n if (this.mounted) {\n this.docView.update(this.state.doc, [], viewDecorations(this), this);\n this.dom.textContent = \"\";\n }\n else if (this.dom.parentNode) {\n this.dom.parentNode.removeChild(this.dom);\n }\n this.docView.destroy();\n this.docView = null;\n clearReusedRange();\n }\n /**\n This is true when the view has been\n [destroyed](https://prosemirror.net/docs/ref/#view.EditorView.destroy) (and thus should not be\n used anymore).\n */\n get isDestroyed() {\n return this.docView == null;\n }\n /**\n Used for testing.\n */\n dispatchEvent(event) {\n return dispatchEvent(this, event);\n }\n /**\n Dispatch a transaction. Will call\n [`dispatchTransaction`](https://prosemirror.net/docs/ref/#view.DirectEditorProps.dispatchTransaction)\n when given, and otherwise defaults to applying the transaction to\n the current state and calling\n [`updateState`](https://prosemirror.net/docs/ref/#view.EditorView.updateState) with the result.\n This method is bound to the view instance, so that it can be\n easily passed around.\n */\n dispatch(tr) {\n let dispatchTransaction = this._props.dispatchTransaction;\n if (dispatchTransaction)\n dispatchTransaction.call(this, tr);\n else\n this.updateState(this.state.apply(tr));\n }\n /**\n @internal\n */\n domSelectionRange() {\n let sel = this.domSelection();\n if (!sel)\n return { focusNode: null, focusOffset: 0, anchorNode: null, anchorOffset: 0 };\n return safari && this.root.nodeType === 11 &&\n deepActiveElement(this.dom.ownerDocument) == this.dom && safariShadowSelectionRange(this, sel) || sel;\n }\n /**\n @internal\n */\n domSelection() {\n return this.root.getSelection();\n }\n}\nfunction computeDocDeco(view) {\n let attrs = Object.create(null);\n attrs.class = \"ProseMirror\";\n attrs.contenteditable = String(view.editable);\n view.someProp(\"attributes\", value => {\n if (typeof value == \"function\")\n value = value(view.state);\n if (value)\n for (let attr in value) {\n if (attr == \"class\")\n attrs.class += \" \" + value[attr];\n else if (attr == \"style\")\n attrs.style = (attrs.style ? attrs.style + \";\" : \"\") + value[attr];\n else if (!attrs[attr] && attr != \"contenteditable\" && attr != \"nodeName\")\n attrs[attr] = String(value[attr]);\n }\n });\n if (!attrs.translate)\n attrs.translate = \"no\";\n return [Decoration.node(0, view.state.doc.content.size, attrs)];\n}\nfunction updateCursorWrapper(view) {\n if (view.markCursor) {\n let dom = document.createElement(\"img\");\n dom.className = \"ProseMirror-separator\";\n dom.setAttribute(\"mark-placeholder\", \"true\");\n dom.setAttribute(\"alt\", \"\");\n view.cursorWrapper = { dom, deco: Decoration.widget(view.state.selection.from, dom, { raw: true, marks: view.markCursor }) };\n }\n else {\n view.cursorWrapper = null;\n }\n}\nfunction getEditable(view) {\n return !view.someProp(\"editable\", value => value(view.state) === false);\n}\nfunction selectionContextChanged(sel1, sel2) {\n let depth = Math.min(sel1.$anchor.sharedDepth(sel1.head), sel2.$anchor.sharedDepth(sel2.head));\n return sel1.$anchor.start(depth) != sel2.$anchor.start(depth);\n}\nfunction buildNodeViews(view) {\n let result = Object.create(null);\n function add(obj) {\n for (let prop in obj)\n if (!Object.prototype.hasOwnProperty.call(result, prop))\n result[prop] = obj[prop];\n }\n view.someProp(\"nodeViews\", add);\n view.someProp(\"markViews\", add);\n return result;\n}\nfunction changedNodeViews(a, b) {\n let nA = 0, nB = 0;\n for (let prop in a) {\n if (a[prop] != b[prop])\n return true;\n nA++;\n }\n for (let _ in b)\n nB++;\n return nA != nB;\n}\nfunction checkStateComponent(plugin) {\n if (plugin.spec.state || plugin.spec.filterTransaction || plugin.spec.appendTransaction)\n throw new RangeError(\"Plugins passed directly to the view must not have a state component\");\n}\n\nexport { Decoration, DecorationSet, EditorView, __endComposition, __parseFromClipboard };\n","/**\n * Common Math expressions.\n *\n * @module math\n */\n\nexport const floor = Math.floor\nexport const ceil = Math.ceil\nexport const abs = Math.abs\nexport const imul = Math.imul\nexport const round = Math.round\nexport const log10 = Math.log10\nexport const log2 = Math.log2\nexport const log = Math.log\nexport const sqrt = Math.sqrt\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The sum of a and b\n */\nexport const add = (a, b) => a + b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The smaller element of a and b\n */\nexport const min = (a, b) => a < b ? a : b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The bigger element of a and b\n */\nexport const max = (a, b) => a > b ? a : b\n\nexport const isNaN = Number.isNaN\n\nexport const pow = Math.pow\n/**\n * Base 10 exponential function. Returns the value of 10 raised to the power of pow.\n *\n * @param {number} exp\n * @return {number}\n */\nexport const exp10 = exp => Math.pow(10, exp)\n\nexport const sign = Math.sign\n\n/**\n * @param {number} n\n * @return {boolean} Wether n is negative. This function also differentiates between -0 and +0\n */\nexport const isNegativeZero = n => n !== 0 ? n < 0 : 1 / n < 0\n","/**\n * Utility module to work with sets.\n *\n * @module set\n */\n\nexport const create = () => new Set()\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {Array<T>}\n */\nexport const toArray = set => Array.from(set)\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {T}\n */\nexport const first = set =>\n set.values().next().value ?? undefined\n\n/**\n * @template T\n * @param {Iterable<T>} entries\n * @return {Set<T>}\n */\nexport const from = entries => new Set(entries)\n","import * as array from './array.js'\n\n/**\n * Utility module to work with strings.\n *\n * @module string\n */\n\nexport const fromCharCode = String.fromCharCode\nexport const fromCodePoint = String.fromCodePoint\n\n/**\n * The largest utf16 character.\n * Corresponds to Uint8Array([255, 255]) or charcodeof(2x2^8)\n */\nexport const MAX_UTF16_CHARACTER = fromCharCode(65535)\n\n/**\n * @param {string} s\n * @return {string}\n */\nconst toLowerCase = s => s.toLowerCase()\n\nconst trimLeftRegex = /^\\s*/g\n\n/**\n * @param {string} s\n * @return {string}\n */\nexport const trimLeft = s => s.replace(trimLeftRegex, '')\n\nconst fromCamelCaseRegex = /([A-Z])/g\n\n/**\n * @param {string} s\n * @param {string} separator\n * @return {string}\n */\nexport const fromCamelCase = (s, separator) => trimLeft(s.replace(fromCamelCaseRegex, match => `${separator}${toLowerCase(match)}`))\n\n/**\n * Compute the utf8ByteLength\n * @param {string} str\n * @return {number}\n */\nexport const utf8ByteLength = str => unescape(encodeURIComponent(str)).length\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\nexport const _encodeUtf8Polyfill = str => {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n const buf = new Uint8Array(len)\n for (let i = 0; i < len; i++) {\n buf[i] = /** @type {number} */ (encodedString.codePointAt(i))\n }\n return buf\n}\n\n/* c8 ignore next */\nexport const utf8TextEncoder = /** @type {TextEncoder} */ (typeof TextEncoder !== 'undefined' ? new TextEncoder() : null)\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\nexport const _encodeUtf8Native = str => utf8TextEncoder.encode(str)\n\n/**\n * @param {string} str\n * @return {Uint8Array}\n */\n/* c8 ignore next */\nexport const encodeUtf8 = utf8TextEncoder ? _encodeUtf8Native : _encodeUtf8Polyfill\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Polyfill = buf => {\n let remainingLen = buf.length\n let encodedString = ''\n let bufPos = 0\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n const bytes = buf.subarray(bufPos, bufPos + nextLen)\n bufPos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n encodedString += String.fromCodePoint.apply(null, /** @type {any} */ (bytes))\n remainingLen -= nextLen\n }\n return decodeURIComponent(escape(encodedString))\n}\n\n/* c8 ignore next */\nexport let utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf-8', { fatal: true, ignoreBOM: true })\n\n/* c8 ignore start */\nif (utf8TextDecoder && utf8TextDecoder.decode(new Uint8Array()).length === 1) {\n // Safari doesn't handle BOM correctly.\n // This fixes a bug in Safari 13.0.5 where it produces a BOM the first time it is called.\n // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the first call and\n // utf8TextDecoder.decode(new Uint8Array()).length === 1 on the second call\n // Another issue is that from then on no BOM chars are recognized anymore\n /* c8 ignore next */\n utf8TextDecoder = null\n}\n/* c8 ignore stop */\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\nexport const _decodeUtf8Native = buf => /** @type {TextDecoder} */ (utf8TextDecoder).decode(buf)\n\n/**\n * @param {Uint8Array} buf\n * @return {string}\n */\n/* c8 ignore next */\nexport const decodeUtf8 = utf8TextDecoder ? _decodeUtf8Native : _decodeUtf8Polyfill\n\n/**\n * @param {string} str The initial string\n * @param {number} index Starting position\n * @param {number} remove Number of characters to remove\n * @param {string} insert New content to insert\n */\nexport const splice = (str, index, remove, insert = '') => str.slice(0, index) + insert + str.slice(index + remove)\n\n/**\n * @param {string} source\n * @param {number} n\n */\nexport const repeat = (source, n) => array.unfold(n, () => source).join('')\n","/**\n * Error helpers.\n *\n * @module error\n */\n\n/**\n * @param {string} s\n * @return {Error}\n */\n/* c8 ignore next */\nexport const create = s => new Error(s)\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const methodUnimplemented = () => {\n throw create('Method unimplemented')\n}\n\n/**\n * @throws {Error}\n * @return {never}\n */\n/* c8 ignore next 3 */\nexport const unexpectedCase = () => {\n throw create('Unexpected case')\n}\n","/**\n * Utility module to work with key-value stores.\n *\n * @module map\n */\n\n/**\n * Creates a new Map instance.\n *\n * @function\n * @return {Map<any, any>}\n *\n * @function\n */\nexport const create = () => new Map()\n\n/**\n * Copy a Map object into a fresh Map object.\n *\n * @function\n * @template K,V\n * @param {Map<K,V>} m\n * @return {Map<K,V>}\n */\nexport const copy = m => {\n const r = create()\n m.forEach((v, k) => { r.set(k, v) })\n return r\n}\n\n/**\n * Get map property. Create T if property is undefined and set T on map.\n *\n * ```js\n * const listeners = map.setIfUndefined(events, 'eventName', set.create)\n * listeners.add(listener)\n * ```\n *\n * @function\n * @template {Map<any, any>} MAP\n * @template {MAP extends Map<any,infer V> ? function():V : unknown} CF\n * @param {MAP} map\n * @param {MAP extends Map<infer K,any> ? K : unknown} key\n * @param {CF} createT\n * @return {ReturnType<CF>}\n */\nexport const setIfUndefined = (map, key, createT) => {\n let set = map.get(key)\n if (set === undefined) {\n map.set(key, set = createT())\n }\n return set\n}\n\n/**\n * Creates an Array and populates it with the content of all key-value pairs using the `f(value, key)` function.\n *\n * @function\n * @template K\n * @template V\n * @template R\n * @param {Map<K,V>} m\n * @param {function(V,K):R} f\n * @return {Array<R>}\n */\nexport const map = (m, f) => {\n const res = []\n for (const [key, value] of m) {\n res.push(f(value, key))\n }\n return res\n}\n\n/**\n * Tests whether any key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @todo should rename to some - similarly to Array.some\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const any = (m, f) => {\n for (const [key, value] of m) {\n if (f(value, key)) {\n return true\n }\n }\n return false\n}\n\n/**\n * Tests whether all key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const all = (m, f) => {\n for (const [key, value] of m) {\n if (!f(value, key)) {\n return false\n }\n }\n return true\n}\n","/**\n * Utility functions for working with EcmaScript objects.\n *\n * @module object\n */\n\n/**\n * @return {Object<string,any>} obj\n */\nexport const create = () => Object.create(null)\n\n/**\n * Object.assign\n */\nexport const assign = Object.assign\n\n/**\n * @param {Object<string,any>} obj\n */\nexport const keys = Object.keys\n\n/**\n * @template V\n * @param {{[k:string]:V}} obj\n * @param {function(V,string):any} f\n */\nexport const forEach = (obj, f) => {\n for (const key in obj) {\n f(obj[key], key)\n }\n}\n\n/**\n * @todo implement mapToArray & map\n *\n * @template R\n * @param {Object<string,any>} obj\n * @param {function(any,string):R} f\n * @return {Array<R>}\n */\nexport const map = (obj, f) => {\n const results = []\n for (const key in obj) {\n results.push(f(obj[key], key))\n }\n return results\n}\n\n/**\n * @deprecated use object.size instead\n * @param {Object<string,any>} obj\n * @return {number}\n */\nexport const length = obj => keys(obj).length\n\n/**\n * @param {Object<string,any>} obj\n * @return {number}\n */\nexport const size = obj => keys(obj).length\n\n/**\n * @param {Object<string,any>} obj\n * @param {function(any,string):boolean} f\n * @return {boolean}\n */\nexport const some = (obj, f) => {\n for (const key in obj) {\n if (f(obj[key], key)) {\n return true\n }\n }\n return false\n}\n\n/**\n * @param {Object|undefined} obj\n */\nexport const isEmpty = obj => {\n // eslint-disable-next-line\n for (const _k in obj) {\n return false\n }\n return true\n}\n\n/**\n * @param {Object<string,any>} obj\n * @param {function(any,string):boolean} f\n * @return {boolean}\n */\nexport const every = (obj, f) => {\n for (const key in obj) {\n if (!f(obj[key], key)) {\n return false\n }\n }\n return true\n}\n\n/**\n * Calls `Object.prototype.hasOwnProperty`.\n *\n * @param {any} obj\n * @param {string|symbol} key\n * @return {boolean}\n */\nexport const hasProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key)\n\n/**\n * @param {Object<string,any>} a\n * @param {Object<string,any>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a === b || (size(a) === size(b) && every(a, (val, key) => (val !== undefined || hasProperty(b, key)) && b[key] === val))\n\n/**\n * Make an object immutable. This hurts performance and is usually not needed if you perform good\n * coding practices.\n */\nexport const freeze = Object.freeze\n\n/**\n * Make an object and all its children immutable.\n * This *really* hurts performance and is usually not needed if you perform good coding practices.\n *\n * @template {any} T\n * @param {T} o\n * @return {Readonly<T>}\n */\nexport const deepFreeze = (o) => {\n for (const key in o) {\n const c = o[key]\n if (typeof c === 'object' || typeof c === 'function') {\n deepFreeze(o[key])\n }\n }\n return freeze(o)\n}\n","/**\n * Common functions and function call helpers.\n *\n * @module function\n */\n\nimport * as array from './array.js'\nimport * as object from './object.js'\n\n/**\n * Calls all functions in `fs` with args. Only throws after all functions were called.\n *\n * @param {Array<function>} fs\n * @param {Array<any>} args\n */\nexport const callAll = (fs, args, i = 0) => {\n try {\n for (; i < fs.length; i++) {\n fs[i](...args)\n }\n } finally {\n if (i < fs.length) {\n callAll(fs, args, i + 1)\n }\n }\n}\n\nexport const nop = () => {}\n\n/**\n * @template T\n * @param {function():T} f\n * @return {T}\n */\nexport const apply = f => f()\n\n/**\n * @template A\n *\n * @param {A} a\n * @return {A}\n */\nexport const id = a => a\n\n/**\n * @template T\n *\n * @param {T} a\n * @param {T} b\n * @return {boolean}\n */\nexport const equalityStrict = (a, b) => a === b\n\n/**\n * @template T\n *\n * @param {Array<T>|object} a\n * @param {Array<T>|object} b\n * @return {boolean}\n */\nexport const equalityFlat = (a, b) => a === b || (a != null && b != null && a.constructor === b.constructor && ((array.isArray(a) && array.equalFlat(a, /** @type {Array<T>} */ (b))) || (typeof a === 'object' && object.equalFlat(a, b))))\n\n/* c8 ignore start */\n\n/**\n * @param {any} a\n * @param {any} b\n * @return {boolean}\n */\nexport const equalityDeep = (a, b) => {\n if (a == null || b == null) {\n return equalityStrict(a, b)\n }\n if (a.constructor !== b.constructor) {\n return false\n }\n if (a === b) {\n return true\n }\n switch (a.constructor) {\n case ArrayBuffer:\n a = new Uint8Array(a)\n b = new Uint8Array(b)\n // eslint-disable-next-line no-fallthrough\n case Uint8Array: {\n if (a.byteLength !== b.byteLength) {\n return false\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n break\n }\n case Set: {\n if (a.size !== b.size) {\n return false\n }\n for (const value of a) {\n if (!b.has(value)) {\n return false\n }\n }\n break\n }\n case Map: {\n if (a.size !== b.size) {\n return false\n }\n for (const key of a.keys()) {\n if (!b.has(key) || !equalityDeep(a.get(key), b.get(key))) {\n return false\n }\n }\n break\n }\n case Object:\n if (object.length(a) !== object.length(b)) {\n return false\n }\n for (const key in a) {\n if (!object.hasProperty(a, key) || !equalityDeep(a[key], b[key])) {\n return false\n }\n }\n break\n case Array:\n if (a.length !== b.length) {\n return false\n }\n for (let i = 0; i < a.length; i++) {\n if (!equalityDeep(a[i], b[i])) {\n return false\n }\n }\n break\n default:\n return false\n }\n return true\n}\n\n/**\n * @template V\n * @template {V} OPTS\n *\n * @param {V} value\n * @param {Array<OPTS>} options\n */\n// @ts-ignore\nexport const isOneOf = (value, options) => options.includes(value)\n/* c8 ignore stop */\n\nexport const isArray = array.isArray\n\n/**\n * @param {any} s\n * @return {s is String}\n */\nexport const isString = (s) => s && s.constructor === String\n\n/**\n * @param {any} n\n * @return {n is Number}\n */\nexport const isNumber = n => n != null && n.constructor === Number\n\n/**\n * @template {abstract new (...args: any) => any} TYPE\n * @param {any} n\n * @param {TYPE} T\n * @return {n is InstanceType<TYPE>}\n */\nexport const is = (n, T) => n && n.constructor === T\n\n/**\n * @template {abstract new (...args: any) => any} TYPE\n * @param {TYPE} T\n */\nexport const isTemplate = (T) =>\n /**\n * @param {any} n\n * @return {n is InstanceType<TYPE>}\n **/\n n => n && n.constructor === T\n","/**\n * Mutual exclude for JavaScript.\n *\n * @module mutex\n */\n\n/**\n * @callback mutex\n * @param {function():void} cb Only executed when this mutex is not in the current stack\n * @param {function():void} [elseCb] Executed when this mutex is in the current stack\n */\n\n/**\n * Creates a mutual exclude function with the following property:\n *\n * ```js\n * const mutex = createMutex()\n * mutex(() => {\n * // This function is immediately executed\n * mutex(() => {\n * // This function is not executed, as the mutex is already active.\n * })\n * })\n * ```\n *\n * @return {mutex} A mutual exclude function\n * @public\n */\nexport const createMutex = () => {\n let token = true\n return (f, g) => {\n if (token) {\n token = false\n try {\n f()\n } finally {\n token = true\n }\n } else if (g !== undefined) {\n g()\n }\n }\n}\n","/**\n * Efficient diffs.\n *\n * @module diff\n */\n\nimport { equalityStrict } from './function.js'\n\n/**\n * A SimpleDiff describes a change on a String.\n *\n * ```js\n * console.log(a) // the old value\n * console.log(b) // the updated value\n * // Apply changes of diff (pseudocode)\n * a.remove(diff.index, diff.remove) // Remove `diff.remove` characters\n * a.insert(diff.index, diff.insert) // Insert `diff.insert`\n * a === b // values match\n * ```\n *\n * @typedef {Object} SimpleDiff\n * @property {Number} index The index where changes were applied\n * @property {Number} remove The number of characters to delete starting\n * at `index`.\n * @property {T} insert The new text to insert at `index` after applying\n * `delete`\n *\n * @template T\n */\n\nconst highSurrogateRegex = /[\\uD800-\\uDBFF]/\nconst lowSurrogateRegex = /[\\uDC00-\\uDFFF]/\n\n/**\n * Create a diff between two strings. This diff implementation is highly\n * efficient, but not very sophisticated.\n *\n * @function\n *\n * @param {string} a The old version of the string\n * @param {string} b The updated version of the string\n * @return {SimpleDiff<string>} The diff description.\n */\nexport const simpleDiffString = (a, b) => {\n let left = 0 // number of same characters counting from left\n let right = 0 // number of same characters counting from right\n while (left < a.length && left < b.length && a[left] === b[left]) {\n left++\n }\n // If the last same character is a high surrogate, we need to rollback to the previous character\n if (left > 0 && highSurrogateRegex.test(a[left - 1])) left--\n while (right + left < a.length && right + left < b.length && a[a.length - right - 1] === b[b.length - right - 1]) {\n right++\n }\n // If the last same character is a low surrogate, we need to rollback to the previous character\n if (right > 0 && lowSurrogateRegex.test(a[a.length - right])) right--\n return {\n index: left,\n remove: a.length - left - right,\n insert: b.slice(left, b.length - right)\n }\n}\n\n/**\n * @todo Remove in favor of simpleDiffString\n * @deprecated\n */\nexport const simpleDiff = simpleDiffString\n\n/**\n * Create a diff between two arrays. This diff implementation is highly\n * efficient, but not very sophisticated.\n *\n * Note: This is basically the same function as above. Another function was created so that the runtime\n * can better optimize these function calls.\n *\n * @function\n * @template T\n *\n * @param {Array<T>} a The old version of the array\n * @param {Array<T>} b The updated version of the array\n * @param {function(T, T):boolean} [compare]\n * @return {SimpleDiff<Array<T>>} The diff description.\n */\nexport const simpleDiffArray = (a, b, compare = equalityStrict) => {\n let left = 0 // number of same characters counting from left\n let right = 0 // number of same characters counting from right\n while (left < a.length && left < b.length && compare(a[left], b[left])) {\n left++\n }\n while (right + left < a.length && right + left < b.length && compare(a[a.length - right - 1], b[b.length - right - 1])) {\n right++\n }\n return {\n index: left,\n remove: a.length - left - right,\n insert: b.slice(left, b.length - right)\n }\n}\n\n/**\n * Diff text and try to diff at the current cursor position.\n *\n * @param {string} a\n * @param {string} b\n * @param {number} cursor This should refer to the current left cursor-range position\n */\nexport const simpleDiffStringWithCursor = (a, b, cursor) => {\n let left = 0 // number of same characters counting from left\n let right = 0 // number of same characters counting from right\n // Iterate left to the right until we find a changed character\n // First iteration considers the current cursor position\n while (\n left < a.length &&\n left < b.length &&\n a[left] === b[left] &&\n left < cursor\n ) {\n left++\n }\n // If the last same character is a high surrogate, we need to rollback to the previous character\n if (left > 0 && highSurrogateRegex.test(a[left - 1])) left--\n // Iterate right to the left until we find a changed character\n while (\n right + left < a.length &&\n right + left < b.length &&\n a[a.length - right - 1] === b[b.length - right - 1]\n ) {\n right++\n }\n // If the last same character is a low surrogate, we need to rollback to the previous character\n if (right > 0 && lowSurrogateRegex.test(a[a.length - right])) right--\n // Try to iterate left further to the right without caring about the current cursor position\n while (\n right + left < a.length &&\n right + left < b.length &&\n a[left] === b[left]\n ) {\n left++\n }\n if (left > 0 && highSurrogateRegex.test(a[left - 1])) left--\n return {\n index: left,\n remove: a.length - left - right,\n insert: b.slice(left, b.length - right)\n }\n}\n","import { PluginKey } from 'prosemirror-state' // eslint-disable-line\n\n/**\n * The unique prosemirror plugin key for syncPlugin\n *\n * @public\n */\nexport const ySyncPluginKey = new PluginKey('y-sync')\n\n/**\n * The unique prosemirror plugin key for undoPlugin\n *\n * @public\n */\nexport const yUndoPluginKey = new PluginKey('y-undo')\n\n/**\n * The unique prosemirror plugin key for cursorPlugin\n *\n * @public\n */\nexport const yCursorPluginKey = new PluginKey('yjs-cursor')\n","/**\n * Isomorphic module for true random numbers / buffers / uuids.\n *\n * Attention: falls back to Math.random if the browser does not support crypto.\n *\n * @module random\n */\n\nimport * as math from './math.js'\nimport * as binary from './binary.js'\nimport { getRandomValues } from 'lib0/webcrypto'\n\nexport const rand = Math.random\n\nexport const uint32 = () => getRandomValues(new Uint32Array(1))[0]\n\nexport const uint53 = () => {\n const arr = getRandomValues(new Uint32Array(8))\n return (arr[0] & binary.BITS21) * (binary.BITS32 + 1) + (arr[1] >>> 0)\n}\n\n/**\n * @template T\n * @param {Array<T>} arr\n * @return {T}\n */\nexport const oneOf = arr => arr[math.floor(rand() * arr.length)]\n\n// @ts-ignore\nconst uuidv4Template = [1e7] + -1e3 + -4e3 + -8e3 + -1e11\n\n/**\n * @return {string}\n */\nexport const uuidv4 = () => uuidv4Template.replace(/[018]/g, /** @param {number} c */ c =>\n (c ^ uint32() & 15 >> c / 4).toString(16)\n)\n","/**\n * Often used conditions.\n *\n * @module conditions\n */\n\n/**\n * @template T\n * @param {T|null|undefined} v\n * @return {T|null}\n */\n/* c8 ignore next */\nexport const undefinedToNull = v => v === undefined ? null : v\n","/* eslint-env browser */\n\n/**\n * Isomorphic variable storage.\n *\n * Uses LocalStorage in the browser and falls back to in-memory storage.\n *\n * @module storage\n */\n\n/* c8 ignore start */\nclass VarStoragePolyfill {\n constructor () {\n this.map = new Map()\n }\n\n /**\n * @param {string} key\n * @param {any} newValue\n */\n setItem (key, newValue) {\n this.map.set(key, newValue)\n }\n\n /**\n * @param {string} key\n */\n getItem (key) {\n return this.map.get(key)\n }\n}\n/* c8 ignore stop */\n\n/**\n * @type {any}\n */\nlet _localStorage = new VarStoragePolyfill()\nlet usePolyfill = true\n\n/* c8 ignore start */\ntry {\n // if the same-origin rule is violated, accessing localStorage might thrown an error\n if (typeof localStorage !== 'undefined' && localStorage) {\n _localStorage = localStorage\n usePolyfill = false\n }\n} catch (e) { }\n/* c8 ignore stop */\n\n/**\n * This is basically localStorage in browser, or a polyfill in nodejs\n */\n/* c8 ignore next */\nexport const varStorage = _localStorage\n\n/**\n * A polyfill for `addEventListener('storage', event => {..})` that does nothing if the polyfill is being used.\n *\n * @param {function({ key: string, newValue: string, oldValue: string }): void} eventHandler\n * @function\n */\n/* c8 ignore next */\nexport const onChange = eventHandler => usePolyfill || addEventListener('storage', /** @type {any} */ (eventHandler))\n\n/**\n * A polyfill for `removeEventListener('storage', event => {..})` that does nothing if the polyfill is being used.\n *\n * @param {function({ key: string, newValue: string, oldValue: string }): void} eventHandler\n * @function\n */\n/* c8 ignore next */\nexport const offChange = eventHandler => usePolyfill || removeEventListener('storage', /** @type {any} */ (eventHandler))\n","/**\n * Isomorphic module to work access the environment (query params, env variables).\n *\n * @module environment\n */\n\nimport * as map from './map.js'\nimport * as string from './string.js'\nimport * as conditions from './conditions.js'\nimport * as storage from './storage.js'\nimport * as f from './function.js'\n\n/* c8 ignore next 2 */\n// @ts-ignore\nexport const isNode = typeof process !== 'undefined' && process.release && /node|io\\.js/.test(process.release.name) && Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]'\n\n/* c8 ignore next */\nexport const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && !isNode\n/* c8 ignore next 3 */\nexport const isMac = typeof navigator !== 'undefined'\n ? /Mac/.test(navigator.platform)\n : false\n\n/**\n * @type {Map<string,string>}\n */\nlet params\nconst args = []\n\n/* c8 ignore start */\nconst computeParams = () => {\n if (params === undefined) {\n if (isNode) {\n params = map.create()\n const pargs = process.argv\n let currParamName = null\n for (let i = 0; i < pargs.length; i++) {\n const parg = pargs[i]\n if (parg[0] === '-') {\n if (currParamName !== null) {\n params.set(currParamName, '')\n }\n currParamName = parg\n } else {\n if (currParamName !== null) {\n params.set(currParamName, parg)\n currParamName = null\n } else {\n args.push(parg)\n }\n }\n }\n if (currParamName !== null) {\n params.set(currParamName, '')\n }\n // in ReactNative for example this would not be true (unless connected to the Remote Debugger)\n } else if (typeof location === 'object') {\n params = map.create(); // eslint-disable-next-line no-undef\n (location.search || '?').slice(1).split('&').forEach((kv) => {\n if (kv.length !== 0) {\n const [key, value] = kv.split('=')\n params.set(`--${string.fromCamelCase(key, '-')}`, value)\n params.set(`-${string.fromCamelCase(key, '-')}`, value)\n }\n })\n } else {\n params = map.create()\n }\n }\n return params\n}\n/* c8 ignore stop */\n\n/**\n * @param {string} name\n * @return {boolean}\n */\n/* c8 ignore next */\nexport const hasParam = (name) => computeParams().has(name)\n\n/**\n * @param {string} name\n * @param {string} defaultVal\n * @return {string}\n */\n/* c8 ignore next 2 */\nexport const getParam = (name, defaultVal) =>\n computeParams().get(name) || defaultVal\n\n/**\n * @param {string} name\n * @return {string|null}\n */\n/* c8 ignore next 4 */\nexport const getVariable = (name) =>\n isNode\n ? conditions.undefinedToNull(process.env[name.toUpperCase().replaceAll('-', '_')])\n : conditions.undefinedToNull(storage.varStorage.getItem(name))\n\n/**\n * @param {string} name\n * @return {string|null}\n */\n/* c8 ignore next 2 */\nexport const getConf = (name) =>\n computeParams().get('--' + name) || getVariable(name)\n\n/**\n * @param {string} name\n * @return {string}\n */\n/* c8 ignore next 5 */\nexport const ensureConf = (name) => {\n const c = getConf(name)\n if (c == null) throw new Error(`Expected configuration \"${name.toUpperCase().replaceAll('-', '_')}\"`)\n return c\n}\n\n/**\n * @param {string} name\n * @return {boolean}\n */\n/* c8 ignore next 2 */\nexport const hasConf = (name) =>\n hasParam('--' + name) || getVariable(name) !== null\n\n/* c8 ignore next */\nexport const production = hasConf('production')\n\n/* c8 ignore next 2 */\nconst forceColor = isNode &&\n f.isOneOf(process.env.FORCE_COLOR, ['true', '1', '2'])\n\n/* c8 ignore start */\n/**\n * Color is enabled by default if the terminal supports it.\n *\n * Explicitly enable color using `--color` parameter\n * Disable color using `--no-color` parameter or using `NO_COLOR=1` environment variable.\n * `FORCE_COLOR=1` enables color and takes precedence over all.\n */\nexport const supportsColor = forceColor || (\n !hasParam('--no-colors') && // @todo deprecate --no-colors\n !hasConf('no-color') &&\n (!isNode || process.stdout.isTTY) && (\n !isNode ||\n hasParam('--color') ||\n getVariable('COLORTERM') !== null ||\n (getVariable('TERM') || '').includes('color')\n )\n)\n/* c8 ignore stop */\n","/* eslint-env browser */\n\n/**\n * Utility module to work with the DOM.\n *\n * @module dom\n */\n\nimport * as pair from './pair.js'\nimport * as map from './map.js'\n\n/* c8 ignore start */\n/**\n * @type {Document}\n */\nexport const doc = /** @type {Document} */ (typeof document !== 'undefined' ? document : {})\n\n/**\n * @param {string} name\n * @return {HTMLElement}\n */\nexport const createElement = name => doc.createElement(name)\n\n/**\n * @return {DocumentFragment}\n */\nexport const createDocumentFragment = () => doc.createDocumentFragment()\n\n/**\n * @param {string} text\n * @return {Text}\n */\nexport const createTextNode = text => doc.createTextNode(text)\n\nexport const domParser = /** @type {DOMParser} */ (typeof DOMParser !== 'undefined' ? new DOMParser() : null)\n\n/**\n * @param {HTMLElement} el\n * @param {string} name\n * @param {Object} opts\n */\nexport const emitCustomEvent = (el, name, opts) => el.dispatchEvent(new CustomEvent(name, opts))\n\n/**\n * @param {Element} el\n * @param {Array<pair.Pair<string,string|boolean>>} attrs Array of key-value pairs\n * @return {Element}\n */\nexport const setAttributes = (el, attrs) => {\n pair.forEach(attrs, (key, value) => {\n if (value === false) {\n el.removeAttribute(key)\n } else if (value === true) {\n el.setAttribute(key, '')\n } else {\n // @ts-ignore\n el.setAttribute(key, value)\n }\n })\n return el\n}\n\n/**\n * @param {Element} el\n * @param {Map<string, string>} attrs Array of key-value pairs\n * @return {Element}\n */\nexport const setAttributesMap = (el, attrs) => {\n attrs.forEach((value, key) => { el.setAttribute(key, value) })\n return el\n}\n\n/**\n * @param {Array<Node>|HTMLCollection} children\n * @return {DocumentFragment}\n */\nexport const fragment = children => {\n const fragment = createDocumentFragment()\n for (let i = 0; i < children.length; i++) {\n appendChild(fragment, children[i])\n }\n return fragment\n}\n\n/**\n * @param {Element} parent\n * @param {Array<Node>} nodes\n * @return {Element}\n */\nexport const append = (parent, nodes) => {\n appendChild(parent, fragment(nodes))\n return parent\n}\n\n/**\n * @param {HTMLElement} el\n */\nexport const remove = el => el.remove()\n\n/**\n * @param {EventTarget} el\n * @param {string} name\n * @param {EventListener} f\n */\nexport const addEventListener = (el, name, f) => el.addEventListener(name, f)\n\n/**\n * @param {EventTarget} el\n * @param {string} name\n * @param {EventListener} f\n */\nexport const removeEventListener = (el, name, f) => el.removeEventListener(name, f)\n\n/**\n * @param {Node} node\n * @param {Array<pair.Pair<string,EventListener>>} listeners\n * @return {Node}\n */\nexport const addEventListeners = (node, listeners) => {\n pair.forEach(listeners, (name, f) => addEventListener(node, name, f))\n return node\n}\n\n/**\n * @param {Node} node\n * @param {Array<pair.Pair<string,EventListener>>} listeners\n * @return {Node}\n */\nexport const removeEventListeners = (node, listeners) => {\n pair.forEach(listeners, (name, f) => removeEventListener(node, name, f))\n return node\n}\n\n/**\n * @param {string} name\n * @param {Array<pair.Pair<string,string>|pair.Pair<string,boolean>>} attrs Array of key-value pairs\n * @param {Array<Node>} children\n * @return {Element}\n */\nexport const element = (name, attrs = [], children = []) =>\n append(setAttributes(createElement(name), attrs), children)\n\n/**\n * @param {number} width\n * @param {number} height\n */\nexport const canvas = (width, height) => {\n const c = /** @type {HTMLCanvasElement} */ (createElement('canvas'))\n c.height = height\n c.width = width\n return c\n}\n\n/**\n * @param {string} t\n * @return {Text}\n */\nexport const text = createTextNode\n\n/**\n * @param {pair.Pair<string,string>} pair\n */\nexport const pairToStyleString = pair => `${pair.left}:${pair.right};`\n\n/**\n * @param {Array<pair.Pair<string,string>>} pairs\n * @return {string}\n */\nexport const pairsToStyleString = pairs => pairs.map(pairToStyleString).join('')\n\n/**\n * @param {Map<string,string>} m\n * @return {string}\n */\nexport const mapToStyleString = m => map.map(m, (value, key) => `${key}:${value};`).join('')\n\n/**\n * @todo should always query on a dom element\n *\n * @param {HTMLElement|ShadowRoot} el\n * @param {string} query\n * @return {HTMLElement | null}\n */\nexport const querySelector = (el, query) => el.querySelector(query)\n\n/**\n * @param {HTMLElement|ShadowRoot} el\n * @param {string} query\n * @return {NodeListOf<HTMLElement>}\n */\nexport const querySelectorAll = (el, query) => el.querySelectorAll(query)\n\n/**\n * @param {string} id\n * @return {HTMLElement}\n */\nexport const getElementById = id => /** @type {HTMLElement} */ (doc.getElementById(id))\n\n/**\n * @param {string} html\n * @return {HTMLElement}\n */\nconst _parse = html => domParser.parseFromString(`<html><body>${html}</body></html>`, 'text/html').body\n\n/**\n * @param {string} html\n * @return {DocumentFragment}\n */\nexport const parseFragment = html => fragment(/** @type {any} */ (_parse(html).childNodes))\n\n/**\n * @param {string} html\n * @return {HTMLElement}\n */\nexport const parseElement = html => /** @type HTMLElement */ (_parse(html).firstElementChild)\n\n/**\n * @param {HTMLElement} oldEl\n * @param {HTMLElement|DocumentFragment} newEl\n */\nexport const replaceWith = (oldEl, newEl) => oldEl.replaceWith(newEl)\n\n/**\n * @param {HTMLElement} parent\n * @param {HTMLElement} el\n * @param {Node|null} ref\n * @return {HTMLElement}\n */\nexport const insertBefore = (parent, el, ref) => parent.insertBefore(el, ref)\n\n/**\n * @param {Node} parent\n * @param {Node} child\n * @return {Node}\n */\nexport const appendChild = (parent, child) => parent.appendChild(child)\n\nexport const ELEMENT_NODE = doc.ELEMENT_NODE\nexport const TEXT_NODE = doc.TEXT_NODE\nexport const CDATA_SECTION_NODE = doc.CDATA_SECTION_NODE\nexport const COMMENT_NODE = doc.COMMENT_NODE\nexport const DOCUMENT_NODE = doc.DOCUMENT_NODE\nexport const DOCUMENT_TYPE_NODE = doc.DOCUMENT_TYPE_NODE\nexport const DOCUMENT_FRAGMENT_NODE = doc.DOCUMENT_FRAGMENT_NODE\n\n/**\n * @param {any} node\n * @param {number} type\n */\nexport const checkNodeType = (node, type) => node.nodeType === type\n\n/**\n * @param {Node} parent\n * @param {HTMLElement} child\n */\nexport const isParentOf = (parent, child) => {\n let p = child.parentNode\n while (p && p !== parent) {\n p = p.parentNode\n }\n return p === parent\n}\n/* c8 ignore stop */\n","/* global requestIdleCallback, requestAnimationFrame, cancelIdleCallback, cancelAnimationFrame */\n\n/**\n * Utility module to work with EcmaScript's event loop.\n *\n * @module eventloop\n */\n\n/**\n * @type {Array<function>}\n */\nlet queue = []\n\nconst _runQueue = () => {\n for (let i = 0; i < queue.length; i++) {\n queue[i]()\n }\n queue = []\n}\n\n/**\n * @param {function():void} f\n */\nexport const enqueue = f => {\n queue.push(f)\n if (queue.length === 1) {\n setTimeout(_runQueue, 0)\n }\n}\n\n/**\n * @typedef {Object} TimeoutObject\n * @property {function} TimeoutObject.destroy\n */\n\n/**\n * @param {function(number):void} clearFunction\n */\nconst createTimeoutClass = clearFunction => class TT {\n /**\n * @param {number} timeoutId\n */\n constructor (timeoutId) {\n this._ = timeoutId\n }\n\n destroy () {\n clearFunction(this._)\n }\n}\n\nconst Timeout = createTimeoutClass(clearTimeout)\n\n/**\n * @param {number} timeout\n * @param {function} callback\n * @return {TimeoutObject}\n */\nexport const timeout = (timeout, callback) => new Timeout(setTimeout(callback, timeout))\n\nconst Interval = createTimeoutClass(clearInterval)\n\n/**\n * @param {number} timeout\n * @param {function} callback\n * @return {TimeoutObject}\n */\nexport const interval = (timeout, callback) => new Interval(setInterval(callback, timeout))\n\n/* c8 ignore next */\nexport const Animation = createTimeoutClass(arg => typeof requestAnimationFrame !== 'undefined' && cancelAnimationFrame(arg))\n\n/**\n * @param {function(number):void} cb\n * @return {TimeoutObject}\n */\n/* c8 ignore next */\nexport const animationFrame = cb => typeof requestAnimationFrame === 'undefined' ? timeout(0, cb) : new Animation(requestAnimationFrame(cb))\n\n/* c8 ignore next */\n// @ts-ignore\nconst Idle = createTimeoutClass(arg => typeof cancelIdleCallback !== 'undefined' && cancelIdleCallback(arg))\n\n/**\n * Note: this is experimental and is probably only useful in browsers.\n *\n * @param {function} cb\n * @return {TimeoutObject}\n */\n/* c8 ignore next 2 */\n// @ts-ignore\nexport const idleCallback = cb => typeof requestIdleCallback !== 'undefined' ? new Idle(requestIdleCallback(cb)) : timeout(1000, cb)\n\n/**\n * @param {number} timeout Timeout of the debounce action\n * @return {function(function():void):void}\n */\nexport const createDebouncer = timeout => {\n let timer = -1\n return f => {\n clearTimeout(timer)\n if (f) {\n timer = /** @type {any} */ (setTimeout(f, timeout))\n }\n }\n}\n","/**\n * @module bindings/prosemirror\n */\n\nimport { createMutex } from 'lib0/mutex'\nimport * as PModel from 'prosemirror-model'\nimport { AllSelection, Plugin, TextSelection } from \"prosemirror-state\"; // eslint-disable-line\nimport * as math from 'lib0/math'\nimport * as object from 'lib0/object'\nimport * as set from 'lib0/set'\nimport { simpleDiff } from 'lib0/diff'\nimport * as error from 'lib0/error'\nimport { ySyncPluginKey, yUndoPluginKey } from './keys.js'\nimport * as Y from 'yjs'\nimport {\n absolutePositionToRelativePosition,\n relativePositionToAbsolutePosition\n} from '../lib.js'\nimport * as random from 'lib0/random'\nimport * as environment from 'lib0/environment'\nimport * as dom from 'lib0/dom'\nimport * as eventloop from 'lib0/eventloop'\n\n/**\n * @param {Y.Item} item\n * @param {Y.Snapshot} [snapshot]\n */\nexport const isVisible = (item, snapshot) =>\n snapshot === undefined\n ? !item.deleted\n : (snapshot.sv.has(item.id.client) && /** @type {number} */\n (snapshot.sv.get(item.id.client)) > item.id.clock &&\n !Y.isDeleted(snapshot.ds, item.id))\n\n/**\n * Either a node if type is YXmlElement or an Array of text nodes if YXmlText\n * @typedef {Map<Y.AbstractType<any>, PModel.Node | Array<PModel.Node>>} ProsemirrorMapping\n */\n\n/**\n * @typedef {Object} ColorDef\n * @property {string} ColorDef.light\n * @property {string} ColorDef.dark\n */\n\n/**\n * @typedef {Object} YSyncOpts\n * @property {Array<ColorDef>} [YSyncOpts.colors]\n * @property {Map<string,ColorDef>} [YSyncOpts.colorMapping]\n * @property {Y.PermanentUserData|null} [YSyncOpts.permanentUserData]\n * @property {ProsemirrorMapping} [YSyncOpts.mapping]\n * @property {function} [YSyncOpts.onFirstRender] Fired when the content from Yjs is initially rendered to ProseMirror\n */\n\n/**\n * @type {Array<ColorDef>}\n */\nconst defaultColors = [{ light: '#ecd44433', dark: '#ecd444' }]\n\n/**\n * @param {Map<string,ColorDef>} colorMapping\n * @param {Array<ColorDef>} colors\n * @param {string} user\n * @return {ColorDef}\n */\nconst getUserColor = (colorMapping, colors, user) => {\n // @todo do not hit the same color twice if possible\n if (!colorMapping.has(user)) {\n if (colorMapping.size < colors.length) {\n const usedColors = set.create()\n colorMapping.forEach((color) => usedColors.add(color))\n colors = colors.filter((color) => !usedColors.has(color))\n }\n colorMapping.set(user, random.oneOf(colors))\n }\n return /** @type {ColorDef} */ (colorMapping.get(user))\n}\n\n/**\n * This plugin listens to changes in prosemirror view and keeps yXmlState and view in sync.\n *\n * This plugin also keeps references to the type and the shared document so other plugins can access it.\n * @param {Y.XmlFragment} yXmlFragment\n * @param {YSyncOpts} opts\n * @return {any} Returns a prosemirror plugin that binds to this type\n */\nexport const ySyncPlugin = (yXmlFragment, {\n colors = defaultColors,\n colorMapping = new Map(),\n permanentUserData = null,\n onFirstRender = () => {},\n mapping\n} = {}) => {\n let initialContentChanged = false\n const binding = new ProsemirrorBinding(yXmlFragment, mapping)\n const plugin = new Plugin({\n props: {\n editable: (state) => {\n const syncState = ySyncPluginKey.getState(state)\n return syncState.snapshot == null && syncState.prevSnapshot == null\n }\n },\n key: ySyncPluginKey,\n state: {\n /**\n * @returns {any}\n */\n init: (_initargs, _state) => {\n return {\n type: yXmlFragment,\n doc: yXmlFragment.doc,\n binding,\n snapshot: null,\n prevSnapshot: null,\n isChangeOrigin: false,\n isUndoRedoOperation: false,\n addToHistory: true,\n colors,\n colorMapping,\n permanentUserData\n }\n },\n apply: (tr, pluginState) => {\n const change = tr.getMeta(ySyncPluginKey)\n if (change !== undefined) {\n pluginState = Object.assign({}, pluginState)\n for (const key in change) {\n pluginState[key] = change[key]\n }\n }\n pluginState.addToHistory = tr.getMeta('addToHistory') !== false\n // always set isChangeOrigin. If undefined, this is not change origin.\n pluginState.isChangeOrigin = change !== undefined &&\n !!change.isChangeOrigin\n pluginState.isUndoRedoOperation = change !== undefined && !!change.isChangeOrigin && !!change.isUndoRedoOperation\n if (binding.prosemirrorView !== null) {\n if (\n change !== undefined &&\n (change.snapshot != null || change.prevSnapshot != null)\n ) {\n // snapshot changed, rerender next\n eventloop.timeout(0, () => {\n if (binding.prosemirrorView == null) {\n return\n }\n if (change.restore == null) {\n binding._renderSnapshot(\n change.snapshot,\n change.prevSnapshot,\n pluginState\n )\n } else {\n binding._renderSnapshot(\n change.snapshot,\n change.snapshot,\n pluginState\n )\n // reset to current prosemirror state\n delete pluginState.restore\n delete pluginState.snapshot\n delete pluginState.prevSnapshot\n binding.mux(() => {\n binding._prosemirrorChanged(\n binding.prosemirrorView.state.doc\n )\n })\n }\n })\n }\n }\n return pluginState\n }\n },\n view: (view) => {\n binding.initView(view)\n if (mapping == null) {\n // force rerender to update the bindings mapping\n binding._forceRerender()\n }\n onFirstRender()\n return {\n update: () => {\n const pluginState = plugin.getState(view.state)\n if (\n pluginState.snapshot == null && pluginState.prevSnapshot == null\n ) {\n if (\n // If the content doesn't change initially, we don't render anything to Yjs\n // If the content was cleared by a user action, we want to catch the change and\n // represent it in Yjs\n initialContentChanged ||\n view.state.doc.content.findDiffStart(\n view.state.doc.type.createAndFill().content\n ) !== null\n ) {\n initialContentChanged = true\n if (\n pluginState.addToHistory === false &&\n !pluginState.isChangeOrigin\n ) {\n const yUndoPluginState = yUndoPluginKey.getState(view.state)\n /**\n * @type {Y.UndoManager}\n */\n const um = yUndoPluginState && yUndoPluginState.undoManager\n if (um) {\n um.stopCapturing()\n }\n }\n binding.mux(() => {\n /** @type {Y.Doc} */ (pluginState.doc).transact((tr) => {\n tr.meta.set('addToHistory', pluginState.addToHistory)\n binding._prosemirrorChanged(view.state.doc)\n }, ySyncPluginKey)\n })\n }\n }\n },\n destroy: () => {\n binding.destroy()\n }\n }\n }\n })\n return plugin\n}\n\n/**\n * @param {any} tr\n * @param {any} relSel\n * @param {ProsemirrorBinding} binding\n */\nconst restoreRelativeSelection = (tr, relSel, binding) => {\n if (relSel !== null && relSel.anchor !== null && relSel.head !== null) {\n if (relSel.type === 'all') {\n tr.setSelection(new AllSelection(tr.doc))\n } else {\n const anchor = relativePositionToAbsolutePosition(\n binding.doc,\n binding.type,\n relSel.anchor,\n binding.mapping\n )\n const head = relativePositionToAbsolutePosition(\n binding.doc,\n binding.type,\n relSel.head,\n binding.mapping\n )\n if (anchor !== null && head !== null) {\n tr = tr.setSelection(TextSelection.create(tr.doc, anchor, head))\n }\n }\n }\n}\n\nexport const getRelativeSelection = (pmbinding, state) => ({\n type: state.selection.jsonID,\n anchor: absolutePositionToRelativePosition(\n state.selection.anchor,\n pmbinding.type,\n pmbinding.mapping\n ),\n head: absolutePositionToRelativePosition(\n state.selection.head,\n pmbinding.type,\n pmbinding.mapping\n )\n})\n\n/**\n * Binding for prosemirror.\n *\n * @protected\n */\nexport class ProsemirrorBinding {\n /**\n * @param {Y.XmlFragment} yXmlFragment The bind source\n * @param {ProsemirrorMapping} mapping\n */\n constructor (yXmlFragment, mapping = new Map()) {\n this.type = yXmlFragment\n /**\n * this will be set once the view is created\n * @type {any}\n */\n this.prosemirrorView = null\n this.mux = createMutex()\n this.mapping = mapping\n this._observeFunction = this._typeChanged.bind(this)\n /**\n * @type {Y.Doc}\n */\n // @ts-ignore\n this.doc = yXmlFragment.doc\n /**\n * current selection as relative positions in the Yjs model\n */\n this.beforeTransactionSelection = null\n this.beforeAllTransactions = () => {\n if (this.beforeTransactionSelection === null && this.prosemirrorView != null) {\n this.beforeTransactionSelection = getRelativeSelection(\n this,\n this.prosemirrorView.state\n )\n }\n }\n this.afterAllTransactions = () => {\n this.beforeTransactionSelection = null\n }\n this._domSelectionInView = null\n }\n\n /**\n * Create a transaction for changing the prosemirror state.\n *\n * @returns\n */\n get _tr () {\n return this.prosemirrorView.state.tr.setMeta('addToHistory', false)\n }\n\n _isLocalCursorInView () {\n if (!this.prosemirrorView.hasFocus()) return false\n if (environment.isBrowser && this._domSelectionInView === null) {\n // Calculate the domSelectionInView and clear by next tick after all events are finished\n eventloop.timeout(0, () => {\n this._domSelectionInView = null\n })\n this._domSelectionInView = this._isDomSelectionInView()\n }\n return this._domSelectionInView\n }\n\n _isDomSelectionInView () {\n const selection = this.prosemirrorView._root.getSelection()\n\n if (selection == null || selection.anchorNode == null) return false\n\n const range = this.prosemirrorView._root.createRange()\n range.setStart(selection.anchorNode, selection.anchorOffset)\n range.setEnd(selection.focusNode, selection.focusOffset)\n\n // This is a workaround for an edgecase where getBoundingClientRect will\n // return zero values if the selection is collapsed at the start of a newline\n // see reference here: https://stackoverflow.com/a/59780954\n const rects = range.getClientRects()\n if (rects.length === 0) {\n // probably buggy newline behavior, explicitly select the node contents\n if (range.startContainer && range.collapsed) {\n range.selectNodeContents(range.startContainer)\n }\n }\n\n const bounding = range.getBoundingClientRect()\n const documentElement = dom.doc.documentElement\n\n return bounding.bottom >= 0 && bounding.right >= 0 &&\n bounding.left <=\n (window.innerWidth || documentElement.clientWidth || 0) &&\n bounding.top <= (window.innerHeight || documentElement.clientHeight || 0)\n }\n\n /**\n * @param {Y.Snapshot} snapshot\n * @param {Y.Snapshot} prevSnapshot\n */\n renderSnapshot (snapshot, prevSnapshot) {\n if (!prevSnapshot) {\n prevSnapshot = Y.createSnapshot(Y.createDeleteSet(), new Map())\n }\n this.prosemirrorView.dispatch(\n this._tr.setMeta(ySyncPluginKey, { snapshot, prevSnapshot })\n )\n }\n\n unrenderSnapshot () {\n this.mapping.clear()\n this.mux(() => {\n const fragmentContent = this.type.toArray().map((t) =>\n createNodeFromYElement(\n /** @type {Y.XmlElement} */ (t),\n this.prosemirrorView.state.schema,\n this.mapping\n )\n ).filter((n) => n !== null)\n // @ts-ignore\n const tr = this._tr.replace(\n 0,\n this.prosemirrorView.state.doc.content.size,\n new PModel.Slice(PModel.Fragment.from(fragmentContent), 0, 0)\n )\n tr.setMeta(ySyncPluginKey, { snapshot: null, prevSnapshot: null })\n this.prosemirrorView.dispatch(tr)\n })\n }\n\n _forceRerender () {\n this.mapping.clear()\n this.mux(() => {\n // If this is a forced rerender, this might neither happen as a pm change nor within a Yjs\n // transaction. Then the \"before selection\" doesn't exist. In this case, we need to create a\n // relative position before replacing content. Fixes #126\n const sel = this.beforeTransactionSelection !== null ? null : this.prosemirrorView.state.selection\n const fragmentContent = this.type.toArray().map((t) =>\n createNodeFromYElement(\n /** @type {Y.XmlElement} */ (t),\n this.prosemirrorView.state.schema,\n this.mapping\n )\n ).filter((n) => n !== null)\n // @ts-ignore\n const tr = this._tr.replace(\n 0,\n this.prosemirrorView.state.doc.content.size,\n new PModel.Slice(PModel.Fragment.from(fragmentContent), 0, 0)\n )\n if (sel) {\n /**\n * If the Prosemirror document we just created from this.type is\n * smaller than the previous document, the selection might be\n * out of bound, which would make Prosemirror throw an error.\n */\n const clampedAnchor = math.min(math.max(sel.anchor, 0), tr.doc.content.size)\n const clampedHead = math.min(math.max(sel.head, 0), tr.doc.content.size)\n\n tr.setSelection(TextSelection.create(tr.doc, clampedAnchor, clampedHead))\n }\n this.prosemirrorView.dispatch(\n tr.setMeta(ySyncPluginKey, { isChangeOrigin: true, binding: this })\n )\n })\n }\n\n /**\n * @param {Y.Snapshot|Uint8Array} snapshot\n * @param {Y.Snapshot|Uint8Array} prevSnapshot\n * @param {Object} pluginState\n */\n _renderSnapshot (snapshot, prevSnapshot, pluginState) {\n /**\n * The document that contains the full history of this document.\n * @type {Y.Doc}\n */\n let historyDoc = this.doc\n if (!snapshot) {\n snapshot = Y.snapshot(this.doc)\n }\n if (snapshot instanceof Uint8Array || prevSnapshot instanceof Uint8Array) {\n if (!(snapshot instanceof Uint8Array) || !(prevSnapshot instanceof Uint8Array)) {\n // expected both snapshots to be v2 updates\n error.unexpectedCase()\n }\n historyDoc = new Y.Doc({ gc: false })\n Y.applyUpdateV2(historyDoc, prevSnapshot)\n prevSnapshot = Y.snapshot(historyDoc)\n Y.applyUpdateV2(historyDoc, snapshot)\n snapshot = Y.snapshot(historyDoc)\n }\n // clear mapping because we are going to rerender\n this.mapping.clear()\n this.mux(() => {\n historyDoc.transact((transaction) => {\n // before rendering, we are going to sanitize ops and split deleted ops\n // if they were deleted by seperate users.\n const pud = pluginState.permanentUserData\n if (pud) {\n pud.dss.forEach((ds) => {\n Y.iterateDeletedStructs(transaction, ds, (_item) => {})\n })\n }\n /**\n * @param {'removed'|'added'} type\n * @param {Y.ID} id\n */\n const computeYChange = (type, id) => {\n const user = type === 'added'\n ? pud.getUserByClientId(id.client)\n : pud.getUserByDeletedId(id)\n return {\n user,\n type,\n color: getUserColor(\n pluginState.colorMapping,\n pluginState.colors,\n user\n )\n }\n }\n // Create document fragment and render\n const fragmentContent = Y.typeListToArraySnapshot(\n this.type,\n new Y.Snapshot(prevSnapshot.ds, snapshot.sv)\n ).map((t) => {\n if (\n !t._item.deleted || isVisible(t._item, snapshot) ||\n isVisible(t._item, prevSnapshot)\n ) {\n return createNodeFromYElement(\n t,\n this.prosemirrorView.state.schema,\n new Map(),\n snapshot,\n prevSnapshot,\n computeYChange\n )\n } else {\n // No need to render elements that are not visible by either snapshot.\n // If a client adds and deletes content in the same snapshot the element is not visible by either snapshot.\n return null\n }\n }).filter((n) => n !== null)\n // @ts-ignore\n const tr = this._tr.replace(\n 0,\n this.prosemirrorView.state.doc.content.size,\n new PModel.Slice(PModel.Fragment.from(fragmentContent), 0, 0)\n )\n this.prosemirrorView.dispatch(\n tr.setMeta(ySyncPluginKey, { isChangeOrigin: true })\n )\n }, ySyncPluginKey)\n })\n }\n\n /**\n * @param {Array<Y.YEvent<any>>} events\n * @param {Y.Transaction} transaction\n */\n _typeChanged (events, transaction) {\n if (this.prosemirrorView == null) return\n const syncState = ySyncPluginKey.getState(this.prosemirrorView.state)\n if (\n events.length === 0 || syncState.snapshot != null ||\n syncState.prevSnapshot != null\n ) {\n // drop out if snapshot is active\n this.renderSnapshot(syncState.snapshot, syncState.prevSnapshot)\n return\n }\n this.mux(() => {\n /**\n * @param {any} _\n * @param {Y.AbstractType<any>} type\n */\n const delType = (_, type) => this.mapping.delete(type)\n Y.iterateDeletedStructs(\n transaction,\n transaction.deleteSet,\n (struct) => {\n if (struct.constructor === Y.Item) {\n const type = /** @type {Y.ContentType} */ (/** @type {Y.Item} */ (struct).content).type\n type && this.mapping.delete(type)\n }\n }\n )\n transaction.changed.forEach(delType)\n transaction.changedParentTypes.forEach(delType)\n const fragmentContent = this.type.toArray().map((t) =>\n createNodeIfNotExists(\n /** @type {Y.XmlElement | Y.XmlHook} */ (t),\n this.prosemirrorView.state.schema,\n this.mapping\n )\n ).filter((n) => n !== null)\n // @ts-ignore\n let tr = this._tr.replace(\n 0,\n this.prosemirrorView.state.doc.content.size,\n new PModel.Slice(PModel.Fragment.from(fragmentContent), 0, 0)\n )\n restoreRelativeSelection(tr, this.beforeTransactionSelection, this)\n tr = tr.setMeta(ySyncPluginKey, { isChangeOrigin: true, isUndoRedoOperation: transaction.origin instanceof Y.UndoManager })\n if (\n this.beforeTransactionSelection !== null && this._isLocalCursorInView()\n ) {\n tr.scrollIntoView()\n }\n this.prosemirrorView.dispatch(tr)\n })\n }\n\n _prosemirrorChanged (doc) {\n this.doc.transact(() => {\n updateYFragment(this.doc, this.type, doc, this.mapping)\n this.beforeTransactionSelection = getRelativeSelection(\n this,\n this.prosemirrorView.state\n )\n }, ySyncPluginKey)\n }\n\n /**\n * View is ready to listen to changes. Register observers.\n * @param {any} prosemirrorView\n */\n initView (prosemirrorView) {\n if (this.prosemirrorView != null) this.destroy()\n this.prosemirrorView = prosemirrorView\n this.doc.on('beforeAllTransactions', this.beforeAllTransactions)\n this.doc.on('afterAllTransactions', this.afterAllTransactions)\n this.type.observeDeep(this._observeFunction)\n }\n\n destroy () {\n if (this.prosemirrorView == null) return\n this.prosemirrorView = null\n this.type.unobserveDeep(this._observeFunction)\n this.doc.off('beforeAllTransactions', this.beforeAllTransactions)\n this.doc.off('afterAllTransactions', this.afterAllTransactions)\n }\n}\n\n/**\n * @private\n * @param {Y.XmlElement | Y.XmlHook} el\n * @param {PModel.Schema} schema\n * @param {ProsemirrorMapping} mapping\n * @param {Y.Snapshot} [snapshot]\n * @param {Y.Snapshot} [prevSnapshot]\n * @param {function('removed' | 'added', Y.ID):any} [computeYChange]\n * @return {PModel.Node | null}\n */\nconst createNodeIfNotExists = (\n el,\n schema,\n mapping,\n snapshot,\n prevSnapshot,\n computeYChange\n) => {\n const node = /** @type {PModel.Node} */ (mapping.get(el))\n if (node === undefined) {\n if (el instanceof Y.XmlElement) {\n return createNodeFromYElement(\n el,\n schema,\n mapping,\n snapshot,\n prevSnapshot,\n computeYChange\n )\n } else {\n throw error.methodUnimplemented() // we are currently not handling hooks\n }\n }\n return node\n}\n\n/**\n * @private\n * @param {Y.XmlElement} el\n * @param {any} schema\n * @param {ProsemirrorMapping} mapping\n * @param {Y.Snapshot} [snapshot]\n * @param {Y.Snapshot} [prevSnapshot]\n * @param {function('removed' | 'added', Y.ID):any} [computeYChange]\n * @return {PModel.Node | null} Returns node if node could be created. Otherwise it deletes the yjs type and returns null\n */\nexport const createNodeFromYElement = (\n el,\n schema,\n mapping,\n snapshot,\n prevSnapshot,\n computeYChange\n) => {\n const children = []\n const createChildren = (type) => {\n if (type.constructor === Y.XmlElement) {\n const n = createNodeIfNotExists(\n type,\n schema,\n mapping,\n snapshot,\n prevSnapshot,\n computeYChange\n )\n if (n !== null) {\n children.push(n)\n }\n } else {\n // If the next ytext exists and was created by us, move the content to the current ytext.\n // This is a fix for #160 -- duplication of characters when two Y.Text exist next to each\n // other.\n const nextytext = type._item.right?.content.type\n if (nextytext instanceof Y.Text && !nextytext._item.deleted && nextytext._item.id.client === nextytext.doc.clientID) {\n type.applyDelta([\n { retain: type.length },\n ...nextytext.toDelta()\n ])\n nextytext.doc.transact(tr => {\n nextytext._item.delete(tr)\n })\n }\n // now create the prosemirror text nodes\n const ns = createTextNodesFromYText(\n type,\n schema,\n mapping,\n snapshot,\n prevSnapshot,\n computeYChange\n )\n if (ns !== null) {\n ns.forEach((textchild) => {\n if (textchild !== null) {\n children.push(textchild)\n }\n })\n }\n }\n }\n if (snapshot === undefined || prevSnapshot === undefined) {\n el.toArray().forEach(createChildren)\n } else {\n Y.typeListToArraySnapshot(el, new Y.Snapshot(prevSnapshot.ds, snapshot.sv))\n .forEach(createChildren)\n }\n try {\n const attrs = el.getAttributes(snapshot)\n if (snapshot !== undefined) {\n if (!isVisible(/** @type {Y.Item} */ (el._item), snapshot)) {\n attrs.ychange = computeYChange\n ? computeYChange('removed', /** @type {Y.Item} */ (el._item).id)\n : { type: 'removed' }\n } else if (!isVisible(/** @type {Y.Item} */ (el._item), prevSnapshot)) {\n attrs.ychange = computeYChange\n ? computeYChange('added', /** @type {Y.Item} */ (el._item).id)\n : { type: 'added' }\n }\n }\n const node = schema.node(el.nodeName, attrs, children)\n mapping.set(el, node)\n return node\n } catch (e) {\n // an error occured while creating the node. This is probably a result of a concurrent action.\n /** @type {Y.Doc} */ (el.doc).transact((transaction) => {\n /** @type {Y.Item} */ (el._item).delete(transaction)\n }, ySyncPluginKey)\n mapping.delete(el)\n return null\n }\n}\n\n/**\n * @private\n * @param {Y.XmlText} text\n * @param {any} schema\n * @param {ProsemirrorMapping} _mapping\n * @param {Y.Snapshot} [snapshot]\n * @param {Y.Snapshot} [prevSnapshot]\n * @param {function('removed' | 'added', Y.ID):any} [computeYChange]\n * @return {Array<PModel.Node>|null}\n */\nconst createTextNodesFromYText = (\n text,\n schema,\n _mapping,\n snapshot,\n prevSnapshot,\n computeYChange\n) => {\n const nodes = []\n const deltas = text.toDelta(snapshot, prevSnapshot, computeYChange)\n try {\n for (let i = 0; i < deltas.length; i++) {\n const delta = deltas[i]\n const marks = []\n for (const markName in delta.attributes) {\n marks.push(schema.mark(markName, delta.attributes[markName]))\n }\n nodes.push(schema.text(delta.insert, marks))\n }\n } catch (e) {\n // an error occured while creating the node. This is probably a result of a concurrent action.\n /** @type {Y.Doc} */ (text.doc).transact((transaction) => {\n /** @type {Y.Item} */ (text._item).delete(transaction)\n }, ySyncPluginKey)\n return null\n }\n // @ts-ignore\n return nodes\n}\n\n/**\n * @private\n * @param {Array<any>} nodes prosemirror node\n * @param {ProsemirrorMapping} mapping\n * @return {Y.XmlText}\n */\nconst createTypeFromTextNodes = (nodes, mapping) => {\n const type = new Y.XmlText()\n const delta = nodes.map((node) => ({\n // @ts-ignore\n insert: node.text,\n attributes: marksToAttributes(node.marks)\n }))\n type.applyDelta(delta)\n mapping.set(type, nodes)\n return type\n}\n\n/**\n * @private\n * @param {any} node prosemirror node\n * @param {ProsemirrorMapping} mapping\n * @return {Y.XmlElement}\n */\nconst createTypeFromElementNode = (node, mapping) => {\n const type = new Y.XmlElement(node.type.name)\n for (const key in node.attrs) {\n const val = node.attrs[key]\n if (val !== null && key !== 'ychange') {\n type.setAttribute(key, val)\n }\n }\n type.insert(\n 0,\n normalizePNodeContent(node).map((n) =>\n createTypeFromTextOrElementNode(n, mapping)\n )\n )\n mapping.set(type, node)\n return type\n}\n\n/**\n * @private\n * @param {PModel.Node|Array<PModel.Node>} node prosemirror text node\n * @param {ProsemirrorMapping} mapping\n * @return {Y.XmlElement|Y.XmlText}\n */\nconst createTypeFromTextOrElementNode = (node, mapping) =>\n node instanceof Array\n ? createTypeFromTextNodes(node, mapping)\n : createTypeFromElementNode(node, mapping)\n\nconst isObject = (val) => typeof val === 'object' && val !== null\n\nconst equalAttrs = (pattrs, yattrs) => {\n const keys = Object.keys(pattrs).filter((key) => pattrs[key] !== null)\n let eq =\n keys.length ===\n Object.keys(yattrs).filter((key) => yattrs[key] !== null).length\n for (let i = 0; i < keys.length && eq; i++) {\n const key = keys[i]\n const l = pattrs[key]\n const r = yattrs[key]\n eq = key === 'ychange' || l === r ||\n (isObject(l) && isObject(r) && equalAttrs(l, r))\n }\n return eq\n}\n\n/**\n * @typedef {Array<Array<PModel.Node>|PModel.Node>} NormalizedPNodeContent\n */\n\n/**\n * @param {any} pnode\n * @return {NormalizedPNodeContent}\n */\nconst normalizePNodeContent = (pnode) => {\n const c = pnode.content.content\n const res = []\n for (let i = 0; i < c.length; i++) {\n const n = c[i]\n if (n.isText) {\n const textNodes = []\n for (let tnode = c[i]; i < c.length && tnode.isText; tnode = c[++i]) {\n textNodes.push(tnode)\n }\n i--\n res.push(textNodes)\n } else {\n res.push(n)\n }\n }\n return res\n}\n\n/**\n * @param {Y.XmlText} ytext\n * @param {Array<any>} ptexts\n */\nconst equalYTextPText = (ytext, ptexts) => {\n const delta = ytext.toDelta()\n return delta.length === ptexts.length &&\n delta.every((d, i) =>\n d.insert === /** @type {any} */ (ptexts[i]).text &&\n object.keys(d.attributes || {}).length === ptexts[i].marks.length &&\n ptexts[i].marks.every((mark) =>\n equalAttrs(d.attributes[mark.type.name] || {}, mark.attrs)\n )\n )\n}\n\n/**\n * @param {Y.XmlElement|Y.XmlText|Y.XmlHook} ytype\n * @param {any|Array<any>} pnode\n */\nconst equalYTypePNode = (ytype, pnode) => {\n if (\n ytype instanceof Y.XmlElement && !(pnode instanceof Array) &&\n matchNodeName(ytype, pnode)\n ) {\n const normalizedContent = normalizePNodeContent(pnode)\n return ytype._length === normalizedContent.length &&\n equalAttrs(ytype.getAttributes(), pnode.attrs) &&\n ytype.toArray().every((ychild, i) =>\n equalYTypePNode(ychild, normalizedContent[i])\n )\n }\n return ytype instanceof Y.XmlText && pnode instanceof Array &&\n equalYTextPText(ytype, pnode)\n}\n\n/**\n * @param {PModel.Node | Array<PModel.Node> | undefined} mapped\n * @param {PModel.Node | Array<PModel.Node>} pcontent\n */\nconst mappedIdentity = (mapped, pcontent) =>\n mapped === pcontent ||\n (mapped instanceof Array && pcontent instanceof Array &&\n mapped.length === pcontent.length && mapped.every((a, i) =>\n pcontent[i] === a\n ))\n\n/**\n * @param {Y.XmlElement} ytype\n * @param {PModel.Node} pnode\n * @param {ProsemirrorMapping} mapping\n * @return {{ foundMappedChild: boolean, equalityFactor: number }}\n */\nconst computeChildEqualityFactor = (ytype, pnode, mapping) => {\n const yChildren = ytype.toArray()\n const pChildren = normalizePNodeContent(pnode)\n const pChildCnt = pChildren.length\n const yChildCnt = yChildren.length\n const minCnt = math.min(yChildCnt, pChildCnt)\n let left = 0\n let right = 0\n let foundMappedChild = false\n for (; left < minCnt; left++) {\n const leftY = yChildren[left]\n const leftP = pChildren[left]\n if (mappedIdentity(mapping.get(leftY), leftP)) {\n foundMappedChild = true // definite (good) match!\n } else if (!equalYTypePNode(leftY, leftP)) {\n break\n }\n }\n for (; left + right < minCnt; right++) {\n const rightY = yChildren[yChildCnt - right - 1]\n const rightP = pChildren[pChildCnt - right - 1]\n if (mappedIdentity(mapping.get(rightY), rightP)) {\n foundMappedChild = true\n } else if (!equalYTypePNode(rightY, rightP)) {\n break\n }\n }\n return {\n equalityFactor: left + right,\n foundMappedChild\n }\n}\n\nconst ytextTrans = (ytext) => {\n let str = ''\n /**\n * @type {Y.Item|null}\n */\n let n = ytext._start\n const nAttrs = {}\n while (n !== null) {\n if (!n.deleted) {\n if (n.countable && n.content instanceof Y.ContentString) {\n str += n.content.str\n } else if (n.content instanceof Y.ContentFormat) {\n nAttrs[n.content.key] = null\n }\n }\n n = n.right\n }\n return {\n str,\n nAttrs\n }\n}\n\n/**\n * @todo test this more\n *\n * @param {Y.Text} ytext\n * @param {Array<any>} ptexts\n * @param {ProsemirrorMapping} mapping\n */\nconst updateYText = (ytext, ptexts, mapping) => {\n mapping.set(ytext, ptexts)\n const { nAttrs, str } = ytextTrans(ytext)\n const content = ptexts.map((p) => ({\n insert: /** @type {any} */ (p).text,\n attributes: Object.assign({}, nAttrs, marksToAttributes(p.marks))\n }))\n const { insert, remove, index } = simpleDiff(\n str,\n content.map((c) => c.insert).join('')\n )\n ytext.delete(index, remove)\n ytext.insert(index, insert)\n ytext.applyDelta(\n content.map((c) => ({ retain: c.insert.length, attributes: c.attributes }))\n )\n}\n\nconst marksToAttributes = (marks) => {\n const pattrs = {}\n marks.forEach((mark) => {\n if (mark.type.name !== 'ychange') {\n pattrs[mark.type.name] = mark.attrs\n }\n })\n return pattrs\n}\n\n/**\n * Update a yDom node by syncing the current content of the prosemirror node.\n *\n * This is a y-prosemirror internal feature that you can use at your own risk.\n *\n * @private\n * @unstable\n *\n * @param {{transact: Function}} y\n * @param {Y.XmlFragment} yDomFragment\n * @param {any} pNode\n * @param {ProsemirrorMapping} mapping\n */\nexport const updateYFragment = (y, yDomFragment, pNode, mapping) => {\n if (\n yDomFragment instanceof Y.XmlElement &&\n yDomFragment.nodeName !== pNode.type.name\n ) {\n throw new Error('node name mismatch!')\n }\n mapping.set(yDomFragment, pNode)\n // update attributes\n if (yDomFragment instanceof Y.XmlElement) {\n const yDomAttrs = yDomFragment.getAttributes()\n const pAttrs = pNode.attrs\n for (const key in pAttrs) {\n if (pAttrs[key] !== null) {\n if (yDomAttrs[key] !== pAttrs[key] && key !== 'ychange') {\n yDomFragment.setAttribute(key, pAttrs[key])\n }\n } else {\n yDomFragment.removeAttribute(key)\n }\n }\n // remove all keys that are no longer in pAttrs\n for (const key in yDomAttrs) {\n if (pAttrs[key] === undefined) {\n yDomFragment.removeAttribute(key)\n }\n }\n }\n // update children\n const pChildren = normalizePNodeContent(pNode)\n const pChildCnt = pChildren.length\n const yChildren = yDomFragment.toArray()\n const yChildCnt = yChildren.length\n const minCnt = math.min(pChildCnt, yChildCnt)\n let left = 0\n let right = 0\n // find number of matching elements from left\n for (; left < minCnt; left++) {\n const leftY = yChildren[left]\n const leftP = pChildren[left]\n if (!mappedIdentity(mapping.get(leftY), leftP)) {\n if (equalYTypePNode(leftY, leftP)) {\n // update mapping\n mapping.set(leftY, leftP)\n } else {\n break\n }\n }\n }\n // find number of matching elements from right\n for (; right + left + 1 < minCnt; right++) {\n const rightY = yChildren[yChildCnt - right - 1]\n const rightP = pChildren[pChildCnt - right - 1]\n if (!mappedIdentity(mapping.get(rightY), rightP)) {\n if (equalYTypePNode(rightY, rightP)) {\n // update mapping\n mapping.set(rightY, rightP)\n } else {\n break\n }\n }\n }\n y.transact(() => {\n // try to compare and update\n while (yChildCnt - left - right > 0 && pChildCnt - left - right > 0) {\n const leftY = yChildren[left]\n const leftP = pChildren[left]\n const rightY = yChildren[yChildCnt - right - 1]\n const rightP = pChildren[pChildCnt - right - 1]\n if (leftY instanceof Y.XmlText && leftP instanceof Array) {\n if (!equalYTextPText(leftY, leftP)) {\n updateYText(leftY, leftP, mapping)\n }\n left += 1\n } else {\n let updateLeft = leftY instanceof Y.XmlElement &&\n matchNodeName(leftY, leftP)\n let updateRight = rightY instanceof Y.XmlElement &&\n matchNodeName(rightY, rightP)\n if (updateLeft && updateRight) {\n // decide which which element to update\n const equalityLeft = computeChildEqualityFactor(\n /** @type {Y.XmlElement} */ (leftY),\n /** @type {PModel.Node} */ (leftP),\n mapping\n )\n const equalityRight = computeChildEqualityFactor(\n /** @type {Y.XmlElement} */ (rightY),\n /** @type {PModel.Node} */ (rightP),\n mapping\n )\n if (\n equalityLeft.foundMappedChild && !equalityRight.foundMappedChild\n ) {\n updateRight = false\n } else if (\n !equalityLeft.foundMappedChild && equalityRight.foundMappedChild\n ) {\n updateLeft = false\n } else if (\n equalityLeft.equalityFactor < equalityRight.equalityFactor\n ) {\n updateLeft = false\n } else {\n updateRight = false\n }\n }\n if (updateLeft) {\n updateYFragment(\n y,\n /** @type {Y.XmlFragment} */ (leftY),\n /** @type {PModel.Node} */ (leftP),\n mapping\n )\n left += 1\n } else if (updateRight) {\n updateYFragment(\n y,\n /** @type {Y.XmlFragment} */ (rightY),\n /** @type {PModel.Node} */ (rightP),\n mapping\n )\n right += 1\n } else {\n mapping.delete(yDomFragment.get(left))\n yDomFragment.delete(left, 1)\n yDomFragment.insert(left, [\n createTypeFromTextOrElementNode(leftP, mapping)\n ])\n left += 1\n }\n }\n }\n const yDelLen = yChildCnt - left - right\n if (\n yChildCnt === 1 && pChildCnt === 0 && yChildren[0] instanceof Y.XmlText\n ) {\n mapping.delete(yChildren[0])\n // Edge case handling https://github.com/yjs/y-prosemirror/issues/108\n // Only delete the content of the Y.Text to retain remote changes on the same Y.Text object\n yChildren[0].delete(0, yChildren[0].length)\n } else if (yDelLen > 0) {\n yDomFragment.slice(left, left + yDelLen).forEach(type => mapping.delete(type))\n yDomFragment.delete(left, yDelLen)\n }\n if (left + right < pChildCnt) {\n const ins = []\n for (let i = left; i < pChildCnt - right; i++) {\n ins.push(createTypeFromTextOrElementNode(pChildren[i], mapping))\n }\n yDomFragment.insert(left, ins)\n }\n }, ySyncPluginKey)\n}\n\n/**\n * @function\n * @param {Y.XmlElement} yElement\n * @param {any} pNode Prosemirror Node\n */\nconst matchNodeName = (yElement, pNode) =>\n !(pNode instanceof Array) && yElement.nodeName === pNode.type.name\n","import { updateYFragment, createNodeFromYElement } from './plugins/sync-plugin.js' // eslint-disable-line\nimport { ySyncPluginKey } from './plugins/keys.js'\nimport * as Y from 'yjs'\nimport { EditorView } from 'prosemirror-view' // eslint-disable-line\nimport { Node, Schema, Fragment } from 'prosemirror-model' // eslint-disable-line\nimport * as error from 'lib0/error'\nimport * as map from 'lib0/map'\nimport * as eventloop from 'lib0/eventloop'\n\n/**\n * Either a node if type is YXmlElement or an Array of text nodes if YXmlText\n * @typedef {Map<Y.AbstractType, Node | Array<Node>>} ProsemirrorMapping\n */\n\n/**\n * Is null if no timeout is in progress.\n * Is defined if a timeout is in progress.\n * Maps from view\n * @type {Map<EditorView, Map<any, any>>|null}\n */\nlet viewsToUpdate = null\n\nconst updateMetas = () => {\n const ups = /** @type {Map<EditorView, Map<any, any>>} */ (viewsToUpdate)\n viewsToUpdate = null\n ups.forEach((metas, view) => {\n const tr = view.state.tr\n const syncState = ySyncPluginKey.getState(view.state)\n if (syncState && syncState.binding && !syncState.binding.isDestroyed) {\n metas.forEach((val, key) => {\n tr.setMeta(key, val)\n })\n view.dispatch(tr)\n }\n })\n}\n\nexport const setMeta = (view, key, value) => {\n if (!viewsToUpdate) {\n viewsToUpdate = new Map()\n eventloop.timeout(0, updateMetas)\n }\n map.setIfUndefined(viewsToUpdate, view, map.create).set(key, value)\n}\n\n/**\n * Transforms a Prosemirror based absolute position to a Yjs Cursor (relative position in the Yjs model).\n *\n * @param {number} pos\n * @param {Y.XmlFragment} type\n * @param {ProsemirrorMapping} mapping\n * @return {any} relative position\n */\nexport const absolutePositionToRelativePosition = (pos, type, mapping) => {\n if (pos === 0) {\n return Y.createRelativePositionFromTypeIndex(type, 0, -1)\n }\n /**\n * @type {any}\n */\n let n = type._first === null ? null : /** @type {Y.ContentType} */ (type._first.content).type\n while (n !== null && type !== n) {\n if (n instanceof Y.XmlText) {\n if (n._length >= pos) {\n return Y.createRelativePositionFromTypeIndex(n, pos, -1)\n } else {\n pos -= n._length\n }\n if (n._item !== null && n._item.next !== null) {\n n = /** @type {Y.ContentType} */ (n._item.next.content).type\n } else {\n do {\n n = n._item === null ? null : n._item.parent\n pos--\n } while (n !== type && n !== null && n._item !== null && n._item.next === null)\n if (n !== null && n !== type) {\n // @ts-gnore we know that n.next !== null because of above loop conditition\n n = n._item === null ? null : /** @type {Y.ContentType} */ (/** @type Y.Item */ (n._item.next).content).type\n }\n }\n } else {\n const pNodeSize = /** @type {any} */ (mapping.get(n) || { nodeSize: 0 }).nodeSize\n if (n._first !== null && pos < pNodeSize) {\n n = /** @type {Y.ContentType} */ (n._first.content).type\n pos--\n } else {\n if (pos === 1 && n._length === 0 && pNodeSize > 1) {\n // edge case, should end in this paragraph\n return new Y.RelativePosition(n._item === null ? null : n._item.id, n._item === null ? Y.findRootTypeKey(n) : null, null)\n }\n pos -= pNodeSize\n if (n._item !== null && n._item.next !== null) {\n n = /** @type {Y.ContentType} */ (n._item.next.content).type\n } else {\n if (pos === 0) {\n // set to end of n.parent\n n = n._item === null ? n : n._item.parent\n return new Y.RelativePosition(n._item === null ? null : n._item.id, n._item === null ? Y.findRootTypeKey(n) : null, null)\n }\n do {\n n = /** @type {Y.Item} */ (n._item).parent\n pos--\n } while (n !== type && /** @type {Y.Item} */ (n._item).next === null)\n // if n is null at this point, we have an unexpected case\n if (n !== type) {\n // We know that n._item.next is defined because of above loop condition\n n = /** @type {Y.ContentType} */ (/** @type {Y.Item} */ (/** @type {Y.Item} */ (n._item).next).content).type\n }\n }\n }\n }\n if (n === null) {\n throw error.unexpectedCase()\n }\n if (pos === 0 && n.constructor !== Y.XmlText && n !== type) { // TODO: set to <= 0\n return createRelativePosition(n._item.parent, n._item)\n }\n }\n return Y.createRelativePositionFromTypeIndex(type, type._length, -1)\n}\n\nconst createRelativePosition = (type, item) => {\n let typeid = null\n let tname = null\n if (type._item === null) {\n tname = Y.findRootTypeKey(type)\n } else {\n typeid = Y.createID(type._item.id.client, type._item.id.clock)\n }\n return new Y.RelativePosition(typeid, tname, item.id)\n}\n\n/**\n * @param {Y.Doc} y\n * @param {Y.XmlFragment} documentType Top level type that is bound to pView\n * @param {any} relPos Encoded Yjs based relative position\n * @param {ProsemirrorMapping} mapping\n * @return {null|number}\n */\nexport const relativePositionToAbsolutePosition = (y, documentType, relPos, mapping) => {\n const decodedPos = Y.createAbsolutePositionFromRelativePosition(relPos, y)\n if (decodedPos === null || (decodedPos.type !== documentType && !Y.isParentOf(documentType, decodedPos.type._item))) {\n return null\n }\n let type = decodedPos.type\n let pos = 0\n if (type.constructor === Y.XmlText) {\n pos = decodedPos.index\n } else if (type._item === null || !type._item.deleted) {\n let n = type._first\n let i = 0\n while (i < type._length && i < decodedPos.index && n !== null) {\n if (!n.deleted) {\n const t = /** @type {Y.ContentType} */ (n.content).type\n i++\n if (t instanceof Y.XmlText) {\n pos += t._length\n } else {\n pos += /** @type {any} */ (mapping.get(t)).nodeSize\n }\n }\n n = /** @type {Y.Item} */ (n.right)\n }\n pos += 1 // increase because we go out of n\n }\n while (type !== documentType && type._item !== null) {\n // @ts-ignore\n const parent = type._item.parent\n // @ts-ignore\n if (parent._item === null || !parent._item.deleted) {\n pos += 1 // the start tag\n let n = /** @type {Y.AbstractType} */ (parent)._first\n // now iterate until we found type\n while (n !== null) {\n const contentType = /** @type {Y.ContentType} */ (n.content).type\n if (contentType === type) {\n break\n }\n if (!n.deleted) {\n if (contentType instanceof Y.XmlText) {\n pos += contentType._length\n } else {\n pos += /** @type {any} */ (mapping.get(contentType)).nodeSize\n }\n }\n n = n.right\n }\n }\n type = /** @type {Y.AbstractType} */ (parent)\n }\n return pos - 1 // we don't count the most outer tag, because it is a fragment\n}\n\n/**\n * Utility function for converting an Y.Fragment to a ProseMirror fragment.\n *\n * @param {Y.XmlFragment} yXmlFragment\n * @param {Schema} schema\n */\nexport const yXmlFragmentToProseMirrorFragment = (yXmlFragment, schema) => {\n const fragmentContent = yXmlFragment.toArray().map((t) =>\n createNodeFromYElement(\n /** @type {Y.XmlElement} */ (t),\n schema,\n new Map()\n )\n ).filter((n) => n !== null)\n return Fragment.fromArray(fragmentContent)\n}\n\n/**\n * Utility function for converting an Y.Fragment to a ProseMirror node.\n *\n * @param {Y.XmlFragment} yXmlFragment\n * @param {Schema} schema\n */\nexport const yXmlFragmentToProseMirrorRootNode = (yXmlFragment, schema) =>\n schema.topNodeType.create(null, yXmlFragmentToProseMirrorFragment(yXmlFragment, schema))\n\n/**\n * The initial ProseMirror content should be supplied by Yjs. This function transforms a Y.Fragment\n * to a ProseMirror Doc node and creates a mapping that is used by the sync plugin.\n *\n * @param {Y.XmlFragment} yXmlFragment\n * @param {Schema} schema\n */\nexport const initProseMirrorDoc = (yXmlFragment, schema) => {\n /**\n * @type {ProsemirrorMapping}\n */\n const mapping = new Map()\n const fragmentContent = yXmlFragment.toArray().map((t) =>\n createNodeFromYElement(\n /** @type {Y.XmlElement} */ (t),\n schema,\n mapping\n )\n ).filter((n) => n !== null)\n const doc = schema.topNodeType.create(null, Fragment.fromArray(fragmentContent))\n return { doc, mapping }\n}\n\n/**\n * Utility method to convert a Prosemirror Doc Node into a Y.Doc.\n *\n * This can be used when importing existing content to Y.Doc for the first time,\n * note that this should not be used to rehydrate a Y.Doc from a database once\n * collaboration has begun as all history will be lost\n *\n * @param {Node} doc\n * @param {string} xmlFragment\n * @return {Y.Doc}\n */\nexport function prosemirrorToYDoc (doc, xmlFragment = 'prosemirror') {\n const ydoc = new Y.Doc()\n const type = /** @type {Y.XmlFragment} */ (ydoc.get(xmlFragment, Y.XmlFragment))\n if (!type.doc) {\n return ydoc\n }\n\n prosemirrorToYXmlFragment(doc, type)\n return type.doc\n}\n\n/**\n * Utility method to update an empty Y.XmlFragment with content from a Prosemirror Doc Node.\n *\n * This can be used when importing existing content to Y.Doc for the first time,\n * note that this should not be used to rehydrate a Y.Doc from a database once\n * collaboration has begun as all history will be lost\n *\n * Note: The Y.XmlFragment does not need to be part of a Y.Doc document at the time that this\n * method is called, but it must be added before any other operations are performed on it.\n *\n * @param {Node} doc prosemirror document.\n * @param {Y.XmlFragment} [xmlFragment] If supplied, an xml fragment to be\n * populated from the prosemirror state; otherwise a new XmlFragment will be created.\n * @return {Y.XmlFragment}\n */\nexport function prosemirrorToYXmlFragment (doc, xmlFragment) {\n const type = xmlFragment || new Y.XmlFragment()\n const ydoc = type.doc ? type.doc : { transact: (transaction) => transaction(undefined) }\n updateYFragment(ydoc, type, doc, new Map())\n return type\n}\n\n/**\n * Utility method to convert Prosemirror compatible JSON into a Y.Doc.\n *\n * This can be used when importing existing content to Y.Doc for the first time,\n * note that this should not be used to rehydrate a Y.Doc from a database once\n * collaboration has begun as all history will be lost\n *\n * @param {Schema} schema\n * @param {any} state\n * @param {string} xmlFragment\n * @return {Y.Doc}\n */\nexport function prosemirrorJSONToYDoc (schema, state, xmlFragment = 'prosemirror') {\n const doc = Node.fromJSON(schema, state)\n return prosemirrorToYDoc(doc, xmlFragment)\n}\n\n/**\n * Utility method to convert Prosemirror compatible JSON to a Y.XmlFragment\n *\n * This can be used when importing existing content to Y.Doc for the first time,\n * note that this should not be used to rehydrate a Y.Doc from a database once\n * collaboration has begun as all history will be lost\n *\n * @param {Schema} schema\n * @param {any} state\n * @param {Y.XmlFragment} [xmlFragment] If supplied, an xml fragment to be\n * populated from the prosemirror state; otherwise a new XmlFragment will be created.\n * @return {Y.XmlFragment}\n */\nexport function prosemirrorJSONToYXmlFragment (schema, state, xmlFragment) {\n const doc = Node.fromJSON(schema, state)\n return prosemirrorToYXmlFragment(doc, xmlFragment)\n}\n\n/**\n * @deprecated Use `yXmlFragmentToProseMirrorRootNode` instead\n *\n * Utility method to convert a Y.Doc to a Prosemirror Doc node.\n *\n * @param {Schema} schema\n * @param {Y.Doc} ydoc\n * @return {Node}\n */\nexport function yDocToProsemirror (schema, ydoc) {\n const state = yDocToProsemirrorJSON(ydoc)\n return Node.fromJSON(schema, state)\n}\n\n/**\n *\n * @deprecated Use `yXmlFragmentToProseMirrorRootNode` instead\n *\n * Utility method to convert a Y.XmlFragment to a Prosemirror Doc node.\n *\n * @param {Schema} schema\n * @param {Y.XmlFragment} xmlFragment\n * @return {Node}\n */\nexport function yXmlFragmentToProsemirror (schema, xmlFragment) {\n const state = yXmlFragmentToProsemirrorJSON(xmlFragment)\n return Node.fromJSON(schema, state)\n}\n\n/**\n *\n * @deprecated Use `yXmlFragmentToProseMirrorRootNode` instead\n *\n * Utility method to convert a Y.Doc to Prosemirror compatible JSON.\n *\n * @param {Y.Doc} ydoc\n * @param {string} xmlFragment\n * @return {Record<string, any>}\n */\nexport function yDocToProsemirrorJSON (\n ydoc,\n xmlFragment = 'prosemirror'\n) {\n return yXmlFragmentToProsemirrorJSON(ydoc.getXmlFragment(xmlFragment))\n}\n\n/**\n * @deprecated Use `yXmlFragmentToProseMirrorRootNode` instead\n *\n * Utility method to convert a Y.Doc to Prosemirror compatible JSON.\n *\n * @param {Y.XmlFragment} xmlFragment The fragment, which must be part of a Y.Doc.\n * @return {Record<string, any>}\n */\nexport function yXmlFragmentToProsemirrorJSON (xmlFragment) {\n const items = xmlFragment.toArray()\n\n function serialize (item) {\n /**\n * @type {Object} NodeObject\n * @property {string} NodeObject.type\n * @property {Record<string, string>=} NodeObject.attrs\n * @property {Array<NodeObject>=} NodeObject.content\n */\n let response\n\n // TODO: Must be a better way to detect text nodes than this\n if (!item.nodeName) {\n const delta = item.toDelta()\n response = delta.map((d) => {\n const text = {\n type: 'text',\n text: d.insert\n }\n\n if (d.attributes) {\n text.marks = Object.keys(d.attributes).map((type) => {\n const attrs = d.attributes[type]\n const mark = {\n type\n }\n\n if (Object.keys(attrs)) {\n mark.attrs = attrs\n }\n\n return mark\n })\n }\n return text\n })\n } else {\n response = {\n type: item.nodeName\n }\n\n const attrs = item.getAttributes()\n if (Object.keys(attrs).length) {\n response.attrs = attrs\n }\n\n const children = item.toArray()\n if (children.length) {\n response.content = children.map(serialize).flat()\n }\n }\n\n return response\n }\n\n return {\n type: 'doc',\n content: items.map(serialize)\n }\n}\n","import * as Y from 'yjs'\nimport { Decoration, DecorationSet } from \"prosemirror-view\"; // eslint-disable-line\nimport { Plugin } from \"prosemirror-state\"; // eslint-disable-line\nimport { Awareness } from \"y-protocols/awareness\"; // eslint-disable-line\nimport {\n absolutePositionToRelativePosition,\n relativePositionToAbsolutePosition,\n setMeta\n} from '../lib.js'\nimport { yCursorPluginKey, ySyncPluginKey } from './keys.js'\n\nimport * as math from 'lib0/math'\n\n/**\n * Default awareness state filter\n *\n * @param {number} currentClientId current client id\n * @param {number} userClientId user client id\n * @param {any} _user user data\n * @return {boolean}\n */\nexport const defaultAwarenessStateFilter = (currentClientId, userClientId, _user) => currentClientId !== userClientId\n\n/**\n * Default generator for a cursor element\n *\n * @param {any} user user data\n * @return {HTMLElement}\n */\nexport const defaultCursorBuilder = (user) => {\n const cursor = document.createElement('span')\n cursor.classList.add('ProseMirror-yjs-cursor')\n cursor.setAttribute('style', `border-color: ${user.color}`)\n const userDiv = document.createElement('div')\n userDiv.setAttribute('style', `background-color: ${user.color}`)\n userDiv.insertBefore(document.createTextNode(user.name), null)\n const nonbreakingSpace1 = document.createTextNode('\\u2060')\n const nonbreakingSpace2 = document.createTextNode('\\u2060')\n cursor.insertBefore(nonbreakingSpace1, null)\n cursor.insertBefore(userDiv, null)\n cursor.insertBefore(nonbreakingSpace2, null)\n return cursor\n}\n\n/**\n * Default generator for the selection attributes\n *\n * @param {any} user user data\n * @return {import('prosemirror-view').DecorationAttrs}\n */\nexport const defaultSelectionBuilder = (user) => {\n return {\n style: `background-color: ${user.color}70`,\n class: 'ProseMirror-yjs-selection'\n }\n}\n\nconst rxValidColor = /^#[0-9a-fA-F]{6}$/\n\n/**\n * @param {any} state\n * @param {Awareness} awareness\n * @param {function(number, number, any):boolean} awarenessFilter\n * @param {(user: { name: string, color: string }, clientId: number) => Element} createCursor\n * @param {(user: { name: string, color: string }, clientId: number) => import('prosemirror-view').DecorationAttrs} createSelection\n * @return {any} DecorationSet\n */\nexport const createDecorations = (\n state,\n awareness,\n awarenessFilter,\n createCursor,\n createSelection\n) => {\n const ystate = ySyncPluginKey.getState(state)\n const y = ystate.doc\n const decorations = []\n if (\n ystate.snapshot != null || ystate.prevSnapshot != null ||\n ystate.binding.mapping.size === 0\n ) {\n // do not render cursors while snapshot is active\n return DecorationSet.create(state.doc, [])\n }\n awareness.getStates().forEach((aw, clientId) => {\n if (!awarenessFilter(y.clientID, clientId, aw)) {\n return\n }\n\n if (aw.cursor != null) {\n const user = aw.user || {}\n if (user.color == null) {\n user.color = '#ffa500'\n } else if (!rxValidColor.test(user.color)) {\n // We only support 6-digit RGB colors in y-prosemirror\n console.warn('A user uses an unsupported color format', user)\n }\n if (user.name == null) {\n user.name = `User: ${clientId}`\n }\n let anchor = relativePositionToAbsolutePosition(\n y,\n ystate.type,\n Y.createRelativePositionFromJSON(aw.cursor.anchor),\n ystate.binding.mapping\n )\n let head = relativePositionToAbsolutePosition(\n y,\n ystate.type,\n Y.createRelativePositionFromJSON(aw.cursor.head),\n ystate.binding.mapping\n )\n if (anchor !== null && head !== null) {\n const maxsize = math.max(state.doc.content.size - 1, 0)\n anchor = math.min(anchor, maxsize)\n head = math.min(head, maxsize)\n decorations.push(\n Decoration.widget(head, () => createCursor(user, clientId), {\n key: clientId + '',\n side: 10\n })\n )\n const from = math.min(anchor, head)\n const to = math.max(anchor, head)\n decorations.push(\n Decoration.inline(from, to, createSelection(user, clientId), {\n inclusiveEnd: true,\n inclusiveStart: false\n })\n )\n }\n }\n })\n return DecorationSet.create(state.doc, decorations)\n}\n\n/**\n * A prosemirror plugin that listens to awareness information on Yjs.\n * This requires that a `prosemirrorPlugin` is also bound to the prosemirror.\n *\n * @public\n * @param {Awareness} awareness\n * @param {object} opts\n * @param {function(any, any, any):boolean} [opts.awarenessStateFilter]\n * @param {(user: any, clientId: number) => HTMLElement} [opts.cursorBuilder]\n * @param {(user: any, clientId: number) => import('prosemirror-view').DecorationAttrs} [opts.selectionBuilder]\n * @param {function(any):any} [opts.getSelection]\n * @param {string} [cursorStateField] By default all editor bindings use the awareness 'cursor' field to propagate cursor information.\n * @return {any}\n */\nexport const yCursorPlugin = (\n awareness,\n {\n awarenessStateFilter = defaultAwarenessStateFilter,\n cursorBuilder = defaultCursorBuilder,\n selectionBuilder = defaultSelectionBuilder,\n getSelection = (state) => state.selection\n } = {},\n cursorStateField = 'cursor'\n) =>\n new Plugin({\n key: yCursorPluginKey,\n state: {\n init (_, state) {\n return createDecorations(\n state,\n awareness,\n awarenessStateFilter,\n cursorBuilder,\n selectionBuilder\n )\n },\n apply (tr, prevState, _oldState, newState) {\n const ystate = ySyncPluginKey.getState(newState)\n const yCursorState = tr.getMeta(yCursorPluginKey)\n if (\n (ystate && ystate.isChangeOrigin) ||\n (yCursorState && yCursorState.awarenessUpdated)\n ) {\n return createDecorations(\n newState,\n awareness,\n awarenessStateFilter,\n cursorBuilder,\n selectionBuilder\n )\n }\n return prevState.map(tr.mapping, tr.doc)\n }\n },\n props: {\n decorations: (state) => {\n return yCursorPluginKey.getState(state)\n }\n },\n view: (view) => {\n const awarenessListener = () => {\n // @ts-ignore\n if (view.docView) {\n setMeta(view, yCursorPluginKey, { awarenessUpdated: true })\n }\n }\n const updateCursorInfo = () => {\n const ystate = ySyncPluginKey.getState(view.state)\n // @note We make implicit checks when checking for the cursor property\n const current = awareness.getLocalState() || {}\n if (view.hasFocus()) {\n const selection = getSelection(view.state)\n /**\n * @type {Y.RelativePosition}\n */\n const anchor = absolutePositionToRelativePosition(\n selection.anchor,\n ystate.type,\n ystate.binding.mapping\n )\n /**\n * @type {Y.RelativePosition}\n */\n const head = absolutePositionToRelativePosition(\n selection.head,\n ystate.type,\n ystate.binding.mapping\n )\n if (\n current.cursor == null ||\n !Y.compareRelativePositions(\n Y.createRelativePositionFromJSON(current.cursor.anchor),\n anchor\n ) ||\n !Y.compareRelativePositions(\n Y.createRelativePositionFromJSON(current.cursor.head),\n head\n )\n ) {\n awareness.setLocalStateField(cursorStateField, {\n anchor,\n head\n })\n }\n } else if (\n current.cursor != null &&\n relativePositionToAbsolutePosition(\n ystate.doc,\n ystate.type,\n Y.createRelativePositionFromJSON(current.cursor.anchor),\n ystate.binding.mapping\n ) !== null\n ) {\n // delete cursor information if current cursor information is owned by this editor binding\n awareness.setLocalStateField(cursorStateField, null)\n }\n }\n awareness.on('change', awarenessListener)\n view.dom.addEventListener('focusin', updateCursorInfo)\n view.dom.addEventListener('focusout', updateCursorInfo)\n return {\n update: updateCursorInfo,\n destroy: () => {\n view.dom.removeEventListener('focusin', updateCursorInfo)\n view.dom.removeEventListener('focusout', updateCursorInfo)\n awareness.off('change', awarenessListener)\n awareness.setLocalStateField(cursorStateField, null)\n }\n }\n }\n })\n","import { Plugin } from 'prosemirror-state' // eslint-disable-line\n\nimport { getRelativeSelection } from './sync-plugin.js'\nimport { UndoManager, Item, ContentType, XmlElement, Text } from 'yjs'\nimport { yUndoPluginKey, ySyncPluginKey } from './keys.js'\n\nexport const undo = state => {\n const undoManager = yUndoPluginKey.getState(state).undoManager\n if (undoManager != null) {\n undoManager.undo()\n return true\n }\n}\n\nexport const redo = state => {\n const undoManager = yUndoPluginKey.getState(state).undoManager\n if (undoManager != null) {\n undoManager.redo()\n return true\n }\n}\n\nexport const defaultProtectedNodes = new Set(['paragraph'])\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))) ||\nitem.content.type._length === 0\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 /**\n * @returns {any}\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","/**\n * EventEmitter class is used to emit and subscribe to events.\n */\nexport class EventEmitter {\n #events = new Map();\n\n /**\n * Subscribe to the event.\n * @param name Event name.\n * @param fn Callback.\n */\n on(name, fn) {\n const callbacks = this.#events.get(name);\n if (callbacks) callbacks.push(fn);\n else this.#events.set(name, [fn]);\n }\n\n /**\n * Emit event.\n * @param name Event name.\n * @param args Arguments.\n */\n emit(name, ...args) {\n const callbacks = this.#events.get(name);\n if (!callbacks) return;\n for (const fn of callbacks) {\n fn.apply(this, args);\n }\n }\n\n /**\n * Remove a specific callback from event\n * or all event subscriptions.\n * @param name Event name.\n * @param fn Callback.\n */\n off(name, fn) {\n const callbacks = this.#events.get(name);\n if (!callbacks) return;\n if (fn) {\n this.#events.set(\n name,\n callbacks.filter((cb) => cb !== fn),\n );\n } else {\n this.#events.delete(name);\n }\n }\n\n /**\n * Remove all registered events and subscriptions.\n */\n removeAllListeners() {\n this.#events = new Map();\n }\n}\n","export var base = {\n 8: \"Backspace\",\n 9: \"Tab\",\n 10: \"Enter\",\n 12: \"NumLock\",\n 13: \"Enter\",\n 16: \"Shift\",\n 17: \"Control\",\n 18: \"Alt\",\n 20: \"CapsLock\",\n 27: \"Escape\",\n 32: \" \",\n 33: \"PageUp\",\n 34: \"PageDown\",\n 35: \"End\",\n 36: \"Home\",\n 37: \"ArrowLeft\",\n 38: \"ArrowUp\",\n 39: \"ArrowRight\",\n 40: \"ArrowDown\",\n 44: \"PrintScreen\",\n 45: \"Insert\",\n 46: \"Delete\",\n 59: \";\",\n 61: \"=\",\n 91: \"Meta\",\n 92: \"Meta\",\n 106: \"*\",\n 107: \"+\",\n 108: \",\",\n 109: \"-\",\n 110: \".\",\n 111: \"/\",\n 144: \"NumLock\",\n 145: \"ScrollLock\",\n 160: \"Shift\",\n 161: \"Shift\",\n 162: \"Control\",\n 163: \"Control\",\n 164: \"Alt\",\n 165: \"Alt\",\n 173: \"-\",\n 186: \";\",\n 187: \"=\",\n 188: \",\",\n 189: \"-\",\n 190: \".\",\n 191: \"/\",\n 192: \"`\",\n 219: \"[\",\n 220: \"\\\\\",\n 221: \"]\",\n 222: \"'\"\n}\n\nexport var shift = {\n 48: \")\",\n 49: \"!\",\n 50: \"@\",\n 51: \"#\",\n 52: \"$\",\n 53: \"%\",\n 54: \"^\",\n 55: \"&\",\n 56: \"*\",\n 57: \"(\",\n 59: \":\",\n 61: \"+\",\n 173: \"_\",\n 186: \":\",\n 187: \"+\",\n 188: \"<\",\n 189: \"_\",\n 190: \">\",\n 191: \"?\",\n 192: \"~\",\n 219: \"{\",\n 220: \"|\",\n 221: \"}\",\n 222: \"\\\"\"\n}\n\nvar mac = typeof navigator != \"undefined\" && /Mac/.test(navigator.platform)\nvar ie = typeof navigator != \"undefined\" && /MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent)\n\n// Fill in the digit keys\nfor (var i = 0; i < 10; i++) base[48 + i] = base[96 + i] = String(i)\n\n// The function keys\nfor (var i = 1; i <= 24; i++) base[i + 111] = \"F\" + i\n\n// And the alphabetic keys\nfor (var i = 65; i <= 90; i++) {\n base[i] = String.fromCharCode(i + 32)\n shift[i] = String.fromCharCode(i)\n}\n\n// For each code that doesn't have a shift-equivalent, copy the base name\nfor (var code in base) if (!shift.hasOwnProperty(code)) shift[code] = base[code]\n\nexport function keyName(event) {\n // On macOS, keys held with Shift and Cmd don't reflect the effect of Shift in `.key`.\n // On IE, shift effect is never included in `.key`.\n var ignoreKey = mac && event.metaKey && event.shiftKey && !event.ctrlKey && !event.altKey ||\n ie && event.shiftKey && event.key && event.key.length == 1 ||\n event.key == \"Unidentified\"\n var name = (!ignoreKey && event.key) ||\n (event.shiftKey ? shift : base)[event.keyCode] ||\n event.key || \"Unidentified\"\n // Edge sometimes produces wrong names (Issue #3)\n if (name == \"Esc\") name = \"Escape\"\n if (name == \"Del\") name = \"Delete\"\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/\n if (name == \"Left\") name = \"ArrowLeft\"\n if (name == \"Up\") name = \"ArrowUp\"\n if (name == \"Right\") name = \"ArrowRight\"\n if (name == \"Down\") name = \"ArrowDown\"\n return name\n}\n","import { keyName, base } from 'w3c-keyname';\nimport { Plugin } from 'prosemirror-state';\n\nconst mac = typeof navigator != \"undefined\" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform) : false;\nfunction normalizeKeyName(name) {\n let parts = name.split(/-(?!$)/), result = parts[parts.length - 1];\n if (result == \"Space\")\n result = \" \";\n let alt, ctrl, shift, meta;\n for (let i = 0; i < parts.length - 1; i++) {\n let mod = parts[i];\n if (/^(cmd|meta|m)$/i.test(mod))\n meta = true;\n else if (/^a(lt)?$/i.test(mod))\n alt = true;\n else if (/^(c|ctrl|control)$/i.test(mod))\n ctrl = true;\n else if (/^s(hift)?$/i.test(mod))\n shift = true;\n else if (/^mod$/i.test(mod)) {\n if (mac)\n meta = true;\n else\n ctrl = true;\n }\n else\n throw new Error(\"Unrecognized modifier name: \" + mod);\n }\n if (alt)\n result = \"Alt-\" + result;\n if (ctrl)\n result = \"Ctrl-\" + result;\n if (meta)\n result = \"Meta-\" + result;\n if (shift)\n result = \"Shift-\" + result;\n return result;\n}\nfunction normalize(map) {\n let copy = Object.create(null);\n for (let prop in map)\n copy[normalizeKeyName(prop)] = map[prop];\n return copy;\n}\nfunction modifiers(name, event, shift = true) {\n if (event.altKey)\n name = \"Alt-\" + name;\n if (event.ctrlKey)\n name = \"Ctrl-\" + name;\n if (event.metaKey)\n name = \"Meta-\" + name;\n if (shift && event.shiftKey)\n name = \"Shift-\" + name;\n return name;\n}\n/**\nCreate a keymap plugin for the given set of bindings.\n\nBindings should map key names to [command](https://prosemirror.net/docs/ref/#commands)-style\nfunctions, which will be called with `(EditorState, dispatch,\nEditorView)` arguments, and should return true when they've handled\nthe key. Note that the view argument isn't part of the command\nprotocol, but can be used as an escape hatch if a binding needs to\ndirectly interact with the UI.\n\nKey names may be strings like `\"Shift-Ctrl-Enter\"`—a key\nidentifier prefixed with zero or more modifiers. Key identifiers\nare based on the strings that can appear in\n[`KeyEvent.key`](https:developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key).\nUse lowercase letters to refer to letter keys (or uppercase letters\nif you want shift to be held). You may use `\"Space\"` as an alias\nfor the `\" \"` name.\n\nModifiers can be given in any order. `Shift-` (or `s-`), `Alt-` (or\n`a-`), `Ctrl-` (or `c-` or `Control-`) and `Cmd-` (or `m-` or\n`Meta-`) are recognized. For characters that are created by holding\nshift, the `Shift-` prefix is implied, and should not be added\nexplicitly.\n\nYou can use `Mod-` as a shorthand for `Cmd-` on Mac and `Ctrl-` on\nother platforms.\n\nYou can add multiple keymap plugins to an editor. The order in\nwhich they appear determines their precedence (the ones early in\nthe array get to dispatch first).\n*/\nfunction keymap(bindings) {\n return new Plugin({ props: { handleKeyDown: keydownHandler(bindings) } });\n}\n/**\nGiven a set of bindings (using the same format as\n[`keymap`](https://prosemirror.net/docs/ref/#keymap.keymap)), return a [keydown\nhandler](https://prosemirror.net/docs/ref/#view.EditorProps.handleKeyDown) that handles them.\n*/\nfunction keydownHandler(bindings) {\n let map = normalize(bindings);\n return function (view, event) {\n let name = keyName(event), baseName, direct = map[modifiers(name, event)];\n if (direct && direct(view.state, view.dispatch, view))\n return true;\n // A character key\n if (name.length == 1 && name != \" \") {\n if (event.shiftKey) {\n // In case the name was already modified by shift, try looking\n // it up without its shift modifier\n let noShift = map[modifiers(name, event, false)];\n if (noShift && noShift(view.state, view.dispatch, view))\n return true;\n }\n if ((event.shiftKey || event.altKey || event.metaKey || name.charCodeAt(0) > 127) &&\n (baseName = base[event.keyCode]) && baseName != name) {\n // Try falling back to the keyCode when there's a modifier\n // active or the character produced isn't ASCII, and our table\n // produces a different name from the the keyCode. See #668,\n // #1060\n let fromCode = map[modifiers(baseName, event)];\n if (fromCode && fromCode(view.state, view.dispatch, view))\n return true;\n }\n }\n return false;\n };\n}\n\nexport { keydownHandler, keymap };\n","/**\n * Get node type from schema if it's a string or return directly.\n * @param nameOrType Name or type of the node.\n * @param schema Schema.\n * @returns Node type or null.\n */\nexport function getNodeType(nameOrType, schema) {\n if (typeof nameOrType === 'string') {\n if (!schema.nodes[nameOrType]) {\n throw Error(`There is no node type named '${nameOrType}' in schema.`);\n }\n\n return schema.nodes[nameOrType];\n }\n\n return nameOrType;\n}\n","/**\n * Get mark type from schema if it's a string or return directly.\n * @param nameOrType Name or type of the mark.\n * @param schema Schema.\n * @returns Mark type or null.\n */\nexport function getMarkType(nameOrType, schema) {\n if (typeof nameOrType === 'string') {\n if (!schema.marks[nameOrType]) {\n throw Error(`There is no mark type named '${nameOrType}' in schema.`);\n }\n\n return schema.marks[nameOrType];\n }\n\n return nameOrType;\n}\n","/**\n * Get the type of a schema item by its name.\n * @param name The name of the schema item.\n * @param schema The PM schema to search in.\n * @returns The type of the schema item (`node` or `mark`), or null if it doesn't exist.\n */\nexport function getSchemaTypeNameByName(name, schema) {\n if (schema.nodes[name]) return 'node';\n if (schema.marks[name]) return 'mark';\n return null;\n}\n","import { getExtensionConfigField } from './helpers/getExtensionConfigField.js';\nimport { getNodeType } from './helpers/getNodeType.js';\nimport { getMarkType } from './helpers/getMarkType.js';\nimport { getSchemaTypeNameByName } from './helpers/getSchemaTypeNameByName.js';\nimport { getMarksFromSelection } from './helpers/getMarksFromSelection.js';\n\n/**\n * Attribute class is a space that contains\n * methods for working with attributes.\n */\nexport class Attribute {\n /**\n * Get a list of all attributes defined in the extensions.\n * @param extensions List of all extensions.\n * @returns Extension attributes.\n */\n static getAttributesFromExtensions(extensions) {\n const extensionAttributes = [];\n\n const defaultAttribute = {\n default: null,\n rendered: true,\n renderDOM: null,\n parseDOM: null,\n keepOnSplit: true,\n };\n\n const globalAttributes = this.#getGlobalAttributes(extensions, defaultAttribute);\n const nodeAndMarksAttributes = this.#getNodeAndMarksAttributes(extensions, defaultAttribute);\n\n extensionAttributes.push(...globalAttributes, ...nodeAndMarksAttributes);\n\n return extensionAttributes;\n }\n\n /**\n * Get a list of global attributes defined in the extensions.\n * @param extensions List of all extensions.\n * @param defaultAttribute Default attribute.\n * @returns Global extension attributes.\n */\n static #getGlobalAttributes(extensions, defaultAttribute) {\n const extensionAttributes = [];\n\n const collectAttribute = (globalAttr) => {\n for (const type of globalAttr.types) {\n const entries = Object.entries(globalAttr.attributes);\n for (const [name, attribute] of entries) {\n extensionAttributes.push({\n type,\n name,\n attribute: {\n ...defaultAttribute,\n ...attribute,\n },\n });\n }\n }\n };\n\n for (const extension of extensions) {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n };\n\n const addGlobalAttributes = getExtensionConfigField(extension, 'addGlobalAttributes', context);\n\n if (!addGlobalAttributes) continue;\n\n const globalAttributes = addGlobalAttributes();\n\n for (const globalAttr of globalAttributes) {\n collectAttribute(globalAttr);\n }\n }\n\n return extensionAttributes;\n }\n\n /**\n * Get a list of attributes defined in the Node and Mark extensions.\n * @param extensions List of all extensions.\n * @param defaultAttribute Default attribute.\n * @returns Node and Mark extension attributes.\n */\n static #getNodeAndMarksAttributes(extensions, defaultAttribute) {\n const extensionAttributes = [];\n\n const nodeAndMarkExtensions = extensions.filter((e) => {\n return e.type === 'node' || e.type === 'mark';\n });\n\n for (const extension of nodeAndMarkExtensions) {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n };\n\n const addAttributes = getExtensionConfigField(extension, 'addAttributes', context);\n\n if (!addAttributes) continue;\n\n const attributes = addAttributes();\n\n for (const [name, attribute] of Object.entries(attributes)) {\n const merged = {\n ...defaultAttribute,\n ...attribute,\n };\n\n if (typeof merged.default === 'function') {\n merged.default = merged.default();\n }\n\n extensionAttributes.push({\n type: extension.name,\n name,\n attribute: merged,\n });\n }\n }\n\n return extensionAttributes;\n }\n\n /**\n * Inserts extension attributes into parseRule attributes.\n * @param parseRule PM ParseRule.\n * @param extensionAttrs List of attributes to insert.\n */\n static insertExtensionAttrsToParseRule(parseRule, extensionAttrs) {\n if ('style' in parseRule) {\n return parseRule;\n }\n\n return {\n ...parseRule,\n\n getAttrs: (node) => {\n const oldAttrs = parseRule.getAttrs ? parseRule.getAttrs(node) : parseRule.attrs;\n if (oldAttrs === false) return false;\n\n const parseFromString = (value) => {\n if (typeof value !== 'string') return value;\n if (value.match(/^[+-]?(\\d*\\.)?\\d+$/)) return Number(value);\n if (value === 'true') return true;\n if (value === 'false') return false;\n return value;\n };\n\n let newAttrs = {};\n for (const item of extensionAttrs) {\n const value = item.attribute.parseDOM\n ? item.attribute.parseDOM(node)\n : parseFromString(node.getAttribute(item.name));\n\n if (value === null || value === undefined) continue;\n\n newAttrs = {\n ...newAttrs,\n [item.name]: value,\n };\n }\n\n return { ...oldAttrs, ...newAttrs };\n },\n };\n }\n\n /**\n * Get attributes to render.\n * @param nodeOrMark Node or Mark.\n * @param extensionAttrs Extension attributes.\n */\n static getAttributesToRender(nodeOrMark, extensionAttrs) {\n const attributes = extensionAttrs\n .filter((item) => item.attribute.rendered)\n .map((item) => {\n if (!item.attribute.renderDOM) {\n return { [item.name]: nodeOrMark.attrs[item.name] };\n }\n return item.attribute.renderDOM(nodeOrMark.attrs) || {};\n });\n\n let mergedAttrs = {};\n for (const attribute of attributes) {\n mergedAttrs = this.mergeAttributes(mergedAttrs, attribute);\n }\n\n return mergedAttrs;\n }\n\n /**\n * Merges attributes.\n * @param objects Objects with attributes.\n * @returns Object with merged attributes.\n */\n static mergeAttributes(...objects) {\n const items = objects.filter((item) => !!item);\n\n let attrs = {};\n\n for (const item of items) {\n const mergedAttributes = { ...attrs };\n\n for (const [key, value] of Object.entries(item)) {\n const exists = mergedAttributes[key];\n\n if (!exists) {\n mergedAttributes[key] = value;\n continue;\n }\n\n if (key === 'class') {\n const valueClasses = value ? value.split(' ') : [];\n const existingClasses = mergedAttributes[key] ? mergedAttributes[key].split(' ') : [];\n const insertClasses = valueClasses.filter((value) => !existingClasses.includes(value));\n mergedAttributes[key] = [...existingClasses, ...insertClasses].join(' ');\n } else if (key === 'style') {\n mergedAttributes[key] = [mergedAttributes[key], value].join('; ');\n } else {\n mergedAttributes[key] = value;\n }\n }\n\n attrs = mergedAttributes;\n }\n\n return attrs;\n }\n\n /**\n * Get extension attributes that should be splitted by keepOnSplit flag.\n * @param extensionAttrs Array of attributes.\n * @param typeName The type of the extension.\n * @param attributes The extension attributes.\n * @returns The splitted attributes.\n */\n static getSplittedAttributes(extensionAttrs, typeName, attributes) {\n const entries = Object.entries(attributes).filter(([name]) => {\n const extensionAttr = extensionAttrs.find((item) => {\n return item.type === typeName && item.name === name;\n });\n\n if (!extensionAttr) return false;\n\n return extensionAttr.attribute.keepOnSplit;\n });\n\n return Object.fromEntries(entries);\n }\n\n /**\n * Get mark attrs on the current editor state.\n * @param state The current editor state.\n * @param typeOrName The mark type or name.\n * @returns The mark attrs.\n */\n static getMarkAttributes(state, typeOrName) {\n const type = getMarkType(typeOrName, state.schema);\n const marks = getMarksFromSelection(state);\n\n const mark = marks.find((markItem) => markItem.type.name === type.name);\n\n if (!mark) return {};\n\n return { ...mark.attrs };\n }\n\n /**\n * Get node attrs on the current editor state.\n * @param state The current editor state.\n * @param typeOrName The node type or name.\n * @returns The node attrs.\n */\n static getNodeAttributes(state, typeOrName) {\n const type = getNodeType(typeOrName, state.schema);\n const { from, to } = state.selection;\n const nodes = [];\n\n state.doc.nodesBetween(from, to, (node) => {\n nodes.push(node);\n });\n\n const node = nodes.reverse().find((nodeItem) => nodeItem.type.name === type.name);\n\n if (!node) return {};\n\n return { ...node.attrs };\n }\n\n /**\n * Get node or mark attrs on the current editor state.\n * @param state The current editor state.\n * @param typeOrName The node/mark type or name.\n * @returns The attrs of the node/mark or an empty object.\n */\n static getAttributes(state, typeOrName) {\n const schemaType = getSchemaTypeNameByName(\n typeof typeOrName === 'string' ? typeOrName : typeOrName.name,\n state.schema,\n );\n\n if (schemaType === 'node') {\n return this.getNodeAttributes(state, typeOrName);\n }\n\n if (schemaType === 'mark') {\n return this.getMarkAttributes(state, typeOrName);\n }\n\n return {};\n }\n}\n","/**\n * Check if the object is empty.\n * @param value Object.\n */\nexport function isEmptyObject(value = {}) {\n return Object.keys(value).length === 0 && value.constructor === Object;\n}\n","import { isEmptyObject } from '../utilities/isEmptyObject.js';\n\n/**\n * Clean schema item from \"null\" and \"undefined\" values.\n * @param schemaItem Schema item.\n * @returns Cleaned schema item.\n */\nexport function cleanSchemaItem(schemaItem) {\n const entries = Object.entries(schemaItem).filter(([key, value]) => {\n if (key === 'attrs' && isEmptyObject(value)) {\n return false;\n }\n return value !== null && value !== undefined;\n });\n return Object.fromEntries(entries);\n}\n","import { Schema as PmSchema } from 'prosemirror-model';\nimport { Attribute } from './Attribute.js';\nimport { getExtensionConfigField } from './helpers/getExtensionConfigField.js';\nimport { cleanSchemaItem } from './helpers/cleanSchemaItem.js';\nimport { callOrGet } from './utilities/callOrGet.js';\n\n/**\n * Schema class is used to create and work with schema.\n */\nexport class Schema {\n /**\n * Creates PM schema by resolved extensions.\n * @param extensions List of extensions.\n * @param editor Editor instance.\n * @returns PM schema\n */\n static createSchemaByExtensions(extensions, editor) {\n const nodeExtensions = extensions.filter((e) => e.type === 'node');\n const markExtensions = extensions.filter((e) => e.type === 'mark');\n const topNode = nodeExtensions.find((e) => getExtensionConfigField(e, 'topNode'))?.name;\n\n const attributes = Attribute.getAttributesFromExtensions(extensions);\n const nodes = Schema.#createNodesSchema(nodeExtensions, attributes, editor);\n const marks = Schema.#createMarksSchema(markExtensions, attributes, editor);\n return new PmSchema({ topNode, nodes, marks });\n }\n\n /**\n * Creates nodes schema by Node extensions.\n * @param nodeExtensions Node extensions.\n * @param attributes List of all extension attributes.\n * @param editor Editor instance.\n * @returns Nodes schema.\n */\n static #createNodesSchema(nodeExtensions, attributes, editor) {\n const nodeEntries = nodeExtensions.map((extension) => {\n const extensionAttributes = attributes.filter((a) => a.type === extension.name);\n\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n editor,\n };\n\n const attrs = Object.fromEntries(\n extensionAttributes.map((attr) => {\n return [attr.name, { default: attr?.attribute?.default }];\n }),\n );\n\n const additionalNodeFields = nodeExtensions.reduce((fields, e) => {\n const extendNodeSchema = getExtensionConfigField(e, 'extendNodeSchema', context);\n return {\n ...fields,\n ...(extendNodeSchema ? extendNodeSchema(extension) : {}),\n };\n }, {});\n \n const schema = cleanSchemaItem({\n content: callOrGet(getExtensionConfigField(extension, 'content', context)),\n group: callOrGet(getExtensionConfigField(extension, 'group', context)),\n marks: callOrGet(getExtensionConfigField(extension, 'marks', context)),\n inline: callOrGet(getExtensionConfigField(extension, 'inline', context)),\n atom: callOrGet(getExtensionConfigField(extension, 'atom', context)),\n selectable: callOrGet(getExtensionConfigField(extension, 'selectable', context)),\n draggable: callOrGet(getExtensionConfigField(extension, 'draggable', context)),\n code: callOrGet(getExtensionConfigField(extension, 'code', context)),\n defining: callOrGet(getExtensionConfigField(extension, 'defining', context)),\n isolating: callOrGet(getExtensionConfigField(extension, 'isolating', context)),\n attrs,\n ...additionalNodeFields,\n });\n\n const parseDOM = callOrGet(getExtensionConfigField(extension, 'parseDOM', context));\n if (parseDOM) {\n schema.parseDOM = parseDOM.map((parseRule) => {\n return Attribute.insertExtensionAttrsToParseRule(parseRule, extensionAttributes);\n });\n }\n\n const renderDOM = getExtensionConfigField(extension, 'renderDOM', context);\n if (renderDOM) {\n schema.toDOM = (node) =>\n renderDOM({\n node,\n htmlAttributes: Attribute.getAttributesToRender(node, extensionAttributes),\n });\n }\n\n const renderText = getExtensionConfigField(extension, 'renderText', context);\n if (renderText) {\n schema.toText = renderText;\n }\n\n return [extension.name, schema];\n });\n\n return Object.fromEntries(nodeEntries);\n }\n\n /**\n * Creates marks schema by Marks extensions.\n * @param markExtensions Marks extensions.\n * @param attributes List of all extension attributes.\n * @param editor Editor instance.\n * @returns Marks schema.\n */\n static #createMarksSchema(markExtensions, attributes, editor) {\n const markEntries = markExtensions.map((extension) => {\n const extensionAttributes = attributes.filter((a) => a.type === extension.name);\n\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n editor,\n };\n\n const attrs = Object.fromEntries(\n extensionAttributes.map((attr) => {\n return [attr.name, { default: attr?.attribute?.default }];\n }),\n );\n\n const schema = cleanSchemaItem({\n group: callOrGet(getExtensionConfigField(extension, 'group', context)),\n inclusive: callOrGet(getExtensionConfigField(extension, 'inclusive', context)),\n excludes: callOrGet(getExtensionConfigField(extension, 'excludes', context)),\n spanning: callOrGet(getExtensionConfigField(extension, 'spanning', context)),\n code: callOrGet(getExtensionConfigField(extension, 'code', context)),\n attrs,\n });\n\n const parseDOM = callOrGet(getExtensionConfigField(extension, 'parseDOM', context));\n if (parseDOM) {\n schema.parseDOM = parseDOM.map((parseRule) => {\n return Attribute.insertExtensionAttrsToParseRule(parseRule, extensionAttributes);\n });\n }\n const renderDOM = getExtensionConfigField(extension, 'renderDOM', context);\n if (renderDOM) {\n schema.toDOM = (mark) =>\n renderDOM({\n mark,\n htmlAttributes: Attribute.getAttributesToRender(mark, extensionAttributes),\n });\n }\n\n return [extension.name, schema];\n });\n\n return Object.fromEntries(markEntries);\n }\n}\n","/**\n * Get node or mark type by name.\n * @param name Node or mark name.\n * @param schema PM schema.\n * @returns Node or mark type or null.\n */\nexport function getSchemaTypeByName(name, schema) {\n return schema.nodes[name] || schema.marks[name] || null;\n}\n","import { keymap } from 'prosemirror-keymap';\nimport { Schema } from './Schema.js';\nimport { Attribute } from './Attribute.js';\nimport { getNodeType } from './helpers/getNodeType.js';\nimport { getExtensionConfigField } from './helpers/getExtensionConfigField.js';\nimport { getSchemaTypeByName } from './helpers/getSchemaTypeByName.js';\nimport { callOrGet } from './utilities/callOrGet.js';\n\n/**\n * ExtensionService is the main class to work with extensions.\n */\nexport class ExtensionService {\n editor;\n\n schema;\n\n extensions;\n\n externalExtensions = [];\n\n splittableMarks = [];\n\n constructor(extensions, userExtensions, editor) {\n this.editor = editor;\n\n this.externalExtensions = userExtensions || [];\n this.extensions = ExtensionService.getResolvedExtensions([...extensions, ...this.externalExtensions]);\n this.schema = Schema.createSchemaByExtensions(this.extensions, editor);\n this.#setupExtensions();\n }\n\n /**\n * Static method for creating ExtensionService.\n * @param args Arguments for the constructor.\n */\n static create(...args) {\n return new ExtensionService(...args);\n }\n\n /**\n * Get an array of resolved extensions (e.g. sorted by priority).\n * @param extensions Array of extensions.\n * @returns Array of resolved extensions.\n */\n static getResolvedExtensions(extensions) {\n const resolvedExtensions = ExtensionService.sortByPriority(extensions);\n return resolvedExtensions;\n }\n\n /**\n * Sort extensions by priority.\n * @param extensions Array of extensions.\n * @returns Array of sorted extensions by priority.\n */\n static sortByPriority(extensions) {\n const defaultValue = 100;\n return extensions.sort((a, b) => {\n const priorityA = getExtensionConfigField(a, 'priority') || defaultValue;\n const priorityB = getExtensionConfigField(b, 'priority') || defaultValue;\n if (priorityA > priorityB) return -1;\n if (priorityA < priorityB) return 1;\n return 0;\n });\n }\n\n /**\n * Get all attributes defined in the extensions.\n * @returns Array of attributes.\n */\n get attributes() {\n return Attribute.getAttributesFromExtensions(this.extensions);\n }\n\n /**\n * Get all commands defined in the extensions.\n * @returns Object with commands (key - command name, value - function).\n */\n get commands() {\n let commandsObject = {};\n\n for (const extension of this.extensions) {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n editor: this.editor,\n type: getSchemaTypeByName(extension.name, this.schema),\n };\n\n const addCommands = getExtensionConfigField(extension, 'addCommands', context);\n if (addCommands) {\n commandsObject = {\n ...commandsObject,\n ...addCommands(),\n };\n }\n }\n\n return commandsObject;\n }\n\n /**\n * Get all PM plugins defined in the extensions.\n * And also keyboard shortcuts.\n * @returns Array of PM plugins.\n */\n get plugins() {\n const editor = this.editor;\n const extensions = ExtensionService.sortByPriority([...this.extensions].reverse());\n\n const allPlugins = extensions\n .map((extension) => {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n editor,\n type: getSchemaTypeByName(extension.name, this.schema),\n };\n\n const plugins = [];\n\n const addShortcuts = getExtensionConfigField(extension, 'addShortcuts', context);\n\n let bindingsObject = {};\n\n if (addShortcuts) {\n const entries = Object.entries(addShortcuts()).map(([shortcut, method]) => {\n return [shortcut, (...args) => method({ editor, keymapArgs: args })];\n });\n bindingsObject = { ...Object.fromEntries(entries) };\n }\n\n plugins.push(keymap(bindingsObject));\n\n const addPmPlugins = getExtensionConfigField(extension, 'addPmPlugins', context);\n\n if (addPmPlugins) {\n const pmPlugins = addPmPlugins();\n plugins.push(...pmPlugins);\n }\n\n return plugins;\n })\n .flat();\n\n return [...allPlugins];\n }\n\n /**\n * Get all node views from the extensions.\n * @returns An object with all node views.\n */\n get nodeViews() {\n const { editor } = this;\n const nodeExtensions = this.extensions.filter((e) => e.type === 'node');\n\n const entries = nodeExtensions\n .filter((extension) => !!getExtensionConfigField(extension, 'addNodeView'))\n .map((extension) => {\n const extensionAttrs = this.attributes.filter((a) => a.type === extension.name);\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n editor,\n type: getNodeType(extension.name, this.schema),\n };\n\n const addNodeView = getExtensionConfigField(extension, 'addNodeView', context);\n\n if (!addNodeView) return [];\n\n const nodeview = (node, _view, getPos, decorations) => {\n const htmlAttributes = Attribute.getAttributesToRender(node, extensionAttrs);\n return addNodeView()({\n editor,\n node,\n getPos,\n decorations,\n htmlAttributes,\n extension,\n });\n };\n\n return [extension.name, nodeview];\n });\n\n return Object.fromEntries(entries);\n }\n\n /**\n * Install all extensions.\n * Create extension storage in the editor, attach editor events.\n */\n #setupExtensions() {\n for (const extension of this.extensions) {\n this.editor.extensionStorage[extension.name] = extension.storage;\n\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n editor: this.editor,\n type: getSchemaTypeByName(extension.name, this.schema),\n };\n\n if (extension.type === 'mark') {\n const keepOnSplit = callOrGet(getExtensionConfigField(extension, 'keepOnSplit', context)) ?? true;\n if (keepOnSplit) {\n this.splittableMarks.push(extension.name);\n }\n }\n\n this.#attachEditorEvents(extension);\n }\n }\n\n /**\n * Attach editor events to extension\n * if callbacks are defined in the extension config.\n * @param extension Extension.\n */\n #attachEditorEvents(extension) {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n editor: this.editor,\n type: getSchemaTypeByName(extension.name, this.schema),\n };\n\n const onBeforeCreate = getExtensionConfigField(extension, 'onBeforeCreate', context);\n const onCreate = getExtensionConfigField(extension, 'onCreate', context);\n const onUpdate = getExtensionConfigField(extension, 'onUpdate', context);\n const onSelectionUpdate = getExtensionConfigField(extension, 'onSelectionUpdate', context);\n const onTransaction = getExtensionConfigField(extension, 'onTransaction', context);\n const onFocus = getExtensionConfigField(extension, 'onFocus', context);\n const onBlur = getExtensionConfigField(extension, 'onBlur', context);\n const onDestroy = getExtensionConfigField(extension, 'onDestroy', context);\n\n if (onBeforeCreate) this.editor.on('beforeCreate', onBeforeCreate);\n if (onCreate) this.editor.on('create', onCreate);\n if (onUpdate) this.editor.on('update', onUpdate);\n if (onSelectionUpdate) this.editor.on('selectionUpdate', onSelectionUpdate);\n if (onTransaction) this.editor.on('transaction', onTransaction);\n if (onFocus) this.editor.on('focus', onFocus);\n if (onBlur) this.editor.on('blur', onBlur);\n if (onDestroy) this.editor.on('destroy', onDestroy);\n }\n}\n","/**\n * Creates chainable editor state.\n * https://remirror.io/blog/chainable-commands/\n * @param {*} transaction Transaction.\n * @param {*} state State\n * @returns Chainable editor state.\n */\nexport function chainableEditorState(transaction, state) {\n let { selection, doc, storedMarks } = transaction;\n\n return {\n ...state,\n apply: state.apply.bind(state),\n applyTransaction: state.applyTransaction.bind(state),\n plugins: state.plugins,\n schema: state.schema,\n reconfigure: state.reconfigure.bind(state),\n toJSON: state.toJSON.bind(state),\n get storedMarks() {\n return storedMarks;\n },\n get selection() {\n return selection;\n },\n get doc() {\n return doc;\n },\n get tr() {\n selection = transaction.selection;\n doc = transaction.doc;\n storedMarks = transaction.storedMarks;\n return transaction;\n },\n };\n}\n","import { chainableEditorState } from './helpers/chainableEditorState.js';\n\n/**\n * CommandService is the main class to work with commands.\n */\nexport class CommandService {\n editor;\n\n rawCommands;\n\n constructor(props) {\n this.editor = props.editor;\n this.rawCommands = this.editor.extensionService.commands;\n }\n\n /**\n * Static method for creating a service.\n * @param args Arguments for the constructor.\n */\n static create(...args) {\n return new CommandService(...args);\n }\n\n /**\n * Get editor state.\n */\n get state() {\n return this.editor.state;\n }\n\n /**\n * Get all commands with wrapped command method.\n */\n get commands() {\n const { editor, state } = this;\n const { view } = editor;\n const { tr } = state;\n const props = this.createProps(tr);\n\n const entries = Object.entries(this.rawCommands).map(([name, command]) => {\n const method = (...args) => {\n const fn = command(...args)(props);\n\n if (!tr.getMeta('preventDispatch')) {\n view.dispatch(tr);\n }\n\n return fn;\n };\n\n return [name, method];\n });\n\n return Object.fromEntries(entries);\n }\n\n /**\n * Create a chain of commands to call multiple commands at once.\n */\n get chain() {\n return () => this.createChain();\n }\n\n /**\n * Check if a command or a chain of commands can be executed. Without executing it.\n */\n get can() {\n return () => this.createCan();\n }\n\n /**\n * Creates a chain of commands.\n * @param startTr Start transaction.\n * @param shouldDispatch Should dispatch or not.\n */\n createChain(startTr, shouldDispatch = true) {\n const { editor, state, rawCommands } = this;\n const { view } = editor;\n const callbacks = [];\n const hasStartTr = !!startTr;\n const tr = startTr || state.tr;\n\n const run = () => {\n if (!hasStartTr && shouldDispatch && !tr.getMeta('preventDispatch')) {\n view.dispatch(tr);\n }\n\n return callbacks.every((cb) => cb === true);\n };\n\n const entries = Object.entries(rawCommands).map(([name, command]) => {\n const chainedCommand = (...args) => {\n const props = this.createProps(tr, shouldDispatch);\n const callback = command(...args)(props);\n callbacks.push(callback);\n return chain;\n };\n\n return [name, chainedCommand];\n });\n\n const chain = {\n ...Object.fromEntries(entries),\n run,\n };\n\n return chain;\n }\n\n /**\n * Creates a can check for commands.\n * @param startTr Start transaction.\n */\n createCan(startTr) {\n const { rawCommands, state } = this;\n const dispatch = false;\n const tr = startTr || state.tr;\n const props = this.createProps(tr, dispatch);\n const commands = Object.fromEntries(\n Object.entries(rawCommands).map(([name, command]) => {\n return [name, (...args) => command(...args)({ ...props, dispatch: undefined })];\n }),\n );\n\n return {\n ...commands,\n chain: () => this.createChain(tr, dispatch),\n };\n }\n\n /**\n * Creates default props for the command method.\n * @param {*} tr Transaction.\n * @param {*} shouldDispatch Check if should dispatch.\n * @returns Object with props.\n */\n createProps(tr, shouldDispatch = true) {\n const { editor, state, rawCommands } = this;\n const { view } = editor;\n\n const props = {\n tr,\n editor,\n view,\n state: chainableEditorState(tr, state),\n dispatch: shouldDispatch ? () => undefined : undefined,\n chain: () => this.createChain(tr, shouldDispatch),\n can: () => this.createCan(tr),\n get commands() {\n return Object.fromEntries(\n Object.entries(rawCommands).map(([name, command]) => {\n return [name, (...args) => command(...args)(props)];\n }),\n );\n },\n };\n\n return props;\n }\n}\n","/**\n * Runs commands and stops at the first one that returns true.\n * @param commands Commands to run.\n *\n * Example:\n * editor.commands.first(({ commands }) => [\n * () => commands.deleteSelection(),\n * () => commands.joinBackward(),\n * () => commands.selectNodeBackward(),\n * ]);\n */\nexport const first = (commands) => (props) => {\n const items = typeof commands === 'function' ? commands(props) : commands;\n\n for (let i = 0; i < items.length; i += 1) {\n if (items[i](props)) return true;\n }\n\n return false;\n};\n","/**\n * Define a command function inline.\n * @param fn Command function.\n */\nexport const command = (fn) => (props) => fn(props);\n","//prettier-ignore\nexport const insertTabChar = () => ({ tr }) => {\n tr.insertText('\\t', tr.selection.from, tr.selection.to);\n \n return true;\n};\n","//prettier-ignore\nexport const insertTabNode = () => ({ tr, state }) => {\n let newPos = tr.selection.from;\n const node = state.schema.nodes.tab.create();\n tr.insert(newPos, node);\n \n return true;\n};\n","//prettier-ignore\nexport const setMeta = (key, value) => ({ tr }) => {\n tr.setMeta(key, value);\n return true;\n};\n","import { liftTarget, replaceStep, ReplaceStep, canJoin, joinPoint, canSplit, ReplaceAroundStep, findWrapping } from 'prosemirror-transform';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { NodeSelection, Selection, TextSelection, AllSelection, SelectionRange } from 'prosemirror-state';\n\n/**\nDelete the selection, if there is one.\n*/\nconst deleteSelection = (state, dispatch) => {\n if (state.selection.empty)\n return false;\n if (dispatch)\n dispatch(state.tr.deleteSelection().scrollIntoView());\n return true;\n};\nfunction atBlockStart(state, view) {\n let { $cursor } = state.selection;\n if (!$cursor || (view ? !view.endOfTextblock(\"backward\", state)\n : $cursor.parentOffset > 0))\n return null;\n return $cursor;\n}\n/**\nIf the selection is empty and at the start of a textblock, try to\nreduce the distance between that block and the one before it—if\nthere's a block directly before it that can be joined, join them.\nIf not, try to move the selected block closer to the next one in\nthe document structure by lifting it out of its parent or moving it\ninto a parent of the previous block. Will use the view for accurate\n(bidi-aware) start-of-textblock detection if given.\n*/\nconst joinBackward = (state, dispatch, view) => {\n let $cursor = atBlockStart(state, view);\n if (!$cursor)\n return false;\n let $cut = findCutBefore($cursor);\n // If there is no node before this, try to lift\n if (!$cut) {\n let range = $cursor.blockRange(), target = range && liftTarget(range);\n if (target == null)\n return false;\n if (dispatch)\n dispatch(state.tr.lift(range, target).scrollIntoView());\n return true;\n }\n let before = $cut.nodeBefore;\n // Apply the joining algorithm\n if (deleteBarrier(state, $cut, dispatch, -1))\n return true;\n // If the node below has no content and the node above is\n // selectable, delete the node below and select the one above.\n if ($cursor.parent.content.size == 0 &&\n (textblockAt(before, \"end\") || NodeSelection.isSelectable(before))) {\n for (let depth = $cursor.depth;; depth--) {\n let delStep = replaceStep(state.doc, $cursor.before(depth), $cursor.after(depth), Slice.empty);\n if (delStep && delStep.slice.size < delStep.to - delStep.from) {\n if (dispatch) {\n let tr = state.tr.step(delStep);\n tr.setSelection(textblockAt(before, \"end\")\n ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos, -1)), -1)\n : NodeSelection.create(tr.doc, $cut.pos - before.nodeSize));\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n if (depth == 1 || $cursor.node(depth - 1).childCount > 1)\n break;\n }\n }\n // If the node before is an atom, delete it\n if (before.isAtom && $cut.depth == $cursor.depth - 1) {\n if (dispatch)\n dispatch(state.tr.delete($cut.pos - before.nodeSize, $cut.pos).scrollIntoView());\n return true;\n }\n return false;\n};\n/**\nA more limited form of [`joinBackward`](https://prosemirror.net/docs/ref/#commands.joinBackward)\nthat only tries to join the current textblock to the one before\nit, if the cursor is at the start of a textblock.\n*/\nconst joinTextblockBackward = (state, dispatch, view) => {\n let $cursor = atBlockStart(state, view);\n if (!$cursor)\n return false;\n let $cut = findCutBefore($cursor);\n return $cut ? joinTextblocksAround(state, $cut, dispatch) : false;\n};\n/**\nA more limited form of [`joinForward`](https://prosemirror.net/docs/ref/#commands.joinForward)\nthat only tries to join the current textblock to the one after\nit, if the cursor is at the end of a textblock.\n*/\nconst joinTextblockForward = (state, dispatch, view) => {\n let $cursor = atBlockEnd(state, view);\n if (!$cursor)\n return false;\n let $cut = findCutAfter($cursor);\n return $cut ? joinTextblocksAround(state, $cut, dispatch) : false;\n};\nfunction joinTextblocksAround(state, $cut, dispatch) {\n let before = $cut.nodeBefore, beforeText = before, beforePos = $cut.pos - 1;\n for (; !beforeText.isTextblock; beforePos--) {\n if (beforeText.type.spec.isolating)\n return false;\n let child = beforeText.lastChild;\n if (!child)\n return false;\n beforeText = child;\n }\n let after = $cut.nodeAfter, afterText = after, afterPos = $cut.pos + 1;\n for (; !afterText.isTextblock; afterPos++) {\n if (afterText.type.spec.isolating)\n return false;\n let child = afterText.firstChild;\n if (!child)\n return false;\n afterText = child;\n }\n let step = replaceStep(state.doc, beforePos, afterPos, Slice.empty);\n if (!step || step.from != beforePos ||\n step instanceof ReplaceStep && step.slice.size >= afterPos - beforePos)\n return false;\n if (dispatch) {\n let tr = state.tr.step(step);\n tr.setSelection(TextSelection.create(tr.doc, beforePos));\n dispatch(tr.scrollIntoView());\n }\n return true;\n}\nfunction textblockAt(node, side, only = false) {\n for (let scan = node; scan; scan = (side == \"start\" ? scan.firstChild : scan.lastChild)) {\n if (scan.isTextblock)\n return true;\n if (only && scan.childCount != 1)\n return false;\n }\n return false;\n}\n/**\nWhen the selection is empty and at the start of a textblock, select\nthe node before that textblock, if possible. This is intended to be\nbound to keys like backspace, after\n[`joinBackward`](https://prosemirror.net/docs/ref/#commands.joinBackward) or other deleting\ncommands, as a fall-back behavior when the schema doesn't allow\ndeletion at the selected point.\n*/\nconst selectNodeBackward = (state, dispatch, view) => {\n let { $head, empty } = state.selection, $cut = $head;\n if (!empty)\n return false;\n if ($head.parent.isTextblock) {\n if (view ? !view.endOfTextblock(\"backward\", state) : $head.parentOffset > 0)\n return false;\n $cut = findCutBefore($head);\n }\n let node = $cut && $cut.nodeBefore;\n if (!node || !NodeSelection.isSelectable(node))\n return false;\n if (dispatch)\n dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos - node.nodeSize)).scrollIntoView());\n return true;\n};\nfunction findCutBefore($pos) {\n if (!$pos.parent.type.spec.isolating)\n for (let i = $pos.depth - 1; i >= 0; i--) {\n if ($pos.index(i) > 0)\n return $pos.doc.resolve($pos.before(i + 1));\n if ($pos.node(i).type.spec.isolating)\n break;\n }\n return null;\n}\nfunction atBlockEnd(state, view) {\n let { $cursor } = state.selection;\n if (!$cursor || (view ? !view.endOfTextblock(\"forward\", state)\n : $cursor.parentOffset < $cursor.parent.content.size))\n return null;\n return $cursor;\n}\n/**\nIf the selection is empty and the cursor is at the end of a\ntextblock, try to reduce or remove the boundary between that block\nand the one after it, either by joining them or by moving the other\nblock closer to this one in the tree structure. Will use the view\nfor accurate start-of-textblock detection if given.\n*/\nconst joinForward = (state, dispatch, view) => {\n let $cursor = atBlockEnd(state, view);\n if (!$cursor)\n return false;\n let $cut = findCutAfter($cursor);\n // If there is no node after this, there's nothing to do\n if (!$cut)\n return false;\n let after = $cut.nodeAfter;\n // Try the joining algorithm\n if (deleteBarrier(state, $cut, dispatch, 1))\n return true;\n // If the node above has no content and the node below is\n // selectable, delete the node above and select the one below.\n if ($cursor.parent.content.size == 0 &&\n (textblockAt(after, \"start\") || NodeSelection.isSelectable(after))) {\n let delStep = replaceStep(state.doc, $cursor.before(), $cursor.after(), Slice.empty);\n if (delStep && delStep.slice.size < delStep.to - delStep.from) {\n if (dispatch) {\n let tr = state.tr.step(delStep);\n tr.setSelection(textblockAt(after, \"start\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos)), 1)\n : NodeSelection.create(tr.doc, tr.mapping.map($cut.pos)));\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n }\n // If the next node is an atom, delete it\n if (after.isAtom && $cut.depth == $cursor.depth - 1) {\n if (dispatch)\n dispatch(state.tr.delete($cut.pos, $cut.pos + after.nodeSize).scrollIntoView());\n return true;\n }\n return false;\n};\n/**\nWhen the selection is empty and at the end of a textblock, select\nthe node coming after that textblock, if possible. This is intended\nto be bound to keys like delete, after\n[`joinForward`](https://prosemirror.net/docs/ref/#commands.joinForward) and similar deleting\ncommands, to provide a fall-back behavior when the schema doesn't\nallow deletion at the selected point.\n*/\nconst selectNodeForward = (state, dispatch, view) => {\n let { $head, empty } = state.selection, $cut = $head;\n if (!empty)\n return false;\n if ($head.parent.isTextblock) {\n if (view ? !view.endOfTextblock(\"forward\", state) : $head.parentOffset < $head.parent.content.size)\n return false;\n $cut = findCutAfter($head);\n }\n let node = $cut && $cut.nodeAfter;\n if (!node || !NodeSelection.isSelectable(node))\n return false;\n if (dispatch)\n dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos)).scrollIntoView());\n return true;\n};\nfunction findCutAfter($pos) {\n if (!$pos.parent.type.spec.isolating)\n for (let i = $pos.depth - 1; i >= 0; i--) {\n let parent = $pos.node(i);\n if ($pos.index(i) + 1 < parent.childCount)\n return $pos.doc.resolve($pos.after(i + 1));\n if (parent.type.spec.isolating)\n break;\n }\n return null;\n}\n/**\nJoin the selected block or, if there is a text selection, the\nclosest ancestor block of the selection that can be joined, with\nthe sibling above it.\n*/\nconst joinUp = (state, dispatch) => {\n let sel = state.selection, nodeSel = sel instanceof NodeSelection, point;\n if (nodeSel) {\n if (sel.node.isTextblock || !canJoin(state.doc, sel.from))\n return false;\n point = sel.from;\n }\n else {\n point = joinPoint(state.doc, sel.from, -1);\n if (point == null)\n return false;\n }\n if (dispatch) {\n let tr = state.tr.join(point);\n if (nodeSel)\n tr.setSelection(NodeSelection.create(tr.doc, point - state.doc.resolve(point).nodeBefore.nodeSize));\n dispatch(tr.scrollIntoView());\n }\n return true;\n};\n/**\nJoin the selected block, or the closest ancestor of the selection\nthat can be joined, with the sibling after it.\n*/\nconst joinDown = (state, dispatch) => {\n let sel = state.selection, point;\n if (sel instanceof NodeSelection) {\n if (sel.node.isTextblock || !canJoin(state.doc, sel.to))\n return false;\n point = sel.to;\n }\n else {\n point = joinPoint(state.doc, sel.to, 1);\n if (point == null)\n return false;\n }\n if (dispatch)\n dispatch(state.tr.join(point).scrollIntoView());\n return true;\n};\n/**\nLift the selected block, or the closest ancestor block of the\nselection that can be lifted, out of its parent node.\n*/\nconst lift = (state, dispatch) => {\n let { $from, $to } = state.selection;\n let range = $from.blockRange($to), target = range && liftTarget(range);\n if (target == null)\n return false;\n if (dispatch)\n dispatch(state.tr.lift(range, target).scrollIntoView());\n return true;\n};\n/**\nIf the selection is in a node whose type has a truthy\n[`code`](https://prosemirror.net/docs/ref/#model.NodeSpec.code) property in its spec, replace the\nselection with a newline character.\n*/\nconst newlineInCode = (state, dispatch) => {\n let { $head, $anchor } = state.selection;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor))\n return false;\n if (dispatch)\n dispatch(state.tr.insertText(\"\\n\").scrollIntoView());\n return true;\n};\nfunction defaultBlockAt(match) {\n for (let i = 0; i < match.edgeCount; i++) {\n let { type } = match.edge(i);\n if (type.isTextblock && !type.hasRequiredAttrs())\n return type;\n }\n return null;\n}\n/**\nWhen the selection is in a node with a truthy\n[`code`](https://prosemirror.net/docs/ref/#model.NodeSpec.code) property in its spec, create a\ndefault block after the code block, and move the cursor there.\n*/\nconst exitCode = (state, dispatch) => {\n let { $head, $anchor } = state.selection;\n if (!$head.parent.type.spec.code || !$head.sameParent($anchor))\n return false;\n let above = $head.node(-1), after = $head.indexAfter(-1), type = defaultBlockAt(above.contentMatchAt(after));\n if (!type || !above.canReplaceWith(after, after, type))\n return false;\n if (dispatch) {\n let pos = $head.after(), tr = state.tr.replaceWith(pos, pos, type.createAndFill());\n tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n dispatch(tr.scrollIntoView());\n }\n return true;\n};\n/**\nIf a block node is selected, create an empty paragraph before (if\nit is its parent's first child) or after it.\n*/\nconst createParagraphNear = (state, dispatch) => {\n let sel = state.selection, { $from, $to } = sel;\n if (sel instanceof AllSelection || $from.parent.inlineContent || $to.parent.inlineContent)\n return false;\n let type = defaultBlockAt($to.parent.contentMatchAt($to.indexAfter()));\n if (!type || !type.isTextblock)\n return false;\n if (dispatch) {\n let side = (!$from.parentOffset && $to.index() < $to.parent.childCount ? $from : $to).pos;\n let tr = state.tr.insert(side, type.createAndFill());\n tr.setSelection(TextSelection.create(tr.doc, side + 1));\n dispatch(tr.scrollIntoView());\n }\n return true;\n};\n/**\nIf the cursor is in an empty textblock that can be lifted, lift the\nblock.\n*/\nconst liftEmptyBlock = (state, dispatch) => {\n let { $cursor } = state.selection;\n if (!$cursor || $cursor.parent.content.size)\n return false;\n if ($cursor.depth > 1 && $cursor.after() != $cursor.end(-1)) {\n let before = $cursor.before();\n if (canSplit(state.doc, before)) {\n if (dispatch)\n dispatch(state.tr.split(before).scrollIntoView());\n return true;\n }\n }\n let range = $cursor.blockRange(), target = range && liftTarget(range);\n if (target == null)\n return false;\n if (dispatch)\n dispatch(state.tr.lift(range, target).scrollIntoView());\n return true;\n};\n/**\nCreate a variant of [`splitBlock`](https://prosemirror.net/docs/ref/#commands.splitBlock) that uses\na custom function to determine the type of the newly split off block.\n*/\nfunction splitBlockAs(splitNode) {\n return (state, dispatch) => {\n let { $from, $to } = state.selection;\n if (state.selection instanceof NodeSelection && state.selection.node.isBlock) {\n if (!$from.parentOffset || !canSplit(state.doc, $from.pos))\n return false;\n if (dispatch)\n dispatch(state.tr.split($from.pos).scrollIntoView());\n return true;\n }\n if (!$from.depth)\n return false;\n let types = [];\n let splitDepth, deflt, atEnd = false, atStart = false;\n for (let d = $from.depth;; d--) {\n let node = $from.node(d);\n if (node.isBlock) {\n atEnd = $from.end(d) == $from.pos + ($from.depth - d);\n atStart = $from.start(d) == $from.pos - ($from.depth - d);\n deflt = defaultBlockAt($from.node(d - 1).contentMatchAt($from.indexAfter(d - 1)));\n let splitType = splitNode && splitNode($to.parent, atEnd, $from);\n types.unshift(splitType || (atEnd && deflt ? { type: deflt } : null));\n splitDepth = d;\n break;\n }\n else {\n if (d == 1)\n return false;\n types.unshift(null);\n }\n }\n let tr = state.tr;\n if (state.selection instanceof TextSelection || state.selection instanceof AllSelection)\n tr.deleteSelection();\n let splitPos = tr.mapping.map($from.pos);\n let can = canSplit(tr.doc, splitPos, types.length, types);\n if (!can) {\n types[0] = deflt ? { type: deflt } : null;\n can = canSplit(tr.doc, splitPos, types.length, types);\n }\n tr.split(splitPos, types.length, types);\n if (!atEnd && atStart && $from.node(splitDepth).type != deflt) {\n let first = tr.mapping.map($from.before(splitDepth)), $first = tr.doc.resolve(first);\n if (deflt && $from.node(splitDepth - 1).canReplaceWith($first.index(), $first.index() + 1, deflt))\n tr.setNodeMarkup(tr.mapping.map($from.before(splitDepth)), deflt);\n }\n if (dispatch)\n dispatch(tr.scrollIntoView());\n return true;\n };\n}\n/**\nSplit the parent block of the selection. If the selection is a text\nselection, also delete its content.\n*/\nconst splitBlock = splitBlockAs();\n/**\nActs like [`splitBlock`](https://prosemirror.net/docs/ref/#commands.splitBlock), but without\nresetting the set of active marks at the cursor.\n*/\nconst splitBlockKeepMarks = (state, dispatch) => {\n return splitBlock(state, dispatch && (tr => {\n let marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\n if (marks)\n tr.ensureMarks(marks);\n dispatch(tr);\n }));\n};\n/**\nMove the selection to the node wrapping the current selection, if\nany. (Will not select the document node.)\n*/\nconst selectParentNode = (state, dispatch) => {\n let { $from, to } = state.selection, pos;\n let same = $from.sharedDepth(to);\n if (same == 0)\n return false;\n pos = $from.before(same);\n if (dispatch)\n dispatch(state.tr.setSelection(NodeSelection.create(state.doc, pos)));\n return true;\n};\n/**\nSelect the whole document.\n*/\nconst selectAll = (state, dispatch) => {\n if (dispatch)\n dispatch(state.tr.setSelection(new AllSelection(state.doc)));\n return true;\n};\nfunction joinMaybeClear(state, $pos, dispatch) {\n let before = $pos.nodeBefore, after = $pos.nodeAfter, index = $pos.index();\n if (!before || !after || !before.type.compatibleContent(after.type))\n return false;\n if (!before.content.size && $pos.parent.canReplace(index - 1, index)) {\n if (dispatch)\n dispatch(state.tr.delete($pos.pos - before.nodeSize, $pos.pos).scrollIntoView());\n return true;\n }\n if (!$pos.parent.canReplace(index, index + 1) || !(after.isTextblock || canJoin(state.doc, $pos.pos)))\n return false;\n if (dispatch)\n dispatch(state.tr.join($pos.pos).scrollIntoView());\n return true;\n}\nfunction deleteBarrier(state, $cut, dispatch, dir) {\n let before = $cut.nodeBefore, after = $cut.nodeAfter, conn, match;\n let isolated = before.type.spec.isolating || after.type.spec.isolating;\n if (!isolated && joinMaybeClear(state, $cut, dispatch))\n return true;\n let canDelAfter = !isolated && $cut.parent.canReplace($cut.index(), $cut.index() + 1);\n if (canDelAfter &&\n (conn = (match = before.contentMatchAt(before.childCount)).findWrapping(after.type)) &&\n match.matchType(conn[0] || after.type).validEnd) {\n if (dispatch) {\n let end = $cut.pos + after.nodeSize, wrap = Fragment.empty;\n for (let i = conn.length - 1; i >= 0; i--)\n wrap = Fragment.from(conn[i].create(null, wrap));\n wrap = Fragment.from(before.copy(wrap));\n let tr = state.tr.step(new ReplaceAroundStep($cut.pos - 1, end, $cut.pos, end, new Slice(wrap, 1, 0), conn.length, true));\n let $joinAt = tr.doc.resolve(end + 2 * conn.length);\n if ($joinAt.nodeAfter && $joinAt.nodeAfter.type == before.type &&\n canJoin(tr.doc, $joinAt.pos))\n tr.join($joinAt.pos);\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n let selAfter = after.type.spec.isolating || (dir > 0 && isolated) ? null : Selection.findFrom($cut, 1);\n let range = selAfter && selAfter.$from.blockRange(selAfter.$to), target = range && liftTarget(range);\n if (target != null && target >= $cut.depth) {\n if (dispatch)\n dispatch(state.tr.lift(range, target).scrollIntoView());\n return true;\n }\n if (canDelAfter && textblockAt(after, \"start\", true) && textblockAt(before, \"end\")) {\n let at = before, wrap = [];\n for (;;) {\n wrap.push(at);\n if (at.isTextblock)\n break;\n at = at.lastChild;\n }\n let afterText = after, afterDepth = 1;\n for (; !afterText.isTextblock; afterText = afterText.firstChild)\n afterDepth++;\n if (at.canReplace(at.childCount, at.childCount, afterText.content)) {\n if (dispatch) {\n let end = Fragment.empty;\n for (let i = wrap.length - 1; i >= 0; i--)\n end = Fragment.from(wrap[i].copy(end));\n let tr = state.tr.step(new ReplaceAroundStep($cut.pos - wrap.length, $cut.pos + after.nodeSize, $cut.pos + afterDepth, $cut.pos + after.nodeSize - afterDepth, new Slice(end, wrap.length, 0), 0, true));\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n }\n return false;\n}\nfunction selectTextblockSide(side) {\n return function (state, dispatch) {\n let sel = state.selection, $pos = side < 0 ? sel.$from : sel.$to;\n let depth = $pos.depth;\n while ($pos.node(depth).isInline) {\n if (!depth)\n return false;\n depth--;\n }\n if (!$pos.node(depth).isTextblock)\n return false;\n if (dispatch)\n dispatch(state.tr.setSelection(TextSelection.create(state.doc, side < 0 ? $pos.start(depth) : $pos.end(depth))));\n return true;\n };\n}\n/**\nMoves the cursor to the start of current text block.\n*/\nconst selectTextblockStart = selectTextblockSide(-1);\n/**\nMoves the cursor to the end of current text block.\n*/\nconst selectTextblockEnd = selectTextblockSide(1);\n// Parameterized commands\n/**\nWrap the selection in a node of the given type with the given\nattributes.\n*/\nfunction wrapIn(nodeType, attrs = null) {\n return function (state, dispatch) {\n let { $from, $to } = state.selection;\n let range = $from.blockRange($to), wrapping = range && findWrapping(range, nodeType, attrs);\n if (!wrapping)\n return false;\n if (dispatch)\n dispatch(state.tr.wrap(range, wrapping).scrollIntoView());\n return true;\n };\n}\n/**\nReturns a command that tries to set the selected textblocks to the\ngiven node type with the given attributes.\n*/\nfunction setBlockType(nodeType, attrs = null) {\n return function (state, dispatch) {\n let applicable = false;\n for (let i = 0; i < state.selection.ranges.length && !applicable; i++) {\n let { $from: { pos: from }, $to: { pos: to } } = state.selection.ranges[i];\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (applicable)\n return false;\n if (!node.isTextblock || node.hasMarkup(nodeType, attrs))\n return;\n if (node.type == nodeType) {\n applicable = true;\n }\n else {\n let $pos = state.doc.resolve(pos), index = $pos.index();\n applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType);\n }\n });\n }\n if (!applicable)\n return false;\n if (dispatch) {\n let tr = state.tr;\n for (let i = 0; i < state.selection.ranges.length; i++) {\n let { $from: { pos: from }, $to: { pos: to } } = state.selection.ranges[i];\n tr.setBlockType(from, to, nodeType, attrs);\n }\n dispatch(tr.scrollIntoView());\n }\n return true;\n };\n}\nfunction markApplies(doc, ranges, type, enterAtoms) {\n for (let i = 0; i < ranges.length; i++) {\n let { $from, $to } = ranges[i];\n let can = $from.depth == 0 ? doc.inlineContent && doc.type.allowsMarkType(type) : false;\n doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n if (can || !enterAtoms && node.isAtom && node.isInline && pos >= $from.pos && pos + node.nodeSize <= $to.pos)\n return false;\n can = node.inlineContent && node.type.allowsMarkType(type);\n });\n if (can)\n return true;\n }\n return false;\n}\nfunction removeInlineAtoms(ranges) {\n let result = [];\n for (let i = 0; i < ranges.length; i++) {\n let { $from, $to } = ranges[i];\n $from.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n if (node.isAtom && node.content.size && node.isInline && pos >= $from.pos && pos + node.nodeSize <= $to.pos) {\n if (pos + 1 > $from.pos)\n result.push(new SelectionRange($from, $from.doc.resolve(pos + 1)));\n $from = $from.doc.resolve(pos + 1 + node.content.size);\n return false;\n }\n });\n if ($from.pos < $to.pos)\n result.push(new SelectionRange($from, $to));\n }\n return result;\n}\n/**\nCreate a command function that toggles the given mark with the\ngiven attributes. Will return `false` when the current selection\ndoesn't support that mark. This will remove the mark if any marks\nof that type exist in the selection, or add it otherwise. If the\nselection is empty, this applies to the [stored\nmarks](https://prosemirror.net/docs/ref/#state.EditorState.storedMarks) instead of a range of the\ndocument.\n*/\nfunction toggleMark(markType, attrs = null, options) {\n let removeWhenPresent = (options && options.removeWhenPresent) !== false;\n let enterAtoms = (options && options.enterInlineAtoms) !== false;\n let dropSpace = !(options && options.includeWhitespace);\n return function (state, dispatch) {\n let { empty, $cursor, ranges } = state.selection;\n if ((empty && !$cursor) || !markApplies(state.doc, ranges, markType, enterAtoms))\n return false;\n if (dispatch) {\n if ($cursor) {\n if (markType.isInSet(state.storedMarks || $cursor.marks()))\n dispatch(state.tr.removeStoredMark(markType));\n else\n dispatch(state.tr.addStoredMark(markType.create(attrs)));\n }\n else {\n let add, tr = state.tr;\n if (!enterAtoms)\n ranges = removeInlineAtoms(ranges);\n if (removeWhenPresent) {\n add = !ranges.some(r => state.doc.rangeHasMark(r.$from.pos, r.$to.pos, markType));\n }\n else {\n add = !ranges.every(r => {\n let missing = false;\n tr.doc.nodesBetween(r.$from.pos, r.$to.pos, (node, pos, parent) => {\n if (missing)\n return false;\n missing = !markType.isInSet(node.marks) && !!parent && parent.type.allowsMarkType(markType) &&\n !(node.isText && /^\\s*$/.test(node.textBetween(Math.max(0, r.$from.pos - pos), Math.min(node.nodeSize, r.$to.pos - pos))));\n });\n return !missing;\n });\n }\n for (let i = 0; i < ranges.length; i++) {\n let { $from, $to } = ranges[i];\n if (!add) {\n tr.removeMark($from.pos, $to.pos, markType);\n }\n else {\n let from = $from.pos, to = $to.pos, start = $from.nodeAfter, end = $to.nodeBefore;\n let spaceStart = dropSpace && start && start.isText ? /^\\s*/.exec(start.text)[0].length : 0;\n let spaceEnd = dropSpace && end && end.isText ? /\\s*$/.exec(end.text)[0].length : 0;\n if (from + spaceStart < to) {\n from += spaceStart;\n to -= spaceEnd;\n }\n tr.addMark(from, to, markType.create(attrs));\n }\n }\n dispatch(tr.scrollIntoView());\n }\n }\n return true;\n };\n}\nfunction wrapDispatchForJoin(dispatch, isJoinable) {\n return (tr) => {\n if (!tr.isGeneric)\n return dispatch(tr);\n let ranges = [];\n for (let i = 0; i < tr.mapping.maps.length; i++) {\n let map = tr.mapping.maps[i];\n for (let j = 0; j < ranges.length; j++)\n ranges[j] = map.map(ranges[j]);\n map.forEach((_s, _e, from, to) => ranges.push(from, to));\n }\n // Figure out which joinable points exist inside those ranges,\n // by checking all node boundaries in their parent nodes.\n let joinable = [];\n for (let i = 0; i < ranges.length; i += 2) {\n let from = ranges[i], to = ranges[i + 1];\n let $from = tr.doc.resolve(from), depth = $from.sharedDepth(to), parent = $from.node(depth);\n for (let index = $from.indexAfter(depth), pos = $from.after(depth + 1); pos <= to; ++index) {\n let after = parent.maybeChild(index);\n if (!after)\n break;\n if (index && joinable.indexOf(pos) == -1) {\n let before = parent.child(index - 1);\n if (before.type == after.type && isJoinable(before, after))\n joinable.push(pos);\n }\n pos += after.nodeSize;\n }\n }\n // Join the joinable points\n joinable.sort((a, b) => a - b);\n for (let i = joinable.length - 1; i >= 0; i--) {\n if (canJoin(tr.doc, joinable[i]))\n tr.join(joinable[i]);\n }\n dispatch(tr);\n };\n}\n/**\nWrap a command so that, when it produces a transform that causes\ntwo joinable nodes to end up next to each other, those are joined.\nNodes are considered joinable when they are of the same type and\nwhen the `isJoinable` predicate returns true for them or, if an\narray of strings was passed, if their node type name is in that\narray.\n*/\nfunction autoJoin(command, isJoinable) {\n let canJoin = Array.isArray(isJoinable) ? (node) => isJoinable.indexOf(node.type.name) > -1\n : isJoinable;\n return (state, dispatch, view) => command(state, dispatch && wrapDispatchForJoin(dispatch, canJoin), view);\n}\n/**\nCombine a number of command functions into a single function (which\ncalls them one by one until one returns true).\n*/\nfunction chainCommands(...commands) {\n return function (state, dispatch, view) {\n for (let i = 0; i < commands.length; i++)\n if (commands[i](state, dispatch, view))\n return true;\n return false;\n };\n}\nlet backspace = chainCommands(deleteSelection, joinBackward, selectNodeBackward);\nlet del = chainCommands(deleteSelection, joinForward, selectNodeForward);\n/**\nA basic keymap containing bindings not specific to any schema.\nBinds the following keys (when multiple commands are listed, they\nare chained with [`chainCommands`](https://prosemirror.net/docs/ref/#commands.chainCommands)):\n\n* **Enter** to `newlineInCode`, `createParagraphNear`, `liftEmptyBlock`, `splitBlock`\n* **Mod-Enter** to `exitCode`\n* **Backspace** and **Mod-Backspace** to `deleteSelection`, `joinBackward`, `selectNodeBackward`\n* **Delete** and **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n* **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n* **Mod-a** to `selectAll`\n*/\nconst pcBaseKeymap = {\n \"Enter\": chainCommands(newlineInCode, createParagraphNear, liftEmptyBlock, splitBlock),\n \"Mod-Enter\": exitCode,\n \"Backspace\": backspace,\n \"Mod-Backspace\": backspace,\n \"Shift-Backspace\": backspace,\n \"Delete\": del,\n \"Mod-Delete\": del,\n \"Mod-a\": selectAll\n};\n/**\nA copy of `pcBaseKeymap` that also binds **Ctrl-h** like Backspace,\n**Ctrl-d** like Delete, **Alt-Backspace** like Ctrl-Backspace, and\n**Ctrl-Alt-Backspace**, **Alt-Delete**, and **Alt-d** like\nCtrl-Delete.\n*/\nconst macBaseKeymap = {\n \"Ctrl-h\": pcBaseKeymap[\"Backspace\"],\n \"Alt-Backspace\": pcBaseKeymap[\"Mod-Backspace\"],\n \"Ctrl-d\": pcBaseKeymap[\"Delete\"],\n \"Ctrl-Alt-Backspace\": pcBaseKeymap[\"Mod-Delete\"],\n \"Alt-Delete\": pcBaseKeymap[\"Mod-Delete\"],\n \"Alt-d\": pcBaseKeymap[\"Mod-Delete\"],\n \"Ctrl-a\": selectTextblockStart,\n \"Ctrl-e\": selectTextblockEnd\n};\nfor (let key in pcBaseKeymap)\n macBaseKeymap[key] = pcBaseKeymap[key];\nconst mac = typeof navigator != \"undefined\" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform)\n // @ts-ignore\n : typeof os != \"undefined\" && os.platform ? os.platform() == \"darwin\" : false;\n/**\nDepending on the detected platform, this will hold\n[`pcBasekeymap`](https://prosemirror.net/docs/ref/#commands.pcBaseKeymap) or\n[`macBaseKeymap`](https://prosemirror.net/docs/ref/#commands.macBaseKeymap).\n*/\nconst baseKeymap = mac ? macBaseKeymap : pcBaseKeymap;\n\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinTextblockBackward, joinTextblockForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, selectTextblockEnd, selectTextblockStart, setBlockType, splitBlock, splitBlockAs, splitBlockKeepMarks, toggleMark, wrapIn };\n","/**\n * Gets the default block type at a given match.\n * @param match Content match.\n * @returns Default block type or null.\n *\n * https://github.com/ProseMirror/prosemirror-commands/blob/master/src/commands.ts#L297\n */\nexport function defaultBlockAt(match) {\n for (let i = 0; i < match.edgeCount; i++) {\n const { type } = match.edge(i);\n if (type.isTextblock && !type.hasRequiredAttrs()) return type;\n }\n return null;\n}\n","import { splitBlock as originalSplitBlock } from 'prosemirror-commands';\nimport { NodeSelection, TextSelection } from 'prosemirror-state';\nimport { canSplit } from 'prosemirror-transform';\nimport { defaultBlockAt } from '../helpers/defaultBlockAt.js';\nimport { Attribute } from '../Attribute.js';\n\nconst ensureMarks = (state, splittableMarks) => {\n const marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\n if (marks) {\n const filtered = marks.filter((m) => splittableMarks?.includes(m.type.name));\n state.tr.ensureMarks(filtered);\n }\n};\n\n/**\n * Will split the current node into two nodes. If the selection is not\n * splittable, the command will be ignored.\n * @param options.keepMarks Keep marks from prev node.\n *\n * The command is a slightly modified version of the original\n * `splitBlockAs` command to better manage attributes and marks.\n * https://github.com/ProseMirror/prosemirror-commands/blob/master/src/commands.ts#L357\n */\nexport const splitBlock =\n ({ keepMarks = true } = {}) =>\n (props) => {\n const { tr, state, dispatch, editor } = props;\n const { selection, doc } = tr;\n const { $from, $to } = selection;\n\n const extensionAttrs = editor.extensionService.attributes;\n const newAttrs = Attribute.getSplittedAttributes(extensionAttrs, $from.node().type.name, $from.node().attrs);\n\n if (selection instanceof NodeSelection && selection.node.isBlock) {\n if (!$from.parentOffset || !canSplit(doc, $from.pos)) return false;\n if (dispatch) {\n if (keepMarks) ensureMarks(state, editor.extensionService.splittableMarks);\n tr.split($from.pos).scrollIntoView();\n }\n return true;\n }\n\n if (!$from.parent.isBlock) return false;\n\n if (dispatch) {\n const atEnd = $to.parentOffset === $to.parent.content.size;\n if (selection instanceof TextSelection) tr.deleteSelection();\n const deflt = $from.depth === 0 ? null : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)));\n\n let types = atEnd && deflt ? [{ type: deflt, attrs: newAttrs }] : undefined;\n let can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types);\n\n if (!types && !can && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : undefined)) {\n can = true;\n types = deflt ? [{ type: deflt, attrs: newAttrs }] : undefined;\n }\n\n if (can) {\n tr.split(tr.mapping.map($from.pos), 1, types);\n\n if (deflt && !atEnd && !$from.parentOffset && $from.parent.type !== deflt) {\n const first = tr.mapping.map($from.before());\n const $first = tr.doc.resolve(first);\n if ($from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) {\n tr.setNodeMarkup(tr.mapping.map($from.before()), deflt);\n }\n }\n }\n\n if (keepMarks) ensureMarks(state, editor.extensionService.splittableMarks);\n tr.scrollIntoView();\n }\n\n return true;\n };\n","import { liftEmptyBlock as originalLiftEmptyBlock } from 'prosemirror-commands';\n\n/**\n * If the cursor is in an empty textblock that can be lifted, lift the block.\n *\n * https://prosemirror.net/docs/ref/#commands.liftEmptyBlock\n */\n//prettier-ignore\nexport const liftEmptyBlock = () => ({ state, dispatch }) => originalLiftEmptyBlock(state, dispatch);\n","import { createParagraphNear as originalCreateParagraphNear } from 'prosemirror-commands';\n\n/**\n * Create a paragraph nearby.\n */\n//prettier-ignore\nexport const createParagraphNear = () => ({ state, dispatch }) => {\n return originalCreateParagraphNear(state, dispatch);\n};\n","import { newlineInCode as originalNewlineInCode } from 'prosemirror-commands';\n\n/**\n * Add a newline character in code.\n *\n * https://prosemirror.net/docs/ref/#commands.newlineInCode\n */\n//prettier-ignore\nexport const newlineInCode = () => ({ state, dispatch }) => originalNewlineInCode(state, dispatch);\n","import { exitCode as originalExitCode } from 'prosemirror-commands';\n\n/**\n * Exit from a code block.\n */\n//prettier-ignore\nexport const exitCode = () => ({ state, dispatch }) => {\n return originalExitCode(state, dispatch);\n};\n","import { TextSelection } from 'prosemirror-state';\n\n/**\n * Checks if value is a TextSelection.\n * @param value Any value.\n */\nexport const isTextSelection = (value) => {\n value instanceof TextSelection;\n};\n","import { Attribute } from '../Attribute.js';\nimport { getMarkType } from '../helpers/getMarkType.js';\nimport { isTextSelection } from '../helpers/isTextSelection.js';\n\nfunction canSetMark(state, tr, newMarkType) {\n const { selection } = tr;\n let cursor = null;\n\n if (isTextSelection(selection)) {\n cursor = selection.$cursor;\n }\n\n if (cursor) {\n const currentMarks = state.storedMarks ?? cursor.marks();\n\n // There can be no current marks that exclude the new mark\n return !!newMarkType.isInSet(currentMarks) || !currentMarks.some((mark) => mark.type.excludes(newMarkType));\n }\n\n return selection.ranges.some(({ $from, $to }) => {\n let someNodeSupportsMark =\n $from.depth === 0 ? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType) : false;\n\n state.doc.nodesBetween($from.pos, $to.pos, (node, _pos, parent) => {\n // If we already found a mark that we can enable, return false to bypass the remaining search\n if (someNodeSupportsMark) return false;\n\n if (node.isInline) {\n const parentAllowsMarkType = !parent || parent.type.allowsMarkType(newMarkType);\n\n //prettier-ignore\n const currentMarksAllowMarkType = (\n !!newMarkType.isInSet(node.marks) || \n !node.marks.some((otherMark) => otherMark.type.excludes(newMarkType))\n );\n\n someNodeSupportsMark = parentAllowsMarkType && currentMarksAllowMarkType;\n }\n return !someNodeSupportsMark;\n });\n\n return someNodeSupportsMark;\n });\n}\n\n/**\n * Add a mark with new attrs.\n * @param typeOrName The mark type or name.\n * @param attributes Attributes to add.\n */\n//prettier-ignore\nexport const setMark = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {\n const { selection } = tr;\n const { empty, ranges } = selection;\n const type = getMarkType(typeOrName, state.schema);\n\n if (dispatch) {\n if (empty) {\n const oldAttributes = Attribute.getMarkAttributes(state, type);\n\n tr.addStoredMark(\n type.create({\n ...oldAttributes,\n ...attributes,\n }),\n );\n } else {\n ranges.forEach((range) => {\n const from = range.$from.pos;\n const to = range.$to.pos;\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n const trimmedFrom = Math.max(pos, from);\n const trimmedTo = Math.min(pos + node.nodeSize, to);\n const someHasMark = node.marks.find((mark) => mark.type === type);\n\n // if there is already a mark of this type\n // we know that we have to merge its attributes\n // otherwise we add a fresh new mark\n if (someHasMark) {\n node.marks.forEach((mark) => {\n if (type === mark.type) {\n tr.addMark(\n trimmedFrom,\n trimmedTo,\n type.create({\n ...mark.attrs,\n ...attributes,\n }),\n );\n }\n });\n } else {\n tr.addMark(trimmedFrom, trimmedTo, type.create(attributes));\n }\n });\n });\n }\n }\n\n return canSetMark(state, tr, type);\n };\n","import { objectIncludes } from '../utilities/objectIncludes.js';\n\nfunction findMarkInSet(marks, type, attrs = {}) {\n return marks.find((item) => {\n return item.type === type && objectIncludes(item.attrs, attrs);\n });\n}\n\nfunction isMarkInSet(marks, type, attrs = {}) {\n return !!findMarkInSet(marks, type, attrs);\n}\n\nexport function getMarkRange($pos, type, attrs = {}) {\n if (!$pos || !type) return;\n\n let start = $pos.parent.childAfter($pos.parentOffset);\n\n if ($pos.parentOffset === start.offset && start.offset !== 0) {\n start = $pos.parent.childBefore($pos.parentOffset);\n }\n\n if (!start.node) return;\n\n const mark = findMarkInSet([...start.node.marks], type, attrs);\n if (!mark) return;\n\n let startIndex = start.index;\n let startPos = $pos.start() + start.offset;\n let endIndex = startIndex + 1;\n let endPos = startPos + start.node.nodeSize;\n\n findMarkInSet([...start.node.marks], type, attrs);\n\n while (startIndex > 0 && mark.isInSet($pos.parent.child(startIndex - 1).marks)) {\n startIndex -= 1;\n startPos -= $pos.parent.child(startIndex).nodeSize;\n }\n\n while (endIndex < $pos.parent.childCount && isMarkInSet([...$pos.parent.child(endIndex).marks], type, attrs)) {\n endPos += $pos.parent.child(endIndex).nodeSize;\n endIndex += 1;\n }\n\n return { from: startPos, to: endPos };\n}\n","import { getMarkRange } from '../helpers/getMarkRange.js';\nimport { getMarkType } from '../helpers/getMarkType.js';\n\n/**\n * Remove all marks in the current selection.\n * @param typeOrName Mark type or name.\n * @param options.extendEmptyMarkRange Removes the mark even across the current selection.\n */\n//prettier-ignore\nexport const unsetMark = (typeOrName, options = {}) => ({ tr, state, dispatch }) => {\n const { extendEmptyMarkRange = false } = options;\n const { selection } = tr;\n const type = getMarkType(typeOrName, state.schema);\n const { $from, empty, ranges } = selection;\n\n if (!dispatch) return true;\n\n if (empty && extendEmptyMarkRange) {\n let { from, to } = selection;\n const attrs = $from.marks().find((mark) => mark.type === type)?.attrs;\n const range = getMarkRange($from, type, attrs);\n\n if (range) {\n from = range.from;\n to = range.to;\n }\n\n tr.removeMark(from, to, type);\n } else {\n ranges.forEach((range) => {\n tr.removeMark(range.$from.pos, range.$to.pos, type);\n });\n }\n\n tr.removeStoredMark(type);\n\n return true;\n};\n","/**\n * Remove all marks in the current selection.\n */\n//prettier-ignore\nexport const unsetAllMarks = () => ({ tr, dispatch }) => {\n const { selection } = tr;\n const { empty, ranges } = selection;\n\n if (empty) return true;\n\n if (dispatch) {\n ranges.forEach((range) => {\n tr.removeMark(range.$from.pos, range.$to.pos);\n });\n }\n\n return true;\n};\n","import { getMarkType } from './getMarkType.js';\nimport { objectIncludes } from '../utilities/objectIncludes.js';\n\n/**\n * Checks if the currently selected mark is active.\n * @param state The current editor state.\n * @param typeOrName The type or name of the mark (or null).\n * @param attrs The mark attrs.\n * @returns Boolean.\n */\nexport function isMarkActive(state, typeOrName, attrs = {}) {\n const { empty, ranges } = state.selection;\n const type = typeOrName ? getMarkType(typeOrName, state.schema) : null;\n\n if (empty) {\n return !!(state.storedMarks || state.selection.$from.marks())\n .filter((mark) => {\n if (!type) return true;\n return type.name === mark.type.name;\n })\n .find((mark) => objectIncludes(mark.attrs, attrs, { strict: false }));\n }\n\n let selectionRange = 0;\n const markRanges = [];\n\n ranges.forEach(({ $from, $to }) => {\n const from = $from.pos;\n const to = $to.pos;\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isText && !node.marks.length) return;\n\n const relativeFrom = Math.max(from, pos);\n const relativeTo = Math.min(to, pos + node.nodeSize);\n const range = relativeTo - relativeFrom;\n\n selectionRange += range;\n\n markRanges.push(\n ...node.marks.map((mark) => ({\n mark,\n from: relativeFrom,\n to: relativeTo,\n })),\n );\n });\n });\n\n if (selectionRange === 0) return false;\n\n // calculate range of matched mark\n const matchedRange = markRanges\n .filter((markRange) => {\n if (!type) return true;\n return type.name === markRange.mark.type.name;\n })\n .filter((markRange) => objectIncludes(markRange.mark.attrs, attrs, { strict: false }))\n .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0);\n\n // calculate range of marks that excludes the searched mark\n // for example `code` doesn’t allow any other marks\n const excludedRange = markRanges\n .filter((markRange) => {\n if (!type) return true;\n return markRange.mark.type !== type && markRange.mark.type.excludes(type);\n })\n .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0);\n\n // we only include the result of `excludedRange`\n // if there is a match at all\n const range = matchedRange > 0 ? matchedRange + excludedRange : matchedRange;\n return range >= selectionRange;\n}\n","import { getMarkType } from '../helpers/getMarkType.js';\nimport { isMarkActive } from '../helpers/isMarkActive.js';\n\n/**\n * Toggle a mark on and off.\n * @param typeOrName Mark type or name.\n * @param attrs Mark attributes.\n * @param options.extendEmptyMarkRange Removes the mark even across the current selection.\n */\nexport const toggleMark =\n (typeOrName, attrs = {}, options = {}) =>\n ({ state, commands }) => {\n const { extendEmptyMarkRange = false } = options;\n const type = getMarkType(typeOrName, state.schema);\n const isActive = isMarkActive(state, type, attrs);\n if (isActive) return commands.unsetMark(type, { extendEmptyMarkRange });\n return commands.setMark(type, attrs);\n };\n","import { liftTarget } from 'prosemirror-transform';\n\n/**\n * Normalize nodes to the default node (paragraph by default).\n * This may be helpful before applying a new node type.\n *\n * The paragraph is the default node because\n * it has the highest priority (priority: 1000) and it's loaded first.\n */\n// prettier-ignore\nexport const clearNodes = () => ({ state, tr, dispatch }) => {\n const { selection } = tr;\n const { ranges } = selection;\n\n if (!dispatch) return true;\n\n ranges.forEach(({ $from, $to }) => {\n state.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n if (node.type.isText) return;\n\n const { doc, mapping } = tr;\n const $mappedFrom = doc.resolve(mapping.map(pos));\n const $mappedTo = doc.resolve(mapping.map(pos + node.nodeSize));\n const nodeRange = $mappedFrom.blockRange($mappedTo);\n if (!nodeRange) return;\n\n const targetLiftDepth = liftTarget(nodeRange);\n\n if (node.type.isTextblock) {\n const { defaultType } = $mappedFrom.parent.contentMatchAt($mappedFrom.index());\n tr.setNodeMarkup(nodeRange.start, defaultType);\n }\n\n if (targetLiftDepth || targetLiftDepth === 0) {\n tr.lift(nodeRange, targetLiftDepth);\n }\n });\n });\n\n return true;\n};\n","import { setBlockType } from 'prosemirror-commands';\nimport { getNodeType } from '../helpers/getNodeType.js';\n\n/**\n * Replace a given range with a node.\n * @param typeOrName The type or name of the node.\n * @param attrs The attributes of the node.\n */\nexport const setNode =\n (typeOrName, attrs = {}) =>\n ({ state, dispatch, chain }) => {\n const type = getNodeType(typeOrName, state.schema);\n if (!type.isTextblock) return false;\n\n return (\n chain()\n // try to convert node to default node if needed\n .command(({ commands }) => {\n const canSetBlock = setBlockType(type, attrs)(state);\n if (canSetBlock) return true;\n return commands.clearNodes();\n })\n .command(({ state: updatedState }) => {\n return setBlockType(type, attrs)(updatedState, dispatch);\n })\n .run()\n );\n };\n","import { getNodeType } from './getNodeType.js';\nimport { objectIncludes } from '../utilities/objectIncludes.js';\n\n/**\n * Checks if the currently selected node is active.\n * @param state The current editor state.\n * @param typeOrName The type or name of the node (or null).\n * @param attrs The node attrs.\n * @returns Boolean.\n */\nexport function isNodeActive(state, typeOrName, attrs = {}) {\n const { from, to, empty } = state.selection;\n const type = typeOrName ? getNodeType(typeOrName, state.schema) : null;\n\n const nodeRanges = [];\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isText) return;\n\n const relativeFrom = Math.max(from, pos);\n const relativeTo = Math.min(to, pos + node.nodeSize);\n nodeRanges.push({\n node,\n from: relativeFrom,\n to: relativeTo,\n });\n });\n\n const selectionRange = to - from;\n const matchedNodeRanges = nodeRanges\n .filter((nodeRange) => {\n if (!type) return true;\n return type.name === nodeRange.node.type.name;\n })\n .filter((nodeRange) => objectIncludes(nodeRange.node.attrs, attrs, { strict: false }));\n\n if (empty) return !!matchedNodeRanges.length;\n\n const range = matchedNodeRanges.reduce((sum, nodeRange) => sum + nodeRange.to - nodeRange.from, 0);\n return range >= selectionRange;\n}\n","import { getNodeType } from '../helpers/getNodeType.js';\nimport { isNodeActive } from '../helpers/isNodeActive.js';\n\n/**\n * Toggle a node with another node.\n * @param typeOrName The type or name of the node.\n * @param toggleTypeOrName The type or name of the node to toggle.\n * @param attrs The attrs of the node.\n */\nexport const toggleNode =\n (typeOrName, toggleTypeOrName, attrs = {}) =>\n ({ state, commands }) => {\n const type = getNodeType(typeOrName, state.schema);\n const toggleType = getNodeType(toggleTypeOrName, state.schema);\n const isActive = isNodeActive(state, type, attrs);\n if (isActive) return commands.setNode(toggleType);\n return commands.setNode(type, attrs);\n };\n","import { selectAll as originalSelectAll } from 'prosemirror-commands';\n\n/**\n * Select the whole document.\n *\n * https://prosemirror.net/docs/ref/#commands.selectAll\n */\n//prettier-ignore\nexport const selectAll = () => ({ state, dispatch }) => originalSelectAll(state, dispatch);\n","import { deleteSelection as originalDeleteSelection } from 'prosemirror-commands';\n\n/**\n * Delete the selection, if there is one.\n */\n//prettier-ignore\nexport const deleteSelection = () => ({ state, dispatch }) => {\n return originalDeleteSelection(state, dispatch);\n};\n","import { getMarkType } from '../helpers/getMarkType.js';\nimport { getNodeType } from '../helpers/getNodeType.js';\nimport { getSchemaTypeNameByName } from '../helpers/getSchemaTypeNameByName.js';\n\n/**\n * Update attributes of a node or mark.\n * @param typeOrName The type or name of the node/mark.\n * @param attrs The attrs of the node/mark.\n */\n//prettier-ignore\nexport const updateAttributes = (typeOrName, attrs = {}) => ({ tr, state, dispatch }) => {\n let nodeType = null;\n let markType = null;\n\n const schemaType = getSchemaTypeNameByName(\n typeof typeOrName === 'string' ? typeOrName : typeOrName.name,\n state.schema,\n );\n\n if (!schemaType) return false;\n\n if (schemaType === 'node') {\n nodeType = getNodeType(typeOrName, state.schema);\n }\n if (schemaType === 'mark') {\n markType = getMarkType(typeOrName, state.schema);\n }\n\n if (dispatch) {\n tr.selection.ranges.forEach((range) => {\n const from = range.$from.pos;\n const to = range.$to.pos;\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (nodeType && nodeType === node.type) {\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, ...attrs });\n }\n\n if (markType && node.marks.length) {\n node.marks.forEach((mark) => {\n if (markType === mark.type) {\n const trimmedFrom = Math.max(pos, from);\n const trimmedTo = Math.min(pos + node.nodeSize, to);\n\n tr.addMark(trimmedFrom, trimmedTo, markType.create({ ...mark.attrs, ...attrs }));\n }\n });\n }\n });\n });\n }\n\n return true;\n};\n","/**\n * Delete a property or an array of properties from an object.\n * @param obj Object\n * @param propOrProps Key or array of keys to remove.\n */\nexport function deleteProps(obj, propOrProps) {\n const isString = typeof propOrProps === 'string';\n const props = isString ? [propOrProps] : propOrProps;\n\n return Object.keys(obj).reduce((newObj, prop) => {\n const contains = props.includes(prop);\n if (!contains) newObj[prop] = obj[prop];\n return newObj;\n }, {});\n}\n","import { getMarkType } from '../helpers/getMarkType.js';\nimport { getNodeType } from '../helpers/getNodeType.js';\nimport { getSchemaTypeNameByName } from '../helpers/getSchemaTypeNameByName.js';\nimport { deleteProps } from '../utilities/deleteProps.js';\n\n/**\n * Resets some node attributes to the default value.\n * @param {*} typeOrName The type or name of the node.\n * @param {*} attrs The attributes of the node to reset.\n */\nexport const resetAttributes =\n (typeOrName, attrs) =>\n ({ tr, state, dispatch }) => {\n let nodeType = null;\n let markType = null;\n\n const schemaType = getSchemaTypeNameByName(\n typeof typeOrName === 'string' ? typeOrName : typeOrName.name,\n state.schema,\n );\n\n if (!schemaType) return false;\n\n if (schemaType === 'node') {\n nodeType = getNodeType(typeOrName, state.schema);\n }\n if (schemaType === 'mark') {\n markType = getMarkType(typeOrName, state.schema);\n }\n\n if (dispatch) {\n tr.selection.ranges.forEach((range) => {\n state.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {\n if (nodeType && nodeType === node.type) {\n tr.setNodeMarkup(pos, undefined, deleteProps(node.attrs, attrs));\n }\n\n if (markType && node.marks.length) {\n node.marks.forEach((mark) => {\n if (markType === mark.type) {\n tr.addMark(pos, pos + node.nodeSize, markType.create(deleteProps(mark.attrs, attrs)));\n }\n });\n }\n });\n });\n }\n\n return true;\n };\n","import { joinUp as originalJoinUp } from 'prosemirror-commands';\n\n/**\n * Join the selected block or, if there is a text selection, the\n * closest ancestor block of the selection that can be joined, with\n * the sibling above it.\n *\n * https://prosemirror.net/docs/ref/#commands.joinUp\n */\n//prettier-ignore\nexport const joinUp = () => ({ state, dispatch }) => originalJoinUp(state, dispatch);\n","import { joinDown as originalJoinDown } from 'prosemirror-commands';\n\n/**\n * Join the selected block, or the closest ancestor of the selection\n * that can be joined, with the sibling after it.\n *\n * https://prosemirror.net/docs/ref/#commands.joinDown\n */\n//prettier-ignore\nexport const joinDown = () => ({ state, dispatch }) => originalJoinDown(state, dispatch);\n","import { joinBackward as originalJoinBackward } from 'prosemirror-commands';\n\n/**\n * Join two nodes backward.\n *\n * If the selection is empty and at the start of a textblock, try to\n * reduce the distance between that block and the one before it—if\n * there's a block directly before it that can be joined, join them.\n * If not, try to move the selected block closer to the next one in\n * the document structure by lifting it out of its parent or moving it\n * into a parent of the previous block. Will use the view for accurate\n * (bidi-aware) start-of-textblock detection if given.\n *\n * https://prosemirror.net/docs/ref/#commands.joinBackward\n */\n//prettier-ignore\nexport const joinBackward = () => ({ state, dispatch }) => originalJoinBackward(state, dispatch);\n","import { joinForward as originalJoinForward } from 'prosemirror-commands';\n\n/**\n * Join two nodes forward.\n *\n * If the selection is empty and the cursor is at the end of a\n * textblock, try to reduce or remove the boundary between that block\n * and the one after it, either by joining them or by moving the other\n * block closer to this one in the tree structure. Will use the view\n * for accurate start-of-textblock detection if given.\n *\n * https://prosemirror.net/docs/ref/#commands.joinForward\n */\n//prettier-ignore\nexport const joinForward = () => ({ state, dispatch }) => originalJoinForward(state, dispatch);\n","import { selectNodeBackward as originalSelectNodeBackward } from 'prosemirror-commands';\n\n/**\n * Select a node backward.\n *\n * https://prosemirror.net/docs/ref/#commands.selectNodeBackward\n */\nexport const selectNodeBackward =\n () =>\n ({ state, dispatch }) => {\n return originalSelectNodeBackward(state, dispatch);\n };\n","import { selectNodeForward as originalSelectNodeForward } from 'prosemirror-commands';\n\n/**\n * Select a node forward.\n *\n * https://prosemirror.net/docs/ref/#commands.selectNodeForward\n */\n//prettier-ignore\nexport const selectNodeForward = () => ({ state, dispatch }) => originalSelectNodeForward(state, dispatch);\n","import { selectTextblockStart as originalSelectTextblockStart } from 'prosemirror-commands';\n\n/**\n * Moves the cursor to the start of current text block.\n *\n * https://prosemirror.net/docs/ref/#commands.selectTextblockStart\n */\n//prettier-ignore\nexport const selectTextblockStart = () => ({ state, dispatch }) => originalSelectTextblockStart(state, dispatch);\n","import { selectTextblockEnd as originalSelectTextblockEnd } from 'prosemirror-commands';\n\n/**\n * Moves the cursor to the end of current text block.\n *\n * https://prosemirror.net/docs/ref/#commands.selectTextblockEnd\n */\n//prettier-ignore\nexport const selectTextblockEnd = () => ({ state, dispatch }) => originalSelectTextblockEnd(state, dispatch);\n","//prettier-ignore\nexport const insertContent = (value, options) => ({ tr, commands }) => {\n return commands.insertContentAt({ from: tr.selection.from, to: tr.selection.to }, value, options);\n};\n","import { DOMParser, Schema, Fragment } from 'prosemirror-model';\n\nconst removeWhitespaces = (node) => {\n const children = node.childNodes;\n\n for (let i = children.length - 1; i >= 0; i -= 1) {\n const child = children[i];\n\n if (child.nodeType === 3 && child.nodeValue && /^(\\n\\s\\s|\\n)$/.test(child.nodeValue)) {\n node.removeChild(child);\n } else if (child.nodeType === 1) {\n removeWhitespaces(child);\n }\n }\n\n return node;\n};\n\nexport function elementFromString(value) {\n // add a wrapper to preserve leading and trailing whitespace\n const wrappedValue = `<body>${value}</body>`;\n const html = new window.DOMParser().parseFromString(wrappedValue, 'text/html').body;\n return removeWhitespaces(html);\n}\n\nexport function createNodeFromContent(content, schema, options) {\n options = {\n slice: true,\n parseOptions: {},\n ...options,\n };\n\n const isJSONContent = typeof content === 'object' && content !== null;\n const isTextContent = typeof content === 'string';\n\n if (isJSONContent) {\n try {\n const isArrayContent = Array.isArray(content) && content.length > 0;\n\n // if the JSON Content is an array of nodes, create a fragment for each node\n if (isArrayContent) {\n return Fragment.fromArray(content.map((item) => schema.nodeFromJSON(item)));\n }\n\n const node = schema.nodeFromJSON(content);\n\n if (options.errorOnInvalidContent) {\n node.check();\n }\n\n return node;\n } catch (error) {\n if (options.errorOnInvalidContent) {\n throw new Error('[super-editor error]: Invalid JSON content', { cause: error });\n }\n\n console.warn('[super-editor warn]: Invalid content.', 'Passed value:', content, 'Error:', error);\n\n return createNodeFromContent('', schema, options);\n }\n }\n\n if (isTextContent) {\n // Check for invalid content\n if (options.errorOnInvalidContent) {\n let hasInvalidContent = false;\n let invalidContent = '';\n\n // A copy of the current schema with a catch-all node at the end\n const contentCheckSchema = new Schema({\n topNode: schema.spec.topNode,\n marks: schema.spec.marks,\n // Prosemirror's schemas are executed such that: the last to execute, matches last\n // This means that we can add a catch-all node at the end of the schema to catch any content that we don't know how to handle\n nodes: schema.spec.nodes.append({\n __supereditor__private__unknown__catch__all__node: {\n content: 'inline*',\n group: 'block',\n parseDOM: [\n {\n tag: '*',\n getAttrs: (e) => {\n // If this is ever called, we know that the content has something that we don't know how to handle in the schema\n hasInvalidContent = true;\n // Try to stringify the element for a more helpful error message\n invalidContent = typeof e === 'string' ? e : e.outerHTML;\n return null;\n },\n },\n ],\n },\n }),\n });\n\n if (options.slice) {\n DOMParser.fromSchema(contentCheckSchema).parseSlice(elementFromString(content), options.parseOptions);\n } else {\n DOMParser.fromSchema(contentCheckSchema).parse(elementFromString(content), options.parseOptions);\n }\n\n if (options.errorOnInvalidContent && hasInvalidContent) {\n throw new Error('[super-editor error]: Invalid HTML content', {\n cause: new Error(`Invalid element found: ${invalidContent}`),\n });\n }\n }\n\n const parser = DOMParser.fromSchema(schema);\n\n if (options.slice) {\n return parser.parseSlice(elementFromString(content), options.parseOptions).content;\n }\n\n return parser.parse(elementFromString(content), options.parseOptions);\n }\n\n return createNodeFromContent('', schema, options);\n}\n","import { Selection } from 'prosemirror-state';\nimport { ReplaceAroundStep, ReplaceStep } from 'prosemirror-transform';\n\n// source: https://github.com/ProseMirror/prosemirror-state/blob/master/src/selection.js#L466\nexport function selectionToInsertionEnd(tr, startLen, bias) {\n const last = tr.steps.length - 1;\n\n if (last < startLen) {\n return;\n }\n\n const step = tr.steps[last];\n\n if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) {\n return;\n }\n\n const map = tr.mapping.maps[last];\n let end = 0;\n\n map.forEach((_from, _to, _newFrom, newTo) => {\n if (end === 0) {\n end = newTo;\n }\n });\n\n tr.setSelection(Selection.near(tr.doc.resolve(end), bias));\n}\n","import { createNodeFromContent } from '../helpers/createNodeFromContent';\nimport { selectionToInsertionEnd } from '../helpers/selectionToInsertionEnd';\n\nconst isFragment = (nodeOrFragment) => {\n return !('type' in nodeOrFragment);\n};\n\n//prettier-ignore\nexport const insertContentAt = (position, value, options) => ({ tr, dispatch, editor }) => {\n if (dispatch) {\n options = {\n parseOptions: {},\n updateSelection: true,\n applyInputRules: false,\n applyPasteRules: false,\n ...options,\n };\n\n let content;\n\n try {\n content = createNodeFromContent(value, editor.schema, {\n parseOptions: {\n preserveWhitespace: 'full',\n ...options.parseOptions,\n },\n errorOnInvalidContent: options.errorOnInvalidContent ?? editor.options.enableContentCheck,\n });\n } catch (e) {\n editor.emit('contentError', {\n editor,\n error: e,\n disableCollaboration: () => {\n console.error('[super-editor error]: Unable to disable collaboration at this point in time');\n },\n });\n return false;\n }\n\n let { from, to } =\n typeof position === 'number' ? { from: position, to: position } : { from: position.from, to: position.to };\n\n let isOnlyTextContent = true;\n let isOnlyBlockContent = true;\n const nodes = isFragment(content) ? content : [content];\n\n nodes.forEach((node) => {\n // check if added node is valid\n node.check();\n\n isOnlyTextContent = isOnlyTextContent ? node.isText && node.marks.length === 0 : false;\n\n isOnlyBlockContent = isOnlyBlockContent ? node.isBlock : false;\n });\n\n // check if we can replace the wrapping node by\n // the newly inserted content\n // example:\n // replace an empty paragraph by an inserted image\n // instead of inserting the image below the paragraph\n if (from === to && isOnlyBlockContent) {\n const { parent } = tr.doc.resolve(from);\n const isEmptyTextBlock = parent.isTextblock && !parent.type.spec.code && !parent.childCount;\n\n if (isEmptyTextBlock) {\n from -= 1;\n to += 1;\n }\n }\n\n let newContent;\n\n // if there is only plain text we have to use `insertText`\n // because this will keep the current marks\n if (isOnlyTextContent) {\n // if value is string, we can use it directly\n // otherwise if it is an array, we have to join it\n if (Array.isArray(value)) {\n newContent = value.map((v) => v.text || '').join('');\n } else if (typeof value === 'object' && !!value && !!value.text) {\n newContent = value.text;\n } else {\n newContent = value;\n }\n\n tr.insertText(newContent, from, to);\n } else {\n newContent = content;\n\n tr.replaceWith(from, to, newContent);\n }\n\n // set cursor at end of inserted content\n if (options.updateSelection) {\n selectionToInsertionEnd(tr, tr.steps.length - 1, -1);\n }\n\n if (options.applyInputRules) {\n tr.setMeta('applyInputRules', { from, text: newContent });\n }\n\n if (options.applyPasteRules) {\n tr.setMeta('applyPasteRules', { from, text: newContent });\n }\n }\n\n return true;\n};\n","import { findWrapping, ReplaceAroundStep, canSplit, liftTarget, canJoin } from 'prosemirror-transform';\nimport { NodeRange, Fragment, Slice } from 'prosemirror-model';\nimport { Selection } from 'prosemirror-state';\n\nconst olDOM = [\"ol\", 0], ulDOM = [\"ul\", 0], liDOM = [\"li\", 0];\n/**\nAn ordered list [node spec](https://prosemirror.net/docs/ref/#model.NodeSpec). Has a single\nattribute, `order`, which determines the number at which the list\nstarts counting, and defaults to 1. Represented as an `<ol>`\nelement.\n*/\nconst orderedList = {\n attrs: { order: { default: 1, validate: \"number\" } },\n parseDOM: [{ tag: \"ol\", getAttrs(dom) {\n return { order: dom.hasAttribute(\"start\") ? +dom.getAttribute(\"start\") : 1 };\n } }],\n toDOM(node) {\n return node.attrs.order == 1 ? olDOM : [\"ol\", { start: node.attrs.order }, 0];\n }\n};\n/**\nA bullet list node spec, represented in the DOM as `<ul>`.\n*/\nconst bulletList = {\n parseDOM: [{ tag: \"ul\" }],\n toDOM() { return ulDOM; }\n};\n/**\nA list item (`<li>`) spec.\n*/\nconst listItem = {\n parseDOM: [{ tag: \"li\" }],\n toDOM() { return liDOM; },\n defining: true\n};\nfunction add(obj, props) {\n let copy = {};\n for (let prop in obj)\n copy[prop] = obj[prop];\n for (let prop in props)\n copy[prop] = props[prop];\n return copy;\n}\n/**\nConvenience function for adding list-related node types to a map\nspecifying the nodes for a schema. Adds\n[`orderedList`](https://prosemirror.net/docs/ref/#schema-list.orderedList) as `\"ordered_list\"`,\n[`bulletList`](https://prosemirror.net/docs/ref/#schema-list.bulletList) as `\"bullet_list\"`, and\n[`listItem`](https://prosemirror.net/docs/ref/#schema-list.listItem) as `\"list_item\"`.\n\n`itemContent` determines the content expression for the list items.\nIf you want the commands defined in this module to apply to your\nlist structure, it should have a shape like `\"paragraph block*\"` or\n`\"paragraph (ordered_list | bullet_list)*\"`. `listGroup` can be\ngiven to assign a group name to the list node types, for example\n`\"block\"`.\n*/\nfunction addListNodes(nodes, itemContent, listGroup) {\n return nodes.append({\n ordered_list: add(orderedList, { content: \"list_item+\", group: listGroup }),\n bullet_list: add(bulletList, { content: \"list_item+\", group: listGroup }),\n list_item: add(listItem, { content: itemContent })\n });\n}\n/**\nReturns a command function that wraps the selection in a list with\nthe given type an attributes. If `dispatch` is null, only return a\nvalue to indicate whether this is possible, but don't actually\nperform the change.\n*/\nfunction wrapInList(listType, attrs = null) {\n return function (state, dispatch) {\n let { $from, $to } = state.selection;\n let range = $from.blockRange($to);\n if (!range)\n return false;\n let tr = dispatch ? state.tr : null;\n if (!wrapRangeInList(tr, range, listType, attrs))\n return false;\n if (dispatch)\n dispatch(tr.scrollIntoView());\n return true;\n };\n}\n/**\nTry to wrap the given node range in a list of the given type.\nReturn `true` when this is possible, `false` otherwise. When `tr`\nis non-null, the wrapping is added to that transaction. When it is\n`null`, the function only queries whether the wrapping is\npossible.\n*/\nfunction wrapRangeInList(tr, range, listType, attrs = null) {\n let doJoin = false, outerRange = range, doc = range.$from.doc;\n // This is at the top of an existing list item\n if (range.depth >= 2 && range.$from.node(range.depth - 1).type.compatibleContent(listType) && range.startIndex == 0) {\n // Don't do anything if this is the top of the list\n if (range.$from.index(range.depth - 1) == 0)\n return false;\n let $insert = doc.resolve(range.start - 2);\n outerRange = new NodeRange($insert, $insert, range.depth);\n if (range.endIndex < range.parent.childCount)\n range = new NodeRange(range.$from, doc.resolve(range.$to.end(range.depth)), range.depth);\n doJoin = true;\n }\n let wrap = findWrapping(outerRange, listType, attrs, range);\n if (!wrap)\n return false;\n if (tr)\n doWrapInList(tr, range, wrap, doJoin, listType);\n return true;\n}\nfunction doWrapInList(tr, range, wrappers, joinBefore, listType) {\n let content = Fragment.empty;\n for (let i = wrappers.length - 1; i >= 0; i--)\n content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content));\n tr.step(new ReplaceAroundStep(range.start - (joinBefore ? 2 : 0), range.end, range.start, range.end, new Slice(content, 0, 0), wrappers.length, true));\n let found = 0;\n for (let i = 0; i < wrappers.length; i++)\n if (wrappers[i].type == listType)\n found = i + 1;\n let splitDepth = wrappers.length - found;\n let splitPos = range.start + wrappers.length - (joinBefore ? 2 : 0), parent = range.parent;\n for (let i = range.startIndex, e = range.endIndex, first = true; i < e; i++, first = false) {\n if (!first && canSplit(tr.doc, splitPos, splitDepth)) {\n tr.split(splitPos, splitDepth);\n splitPos += 2 * splitDepth;\n }\n splitPos += parent.child(i).nodeSize;\n }\n return tr;\n}\n/**\nBuild a command that splits a non-empty textblock at the top level\nof a list item by also splitting that list item.\n*/\nfunction splitListItem(itemType, itemAttrs) {\n return function (state, dispatch) {\n let { $from, $to, node } = state.selection;\n if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to))\n return false;\n let grandParent = $from.node(-1);\n if (grandParent.type != itemType)\n return false;\n if ($from.parent.content.size == 0 && $from.node(-1).childCount == $from.indexAfter(-1)) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n if ($from.depth == 3 || $from.node(-3).type != itemType ||\n $from.index(-2) != $from.node(-2).childCount - 1)\n return false;\n if (dispatch) {\n let wrap = Fragment.empty;\n let depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3;\n // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d--)\n wrap = Fragment.from($from.node(d).copy(wrap));\n let depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount ? 1\n : $from.indexAfter(-2) < $from.node(-3).childCount ? 2 : 3;\n // Add a second list item with an empty default start node\n wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n let start = $from.before($from.depth - (depthBefore - 1));\n let tr = state.tr.replace(start, $from.after(-depthAfter), new Slice(wrap, 4 - depthBefore, 0));\n let sel = -1;\n tr.doc.nodesBetween(start, tr.doc.content.size, (node, pos) => {\n if (sel > -1)\n return false;\n if (node.isTextblock && node.content.size == 0)\n sel = pos + 1;\n });\n if (sel > -1)\n tr.setSelection(Selection.near(tr.doc.resolve(sel)));\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n let nextType = $to.pos == $from.end() ? grandParent.contentMatchAt(0).defaultType : null;\n let tr = state.tr.delete($from.pos, $to.pos);\n let types = nextType ? [itemAttrs ? { type: itemType, attrs: itemAttrs } : null, { type: nextType }] : undefined;\n if (!canSplit(tr.doc, $from.pos, 2, types))\n return false;\n if (dispatch)\n dispatch(tr.split($from.pos, 2, types).scrollIntoView());\n return true;\n };\n}\n/**\nActs like [`splitListItem`](https://prosemirror.net/docs/ref/#schema-list.splitListItem), but\nwithout resetting the set of active marks at the cursor.\n*/\nfunction splitListItemKeepMarks(itemType, itemAttrs) {\n let split = splitListItem(itemType, itemAttrs);\n return (state, dispatch) => {\n return split(state, dispatch && (tr => {\n let marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\n if (marks)\n tr.ensureMarks(marks);\n dispatch(tr);\n }));\n };\n}\n/**\nCreate a command to lift the list item around the selection up into\na wrapping list.\n*/\nfunction liftListItem(itemType) {\n return function (state, dispatch) {\n let { $from, $to } = state.selection;\n let range = $from.blockRange($to, node => node.childCount > 0 && node.firstChild.type == itemType);\n if (!range)\n return false;\n if (!dispatch)\n return true;\n if ($from.node(range.depth - 1).type == itemType) // Inside a parent list\n return liftToOuterList(state, dispatch, itemType, range);\n else // Outer list node\n return liftOutOfList(state, dispatch, range);\n };\n}\nfunction liftToOuterList(state, dispatch, itemType, range) {\n let tr = state.tr, end = range.end, endOfList = range.$to.end(range.depth);\n if (end < endOfList) {\n // There are siblings after the lifted items, which must become\n // children of the last item\n tr.step(new ReplaceAroundStep(end - 1, endOfList, end, endOfList, new Slice(Fragment.from(itemType.create(null, range.parent.copy())), 1, 0), 1, true));\n range = new NodeRange(tr.doc.resolve(range.$from.pos), tr.doc.resolve(endOfList), range.depth);\n }\n const target = liftTarget(range);\n if (target == null)\n return false;\n tr.lift(range, target);\n let $after = tr.doc.resolve(tr.mapping.map(end, -1) - 1);\n if (canJoin(tr.doc, $after.pos) && $after.nodeBefore.type == $after.nodeAfter.type)\n tr.join($after.pos);\n dispatch(tr.scrollIntoView());\n return true;\n}\nfunction liftOutOfList(state, dispatch, range) {\n let tr = state.tr, list = range.parent;\n // Merge the list items into a single big item\n for (let pos = range.end, i = range.endIndex - 1, e = range.startIndex; i > e; i--) {\n pos -= list.child(i).nodeSize;\n tr.delete(pos - 1, pos + 1);\n }\n let $start = tr.doc.resolve(range.start), item = $start.nodeAfter;\n if (tr.mapping.map(range.end) != range.start + $start.nodeAfter.nodeSize)\n return false;\n let atStart = range.startIndex == 0, atEnd = range.endIndex == list.childCount;\n let parent = $start.node(-1), indexBefore = $start.index(-1);\n if (!parent.canReplace(indexBefore + (atStart ? 0 : 1), indexBefore + 1, item.content.append(atEnd ? Fragment.empty : Fragment.from(list))))\n return false;\n let start = $start.pos, end = start + item.nodeSize;\n // Strip off the surrounding list. At the sides where we're not at\n // the end of the list, the existing list is closed. At sides where\n // this is the end, it is overwritten to its end.\n tr.step(new ReplaceAroundStep(start - (atStart ? 1 : 0), end + (atEnd ? 1 : 0), start + 1, end - 1, new Slice((atStart ? Fragment.empty : Fragment.from(list.copy(Fragment.empty)))\n .append(atEnd ? Fragment.empty : Fragment.from(list.copy(Fragment.empty))), atStart ? 0 : 1, atEnd ? 0 : 1), atStart ? 0 : 1));\n dispatch(tr.scrollIntoView());\n return true;\n}\n/**\nCreate a command to sink the list item around the selection down\ninto an inner list.\n*/\nfunction sinkListItem(itemType) {\n return function (state, dispatch) {\n let { $from, $to } = state.selection;\n let range = $from.blockRange($to, node => node.childCount > 0 && node.firstChild.type == itemType);\n if (!range)\n return false;\n let startIndex = range.startIndex;\n if (startIndex == 0)\n return false;\n let parent = range.parent, nodeBefore = parent.child(startIndex - 1);\n if (nodeBefore.type != itemType)\n return false;\n if (dispatch) {\n let nestedBefore = nodeBefore.lastChild && nodeBefore.lastChild.type == parent.type;\n let inner = Fragment.from(nestedBefore ? itemType.create() : null);\n let slice = new Slice(Fragment.from(itemType.create(null, Fragment.from(parent.type.create(null, inner)))), nestedBefore ? 3 : 1, 0);\n let before = range.start, after = range.end;\n dispatch(state.tr.step(new ReplaceAroundStep(before - (nestedBefore ? 3 : 1), after, before, after, slice, 1, true))\n .scrollIntoView());\n }\n return true;\n };\n}\n\nexport { addListNodes, bulletList, liftListItem, listItem, orderedList, sinkListItem, splitListItem, splitListItemKeepMarks, wrapInList, wrapRangeInList };\n","import { wrapInList as originalWrapInList } from 'prosemirror-schema-list';\nimport { getNodeType } from '../helpers/getNodeType.js';\n\n/**\n * Wrap a node in a list.\n * @param typeOrName Type/name of the node.\n * @param attrs Attributes of the node.\n *\n * https://prosemirror.net/docs/ref/#schema-list.wrapInList\n */\n//prettier-ignore\nexport const wrapInList = (typeOrName, attrs = {}) => ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema);\n return originalWrapInList(type, attrs)(state, dispatch);\n};\n","/**\n * Finds the closest parent node to a resolved position that matches a predicate.\n * @param $pos Resolved position.\n * @param predicate Predicate to match.\n * @returns Closest parent node to the resolved position that matches the predicate.\n *\n * https://github.com/atlassian/prosemirror-utils/blob/master/src/selection.ts#L57\n */\nexport const findParentNodeClosestToPos = ($pos, predicate) => {\n for (let i = $pos.depth; i > 0; i--) {\n const node = $pos.node(i);\n if (predicate(node)) {\n return {\n pos: i > 0 ? $pos.before(i) : 0,\n start: $pos.start(i),\n depth: i,\n node,\n };\n }\n }\n};\n","import { findParentNodeClosestToPos } from './findParentNodeClosestToPos';\n\n/**\n * Find the closest parent node to the current selection that matches a predicate.\n * @param predicate Predicate to match.\n * @returns Command that finds the closest parent node.\n *\n * https://github.com/atlassian/prosemirror-utils/blob/master/src/selection.ts#L17\n */\nexport const findParentNode = (predicate) => {\n return ({ $from }) => findParentNodeClosestToPos($from, predicate);\n};\n","import { getExtensionConfigField } from './getExtensionConfigField.js';\nimport { callOrGet } from '../utilities/callOrGet.js';\n\n/**\n * Check if node is a list.\n * @param name Node name.\n * @param extensions Array of extensions.\n */\nexport const isList = (name, extensions) => {\n const nodeExtensions = extensions.filter((e) => e.type === 'node');\n const extension = nodeExtensions.find((i) => i.name === name);\n if (!extension) return false;\n\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n };\n const group = callOrGet(getExtensionConfigField(extension, 'group', context));\n if (typeof group !== 'string') return false;\n\n return group.split(' ').includes('list');\n};\n","import { canJoin } from 'prosemirror-transform';\nimport { getNodeType } from '../helpers/getNodeType.js';\nimport { findParentNode } from '../helpers/findParentNode.js';\nimport { isList } from '../helpers/isList.js';\n\n/**\n * Join list backwards.\n * @param tr Transaction.\n * @param listType List type.\n */\nconst joinListBackwards = (tr, listType) => {\n const list = findParentNode((node) => node.type === listType)(tr.selection);\n if (!list) return true;\n\n const before = tr.doc.resolve(Math.max(0, list.pos - 1)).before(list.depth);\n if (before === undefined) return true;\n\n const nodeBefore = tr.doc.nodeAt(before);\n const canJoinBackwards = list.node.type === nodeBefore?.type && canJoin(tr.doc, list.pos);\n if (!canJoinBackwards) return true;\n\n tr.join(list.pos);\n return true;\n};\n\n/**\n * Join list forwards.\n * @param tr Transaction.\n * @param listType List type.\n */\nconst joinListForwards = (tr, listType) => {\n const list = findParentNode((node) => node.type === listType)(tr.selection);\n if (!list) return true;\n\n const after = tr.doc.resolve(list.start).after(list.depth);\n if (after === undefined) return true;\n\n const nodeAfter = tr.doc.nodeAt(after);\n const canJoinForwards = list.node.type === nodeAfter?.type && canJoin(tr.doc, after);\n if (!canJoinForwards) return true;\n\n tr.join(after);\n return true;\n};\n\n/**\n * Toggle between list types.\n * @param listTypeOrName The type/name of the list.\n * @param itemTypeOrName The type/name of the list item.\n * @param keepMarks Keep marks when toggling.\n * @param attributes Attrs for the new list.\n */\nexport const toggleList =\n (listTypeOrName, itemTypeOrName, keepMarks, attributes = {}) =>\n (props) => {\n const { editor, tr, state, dispatch, chain, can, commands } = props;\n\n const { extensions, splittableMarks } = editor.extensionService;\n const listType = getNodeType(listTypeOrName, state.schema);\n const itemType = getNodeType(itemTypeOrName, state.schema);\n const { selection, storedMarks } = state;\n const { $from, $to } = selection;\n const range = $from.blockRange($to);\n\n const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks());\n\n if (!range) return false;\n\n const parentList = findParentNode((node) => isList(node.type.name, extensions))(selection);\n\n // This is the case when we toggle an existing list.\n if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\n // If we toggle to the same list type,\n // then execute `liftListItem` command.\n if (parentList.node.type === listType) {\n return commands.liftListItem(itemType);\n }\n\n // When we switch between different list types.\n if (isList(parentList.node.type.name, extensions) && listType.validContent(parentList.node.content) && dispatch) {\n const result = chain()\n .command(() => {\n tr.setNodeMarkup(parentList.pos, listType);\n return true;\n })\n .command(() => joinListBackwards(tr, listType))\n .command(() => joinListForwards(tr, listType))\n .run();\n\n return result;\n }\n }\n\n const createTryConvertNodeToDefault = ({ ensureMarks = false }) => {\n return () => {\n const canWrapInList = can().wrapInList(listType, attributes);\n if (ensureMarks) {\n const filteredMarks = marks.filter((mark) => splittableMarks.includes(mark.type.name));\n tr.ensureMarks(filteredMarks);\n }\n if (canWrapInList) return true;\n return commands.clearNodes();\n };\n };\n\n // This is the case when there is no need to ensureMarks.\n if (!keepMarks || !marks || !dispatch) {\n const result = chain()\n // First check if it's possible to wrap node in a list\n // and if not then try to convert it into a default node (paragraph).\n .command(createTryConvertNodeToDefault({ ensureMarks: false }))\n .wrapInList(listType, attributes)\n .command(() => joinListBackwards(tr, listType))\n .command(() => joinListForwards(tr, listType))\n .run();\n\n return result;\n }\n\n const result = chain()\n // First check if it's possible to wrap node in a list\n // and if not then try to convert it into a default node (paragraph).\n .command(createTryConvertNodeToDefault({ ensureMarks: true }))\n .wrapInList(listType, attributes)\n .command(() => joinListBackwards(tr, listType))\n .command(() => joinListForwards(tr, listType))\n .run();\n\n return result;\n };\n","import { Fragment, Slice } from 'prosemirror-model';\nimport { canSplit } from 'prosemirror-transform';\nimport { TextSelection } from 'prosemirror-state';\nimport { Attribute } from '../Attribute.js';\nimport { getNodeType } from '../helpers/getNodeType.js';\n\n/**\n * Splits one list item into two separate list items.\n * @param typeOrName The type or name of the node.\n *\n * The command is a slightly modified version of the original\n * `splitListItem` command to better manage attributes and marks.\n * https://github.com/ProseMirror/prosemirror-schema-list/blob/master/src/schema-list.ts#L114\n */\nexport const splitListItem = (typeOrName) => (props) => {\n const { tr, state, dispatch, editor } = props;\n const type = getNodeType(typeOrName, state.schema);\n const { $from, $to, node } = state.selection;\n\n if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to)) {\n return false;\n }\n\n const grandParent = $from.node(-1);\n if (grandParent.type !== type) {\n return false;\n }\n\n const extensionAttrs = editor.extensionService.attributes;\n\n if ($from.parent.content.size === 0 && $from.node(-1).childCount === $from.indexAfter(-1)) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n\n if (\n $from.depth === 2 || // 3\n $from.node(-3).type !== type ||\n $from.index(-2) !== $from.node(-2).childCount - 1\n ) {\n return false;\n }\n\n if (dispatch) {\n let wrap = Fragment.empty;\n const depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3;\n\n // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d--) {\n wrap = Fragment.from($from.node(d).copy(wrap));\n }\n\n //prettier-ignore\n const depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount ? 1 : $from.indexAfter(-2) < $from.node(-3).childCount ? 2 : 3;\n\n const newNextTypeAttrs = Attribute.getSplittedAttributes(\n extensionAttrs,\n $from.node().type.name,\n $from.node().attrs,\n );\n\n const nextType = type.contentMatch.defaultType?.createAndFill(newNextTypeAttrs) || undefined;\n wrap = wrap.append(Fragment.from(type.createAndFill(null, nextType) || undefined));\n const start = $from.before($from.depth - (depthBefore - 1));\n tr.replace(start, $from.after(-depthAfter), new Slice(wrap, 4 - depthBefore, 0));\n\n let sel = -1;\n tr.doc.nodesBetween(start, tr.doc.content.size, (n, pos) => {\n if (sel > -1) return false;\n if (n.isTextblock && n.content.size === 0) sel = pos + 1;\n });\n if (sel > -1) tr.setSelection(TextSelection.near(tr.doc.resolve(sel))); // Selection\n tr.scrollIntoView();\n }\n\n return true;\n }\n\n const nextType = $to.pos === $from.end() ? grandParent.contentMatchAt(0).defaultType : null;\n\n const newTypeAttributes = Attribute.getSplittedAttributes(extensionAttrs, grandParent.type.name, grandParent.attrs);\n const newNextTypeAttributes = Attribute.getSplittedAttributes(\n extensionAttrs,\n $from.node().type.name,\n $from.node().attrs,\n );\n\n tr.delete($from.pos, $to.pos);\n\n const types = nextType\n ? [\n { type, attrs: newTypeAttributes },\n { type: nextType, attrs: newNextTypeAttributes },\n ]\n : [{ type, attrs: newTypeAttributes }];\n\n if (!canSplit(tr.doc, $from.pos, 2)) {\n return false;\n }\n\n if (dispatch) {\n const { selection, storedMarks } = state;\n const { splittableMarks } = editor.extensionService;\n const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks());\n\n tr.split($from.pos, 2, types).scrollIntoView();\n\n if (!marks || !dispatch) return true;\n\n const filteredMarks = marks.filter((m) => splittableMarks.includes(m.type.name));\n tr.ensureMarks(filteredMarks);\n }\n\n return true;\n};\n","import { sinkListItem as originalSinkListItem } from 'prosemirror-schema-list';\nimport { getNodeType } from '../helpers/getNodeType.js';\n\n/**\n * Sink list item down into an inner list.\n * @param typeOrName Type/name of the node.\n *\n * https://prosemirror.net/docs/ref/#schema-list.sinkListItem\n */\n//prettier-ignore\nexport const sinkListItem = (typeOrName) => ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema);\n return originalSinkListItem(type)(state, dispatch);\n};\n","import { liftListItem as originalLiftListItem } from 'prosemirror-schema-list';\nimport { getNodeType } from '../helpers/getNodeType.js';\n\n/**\n * Lift the list item around the selection up into a wrapping list.\n * @param typeOrName Type/name of the node.\n *\n * https://prosemirror.net/docs/ref/#schema-list.liftListItem\n */\nexport const liftListItem =\n (typeOrName) =>\n ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema);\n return originalLiftListItem(type)(state, dispatch);\n };\n","import { Extension } from '../Extension.js';\nimport * as commands from '../commands/index.js';\n\nexport const Commands = Extension.create({\n name: 'commands',\n\n addCommands() {\n return { ...commands };\n },\n});\n","export const isIOS = () => {\n return ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(\n navigator.platform,\n );\n};\n","export const isMacOS = () => {\n return typeof navigator !== 'undefined' ? /Mac/.test(navigator.platform) : false;\n};\n","import { Extension } from '../Extension.js';\nimport { isIOS } from '../utilities/isIOS.js';\nimport { isMacOS } from '../utilities/isMacOS.js';\n\n/**\n * For reference.\n * https://github.com/ProseMirror/prosemirror-commands/blob/master/src/commands.ts\n */\nexport const Keymap = Extension.create({\n name: 'keymap',\n\n addShortcuts() {\n const handleEnter = () =>\n this.editor.commands.first(({ commands }) => [\n () => commands.newlineInCode(),\n () => commands.createParagraphNear(),\n () => commands.liftEmptyBlock(),\n () => commands.splitBlock(),\n ]);\n\n const handleBackspace = () =>\n this.editor.commands.first(({ commands, tr }) => [\n () => {\n tr.setMeta('inputType', 'deleteContentBackward');\n return false;\n },\n () => commands.deleteSelection(),\n () => commands.joinBackward(),\n () => commands.selectNodeBackward(),\n ]);\n\n const handleDelete = () =>\n this.editor.commands.first(({ commands }) => [\n () => commands.deleteSelection(),\n () => commands.joinForward(),\n () => commands.selectNodeForward(),\n ]);\n\n const baseKeymap = {\n Enter: handleEnter,\n 'Mod-Enter': () => this.editor.commands.exitCode(),\n Backspace: handleBackspace,\n 'Mod-Backspace': handleBackspace,\n 'Shift-Backspace': handleBackspace,\n Delete: handleDelete,\n 'Mod-Delete': handleDelete,\n 'Mod-a': () => this.editor.commands.selectAll(),\n Tab: () => this.editor.commands.insertTabNode(),\n };\n\n const pcBaseKeymap = {\n ...baseKeymap,\n };\n\n const macBaseKeymap = {\n ...baseKeymap,\n 'Ctrl-h': handleBackspace,\n 'Alt-Backspace': handleBackspace,\n 'Ctrl-d': handleDelete,\n 'Ctrl-Alt-Backspace': handleDelete,\n 'Alt-Delete': handleDelete,\n 'Alt-d': handleDelete,\n 'Ctrl-a': () => this.editor.commands.selectTextblockStart(),\n 'Ctrl-e': () => this.editor.commands.selectTextblockEnd(),\n 'Ctrl-t': () => this.editor.commands.insertTabChar(),\n };\n\n if (isMacOS() || isIOS()) {\n return macBaseKeymap;\n }\n\n return pcBaseKeymap;\n },\n});\n","import { Plugin, PluginKey } from 'prosemirror-state';\nimport { Extension } from '../Extension.js';\n\nexport const Editable = Extension.create({\n name: 'editable',\n\n addPmPlugins() {\n const editablePlugin = new Plugin({\n key: new PluginKey('editable'),\n props: {\n editable: () => {\n return this.editor.options.editable;\n },\n },\n });\n\n return [editablePlugin];\n },\n});\n","import { Plugin, PluginKey } from 'prosemirror-state';\nimport { Extension } from '../Extension.js';\n\n/**\n * For reference.\n * https://prosemirror.net/docs/ref/#history.history\n */\nexport const EditorFocus = Extension.create({\n name: 'editorFocus',\n\n addPmPlugins() {\n const editor = this.editor;\n\n const editorFocusPlugin = new Plugin({\n key: new PluginKey('editorFocus'),\n props: {\n handleDOMEvents: {\n focus: (view, event) => {\n editor.isFocused = true;\n \n const tr = editor.state.tr.setMeta('focus', { event }).setMeta('addToHistory', false);\n\n view.dispatch(tr);\n return false;\n },\n blur: (view, event) => {\n editor.isFocused = false;\n\n const tr = editor.state.tr.setMeta('blur', { event }).setMeta('addToHistory', false);\n\n view.dispatch(tr);\n return false;\n },\n },\n },\n });\n\n return [editorFocusPlugin];\n },\n});\n","/**\n * Creates the document to pass to EditorState.\n * @param converter SuperConverter instance.\n * @param schema Schema.\n * @param editor Editor\n * @returns Document.\n */\nexport function createDocument(converter, schema, editor) {\n const documentData = converter.getSchema(editor);\n\n if (documentData) {\n return schema.nodeFromJSON(documentData);\n }\n\n return schema.topNodeType.createAndFill();\n}\n","import { getSchemaTypeNameByName } from './getSchemaTypeNameByName.js';\nimport { isMarkActive } from './isMarkActive.js';\nimport { isNodeActive } from './isNodeActive.js';\n\n/**\n * Checks if the currently selected node or mark is active.\n * @param state The current editor state.\n * @param name The name of the node or mark (or null).\n * @param attrs The node or mark attrs.\n * @returns Boolean.\n */\nexport function isActive(state, name, attrs = {}) {\n if (!name) {\n return isNodeActive(state, null, attrs) || isMarkActive(state, null, attrs);\n }\n\n const schemaType = getSchemaTypeNameByName(name, state.schema);\n\n if (schemaType === 'node') {\n return isNodeActive(state, name, attrs);\n }\n if (schemaType === 'mark') {\n return isMarkActive(state, name, attrs);\n }\n\n return false;\n}\n","/**\n * Find tracked mark between positions by mark name and attrs.\n */\nexport const findTrackedMarkBetween = ({\n tr,\n from,\n to,\n markName,\n attrs = {},\n offset = 1, // To get non-inclusive marks.\n}) => {\n const { doc } = tr;\n\n const startPos = Math.max(from - offset, 0); // $from.start()\n const endPos = Math.min(to + offset, doc.content.size); // $from.end()\n\n let markFound;\n\n doc.nodesBetween(startPos, endPos, (node, pos) => {\n if (!node || node?.nodeSize === undefined) {\n return;\n }\n\n const mark = node.marks.find(\n (mark) => mark.type.name === markName && Object.keys(attrs).every((attr) => mark.attrs[attr] === attrs[attr]),\n );\n\n if (mark && !markFound) {\n markFound = {\n from: pos,\n to: pos + node.nodeSize,\n mark,\n };\n }\n });\n\n return markFound;\n};\n","import { Transaction } from 'prosemirror-state';\nimport { v4 as uuidv4 } from 'uuid';\nimport { TrackInsertMarkName, TrackDeleteMarkName } from '../constants.js';\nimport { findTrackedMarkBetween } from './findTrackedMarkBetween.js';\n\n/**\n * Mark insertion.\n * @param {Transaction} options.tr Transaction.\n * @param {number} options.from From position.\n * @param {number} options.to To position.\n * @param {object} options.user User object ({ name, email }).\n * @param {string} options.date Date.\n * @returns {Mark} Insertion mark.\n */\nexport const markInsertion = ({ tr, from, to, user, date }) => {\n tr.removeMark(from, to, tr.doc.type.schema.marks[TrackDeleteMarkName]);\n tr.removeMark(from, to, tr.doc.type.schema.marks[TrackInsertMarkName]);\n\n let trackedMark = findTrackedMarkBetween({\n tr,\n from,\n to,\n markName: TrackInsertMarkName,\n attrs: { authorEmail: user.email },\n });\n\n let id;\n if (trackedMark) {\n id = trackedMark.mark.attrs.id;\n } else {\n id = uuidv4();\n }\n\n const insertionMark = tr.doc.type.schema.marks[TrackInsertMarkName].create({\n id,\n author: user.name,\n authorEmail: user.email,\n date,\n });\n\n tr.addMark(from, to, insertionMark);\n\n // Add insertion mark also to block nodes (figures, text blocks) but not table cells/rows and lists.\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (pos < from || ['bulletList', 'orderedList'].includes(node.type.name)) {\n return true;\n } else if (node.isInline || ['tableRow', 'tableCell'].includes(node.type.name)) {\n return false;\n }\n\n if (node.attrs.track) {\n // Skip for now.\n }\n\n if (node.type.name === 'table') {\n // A table was inserted. We don't add track marks to elements inside of it.\n return false;\n }\n });\n\n return insertionMark;\n};\n","import { Mapping, ReplaceStep } from 'prosemirror-transform';\nimport { Slice } from 'prosemirror-model';\nimport { v4 as uuidv4 } from 'uuid';\nimport { TrackDeleteMarkName, TrackInsertMarkName } from '../constants.js';\nimport { findTrackedMarkBetween } from './findTrackedMarkBetween.js';\n\n/**\n * Mark deletion.\n * @param {Transaction} options.tr Transaction.\n * @param {number} options.from From position.\n * @param {number} options.to To position.\n * @param {object} options.user User object ({ name, email }).\n * @param {string} options.date Date.\n * @returns {Object} Deletion map and deletionMark\n */\nexport const markDeletion = ({ tr, from, to, user, date }) => {\n let trackedMark = findTrackedMarkBetween({\n tr,\n from,\n to,\n markName: TrackDeleteMarkName,\n attrs: { authorEmail: user.email },\n });\n\n let id;\n if (trackedMark) {\n id = trackedMark.mark.attrs.id;\n } else {\n id = uuidv4();\n }\n\n const deletionMark = tr.doc.type.schema.marks[TrackDeleteMarkName].create({\n id,\n author: user.name,\n authorEmail: user.email,\n date,\n });\n\n const deletionMap = new Mapping();\n\n // Add deletion mark to block nodes (figures, text blocks) and find already deleted inline nodes (and leave them alone).\n let nodes = [];\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.type.name.includes('table')) {\n return;\n }\n\n if (\n node.isInline &&\n node.marks.find((mark) => mark.type.name === TrackInsertMarkName && mark.attrs.authorEmail === user.email)\n ) {\n const removeStep = new ReplaceStep(\n deletionMap.map(Math.max(from, pos)),\n deletionMap.map(Math.min(to, pos + node.nodeSize)),\n Slice.empty,\n );\n if (!tr.maybeStep(removeStep).failed) {\n deletionMap.appendMap(removeStep.getMap());\n }\n } else if (node.isInline && !node.marks.find((mark) => mark.type.name === TrackDeleteMarkName)) {\n nodes.push(node); \n tr.addMark(\n deletionMap.map(Math.max(from, pos)),\n deletionMap.map(Math.min(to, pos + node.nodeSize)),\n deletionMark,\n );\n } else if (\n node.attrs.track &&\n !node.attrs.track.find((trackAttr) => trackAttr.type === TrackDeleteMarkName) &&\n !['bulletList', 'orderedList'].includes(node.type.name)\n ) {\n // Skip for now.\n }\n });\n\n return { deletionMark, deletionMap, nodes };\n};\n","import { generateDocxRandomId, generateRandom32BitHex } from './generateDocxRandomId';\n\nexport function generateDocxListAttributes(listType) {\n // Our default blank doc definition has the following list types:\n const listTypesMap = {\n bulletList: 1,\n orderedList: 2,\n };\n\n return {\n attributes: {\n parentAttributes: {\n 'w14:paraId': generateDocxRandomId(),\n 'w14:textId': generateDocxRandomId(),\n 'w:rsidR': generateDocxRandomId(),\n 'w:rsidRDefault': generateDocxRandomId(),\n 'w:rsidP': generateDocxRandomId(),\n paragraphProperties: {\n type: 'element',\n name: 'w:pPr',\n elements: [\n {\n type: 'element',\n name: 'w:pStyle',\n attributes: {\n 'w:val': 'ListParagraph',\n },\n },\n {\n type: 'element',\n name: 'w:numPr',\n elements: [\n {\n type: 'element',\n name: 'w:ilvl',\n attributes: {\n 'w:val': '0',\n },\n },\n {\n type: 'element',\n name: 'w:numId',\n attributes: {\n 'w:val': listTypesMap[listType] || 0,\n },\n },\n ],\n },\n ],\n },\n },\n },\n };\n}\n","import { getMarkRange } from './getMarkRange.js';\n\nexport function getMarksBetween(from, to, doc) {\n const marks = [];\n\n // get all inclusive marks on empty selection\n if (from === to) {\n doc\n .resolve(from)\n .marks()\n .forEach((mark) => {\n const $pos = doc.resolve(from - 1);\n const range = getMarkRange($pos, mark.type);\n\n if (!range) {\n return;\n }\n\n marks.push({\n mark,\n ...range,\n });\n });\n } else {\n doc.nodesBetween(from, to, (node, pos) => {\n if (!node || node?.nodeSize === undefined) {\n return;\n }\n\n marks.push(\n ...node.marks.map((mark) => ({\n from: pos,\n to: pos + node.nodeSize,\n mark,\n })),\n );\n });\n }\n\n return marks;\n}\n","/**\n * Find children inside PM node that match a predicate.\n * @param node PM node to search in.\n * @param predicate The predicate to match.\n * @returns An array of nodes with their positions.\n */\nexport function findChildren(node, predicate) {\n const nodesWithPos = [];\n\n node.descendants((child, pos) => {\n if (predicate(child)) {\n nodesWithPos.push({\n node: child,\n pos,\n });\n }\n });\n\n return nodesWithPos;\n}\n","export function minMax(value = 0, min = 0, max = 0) {\n return Math.min(Math.max(value, min), max);\n}\n","import { minMax } from '../utilities/minMax.js';\n\nexport function posToDOMRect(view, from, to) {\n const minPos = 0;\n const maxPos = view.state.doc.content.size;\n const resolvedFrom = minMax(from, minPos, maxPos);\n const resolvedEnd = minMax(to, minPos, maxPos);\n const start = view.coordsAtPos(resolvedFrom);\n const end = view.coordsAtPos(resolvedEnd, -1);\n const top = Math.min(start.top, end.top);\n const bottom = Math.max(start.bottom, end.bottom);\n const left = Math.min(start.left, end.left);\n const right = Math.max(start.right, end.right);\n const width = right - left;\n const height = bottom - top;\n const x = left;\n const y = top;\n const data = {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x,\n y,\n };\n\n return {\n ...data,\n toJSON: () => data,\n };\n}\n","export const isInTable = (state) => {\n const { $head } = state.selection;\n \n for (let d = $head.depth; d > 0; d -= 1) {\n if ($head.node(d).type?.spec?.tableRole === 'row') {\n return true;\n }\n }\n\n return false;\n};\n","// https://discuss.prosemirror.net/t/expanding-the-selection-to-the-active-mark/\nexport const findMarkPosition = (doc, pos, markName) => {\n const $pos = doc.resolve(pos);\n const parent = $pos.parent;\n const start = parent.childAfter($pos.parentOffset);\n\n if (!start.node) {\n return null;\n }\n\n const actualMark = start.node.marks.find((mark) => mark.type.name === markName);\n\n let startIndex = $pos.index();\n let startPos = $pos.start() + start.offset;\n\n while (startIndex > 0 && actualMark.isInSet(parent.child(startIndex - 1).marks)) {\n startPos -= parent.child(--startIndex).nodeSize;\n }\n\n let endIndex = $pos.index() + 1;\n let endPos = $pos.start() + start.offset + start.node.nodeSize;\n\n while (endIndex < parent.childCount && actualMark.isInSet(parent.child(endIndex).marks)) {\n endPos += parent.child(endIndex++).nodeSize;\n }\n\n return {\n from: startPos,\n to: endPos,\n attrs: actualMark.attrs,\n };\n};\n\nexport const flatten = (node, descend = true) => {\n if (!node) {\n throw new Error('Invalid \"node\" parameter');\n }\n const result = [];\n node.descendants((child, pos) => {\n result.push({ node: child, pos });\n if (!descend) {\n return false;\n }\n });\n return result;\n};\n\nexport const findChildren = (node, predicate, descend) => {\n if (!node) {\n throw new Error('Invalid \"node\" parameter');\n } else if (!predicate) {\n throw new Error('Invalid \"predicate\" parameter');\n }\n return flatten(node, descend).filter((child) => predicate(child.node));\n};\n\nexport const findInlineNodes = (node, descend) => {\n return findChildren(node, (child) => child.isInline, descend);\n};\n","import { EditorState } from 'prosemirror-state';\nimport { TrackInsertMarkName, TrackDeleteMarkName, TrackFormatMarkName } from '../constants.js';\nimport { findInlineNodes } from './documentHelpers.js';\n\n/**\n * Get track changes marks.\n * @param {EditorState} state\n * @param {string} id\n * @returns {Array} Array with track changes marks.\n */\nexport const getTrackChanges = (state, id = null) => {\n const trackedChanges = [];\n const allInlineNodes = findInlineNodes(state.doc);\n\n if (!allInlineNodes.length) {\n return trackedChanges;\n }\n\n allInlineNodes.forEach(({ node, pos }) => {\n const { marks } = node;\n const trackedMarks = [TrackInsertMarkName, TrackDeleteMarkName, TrackFormatMarkName];\n\n if (marks.length > 0) {\n marks.forEach((mark) => {\n if (trackedMarks.includes(mark.type.name)) {\n trackedChanges.push({\n mark,\n from: pos,\n to: pos + node.nodeSize,\n });\n }\n });\n }\n });\n\n if (id) {\n return trackedChanges.filter(({ mark }) => mark.attrs.id === id);\n }\n\n return trackedChanges;\n};\n","import { Plugin, PluginKey } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { TrackInsertMarkName, TrackDeleteMarkName, TrackFormatMarkName } from '../constants.js';\nimport { getTrackChanges } from '../trackChangesHelpers/getTrackChanges.js';\n\nexport const TrackChangesBasePluginKey = new PluginKey('TrackChangesBase');\n\nexport const TrackChangesBasePlugin = (options = {}) => {\n return new Plugin({\n key: TrackChangesBasePluginKey,\n\n state: {\n init(_, state) {\n const decorations = getTrackChangesDecorations(state, false, false);\n return {\n isTrackChangesActive: false,\n onlyOriginalShown: false,\n onlyModifiedShown: false,\n decorations,\n };\n },\n\n apply(tr, oldState, prevEditorState, newEditorState) {\n const meta = tr.getMeta(TrackChangesBasePluginKey);\n\n if (!meta) {\n return {\n ...oldState,\n decorations: getTrackChangesDecorations(\n newEditorState,\n oldState.onlyOriginalShown,\n oldState.onlyModifiedShown,\n ),\n };\n }\n\n if (meta.type === 'TRACK_CHANGES_ENABLE') {\n return {\n ...oldState,\n isTrackChangesActive: meta.value === true,\n decorations: getTrackChangesDecorations(\n newEditorState,\n oldState.onlyOriginalShown,\n oldState.onlyModifiedShown,\n ),\n };\n }\n\n if (meta.type === 'SHOW_ONLY_ORIGINAL') {\n return {\n ...oldState,\n onlyOriginalShown: meta.value === true,\n onlyModifiedShown: false,\n decorations: getTrackChangesDecorations(newEditorState, meta.value === true, false),\n };\n }\n\n if (meta.type === 'SHOW_ONLY_MODIFIED') {\n return {\n ...oldState,\n onlyOriginalShown: false,\n onlyModifiedShown: meta.value === true,\n decorations: getTrackChangesDecorations(newEditorState, false, meta.value === true),\n };\n }\n\n return {\n ...oldState,\n decorations: getTrackChangesDecorations(\n newEditorState,\n oldState.onlyOriginalShown,\n oldState.onlyModifiedShown,\n ),\n };\n },\n },\n\n props: {\n decorations(state) {\n return this.getState(state)?.decorations;\n },\n },\n });\n};\n\nconst getTrackChangesDecorations = (state, onlyOriginalShown, onlyModifiedShown) => {\n if (!state.doc || !state.doc.nodeSize || (onlyModifiedShown && onlyOriginalShown)) {\n return DecorationSet.empty;\n }\n\n const decorations = [];\n const trackedChanges = getTrackChanges(state);\n\n if (!trackedChanges.length) {\n return DecorationSet.empty;\n }\n\n trackedChanges.forEach(({ mark, from, to }) => {\n if (mark.type.name === TrackInsertMarkName) {\n if (onlyOriginalShown) {\n const decoration = Decoration.inline(from, to, {\n class: 'track-insert-dec hidden',\n });\n decorations.push(decoration);\n } else if (onlyModifiedShown) {\n const decoration = Decoration.inline(from, to, {\n class: 'track-insert-dec normal',\n });\n decorations.push(decoration);\n } else {\n const decoration = Decoration.inline(from, to, {\n class: 'track-insert-dec highlighted',\n });\n decorations.push(decoration);\n }\n }\n\n if (mark.type.name === TrackDeleteMarkName) {\n if (onlyOriginalShown) {\n const decoration = Decoration.inline(from, to, {\n class: 'track-delete-dec normal',\n });\n decorations.push(decoration);\n } else if (onlyModifiedShown) {\n const decoration = Decoration.inline(from, to, {\n class: 'track-delete-dec hidden',\n });\n decorations.push(decoration);\n } else {\n const decorationInline = Decoration.inline(from, to, {\n class: 'track-delete-dec highlighted', // 'hidden'\n });\n decorations.push(decorationInline);\n\n // Workaround for Chrome to handle text deletion correctly.\n // Maybe this won't be needed later.\n const decorationWidget = Decoration.widget(\n from,\n () => {\n const span = document.createElement('span');\n span.classList.add('track-delete-widget');\n span.contentEditable = false;\n return span;\n },\n { ignoreSelection: true },\n );\n decorations.push(decorationWidget);\n }\n }\n\n if (mark.type.name === TrackFormatMarkName) {\n if (onlyOriginalShown) {\n // For this we should render the before array as marks.\n // No solid idea for this yet.\n const decoration = Decoration.inline(from, to, {\n class: 'track-format-dec before',\n });\n decorations.push(decoration);\n } else if (onlyModifiedShown) {\n // For this we should render nothing.\n // We already have the applied marks on the text.\n const decoration = Decoration.inline(from, to, {\n class: 'track-format-dec normal',\n });\n decorations.push(decoration);\n } else {\n const decoration = Decoration.inline(from, to, {\n class: 'track-format-dec highlighted',\n });\n decorations.push(decoration);\n }\n }\n });\n\n return DecorationSet.create(state.doc, decorations);\n};\n","import { ReplaceStep, Mapping } from 'prosemirror-transform';\nimport { Transaction, EditorState } from 'prosemirror-state';\nimport { Node } from 'prosemirror-model';\nimport { markInsertion } from './markInsertion.js';\nimport { markDeletion } from './markDeletion.js';\nimport { findMark } from '@core/helpers/index.js';\nimport { TrackDeleteMarkName } from '../constants.js';\nimport { TrackChangesBasePluginKey } from '../plugins/index.js';\n\n/**\n * Replace step.\n * @param {EditorState} options.state Editor state.\n * @param {Transaction} options.tr Transaction.\n * @param {ReplaceStep} options.step Step.\n * @param {Transaction} options.newTr New transaction.\n * @param {Mapping} options.map Map.\n * @param {Node} options.doc Doc.\n * @param {object} options.user User object ({ name, email }).\n * @param {string} options.date Date.\n * @param {ReplaceStep} options.originalStep Original step.\n * @param {number} options.originalStepIndex Original step index.\n */\nexport const replaceStep = ({ state, tr, step, newTr, map, doc, user, date, originalStep, originalStepIndex }) => {\n const deletionMarkSchema = state.schema.marks[TrackDeleteMarkName];\n const deletionMark = findMark(state, deletionMarkSchema, false);\n const positionTo = deletionMark ? deletionMark.to : step.to;\n\n const newStep = new ReplaceStep(\n positionTo, // We insert all the same steps, but with \"from\"/\"to\" both set to \"to\" in order not to delete content. Mapped as needed.\n positionTo,\n step.slice,\n step.structure,\n );\n\n // We didn't apply the original step in its original place. We adjust the map accordingly.\n const invertStep = originalStep.invert(tr.docs[originalStepIndex]).map(map);\n map.appendMap(invertStep.getMap());\n\n const meta = {};\n if (newStep) {\n const trTemp = state.apply(newTr).tr;\n\n if (trTemp.maybeStep(newStep).failed) {\n return;\n }\n\n const mappedNewStepTo = newStep.getMap().map(newStep.to);\n\n const insertedMark = markInsertion({\n tr: trTemp,\n from: newStep.from,\n to: mappedNewStepTo,\n user,\n date,\n });\n\n // We condense it down to a single replace step.\n const condensedStep = new ReplaceStep(newStep.from, newStep.to, trTemp.doc.slice(newStep.from, mappedNewStepTo));\n\n newTr.step(condensedStep);\n const mirrorIndex = map.maps.length - 1;\n map.appendMap(condensedStep.getMap(), mirrorIndex);\n\n // Prepare meta for the transaction\n meta.insertedMark = insertedMark;\n meta.step = condensedStep;\n\n if (!newTr.selection.eq(trTemp.selection)) {\n newTr.setSelection(trTemp.selection);\n }\n }\n\n if (step.from !== step.to) {\n const { deletionMark, deletionMap, nodes: deletionNodes } = markDeletion({\n tr: newTr,\n from: step.from,\n to: step.to,\n user,\n date,\n });\n meta.deletionNodes = deletionNodes;\n meta.deletionMark = deletionMark;\n map.appendMapping(deletionMap);\n }\n\n // Add meta to the new transaction.\n newTr.setMeta(TrackChangesBasePluginKey, meta);\n};\n","/**\n * Mark wrapping.\n */\nexport const markWrapping = () => {\n // Skip for now.\n};\n","import { markInsertion } from './markInsertion.js';\nimport { markDeletion } from './markDeletion.js';\nimport { markWrapping } from './markWrapping.js';\n\nexport const replaceAroundStep = () => {\n // Skip for now.\n};\n","import { Transaction, EditorState } from 'prosemirror-state';\nimport { Mapping, AddMarkStep } from 'prosemirror-transform';\nimport { Node } from 'prosemirror-model';\nimport { TrackDeleteMarkName, TrackFormatMarkName } from '../constants.js';\nimport { v4 as uuidv4 } from 'uuid';\nimport { objectIncludes } from '@core/utilities/objectIncludes.js';\nimport { TrackChangesBasePluginKey } from '../plugins/index.js';\n\n/**\n * Add mark step.\n * @param {EditorState} options.state Editor state.\n * @param {Transaction} options.tr Transaction.\n * @param {AddMarkStep} options.step Step.\n * @param {Transaction} options.newTr New transaction.\n * @param {Mapping} options.map Map.\n * @param {Node} options.doc Doc.\n * @param {object} options.user User object ({ name, email }).\n * @param {string} options.date Date.\n */\nexport const addMarkStep = ({ state, tr, step, newTr, map, doc, user, date }) => {\n const meta = {};\n doc.nodesBetween(step.from, step.to, (node, pos) => {\n if (!node.isInline) {\n return;\n }\n\n if (node.marks.find((mark) => mark.type.name === TrackDeleteMarkName)) {\n return false;\n }\n\n const existingChangeMark = node.marks.find((mark) => [TrackDeleteMarkName, TrackFormatMarkName].includes(mark.type.name));\n const wid = existingChangeMark ? existingChangeMark.attrs.id : uuidv4();\n newTr.addMark(Math.max(step.from, pos), Math.min(step.to, pos + node.nodeSize), step.mark);\n\n const allowedMarks = ['bold', 'italic', 'strike', 'underline', 'textStyle'];\n\n // ![TrackDeleteMarkName].includes(step.mark.type.name)\n if (allowedMarks.includes(step.mark.type.name) && !node.marks.find((mark) => mark.type === step.mark.type)) {\n const formatChangeMark = node.marks.find((mark) => mark.type.name === TrackFormatMarkName);\n\n let after = [];\n let before = [];\n\n if (formatChangeMark) {\n let foundBefore = formatChangeMark.attrs.before.find((mark) => {\n if (mark.type === 'textStyle') {\n return mark.type === step.mark.type.name && objectIncludes(mark.attrs, step.mark.attrs);\n }\n return mark.type === step.mark.type.name;\n });\n\n if (foundBefore) {\n before = [...formatChangeMark.attrs.before.filter((mark) => mark.type !== step.mark.type.name)];\n after = [...formatChangeMark.attrs.after];\n } else {\n before = [...formatChangeMark.attrs.before];\n after = [\n ...formatChangeMark.attrs.after,\n {\n type: step.mark.type.name,\n attrs: { ...step.mark.attrs },\n },\n ];\n }\n } else {\n // before = [];\n before = node.marks.map((mark) => ({\n type: mark.type.name,\n attrs: { ...mark.attrs },\n }));\n\n after = [\n {\n type: step.mark.type.name,\n attrs: { ...step.mark.attrs },\n },\n ];\n }\n\n if (after.length || before.length) {\n const newFormatMark = state.schema.marks[TrackFormatMarkName].create({\n id: wid,\n author: user.name,\n authorEmail: user.email,\n date,\n before,\n after,\n });\n newTr.addMark(\n step.from, // Math.max(step.from, pos)\n step.to, // Math.min(step.to, pos + node.nodeSize),\n newFormatMark,\n );\n meta.formatMark = newFormatMark;\n meta.step = step;\n newTr.setMeta(TrackChangesBasePluginKey, meta);\n } else if (formatChangeMark) {\n newTr.removeMark(Math.max(step.from, pos), Math.min(step.to, pos + node.nodeSize), formatChangeMark);\n }\n }\n });\n};\n","import { Transaction, EditorState } from 'prosemirror-state';\nimport { Mapping, RemoveMarkStep } from 'prosemirror-transform';\nimport { Node } from 'prosemirror-model';\nimport { v4 as uuidv4 } from 'uuid';\nimport { TrackDeleteMarkName, TrackFormatMarkName } from '../constants.js';\n\n/**\n * Remove mark step.\n * @param {EditorState} options.state Editor state.\n * @param {Transaction} options.tr Transaction.\n * @param {RemoveMarkStep} options.step Step.\n * @param {Transaction} options.newTr New transaction.\n * @param {Mapping} options.map Map.\n * @param {Node} options.doc Doc.\n * @param {object} options.user User object ({ name, email }).\n * @param {string} options.date Date.\n */\nexport const removeMarkStep = ({ state, tr, step, newTr, map, doc, user, date }) => {\n doc.nodesBetween(step.from, step.to, (node, pos) => {\n if (!node.isInline) {\n return true;\n }\n\n if (node.marks.find((mark) => mark.type.name === TrackDeleteMarkName)) {\n return false;\n }\n\n newTr.removeMark(Math.max(step.from, pos), Math.min(step.to, pos + node.nodeSize), step.mark);\n\n const allowedMarks = ['bold', 'italic', 'strike', 'underline', 'textStyle'];\n\n if (allowedMarks.includes(step.mark.type.name) && node.marks.find((mark) => mark.type === step.mark.type)) {\n const formatChangeMark = node.marks.find((mark) => mark.type.name === TrackFormatMarkName);\n\n let after = [];\n let before = [];\n\n if (formatChangeMark) {\n let foundAfter = formatChangeMark.attrs.after.find((mark) => mark.type === step.mark.type.name);\n\n if (foundAfter) {\n after = [...formatChangeMark.attrs.after.filter((mark) => mark.type !== step.mark.type.name)];\n before = [...formatChangeMark.attrs.before];\n } else {\n after = [...formatChangeMark.attrs.after];\n before = [\n ...formatChangeMark.attrs.before,\n {\n type: step.mark.type.name,\n attrs: { ...step.mark.attrs },\n },\n ];\n }\n } else {\n after = [];\n before = [\n {\n type: step.mark.type.name,\n attrs: { ...step.mark.attrs },\n },\n ];\n }\n\n if (after.length || before.length) {\n newTr.addMark(\n Math.max(step.from, pos),\n Math.min(step.to, pos + node.nodeSize),\n state.schema.marks[TrackFormatMarkName].create({\n id: uuidv4(),\n author: user.name,\n authorEmail: user.email,\n date,\n before,\n after,\n }),\n );\n } else if (formatChangeMark) {\n newTr.removeMark(Math.max(step.from, pos), Math.min(step.to, pos + node.nodeSize), formatChangeMark);\n }\n }\n });\n};\n","export const CommentMarkName = 'commentMark';\n","import { CommentMarkName } from './comments-constants.js';\nimport { COMMENTS_XML_DEFINITIONS } from '@converter/exporter-docx-defs.js';\nimport { CommentsPluginKey } from './comments-plugin.js';\n\n/**\n * Remove comment by id\n * \n * @param {Object} param0 \n * @param {string} param0.commentId The comment ID\n * @param {import('prosemirror-state').EditorState} state The current editor state\n * @param {import('prosemirror-state').Transaction} tr The current transaction\n * @param {Function} param0.dispatch The dispatch function\n * @returns {void}\n */\nexport const removeCommentsById = ({ commentId, state, tr, dispatch }) => {\n const positions = getCommentPositionsById(commentId, state.doc);\n \n // Remove the mark\n positions.forEach(({ from, to }) => {\n tr.removeMark(from, to, state.schema.marks[CommentMarkName]);\n });\n dispatch(tr);\n};\n\n\n/**\n * Get the positions of a comment by ID\n * \n * @param {String} commentId The comment ID\n * @param {import('prosemirror-model').Node} doc The prosemirror document\n * @returns {Array} The positions of the comment\n */\nexport const getCommentPositionsById = (commentId, doc) => {\n const positions = [];\n doc.descendants((node, pos) => {\n const { marks } = node;\n const commentMark = marks.find((mark) => mark.type.name === CommentMarkName);\n \n if (commentMark) {\n const { attrs } = commentMark;\n const { commentId: currentCommentId, } = attrs;\n if (commentId === currentCommentId) {\n positions.push({ from: pos, to: pos + node.nodeSize });\n }\n }\n });\n return positions;\n};\n\n/**\n * Prepare comments for export by converting the marks back to commentRange nodes\n * \n * @param {import('prosemirror-model').Node} doc The prosemirror document\n * @param {import('prosemirror-state').Transaction} tr The preparation transaction\n * @param {import('prosemirror-model').Schema} schema The editor schema\n * @param {Array[Object]} comments The comments to prepare\n * @returns {void}\n */\nexport const prepareCommentsForExport = (doc, tr, schema, comments = []) => {\n // Collect all pending insertions in an array\n const startNodes = [];\n const endNodes = [];\n const seen = new Set();\n\n doc.descendants((node, pos) => {\n const commentMarks = node.marks?.filter(mark => mark.type.name === CommentMarkName);\n commentMarks.forEach((commentMark) => {\n if (commentMark) {\n\n const { attrs = {} } = commentMark;\n const { commentId } = attrs;\n\n if (commentId === 'pending') return;\n if (seen.has(commentId)) return;\n seen.add(commentId);\n\n const commentStartNodeAttrs = getPreparedComment(commentMark.attrs);\n const startNode = schema.nodes.commentRangeStart.create(commentStartNodeAttrs);\n startNodes.push({\n pos,\n node: startNode,\n });\n\n const endNode = schema.nodes.commentRangeEnd.create(commentStartNodeAttrs);\n endNodes.push({\n pos: pos + node.nodeSize,\n node: endNode,\n });\n\n const parentId = commentId;\n if (parentId) {\n const childComments = comments\n .filter((c) => c.parentCommentId === parentId)\n .sort((a, b) => a.createdTime - b.createdTime);\n\n childComments.forEach((c) => {\n const childMark = getPreparedComment(c);\n const childStartNode = schema.nodes.commentRangeStart.create(childMark);\n seen.add(c.commentId);\n startNodes.push({\n pos: pos,\n node: childStartNode,\n });\n\n const childEndNode = schema.nodes.commentRangeEnd.create(childMark);\n endNodes.push({\n pos: pos + node.nodeSize,\n node: childEndNode,\n });\n });\n }\n }\n });\n });\n\n startNodes.forEach((n) => {\n const { pos, node } = n;\n const mappedPos = tr.mapping.map(pos);\n\n tr.insert(mappedPos, node);\n });\n\n endNodes.forEach((n) => {\n const { pos, node } = n;\n const mappedPos = tr.mapping.map(pos);\n\n tr.insert(mappedPos, node);\n });\n\n return tr;\n};\n\n\n/**\n * Generate the prepared comment attrs for export\n * \n * @param {Object} attrs The comment mark attributes\n * @returns {Object} The prepared comment attributes\n */\nexport const getPreparedComment = (attrs) => {\n const { commentId, internal } = attrs;\n return {\n 'w:id': commentId,\n internal: internal,\n };\n}\n\n\n/**\n * Prepare comments for import by removing the commentRange nodes and replacing with marks\n * \n * @param {import('prosemirror-model').Node} doc The prosemirror document\n * @param {import('prosemirror-state').Transaction} tr The preparation transaction\n * @param {import('prosemirror-model').Schema} schema The editor schema\n * @returns {void}\n */\nexport const prepareCommentsForImport = (doc, tr, schema, converter) => {\n const toMark = [];\n const toDelete = [];\n\n doc.descendants((node, pos) => {\n const { type } = node;\n \n const commentNodes = ['commentRangeStart', 'commentRangeEnd', 'commentReference'];\n if (!commentNodes.includes(type.name)) return;\n\n const matchingImportedComment = converter.comments?.find((c) => c.importedId == node.attrs['w:id']) || {};\n const { commentId } = matchingImportedComment;\n if (!commentId) return;\n\n // If the node is a commentRangeStart, record it so we can place a mark once we find the end.\n if (type.name === 'commentRangeStart') {\n toMark.push({\n 'w:id': commentId,\n importedId: node.attrs['w:id'],\n internal: false,\n start: pos,\n });\n\n // We'll remove this node from the final doc\n toDelete.push({ start: pos, end: pos + 1 });\n }\n\n // When we reach the commentRangeEnd, add a mark spanning from start to current pos,\n // then mark it for deletion as well.\n else if (type.name === 'commentRangeEnd') {\n const itemToMark = toMark.find((p) => p.importedId === node.attrs['w:id']);\n if (!itemToMark) return; // No matching start? just skip\n\n const { start } = itemToMark;\n const markAttrs = {\n commentId,\n importedId: node.attrs['w:id'],\n internal: itemToMark.internal,\n };\n\n tr.addMark(start, pos + 1, schema.marks[CommentMarkName].create(markAttrs));\n toDelete.push({ start: pos, end: pos + 1 });\n }\n\n // commentReference nodes likewise get deleted\n else if (type.name === 'commentReference') {\n toDelete.push({ start: pos, end: pos + 1 });\n }\n });\n\n // Sort descending so deletions don't mess up positions\n toDelete\n .sort((a, b) => b.start - a.start)\n .forEach(({ start, end }) => {\n tr.delete(start, end);\n });\n};\n\n/**\n * Translate a list of before/after marks into a human-readable format we can\n * display in tracked change comments. This tells us what formatting changes\n * a suggester made\n * \n * @param {Object} attrs The tracked change node attributes. Contains before/after lists\n * @returns {String} The human-readable format of the changes\n */\nexport const translateFormatChangesToEnglish = (attrs = {}) => {\n const { before = [], after = [] } = attrs;\n\n const beforeTypes = new Set(before.map(mark => mark.type));\n const afterTypes = new Set(after.map(mark => mark.type));\n\n const added = [...afterTypes].filter(type => !beforeTypes.has(type));\n const removed = [...beforeTypes].filter(type => !afterTypes.has(type));\n\n const messages = [];\n\n // Detect added formatting (excluding textStyle, handled separately)\n const nonTextStyleAdded = added.filter(type => ![\"textStyle\", \"commentMark\"].includes(type));\n if (nonTextStyleAdded.length) {\n messages.push(`Added formatting: ${nonTextStyleAdded.join(', ')}`);\n }\n\n // Detect removed formatting (excluding textStyle, handled separately)\n const nonTextStyleRemoved = removed.filter(type => ![\"textStyle\", \"commentMark\"].includes(type));\n if (nonTextStyleRemoved.length) {\n messages.push(`Removed formatting: ${nonTextStyleRemoved.join(', ')}`);\n }\n\n // Handling textStyle changes separately\n const beforeTextStyle = before.find(mark => mark.type === \"textStyle\")?.attrs || {};\n const afterTextStyle = after.find(mark => mark.type === \"textStyle\")?.attrs || {};\n\n const textStyleChanges = [];\n\n // Function to convert camelCase to human-readable format\n const formatAttrName = (attr) => attr.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();\n\n Object.keys({ ...beforeTextStyle, ...afterTextStyle }).forEach(attr => {\n const beforeValue = beforeTextStyle[attr];\n const afterValue = afterTextStyle[attr];\n\n if (beforeValue !== afterValue) {\n if (afterValue === null) {\n // Ignore attributes that are now null\n return;\n } else if (attr === \"color\") {\n // Special case: Simplify color change message\n textStyleChanges.push(`Changed color`);\n } else {\n const label = formatAttrName(attr); // Convert camelCase to lowercase words\n if (beforeValue === undefined || beforeValue === null) {\n textStyleChanges.push(`Set ${label} to ${afterValue}`);\n } else {\n textStyleChanges.push(`Changed ${label} from ${beforeValue} to ${afterValue}`);\n }\n }\n }\n });\n\n if (textStyleChanges.length) {\n messages.push(`Modified text style: ${textStyleChanges.join(', ')}`);\n }\n\n return messages.length ? messages.join('. ') : 'No formatting changes.';\n};\n\n/**\n * Get the highlight color for a comment or tracked changes node\n * \n * @param {Object} param0 \n * @param {String} param0.activeThreadId The active comment ID\n * @param {String} param0.threadId The current thread ID\n * @param {Boolean} param0.isInternal Whether the comment is internal or external\n * @param {EditorView} param0.editor The current editor view\n * @returns {String} The color to use for the highlight\n */\nexport const getHighlightColor = ({ activeThreadId, threadId, isInternal, editor }) => {\n if (!editor.options.isInternal && isInternal) return 'transparent';\n const pluginState = CommentsPluginKey.getState(editor.state);\n const color = isInternal ? pluginState.internalColor : pluginState.externalColor;\n const alpha = activeThreadId == threadId ? '44' : '22';\n return `${color}${alpha}`;\n}\n","import { PluginKey } from 'prosemirror-state';\nimport { Editor as SuperEditor } from '@core/Editor.js';\nimport { getStarterExtensions } from '@extensions/index.js';\n\nexport const PaginationPluginKey = new PluginKey('paginationPlugin');\n\n/**\n * Initialize the pagination data for the editor\n * This will fetch the header and footer data from the converter and calculate their height\n * @param {SuperEditor} editor The editor instance\n * @returns {Object} The data for the headers and footers\n */\nexport const initPaginationData = async (editor) => {\n if (!editor.converter) return;\n\n const sectionData = { headers: {}, footers: {} };\n const headerIds = editor.converter.headerIds;\n const footerIds = editor.converter.footerIds;\n\n for (let key in headerIds) {\n const sectionId = headerIds[key];\n if (!sectionId) continue;\n\n const dataForThisSection = editor.converter.headers[sectionId];\n if (!sectionData.headers[sectionId]) sectionData.headers[sectionId] = {};\n sectionData.headers[sectionId].data = dataForThisSection;\n // Wait for the height to be resolved\n const { height, sectionEditor, sectionContainer } = await getSectionHeight(editor, dataForThisSection);\n sectionData.headers[sectionId].height = height;\n sectionData.headers[sectionId].sectionEditor = sectionEditor;\n sectionData.headers[sectionId].sectionContainer = sectionContainer;\n }\n\n for (let key in footerIds) {\n const sectionId = footerIds[key];\n if (!sectionId) continue;\n\n const dataForThisSection = editor.converter.footers[sectionId];\n if (!sectionData.headers[sectionId]) sectionData.footers[sectionId] = {};\n sectionData.footers[sectionId].data = dataForThisSection;\n // Wait for the height to be resolved\n const { height, sectionEditor, sectionContainer } = await getSectionHeight(editor, dataForThisSection);\n sectionData.footers[sectionId].height = height;\n sectionData.footers[sectionId].sectionEditor = sectionEditor;\n sectionData.footers[sectionId].sectionContainer = sectionContainer;\n }\n\n return sectionData;\n};\n\n/**\n * Get the height of a section\n * @param {SuperEditor} editor The editor instance\n * @param {Object} data The data for the section\n * @returns {Promise<Object>} An object containing the height of the section, the section editor and the section container\n */\nconst getSectionHeight = async (editor, data) => {\n return new Promise((resolve) => {\n const editorContainer = document.createElement('div');\n editorContainer.className = 'super-editor';\n editorContainer.style.padding = 0;\n editorContainer.style.margin = 0;\n\n const parentStyles = editor.converter.getDocumentDefaultStyles();\n const { fontSizePt, typeface } = parentStyles;\n const fontSizeInPixles = fontSizePt * 1.3333;\n const lineHeight = fontSizeInPixles * 1.15;\n\n Object.assign(editorContainer.style, {\n padding: \"0\",\n margin: \"0\",\n border: \"none\",\n boxSizing: \"border-box\",\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n width: \"auto\",\n maxWidth: \"none\",\n fontFamily: typeface,\n fontSize: `${fontSizeInPixles}px`,\n lineHeight: `${lineHeight}px`,\n });\n\n document.body.appendChild(editorContainer);\n const sectionEditor = new SuperEditor({\n loadFromSchema: true,\n mode: 'text',\n editable: false,\n element: editorContainer,\n content: data,\n extensions: getStarterExtensions(),\n documentId: 'sectionId',\n });\n\n sectionEditor.on('create', () => {\n requestAnimationFrame(() => {\n const height = editorContainer.offsetHeight;\n document.body.removeChild(editorContainer);\n\n Object.assign(editorContainer.style, {\n padding: \"0\",\n margin: \"0\",\n border: \"none\",\n boxSizing: \"border-box\",\n position: \"relative\",\n top: \"initial\",\n left: \"initial\",\n width: \"initial\",\n maxWidth: \"initial\",\n fontFamily: \"initial\",\n fontSize: \"initial\",\n lineHeight: \"initial\",\n });\n resolve({ height, sectionEditor, sectionContainer: editorContainer });\n })\n });\n });\n};","import { Plugin, PluginKey } from 'prosemirror-state'\nimport { Extension } from '@core/Extension.js'\nimport { Decoration, DecorationSet } from 'prosemirror-view'\nimport { removeCommentsById, getHighlightColor } from './comments-helpers.js'\nimport { CommentMarkName } from './comments-constants.js'\nimport { PaginationPluginKey } from '../pagination/pagination-helpers.js';\n\n\n// Example tracked-change keys, if needed\nimport {\n TrackInsertMarkName,\n TrackDeleteMarkName,\n TrackFormatMarkName,\n} from '../track-changes/constants.js'\nimport { TrackChangesBasePluginKey } from '../track-changes/plugins/index.js'\nimport { comments_module_events } from '@harbour-enterprises/common'\nimport { translateFormatChangesToEnglish } from './comments-helpers.js'\n\nconst TRACK_CHANGE_MARKS = [TrackInsertMarkName, TrackDeleteMarkName, TrackFormatMarkName];\n\nexport const CommentsPluginKey = new PluginKey('comments')\n\nexport const CommentsPlugin = Extension.create({\n name: 'comments',\n\n addCommands() {\n return {\n insertComment:\n (conversation) =>\n ({ tr, dispatch, state }) => {\n const { selection } = tr\n const { $from, $to } = selection\n const { commentId, isInternal } = conversation\n\n tr.setMeta(CommentsPluginKey, { event: 'add' })\n tr.addMark(\n $from.pos,\n $to.pos,\n this.editor.schema.marks[CommentMarkName].create({\n commentId,\n internal: isInternal,\n })\n )\n\n dispatch(tr)\n return true;\n },\n\n removeComment:\n ({ commentId, importedId }) =>\n ({ tr, dispatch, state }) => {\n tr.setMeta(CommentsPluginKey, { event: 'deleted' });\n removeCommentsById({ commentId, importedId, state, tr, dispatch });\n },\n\n setActiveComment:\n ({ commentId }) =>\n ({ tr, dispatch }) => {\n let activeThreadId = commentId;\n tr.setMeta(CommentsPluginKey, { type: 'setActiveComment', activeThreadId });\n return true;\n },\n\n setCommentInternal:\n ({ commentId, isInternal }) =>\n ({ tr, dispatch, state }) => {\n const { doc } = state;\n let foundStartNode;\n let foundPos;\n\n // Find the commentRangeStart node that matches the comment ID\n tr.setMeta(CommentsPluginKey, { event: 'update' })\n doc.descendants((node, pos) => {\n if (foundStartNode) return;\n\n const { marks = [] } = node;\n const commentMark = marks.find((mark) => mark.type.name === CommentMarkName);\n\n if (commentMark) {\n const { attrs } = commentMark;\n const wid = attrs.commentId;\n if (wid === commentId) {\n foundStartNode = node;\n foundPos = pos;\n }\n }\n })\n\n // If no matching node, return false\n if (!foundStartNode) return false\n\n // Update the mark itself\n tr.addMark(\n foundPos,\n foundPos + foundStartNode.nodeSize,\n this.editor.schema.marks[CommentMarkName].create({\n commentId,\n internal: isInternal,\n })\n )\n\n tr.setMeta(CommentsPluginKey, { type: 'setCommentInternal' })\n dispatch(tr)\n return true\n },\n\n resolveComment:\n ({ commentId }) =>\n ({ tr, dispatch, state }) => {\n tr.setMeta(CommentsPluginKey, { event: 'update' })\n removeCommentsById({ commentId, state, tr, dispatch })\n },\n }\n },\n\n addPmPlugins() {\n const editor = this.editor\n let shouldUpdate;\n let activeThreadId;\n\n const commentsPlugin = new Plugin({\n key: CommentsPluginKey,\n\n state: {\n init() {\n return {\n activeThreadId: null,\n externalColor: '#B1124B',\n internalColor: '#078383',\n decorations: DecorationSet.empty,\n allCommentPositions: {},\n allCommentIds: [],\n changedActiveThread: false,\n trackedChanges: {},\n }\n },\n\n apply(tr, pluginState, _, newEditorState) {\n\n const paginationMeta = tr.getMeta(PaginationPluginKey);\n const isPaginationInit = paginationMeta?.isReadyToInit;\n if (isPaginationInit) shouldUpdate = true;\n\n const meta = tr.getMeta(CommentsPluginKey);\n const { type } = meta || {};\n\n if (type === 'force') shouldUpdate = true;\n\n if (!isPaginationInit && !shouldUpdate && meta && meta.decorations) {\n return {\n ...pluginState,\n decorations: meta.decorations,\n allCommentPositions: meta.allCommentPositions,\n }\n };\n\n // If this is a tracked change transaction, handle separately\n const trackedChangeMeta = tr.getMeta(TrackChangesBasePluginKey);\n const currentTrackedChanges = pluginState.trackedChanges;\n if (trackedChangeMeta) {\n pluginState.trackedChanges = handleTrackedChangeTransaction(\n trackedChangeMeta,\n currentTrackedChanges,\n newEditorState,\n editor,\n );\n }; \n\n // Check for changes in the actively selected comment\n const trChangedActiveComment = meta?.type === 'setActiveComment';\n if ((!tr.docChanged && tr.selectionSet) || trChangedActiveComment) {\n const { selection } = tr;\n let currentActiveThread = getActiveCommentId(newEditorState.doc, selection);\n if (trChangedActiveComment) currentActiveThread = meta.activeThreadId;\n\n const previousSelectionId = activeThreadId;\n if (previousSelectionId !== currentActiveThread) {\n activeThreadId = currentActiveThread;\n const update = {\n type: comments_module_events.SELECTED,\n activeCommentId: activeThreadId ? activeThreadId : null\n };\n\n shouldUpdate = true;\n editor.emit('commentsUpdate', update);\n\n const { tr: newTr } = editor.view.state;\n const { dispatch } = editor.view;\n newTr.setMeta(CommentsPluginKey, { type: 'force' });\n dispatch(newTr);\n };\n };\n\n return pluginState\n },\n },\n\n props: {\n decorations(state) {\n return this.getState(state).decorations\n },\n },\n\n view(editorView) {\n let prevDoc;\n let prevDecorations;\n\n return {\n update(view, prevState) {\n const { state } = view\n const { doc, tr } = state\n\n if (prevDoc && prevDoc.eq(doc) && !shouldUpdate) return;\n prevDoc = doc;\n shouldUpdate = false;\n\n const decorations = []\n const allCommentPositions = {}\n doc.descendants((node, pos) => {\n const { marks = [] } = node\n const commentMarks = marks.filter(\n (mark) => mark.type.name === CommentMarkName\n )\n\n commentMarks.forEach((commentMark) => {\n const { attrs } = commentMark\n const threadId = attrs.commentId || attrs.importedId\n\n const currentBounds = view.coordsAtPos(pos)\n\n updatePosition({\n allCommentPositions,\n threadId,\n pos,\n currentBounds,\n node,\n });\n\n const isInternal = attrs.internal;\n\n const color = getHighlightColor({ activeThreadId, threadId, isInternal, editor });\n const deco = Decoration.inline(pos, pos + node.nodeSize, {\n style: `background-color: ${color}`,\n class: 'comment-highlight',\n 'data-thread-id': threadId,\n })\n decorations.push(deco)\n });\n\n const trackedChangeNode = getTrackedChangeNode(node);\n if (trackedChangeNode) {\n const currentBounds = view.coordsAtPos(pos);\n const { id } = trackedChangeNode.attrs;\n updatePosition({\n allCommentPositions,\n threadId: id,\n pos,\n currentBounds,\n node,\n });\n };\n });\n\n const decorationSet = DecorationSet.create(doc, decorations)\n\n // Compare new decorations with the old state to avoid infinite loop\n const pluginState = CommentsPluginKey.getState(state)\n const oldDecorations = pluginState.decorations\n\n // We only dispatch if something actually changed\n const same = oldDecorations.eq(decorationSet)\n if (!same) {\n const tr = state.tr.setMeta(CommentsPluginKey, {\n decorations: decorationSet,\n allCommentPositions,\n })\n // Dispatch the transaction to update pluginState\n view.dispatch(tr)\n }\n\n editor.emit('comment-positions', { allCommentPositions });\n\n // Remember the new decorations for next time\n prevDecorations = decorationSet\n\n },\n }\n },\n })\n\n return [commentsPlugin]\n },\n});\n\nconst updatePosition = ({\n allCommentPositions,\n threadId,\n pos,\n currentBounds,\n node,\n}) => {\n if (!allCommentPositions[threadId]) {\n allCommentPositions[threadId] = {\n threadId,\n start: pos,\n end: pos + node.nodeSize,\n bounds: { ...currentBounds },\n }\n } else {\n // Adjust the positional indices\n const existing = allCommentPositions[threadId]\n existing.start = Math.min(existing.start, pos)\n existing.end = Math.max(existing.end, pos + node.nodeSize)\n existing.bounds.top = Math.min(existing.bounds.top, currentBounds.top)\n existing.bounds.bottom = Math.max(existing.bounds.bottom, currentBounds.bottom)\n }\n};\n\n/**\n * This is run when a new selection is set (tr.selectionSet) to return the active comment ID, if any\n * If there are multiple, only return the first one\n *\n * @param {Object} doc The current document\n * @param {Selection} selection The current selection\n * @returns {String | null} The active comment ID, if any\n */\nconst getActiveCommentId = (doc, selection) => {\n if (!selection) return;\n const { $from, $to } = selection;\n\n // We only need to check for active comment ID if the selection is empty\n if ($from.pos !== $to.pos) return;\n\n const nodeAtPos = doc.nodeAt($from.pos);\n if (!nodeAtPos) return;\n\n // If we have a tracked change, we can return it right away\n const trackedChangeNode = getTrackedChangeNode(nodeAtPos);\n if (trackedChangeNode) {\n return trackedChangeNode.attrs.wid;\n }\n\n // Otherwise, we need to check for comment nodes\n const overlaps = [];\n let found = false;\n \n // Look for commentRangeStart nodes before the current position\n // There could be overlapping comments so we need to track all of them\n doc.descendants((node, pos) => {\n if (found) return;\n\n // node goes from `pos` to `end = pos + node.nodeSize`\n const end = pos + node.nodeSize;\n\n // If $from.pos is outside this node’s range, skip it\n if ($from.pos < pos || $from.pos >= end) {\n return;\n }\n\n // Now we know $from.pos is within this node’s start/end\n const { marks = [] } = node;\n const commentMark = marks.find((mark) => mark.type.name === CommentMarkName);\n if (commentMark) {\n overlaps.push({\n node,\n pos,\n size: node.nodeSize,\n });\n }\n\n // If we've passed the position, we can stop\n if (pos > $from.pos) {\n found = true;\n }\n });\n\n // Get the closest commentRangeStart node to the current position\n let closest = null;\n let closestCommentRangeStart = null;\n overlaps.forEach(({ pos, node }) => {\n if (!closest) closest = $from.pos - pos;\n\n const diff = $from.pos - pos;\n if (diff >= 0 && diff <= closest) {\n closestCommentRangeStart = node;\n closest = diff;\n }\n });\n\n const { marks: closestMarks = [] } = closestCommentRangeStart || {};\n const closestCommentMark = closestMarks.find((mark) => mark.type.name === CommentMarkName);\n return closestCommentMark?.attrs?.commentId || closestCommentMark?.attrs?.importedId;\n};\n\n\n/**\n * Check if this node is a tracked changes node\n * @param {Node} node The node to check\n * @returns {Node | null} Either a tracked change node (insert, delete) or null\n */\nconst getTrackedChangeNode = (node) => {\n if (!node) return;\n const nodeMarks = node.marks;\n const trackedChangeMark = nodeMarks?.find((mark) => mark.type.name === TrackInsertMarkName);\n const trackedDeleteMark = nodeMarks?.find((mark) => mark.type.name === TrackDeleteMarkName);\n const trackedFormatMark = nodeMarks?.find((mark) => mark.type.name === TrackFormatMarkName);\n return trackedChangeMark || trackedDeleteMark || trackedFormatMark;\n};\n\nconst handleTrackedChangeTransaction = (trackedChangeMeta, trackedChanges, newEditorState, editor) => {\n const { deletionMark, insertedMark, formatMark, deletionNodes } = trackedChangeMeta;\n if (!deletionMark && !insertedMark && !formatMark) return;\n\n const newTrackedChanges = { ...trackedChanges };\n let id = insertedMark?.attrs?.id || deletionMark?.attrs?.id || formatMark?.attrs?.id;\n if (!id) return trackedChanges;\n\n // Maintain a map of tracked changes with their inserted/deleted ids\n let isNewChange = false;\n if (!newTrackedChanges[id]) {\n newTrackedChanges[id] = {};\n isNewChange = true;\n };\n\n if (insertedMark) newTrackedChanges[id].insertion = id;\n if (deletionMark) newTrackedChanges[id].deletion = deletionMark.attrs?.id;\n if (formatMark) newTrackedChanges[id].format = formatMark.attrs?.id;\n\n const { step } = trackedChangeMeta;\n let nodes = step?.slice?.content?.content || [];\n\n // Track format has no nodes, we need to find the node\n if (!nodes.length) {\n newEditorState.doc.descendants((node, pos) => {\n const hasFormatMark = node.marks.find((mark) => mark.type.name === TrackFormatMarkName);\n if (hasFormatMark) {\n nodes = [node];\n return false;\n };\n });\n }\n const emitParams = createOrUpdateTrackedChangeComment({\n documentId: editor.options.documentId,\n event: isNewChange ? 'add' : 'update',\n marks: {\n insertedMark,\n deletionMark,\n formatMark,\n },\n deletionNodes,\n nodes: nodes,\n newEditorState,\n });\n\n if (emitParams) editor.emit('commentsUpdate', emitParams);\n\n return newTrackedChanges;\n};\n\nconst getTrackedChangeText = ({ node, mark, trackedChangeType, isDeletionInsertion, deletionNodes = [] }) => {\n const deletionText = deletionNodes.length ? deletionNodes[0].text : null; \n\n let trackedChangeText = isDeletionInsertion ? nextNode.text : node.text;\n\n // If this is a format change, let's get the string of what changes were made\n const isFormatChange = trackedChangeType === TrackFormatMarkName;\n if (isFormatChange) trackedChangeText = translateFormatChangesToEnglish(mark.attrs)\n\n return {\n deletionText,\n trackedChangeText,\n }\n};\n\nconst createOrUpdateTrackedChangeComment = ({ event, marks, deletionNodes, nodes, newEditorState, documentId }) => {\n const trackedMark = marks.insertedMark || marks.deletionMark || marks.formatMark;\n const { type, attrs } = trackedMark;\n \n const { name: trackedChangeType } = type;\n const { author, authorEmail, date } = attrs;\n\n let id = attrs.id;\n\n if (!nodes.length) return;\n\n const node = nodes[0];\n const isDeletionInsertion = (\n trackedChangeType === TrackDeleteMarkName && nextTrackedNode?.type?.name === TrackInsertMarkName\n );\n\n let existingNode;\n newEditorState.doc.descendants((node, pos) => {\n const { marks = [] } = node;\n const changeMarks = marks.filter((mark) => TRACK_CHANGE_MARKS.includes(mark.type.name));\n if (!changeMarks.length) return;\n\n const hasMatchingId = changeMarks.find((mark) => mark.attrs.id === id);\n if (hasMatchingId) existingNode = node;\n if (!existingNode) return false;\n });\n\n const { deletionText, trackedChangeText } = getTrackedChangeText({\n node: existingNode || node,\n mark: trackedMark,\n trackedChangeType,\n isDeletionInsertion,\n deletionNodes\n });\n\n if (!deletionText && !trackedChangeText) return;\n\n const params = {\n event: comments_module_events.ADD,\n type: 'trackedChange',\n documentId,\n changeId: id,\n trackedChangeType: isDeletionInsertion ? 'both' : trackedChangeType,\n trackedChangeText,\n deletedText: marks.deletionMark ? deletionText : null,\n author,\n authorEmail,\n date,\n };\n \n if (event === 'add') params.event = comments_module_events.ADD;\n else if (event === 'update') params.event = comments_module_events.UPDATE;\n return params;\n};","import { Mapping, ReplaceStep, ReplaceAroundStep, AddMarkStep, RemoveMarkStep } from 'prosemirror-transform';\nimport { TextSelection, Transaction, EditorState } from 'prosemirror-state';\nimport { replaceStep } from './replaceStep.js';\nimport { replaceAroundStep } from './replaceAroundStep.js';\nimport { addMarkStep } from './addMarkStep.js';\nimport { removeMarkStep } from './removeMarkStep.js';\nimport { TrackDeleteMarkName } from '../constants.js';\nimport { findMark } from '@core/helpers/index.js';\nimport { CommentsPluginKey } from '../../comment/comments-plugin.js';\n\n/**\n * Tracked transaction to track changes.\n * @param {Transaction} options.tr Transaction.\n * @param {EditorState} options.state Editor state.\n * @param {object} options.user User object ({ name, email }).\n * @returns {Transaction} Modified transaction.\n */\nexport const trackedTransaction = ({ tr, state, user }) => {\n const onlyInputTypeMeta = ['inputType', 'uiEvent', 'paste', 'pointer'];\n const notAllowedMeta = ['historyUndo', 'historyRedo', 'acceptReject'];\n\n if (\n !tr.steps.length ||\n (tr.meta && !Object.keys(tr.meta).every((meta) => onlyInputTypeMeta.includes(meta))) ||\n notAllowedMeta.includes(tr.getMeta('inputType')) ||\n tr.getMeta(CommentsPluginKey) // Skip if it's a comment transaction.\n ) {\n return tr;\n }\n\n const newTr = state.tr;\n const map = new Mapping();\n const fixedTimeTo10Mins = Math.floor(Date.now() / 600000) * 600000;\n const date = new Date(fixedTimeTo10Mins).toISOString();\n\n tr.steps.forEach((originalStep, originalStepIndex) => {\n const step = originalStep.map(map);\n const { doc } = newTr;\n\n if (!step) {\n return;\n }\n\n if (step instanceof ReplaceStep) {\n replaceStep({\n state,\n tr,\n step,\n newTr,\n map,\n doc,\n user,\n date,\n originalStep,\n originalStepIndex,\n });\n console.debug('[track-changes]: replaceStep');\n } /* else if (step instanceof ReplaceAroundStep) {\n // Skip for now.\n replaceAroundStep({\n state,\n tr,\n step,\n newTr,\n map,\n doc,\n user,\n date,\n originalStep,\n originalStepIndex,\n });\n console.debug('[track-changes]: ReplaceAroundStep');\n } */ else if (step instanceof AddMarkStep) {\n addMarkStep({\n state,\n tr,\n step,\n newTr,\n map,\n doc,\n user,\n date,\n });\n console.debug('[track-changes]: addMarkStep');\n } else if (step instanceof RemoveMarkStep) {\n removeMarkStep({\n state,\n tr,\n step,\n newTr,\n map,\n doc,\n user,\n date,\n });\n console.debug('[track-changes]: removeMarkStep');\n } else {\n newTr.step(step);\n console.log('[track-changes]: otherStep');\n }\n });\n\n if (tr.getMeta('inputType')) {\n newTr.setMeta(tr.getMeta('inputType'));\n }\n\n if (tr.getMeta('uiEvent')) {\n newTr.setMeta(tr.getMeta('uiEvent'));\n }\n\n if (tr.selectionSet) {\n const deletionMarkSchema = state.schema.marks[TrackDeleteMarkName];\n const deletionMark = findMark(state, deletionMarkSchema, false);\n\n if (\n tr.selection instanceof TextSelection &&\n (tr.selection.from < state.selection.from || tr.getMeta('inputType') === 'deleteContentBackward')\n ) {\n const caretPos = map.map(tr.selection.from, -1);\n newTr.setSelection(new TextSelection(newTr.doc.resolve(caretPos)));\n } else if (tr.selection.from > state.selection.from && deletionMark) {\n const caretPos = map.map(deletionMark.to + 1, 1);\n newTr.setSelection(new TextSelection(newTr.doc.resolve(caretPos)));\n } else {\n newTr.setSelection(tr.selection.map(newTr.doc, map));\n }\n } else if (state.selection.from - tr.selection.from > 1 && tr.selection.$head.depth > 1) {\n const caretPos = map.map(tr.selection.from - 2, -1);\n newTr.setSelection(new TextSelection(newTr.doc.resolve(caretPos)));\n } else {\n // Skip the other cases for now.\n }\n\n if (tr.storedMarksSet) {\n newTr.setStoredMarks(tr.storedMarks);\n }\n\n if (tr.scrolledIntoView) {\n newTr.scrollIntoView();\n }\n\n return newTr;\n};\n","import { twipsToLines, pixelsToTwips } from '@converter/helpers.js';\n\n/**\n * This migration is necessary after 0.4.14 line change upgrades as we went from using pixels in \n * line spacing to unitless line spacing.\n * \n * @param {Editor} editor \n */\nexport const migration_after_0_4_14 = (editor) => {\n const { state } = editor;\n const { dispatch } = editor.view;\n const { tr } = state;\n if (!dispatch) return;\n\n state.doc.descendants((node, pos) => {\n if (node.type.name === 'paragraph') {\n const { attrs } = node;\n const { spacing } = attrs;\n\n if (!spacing) return;\n const newSpacing = {\n line: twipsToLines(pixelsToTwips(spacing.line)),\n lineSpaceBefore: twipsToLines(pixelsToTwips(spacing.lineSpaceBefore)),\n lineSpaceAfter: twipsToLines(pixelsToTwips(spacing.lineSpaceAfter)),\n }\n tr.setNodeMarkup(pos, undefined, {\n ...attrs,\n spacing: {\n ...spacing,\n ...newSpacing\n }\n });\n }\n });\n dispatch(tr);\n return true;\n};\n","import { migration_after_0_4_14 } from './migration_after_0_4_14';\n\nconst DOCUMENT_MIGRATIONS = {\n 'initial': migration_after_0_4_14,\n};\n\nexport const getNecessaryMigrations = (version) => {\n if (version === 'initial' || version === '0.4.14') return Object.values(DOCUMENT_MIGRATIONS);\n};","import { EditorState } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { DOMParser, DOMSerializer } from 'prosemirror-model';\nimport { yXmlFragmentToProseMirrorRootNode } from 'y-prosemirror';\nimport { EventEmitter } from './EventEmitter.js';\nimport { ExtensionService } from './ExtensionService.js';\nimport { CommandService } from './CommandService.js';\nimport { Attribute } from './Attribute.js';\nimport { SuperConverter } from '@core/super-converter/SuperConverter.js';\nimport { Commands, Keymap, Editable, EditorFocus } from './extensions/index.js';\nimport { createDocument } from './helpers/createDocument.js';\nimport { isActive } from './helpers/isActive.js';\nimport { trackedTransaction } from '@extensions/track-changes/trackChangesHelpers/trackedTransaction.js';\nimport { TrackChangesBasePluginKey } from '@extensions/track-changes/plugins/index.js';\nimport { initPaginationData, PaginationPluginKey } from '@extensions/pagination/pagination-helpers';\nimport { CommentsPluginKey } from '@extensions/comment/comments-plugin.js';\nimport { getNecessaryMigrations } from '@core/migrations/index.js';\nimport {\n prepareCommentsForExport,\n prepareCommentsForImport,\n} from '@extensions/comment/comments-helpers.js';\nimport DocxZipper from '@core/DocxZipper.js';\n\n/**\n * Editor main class.\n */\nexport class Editor extends EventEmitter {\n #commandService;\n\n extensionService;\n\n extensionStorage = {};\n\n schema;\n\n view;\n\n isFocused = false;\n\n #css;\n\n options = {\n element: null,\n isHeadless: false,\n mockDocument: null,\n mockWindow: null,\n content: '', // XML content\n user: null,\n users: [],\n media: {},\n mediaFiles: {},\n fonts: {},\n documentMode: 'editing',\n mode: 'docx',\n role: 'editor',\n colors: [],\n converter: null,\n fileSource: null,\n initialState: null,\n documentId: null,\n extensions: [],\n editable: true,\n editorProps: {},\n parseOptions: {},\n coreExtensionOptions: {},\n isCommentsEnabled: false,\n isNewFile: false,\n scale: 1,\n annotations: false,\n isInternal: false,\n externalExtensions: [],\n onBeforeCreate: () => null,\n onCreate: () => null,\n onUpdate: () => null,\n onSelectionUpdate: () => null,\n onTransaction: () => null,\n onFocus: () => null,\n onBlur: () => null,\n onDestroy: () => null,\n onContentError: ({ error }) => {\n throw error;\n },\n onTrackedChangesUpdate: () => null,\n onCommentsUpdate: () => null,\n onCommentsLoaded: () => null,\n onCommentClicked: () => null,\n onCommentLocationsUpdate: () => null,\n onDocumentLocked: () => null,\n onFirstRender: () => null,\n onCollaborationReady: () => null,\n onPaginationUpdate: () => null,\n onException: () => null,\n // async (file) => url;\n handleImageUpload: null,\n \n // telemetry\n telemetry: null,\n };\n\n constructor(options) {\n super();\n \n options.element = options.isHeadless ? null : options.element || document.createElement('div');\n this.#checkHeadless(options);\n this.setOptions(options);\n\n let modes = {\n docx: () => this.#init(this.options),\n text: () => this.#initRichText(this.options),\n default: () => {\n console.log('Not implemented.');\n },\n };\n\n let initMode = modes[this.options.mode] ?? modes.default;\n \n initMode();\n }\n\n #init(options) {\n this.#createExtensionService();\n this.#createCommandService();\n this.#createSchema();\n this.#createConverter();\n this.#initMedia();\n\n this.on('beforeCreate', this.options.onBeforeCreate);\n this.emit('beforeCreate', { editor: this });\n this.on('contentError', this.options.onContentError);\n this.on('exception', this.options.onException);\n\n this.#createView();\n this.initDefaultStyles();\n this.setDocumentMode(options.documentMode);\n\n // If we are running headless, we can stop here\n if (this.options.isHeadless) return;\n\n this.on('create', this.options.onCreate);\n this.on('update', this.options.onUpdate);\n this.on('selectionUpdate', this.options.onSelectionUpdate);\n this.on('transaction', this.options.onTransaction);\n this.on('focus', this.#onFocus);\n this.on('blur', this.options.onBlur);\n this.on('destroy', this.options.onDestroy);\n this.on('trackedChangesUpdate', this.options.onTrackedChangesUpdate);\n this.on('commentsLoaded', this.options.onCommentsLoaded);\n this.on('commentClick', this.options.onCommentClicked);\n this.on('commentsUpdate', this.options.onCommentsUpdate);\n this.on('locked', this.options.onDocumentLocked);\n this.on('collaborationReady', this.#onCollaborationReady);\n this.on('paginationUpdate', this.options.onPaginationUpdate);\n this.on('comment-positions', this.options.onCommentLocationsUpdate);\n\n this.initializeCollaborationData();\n\n // Init pagination only if we are not in collaborative mode. Otherwise\n // it will be in itialized via this.#onCollaborationReady\n if (!this.options.ydoc) {\n this.#initPagination();\n this.#initComments();\n };\n\n window.setTimeout(() => {\n if (this.isDestroyed) return;\n this.emit('create', { editor: this });\n }, 0);\n }\n\n #initRichText(options) {\n this.#createExtensionService();\n this.#createCommandService();\n this.#createSchema();\n\n this.on('beforeCreate', this.options.onBeforeCreate);\n this.emit('beforeCreate', { editor: this });\n this.on('contentError', this.options.onContentError);\n\n this.#createView();\n\n this.on('create', this.options.onCreate);\n this.on('update', this.options.onUpdate);\n this.on('selectionUpdate', this.options.onSelectionUpdate);\n this.on('transaction', this.options.onTransaction);\n this.on('focus', this.#onFocus);\n this.on('blur', this.options.onBlur);\n this.on('destroy', this.options.onDestroy);\n this.on('commentsLoaded', this.options.onCommentsLoaded);\n this.on('commentClick', this.options.onCommentClicked);\n this.on('locked', this.options.onDocumentLocked);\n\n window.setTimeout(() => {\n if (this.isDestroyed) return;\n this.emit('create', { editor: this });\n }, 0);\n }\n\n #onFocus({ editor, event }) {\n this.toolbar?.setActiveEditor(editor);\n this.options.onFocus({ editor, event });\n }\n\n setToolbar(toolbar) {\n this.toolbar = toolbar;\n }\n\n #checkHeadless(options) {\n if (!options.isHeadless) return;\n\n if (typeof navigator === 'undefined') {\n global.navigator = { isHeadless: true };\n }\n\n if (options.mockDocument) {\n global.document = options.mockDocument;\n global.window = options.mockWindow;\n }\n }\n\n /**\n * Get the editor state.\n */\n get state() {\n return this.view.state;\n }\n\n /**\n * Get the editor storage.\n */\n get storage() {\n return this.extensionStorage;\n }\n\n /**\n * Get object of registered commands.\n */\n get commands() {\n return this.#commandService.commands;\n }\n\n /**\n * Check if the editor is editable.\n */\n get isEditable() {\n return this.options.editable && this.view && this.view.editable;\n }\n\n /**\n * Check if editor is destroyed.\n */\n get isDestroyed() {\n return this.view.isDestroyed; // !this.view?.docView\n }\n\n /**\n * Get the editor element\n */\n get element() {\n return this.options.element;\n }\n\n /**\n * Get possible users of the editor.\n */\n get users() {\n return this.options.users;\n }\n\n /**\n * Create a chain of commands to call multiple commands at once.\n */\n chain() {\n return this.#commandService.chain();\n }\n\n /**\n * Check if a command or a chain of commands can be executed. Without executing it.\n */\n can() {\n return this.#commandService.can();\n }\n\n setDocumentMode(documentMode) {\n let cleanedMode = documentMode?.toLowerCase() || 'editing';\n if (!this.extensionService) return;\n\n if (this.options.role === 'viewer') cleanedMode = 'viewing';\n if (this.options.role === 'suggester' && cleanedMode === 'editing') cleanedMode = 'suggesting';\n // Viewing mode: Not editable, no tracked changes, no comments\n if (cleanedMode === 'viewing') {\n // this.unregisterPlugin('comments');\n this.commands.toggleTrackChangesShowOriginal();\n this.setEditable(false, false);\n }\n\n // Suggesting: Editable, tracked changes plugin enabled, comments\n else if (cleanedMode === 'suggesting') {\n // this.#registerPluginByNameIfNotExists('comments')\n this.#registerPluginByNameIfNotExists('TrackChangesBase');\n this.commands.disableTrackChangesShowOriginal();\n this.commands.enableTrackChanges();\n this.setEditable(true, false);\n }\n\n // Editing: Editable, tracked changes plguin disabled, comments\n else if (cleanedMode === 'editing') {\n this.#registerPluginByNameIfNotExists('TrackChangesBase');\n // this.#registerPluginByNameIfNotExists('comments');\n this.commands.disableTrackChangesShowOriginal();\n this.commands.disableTrackChanges();\n this.setEditable(true, false);\n }\n }\n\n /**\n * If we are replacing data and have a valid provider, listen for synced event\n * so that we can initialize the data\n */\n initializeCollaborationData() {\n if (!this.options.isNewFile || !this.options.collaborationProvider) return;\n const { collaborationProvider: provider } = this.options;\n\n const postSyncInit = () => {\n provider.off('synced', postSyncInit);\n this.#insertNewFileData();\n };\n\n if (provider.synced) this.#insertNewFileData();\n // If we are not sync'd yet, wait for the event then insert the data\n else provider.on('synced', postSyncInit);\n }\n\n /**\n * Replace the current document with new data. Necessary for initializing a new collaboration file,\n * since we need to insert the data only after the provider has synced.\n */\n #insertNewFileData() {\n if (!this.options.isNewFile) return;\n this.options.isNewFile = false;\n const doc = this.#generatePmData();\n const tr = this.state.tr.replaceWith(0, this.state.doc.content.size, doc);\n this.view.dispatch(tr);\n\n setTimeout(() => {\n this.#initPagination();\n this.#initComments();\n }, 50);\n }\n\n #registerPluginByNameIfNotExists(name) {\n const plugin = this.extensionService?.plugins.find((p) => p.key.startsWith(name));\n const hasPlugin = this.state.plugins.find((p) => p.key.startsWith(name));\n if (plugin && !hasPlugin) this.registerPlugin(plugin);\n return plugin?.key;\n }\n\n /**\n * Set editor options and update state.\n * @param options List of options.\n */\n setOptions(options) {\n this.options = {\n ...this.options,\n ...options,\n };\n\n if (this.options.isNewFile && this.options.isCommentsEnabled) {\n this.options.shouldLoadComments = true;\n }\n \n if (!this.view || !this.state || this.ifsDestroyed) {\n return;\n }\n\n if (this.options.editorProps) {\n this.view.setProps(this.options.editorProps);\n }\n\n this.view.updateState(this.state);\n }\n\n /**\n * Updates editable state.\n * @param editable Editable value.\n * @param emitUpdate Emit 'update' event or not.\n */\n setEditable(editable, emitUpdate = true) {\n this.setOptions({ editable });\n\n if (emitUpdate) {\n this.emit('update', { editor: this, transaction: this.state.tr });\n }\n }\n\n /**\n * Register PM plugin.\n * @param plugin PM plugin.\n * @param handlePlugins Optional function for handling plugin merge.\n */\n registerPlugin(plugin, handlePlugins) {\n const plugins =\n typeof handlePlugins === 'function'\n ? handlePlugins(plugin, [...this.state.plugins])\n : [...this.state.plugins, plugin];\n\n const state = this.state.reconfigure({ plugins });\n this.view.updateState(state);\n }\n\n /**\n * Unregister PM plugin.\n * @param nameOrPluginKey Plugin name.\n */\n unregisterPlugin(nameOrPluginKey) {\n if (this.isDestroyed) return;\n\n const name = typeof nameOrPluginKey === 'string' ? `${nameOrPluginKey}$` : nameOrPluginKey.key;\n\n const state = this.state.reconfigure({\n plugins: this.state.plugins.filter((plugin) => !plugin.key.startsWith(name)),\n });\n\n this.view.updateState(state);\n }\n\n /**\n * Creates extension service.\n */\n #createExtensionService() {\n const allowedExtensions = ['extension', 'node', 'mark'];\n\n const coreExtensions = [Editable, Commands, EditorFocus, Keymap];\n const externalExtensions = this.options.externalExtensions || [];\n\n const allExtensions = [...coreExtensions, ...this.options.extensions].filter((e) =>\n allowedExtensions.includes(e?.type),\n );\n\n this.extensionService = ExtensionService.create(allExtensions, externalExtensions, this);\n }\n\n /**\n * Creates a command service.\n */\n #createCommandService() {\n this.#commandService = CommandService.create({\n editor: this,\n });\n }\n\n /**\n * Creates a SuperConverter.\n */\n #createConverter() {\n if (this.options.converter) {\n this.converter = this.options.converter;\n } else {\n this.converter = new SuperConverter({\n docx: this.options.content,\n media: this.options.mediaFiles,\n debug: true,\n telemetry: this.options.telemetry,\n fileSource: this.options.fileSource,\n documentId: this.options.documentId,\n });\n }\n }\n\n /**\n * Initialize media.\n */\n #initMedia() {\n if (!this.options.ydoc) return (this.storage.image.media = this.options.mediaFiles);\n\n const mediaMap = this.options.ydoc.getMap('media');\n\n // We are creating a new file and need to set the media\n if (this.options.isNewFile) {\n Object.entries(this.options.mediaFiles).forEach(([key, value]) => {\n mediaMap.set(key, value);\n });\n\n // Set the storage to the imported media files\n this.storage.image.media = this.options.mediaFiles;\n }\n\n // If we are opening an existing file, we need to get the media from the ydoc\n else {\n this.storage.image.media = Object.fromEntries(mediaMap.entries());\n }\n }\n\n /**\n * Load the data from DOCX to be used in the schema.\n * Expects a DOCX file.\n */\n static async loadXmlData(fileSource) {\n if (!fileSource) return;\n\n const zipper = new DocxZipper();\n const xmlFiles = await zipper.getDocxData(fileSource);\n const mediaFiles = zipper.media;\n\n return [xmlFiles, mediaFiles, zipper.mediaFiles, zipper.fonts];\n }\n\n static getDocumentVersion(content) {\n const version = SuperConverter.getStoredSuperdocVersion(content);\n return version;\n };\n\n static updateDocumentVersion(content, version) {\n const updatedContent = SuperConverter.updateDocumentVersion(content, version);\n return updatedContent;\n };\n\n /**\n * Creates PM schema.\n */\n #createSchema() {\n this.schema = this.extensionService.schema;\n }\n\n /**\n * Generate data from file\n */\n #generatePmData() {\n let doc;\n try {\n const { mode, fragment, isHeadless, content, loadFromSchema } = this.options;\n \n if (mode === 'docx') {\n doc = createDocument(this.converter, this.schema, this);\n\n // Perform any additional document processing prior to finalizing the doc here\n doc = this.#prepareDocumentForImport(doc);\n\n if (fragment && isHeadless) {\n doc = yXmlFragmentToProseMirrorRootNode(fragment, this.schema);\n }\n } else if (mode === 'text') {\n if (content) {\n doc = loadFromSchema\n ? this.schema.nodeFromJSON(content)\n : DOMParser.fromSchema(this.schema).parse(content);\n } else {\n doc = this.schema.topNodeType.createAndFill();\n }\n }\n } catch (err) {\n console.error(err);\n this.emit('contentError', { editor: this, error: err });\n }\n \n return doc;\n }\n\n /**\n * Creates PM View.\n */\n #createView() {\n let doc = this.#generatePmData();\n \n // Only initialize the doc if we are not using Yjs/collaboration\n const state = { schema: this.schema };\n if (!this.options.ydoc) state.doc = doc;\n\n this.view = new EditorView(this.options.element, {\n ...this.options.editorProps,\n dispatchTransaction: this.#dispatchTransaction.bind(this),\n state: EditorState.create(state),\n });\n\n const newState = this.state.reconfigure({\n plugins: this.extensionService.plugins,\n });\n\n this.view.updateState(newState);\n\n this.createNodeViews();\n\n const dom = this.view.dom;\n dom.editor = this;\n \n this.options.telemetry?.sendReport();\n }\n\n /**\n * Creates all node views.\n */\n createNodeViews() {\n this.view.setProps({\n nodeViews: this.extensionService.nodeViews,\n });\n }\n\n getMaxContentSize() {\n const { pageSize = {}, pageMargins = {} } = this.converter.pageStyles ?? {};\n const { width, height } = pageSize;\n const { top = 0, bottom = 0, left = 0, right = 0 } = pageMargins;\n\n // All sizes are in inches so we multiply by 96 to get pixels\n if (!width || !height) return {};\n\n const maxHeight = height * 96 - top * 96 - bottom * 96 - 50;\n const maxWidth = width * 96 - left * 96 - right * 96 - 20;\n return {\n width: maxWidth,\n height: maxHeight,\n }\n }\n\n /**\n * Initialize default styles for the editor container and ProseMirror.\n * Get page size and margins from the converter.\n * Set document default font and font size.\n */\n initDefaultStyles(element = this.element) {\n if (this.options.isHeadless) return;\n\n const proseMirror = element?.querySelector('.ProseMirror');\n const { pageSize, pageMargins } = this.converter.pageStyles ?? {};\n\n if (!proseMirror || !pageSize || !pageMargins) {\n return;\n }\n\n // Set fixed dimensions and padding that won't change with scaling\n element.style.width = pageSize.width + 'in';\n element.style.minWidth = pageSize.width + 'in';\n element.style.minHeight = pageSize.height + 'in';\n element.style.paddingLeft = pageMargins.left + 'in';\n element.style.paddingRight = pageMargins.right + 'in';\n element.style.boxSizing = 'border-box';\n\n proseMirror.style.outline = 'none';\n proseMirror.style.border = 'none';\n\n // Typeface and font size\n const { typeface, fontSizePt } = this.converter.getDocumentDefaultStyles() ?? {};\n\n if (typeface) {\n element.style.fontFamily = typeface;\n }\n if (fontSizePt) {\n element.style.fontSize = `${fontSizePt}pt`;\n }\n\n // Mobile styles\n element.style.transformOrigin = 'top left';\n element.style.touchAction = 'auto';\n element.style.webkitOverflowScrolling = 'touch';\n\n // Calculate line height\n const defaultLineHeight = 1.15;\n proseMirror.style.lineHeight = defaultLineHeight;\n\n // If we are not using pagination, we still need to add some padding for header/footer\n if (!this.options.extensions.find((e) => e.name === 'pagination')) {\n proseMirror.style.paddingTop = '1in';\n proseMirror.style.paddingBottom = '1in';\n }\n\n this.initMobileStyles(element);\n };\n\n initMobileStyles(element) {\n if (!element) {\n return;\n }\n\n const initialWidth = element.offsetWidth;\n \n const updateScale = () => {\n const minPageSideMargin = 10;\n const elementWidth = initialWidth;\n const availableWidth = document.documentElement.clientWidth - minPageSideMargin;\n \n this.options.scale = Math.min(1, availableWidth / elementWidth);\n\n const superEditorElement = element.closest('.super-editor');\n const superEditorContainer = element.closest('.super-editor-container');\n\n if (!superEditorElement || !superEditorContainer) {\n return;\n }\n\n if (this.options.scale < 1) {\n superEditorElement.style.maxWidth = `${elementWidth * this.options.scale}px`;\n superEditorContainer.style.minWidth = '0px';\n\n element.style.transform = `scale(${this.options.scale})`;\n } else {\n superEditorElement.style.maxWidth = '';\n superEditorContainer.style.minWidth = '';\n\n element.style.transform = \"none\"; \n }\n };\n\n // Initial scale\n updateScale();\n\n const handleResize = () => {\n setTimeout(() => {\n updateScale();\n }, 150);\n };\n\n if ('orientation' in screen && 'addEventListener' in screen.orientation) {\n screen.orientation.addEventListener(\"change\", handleResize);\n } else {\n window.matchMedia(\"(orientation: portrait)\").addEventListener(\"change\", handleResize);\n }\n\n window.addEventListener('resize', () => handleResize);\n };\n\n #onCollaborationReady({ editor, ydoc }) {\n if (this.options.collaborationIsReady) return;\n console.debug('🔗 [super-editor] Collaboration ready');\n\n this.options.onCollaborationReady({ editor, ydoc });\n this.options.collaborationIsReady = true;\n\n if (!this.options.isNewFile) {\n this.#initPagination();\n this.#initComments();\n }\n };\n\n /**\n * Initialize comments plugin\n */\n #initComments() {\n if (!this.options.isCommentsEnabled) return;\n if (this.options.isHeadless) return;\n if (!this.options.shouldLoadComments) return;\n const replacedFile = this.options.replacedFile;\n this.emit('commentsLoaded', { editor: this, replacedFile, comments: this.converter.comments || [] });\n\n setTimeout(() => {\n this.options.replacedFile = false;\n const { state, dispatch } = this.view;\n const tr = state.tr.setMeta(CommentsPluginKey, { type: 'force' });\n dispatch(tr);\n }, 50);\n };\n\n /**\n * Initialize pagination, if the pagination extension is enabled.\n */\n async #initPagination() {\n if (this.options.isHeadless || !this.extensionService) return;\n\n const pagination = this.options.extensions.find((e) => e.name === 'pagination');\n if (pagination && this.options.pagination) {\n console.debug('🔗 [super-editor] Initializing pagination');\n const sectionData = await initPaginationData(this);\n this.storage.pagination.sectionData = sectionData;\n\n // Trigger transaction to initialize pagination\n const { state, dispatch } = this.view;\n const tr = state.tr.setMeta(PaginationPluginKey, { isReadyToInit: true });\n dispatch(tr);\n }\n };\n\n /**\n * The callback which is used to intercept View transactions.\n * @param {*} transaction State transaction.\n */\n #dispatchTransaction(transaction) {\n if (this.view.isDestroyed) return;\n\n let state;\n try {\n const trackChangesState = TrackChangesBasePluginKey.getState(this.view.state);\n const isTrackChangesActive = trackChangesState?.isTrackChangesActive ?? false;\n\n const tr = isTrackChangesActive\n ? trackedTransaction({\n tr: transaction,\n state: this.state,\n user: this.options.user,\n })\n : transaction;\n\n const { state: newState } = this.view.state.applyTransaction(tr);\n state = newState;\n } catch (error) {\n // just in case\n state = this.state.apply(transaction);\n console.log(error);\n }\n\n const selectionHasChanged = !this.state.selection.eq(state.selection);\n this.view.updateState(state);\n\n this.emit('transaction', {\n editor: this,\n transaction,\n });\n\n if (selectionHasChanged) {\n this.emit('selectionUpdate', {\n editor: this,\n transaction,\n });\n }\n\n const focus = transaction.getMeta('focus');\n if (focus) {\n this.emit('focus', {\n editor: this,\n event: focus.event,\n transaction,\n });\n }\n\n const blur = transaction.getMeta('blur');\n if (blur) {\n this.emit('blur', {\n editor: this,\n event: blur.event,\n transaction,\n });\n }\n \n if (!transaction.docChanged) {\n return;\n }\n\n this.emit('update', {\n editor: this,\n transaction,\n });\n }\n\n /**\n * Get attrs of the currently selected node or mark.\n * @example\n * editor.getAttributes('textStyle').color\n */\n getAttributes(nameOrType) {\n return Attribute.getAttributes(this.state, nameOrType);\n }\n\n /**\n * Returns if the currently selected node or mark is active.\n * @example\n * editor.isActive('bold')\n * editor.isActive('textStyle', { color: 'purple' })\n * editor.isActive({ textAlign: 'center' })\n */\n isActive(nameOrAttributes, attributesOrUndefined) {\n const name = typeof nameOrAttributes === 'string' ? nameOrAttributes : null;\n const attributes =\n typeof nameOrAttributes === 'string' ? attributesOrUndefined : nameOrAttributes;\n return isActive(this.state, name, attributes);\n }\n\n /**\n * Get the document as JSON.\n */\n getJSON() {\n return this.state.doc.toJSON();\n }\n\n /**\n * Get HTML string of the document\n */\n getHTML() {\n const div = document.createElement('div');\n const fragment = DOMSerializer.fromSchema(this.schema).serializeFragment(this.state.doc.content);\n\n div.appendChild(fragment);\n return div.innerHTML;\n }\n\n /**\n * Get page styles\n */\n getPageStyles() {\n return this.converter?.pageStyles || {};\n }\n\n /**\n * Update page styles\n * \n * @param {Object} param0 \n * @param {Object} param0.pageMargins The new page margins\n * @returns {void}\n */\n updatePageStyle({ pageMargins }) {\n if (!this.converter) return;\n\n let hasMadeUpdate = false;\n if (pageMargins) {\n this.converter.pageStyles.pageMargins = pageMargins;\n this.initDefaultStyles();\n hasMadeUpdate = true;\n };\n\n if (hasMadeUpdate) {\n const newTr = this.view.state.tr;\n newTr.setMeta('forceUpdatePagination', true);\n this.view.dispatch(newTr);\n };\n }\n\n /**\n * Perform any post conversion pre prosemirror import processing.\n * Comments are processed here.\n * \n * @param {import('prosemirror-model').Node} doc The prosemirror document\n * @returns {import('prosemirror-model').Node} The updated prosemirror document\n */\n #prepareDocumentForImport(doc) {\n\n const newState = EditorState.create({\n schema: this.schema,\n doc,\n });\n\n const { tr, doc: newDoc } = newState;\n\n // Perform comments processing (replaces comment nodes with marks)\n prepareCommentsForImport(newDoc, tr, this.schema, this.converter);\n\n const updatedState = newState.apply(tr);\n return updatedState.doc;\n }\n\n /**\n * Prepare the document for export. Any necessary pre-export processing to the state\n * can happen here.\n * \n * @returns {Record<string, any>} The updated document JSON\n */\n #prepareDocumentForExport(comments = []) {\n const newState = EditorState.create({\n schema: this.schema,\n doc: this.state.doc,\n plugins: this.state.plugins\n });\n\n const { tr, doc } = newState;\n\n prepareCommentsForExport(doc, tr, this.schema, comments);\n const updatedState = newState.apply(tr);\n return updatedState.doc.toJSON();\n }\n\n /**\n * Export the editor document to DOCX.\n */\n async exportDocx({ isFinalDoc = false, commentsType, comments = [] } = {}) {\n\n // Pre-process the document state to prepare for export\n const json = this.#prepareDocumentForExport(comments);\n\n // Export the document to DOCX\n const documentXml = await this.converter.exportToDocx(\n json,\n this.schema,\n this.storage.image.media,\n isFinalDoc,\n commentsType,\n comments,\n );\n\n const customXml = this.converter.schemaToXml(this.converter.convertedXml['docProps/custom.xml'].elements[0]);\n const styles = this.converter.schemaToXml(this.converter.convertedXml['word/styles.xml'].elements[0]);\n const customSettings = this.converter.schemaToXml(this.converter.convertedXml['word/settings.xml'].elements[0]);\n const rels = this.converter.schemaToXml(this.converter.convertedXml['word/_rels/document.xml.rels'].elements[0]);\n const media = this.converter.addedMedia;\n\n const updatedDocs = {\n 'word/document.xml': String(documentXml),\n 'docProps/custom.xml': String(customXml),\n 'word/settings.xml': String(customSettings),\n 'word/_rels/document.xml.rels': String(rels),\n\n // Replace & with &amp; in styles.xml as DOCX viewers can't handle it\n 'word/styles.xml': String(styles).replace(/&/gi, '&amp;'),\n };\n\n if (comments.length) {\n const commentsXml = this.converter.schemaToXml(this.converter.convertedXml['word/comments.xml'].elements[0]);\n const commentsExtendedXml = this.converter.schemaToXml(this.converter.convertedXml['word/commentsExtended.xml'].elements[0]);\n const commentsExtensibleXml = this.converter.schemaToXml(this.converter.convertedXml['word/commentsExtensible.xml'].elements[0]);\n const commentsIdsXml = this.converter.schemaToXml(this.converter.convertedXml['word/commentsIds.xml'].elements[0]);\n\n updatedDocs['word/comments.xml'] = String(commentsXml);\n updatedDocs['word/commentsExtended.xml'] = String(commentsExtendedXml);\n updatedDocs['word/commentsExtensible.xml'] = String(commentsExtensibleXml);\n updatedDocs['word/commentsIds.xml'] = String(commentsIdsXml);\n };\n\n const zipper = new DocxZipper();\n const result = await zipper.updateZip({\n docx: this.options.content,\n updatedDocs: updatedDocs,\n originalDocxFile: this.options.fileSource,\n media,\n fonts: this.options.fonts,\n isHeadless: this.options.isHeadless,\n });\n\n this.options.telemetry?.trackUsage('document_export', {\n documentType: 'docx',\n timestamp: new Date().toISOString()\n });\n\n return result;\n }\n\n /**\n * Destroy collaboration provider and ydoc\n */\n #endCollaboration() {\n if (!this.options.ydoc) return;\n try {\n console.debug('🔗 [super-editor] Ending collaboration');\n if (this.options.collaborationProvider) this.options.collaborationProvider.disconnect();\n if (this.options.ydoc) this.options.ydoc.destroy();\n } catch (error) {}\n }\n\n /**\n * Destroy the editor.\n */\n destroy() {\n this.emit('destroy');\n if (this.view) this.view.destroy();\n this.#endCollaboration();\n this.removeAllListeners();\n }\n\n static checkIfMigrationsNeeded(version) {\n if (!version) version = 'initial';\n const migrations = getNecessaryMigrations(version) || [];\n console.debug('[checkVersionMigrations] Migrations needed:', version, migrations.length);\n return migrations.length > 0;\n }\n\n /**\n * Check for any necessary document migrations in collaboration mode\n * \n * @returns {Y.Doc | undefined} Updated Y.Doc if any, otherwise undefined\n */\n processCollaborationMigrations() {\n console.debug('[checkVersionMigrations] Current editor version', __APP_VERSION__);\n if (!this.options.ydoc) return;\n\n const metaMap = this.options.ydoc.getMap('meta');\n let docVersion = metaMap.get('version');\n if (!docVersion) docVersion = 'initial';\n console.debug('[checkVersionMigrations] Document version', docVersion);\n const migrations = getNecessaryMigrations(docVersion) || [];\n\n const plugins = this.state.plugins;\n const syncPlugin = plugins.find((p) => p.key.startsWith('y-sync'));\n if (!syncPlugin) return this.options.ydoc;\n\n let hasRunMigrations = false;\n for (let migration of migrations) {\n console.debug('🏃‍♂️ Running migration', migration.name);\n const result = migration(this);\n if (!result) throw new Error('Migration failed at ' + migration.name);\n else hasRunMigrations = true;\n };\n\n // If no migrations were run, return undefined (no updated ydoc).\n if (!hasRunMigrations) return;\n\n // Return the updated ydoc\n const pluginState = syncPlugin?.getState(this.state);\n return pluginState.doc;\n };\n\n async replaceFile(newFile) {\n const [docx, media, mediaFiles, fonts] = await Editor.loadXmlData(newFile);\n this.setOptions({\n fileSource: newFile,\n content: docx,\n media,\n mediaFiles,\n fonts,\n isNewFile: true,\n shouldLoadComments: true,\n replacedFile: true,\n });\n\n this.#createConverter();\n this.#initMedia();\n this.initDefaultStyles();\n \n this.initializeCollaborationData(true);\n \n if (!this.options.ydoc) {\n this.#initPagination();\n this.#initComments();\n };\n \n }\n}","import { getExtensionConfigField } from './helpers/getExtensionConfigField.js';\nimport { callOrGet } from './utilities/callOrGet.js';\n\n/**\n * Node class is used to create Node extensions.\n */\nexport class Node {\n type = 'node';\n\n name = 'node';\n\n options;\n\n storage;\n\n config = {\n name: this.name,\n };\n\n constructor(config) {\n this.config = {\n ...this.config,\n ...config,\n };\n\n this.name = this.config.name;\n\n if (this.config.addOptions) {\n this.options = callOrGet(\n getExtensionConfigField(this, 'addOptions', {\n name: this.name,\n }),\n );\n }\n\n this.storage =\n callOrGet(\n getExtensionConfigField(this, 'addStorage', {\n name: this.name,\n options: this.options,\n }),\n ) || {};\n }\n\n /**\n * Static method for creating Node extension.\n * @param args Arguments for the constructor.\n */\n static create(...args) {\n return new Node(...args);\n }\n}\n","import { getExtensionConfigField } from './helpers/getExtensionConfigField.js';\nimport { callOrGet } from './utilities/callOrGet.js';\n\n/**\n * Mark class is used to create Mark extensions.\n */\nexport class Mark {\n type = 'mark';\n\n name = 'mark';\n\n options;\n\n storage;\n\n config = {\n name: this.name,\n };\n\n constructor(config) {\n this.config = {\n ...this.config,\n ...config,\n };\n\n this.name = this.config.name;\n\n if (this.config.addOptions) {\n this.options = callOrGet(\n getExtensionConfigField(this, 'addOptions', {\n name: this.name,\n }),\n );\n }\n\n this.storage =\n callOrGet(\n getExtensionConfigField(this, 'addStorage', {\n name: this.name,\n options: this.options,\n }),\n ) || {};\n }\n\n /**\n * Static method for creating Mark extension.\n * @param args Arguments for the constructor.\n */\n static create(...args) {\n return new Mark(...args);\n }\n}\n","/**\n * Matches a CSS dimension returning a group containing the unit name\n * i.e. '10rem' returns the group 'rem'\n */\nconst CSS_DIMENSION_REGEX = /[\\d-.]+(\\w+)$/;\n\nconst DOM_SIZE_UNITS = ['px', 'rem', 'em', 'in', 'q', 'mm', 'cm', 'pt', 'pc', 'vh', 'vw', 'vmin', 'vmax'];\n\n/**\n * Parse the size and unit from the provided value.\n * @param val Value to parse.\n * @returns Array with parsed value and unit (or null).\n */\nexport function parseSizeUnit(val = '0') {\n const length = val || '0';\n const value = Number.parseFloat(length);\n const match = length.match(CSS_DIMENSION_REGEX);\n const unit = (match?.[1] ?? '').toLowerCase();\n return [value, DOM_SIZE_UNITS.includes(unit) ? unit : null];\n}\n","import { Extension } from '@core/index.js';\n\nexport const Color = Extension.create({\n name: 'color',\n\n addOptions() {\n return {\n types: ['textStyle'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n color: {\n default: null,\n parseDOM: (el) => el.style.color?.replace(/['\"]+/g, ''),\n renderDOM: (attrs) => {\n if (!attrs.color) return {};\n return { style: `color: ${attrs.color}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setColor:\n (color) =>\n ({ chain }) => {\n return chain().setMark('textStyle', { color: color }).run();\n },\n unsetColor:\n () =>\n ({ chain }) => {\n return chain().setMark('textStyle', { color: null }).removeEmptyTextStyle().run();\n },\n };\n },\n});\n","import { Extension } from '@core/index.js';\n\nexport const FontFamily = Extension.create({\n name: 'fontFamily',\n\n addOptions() {\n return {\n types: ['textStyle'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontFamily: {\n default: null,\n parseDOM: (el) => el.style.fontFamily?.replace(/['\"]+/g, ''),\n renderDOM: (attrs) => {\n if (!attrs.fontFamily) return {};\n return { style: `font-family: ${attrs.fontFamily}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontFamily:\n (fontFamily) =>\n ({ chain }) => {\n return chain().setMark('textStyle', { fontFamily }).run();\n },\n\n unsetFontFamily:\n () =>\n ({ chain }) => {\n return chain().setMark('textStyle', { fontFamily: null }).removeEmptyTextStyle().run();\n },\n };\n },\n});\n","import { Extension } from '@core/index.js';\nimport { parseSizeUnit, minMax } from '@core/utilities/index.js';\n\n/**\n * Do we need a unit conversion system?\n *\n * For reference.\n * https://github.com/remirror/remirror/tree/HEAD/packages/remirror__extension-font-size\n * https://github.com/remirror/remirror/blob/83adfa93f9a320b6146b8011790f27096af9340b/packages/remirror__core-utils/src/dom-utils.ts\n */\nexport const FontSize = Extension.create({\n name: 'fontSize',\n\n addOptions() {\n return {\n types: ['textStyle', 'tableCell'],\n defaults: {\n value: 12,\n unit: 'pt',\n min: 8,\n max: 96,\n },\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseDOM: (el) => el.style.fontSize,\n renderDOM: (attrs) => {\n if (!attrs.fontSize) return {};\n let [value, unit] = parseSizeUnit(attrs.fontSize);\n if (Number.isNaN(value)) return {};\n unit = unit ? unit : this.options.defaults.unit;\n return { style: `font-size: ${value}${unit}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setFontSize:\n (fontSize) =>\n ({ chain }) => {\n let [value, unit] = parseSizeUnit(fontSize);\n\n if (Number.isNaN(value)) {\n return false;\n }\n\n let { min, max, unit: defaultUnit } = this.options.defaults;\n value = minMax(value, min, max);\n unit = unit ? unit : defaultUnit;\n\n return chain()\n .setMark('textStyle', { fontSize: `${value}${unit}` })\n .run();\n },\n\n unsetFontSize:\n () =>\n ({ chain }) => {\n return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run();\n },\n };\n },\n});\n","import { Extension } from '@core/index.js';\n\nexport const TextAlign = Extension.create({\n name: 'textAlign',\n\n addOptions() {\n return {\n types: ['heading', 'paragraph'],\n alignments: ['left', 'center', 'right', 'justify'],\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n textAlign: {\n default: this.options.defaultAlignment,\n parseDOM: (el) => {\n const alignment = el.style.textAlign || this.options.defaultAlignment;\n const containsAlignment = this.options.alignments.includes(alignment);\n return containsAlignment ? alignment : this.options.defaultAlignment;\n },\n renderDOM: (attrs) => {\n if (attrs.textAlign === this.options.defaultAlignment) return {};\n const textAlign = attrs.textAlign === 'both' ? 'justify' : attrs.textAlign;\n return { style: `text-align: ${textAlign}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setTextAlign:\n (alignment) =>\n ({ commands }) => {\n const containsAlignment = this.options.alignments.includes(alignment);\n if (!containsAlignment) return false;\n\n return this.options.types\n .map((type) => commands.updateAttributes(type, { textAlign: alignment }))\n .every((result) => result);\n },\n\n unsetTextAlign:\n () =>\n ({ commands }) => {\n return this.options.types\n .map((type) => commands.resetAttributes(type, 'textAlign'))\n .every((result) => result);\n },\n };\n },\n\n addShortcuts() {\n return {\n 'Mod-Shift-l': () => this.editor.commands.setTextAlign('left'),\n 'Mod-Shift-e': () => this.editor.commands.setTextAlign('center'),\n 'Mod-Shift-r': () => this.editor.commands.setTextAlign('right'),\n 'Mod-Shift-j': () => this.editor.commands.setTextAlign('justify'),\n };\n },\n});\n","import { Extension } from '@core/index.js';\nimport { parseSizeUnit } from '@core/utilities/index.js';\n\n/**\n * Do we need a unit conversion system?\n *\n * For reference.\n * https://remirror.vercel.app/?path=/story/extensions-nodeformatting--basic\n * https://github.com/remirror/remirror/tree/HEAD/packages/remirror__extension-node-formatting\n */\nexport const TextIndent = Extension.create({\n name: 'textIndent',\n\n addOptions() {\n return {\n types: ['heading', 'paragraph'],\n defaults: {\n unit: 'in',\n increment: 0.125,\n },\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n textIndent: {\n default: null,\n parseDOM: (el) => el.style.textIndent,\n renderDOM: (attrs) => {\n if (!attrs.textIndent) return {};\n let [value, unit] = parseSizeUnit(attrs.textIndent);\n if (Number.isNaN(value)) return {};\n unit = unit ? unit : this.options.defaults.unit;\n return { style: `margin-left: ${value}${unit}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setTextIndent:\n (indent) =>\n ({ commands }) => {\n if (!indent) return false;\n\n return this.options.types\n .map((type) => commands.updateAttributes(type, { textIndent: indent }))\n .every((result) => result);\n },\n\n unsetTextIndent:\n () =>\n ({ commands }) => {\n return this.options.types\n .map((type) => commands.resetAttributes(type, 'textIndent'))\n .every((result) => result);\n },\n\n increaseTextIndent:\n () =>\n ({ commands }) => {\n return this.options.types\n .map((type) => {\n let { textIndent } = this.editor.getAttributes(type);\n\n if (!textIndent) {\n let { increment, unit } = this.options.defaults;\n return commands.updateAttributes(type, {\n textIndent: `${increment}${unit}`,\n });\n }\n\n let [value, unit] = parseSizeUnit(textIndent);\n value = value + this.options.defaults.increment;\n unit = unit ? unit : this.options.defaults.unit;\n\n if (Number.isNaN(value)) return false;\n\n return commands.updateAttributes(type, {\n textIndent: `${value}${unit}`,\n });\n })\n .every((result) => result);\n },\n\n decreaseTextIndent:\n () =>\n ({ commands }) => {\n return this.options.types\n .map((type) => {\n let { textIndent } = this.editor.getAttributes(type);\n\n if (!textIndent) return false;\n\n let [value, unit] = parseSizeUnit(textIndent);\n value = value - this.options.defaults.increment;\n unit = unit ? unit : this.options.defaults.unit;\n\n if (Number.isNaN(value)) return false;\n\n if (value <= 0) {\n return commands.unsetTextIndent();\n }\n\n return commands.updateAttributes(type, {\n textIndent: `${value}${unit}`,\n });\n })\n .every((result) => result);\n },\n };\n },\n});\n","import { Extension } from '@core/index.js';\nimport { parseSizeUnit } from '@core/utilities/index.js';\n\nexport const LineHeight = Extension.create({\n name: 'lineHeight',\n\n addOptions() {\n return {\n types: ['heading', 'paragraph'],\n defaults: {\n unit: '',\n },\n };\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n lineHeight: {\n default: null,\n parseDOM: (el) => el.style.lineHeight,\n renderDOM: (attrs) => {\n if (!attrs.lineHeight) return {};\n let [value, unit] = parseSizeUnit(attrs.lineHeight);\n if (Number.isNaN(value)) return {};\n unit = unit ? unit : this.options.defaults.unit;\n return { style: `line-height: ${value}${unit}` };\n },\n },\n },\n },\n ];\n },\n\n addCommands() {\n return {\n setLineHeight:\n (lineHeight) =>\n ({ commands }) => {\n if (!lineHeight) return false;\n\n return this.options.types\n .map((type) => commands.updateAttributes(type, { lineHeight }))\n .every((result) => result);\n },\n\n unsetLineHeight:\n () =>\n ({ commands }) => {\n return this.options.types\n .map((type) => commands.resetAttributes(type, 'lineHeight'))\n .every((result) => result);\n },\n };\n },\n});\n","import { Extension } from '@core/index.js';\nimport { getMarksFromSelection } from '@/core/helpers/getMarksFromSelection.js';\n\nexport const FormatCommands = Extension.create({\n name: 'formatCommands',\n\n addOptions() {\n return {};\n },\n\n addStorage() {\n return {\n storedStyle: null,\n };\n },\n\n addCommands() {\n return {\n clearFormat:\n () =>\n ({ chain }) => {\n return chain().clearNodes().unsetAllMarks().run();\n },\n\n clearMarksFormat:\n () =>\n ({ chain }) => {\n return chain().unsetAllMarks().run();\n },\n\n clearNodesFormat:\n () =>\n ({ chain }) => {\n return chain().clearNodes().run();\n },\n\n copyFormat:\n () =>\n ({ chain }) => {\n // If we don't have a saved style, save the current one\n if (!this.storage.storedStyle) {\n const marks = getMarksFromSelection(this.editor.state);\n this.storage.storedStyle = marks;\n return true;\n }\n\n // Special case: if there are no stored marks, but this is still an apply action\n // We just clear the format\n if (!this.storage.storedStyle.length) {\n this.storage.storedStyle = null;\n return chain().clearFormat().run();\n }\n\n // If we do have a stored style, apply it\n const storedMarks = this.storage.storedStyle;\n const processedMarks = [];\n storedMarks.forEach((mark) => {\n const { type, attrs } = mark;\n const { name } = type;\n\n if (name === 'textStyle') {\n Object.keys(attrs).forEach((key) => {\n if (!attrs[key]) return;\n const attributes = {};\n attributes[key] = attrs[key];\n processedMarks.push({ name: key, attrs: attributes });\n });\n } else {\n processedMarks.push({ name, attrs });\n }\n });\n\n const marksToCommands = {\n bold: ['setBold', 'unsetBold'],\n italic: ['setItalic', 'unsetItalic'],\n underline: ['setUnderline', 'unsetUnderline'],\n color: ['setColor', 'setColor', null],\n fontSize: ['setFontSize', 'unsetFontSize'],\n fontFamily: ['setFontFamily', 'unsetFontFamily'],\n };\n\n // Apply marks present, clear ones that are not, by chaining commands\n let result = chain();\n Object.keys(marksToCommands).forEach((key) => {\n const [setCommand, unsetCommand, defaultParam] = marksToCommands[key];\n const markToApply = processedMarks.find((mark) => mark.name === key);\n const hasEmptyAttrs = markToApply?.attrs && markToApply?.attrs[key];\n\n let cmd = {};\n if (!markToApply && !hasEmptyAttrs) cmd = { command: unsetCommand, argument: defaultParam };\n else cmd = { command: setCommand, argument: markToApply.attrs[key] || defaultParam };\n result = result[cmd.command](cmd.argument);\n });\n\n this.storage.storedStyle = null;\n return result;\n },\n };\n },\n\n addShortcuts() {\n return {\n 'Mod-Alt-c': () => this.editor.commands.clearFormat(),\n };\n },\n});\n","import { Plugin } from 'prosemirror-state';\nimport { dropPoint } from 'prosemirror-transform';\n\n/**\nCreate a plugin that, when added to a ProseMirror instance,\ncauses a decoration to show up at the drop position when something\nis dragged over the editor.\n\nNodes may add a `disableDropCursor` property to their spec to\ncontrol the showing of a drop cursor inside them. This may be a\nboolean or a function, which will be called with a view and a\nposition, and should return a boolean.\n*/\nfunction dropCursor(options = {}) {\n return new Plugin({\n view(editorView) { return new DropCursorView(editorView, options); }\n });\n}\nclass DropCursorView {\n constructor(editorView, options) {\n var _a;\n this.editorView = editorView;\n this.cursorPos = null;\n this.element = null;\n this.timeout = -1;\n this.width = (_a = options.width) !== null && _a !== void 0 ? _a : 1;\n this.color = options.color === false ? undefined : (options.color || \"black\");\n this.class = options.class;\n this.handlers = [\"dragover\", \"dragend\", \"drop\", \"dragleave\"].map(name => {\n let handler = (e) => { this[name](e); };\n editorView.dom.addEventListener(name, handler);\n return { name, handler };\n });\n }\n destroy() {\n this.handlers.forEach(({ name, handler }) => this.editorView.dom.removeEventListener(name, handler));\n }\n update(editorView, prevState) {\n if (this.cursorPos != null && prevState.doc != editorView.state.doc) {\n if (this.cursorPos > editorView.state.doc.content.size)\n this.setCursor(null);\n else\n this.updateOverlay();\n }\n }\n setCursor(pos) {\n if (pos == this.cursorPos)\n return;\n this.cursorPos = pos;\n if (pos == null) {\n this.element.parentNode.removeChild(this.element);\n this.element = null;\n }\n else {\n this.updateOverlay();\n }\n }\n updateOverlay() {\n let $pos = this.editorView.state.doc.resolve(this.cursorPos);\n let isBlock = !$pos.parent.inlineContent, rect;\n if (isBlock) {\n let before = $pos.nodeBefore, after = $pos.nodeAfter;\n if (before || after) {\n let node = this.editorView.nodeDOM(this.cursorPos - (before ? before.nodeSize : 0));\n if (node) {\n let nodeRect = node.getBoundingClientRect();\n let top = before ? nodeRect.bottom : nodeRect.top;\n if (before && after)\n top = (top + this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top) / 2;\n rect = { left: nodeRect.left, right: nodeRect.right, top: top - this.width / 2, bottom: top + this.width / 2 };\n }\n }\n }\n if (!rect) {\n let coords = this.editorView.coordsAtPos(this.cursorPos);\n rect = { left: coords.left - this.width / 2, right: coords.left + this.width / 2, top: coords.top, bottom: coords.bottom };\n }\n let parent = this.editorView.dom.offsetParent;\n if (!this.element) {\n this.element = parent.appendChild(document.createElement(\"div\"));\n if (this.class)\n this.element.className = this.class;\n this.element.style.cssText = \"position: absolute; z-index: 50; pointer-events: none;\";\n if (this.color) {\n this.element.style.backgroundColor = this.color;\n }\n }\n this.element.classList.toggle(\"prosemirror-dropcursor-block\", isBlock);\n this.element.classList.toggle(\"prosemirror-dropcursor-inline\", !isBlock);\n let parentLeft, parentTop;\n if (!parent || parent == document.body && getComputedStyle(parent).position == \"static\") {\n parentLeft = -pageXOffset;\n parentTop = -pageYOffset;\n }\n else {\n let rect = parent.getBoundingClientRect();\n parentLeft = rect.left - parent.scrollLeft;\n parentTop = rect.top - parent.scrollTop;\n }\n this.element.style.left = (rect.left - parentLeft) + \"px\";\n this.element.style.top = (rect.top - parentTop) + \"px\";\n this.element.style.width = (rect.right - rect.left) + \"px\";\n this.element.style.height = (rect.bottom - rect.top) + \"px\";\n }\n scheduleRemoval(timeout) {\n clearTimeout(this.timeout);\n this.timeout = setTimeout(() => this.setCursor(null), timeout);\n }\n dragover(event) {\n if (!this.editorView.editable)\n return;\n let pos = this.editorView.posAtCoords({ left: event.clientX, top: event.clientY });\n let node = pos && pos.inside >= 0 && this.editorView.state.doc.nodeAt(pos.inside);\n let disableDropCursor = node && node.type.spec.disableDropCursor;\n let disabled = typeof disableDropCursor == \"function\" ? disableDropCursor(this.editorView, pos, event) : disableDropCursor;\n if (pos && !disabled) {\n let target = pos.pos;\n if (this.editorView.dragging && this.editorView.dragging.slice) {\n let point = dropPoint(this.editorView.state.doc, target, this.editorView.dragging.slice);\n if (point != null)\n target = point;\n }\n this.setCursor(target);\n this.scheduleRemoval(5000);\n }\n }\n dragend() {\n this.scheduleRemoval(20);\n }\n drop() {\n this.scheduleRemoval(20);\n }\n dragleave(event) {\n if (event.target == this.editorView.dom || !this.editorView.dom.contains(event.relatedTarget))\n this.setCursor(null);\n }\n}\n\nexport { dropCursor };\n","import { Extension } from '@core/index.js';\nimport { dropCursor } from 'prosemirror-dropcursor';\n\nexport const DropCursor = Extension.create({\n name: 'dropCursor',\n\n addOptions() {\n return {\n color: 'currentColor',\n width: 2,\n class: undefined,\n };\n },\n\n addPmPlugins() {\n return [dropCursor(this.options)];\n },\n});\n","import { keydownHandler } from 'prosemirror-keymap';\nimport { Selection, NodeSelection, TextSelection, Plugin } from 'prosemirror-state';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\n\n/**\nGap cursor selections are represented using this class. Its\n`$anchor` and `$head` properties both point at the cursor position.\n*/\nclass GapCursor extends Selection {\n /**\n Create a gap cursor.\n */\n constructor($pos) {\n super($pos, $pos);\n }\n map(doc, mapping) {\n let $pos = doc.resolve(mapping.map(this.head));\n return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos);\n }\n content() { return Slice.empty; }\n eq(other) {\n return other instanceof GapCursor && other.head == this.head;\n }\n toJSON() {\n return { type: \"gapcursor\", pos: this.head };\n }\n /**\n @internal\n */\n static fromJSON(doc, json) {\n if (typeof json.pos != \"number\")\n throw new RangeError(\"Invalid input for GapCursor.fromJSON\");\n return new GapCursor(doc.resolve(json.pos));\n }\n /**\n @internal\n */\n getBookmark() { return new GapBookmark(this.anchor); }\n /**\n @internal\n */\n static valid($pos) {\n let parent = $pos.parent;\n if (parent.isTextblock || !closedBefore($pos) || !closedAfter($pos))\n return false;\n let override = parent.type.spec.allowGapCursor;\n if (override != null)\n return override;\n let deflt = parent.contentMatchAt($pos.index()).defaultType;\n return deflt && deflt.isTextblock;\n }\n /**\n @internal\n */\n static findGapCursorFrom($pos, dir, mustMove = false) {\n search: for (;;) {\n if (!mustMove && GapCursor.valid($pos))\n return $pos;\n let pos = $pos.pos, next = null;\n // Scan up from this position\n for (let d = $pos.depth;; d--) {\n let parent = $pos.node(d);\n if (dir > 0 ? $pos.indexAfter(d) < parent.childCount : $pos.index(d) > 0) {\n next = parent.child(dir > 0 ? $pos.indexAfter(d) : $pos.index(d) - 1);\n break;\n }\n else if (d == 0) {\n return null;\n }\n pos += dir;\n let $cur = $pos.doc.resolve(pos);\n if (GapCursor.valid($cur))\n return $cur;\n }\n // And then down into the next node\n for (;;) {\n let inside = dir > 0 ? next.firstChild : next.lastChild;\n if (!inside) {\n if (next.isAtom && !next.isText && !NodeSelection.isSelectable(next)) {\n $pos = $pos.doc.resolve(pos + next.nodeSize * dir);\n mustMove = false;\n continue search;\n }\n break;\n }\n next = inside;\n pos += dir;\n let $cur = $pos.doc.resolve(pos);\n if (GapCursor.valid($cur))\n return $cur;\n }\n return null;\n }\n }\n}\nGapCursor.prototype.visible = false;\nGapCursor.findFrom = GapCursor.findGapCursorFrom;\nSelection.jsonID(\"gapcursor\", GapCursor);\nclass GapBookmark {\n constructor(pos) {\n this.pos = pos;\n }\n map(mapping) {\n return new GapBookmark(mapping.map(this.pos));\n }\n resolve(doc) {\n let $pos = doc.resolve(this.pos);\n return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos);\n }\n}\nfunction closedBefore($pos) {\n for (let d = $pos.depth; d >= 0; d--) {\n let index = $pos.index(d), parent = $pos.node(d);\n // At the start of this parent, look at next one\n if (index == 0) {\n if (parent.type.spec.isolating)\n return true;\n continue;\n }\n // See if the node before (or its first ancestor) is closed\n for (let before = parent.child(index - 1);; before = before.lastChild) {\n if ((before.childCount == 0 && !before.inlineContent) || before.isAtom || before.type.spec.isolating)\n return true;\n if (before.inlineContent)\n return false;\n }\n }\n // Hit start of document\n return true;\n}\nfunction closedAfter($pos) {\n for (let d = $pos.depth; d >= 0; d--) {\n let index = $pos.indexAfter(d), parent = $pos.node(d);\n if (index == parent.childCount) {\n if (parent.type.spec.isolating)\n return true;\n continue;\n }\n for (let after = parent.child(index);; after = after.firstChild) {\n if ((after.childCount == 0 && !after.inlineContent) || after.isAtom || after.type.spec.isolating)\n return true;\n if (after.inlineContent)\n return false;\n }\n }\n return true;\n}\n\n/**\nCreate a gap cursor plugin. When enabled, this will capture clicks\nnear and arrow-key-motion past places that don't have a normally\nselectable position nearby, and create a gap cursor selection for\nthem. The cursor is drawn as an element with class\n`ProseMirror-gapcursor`. You can either include\n`style/gapcursor.css` from the package's directory or add your own\nstyles to make it visible.\n*/\nfunction gapCursor() {\n return new Plugin({\n props: {\n decorations: drawGapCursor,\n createSelectionBetween(_view, $anchor, $head) {\n return $anchor.pos == $head.pos && GapCursor.valid($head) ? new GapCursor($head) : null;\n },\n handleClick,\n handleKeyDown,\n handleDOMEvents: { beforeinput: beforeinput }\n }\n });\n}\nconst handleKeyDown = keydownHandler({\n \"ArrowLeft\": arrow(\"horiz\", -1),\n \"ArrowRight\": arrow(\"horiz\", 1),\n \"ArrowUp\": arrow(\"vert\", -1),\n \"ArrowDown\": arrow(\"vert\", 1)\n});\nfunction arrow(axis, dir) {\n const dirStr = axis == \"vert\" ? (dir > 0 ? \"down\" : \"up\") : (dir > 0 ? \"right\" : \"left\");\n return function (state, dispatch, view) {\n let sel = state.selection;\n let $start = dir > 0 ? sel.$to : sel.$from, mustMove = sel.empty;\n if (sel instanceof TextSelection) {\n if (!view.endOfTextblock(dirStr) || $start.depth == 0)\n return false;\n mustMove = false;\n $start = state.doc.resolve(dir > 0 ? $start.after() : $start.before());\n }\n let $found = GapCursor.findGapCursorFrom($start, dir, mustMove);\n if (!$found)\n return false;\n if (dispatch)\n dispatch(state.tr.setSelection(new GapCursor($found)));\n return true;\n };\n}\nfunction handleClick(view, pos, event) {\n if (!view || !view.editable)\n return false;\n let $pos = view.state.doc.resolve(pos);\n if (!GapCursor.valid($pos))\n return false;\n let clickPos = view.posAtCoords({ left: event.clientX, top: event.clientY });\n if (clickPos && clickPos.inside > -1 && NodeSelection.isSelectable(view.state.doc.nodeAt(clickPos.inside)))\n return false;\n view.dispatch(view.state.tr.setSelection(new GapCursor($pos)));\n return true;\n}\n// This is a hack that, when a composition starts while a gap cursor\n// is active, quickly creates an inline context for the composition to\n// happen in, to avoid it being aborted by the DOM selection being\n// moved into a valid position.\nfunction beforeinput(view, event) {\n if (event.inputType != \"insertCompositionText\" || !(view.state.selection instanceof GapCursor))\n return false;\n let { $from } = view.state.selection;\n let insert = $from.parent.contentMatchAt($from.index()).findWrapping(view.state.schema.nodes.text);\n if (!insert)\n return false;\n let frag = Fragment.empty;\n for (let i = insert.length - 1; i >= 0; i--)\n frag = Fragment.from(insert[i].createAndFill(null, frag));\n let tr = view.state.tr.replace($from.pos, $from.pos, new Slice(frag, 0, 0));\n tr.setSelection(TextSelection.near(tr.doc.resolve($from.pos + 1)));\n view.dispatch(tr);\n return false;\n}\nfunction drawGapCursor(state) {\n if (!(state.selection instanceof GapCursor))\n return null;\n let node = document.createElement(\"div\");\n node.className = \"ProseMirror-gapcursor\";\n return DecorationSet.create(state.doc, [Decoration.widget(state.selection.head, node, { key: \"gapcursor\" })]);\n}\n\nexport { GapCursor, gapCursor };\n","import { gapCursor } from 'prosemirror-gapcursor';\nimport { Extension } from '@core/index.js';\nimport { callOrGet } from '@core/utilities/callOrGet.js';\nimport { getExtensionConfigField } from '@core/helpers/getExtensionConfigField.js';\n\nexport const Gapcursor = Extension.create({\n name: 'gapCursor',\n \n addPmPlugins() {\n return [\n gapCursor(),\n ];\n },\n\n extendNodeSchema(extension) {\n return {\n allowGapCursor: callOrGet(getExtensionConfigField(extension, 'allowGapCursor', {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n })) ?? null,\n };\n },\n});\n","import { Extension } from '@core/index.js';\nimport { PluginKey } from 'prosemirror-state';\nimport { ySyncPlugin, yUndoPlugin, yUndoPluginKey, undo, redo } from 'y-prosemirror';\n\nexport const CollaborationPluginKey = new PluginKey('collaboration');\n\nexport const Collaboration = Extension.create({\n name: 'collaboration',\n\n priority: 1000,\n\n addOptions() {\n return {\n ydoc: null,\n field: 'supereditor',\n fragment: null,\n isReady: false,\n };\n },\n\n addPmPlugins() {\n if (!this.editor.options.ydoc) return [];\n this.options.ydoc = this.editor.options.ydoc;\n const undoPlugin = createUndoPlugin();\n\n // Listen for document lock changes\n initDocumentLockHandler(this.options.ydoc, this.editor);\n initSyncListener(this.options.ydoc, this.editor, this);\n\n const [syncPlugin, fragment] = createSyncPlugin(this.options.ydoc, this.editor);\n this.options.fragment = fragment;\n\n const metaMap = this.options.ydoc.getMap('media');\n metaMap.observe((event) => {\n event.changes.keys.forEach((change, key) => {\n if (!(key in this.editor.storage.image.media)) {\n const fileData = metaMap.get(key);\n this.editor.storage.image.media[key] = fileData;\n }\n });\n });\n\n return [syncPlugin, undoPlugin];\n },\n\n addCommands() {\n return {\n undo:\n () =>\n ({ tr, state, dispatch }) => {\n tr.setMeta('preventDispatch', true);\n tr.setMeta('inputType', 'historyUndo');\n const undoManager = yUndoPluginKey.getState(state).undoManager;\n if (undoManager.undoStack.length === 0) return false;\n if (!dispatch) return true;\n return undo(state);\n },\n redo:\n () =>\n ({ tr, state, dispatch }) => {\n tr.setMeta('preventDispatch', true);\n tr.setMeta('inputType', 'historyRedo');\n const undoManager = yUndoPluginKey.getState(state).undoManager;\n if (undoManager.redoStack.length === 0) return false;\n if (!dispatch) return true;\n return redo(state);\n },\n addImageToCollaboration:\n ({ mediaPath, fileData }) =>\n () => {\n if (!this.options.ydoc) return;\n const mediaMap = this.options.ydoc.getMap('media');\n mediaMap.set(mediaPath, fileData);\n },\n };\n },\n\n addShortcuts() {\n return {\n 'Mod-z': () => this.editor.commands.undo(),\n 'Mod-Shift-z': () => this.editor.commands.redo(),\n 'Mod-y': () => this.editor.commands.redo(),\n };\n },\n});\n\nconst createSyncPlugin = (ydoc, editor) => {\n const fragment = ydoc.getXmlFragment('supereditor');\n\n const onFirstRender = () => {\n if (!editor.options.isNewFile) return;\n const metaMap = ydoc.getMap('meta');\n metaMap.set('docx', editor.options.content);\n metaMap.set('fonts', editor.options.fonts);\n };\n\n return [ySyncPlugin(fragment, { onFirstRender }), fragment];\n};\n\nconst createUndoPlugin = () => {\n const yUndoPluginInstance = yUndoPlugin();\n return yUndoPluginInstance;\n};\n\nconst initDocumentLockHandler = (ydoc, editor) => {\n const metaMap = ydoc.getMap('meta');\n metaMap.observe((event) => {\n const lockedBy = metaMap.get('lockedBy');\n const isLocked = metaMap.get('locked');\n if (!editor.options.user || !lockedBy) return;\n const emitEvent = lockedBy?.email !== editor.options.user?.email;\n\n // If the event was initiated by this user, don't emit anything\n const editableChanged = editor.options.editable !== !isLocked;\n if (!emitEvent || !editableChanged) return;\n\n // Otherwise, we need to emit the event for all other users\n if (isLocked) {\n console.debug('--- Locking editor ---', lockedBy, editor.options.user);\n } else {\n console.debug('--- Unlocking editor ---', lockedBy);\n }\n editor.setEditable(!isLocked);\n editor.emit('locked', { editor, isLocked, lockedBy });\n });\n};\n\nconst initSyncListener = (ydoc, editor, extension) => {\n const provider = editor.options.collaborationProvider;\n if (!provider) return;\n\n const emit = () => {\n extension.options.isReady = true;\n provider.off('synced', emit);\n editor.emit('collaborationReady', { editor, ydoc });\n };\n\n if (provider.synced) {\n setTimeout(() => {\n emit();\n }, 250);\n return;\n }\n provider.on('synced', emit);\n};\n","import { Extension } from '@core/index.js';\nimport { yCursorPlugin } from 'y-prosemirror';\n\nexport const CollaborationCursor = Extension.create({\n name: 'collaborationCursor',\n\n priority: 999,\n\n addOptions() {\n return {\n provider: null,\n user: {\n name: null,\n color: null,\n },\n };\n },\n\n addStorage() {\n return {\n users: [],\n };\n },\n\n addPmPlugins() {\n const { collaborationProvider: provider = null } = this.editor.options;\n if (!provider) return [];\n\n return [yCursorPlugin(provider.awareness, { cursorBuilder: customCursors })];\n },\n});\n\nconst customCursors = (user) => {\n const cursor = document.createElement('span');\n cursor.classList.add('ProseMirror-yjs-cursor');\n cursor.setAttribute('style', `border-color: ${user.color}`);\n\n const userDiv = document.createElement('div');\n userDiv.setAttribute('style', `background-color: ${user.color}`);\n userDiv.insertBefore(document.createTextNode(user.name || user.email), null);\n cursor.insertBefore(userDiv, null);\n return cursor;\n};\n","import { Node } from '@core/index.js';\n\nexport const Document = Node.create({\n name: 'doc',\n\n topNode: true,\n\n content: 'block+',\n\n parseDOM() {\n return [{ tag: 'doc' }];\n },\n\n renderDOM() {\n return ['doc', 0];\n },\n\n addAttributes() {\n return {\n attributes: {\n rendered: false,\n },\n };\n },\n});\n","import { Node } from '@core/index.js';\n\nexport const Text = Node.create({\n name: 'text',\n group: 'inline',\n inline: true,\n});\n","import { Node } from '@core/index.js';\n\nexport const RunItem = Node.create({\n name: 'run',\n\n group: 'inline',\n\n content: 'text*',\n\n inline: true,\n\n parseDOM() {\n return [{ tag: 'run' }];\n },\n\n renderDOM() {\n return ['run', 0];\n },\n\n addAttributes() {\n return {\n attributes: {\n rendered: false,\n },\n };\n },\n});\n","import { Node, Attribute } from '@core/index.js';\nimport { generateDocxListAttributes } from '@helpers/index.js';\n\nexport const BulletList = Node.create({\n name: 'bulletList',\n\n group: 'block list',\n\n content() {\n return `${this.options.itemTypeName}+`;\n },\n\n addOptions() {\n return {\n itemTypeName: 'listItem',\n htmlAttributes: {},\n keepMarks: true,\n };\n },\n\n parseDOM() {\n return [{ tag: 'ul' }];\n },\n\n renderDOM({ htmlAttributes }) {\n const attributes = Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes);\n return ['ul', attributes, 0];\n },\n\n addAttributes() {\n return {\n 'list-style-type': {\n default: 'bullet',\n rendered: false,\n },\n\n attributes: {\n rendered: false,\n keepOnSplit: true,\n },\n };\n },\n\n addCommands() {\n return {\n toggleBulletList: () => (props) => {\n const { commands, chain } = props;\n const attributes = generateDocxListAttributes('bulletList');\n console.debug('[bulletList] Toggling bullet list', attributes);\n return commands.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks, attributes);\n },\n };\n },\n\n addShortcuts() {\n return {\n 'Mod-Shift-8': () => {\n return this.editor.commands.toggleBulletList();\n },\n };\n },\n\n // Input rules.\n});\n","import { Plugin, PluginKey } from 'prosemirror-state';\n\n/**\n * Synchronizes order attribute if lists have the same syncId.\n */\nexport function orderedListSync(options = {}) {\n return new Plugin({\n key: new PluginKey('orderedListSync'),\n\n appendTransaction: (transactions, oldState, newState) => {\n let docChanges = transactions.some((tr) => tr.docChanged) && !oldState.doc.eq(newState.doc);\n\n if (!docChanges) {\n return;\n }\n\n let { doc, tr } = newState;\n\n let listsBySyncId = {};\n doc.descendants((node, pos) => {\n if (node.type.name === 'orderedList' && !!node.attrs.syncId) {\n let syncId = node.attrs.syncId;\n if (!listsBySyncId[syncId]) listsBySyncId[syncId] = [];\n listsBySyncId[syncId].push({ node, pos });\n }\n });\n\n let hasListsToSync = !!Object.keys(listsBySyncId).length;\n\n if (!hasListsToSync) {\n return;\n }\n\n let changed = false;\n Object.entries(listsBySyncId).forEach(([_syncId, lists]) => {\n // If there are less than 2 lists, then we have nothing to sync.\n if (lists.length < 2) {\n let [firstList] = lists;\n tr.setNodeMarkup(firstList.pos, undefined, {\n ...firstList.node.attrs,\n syncId: null,\n });\n\n changed = true;\n return;\n }\n\n let [firstList] = lists;\n let currentOrder = firstList.node.attrs.order;\n\n lists.forEach((list, index) => {\n // Skip the first list.\n if (index === 0) return;\n\n let { node, pos } = list;\n let prevList = lists[index - 1];\n let newOrder = currentOrder + prevList.node.childCount;\n\n if (node.attrs.order !== newOrder) {\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n order: newOrder,\n });\n changed = true;\n }\n\n currentOrder = newOrder;\n });\n });\n\n return changed ? tr : null;\n },\n });\n}\n","import { Plugin, PluginKey } from 'prosemirror-state';\n\nexport function orderedListMarker(options = {}) {\n return new Plugin({\n key: new PluginKey('orderedListMarker'),\n\n appendTransaction: (transactions, oldState, newState) => {\n let docChanges = transactions.some((tr) => tr.docChanged) && !oldState.doc.eq(newState.doc);\n\n if (!docChanges) {\n return;\n }\n\n let { doc, tr } = newState;\n let listItemsByList = getOrderedListItemsByList(newState);\n\n if (!listItemsByList.size) {\n return;\n }\n\n let changed = false;\n Array.from(listItemsByList).forEach(([list, items]) => {\n let listItems = items;\n let isBulletList = list.type.name === 'bulletList';\n let listHasSyncId = !!list.attrs.syncId; // Lists with syncId?\n let listHasItemsWithoutAttrs = list.childCount !== listItems.length;\n\n // If the list was toggled to a bullet list,\n // then remove ordered marker attrs from list items.\n if (isBulletList) {\n listItems.forEach((item) => removeListItemMarkerAttrs(tr, item));\n changed = true;\n return;\n }\n\n // If the current list has items without the marker attrs,\n // then get all items and update listItems.\n if (listHasItemsWithoutAttrs) {\n let allItems = getAllChildListItemsOfList({ state: newState, list });\n if (allItems.length) listItems = allItems;\n }\n\n let firstItem = listItems[0];\n let firstItemAttrs = buildFirstListItemAttrs({ state: newState, listItems });\n\n let defaultAttrs = createMarkerAttrs();\n let currentAttrs = {\n lvlText: firstItem.node.attrs.lvlText ?? defaultAttrs.lvlText,\n listLevel: firstItem.node.attrs.listLevel ?? defaultAttrs.listLevel,\n listNumberingType: firstItem.node.attrs.listNumberingType ?? defaultAttrs.listNumberingType,\n };\n\n let equalFirstItemAttrs =\n currentAttrs.lvlText === firstItemAttrs.lvlText &&\n currentAttrs.listNumberingType === firstItemAttrs.listNumberingType &&\n compare(currentAttrs.listLevel, firstItemAttrs.listLevel);\n\n if (!equalFirstItemAttrs) {\n tr.setNodeMarkup(firstItem.pos, undefined, {\n ...firstItem.node.attrs,\n ...firstItemAttrs,\n });\n changed = true;\n currentAttrs = firstItemAttrs;\n }\n\n listItems.forEach((listItem, index) => {\n // Skip the first list item.\n if (index === 0) {\n return;\n }\n\n let { node, pos } = listItem;\n let { lvlText, listLevel, listNumberingType } = node.attrs;\n\n let newListLevel = [...currentAttrs.listLevel.slice(0, -1), currentAttrs.listLevel.at(-1) + 1];\n\n let equalMarkerAttrs =\n lvlText === currentAttrs.lvlText &&\n listNumberingType === currentAttrs.listNumberingType &&\n compare(listLevel, newListLevel);\n\n if (!equalMarkerAttrs) {\n let { selection, storedMarks } = newState;\n let marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks());\n\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n listLevel: newListLevel,\n lvlText: currentAttrs.lvlText,\n listNumberingType: currentAttrs.listNumberingType,\n });\n\n if (marks) {\n tr.ensureMarks(marks);\n }\n\n changed = true;\n }\n\n currentAttrs = {\n ...currentAttrs,\n listLevel: newListLevel,\n };\n });\n });\n\n return changed ? tr : null;\n },\n });\n}\n\nfunction getOrderedListItemsByList(state) {\n let { doc } = state;\n let map = new Map();\n doc.descendants((node, pos) => {\n let { attrs } = node;\n let isListItem = node.type.name === 'listItem';\n let hasListLevel = !!attrs.listLevel?.length;\n let hasLvlText = !!attrs.lvlText;\n let orderedType = attrs.listNumberingType && attrs.listNumberingType !== 'bullet';\n if (isListItem && hasListLevel && hasLvlText && orderedType) {\n let $pos = doc.resolve(pos);\n let list = $pos.parent;\n if (!map.get(list)) map.set(list, []);\n let items = map.get(list);\n items.push({ node, pos });\n }\n });\n return map;\n}\n\nfunction getAllChildListItemsOfList({ state, list }) {\n let { doc } = state;\n let allItems = [];\n doc.descendants((node, pos) => {\n let isListItem = node.type.name === 'listItem';\n let $pos = doc.resolve(pos);\n if (isListItem && $pos.parent === list) {\n allItems.push({ node, pos });\n }\n });\n return allItems;\n}\n\nfunction createMarkerAttrs({ lvlText = '', listLevel = [], listNumberingType = 'decimal' } = {}) {\n return {\n lvlText,\n listLevel,\n listNumberingType,\n };\n}\n\nfunction removeListItemMarkerAttrs(tr, listItem) {\n let { pos, node } = listItem;\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n lvlText: null,\n listLevel: null,\n listNumberingType: null,\n });\n}\n\nfunction compare(a1, a2) {\n return a1.length === a2.length && a1.every((item, index) => item === a2[index]);\n}\n\n// This is the place where we can check\n// the first item attributes and patch them as needed.\nfunction buildFirstListItemAttrs({ state, listItems }) {\n let { doc } = state;\n let firstItem = listItems[0];\n let { lvlText, listLevel, listNumberingType } = firstItem.node.attrs;\n\n let defaultAttrs = createMarkerAttrs({\n lvlText: '%1.',\n listLevel: [1],\n listNumberingType: 'decimal',\n });\n\n let $itemPos = doc.resolve(firstItem.pos);\n let listDepth = $itemPos.depth - 1; // listItem depth - 1\n let listLevelValue = listDepth / 2;\n\n let itemHasAllAttrs = lvlText && listLevel?.length && listNumberingType;\n\n if (!itemHasAllAttrs) {\n // Set default attributes.\n ({ lvlText, listLevel, listNumberingType } = defaultAttrs);\n } else {\n let firstLevel = listLevelValue === 0;\n let nestedList = listLevelValue > 0;\n\n if (nestedList && listLevelValue >= 3) {\n // Set default attributes.\n ({ lvlText, listLevel, listNumberingType } = defaultAttrs);\n } else if (nestedList && listLevelValue < 3) {\n // Update listLevel to always start at 1.\n // [6] -> [1], [3, 3] -> [3, 1], etc.\n listLevel = [...listLevel.slice(0, -1), 1];\n }\n }\n\n return {\n lvlText,\n listLevel,\n listNumberingType,\n };\n}\n","import { Node, Attribute } from '@core/index.js';\nimport { toKebabCase } from '@harbour-enterprises/common';\nimport { generateDocxListAttributes, findParentNode } from '@helpers/index.js';\nimport { orderedListSync as orderedListSyncPlugin } from './helpers/orderedListSyncPlugin.js';\nimport { orderedListMarker as orderedListMarkerPlugin } from './helpers/orderedListMarkerPlugin.js';\n\nexport const OrderedList = Node.create({\n name: 'orderedList',\n\n group: 'block list',\n\n content() {\n return `${this.options.itemTypeName}+`;\n },\n\n addOptions() {\n return {\n itemTypeName: 'listItem',\n htmlAttributes: {},\n keepMarks: true,\n listStyleTypes: ['decimal', 'lowerAlpha', 'lowerRoman'],\n };\n },\n\n addAttributes() {\n return {\n order: {\n default: 1,\n parseDOM: (element) => {\n return element.hasAttribute('start') ? parseInt(element.getAttribute('start') || '', 10) : 1;\n },\n renderDOM: (attrs) => {\n return {\n start: attrs.order,\n };\n },\n },\n\n syncId: {\n default: null,\n parseDOM: (elem) => elem.getAttribute('data-sync-id'),\n renderDOM: (attrs) => {\n if (!attrs.syncId) return {};\n return {\n 'data-sync-id': attrs.syncId,\n };\n },\n // rendered: false,\n },\n\n 'list-style-type': {\n default: 'decimal',\n renderDOM: (attrs) => {\n let listStyleType = attrs['list-style-type'];\n if (!listStyleType) return {};\n\n if (listStyleType === 'lowerLetter') {\n listStyleType = 'lowerAlpha';\n }\n\n return {\n style: `list-style-type: ${toKebabCase(listStyleType)};`,\n };\n },\n },\n\n attributes: {\n rendered: false,\n keepOnSplit: true,\n },\n };\n },\n\n parseDOM() {\n return [{ tag: 'ol' }];\n },\n\n renderDOM({ htmlAttributes }) {\n const { start, ...restAttributes } = htmlAttributes;\n\n return start === 1\n ? ['ol', Attribute.mergeAttributes(this.options.htmlAttributes, restAttributes), 0]\n : ['ol', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n\n addCommands() {\n return {\n toggleOrderedList:\n () =>\n ({ commands }) => {\n const attributes = generateDocxListAttributes('orderedList');\n return commands.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks, attributes);\n },\n\n /**\n * Updates ordered list style type when sink or lift `listItem`.\n * @example 1,2,3 -> a,b,c -> i,ii,iii -> 1,2,3 -> etc\n */\n updateOrderedListStyleType:\n () =>\n ({ dispatch, state, tr }) => {\n let list = findParentNode((node) => node.type.name === this.name)(state.selection);\n\n if (!list) {\n return true;\n }\n\n if (dispatch) {\n // Each list level increases depth by 2.\n let listLevel = (list.depth - 1) / 2;\n let listStyleTypes = this.options.listStyleTypes;\n let listStyle = listStyleTypes[listLevel % listStyleTypes.length];\n let currentListStyle = list.node.attrs['list-style-type'];\n let nodeAtPos = tr.doc.nodeAt(list.pos);\n\n if (currentListStyle !== listStyle && nodeAtPos.eq(list.node)) {\n tr.setNodeMarkup(list.pos, undefined, {\n ...list.node.attrs,\n ...{\n 'list-style-type': listStyle,\n },\n });\n }\n }\n\n return true;\n },\n\n /**\n * Continue list numbering after `liftEmptyBlock` command.\n * @example\n * <ol start=\"1\">\n * <li>item</li>\n * <li>item</li>\n * </ol>\n * <ol start=\"3\">\n * <li>item</li>\n * <li>item</li>\n * </ol>\n */\n liftEmptyBlockAndContinueListOrder:\n () =>\n ({ editor, dispatch, state, tr, commands }) => {\n let list = findParentNode((node) => node.type.name === this.name)(state.selection);\n\n if (!list) {\n return false;\n }\n\n let canLiftEmptyBlock = editor.can().liftEmptyBlock();\n let isRootDepth = list.depth === 1; // Only first level lists.\n let isOneItem = list.node.childCount === 1;\n let currentListItem = state.selection.$from.node(-1);\n let isLastItem = list.node.lastChild.eq(currentListItem);\n\n let canRunCommand = canLiftEmptyBlock && isRootDepth && !isOneItem && !isLastItem;\n\n if (!canRunCommand) {\n return false;\n }\n\n if (dispatch) {\n // Save pos before liftEmptyBlock command.\n let prevListPos = list.pos;\n\n if (!commands.liftEmptyBlock(state, dispatch)) {\n return false;\n }\n\n let { $from } = tr.selection;\n let prevListNode = tr.doc.nodeAt(prevListPos);\n let newListPos = $from.after();\n let newListNode = tr.doc.nodeAt(newListPos);\n\n let isPrevOrderedList = prevListNode?.type.name === this.name;\n let isNewOrderedList = newListNode?.type.name === this.name;\n\n if (isPrevOrderedList && isNewOrderedList) {\n let lastOrder = prevListNode.attrs.order || 1;\n let lastIndex = prevListNode.childCount;\n let lastSyncId = prevListNode.attrs.syncId;\n let newOrder = lastIndex + lastOrder;\n let syncId = !!lastSyncId ? lastSyncId : randomId();\n\n tr.setNodeMarkup(newListPos, undefined, {\n ...newListNode.attrs,\n order: newOrder,\n syncId,\n });\n\n if (!lastSyncId) {\n tr.setNodeMarkup(prevListPos, undefined, {\n ...prevListNode.attrs,\n syncId,\n });\n }\n }\n }\n\n return true;\n },\n };\n },\n\n addShortcuts() {\n return {\n 'Mod-Shift-7': () => {\n return this.editor.commands.toggleOrderedList();\n },\n Enter: () => {\n return this.editor.commands.liftEmptyBlockAndContinueListOrder();\n },\n };\n },\n\n addPmPlugins() {\n return [orderedListMarkerPlugin(), orderedListSyncPlugin()];\n },\n});\n\nfunction randomId() {\n return Math.floor(Math.random() * 0xffffffff).toString();\n}\n","export const generateOrderedListIndex = ({ listLevel, lvlText, listNumberingType }) => {\n const handler = listIndexMap[listNumberingType];\n return handler ? handler(listLevel, lvlText) : null;\n};\n\nconst handleDecimal = (path, lvlText) => generateNumbering(path, lvlText, String);\nconst handleRoman = (path, lvlText) => generateNumbering(path, lvlText, intToRoman);\nconst handleLowerRoman = (path, lvlText) => handleRoman(path, lvlText).toLowerCase();\nconst handleLowerAlpha = (path, lvlText) => handleAlpha(path, lvlText).toLowerCase();\nconst handleAlpha = (path, lvlText) => generateNumbering(path, lvlText, (p) => intToAlpha(p));\n\nconst listIndexMap = {\n decimal: handleDecimal,\n lowerRoman: handleLowerRoman,\n upperRoman: handleRoman,\n lowerLetter: handleLowerAlpha,\n upperLetter: handleAlpha,\n};\n\nconst createNumbering = (values, lvlText) => {\n return values.reduce((acc, value, index) => {\n return acc.replace(`%${index + 1}`, value);\n }, lvlText);\n};\n\nconst generateNumbering = (path, lvlText, formatter) => {\n const formattedValues = path.map(formatter);\n return createNumbering(formattedValues, lvlText);\n};\n\n/**\n * Convert a number to a roman numeral\n * @param {Integer} num\n * @returns {String}\n */\nconst intToRoman = (num) => {\n const romanNumeralMap = [\n { value: 1000, numeral: 'M' },\n { value: 900, numeral: 'CM' },\n { value: 500, numeral: 'D' },\n { value: 400, numeral: 'CD' },\n { value: 100, numeral: 'C' },\n { value: 90, numeral: 'XC' },\n { value: 50, numeral: 'L' },\n { value: 40, numeral: 'XL' },\n { value: 10, numeral: 'X' },\n { value: 9, numeral: 'IX' },\n { value: 5, numeral: 'V' },\n { value: 4, numeral: 'IV' },\n { value: 1, numeral: 'I' },\n ];\n\n let result = '';\n for (const { value, numeral } of romanNumeralMap) {\n while (num >= value) {\n result += numeral;\n num -= value;\n }\n }\n return result;\n};\n\n/**\n * Convert a number to an alphabetic character\n * @param {Integer} num\n * @returns {String}\n */\nconst intToAlpha = (num) => {\n let result = '';\n const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n while (num > 0) {\n let index = (num - 1) % 26;\n result = alphabet[index] + result;\n num = Math.floor((num - 1) / 26);\n }\n return result;\n};\n","import { Plugin, PluginKey } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { Attribute } from '@core/index.js';\nimport { findChildren, getMarkType } from '@core/helpers/index.js';\nimport { parseSizeUnit } from '@core/utilities/index.js';\n\nexport function styledListMarker(options = {}) {\n return new Plugin({\n key: new PluginKey('styledListMarker'),\n\n state: {\n init(_, state) {\n const decorations = [\n ...getListMarkerDecorations(state),\n ...getListItemStylingFromParagraphProps(state),\n ];\n return DecorationSet.create(state.doc, decorations);\n },\n\n apply(tr, oldDecorationSet, oldState, newState) {\n if (!tr.docChanged) return oldDecorationSet;\n const decorations = [\n ...getListMarkerDecorations(newState),\n ...getListItemStylingFromParagraphProps(newState),\n ];\n return DecorationSet.create(newState.doc, decorations);\n },\n },\n\n props: {\n decorations(state) {\n return this.getState(state);\n },\n },\n });\n}\n\nfunction getListMarkerDecorations(state) {\n let { doc, storedMarks } = state;\n let decorations = [];\n\n let listItems = findChildren(doc, (node) => node.type.name === 'listItem');\n\n if (!listItems.length) {\n return decorations;\n }\n\n listItems.forEach(({ node, pos }) => {\n let textStyleMarks = [];\n let textStyleType = getMarkType('textStyle', doc.type.schema);\n let isEmptyListItem = checkListItemEmpty(node);\n\n if (isEmptyListItem && storedMarks) {\n let marks = storedMarks.filter((mark) => mark.type === textStyleType);\n textStyleMarks.push(...marks);\n } else {\n let marks = getListItemTextStyleMarks(node, doc, textStyleType);\n textStyleMarks.push(...marks);\n }\n\n let fontSize = null;\n let fontFamily = null;\n\n // We iterate over all found textStyle marks\n // and take the first style found.\n textStyleMarks.forEach((mark) => {\n let { attrs } = mark;\n\n if (attrs.fontSize && !fontSize) {\n let [value, unit] = parseSizeUnit(attrs.fontSize);\n if (!Number.isNaN(value)) {\n unit = unit ?? 'pt';\n fontSize = `${value}${unit}`;\n }\n }\n\n if (attrs.fontFamily && !fontFamily) {\n fontFamily = attrs.fontFamily;\n }\n });\n\n let fontSizeAttrs = {\n style: `--marker-font-size: ${fontSize ?? 'initial'}`,\n };\n let fontFamilyAttrs = {\n style: `--marker-font-family: ${fontFamily ?? 'initial'}`,\n };\n \n let attrs = Attribute.mergeAttributes(fontSizeAttrs, fontFamilyAttrs);\n\n let dec = Decoration.node(pos, pos + node.nodeSize, attrs);\n decorations.push(dec);\n });\n\n return decorations;\n}\n\nfunction getListItemStylingFromParagraphProps(state) {\n let { doc } = state;\n let decorations = [];\n let listItems = findChildren(doc, (node) => node.type.name === 'listItem');\n\n if (!listItems.length) {\n return decorations;\n }\n\n listItems.forEach(({ node, pos }) => {\n let spacingAttrs = {};\n \n if (node.attrs.spacing) {\n const { lineSpaceBefore, lineSpaceAfter, line } = node.attrs.spacing;\n const style = `\n ${lineSpaceBefore ? `margin-top: ${lineSpaceBefore}px;` : ''}\n ${lineSpaceAfter ? `margin-bottom: ${lineSpaceAfter}px;` : ''}\n ${line ? `line-height: ${line};` : ''}\n `.trim();\n \n spacingAttrs = {\n style\n };\n }\n\n let dec = Decoration.node(pos, pos + node.nodeSize, spacingAttrs);\n decorations.push(dec);\n });\n\n return decorations;\n}\n\nfunction getListItemTextStyleMarks(listItem, doc, markType) {\n let textStyleMarks = [];\n listItem.forEach((childNode) => {\n if (childNode.type.name !== 'paragraph') return;\n childNode.forEach((textNode) => {\n let isTextNode = textNode.type.name === 'text';\n let hasTextStyleMarks = markType.isInSet(textNode.marks);\n if (isTextNode && hasTextStyleMarks) {\n let marks = textNode.marks.filter((mark) => mark.type === markType);\n textStyleMarks.push(...marks);\n }\n });\n });\n return textStyleMarks;\n}\n\nfunction checkListItemEmpty(listItem) {\n return (\n listItem.childCount === 1 &&\n listItem.firstChild?.type.name === 'paragraph' &&\n listItem.firstChild?.content.size === 0\n );\n}\n","import { Node, Attribute } from '@core/index.js';\nimport { generateOrderedListIndex } from '@helpers/orderedListUtils.js';\nimport { styledListMarker as styledListMarkerPlugin } from './helpers/styledListMarkerPlugin.js';\n\nexport const ListItem = Node.create({\n name: 'listItem',\n\n content: 'paragraph* block*',\n\n defining: true,\n\n priority: 101, // to run listItem commands first\n\n addOptions() {\n return {\n htmlAttributes: {},\n bulletListTypeName: 'bulletList',\n orderedListTypeName: 'orderedList',\n };\n },\n\n parseDOM() {\n return [{ tag: 'li' }];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['li', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n\n addAttributes() {\n return {\n // Virtual attribute.\n markerType: {\n default: null,\n renderDOM: (attrs) => {\n let { listLevel, listNumberingType, lvlText } = attrs;\n let hasListLevel = !!listLevel?.length;\n\n if (!hasListLevel || !lvlText) {\n return {};\n }\n\n // MS Word has many custom ordered list options.\n // We need to generate the correct index here.\n let orderMarker = generateOrderedListIndex({\n listLevel,\n lvlText,\n listNumberingType,\n });\n\n if (!orderMarker) return {};\n\n return {\n 'data-marker-type': orderMarker,\n };\n },\n },\n\n lvlText: {\n default: null,\n rendered: false,\n },\n\n listNumberingType: {\n default: null,\n rendered: false,\n },\n\n listLevel: {\n default: null,\n rendered: false,\n },\n \n // JC = justification. Expect left, right, center\n lvlJc: {\n default: null,\n rendered: false,\n },\n\n // This will contain indentation and space info.\n // ie: w:left (left indent), w:hanging (hanging indent)\n listParagraphProperties: {\n default: null,\n rendered: false,\n },\n\n // This will contain run properties for the list item\n listRunProperties: {\n default: null,\n rendered: false,\n },\n\n // numbering.xml reference id\n numId: {\n default: null,\n rendered: false,\n },\n\n attributes: {\n rendered: false,\n },\n \n spacing: {\n default: null,\n rendered: false,\n }\n };\n },\n\n addShortcuts() {\n return {\n Enter: () => {\n return this.editor.commands.splitListItem(this.name);\n },\n 'Shift-Enter': () => {\n return this.editor.commands.first(({ commands }) => [\n () => commands.createParagraphNear(),\n () => commands.splitBlock(),\n ]);\n },\n Tab: () => {\n return this.editor.chain().sinkListItem(this.name).updateOrderedListStyleType().run();\n },\n 'Shift-Tab': () => {\n return this.editor.chain().liftListItem(this.name).updateOrderedListStyleType().run();\n },\n };\n },\n\n addPmPlugins() {\n return [styledListMarkerPlugin()];\n },\n});\n","import { Plugin, PluginKey } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { Extension } from '@core/Extension.js';\nimport { kebabCase } from '@harbour-enterprises/common';\nimport { findParentNode } from '@helpers/index.js';\n\nexport const LinkedStylesPluginKey = new PluginKey('linkedStyles');\n\nexport const LinkedStyles = Extension.create({\n name: 'linkedStyles',\n\n addPmPlugins() {\n return [createLinkedStylesPlugin(this.editor)];\n },\n\n addCommands() {\n return {\n setLinkedStyle: (style) => (params) => {\n if (!style) return;\n const { tr } = params;\n const selection = tr.selection;\n const { from, to } = selection;\n if (from === to) return;\n\n let pos = from;\n let paragraphNode = tr.doc.nodeAt(from);\n if (paragraphNode.type.name !== 'paragraph') {\n const parentNode = findParentNode((node) => node.type.name === 'paragraph')(tr.selection) || {};\n pos = parentNode.pos;\n paragraphNode = parentNode.node;\n };\n\n tr.setNodeMarkup(pos, undefined, {\n ...paragraphNode.attrs,\n styleId: style.id,\n });\n\n },\n }\n },\n\n});\n\n/**\n * The linked styles plugin\n */\nconst createLinkedStylesPlugin = (editor) => {\n return new Plugin({\n key: LinkedStylesPluginKey,\n state: {\n init(_, { doc, selection }) {\n if (!editor.converter || editor.options.mode !== 'docx') return {};\n const styles = editor.converter?.linkedStyles || [];\n return {\n styles,\n decorations: generateDecorations(editor.state?.doc, styles),\n };\n },\n apply(tr, prev, oldEditorState, newEditorState) {\n if (!editor.converter || editor.options.mode !== 'docx') return { ...prev };\n let decorations = prev.decorations || DecorationSet.empty;\n if (tr.docChanged) {\n const styles = LinkedStylesPluginKey.getState(editor.state).styles;\n decorations = generateDecorations(newEditorState.doc, styles);\n }\n\n return { ...prev, decorations };\n },\n },\n props: {\n decorations(state) {\n return LinkedStylesPluginKey.getState(state)?.decorations;\n }\n }\n })\n};\n\n/**\n * Generate style decorations for linked styles\n * \n * @param {Object} doc The current document object\n * @param {Array[Object]} styles The linked styles\n * @returns {DecorationSet} The decorations\n */\nconst generateDecorations = (doc, styles) => {\n const decorations = [];\n let lastStyleId = null;\n doc.descendants((node, pos) => {\n const { name } = node.type;\n\n // Track the current StyleId\n if (node?.attrs?.styleId) lastStyleId = node.attrs.styleId;\n if (name === 'paragraph' && !node.attrs?.styleId) lastStyleId = null;\n if (name !== 'text') return;\n\n const linkedStyle = getLinkedStyle(lastStyleId, styles);\n if (!linkedStyle) return;\n\n const styleString = generateLinkedStyleString(linkedStyle, node);\n if (!styleString) return;\n\n const decoration = Decoration.inline(pos, pos + node.nodeSize, { style: styleString });\n decorations.push(decoration);\n });\n return DecorationSet.create(doc, decorations);\n};\n\n/**\n * Convert the linked styles and current node marks into a decoration string\n * If the node contains a given mark, we don't override it with the linked style per MS Word behavior\n * \n * @param {Object} linkedStyle The linked style object\n * @param {Object} node The current node\n * @returns {String} The style string\n */\nexport const generateLinkedStyleString = (linkedStyle, node, includeSpacing = true) => {\n if (!linkedStyle?.definition?.styles) return '';\n const markValue = {};\n\n Object.entries(linkedStyle.definition.styles).forEach(([k, value]) => {\n const key = kebabCase(k); \n const flattenedMarks = [];\n\n // Flatten node marks (including text styles) for comparison\n node?.marks?.forEach((n) => {\n if (n.type.name === 'textStyle') {\n Object.entries(n.attrs).forEach(([styleKey, value]) => {\n const parsedKey = kebabCase(styleKey);\n if (!value) return;\n flattenedMarks.push({ key: parsedKey, value });\n });\n return;\n }\n\n flattenedMarks.push({ key: n.type.name, value: n.attrs[key] });\n });\n \n // Check if this node has the expected mark. If yes, we are not overriding it\n const mark = flattenedMarks.find((n) => n.key === key);\n\n // If no mark already in the node, we override the style\n if (!mark) {\n if (key === 'spacing' && includeSpacing) {\n const space = getSpacingStyle(value);\n Object.entries(space).forEach(([k, v]) => {\n markValue[k] = v;\n });\n } else if (key === 'indent' && includeSpacing) {\n const { leftIndent, rightIndent, firstLine } = value;\n if (leftIndent) markValue['margin-left'] = leftIndent + 'px';\n if (rightIndent) markValue['margin-right'] = rightIndent + 'px';\n if (firstLine) markValue['text-indent'] = firstLine + 'px';\n } else if (key === 'bold') {\n markValue['font-weight'] = 'bold';\n } else {\n markValue[key] = value;\n }\n }\n });\n\n return Object.entries(markValue).map(([key, value]) => `${key}: ${value}`).join(';');\n};\n\n/**\n * Get the (parsed) linked style from the styles.xml\n * \n * @param {String} styleId The styleId of the linked style\n * @param {Array[Object]} styles The styles array\n * @returns {Object} The linked style\n */\nconst getLinkedStyle = (styleId, styles = []) => {\n return styles.find((style) => style.id === styleId);\n};\n\nexport const getSpacingStyle = (spacing) => {\n const { lineSpaceBefore, lineSpaceAfter, line, lineRule } = spacing;\n return {\n 'margin-top': lineSpaceBefore + 'px',\n 'margin-bottom': lineSpaceAfter + 'px',\n 'line-height': line,\n };\n};\n\n/**\n * Convert spacing object to a style string\n * \n * @param {Object} spacing The spacing object\n * @returns {String} The style string\n */\nexport const getSpacingStyleString = (spacing) => {\n const { lineSpaceBefore, lineSpaceAfter, line, lineRule } = spacing;\n return `\n ${lineSpaceBefore ? `margin-top: ${lineSpaceBefore}px;` : ''}\n ${lineSpaceAfter ? `margin-bottom: ${lineSpaceAfter}px;` : ''}\n ${line ? `line-height: ${line};` : ''}\n `.trim();\n};\n\nexport const getQuickFormatList = (editor) => {\n if (!editor?.converter) return [];\n const styles = editor.converter.linkedStyles || [];\n return styles \n .filter((style) => {\n return style.type === 'paragraph' && style.definition.attrs;\n })\n .sort((a, b) => {\n return a.definition.attrs?.name.localeCompare(b.definition.attrs?.name);\n });\n};","import { Node, Attribute } from '@core/index.js';\nimport { getSpacingStyleString } from '@extensions/linked-styles/index.js';\n\nexport const Paragraph = Node.create({\n name: 'paragraph',\n\n priority: 1000,\n\n group: 'block',\n\n content: 'inline*',\n\n inline: false,\n\n addOptions() {\n return {\n htmlAttributes: {},\n };\n },\n\n addAttributes() {\n return {\n spacing: {\n renderDOM: (attrs) => {\n const { spacing } = attrs;\n if (!spacing) return {};\n\n const style = getSpacingStyleString(spacing);\n if (style) return { style };\n return {};\n },\n },\n indent: {\n renderDOM: ({ indent }) => {\n if (!indent) return {};\n const { left, right, firstLine } = indent;\n\n let style = '';\n if (left) style += `margin-left: ${left}px;`;\n if (right) style += `margin-right: ${right}px;`;\n if (firstLine) style += `text-indent: ${firstLine}px;`;\n\n return { style };\n },\n },\n styleId: { rendered: false },\n attributes: {\n rendered: false,\n },\n filename: { rendered: false },\n rsidRDefault: { rendered: false },\n };\n },\n\n parseDOM() {\n return [{ tag: 'p' }];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['p', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n});\n","import { Node, Attribute } from '@core/index.js';\n\nexport const Heading = Node.create({\n name: 'heading',\n\n group: 'block',\n\n content: 'inline*',\n\n defining: true,\n\n addOptions() {\n return {\n levels: [1, 2, 3, 4, 5, 6],\n htmlAttributes: {},\n };\n },\n\n addAttributes() {\n return {\n level: {\n default: 1,\n rendered: false,\n },\n };\n },\n\n parseDOM() {\n return this.options.levels.map((level) => ({\n tag: `h${level}`,\n attrs: { level },\n }));\n },\n\n renderDOM({ node, htmlAttributes }) {\n const hasLevel = this.options.levels.includes(node.attrs.level);\n const level = hasLevel ? node.attrs.level : this.options.levels[0];\n return [`h${level}`, Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n\n addCommands() {\n return {\n setHeading:\n (attributes) =>\n ({ commands }) => {\n const containsLevel = this.options.levels.includes(attributes.level);\n if (!containsLevel) return false;\n return commands.setNode(this.name, attributes);\n },\n toggleHeading:\n (attributes) =>\n ({ commands }) => {\n const containsLevel = this.options.levels.includes(attributes.level);\n if (!containsLevel) return false;\n return commands.toggleNode(this.name, 'paragraph', attributes);\n },\n };\n },\n\n addShortcuts() {\n return this.options.levels.reduce(\n (items, level) => ({\n ...items,\n ...{\n [`Mod-Alt-${level}`]: () => this.editor.commands.toggleHeading({ level }),\n },\n }),\n {},\n );\n },\n});\n","import { Node, Attribute } from '@core/index.js';\n\nexport const CommentRangeStart = Node.create({\n name: 'commentRangeStart',\n\n group: 'inline',\n\n inline: true,\n\n atom: true,\n\n selectable: false,\n\n draggable: false,\n\n parseDOM() {\n return [{ tag: 'commentRangeStart' }];\n },\n\n addOptions() {\n return {\n htmlAttributes: {\n contentEditable: 'false',\n }\n }\n },\n\n renderDOM({ htmlAttributes}) {\n return ['commentRangeStart', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes)];\n },\n\n addAttributes() {\n return {\n 'w:id': {\n rendered: false,\n },\n internal: {\n default: true,\n rendered: false,\n },\n };\n },\n});\n\nexport const CommentRangeEnd = Node.create({\n name: 'commentRangeEnd',\n\n group: 'inline',\n\n inline: true,\n\n atom: true,\n\n selectable: false,\n\n draggable: false,\n\n addOptions() {\n return {\n htmlAttributes: {\n contentEditable: 'false',\n }\n }\n },\n\n parseDOM() {\n return [{ tag: 'commentRangeEnd' }];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['commentRangeEnd', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes)];\n },\n\n addAttributes() {\n return {\n 'w:id': {\n rendered: false,\n },\n };\n },\n});\n\nexport const CommentReference = Node.create({\n name: 'commentReference',\n\n group: 'inline',\n\n inline: true,\n\n atom: true,\n\n selectable: false,\n\n draggable: false,\n\n addOptions() {\n return {\n htmlAttributes: {\n contentEditable: 'false',\n }\n }\n },\n\n parseDOM() {\n return [{ tag: 'commentReference' }];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['commentReference', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes)];\n },\n\n addAttributes() {\n return {\n attributes: {\n rendered: false,\n },\n };\n },\n});\n","import { Mark, Attribute } from '@core/index.js';\nimport { CommentMarkName } from './comments-constants.js';\n\nexport const CommentsMark = Mark.create({\n name: CommentMarkName,\n\n group: 'comments',\n\n excludes: \"\",\n\n addOptions() {\n return {\n htmlAttributes: { class: 'super-editor-comment' },\n };\n },\n\n addAttributes() {\n return {\n commentId: {},\n importedId: {},\n internal: {\n default: true,\n rendered: false,\n },\n };\n },\n\n parseDOM() {\n return [{ tag: CommentMarkName }];\n },\n\n renderDOM({ htmlAttributes}) {\n return [CommentMarkName, Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes)];\n },\n});\n","import { Node, Attribute } from '@core/index.js';\nimport { Plugin, PluginKey } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\n\nexport const TabNode = Node.create({\n name: 'tab',\n group: 'inline',\n inline: true,\n // need this prop so Prosemirror doesn't treat tab as an\n // empty node and doesn't insert separator after\n content: 'inline*',\n selectable: false,\n atom: true,\n\n addOptions() {\n return {\n htmlAttributes: {\n class: 'tab',\n // this works together with content prop:\n // since tab can't have content inside but content prop is defined I have to manually add attribute\n contentEditable: false,\n },\n };\n },\n\n parseDOM() {\n return [{ tag: 'span.tab' }];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['span', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n\n addAttributes() {\n return {\n tabSize: {\n renderDOM: ({ tabSize }) => {\n if (!tabSize) return {};\n const style = `width: ${tabSize}px;`;\n return { style };\n },\n },\n };\n },\n\n addPmPlugins() {\n const { view } = this.editor;\n const tabPlugin = new Plugin({\n name: 'tabPlugin',\n key: new PluginKey('tabPlugin'),\n state: {\n init(_, state) {\n let decorations = getTabDecorations(state, view);\n return DecorationSet.create(state.doc, decorations);\n },\n\n apply(tr, oldDecorationSet, oldState, newState) {\n if (!tr.docChanged) return oldDecorationSet;\n const decorations = getTabDecorations(newState, view);\n return DecorationSet.create(newState.doc, decorations);\n },\n },\n props: {\n decorations(state) {\n return this.getState(state);\n },\n },\n });\n return [tabPlugin];\n },\n});\n\nconst tabWidthPx = 48;\n\nconst getTabDecorations = (state, view) => {\n let decorations = [];\n state.doc.descendants((node, pos) => {\n if (node.type.name === 'tab') {\n let $pos = state.doc.resolve(pos);\n const prevNodeSize = $pos.nodeBefore?.nodeSize || 0;\n\n let textWidth = 0;\n\n try {\n view.state.doc.nodesBetween(pos - prevNodeSize - 1, pos - 1, (node, nodePos) => {\n if (node.isText && node.textContent !== ' ') {\n const textWidthForNode = calcTextWidth(view, nodePos);\n textWidth += textWidthForNode;\n }\n });\n } catch (e) {\n return;\n }\n\n const tabWidth = $pos.nodeBefore?.type.name === 'tab' ? tabWidthPx : tabWidthPx - (textWidth % tabWidthPx);\n const tabHeight = calcTabHeight($pos);\n\n decorations.push(\n Decoration.node(pos, pos + node.nodeSize, { style: `width: ${tabWidth}px; height: ${tabHeight};` }),\n );\n }\n });\n return decorations;\n};\n\nfunction calcTextWidth(view, pos) {\n const domNode = view.nodeDOM(pos);\n if (domNode) {\n const range = document.createRange();\n range.selectNodeContents(domNode);\n return range.getBoundingClientRect().width;\n }\n return 0;\n}\n\nfunction calcTabHeight(pos) {\n const ptToPxRatio = 1.333;\n const defaultFontSize = 16;\n const defaultLineHeight = 1.1;\n\n const blockParent = pos.node(1);\n const parentTextStyleMark = blockParent.firstChild.marks.find((mark) => mark.type.name === 'textStyle');\n\n const fontSize = parseInt(parentTextStyleMark?.attrs.fontSize) * ptToPxRatio || defaultFontSize;\n\n return `${fontSize * defaultLineHeight}px`;\n}\n","import { Node, Attribute } from '@core/index.js';\n\nexport const LineBreak = Node.create({\n name: 'lineBreak',\n\n group: 'inline',\n\n inline: true,\n\n parseDOM() {\n return [{ tag: 'br' }];\n },\n\n renderDOM() {\n return ['br', {}, 0];\n },\n});\n\nexport const HardBreak = Node.create({\n name: 'hardBreak',\n group: 'inline',\n inline: true,\n selectable: false,\n atom: true,\n\n addOptions() {\n return {\n htmlAttributes: {\n contentEditable: 'false',\n lineBreakType: 'page',\n },\n }\n },\n\n parseDOM() {\n return [{ tag: 'span' }];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['span', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes)];\n }\n});","export const getColStyleDeclaration = (minWidth, width) => {\n if (width) {\n // Apply the stored width unless it is below the configured minimum cell width.\n return ['width', `${Math.max(width, minWidth)}px`]\n }\n // Set the minimum with on the column if it has no stored width.\n return ['min-width', `${minWidth}px`]\n}\n","import { getColStyleDeclaration } from './tableHelpers/getColStyleDeclaration.js';\nimport { Attribute } from '@core/Attribute.js';\n\n/**\n * Source example.\n * https://github.com/ProseMirror/prosemirror-tables/blob/master/src/tableview.ts\n */\nexport const createTableView = ({ editor }) => {\n\n return class TableView {\n editor;\n\n node;\n\n dom;\n\n table;\n\n colgroup;\n\n contentDOM;\n\n cellMinWidth;\n\n constructor(node, cellMinWidth) {\n this.editor = editor;\n this.node = node;\n this.cellMinWidth = cellMinWidth;\n this.dom = document.createElement('div');\n this.dom.className = 'tableWrapper';\n this.table = this.dom.appendChild(document.createElement('table'));\n this.colgroup = this.table.appendChild(document.createElement('colgroup'));\n updateTable(this.editor, this.node, this.table);\n updateColumns(node, this.colgroup, this.table, cellMinWidth);\n this.contentDOM = this.table.appendChild(document.createElement('tbody'));\n }\n\n update(node) {\n if (node.type !== this.node.type) {\n return false;\n }\n\n this.node = node;\n updateTable(this.editor, node, this.table);\n updateColumns(node, this.colgroup, this.table, this.cellMinWidth);\n\n return true;\n }\n\n ignoreMutation(mutation) {\n return (\n mutation.type === 'attributes'\n && (mutation.target === this.table || this.colgroup.contains(mutation.target))\n );\n }\n }\n}\n\nexport function updateColumns(\n node,\n colgroup,\n table,\n cellMinWidth,\n overrideCol,\n overrideValue,\n) {\n let totalWidth = 0;\n let fixedWidth = true;\n let nextDOM = colgroup.firstChild;\n const row = node.firstChild;\n\n // if (!row) return;\n\n if (row !== null) {\n for (let i = 0, col = 0; i < row.childCount; i++) {\n const { colspan, colwidth } = row.child(i).attrs;\n \n for (let j = 0; j < colspan; j++, col++) {\n const hasWidth = overrideCol === col ? overrideValue : (colwidth && colwidth[j]);\n const cssWidth = hasWidth ? `${hasWidth}px` : '';\n totalWidth += hasWidth || cellMinWidth;\n if (!hasWidth) fixedWidth = false;\n\n if (!nextDOM) {\n const col = document.createElement('col')\n const [propKey, propVal] = getColStyleDeclaration(cellMinWidth, hasWidth);\n col.style.setProperty(propKey, propVal);\n colgroup.appendChild(col);\n } else {\n if (nextDOM.style.width !== cssWidth) {\n const [propKey, propVal] = getColStyleDeclaration(cellMinWidth, hasWidth);\n nextDOM.style.setProperty(propKey, propVal);\n }\n\n nextDOM = nextDOM.nextSibling;\n }\n }\n }\n }\n\n while (nextDOM) {\n const after = nextDOM.nextSibling;\n nextDOM.parentNode?.removeChild(nextDOM);\n nextDOM = after;\n }\n\n if (fixedWidth) {\n table.style.width = `${totalWidth}px`;\n table.style.minWidth = '';\n } else {\n table.style.width = '';\n table.style.minWidth = `${totalWidth}px`;\n }\n}\n\nfunction updateTable(editor, node, table) {\n const allExtensionsAttrs = editor.extensionService.attributes;\n const tableExtensionAttrs = allExtensionsAttrs.filter((e) => e.type === 'table');\n const htmlAttributes = Attribute.getAttributesToRender(node, tableExtensionAttrs);\n Object.entries(htmlAttributes).forEach(([key, value]) => {\n table.setAttribute(key, value);\n });\n}\n","\nexport const createCell = (cellType, cellContent = null) => {\n if (cellContent) {\n return cellType.createChecked(null, cellContent);\n }\n return cellType.createAndFill();\n};\n","export const createTableBorders = ({ \n size = 0.66665,\n color = '#000000',\n} = {}) => {\n return {\n top: { size, color },\n left: { size, color },\n bottom: { size, color },\n right: { size, color },\n insideH: { size, color },\n insideV: { size, color },\n };\n};\n","import { getNodeType } from '@core/helpers/getNodeType.js';\nimport { createCell } from './createCell.js';\nimport { createTableBorders } from './createTableBorders.js';\n\nexport const createTable = (\n schema, \n rowsCount, \n colsCount, \n withHeaderRow, \n cellContent = null\n) => {\n const types = {\n table: getNodeType('table', schema),\n tableRow: getNodeType('tableRow', schema),\n tableCell: getNodeType('tableCell', schema),\n tableHeader: getNodeType('tableHeader', schema)\n };\n \n const headerCells = [];\n const cells = [];\n \n for (let index = 0; index < colsCount; index++) {\n const cell = createCell(types.tableCell, cellContent);\n if (cell) cells.push(cell);\n if (withHeaderRow) {\n const headerCell = createCell(types.tableHeader, cellContent);\n if (headerCell) {\n headerCells.push(headerCell);\n }\n }\n } \n\n const rows = [];\n \n for (let index = 0; index < rowsCount; index++) {\n const cellsToInsert = withHeaderRow && index === 0 ? headerCells : cells;\n rows.push(types.tableRow.createChecked(null, cellsToInsert));\n }\n \n const tableBorders = createTableBorders();\n\n return types.table.createChecked({ borders: tableBorders }, rows);\n};\n","import { getColStyleDeclaration } from './getColStyleDeclaration.js';\n\nexport const createColGroup = (node, cellMinWidth, overrideCol, overrideValue) => {\n let totalWidth = 0;\n let fixedWidth = true;\n \n const cols = [];\n const row = node.firstChild;\n\n if (!row) return {};\n\n for (let i = 0, col = 0; i < row.childCount; i++) {\n const { colspan, colwidth } = row.child(i).attrs;\n\n for (let j = 0; j < colspan; j++, col++) {\n const hasWidth = overrideCol === col ? overrideValue : colwidth && colwidth[j];\n totalWidth += hasWidth || cellMinWidth;\n if (!hasWidth) fixedWidth = false;\n const [prop, value] = getColStyleDeclaration(cellMinWidth, hasWidth);\n cols.push(['col', { style: `${prop}: ${value}` }]);\n }\n }\n\n const tableWidth = fixedWidth ? `${totalWidth}px` : '';\n const tableMinWidth = fixedWidth ? '' : `${totalWidth}px`;\n const colgroup = ['colgroup', {}, ...cols];\n\n return { \n colgroup, \n tableWidth, \n tableMinWidth, \n };\n};\n","// src/index.ts\nimport { Plugin as Plugin2 } from \"prosemirror-state\";\n\n// src/cellselection.ts\nimport { Fragment, Slice } from \"prosemirror-model\";\nimport {\n NodeSelection as NodeSelection2,\n Selection,\n SelectionRange,\n TextSelection\n} from \"prosemirror-state\";\nimport { Decoration, DecorationSet } from \"prosemirror-view\";\n\n// src/tablemap.ts\nvar readFromCache;\nvar addToCache;\nif (typeof WeakMap != \"undefined\") {\n let cache = /* @__PURE__ */ new WeakMap();\n readFromCache = (key) => cache.get(key);\n addToCache = (key, value) => {\n cache.set(key, value);\n return value;\n };\n} else {\n const cache = [];\n const cacheSize = 10;\n let cachePos = 0;\n readFromCache = (key) => {\n for (let i = 0; i < cache.length; i += 2)\n if (cache[i] == key) return cache[i + 1];\n };\n addToCache = (key, value) => {\n if (cachePos == cacheSize) cachePos = 0;\n cache[cachePos++] = key;\n return cache[cachePos++] = value;\n };\n}\nvar TableMap = class {\n constructor(width, height, map, problems) {\n this.width = width;\n this.height = height;\n this.map = map;\n this.problems = problems;\n }\n // Find the dimensions of the cell at the given position.\n findCell(pos) {\n for (let i = 0; i < this.map.length; i++) {\n const curPos = this.map[i];\n if (curPos != pos) continue;\n const left = i % this.width;\n const top = i / this.width | 0;\n let right = left + 1;\n let bottom = top + 1;\n for (let j = 1; right < this.width && this.map[i + j] == curPos; j++) {\n right++;\n }\n for (let j = 1; bottom < this.height && this.map[i + this.width * j] == curPos; j++) {\n bottom++;\n }\n return { left, top, right, bottom };\n }\n throw new RangeError(`No cell with offset ${pos} found`);\n }\n // Find the left side of the cell at the given position.\n colCount(pos) {\n for (let i = 0; i < this.map.length; i++) {\n if (this.map[i] == pos) {\n return i % this.width;\n }\n }\n throw new RangeError(`No cell with offset ${pos} found`);\n }\n // Find the next cell in the given direction, starting from the cell\n // at `pos`, if any.\n nextCell(pos, axis, dir) {\n const { left, right, top, bottom } = this.findCell(pos);\n if (axis == \"horiz\") {\n if (dir < 0 ? left == 0 : right == this.width) return null;\n return this.map[top * this.width + (dir < 0 ? left - 1 : right)];\n } else {\n if (dir < 0 ? top == 0 : bottom == this.height) return null;\n return this.map[left + this.width * (dir < 0 ? top - 1 : bottom)];\n }\n }\n // Get the rectangle spanning the two given cells.\n rectBetween(a, b) {\n const {\n left: leftA,\n right: rightA,\n top: topA,\n bottom: bottomA\n } = this.findCell(a);\n const {\n left: leftB,\n right: rightB,\n top: topB,\n bottom: bottomB\n } = this.findCell(b);\n return {\n left: Math.min(leftA, leftB),\n top: Math.min(topA, topB),\n right: Math.max(rightA, rightB),\n bottom: Math.max(bottomA, bottomB)\n };\n }\n // Return the position of all cells that have the top left corner in\n // the given rectangle.\n cellsInRect(rect) {\n const result = [];\n const seen = {};\n for (let row = rect.top; row < rect.bottom; row++) {\n for (let col = rect.left; col < rect.right; col++) {\n const index = row * this.width + col;\n const pos = this.map[index];\n if (seen[pos]) continue;\n seen[pos] = true;\n if (col == rect.left && col && this.map[index - 1] == pos || row == rect.top && row && this.map[index - this.width] == pos) {\n continue;\n }\n result.push(pos);\n }\n }\n return result;\n }\n // Return the position at which the cell at the given row and column\n // starts, or would start, if a cell started there.\n positionAt(row, col, table) {\n for (let i = 0, rowStart = 0; ; i++) {\n const rowEnd = rowStart + table.child(i).nodeSize;\n if (i == row) {\n let index = col + row * this.width;\n const rowEndIndex = (row + 1) * this.width;\n while (index < rowEndIndex && this.map[index] < rowStart) index++;\n return index == rowEndIndex ? rowEnd - 1 : this.map[index];\n }\n rowStart = rowEnd;\n }\n }\n // Find the table map for the given table node.\n static get(table) {\n return readFromCache(table) || addToCache(table, computeMap(table));\n }\n};\nfunction computeMap(table) {\n if (table.type.spec.tableRole != \"table\")\n throw new RangeError(\"Not a table node: \" + table.type.name);\n const width = findWidth(table), height = table.childCount;\n const map = [];\n let mapPos = 0;\n let problems = null;\n const colWidths = [];\n for (let i = 0, e = width * height; i < e; i++) map[i] = 0;\n for (let row = 0, pos = 0; row < height; row++) {\n const rowNode = table.child(row);\n pos++;\n for (let i = 0; ; i++) {\n while (mapPos < map.length && map[mapPos] != 0) mapPos++;\n if (i == rowNode.childCount) break;\n const cellNode = rowNode.child(i);\n const { colspan, rowspan, colwidth } = cellNode.attrs;\n for (let h = 0; h < rowspan; h++) {\n if (h + row >= height) {\n (problems || (problems = [])).push({\n type: \"overlong_rowspan\",\n pos,\n n: rowspan - h\n });\n break;\n }\n const start = mapPos + h * width;\n for (let w = 0; w < colspan; w++) {\n if (map[start + w] == 0) map[start + w] = pos;\n else\n (problems || (problems = [])).push({\n type: \"collision\",\n row,\n pos,\n n: colspan - w\n });\n const colW = colwidth && colwidth[w];\n if (colW) {\n const widthIndex = (start + w) % width * 2, prev = colWidths[widthIndex];\n if (prev == null || prev != colW && colWidths[widthIndex + 1] == 1) {\n colWidths[widthIndex] = colW;\n colWidths[widthIndex + 1] = 1;\n } else if (prev == colW) {\n colWidths[widthIndex + 1]++;\n }\n }\n }\n }\n mapPos += colspan;\n pos += cellNode.nodeSize;\n }\n const expectedPos = (row + 1) * width;\n let missing = 0;\n while (mapPos < expectedPos) if (map[mapPos++] == 0) missing++;\n if (missing)\n (problems || (problems = [])).push({ type: \"missing\", row, n: missing });\n pos++;\n }\n if (width === 0 || height === 0)\n (problems || (problems = [])).push({ type: \"zero_sized\" });\n const tableMap = new TableMap(width, height, map, problems);\n let badWidths = false;\n for (let i = 0; !badWidths && i < colWidths.length; i += 2)\n if (colWidths[i] != null && colWidths[i + 1] < height) badWidths = true;\n if (badWidths) findBadColWidths(tableMap, colWidths, table);\n return tableMap;\n}\nfunction findWidth(table) {\n let width = -1;\n let hasRowSpan = false;\n for (let row = 0; row < table.childCount; row++) {\n const rowNode = table.child(row);\n let rowWidth = 0;\n if (hasRowSpan)\n for (let j = 0; j < row; j++) {\n const prevRow = table.child(j);\n for (let i = 0; i < prevRow.childCount; i++) {\n const cell = prevRow.child(i);\n if (j + cell.attrs.rowspan > row) rowWidth += cell.attrs.colspan;\n }\n }\n for (let i = 0; i < rowNode.childCount; i++) {\n const cell = rowNode.child(i);\n rowWidth += cell.attrs.colspan;\n if (cell.attrs.rowspan > 1) hasRowSpan = true;\n }\n if (width == -1) width = rowWidth;\n else if (width != rowWidth) width = Math.max(width, rowWidth);\n }\n return width;\n}\nfunction findBadColWidths(map, colWidths, table) {\n if (!map.problems) map.problems = [];\n const seen = {};\n for (let i = 0; i < map.map.length; i++) {\n const pos = map.map[i];\n if (seen[pos]) continue;\n seen[pos] = true;\n const node = table.nodeAt(pos);\n if (!node) {\n throw new RangeError(`No cell with offset ${pos} found`);\n }\n let updated = null;\n const attrs = node.attrs;\n for (let j = 0; j < attrs.colspan; j++) {\n const col = (i + j) % map.width;\n const colWidth = colWidths[col * 2];\n if (colWidth != null && (!attrs.colwidth || attrs.colwidth[j] != colWidth))\n (updated || (updated = freshColWidth(attrs)))[j] = colWidth;\n }\n if (updated)\n map.problems.unshift({\n type: \"colwidth mismatch\",\n pos,\n colwidth: updated\n });\n }\n}\nfunction freshColWidth(attrs) {\n if (attrs.colwidth) return attrs.colwidth.slice();\n const result = [];\n for (let i = 0; i < attrs.colspan; i++) result.push(0);\n return result;\n}\n\n// src/util.ts\nimport { PluginKey } from \"prosemirror-state\";\n\n// src/schema.ts\nfunction getCellAttrs(dom, extraAttrs) {\n if (typeof dom === \"string\") {\n return {};\n }\n const widthAttr = dom.getAttribute(\"data-colwidth\");\n const widths = widthAttr && /^\\d+(,\\d+)*$/.test(widthAttr) ? widthAttr.split(\",\").map((s) => Number(s)) : null;\n const colspan = Number(dom.getAttribute(\"colspan\") || 1);\n const result = {\n colspan,\n rowspan: Number(dom.getAttribute(\"rowspan\") || 1),\n colwidth: widths && widths.length == colspan ? widths : null\n };\n for (const prop in extraAttrs) {\n const getter = extraAttrs[prop].getFromDOM;\n const value = getter && getter(dom);\n if (value != null) {\n result[prop] = value;\n }\n }\n return result;\n}\nfunction setCellAttrs(node, extraAttrs) {\n const attrs = {};\n if (node.attrs.colspan != 1) attrs.colspan = node.attrs.colspan;\n if (node.attrs.rowspan != 1) attrs.rowspan = node.attrs.rowspan;\n if (node.attrs.colwidth)\n attrs[\"data-colwidth\"] = node.attrs.colwidth.join(\",\");\n for (const prop in extraAttrs) {\n const setter = extraAttrs[prop].setDOMAttr;\n if (setter) setter(node.attrs[prop], attrs);\n }\n return attrs;\n}\nfunction tableNodes(options) {\n const extraAttrs = options.cellAttributes || {};\n const cellAttrs = {\n colspan: { default: 1 },\n rowspan: { default: 1 },\n colwidth: { default: null }\n };\n for (const prop in extraAttrs)\n cellAttrs[prop] = { default: extraAttrs[prop].default };\n return {\n table: {\n content: \"table_row+\",\n tableRole: \"table\",\n isolating: true,\n group: options.tableGroup,\n parseDOM: [{ tag: \"table\" }],\n toDOM() {\n return [\"table\", [\"tbody\", 0]];\n }\n },\n table_row: {\n content: \"(table_cell | table_header)*\",\n tableRole: \"row\",\n parseDOM: [{ tag: \"tr\" }],\n toDOM() {\n return [\"tr\", 0];\n }\n },\n table_cell: {\n content: options.cellContent,\n attrs: cellAttrs,\n tableRole: \"cell\",\n isolating: true,\n parseDOM: [\n { tag: \"td\", getAttrs: (dom) => getCellAttrs(dom, extraAttrs) }\n ],\n toDOM(node) {\n return [\"td\", setCellAttrs(node, extraAttrs), 0];\n }\n },\n table_header: {\n content: options.cellContent,\n attrs: cellAttrs,\n tableRole: \"header_cell\",\n isolating: true,\n parseDOM: [\n { tag: \"th\", getAttrs: (dom) => getCellAttrs(dom, extraAttrs) }\n ],\n toDOM(node) {\n return [\"th\", setCellAttrs(node, extraAttrs), 0];\n }\n }\n };\n}\nfunction tableNodeTypes(schema) {\n let result = schema.cached.tableNodeTypes;\n if (!result) {\n result = schema.cached.tableNodeTypes = {};\n for (const name in schema.nodes) {\n const type = schema.nodes[name], role = type.spec.tableRole;\n if (role) result[role] = type;\n }\n }\n return result;\n}\n\n// src/util.ts\nvar tableEditingKey = new PluginKey(\"selectingCells\");\nfunction cellAround($pos) {\n for (let d = $pos.depth - 1; d > 0; d--)\n if ($pos.node(d).type.spec.tableRole == \"row\")\n return $pos.node(0).resolve($pos.before(d + 1));\n return null;\n}\nfunction cellWrapping($pos) {\n for (let d = $pos.depth; d > 0; d--) {\n const role = $pos.node(d).type.spec.tableRole;\n if (role === \"cell\" || role === \"header_cell\") return $pos.node(d);\n }\n return null;\n}\nfunction isInTable(state) {\n const $head = state.selection.$head;\n for (let d = $head.depth; d > 0; d--)\n if ($head.node(d).type.spec.tableRole == \"row\") return true;\n return false;\n}\nfunction selectionCell(state) {\n const sel = state.selection;\n if (\"$anchorCell\" in sel && sel.$anchorCell) {\n return sel.$anchorCell.pos > sel.$headCell.pos ? sel.$anchorCell : sel.$headCell;\n } else if (\"node\" in sel && sel.node && sel.node.type.spec.tableRole == \"cell\") {\n return sel.$anchor;\n }\n const $cell = cellAround(sel.$head) || cellNear(sel.$head);\n if ($cell) {\n return $cell;\n }\n throw new RangeError(`No cell found around position ${sel.head}`);\n}\nfunction cellNear($pos) {\n for (let after = $pos.nodeAfter, pos = $pos.pos; after; after = after.firstChild, pos++) {\n const role = after.type.spec.tableRole;\n if (role == \"cell\" || role == \"header_cell\") return $pos.doc.resolve(pos);\n }\n for (let before = $pos.nodeBefore, pos = $pos.pos; before; before = before.lastChild, pos--) {\n const role = before.type.spec.tableRole;\n if (role == \"cell\" || role == \"header_cell\")\n return $pos.doc.resolve(pos - before.nodeSize);\n }\n}\nfunction pointsAtCell($pos) {\n return $pos.parent.type.spec.tableRole == \"row\" && !!$pos.nodeAfter;\n}\nfunction moveCellForward($pos) {\n return $pos.node(0).resolve($pos.pos + $pos.nodeAfter.nodeSize);\n}\nfunction inSameTable($cellA, $cellB) {\n return $cellA.depth == $cellB.depth && $cellA.pos >= $cellB.start(-1) && $cellA.pos <= $cellB.end(-1);\n}\nfunction findCell($pos) {\n return TableMap.get($pos.node(-1)).findCell($pos.pos - $pos.start(-1));\n}\nfunction colCount($pos) {\n return TableMap.get($pos.node(-1)).colCount($pos.pos - $pos.start(-1));\n}\nfunction nextCell($pos, axis, dir) {\n const table = $pos.node(-1);\n const map = TableMap.get(table);\n const tableStart = $pos.start(-1);\n const moved = map.nextCell($pos.pos - tableStart, axis, dir);\n return moved == null ? null : $pos.node(0).resolve(tableStart + moved);\n}\nfunction removeColSpan(attrs, pos, n = 1) {\n const result = { ...attrs, colspan: attrs.colspan - n };\n if (result.colwidth) {\n result.colwidth = result.colwidth.slice();\n result.colwidth.splice(pos, n);\n if (!result.colwidth.some((w) => w > 0)) result.colwidth = null;\n }\n return result;\n}\nfunction addColSpan(attrs, pos, n = 1) {\n const result = { ...attrs, colspan: attrs.colspan + n };\n if (result.colwidth) {\n result.colwidth = result.colwidth.slice();\n for (let i = 0; i < n; i++) result.colwidth.splice(pos, 0, 0);\n }\n return result;\n}\nfunction columnIsHeader(map, table, col) {\n const headerCell = tableNodeTypes(table.type.schema).header_cell;\n for (let row = 0; row < map.height; row++)\n if (table.nodeAt(map.map[col + row * map.width]).type != headerCell)\n return false;\n return true;\n}\n\n// src/cellselection.ts\nvar CellSelection = class _CellSelection extends Selection {\n // A table selection is identified by its anchor and head cells. The\n // positions given to this constructor should point _before_ two\n // cells in the same table. They may be the same, to select a single\n // cell.\n constructor($anchorCell, $headCell = $anchorCell) {\n const table = $anchorCell.node(-1);\n const map = TableMap.get(table);\n const tableStart = $anchorCell.start(-1);\n const rect = map.rectBetween(\n $anchorCell.pos - tableStart,\n $headCell.pos - tableStart\n );\n const doc = $anchorCell.node(0);\n const cells = map.cellsInRect(rect).filter((p) => p != $headCell.pos - tableStart);\n cells.unshift($headCell.pos - tableStart);\n const ranges = cells.map((pos) => {\n const cell = table.nodeAt(pos);\n if (!cell) {\n throw RangeError(`No cell with offset ${pos} found`);\n }\n const from = tableStart + pos + 1;\n return new SelectionRange(\n doc.resolve(from),\n doc.resolve(from + cell.content.size)\n );\n });\n super(ranges[0].$from, ranges[0].$to, ranges);\n this.$anchorCell = $anchorCell;\n this.$headCell = $headCell;\n }\n map(doc, mapping) {\n const $anchorCell = doc.resolve(mapping.map(this.$anchorCell.pos));\n const $headCell = doc.resolve(mapping.map(this.$headCell.pos));\n if (pointsAtCell($anchorCell) && pointsAtCell($headCell) && inSameTable($anchorCell, $headCell)) {\n const tableChanged = this.$anchorCell.node(-1) != $anchorCell.node(-1);\n if (tableChanged && this.isRowSelection())\n return _CellSelection.rowSelection($anchorCell, $headCell);\n else if (tableChanged && this.isColSelection())\n return _CellSelection.colSelection($anchorCell, $headCell);\n else return new _CellSelection($anchorCell, $headCell);\n }\n return TextSelection.between($anchorCell, $headCell);\n }\n // Returns a rectangular slice of table rows containing the selected\n // cells.\n content() {\n const table = this.$anchorCell.node(-1);\n const map = TableMap.get(table);\n const tableStart = this.$anchorCell.start(-1);\n const rect = map.rectBetween(\n this.$anchorCell.pos - tableStart,\n this.$headCell.pos - tableStart\n );\n const seen = {};\n const rows = [];\n for (let row = rect.top; row < rect.bottom; row++) {\n const rowContent = [];\n for (let index = row * map.width + rect.left, col = rect.left; col < rect.right; col++, index++) {\n const pos = map.map[index];\n if (seen[pos]) continue;\n seen[pos] = true;\n const cellRect = map.findCell(pos);\n let cell = table.nodeAt(pos);\n if (!cell) {\n throw RangeError(`No cell with offset ${pos} found`);\n }\n const extraLeft = rect.left - cellRect.left;\n const extraRight = cellRect.right - rect.right;\n if (extraLeft > 0 || extraRight > 0) {\n let attrs = cell.attrs;\n if (extraLeft > 0) {\n attrs = removeColSpan(attrs, 0, extraLeft);\n }\n if (extraRight > 0) {\n attrs = removeColSpan(\n attrs,\n attrs.colspan - extraRight,\n extraRight\n );\n }\n if (cellRect.left < rect.left) {\n cell = cell.type.createAndFill(attrs);\n if (!cell) {\n throw RangeError(\n `Could not create cell with attrs ${JSON.stringify(attrs)}`\n );\n }\n } else {\n cell = cell.type.create(attrs, cell.content);\n }\n }\n if (cellRect.top < rect.top || cellRect.bottom > rect.bottom) {\n const attrs = {\n ...cell.attrs,\n rowspan: Math.min(cellRect.bottom, rect.bottom) - Math.max(cellRect.top, rect.top)\n };\n if (cellRect.top < rect.top) {\n cell = cell.type.createAndFill(attrs);\n } else {\n cell = cell.type.create(attrs, cell.content);\n }\n }\n rowContent.push(cell);\n }\n rows.push(table.child(row).copy(Fragment.from(rowContent)));\n }\n const fragment = this.isColSelection() && this.isRowSelection() ? table : rows;\n return new Slice(Fragment.from(fragment), 1, 1);\n }\n replace(tr, content = Slice.empty) {\n const mapFrom = tr.steps.length, ranges = this.ranges;\n for (let i = 0; i < ranges.length; i++) {\n const { $from, $to } = ranges[i], mapping = tr.mapping.slice(mapFrom);\n tr.replace(\n mapping.map($from.pos),\n mapping.map($to.pos),\n i ? Slice.empty : content\n );\n }\n const sel = Selection.findFrom(\n tr.doc.resolve(tr.mapping.slice(mapFrom).map(this.to)),\n -1\n );\n if (sel) tr.setSelection(sel);\n }\n replaceWith(tr, node) {\n this.replace(tr, new Slice(Fragment.from(node), 0, 0));\n }\n forEachCell(f) {\n const table = this.$anchorCell.node(-1);\n const map = TableMap.get(table);\n const tableStart = this.$anchorCell.start(-1);\n const cells = map.cellsInRect(\n map.rectBetween(\n this.$anchorCell.pos - tableStart,\n this.$headCell.pos - tableStart\n )\n );\n for (let i = 0; i < cells.length; i++) {\n f(table.nodeAt(cells[i]), tableStart + cells[i]);\n }\n }\n // True if this selection goes all the way from the top to the\n // bottom of the table.\n isColSelection() {\n const anchorTop = this.$anchorCell.index(-1);\n const headTop = this.$headCell.index(-1);\n if (Math.min(anchorTop, headTop) > 0) return false;\n const anchorBottom = anchorTop + this.$anchorCell.nodeAfter.attrs.rowspan;\n const headBottom = headTop + this.$headCell.nodeAfter.attrs.rowspan;\n return Math.max(anchorBottom, headBottom) == this.$headCell.node(-1).childCount;\n }\n // Returns the smallest column selection that covers the given anchor\n // and head cell.\n static colSelection($anchorCell, $headCell = $anchorCell) {\n const table = $anchorCell.node(-1);\n const map = TableMap.get(table);\n const tableStart = $anchorCell.start(-1);\n const anchorRect = map.findCell($anchorCell.pos - tableStart);\n const headRect = map.findCell($headCell.pos - tableStart);\n const doc = $anchorCell.node(0);\n if (anchorRect.top <= headRect.top) {\n if (anchorRect.top > 0)\n $anchorCell = doc.resolve(tableStart + map.map[anchorRect.left]);\n if (headRect.bottom < map.height)\n $headCell = doc.resolve(\n tableStart + map.map[map.width * (map.height - 1) + headRect.right - 1]\n );\n } else {\n if (headRect.top > 0)\n $headCell = doc.resolve(tableStart + map.map[headRect.left]);\n if (anchorRect.bottom < map.height)\n $anchorCell = doc.resolve(\n tableStart + map.map[map.width * (map.height - 1) + anchorRect.right - 1]\n );\n }\n return new _CellSelection($anchorCell, $headCell);\n }\n // True if this selection goes all the way from the left to the\n // right of the table.\n isRowSelection() {\n const table = this.$anchorCell.node(-1);\n const map = TableMap.get(table);\n const tableStart = this.$anchorCell.start(-1);\n const anchorLeft = map.colCount(this.$anchorCell.pos - tableStart);\n const headLeft = map.colCount(this.$headCell.pos - tableStart);\n if (Math.min(anchorLeft, headLeft) > 0) return false;\n const anchorRight = anchorLeft + this.$anchorCell.nodeAfter.attrs.colspan;\n const headRight = headLeft + this.$headCell.nodeAfter.attrs.colspan;\n return Math.max(anchorRight, headRight) == map.width;\n }\n eq(other) {\n return other instanceof _CellSelection && other.$anchorCell.pos == this.$anchorCell.pos && other.$headCell.pos == this.$headCell.pos;\n }\n // Returns the smallest row selection that covers the given anchor\n // and head cell.\n static rowSelection($anchorCell, $headCell = $anchorCell) {\n const table = $anchorCell.node(-1);\n const map = TableMap.get(table);\n const tableStart = $anchorCell.start(-1);\n const anchorRect = map.findCell($anchorCell.pos - tableStart);\n const headRect = map.findCell($headCell.pos - tableStart);\n const doc = $anchorCell.node(0);\n if (anchorRect.left <= headRect.left) {\n if (anchorRect.left > 0)\n $anchorCell = doc.resolve(\n tableStart + map.map[anchorRect.top * map.width]\n );\n if (headRect.right < map.width)\n $headCell = doc.resolve(\n tableStart + map.map[map.width * (headRect.top + 1) - 1]\n );\n } else {\n if (headRect.left > 0)\n $headCell = doc.resolve(tableStart + map.map[headRect.top * map.width]);\n if (anchorRect.right < map.width)\n $anchorCell = doc.resolve(\n tableStart + map.map[map.width * (anchorRect.top + 1) - 1]\n );\n }\n return new _CellSelection($anchorCell, $headCell);\n }\n toJSON() {\n return {\n type: \"cell\",\n anchor: this.$anchorCell.pos,\n head: this.$headCell.pos\n };\n }\n static fromJSON(doc, json) {\n return new _CellSelection(doc.resolve(json.anchor), doc.resolve(json.head));\n }\n static create(doc, anchorCell, headCell = anchorCell) {\n return new _CellSelection(doc.resolve(anchorCell), doc.resolve(headCell));\n }\n getBookmark() {\n return new CellBookmark(this.$anchorCell.pos, this.$headCell.pos);\n }\n};\nCellSelection.prototype.visible = false;\nSelection.jsonID(\"cell\", CellSelection);\nvar CellBookmark = class _CellBookmark {\n constructor(anchor, head) {\n this.anchor = anchor;\n this.head = head;\n }\n map(mapping) {\n return new _CellBookmark(mapping.map(this.anchor), mapping.map(this.head));\n }\n resolve(doc) {\n const $anchorCell = doc.resolve(this.anchor), $headCell = doc.resolve(this.head);\n if ($anchorCell.parent.type.spec.tableRole == \"row\" && $headCell.parent.type.spec.tableRole == \"row\" && $anchorCell.index() < $anchorCell.parent.childCount && $headCell.index() < $headCell.parent.childCount && inSameTable($anchorCell, $headCell))\n return new CellSelection($anchorCell, $headCell);\n else return Selection.near($headCell, 1);\n }\n};\nfunction drawCellSelection(state) {\n if (!(state.selection instanceof CellSelection)) return null;\n const cells = [];\n state.selection.forEachCell((node, pos) => {\n cells.push(\n Decoration.node(pos, pos + node.nodeSize, { class: \"selectedCell\" })\n );\n });\n return DecorationSet.create(state.doc, cells);\n}\nfunction isCellBoundarySelection({ $from, $to }) {\n if ($from.pos == $to.pos || $from.pos < $to.pos - 6) return false;\n let afterFrom = $from.pos;\n let beforeTo = $to.pos;\n let depth = $from.depth;\n for (; depth >= 0; depth--, afterFrom++)\n if ($from.after(depth + 1) < $from.end(depth)) break;\n for (let d = $to.depth; d >= 0; d--, beforeTo--)\n if ($to.before(d + 1) > $to.start(d)) break;\n return afterFrom == beforeTo && /row|table/.test($from.node(depth).type.spec.tableRole);\n}\nfunction isTextSelectionAcrossCells({ $from, $to }) {\n let fromCellBoundaryNode;\n let toCellBoundaryNode;\n for (let i = $from.depth; i > 0; i--) {\n const node = $from.node(i);\n if (node.type.spec.tableRole === \"cell\" || node.type.spec.tableRole === \"header_cell\") {\n fromCellBoundaryNode = node;\n break;\n }\n }\n for (let i = $to.depth; i > 0; i--) {\n const node = $to.node(i);\n if (node.type.spec.tableRole === \"cell\" || node.type.spec.tableRole === \"header_cell\") {\n toCellBoundaryNode = node;\n break;\n }\n }\n return fromCellBoundaryNode !== toCellBoundaryNode && $to.parentOffset === 0;\n}\nfunction normalizeSelection(state, tr, allowTableNodeSelection) {\n const sel = (tr || state).selection;\n const doc = (tr || state).doc;\n let normalize;\n let role;\n if (sel instanceof NodeSelection2 && (role = sel.node.type.spec.tableRole)) {\n if (role == \"cell\" || role == \"header_cell\") {\n normalize = CellSelection.create(doc, sel.from);\n } else if (role == \"row\") {\n const $cell = doc.resolve(sel.from + 1);\n normalize = CellSelection.rowSelection($cell, $cell);\n } else if (!allowTableNodeSelection) {\n const map = TableMap.get(sel.node);\n const start = sel.from + 1;\n const lastCell = start + map.map[map.width * map.height - 1];\n normalize = CellSelection.create(doc, start + 1, lastCell);\n }\n } else if (sel instanceof TextSelection && isCellBoundarySelection(sel)) {\n normalize = TextSelection.create(doc, sel.from);\n } else if (sel instanceof TextSelection && isTextSelectionAcrossCells(sel)) {\n normalize = TextSelection.create(doc, sel.$from.start(), sel.$from.end());\n }\n if (normalize) (tr || (tr = state.tr)).setSelection(normalize);\n return tr;\n}\n\n// src/fixtables.ts\nimport { PluginKey as PluginKey2 } from \"prosemirror-state\";\nvar fixTablesKey = new PluginKey2(\"fix-tables\");\nfunction changedDescendants(old, cur, offset, f) {\n const oldSize = old.childCount, curSize = cur.childCount;\n outer: for (let i = 0, j = 0; i < curSize; i++) {\n const child = cur.child(i);\n for (let scan = j, e = Math.min(oldSize, i + 3); scan < e; scan++) {\n if (old.child(scan) == child) {\n j = scan + 1;\n offset += child.nodeSize;\n continue outer;\n }\n }\n f(child, offset);\n if (j < oldSize && old.child(j).sameMarkup(child))\n changedDescendants(old.child(j), child, offset + 1, f);\n else child.nodesBetween(0, child.content.size, f, offset + 1);\n offset += child.nodeSize;\n }\n}\nfunction fixTables(state, oldState) {\n let tr;\n const check = (node, pos) => {\n if (node.type.spec.tableRole == \"table\")\n tr = fixTable(state, node, pos, tr);\n };\n if (!oldState) state.doc.descendants(check);\n else if (oldState.doc != state.doc)\n changedDescendants(oldState.doc, state.doc, 0, check);\n return tr;\n}\nfunction fixTable(state, table, tablePos, tr) {\n const map = TableMap.get(table);\n if (!map.problems) return tr;\n if (!tr) tr = state.tr;\n const mustAdd = [];\n for (let i = 0; i < map.height; i++) mustAdd.push(0);\n for (let i = 0; i < map.problems.length; i++) {\n const prob = map.problems[i];\n if (prob.type == \"collision\") {\n const cell = table.nodeAt(prob.pos);\n if (!cell) continue;\n const attrs = cell.attrs;\n for (let j = 0; j < attrs.rowspan; j++) mustAdd[prob.row + j] += prob.n;\n tr.setNodeMarkup(\n tr.mapping.map(tablePos + 1 + prob.pos),\n null,\n removeColSpan(attrs, attrs.colspan - prob.n, prob.n)\n );\n } else if (prob.type == \"missing\") {\n mustAdd[prob.row] += prob.n;\n } else if (prob.type == \"overlong_rowspan\") {\n const cell = table.nodeAt(prob.pos);\n if (!cell) continue;\n tr.setNodeMarkup(tr.mapping.map(tablePos + 1 + prob.pos), null, {\n ...cell.attrs,\n rowspan: cell.attrs.rowspan - prob.n\n });\n } else if (prob.type == \"colwidth mismatch\") {\n const cell = table.nodeAt(prob.pos);\n if (!cell) continue;\n tr.setNodeMarkup(tr.mapping.map(tablePos + 1 + prob.pos), null, {\n ...cell.attrs,\n colwidth: prob.colwidth\n });\n } else if (prob.type == \"zero_sized\") {\n const pos = tr.mapping.map(tablePos);\n tr.delete(pos, pos + table.nodeSize);\n }\n }\n let first, last;\n for (let i = 0; i < mustAdd.length; i++)\n if (mustAdd[i]) {\n if (first == null) first = i;\n last = i;\n }\n for (let i = 0, pos = tablePos + 1; i < map.height; i++) {\n const row = table.child(i);\n const end = pos + row.nodeSize;\n const add = mustAdd[i];\n if (add > 0) {\n let role = \"cell\";\n if (row.firstChild) {\n role = row.firstChild.type.spec.tableRole;\n }\n const nodes = [];\n for (let j = 0; j < add; j++) {\n const node = tableNodeTypes(state.schema)[role].createAndFill();\n if (node) nodes.push(node);\n }\n const side = (i == 0 || first == i - 1) && last == i ? pos + 1 : end - 1;\n tr.insert(tr.mapping.map(side), nodes);\n }\n pos = end;\n }\n return tr.setMeta(fixTablesKey, { fixTables: true });\n}\n\n// src/input.ts\nimport { keydownHandler } from \"prosemirror-keymap\";\nimport { Fragment as Fragment4 } from \"prosemirror-model\";\nimport {\n Selection as Selection2,\n TextSelection as TextSelection3\n} from \"prosemirror-state\";\n\n// src/commands.ts\nimport {\n Fragment as Fragment2,\n Slice as Slice2\n} from \"prosemirror-model\";\nimport {\n TextSelection as TextSelection2\n} from \"prosemirror-state\";\nfunction selectedRect(state) {\n const sel = state.selection;\n const $pos = selectionCell(state);\n const table = $pos.node(-1);\n const tableStart = $pos.start(-1);\n const map = TableMap.get(table);\n const rect = sel instanceof CellSelection ? map.rectBetween(\n sel.$anchorCell.pos - tableStart,\n sel.$headCell.pos - tableStart\n ) : map.findCell($pos.pos - tableStart);\n return { ...rect, tableStart, map, table };\n}\nfunction addColumn(tr, { map, tableStart, table }, col) {\n let refColumn = col > 0 ? -1 : 0;\n if (columnIsHeader(map, table, col + refColumn)) {\n refColumn = col == 0 || col == map.width ? null : 0;\n }\n for (let row = 0; row < map.height; row++) {\n const index = row * map.width + col;\n if (col > 0 && col < map.width && map.map[index - 1] == map.map[index]) {\n const pos = map.map[index];\n const cell = table.nodeAt(pos);\n tr.setNodeMarkup(\n tr.mapping.map(tableStart + pos),\n null,\n addColSpan(cell.attrs, col - map.colCount(pos))\n );\n row += cell.attrs.rowspan - 1;\n } else {\n const type = refColumn == null ? tableNodeTypes(table.type.schema).cell : table.nodeAt(map.map[index + refColumn]).type;\n const pos = map.positionAt(row, col, table);\n tr.insert(tr.mapping.map(tableStart + pos), type.createAndFill());\n }\n }\n return tr;\n}\nfunction addColumnBefore(state, dispatch) {\n if (!isInTable(state)) return false;\n if (dispatch) {\n const rect = selectedRect(state);\n dispatch(addColumn(state.tr, rect, rect.left));\n }\n return true;\n}\nfunction addColumnAfter(state, dispatch) {\n if (!isInTable(state)) return false;\n if (dispatch) {\n const rect = selectedRect(state);\n dispatch(addColumn(state.tr, rect, rect.right));\n }\n return true;\n}\nfunction removeColumn(tr, { map, table, tableStart }, col) {\n const mapStart = tr.mapping.maps.length;\n for (let row = 0; row < map.height; ) {\n const index = row * map.width + col;\n const pos = map.map[index];\n const cell = table.nodeAt(pos);\n const attrs = cell.attrs;\n if (col > 0 && map.map[index - 1] == pos || col < map.width - 1 && map.map[index + 1] == pos) {\n tr.setNodeMarkup(\n tr.mapping.slice(mapStart).map(tableStart + pos),\n null,\n removeColSpan(attrs, col - map.colCount(pos))\n );\n } else {\n const start = tr.mapping.slice(mapStart).map(tableStart + pos);\n tr.delete(start, start + cell.nodeSize);\n }\n row += attrs.rowspan;\n }\n}\nfunction deleteColumn(state, dispatch) {\n if (!isInTable(state)) return false;\n if (dispatch) {\n const rect = selectedRect(state);\n const tr = state.tr;\n if (rect.left == 0 && rect.right == rect.map.width) return false;\n for (let i = rect.right - 1; ; i--) {\n removeColumn(tr, rect, i);\n if (i == rect.left) break;\n const table = rect.tableStart ? tr.doc.nodeAt(rect.tableStart - 1) : tr.doc;\n if (!table) {\n throw RangeError(\"No table found\");\n }\n rect.table = table;\n rect.map = TableMap.get(table);\n }\n dispatch(tr);\n }\n return true;\n}\nfunction rowIsHeader(map, table, row) {\n var _a;\n const headerCell = tableNodeTypes(table.type.schema).header_cell;\n for (let col = 0; col < map.width; col++)\n if (((_a = table.nodeAt(map.map[col + row * map.width])) == null ? void 0 : _a.type) != headerCell)\n return false;\n return true;\n}\nfunction addRow(tr, { map, tableStart, table }, row) {\n var _a;\n let rowPos = tableStart;\n for (let i = 0; i < row; i++) rowPos += table.child(i).nodeSize;\n const cells = [];\n let refRow = row > 0 ? -1 : 0;\n if (rowIsHeader(map, table, row + refRow))\n refRow = row == 0 || row == map.height ? null : 0;\n for (let col = 0, index = map.width * row; col < map.width; col++, index++) {\n if (row > 0 && row < map.height && map.map[index] == map.map[index - map.width]) {\n const pos = map.map[index];\n const attrs = table.nodeAt(pos).attrs;\n tr.setNodeMarkup(tableStart + pos, null, {\n ...attrs,\n rowspan: attrs.rowspan + 1\n });\n col += attrs.colspan - 1;\n } else {\n const type = refRow == null ? tableNodeTypes(table.type.schema).cell : (_a = table.nodeAt(map.map[index + refRow * map.width])) == null ? void 0 : _a.type;\n const node = type == null ? void 0 : type.createAndFill();\n if (node) cells.push(node);\n }\n }\n tr.insert(rowPos, tableNodeTypes(table.type.schema).row.create(null, cells));\n return tr;\n}\nfunction addRowBefore(state, dispatch) {\n if (!isInTable(state)) return false;\n if (dispatch) {\n const rect = selectedRect(state);\n dispatch(addRow(state.tr, rect, rect.top));\n }\n return true;\n}\nfunction addRowAfter(state, dispatch) {\n if (!isInTable(state)) return false;\n if (dispatch) {\n const rect = selectedRect(state);\n dispatch(addRow(state.tr, rect, rect.bottom));\n }\n return true;\n}\nfunction removeRow(tr, { map, table, tableStart }, row) {\n let rowPos = 0;\n for (let i = 0; i < row; i++) rowPos += table.child(i).nodeSize;\n const nextRow = rowPos + table.child(row).nodeSize;\n const mapFrom = tr.mapping.maps.length;\n tr.delete(rowPos + tableStart, nextRow + tableStart);\n const seen = /* @__PURE__ */ new Set();\n for (let col = 0, index = row * map.width; col < map.width; col++, index++) {\n const pos = map.map[index];\n if (seen.has(pos)) continue;\n seen.add(pos);\n if (row > 0 && pos == map.map[index - map.width]) {\n const attrs = table.nodeAt(pos).attrs;\n tr.setNodeMarkup(tr.mapping.slice(mapFrom).map(pos + tableStart), null, {\n ...attrs,\n rowspan: attrs.rowspan - 1\n });\n col += attrs.colspan - 1;\n } else if (row < map.height && pos == map.map[index + map.width]) {\n const cell = table.nodeAt(pos);\n const attrs = cell.attrs;\n const copy = cell.type.create(\n { ...attrs, rowspan: cell.attrs.rowspan - 1 },\n cell.content\n );\n const newPos = map.positionAt(row + 1, col, table);\n tr.insert(tr.mapping.slice(mapFrom).map(tableStart + newPos), copy);\n col += attrs.colspan - 1;\n }\n }\n}\nfunction deleteRow(state, dispatch) {\n if (!isInTable(state)) return false;\n if (dispatch) {\n const rect = selectedRect(state), tr = state.tr;\n if (rect.top == 0 && rect.bottom == rect.map.height) return false;\n for (let i = rect.bottom - 1; ; i--) {\n removeRow(tr, rect, i);\n if (i == rect.top) break;\n const table = rect.tableStart ? tr.doc.nodeAt(rect.tableStart - 1) : tr.doc;\n if (!table) {\n throw RangeError(\"No table found\");\n }\n rect.table = table;\n rect.map = TableMap.get(rect.table);\n }\n dispatch(tr);\n }\n return true;\n}\nfunction isEmpty(cell) {\n const c = cell.content;\n return c.childCount == 1 && c.child(0).isTextblock && c.child(0).childCount == 0;\n}\nfunction cellsOverlapRectangle({ width, height, map }, rect) {\n let indexTop = rect.top * width + rect.left, indexLeft = indexTop;\n let indexBottom = (rect.bottom - 1) * width + rect.left, indexRight = indexTop + (rect.right - rect.left - 1);\n for (let i = rect.top; i < rect.bottom; i++) {\n if (rect.left > 0 && map[indexLeft] == map[indexLeft - 1] || rect.right < width && map[indexRight] == map[indexRight + 1])\n return true;\n indexLeft += width;\n indexRight += width;\n }\n for (let i = rect.left; i < rect.right; i++) {\n if (rect.top > 0 && map[indexTop] == map[indexTop - width] || rect.bottom < height && map[indexBottom] == map[indexBottom + width])\n return true;\n indexTop++;\n indexBottom++;\n }\n return false;\n}\nfunction mergeCells(state, dispatch) {\n const sel = state.selection;\n if (!(sel instanceof CellSelection) || sel.$anchorCell.pos == sel.$headCell.pos)\n return false;\n const rect = selectedRect(state), { map } = rect;\n if (cellsOverlapRectangle(map, rect)) return false;\n if (dispatch) {\n const tr = state.tr;\n const seen = {};\n let content = Fragment2.empty;\n let mergedPos;\n let mergedCell;\n for (let row = rect.top; row < rect.bottom; row++) {\n for (let col = rect.left; col < rect.right; col++) {\n const cellPos = map.map[row * map.width + col];\n const cell = rect.table.nodeAt(cellPos);\n if (seen[cellPos] || !cell) continue;\n seen[cellPos] = true;\n if (mergedPos == null) {\n mergedPos = cellPos;\n mergedCell = cell;\n } else {\n if (!isEmpty(cell)) content = content.append(cell.content);\n const mapped = tr.mapping.map(cellPos + rect.tableStart);\n tr.delete(mapped, mapped + cell.nodeSize);\n }\n }\n }\n if (mergedPos == null || mergedCell == null) {\n return true;\n }\n tr.setNodeMarkup(mergedPos + rect.tableStart, null, {\n ...addColSpan(\n mergedCell.attrs,\n mergedCell.attrs.colspan,\n rect.right - rect.left - mergedCell.attrs.colspan\n ),\n rowspan: rect.bottom - rect.top\n });\n if (content.size) {\n const end = mergedPos + 1 + mergedCell.content.size;\n const start = isEmpty(mergedCell) ? mergedPos + 1 : end;\n tr.replaceWith(start + rect.tableStart, end + rect.tableStart, content);\n }\n tr.setSelection(\n new CellSelection(tr.doc.resolve(mergedPos + rect.tableStart))\n );\n dispatch(tr);\n }\n return true;\n}\nfunction splitCell(state, dispatch) {\n const nodeTypes = tableNodeTypes(state.schema);\n return splitCellWithType(({ node }) => {\n return nodeTypes[node.type.spec.tableRole];\n })(state, dispatch);\n}\nfunction splitCellWithType(getCellType) {\n return (state, dispatch) => {\n var _a;\n const sel = state.selection;\n let cellNode;\n let cellPos;\n if (!(sel instanceof CellSelection)) {\n cellNode = cellWrapping(sel.$from);\n if (!cellNode) return false;\n cellPos = (_a = cellAround(sel.$from)) == null ? void 0 : _a.pos;\n } else {\n if (sel.$anchorCell.pos != sel.$headCell.pos) return false;\n cellNode = sel.$anchorCell.nodeAfter;\n cellPos = sel.$anchorCell.pos;\n }\n if (cellNode == null || cellPos == null) {\n return false;\n }\n if (cellNode.attrs.colspan == 1 && cellNode.attrs.rowspan == 1) {\n return false;\n }\n if (dispatch) {\n let baseAttrs = cellNode.attrs;\n const attrs = [];\n const colwidth = baseAttrs.colwidth;\n if (baseAttrs.rowspan > 1) baseAttrs = { ...baseAttrs, rowspan: 1 };\n if (baseAttrs.colspan > 1) baseAttrs = { ...baseAttrs, colspan: 1 };\n const rect = selectedRect(state), tr = state.tr;\n for (let i = 0; i < rect.right - rect.left; i++)\n attrs.push(\n colwidth ? {\n ...baseAttrs,\n colwidth: colwidth && colwidth[i] ? [colwidth[i]] : null\n } : baseAttrs\n );\n let lastCell;\n for (let row = rect.top; row < rect.bottom; row++) {\n let pos = rect.map.positionAt(row, rect.left, rect.table);\n if (row == rect.top) pos += cellNode.nodeSize;\n for (let col = rect.left, i = 0; col < rect.right; col++, i++) {\n if (col == rect.left && row == rect.top) continue;\n tr.insert(\n lastCell = tr.mapping.map(pos + rect.tableStart, 1),\n getCellType({ node: cellNode, row, col }).createAndFill(attrs[i])\n );\n }\n }\n tr.setNodeMarkup(\n cellPos,\n getCellType({ node: cellNode, row: rect.top, col: rect.left }),\n attrs[0]\n );\n if (sel instanceof CellSelection)\n tr.setSelection(\n new CellSelection(\n tr.doc.resolve(sel.$anchorCell.pos),\n lastCell ? tr.doc.resolve(lastCell) : void 0\n )\n );\n dispatch(tr);\n }\n return true;\n };\n}\nfunction setCellAttr(name, value) {\n return function(state, dispatch) {\n if (!isInTable(state)) return false;\n const $cell = selectionCell(state);\n if ($cell.nodeAfter.attrs[name] === value) return false;\n if (dispatch) {\n const tr = state.tr;\n if (state.selection instanceof CellSelection)\n state.selection.forEachCell((node, pos) => {\n if (node.attrs[name] !== value)\n tr.setNodeMarkup(pos, null, {\n ...node.attrs,\n [name]: value\n });\n });\n else\n tr.setNodeMarkup($cell.pos, null, {\n ...$cell.nodeAfter.attrs,\n [name]: value\n });\n dispatch(tr);\n }\n return true;\n };\n}\nfunction deprecated_toggleHeader(type) {\n return function(state, dispatch) {\n if (!isInTable(state)) return false;\n if (dispatch) {\n const types = tableNodeTypes(state.schema);\n const rect = selectedRect(state), tr = state.tr;\n const cells = rect.map.cellsInRect(\n type == \"column\" ? {\n left: rect.left,\n top: 0,\n right: rect.right,\n bottom: rect.map.height\n } : type == \"row\" ? {\n left: 0,\n top: rect.top,\n right: rect.map.width,\n bottom: rect.bottom\n } : rect\n );\n const nodes = cells.map((pos) => rect.table.nodeAt(pos));\n for (let i = 0; i < cells.length; i++)\n if (nodes[i].type == types.header_cell)\n tr.setNodeMarkup(\n rect.tableStart + cells[i],\n types.cell,\n nodes[i].attrs\n );\n if (tr.steps.length == 0)\n for (let i = 0; i < cells.length; i++)\n tr.setNodeMarkup(\n rect.tableStart + cells[i],\n types.header_cell,\n nodes[i].attrs\n );\n dispatch(tr);\n }\n return true;\n };\n}\nfunction isHeaderEnabledByType(type, rect, types) {\n const cellPositions = rect.map.cellsInRect({\n left: 0,\n top: 0,\n right: type == \"row\" ? rect.map.width : 1,\n bottom: type == \"column\" ? rect.map.height : 1\n });\n for (let i = 0; i < cellPositions.length; i++) {\n const cell = rect.table.nodeAt(cellPositions[i]);\n if (cell && cell.type !== types.header_cell) {\n return false;\n }\n }\n return true;\n}\nfunction toggleHeader(type, options) {\n options = options || { useDeprecatedLogic: false };\n if (options.useDeprecatedLogic) return deprecated_toggleHeader(type);\n return function(state, dispatch) {\n if (!isInTable(state)) return false;\n if (dispatch) {\n const types = tableNodeTypes(state.schema);\n const rect = selectedRect(state), tr = state.tr;\n const isHeaderRowEnabled = isHeaderEnabledByType(\"row\", rect, types);\n const isHeaderColumnEnabled = isHeaderEnabledByType(\n \"column\",\n rect,\n types\n );\n const isHeaderEnabled = type === \"column\" ? isHeaderRowEnabled : type === \"row\" ? isHeaderColumnEnabled : false;\n const selectionStartsAt = isHeaderEnabled ? 1 : 0;\n const cellsRect = type == \"column\" ? {\n left: 0,\n top: selectionStartsAt,\n right: 1,\n bottom: rect.map.height\n } : type == \"row\" ? {\n left: selectionStartsAt,\n top: 0,\n right: rect.map.width,\n bottom: 1\n } : rect;\n const newType = type == \"column\" ? isHeaderColumnEnabled ? types.cell : types.header_cell : type == \"row\" ? isHeaderRowEnabled ? types.cell : types.header_cell : types.cell;\n rect.map.cellsInRect(cellsRect).forEach((relativeCellPos) => {\n const cellPos = relativeCellPos + rect.tableStart;\n const cell = tr.doc.nodeAt(cellPos);\n if (cell) {\n tr.setNodeMarkup(cellPos, newType, cell.attrs);\n }\n });\n dispatch(tr);\n }\n return true;\n };\n}\nvar toggleHeaderRow = toggleHeader(\"row\", {\n useDeprecatedLogic: true\n});\nvar toggleHeaderColumn = toggleHeader(\"column\", {\n useDeprecatedLogic: true\n});\nvar toggleHeaderCell = toggleHeader(\"cell\", {\n useDeprecatedLogic: true\n});\nfunction findNextCell($cell, dir) {\n if (dir < 0) {\n const before = $cell.nodeBefore;\n if (before) return $cell.pos - before.nodeSize;\n for (let row = $cell.index(-1) - 1, rowEnd = $cell.before(); row >= 0; row--) {\n const rowNode = $cell.node(-1).child(row);\n const lastChild = rowNode.lastChild;\n if (lastChild) {\n return rowEnd - 1 - lastChild.nodeSize;\n }\n rowEnd -= rowNode.nodeSize;\n }\n } else {\n if ($cell.index() < $cell.parent.childCount - 1) {\n return $cell.pos + $cell.nodeAfter.nodeSize;\n }\n const table = $cell.node(-1);\n for (let row = $cell.indexAfter(-1), rowStart = $cell.after(); row < table.childCount; row++) {\n const rowNode = table.child(row);\n if (rowNode.childCount) return rowStart + 1;\n rowStart += rowNode.nodeSize;\n }\n }\n return null;\n}\nfunction goToNextCell(direction) {\n return function(state, dispatch) {\n if (!isInTable(state)) return false;\n const cell = findNextCell(selectionCell(state), direction);\n if (cell == null) return false;\n if (dispatch) {\n const $cell = state.doc.resolve(cell);\n dispatch(\n state.tr.setSelection(TextSelection2.between($cell, moveCellForward($cell))).scrollIntoView()\n );\n }\n return true;\n };\n}\nfunction deleteTable(state, dispatch) {\n const $pos = state.selection.$anchor;\n for (let d = $pos.depth; d > 0; d--) {\n const node = $pos.node(d);\n if (node.type.spec.tableRole == \"table\") {\n if (dispatch)\n dispatch(\n state.tr.delete($pos.before(d), $pos.after(d)).scrollIntoView()\n );\n return true;\n }\n }\n return false;\n}\nfunction deleteCellSelection(state, dispatch) {\n const sel = state.selection;\n if (!(sel instanceof CellSelection)) return false;\n if (dispatch) {\n const tr = state.tr;\n const baseContent = tableNodeTypes(state.schema).cell.createAndFill().content;\n sel.forEachCell((cell, pos) => {\n if (!cell.content.eq(baseContent))\n tr.replace(\n tr.mapping.map(pos + 1),\n tr.mapping.map(pos + cell.nodeSize - 1),\n new Slice2(baseContent, 0, 0)\n );\n });\n if (tr.docChanged) dispatch(tr);\n }\n return true;\n}\n\n// src/copypaste.ts\nimport { Fragment as Fragment3, Slice as Slice3 } from \"prosemirror-model\";\nimport { Transform } from \"prosemirror-transform\";\nfunction pastedCells(slice) {\n if (!slice.size) return null;\n let { content, openStart, openEnd } = slice;\n while (content.childCount == 1 && (openStart > 0 && openEnd > 0 || content.child(0).type.spec.tableRole == \"table\")) {\n openStart--;\n openEnd--;\n content = content.child(0).content;\n }\n const first = content.child(0);\n const role = first.type.spec.tableRole;\n const schema = first.type.schema, rows = [];\n if (role == \"row\") {\n for (let i = 0; i < content.childCount; i++) {\n let cells = content.child(i).content;\n const left = i ? 0 : Math.max(0, openStart - 1);\n const right = i < content.childCount - 1 ? 0 : Math.max(0, openEnd - 1);\n if (left || right)\n cells = fitSlice(\n tableNodeTypes(schema).row,\n new Slice3(cells, left, right)\n ).content;\n rows.push(cells);\n }\n } else if (role == \"cell\" || role == \"header_cell\") {\n rows.push(\n openStart || openEnd ? fitSlice(\n tableNodeTypes(schema).row,\n new Slice3(content, openStart, openEnd)\n ).content : content\n );\n } else {\n return null;\n }\n return ensureRectangular(schema, rows);\n}\nfunction ensureRectangular(schema, rows) {\n const widths = [];\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n for (let j = row.childCount - 1; j >= 0; j--) {\n const { rowspan, colspan } = row.child(j).attrs;\n for (let r = i; r < i + rowspan; r++)\n widths[r] = (widths[r] || 0) + colspan;\n }\n }\n let width = 0;\n for (let r = 0; r < widths.length; r++) width = Math.max(width, widths[r]);\n for (let r = 0; r < widths.length; r++) {\n if (r >= rows.length) rows.push(Fragment3.empty);\n if (widths[r] < width) {\n const empty = tableNodeTypes(schema).cell.createAndFill();\n const cells = [];\n for (let i = widths[r]; i < width; i++) {\n cells.push(empty);\n }\n rows[r] = rows[r].append(Fragment3.from(cells));\n }\n }\n return { height: rows.length, width, rows };\n}\nfunction fitSlice(nodeType, slice) {\n const node = nodeType.createAndFill();\n const tr = new Transform(node).replace(0, node.content.size, slice);\n return tr.doc;\n}\nfunction clipCells({ width, height, rows }, newWidth, newHeight) {\n if (width != newWidth) {\n const added = [];\n const newRows = [];\n for (let row = 0; row < rows.length; row++) {\n const frag = rows[row], cells = [];\n for (let col = added[row] || 0, i = 0; col < newWidth; i++) {\n let cell = frag.child(i % frag.childCount);\n if (col + cell.attrs.colspan > newWidth)\n cell = cell.type.createChecked(\n removeColSpan(\n cell.attrs,\n cell.attrs.colspan,\n col + cell.attrs.colspan - newWidth\n ),\n cell.content\n );\n cells.push(cell);\n col += cell.attrs.colspan;\n for (let j = 1; j < cell.attrs.rowspan; j++)\n added[row + j] = (added[row + j] || 0) + cell.attrs.colspan;\n }\n newRows.push(Fragment3.from(cells));\n }\n rows = newRows;\n width = newWidth;\n }\n if (height != newHeight) {\n const newRows = [];\n for (let row = 0, i = 0; row < newHeight; row++, i++) {\n const cells = [], source = rows[i % height];\n for (let j = 0; j < source.childCount; j++) {\n let cell = source.child(j);\n if (row + cell.attrs.rowspan > newHeight)\n cell = cell.type.create(\n {\n ...cell.attrs,\n rowspan: Math.max(1, newHeight - cell.attrs.rowspan)\n },\n cell.content\n );\n cells.push(cell);\n }\n newRows.push(Fragment3.from(cells));\n }\n rows = newRows;\n height = newHeight;\n }\n return { width, height, rows };\n}\nfunction growTable(tr, map, table, start, width, height, mapFrom) {\n const schema = tr.doc.type.schema;\n const types = tableNodeTypes(schema);\n let empty;\n let emptyHead;\n if (width > map.width) {\n for (let row = 0, rowEnd = 0; row < map.height; row++) {\n const rowNode = table.child(row);\n rowEnd += rowNode.nodeSize;\n const cells = [];\n let add;\n if (rowNode.lastChild == null || rowNode.lastChild.type == types.cell)\n add = empty || (empty = types.cell.createAndFill());\n else add = emptyHead || (emptyHead = types.header_cell.createAndFill());\n for (let i = map.width; i < width; i++) cells.push(add);\n tr.insert(tr.mapping.slice(mapFrom).map(rowEnd - 1 + start), cells);\n }\n }\n if (height > map.height) {\n const cells = [];\n for (let i = 0, start2 = (map.height - 1) * map.width; i < Math.max(map.width, width); i++) {\n const header = i >= map.width ? false : table.nodeAt(map.map[start2 + i]).type == types.header_cell;\n cells.push(\n header ? emptyHead || (emptyHead = types.header_cell.createAndFill()) : empty || (empty = types.cell.createAndFill())\n );\n }\n const emptyRow = types.row.create(null, Fragment3.from(cells)), rows = [];\n for (let i = map.height; i < height; i++) rows.push(emptyRow);\n tr.insert(tr.mapping.slice(mapFrom).map(start + table.nodeSize - 2), rows);\n }\n return !!(empty || emptyHead);\n}\nfunction isolateHorizontal(tr, map, table, start, left, right, top, mapFrom) {\n if (top == 0 || top == map.height) return false;\n let found = false;\n for (let col = left; col < right; col++) {\n const index = top * map.width + col, pos = map.map[index];\n if (map.map[index - map.width] == pos) {\n found = true;\n const cell = table.nodeAt(pos);\n const { top: cellTop, left: cellLeft } = map.findCell(pos);\n tr.setNodeMarkup(tr.mapping.slice(mapFrom).map(pos + start), null, {\n ...cell.attrs,\n rowspan: top - cellTop\n });\n tr.insert(\n tr.mapping.slice(mapFrom).map(map.positionAt(top, cellLeft, table)),\n cell.type.createAndFill({\n ...cell.attrs,\n rowspan: cellTop + cell.attrs.rowspan - top\n })\n );\n col += cell.attrs.colspan - 1;\n }\n }\n return found;\n}\nfunction isolateVertical(tr, map, table, start, top, bottom, left, mapFrom) {\n if (left == 0 || left == map.width) return false;\n let found = false;\n for (let row = top; row < bottom; row++) {\n const index = row * map.width + left, pos = map.map[index];\n if (map.map[index - 1] == pos) {\n found = true;\n const cell = table.nodeAt(pos);\n const cellLeft = map.colCount(pos);\n const updatePos = tr.mapping.slice(mapFrom).map(pos + start);\n tr.setNodeMarkup(\n updatePos,\n null,\n removeColSpan(\n cell.attrs,\n left - cellLeft,\n cell.attrs.colspan - (left - cellLeft)\n )\n );\n tr.insert(\n updatePos + cell.nodeSize,\n cell.type.createAndFill(\n removeColSpan(cell.attrs, 0, left - cellLeft)\n )\n );\n row += cell.attrs.rowspan - 1;\n }\n }\n return found;\n}\nfunction insertCells(state, dispatch, tableStart, rect, cells) {\n let table = tableStart ? state.doc.nodeAt(tableStart - 1) : state.doc;\n if (!table) {\n throw new Error(\"No table found\");\n }\n let map = TableMap.get(table);\n const { top, left } = rect;\n const right = left + cells.width, bottom = top + cells.height;\n const tr = state.tr;\n let mapFrom = 0;\n function recomp() {\n table = tableStart ? tr.doc.nodeAt(tableStart - 1) : tr.doc;\n if (!table) {\n throw new Error(\"No table found\");\n }\n map = TableMap.get(table);\n mapFrom = tr.mapping.maps.length;\n }\n if (growTable(tr, map, table, tableStart, right, bottom, mapFrom)) recomp();\n if (isolateHorizontal(tr, map, table, tableStart, left, right, top, mapFrom))\n recomp();\n if (isolateHorizontal(tr, map, table, tableStart, left, right, bottom, mapFrom))\n recomp();\n if (isolateVertical(tr, map, table, tableStart, top, bottom, left, mapFrom))\n recomp();\n if (isolateVertical(tr, map, table, tableStart, top, bottom, right, mapFrom))\n recomp();\n for (let row = top; row < bottom; row++) {\n const from = map.positionAt(row, left, table), to = map.positionAt(row, right, table);\n tr.replace(\n tr.mapping.slice(mapFrom).map(from + tableStart),\n tr.mapping.slice(mapFrom).map(to + tableStart),\n new Slice3(cells.rows[row - top], 0, 0)\n );\n }\n recomp();\n tr.setSelection(\n new CellSelection(\n tr.doc.resolve(tableStart + map.positionAt(top, left, table)),\n tr.doc.resolve(tableStart + map.positionAt(bottom - 1, right - 1, table))\n )\n );\n dispatch(tr);\n}\n\n// src/input.ts\nvar handleKeyDown = keydownHandler({\n ArrowLeft: arrow(\"horiz\", -1),\n ArrowRight: arrow(\"horiz\", 1),\n ArrowUp: arrow(\"vert\", -1),\n ArrowDown: arrow(\"vert\", 1),\n \"Shift-ArrowLeft\": shiftArrow(\"horiz\", -1),\n \"Shift-ArrowRight\": shiftArrow(\"horiz\", 1),\n \"Shift-ArrowUp\": shiftArrow(\"vert\", -1),\n \"Shift-ArrowDown\": shiftArrow(\"vert\", 1),\n Backspace: deleteCellSelection,\n \"Mod-Backspace\": deleteCellSelection,\n Delete: deleteCellSelection,\n \"Mod-Delete\": deleteCellSelection\n});\nfunction maybeSetSelection(state, dispatch, selection) {\n if (selection.eq(state.selection)) return false;\n if (dispatch) dispatch(state.tr.setSelection(selection).scrollIntoView());\n return true;\n}\nfunction arrow(axis, dir) {\n return (state, dispatch, view) => {\n if (!view) return false;\n const sel = state.selection;\n if (sel instanceof CellSelection) {\n return maybeSetSelection(\n state,\n dispatch,\n Selection2.near(sel.$headCell, dir)\n );\n }\n if (axis != \"horiz\" && !sel.empty) return false;\n const end = atEndOfCell(view, axis, dir);\n if (end == null) return false;\n if (axis == \"horiz\") {\n return maybeSetSelection(\n state,\n dispatch,\n Selection2.near(state.doc.resolve(sel.head + dir), dir)\n );\n } else {\n const $cell = state.doc.resolve(end);\n const $next = nextCell($cell, axis, dir);\n let newSel;\n if ($next) newSel = Selection2.near($next, 1);\n else if (dir < 0)\n newSel = Selection2.near(state.doc.resolve($cell.before(-1)), -1);\n else newSel = Selection2.near(state.doc.resolve($cell.after(-1)), 1);\n return maybeSetSelection(state, dispatch, newSel);\n }\n };\n}\nfunction shiftArrow(axis, dir) {\n return (state, dispatch, view) => {\n if (!view) return false;\n const sel = state.selection;\n let cellSel;\n if (sel instanceof CellSelection) {\n cellSel = sel;\n } else {\n const end = atEndOfCell(view, axis, dir);\n if (end == null) return false;\n cellSel = new CellSelection(state.doc.resolve(end));\n }\n const $head = nextCell(cellSel.$headCell, axis, dir);\n if (!$head) return false;\n return maybeSetSelection(\n state,\n dispatch,\n new CellSelection(cellSel.$anchorCell, $head)\n );\n };\n}\nfunction handleTripleClick(view, pos) {\n const doc = view.state.doc, $cell = cellAround(doc.resolve(pos));\n if (!$cell) return false;\n view.dispatch(view.state.tr.setSelection(new CellSelection($cell)));\n return true;\n}\nfunction handlePaste(view, _, slice) {\n if (!isInTable(view.state)) return false;\n let cells = pastedCells(slice);\n const sel = view.state.selection;\n if (sel instanceof CellSelection) {\n if (!cells)\n cells = {\n width: 1,\n height: 1,\n rows: [\n Fragment4.from(\n fitSlice(tableNodeTypes(view.state.schema).cell, slice)\n )\n ]\n };\n const table = sel.$anchorCell.node(-1);\n const start = sel.$anchorCell.start(-1);\n const rect = TableMap.get(table).rectBetween(\n sel.$anchorCell.pos - start,\n sel.$headCell.pos - start\n );\n cells = clipCells(cells, rect.right - rect.left, rect.bottom - rect.top);\n insertCells(view.state, view.dispatch, start, rect, cells);\n return true;\n } else if (cells) {\n const $cell = selectionCell(view.state);\n const start = $cell.start(-1);\n insertCells(\n view.state,\n view.dispatch,\n start,\n TableMap.get($cell.node(-1)).findCell($cell.pos - start),\n cells\n );\n return true;\n } else {\n return false;\n }\n}\nfunction handleMouseDown(view, startEvent) {\n var _a;\n if (startEvent.ctrlKey || startEvent.metaKey) return;\n const startDOMCell = domInCell(view, startEvent.target);\n let $anchor;\n if (startEvent.shiftKey && view.state.selection instanceof CellSelection) {\n setCellSelection(view.state.selection.$anchorCell, startEvent);\n startEvent.preventDefault();\n } else if (startEvent.shiftKey && startDOMCell && ($anchor = cellAround(view.state.selection.$anchor)) != null && ((_a = cellUnderMouse(view, startEvent)) == null ? void 0 : _a.pos) != $anchor.pos) {\n setCellSelection($anchor, startEvent);\n startEvent.preventDefault();\n } else if (!startDOMCell) {\n return;\n }\n function setCellSelection($anchor2, event) {\n let $head = cellUnderMouse(view, event);\n const starting = tableEditingKey.getState(view.state) == null;\n if (!$head || !inSameTable($anchor2, $head)) {\n if (starting) $head = $anchor2;\n else return;\n }\n const selection = new CellSelection($anchor2, $head);\n if (starting || !view.state.selection.eq(selection)) {\n const tr = view.state.tr.setSelection(selection);\n if (starting) tr.setMeta(tableEditingKey, $anchor2.pos);\n view.dispatch(tr);\n }\n }\n function stop() {\n view.root.removeEventListener(\"mouseup\", stop);\n view.root.removeEventListener(\"dragstart\", stop);\n view.root.removeEventListener(\"mousemove\", move);\n if (tableEditingKey.getState(view.state) != null)\n view.dispatch(view.state.tr.setMeta(tableEditingKey, -1));\n }\n function move(_event) {\n const event = _event;\n const anchor = tableEditingKey.getState(view.state);\n let $anchor2;\n if (anchor != null) {\n $anchor2 = view.state.doc.resolve(anchor);\n } else if (domInCell(view, event.target) != startDOMCell) {\n $anchor2 = cellUnderMouse(view, startEvent);\n if (!$anchor2) return stop();\n }\n if ($anchor2) setCellSelection($anchor2, event);\n }\n view.root.addEventListener(\"mouseup\", stop);\n view.root.addEventListener(\"dragstart\", stop);\n view.root.addEventListener(\"mousemove\", move);\n}\nfunction atEndOfCell(view, axis, dir) {\n if (!(view.state.selection instanceof TextSelection3)) return null;\n const { $head } = view.state.selection;\n for (let d = $head.depth - 1; d >= 0; d--) {\n const parent = $head.node(d), index = dir < 0 ? $head.index(d) : $head.indexAfter(d);\n if (index != (dir < 0 ? 0 : parent.childCount)) return null;\n if (parent.type.spec.tableRole == \"cell\" || parent.type.spec.tableRole == \"header_cell\") {\n const cellPos = $head.before(d);\n const dirStr = axis == \"vert\" ? dir > 0 ? \"down\" : \"up\" : dir > 0 ? \"right\" : \"left\";\n return view.endOfTextblock(dirStr) ? cellPos : null;\n }\n }\n return null;\n}\nfunction domInCell(view, dom) {\n for (; dom && dom != view.dom; dom = dom.parentNode) {\n if (dom.nodeName == \"TD\" || dom.nodeName == \"TH\") {\n return dom;\n }\n }\n return null;\n}\nfunction cellUnderMouse(view, event) {\n const mousePos = view.posAtCoords({\n left: event.clientX,\n top: event.clientY\n });\n if (!mousePos) return null;\n return mousePos ? cellAround(view.state.doc.resolve(mousePos.pos)) : null;\n}\n\n// src/columnresizing.ts\nimport { Plugin, PluginKey as PluginKey3 } from \"prosemirror-state\";\nimport {\n Decoration as Decoration2,\n DecorationSet as DecorationSet2\n} from \"prosemirror-view\";\n\n// src/tableview.ts\nvar TableView = class {\n constructor(node, defaultCellMinWidth) {\n this.node = node;\n this.defaultCellMinWidth = defaultCellMinWidth;\n this.dom = document.createElement(\"div\");\n this.dom.className = \"tableWrapper\";\n this.table = this.dom.appendChild(document.createElement(\"table\"));\n this.table.style.setProperty(\n \"--default-cell-min-width\",\n `${defaultCellMinWidth}px`\n );\n this.colgroup = this.table.appendChild(document.createElement(\"colgroup\"));\n updateColumnsOnResize(node, this.colgroup, this.table, defaultCellMinWidth);\n this.contentDOM = this.table.appendChild(document.createElement(\"tbody\"));\n }\n update(node) {\n if (node.type != this.node.type) return false;\n this.node = node;\n updateColumnsOnResize(\n node,\n this.colgroup,\n this.table,\n this.defaultCellMinWidth\n );\n return true;\n }\n ignoreMutation(record) {\n return record.type == \"attributes\" && (record.target == this.table || this.colgroup.contains(record.target));\n }\n};\nfunction updateColumnsOnResize(node, colgroup, table, defaultCellMinWidth, overrideCol, overrideValue) {\n var _a;\n let totalWidth = 0;\n let fixedWidth = true;\n let nextDOM = colgroup.firstChild;\n const row = node.firstChild;\n if (!row) return;\n for (let i = 0, col = 0; i < row.childCount; i++) {\n const { colspan, colwidth } = row.child(i).attrs;\n for (let j = 0; j < colspan; j++, col++) {\n const hasWidth = overrideCol == col ? overrideValue : colwidth && colwidth[j];\n const cssWidth = hasWidth ? hasWidth + \"px\" : \"\";\n totalWidth += hasWidth || defaultCellMinWidth;\n if (!hasWidth) fixedWidth = false;\n if (!nextDOM) {\n const col2 = document.createElement(\"col\");\n col2.style.width = cssWidth;\n colgroup.appendChild(col2);\n } else {\n if (nextDOM.style.width != cssWidth) {\n nextDOM.style.width = cssWidth;\n }\n nextDOM = nextDOM.nextSibling;\n }\n }\n }\n while (nextDOM) {\n const after = nextDOM.nextSibling;\n (_a = nextDOM.parentNode) == null ? void 0 : _a.removeChild(nextDOM);\n nextDOM = after;\n }\n if (fixedWidth) {\n table.style.width = totalWidth + \"px\";\n table.style.minWidth = \"\";\n } else {\n table.style.width = \"\";\n table.style.minWidth = totalWidth + \"px\";\n }\n}\n\n// src/columnresizing.ts\nvar columnResizingPluginKey = new PluginKey3(\n \"tableColumnResizing\"\n);\nfunction columnResizing({\n handleWidth = 5,\n cellMinWidth = 25,\n defaultCellMinWidth = 100,\n View = TableView,\n lastColumnResizable = true\n} = {}) {\n const plugin = new Plugin({\n key: columnResizingPluginKey,\n state: {\n init(_, state) {\n var _a, _b;\n const nodeViews = (_b = (_a = plugin.spec) == null ? void 0 : _a.props) == null ? void 0 : _b.nodeViews;\n const tableName = tableNodeTypes(state.schema).table.name;\n if (View && nodeViews) {\n nodeViews[tableName] = (node, view) => {\n return new View(node, defaultCellMinWidth, view);\n };\n }\n return new ResizeState(-1, false);\n },\n apply(tr, prev) {\n return prev.apply(tr);\n }\n },\n props: {\n attributes: (state) => {\n const pluginState = columnResizingPluginKey.getState(state);\n return pluginState && pluginState.activeHandle > -1 ? { class: \"resize-cursor\" } : {};\n },\n handleDOMEvents: {\n mousemove: (view, event) => {\n handleMouseMove(view, event, handleWidth, lastColumnResizable);\n },\n mouseleave: (view) => {\n handleMouseLeave(view);\n },\n mousedown: (view, event) => {\n handleMouseDown2(view, event, cellMinWidth, defaultCellMinWidth);\n }\n },\n decorations: (state) => {\n const pluginState = columnResizingPluginKey.getState(state);\n if (pluginState && pluginState.activeHandle > -1) {\n return handleDecorations(state, pluginState.activeHandle);\n }\n },\n nodeViews: {}\n }\n });\n return plugin;\n}\nvar ResizeState = class _ResizeState {\n constructor(activeHandle, dragging) {\n this.activeHandle = activeHandle;\n this.dragging = dragging;\n }\n apply(tr) {\n const state = this;\n const action = tr.getMeta(columnResizingPluginKey);\n if (action && action.setHandle != null)\n return new _ResizeState(action.setHandle, false);\n if (action && action.setDragging !== void 0)\n return new _ResizeState(state.activeHandle, action.setDragging);\n if (state.activeHandle > -1 && tr.docChanged) {\n let handle = tr.mapping.map(state.activeHandle, -1);\n if (!pointsAtCell(tr.doc.resolve(handle))) {\n handle = -1;\n }\n return new _ResizeState(handle, state.dragging);\n }\n return state;\n }\n};\nfunction handleMouseMove(view, event, handleWidth, lastColumnResizable) {\n if (!view.editable) return;\n const pluginState = columnResizingPluginKey.getState(view.state);\n if (!pluginState) return;\n if (!pluginState.dragging) {\n const target = domCellAround(event.target);\n let cell = -1;\n if (target) {\n const { left, right } = target.getBoundingClientRect();\n if (event.clientX - left <= handleWidth)\n cell = edgeCell(view, event, \"left\", handleWidth);\n else if (right - event.clientX <= handleWidth)\n cell = edgeCell(view, event, \"right\", handleWidth);\n }\n if (cell != pluginState.activeHandle) {\n if (!lastColumnResizable && cell !== -1) {\n const $cell = view.state.doc.resolve(cell);\n const table = $cell.node(-1);\n const map = TableMap.get(table);\n const tableStart = $cell.start(-1);\n const col = map.colCount($cell.pos - tableStart) + $cell.nodeAfter.attrs.colspan - 1;\n if (col == map.width - 1) {\n return;\n }\n }\n updateHandle(view, cell);\n }\n }\n}\nfunction handleMouseLeave(view) {\n if (!view.editable) return;\n const pluginState = columnResizingPluginKey.getState(view.state);\n if (pluginState && pluginState.activeHandle > -1 && !pluginState.dragging)\n updateHandle(view, -1);\n}\nfunction handleMouseDown2(view, event, cellMinWidth, defaultCellMinWidth) {\n var _a;\n if (!view.editable) return false;\n const win = (_a = view.dom.ownerDocument.defaultView) != null ? _a : window;\n const pluginState = columnResizingPluginKey.getState(view.state);\n if (!pluginState || pluginState.activeHandle == -1 || pluginState.dragging)\n return false;\n const cell = view.state.doc.nodeAt(pluginState.activeHandle);\n const width = currentColWidth(view, pluginState.activeHandle, cell.attrs);\n view.dispatch(\n view.state.tr.setMeta(columnResizingPluginKey, {\n setDragging: { startX: event.clientX, startWidth: width }\n })\n );\n function finish(event2) {\n win.removeEventListener(\"mouseup\", finish);\n win.removeEventListener(\"mousemove\", move);\n const pluginState2 = columnResizingPluginKey.getState(view.state);\n if (pluginState2 == null ? void 0 : pluginState2.dragging) {\n updateColumnWidth(\n view,\n pluginState2.activeHandle,\n draggedWidth(pluginState2.dragging, event2, cellMinWidth)\n );\n view.dispatch(\n view.state.tr.setMeta(columnResizingPluginKey, { setDragging: null })\n );\n }\n }\n function move(event2) {\n if (!event2.which) return finish(event2);\n const pluginState2 = columnResizingPluginKey.getState(view.state);\n if (!pluginState2) return;\n if (pluginState2.dragging) {\n const dragged = draggedWidth(pluginState2.dragging, event2, cellMinWidth);\n displayColumnWidth(\n view,\n pluginState2.activeHandle,\n dragged,\n defaultCellMinWidth\n );\n }\n }\n displayColumnWidth(\n view,\n pluginState.activeHandle,\n width,\n defaultCellMinWidth\n );\n win.addEventListener(\"mouseup\", finish);\n win.addEventListener(\"mousemove\", move);\n event.preventDefault();\n return true;\n}\nfunction currentColWidth(view, cellPos, { colspan, colwidth }) {\n const width = colwidth && colwidth[colwidth.length - 1];\n if (width) return width;\n const dom = view.domAtPos(cellPos);\n const node = dom.node.childNodes[dom.offset];\n let domWidth = node.offsetWidth, parts = colspan;\n if (colwidth) {\n for (let i = 0; i < colspan; i++)\n if (colwidth[i]) {\n domWidth -= colwidth[i];\n parts--;\n }\n }\n return domWidth / parts;\n}\nfunction domCellAround(target) {\n while (target && target.nodeName != \"TD\" && target.nodeName != \"TH\")\n target = target.classList && target.classList.contains(\"ProseMirror\") ? null : target.parentNode;\n return target;\n}\nfunction edgeCell(view, event, side, handleWidth) {\n const offset = side == \"right\" ? -handleWidth : handleWidth;\n const found = view.posAtCoords({\n left: event.clientX + offset,\n top: event.clientY\n });\n if (!found) return -1;\n const { pos } = found;\n const $cell = cellAround(view.state.doc.resolve(pos));\n if (!$cell) return -1;\n if (side == \"right\") return $cell.pos;\n const map = TableMap.get($cell.node(-1)), start = $cell.start(-1);\n const index = map.map.indexOf($cell.pos - start);\n return index % map.width == 0 ? -1 : start + map.map[index - 1];\n}\nfunction draggedWidth(dragging, event, resizeMinWidth) {\n const offset = event.clientX - dragging.startX;\n return Math.max(resizeMinWidth, dragging.startWidth + offset);\n}\nfunction updateHandle(view, value) {\n view.dispatch(\n view.state.tr.setMeta(columnResizingPluginKey, { setHandle: value })\n );\n}\nfunction updateColumnWidth(view, cell, width) {\n const $cell = view.state.doc.resolve(cell);\n const table = $cell.node(-1), map = TableMap.get(table), start = $cell.start(-1);\n const col = map.colCount($cell.pos - start) + $cell.nodeAfter.attrs.colspan - 1;\n const tr = view.state.tr;\n for (let row = 0; row < map.height; row++) {\n const mapIndex = row * map.width + col;\n if (row && map.map[mapIndex] == map.map[mapIndex - map.width]) continue;\n const pos = map.map[mapIndex];\n const attrs = table.nodeAt(pos).attrs;\n const index = attrs.colspan == 1 ? 0 : col - map.colCount(pos);\n if (attrs.colwidth && attrs.colwidth[index] == width) continue;\n const colwidth = attrs.colwidth ? attrs.colwidth.slice() : zeroes(attrs.colspan);\n colwidth[index] = width;\n tr.setNodeMarkup(start + pos, null, { ...attrs, colwidth });\n }\n if (tr.docChanged) view.dispatch(tr);\n}\nfunction displayColumnWidth(view, cell, width, defaultCellMinWidth) {\n const $cell = view.state.doc.resolve(cell);\n const table = $cell.node(-1), start = $cell.start(-1);\n const col = TableMap.get(table).colCount($cell.pos - start) + $cell.nodeAfter.attrs.colspan - 1;\n let dom = view.domAtPos($cell.start(-1)).node;\n while (dom && dom.nodeName != \"TABLE\") {\n dom = dom.parentNode;\n }\n if (!dom) return;\n updateColumnsOnResize(\n table,\n dom.firstChild,\n dom,\n defaultCellMinWidth,\n col,\n width\n );\n}\nfunction zeroes(n) {\n return Array(n).fill(0);\n}\nfunction handleDecorations(state, cell) {\n var _a;\n const decorations = [];\n const $cell = state.doc.resolve(cell);\n const table = $cell.node(-1);\n if (!table) {\n return DecorationSet2.empty;\n }\n const map = TableMap.get(table);\n const start = $cell.start(-1);\n const col = map.colCount($cell.pos - start) + $cell.nodeAfter.attrs.colspan - 1;\n for (let row = 0; row < map.height; row++) {\n const index = col + row * map.width;\n if ((col == map.width - 1 || map.map[index] != map.map[index + 1]) && (row == 0 || map.map[index] != map.map[index - map.width])) {\n const cellPos = map.map[index];\n const pos = start + cellPos + table.nodeAt(cellPos).nodeSize - 1;\n const dom = document.createElement(\"div\");\n dom.className = \"column-resize-handle\";\n if ((_a = columnResizingPluginKey.getState(state)) == null ? void 0 : _a.dragging) {\n decorations.push(\n Decoration2.node(\n start + cellPos,\n start + cellPos + table.nodeAt(cellPos).nodeSize,\n {\n class: \"column-resize-dragging\"\n }\n )\n );\n }\n decorations.push(Decoration2.widget(pos, dom));\n }\n }\n return DecorationSet2.create(state.doc, decorations);\n}\n\n// src/index.ts\nfunction tableEditing({\n allowTableNodeSelection = false\n} = {}) {\n return new Plugin2({\n key: tableEditingKey,\n // This piece of state is used to remember when a mouse-drag\n // cell-selection is happening, so that it can continue even as\n // transactions (which might move its anchor cell) come in.\n state: {\n init() {\n return null;\n },\n apply(tr, cur) {\n const set = tr.getMeta(tableEditingKey);\n if (set != null) return set == -1 ? null : set;\n if (cur == null || !tr.docChanged) return cur;\n const { deleted, pos } = tr.mapping.mapResult(cur);\n return deleted ? null : pos;\n }\n },\n props: {\n decorations: drawCellSelection,\n handleDOMEvents: {\n mousedown: handleMouseDown\n },\n createSelectionBetween(view) {\n return tableEditingKey.getState(view.state) != null ? view.state.selection : null;\n },\n handleTripleClick,\n handleKeyDown,\n handlePaste\n },\n appendTransaction(_, oldState, state) {\n return normalizeSelection(\n state,\n fixTables(state, oldState),\n allowTableNodeSelection\n );\n }\n });\n}\nexport {\n CellBookmark,\n CellSelection,\n ResizeState,\n TableMap,\n TableView,\n clipCells as __clipCells,\n insertCells as __insertCells,\n pastedCells as __pastedCells,\n addColSpan,\n addColumn,\n addColumnAfter,\n addColumnBefore,\n addRow,\n addRowAfter,\n addRowBefore,\n cellAround,\n cellNear,\n colCount,\n columnIsHeader,\n columnResizing,\n columnResizingPluginKey,\n deleteCellSelection,\n deleteColumn,\n deleteRow,\n deleteTable,\n findCell,\n fixTables,\n fixTablesKey,\n goToNextCell,\n handlePaste,\n inSameTable,\n isInTable,\n mergeCells,\n moveCellForward,\n nextCell,\n pointsAtCell,\n removeColSpan,\n removeColumn,\n removeRow,\n rowIsHeader,\n selectedRect,\n selectionCell,\n setCellAttr,\n splitCell,\n splitCellWithType,\n tableEditing,\n tableEditingKey,\n tableNodeTypes,\n tableNodes,\n toggleHeader,\n toggleHeaderCell,\n toggleHeaderColumn,\n toggleHeaderRow,\n updateColumnsOnResize\n};\n","import { CellSelection } from 'prosemirror-tables';\n\nexport const isCellSelection = (value) => value instanceof CellSelection;\n","import { findParentNodeClosestToPos } from '@core/helpers/findParentNodeClosestToPos.js';\nimport { isCellSelection } from './isCellSelection.js';\n\nexport const deleteTableWhenSelected = ({ editor }) => {\n const { selection } = editor.state;\n\n if (!isCellSelection(selection)) return false;\n\n let cellCount = 0;\n const table = findParentNodeClosestToPos(selection.ranges[0].$from, (node) => {\n return node.type.name === 'table';\n });\n\n table?.node.descendants((node) => {\n if (node.type.name === 'table') return false;\n if (['tableCell', 'tableHeader'].includes(node.type.name)) {\n cellCount += 1;\n };\n });\n\n const allCellsSelected = cellCount === selection.ranges.length;\n\n if (!allCellsSelected) {\n return false;\n }\n\n editor.commands.deleteTable();\n \n return true;\n};\n","export const createCellBorders = ({\n size = 0.66665,\n color = '#000000',\n} = {}) => {\n return {\n top: { size, color },\n left: { size, color },\n bottom: { size, color },\n right: { size, color },\n };\n};\n","import { Node, Attribute } from '@core/index.js';\nimport { callOrGet } from '@core/utilities/callOrGet.js';\nimport { getExtensionConfigField } from '@core/helpers/getExtensionConfigField.js';\nimport { /* TableView */ createTableView } from './TableView.js';\nimport { createTable } from './tableHelpers/createTable.js';\nimport { createColGroup } from './tableHelpers/createColGroup.js';\nimport { deleteTableWhenSelected } from './tableHelpers/deleteTableWhenSelected.js';\nimport { isInTable } from '@helpers/isInTable.js';\nimport { createTableBorders } from './tableHelpers/createTableBorders.js';\nimport { createCellBorders } from '../table-cell/helpers/createCellBorders.js';\nimport { findParentNode } from '@helpers/findParentNode.js';\nimport { TextSelection } from 'prosemirror-state';\nimport {\n addColumnBefore,\n addColumnAfter,\n addRowBefore,\n addRowAfter,\n CellSelection,\n columnResizing,\n deleteColumn,\n deleteRow,\n deleteTable,\n fixTables,\n goToNextCell,\n mergeCells,\n setCellAttr,\n splitCell,\n tableEditing,\n toggleHeader,\n toggleHeaderCell,\n // TableView,\n} from 'prosemirror-tables';\n\nexport const Table = Node.create({\n name: 'table',\n\n content: 'tableRow+',\n\n group: 'block',\n\n isolating: true,\n\n tableRole: 'table',\n\n addOptions() {\n return {\n htmlAttributes: {},\n resizable: true,\n handleWidth: 5,\n cellMinWidth: 25,\n lastColumnResizable: true,\n allowTableNodeSelection: false,\n };\n },\n\n addAttributes() {\n return {\n /* tableWidth: {\n renderDOM: ({ tableWidth }) => {\n if (!tableWidth) return {};\n const { width, type = 'auto' } = tableWidth;\n return { \n style: `width: ${width}px` \n };\n },\n }, */\n\n tableIndent: {\n renderDOM: ({ tableIndent }) => {\n if (!tableIndent) return {};\n const { width, type = 'dxa' } = tableIndent;\n let style = '';\n if (width) style += `margin-left: ${width}px`;\n return { \n style, \n };\n },\n },\n\n borders: {\n default: {},\n renderDOM({ borders }) {\n if (!borders) return {};\n const style = Object.entries(borders).reduce(\n (acc, [key, { size, color }]) => {\n return `${acc}border-${key}: ${size}px solid ${color || 'black'};`;\n }, \n ''\n );\n\n return { \n style, \n };\n },\n },\n\n borderCollapse: {\n default: null,\n renderDOM({ borderCollapse }) {\n return { \n style: `border-collapse: ${borderCollapse || 'collapse'}`, \n };\n },\n },\n\n tableStyleId: { \n rendered: false, \n },\n\n tableLayout: { \n rendered: false \n },\n\n tableCellSpacing: {\n default: null,\n rendered: false,\n },\n };\n },\n\n parseDOM() {\n return [{ tag: 'table' }];\n },\n\n renderDOM({ node, htmlAttributes }) {\n const { colgroup, tableWidth, tableMinWidth } = createColGroup(\n node,\n this.options.cellMinWidth,\n );\n\n const attrs = Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes, {\n style: tableWidth \n ? `width: ${tableWidth}` \n : `min-width: ${tableMinWidth}`,\n });\n\n const table = [\n 'table', \n attrs, \n colgroup, \n ['tbody', 0],\n ];\n\n return table;\n },\n\n addCommands() {\n return {\n insertTable:\n ({ rows = 3, cols = 3, withHeaderRow = false } = {}) => ({ tr, dispatch, editor }) => {\n const node = createTable(editor.schema, rows, cols, withHeaderRow);\n\n if (dispatch) {\n const offset = tr.selection.from + 1;\n tr.replaceSelectionWith(node)\n .scrollIntoView()\n .setSelection(TextSelection.near(tr.doc.resolve(offset)));\n }\n \n return true;\n },\n\n deleteTable:\n () => ({ state, dispatch }) => {\n return deleteTable(state, dispatch);\n },\n\n addColumnBefore:\n () => ({ state, dispatch }) => {\n return addColumnBefore(state, dispatch);\n },\n\n addColumnAfter:\n () => ({ state, dispatch }) => {\n return addColumnAfter(state, dispatch);\n },\n\n deleteColumn:\n () => ({ state, dispatch }) => {\n return deleteColumn(state, dispatch);\n },\n\n addRowBefore:\n () => ({ state, dispatch }) => {\n return addRowBefore(state, dispatch);\n },\n\n addRowAfter:\n () => ({ state, dispatch }) => {\n return addRowAfter(state, dispatch);\n },\n\n deleteRow:\n () => ({ state, dispatch }) => {\n return deleteRow(state, dispatch);\n },\n\n mergeCells:\n () => ({ state, dispatch }) => {\n return mergeCells(state, dispatch);\n },\n\n splitCell:\n () => ({ state, dispatch }) => {\n return splitCell(state, dispatch);\n },\n\n mergeOrSplit:\n () => ({ state, dispatch }) => {\n if (mergeCells(state, dispatch)) {\n return true;\n }\n\n return splitCell(state, dispatch);\n },\n\n toggleHeaderColumn:\n () => ({ state, dispatch }) => {\n return toggleHeader('column')(state, dispatch);\n },\n\n toggleHeaderRow:\n () => ({ state, dispatch }) => {\n return toggleHeader('row')(state, dispatch);\n },\n\n toggleHeaderCell:\n () => ({ state, dispatch }) => {\n return toggleHeaderCell(state, dispatch);\n },\n\n setCellAttr:\n (name, value) => ({ state, dispatch }) => {\n return setCellAttr(name, value)(state, dispatch);\n },\n\n goToNextCell:\n () => ({ state, dispatch }) => {\n return goToNextCell(1)(state, dispatch);\n },\n\n goToPreviousCell:\n () => ({ state, dispatch }) => {\n return goToNextCell(-1)(state, dispatch);\n },\n\n fixTables:\n () => ({ state, dispatch }) => {\n if (dispatch) {\n fixTables(state);\n }\n\n return true;\n },\n\n setCellSelection:\n (pos) => ({ tr, dispatch }) => {\n if (dispatch) {\n tr.setSelection(CellSelection.create(tr.doc, pos.anchorCell, pos.headCell));\n }\n\n return true;\n },\n\n deleteCellAndTableBorders:\n () => ({ chain, state, tr }) => {\n if (!isInTable(state)) {\n return false;\n }\n\n const table = findParentNode((node) => node.type.name === this.name)(state.selection);\n\n if (!table) {\n return false;\n }\n\n const from = table.pos;\n const to = table.pos + table.node.nodeSize;\n\n // remove from cells\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (['tableCell', 'tableHeader'].includes(node.type.name)) {\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n borders: createCellBorders({ size: 0 }),\n });\n }\n });\n\n // remove from table\n tr.setNodeMarkup(table.pos, undefined, {\n ...table.node.attrs,\n borders: createTableBorders({ size: 0 }),\n });\n\n return true;\n },\n };\n },\n\n addShortcuts() {\n return {\n Tab: () => {\n if (this.editor.commands.goToNextCell()) {\n return true;\n }\n if (!this.editor.can().addRowAfter()) {\n return false;\n }\n return this.editor.chain().addRowAfter().goToNextCell().run();\n },\n 'Shift-Tab': () => this.editor.commands.goToPreviousCell(),\n Backspace: deleteTableWhenSelected,\n 'Mod-Backspace': deleteTableWhenSelected,\n Delete: deleteTableWhenSelected,\n 'Mod-Delete': deleteTableWhenSelected,\n };\n },\n\n addPmPlugins() {\n const resizable = this.options.resizable && this.editor.isEditable;\n\n return [\n ...(resizable\n ? [\n columnResizing({\n handleWidth: this.options.handleWidth,\n cellMinWidth: this.options.cellMinWidth,\n defaultCellMinWidth: this.options.cellMinWidth,\n lastColumnResizable: this.options.lastColumnResizable,\n View: createTableView({\n editor: this.editor,\n }),\n }),\n ] \n : []),\n \n tableEditing({\n allowTableNodeSelection: this.options.allowTableNodeSelection,\n }),\n ];\n },\n\n extendNodeSchema(extension) {\n return {\n tableRole: callOrGet(getExtensionConfigField(extension, 'tableRole', {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n })),\n };\n },\n});\n","import { Node, Attribute } from '@core/index.js';\n\nexport const TableHeader = Node.create({\n name: 'tableHeader',\n\n content: 'block+',\n\n tableRole: 'header_cell',\n\n isolating: true,\n\n addOptions() {\n return {\n htmlAttributes: {},\n };\n },\n\n addAttributes() {\n return {\n colspan: { \n default: 1, \n },\n rowspan: { \n default: 1, \n },\n colwidth: {\n default: null,\n parseDOM: (element) => {\n const colwidth = element.getAttribute('data-colwidth');\n const value = colwidth\n ? colwidth.split(',').map((width) => parseInt(width, 10))\n : null;\n return value;\n },\n renderDOM: (attrs) => {\n if (!attrs.colwidth) return {};\n return {\n 'data-colwidth': attrs.colwidth.join(','),\n };\n },\n },\n };\n },\n\n parseDOM() {\n return [{ tag: 'th' }];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['th', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n});\n","import { Node, Attribute } from '@core/index.js';\n\nexport const TableRow = Node.create({\n name: 'tableRow',\n\n content: '(tableCell | tableHeader)*',\n\n tableRole: 'row',\n\n addOptions() {\n return {\n htmlAttributes: {},\n };\n },\n\n addAttributes() {\n return {\n rowHeight: {\n renderDOM({ rowHeight }) {\n if (!rowHeight) return {};\n const style = `height: ${rowHeight}px`;\n return { style };\n },\n },\n };\n },\n\n parseDOM() {\n return [{ tag: 'tr' }];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['tr', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n});\n","import { Node, Attribute } from '@core/index.js';\nimport { createCellBorders } from './helpers/createCellBorders.js';\n\nexport const TableCell = Node.create({\n name: 'tableCell',\n\n content: 'block+',\n\n tableRole: 'cell',\n\n isolating: true,\n\n addOptions() {\n return {\n htmlAttributes: {},\n };\n },\n\n addAttributes() {\n return {\n colspan: { \n default: 1, \n },\n\n rowspan: {\n default: 1,\n },\n\n colwidth: {\n default: [100],\n parseDOM: (elem) => {\n const colwidth = elem.getAttribute('data-colwidth');\n const value = colwidth\n ? colwidth.split(',').map((width) => parseInt(width, 10))\n : null;\n return value;\n },\n renderDOM: (attrs) => {\n if (!attrs.colwidth) return {};\n return {\n 'data-colwidth': attrs.colwidth.join(','),\n };\n },\n },\n\n /* width: {\n renderDOM: ({ width, widthType, widthUnit }) => {\n if (!width) return {};\n let unit = widthUnit === 'px' ? widthUnit : 'in';\n if (widthType === 'pct') unit = '%';\n const style = `width: ${width}${unit}`;\n return { style };\n },\n }, */\n \n background: {\n renderDOM({ background }) {\n if (!background) return {};\n const { color } = background || {};\n const style = `background-color: ${color ? `#${color}` : 'transparent'}`;\n return { style };\n },\n },\n\n verticalAlign: {\n renderDOM({ verticalAlign }) {\n if (!verticalAlign) return {};\n const style = `vertical-align: ${verticalAlign}`;\n return { style };\n },\n },\n\n cellMargins: {\n renderDOM({ cellMargins }) {\n if (!cellMargins) return {};\n const sides = ['top', 'right', 'bottom', 'left'];\n const style = sides\n .map((side) => {\n const margin = cellMargins?.[side];\n if (margin) return `padding-${side}: ${margin}px;`;\n return '';\n })\n .join(' ');\n return { style };\n },\n },\n\n borders: {\n default: () => createCellBorders(),\n renderDOM({ borders }) {\n if (!borders) return {};\n const sides = ['top', 'right', 'bottom', 'left'];\n const style = sides\n .map((side) => {\n const border = borders?.[side];\n if (border && border.val === 'none') return `border-${side}: ${border.val};`;\n if (border) return `border-${side}: ${border.size}px solid ${border.color || 'black'};`;\n return '';\n })\n .join(' ');\n return { style };\n },\n },\n\n widthType: { \n default: 'auto', \n rendered: false, \n },\n\n widthUnit: { \n default: 'px', \n rendered: false, \n },\n };\n },\n\n parseDOM() {\n return [{ tag: 'td' }];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['td', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n});\n","import { Attribute } from '@core/index.js';\nimport { NodeSelection } from 'prosemirror-state';\n\nexport class FieldAnnotationView {\n editor;\n\n node;\n\n decorations;\n\n getPos;\n\n htmlAttributes;\n\n dom;\n\n annotationClass;\n\n annotationContentClass;\n\n borderColor;\n\n constructor(options) {\n this.editor = options.editor;\n this.node = options.node;\n this.decorations = options.decorations;\n this.getPos = options.getPos;\n\n this.htmlAttributes = options.htmlAttributes;\n this.annotationClass = options.annotationClass;\n this.annotationContentClass = options.annotationContentClass;\n this.borderColor = options.borderColor;\n\n this.handleAnnotationClick = this.handleAnnotationClick.bind(this);\n this.handleAnnotationDoubleClick = this.handleAnnotationDoubleClick.bind(this);\n this.handleSelectionUpdate = this.handleSelectionUpdate.bind(this);\n\n this.buildView();\n this.attachEventListeners();\n }\n\n buildView() {\n let { type } = this.node.attrs;\n\n let handlers = {\n text: (...args) => this.buildTextView(...args),\n image: (...args) => this.buildImageView(...args),\n signature: (...args) => this.buildSignatureView(...args),\n checkbox: (...args) => this.buildCheckboxView(...args),\n html: (...args) => this.buildHTMLView(...args),\n link: (...args) => this.buildLinkView(...args),\n default: (...args) => this.buildTextView(...args),\n };\n\n let buildHandler = handlers[type] ?? handlers.default;\n\n buildHandler();\n }\n\n buildTextView() {\n let { displayLabel } = this.node.attrs;\n\n let { annotation } = this.#createAnnotation({\n displayLabel,\n });\n\n this.dom = annotation;\n }\n\n buildImageView() {\n let { displayLabel, imageSrc } = this.node.attrs;\n\n let { annotation, content } = this.#createAnnotation();\n\n if (imageSrc) {\n let img = document.createElement('img');\n img.src = imageSrc;\n img.alt = displayLabel;\n\n img.style.height = 'auto';\n img.style.maxWidth = '100%';\n img.style.pointerEvents = 'none';\n img.style.verticalAlign = 'middle';\n\n content.append(img);\n\n annotation.style.display = 'inline-block';\n content.style.display = 'inline-block';\n } else {\n content.textContent = displayLabel;\n }\n\n this.dom = annotation;\n }\n\n buildSignatureView() {\n let { displayLabel, imageSrc } = this.node.attrs;\n\n displayLabel = displayLabel || 'Signature';\n\n let { annotation, content } = this.#createAnnotation();\n\n if (imageSrc) {\n let img = document.createElement('img');\n img.src = imageSrc;\n img.alt = displayLabel;\n\n img.style.height = 'auto';\n img.style.maxWidth = '100%';\n img.style.maxHeight = '28px';\n img.style.pointerEvents = 'none';\n img.style.verticalAlign = 'middle';\n\n content.append(img);\n\n annotation.style.display = 'inline-block';\n content.style.display = 'inline-block';\n } else {\n content.textContent = displayLabel;\n }\n\n this.dom = annotation;\n }\n\n buildCheckboxView() {\n let { displayLabel } = this.node.attrs;\n\n let { annotation } = this.#createAnnotation({\n displayLabel,\n });\n\n this.dom = annotation;\n }\n\n buildHTMLView() {\n let { displayLabel, rawHtml } = this.node.attrs;\n\n let { annotation, content } = this.#createAnnotation();\n\n if (rawHtml) {\n content.innerHTML = rawHtml.trim();\n\n annotation.style.display = 'inline-block';\n content.style.display = 'inline-block';\n } else {\n content.textContent = displayLabel;\n }\n\n this.dom = annotation;\n }\n\n buildLinkView() {\n let { displayLabel, linkUrl } = this.node.attrs;\n\n let { annotation, content } = this.#createAnnotation();\n\n if (linkUrl) {\n let link = document.createElement('a');\n\n link.href = linkUrl;\n link.target = '_blank';\n link.textContent = linkUrl;\n link.style.textDecoration = 'none';\n\n content.append(link);\n\n content.style.pointerEvents = 'all';\n } else {\n content.textContent = displayLabel;\n }\n\n this.dom = annotation;\n }\n\n #createAnnotation({ displayLabel } = {}) {\n let { highlighted } = this.node.attrs;\n\n let annotation = document.createElement('span');\n annotation.classList.add(this.annotationClass);\n\n let content = document.createElement('span');\n content.classList.add(this.annotationContentClass);\n content.style.pointerEvents = 'none';\n content.contentEditable = 'false';\n\n if (displayLabel) {\n content.textContent = displayLabel;\n }\n\n annotation.append(content);\n\n let omitHighlight = highlighted === false;\n let annotationStyle = [`border: 2px solid ${this.borderColor}`, `border-radius: 2px`, `padding: 1px 2px`, `box-sizing: border-box`].join(\n '; ',\n );\n\n let mergedAttrs = Attribute.mergeAttributes(this.htmlAttributes, {\n style: omitHighlight ? '' : annotationStyle,\n });\n\n for (let [key, value] of Object.entries(mergedAttrs)) {\n annotation.setAttribute(key, value);\n }\n\n return {\n annotation,\n content,\n };\n }\n\n attachEventListeners() {\n this.dom.addEventListener('click', this.handleAnnotationClick);\n this.dom.addEventListener('dblclick', this.handleAnnotationDoubleClick);\n this.editor.on('selectionUpdate', this.handleSelectionUpdate);\n }\n\n removeEventListeners() {\n this.dom.removeEventListener('click', this.handleAnnotationClick);\n this.dom.removeEventListener('dblclick', this.handleAnnotationDoubleClick);\n this.editor.off('selectionUpdate', this.handleSelectionUpdate);\n }\n\n handleSelectionUpdate({ editor, transaction }) {\n if (!this.editor.isEditable) {\n return;\n }\n\n let { selection } = editor.state;\n\n if (selection instanceof NodeSelection) {\n let currentNode = selection.node;\n\n if (this.node.eq(currentNode)) {\n this.editor.emit('fieldAnnotationSelected', {\n editor: this.editor,\n node: this.node,\n nodePos: this.getPos(),\n target: this.dom,\n });\n }\n }\n }\n\n handleAnnotationClick(event) {\n if (!this.editor.isEditable) {\n return;\n }\n\n this.editor.emit('fieldAnnotationClicked', {\n editor: this.editor,\n node: this.node,\n nodePos: this.getPos(),\n event,\n currentTarget: event.currentTarget,\n });\n }\n\n handleAnnotationDoubleClick(event) {\n if (!this.editor.isEditable) {\n return;\n }\n\n this.editor.emit('fieldAnnotationDoubleClicked', {\n editor: this.editor,\n node: this.node,\n nodePos: this.getPos(),\n event,\n currentTarget: event.currentTarget,\n });\n }\n\n stopEvent(event) {\n if (!this.editor.isEditable) {\n event.preventDefault();\n return true;\n }\n\n return false;\n }\n\n // Can be used to manually update the NodeView.\n // Otherwise the NodeView is recreated.\n update(updatedNode) {\n return false;\n }\n\n ignoreMutation(mutation) {\n // https://github.com/ueberdosis/tiptap/blob/main/packages/core/src/NodeView.ts\n // a leaf/atom node is like a black box for ProseMirror\n // and should be fully handled by the node view\n return true;\n }\n\n destroy() {\n this.removeEventListeners();\n }\n\n updateAttributes(attributes) {\n this.editor.commands.command(({ tr }) => {\n tr.setNodeMarkup(this.getPos(), undefined, {\n ...this.node.attrs,\n ...attributes,\n });\n return true;\n });\n }\n}\n","import { ReplaceStep } from 'prosemirror-transform';\n\nexport function findRemovedFieldAnnotations(tr) {\n let removedNodes = [];\n\n if (\n !tr.steps.length ||\n (tr.meta && !Object.keys(tr.meta).every((meta) => ['inputType', 'uiEvent', 'paste'].includes(meta))) ||\n ['historyUndo', 'historyRedo'].includes(tr.getMeta('inputType')) ||\n ['drop'].includes(tr.getMeta('uiEvent')) ||\n tr.getMeta('fieldAnnotationUpdate') === true\n ) {\n return removedNodes;\n }\n\n tr.steps.forEach((step, stepIndex) => {\n if (step instanceof ReplaceStep && step.from !== step.to) {\n let mapping = tr.mapping.maps[stepIndex];\n let originalDoc = tr.before;\n\n originalDoc.nodesBetween(step.from, step.to, (node, pos) => {\n if (node.type.name === 'fieldAnnotation') {\n let mappedPos = mapping.mapResult(pos);\n\n if (mappedPos.deleted) {\n removedNodes.push({ node, pos });\n }\n }\n });\n }\n });\n\n return removedNodes;\n}\n","import { findRemovedFieldAnnotations } from './findRemovedFieldAnnotations.js';\n\nexport function trackFieldAnnotationsDeletion(editor, tr) {\n let removedAnnotations = findRemovedFieldAnnotations(tr);\n\n if (removedAnnotations.length > 0) {\n setTimeout(() => {\n editor.emit('fieldAnnotationDeleted', {\n editor,\n removedNodes: removedAnnotations,\n });\n }, 0);\n }\n}\n","import { helpers } from '@core/index.js';\n\nconst { findChildren } = helpers;\n\n/**\n * Get all field annotations in the doc.\n * @param state The editor state.\n * @returns The array of field annotations.\n */\nexport function getAllFieldAnnotations(state) {\n let fieldAnnotations = findChildren(state.doc, (node) => node.type.name === 'fieldAnnotation');\n\n return fieldAnnotations;\n}\n","import { Plugin, PluginKey } from 'prosemirror-state';\nimport { trackFieldAnnotationsDeletion } from './fieldAnnotationHelpers/trackFieldAnnotationsDeletion.js';\nimport { getAllFieldAnnotations } from './fieldAnnotationHelpers/getAllFieldAnnotations.js';\n\nexport const FieldAnnotationPlugin = (options = {}) => {\n let { editor, annotationClass } = options;\n\n return new Plugin({\n key: new PluginKey('fieldAnnotation'),\n\n state: {\n init() {\n return null;\n },\n\n apply(tr, prevState) {\n trackFieldAnnotationsDeletion(editor, tr);\n\n return prevState;\n },\n },\n\n props: {\n handleDrop(view, event, slice, moved) {\n if (moved) return false;\n\n let fieldAnnotation = event?.dataTransfer.getData('fieldAnnotation');\n\n if (fieldAnnotation) {\n if (options.handleDropOutside) {\n handleDropOutside({\n fieldAnnotation,\n editor,\n view,\n event,\n });\n } else {\n let annotationAttrs;\n\n try {\n let fieldAnnotationObj = JSON.parse(fieldAnnotation);\n annotationAttrs = fieldAnnotationObj.attributes;\n } catch {\n return false;\n }\n\n const coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n });\n\n if (coordinates) {\n editor.commands.addFieldAnnotation(coordinates.pos, {\n ...annotationAttrs,\n });\n }\n }\n\n return true;\n }\n\n return false;\n },\n\n handlePaste(view, event, slice) {\n const content = slice.content.content.filter((item) => item.type.name === 'fieldAnnotation');\n if (content.length) {\n editor.emit('fieldAnnotationPaste', {\n content,\n editor,\n });\n }\n return false;\n },\n\n handleDOMEvents: {\n dragstart: (view, event) => {\n if (!event.target) return false;\n\n let { target } = event;\n let isAnnotationField = target.classList?.contains(annotationClass);\n\n if (isAnnotationField) {\n event.dataTransfer?.setDragImage(target, 0, 0);\n }\n\n return false;\n },\n\n // drop: (view, event) => {\n // console.log({ view, event });\n // },\n },\n },\n\n /// For y-prosemirror support.\n appendTransaction: (transactions, oldState, newState) => {\n let docChanges = transactions.some((tr) => tr.docChanged) && !oldState.doc.eq(newState.doc);\n\n if (!docChanges) {\n return;\n }\n\n let { tr, doc } = newState;\n let changed = false;\n\n let annotations = getAllFieldAnnotations(newState);\n\n if (!annotations.length) {\n return;\n }\n\n annotations.forEach(({ node, pos }) => {\n let { marks } = node;\n let currentNode = tr.doc.nodeAt(pos);\n\n if (marks.length > 0 && node.eq(currentNode)) {\n // Unset all marks from annotation.\n tr.removeMark(pos, pos + node.nodeSize, null);\n changed = true;\n }\n });\n \n return changed ? tr : null;\n },\n ///\n });\n};\n\nfunction handleDropOutside({ fieldAnnotation, editor, view, event }) {\n let sourceField;\n try {\n let fieldAnnotationObj = JSON.parse(fieldAnnotation);\n sourceField = fieldAnnotationObj.sourceField;\n } catch {\n return;\n }\n\n let coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n });\n\n if (coordinates) {\n editor.emit('fieldAnnotationDropped', {\n sourceField,\n editor,\n coordinates,\n pos: coordinates.pos,\n });\n }\n}\n","import { getNodeType, posToDOMRect } from '@core/helpers/index.js';\nimport { getAllFieldAnnotations } from './getAllFieldAnnotations.js';\n\n/**\n * Get all field annotations with rects in the doc.\n * @param view The editor view.\n * @param state The editor state.\n * @returns The array of field annotations with rects.\n */\nexport function getAllFieldAnnotationsWithRect(view, state) {\n let fieldAnnotations = getAllFieldAnnotations(state).map(({ node, pos }) => {\n let rect = posToDOMRect(view, pos, pos + node.nodeSize);\n return {\n node,\n pos,\n rect,\n };\n });\n\n return fieldAnnotations;\n}\n","import { getAllFieldAnnotations } from './getAllFieldAnnotations.js';\n\nexport function findFieldAnnotations(predicate, state) {\n let allFieldAnnotations = getAllFieldAnnotations(state);\n let fieldAnnotations = [];\n\n allFieldAnnotations.forEach((annotation) => {\n if (predicate(annotation.node)) {\n fieldAnnotations.push(annotation);\n }\n });\n\n return fieldAnnotations;\n}\n","import { helpers } from '@core/index.js';\n\nconst { findChildren } = helpers;\n\n/**\n * Find field annotations by field ID or array of field IDs.\n * @param fieldIdOrArray The field ID or array of field IDs.\n * @param state The editor state.\n * @returns The field annotations array.\n */\nexport function findFieldAnnotationsByFieldId(fieldIdOrArray, state) {\n let fieldAnnotations = findChildren(state.doc, (node) => {\n let isFieldAnnotation = node.type.name === 'fieldAnnotation';\n if (Array.isArray(fieldIdOrArray)) {\n return isFieldAnnotation && fieldIdOrArray.includes(node.attrs.fieldId);\n } else {\n return isFieldAnnotation && node.attrs.fieldId === fieldIdOrArray;\n }\n });\n\n return fieldAnnotations;\n}\n","/**\n * Find first field annotation by field ID.\n * @param fieldId The field ID.\n * @param state The editor state.\n * @returns The field annotation or null.\n */\nexport function findFirstFieldAnnotationByFieldId(fieldId, state) {\n let fieldAnnotation = findNode(state.doc, (node) => {\n return node.type.name === 'fieldAnnotation' && node.attrs.fieldId === fieldId;\n });\n\n return fieldAnnotation;\n}\n\nfunction findNode(node, predicate) {\n let found = null;\n node.descendants((node, pos) => {\n if (predicate(node)) found = { node, pos };\n if (found) return false;\n });\n return found;\n}\n","\n/**\n * Find all field annotations between positions.\n * @param from From position.\n * @param to To position.\n * @param doc Document.\n * @returns The array of field annotations (node and pos).\n */\nexport function findFieldAnnotationsBetween(from, to, doc) {\n let fieldAnnotations = [];\n\n doc.nodesBetween(from, to, (node, pos) => {\n if (!node || node?.nodeSize === undefined) {\n return;\n }\n\n if (node.type.name === 'fieldAnnotation') {\n fieldAnnotations.push({\n node,\n pos,\n });\n }\n });\n \n return fieldAnnotations;\n}\n","/**\n * A simple guard function:\n *\n * ```js\n * Math.min(Math.max(low, value), high)\n * ```\n */\nfunction guard(low, high, value) {\n return Math.min(Math.max(low, value), high);\n}\n\nclass ColorError extends Error {\n constructor(color) {\n super(`Failed to parse color: \"${color}\"`);\n }\n}\nvar ColorError$1 = ColorError;\n\n/**\n * Parses a color into red, gree, blue, alpha parts\n *\n * @param color the input color. Can be a RGB, RBGA, HSL, HSLA, or named color\n */\nfunction parseToRgba(color) {\n if (typeof color !== 'string') throw new ColorError$1(color);\n if (color.trim().toLowerCase() === 'transparent') return [0, 0, 0, 0];\n let normalizedColor = color.trim();\n normalizedColor = namedColorRegex.test(color) ? nameToHex(color) : color;\n const reducedHexMatch = reducedHexRegex.exec(normalizedColor);\n if (reducedHexMatch) {\n const arr = Array.from(reducedHexMatch).slice(1);\n return [...arr.slice(0, 3).map(x => parseInt(r(x, 2), 16)), parseInt(r(arr[3] || 'f', 2), 16) / 255];\n }\n const hexMatch = hexRegex.exec(normalizedColor);\n if (hexMatch) {\n const arr = Array.from(hexMatch).slice(1);\n return [...arr.slice(0, 3).map(x => parseInt(x, 16)), parseInt(arr[3] || 'ff', 16) / 255];\n }\n const rgbaMatch = rgbaRegex.exec(normalizedColor);\n if (rgbaMatch) {\n const arr = Array.from(rgbaMatch).slice(1);\n return [...arr.slice(0, 3).map(x => parseInt(x, 10)), parseFloat(arr[3] || '1')];\n }\n const hslaMatch = hslaRegex.exec(normalizedColor);\n if (hslaMatch) {\n const [h, s, l, a] = Array.from(hslaMatch).slice(1).map(parseFloat);\n if (guard(0, 100, s) !== s) throw new ColorError$1(color);\n if (guard(0, 100, l) !== l) throw new ColorError$1(color);\n return [...hslToRgb(h, s, l), Number.isNaN(a) ? 1 : a];\n }\n throw new ColorError$1(color);\n}\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i) {\n hash = hash * 33 ^ str.charCodeAt(--i);\n }\n\n /* JavaScript does bitwise operations (like XOR, above) on 32-bit signed\n * integers. Since we want the results to be always positive, convert the\n * signed int to an unsigned by doing an unsigned bitshift. */\n return (hash >>> 0) % 2341;\n}\nconst colorToInt = x => parseInt(x.replace(/_/g, ''), 36);\nconst compressedColorMap = '1q29ehhb 1n09sgk7 1kl1ekf_ _yl4zsno 16z9eiv3 1p29lhp8 _bd9zg04 17u0____ _iw9zhe5 _to73___ _r45e31e _7l6g016 _jh8ouiv _zn3qba8 1jy4zshs 11u87k0u 1ro9yvyo 1aj3xael 1gz9zjz0 _3w8l4xo 1bf1ekf_ _ke3v___ _4rrkb__ 13j776yz _646mbhl _nrjr4__ _le6mbhl 1n37ehkb _m75f91n _qj3bzfz 1939yygw 11i5z6x8 _1k5f8xs 1509441m 15t5lwgf _ae2th1n _tg1ugcv 1lp1ugcv 16e14up_ _h55rw7n _ny9yavn _7a11xb_ 1ih442g9 _pv442g9 1mv16xof 14e6y7tu 1oo9zkds 17d1cisi _4v9y70f _y98m8kc 1019pq0v 12o9zda8 _348j4f4 1et50i2o _8epa8__ _ts6senj 1o350i2o 1mi9eiuo 1259yrp0 1ln80gnw _632xcoy 1cn9zldc _f29edu4 1n490c8q _9f9ziet 1b94vk74 _m49zkct 1kz6s73a 1eu9dtog _q58s1rz 1dy9sjiq __u89jo3 _aj5nkwg _ld89jo3 13h9z6wx _qa9z2ii _l119xgq _bs5arju 1hj4nwk9 1qt4nwk9 1ge6wau6 14j9zlcw 11p1edc_ _ms1zcxe _439shk6 _jt9y70f _754zsow 1la40eju _oq5p___ _x279qkz 1fa5r3rv _yd2d9ip _424tcku _8y1di2_ _zi2uabw _yy7rn9h 12yz980_ __39ljp6 1b59zg0x _n39zfzp 1fy9zest _b33k___ _hp9wq92 1il50hz4 _io472ub _lj9z3eo 19z9ykg0 _8t8iu3a 12b9bl4a 1ak5yw0o _896v4ku _tb8k8lv _s59zi6t _c09ze0p 1lg80oqn 1id9z8wb _238nba5 1kq6wgdi _154zssg _tn3zk49 _da9y6tc 1sg7cv4f _r12jvtt 1gq5fmkz 1cs9rvci _lp9jn1c _xw1tdnb 13f9zje6 16f6973h _vo7ir40 _bt5arjf _rc45e4t _hr4e100 10v4e100 _hc9zke2 _w91egv_ _sj2r1kk 13c87yx8 _vqpds__ _ni8ggk8 _tj9yqfb 1ia2j4r4 _7x9b10u 1fc9ld4j 1eq9zldr _5j9lhpx _ez9zl6o _md61fzm'.split(' ').reduce((acc, next) => {\n const key = colorToInt(next.substring(0, 3));\n const hex = colorToInt(next.substring(3)).toString(16);\n\n // NOTE: padStart could be used here but it breaks Node 6 compat\n // https://github.com/ricokahler/color2k/issues/351\n let prefix = '';\n for (let i = 0; i < 6 - hex.length; i++) {\n prefix += '0';\n }\n acc[key] = `${prefix}${hex}`;\n return acc;\n}, {});\n\n/**\n * Checks if a string is a CSS named color and returns its equivalent hex value, otherwise returns the original color.\n */\nfunction nameToHex(color) {\n const normalizedColorName = color.toLowerCase().trim();\n const result = compressedColorMap[hash(normalizedColorName)];\n if (!result) throw new ColorError$1(color);\n return `#${result}`;\n}\nconst r = (str, amount) => Array.from(Array(amount)).map(() => str).join('');\nconst reducedHexRegex = new RegExp(`^#${r('([a-f0-9])', 3)}([a-f0-9])?$`, 'i');\nconst hexRegex = new RegExp(`^#${r('([a-f0-9]{2})', 3)}([a-f0-9]{2})?$`, 'i');\nconst rgbaRegex = new RegExp(`^rgba?\\\\(\\\\s*(\\\\d+)\\\\s*${r(',\\\\s*(\\\\d+)\\\\s*', 2)}(?:,\\\\s*([\\\\d.]+))?\\\\s*\\\\)$`, 'i');\nconst hslaRegex = /^hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%(?:\\s*,\\s*([\\d.]+))?\\s*\\)$/i;\nconst namedColorRegex = /^[a-z]+$/i;\nconst roundColor = color => {\n return Math.round(color * 255);\n};\nconst hslToRgb = (hue, saturation, lightness) => {\n let l = lightness / 100;\n if (saturation === 0) {\n // achromatic\n return [l, l, l].map(roundColor);\n }\n\n // formulae from https://en.wikipedia.org/wiki/HSL_and_HSV\n const huePrime = (hue % 360 + 360) % 360 / 60;\n const chroma = (1 - Math.abs(2 * l - 1)) * (saturation / 100);\n const secondComponent = chroma * (1 - Math.abs(huePrime % 2 - 1));\n let red = 0;\n let green = 0;\n let blue = 0;\n if (huePrime >= 0 && huePrime < 1) {\n red = chroma;\n green = secondComponent;\n } else if (huePrime >= 1 && huePrime < 2) {\n red = secondComponent;\n green = chroma;\n } else if (huePrime >= 2 && huePrime < 3) {\n green = chroma;\n blue = secondComponent;\n } else if (huePrime >= 3 && huePrime < 4) {\n green = secondComponent;\n blue = chroma;\n } else if (huePrime >= 4 && huePrime < 5) {\n red = secondComponent;\n blue = chroma;\n } else if (huePrime >= 5 && huePrime < 6) {\n red = chroma;\n blue = secondComponent;\n }\n const lightnessModification = l - chroma / 2;\n const finalRed = red + lightnessModification;\n const finalGreen = green + lightnessModification;\n const finalBlue = blue + lightnessModification;\n return [finalRed, finalGreen, finalBlue].map(roundColor);\n};\n\n// taken from:\n// https://github.com/styled-components/polished/blob/a23a6a2bb26802b3d922d9c3b67bac3f3a54a310/src/internalHelpers/_rgbToHsl.js\n\n/**\n * Parses a color in hue, saturation, lightness, and the alpha channel.\n *\n * Hue is a number between 0 and 360, saturation, lightness, and alpha are\n * decimal percentages between 0 and 1\n */\nfunction parseToHsla(color) {\n const [red, green, blue, alpha] = parseToRgba(color).map((value, index) =>\n // 3rd index is alpha channel which is already normalized\n index === 3 ? value : value / 255);\n const max = Math.max(red, green, blue);\n const min = Math.min(red, green, blue);\n const lightness = (max + min) / 2;\n\n // achromatic\n if (max === min) return [0, 0, lightness, alpha];\n const delta = max - min;\n const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n const hue = 60 * (red === max ? (green - blue) / delta + (green < blue ? 6 : 0) : green === max ? (blue - red) / delta + 2 : (red - green) / delta + 4);\n return [hue, saturation, lightness, alpha];\n}\n\n/**\n * Takes in hsla parts and constructs an hsla string\n *\n * @param hue The color circle (from 0 to 360) - 0 (or 360) is red, 120 is green, 240 is blue\n * @param saturation Percentage of saturation, given as a decimal between 0 and 1\n * @param lightness Percentage of lightness, given as a decimal between 0 and 1\n * @param alpha Percentage of opacity, given as a decimal between 0 and 1\n */\nfunction hsla(hue, saturation, lightness, alpha) {\n return `hsla(${(hue % 360).toFixed()}, ${guard(0, 100, saturation * 100).toFixed()}%, ${guard(0, 100, lightness * 100).toFixed()}%, ${parseFloat(guard(0, 1, alpha).toFixed(3))})`;\n}\n\n/**\n * Adjusts the current hue of the color by the given degrees. Wraps around when\n * over 360.\n *\n * @param color input color\n * @param degrees degrees to adjust the input color, accepts degree integers\n * (0 - 360) and wraps around on overflow\n */\nfunction adjustHue(color, degrees) {\n const [h, s, l, a] = parseToHsla(color);\n return hsla(h + degrees, s, l, a);\n}\n\n/**\n * Darkens using lightness. This is equivalent to subtracting the lightness\n * from the L in HSL.\n *\n * @param amount The amount to darken, given as a decimal between 0 and 1\n */\nfunction darken(color, amount) {\n const [hue, saturation, lightness, alpha] = parseToHsla(color);\n return hsla(hue, saturation, lightness - amount, alpha);\n}\n\n/**\n * Desaturates the input color by the given amount via subtracting from the `s`\n * in `hsla`.\n *\n * @param amount The amount to desaturate, given as a decimal between 0 and 1\n */\nfunction desaturate(color, amount) {\n const [h, s, l, a] = parseToHsla(color);\n return hsla(h, s - amount, l, a);\n}\n\n// taken from:\n// https://github.com/styled-components/polished/blob/0764c982551b487469043acb56281b0358b3107b/src/color/getLuminance.js\n\n/**\n * Returns a number (float) representing the luminance of a color.\n */\nfunction getLuminance(color) {\n if (color === 'transparent') return 0;\n function f(x) {\n const channel = x / 255;\n return channel <= 0.04045 ? channel / 12.92 : Math.pow((channel + 0.055) / 1.055, 2.4);\n }\n const [r, g, b] = parseToRgba(color);\n return 0.2126 * f(r) + 0.7152 * f(g) + 0.0722 * f(b);\n}\n\n// taken from:\n// https://github.com/styled-components/polished/blob/0764c982551b487469043acb56281b0358b3107b/src/color/getContrast.js\n\n/**\n * Returns the contrast ratio between two colors based on\n * [W3's recommended equation for calculating contrast](http://www.w3.org/TR/WCAG20/#contrast-ratiodef).\n */\nfunction getContrast(color1, color2) {\n const luminance1 = getLuminance(color1);\n const luminance2 = getLuminance(color2);\n return luminance1 > luminance2 ? (luminance1 + 0.05) / (luminance2 + 0.05) : (luminance2 + 0.05) / (luminance1 + 0.05);\n}\n\n/**\n * Takes in rgba parts and returns an rgba string\n *\n * @param red The amount of red in the red channel, given in a number between 0 and 255 inclusive\n * @param green The amount of green in the red channel, given in a number between 0 and 255 inclusive\n * @param blue The amount of blue in the red channel, given in a number between 0 and 255 inclusive\n * @param alpha Percentage of opacity, given as a decimal between 0 and 1\n */\nfunction rgba(red, green, blue, alpha) {\n return `rgba(${guard(0, 255, red).toFixed()}, ${guard(0, 255, green).toFixed()}, ${guard(0, 255, blue).toFixed()}, ${parseFloat(guard(0, 1, alpha).toFixed(3))})`;\n}\n\n/**\n * Mixes two colors together. Taken from sass's implementation.\n */\nfunction mix(color1, color2, weight) {\n const normalize = (n, index) =>\n // 3rd index is alpha channel which is already normalized\n index === 3 ? n : n / 255;\n const [r1, g1, b1, a1] = parseToRgba(color1).map(normalize);\n const [r2, g2, b2, a2] = parseToRgba(color2).map(normalize);\n\n // The formula is copied from the original Sass implementation:\n // http://sass-lang.com/documentation/Sass/Script/Functions.html#mix-instance_method\n const alphaDelta = a2 - a1;\n const normalizedWeight = weight * 2 - 1;\n const combinedWeight = normalizedWeight * alphaDelta === -1 ? normalizedWeight : normalizedWeight + alphaDelta / (1 + normalizedWeight * alphaDelta);\n const weight2 = (combinedWeight + 1) / 2;\n const weight1 = 1 - weight2;\n const r = (r1 * weight1 + r2 * weight2) * 255;\n const g = (g1 * weight1 + g2 * weight2) * 255;\n const b = (b1 * weight1 + b2 * weight2) * 255;\n const a = a2 * weight + a1 * (1 - weight);\n return rgba(r, g, b, a);\n}\n\n/**\n * Given a series colors, this function will return a `scale(x)` function that\n * accepts a percentage as a decimal between 0 and 1 and returns the color at\n * that percentage in the scale.\n *\n * ```js\n * const scale = getScale('red', 'yellow', 'green');\n * console.log(scale(0)); // rgba(255, 0, 0, 1)\n * console.log(scale(0.5)); // rgba(255, 255, 0, 1)\n * console.log(scale(1)); // rgba(0, 128, 0, 1)\n * ```\n *\n * If you'd like to limit the domain and range like chroma-js, we recommend\n * wrapping scale again.\n *\n * ```js\n * const _scale = getScale('red', 'yellow', 'green');\n * const scale = x => _scale(x / 100);\n *\n * console.log(scale(0)); // rgba(255, 0, 0, 1)\n * console.log(scale(50)); // rgba(255, 255, 0, 1)\n * console.log(scale(100)); // rgba(0, 128, 0, 1)\n * ```\n */\nfunction getScale(...colors) {\n return n => {\n const lastIndex = colors.length - 1;\n const lowIndex = guard(0, lastIndex, Math.floor(n * lastIndex));\n const highIndex = guard(0, lastIndex, Math.ceil(n * lastIndex));\n const color1 = colors[lowIndex];\n const color2 = colors[highIndex];\n const unit = 1 / lastIndex;\n const weight = (n - unit * lowIndex) / unit;\n return mix(color1, color2, weight);\n };\n}\n\nconst guidelines = {\n decorative: 1.5,\n readable: 3,\n aa: 4.5,\n aaa: 7\n};\n\n/**\n * Returns whether or not a color has bad contrast against a background\n * according to a given standard.\n */\nfunction hasBadContrast(color, standard = 'aa', background = '#fff') {\n return getContrast(color, background) < guidelines[standard];\n}\n\n/**\n * Lightens a color by a given amount. This is equivalent to\n * `darken(color, -amount)`\n *\n * @param amount The amount to darken, given as a decimal between 0 and 1\n */\nfunction lighten(color, amount) {\n return darken(color, -amount);\n}\n\n/**\n * Takes in a color and makes it more transparent by convert to `rgba` and\n * decreasing the amount in the alpha channel.\n *\n * @param amount The amount to increase the transparency by, given as a decimal between 0 and 1\n */\nfunction transparentize(color, amount) {\n const [r, g, b, a] = parseToRgba(color);\n return rgba(r, g, b, a - amount);\n}\n\n/**\n * Takes a color and un-transparentizes it. Equivalent to\n * `transparentize(color, -amount)`\n *\n * @param amount The amount to increase the opacity by, given as a decimal between 0 and 1\n */\nfunction opacify(color, amount) {\n return transparentize(color, -amount);\n}\n\n/**\n * An alternative function to `readableColor`. Returns whether or not the \n * readable color (i.e. the color to be place on top the input color) should be\n * black.\n */\nfunction readableColorIsBlack(color) {\n return getLuminance(color) > 0.179;\n}\n\n/**\n * Returns black or white for best contrast depending on the luminosity of the\n * given color.\n */\nfunction readableColor(color) {\n return readableColorIsBlack(color) ? '#000' : '#fff';\n}\n\n/**\n * Saturates a color by converting it to `hsl` and increasing the saturation\n * amount. Equivalent to `desaturate(color, -amount)`\n * \n * @param color Input color\n * @param amount The amount to darken, given as a decimal between 0 and 1\n */\nfunction saturate(color, amount) {\n return desaturate(color, -amount);\n}\n\n/**\n * Takes in any color and returns it as a hex code.\n */\nfunction toHex(color) {\n const [r, g, b, a] = parseToRgba(color);\n let hex = x => {\n const h = guard(0, 255, x).toString(16);\n // NOTE: padStart could be used here but it breaks Node 6 compat\n // https://github.com/ricokahler/color2k/issues/351\n return h.length === 1 ? `0${h}` : h;\n };\n return `#${hex(r)}${hex(g)}${hex(b)}${a < 1 ? hex(Math.round(a * 255)) : ''}`;\n}\n\n/**\n * Takes in any color and returns it as an rgba string.\n */\nfunction toRgba(color) {\n return rgba(...parseToRgba(color));\n}\n\n/**\n * Takes in any color and returns it as an hsla string.\n */\nfunction toHsla(color) {\n return hsla(...parseToHsla(color));\n}\n\nexport { ColorError$1 as ColorError, adjustHue, darken, desaturate, getContrast, getLuminance, getScale, guard, hasBadContrast, hsla, lighten, mix, opacify, parseToHsla, parseToRgba, readableColor, readableColorIsBlack, rgba, saturate, toHex, toHsla, toRgba, transparentize };\n//# sourceMappingURL=index.exports.import.es.mjs.map\n","import { Node, Attribute } from '@core/index.js';\nimport { FieldAnnotationView } from './FieldAnnotationView.js';\nimport { FieldAnnotationPlugin } from './FieldAnnotationPlugin.js';\nimport { findFieldAnnotationsByFieldId, getAllFieldAnnotations, findFieldAnnotationsBetween } from './fieldAnnotationHelpers/index.js';\nimport { toHex } from 'color2k';\nimport { parseSizeUnit, minMax } from '@core/utilities/index.js';\nimport { NodeSelection, Selection } from 'prosemirror-state';\n\nexport const fieldAnnotationName = 'fieldAnnotation';\nexport const annotationClass = 'annotation';\nexport const annotationContentClass = 'annotation-content';\n\nexport const FieldAnnotation = Node.create({\n name: 'fieldAnnotation',\n\n group: 'inline',\n\n inline: true,\n\n atom: true,\n\n draggable: true,\n\n selectable: true,\n\n addOptions() {\n return {\n htmlAttributes: {\n class: annotationClass,\n },\n annotationClass,\n annotationContentClass,\n types: ['text', 'image', 'signature', 'checkbox', 'html', 'link'], // annotation types\n defaultType: 'text',\n borderColor: '#b015b3',\n visibilityOptions: ['visible', 'hidden'],\n handleDropOutside: true,\n\n /// for y-prosemirror support\n toggleFormatNames: ['bold', 'italic', 'underline'],\n };\n },\n\n addAttributes() {\n return {\n type: {\n default: this.options.defaultType,\n parseDOM: (elem) => elem.getAttribute('data-type'),\n renderDOM: (attrs) => {\n if (!attrs.type) return {};\n return {\n 'data-type': attrs.type,\n };\n },\n },\n\n displayLabel: {\n default: 'Text field',\n parseDOM: (elem) => elem.getAttribute('data-display-label'),\n renderDOM: (attrs) => {\n if (!attrs.displayLabel) return {};\n return {\n 'data-display-label': attrs.displayLabel,\n };\n },\n },\n\n imageSrc: {\n default: null,\n rendered: false,\n parseDOM: (elem) => {\n let img = elem.querySelector('img');\n return img?.getAttribute('src') || null;\n },\n },\n\n rawHtml: {\n default: null,\n parseDOM: (elem) => {\n try {\n return JSON.parse(elem.getAttribute('data-raw-html'));\n } catch (e) {\n console.warn('Paste parse error', e);\n }\n return null;\n },\n renderDOM: (attrs) => {\n if (!attrs.rawHtml) return {};\n return {\n 'data-raw-html': JSON.stringify(attrs.rawHtml),\n };\n },\n },\n\n linkUrl: {\n default: null,\n rendered: false,\n parseDOM: (elem) => {\n let link = elem.querySelector('a');\n return link?.getAttribute('href') || null;\n },\n },\n\n fieldId: {\n default: null,\n parseDOM: (elem) => elem.getAttribute('data-field-id'),\n renderDOM: (attrs) => {\n if (!attrs.fieldId) return {};\n return {\n 'data-field-id': attrs.fieldId,\n };\n },\n },\n\n fieldType: {\n default: null,\n parseDOM: (elem) => elem.getAttribute('data-field-type'),\n renderDOM: (attrs) => {\n if (!attrs.fieldType) return {};\n return {\n 'data-field-type': attrs.fieldType,\n };\n },\n },\n\n fieldColor: {\n default: '#980043',\n parseDOM: (elem) => elem.getAttribute('data-field-color') || elem.style.backgroundColor || null,\n renderDOM: (attrs) => {\n if (!attrs.fieldColor) return {};\n let hexColor = toHex(attrs.fieldColor);\n let isSixValueSyntax = hexColor.slice(1).length === 6;\n\n if (isSixValueSyntax) {\n hexColor = `${hexColor}33`;\n }\n\n let omitHighlight = attrs.highlighted === false;\n\n if (omitHighlight) {\n return {\n 'data-field-color': hexColor,\n };\n }\n\n return {\n 'data-field-color': hexColor,\n style: `background-color: ${hexColor}`,\n };\n },\n },\n\n hidden: {\n default: false,\n parseDOM: (elem) => {\n let hasHiddenAttr = elem.hasAttribute('hidden');\n let hasDisplayNoneStyle = elem.style.display === 'none';\n let isHidden = hasHiddenAttr || hasDisplayNoneStyle;\n return isHidden;\n },\n renderDOM: (attrs) => {\n if (!attrs.hidden) return {};\n return {\n style: 'display: none',\n };\n },\n },\n\n visibility: {\n default: 'visible',\n parseDOM: (el) => {\n let visibility = el.style.visibility || 'visible';\n let containsVisibility = this.options.visibilityOptions.includes(visibility);\n return containsVisibility ? visibility : 'visible';\n },\n renderDOM: (attrs) => {\n if (!attrs.visibility || attrs.visibility === 'visible') return {};\n return { style: `visibility: ${attrs.visibility}` };\n },\n },\n\n highlighted: {\n default: true,\n rendered: false,\n },\n\n multipleImage: {\n default: false,\n parseDOM: (elem) => elem.getAttribute('data-multiple-image'),\n renderDOM: (attrs) => {\n if (!attrs.multipleImage) return {};\n return {\n 'data-multiple-image': attrs.multipleImage,\n };\n },\n },\n\n size: {\n default: null,\n renderDOM: ({ size }) => {\n if (!size || !size.width) return {};\n const style = `width: ${size.width}px; height: ${size.height}px; overflow: hidden;`;\n return { style };\n },\n },\n\n extras: {\n default: {},\n rendered: false,\n },\n\n /// Formatting attrs for y-prosemirror support.\n bold: {\n default: false,\n parseDOM: (elem) => elem.getAttribute('data-bold') === 'true',\n renderDOM: (attrs) => {\n if (!attrs.bold) return {};\n return {\n 'data-bold': 'true',\n style: 'font-weight: bold',\n };\n },\n },\n\n italic: {\n default: false,\n parseDOM: (elem) => elem.getAttribute('data-italic') === 'true',\n renderDOM: (attrs) => {\n if (!attrs.italic) return {};\n return {\n 'data-italic': 'true',\n style: 'font-style: italic',\n };\n },\n },\n\n underline: {\n default: false,\n parseDOM: (elem) => elem.getAttribute('data-underline') === 'true',\n renderDOM: (attrs) => {\n if (!attrs.underline) return {};\n return {\n 'data-underline': 'true',\n style: 'text-decoration: underline',\n };\n },\n },\n\n fontFamily: {\n default: null,\n parseDOM: (elem) => elem.getAttribute('data-font-family') || elem.style.fontFamily || null,\n renderDOM: (attrs) => {\n if (!attrs.fontFamily) return {};\n return {\n 'data-font-family': attrs.fontFamily,\n style: `font-family: ${attrs.fontFamily}`,\n };\n },\n },\n\n fontSize: {\n default: null,\n parseDOM: (elem) => elem.getAttribute('data-font-size') || elem.style.fontSize || null,\n renderDOM: (attrs) => {\n if (!attrs.fontSize) return {};\n let [value, unit] = parseSizeUnit(attrs.fontSize);\n if (Number.isNaN(value)) return {};\n unit = unit ? unit : 'pt';\n let fontSize = `${value}${unit}`;\n return {\n 'data-font-size': fontSize,\n style: `font-size: ${fontSize}`,\n };\n },\n },\n /// Formatting attrs - end.\n };\n },\n\n parseDOM() {\n return [\n {\n tag: `span.${this.options.annotationClass}`,\n priority: 60,\n },\n ];\n },\n\n renderDOM({ node, htmlAttributes }) {\n let { type, displayLabel, imageSrc, rawHtml, linkUrl } = node.attrs;\n\n let textRenderer = () => {\n return [\n 'span',\n Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes),\n [\n 'span',\n {\n class: `${this.options.annotationContentClass}`,\n },\n displayLabel,\n ],\n ];\n };\n\n let imageRenderer = () => {\n let contentRenderer = () => {\n if (!imageSrc) return displayLabel;\n return [\n 'img',\n {\n src: imageSrc,\n alt: displayLabel,\n },\n ];\n };\n\n return [\n 'span',\n Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes),\n [\n 'span',\n {\n class: `${this.options.annotationContentClass}`,\n },\n contentRenderer(),\n ],\n ];\n };\n\n let linkRenderer = () => {\n let contentRenderer = () => {\n if (!linkUrl) return displayLabel;\n return [\n 'a',\n {\n href: linkUrl,\n target: '_blank',\n },\n linkUrl,\n ];\n };\n\n return [\n 'span',\n Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes),\n [\n 'span',\n {\n class: `${this.options.annotationContentClass}`,\n },\n contentRenderer(),\n ],\n ];\n };\n\n let renderers = {\n text: () => textRenderer(),\n image: () => imageRenderer(),\n signature: () => imageRenderer(),\n checkbox: () => textRenderer(),\n html: () => textRenderer(),\n link: () => linkRenderer(),\n default: () => textRenderer(),\n };\n\n let renderer = renderers[type] ?? renderers.default;\n\n return renderer();\n },\n\n addCommands() {\n return {\n /**\n * Add field annotation.\n * @param pos The position in the doc.\n * @param attrs The attributes.\n * @example\n * editor.commands.addFieldAnnotation(0, {\n * displayLabel: 'Enter your info',\n * fieldId: `123`,\n * fieldType: 'TEXTINPUT',\n * fieldColor: '#980043',\n * })\n */\n addFieldAnnotation:\n (pos, attrs = {}, editorFocus = false) =>\n ({ editor, dispatch, state, tr }) => {\n if (dispatch) {\n let { schema } = editor;\n\n let newPos = tr.mapping.map(pos);\n let $pos = state.doc.resolve(newPos);\n let currentMarks = $pos.marks();\n currentMarks = currentMarks.length ? [...currentMarks] : null;\n\n /// for y-prosemirror support - attrs instead marks\n let formatAttrs = getFormatAttrsFromMarks(currentMarks);\n ///\n\n let node = schema.nodes[this.name].create({ ...attrs, ...formatAttrs }, null, null);\n state.tr\n .insert(newPos, node)\n .setSelection(Selection.near(tr.doc.resolve(newPos + node.nodeSize)));\n\n if (editorFocus) {\n this.editor.view.focus();\n }\n }\n\n return true;\n },\n\n /**\n * Update annotations associated with a field.\n * @param fieldIdOrArray The field ID or array of field IDs.\n * @param attrs The attributes.\n * @example\n * editor.commands.updateFieldAnnotations('123', {\n * displayLabel: 'Updated!',\n * })\n * @example\n * editor.commands.updateFieldAnnotations(['123', '456'], {\n * displayLabel: 'Updated!',\n * })\n */\n updateFieldAnnotations:\n (fieldIdOrArray, attrs = {}) =>\n ({ dispatch, state, commands }) => {\n let annotations = findFieldAnnotationsByFieldId(fieldIdOrArray, state);\n\n if (!annotations.length) {\n return true;\n }\n\n if (dispatch) {\n return commands.updateFieldAnnotationsAttributes(annotations, attrs);\n }\n\n return true;\n },\n\n /**\n * Update particular annotation's attributes.\n * @param annotation field annotation node to be updated.\n * @param attrs The attributes.\n *\n * Used for a case when multiple annotations for one input presented\n */\n updateFieldAnnotation:\n (annotation, attrs = {}) =>\n ({ dispatch, commands }) => {\n if (!annotation) {\n return true;\n }\n\n if (dispatch) {\n commands.updateFieldAnnotationsAttributes([annotation], attrs);\n\n if (this.editor.options.pagination) {\n setTimeout(() => {\n const newTr = this.editor.view.state.tr;\n newTr.setMeta('forceUpdatePagination', true);\n this.editor.view.dispatch(newTr);\n }, 50);\n };\n return true;\n }\n\n return true;\n },\n\n /**\n * Update the attributes of annotations.\n * @param annotations The annotations array [{pos, node}].\n * @param attrs The attributes object.\n */\n updateFieldAnnotationsAttributes:\n (annotations, attrs = {}) =>\n ({ dispatch, tr }) => {\n if (!dispatch) return true;\n\n // Specify that we are updating annotations\n // so they are not detected as deletions.\n tr.setMeta('fieldAnnotationUpdate', true);\n\n annotations.forEach((annotation) => {\n let { pos, node } = annotation;\n let newPos = tr.mapping.map(pos);\n let currentNode = tr.doc.nodeAt(newPos);\n let nodeEqual = node.attrs.fieldId === currentNode?.attrs?.fieldId;\n\n if (nodeEqual) {\n tr.setNodeMarkup(newPos, undefined, {\n ...node.attrs,\n ...attrs,\n });\n }\n });\n\n return true;\n },\n\n /**\n * Delete annotations associated with a field.\n * @param fieldIdOrArray The field ID or array of field IDs.\n * @example\n * editor.commands.deleteFieldAnnotations('123')\n * @example\n * editor.commands.deleteFieldAnnotations(['123', '456'])\n */\n deleteFieldAnnotations:\n (fieldIdOrArray) =>\n ({ dispatch, state, tr }) => {\n let annotations = findFieldAnnotationsByFieldId(fieldIdOrArray, state);\n\n if (!annotations.length) {\n return true;\n }\n\n if (dispatch) {\n annotations.forEach((annotation) => {\n let { pos, node } = annotation;\n let newPosFrom = tr.mapping.map(pos); // map the position between transaction steps\n let newPosTo = tr.mapping.map(pos + node.nodeSize);\n\n let currentNode = tr.doc.nodeAt(newPosFrom);\n if (node.eq(currentNode)) {\n tr.delete(newPosFrom, newPosTo);\n }\n });\n }\n\n return true;\n },\n\n deleteFieldAnnotationsByNode:\n (annotations) =>\n ({ dispatch, state, tr }) => {\n if (!annotations.length) {\n return true;\n }\n\n if (dispatch) {\n annotations.forEach((annotation) => {\n let { pos, node } = annotation;\n let newPosFrom = tr.mapping.map(pos); // map the position between transaction steps\n let newPosTo = tr.mapping.map(pos + node.nodeSize);\n\n let currentNode = tr.doc.nodeAt(newPosFrom);\n if (node.eq(currentNode)) {\n tr.delete(newPosFrom, newPosTo);\n }\n });\n }\n\n return true;\n },\n\n deleteFieldAnnotation:\n (annotation) =>\n ({ dispatch, state, tr }) => {\n if (!annotation) {\n return true;\n }\n\n if (dispatch) {\n let { pos, node } = annotation;\n let newPosFrom = tr.mapping.map(pos);\n let newPosTo = tr.mapping.map(pos + node.nodeSize);\n\n let currentNode = tr.doc.nodeAt(newPosFrom);\n if (node.eq(currentNode)) {\n tr.delete(newPosFrom, newPosTo);\n }\n }\n \n return true;\n },\n\n /**\n * Delete a portion of annotations associated with a field.\n * @param fieldIdOrArray The field ID or array of field IDs.\n * @param end index at which to end extraction\n * @example\n * editor.commands.sliceFieldAnnotations('123', 5) - will remove a portion of annotations array starting from index 6\n * @example\n * editor.commands.sliceFieldAnnotations(['123', '456'], 5)\n */\n sliceFieldAnnotations:\n (fieldIdOrArray, end) =>\n ({ dispatch, state, tr }) => {\n let annotations = findFieldAnnotationsByFieldId(fieldIdOrArray, state);\n\n if (!annotations.length) {\n return true;\n }\n\n if (dispatch) {\n annotations.forEach((annotation, index) => {\n if (index >= end) {\n let { pos, node } = annotation;\n let newPosFrom = tr.mapping.map(pos); // map the position between transaction steps\n let newPosTo = tr.mapping.map(pos + node.nodeSize);\n\n let currentNode = tr.doc.nodeAt(newPosFrom);\n if (node.eq(currentNode)) {\n tr.delete(newPosFrom, newPosTo);\n }\n }\n });\n }\n\n return true;\n },\n\n /**\n * Set `hidden` for annotations matching predicate.\n * Other annotations become unhidden.\n * @param predicate The predicate function.\n * @param unsetFromOthers If should unset hidden from other annotations.\n * @example\n * editor.commands.setFieldAnnotationsHiddenByCondition((node) => {\n * let ids = ['111', '222', '333'];\n * return ids.includes(node.attrs.fieldId);\n * })\n */\n setFieldAnnotationsHiddenByCondition:\n (predicate = () => false, unsetFromOthers = false) =>\n ({ dispatch, state, chain }) => {\n let annotations = getAllFieldAnnotations(state);\n\n if (!annotations.length) {\n return true;\n }\n\n if (dispatch) {\n let otherAnnotations = [];\n let matchedAnnotations = annotations.filter((annotation) => {\n if (predicate(annotation.node)) return annotation;\n else otherAnnotations.push(annotation);\n });\n\n if (unsetFromOthers) {\n return chain()\n .updateFieldAnnotationsAttributes(matchedAnnotations, { hidden: true })\n .updateFieldAnnotationsAttributes(otherAnnotations, { hidden: false })\n .run();\n } else {\n return chain().updateFieldAnnotationsAttributes(matchedAnnotations, { hidden: true }).run();\n }\n }\n\n return true;\n },\n\n /**\n * Unset `hidden` for all annotations.\n * @example\n * editor.commands.unsetFieldAnnotationsHidden()\n */\n unsetFieldAnnotationsHidden:\n () =>\n ({ dispatch, state, commands }) => {\n let annotations = getAllFieldAnnotations(state);\n\n if (!annotations.length) {\n return true;\n }\n\n if (dispatch) {\n return commands.updateFieldAnnotationsAttributes(annotations, { hidden: false });\n }\n\n return true;\n },\n\n /**\n * Set `visibility` for all annotations (without changing the layout).\n * @param visibility The visibility value (visible, hidden).\n * @example\n * editor.commands.setFieldAnnotationsVisibility('visible');\n * @example\n * editor.commands.setFieldAnnotationsVisibility('hidden');\n */\n setFieldAnnotationsVisibility:\n (visibility = 'visible') =>\n ({ dispatch, state, commands }) => {\n let annotations = getAllFieldAnnotations(state);\n\n if (!annotations.length) {\n return true;\n }\n\n let containsVisibility = this.options.visibilityOptions.includes(visibility);\n\n if (!containsVisibility) {\n return false;\n }\n\n if (dispatch) {\n return commands.updateFieldAnnotationsAttributes(annotations, {\n visibility,\n });\n }\n\n return true;\n },\n\n /**\n * Set `highlighted` for annotations matching predicate.\n * @param predicate The predicate function.\n * @param highlighted The highlighted attribute.\n * @example\n * editor.commands.setFieldAnnotationsHighlighted((node) => {\n * let ids = ['111', '222', '333'];\n * return ids.includes(node.attrs.fieldId);\n * }, false)\n * @example Set for all annotations.\n * editor.commands.setFieldAnnotationsHighlighted(() => true, false)\n * editor.commands.setFieldAnnotationsHighlighted(() => true, true)\n */\n setFieldAnnotationsHighlighted:\n (predicate = () => false, highlighted = true) =>\n ({ dispatch, state, commands }) => {\n let annotations = getAllFieldAnnotations(state);\n\n if (!annotations.length) {\n return true;\n }\n\n if (dispatch) {\n let matchedAnnotations = annotations.filter((annotation) => {\n if (predicate(annotation.node)) return annotation;\n });\n\n return commands.updateFieldAnnotationsAttributes(matchedAnnotations, {\n highlighted,\n });\n }\n\n return true;\n },\n\n /// Formatting commands for y-prosemirror support.\n toggleFieldAnnotationsFormat:\n (name, setSelection = false) =>\n ({ dispatch, tr, state, commands }) => {\n let formats = this.options.toggleFormatNames;\n\n if (!formats.includes(name)) {\n return false;\n }\n\n let { from, to, node } = state.selection;\n let annotations = findFieldAnnotationsBetween(from, to, state.doc);\n\n if (!annotations.length) {\n return true;\n }\n\n if (dispatch) {\n annotations.forEach((annotation) => {\n commands.updateFieldAnnotationsAttributes([annotation], {\n [name]: !annotation.node.attrs[name],\n });\n });\n\n if (setSelection && node?.type.name === this.name) {\n tr.setSelection(NodeSelection.create(tr.doc, from));\n }\n }\n\n return true;\n },\n\n setFieldAnnotationsFontFamily: \n (fontFamily, setSelection = false) =>\n ({ dispatch, tr, state, commands }) => {\n let { from, to, node } = state.selection;\n let annotations = findFieldAnnotationsBetween(from, to, state.doc);\n\n if (!annotations.length) {\n return true;\n }\n\n if (dispatch) {\n annotations.forEach((annotation) => {\n commands.updateFieldAnnotationsAttributes([annotation], {\n fontFamily,\n });\n });\n\n if (setSelection && node?.type.name === this.name) {\n tr.setSelection(NodeSelection.create(tr.doc, from));\n }\n }\n\n return true;\n },\n\n setFieldAnnotationsFontSize:\n (fontSize, setSelection = false) =>\n ({ dispatch, tr, state, commands }) => {\n let { from, to, node } = state.selection;\n let annotations = findFieldAnnotationsBetween(from, to, state.doc);\n\n if (!annotations.length) {\n return true;\n }\n\n let [value, unit] = parseSizeUnit(fontSize);\n let min = 8, max = 96, defaultUnit = 'pt';\n \n if (Number.isNaN(value)) {\n return false;\n }\n\n value = minMax(value, min, max);\n unit = unit ? unit : defaultUnit;\n\n if (dispatch) {\n annotations.forEach((annotation) => {\n commands.updateFieldAnnotationsAttributes([annotation], {\n fontSize: `${value}${unit}`,\n });\n });\n\n if (setSelection && node?.type.name === this.name) {\n tr.setSelection(NodeSelection.create(tr.doc, from));\n }\n }\n\n return true;\n },\n /// Formatting commands - end.\n };\n },\n\n addNodeView() {\n return (props) => {\n return new FieldAnnotationView({\n ...props,\n annotationClass: this.options.annotationClass,\n annotationContentClass: this.options.annotationContentClass,\n borderColor: this.options.borderColor,\n });\n };\n },\n\n addPmPlugins() {\n return [\n FieldAnnotationPlugin({\n editor: this.editor,\n annotationClass: this.options.annotationClass,\n handleDropOutside: this.options.handleDropOutside,\n }),\n ];\n },\n});\n\n/// for y-prosemirror support\nfunction getFormatAttrsFromMarks(marks) {\n if (!marks) {\n return {};\n }\n\n let formatAttrs = {\n bold: false,\n italic: false,\n underline: false,\n fontFamily: null,\n fontSize: null,\n };\n\n if (marks && marks.length) {\n formatAttrs.bold = marks.some((mark) => mark.type.name === 'bold');\n formatAttrs.italic = marks.some((mark) => mark.type.name === 'italic');\n formatAttrs.underline = marks.some((mark) => mark.type.name === 'underline');\n\n let textStyle = marks.find((mark) => mark.type.name === 'textStyle');\n\n if (textStyle) {\n formatAttrs.fontFamily = textStyle.attrs.fontFamily ?? null;\n formatAttrs.fontSize = textStyle.attrs.fontSize ?? null;\n }\n }\n\n return formatAttrs;\n}\n///\n","import { Plugin, PluginKey } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { Mapping, StepMap } from 'prosemirror-transform';\n\nexport const ImagePlaceholderPluginKey = new PluginKey('ImagePlaceholder');\n\nexport const ImagePlaceholderPlugin = (options = {}) => {\n return new Plugin({\n key: ImagePlaceholderPluginKey,\n\n state: {\n init() {\n return DecorationSet.empty;\n },\n\n apply(tr, set, oldState, newState) {\n // For reference.\n // let diffStart = tr.doc.content.findDiffStart(oldState.doc.content);\n // let diffEnd = oldState.doc.content.findDiffEnd(tr.doc.content);\n // let map = diffEnd && diffStart\n // ? new StepMap([diffStart, diffEnd.a - diffStart, diffEnd.b - diffStart])\n // : new StepMap([0, 0, 0]);\n // let pmMapping = new Mapping([map]);\n // let set = value.map(pmMapping, tr.doc);\n ///\n\n // Adjust decoration positions to changes made by the transaction\n set = set.map(tr.mapping, tr.doc);\n\n // See if the transaction adds or removes any placeholders\n let action = tr.getMeta(ImagePlaceholderPluginKey);\n\n if (action?.type === 'add') {\n let widget = document.createElement('placeholder');\n let deco = Decoration.widget(action.pos, widget, {\n id: action.id,\n });\n set = set.add(tr.doc, [deco]);\n } else if (action?.type === 'remove') {\n set = set.remove(set.find(null, null, (spec) => spec.id == action.id));\n }\n return set;\n },\n },\n\n props: {\n decorations(state) {\n return this.getState(state);\n },\n },\n });\n};\n\nexport const findPlaceholder = (state, id) => {\n let decos = ImagePlaceholderPluginKey.getState(state);\n let found = decos?.find(null, null, (spec) => spec.id === id);\n return found?.length ? found[0].from : null;\n};\n","import { Node, Attribute } from '@core/index.js';\nimport { ImagePlaceholderPlugin } from './imageHelpers/imagePlaceholderPlugin.js';\n\nexport const Image = Node.create({\n name: 'image',\n\n group: 'inline',\n\n inline: true,\n\n draggable: true,\n\n addOptions() {\n return {\n allowBase64: true,\n htmlAttributes: {},\n };\n },\n\n addStorage() {\n return {\n media: {},\n };\n },\n\n addAttributes() {\n return {\n src: {\n default: null,\n renderDOM: ({ src }) => {\n return {\n src: this.storage.media[src],\n };\n },\n },\n\n alt: {\n default: null,\n },\n\n title: {\n default: null,\n },\n\n rId: {\n default: null,\n rendered: false,\n },\n\n originalPadding: {\n default: null,\n rendered: false,\n },\n\n size: {\n default: {},\n renderDOM: ({ size }) => {\n let style = 'display: inline-block;';\n let { width, height } = size ?? {};\n if (width) style += `width: ${width}px;`;\n if (height) style += `height: auto;`;\n return { style };\n },\n },\n\n marginOffset: {\n default: {},\n renderDOM: ({ marginOffset }) => {\n let { left = 0, top = 0 } = marginOffset ?? {};\n let style = '';\n if (left) style += `margin-left: ${left}px;`;\n if (top) style += `margin-top: ${top}px;`;\n return { style };\n },\n },\n };\n },\n\n parseDOM() {\n return [\n {\n tag: this.options.allowBase64 ? 'img[src]' : 'img[src]:not([src^=\"data:\"])',\n },\n ];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['img', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes)];\n },\n\n addCommands() {\n return {\n setImage:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n });\n },\n };\n },\n\n addPmPlugins() {\n return [ImagePlaceholderPlugin()];\n },\n});\n","import { Node, Attribute } from '@core/index.js';\n\nexport const BookmarkStart = Node.create({\n name: 'bookmarkStart',\n group: 'inline',\n content: 'inline*',\n inline: true,\n\n addOptions() {\n return {\n htmlAttributes: { style: 'height: 0; width: 0;' },\n };\n },\n\n addAttributes() {\n return {\n name: {\n default: null,\n renderDOM: ({ name }) => {\n if (name) return { name };\n return {};\n },\n },\n id: {\n default: null,\n renderDOM: ({ id }) => {\n if (id) return { id };\n return {};\n },\n },\n };\n },\n\n renderDOM({ htmlAttributes }) {\n return ['a', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes)];\n },\n});\n","import { Node, Attribute } from '@core/index.js';\n\nexport const Mention = Node.create({\n name: 'mention',\n\n group: 'inline',\n\n inline: true,\n\n selectable: false,\n\n atom: true,\n\n addOptions() {\n return {\n htmlAttributes: {\n class: 'super-editor-mention',\n },\n };\n },\n\n parseDOM() {\n return [\n {\n tag: `span[data-type=\"${this.name || this.email}\"]`,\n getAttrs: (node) => ({\n name: node.getAttribute('name') || null,\n email: node.getAttribute('email') || null,\n }),\n },\n ];\n },\n\n renderDOM({ node, htmlAttributes }) {\n const { name, email } = node.attrs;\n\n return [\n 'span',\n Attribute.mergeAttributes({ 'data-type': this.name || this.email, }, this.options.htmlAttributes, htmlAttributes),\n `@${name ? name : email}`,\n ];\n },\n\n addAttributes() {\n return {\n name: { default: null },\n email: { default: null },\n };\n },\n});\n","import { Mark, Attribute } from '@core/index.js';\n\nimport { annotationClass, annotationContentClass } from '../field-annotation/index.js';\n\nexport const TextStyle = Mark.create({\n name: 'textStyle',\n\n addOptions() {\n return {\n htmlAttributes: {},\n };\n },\n\n parseDOM() {\n return [\n {\n tag: 'span',\n getAttrs: (el) => {\n const hasStyles = el.hasAttribute('style');\n const isAnnotation = el.classList.contains(annotationClass) || el.classList.contains(annotationContentClass);\n if (!hasStyles || isAnnotation) return false;\n return {};\n },\n },\n ];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['span', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n\n addCommands() {\n return {\n removeEmptyTextStyle:\n () =>\n ({ state, commands }) => {\n const attributes = Attribute.getMarkAttributes(state, this.type);\n const hasStyles = Object.entries(attributes).some(([, value]) => !!value);\n if (hasStyles) return true;\n return commands.unsetMark(this.name);\n },\n };\n },\n});\n","import { Mark, Attribute } from '@core/index.js';\n\nexport const Bold = Mark.create({\n name: 'bold',\n\n addOptions() {\n return {\n htmlAttributes: {},\n };\n },\n\n parseDOM() {\n return [\n { tag: 'strong' },\n { tag: 'b', getAttrs: (node) => node.style.fontWeight != 'normal' && null },\n { style: 'font-weight=400', clearMark: (m) => m.type.name == 'strong' },\n { style: 'font-weight', getAttrs: (value) => /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null },\n ];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['strong', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n\n //prettier-ignore\n addCommands() {\n return {\n setBold: () => ({ commands }) => commands.setMark(this.name),\n unsetBold: () => ({ commands }) => commands.unsetMark(this.name),\n toggleBold: () => ({ commands }) => commands.toggleMark(this.name),\n };\n },\n\n addShortcuts() {\n return {\n 'Mod-b': () => this.editor.commands.toggleBold(),\n 'Mod-B': () => this.editor.commands.toggleBold(),\n };\n },\n});\n","import { Mark, Attribute } from '@core/index.js';\n\nexport const Italic = Mark.create({\n name: 'italic',\n\n addOptions() {\n return {\n htmlAttributes: {},\n };\n },\n\n parseDOM() {\n return [\n { tag: 'i' },\n { tag: 'em' },\n { style: 'font-style=italic' },\n { style: 'font-style=normal', clearMark: (m) => m.type.name == 'em' },\n ];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['em', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n\n //prettier-ignore\n addCommands() {\n return {\n setItalic: () => ({ commands }) => commands.setMark(this.name),\n unsetItalic: () => ({ commands }) => commands.unsetMark(this.name),\n toggleItalic: () => ({ commands }) => commands.toggleMark(this.name),\n };\n },\n\n addShortcuts() {\n return {\n 'Mod-i': () => this.editor.commands.toggleItalic(),\n 'Mod-I': () => this.editor.commands.toggleItalic(),\n };\n },\n});\n","import { Mark, Attribute } from '@core/index.js';\n\nexport const Underline = Mark.create({\n name: 'underline',\n\n addOptions() {\n return {\n htmlAttributes: {},\n };\n },\n\n parseDOM() {\n return [\n { tag: 'u' },\n { style: 'text-decoration=underline' },\n { style: 'text-decoration=auto', clearMark: (m) => m.type.name == 'u' },\n ];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['u', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n\n addAttributes() {\n return {\n underlineType: {\n default: 'single',\n },\n };\n },\n\n //prettier-ignore\n addCommands() {\n return {\n setUnderline: () => ({ commands }) => commands.setMark(this.name),\n unsetUnderline: () => ({ commands }) => commands.unsetMark(this.name),\n toggleUnderline: () => ({ commands }) => commands.toggleMark(this.name),\n };\n },\n\n addShortcuts() {\n return {\n 'Mod-u': () => this.editor.commands.toggleUnderline(),\n 'Mod-U': () => this.editor.commands.toggleUnderline(),\n };\n },\n});\n","import { Mark, Attribute } from '@core/index.js';\n\nexport const Highlight = Mark.create({\n name: 'highlight',\n\n addOptions() {\n return {\n htmlAttributes: {},\n };\n },\n\n addAttributes() {\n return {\n color: {\n default: null,\n parseDOM: (element) => element.getAttribute('data-color') || element.style.backgroundColor,\n renderDOM: (attributes) => {\n if (!attributes.color) {\n return {};\n }\n\n return {\n 'data-color': attributes.color,\n style: `background-color: ${attributes.color}; color: inherit`,\n };\n },\n },\n };\n },\n\n parseDOM() {\n return [{ tag: 'mark' }];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['mark', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n\n //prettier-ignore\n addCommands() {\n return {\n setHighlight: (color) => ({ commands }) => commands.setMark(this.name, { color }),\n unsetHighlight: () => ({ commands }) => commands.unsetMark(this.name),\n toggleHighlight: () => ({ commands }) => commands.toggleMark(this.name),\n };\n },\n\n addShortcuts() {\n return {\n 'Mod-Shift-h': () => this.editor.commands.toggleHighlight(),\n };\n },\n});\n","import { Mark, Attribute } from '@core/index.js';\n\nexport const Strike = Mark.create({\n name: 'strike',\n\n addOptions() {\n return {\n htmlAttributes: {},\n };\n },\n\n parseDOM() {\n return [\n { tag: 's' },\n { style: 'text-decoration=line-through' },\n { style: 'text-decoration=auto', clearMark: (m) => m.type.name == 's' },\n ];\n },\n\n renderDOM({ htmlAttributes }) {\n return ['s', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n\n addCommands() {\n return {\n setStrike:\n () =>\n ({ commands }) => {\n return commands.setMark(this.name);\n },\n unsetStrike:\n () =>\n ({ commands }) => {\n return commands.unsetMark(this.name);\n },\n toggleStrike:\n () =>\n ({ commands }) => {\n return commands.toggleMark(this.name);\n },\n };\n },\n\n addShortcuts() {\n return {\n 'Mod-Shift-s': () => this.editor.commands.toggleStrike(),\n };\n },\n});\n","import { Mark, Attribute } from '@core/index.js';\n\nexport const Link = Mark.create({\n name: 'link',\n\n priority: 1000,\n\n keepOnSplit: false,\n\n inclusive: false,\n\n addOptions() {\n return {\n protocols: ['http', 'https'],\n htmlAttributes: {\n target: '_blank',\n rel: 'noopener noreferrer nofollow',\n class: null,\n },\n };\n },\n\n parseDOM() {\n return [{ tag: 'a' }];\n },\n\n renderDOM({ htmlAttributes }) {\n if (!isAllowedUri(htmlAttributes.href, this.options.protocols)) {\n return ['a', mergeAttributes(this.options.htmlAttributes, { ...htmlAttributes, href: '' }), 0];\n }\n\n return ['a', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n\n addAttributes() {\n return {\n href: {\n default: null,\n renderDOM: ({ href, name }) => {\n if (href && isAllowedUri(href, this.options.protocols)) return { href };\n else if (name) return { href: `#${name}` };\n return {};\n },\n },\n target: {\n default: this.options.htmlAttributes.target,\n },\n rel: {\n default: this.options.htmlAttributes.rel,\n },\n rId: {\n default: this.options.htmlAttributes.rId || null,\n },\n text: {\n default: null,\n },\n name: {\n default: null,\n },\n };\n },\n\n addCommands() {\n return {\n setLink:\n ({ href }) =>\n ({ chain }) => {\n return chain().setMark(this.name, { href }).run();\n },\n unsetLink:\n () =>\n ({ chain }) => {\n return chain().unsetMark('underline').unsetColor().unsetMark(this.name, { extendEmptyMarkRange: true }).run();\n },\n toggleLink:\n ({ href }) =>\n ({ commands }) => {\n if (!href) return commands.unsetLink();\n return commands.setLink({ href });\n },\n };\n },\n});\n\nconst ATTR_WHITESPACE = /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g;\nfunction isAllowedUri(uri, protocols) {\n const allowedProtocols = ['http', 'https', 'mailto'];\n\n if (protocols) {\n protocols.forEach((protocol) => {\n const nextProtocol = typeof protocol === 'string' ? protocol : protocol.scheme;\n\n if (nextProtocol) {\n allowedProtocols.push(nextProtocol);\n }\n });\n }\n\n // eslint-disable-next-line no-useless-escape\n return (\n !uri ||\n uri\n .replace(ATTR_WHITESPACE, '')\n .match(new RegExp(`^(?:(?:${allowedProtocols.join('|')}):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))`, 'i'))\n );\n}\n","import { Mark, Attribute } from '@core/index.js';\nimport { TrackInsertMarkName } from './constants.js';\n\nconst trackInsertClass = 'track-insert';\n\nexport const TrackInsert = Mark.create({\n name: TrackInsertMarkName,\n\n group: 'track',\n\n inclusive: false,\n\n addOptions() {\n return {\n htmlAttributes: {\n class: trackInsertClass,\n },\n };\n },\n\n addAttributes() {\n return {\n id: {\n default: '',\n parseDOM: (elem) => elem.getAttribute('data-id'),\n renderDOM: (attrs) => {\n if (!attrs.id) return {};\n return {\n 'data-id': attrs.id,\n };\n },\n },\n\n author: {\n default: '',\n parseDOM: (elem) => elem.getAttribute('data-author'),\n renderDOM: (attrs) => {\n if (!attrs.author) return {};\n return {\n 'data-author': attrs.author,\n };\n },\n },\n\n authorEmail: {\n default: '',\n parseDOM: (elem) => elem.getAttribute('data-authoremail'),\n renderDOM: (attrs) => {\n if (!attrs.authorEmail) return {};\n return {\n 'data-authoremail': attrs.authorEmail,\n };\n },\n },\n\n date: {\n default: '',\n parseDOM: (elem) => elem.getAttribute('data-date'),\n renderDOM: (attrs) => {\n if (!attrs.date) return {};\n return {\n 'data-date': attrs.date,\n };\n },\n },\n };\n },\n\n parseDOM() {\n return false;\n },\n\n renderDOM({ htmlAttributes }) {\n return ['span', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n});\n","import { Mark, Attribute } from '@core/index.js';\nimport { TrackDeleteMarkName } from './constants.js';\n\nconst trackDeleteClass = 'track-delete';\n\nexport const TrackDelete = Mark.create({\n name: TrackDeleteMarkName,\n\n group: 'track',\n\n inclusive: false,\n\n addOptions() {\n return {\n htmlAttributes: {\n class: trackDeleteClass,\n },\n };\n },\n\n addAttributes() {\n return {\n id: {\n default: '',\n parseDOM: (elem) => elem.getAttribute('data-id'),\n renderDOM: (attrs) => {\n if (!attrs.id) return {};\n return {\n 'data-id': attrs.id,\n };\n },\n },\n\n author: {\n default: '',\n parseDOM: (elem) => elem.getAttribute('data-author'),\n renderDOM: (attrs) => {\n if (!attrs.author) return {};\n return {\n 'data-author': attrs.author,\n };\n },\n },\n\n authorEmail: {\n default: '',\n parseDOM: (elem) => elem.getAttribute('data-authoremail'),\n renderDOM: (attrs) => {\n if (!attrs.authorEmail) return {};\n return {\n 'data-authoremail': attrs.authorEmail,\n };\n },\n },\n\n date: {\n default: '',\n parseDOM: (elem) => elem.getAttribute('data-date'),\n renderDOM: (attrs) => {\n if (!attrs.date) return {};\n return {\n 'data-date': attrs.date,\n };\n },\n },\n };\n },\n\n parseDOM() {\n return false;\n },\n\n renderDOM({ htmlAttributes }) {\n return ['span', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n});\n","/**\n * Parse format list from string.\n * @param {string} str\n * @returns {Array} Array ({ type, attrs })\n */\nexport const parseFormatList = (str) => {\n if (!str) return [];\n let formatList;\n try {\n formatList = JSON.parse(str);\n } catch (error) {\n return [];\n }\n if (!Array.isArray(formatList)) {\n return [];\n }\n return formatList.filter((format) => Object.hasOwn(format, 'type') && Object.hasOwn(format, 'attrs'));\n};\n","import { Mark, Attribute } from '@core/index.js';\nimport { TrackFormatMarkName } from './constants.js';\nimport { parseFormatList } from './trackChangesHelpers/index.js';\n\nconst trackFormatClass = 'track-format';\n\nexport const TrackFormat = Mark.create({\n name: TrackFormatMarkName,\n\n group: 'track',\n\n inclusive: false,\n\n addOptions() {\n return {\n htmlAttributes: {\n class: trackFormatClass,\n },\n };\n },\n\n addAttributes() {\n return {\n id: {\n default: '',\n parseDOM: (elem) => elem.getAttribute('data-id'),\n renderDOM: (attrs) => {\n if (!attrs.id) return {};\n return {\n 'data-id': attrs.id,\n };\n },\n },\n\n author: {\n default: '',\n parseDOM: (elem) => elem.getAttribute('data-author'),\n renderDOM: (attrs) => {\n if (!attrs.author) return {};\n return {\n 'data-author': attrs.author,\n };\n },\n },\n\n authorEmail: {\n default: '',\n parseDOM: (elem) => elem.getAttribute('data-authoremail'),\n renderDOM: (attrs) => {\n if (!attrs.authorEmail) return {};\n return {\n 'data-authoremail': attrs.authorEmail,\n };\n },\n },\n\n date: {\n default: '',\n parseDOM: (elem) => elem.getAttribute('data-date'),\n renderDOM: (attrs) => {\n if (!attrs.date) return {};\n return {\n 'data-date': attrs.date,\n };\n },\n },\n\n // {\n // type: string, // the mark name\n // attrs: object, // the mark attrs\n // }\n before: {\n default: [],\n parseDOM: (elem) => {\n return parseFormatList(elem.getAttribute('data-before'));\n },\n renderDOM: (attrs) => {\n if (!attrs.before) return {};\n return {\n 'data-before': JSON.stringify(attrs.before),\n };\n },\n },\n\n // {\n // type: string, // the mark name\n // attrs: object, // the mark attrs\n // }\n after: {\n default: [],\n parseDOM: (elem) => {\n return parseFormatList(elem.getAttribute('data-after'));\n },\n renderDOM: (attrs) => {\n if (!attrs.after) return {};\n return {\n 'data-after': JSON.stringify(attrs.after),\n };\n },\n },\n };\n },\n\n parseDOM() {\n return false;\n },\n\n renderDOM({ htmlAttributes }) {\n return ['span', Attribute.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];\n },\n});\n","import { Extension } from '@core/Extension.js';\nimport { Slice } from 'prosemirror-model';\nimport { Mapping, ReplaceStep, AddMarkStep, RemoveMarkStep } from 'prosemirror-transform';\nimport { TrackDeleteMarkName, TrackInsertMarkName, TrackFormatMarkName } from './constants.js';\nimport { TrackChangesBasePlugin, TrackChangesBasePluginKey } from './plugins/index.js';\nimport { getTrackChanges } from './trackChangesHelpers/getTrackChanges.js';\n\nexport const TrackChanges = Extension.create({\n name: 'trackChanges',\n\n addCommands() {\n return {\n acceptTrackedChangesBetween:\n (from, to) =>\n ({ state, dispatch }) => {\n let { tr, doc } = state;\n\n // if (from === to) {\n // to += 1;\n // }\n\n tr.setMeta('acceptReject', true);\n\n const map = new Mapping();\n\n doc.nodesBetween(from, to, (node, pos) => {\n if (node.marks && node.marks.find((mark) => mark.type.name === TrackDeleteMarkName)) {\n const deletionStep = new ReplaceStep(\n map.map(Math.max(pos, from)),\n map.map(Math.min(pos + node.nodeSize, to)),\n Slice.empty,\n );\n\n tr.step(deletionStep);\n map.appendMap(deletionStep.getMap());\n } else if (node.marks && node.marks.find((mark) => mark.type.name === TrackInsertMarkName)) {\n const insertionMark = node.marks.find((mark) => mark.type.name === TrackInsertMarkName);\n\n tr.step(\n new RemoveMarkStep(\n map.map(Math.max(pos, from)),\n map.map(Math.min(pos + node.nodeSize, to)),\n insertionMark,\n ),\n );\n } else if (node.marks && node.marks.find((mark) => mark.type.name === TrackFormatMarkName)) {\n const formatChangeMark = node.marks.find((mark) => mark.type.name === TrackFormatMarkName);\n\n tr.step(\n new RemoveMarkStep(\n map.map(Math.max(pos, from)),\n map.map(Math.min(pos + node.nodeSize, to)),\n formatChangeMark,\n ),\n );\n }\n });\n\n if (tr.steps.length) {\n dispatch(tr);\n }\n\n return true;\n },\n\n rejectTrackedChangesBetween:\n (from, to) =>\n ({ state, dispatch }) => {\n const { tr, doc } = state;\n\n tr.setMeta('acceptReject', true);\n\n const map = new Mapping();\n\n doc.nodesBetween(from, to, (node, pos) => {\n if (node.marks && node.marks.find((mark) => mark.type.name === TrackDeleteMarkName)) {\n const deletionMark = node.marks.find((mark) => mark.type.name === TrackDeleteMarkName);\n\n tr.step(\n new RemoveMarkStep(\n map.map(Math.max(pos, from)),\n map.map(Math.min(pos + node.nodeSize, to)),\n deletionMark,\n ),\n );\n } else if (node.marks && node.marks.find((mark) => mark.type.name === TrackInsertMarkName)) {\n const deletionStep = new ReplaceStep(\n map.map(Math.max(pos, from)),\n map.map(Math.min(pos + node.nodeSize, to)),\n Slice.empty,\n );\n\n tr.step(deletionStep);\n map.appendMap(deletionStep.getMap());\n } else if (node.marks && node.marks.find((mark) => mark.type.name === TrackFormatMarkName)) {\n const formatChangeMark = node.marks.find((mark) => mark.type.name === TrackFormatMarkName);\n\n formatChangeMark.attrs.before.forEach((oldMark) => {\n tr.step(\n new AddMarkStep(\n map.map(Math.max(pos, from)),\n map.map(Math.min(pos + node.nodeSize, to)),\n state.schema.marks[oldMark.type].create(oldMark.attrs),\n ),\n );\n });\n\n formatChangeMark.attrs.after.forEach((newMark) => {\n tr.step(\n new RemoveMarkStep(\n map.map(Math.max(pos, from)),\n map.map(Math.min(pos + node.nodeSize, to)),\n node.marks.find((mark) => mark.type.name === newMark.type),\n ),\n );\n });\n\n tr.step(\n new RemoveMarkStep(\n map.map(Math.max(pos, from)),\n map.map(Math.min(pos + node.nodeSize, to)),\n formatChangeMark,\n ),\n );\n }\n });\n\n if (tr.steps.length) {\n dispatch(tr);\n }\n\n return true;\n },\n\n acceptTrackedChange:\n ({ trackedChange }) =>\n ({ commands }) => {\n const { start: from, end: to } = trackedChange;\n return commands.acceptTrackedChangesBetween(from, to);\n },\n\n acceptTrackedChangeBySelection:\n () =>\n ({ state, commands }) => {\n const { from, to } = state.selection;\n return commands.acceptTrackedChangesBetween(from, to);\n },\n\n acceptTrackedChangeById:\n (id) =>\n ({ state, tr, commands }) => {\n const toResolve = getChangesByIdToResolve(state, id) || [];\n\n return toResolve\n .map(({ from, to }) => {\n let mappedFrom = tr.mapping.map(from);\n let mappedTo = tr.mapping.map(to);\n return commands.acceptTrackedChangesBetween(mappedFrom, mappedTo);\n })\n .every((result) => result);\n },\n\n acceptAllTrackedChanges:\n () =>\n ({ state, commands }) => {\n const from = 0,\n to = state.doc.content.size;\n return commands.acceptTrackedChangesBetween(from, to);\n },\n\n rejectTrackedChangeById:\n (id) =>\n ({ state, tr, commands }) => {\n const toReject = getChangesByIdToResolve(state, id) || [];\n\n return toReject\n .map(({ from, to }) => {\n let mappedFrom = tr.mapping.map(from);\n let mappedTo = tr.mapping.map(to);\n return commands.rejectTrackedChangesBetween(mappedFrom, mappedTo);\n })\n .every((result) => result);\n },\n\n rejectTrackedChange:\n ({ trackedChange }) =>\n ({ commands }) => {\n const { start: from, end: to } = trackedChange;\n return commands.rejectTrackedChangesBetween(from, to);\n },\n\n rejectTrackedChangeOnSelection:\n () =>\n ({ state, commands }) => {\n const { from, to } = state.selection;\n return commands.rejectTrackedChangesBetween(from, to);\n },\n\n rejectAllTrackedChanges:\n () =>\n ({ state, commands }) => {\n const from = 0,\n to = state.doc.content.size;\n return commands.rejectTrackedChangesBetween(from, to);\n },\n\n toggleTrackChanges:\n () =>\n ({ state }) => {\n const trackChangeState = TrackChangesBasePluginKey.getState(state);\n if (trackChangeState === undefined) return false;\n state.tr.setMeta(TrackChangesBasePluginKey, {\n type: 'TRACK_CHANGES_ENABLE',\n value: !trackChangeState.isTrackChangesActive,\n });\n return true;\n },\n\n enableTrackChanges:\n () =>\n ({ state }) => {\n state.tr.setMeta(TrackChangesBasePluginKey, {\n type: 'TRACK_CHANGES_ENABLE',\n value: true,\n });\n return true;\n },\n\n disableTrackChanges:\n () =>\n ({ state }) => {\n state.tr.setMeta(TrackChangesBasePluginKey, {\n type: 'TRACK_CHANGES_ENABLE',\n value: false,\n });\n return true;\n },\n\n toggleTrackChangesShowOriginal:\n () =>\n ({ state }) => {\n const trackChangeState = TrackChangesBasePluginKey.getState(state);\n if (trackChangeState === undefined) return false;\n state.tr.setMeta(TrackChangesBasePluginKey, {\n type: 'SHOW_ONLY_ORIGINAL',\n value: !trackChangeState.onlyOriginalShown,\n });\n return true;\n },\n\n enableTrackChangesShowOriginal:\n () =>\n ({ state }) => {\n state.tr.setMeta(TrackChangesBasePluginKey, {\n type: 'SHOW_ONLY_ORIGINAL',\n value: true,\n });\n return true;\n },\n\n disableTrackChangesShowOriginal:\n () =>\n ({ state }) => {\n state.tr.setMeta(TrackChangesBasePluginKey, {\n type: 'SHOW_ONLY_ORIGINAL',\n value: false,\n });\n return true;\n },\n\n toggleTrackChangesShowFinal:\n () =>\n ({ state, dispatch }) => {\n const trackChangeState = TrackChangesBasePluginKey.getState(state);\n if (trackChangeState === undefined) return false;\n state.tr.setMeta(TrackChangesBasePluginKey, {\n type: 'SHOW_ONLY_MODIFIED',\n value: !trackChangeState.onlyModifiedShown,\n });\n return true;\n },\n\n enableTrackChangesShowFinal:\n () =>\n ({ state }) => {\n state.tr.setMeta(TrackChangesBasePluginKey, {\n type: 'SHOW_ONLY_MODIFIED',\n value: true,\n });\n return true;\n },\n };\n },\n\n addPmPlugins() {\n return [TrackChangesBasePlugin()];\n },\n});\n\n// For reference.\n// const trackChangesCallback = (action, acceptedChanges, revertedChanges, editor) => {\n// const id = acceptedChanges.modifiers[0]?.id || revertedChanges.modifiers[0]?.id;\n// if (action === 'accept') {\n// editor.emit('trackedChangesUpdate', { action, id });\n// } else {\n// editor.emit('trackedChangesUpdate', { action, id });\n// }\n// };\n\nconst getChangesByIdToResolve = (state, id) => {\n const trackedChanges = getTrackChanges(state);\n const changeIndex = trackedChanges.findIndex(({ mark }) => mark.attrs.id === id);\n if (changeIndex === -1) return;\n\n const matchingChange = trackedChanges[changeIndex];\n const prev = trackedChanges[changeIndex - 1];\n const next = trackedChanges[changeIndex + 1];\n\n // Determine the linked change\n let linkedChange;\n if (prev && matchingChange.start === prev.end) {\n linkedChange = prev;\n } else if (next && matchingChange.end === next.start) {\n linkedChange = next;\n }\n return [matchingChange, linkedChange].filter(Boolean);\n};","import { Plugin, PluginKey } from 'prosemirror-state';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { Extension } from '@core/Extension.js';\n\nexport const Placeholder = Extension.create({\n name: 'placeholder',\n\n addOptions() {\n return {\n placeholder: 'Type something...',\n };\n },\n\n addPmPlugins() {\n const applyDecoration = (state) => {\n const plainText = state.doc.textBetween(0, state.doc.content.size, ' ', ' ');\n if (plainText !== '') return DecorationSet.empty;\n\n const { $from } = state.selection;\n const decoration = Decoration.node($from.before(), $from.after(), {\n 'data-placeholder': this.options.placeholder,\n class: 'super-editor-placeholder',\n });\n return DecorationSet.create(state.doc, [decoration]);\n };\n\n const placeholderPlugin = new Plugin({\n key: new PluginKey('placeholder'),\n state: {\n init: (_, state) => {\n return applyDecoration(state);\n },\n apply: (tr, oldValue, oldState, newState) => {\n return applyDecoration(newState);\n },\n },\n props: {\n decorations(state) {\n return this.getState(state);\n },\n },\n });\n\n return [placeholderPlugin];\n },\n});\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on <html>\n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**!\n* tippy.js v6.3.7\n* (c) 2017-2021 atomiks\n* MIT License\n*/\nimport { createPopper, applyStyles } from '@popperjs/core';\n\nvar ROUND_ARROW = '<svg width=\"16\" height=\"6\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M0 6s1.796-.013 4.67-3.615C5.851.9 6.93.006 8 0c1.07-.006 2.148.887 3.343 2.385C14.233 6.005 16 6 16 6H0z\"></svg>';\nvar BOX_CLASS = \"tippy-box\";\nvar CONTENT_CLASS = \"tippy-content\";\nvar BACKDROP_CLASS = \"tippy-backdrop\";\nvar ARROW_CLASS = \"tippy-arrow\";\nvar SVG_ARROW_CLASS = \"tippy-svg-arrow\";\nvar TOUCH_OPTIONS = {\n passive: true,\n capture: true\n};\nvar TIPPY_DEFAULT_APPEND_TO = function TIPPY_DEFAULT_APPEND_TO() {\n return document.body;\n};\n\nfunction hasOwnProperty(obj, key) {\n return {}.hasOwnProperty.call(obj, key);\n}\nfunction getValueAtIndexOrReturn(value, index, defaultValue) {\n if (Array.isArray(value)) {\n var v = value[index];\n return v == null ? Array.isArray(defaultValue) ? defaultValue[index] : defaultValue : v;\n }\n\n return value;\n}\nfunction isType(value, type) {\n var str = {}.toString.call(value);\n return str.indexOf('[object') === 0 && str.indexOf(type + \"]\") > -1;\n}\nfunction invokeWithArgsOrReturn(value, args) {\n return typeof value === 'function' ? value.apply(void 0, args) : value;\n}\nfunction debounce(fn, ms) {\n // Avoid wrapping in `setTimeout` if ms is 0 anyway\n if (ms === 0) {\n return fn;\n }\n\n var timeout;\n return function (arg) {\n clearTimeout(timeout);\n timeout = setTimeout(function () {\n fn(arg);\n }, ms);\n };\n}\nfunction removeProperties(obj, keys) {\n var clone = Object.assign({}, obj);\n keys.forEach(function (key) {\n delete clone[key];\n });\n return clone;\n}\nfunction splitBySpaces(value) {\n return value.split(/\\s+/).filter(Boolean);\n}\nfunction normalizeToArray(value) {\n return [].concat(value);\n}\nfunction pushIfUnique(arr, value) {\n if (arr.indexOf(value) === -1) {\n arr.push(value);\n }\n}\nfunction unique(arr) {\n return arr.filter(function (item, index) {\n return arr.indexOf(item) === index;\n });\n}\nfunction getBasePlacement(placement) {\n return placement.split('-')[0];\n}\nfunction arrayFrom(value) {\n return [].slice.call(value);\n}\nfunction removeUndefinedProps(obj) {\n return Object.keys(obj).reduce(function (acc, key) {\n if (obj[key] !== undefined) {\n acc[key] = obj[key];\n }\n\n return acc;\n }, {});\n}\n\nfunction div() {\n return document.createElement('div');\n}\nfunction isElement(value) {\n return ['Element', 'Fragment'].some(function (type) {\n return isType(value, type);\n });\n}\nfunction isNodeList(value) {\n return isType(value, 'NodeList');\n}\nfunction isMouseEvent(value) {\n return isType(value, 'MouseEvent');\n}\nfunction isReferenceElement(value) {\n return !!(value && value._tippy && value._tippy.reference === value);\n}\nfunction getArrayOfElements(value) {\n if (isElement(value)) {\n return [value];\n }\n\n if (isNodeList(value)) {\n return arrayFrom(value);\n }\n\n if (Array.isArray(value)) {\n return value;\n }\n\n return arrayFrom(document.querySelectorAll(value));\n}\nfunction setTransitionDuration(els, value) {\n els.forEach(function (el) {\n if (el) {\n el.style.transitionDuration = value + \"ms\";\n }\n });\n}\nfunction setVisibilityState(els, state) {\n els.forEach(function (el) {\n if (el) {\n el.setAttribute('data-state', state);\n }\n });\n}\nfunction getOwnerDocument(elementOrElements) {\n var _element$ownerDocumen;\n\n var _normalizeToArray = normalizeToArray(elementOrElements),\n element = _normalizeToArray[0]; // Elements created via a <template> have an ownerDocument with no reference to the body\n\n\n return element != null && (_element$ownerDocumen = element.ownerDocument) != null && _element$ownerDocumen.body ? element.ownerDocument : document;\n}\nfunction isCursorOutsideInteractiveBorder(popperTreeData, event) {\n var clientX = event.clientX,\n clientY = event.clientY;\n return popperTreeData.every(function (_ref) {\n var popperRect = _ref.popperRect,\n popperState = _ref.popperState,\n props = _ref.props;\n var interactiveBorder = props.interactiveBorder;\n var basePlacement = getBasePlacement(popperState.placement);\n var offsetData = popperState.modifiersData.offset;\n\n if (!offsetData) {\n return true;\n }\n\n var topDistance = basePlacement === 'bottom' ? offsetData.top.y : 0;\n var bottomDistance = basePlacement === 'top' ? offsetData.bottom.y : 0;\n var leftDistance = basePlacement === 'right' ? offsetData.left.x : 0;\n var rightDistance = basePlacement === 'left' ? offsetData.right.x : 0;\n var exceedsTop = popperRect.top - clientY + topDistance > interactiveBorder;\n var exceedsBottom = clientY - popperRect.bottom - bottomDistance > interactiveBorder;\n var exceedsLeft = popperRect.left - clientX + leftDistance > interactiveBorder;\n var exceedsRight = clientX - popperRect.right - rightDistance > interactiveBorder;\n return exceedsTop || exceedsBottom || exceedsLeft || exceedsRight;\n });\n}\nfunction updateTransitionEndListener(box, action, listener) {\n var method = action + \"EventListener\"; // some browsers apparently support `transition` (unprefixed) but only fire\n // `webkitTransitionEnd`...\n\n ['transitionend', 'webkitTransitionEnd'].forEach(function (event) {\n box[method](event, listener);\n });\n}\n/**\n * Compared to xxx.contains, this function works for dom structures with shadow\n * dom\n */\n\nfunction actualContains(parent, child) {\n var target = child;\n\n while (target) {\n var _target$getRootNode;\n\n if (parent.contains(target)) {\n return true;\n }\n\n target = target.getRootNode == null ? void 0 : (_target$getRootNode = target.getRootNode()) == null ? void 0 : _target$getRootNode.host;\n }\n\n return false;\n}\n\nvar currentInput = {\n isTouch: false\n};\nvar lastMouseMoveTime = 0;\n/**\n * When a `touchstart` event is fired, it's assumed the user is using touch\n * input. We'll bind a `mousemove` event listener to listen for mouse input in\n * the future. This way, the `isTouch` property is fully dynamic and will handle\n * hybrid devices that use a mix of touch + mouse input.\n */\n\nfunction onDocumentTouchStart() {\n if (currentInput.isTouch) {\n return;\n }\n\n currentInput.isTouch = true;\n\n if (window.performance) {\n document.addEventListener('mousemove', onDocumentMouseMove);\n }\n}\n/**\n * When two `mousemove` event are fired consecutively within 20ms, it's assumed\n * the user is using mouse input again. `mousemove` can fire on touch devices as\n * well, but very rarely that quickly.\n */\n\nfunction onDocumentMouseMove() {\n var now = performance.now();\n\n if (now - lastMouseMoveTime < 20) {\n currentInput.isTouch = false;\n document.removeEventListener('mousemove', onDocumentMouseMove);\n }\n\n lastMouseMoveTime = now;\n}\n/**\n * When an element is in focus and has a tippy, leaving the tab/window and\n * returning causes it to show again. For mouse users this is unexpected, but\n * for keyboard use it makes sense.\n * TODO: find a better technique to solve this problem\n */\n\nfunction onWindowBlur() {\n var activeElement = document.activeElement;\n\n if (isReferenceElement(activeElement)) {\n var instance = activeElement._tippy;\n\n if (activeElement.blur && !instance.state.isVisible) {\n activeElement.blur();\n }\n }\n}\nfunction bindGlobalEventListeners() {\n document.addEventListener('touchstart', onDocumentTouchStart, TOUCH_OPTIONS);\n window.addEventListener('blur', onWindowBlur);\n}\n\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\nvar isIE11 = isBrowser ? // @ts-ignore\n!!window.msCrypto : false;\n\nfunction createMemoryLeakWarning(method) {\n var txt = method === 'destroy' ? 'n already-' : ' ';\n return [method + \"() was called on a\" + txt + \"destroyed instance. This is a no-op but\", 'indicates a potential memory leak.'].join(' ');\n}\nfunction clean(value) {\n var spacesAndTabs = /[ \\t]{2,}/g;\n var lineStartWithSpaces = /^[ \\t]*/gm;\n return value.replace(spacesAndTabs, ' ').replace(lineStartWithSpaces, '').trim();\n}\n\nfunction getDevMessage(message) {\n return clean(\"\\n %ctippy.js\\n\\n %c\" + clean(message) + \"\\n\\n %c\\uD83D\\uDC77\\u200D This is a development-only message. It will be removed in production.\\n \");\n}\n\nfunction getFormattedMessage(message) {\n return [getDevMessage(message), // title\n 'color: #00C584; font-size: 1.3em; font-weight: bold;', // message\n 'line-height: 1.5', // footer\n 'color: #a6a095;'];\n} // Assume warnings and errors never have the same message\n\nvar visitedMessages;\n\nif (process.env.NODE_ENV !== \"production\") {\n resetVisitedMessages();\n}\n\nfunction resetVisitedMessages() {\n visitedMessages = new Set();\n}\nfunction warnWhen(condition, message) {\n if (condition && !visitedMessages.has(message)) {\n var _console;\n\n visitedMessages.add(message);\n\n (_console = console).warn.apply(_console, getFormattedMessage(message));\n }\n}\nfunction errorWhen(condition, message) {\n if (condition && !visitedMessages.has(message)) {\n var _console2;\n\n visitedMessages.add(message);\n\n (_console2 = console).error.apply(_console2, getFormattedMessage(message));\n }\n}\nfunction validateTargets(targets) {\n var didPassFalsyValue = !targets;\n var didPassPlainObject = Object.prototype.toString.call(targets) === '[object Object]' && !targets.addEventListener;\n errorWhen(didPassFalsyValue, ['tippy() was passed', '`' + String(targets) + '`', 'as its targets (first) argument. Valid types are: String, Element,', 'Element[], or NodeList.'].join(' '));\n errorWhen(didPassPlainObject, ['tippy() was passed a plain object which is not supported as an argument', 'for virtual positioning. Use props.getReferenceClientRect instead.'].join(' '));\n}\n\nvar pluginProps = {\n animateFill: false,\n followCursor: false,\n inlinePositioning: false,\n sticky: false\n};\nvar renderProps = {\n allowHTML: false,\n animation: 'fade',\n arrow: true,\n content: '',\n inertia: false,\n maxWidth: 350,\n role: 'tooltip',\n theme: '',\n zIndex: 9999\n};\nvar defaultProps = Object.assign({\n appendTo: TIPPY_DEFAULT_APPEND_TO,\n aria: {\n content: 'auto',\n expanded: 'auto'\n },\n delay: 0,\n duration: [300, 250],\n getReferenceClientRect: null,\n hideOnClick: true,\n ignoreAttributes: false,\n interactive: false,\n interactiveBorder: 2,\n interactiveDebounce: 0,\n moveTransition: '',\n offset: [0, 10],\n onAfterUpdate: function onAfterUpdate() {},\n onBeforeUpdate: function onBeforeUpdate() {},\n onCreate: function onCreate() {},\n onDestroy: function onDestroy() {},\n onHidden: function onHidden() {},\n onHide: function onHide() {},\n onMount: function onMount() {},\n onShow: function onShow() {},\n onShown: function onShown() {},\n onTrigger: function onTrigger() {},\n onUntrigger: function onUntrigger() {},\n onClickOutside: function onClickOutside() {},\n placement: 'top',\n plugins: [],\n popperOptions: {},\n render: null,\n showOnCreate: false,\n touch: true,\n trigger: 'mouseenter focus',\n triggerTarget: null\n}, pluginProps, renderProps);\nvar defaultKeys = Object.keys(defaultProps);\nvar setDefaultProps = function setDefaultProps(partialProps) {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n validateProps(partialProps, []);\n }\n\n var keys = Object.keys(partialProps);\n keys.forEach(function (key) {\n defaultProps[key] = partialProps[key];\n });\n};\nfunction getExtendedPassedProps(passedProps) {\n var plugins = passedProps.plugins || [];\n var pluginProps = plugins.reduce(function (acc, plugin) {\n var name = plugin.name,\n defaultValue = plugin.defaultValue;\n\n if (name) {\n var _name;\n\n acc[name] = passedProps[name] !== undefined ? passedProps[name] : (_name = defaultProps[name]) != null ? _name : defaultValue;\n }\n\n return acc;\n }, {});\n return Object.assign({}, passedProps, pluginProps);\n}\nfunction getDataAttributeProps(reference, plugins) {\n var propKeys = plugins ? Object.keys(getExtendedPassedProps(Object.assign({}, defaultProps, {\n plugins: plugins\n }))) : defaultKeys;\n var props = propKeys.reduce(function (acc, key) {\n var valueAsString = (reference.getAttribute(\"data-tippy-\" + key) || '').trim();\n\n if (!valueAsString) {\n return acc;\n }\n\n if (key === 'content') {\n acc[key] = valueAsString;\n } else {\n try {\n acc[key] = JSON.parse(valueAsString);\n } catch (e) {\n acc[key] = valueAsString;\n }\n }\n\n return acc;\n }, {});\n return props;\n}\nfunction evaluateProps(reference, props) {\n var out = Object.assign({}, props, {\n content: invokeWithArgsOrReturn(props.content, [reference])\n }, props.ignoreAttributes ? {} : getDataAttributeProps(reference, props.plugins));\n out.aria = Object.assign({}, defaultProps.aria, out.aria);\n out.aria = {\n expanded: out.aria.expanded === 'auto' ? props.interactive : out.aria.expanded,\n content: out.aria.content === 'auto' ? props.interactive ? null : 'describedby' : out.aria.content\n };\n return out;\n}\nfunction validateProps(partialProps, plugins) {\n if (partialProps === void 0) {\n partialProps = {};\n }\n\n if (plugins === void 0) {\n plugins = [];\n }\n\n var keys = Object.keys(partialProps);\n keys.forEach(function (prop) {\n var nonPluginProps = removeProperties(defaultProps, Object.keys(pluginProps));\n var didPassUnknownProp = !hasOwnProperty(nonPluginProps, prop); // Check if the prop exists in `plugins`\n\n if (didPassUnknownProp) {\n didPassUnknownProp = plugins.filter(function (plugin) {\n return plugin.name === prop;\n }).length === 0;\n }\n\n warnWhen(didPassUnknownProp, [\"`\" + prop + \"`\", \"is not a valid prop. You may have spelled it incorrectly, or if it's\", 'a plugin, forgot to pass it in an array as props.plugins.', '\\n\\n', 'All props: https://atomiks.github.io/tippyjs/v6/all-props/\\n', 'Plugins: https://atomiks.github.io/tippyjs/v6/plugins/'].join(' '));\n });\n}\n\nvar innerHTML = function innerHTML() {\n return 'innerHTML';\n};\n\nfunction dangerouslySetInnerHTML(element, html) {\n element[innerHTML()] = html;\n}\n\nfunction createArrowElement(value) {\n var arrow = div();\n\n if (value === true) {\n arrow.className = ARROW_CLASS;\n } else {\n arrow.className = SVG_ARROW_CLASS;\n\n if (isElement(value)) {\n arrow.appendChild(value);\n } else {\n dangerouslySetInnerHTML(arrow, value);\n }\n }\n\n return arrow;\n}\n\nfunction setContent(content, props) {\n if (isElement(props.content)) {\n dangerouslySetInnerHTML(content, '');\n content.appendChild(props.content);\n } else if (typeof props.content !== 'function') {\n if (props.allowHTML) {\n dangerouslySetInnerHTML(content, props.content);\n } else {\n content.textContent = props.content;\n }\n }\n}\nfunction getChildren(popper) {\n var box = popper.firstElementChild;\n var boxChildren = arrayFrom(box.children);\n return {\n box: box,\n content: boxChildren.find(function (node) {\n return node.classList.contains(CONTENT_CLASS);\n }),\n arrow: boxChildren.find(function (node) {\n return node.classList.contains(ARROW_CLASS) || node.classList.contains(SVG_ARROW_CLASS);\n }),\n backdrop: boxChildren.find(function (node) {\n return node.classList.contains(BACKDROP_CLASS);\n })\n };\n}\nfunction render(instance) {\n var popper = div();\n var box = div();\n box.className = BOX_CLASS;\n box.setAttribute('data-state', 'hidden');\n box.setAttribute('tabindex', '-1');\n var content = div();\n content.className = CONTENT_CLASS;\n content.setAttribute('data-state', 'hidden');\n setContent(content, instance.props);\n popper.appendChild(box);\n box.appendChild(content);\n onUpdate(instance.props, instance.props);\n\n function onUpdate(prevProps, nextProps) {\n var _getChildren = getChildren(popper),\n box = _getChildren.box,\n content = _getChildren.content,\n arrow = _getChildren.arrow;\n\n if (nextProps.theme) {\n box.setAttribute('data-theme', nextProps.theme);\n } else {\n box.removeAttribute('data-theme');\n }\n\n if (typeof nextProps.animation === 'string') {\n box.setAttribute('data-animation', nextProps.animation);\n } else {\n box.removeAttribute('data-animation');\n }\n\n if (nextProps.inertia) {\n box.setAttribute('data-inertia', '');\n } else {\n box.removeAttribute('data-inertia');\n }\n\n box.style.maxWidth = typeof nextProps.maxWidth === 'number' ? nextProps.maxWidth + \"px\" : nextProps.maxWidth;\n\n if (nextProps.role) {\n box.setAttribute('role', nextProps.role);\n } else {\n box.removeAttribute('role');\n }\n\n if (prevProps.content !== nextProps.content || prevProps.allowHTML !== nextProps.allowHTML) {\n setContent(content, instance.props);\n }\n\n if (nextProps.arrow) {\n if (!arrow) {\n box.appendChild(createArrowElement(nextProps.arrow));\n } else if (prevProps.arrow !== nextProps.arrow) {\n box.removeChild(arrow);\n box.appendChild(createArrowElement(nextProps.arrow));\n }\n } else if (arrow) {\n box.removeChild(arrow);\n }\n }\n\n return {\n popper: popper,\n onUpdate: onUpdate\n };\n} // Runtime check to identify if the render function is the default one; this\n// way we can apply default CSS transitions logic and it can be tree-shaken away\n\nrender.$$tippy = true;\n\nvar idCounter = 1;\nvar mouseMoveListeners = []; // Used by `hideAll()`\n\nvar mountedInstances = [];\nfunction createTippy(reference, passedProps) {\n var props = evaluateProps(reference, Object.assign({}, defaultProps, getExtendedPassedProps(removeUndefinedProps(passedProps)))); // ===========================================================================\n // 🔒 Private members\n // ===========================================================================\n\n var showTimeout;\n var hideTimeout;\n var scheduleHideAnimationFrame;\n var isVisibleFromClick = false;\n var didHideDueToDocumentMouseDown = false;\n var didTouchMove = false;\n var ignoreOnFirstUpdate = false;\n var lastTriggerEvent;\n var currentTransitionEndListener;\n var onFirstUpdate;\n var listeners = [];\n var debouncedOnMouseMove = debounce(onMouseMove, props.interactiveDebounce);\n var currentTarget; // ===========================================================================\n // 🔑 Public members\n // ===========================================================================\n\n var id = idCounter++;\n var popperInstance = null;\n var plugins = unique(props.plugins);\n var state = {\n // Is the instance currently enabled?\n isEnabled: true,\n // Is the tippy currently showing and not transitioning out?\n isVisible: false,\n // Has the instance been destroyed?\n isDestroyed: false,\n // Is the tippy currently mounted to the DOM?\n isMounted: false,\n // Has the tippy finished transitioning in?\n isShown: false\n };\n var instance = {\n // properties\n id: id,\n reference: reference,\n popper: div(),\n popperInstance: popperInstance,\n props: props,\n state: state,\n plugins: plugins,\n // methods\n clearDelayTimeouts: clearDelayTimeouts,\n setProps: setProps,\n setContent: setContent,\n show: show,\n hide: hide,\n hideWithInteractivity: hideWithInteractivity,\n enable: enable,\n disable: disable,\n unmount: unmount,\n destroy: destroy\n }; // TODO: Investigate why this early return causes a TDZ error in the tests —\n // it doesn't seem to happen in the browser\n\n /* istanbul ignore if */\n\n if (!props.render) {\n if (process.env.NODE_ENV !== \"production\") {\n errorWhen(true, 'render() function has not been supplied.');\n }\n\n return instance;\n } // ===========================================================================\n // Initial mutations\n // ===========================================================================\n\n\n var _props$render = props.render(instance),\n popper = _props$render.popper,\n onUpdate = _props$render.onUpdate;\n\n popper.setAttribute('data-tippy-root', '');\n popper.id = \"tippy-\" + instance.id;\n instance.popper = popper;\n reference._tippy = instance;\n popper._tippy = instance;\n var pluginsHooks = plugins.map(function (plugin) {\n return plugin.fn(instance);\n });\n var hasAriaExpanded = reference.hasAttribute('aria-expanded');\n addListeners();\n handleAriaExpandedAttribute();\n handleStyles();\n invokeHook('onCreate', [instance]);\n\n if (props.showOnCreate) {\n scheduleShow();\n } // Prevent a tippy with a delay from hiding if the cursor left then returned\n // before it started hiding\n\n\n popper.addEventListener('mouseenter', function () {\n if (instance.props.interactive && instance.state.isVisible) {\n instance.clearDelayTimeouts();\n }\n });\n popper.addEventListener('mouseleave', function () {\n if (instance.props.interactive && instance.props.trigger.indexOf('mouseenter') >= 0) {\n getDocument().addEventListener('mousemove', debouncedOnMouseMove);\n }\n });\n return instance; // ===========================================================================\n // 🔒 Private methods\n // ===========================================================================\n\n function getNormalizedTouchSettings() {\n var touch = instance.props.touch;\n return Array.isArray(touch) ? touch : [touch, 0];\n }\n\n function getIsCustomTouchBehavior() {\n return getNormalizedTouchSettings()[0] === 'hold';\n }\n\n function getIsDefaultRenderFn() {\n var _instance$props$rende;\n\n // @ts-ignore\n return !!((_instance$props$rende = instance.props.render) != null && _instance$props$rende.$$tippy);\n }\n\n function getCurrentTarget() {\n return currentTarget || reference;\n }\n\n function getDocument() {\n var parent = getCurrentTarget().parentNode;\n return parent ? getOwnerDocument(parent) : document;\n }\n\n function getDefaultTemplateChildren() {\n return getChildren(popper);\n }\n\n function getDelay(isShow) {\n // For touch or keyboard input, force `0` delay for UX reasons\n // Also if the instance is mounted but not visible (transitioning out),\n // ignore delay\n if (instance.state.isMounted && !instance.state.isVisible || currentInput.isTouch || lastTriggerEvent && lastTriggerEvent.type === 'focus') {\n return 0;\n }\n\n return getValueAtIndexOrReturn(instance.props.delay, isShow ? 0 : 1, defaultProps.delay);\n }\n\n function handleStyles(fromHide) {\n if (fromHide === void 0) {\n fromHide = false;\n }\n\n popper.style.pointerEvents = instance.props.interactive && !fromHide ? '' : 'none';\n popper.style.zIndex = \"\" + instance.props.zIndex;\n }\n\n function invokeHook(hook, args, shouldInvokePropsHook) {\n if (shouldInvokePropsHook === void 0) {\n shouldInvokePropsHook = true;\n }\n\n pluginsHooks.forEach(function (pluginHooks) {\n if (pluginHooks[hook]) {\n pluginHooks[hook].apply(pluginHooks, args);\n }\n });\n\n if (shouldInvokePropsHook) {\n var _instance$props;\n\n (_instance$props = instance.props)[hook].apply(_instance$props, args);\n }\n }\n\n function handleAriaContentAttribute() {\n var aria = instance.props.aria;\n\n if (!aria.content) {\n return;\n }\n\n var attr = \"aria-\" + aria.content;\n var id = popper.id;\n var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n nodes.forEach(function (node) {\n var currentValue = node.getAttribute(attr);\n\n if (instance.state.isVisible) {\n node.setAttribute(attr, currentValue ? currentValue + \" \" + id : id);\n } else {\n var nextValue = currentValue && currentValue.replace(id, '').trim();\n\n if (nextValue) {\n node.setAttribute(attr, nextValue);\n } else {\n node.removeAttribute(attr);\n }\n }\n });\n }\n\n function handleAriaExpandedAttribute() {\n if (hasAriaExpanded || !instance.props.aria.expanded) {\n return;\n }\n\n var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n nodes.forEach(function (node) {\n if (instance.props.interactive) {\n node.setAttribute('aria-expanded', instance.state.isVisible && node === getCurrentTarget() ? 'true' : 'false');\n } else {\n node.removeAttribute('aria-expanded');\n }\n });\n }\n\n function cleanupInteractiveMouseListeners() {\n getDocument().removeEventListener('mousemove', debouncedOnMouseMove);\n mouseMoveListeners = mouseMoveListeners.filter(function (listener) {\n return listener !== debouncedOnMouseMove;\n });\n }\n\n function onDocumentPress(event) {\n // Moved finger to scroll instead of an intentional tap outside\n if (currentInput.isTouch) {\n if (didTouchMove || event.type === 'mousedown') {\n return;\n }\n }\n\n var actualTarget = event.composedPath && event.composedPath()[0] || event.target; // Clicked on interactive popper\n\n if (instance.props.interactive && actualContains(popper, actualTarget)) {\n return;\n } // Clicked on the event listeners target\n\n\n if (normalizeToArray(instance.props.triggerTarget || reference).some(function (el) {\n return actualContains(el, actualTarget);\n })) {\n if (currentInput.isTouch) {\n return;\n }\n\n if (instance.state.isVisible && instance.props.trigger.indexOf('click') >= 0) {\n return;\n }\n } else {\n invokeHook('onClickOutside', [instance, event]);\n }\n\n if (instance.props.hideOnClick === true) {\n instance.clearDelayTimeouts();\n instance.hide(); // `mousedown` event is fired right before `focus` if pressing the\n // currentTarget. This lets a tippy with `focus` trigger know that it\n // should not show\n\n didHideDueToDocumentMouseDown = true;\n setTimeout(function () {\n didHideDueToDocumentMouseDown = false;\n }); // The listener gets added in `scheduleShow()`, but this may be hiding it\n // before it shows, and hide()'s early bail-out behavior can prevent it\n // from being cleaned up\n\n if (!instance.state.isMounted) {\n removeDocumentPress();\n }\n }\n }\n\n function onTouchMove() {\n didTouchMove = true;\n }\n\n function onTouchStart() {\n didTouchMove = false;\n }\n\n function addDocumentPress() {\n var doc = getDocument();\n doc.addEventListener('mousedown', onDocumentPress, true);\n doc.addEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n doc.addEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n doc.addEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n }\n\n function removeDocumentPress() {\n var doc = getDocument();\n doc.removeEventListener('mousedown', onDocumentPress, true);\n doc.removeEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n doc.removeEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n doc.removeEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n }\n\n function onTransitionedOut(duration, callback) {\n onTransitionEnd(duration, function () {\n if (!instance.state.isVisible && popper.parentNode && popper.parentNode.contains(popper)) {\n callback();\n }\n });\n }\n\n function onTransitionedIn(duration, callback) {\n onTransitionEnd(duration, callback);\n }\n\n function onTransitionEnd(duration, callback) {\n var box = getDefaultTemplateChildren().box;\n\n function listener(event) {\n if (event.target === box) {\n updateTransitionEndListener(box, 'remove', listener);\n callback();\n }\n } // Make callback synchronous if duration is 0\n // `transitionend` won't fire otherwise\n\n\n if (duration === 0) {\n return callback();\n }\n\n updateTransitionEndListener(box, 'remove', currentTransitionEndListener);\n updateTransitionEndListener(box, 'add', listener);\n currentTransitionEndListener = listener;\n }\n\n function on(eventType, handler, options) {\n if (options === void 0) {\n options = false;\n }\n\n var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n nodes.forEach(function (node) {\n node.addEventListener(eventType, handler, options);\n listeners.push({\n node: node,\n eventType: eventType,\n handler: handler,\n options: options\n });\n });\n }\n\n function addListeners() {\n if (getIsCustomTouchBehavior()) {\n on('touchstart', onTrigger, {\n passive: true\n });\n on('touchend', onMouseLeave, {\n passive: true\n });\n }\n\n splitBySpaces(instance.props.trigger).forEach(function (eventType) {\n if (eventType === 'manual') {\n return;\n }\n\n on(eventType, onTrigger);\n\n switch (eventType) {\n case 'mouseenter':\n on('mouseleave', onMouseLeave);\n break;\n\n case 'focus':\n on(isIE11 ? 'focusout' : 'blur', onBlurOrFocusOut);\n break;\n\n case 'focusin':\n on('focusout', onBlurOrFocusOut);\n break;\n }\n });\n }\n\n function removeListeners() {\n listeners.forEach(function (_ref) {\n var node = _ref.node,\n eventType = _ref.eventType,\n handler = _ref.handler,\n options = _ref.options;\n node.removeEventListener(eventType, handler, options);\n });\n listeners = [];\n }\n\n function onTrigger(event) {\n var _lastTriggerEvent;\n\n var shouldScheduleClickHide = false;\n\n if (!instance.state.isEnabled || isEventListenerStopped(event) || didHideDueToDocumentMouseDown) {\n return;\n }\n\n var wasFocused = ((_lastTriggerEvent = lastTriggerEvent) == null ? void 0 : _lastTriggerEvent.type) === 'focus';\n lastTriggerEvent = event;\n currentTarget = event.currentTarget;\n handleAriaExpandedAttribute();\n\n if (!instance.state.isVisible && isMouseEvent(event)) {\n // If scrolling, `mouseenter` events can be fired if the cursor lands\n // over a new target, but `mousemove` events don't get fired. This\n // causes interactive tooltips to get stuck open until the cursor is\n // moved\n mouseMoveListeners.forEach(function (listener) {\n return listener(event);\n });\n } // Toggle show/hide when clicking click-triggered tooltips\n\n\n if (event.type === 'click' && (instance.props.trigger.indexOf('mouseenter') < 0 || isVisibleFromClick) && instance.props.hideOnClick !== false && instance.state.isVisible) {\n shouldScheduleClickHide = true;\n } else {\n scheduleShow(event);\n }\n\n if (event.type === 'click') {\n isVisibleFromClick = !shouldScheduleClickHide;\n }\n\n if (shouldScheduleClickHide && !wasFocused) {\n scheduleHide(event);\n }\n }\n\n function onMouseMove(event) {\n var target = event.target;\n var isCursorOverReferenceOrPopper = getCurrentTarget().contains(target) || popper.contains(target);\n\n if (event.type === 'mousemove' && isCursorOverReferenceOrPopper) {\n return;\n }\n\n var popperTreeData = getNestedPopperTree().concat(popper).map(function (popper) {\n var _instance$popperInsta;\n\n var instance = popper._tippy;\n var state = (_instance$popperInsta = instance.popperInstance) == null ? void 0 : _instance$popperInsta.state;\n\n if (state) {\n return {\n popperRect: popper.getBoundingClientRect(),\n popperState: state,\n props: props\n };\n }\n\n return null;\n }).filter(Boolean);\n\n if (isCursorOutsideInteractiveBorder(popperTreeData, event)) {\n cleanupInteractiveMouseListeners();\n scheduleHide(event);\n }\n }\n\n function onMouseLeave(event) {\n var shouldBail = isEventListenerStopped(event) || instance.props.trigger.indexOf('click') >= 0 && isVisibleFromClick;\n\n if (shouldBail) {\n return;\n }\n\n if (instance.props.interactive) {\n instance.hideWithInteractivity(event);\n return;\n }\n\n scheduleHide(event);\n }\n\n function onBlurOrFocusOut(event) {\n if (instance.props.trigger.indexOf('focusin') < 0 && event.target !== getCurrentTarget()) {\n return;\n } // If focus was moved to within the popper\n\n\n if (instance.props.interactive && event.relatedTarget && popper.contains(event.relatedTarget)) {\n return;\n }\n\n scheduleHide(event);\n }\n\n function isEventListenerStopped(event) {\n return currentInput.isTouch ? getIsCustomTouchBehavior() !== event.type.indexOf('touch') >= 0 : false;\n }\n\n function createPopperInstance() {\n destroyPopperInstance();\n var _instance$props2 = instance.props,\n popperOptions = _instance$props2.popperOptions,\n placement = _instance$props2.placement,\n offset = _instance$props2.offset,\n getReferenceClientRect = _instance$props2.getReferenceClientRect,\n moveTransition = _instance$props2.moveTransition;\n var arrow = getIsDefaultRenderFn() ? getChildren(popper).arrow : null;\n var computedReference = getReferenceClientRect ? {\n getBoundingClientRect: getReferenceClientRect,\n contextElement: getReferenceClientRect.contextElement || getCurrentTarget()\n } : reference;\n var tippyModifier = {\n name: '$$tippy',\n enabled: true,\n phase: 'beforeWrite',\n requires: ['computeStyles'],\n fn: function fn(_ref2) {\n var state = _ref2.state;\n\n if (getIsDefaultRenderFn()) {\n var _getDefaultTemplateCh = getDefaultTemplateChildren(),\n box = _getDefaultTemplateCh.box;\n\n ['placement', 'reference-hidden', 'escaped'].forEach(function (attr) {\n if (attr === 'placement') {\n box.setAttribute('data-placement', state.placement);\n } else {\n if (state.attributes.popper[\"data-popper-\" + attr]) {\n box.setAttribute(\"data-\" + attr, '');\n } else {\n box.removeAttribute(\"data-\" + attr);\n }\n }\n });\n state.attributes.popper = {};\n }\n }\n };\n var modifiers = [{\n name: 'offset',\n options: {\n offset: offset\n }\n }, {\n name: 'preventOverflow',\n options: {\n padding: {\n top: 2,\n bottom: 2,\n left: 5,\n right: 5\n }\n }\n }, {\n name: 'flip',\n options: {\n padding: 5\n }\n }, {\n name: 'computeStyles',\n options: {\n adaptive: !moveTransition\n }\n }, tippyModifier];\n\n if (getIsDefaultRenderFn() && arrow) {\n modifiers.push({\n name: 'arrow',\n options: {\n element: arrow,\n padding: 3\n }\n });\n }\n\n modifiers.push.apply(modifiers, (popperOptions == null ? void 0 : popperOptions.modifiers) || []);\n instance.popperInstance = createPopper(computedReference, popper, Object.assign({}, popperOptions, {\n placement: placement,\n onFirstUpdate: onFirstUpdate,\n modifiers: modifiers\n }));\n }\n\n function destroyPopperInstance() {\n if (instance.popperInstance) {\n instance.popperInstance.destroy();\n instance.popperInstance = null;\n }\n }\n\n function mount() {\n var appendTo = instance.props.appendTo;\n var parentNode; // By default, we'll append the popper to the triggerTargets's parentNode so\n // it's directly after the reference element so the elements inside the\n // tippy can be tabbed to\n // If there are clipping issues, the user can specify a different appendTo\n // and ensure focus management is handled correctly manually\n\n var node = getCurrentTarget();\n\n if (instance.props.interactive && appendTo === TIPPY_DEFAULT_APPEND_TO || appendTo === 'parent') {\n parentNode = node.parentNode;\n } else {\n parentNode = invokeWithArgsOrReturn(appendTo, [node]);\n } // The popper element needs to exist on the DOM before its position can be\n // updated as Popper needs to read its dimensions\n\n\n if (!parentNode.contains(popper)) {\n parentNode.appendChild(popper);\n }\n\n instance.state.isMounted = true;\n createPopperInstance();\n /* istanbul ignore else */\n\n if (process.env.NODE_ENV !== \"production\") {\n // Accessibility check\n warnWhen(instance.props.interactive && appendTo === defaultProps.appendTo && node.nextElementSibling !== popper, ['Interactive tippy element may not be accessible via keyboard', 'navigation because it is not directly after the reference element', 'in the DOM source order.', '\\n\\n', 'Using a wrapper <div> or <span> tag around the reference element', 'solves this by creating a new parentNode context.', '\\n\\n', 'Specifying `appendTo: document.body` silences this warning, but it', 'assumes you are using a focus management solution to handle', 'keyboard navigation.', '\\n\\n', 'See: https://atomiks.github.io/tippyjs/v6/accessibility/#interactivity'].join(' '));\n }\n }\n\n function getNestedPopperTree() {\n return arrayFrom(popper.querySelectorAll('[data-tippy-root]'));\n }\n\n function scheduleShow(event) {\n instance.clearDelayTimeouts();\n\n if (event) {\n invokeHook('onTrigger', [instance, event]);\n }\n\n addDocumentPress();\n var delay = getDelay(true);\n\n var _getNormalizedTouchSe = getNormalizedTouchSettings(),\n touchValue = _getNormalizedTouchSe[0],\n touchDelay = _getNormalizedTouchSe[1];\n\n if (currentInput.isTouch && touchValue === 'hold' && touchDelay) {\n delay = touchDelay;\n }\n\n if (delay) {\n showTimeout = setTimeout(function () {\n instance.show();\n }, delay);\n } else {\n instance.show();\n }\n }\n\n function scheduleHide(event) {\n instance.clearDelayTimeouts();\n invokeHook('onUntrigger', [instance, event]);\n\n if (!instance.state.isVisible) {\n removeDocumentPress();\n return;\n } // For interactive tippies, scheduleHide is added to a document.body handler\n // from onMouseLeave so must intercept scheduled hides from mousemove/leave\n // events when trigger contains mouseenter and click, and the tip is\n // currently shown as a result of a click.\n\n\n if (instance.props.trigger.indexOf('mouseenter') >= 0 && instance.props.trigger.indexOf('click') >= 0 && ['mouseleave', 'mousemove'].indexOf(event.type) >= 0 && isVisibleFromClick) {\n return;\n }\n\n var delay = getDelay(false);\n\n if (delay) {\n hideTimeout = setTimeout(function () {\n if (instance.state.isVisible) {\n instance.hide();\n }\n }, delay);\n } else {\n // Fixes a `transitionend` problem when it fires 1 frame too\n // late sometimes, we don't want hide() to be called.\n scheduleHideAnimationFrame = requestAnimationFrame(function () {\n instance.hide();\n });\n }\n } // ===========================================================================\n // 🔑 Public methods\n // ===========================================================================\n\n\n function enable() {\n instance.state.isEnabled = true;\n }\n\n function disable() {\n // Disabling the instance should also hide it\n // https://github.com/atomiks/tippy.js-react/issues/106\n instance.hide();\n instance.state.isEnabled = false;\n }\n\n function clearDelayTimeouts() {\n clearTimeout(showTimeout);\n clearTimeout(hideTimeout);\n cancelAnimationFrame(scheduleHideAnimationFrame);\n }\n\n function setProps(partialProps) {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('setProps'));\n }\n\n if (instance.state.isDestroyed) {\n return;\n }\n\n invokeHook('onBeforeUpdate', [instance, partialProps]);\n removeListeners();\n var prevProps = instance.props;\n var nextProps = evaluateProps(reference, Object.assign({}, prevProps, removeUndefinedProps(partialProps), {\n ignoreAttributes: true\n }));\n instance.props = nextProps;\n addListeners();\n\n if (prevProps.interactiveDebounce !== nextProps.interactiveDebounce) {\n cleanupInteractiveMouseListeners();\n debouncedOnMouseMove = debounce(onMouseMove, nextProps.interactiveDebounce);\n } // Ensure stale aria-expanded attributes are removed\n\n\n if (prevProps.triggerTarget && !nextProps.triggerTarget) {\n normalizeToArray(prevProps.triggerTarget).forEach(function (node) {\n node.removeAttribute('aria-expanded');\n });\n } else if (nextProps.triggerTarget) {\n reference.removeAttribute('aria-expanded');\n }\n\n handleAriaExpandedAttribute();\n handleStyles();\n\n if (onUpdate) {\n onUpdate(prevProps, nextProps);\n }\n\n if (instance.popperInstance) {\n createPopperInstance(); // Fixes an issue with nested tippies if they are all getting re-rendered,\n // and the nested ones get re-rendered first.\n // https://github.com/atomiks/tippyjs-react/issues/177\n // TODO: find a cleaner / more efficient solution(!)\n\n getNestedPopperTree().forEach(function (nestedPopper) {\n // React (and other UI libs likely) requires a rAF wrapper as it flushes\n // its work in one\n requestAnimationFrame(nestedPopper._tippy.popperInstance.forceUpdate);\n });\n }\n\n invokeHook('onAfterUpdate', [instance, partialProps]);\n }\n\n function setContent(content) {\n instance.setProps({\n content: content\n });\n }\n\n function show() {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('show'));\n } // Early bail-out\n\n\n var isAlreadyVisible = instance.state.isVisible;\n var isDestroyed = instance.state.isDestroyed;\n var isDisabled = !instance.state.isEnabled;\n var isTouchAndTouchDisabled = currentInput.isTouch && !instance.props.touch;\n var duration = getValueAtIndexOrReturn(instance.props.duration, 0, defaultProps.duration);\n\n if (isAlreadyVisible || isDestroyed || isDisabled || isTouchAndTouchDisabled) {\n return;\n } // Normalize `disabled` behavior across browsers.\n // Firefox allows events on disabled elements, but Chrome doesn't.\n // Using a wrapper element (i.e. <span>) is recommended.\n\n\n if (getCurrentTarget().hasAttribute('disabled')) {\n return;\n }\n\n invokeHook('onShow', [instance], false);\n\n if (instance.props.onShow(instance) === false) {\n return;\n }\n\n instance.state.isVisible = true;\n\n if (getIsDefaultRenderFn()) {\n popper.style.visibility = 'visible';\n }\n\n handleStyles();\n addDocumentPress();\n\n if (!instance.state.isMounted) {\n popper.style.transition = 'none';\n } // If flipping to the opposite side after hiding at least once, the\n // animation will use the wrong placement without resetting the duration\n\n\n if (getIsDefaultRenderFn()) {\n var _getDefaultTemplateCh2 = getDefaultTemplateChildren(),\n box = _getDefaultTemplateCh2.box,\n content = _getDefaultTemplateCh2.content;\n\n setTransitionDuration([box, content], 0);\n }\n\n onFirstUpdate = function onFirstUpdate() {\n var _instance$popperInsta2;\n\n if (!instance.state.isVisible || ignoreOnFirstUpdate) {\n return;\n }\n\n ignoreOnFirstUpdate = true; // reflow\n\n void popper.offsetHeight;\n popper.style.transition = instance.props.moveTransition;\n\n if (getIsDefaultRenderFn() && instance.props.animation) {\n var _getDefaultTemplateCh3 = getDefaultTemplateChildren(),\n _box = _getDefaultTemplateCh3.box,\n _content = _getDefaultTemplateCh3.content;\n\n setTransitionDuration([_box, _content], duration);\n setVisibilityState([_box, _content], 'visible');\n }\n\n handleAriaContentAttribute();\n handleAriaExpandedAttribute();\n pushIfUnique(mountedInstances, instance); // certain modifiers (e.g. `maxSize`) require a second update after the\n // popper has been positioned for the first time\n\n (_instance$popperInsta2 = instance.popperInstance) == null ? void 0 : _instance$popperInsta2.forceUpdate();\n invokeHook('onMount', [instance]);\n\n if (instance.props.animation && getIsDefaultRenderFn()) {\n onTransitionedIn(duration, function () {\n instance.state.isShown = true;\n invokeHook('onShown', [instance]);\n });\n }\n };\n\n mount();\n }\n\n function hide() {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('hide'));\n } // Early bail-out\n\n\n var isAlreadyHidden = !instance.state.isVisible;\n var isDestroyed = instance.state.isDestroyed;\n var isDisabled = !instance.state.isEnabled;\n var duration = getValueAtIndexOrReturn(instance.props.duration, 1, defaultProps.duration);\n\n if (isAlreadyHidden || isDestroyed || isDisabled) {\n return;\n }\n\n invokeHook('onHide', [instance], false);\n\n if (instance.props.onHide(instance) === false) {\n return;\n }\n\n instance.state.isVisible = false;\n instance.state.isShown = false;\n ignoreOnFirstUpdate = false;\n isVisibleFromClick = false;\n\n if (getIsDefaultRenderFn()) {\n popper.style.visibility = 'hidden';\n }\n\n cleanupInteractiveMouseListeners();\n removeDocumentPress();\n handleStyles(true);\n\n if (getIsDefaultRenderFn()) {\n var _getDefaultTemplateCh4 = getDefaultTemplateChildren(),\n box = _getDefaultTemplateCh4.box,\n content = _getDefaultTemplateCh4.content;\n\n if (instance.props.animation) {\n setTransitionDuration([box, content], duration);\n setVisibilityState([box, content], 'hidden');\n }\n }\n\n handleAriaContentAttribute();\n handleAriaExpandedAttribute();\n\n if (instance.props.animation) {\n if (getIsDefaultRenderFn()) {\n onTransitionedOut(duration, instance.unmount);\n }\n } else {\n instance.unmount();\n }\n }\n\n function hideWithInteractivity(event) {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('hideWithInteractivity'));\n }\n\n getDocument().addEventListener('mousemove', debouncedOnMouseMove);\n pushIfUnique(mouseMoveListeners, debouncedOnMouseMove);\n debouncedOnMouseMove(event);\n }\n\n function unmount() {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('unmount'));\n }\n\n if (instance.state.isVisible) {\n instance.hide();\n }\n\n if (!instance.state.isMounted) {\n return;\n }\n\n destroyPopperInstance(); // If a popper is not interactive, it will be appended outside the popper\n // tree by default. This seems mainly for interactive tippies, but we should\n // find a workaround if possible\n\n getNestedPopperTree().forEach(function (nestedPopper) {\n nestedPopper._tippy.unmount();\n });\n\n if (popper.parentNode) {\n popper.parentNode.removeChild(popper);\n }\n\n mountedInstances = mountedInstances.filter(function (i) {\n return i !== instance;\n });\n instance.state.isMounted = false;\n invokeHook('onHidden', [instance]);\n }\n\n function destroy() {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('destroy'));\n }\n\n if (instance.state.isDestroyed) {\n return;\n }\n\n instance.clearDelayTimeouts();\n instance.unmount();\n removeListeners();\n delete reference._tippy;\n instance.state.isDestroyed = true;\n invokeHook('onDestroy', [instance]);\n }\n}\n\nfunction tippy(targets, optionalProps) {\n if (optionalProps === void 0) {\n optionalProps = {};\n }\n\n var plugins = defaultProps.plugins.concat(optionalProps.plugins || []);\n /* istanbul ignore else */\n\n if (process.env.NODE_ENV !== \"production\") {\n validateTargets(targets);\n validateProps(optionalProps, plugins);\n }\n\n bindGlobalEventListeners();\n var passedProps = Object.assign({}, optionalProps, {\n plugins: plugins\n });\n var elements = getArrayOfElements(targets);\n /* istanbul ignore else */\n\n if (process.env.NODE_ENV !== \"production\") {\n var isSingleContentElement = isElement(passedProps.content);\n var isMoreThanOneReferenceElement = elements.length > 1;\n warnWhen(isSingleContentElement && isMoreThanOneReferenceElement, ['tippy() was passed an Element as the `content` prop, but more than', 'one tippy instance was created by this invocation. This means the', 'content element will only be appended to the last tippy instance.', '\\n\\n', 'Instead, pass the .innerHTML of the element, or use a function that', 'returns a cloned version of the element instead.', '\\n\\n', '1) content: element.innerHTML\\n', '2) content: () => element.cloneNode(true)'].join(' '));\n }\n\n var instances = elements.reduce(function (acc, reference) {\n var instance = reference && createTippy(reference, passedProps);\n\n if (instance) {\n acc.push(instance);\n }\n\n return acc;\n }, []);\n return isElement(targets) ? instances[0] : instances;\n}\n\ntippy.defaultProps = defaultProps;\ntippy.setDefaultProps = setDefaultProps;\ntippy.currentInput = currentInput;\nvar hideAll = function hideAll(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n excludedReferenceOrInstance = _ref.exclude,\n duration = _ref.duration;\n\n mountedInstances.forEach(function (instance) {\n var isExcluded = false;\n\n if (excludedReferenceOrInstance) {\n isExcluded = isReferenceElement(excludedReferenceOrInstance) ? instance.reference === excludedReferenceOrInstance : instance.popper === excludedReferenceOrInstance.popper;\n }\n\n if (!isExcluded) {\n var originalDuration = instance.props.duration;\n instance.setProps({\n duration: duration\n });\n instance.hide();\n\n if (!instance.state.isDestroyed) {\n instance.setProps({\n duration: originalDuration\n });\n }\n }\n });\n};\n\n// every time the popper is destroyed (i.e. a new target), removing the styles\n// and causing transitions to break for singletons when the console is open, but\n// most notably for non-transform styles being used, `gpuAcceleration: false`.\n\nvar applyStylesModifier = Object.assign({}, applyStyles, {\n effect: function effect(_ref) {\n var state = _ref.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n } // intentionally return no cleanup function\n // return () => { ... }\n\n }\n});\n\nvar createSingleton = function createSingleton(tippyInstances, optionalProps) {\n var _optionalProps$popper;\n\n if (optionalProps === void 0) {\n optionalProps = {};\n }\n\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n errorWhen(!Array.isArray(tippyInstances), ['The first argument passed to createSingleton() must be an array of', 'tippy instances. The passed value was', String(tippyInstances)].join(' '));\n }\n\n var individualInstances = tippyInstances;\n var references = [];\n var triggerTargets = [];\n var currentTarget;\n var overrides = optionalProps.overrides;\n var interceptSetPropsCleanups = [];\n var shownOnCreate = false;\n\n function setTriggerTargets() {\n triggerTargets = individualInstances.map(function (instance) {\n return normalizeToArray(instance.props.triggerTarget || instance.reference);\n }).reduce(function (acc, item) {\n return acc.concat(item);\n }, []);\n }\n\n function setReferences() {\n references = individualInstances.map(function (instance) {\n return instance.reference;\n });\n }\n\n function enableInstances(isEnabled) {\n individualInstances.forEach(function (instance) {\n if (isEnabled) {\n instance.enable();\n } else {\n instance.disable();\n }\n });\n }\n\n function interceptSetProps(singleton) {\n return individualInstances.map(function (instance) {\n var originalSetProps = instance.setProps;\n\n instance.setProps = function (props) {\n originalSetProps(props);\n\n if (instance.reference === currentTarget) {\n singleton.setProps(props);\n }\n };\n\n return function () {\n instance.setProps = originalSetProps;\n };\n });\n } // have to pass singleton, as it maybe undefined on first call\n\n\n function prepareInstance(singleton, target) {\n var index = triggerTargets.indexOf(target); // bail-out\n\n if (target === currentTarget) {\n return;\n }\n\n currentTarget = target;\n var overrideProps = (overrides || []).concat('content').reduce(function (acc, prop) {\n acc[prop] = individualInstances[index].props[prop];\n return acc;\n }, {});\n singleton.setProps(Object.assign({}, overrideProps, {\n getReferenceClientRect: typeof overrideProps.getReferenceClientRect === 'function' ? overrideProps.getReferenceClientRect : function () {\n var _references$index;\n\n return (_references$index = references[index]) == null ? void 0 : _references$index.getBoundingClientRect();\n }\n }));\n }\n\n enableInstances(false);\n setReferences();\n setTriggerTargets();\n var plugin = {\n fn: function fn() {\n return {\n onDestroy: function onDestroy() {\n enableInstances(true);\n },\n onHidden: function onHidden() {\n currentTarget = null;\n },\n onClickOutside: function onClickOutside(instance) {\n if (instance.props.showOnCreate && !shownOnCreate) {\n shownOnCreate = true;\n currentTarget = null;\n }\n },\n onShow: function onShow(instance) {\n if (instance.props.showOnCreate && !shownOnCreate) {\n shownOnCreate = true;\n prepareInstance(instance, references[0]);\n }\n },\n onTrigger: function onTrigger(instance, event) {\n prepareInstance(instance, event.currentTarget);\n }\n };\n }\n };\n var singleton = tippy(div(), Object.assign({}, removeProperties(optionalProps, ['overrides']), {\n plugins: [plugin].concat(optionalProps.plugins || []),\n triggerTarget: triggerTargets,\n popperOptions: Object.assign({}, optionalProps.popperOptions, {\n modifiers: [].concat(((_optionalProps$popper = optionalProps.popperOptions) == null ? void 0 : _optionalProps$popper.modifiers) || [], [applyStylesModifier])\n })\n }));\n var originalShow = singleton.show;\n\n singleton.show = function (target) {\n originalShow(); // first time, showOnCreate or programmatic call with no params\n // default to showing first instance\n\n if (!currentTarget && target == null) {\n return prepareInstance(singleton, references[0]);\n } // triggered from event (do nothing as prepareInstance already called by onTrigger)\n // programmatic call with no params when already visible (do nothing again)\n\n\n if (currentTarget && target == null) {\n return;\n } // target is index of instance\n\n\n if (typeof target === 'number') {\n return references[target] && prepareInstance(singleton, references[target]);\n } // target is a child tippy instance\n\n\n if (individualInstances.indexOf(target) >= 0) {\n var ref = target.reference;\n return prepareInstance(singleton, ref);\n } // target is a ReferenceElement\n\n\n if (references.indexOf(target) >= 0) {\n return prepareInstance(singleton, target);\n }\n };\n\n singleton.showNext = function () {\n var first = references[0];\n\n if (!currentTarget) {\n return singleton.show(0);\n }\n\n var index = references.indexOf(currentTarget);\n singleton.show(references[index + 1] || first);\n };\n\n singleton.showPrevious = function () {\n var last = references[references.length - 1];\n\n if (!currentTarget) {\n return singleton.show(last);\n }\n\n var index = references.indexOf(currentTarget);\n var target = references[index - 1] || last;\n singleton.show(target);\n };\n\n var originalSetProps = singleton.setProps;\n\n singleton.setProps = function (props) {\n overrides = props.overrides || overrides;\n originalSetProps(props);\n };\n\n singleton.setInstances = function (nextInstances) {\n enableInstances(true);\n interceptSetPropsCleanups.forEach(function (fn) {\n return fn();\n });\n individualInstances = nextInstances;\n enableInstances(false);\n setReferences();\n setTriggerTargets();\n interceptSetPropsCleanups = interceptSetProps(singleton);\n singleton.setProps({\n triggerTarget: triggerTargets\n });\n };\n\n interceptSetPropsCleanups = interceptSetProps(singleton);\n return singleton;\n};\n\nvar BUBBLING_EVENTS_MAP = {\n mouseover: 'mouseenter',\n focusin: 'focus',\n click: 'click'\n};\n/**\n * Creates a delegate instance that controls the creation of tippy instances\n * for child elements (`target` CSS selector).\n */\n\nfunction delegate(targets, props) {\n /* istanbul ignore else */\n if (process.env.NODE_ENV !== \"production\") {\n errorWhen(!(props && props.target), ['You must specity a `target` prop indicating a CSS selector string matching', 'the target elements that should receive a tippy.'].join(' '));\n }\n\n var listeners = [];\n var childTippyInstances = [];\n var disabled = false;\n var target = props.target;\n var nativeProps = removeProperties(props, ['target']);\n var parentProps = Object.assign({}, nativeProps, {\n trigger: 'manual',\n touch: false\n });\n var childProps = Object.assign({\n touch: defaultProps.touch\n }, nativeProps, {\n showOnCreate: true\n });\n var returnValue = tippy(targets, parentProps);\n var normalizedReturnValue = normalizeToArray(returnValue);\n\n function onTrigger(event) {\n if (!event.target || disabled) {\n return;\n }\n\n var targetNode = event.target.closest(target);\n\n if (!targetNode) {\n return;\n } // Get relevant trigger with fallbacks:\n // 1. Check `data-tippy-trigger` attribute on target node\n // 2. Fallback to `trigger` passed to `delegate()`\n // 3. Fallback to `defaultProps.trigger`\n\n\n var trigger = targetNode.getAttribute('data-tippy-trigger') || props.trigger || defaultProps.trigger; // @ts-ignore\n\n if (targetNode._tippy) {\n return;\n }\n\n if (event.type === 'touchstart' && typeof childProps.touch === 'boolean') {\n return;\n }\n\n if (event.type !== 'touchstart' && trigger.indexOf(BUBBLING_EVENTS_MAP[event.type]) < 0) {\n return;\n }\n\n var instance = tippy(targetNode, childProps);\n\n if (instance) {\n childTippyInstances = childTippyInstances.concat(instance);\n }\n }\n\n function on(node, eventType, handler, options) {\n if (options === void 0) {\n options = false;\n }\n\n node.addEventListener(eventType, handler, options);\n listeners.push({\n node: node,\n eventType: eventType,\n handler: handler,\n options: options\n });\n }\n\n function addEventListeners(instance) {\n var reference = instance.reference;\n on(reference, 'touchstart', onTrigger, TOUCH_OPTIONS);\n on(reference, 'mouseover', onTrigger);\n on(reference, 'focusin', onTrigger);\n on(reference, 'click', onTrigger);\n }\n\n function removeEventListeners() {\n listeners.forEach(function (_ref) {\n var node = _ref.node,\n eventType = _ref.eventType,\n handler = _ref.handler,\n options = _ref.options;\n node.removeEventListener(eventType, handler, options);\n });\n listeners = [];\n }\n\n function applyMutations(instance) {\n var originalDestroy = instance.destroy;\n var originalEnable = instance.enable;\n var originalDisable = instance.disable;\n\n instance.destroy = function (shouldDestroyChildInstances) {\n if (shouldDestroyChildInstances === void 0) {\n shouldDestroyChildInstances = true;\n }\n\n if (shouldDestroyChildInstances) {\n childTippyInstances.forEach(function (instance) {\n instance.destroy();\n });\n }\n\n childTippyInstances = [];\n removeEventListeners();\n originalDestroy();\n };\n\n instance.enable = function () {\n originalEnable();\n childTippyInstances.forEach(function (instance) {\n return instance.enable();\n });\n disabled = false;\n };\n\n instance.disable = function () {\n originalDisable();\n childTippyInstances.forEach(function (instance) {\n return instance.disable();\n });\n disabled = true;\n };\n\n addEventListeners(instance);\n }\n\n normalizedReturnValue.forEach(applyMutations);\n return returnValue;\n}\n\nvar animateFill = {\n name: 'animateFill',\n defaultValue: false,\n fn: function fn(instance) {\n var _instance$props$rende;\n\n // @ts-ignore\n if (!((_instance$props$rende = instance.props.render) != null && _instance$props$rende.$$tippy)) {\n if (process.env.NODE_ENV !== \"production\") {\n errorWhen(instance.props.animateFill, 'The `animateFill` plugin requires the default render function.');\n }\n\n return {};\n }\n\n var _getChildren = getChildren(instance.popper),\n box = _getChildren.box,\n content = _getChildren.content;\n\n var backdrop = instance.props.animateFill ? createBackdropElement() : null;\n return {\n onCreate: function onCreate() {\n if (backdrop) {\n box.insertBefore(backdrop, box.firstElementChild);\n box.setAttribute('data-animatefill', '');\n box.style.overflow = 'hidden';\n instance.setProps({\n arrow: false,\n animation: 'shift-away'\n });\n }\n },\n onMount: function onMount() {\n if (backdrop) {\n var transitionDuration = box.style.transitionDuration;\n var duration = Number(transitionDuration.replace('ms', '')); // The content should fade in after the backdrop has mostly filled the\n // tooltip element. `clip-path` is the other alternative but is not\n // well-supported and is buggy on some devices.\n\n content.style.transitionDelay = Math.round(duration / 10) + \"ms\";\n backdrop.style.transitionDuration = transitionDuration;\n setVisibilityState([backdrop], 'visible');\n }\n },\n onShow: function onShow() {\n if (backdrop) {\n backdrop.style.transitionDuration = '0ms';\n }\n },\n onHide: function onHide() {\n if (backdrop) {\n setVisibilityState([backdrop], 'hidden');\n }\n }\n };\n }\n};\n\nfunction createBackdropElement() {\n var backdrop = div();\n backdrop.className = BACKDROP_CLASS;\n setVisibilityState([backdrop], 'hidden');\n return backdrop;\n}\n\nvar mouseCoords = {\n clientX: 0,\n clientY: 0\n};\nvar activeInstances = [];\n\nfunction storeMouseCoords(_ref) {\n var clientX = _ref.clientX,\n clientY = _ref.clientY;\n mouseCoords = {\n clientX: clientX,\n clientY: clientY\n };\n}\n\nfunction addMouseCoordsListener(doc) {\n doc.addEventListener('mousemove', storeMouseCoords);\n}\n\nfunction removeMouseCoordsListener(doc) {\n doc.removeEventListener('mousemove', storeMouseCoords);\n}\n\nvar followCursor = {\n name: 'followCursor',\n defaultValue: false,\n fn: function fn(instance) {\n var reference = instance.reference;\n var doc = getOwnerDocument(instance.props.triggerTarget || reference);\n var isInternalUpdate = false;\n var wasFocusEvent = false;\n var isUnmounted = true;\n var prevProps = instance.props;\n\n function getIsInitialBehavior() {\n return instance.props.followCursor === 'initial' && instance.state.isVisible;\n }\n\n function addListener() {\n doc.addEventListener('mousemove', onMouseMove);\n }\n\n function removeListener() {\n doc.removeEventListener('mousemove', onMouseMove);\n }\n\n function unsetGetReferenceClientRect() {\n isInternalUpdate = true;\n instance.setProps({\n getReferenceClientRect: null\n });\n isInternalUpdate = false;\n }\n\n function onMouseMove(event) {\n // If the instance is interactive, avoid updating the position unless it's\n // over the reference element\n var isCursorOverReference = event.target ? reference.contains(event.target) : true;\n var followCursor = instance.props.followCursor;\n var clientX = event.clientX,\n clientY = event.clientY;\n var rect = reference.getBoundingClientRect();\n var relativeX = clientX - rect.left;\n var relativeY = clientY - rect.top;\n\n if (isCursorOverReference || !instance.props.interactive) {\n instance.setProps({\n // @ts-ignore - unneeded DOMRect properties\n getReferenceClientRect: function getReferenceClientRect() {\n var rect = reference.getBoundingClientRect();\n var x = clientX;\n var y = clientY;\n\n if (followCursor === 'initial') {\n x = rect.left + relativeX;\n y = rect.top + relativeY;\n }\n\n var top = followCursor === 'horizontal' ? rect.top : y;\n var right = followCursor === 'vertical' ? rect.right : x;\n var bottom = followCursor === 'horizontal' ? rect.bottom : y;\n var left = followCursor === 'vertical' ? rect.left : x;\n return {\n width: right - left,\n height: bottom - top,\n top: top,\n right: right,\n bottom: bottom,\n left: left\n };\n }\n });\n }\n }\n\n function create() {\n if (instance.props.followCursor) {\n activeInstances.push({\n instance: instance,\n doc: doc\n });\n addMouseCoordsListener(doc);\n }\n }\n\n function destroy() {\n activeInstances = activeInstances.filter(function (data) {\n return data.instance !== instance;\n });\n\n if (activeInstances.filter(function (data) {\n return data.doc === doc;\n }).length === 0) {\n removeMouseCoordsListener(doc);\n }\n }\n\n return {\n onCreate: create,\n onDestroy: destroy,\n onBeforeUpdate: function onBeforeUpdate() {\n prevProps = instance.props;\n },\n onAfterUpdate: function onAfterUpdate(_, _ref2) {\n var followCursor = _ref2.followCursor;\n\n if (isInternalUpdate) {\n return;\n }\n\n if (followCursor !== undefined && prevProps.followCursor !== followCursor) {\n destroy();\n\n if (followCursor) {\n create();\n\n if (instance.state.isMounted && !wasFocusEvent && !getIsInitialBehavior()) {\n addListener();\n }\n } else {\n removeListener();\n unsetGetReferenceClientRect();\n }\n }\n },\n onMount: function onMount() {\n if (instance.props.followCursor && !wasFocusEvent) {\n if (isUnmounted) {\n onMouseMove(mouseCoords);\n isUnmounted = false;\n }\n\n if (!getIsInitialBehavior()) {\n addListener();\n }\n }\n },\n onTrigger: function onTrigger(_, event) {\n if (isMouseEvent(event)) {\n mouseCoords = {\n clientX: event.clientX,\n clientY: event.clientY\n };\n }\n\n wasFocusEvent = event.type === 'focus';\n },\n onHidden: function onHidden() {\n if (instance.props.followCursor) {\n unsetGetReferenceClientRect();\n removeListener();\n isUnmounted = true;\n }\n }\n };\n }\n};\n\nfunction getProps(props, modifier) {\n var _props$popperOptions;\n\n return {\n popperOptions: Object.assign({}, props.popperOptions, {\n modifiers: [].concat((((_props$popperOptions = props.popperOptions) == null ? void 0 : _props$popperOptions.modifiers) || []).filter(function (_ref) {\n var name = _ref.name;\n return name !== modifier.name;\n }), [modifier])\n })\n };\n}\n\nvar inlinePositioning = {\n name: 'inlinePositioning',\n defaultValue: false,\n fn: function fn(instance) {\n var reference = instance.reference;\n\n function isEnabled() {\n return !!instance.props.inlinePositioning;\n }\n\n var placement;\n var cursorRectIndex = -1;\n var isInternalUpdate = false;\n var triedPlacements = [];\n var modifier = {\n name: 'tippyInlinePositioning',\n enabled: true,\n phase: 'afterWrite',\n fn: function fn(_ref2) {\n var state = _ref2.state;\n\n if (isEnabled()) {\n if (triedPlacements.indexOf(state.placement) !== -1) {\n triedPlacements = [];\n }\n\n if (placement !== state.placement && triedPlacements.indexOf(state.placement) === -1) {\n triedPlacements.push(state.placement);\n instance.setProps({\n // @ts-ignore - unneeded DOMRect properties\n getReferenceClientRect: function getReferenceClientRect() {\n return _getReferenceClientRect(state.placement);\n }\n });\n }\n\n placement = state.placement;\n }\n }\n };\n\n function _getReferenceClientRect(placement) {\n return getInlineBoundingClientRect(getBasePlacement(placement), reference.getBoundingClientRect(), arrayFrom(reference.getClientRects()), cursorRectIndex);\n }\n\n function setInternalProps(partialProps) {\n isInternalUpdate = true;\n instance.setProps(partialProps);\n isInternalUpdate = false;\n }\n\n function addModifier() {\n if (!isInternalUpdate) {\n setInternalProps(getProps(instance.props, modifier));\n }\n }\n\n return {\n onCreate: addModifier,\n onAfterUpdate: addModifier,\n onTrigger: function onTrigger(_, event) {\n if (isMouseEvent(event)) {\n var rects = arrayFrom(instance.reference.getClientRects());\n var cursorRect = rects.find(function (rect) {\n return rect.left - 2 <= event.clientX && rect.right + 2 >= event.clientX && rect.top - 2 <= event.clientY && rect.bottom + 2 >= event.clientY;\n });\n var index = rects.indexOf(cursorRect);\n cursorRectIndex = index > -1 ? index : cursorRectIndex;\n }\n },\n onHidden: function onHidden() {\n cursorRectIndex = -1;\n }\n };\n }\n};\nfunction getInlineBoundingClientRect(currentBasePlacement, boundingRect, clientRects, cursorRectIndex) {\n // Not an inline element, or placement is not yet known\n if (clientRects.length < 2 || currentBasePlacement === null) {\n return boundingRect;\n } // There are two rects and they are disjoined\n\n\n if (clientRects.length === 2 && cursorRectIndex >= 0 && clientRects[0].left > clientRects[1].right) {\n return clientRects[cursorRectIndex] || boundingRect;\n }\n\n switch (currentBasePlacement) {\n case 'top':\n case 'bottom':\n {\n var firstRect = clientRects[0];\n var lastRect = clientRects[clientRects.length - 1];\n var isTop = currentBasePlacement === 'top';\n var top = firstRect.top;\n var bottom = lastRect.bottom;\n var left = isTop ? firstRect.left : lastRect.left;\n var right = isTop ? firstRect.right : lastRect.right;\n var width = right - left;\n var height = bottom - top;\n return {\n top: top,\n bottom: bottom,\n left: left,\n right: right,\n width: width,\n height: height\n };\n }\n\n case 'left':\n case 'right':\n {\n var minLeft = Math.min.apply(Math, clientRects.map(function (rects) {\n return rects.left;\n }));\n var maxRight = Math.max.apply(Math, clientRects.map(function (rects) {\n return rects.right;\n }));\n var measureRects = clientRects.filter(function (rect) {\n return currentBasePlacement === 'left' ? rect.left === minLeft : rect.right === maxRight;\n });\n var _top = measureRects[0].top;\n var _bottom = measureRects[measureRects.length - 1].bottom;\n var _left = minLeft;\n var _right = maxRight;\n\n var _width = _right - _left;\n\n var _height = _bottom - _top;\n\n return {\n top: _top,\n bottom: _bottom,\n left: _left,\n right: _right,\n width: _width,\n height: _height\n };\n }\n\n default:\n {\n return boundingRect;\n }\n }\n}\n\nvar sticky = {\n name: 'sticky',\n defaultValue: false,\n fn: function fn(instance) {\n var reference = instance.reference,\n popper = instance.popper;\n\n function getReference() {\n return instance.popperInstance ? instance.popperInstance.state.elements.reference : reference;\n }\n\n function shouldCheck(value) {\n return instance.props.sticky === true || instance.props.sticky === value;\n }\n\n var prevRefRect = null;\n var prevPopRect = null;\n\n function updatePosition() {\n var currentRefRect = shouldCheck('reference') ? getReference().getBoundingClientRect() : null;\n var currentPopRect = shouldCheck('popper') ? popper.getBoundingClientRect() : null;\n\n if (currentRefRect && areRectsDifferent(prevRefRect, currentRefRect) || currentPopRect && areRectsDifferent(prevPopRect, currentPopRect)) {\n if (instance.popperInstance) {\n instance.popperInstance.update();\n }\n }\n\n prevRefRect = currentRefRect;\n prevPopRect = currentPopRect;\n\n if (instance.state.isMounted) {\n requestAnimationFrame(updatePosition);\n }\n }\n\n return {\n onMount: function onMount() {\n if (instance.props.sticky) {\n updatePosition();\n }\n }\n };\n }\n};\n\nfunction areRectsDifferent(rectA, rectB) {\n if (rectA && rectB) {\n return rectA.top !== rectB.top || rectA.right !== rectB.right || rectA.bottom !== rectB.bottom || rectA.left !== rectB.left;\n }\n\n return true;\n}\n\ntippy.setDefaultProps({\n render: render\n});\n\nexport default tippy;\nexport { animateFill, createSingleton, delegate, followCursor, hideAll, inlinePositioning, ROUND_ARROW as roundArrow, sticky };\n//# sourceMappingURL=tippy.esm.js.map\n","<script setup>\nimport { computed, ref } from 'vue';\n\nconst props = defineProps({\n users: {\n type: Array,\n required: true,\n },\n mention: {\n type: String,\n default: '',\n },\n inserMention: {\n type: Function,\n required: true,\n },\n});\n\nconst container = ref(null);\nconst activeUserIndex = ref(null);\n\nconst getFilteredUsers = computed(() => {\n // Remove the '@' symbol from the mention\n const mention = props.mention.slice(1)?.toLowerCase();\n const filtered = props.users.filter((user) => {\n const isViewer = user.role === 'viewer';\n const userMatch = user.name?.toLowerCase().startsWith(mention);\n const emailMatch = user.email?.toLowerCase().startsWith(mention);\n return !isViewer && (userMatch || emailMatch);\n }) || [];\n return filtered;\n});\n\nconst handleClick = (user) => {\n props.inserMention(user);\n};\n\nconst handleKeydown = (event) => {\n if (event.key === 'ArrowDown') {\n activeUserIndex.value += 1;\n if (activeUserIndex.value === getFilteredUsers.value.length) {\n activeUserIndex.value = 0;\n }\n } else if (event.key === 'ArrowUp') {\n activeUserIndex.value -= 1;\n if (activeUserIndex.value < 0) {\n activeUserIndex.value = getFilteredUsers.value.length - 1;\n }\n } else if (event.key === 'Enter') {\n const user = getFilteredUsers.value[activeUserIndex.value];\n if (user) {\n props.inserMention(user);\n }\n }\n};\n\nconst handleFocus = () => {\n activeUserIndex.value = 0;\n};\n</script>\n\n<template>\n <div\n class=\"mentions-container\"\n ref=\"container\"\n @keydown.prevent=\"handleKeydown\"\n @focus.stop.prevent=\"handleFocus\"\n tabindex=\"0\"\n >\n <div\n v-for=\"(user, index) in getFilteredUsers\"\n @click.stop.prevent=\"handleClick(user)\"\n @mouseenter=\"activeUserIndex = index\"\n @mouseleave=\"activeUserIndex = null\"\n :key=\"user.email\"\n class=\"user-row\"\n :class=\"{ selected: activeUserIndex === index }\"\n >\n <div v-if=\"user.name\">\n <span v-if=\"user.name\">{{ user.name }}</span>\n <span v-if=\"user.name && user.email\"> ({{ user.email }})</span>\n </div>\n <div v-else>\n <span>{{ user.email }}</span>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.selected {\n background-color: #dbdbdb;\n}\n.mentions-container {\n outline: none !important;\n border: none;\n max-height: 300px;\n overflow-y: auto;\n}\n.mentions-container:focus {\n border: none;\n outline: none !important;\n}\n.user-row {\n padding: 10px 15px;\n cursor: pointer;\n transition: all 0.2s ease;\n box-sizing: border-box;\n}\n</style>\n","import { createApp } from 'vue';\nimport { Plugin, PluginKey, TextSelection } from 'prosemirror-state';\nimport { Extension } from '@core/Extension.js';\nimport tippy from 'tippy.js';\n\nimport Mentions from '@/components/popovers/Mentions.vue';\n\nconst popoverPluginKey = new PluginKey('popoverPlugin');\nexport const PopoverPlugin = Extension.create({\n name: 'popoverPlugin',\n\n addPmPlugins() {\n const popover = new Plugin({\n key: popoverPluginKey,\n state: {\n init: () => {\n return {};\n },\n apply: (tr, value, oldState, state) => {\n let newValue = { ...value };\n\n if (tr.docChanged) {\n newValue.shouldUpdate = true;\n } else {\n newValue.shouldUpdate = false;\n }\n return newValue;\n },\n },\n view: (view) => {\n const popover = new Popover(view, this.editor);\n return {\n update: (view, lastState) => {\n const pluginState = popoverPluginKey.getState(view.state);\n if (!pluginState.shouldUpdate) return;\n popover.update(view, lastState);\n },\n destroy: () => {\n popover.destroy();\n },\n };\n },\n });\n return [popover];\n },\n});\n\nclass Popover {\n constructor(view, editor) {\n this.editor = editor;\n this.view = view;\n this.popover = document.createElement('div');\n this.popover.className = 'popover';\n document.body.appendChild(this.popover);\n\n this.tippyInstance = tippy(this.popover, {\n trigger: 'manual',\n placement: 'bottom-start',\n interactive: true,\n appendTo: document.body,\n arrow: false,\n onShow: (instance) => {\n instance.setProps({ getReferenceClientRect: () => this.popoverRect });\n this.bindKeyDownEvents();\n },\n onHide: () => {\n this.unbindKeyDownEvents();\n },\n theme: 'popover',\n });\n }\n\n bindKeyDownEvents() {\n this.view.dom.addEventListener('keydown', this.handleKeyDown);\n }\n\n unbindKeyDownEvents() {\n this.view.dom.removeEventListener('keydown', this.handleKeyDown);\n }\n\n handleKeyDown = (event) => {\n const isArrow = event.key === 'ArrowDown' || event.key === 'ArrowUp';\n if (this.tippyInstance.state.isVisible && isArrow) {\n event.preventDefault();\n this.popover.firstChild.focus();\n }\n };\n\n mountVueComponent(component, props = {}) {\n if (this.app) this.app.unmount();\n this.app = createApp(component, props);\n this.app.mount(this.popover);\n this.tippyInstance.setContent(this.popover);\n }\n\n update(view, lastState) {\n this.state = view.state;\n const showPopover = this.isShowMentions;\n\n let popoverContent = { component: null, props: null };\n if (this.isShowMentions) {\n const { from } = this.state.selection;\n const atMention = this.getMentionText(from);\n popoverContent = {\n component: Mentions,\n props: {\n users: this.editor.users,\n mention: atMention,\n inserMention: (user) => {\n const { $from } = this.state.selection;\n const length = atMention.length;\n const attributes = { ...user };\n const mentionNode = this.editor.schema.nodes.mention.create(attributes);\n const tr = this.state.tr.replaceWith($from.pos - length, $from.pos, mentionNode);\n this.editor.view.dispatch(tr);\n this.editor.view.focus();\n },\n },\n };\n }\n\n if (showPopover && popoverContent.component) {\n const { to } = this.state.selection;\n const { component, props } = popoverContent;\n this.mountVueComponent(component, props);\n this.showPopoverAtPosition(to);\n } else this.tippyInstance.hide();\n }\n\n showPopoverAtPosition(pos) {\n const end = this.view.coordsAtPos(pos);\n this.popoverRect = {\n width: 0,\n height: 0,\n top: end.bottom,\n left: end.left,\n bottom: end.bottom,\n right: end.left,\n };\n\n this.tippyInstance.show();\n }\n\n getMentionText(from) {\n const maxLookBehind = 20;\n const startPos = Math.max(0, from - maxLookBehind);\n const textBefore = this.state.doc.textBetween(startPos, from, '\\n', '\\0');\n\n // Return only the text after the last @\n const atIndex = textBefore.lastIndexOf('@');\n if (atIndex !== -1) return textBefore.substring(atIndex);\n\n return '';\n }\n\n get isShowMentions() {\n const { from } = this.state.selection;\n\n // Ensure we're not out of bounds\n if (from < 1) return false;\n\n const textBefore = this.getMentionText(from);\n\n // Use regex to match \"@\" followed by word characters and no space\n const mentionPattern = /(?:^|\\s)@[\\w]*$/;\n const match = textBefore.match(mentionPattern);\n\n return match && this.state.selection.empty;\n }\n\n destroy() {\n this.tippyInstance.destroy();\n this.popover.remove();\n }\n}\n","import { Plugin, EditorState } from 'prosemirror-state';\nimport { EditorView } from \"prosemirror-view\";\nimport { Extension } from '@core/Extension.js';\nimport { Decoration, DecorationSet } from 'prosemirror-view';\nimport { PaginationPluginKey } from './pagination-helpers.js';\nimport { CollaborationPluginKey } from '@extensions/collaboration/collaboration.js';\nimport { ImagePlaceholderPluginKey } from '@extensions/image/imageHelpers/imagePlaceholderPlugin.js';\nimport { LinkedStylesPluginKey } from '@extensions/linked-styles/linked-styles.js';\nimport { findParentNodeClosestToPos } from '@core/helpers/findParentNodeClosestToPos.js';\n\nconst isDebugging = false;\n\nexport const Pagination = Extension.create({\n name: 'pagination',\n\n addStorage() {\n return {\n height: 0,\n sectionData: null,\n };\n },\n\n addCommands() {\n return {\n insertPageBreak: () => ({ commands }) => {\n return commands.insertContent({\n type: 'hardBreak',\n });\n }\n }\n },\n\n addShortcuts() {\n return {\n 'Mod-Enter': () => this.editor.commands.insertPageBreak(),\n };\n },\n\n /**\n * The pagination plugin is responsible for calculating page breaks, and redering them using decorations.\n */\n addPmPlugins() {\n const editor = this.editor;\n let isUpdating = false;\n\n // Used to prevent unnecessary transactions\n let shouldUpdate = false;\n\n // Track wether the first load has occured or not\n let hasInitialized = false;\n let shouldInitialize = false;\n\n const paginationPlugin = new Plugin({\n key: PaginationPluginKey,\n state: {\n isReadyToInit: false,\n init(_, state) {\n return {\n isReadyToInit: false,\n decorations: DecorationSet.empty,\n isDebugging,\n }\n },\n apply(tr, oldState, prevEditorState, newEditorState) {\n // Check for new decorations passed via metadata\n\n const meta = tr.getMeta(PaginationPluginKey);\n if (meta && meta.isReadyToInit) {\n if (isDebugging) console.debug('✅ INIT READY')\n shouldUpdate = true;\n shouldInitialize = meta.isReadyToInit;\n };\n\n // We need special handling for images / the image placeholder plugin\n const imagePluginTransaction = tr.getMeta(ImagePlaceholderPluginKey);\n if (imagePluginTransaction) {\n if (imagePluginTransaction.type === 'remove') {\n const imagePos = imagePluginTransaction.pos;\n const domImage = editor.view.domAtPos(imagePos).node.querySelector(\"img\");\n if (domImage.complete) onImageLoad(editor);\n else domImage.onload = () => onImageLoad(editor);\n };\n return { ...oldState }\n };\n\n const isAnnotationUpdate = tr.getMeta('fieldAnnotationUpdate');\n if (isAnnotationUpdate) {\n return { ...oldState }\n }\n\n if (!shouldInitialize && !oldState.isReadyToInit) {\n if (isDebugging) console.debug('🚫 NO INIT')\n return { ...oldState }\n }\n\n if (meta && meta.decorations) {\n shouldUpdate = true;\n if (isDebugging) console.debug('🦋 RETURN META DECORATIONS')\n return {\n ...oldState,\n decorations: meta.decorations.map(tr.mapping, newEditorState.doc),\n }\n };\n\n const isForceUpdate = tr.getMeta('forceUpdatePagination');\n\n // If the document hasn't changed, and we've already initialized, don't update\n if (!isForceUpdate && prevEditorState.doc.eq(newEditorState.doc) && hasInitialized) {\n if (isDebugging) console.debug('🚫 NO UPDATE')\n shouldUpdate = false;\n return { ...oldState };\n }\n\n // content size\n shouldUpdate = true;\n if (isDebugging) console.debug('🚀 UPDATE DECORATIONS')\n if (isForceUpdate) shouldUpdate = true;\n\n return {\n ...oldState,\n isReadyToInit: shouldInitialize,\n };\n },\n },\n\n /* The view method is the most important part of the plugin */\n view: (view) => {\n let previousDecorations = DecorationSet.empty;\n\n return {\n update: (view) => {\n if (!shouldUpdate || isUpdating) return;\n\n isUpdating = true;\n hasInitialized = true;\n\n /**\n * Perform the actual update here.\n * We call calculatePageBreaks which actually generates the decorations\n */\n if (isDebugging) console.debug('--- Calling performUpdate ---')\n performUpdate(editor, view, previousDecorations);\n isUpdating = false;\n shouldUpdate = false;\n },\n };\n },\n props: {\n decorations(state) {\n return PaginationPluginKey.getState(state).decorations;\n },\n },\n });\n\n return [paginationPlugin];\n },\n});\n\n\n/**\n * Calculate page breaks and update the editor state with the new decorations\n * @param {Editor} editor The editor instance\n * @param {EditorView} view The editor view\n * @param {DecorationSet} previousDecorations The previous set of decorations\n * @returns {void}\n */\nconst performUpdate = (editor, view, previousDecorations) => {\n const sectionData = editor.storage.pagination.sectionData;\n const newDecorations = calculatePageBreaks(view, editor, sectionData);\n\n // Skip updating if decorations haven't changed\n if (!previousDecorations.eq(newDecorations)) {\n const updateTransaction = view.state.tr.setMeta(\n PaginationPluginKey,\n { decorations: newDecorations }\n );\n view.dispatch(updateTransaction);\n };\n\n // Emit that pagination has been updated\n editor.emit('paginationUpdate');\n};\n\n/**\n * Generate page breaks. This prepares the initial sizing, as well as appending the initial header and final footer\n * Then, call generateInternalPageBreaks to calculate the inner page breaks\n * @param {EditorView} view The editor view\n * @param {Editor} editor The editor instance\n * @param {Object} sectionData The section data from the converter\n * @returns {DecorationSet} A set of decorations to be applied to the editor\n */\nconst calculatePageBreaks = (view, editor, sectionData) => {\n // If we don't have a converter, return an empty decoration set\n // Since we won't be able to calculate page breaks without a converter\n if (!editor.converter) return DecorationSet.empty;\n\n const pageSize = editor.converter.pageStyles?.pageSize;\n const { width, height } = pageSize; // Page width and height are in inches\n\n // We can't calculate page breaks without a page width and height\n // Under normal docx operation, these are always set\n if (!width || !height) return DecorationSet.empty;\n\n const ignorePlugins = [CollaborationPluginKey, PaginationPluginKey];\n const { state } = view;\n const cleanState = EditorState.create({\n schema: state.schema,\n doc: state.doc,\n plugins: state.plugins.filter((plugin) => ignorePlugins.includes(plugin.key)),\n });\n\n // Create a temporary container with a clean doc to recalculate page breaks\n const tempContainer = editor.options.element.cloneNode();\n if (!tempContainer) return [];\n\n tempContainer.className = 'temp-container super-editor';\n const HIDDEN_EDITOR_OFFSET_TOP = 0;\n const HIDDEN_EDITOR_OFFSET_LEFT = 0;\n tempContainer.style.left = HIDDEN_EDITOR_OFFSET_TOP + 'px';\n tempContainer.style.top = HIDDEN_EDITOR_OFFSET_LEFT + 'px';\n tempContainer.style.position = 'fixed';\n tempContainer.style.visibility = 'hidden';\n\n document.body.appendChild(tempContainer);\n const tempView = new EditorView(tempContainer, {\n state: cleanState,\n dispatchTransaction: () => {},\n });\n\n // Generate decorations on a clean doc\n editor.initDefaultStyles(tempContainer);\n const decorations = generateInternalPageBreaks(cleanState.doc, tempView, editor, sectionData);\n\n // Clean up\n tempView.destroy();\n document.body.removeChild(tempContainer);\n\n // Return a list of page break decorations\n return DecorationSet.create(view.state.doc, decorations)\n};\n\n\n/**\n * Generate internal page breaks by iterating through the document, keeping track of the height.\n * If we find a node that extends past where our page should end, we add a page break.\n * @param {Node} doc The document node\n * @param {EditorView} view The editor view\n * @param {Editor} editor The editor instance\n * @param {Array} decorations The current set of decorations\n * @param {Object} sectionData The section data from the converter\n * @returns {void} The decorations array is altered in place\n */\nfunction generateInternalPageBreaks(doc, view, editor, sectionData) {\n const decorations = [];\n const { pageSize, pageMargins } = editor.converter.pageStyles;\n const pageHeight = pageSize.height * 96; // Convert inches to pixels\n const scale = editor.options.scale;\n\n let currentPageNumber = 1;\n let pageHeightThreshold = pageHeight;\n let hardBreakOffsets = 0;\n let footer = null, header = null;\n const { headerIds, footerIds } = editor.converter;\n\n let firstHeaderId = headerIds.first || headerIds.even || headerIds.default || 'default';\n if (headerIds.titlePg) firstHeaderId = null;\n const firstHeader = createHeader(pageMargins, pageSize, sectionData, firstHeaderId);\n const pageBreak = createPageBreak({ editor, header: firstHeader, isFirstHeader: true });\n decorations.push(Decoration.widget(0, pageBreak, { key: 'stable-key' }));\n\n const lastFooterId = footerIds.last || footerIds.default || 'default';\n const lastFooter = createFooter(pageMargins, pageSize, sectionData, lastFooterId);\n const footerBreak = createPageBreak({ editor, footer: lastFooter, isLastFooter: true });\n\n // Reduce the usable page height by the header and footer heights now that they are prepped\n pageHeightThreshold -= firstHeader.headerHeight + lastFooter.footerHeight;\n\n let coords = view?.coordsAtPos(doc.content.size);\n if (!coords) return [];\n\n /**\n * Iterate through the document, checking for hard page breaks and calculating the page height.\n * If we find a node that extends past where our page should end, we add a page break.\n */\n doc.descendants((node, pos) => {\n let currentNode = node;\n let currentPos = pos;\n \n coords = view?.coordsAtPos(currentPos);\n if (!coords) return;\n \n let shouldAddPageBreak = coords.bottom > pageHeightThreshold;\n const isHardBreakNode = currentNode.type.name === 'hardBreak';\n\n if (currentNode.type.name === 'paragraph' && currentNode.attrs.styleId) {\n const linkedStyles = LinkedStylesPluginKey.getState(editor.state)?.styles;\n const style = linkedStyles?.find((style) => style.id === currentNode.attrs.styleId);\n if (style) {\n const { definition = {} } = style;\n const { pageBreakBefore, pageBreakAfter } = definition.attrs || {};\n if (pageBreakBefore || pageBreakAfter) shouldAddPageBreak = true;\n }\n };\n\n if (isHardBreakNode || shouldAddPageBreak) {\n const $currentPos = view.state.doc.resolve(currentPos);\n const tableRow = findParentNodeClosestToPos($currentPos, (node) => node.type.name === 'tableRow');\n\n if (tableRow) {\n // If the node is in a table cell, then split the entire row.\n currentNode = tableRow.node;\n currentPos = tableRow.pos;\n }\n\n // The node we've found extends past our threshold\n // We need to zoom in and investigate position by position until we find the exact break point\n // And we get the actual top and bottom of the break\n const {\n top: actualBreakTop,\n bottom: actualBreakBottom,\n pos: breakPos,\n } = getActualBreakCoords(view, currentPos, pageHeightThreshold);\n\n if (isDebugging) {\n console.debug('----- [pagination page break] ----');\n console.debug('[pagination page break] Expected pageHeightThreshold:', pageHeightThreshold);\n console.debug('[pagination page break] Actual top:', actualBreakTop, 'Actual bottom:', actualBreakBottom);\n console.debug('[pagination page break] Pos:', currentPos, 'Break pos:', breakPos);\n console.debug('---- [pagination page break end] ---- \\n\\n\\n');\n };\n\n // Update the header and footer based on the current page number\n currentPageNumber++; \n const headerId = (currentPageNumber % 2 === 0 ? headerIds.even : headerIds.odd) || headerIds.default;\n const footerId = (currentPageNumber % 2 === 0 ? footerIds.even : footerIds.odd) || footerIds.default;\n header = createHeader(pageMargins, pageSize, sectionData, headerId);\n footer = createFooter(pageMargins, pageSize, sectionData, footerId);\n\n const bufferHeight = pageHeightThreshold - actualBreakBottom;\n const { node: spacingNode } = createFinalPagePadding(bufferHeight);\n const pageSpacer = Decoration.widget(breakPos, spacingNode, { key: 'stable-key' });\n decorations.push(pageSpacer);\n\n const pageBreak = createPageBreak({ editor, header, footer });\n decorations.push(Decoration.widget(breakPos, pageBreak, { key: 'stable-key' }));\n\n // Check if we have a hard page break node\n // If so, calculate and add spacer to push us into a next page\n if (isHardBreakNode) {\n hardBreakOffsets += pageHeight;\n }\n\n // Recalculate the page threshold based on where we actually inserted the break\n pageHeightThreshold = actualBreakBottom + (pageHeight - header.headerHeight - footer.footerHeight);\n };\n });\n\n // Add blank padding to the last page to make a full page height\n let finalPos = doc.content.size;\n const lastNodeCoords = view.coordsAtPos(finalPos);\n const headerId = (currentPageNumber % 2 === 0 ? headerIds.even : headerIds.odd) || headerIds.default;\n const footerId = (currentPageNumber % 2 === 0 ? footerIds.even : footerIds.odd) || footerIds.default;\n header = createHeader(pageMargins, pageSize, sectionData, headerId);\n footer = createFooter(pageMargins, pageSize, sectionData, footerId);\n const bufferHeight = pageHeightThreshold - lastNodeCoords.bottom;\n const { node: spacingNode } = createFinalPagePadding(bufferHeight);\n const pageSpacer = Decoration.widget(doc.content.size, spacingNode, { key: 'stable-key' });\n decorations.push(pageSpacer);\n\n // Add the final footer\n decorations.push(Decoration.widget(doc.content.size, footerBreak, { key: 'stable-key' }));\n\n // Return the widget decorations array\n return decorations;\n}\n\n/**\n * Create final page padding in order to extend the last page to the full height of the document\n * @param {Number} bufferHeight The padding to add to the final page in pixels\n * @returns {HTMLElement} The padding div\n */\nfunction createFinalPagePadding(bufferHeight) {\n const div = document.createElement('div');\n div.className = 'pagination-page-spacer';\n div.style.userSelect = 'none';\n div.style.pointerEvents = 'none';\n div.style.height = bufferHeight + 'px';\n\n if (isDebugging) div.style.backgroundColor = '#ff000033';\n return { nodeHeight: bufferHeight, node: div }\n};\n\n\n/**\n * Generate a header element\n * @param {Object} pageMargins The page margins from the converter\n * @param {Object} sectionData The section data from the converter\n * @param {string} headerId The footer id to use\n * @returns {Object} The header element and its height\n */\nfunction createHeader(pageMargins, pageSize, sectionData, headerId) {\n const headerDef = sectionData.headers?.[headerId];\n const minHeaderHeight = pageMargins.top * 96; // pageMargins are in inches\n const headerMargin = pageMargins.header * 96;\n\n // If the header content is larger than the available space, we need to add the 'header' margin\n const hasHeaderOffset = headerDef?.height > (minHeaderHeight - headerMargin);\n const headerOffset = hasHeaderOffset ? headerMargin : 0;\n const headerHeight = Math.max(headerDef?.height || 0, minHeaderHeight) + headerOffset;\n\n // Create the header element\n let sectionContainer = headerDef?.sectionContainer?.cloneNode(true);\n if (!sectionContainer) sectionContainer = document.createElement('div');\n\n sectionContainer.className = 'pagination-section-header'\n sectionContainer.style.paddingTop = headerMargin + 'px';\n sectionContainer.style.paddingLeft = pageMargins.left * 96 + 'px';\n sectionContainer.style.paddingRight = pageMargins.right * 96 + 'px';\n sectionContainer.style.height = headerHeight + 'px';\n sectionContainer.style.width = pageSize.width * 96 + 'px';\n\n if (isDebugging) sectionContainer.style.backgroundColor = '#00ff00';\n return {\n section: sectionContainer,\n headerHeight: headerHeight,\n };\n};\n\n\n/**\n * Generate a footer element\n * @param {Object} pageMargins The page margins from the converter\n * @param {Object} sectionData The section data from the converter\n * @param {string} footerId The footer id to use\n * @returns {Object} The footer element and its height\n */\nfunction createFooter(pageMargins, pageSize, sectionData, footerId) {\n const footerDef = sectionData.footers?.[footerId];\n const minFooterHeight = pageMargins.bottom * 96; // pageMargins are in inches\n const footerPaddingFromEdge = pageMargins.footer * 96;\n const footerHeight = Math.max(footerDef?.height || 0, minFooterHeight) - footerPaddingFromEdge;\n let sectionContainer = footerDef?.sectionContainer?.cloneNode(true);\n if (!sectionContainer) sectionContainer = document.createElement('div');\n sectionContainer.className = 'pagination-section-footer';\n sectionContainer.style.height = footerHeight + 'px';\n sectionContainer.style.marginBottom = footerPaddingFromEdge + 'px';\n sectionContainer.style.paddingLeft = pageMargins.left * 96 + 'px';\n sectionContainer.style.paddingRight = pageMargins.right * 96 + 'px';\n sectionContainer.style.width = pageSize.width * 96 + 'px';\n if (isDebugging) sectionContainer.style.backgroundColor = '#00aaaa55';\n\n return {\n section: sectionContainer,\n footerHeight: footerHeight + footerPaddingFromEdge,\n }\n}\n\n\n/**\n * Combine header and footer into a page break element\n * @param {Object} param0 \n * @param {Editor} param0.editor The editor instance\n * @param {HTMLElement} param0.header The header element\n * @param {HTMLElement} param0.footer The footer element\n * @returns {HTMLElement} The page break element\n */\nfunction createPageBreak({ editor, header, footer, footerBottom = null, isFirstHeader, isLastFooter }) {\n const { pageSize, pageMargins } = editor.converter.pageStyles;\n\n let sectionHeight = 0;\n const paginationDiv = document.createElement('div');\n paginationDiv.className = 'pagination-break-wrapper'\n\n const innerDiv = document.createElement('div');\n innerDiv.className = 'pagination-inner';\n innerDiv.style.width = pageSize.width * 96 - 1 + 'px';\n\n if (isFirstHeader) innerDiv.style.borderRadius = '8px 8px 0 0';\n else if (isLastFooter) innerDiv.style.borderRadius = '0 0 8px 8px';\n paginationDiv.appendChild(innerDiv);\n\n if (footer) {\n innerDiv.appendChild(footer.section);\n sectionHeight += footer.footerHeight;\n };\n\n if (header && footer) {\n const separatorHeight = 20;\n sectionHeight += separatorHeight;\n const separator = document.createElement('div');\n separator.className = 'pagination-separator';\n if (isDebugging) separator.style.backgroundColor = 'green';\n\n innerDiv.appendChild(separator);\n };\n\n if (header) {\n innerDiv.appendChild(header.section);\n sectionHeight += header.headerHeight;\n };\n\n paginationDiv.style.height = sectionHeight + 'px';\n paginationDiv.style.minHeight = sectionHeight + 'px';\n paginationDiv.style.maxHeight = sectionHeight + 'px';\n innerDiv.style.height = sectionHeight + 'px';\n paginationDiv.style.width = 100 + 'px';\n paginationDiv.style.marginLeft = pageMargins.left * -96 + 'px';\n\n if (isDebugging) {\n innerDiv.style.backgroundColor = '#0000ff33';\n paginationDiv.style.backgroundColor = '#00ff0099';\n }\n\n if (footerBottom !== null) {\n paginationDiv.style.position = 'absolute';\n paginationDiv.style.bottom = footerBottom + 'px';\n }\n\n return paginationDiv;\n};\n\n/**\n * Get the actual break coordinates for a page split based on the approximate position (pos)\n * and the calculated threshold (which accounts for 'scale')\n * \n * Since we know the node at pos extends past the threshold, we iterate\n * backwards through all positions from there to find the exact break point\n * @param {EditorView} view The current editor view\n * @param {Number} pos The position of the outermost node that exceeds threshold\n * @param {Number} calculatedThreshold The page threshold accounting for scale\n * @returns {Object} Object containing the actual top, bottom, and position of the break\n */\nfunction getActualBreakCoords(view, pos, calculatedThreshold) {\n let currentPos = pos - 1;\n const actualBreak = { top: 0, bottom: 0, pos: 0 };\n while (currentPos > 0) {\n const { top, bottom } = view.coordsAtPos(currentPos);\n if (bottom < calculatedThreshold) {\n Object.assign(actualBreak, { top, bottom, pos: currentPos + 1 });\n break;\n }\n\n currentPos--;\n };\n\n return actualBreak;\n};\n\n/**\n * Special handling for images in pagination. Trigger a pagination update transaction after an image loads.\n * @param {Editor} editor The editor instance\n * @returns {void}\n */\nconst onImageLoad = (editor) => {\n requestAnimationFrame(() => {\n const newTr = editor.view.state.tr;\n newTr.setMeta('forceUpdatePagination', true);\n editor.view.dispatch(newTr);\n });\n};","// Extensions\nimport { History } from './history/index.js';\nimport { Color } from './color/index.js';\nimport { FontFamily } from './font-family/index.js';\nimport { FontSize } from './font-size/index.js';\nimport { TextAlign } from './text-align/index.js';\nimport { TextIndent } from './text-indent/index.js';\nimport { LineHeight } from './line-height/index.js';\nimport { FormatCommands } from './format-commands/index.js';\nimport { DropCursor } from './dropcursor/index.js';\nimport { Gapcursor } from './gapcursor/index.js';\nimport { Collaboration } from './collaboration/index.js';\nimport { CollaborationCursor } from './collaboration-cursor/index.js';\n\n// Nodes extensions\nimport { Document } from './document/index.js';\nimport { Text } from './text/index.js';\nimport { RunItem } from './run-item/index.js';\nimport { BulletList } from './bullet-list/index.js';\nimport { OrderedList } from './ordered-list/index.js';\nimport { ListItem } from './list-item/index.js';\nimport { Paragraph } from './paragraph/index.js';\nimport { Heading } from './heading/index.js';\nimport { CommentRangeStart, CommentRangeEnd, CommentReference } from './comment/index.js';\nimport { TabNode } from './tab/index.js';\nimport { LineBreak, HardBreak } from './line-break/index.js';\nimport { Table } from './table/index.js';\nimport { TableHeader } from './table-header/index.js';\nimport { TableRow } from './table-row/index.js';\nimport { TableCell } from './table-cell/index.js';\nimport { FieldAnnotation, fieldAnnotationHelpers } from './field-annotation/index.js';\nimport { Image } from './image/index.js';\nimport { BookmarkStart } from './bookmarks/index.js';\nimport { Mention } from './mention/index.js';\n\n// Marks extensions\nimport { TextStyle } from './text-style/text-style.js';\nimport { Bold } from './bold/index.js';\nimport { Italic } from './italic/index.js';\nimport { Underline } from './underline/index.js';\nimport { Highlight } from './highlight/index.js';\nimport { Strike } from './strike/index.js';\nimport { Link } from './link/index.js';\nimport { TrackInsert, TrackDelete, TrackFormat } from './track-changes/index.js';\nimport { CommentsMark } from './comment/index.js';\n\n// Plugins\nimport { CommentsPlugin } from './comment/index.js';\nimport { Placeholder } from './placeholder/index.js';\nimport { PopoverPlugin } from './popover-plugin/index.js';\nimport { TrackChanges } from \"./track-changes/index.js\";\nimport { Pagination } from \"./pagination/index.js\";\nimport { LinkedStyles } from './linked-styles/linked-styles.js';\n\n// Helpers\nimport { trackChangesHelpers } from './track-changes/index.js';\n\nconst getRichTextExtensions = () => [\n Bold,\n Color,\n Document,\n History,\n Italic,\n Link,\n Paragraph,\n Strike,\n Text,\n TextStyle,\n Underline,\n Placeholder,\n PopoverPlugin,\n Mention,\n Highlight,\n];\n\nconst getStarterExtensions = () => {\n return [\n Bold,\n BulletList,\n Color,\n CommentRangeStart,\n CommentRangeEnd,\n CommentReference,\n Document,\n FontFamily,\n FontSize,\n // History,\n Heading,\n Italic,\n ListItem,\n LineHeight,\n Link,\n OrderedList,\n Paragraph,\n LineBreak,\n HardBreak,\n RunItem,\n Strike,\n TabNode,\n Text,\n TextAlign,\n TextIndent,\n TextStyle,\n Underline,\n FormatCommands,\n CommentsPlugin,\n Gapcursor,\n Table,\n TableRow,\n TableCell,\n TableHeader,\n FieldAnnotation,\n DropCursor,\n Image,\n BookmarkStart,\n Mention,\n Collaboration,\n CollaborationCursor,\n TrackChanges,\n TrackInsert,\n TrackDelete,\n TrackFormat,\n CommentsMark,\n Pagination,\n Highlight,\n LinkedStyles,\n ];\n};\n\nexport {\n // History,\n Heading,\n Document,\n Text,\n RunItem,\n BulletList,\n OrderedList,\n ListItem,\n Paragraph,\n CommentRangeStart,\n CommentRangeEnd,\n CommentReference,\n TabNode,\n LineBreak,\n HardBreak,\n Bold,\n Italic,\n Underline,\n Highlight,\n Strike,\n Color,\n FontFamily,\n FontSize,\n TextAlign,\n TextIndent,\n TextStyle,\n LineHeight,\n FormatCommands,\n CommentsPlugin,\n Gapcursor,\n Table,\n TableRow,\n TableCell,\n TableHeader,\n Placeholder,\n DropCursor,\n FieldAnnotation,\n fieldAnnotationHelpers,\n Image,\n BookmarkStart,\n PopoverPlugin,\n Mention,\n Collaboration,\n CollaborationCursor,\n TrackChanges,\n TrackInsert,\n TrackDelete,\n TrackFormat,\n CommentsMark,\n trackChangesHelpers,\n getStarterExtensions,\n getRichTextExtensions,\n};\n"],"names":["from","empty","doc","start","end","RopeSequence","Leaf","flatten","Append","left","right","appendInner","map","history","redo","command","undo","originalUndo","originalRedo","index","offset","ie","mac","top","first","i","base","self","spec","Mark","preMatch","min","max","computed","nextNode","slice","DOMParser","dom","event","handlers","handleTripleClick","sel","isNode","r","oldOffset","read","anchor","tr","compare","prop","create","math.floor","process","isBrowser","map.create","string.fromCamelCase","conditions.undefinedToNull","storage.varStorage","f.isOneOf","timeout","set.create","random.oneOf","eventloop.timeout","environment.isBrowser","dom.doc","PModel.Slice","PModel.Fragment","math.min","math.max","error.unexpectedCase","error.methodUnimplemented","keys","object.keys","setMeta","map.setIfUndefined","getSelection","Item","Text","undoManager","fn","shift","value","node","PmSchema","onCreate","onDestroy","commands","deleteSelection","joinBackward","replaceStep","selectNodeBackward","joinForward","selectNodeForward","joinUp","joinDown","newlineInCode","defaultBlockAt","exitCode","createParagraphNear","liftEmptyBlock","splitBlock","selectAll","selectTextblockStart","selectTextblockEnd","originalLiftEmptyBlock","originalCreateParagraphNear","originalNewlineInCode","originalExitCode","range","isActive","originalSelectAll","originalDeleteSelection","contains","originalJoinUp","originalJoinDown","originalJoinBackward","originalJoinForward","originalSelectNodeBackward","originalSelectNodeForward","originalSelectTextblockStart","originalSelectTextblockEnd","Schema","wrapInList","liftListItem","sinkListItem","originalWrapInList","result","ensureMarks","nextType","originalSinkListItem","originalLiftListItem","mark","uuidv4","findChildren","bottom","isInTable","deletionMark","SuperEditor","marks","params","div","unit","rect","handleKeyDown","arrow","firstList","orderedListMarkerPlugin","orderedListSyncPlugin","attrs","styledListMarkerPlugin","parentNode","k","blockParent","col","normalize","NodeSelection2","PluginKey2","Fragment2","TextSelection2","Slice2","Slice3","Fragment3","start2","Selection2","Fragment4","TextSelection3","PluginKey3","DecorationSet2","Decoration2","Plugin2","annotationClass","hash","isElement","name","effect","style","getBasePlacement","clientRect","getComputedStyle","window","mathMax","mathMin","toPaddingObject","popperOffsets","popper","clippingParents","reference","allPlacements","placements","placement","_loop","_i","checks","modifiers","debounce","merged","defaultModifiers","createPopper","options","state","noopFn","computeStyles","applyStyles","flip","preventOverflow","hide","TIPPY_DEFAULT_APPEND_TO","setDefaultProps","pluginProps","innerHTML","box","content","setContent","id","onTrigger","instance","onFirstUpdate","handleClick","popover","view","headerId","footerId","bufferHeight","spacingNode","pageSpacer","pageBreak"],"mappings":"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","x_google_ignoreList":[3,4,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,33,50,85,137,139,166,184,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257]}