{"version":3,"sources":["webpack:///./node_modules/tiptap-utils/dist/utils.esm.js","webpack:///./node_modules/tiptap-commands/dist/commands.esm.js","webpack:///./node_modules/tiptap/dist/tiptap.esm.js","webpack:///./node_modules/tiptap-extensions/dist/extensions.esm.js"],"names":["createCell","cellType","cellContent","createChecked","createAndFill","getTableNodeTypes","schema","cached","tableNodeTypes","roles","Object","keys","nodes","forEach","type","nodeType","spec","tableRole","createTable","rowsCount","colsCount","withHeaderRow","types","headerCells","cells","index","cell","push","headerCell","header_cell","rows","row","table","equalNodeType","node","Array","isArray","indexOf","flatten","descend","arguments","length","undefined","Error","result","descendants","child","pos","findChildren","predicate","filter","findBlockNodes","isBlock","findParentNodeClosestToPos","$pos","i","depth","before","start","findParentNode","selection","$from","isNodeSelection","findSelectedNodeOfType","getMarkAttrs","state","from","to","marks","doc","nodesBetween","mark","find","markItem","name","attrs","getMarkRange","parent","childAfter","parentOffset","link","startIndex","startPos","offset","endIndex","endPos","nodeSize","isInSet","childCount","getNodeAttrs","reverse","nodeItem","markIsActive","empty","storedMarks","rangeHasMark","nodeEqualsType","includes","nodeIsActive","hasMarkup","insertText","text","dispatch","tr","getMarksBetween","end","map","markInputRule","regexp","markType","getAttrs","match","Function","m","markEnd","markStart","matchStart","matchEnd","textStart","lastIndexOf","textEnd","excludedMarks","item","excluded","delete","addMark","create","removeStoredMark","nodeInputRule","replaceWith","pasteRule","handler","fragment","isText","exec","cut","addToSet","copy","content","fromArray","props","transformPasted","slice","openStart","openEnd","markPasteRule","isLink","x","allowsMarkType","removeMark","range","replaceText","$to","canReplaceWith","canSplit","typesAfter","resolve","base","innerType","isolating","canReplace","validContent","cutByIndex","d","rest","after","replaceChild","indexAfter","baseType","splitToDefaultListItem","itemType","sameParent","grandParent","size","wrap","keepItem","append","replace","setSelection","constructor","near","scrollIntoView","nextType","contentMatchAt","defaultType","split","toggleBlockType","toggletype","view","isActive","isList","bullet_list","ordered_list","todo_list","toggleList","listType","blockRange","parentList","setNodeMarkup","toggleWrap","updateMark","ranges","ref$1","camelCase","str","word","toLowerCase","toUpperCase","ComponentView","component","editor","extension","decorations","getPos","this","isNode","isMark","getMarkPos","captureEvents","dom","createDOM","contentDOM","vm","$refs","Component","extend","selected","options","updateAttrs","update","propsData","$mount","$el","updateComponentProps","_props","originalSilent","config","silent","entries","key","value","editable","newAttrs","transaction","mutation","contains","target","event","stopEvent","draggable","dragHandle","closest","isValidDragHandle","document","addEventListener","once","isCopy","isPaste","isCut","isDrag","startsWith","posAtDOM","resolvedPos","$destroy","Emitter","fn","_callbacks","args","callbacks","callback","apply","cb","Extension","defaultOptions","ExtensionManager","extensions","bindEditor","init","reduce","Proxy","obj","prop","changed","assign","updateState","plugins","allPlugins","extensionKeymaps","nodeMarkKeymaps","excludedExtensions","allowedExtensions","extensionInputRules","inputRules","nodeMarkInputRules","allInputRules","extensionPasteRules","pasteRules","nodeMarkPasteRules","allPasteRules","commands","allCommands","focus","handle","_name","_value","commandName","commandValue","injectCSS","css","style","createElement","textContent","head","firstChild","insertBefore","appendChild","Mark","super","minMax","min","max","Math","parseInt","Node","Doc","Paragraph","group","parseDOM","tag","toDOM","Text","Editor","editorProps","autoFocus","topNode","emptyDocument","useBuiltInExtensions","disableInputRules","disablePasteRules","dropCursor","enableDropCursor","enableGapCursor","parseOptions","onInit","onTransaction","onUpdate","onFocus","onBlur","onPaste","onDrop","events","setOptions","focused","element","createExtensions","createNodes","createMarks","createSchema","createPlugins","keymaps","createKeymaps","createInputRules","createPasteRules","createView","createCommands","setActiveNodesAndMarks","on","emit","builtInExtensions","createDocument","rules","Backspace","attributes","tabindex","handleDOMEvents","setMeta","blur","nodeFromJSON","error","console","warn","htmlString","parser","window","DOMParser","parseFromString","body","firstElementChild","fromSchema","parse","createState","handlePaste","handleDrop","dispatchTransaction","bind","setProps","nodeViews","initNodeViews","nodeView","newState","getHTML","getJSON","docChanged","getMeta","emitUpdate","position","resolveSelection","setTimeout","resolvedFrom","resolvedEnd","JSON","stringify","div","serializeFragment","innerHTML","toJSON","replaceSelectionWith","setContent","activeMarks","activeMarkAttrs","activeNodes","plugin","handlePlugins","reconfigure","docView","destroy","EditorContent","default","watch","immediate","$nextTick","setParentComponent","Menu","preventHide","mousedownHandler","handleClick","capture","blurHandler","removeEventListener","off","MenuBar","editorView","EditorMenuBar","registerPlugin","$scopedSlots","textRange","createRange","setEnd","nodeValue","setStart","singleRect","object","bias","rects","getClientRects","getBoundingClientRect","coordsAtPos","domFromPos","side","rect","childNodes","top","bottom","left","right","Menu$1","keepInBounds","focusHandler","hide","lastState","composing","eq","offsetParent","box","el","round","width","sendUpdate","relatedTarget","parentNode","MenuBubble","EditorMenuBubble","Boolean","menu","$emit","unregisterPlugin","Blockquote","defining","BulletList","list_item","CodeBlock","code","preserveWhitespace","paragraph","HardBreak","inline","selectable","command","Heading","levels","level","items","RegExp","HorizontalRule","IMAGE_INPUT_REGEX","Image","src","alt","title","getAttribute","$cursor","insert","hasFiles","dataTransfer","files","images","file","test","preventDefault","coordinates","posAtCoords","clientX","clientY","image","reader","FileReader","onload","readerEvent","readAsDataURL","ListItem","Enter","Tab","OrderedList","order","hasAttribute","TableNodes","tableGroup","cellAttributes","background","backgroundColor","Table","resizable","anchor","addColumnBefore","addColumnAfter","deleteColumn","addRowBefore","addRowAfter","deleteRow","deleteTable","toggleCellMerge","mergeCells","splitCell","toggleHeaderColumn","toggleHeaderRow","toggleHeaderCell","setCellAttr","fixTables","TableHeader","table_header","TableCell","table_cell","TableRow","table_row","TodoList","priority","todo_item","Bold","fontWeight","Code","excludes","Italic","Link","openOnClick","href","inclusive","rel","url","HTMLAnchorElement","stopPropagation","open","Strike","Underline","History","newGroupDelay","keymap","undo","redo","undoDepth","redoDepth","Placeholder","emptyEditorClass","emptyNodeClass","emptyNodeText","showOnlyWhenEditable","showOnlyCurrent","editablePlugin","active","isEditorEmpty","hasAnchor","isNodeEmpty","classes","decoration","class","join"],"mappings":"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","file":"js/chunk-vendors~c3ab44c1.b9e01768.js","sourcesContent":["\n /*!\n * tiptap-utils v1.13.0\n * (c) 2021 überdosis GbR (limited liability)\n * @license MIT\n */\n \nimport { NodeSelection } from 'prosemirror-state';\n\nfunction createCell(cellType, cellContent) {\n if (cellContent) {\n return cellType.createChecked(null, cellContent);\n }\n\n return cellType.createAndFill();\n}\n\nfunction getTableNodeTypes(schema) {\n if (schema.cached.tableNodeTypes) {\n return schema.cached.tableNodeTypes;\n }\n\n const roles = {};\n Object.keys(schema.nodes).forEach(type => {\n const nodeType = schema.nodes[type];\n\n if (nodeType.spec.tableRole) {\n roles[nodeType.spec.tableRole] = nodeType;\n }\n }); // eslint-disable-next-line\n\n schema.cached.tableNodeTypes = roles;\n return roles;\n}\n\nfunction createTable(schema, rowsCount, colsCount, withHeaderRow, cellContent) {\n const types = getTableNodeTypes(schema);\n const headerCells = [];\n const cells = [];\n\n for (let index = 0; index < colsCount; index += 1) {\n const cell = createCell(types.cell, cellContent);\n\n if (cell) {\n cells.push(cell);\n }\n\n if (withHeaderRow) {\n const headerCell = createCell(types.header_cell, cellContent);\n\n if (headerCell) {\n headerCells.push(headerCell);\n }\n }\n }\n\n const rows = [];\n\n for (let index = 0; index < rowsCount; index += 1) {\n rows.push(types.row.createChecked(null, withHeaderRow && index === 0 ? headerCells : cells));\n }\n\n return types.table.createChecked(null, rows);\n}\n\nfunction equalNodeType(nodeType, node) {\n return Array.isArray(nodeType) && nodeType.indexOf(node.type) > -1 || node.type === nodeType;\n}\n\nfunction flatten(node) {\n // eslint-disable-next-line\n const descend = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!node) {\n throw new Error('Invalid \"node\" parameter');\n }\n\n const result = []; // eslint-disable-next-line\n\n node.descendants((child, pos) => {\n result.push({\n node: child,\n pos\n });\n\n if (!descend) {\n return false;\n }\n });\n return result;\n}\n\nfunction 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\n return flatten(node, descend).filter(child => predicate(child.node));\n}\n\nfunction findBlockNodes(node, descend) {\n return findChildren(node, child => child.isBlock, descend);\n}\n\n// eslint-disable-next-line\nfunction findParentNodeClosestToPos($pos, predicate) {\n for (let i = $pos.depth; i > 0; i -= 1) {\n const node = $pos.node(i);\n\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\nfunction findParentNode(predicate) {\n return selection => findParentNodeClosestToPos(selection.$from, predicate);\n}\n\nfunction isNodeSelection(selection) {\n return selection instanceof NodeSelection;\n}\n\nfunction findSelectedNodeOfType(nodeType) {\n // eslint-disable-next-line\n return function (selection) {\n if (isNodeSelection(selection)) {\n const {\n node\n } = selection;\n const {\n $from\n } = selection;\n\n if (equalNodeType(nodeType, node)) {\n return {\n node,\n pos: $from.pos,\n depth: $from.depth\n };\n }\n }\n };\n}\n\nfunction getMarkAttrs(state, type) {\n const {\n from,\n to\n } = state.selection;\n let marks = [];\n state.doc.nodesBetween(from, to, node => {\n marks = [...marks, ...node.marks];\n });\n const mark = marks.find(markItem => markItem.type.name === type.name);\n\n if (mark) {\n return mark.attrs;\n }\n\n return {};\n}\n\nfunction getMarkRange($pos = null, type = null) {\n if (!$pos || !type) {\n return false;\n }\n\n const start = $pos.parent.childAfter($pos.parentOffset);\n\n if (!start.node) {\n return false;\n }\n\n const link = start.node.marks.find(mark => mark.type === type);\n\n if (!link) {\n return false;\n }\n\n let startIndex = $pos.index();\n let startPos = $pos.start() + start.offset;\n let endIndex = startIndex + 1;\n let endPos = startPos + start.node.nodeSize;\n\n while (startIndex > 0 && link.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 && link.isInSet($pos.parent.child(endIndex).marks)) {\n endPos += $pos.parent.child(endIndex).nodeSize;\n endIndex += 1;\n }\n\n return {\n from: startPos,\n to: endPos\n };\n}\n\nfunction getNodeAttrs(state, type) {\n const {\n from,\n to\n } = state.selection;\n let nodes = [];\n state.doc.nodesBetween(from, to, node => {\n nodes = [...nodes, node];\n });\n const node = nodes.reverse().find(nodeItem => nodeItem.type.name === type.name);\n\n if (node) {\n return node.attrs;\n }\n\n return {};\n}\n\nfunction markIsActive(state, type) {\n const {\n from,\n $from,\n to,\n empty\n } = state.selection;\n\n if (empty) {\n return !!type.isInSet(state.storedMarks || $from.marks());\n }\n\n return !!state.doc.rangeHasMark(from, to, type);\n}\n\nfunction nodeEqualsType({\n types,\n node\n}) {\n return Array.isArray(types) && types.includes(node.type) || node.type === types;\n}\n\nfunction nodeIsActive(state, type, attrs = {}) {\n const predicate = node => node.type === type;\n\n const node = findSelectedNodeOfType(type)(state.selection) || findParentNode(predicate)(state.selection);\n\n if (!Object.keys(attrs).length || !node) {\n return !!node;\n }\n\n return node.node.hasMarkup(type, { ...node.node.attrs,\n ...attrs\n });\n}\n\nexport { createCell, createTable, equalNodeType, findBlockNodes, findChildren, findParentNode, findParentNodeClosestToPos, findSelectedNodeOfType, flatten, getMarkAttrs, getMarkRange, getNodeAttrs, getTableNodeTypes, isNodeSelection, markIsActive, nodeEqualsType, nodeIsActive };\n","\n /*!\n * tiptap-commands v1.17.0\n * (c) 2021 überdosis GbR (limited liability)\n * @license MIT\n */\n \nimport { setBlockType, lift, wrapIn } from 'prosemirror-commands';\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, setBlockType, splitBlock, splitBlockKeepMarks, toggleMark, wrapIn } from 'prosemirror-commands';\nimport { liftListItem, wrapInList } from 'prosemirror-schema-list';\nexport { addListNodes, liftListItem, sinkListItem, splitListItem, wrapInList } from 'prosemirror-schema-list';\nimport { InputRule } from 'prosemirror-inputrules';\nexport { textblockTypeInputRule, wrappingInputRule } from 'prosemirror-inputrules';\nimport { Plugin } from 'prosemirror-state';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { getMarkRange, nodeIsActive, findParentNode } from 'tiptap-utils';\n\nfunction insertText (text = '') {\n return (state, dispatch) => {\n const {\n $from\n } = state.selection;\n const {\n pos\n } = $from.pos;\n dispatch(state.tr.insertText(text, pos));\n return true;\n };\n}\n\nfunction getMarksBetween(start, end, state) {\n let marks = [];\n state.doc.nodesBetween(start, end, (node, pos) => {\n marks = [...marks, ...node.marks.map(mark => ({\n start: pos,\n end: pos + node.nodeSize,\n mark\n }))];\n });\n return marks;\n}\n\nfunction markInputRule (regexp, markType, getAttrs) {\n return new InputRule(regexp, (state, match, start, end) => {\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const {\n tr\n } = state;\n const m = match.length - 1;\n let markEnd = end;\n let markStart = start;\n\n if (match[m]) {\n const matchStart = start + match[0].indexOf(match[m - 1]);\n const matchEnd = matchStart + match[m - 1].length - 1;\n const textStart = matchStart + match[m - 1].lastIndexOf(match[m]);\n const textEnd = textStart + match[m].length;\n const excludedMarks = getMarksBetween(start, end, state).filter(item => {\n const {\n excluded\n } = item.mark.type;\n return excluded.find(type => type.name === markType.name);\n }).filter(item => item.end > matchStart);\n\n if (excludedMarks.length) {\n return false;\n }\n\n if (textEnd < matchEnd) {\n tr.delete(textEnd, matchEnd);\n }\n\n if (textStart > matchStart) {\n tr.delete(matchStart, textStart);\n }\n\n markStart = matchStart;\n markEnd = markStart + match[m].length;\n }\n\n tr.addMark(markStart, markEnd, markType.create(attrs));\n tr.removeStoredMark(markType);\n return tr;\n });\n}\n\nfunction nodeInputRule (regexp, type, getAttrs) {\n return new InputRule(regexp, (state, match, start, end) => {\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const {\n tr\n } = state;\n\n if (match[0]) {\n tr.replaceWith(start - 1, end, type.create(attrs));\n }\n\n return tr;\n });\n}\n\nfunction pasteRule (regexp, type, getAttrs) {\n const handler = fragment => {\n const nodes = [];\n fragment.forEach(child => {\n if (child.isText) {\n const {\n text\n } = child;\n let pos = 0;\n let match;\n\n do {\n match = regexp.exec(text);\n\n if (match) {\n const start = match.index;\n const end = start + match[0].length;\n const attrs = getAttrs instanceof Function ? getAttrs(match[0]) : getAttrs;\n\n if (start > 0) {\n nodes.push(child.cut(pos, start));\n }\n\n nodes.push(child.cut(start, end).mark(type.create(attrs).addToSet(child.marks)));\n pos = end;\n }\n } while (match);\n\n if (pos < text.length) {\n nodes.push(child.cut(pos));\n }\n } else {\n nodes.push(child.copy(handler(child.content)));\n }\n });\n return Fragment.fromArray(nodes);\n };\n\n return new Plugin({\n props: {\n transformPasted: slice => new Slice(handler(slice.content), slice.openStart, slice.openEnd)\n }\n });\n}\n\nfunction markPasteRule (regexp, type, getAttrs) {\n const handler = (fragment, parent) => {\n const nodes = [];\n fragment.forEach(child => {\n if (child.isText) {\n const {\n text,\n marks\n } = child;\n let pos = 0;\n let match;\n const isLink = !!marks.filter(x => x.type.name === 'link')[0]; // eslint-disable-next-line\n\n while (!isLink && (match = regexp.exec(text)) !== null) {\n if (parent && parent.type.allowsMarkType(type) && match[1]) {\n const start = match.index;\n const end = start + match[0].length;\n const textStart = start + match[0].indexOf(match[1]);\n const textEnd = textStart + match[1].length;\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs; // adding text before markdown to nodes\n\n if (start > 0) {\n nodes.push(child.cut(pos, start));\n } // adding the markdown part to nodes\n\n\n nodes.push(child.cut(textStart, textEnd).mark(type.create(attrs).addToSet(child.marks)));\n pos = end;\n }\n } // adding rest of text to nodes\n\n\n if (pos < text.length) {\n nodes.push(child.cut(pos));\n }\n } else {\n nodes.push(child.copy(handler(child.content, child)));\n }\n });\n return Fragment.fromArray(nodes);\n };\n\n return new Plugin({\n props: {\n transformPasted: slice => new Slice(handler(slice.content), slice.openStart, slice.openEnd)\n }\n });\n}\n\nfunction removeMark (type) {\n return (state, dispatch) => {\n const {\n tr,\n selection\n } = state;\n let {\n from,\n to\n } = selection;\n const {\n $from,\n empty\n } = selection;\n\n if (empty) {\n const range = getMarkRange($from, type);\n from = range.from;\n to = range.to;\n }\n\n tr.removeMark(from, to, type);\n return dispatch(tr);\n };\n}\n\nfunction replaceText (range = null, type, attrs = {}, fragment = Fragment.empty) {\n return (state, dispatch) => {\n const {\n $from,\n $to\n } = state.selection;\n const index = $from.index();\n const from = range ? range.from : $from.pos;\n const to = range ? range.to : $to.pos;\n\n if (!$from.parent.canReplaceWith(index, index, type)) {\n return false;\n }\n\n if (dispatch) {\n dispatch(state.tr.replaceWith(from, to, type.create(attrs, fragment)));\n }\n\n return true;\n };\n}\n\nfunction setInlineBlockType (type, attrs = {}) {\n return (state, dispatch) => {\n const {\n $from\n } = state.selection;\n const index = $from.index();\n\n if (!$from.parent.canReplaceWith(index, index, type)) {\n return false;\n }\n\n if (dispatch) {\n dispatch(state.tr.replaceSelectionWith(type.create(attrs)));\n }\n\n return true;\n };\n}\n\n// see https://github.com/ProseMirror/prosemirror-transform/blob/main/src/structure.js\n// Since this piece of code was \"borrowed\" from prosemirror, ESLint rules are ignored.\n\n/* eslint-disable max-len, no-plusplus, no-undef, eqeqeq */\n\nfunction canSplit(doc, pos, depth = 1, typesAfter) {\n const $pos = doc.resolve(pos);\n const base = $pos.depth - depth;\n const innerType = typesAfter && typesAfter[typesAfter.length - 1] || $pos.parent;\n if (base < 0 || $pos.parent.type.spec.isolating || !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) || !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount))) return false;\n\n for (let d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n const node = $pos.node(d);\n const index = $pos.index(d);\n if (node.type.spec.isolating) return false;\n let rest = node.content.cutByIndex(index, node.childCount);\n const after = typesAfter && typesAfter[i] || node;\n if (after != node) rest = rest.replaceChild(0, after.type.create(after.attrs));\n /* Change starts from here */\n // if (!node.canReplace(index + 1, node.childCount) || !after.type.validContent(rest))\n // return false\n\n if (!node.canReplace(index + 1, node.childCount)) return false;\n /* Change ends here */\n }\n\n const index = $pos.indexAfter(base);\n const baseType = typesAfter && typesAfter[0];\n return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type);\n} // this is a copy of splitListItem\n// see https://github.com/ProseMirror/prosemirror-schema-list/blob/main/src/schema-list.js\n\n\nfunction splitToDefaultListItem(itemType) {\n return function (state, dispatch) {\n const {\n $from,\n $to,\n node\n } = state.selection;\n if (node && node.isBlock || $from.depth < 2 || !$from.sameParent($to)) return false;\n const grandParent = $from.node(-1);\n if (grandParent.type != itemType) return false;\n\n if ($from.parent.content.size == 0) {\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 == 2 || $from.node(-3).type != itemType || $from.index(-2) != $from.node(-2).childCount - 1) return false;\n\n if (dispatch) {\n let wrap = Fragment.empty;\n const keepItem = $from.index(-1) > 0; // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n\n for (let d = $from.depth - (keepItem ? 1 : 2); d >= $from.depth - 3; d--) wrap = Fragment.from($from.node(d).copy(wrap)); // Add a second list item with an empty default start node\n\n\n wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n const tr = state.tr.replace($from.before(keepItem ? null : -1), $from.after(-3), new Slice(wrap, keepItem ? 3 : 2, 2));\n tr.setSelection(state.selection.constructor.near(tr.doc.resolve($from.pos + (keepItem ? 3 : 2))));\n dispatch(tr.scrollIntoView());\n }\n\n return true;\n }\n\n const nextType = $to.pos == $from.end() ? grandParent.contentMatchAt($from.indexAfter(-1)).defaultType : null;\n const tr = state.tr.delete($from.pos, $to.pos);\n /* Change starts from here */\n // let types = nextType && [null, {type: nextType}]\n\n let types = nextType && [{\n type: itemType\n }, {\n type: nextType\n }];\n if (!types) types = [{\n type: itemType\n }, null];\n /* Change ends here */\n\n if (!canSplit(tr.doc, $from.pos, 2, types)) return false;\n if (dispatch) dispatch(tr.split($from.pos, 2, types).scrollIntoView());\n return true;\n };\n}\n/* eslint-enable max-len, no-plusplus, no-undef, eqeqeq */\n\nfunction toggleBlockType (type, toggletype, attrs = {}) {\n return (state, dispatch, view) => {\n const isActive = nodeIsActive(state, type, attrs);\n\n if (isActive) {\n return setBlockType(toggletype)(state, dispatch, view);\n }\n\n return setBlockType(type, attrs)(state, dispatch, view);\n };\n}\n\nfunction isList(node, schema) {\n return node.type === schema.nodes.bullet_list || node.type === schema.nodes.ordered_list || node.type === schema.nodes.todo_list;\n}\n\nfunction toggleList(listType, itemType) {\n return (state, dispatch, view) => {\n const {\n schema,\n selection\n } = state;\n const {\n $from,\n $to\n } = selection;\n const range = $from.blockRange($to);\n\n if (!range) {\n return false;\n }\n\n const parentList = findParentNode(node => isList(node, schema))(selection);\n\n if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\n if (parentList.node.type === listType) {\n return liftListItem(itemType)(state, dispatch, view);\n }\n\n if (isList(parentList.node, schema) && listType.validContent(parentList.node.content)) {\n const {\n tr\n } = state;\n tr.setNodeMarkup(parentList.pos, listType);\n\n if (dispatch) {\n dispatch(tr);\n }\n\n return false;\n }\n }\n\n return wrapInList(listType)(state, dispatch, view);\n };\n}\n\nfunction toggleWrap (type, attrs = {}) {\n return (state, dispatch, view) => {\n const isActive = nodeIsActive(state, type, attrs);\n\n if (isActive) {\n return lift(state, dispatch);\n }\n\n return wrapIn(type, attrs)(state, dispatch, view);\n };\n}\n\nfunction updateMark (type, attrs) {\n return (state, dispatch) => {\n const {\n tr,\n selection,\n doc\n } = state;\n const {\n ranges,\n empty\n } = selection;\n\n if (empty) {\n const {\n from,\n to\n } = getMarkRange(selection.$from, type);\n\n if (doc.rangeHasMark(from, to, type)) {\n tr.removeMark(from, to, type);\n }\n\n tr.addMark(from, to, type.create(attrs));\n } else {\n ranges.forEach(ref$1 => {\n const {\n $to,\n $from\n } = ref$1;\n\n if (doc.rangeHasMark($from.pos, $to.pos, type)) {\n tr.removeMark($from.pos, $to.pos, type);\n }\n\n tr.addMark($from.pos, $to.pos, type.create(attrs));\n });\n }\n\n return dispatch(tr);\n };\n}\n\nexport { insertText, markInputRule, markPasteRule, nodeInputRule, pasteRule, removeMark, replaceText, setInlineBlockType, splitToDefaultListItem, toggleBlockType, toggleList, toggleWrap, updateMark };\n","\n /*!\n * tiptap v1.32.1\n * (c) 2021 überdosis GbR (limited liability)\n * @license MIT\n */\n \nimport { EditorState, Plugin, PluginKey, TextSelection } from 'prosemirror-state';\nexport { NodeSelection, Plugin, PluginKey, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { Schema, DOMParser, DOMSerializer } from 'prosemirror-model';\nimport { dropCursor } from 'prosemirror-dropcursor';\nimport { gapCursor } from 'prosemirror-gapcursor';\nimport { keymap } from 'prosemirror-keymap';\nimport { baseKeymap } from 'prosemirror-commands';\nimport { inputRules, undoInputRule } from 'prosemirror-inputrules';\nimport { getMarkRange, markIsActive, getMarkAttrs, nodeIsActive, getNodeAttrs } from 'tiptap-utils';\nimport Vue from 'vue';\nimport { setBlockType } from 'tiptap-commands';\n\nfunction camelCase (str) {\n return str.replace(/(?:^\\w|[A-Z]|\\b\\w)/g, (word, index) => index === 0 ? word.toLowerCase() : word.toUpperCase()).replace(/\\s+/g, '');\n}\n\nclass ComponentView {\n constructor(component, {\n editor,\n extension,\n parent,\n node,\n view,\n decorations,\n getPos\n }) {\n this.component = component;\n this.editor = editor;\n this.extension = extension;\n this.parent = parent;\n this.node = node;\n this.view = view;\n this.decorations = decorations;\n this.isNode = !!this.node.marks;\n this.isMark = !this.isNode;\n this.getPos = this.isMark ? this.getMarkPos : getPos;\n this.captureEvents = true;\n this.dom = this.createDOM();\n this.contentDOM = this.vm.$refs.content;\n }\n\n createDOM() {\n const Component = Vue.extend(this.component);\n const props = {\n editor: this.editor,\n node: this.node,\n view: this.view,\n getPos: () => this.getPos(),\n decorations: this.decorations,\n selected: false,\n options: this.extension.options,\n updateAttrs: attrs => this.updateAttrs(attrs)\n };\n\n if (typeof this.extension.setSelection === 'function') {\n this.setSelection = this.extension.setSelection;\n }\n\n if (typeof this.extension.update === 'function') {\n this.update = this.extension.update;\n }\n\n this.vm = new Component({\n parent: this.parent,\n propsData: props\n }).$mount();\n return this.vm.$el;\n }\n\n update(node, decorations) {\n if (node.type !== this.node.type) {\n return false;\n }\n\n if (node === this.node && this.decorations === decorations) {\n return true;\n }\n\n this.node = node;\n this.decorations = decorations;\n this.updateComponentProps({\n node,\n decorations\n });\n return true;\n }\n\n updateComponentProps(props) {\n if (!this.vm._props) {\n return;\n } // Update props in component\n // TODO: Avoid mutating a prop directly.\n // Maybe there is a better way to do this?\n\n\n const originalSilent = Vue.config.silent;\n Vue.config.silent = true;\n Object.entries(props).forEach(([key, value]) => {\n this.vm._props[key] = value;\n }); // this.vm._props.node = node\n // this.vm._props.decorations = decorations\n\n Vue.config.silent = originalSilent;\n }\n\n updateAttrs(attrs) {\n if (!this.view.editable) {\n return;\n }\n\n const {\n state\n } = this.view;\n const {\n type\n } = this.node;\n const pos = this.getPos();\n const newAttrs = { ...this.node.attrs,\n ...attrs\n };\n const transaction = this.isMark ? state.tr.removeMark(pos.from, pos.to, type).addMark(pos.from, pos.to, type.create(newAttrs)) : state.tr.setNodeMarkup(pos, null, newAttrs);\n this.view.dispatch(transaction);\n } // prevent a full re-render of the vue component on update\n // we'll handle prop updates in `update()`\n\n\n ignoreMutation(mutation) {\n // allow leaf nodes to be selected\n if (mutation.type === 'selection') {\n return false;\n }\n\n if (!this.contentDOM) {\n return true;\n }\n\n return !this.contentDOM.contains(mutation.target);\n } // disable (almost) all prosemirror event listener for node views\n\n\n stopEvent(event) {\n if (typeof this.extension.stopEvent === 'function') {\n return this.extension.stopEvent(event);\n }\n\n const draggable = !!this.extension.schema.draggable; // support a custom drag handle\n\n if (draggable && event.type === 'mousedown') {\n const dragHandle = event.target.closest && event.target.closest('[data-drag-handle]');\n const isValidDragHandle = dragHandle && (this.dom === dragHandle || this.dom.contains(dragHandle));\n\n if (isValidDragHandle) {\n this.captureEvents = false;\n document.addEventListener('dragend', () => {\n this.captureEvents = true;\n }, {\n once: true\n });\n }\n }\n\n const isCopy = event.type === 'copy';\n const isPaste = event.type === 'paste';\n const isCut = event.type === 'cut';\n const isDrag = event.type.startsWith('drag') || event.type === 'drop';\n\n if (draggable && isDrag || isCopy || isPaste || isCut) {\n return false;\n }\n\n return this.captureEvents;\n }\n\n selectNode() {\n this.updateComponentProps({\n selected: true\n });\n }\n\n deselectNode() {\n this.updateComponentProps({\n selected: false\n });\n }\n\n getMarkPos() {\n const pos = this.view.posAtDOM(this.dom);\n const resolvedPos = this.view.state.doc.resolve(pos);\n const range = getMarkRange(resolvedPos, this.node.type);\n return range;\n }\n\n destroy() {\n this.vm.$destroy();\n }\n\n}\n\nclass Emitter {\n // Add an event listener for given event\n on(event, fn) {\n this._callbacks = this._callbacks || {}; // Create namespace for this event\n\n if (!this._callbacks[event]) {\n this._callbacks[event] = [];\n }\n\n this._callbacks[event].push(fn);\n\n return this;\n }\n\n emit(event, ...args) {\n this._callbacks = this._callbacks || {};\n const callbacks = this._callbacks[event];\n\n if (callbacks) {\n callbacks.forEach(callback => callback.apply(this, args));\n }\n\n return this;\n } // Remove event listener for given event.\n // If fn is not provided, all event listeners for that event will be removed.\n // If neither is provided, all event listeners will be removed.\n\n\n off(event, fn) {\n if (!arguments.length) {\n this._callbacks = {};\n } else {\n // event listeners for the given event\n const callbacks = this._callbacks ? this._callbacks[event] : null;\n\n if (callbacks) {\n if (fn) {\n this._callbacks[event] = callbacks.filter(cb => cb !== fn); // remove specific handler\n } else {\n delete this._callbacks[event]; // remove all handlers\n }\n }\n }\n\n return this;\n }\n\n}\n\nclass Extension {\n constructor(options = {}) {\n this.options = { ...this.defaultOptions,\n ...options\n };\n }\n\n init() {\n return null;\n }\n\n bindEditor(editor = null) {\n this.editor = editor;\n }\n\n get name() {\n return null;\n }\n\n get type() {\n return 'extension';\n }\n\n get defaultOptions() {\n return {};\n }\n\n get plugins() {\n return [];\n }\n\n inputRules() {\n return [];\n }\n\n pasteRules() {\n return [];\n }\n\n keys() {\n return {};\n }\n\n}\n\nclass ExtensionManager {\n constructor(extensions = [], editor) {\n extensions.forEach(extension => {\n extension.bindEditor(editor);\n extension.init();\n });\n this.extensions = extensions;\n }\n\n get nodes() {\n return this.extensions.filter(extension => extension.type === 'node').reduce((nodes, {\n name,\n schema\n }) => ({ ...nodes,\n [name]: schema\n }), {});\n }\n\n get options() {\n const {\n view\n } = this;\n return this.extensions.reduce((nodes, extension) => ({ ...nodes,\n [extension.name]: new Proxy(extension.options, {\n set(obj, prop, value) {\n const changed = obj[prop] !== value;\n Object.assign(obj, {\n [prop]: value\n });\n\n if (changed) {\n view.updateState(view.state);\n }\n\n return true;\n }\n\n })\n }), {});\n }\n\n get marks() {\n return this.extensions.filter(extension => extension.type === 'mark').reduce((marks, {\n name,\n schema\n }) => ({ ...marks,\n [name]: schema\n }), {});\n }\n\n get plugins() {\n return this.extensions.filter(extension => extension.plugins).reduce((allPlugins, {\n plugins\n }) => [...allPlugins, ...plugins], []);\n }\n\n keymaps({\n schema\n }) {\n const extensionKeymaps = this.extensions.filter(extension => ['extension'].includes(extension.type)).filter(extension => extension.keys).map(extension => extension.keys({\n schema\n }));\n const nodeMarkKeymaps = this.extensions.filter(extension => ['node', 'mark'].includes(extension.type)).filter(extension => extension.keys).map(extension => extension.keys({\n type: schema[`${extension.type}s`][extension.name],\n schema\n }));\n return [...extensionKeymaps, ...nodeMarkKeymaps].map(keys => keymap(keys));\n }\n\n inputRules({\n schema,\n excludedExtensions\n }) {\n if (!(excludedExtensions instanceof Array) && excludedExtensions) return [];\n const allowedExtensions = excludedExtensions instanceof Array ? this.extensions.filter(extension => !excludedExtensions.includes(extension.name)) : this.extensions;\n const extensionInputRules = allowedExtensions.filter(extension => ['extension'].includes(extension.type)).filter(extension => extension.inputRules).map(extension => extension.inputRules({\n schema\n }));\n const nodeMarkInputRules = allowedExtensions.filter(extension => ['node', 'mark'].includes(extension.type)).filter(extension => extension.inputRules).map(extension => extension.inputRules({\n type: schema[`${extension.type}s`][extension.name],\n schema\n }));\n return [...extensionInputRules, ...nodeMarkInputRules].reduce((allInputRules, inputRules) => [...allInputRules, ...inputRules], []);\n }\n\n pasteRules({\n schema,\n excludedExtensions\n }) {\n if (!(excludedExtensions instanceof Array) && excludedExtensions) return [];\n const allowedExtensions = excludedExtensions instanceof Array ? this.extensions.filter(extension => !excludedExtensions.includes(extension.name)) : this.extensions;\n const extensionPasteRules = allowedExtensions.filter(extension => ['extension'].includes(extension.type)).filter(extension => extension.pasteRules).map(extension => extension.pasteRules({\n schema\n }));\n const nodeMarkPasteRules = allowedExtensions.filter(extension => ['node', 'mark'].includes(extension.type)).filter(extension => extension.pasteRules).map(extension => extension.pasteRules({\n type: schema[`${extension.type}s`][extension.name],\n schema\n }));\n return [...extensionPasteRules, ...nodeMarkPasteRules].reduce((allPasteRules, pasteRules) => [...allPasteRules, ...pasteRules], []);\n }\n\n commands({\n schema,\n view\n }) {\n return this.extensions.filter(extension => extension.commands).reduce((allCommands, extension) => {\n const {\n name,\n type\n } = extension;\n const commands = {};\n const value = extension.commands({\n schema,\n ...(['node', 'mark'].includes(type) ? {\n type: schema[`${type}s`][name]\n } : {})\n });\n\n const apply = (cb, attrs) => {\n if (!view.editable) {\n return false;\n }\n\n view.focus();\n return cb(attrs)(view.state, view.dispatch, view);\n };\n\n const handle = (_name, _value) => {\n if (Array.isArray(_value)) {\n commands[_name] = attrs => _value.forEach(callback => apply(callback, attrs));\n } else if (typeof _value === 'function') {\n commands[_name] = attrs => apply(_value, attrs);\n }\n };\n\n if (typeof value === 'object') {\n Object.entries(value).forEach(([commandName, commandValue]) => {\n handle(commandName, commandValue);\n });\n } else {\n handle(name, value);\n }\n\n return { ...allCommands,\n ...commands\n };\n }, {});\n }\n\n}\n\nfunction injectCSS (css) {\n if (process.env.NODE_ENV !== 'test') {\n const style = document.createElement('style');\n style.type = 'text/css';\n style.textContent = css;\n const {\n head\n } = document;\n const {\n firstChild\n } = head;\n\n if (firstChild) {\n head.insertBefore(style, firstChild);\n } else {\n head.appendChild(style);\n }\n }\n}\n\nclass Mark extends Extension {\n constructor(options = {}) {\n super(options);\n }\n\n get type() {\n return 'mark';\n }\n\n get view() {\n return null;\n }\n\n get schema() {\n return null;\n }\n\n command() {\n return () => {};\n }\n\n}\n\nfunction minMax(value = 0, min = 0, max = 0) {\n return Math.min(Math.max(parseInt(value, 10), min), max);\n}\n\nclass Node extends Extension {\n constructor(options = {}) {\n super(options);\n }\n\n get type() {\n return 'node';\n }\n\n get view() {\n return null;\n }\n\n get schema() {\n return null;\n }\n\n command() {\n return () => {};\n }\n\n}\n\nclass Doc extends Node {\n get name() {\n return 'doc';\n }\n\n get schema() {\n return {\n content: 'block+'\n };\n }\n\n}\n\nclass Paragraph extends Node {\n get name() {\n return 'paragraph';\n }\n\n get schema() {\n return {\n content: 'inline*',\n group: 'block',\n draggable: false,\n parseDOM: [{\n tag: 'p'\n }],\n toDOM: () => ['p', 0]\n };\n }\n\n commands({\n type\n }) {\n return () => setBlockType(type);\n }\n\n}\n\nclass Text extends Node {\n get name() {\n return 'text';\n }\n\n get schema() {\n return {\n group: 'inline'\n };\n }\n\n}\n\nvar css = \".ProseMirror {\\n position: relative;\\n}\\n\\n.ProseMirror {\\n word-wrap: break-word;\\n white-space: pre-wrap;\\n -webkit-font-variant-ligatures: none;\\n font-variant-ligatures: none;\\n}\\n\\n.ProseMirror pre {\\n white-space: pre-wrap;\\n}\\n\\n.ProseMirror-gapcursor {\\n display: none;\\n pointer-events: none;\\n position: absolute;\\n}\\n\\n.ProseMirror-gapcursor:after {\\n content: \\\"\\\";\\n display: block;\\n position: absolute;\\n top: -2px;\\n width: 20px;\\n border-top: 1px solid black;\\n animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite;\\n}\\n\\n@keyframes ProseMirror-cursor-blink {\\n to {\\n visibility: hidden;\\n }\\n}\\n\\n.ProseMirror-hideselection *::selection {\\n background: transparent;\\n}\\n\\n.ProseMirror-hideselection *::-moz-selection {\\n background: transparent;\\n}\\n\\n.ProseMirror-hideselection * {\\n caret-color: transparent;\\n}\\n\\n.ProseMirror-focused .ProseMirror-gapcursor {\\n display: block;\\n}\\n\";\n\nclass Editor extends Emitter {\n constructor(options = {}) {\n super();\n this.defaultOptions = {\n editorProps: {},\n editable: true,\n autoFocus: null,\n extensions: [],\n content: '',\n topNode: 'doc',\n emptyDocument: {\n type: 'doc',\n content: [{\n type: 'paragraph'\n }]\n },\n useBuiltInExtensions: true,\n disableInputRules: false,\n disablePasteRules: false,\n dropCursor: {},\n enableDropCursor: true,\n enableGapCursor: true,\n parseOptions: {},\n injectCSS: true,\n onInit: () => {},\n onTransaction: () => {},\n onUpdate: () => {},\n onFocus: () => {},\n onBlur: () => {},\n onPaste: () => {},\n onDrop: () => {}\n };\n this.events = ['init', 'transaction', 'update', 'focus', 'blur', 'paste', 'drop'];\n this.init(options);\n }\n\n init(options = {}) {\n this.setOptions({ ...this.defaultOptions,\n ...options\n });\n this.focused = false;\n this.selection = {\n from: 0,\n to: 0\n };\n this.element = document.createElement('div');\n this.extensions = this.createExtensions();\n this.nodes = this.createNodes();\n this.marks = this.createMarks();\n this.schema = this.createSchema();\n this.plugins = this.createPlugins();\n this.keymaps = this.createKeymaps();\n this.inputRules = this.createInputRules();\n this.pasteRules = this.createPasteRules();\n this.view = this.createView();\n this.commands = this.createCommands();\n this.setActiveNodesAndMarks();\n\n if (this.options.injectCSS) {\n injectCSS(css);\n }\n\n if (this.options.autoFocus !== null) {\n this.focus(this.options.autoFocus);\n }\n\n this.events.forEach(name => {\n this.on(name, this.options[camelCase(`on ${name}`)] || (() => {}));\n });\n this.emit('init', {\n view: this.view,\n state: this.state\n }); // give extension manager access to our view\n\n this.extensions.view = this.view;\n }\n\n setOptions(options) {\n this.options = { ...this.options,\n ...options\n };\n\n if (this.view && this.state) {\n this.view.updateState(this.state);\n }\n }\n\n get builtInExtensions() {\n if (!this.options.useBuiltInExtensions) {\n return [];\n }\n\n return [new Doc(), new Text(), new Paragraph()];\n }\n\n get state() {\n return this.view ? this.view.state : null;\n }\n\n createExtensions() {\n return new ExtensionManager([...this.builtInExtensions, ...this.options.extensions], this);\n }\n\n createPlugins() {\n return this.extensions.plugins;\n }\n\n createKeymaps() {\n return this.extensions.keymaps({\n schema: this.schema\n });\n }\n\n createInputRules() {\n return this.extensions.inputRules({\n schema: this.schema,\n excludedExtensions: this.options.disableInputRules\n });\n }\n\n createPasteRules() {\n return this.extensions.pasteRules({\n schema: this.schema,\n excludedExtensions: this.options.disablePasteRules\n });\n }\n\n createCommands() {\n return this.extensions.commands({\n schema: this.schema,\n view: this.view\n });\n }\n\n createNodes() {\n return this.extensions.nodes;\n }\n\n createMarks() {\n return this.extensions.marks;\n }\n\n createSchema() {\n return new Schema({\n topNode: this.options.topNode,\n nodes: this.nodes,\n marks: this.marks\n });\n }\n\n createState() {\n return EditorState.create({\n schema: this.schema,\n doc: this.createDocument(this.options.content),\n plugins: [...this.plugins, inputRules({\n rules: this.inputRules\n }), ...this.pasteRules, ...this.keymaps, keymap({\n Backspace: undoInputRule\n }), keymap(baseKeymap), ...(this.options.enableDropCursor ? [dropCursor(this.options.dropCursor)] : []), ...(this.options.enableGapCursor ? [gapCursor()] : []), new Plugin({\n key: new PluginKey('editable'),\n props: {\n editable: () => this.options.editable\n }\n }), new Plugin({\n props: {\n attributes: {\n tabindex: 0\n },\n handleDOMEvents: {\n focus: (view, event) => {\n this.focused = true;\n this.emit('focus', {\n event,\n state: view.state,\n view\n });\n const transaction = this.state.tr.setMeta('focused', true);\n this.view.dispatch(transaction);\n },\n blur: (view, event) => {\n this.focused = false;\n this.emit('blur', {\n event,\n state: view.state,\n view\n });\n const transaction = this.state.tr.setMeta('focused', false);\n this.view.dispatch(transaction);\n }\n }\n }\n }), new Plugin({\n props: this.options.editorProps\n })]\n });\n }\n\n createDocument(content, parseOptions = this.options.parseOptions) {\n if (content === null) {\n return this.schema.nodeFromJSON(this.options.emptyDocument);\n }\n\n if (typeof content === 'object') {\n try {\n return this.schema.nodeFromJSON(content);\n } catch (error) {\n console.warn('[tiptap warn]: Invalid content.', 'Passed value:', content, 'Error:', error);\n return this.schema.nodeFromJSON(this.options.emptyDocument);\n }\n }\n\n if (typeof content === 'string') {\n const htmlString = `<div>${content}</div>`;\n const parser = new window.DOMParser();\n const element = parser.parseFromString(htmlString, 'text/html').body.firstElementChild;\n return DOMParser.fromSchema(this.schema).parse(element, parseOptions);\n }\n\n return false;\n }\n\n createView() {\n return new EditorView(this.element, {\n state: this.createState(),\n handlePaste: (...args) => {\n this.emit('paste', ...args);\n },\n handleDrop: (...args) => {\n this.emit('drop', ...args);\n },\n dispatchTransaction: this.dispatchTransaction.bind(this)\n });\n }\n\n setParentComponent(component = null) {\n if (!component) {\n return;\n }\n\n this.view.setProps({\n nodeViews: this.initNodeViews({\n parent: component,\n extensions: [...this.builtInExtensions, ...this.options.extensions]\n })\n });\n }\n\n initNodeViews({\n parent,\n extensions\n }) {\n return extensions.filter(extension => ['node', 'mark'].includes(extension.type)).filter(extension => extension.view).reduce((nodeViews, extension) => {\n const nodeView = (node, view, getPos, decorations) => {\n const component = extension.view;\n return new ComponentView(component, {\n editor: this,\n extension,\n parent,\n node,\n view,\n getPos,\n decorations\n });\n };\n\n return { ...nodeViews,\n [extension.name]: nodeView\n };\n }, {});\n }\n\n dispatchTransaction(transaction) {\n const newState = this.state.apply(transaction);\n this.view.updateState(newState);\n this.selection = {\n from: this.state.selection.from,\n to: this.state.selection.to\n };\n this.setActiveNodesAndMarks();\n this.emit('transaction', {\n getHTML: this.getHTML.bind(this),\n getJSON: this.getJSON.bind(this),\n state: this.state,\n transaction\n });\n\n if (!transaction.docChanged || transaction.getMeta('preventUpdate')) {\n return;\n }\n\n this.emitUpdate(transaction);\n }\n\n emitUpdate(transaction) {\n this.emit('update', {\n getHTML: this.getHTML.bind(this),\n getJSON: this.getJSON.bind(this),\n state: this.state,\n transaction\n });\n }\n\n resolveSelection(position = null) {\n if (this.selection && position === null) {\n return this.selection;\n }\n\n if (position === 'start' || position === true) {\n return {\n from: 0,\n to: 0\n };\n }\n\n if (position === 'end') {\n const {\n doc\n } = this.state;\n return {\n from: doc.content.size,\n to: doc.content.size\n };\n }\n\n return {\n from: position,\n to: position\n };\n }\n\n focus(position = null) {\n if (this.view.focused && position === null || position === false) {\n return;\n }\n\n const {\n from,\n to\n } = this.resolveSelection(position);\n this.setSelection(from, to);\n setTimeout(() => this.view.focus(), 10);\n }\n\n setSelection(from = 0, to = 0) {\n const {\n doc,\n tr\n } = this.state;\n const resolvedFrom = minMax(from, 0, doc.content.size);\n const resolvedEnd = minMax(to, 0, doc.content.size);\n const selection = TextSelection.create(doc, resolvedFrom, resolvedEnd);\n const transaction = tr.setSelection(selection);\n this.view.dispatch(transaction);\n }\n\n blur() {\n this.view.dom.blur();\n }\n\n getSchemaJSON() {\n return JSON.parse(JSON.stringify({\n nodes: this.extensions.nodes,\n marks: this.extensions.marks\n }));\n }\n\n getHTML() {\n const div = document.createElement('div');\n const fragment = DOMSerializer.fromSchema(this.schema).serializeFragment(this.state.doc.content);\n div.appendChild(fragment);\n return div.innerHTML;\n }\n\n getJSON() {\n return this.state.doc.toJSON();\n }\n\n setContent(content = {}, emitUpdate = false, parseOptions) {\n const {\n doc,\n tr\n } = this.state;\n const document = this.createDocument(content, parseOptions);\n const selection = TextSelection.create(doc, 0, doc.content.size);\n const transaction = tr.setSelection(selection).replaceSelectionWith(document, false).setMeta('preventUpdate', !emitUpdate);\n this.view.dispatch(transaction);\n }\n\n clearContent(emitUpdate = false) {\n this.setContent(this.options.emptyDocument, emitUpdate);\n }\n\n setActiveNodesAndMarks() {\n this.activeMarks = Object.entries(this.schema.marks).reduce((marks, [name, mark]) => ({ ...marks,\n [name]: (attrs = {}) => markIsActive(this.state, mark, attrs)\n }), {});\n this.activeMarkAttrs = Object.entries(this.schema.marks).reduce((marks, [name, mark]) => ({ ...marks,\n [name]: getMarkAttrs(this.state, mark)\n }), {});\n this.activeNodes = Object.entries(this.schema.nodes).reduce((nodes, [name, node]) => ({ ...nodes,\n [name]: (attrs = {}) => nodeIsActive(this.state, node, attrs)\n }), {});\n }\n\n getMarkAttrs(type = null) {\n return this.activeMarkAttrs[type];\n }\n\n getNodeAttrs(type = null) {\n return { ...getNodeAttrs(this.state, this.schema.nodes[type])\n };\n }\n\n get isActive() {\n return Object.entries({ ...this.activeMarks,\n ...this.activeNodes\n }).reduce((types, [name, value]) => ({ ...types,\n [name]: (attrs = {}) => value(attrs)\n }), {});\n }\n\n registerPlugin(plugin = null, handlePlugins) {\n const plugins = typeof handlePlugins === 'function' ? handlePlugins(plugin, this.state.plugins) : [plugin, ...this.state.plugins];\n const newState = this.state.reconfigure({\n plugins\n });\n this.view.updateState(newState);\n }\n\n unregisterPlugin(name = null) {\n if (!name || !this.view.docView) {\n return;\n }\n\n const newState = this.state.reconfigure({\n plugins: this.state.plugins.filter(plugin => !plugin.key.startsWith(`${name}$`))\n });\n this.view.updateState(newState);\n }\n\n destroy() {\n if (!this.view) {\n return;\n }\n\n this.view.destroy();\n }\n\n}\n\nvar EditorContent = {\n props: {\n editor: {\n default: null,\n type: Object\n }\n },\n watch: {\n editor: {\n immediate: true,\n\n handler(editor) {\n if (editor && editor.element) {\n this.$nextTick(() => {\n this.$el.appendChild(editor.element.firstChild);\n editor.setParentComponent(this);\n });\n }\n }\n\n }\n },\n\n render(createElement) {\n return createElement('div');\n },\n\n beforeDestroy() {\n this.editor.element = this.$el;\n }\n\n};\n\nclass Menu {\n constructor({\n options\n }) {\n this.options = options;\n this.preventHide = false; // the mousedown event is fired before blur so we can prevent it\n\n this.mousedownHandler = this.handleClick.bind(this);\n this.options.element.addEventListener('mousedown', this.mousedownHandler, {\n capture: true\n });\n\n this.blurHandler = () => {\n if (this.preventHide) {\n this.preventHide = false;\n return;\n }\n\n this.options.editor.emit('menubar:focusUpdate', false);\n };\n\n this.options.editor.on('blur', this.blurHandler);\n }\n\n handleClick() {\n this.preventHide = true;\n }\n\n destroy() {\n this.options.element.removeEventListener('mousedown', this.mousedownHandler);\n this.options.editor.off('blur', this.blurHandler);\n }\n\n}\n\nfunction MenuBar (options) {\n return new Plugin({\n key: new PluginKey('menu_bar'),\n\n view(editorView) {\n return new Menu({\n editorView,\n options\n });\n }\n\n });\n}\n\nvar EditorMenuBar = {\n props: {\n editor: {\n default: null,\n type: Object\n }\n },\n\n data() {\n return {\n focused: false\n };\n },\n\n watch: {\n editor: {\n immediate: true,\n\n handler(editor) {\n if (editor) {\n this.$nextTick(() => {\n editor.registerPlugin(MenuBar({\n editor,\n element: this.$el\n }));\n this.focused = editor.focused;\n editor.on('focus', () => {\n this.focused = true;\n });\n editor.on('menubar:focusUpdate', focused => {\n this.focused = focused;\n });\n });\n }\n }\n\n }\n },\n\n render() {\n if (!this.editor) {\n return null;\n }\n\n return this.$scopedSlots.default({\n focused: this.focused,\n focus: this.editor.focus,\n commands: this.editor.commands,\n isActive: this.editor.isActive,\n getMarkAttrs: this.editor.getMarkAttrs.bind(this.editor),\n getNodeAttrs: this.editor.getNodeAttrs.bind(this.editor)\n });\n }\n\n};\n\nfunction textRange(node, from, to) {\n const range = document.createRange();\n range.setEnd(node, to == null ? node.nodeValue.length : to);\n range.setStart(node, Math.max(from, 0));\n return range;\n}\n\nfunction singleRect(object, bias) {\n const rects = object.getClientRects();\n return !rects.length ? object.getBoundingClientRect() : rects[bias < 0 ? 0 : rects.length - 1];\n}\n\nfunction coordsAtPos(view, pos, end = false) {\n const {\n node,\n offset\n } = view.docView.domFromPos(pos);\n let side;\n let rect;\n\n if (node.nodeType === 3) {\n if (end && offset < node.nodeValue.length) {\n rect = singleRect(textRange(node, offset - 1, offset), -1);\n side = 'right';\n } else if (offset < node.nodeValue.length) {\n rect = singleRect(textRange(node, offset, offset + 1), -1);\n side = 'left';\n }\n } else if (node.firstChild) {\n if (offset < node.childNodes.length) {\n const child = node.childNodes[offset];\n rect = singleRect(child.nodeType === 3 ? textRange(child) : child, -1);\n side = 'left';\n }\n\n if ((!rect || rect.top === rect.bottom) && offset) {\n const child = node.childNodes[offset - 1];\n rect = singleRect(child.nodeType === 3 ? textRange(child) : child, 1);\n side = 'right';\n }\n } else {\n rect = node.getBoundingClientRect();\n side = 'left';\n }\n\n const x = rect[side];\n return {\n top: rect.top,\n bottom: rect.bottom,\n left: x,\n right: x\n };\n}\n\nclass Menu$1 {\n constructor({\n options,\n editorView\n }) {\n this.options = { ...{\n element: null,\n keepInBounds: true,\n onUpdate: () => false\n },\n ...options\n };\n this.editorView = editorView;\n this.isActive = false;\n this.left = 0;\n this.bottom = 0;\n this.top = 0;\n this.preventHide = false; // the mousedown event is fired before blur so we can prevent it\n\n this.mousedownHandler = this.handleClick.bind(this);\n this.options.element.addEventListener('mousedown', this.mousedownHandler, {\n capture: true\n });\n\n this.focusHandler = ({\n view\n }) => {\n this.update(view);\n };\n\n this.options.editor.on('focus', this.focusHandler);\n\n this.blurHandler = ({\n event\n }) => {\n if (this.preventHide) {\n this.preventHide = false;\n return;\n }\n\n this.hide(event);\n };\n\n this.options.editor.on('blur', this.blurHandler);\n }\n\n handleClick() {\n this.preventHide = true;\n }\n\n update(view, lastState) {\n const {\n state\n } = view;\n\n if (view.composing) {\n return;\n } // Don't do anything if the document/selection didn't change\n\n\n if (lastState && lastState.doc.eq(state.doc) && lastState.selection.eq(state.selection)) {\n return;\n } // Hide the tooltip if the selection is empty\n\n\n if (state.selection.empty) {\n this.hide();\n return;\n } // Otherwise, reposition it and update its content\n\n\n const {\n from,\n to\n } = state.selection; // These are in screen coordinates\n // We can't use EditorView.cordsAtPos here because it can't handle linebreaks correctly\n // See: https://github.com/ProseMirror/prosemirror-view/pull/47\n\n const start = coordsAtPos(view, from);\n const end = coordsAtPos(view, to, true); // The box in which the tooltip is positioned, to use as base\n\n const parent = this.options.element.offsetParent;\n\n if (!parent) {\n this.hide();\n return;\n }\n\n const box = parent.getBoundingClientRect();\n const el = this.options.element.getBoundingClientRect(); // Find a center-ish x position from the selection endpoints (when\n // crossing lines, end may be more to the left)\n\n const left = (start.left + end.left) / 2 - box.left; // Keep the menuBubble in the bounding box of the offsetParent i\n\n this.left = Math.round(this.options.keepInBounds ? Math.min(box.width - el.width / 2, Math.max(left, el.width / 2)) : left);\n this.bottom = Math.round(box.bottom - start.top);\n this.top = Math.round(end.bottom - box.top);\n this.isActive = true;\n this.sendUpdate();\n }\n\n sendUpdate() {\n this.options.onUpdate({\n isActive: this.isActive,\n left: this.left,\n bottom: this.bottom,\n top: this.top\n });\n }\n\n hide(event) {\n if (event && event.relatedTarget && this.options.element.parentNode && this.options.element.parentNode.contains(event.relatedTarget)) {\n return;\n }\n\n this.isActive = false;\n this.sendUpdate();\n }\n\n destroy() {\n this.options.element.removeEventListener('mousedown', this.mousedownHandler);\n this.options.editor.off('focus', this.focusHandler);\n this.options.editor.off('blur', this.blurHandler);\n }\n\n}\n\nfunction MenuBubble (options) {\n return new Plugin({\n key: new PluginKey('menu_bubble'),\n\n view(editorView) {\n return new Menu$1({\n editorView,\n options\n });\n }\n\n });\n}\n\nvar EditorMenuBubble = {\n props: {\n editor: {\n default: null,\n type: Object\n },\n keepInBounds: {\n default: true,\n type: Boolean\n }\n },\n\n data() {\n return {\n menu: {\n isActive: false,\n left: 0,\n bottom: 0\n }\n };\n },\n\n watch: {\n editor: {\n immediate: true,\n\n handler(editor) {\n if (editor) {\n this.$nextTick(() => {\n editor.registerPlugin(MenuBubble({\n editor,\n element: this.$el,\n keepInBounds: this.keepInBounds,\n onUpdate: menu => {\n // the second check ensures event is fired only once\n if (menu.isActive && this.menu.isActive === false) {\n this.$emit('show', menu);\n } else if (!menu.isActive && this.menu.isActive === true) {\n this.$emit('hide', menu);\n }\n\n this.menu = menu;\n }\n }));\n });\n }\n }\n\n }\n },\n\n render() {\n if (!this.editor) {\n return null;\n }\n\n return this.$scopedSlots.default({\n focused: this.editor.view.focused,\n focus: this.editor.focus,\n commands: this.editor.commands,\n isActive: this.editor.isActive,\n getMarkAttrs: this.editor.getMarkAttrs.bind(this.editor),\n getNodeAttrs: this.editor.getNodeAttrs.bind(this.editor),\n menu: this.menu\n });\n },\n\n beforeDestroy() {\n this.editor.unregisterPlugin('menu_bubble');\n }\n\n};\n\nclass Menu$2 {\n constructor({\n options,\n editorView\n }) {\n this.options = { ...{\n resizeObserver: true,\n element: null,\n onUpdate: () => false\n },\n ...options\n };\n this.preventHide = false;\n this.editorView = editorView;\n this.isActive = false;\n this.top = 0; // the mousedown event is fired before blur so we can prevent it\n\n this.mousedownHandler = this.handleClick.bind(this);\n this.options.element.addEventListener('mousedown', this.mousedownHandler, {\n capture: true\n });\n\n this.focusHandler = ({\n view\n }) => {\n this.update(view);\n };\n\n this.options.editor.on('focus', this.focusHandler);\n\n this.blurHandler = ({\n event\n }) => {\n if (this.preventHide) {\n this.preventHide = false;\n return;\n }\n\n this.hide(event);\n };\n\n this.options.editor.on('blur', this.blurHandler); // sometimes we have to update the position\n // because of a loaded images for example\n\n if (this.options.resizeObserver && window.ResizeObserver) {\n this.resizeObserver = new ResizeObserver(() => {\n if (this.isActive) {\n this.update(this.editorView);\n }\n });\n this.resizeObserver.observe(this.editorView.dom);\n }\n }\n\n handleClick() {\n this.preventHide = true;\n }\n\n update(view, lastState) {\n const {\n state\n } = view; // Don't do anything if the document/selection didn't change\n\n if (lastState && lastState.doc.eq(state.doc) && lastState.selection.eq(state.selection)) {\n return;\n }\n\n if (!state.selection.empty) {\n this.hide();\n return;\n }\n\n const currentDom = view.domAtPos(state.selection.anchor);\n const isActive = currentDom.node.innerHTML === '<br>' && currentDom.node.tagName === 'P' && currentDom.node.parentNode === view.dom;\n\n if (!isActive) {\n this.hide();\n return;\n }\n\n const parent = this.options.element.offsetParent;\n\n if (!parent) {\n this.hide();\n return;\n }\n\n const editorBoundings = parent.getBoundingClientRect();\n const cursorBoundings = view.coordsAtPos(state.selection.anchor);\n const top = cursorBoundings.top - editorBoundings.top;\n this.isActive = true;\n this.top = top;\n this.sendUpdate();\n }\n\n sendUpdate() {\n this.options.onUpdate({\n isActive: this.isActive,\n top: this.top\n });\n }\n\n hide(event) {\n if (event && event.relatedTarget && this.options.element.parentNode && this.options.element.parentNode.contains(event.relatedTarget)) {\n return;\n }\n\n this.isActive = false;\n this.sendUpdate();\n }\n\n destroy() {\n this.options.element.removeEventListener('mousedown', this.mousedownHandler);\n\n if (this.resizeObserver) {\n this.resizeObserver.unobserve(this.editorView.dom);\n }\n\n this.options.editor.off('focus', this.focusHandler);\n this.options.editor.off('blur', this.blurHandler);\n }\n\n}\n\nfunction FloatingMenu (options) {\n return new Plugin({\n key: new PluginKey('floating_menu'),\n\n view(editorView) {\n return new Menu$2({\n editorView,\n options\n });\n }\n\n });\n}\n\nvar EditorFloatingMenu = {\n props: {\n editor: {\n default: null,\n type: Object\n }\n },\n\n data() {\n return {\n menu: {\n isActive: false,\n left: 0,\n bottom: 0\n }\n };\n },\n\n watch: {\n editor: {\n immediate: true,\n\n handler(editor) {\n if (editor) {\n this.$nextTick(() => {\n editor.registerPlugin(FloatingMenu({\n editor,\n element: this.$el,\n onUpdate: menu => {\n // the second check ensures event is fired only once\n if (menu.isActive && this.menu.isActive === false) {\n this.$emit('show', menu);\n } else if (!menu.isActive && this.menu.isActive === true) {\n this.$emit('hide', menu);\n }\n\n this.menu = menu;\n }\n }));\n });\n }\n }\n\n }\n },\n\n render() {\n if (!this.editor) {\n return null;\n }\n\n return this.$scopedSlots.default({\n focused: this.editor.view.focused,\n focus: this.editor.focus,\n commands: this.editor.commands,\n isActive: this.editor.isActive,\n getMarkAttrs: this.editor.getMarkAttrs.bind(this.editor),\n getNodeAttrs: this.editor.getNodeAttrs.bind(this.editor),\n menu: this.menu\n });\n },\n\n beforeDestroy() {\n this.editor.unregisterPlugin('floating_menu');\n }\n\n};\n\nexport { Doc, Editor, EditorContent, EditorFloatingMenu, EditorMenuBar, EditorMenuBubble, Extension, Mark, Node, Paragraph, Text };\n","\n /*!\n * tiptap-extensions v1.35.1\n * (c) 2021 überdosis GbR (limited liability)\n * @license MIT\n */\n \nimport { Node, Plugin, PluginKey, Mark, Extension } from 'tiptap';\nimport { toggleWrap, wrappingInputRule, toggleList, toggleBlockType, setBlockType, textblockTypeInputRule, chainCommands, exitCode, nodeInputRule, splitListItem, sinkListItem, liftListItem, insertText, replaceText, splitToDefaultListItem, toggleMark, markInputRule, markPasteRule, updateMark, removeMark, pasteRule } from 'tiptap-commands';\nimport low from 'lowlight/lib/core';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { findBlockNodes, createTable, getMarkAttrs, nodeEqualsType } from 'tiptap-utils';\nimport { Fragment } from 'prosemirror-model';\nimport { Plugin as Plugin$1, PluginKey as PluginKey$1, TextSelection } from 'prosemirror-state';\nimport { tableNodes, addColumnBefore, addColumnAfter, deleteColumn, addRowBefore, addRowAfter, deleteRow, deleteTable, mergeCells, splitCell, toggleHeaderColumn, toggleHeaderRow, toggleHeaderCell, setCellAttr, fixTables, goToNextCell, columnResizing, tableEditing } from 'prosemirror-tables';\nimport { Step } from 'prosemirror-transform';\nimport { sendableSteps, getVersion, receiveTransaction, collab } from 'prosemirror-collab';\nimport { history, undo, redo, undoDepth, redoDepth } from 'prosemirror-history';\n\nclass Blockquote extends Node {\n get name() {\n return 'blockquote';\n }\n\n get schema() {\n return {\n content: 'block*',\n group: 'block',\n defining: true,\n draggable: false,\n parseDOM: [{\n tag: 'blockquote'\n }],\n toDOM: () => ['blockquote', 0]\n };\n }\n\n commands({\n type\n }) {\n return () => toggleWrap(type);\n }\n\n keys({\n type\n }) {\n return {\n 'Ctrl->': toggleWrap(type)\n };\n }\n\n inputRules({\n type\n }) {\n return [wrappingInputRule(/^\\s*>\\s$/, type)];\n }\n\n}\n\nclass BulletList extends Node {\n get name() {\n return 'bullet_list';\n }\n\n get schema() {\n return {\n content: 'list_item+',\n group: 'block',\n parseDOM: [{\n tag: 'ul'\n }],\n toDOM: () => ['ul', 0]\n };\n }\n\n commands({\n type,\n schema\n }) {\n return () => toggleList(type, schema.nodes.list_item);\n }\n\n keys({\n type,\n schema\n }) {\n return {\n 'Shift-Ctrl-8': toggleList(type, schema.nodes.list_item)\n };\n }\n\n inputRules({\n type\n }) {\n return [wrappingInputRule(/^\\s*([-+*])\\s$/, type)];\n }\n\n}\n\nclass CodeBlock extends Node {\n get name() {\n return 'code_block';\n }\n\n get schema() {\n return {\n content: 'text*',\n marks: '',\n group: 'block',\n code: true,\n defining: true,\n draggable: false,\n parseDOM: [{\n tag: 'pre',\n preserveWhitespace: 'full'\n }],\n toDOM: () => ['pre', ['code', 0]]\n };\n }\n\n commands({\n type,\n schema\n }) {\n return () => toggleBlockType(type, schema.nodes.paragraph);\n }\n\n keys({\n type\n }) {\n return {\n 'Shift-Ctrl-\\\\': setBlockType(type)\n };\n }\n\n inputRules({\n type\n }) {\n return [textblockTypeInputRule(/^```$/, type)];\n }\n\n}\n\nfunction getDecorations({\n doc,\n name\n}) {\n const decorations = [];\n const blocks = findBlockNodes(doc).filter(item => item.node.type.name === name);\n\n const flatten = list => list.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []);\n\n function parseNodes(nodes, className = []) {\n return nodes.map(node => {\n const classes = [...className, ...(node.properties ? node.properties.className : [])];\n\n if (node.children) {\n return parseNodes(node.children, classes);\n }\n\n return {\n text: node.value,\n classes\n };\n });\n }\n\n blocks.forEach(block => {\n let startPos = block.pos + 1;\n const nodes = low.highlightAuto(block.node.textContent).value;\n flatten(parseNodes(nodes)).map(node => {\n const from = startPos;\n const to = from + node.text.length;\n startPos = to;\n return { ...node,\n from,\n to\n };\n }).forEach(node => {\n const decoration = Decoration.inline(node.from, node.to, {\n class: node.classes.join(' ')\n });\n decorations.push(decoration);\n });\n });\n return DecorationSet.create(doc, decorations);\n}\n\nfunction HighlightPlugin({\n name\n}) {\n return new Plugin({\n name: new PluginKey('highlight'),\n state: {\n init: (_, {\n doc\n }) => getDecorations({\n doc,\n name\n }),\n apply: (transaction, decorationSet, oldState, newState) => {\n // TODO: find way to cache decorations\n // https://discuss.prosemirror.net/t/how-to-update-multiple-inline-decorations-on-node-change/1493\n const oldNodeName = oldState.selection.$head.parent.type.name;\n const newNodeName = newState.selection.$head.parent.type.name;\n const oldNodes = findBlockNodes(oldState.doc).filter(item => item.node.type.name === name);\n const newNodes = findBlockNodes(newState.doc).filter(item => item.node.type.name === name); // Apply decorations if selection includes named node, or transaction changes named node.\n\n if (transaction.docChanged && ([oldNodeName, newNodeName].includes(name) || newNodes.length !== oldNodes.length)) {\n return getDecorations({\n doc: transaction.doc,\n name\n });\n }\n\n return decorationSet.map(transaction.mapping, transaction.doc);\n }\n },\n props: {\n decorations(state) {\n return this.getState(state);\n }\n\n }\n });\n}\n\nclass CodeBlockHighlight extends Node {\n constructor(options = {}) {\n super(options);\n\n try {\n Object.entries(this.options.languages).forEach(([name, mapping]) => {\n low.registerLanguage(name, mapping);\n });\n } catch (err) {\n throw new Error('Invalid syntax highlight definitions: define at least one highlight.js language mapping');\n }\n }\n\n get name() {\n return 'code_block';\n }\n\n get defaultOptions() {\n return {\n languages: {}\n };\n }\n\n get schema() {\n return {\n content: 'text*',\n marks: '',\n group: 'block',\n code: true,\n defining: true,\n draggable: false,\n parseDOM: [{\n tag: 'pre',\n preserveWhitespace: 'full'\n }],\n toDOM: () => ['pre', ['code', 0]]\n };\n }\n\n commands({\n type,\n schema\n }) {\n return () => toggleBlockType(type, schema.nodes.paragraph);\n }\n\n keys({\n type\n }) {\n return {\n 'Shift-Ctrl-\\\\': setBlockType(type)\n };\n }\n\n inputRules({\n type\n }) {\n return [textblockTypeInputRule(/^```$/, type)];\n }\n\n get plugins() {\n return [HighlightPlugin({\n name: this.name\n })];\n }\n\n}\n\nclass HardBreak extends Node {\n get name() {\n return 'hard_break';\n }\n\n get schema() {\n return {\n inline: true,\n group: 'inline',\n selectable: false,\n parseDOM: [{\n tag: 'br'\n }],\n toDOM: () => ['br']\n };\n }\n\n commands({\n type\n }) {\n return () => chainCommands(exitCode, (state, dispatch) => {\n dispatch(state.tr.replaceSelectionWith(type.create()).scrollIntoView());\n return true;\n });\n }\n\n keys({\n type\n }) {\n const command = chainCommands(exitCode, (state, dispatch) => {\n dispatch(state.tr.replaceSelectionWith(type.create()).scrollIntoView());\n return true;\n });\n return {\n 'Mod-Enter': command,\n 'Shift-Enter': command\n };\n }\n\n}\n\nclass Heading extends Node {\n get name() {\n return 'heading';\n }\n\n get defaultOptions() {\n return {\n levels: [1, 2, 3, 4, 5, 6]\n };\n }\n\n get schema() {\n return {\n attrs: {\n level: {\n default: 1\n }\n },\n content: 'inline*',\n group: 'block',\n defining: true,\n draggable: false,\n parseDOM: this.options.levels.map(level => ({\n tag: `h${level}`,\n attrs: {\n level\n }\n })),\n toDOM: node => [`h${node.attrs.level}`, 0]\n };\n }\n\n commands({\n type,\n schema\n }) {\n return attrs => toggleBlockType(type, schema.nodes.paragraph, attrs);\n }\n\n keys({\n type\n }) {\n return this.options.levels.reduce((items, level) => ({ ...items,\n ...{\n [`Shift-Ctrl-${level}`]: setBlockType(type, {\n level\n })\n }\n }), {});\n }\n\n inputRules({\n type\n }) {\n return this.options.levels.map(level => textblockTypeInputRule(new RegExp(`^(#{1,${level}})\\\\s$`), type, () => ({\n level\n })));\n }\n\n}\n\nclass HorizontalRule extends Node {\n get name() {\n return 'horizontal_rule';\n }\n\n get schema() {\n return {\n group: 'block',\n parseDOM: [{\n tag: 'hr'\n }],\n toDOM: () => ['hr']\n };\n }\n\n commands({\n type\n }) {\n return () => (state, dispatch) => dispatch(state.tr.replaceSelectionWith(type.create()));\n }\n\n inputRules({\n type\n }) {\n return [nodeInputRule(/^(?:---|___\\s|\\*\\*\\*\\s)$/, type)];\n }\n\n}\n\n/**\n * Matches following attributes in Markdown-typed image: [, alt, src, title]\n *\n * Example:\n *  -> [, \"Lorem\", \"image.jpg\"]\n *  -> [, \"\", \"image.jpg\", \"Ipsum\"]\n *  -> [, \"Lorem\", \"image.jpg\", \"Ipsum\"]\n */\n\nconst IMAGE_INPUT_REGEX = /!\\[(.+|:?)]\\((\\S+)(?:(?:\\s+)[\"'](\\S+)[\"'])?\\)/;\nclass Image extends Node {\n get name() {\n return 'image';\n }\n\n get schema() {\n return {\n inline: true,\n attrs: {\n src: {},\n alt: {\n default: null\n },\n title: {\n default: null\n }\n },\n group: 'inline',\n draggable: true,\n parseDOM: [{\n tag: 'img[src]',\n getAttrs: dom => ({\n src: dom.getAttribute('src'),\n title: dom.getAttribute('title'),\n alt: dom.getAttribute('alt')\n })\n }],\n toDOM: node => ['img', node.attrs]\n };\n }\n\n commands({\n type\n }) {\n return attrs => (state, dispatch) => {\n const {\n selection\n } = state;\n const position = selection.$cursor ? selection.$cursor.pos : selection.$to.pos;\n const node = type.create(attrs);\n const transaction = state.tr.insert(position, node);\n dispatch(transaction);\n };\n }\n\n inputRules({\n type\n }) {\n return [nodeInputRule(IMAGE_INPUT_REGEX, type, match => {\n const [, alt, src, title] = match;\n return {\n src,\n alt,\n title\n };\n })];\n }\n\n get plugins() {\n return [new Plugin({\n props: {\n handleDOMEvents: {\n drop(view, event) {\n const hasFiles = event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files.length;\n\n if (!hasFiles) {\n return;\n }\n\n const images = Array.from(event.dataTransfer.files).filter(file => /image/i.test(file.type));\n\n if (images.length === 0) {\n return;\n }\n\n event.preventDefault();\n const {\n schema\n } = view.state;\n const coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY\n });\n images.forEach(image => {\n const reader = new FileReader();\n\n reader.onload = readerEvent => {\n const node = schema.nodes.image.create({\n src: readerEvent.target.result\n });\n const transaction = view.state.tr.insert(coordinates.pos, node);\n view.dispatch(transaction);\n };\n\n reader.readAsDataURL(image);\n });\n }\n\n }\n }\n })];\n }\n\n}\n\nclass ListItem extends Node {\n get name() {\n return 'list_item';\n }\n\n get schema() {\n return {\n content: 'paragraph block*',\n defining: true,\n draggable: false,\n parseDOM: [{\n tag: 'li'\n }],\n toDOM: () => ['li', 0]\n };\n }\n\n keys({\n type\n }) {\n return {\n Enter: splitListItem(type),\n Tab: sinkListItem(type),\n 'Shift-Tab': liftListItem(type)\n };\n }\n\n}\n\nfunction getTextBetween(node, from, to, blockSeparator, inlineSeparator, leafText = '\\0') {\n let text = '';\n let blockSeparated = true;\n let inlineNode = null;\n node.content.nodesBetween(from, to, (innerNode, pos) => {\n if (innerNode.isText) {\n if (inlineNode) {\n inlineNode = null;\n return;\n }\n\n text += innerNode.text.slice(Math.max(from, pos) - pos, to - pos);\n blockSeparated = !blockSeparator;\n } else if (innerNode.isLeaf && leafText) {\n text += leafText;\n blockSeparated = !blockSeparator;\n } else if (innerNode.isInline && !innerNode.isLeaf) {\n text += inlineSeparator;\n\n if (innerNode.textContent) {\n text += innerNode.textContent;\n inlineNode = innerNode;\n }\n\n text += inlineSeparator;\n blockSeparated = !blockSeparated;\n } else if (!blockSeparated && innerNode.isBlock) {\n text += blockSeparator;\n blockSeparated = true;\n }\n }, 0);\n return text;\n} // Create a matcher that matches when a specific character is typed. Useful for @mentions and #tags.\n\n\nfunction triggerCharacter({\n char = '@',\n allowSpaces = false,\n startOfLine = false\n}) {\n return $position => {\n // cancel if top level node\n if ($position.depth <= 0) {\n return false;\n } // Matching expressions used for later\n\n\n const escapedChar = `\\\\${char}`;\n const suffix = new RegExp(`\\\\s${escapedChar}$`);\n const prefix = startOfLine ? '^' : '';\n const regexp = allowSpaces ? new RegExp(`${prefix}${escapedChar}.*?(?=\\\\s${escapedChar}|$)`, 'gm') : new RegExp(`${prefix}(?:^)?${escapedChar}[^\\\\s${escapedChar}]*`, 'gm'); // Lookup the boundaries of the current node\n\n const textFrom = $position.before();\n const textTo = $position.end();\n const text = getTextBetween($position.doc, textFrom, textTo, '\\0', '\\0');\n let match = regexp.exec(text);\n let position;\n\n while (match !== null) {\n // JavaScript doesn't have lookbehinds; this hacks a check that first character is \" \"\n // or the line beginning\n const matchPrefix = match.input.slice(Math.max(0, match.index - 1), match.index);\n\n if (/^[\\s\\0]?$/.test(matchPrefix)) {\n // The absolute position of the match in the document\n const from = match.index + $position.start();\n let to = from + match[0].length; // Edge case handling; if spaces are allowed and we're directly in between\n // two triggers\n\n if (allowSpaces && suffix.test(text.slice(to - 1, to + 1))) {\n match[0] += ' ';\n to += 1;\n } // If the $position is located within the matched substring, return that range\n\n\n if (from < $position.pos && to >= $position.pos) {\n position = {\n range: {\n from,\n to\n },\n query: match[0].slice(char.length),\n text: match[0]\n };\n }\n }\n\n match = regexp.exec(text);\n }\n\n return position;\n };\n}\n\nfunction SuggestionsPlugin({\n matcher = {\n char: '@',\n allowSpaces: false,\n startOfLine: false\n },\n appendText = null,\n suggestionClass = 'suggestion',\n command = () => false,\n items = [],\n onEnter = () => false,\n onChange = () => false,\n onExit = () => false,\n onKeyDown = () => false,\n onFilter = (searchItems, query) => {\n if (!query) {\n return searchItems;\n }\n\n return searchItems.filter(item => JSON.stringify(item).toLowerCase().includes(query.toLowerCase()));\n }\n}) {\n return new Plugin$1({\n key: new PluginKey$1('suggestions'),\n\n view() {\n return {\n update: async (view, prevState) => {\n const prev = this.key.getState(prevState);\n const next = this.key.getState(view.state); // See how the state changed\n\n const moved = prev.active && next.active && prev.range.from !== next.range.from;\n const started = !prev.active && next.active;\n const stopped = prev.active && !next.active;\n const changed = !started && !stopped && prev.query !== next.query;\n const handleStart = started || moved;\n const handleChange = changed && !moved;\n const handleExit = stopped || moved; // Cancel when suggestion isn't active\n\n if (!handleStart && !handleChange && !handleExit) {\n return;\n }\n\n const state = handleExit ? prev : next;\n const decorationNode = document.querySelector(`[data-decoration-id=\"${state.decorationId}\"]`); // build a virtual node for popper.js or tippy.js\n // this can be used for building popups without a DOM node\n\n const virtualNode = decorationNode ? {\n getBoundingClientRect() {\n return decorationNode.getBoundingClientRect();\n },\n\n clientWidth: decorationNode.clientWidth,\n clientHeight: decorationNode.clientHeight\n } : null;\n const props = {\n view,\n range: state.range,\n query: state.query,\n text: state.text,\n decorationNode,\n virtualNode,\n items: handleChange || handleStart ? await onFilter(Array.isArray(items) ? items : await items(), state.query) : [],\n command: ({\n range,\n attrs\n }) => {\n command({\n range,\n attrs,\n schema: view.state.schema\n })(view.state, view.dispatch, view);\n\n if (appendText) {\n insertText(appendText)(view.state, view.dispatch, view);\n }\n }\n }; // Trigger the hooks when necessary\n\n if (handleExit) {\n onExit(props);\n }\n\n if (handleChange) {\n onChange(props);\n }\n\n if (handleStart) {\n onEnter(props);\n }\n }\n };\n },\n\n state: {\n // Initialize the plugin's internal state.\n init() {\n return {\n active: false,\n range: {},\n query: null,\n text: null\n };\n },\n\n // Apply changes to the plugin state from a view transaction.\n apply(tr, prev) {\n const {\n selection\n } = tr;\n const next = { ...prev\n }; // We can only be suggesting if there is no selection\n\n if (selection.from === selection.to) {\n // Reset active state if we just left the previous suggestion range\n if (selection.from < prev.range.from || selection.from > prev.range.to) {\n next.active = false;\n } // Try to match against where our cursor currently is\n\n\n const $position = selection.$from;\n const match = triggerCharacter(matcher)($position);\n const decorationId = (Math.random() + 1).toString(36).substr(2, 5); // If we found a match, update the current state to show it\n\n if (match) {\n next.active = true;\n next.decorationId = prev.decorationId ? prev.decorationId : decorationId;\n next.range = match.range;\n next.query = match.query;\n next.text = match.text;\n } else {\n next.active = false;\n }\n } else {\n next.active = false;\n } // Make sure to empty the range if suggestion is inactive\n\n\n if (!next.active) {\n next.decorationId = null;\n next.range = {};\n next.query = null;\n next.text = null;\n }\n\n return next;\n }\n\n },\n props: {\n // Call the keydown hook if suggestion is active.\n handleKeyDown(view, event) {\n const {\n active,\n range\n } = this.getState(view.state);\n if (!active) return false;\n return onKeyDown({\n view,\n event,\n range\n });\n },\n\n // Setup decorator on the currently active suggestion.\n decorations(editorState) {\n const {\n active,\n range,\n decorationId\n } = this.getState(editorState);\n if (!active) return null;\n return DecorationSet.create(editorState.doc, [Decoration.inline(range.from, range.to, {\n nodeName: 'span',\n class: suggestionClass,\n 'data-decoration-id': decorationId\n })]);\n }\n\n }\n });\n}\n\nclass Mention extends Node {\n get name() {\n return 'mention';\n }\n\n get defaultOptions() {\n return {\n matcher: {\n char: '@',\n allowSpaces: false,\n startOfLine: false\n },\n mentionClass: 'mention',\n suggestionClass: 'mention-suggestion'\n };\n }\n\n getLabel(dom) {\n return dom.innerText.split(this.options.matcher.char).join('');\n }\n\n createFragment(schema, label) {\n return Fragment.fromJSON(schema, [{\n type: 'text',\n text: `${this.options.matcher.char}${label}`\n }]);\n }\n\n insertMention(range, attrs, schema) {\n const nodeType = schema.nodes[this.name];\n const nodeFragment = this.createFragment(schema, attrs.label);\n return replaceText(range, nodeType, attrs, nodeFragment);\n }\n\n get schema() {\n return {\n attrs: {\n id: {},\n label: {}\n },\n group: 'inline',\n inline: true,\n content: 'text*',\n selectable: false,\n atom: true,\n toDOM: node => ['span', {\n class: this.options.mentionClass,\n 'data-mention-id': node.attrs.id\n }, `${this.options.matcher.char}${node.attrs.label}`],\n parseDOM: [{\n tag: 'span[data-mention-id]',\n getAttrs: dom => {\n const id = dom.getAttribute('data-mention-id');\n const label = this.getLabel(dom);\n return {\n id,\n label\n };\n },\n getContent: (dom, schema) => {\n const label = this.getLabel(dom);\n return this.createFragment(schema, label);\n }\n }]\n };\n }\n\n commands({\n schema\n }) {\n return attrs => this.insertMention(null, attrs, schema);\n }\n\n get plugins() {\n return [SuggestionsPlugin({\n command: ({\n range,\n attrs,\n schema\n }) => this.insertMention(range, attrs, schema),\n appendText: ' ',\n matcher: this.options.matcher,\n items: this.options.items,\n onEnter: this.options.onEnter,\n onChange: this.options.onChange,\n onExit: this.options.onExit,\n onKeyDown: this.options.onKeyDown,\n onFilter: this.options.onFilter,\n suggestionClass: this.options.suggestionClass\n })];\n }\n\n}\n\nclass OrderedList extends Node {\n get name() {\n return 'ordered_list';\n }\n\n get schema() {\n return {\n attrs: {\n order: {\n default: 1\n }\n },\n content: 'list_item+',\n group: 'block',\n parseDOM: [{\n tag: 'ol',\n getAttrs: dom => ({\n order: dom.hasAttribute('start') ? +dom.getAttribute('start') : 1\n })\n }],\n toDOM: node => node.attrs.order === 1 ? ['ol', 0] : ['ol', {\n start: node.attrs.order\n }, 0]\n };\n }\n\n commands({\n type,\n schema\n }) {\n return () => toggleList(type, schema.nodes.list_item);\n }\n\n keys({\n type,\n schema\n }) {\n return {\n 'Shift-Ctrl-9': toggleList(type, schema.nodes.list_item)\n };\n }\n\n inputRules({\n type\n }) {\n return [wrappingInputRule(/^(\\d+)\\.\\s$/, type, match => ({\n order: +match[1]\n }), (match, node) => node.childCount + node.attrs.order === +match[1])];\n }\n\n}\n\nvar TableNodes = tableNodes({\n tableGroup: 'block',\n cellContent: 'block+',\n cellAttributes: {\n background: {\n default: null,\n\n getFromDOM(dom) {\n return dom.style.backgroundColor || null;\n },\n\n setDOMAttr(value, attrs) {\n if (value) {\n const style = {\n style: `${attrs.style || ''}background-color: ${value};`\n };\n Object.assign(attrs, style);\n }\n }\n\n }\n }\n});\n\nclass Table extends Node {\n get name() {\n return 'table';\n }\n\n get defaultOptions() {\n return {\n resizable: false\n };\n }\n\n get schema() {\n return TableNodes.table;\n }\n\n commands({\n schema\n }) {\n return {\n createTable: ({\n rowsCount,\n colsCount,\n withHeaderRow\n }) => (state, dispatch) => {\n const offset = state.tr.selection.anchor + 1;\n const nodes = createTable(schema, rowsCount, colsCount, withHeaderRow);\n const tr = state.tr.replaceSelectionWith(nodes).scrollIntoView();\n const resolvedPos = tr.doc.resolve(offset);\n tr.setSelection(TextSelection.near(resolvedPos));\n dispatch(tr);\n },\n addColumnBefore: () => addColumnBefore,\n addColumnAfter: () => addColumnAfter,\n deleteColumn: () => deleteColumn,\n addRowBefore: () => addRowBefore,\n addRowAfter: () => addRowAfter,\n deleteRow: () => deleteRow,\n deleteTable: () => deleteTable,\n toggleCellMerge: () => (state, dispatch) => {\n if (mergeCells(state, dispatch)) {\n return;\n }\n\n splitCell(state, dispatch);\n },\n mergeCells: () => mergeCells,\n splitCell: () => splitCell,\n toggleHeaderColumn: () => toggleHeaderColumn,\n toggleHeaderRow: () => toggleHeaderRow,\n toggleHeaderCell: () => toggleHeaderCell,\n setCellAttr: ({\n name,\n value\n }) => setCellAttr(name, value),\n fixTables: () => fixTables\n };\n }\n\n keys() {\n return {\n Tab: goToNextCell(1),\n 'Shift-Tab': goToNextCell(-1)\n };\n }\n\n get plugins() {\n return [...(this.options.resizable ? [columnResizing()] : []), tableEditing()];\n }\n\n}\n\nclass TableHeader extends Node {\n get name() {\n return 'table_header';\n }\n\n get schema() {\n return TableNodes.table_header;\n }\n\n}\n\nclass TableCell extends Node {\n get name() {\n return 'table_cell';\n }\n\n get schema() {\n return TableNodes.table_cell;\n }\n\n}\n\nclass TableRow extends Node {\n get name() {\n return 'table_row';\n }\n\n get schema() {\n return TableNodes.table_row;\n }\n\n}\n\nclass TodoItem extends Node {\n get name() {\n return 'todo_item';\n }\n\n get defaultOptions() {\n return {\n nested: false\n };\n }\n\n get view() {\n return {\n props: ['node', 'updateAttrs', 'view'],\n methods: {\n onChange() {\n this.updateAttrs({\n done: !this.node.attrs.done\n });\n }\n\n },\n template: `\n <li :data-type=\"node.type.name\" :data-done=\"node.attrs.done.toString()\" data-drag-handle>\n <span class=\"todo-checkbox\" contenteditable=\"false\" @click=\"onChange\"></span>\n <div class=\"todo-content\" ref=\"content\" :contenteditable=\"view.editable.toString()\"></div>\n </li>\n `\n };\n }\n\n get schema() {\n return {\n attrs: {\n done: {\n default: false\n }\n },\n draggable: true,\n content: this.options.nested ? '(paragraph|todo_list)+' : 'paragraph+',\n toDOM: node => {\n const {\n done\n } = node.attrs;\n return ['li', {\n 'data-type': this.name,\n 'data-done': done.toString()\n }, ['span', {\n class: 'todo-checkbox',\n contenteditable: 'false'\n }], ['div', {\n class: 'todo-content'\n }, 0]];\n },\n parseDOM: [{\n priority: 51,\n tag: `[data-type=\"${this.name}\"]`,\n getAttrs: dom => ({\n done: dom.getAttribute('data-done') === 'true'\n })\n }]\n };\n }\n\n keys({\n type\n }) {\n return {\n Enter: splitToDefaultListItem(type),\n Tab: this.options.nested ? sinkListItem(type) : () => {},\n 'Shift-Tab': liftListItem(type)\n };\n }\n\n}\n\nclass TodoList extends Node {\n get name() {\n return 'todo_list';\n }\n\n get schema() {\n return {\n group: 'block',\n content: 'todo_item+',\n toDOM: () => ['ul', {\n 'data-type': this.name\n }, 0],\n parseDOM: [{\n priority: 51,\n tag: `[data-type=\"${this.name}\"]`\n }]\n };\n }\n\n commands({\n type,\n schema\n }) {\n return () => toggleList(type, schema.nodes.todo_item);\n }\n\n inputRules({\n type\n }) {\n return [wrappingInputRule(/^\\s*(\\[ \\])\\s$/, type)];\n }\n\n}\n\nclass Bold extends Mark {\n get name() {\n return 'bold';\n }\n\n get schema() {\n return {\n parseDOM: [{\n tag: 'strong'\n }, {\n tag: 'b',\n getAttrs: node => node.style.fontWeight !== 'normal' && null\n }, {\n style: 'font-weight',\n getAttrs: value => /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null\n }],\n toDOM: () => ['strong', 0]\n };\n }\n\n keys({\n type\n }) {\n return {\n 'Mod-b': toggleMark(type)\n };\n }\n\n commands({\n type\n }) {\n return () => toggleMark(type);\n }\n\n inputRules({\n type\n }) {\n return [markInputRule(/(?:\\*\\*|__)([^*_]+)(?:\\*\\*|__)$/, type)];\n }\n\n pasteRules({\n type\n }) {\n return [markPasteRule(/(?:\\*\\*|__)([^*_]+)(?:\\*\\*|__)/g, type)];\n }\n\n}\n\nclass Code extends Mark {\n get name() {\n return 'code';\n }\n\n get schema() {\n return {\n excludes: '_',\n parseDOM: [{\n tag: 'code'\n }],\n toDOM: () => ['code', 0]\n };\n }\n\n keys({\n type\n }) {\n return {\n 'Mod-`': toggleMark(type)\n };\n }\n\n commands({\n type\n }) {\n return () => toggleMark(type);\n }\n\n inputRules({\n type\n }) {\n return [markInputRule(/(?:`)([^`]+)(?:`)$/, type)];\n }\n\n pasteRules({\n type\n }) {\n return [markPasteRule(/(?:`)([^`]+)(?:`)/g, type)];\n }\n\n}\n\nclass Italic extends Mark {\n get name() {\n return 'italic';\n }\n\n get schema() {\n return {\n parseDOM: [{\n tag: 'i'\n }, {\n tag: 'em'\n }, {\n style: 'font-style=italic'\n }],\n toDOM: () => ['em', 0]\n };\n }\n\n keys({\n type\n }) {\n return {\n 'Mod-i': toggleMark(type)\n };\n }\n\n commands({\n type\n }) {\n return () => toggleMark(type);\n }\n\n inputRules({\n type\n }) {\n return [markInputRule(/(?:^|[^_])(_([^_]+)_)$/, type), markInputRule(/(?:^|[^*])(\\*([^*]+)\\*)$/, type)];\n }\n\n pasteRules({\n type\n }) {\n return [markPasteRule(/_([^_]+)_/g, type), markPasteRule(/\\*([^*]+)\\*/g, type)];\n }\n\n}\n\nclass Link extends Mark {\n get name() {\n return 'link';\n }\n\n get defaultOptions() {\n return {\n openOnClick: true,\n target: null\n };\n }\n\n get schema() {\n return {\n attrs: {\n href: {\n default: null\n },\n target: {\n default: null\n }\n },\n inclusive: false,\n parseDOM: [{\n tag: 'a[href]',\n getAttrs: dom => ({\n href: dom.getAttribute('href'),\n target: dom.getAttribute('target')\n })\n }],\n toDOM: node => ['a', { ...node.attrs,\n rel: 'noopener noreferrer nofollow',\n target: node.attrs.target || this.options.target\n }, 0]\n };\n }\n\n commands({\n type\n }) {\n return attrs => {\n if (attrs.href) {\n return updateMark(type, attrs);\n }\n\n return removeMark(type);\n };\n }\n\n pasteRules({\n type\n }) {\n return [pasteRule(/https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z]{2,}\\b([-a-zA-Z0-9@:%_+.~#?&//=,()!]*)/gi, type, url => ({\n href: url\n }))];\n }\n\n get plugins() {\n if (!this.options.openOnClick) {\n return [];\n }\n\n return [new Plugin({\n props: {\n handleClick: (view, pos, event) => {\n const {\n schema\n } = view.state;\n const attrs = getMarkAttrs(view.state, schema.marks.link);\n\n if (attrs.href && event.target instanceof HTMLAnchorElement) {\n event.stopPropagation();\n window.open(attrs.href, attrs.target);\n }\n }\n }\n })];\n }\n\n}\n\nclass Strike extends Mark {\n get name() {\n return 'strike';\n }\n\n get schema() {\n return {\n parseDOM: [{\n tag: 's'\n }, {\n tag: 'del'\n }, {\n tag: 'strike'\n }, {\n style: 'text-decoration',\n getAttrs: value => value === 'line-through'\n }],\n toDOM: () => ['s', 0]\n };\n }\n\n keys({\n type\n }) {\n return {\n 'Mod-d': toggleMark(type)\n };\n }\n\n commands({\n type\n }) {\n return () => toggleMark(type);\n }\n\n inputRules({\n type\n }) {\n return [markInputRule(/~([^~]+)~$/, type)];\n }\n\n pasteRules({\n type\n }) {\n return [markPasteRule(/~([^~]+)~/g, type)];\n }\n\n}\n\nclass Underline extends Mark {\n get name() {\n return 'underline';\n }\n\n get schema() {\n return {\n parseDOM: [{\n tag: 'u'\n }, {\n style: 'text-decoration',\n getAttrs: value => value === 'underline'\n }],\n toDOM: () => ['u', 0]\n };\n }\n\n keys({\n type\n }) {\n return {\n 'Mod-u': toggleMark(type)\n };\n }\n\n commands({\n type\n }) {\n return () => toggleMark(type);\n }\n\n}\n\nclass Collaboration extends Extension {\n get name() {\n return 'collaboration';\n }\n\n init() {\n this.getSendableSteps = this.debounce(state => {\n const sendable = sendableSteps(state);\n\n if (sendable) {\n this.options.onSendable({\n editor: this.editor,\n sendable: {\n version: sendable.version,\n steps: sendable.steps.map(step => step.toJSON()),\n clientID: sendable.clientID\n }\n });\n }\n }, this.options.debounce);\n this.editor.on('transaction', ({\n state\n }) => {\n this.getSendableSteps(state);\n });\n }\n\n get defaultOptions() {\n return {\n version: 0,\n clientID: Math.floor(Math.random() * 0xFFFFFFFF),\n debounce: 250,\n onSendable: () => {},\n update: ({\n steps,\n version\n }) => {\n const {\n state,\n view,\n schema\n } = this.editor;\n\n if (getVersion(state) > version) {\n return;\n }\n\n view.dispatch(receiveTransaction(state, steps.map(item => Step.fromJSON(schema, item.step)), steps.map(item => item.clientID)));\n }\n };\n }\n\n get plugins() {\n return [collab({\n version: this.options.version,\n clientID: this.options.clientID\n })];\n }\n\n debounce(fn, delay) {\n let timeout;\n return function (...args) {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n fn(...args);\n timeout = null;\n }, delay);\n };\n }\n\n}\n\nclass Focus extends Extension {\n get name() {\n return 'focus';\n }\n\n get defaultOptions() {\n return {\n className: 'has-focus',\n nested: false\n };\n }\n\n get plugins() {\n return [new Plugin({\n props: {\n decorations: ({\n doc,\n plugins,\n selection\n }) => {\n const editablePlugin = plugins.find(plugin => plugin.key.startsWith('editable$'));\n const editable = editablePlugin.props.editable();\n const active = editable && this.options.className;\n const {\n focused\n } = this.editor;\n const {\n anchor\n } = selection;\n const decorations = [];\n\n if (!active || !focused) {\n return false;\n }\n\n doc.descendants((node, pos) => {\n const hasAnchor = anchor >= pos && anchor <= pos + node.nodeSize;\n\n if (hasAnchor && !node.isText) {\n const decoration = Decoration.node(pos, pos + node.nodeSize, {\n class: this.options.className\n });\n decorations.push(decoration);\n }\n\n return this.options.nested;\n });\n return DecorationSet.create(doc, decorations);\n }\n }\n })];\n }\n\n}\n\nclass History extends Extension {\n get name() {\n return 'history';\n }\n\n get defaultOptions() {\n return {\n depth: '',\n newGroupDelay: ''\n };\n }\n\n keys() {\n const keymap = {\n 'Mod-z': undo,\n 'Mod-y': redo,\n 'Shift-Mod-z': redo,\n // Russian language\n 'Mod-Ñ': undo,\n 'Shift-Mod-Ñ': redo\n };\n return keymap;\n }\n\n get plugins() {\n return [history({\n depth: this.options.depth,\n newGroupDelay: this.options.newGroupDelay\n })];\n }\n\n commands() {\n return {\n undo: () => undo,\n redo: () => redo,\n undoDepth: () => undoDepth,\n redoDepth: () => redoDepth\n };\n }\n\n}\n\nclass Placeholder extends Extension {\n get name() {\n return 'placeholder';\n }\n\n get defaultOptions() {\n return {\n emptyEditorClass: 'is-editor-empty',\n emptyNodeClass: 'is-empty',\n emptyNodeText: 'Write something …',\n showOnlyWhenEditable: true,\n showOnlyCurrent: true\n };\n }\n\n get plugins() {\n return [new Plugin({\n props: {\n decorations: ({\n doc,\n plugins,\n selection\n }) => {\n const editablePlugin = plugins.find(plugin => plugin.key.startsWith('editable$'));\n const editable = editablePlugin.props.editable();\n const active = editable || !this.options.showOnlyWhenEditable;\n const {\n anchor\n } = selection;\n const decorations = [];\n const isEditorEmpty = doc.textContent.length === 0;\n\n if (!active) {\n return false;\n }\n\n doc.descendants((node, pos) => {\n const hasAnchor = anchor >= pos && anchor <= pos + node.nodeSize;\n const isNodeEmpty = node.content.size === 0;\n\n if ((hasAnchor || !this.options.showOnlyCurrent) && isNodeEmpty) {\n const classes = [this.options.emptyNodeClass];\n\n if (isEditorEmpty) {\n classes.push(this.options.emptyEditorClass);\n }\n\n const decoration = Decoration.node(pos, pos + node.nodeSize, {\n class: classes.join(' '),\n 'data-empty-text': typeof this.options.emptyNodeText === 'function' ? this.options.emptyNodeText(node) : this.options.emptyNodeText\n });\n decorations.push(decoration);\n }\n\n return false;\n });\n return DecorationSet.create(doc, decorations);\n }\n }\n })];\n }\n\n}\n\nclass Search extends Extension {\n constructor(options = {}) {\n super(options);\n this.results = [];\n this.searchTerm = null;\n this._updating = false;\n }\n\n get name() {\n return 'search';\n }\n\n get defaultOptions() {\n return {\n autoSelectNext: true,\n findClass: 'find',\n searching: false,\n caseSensitive: false,\n disableRegex: true,\n alwaysSearch: false\n };\n }\n\n commands() {\n return {\n find: attrs => this.find(attrs),\n replace: attrs => this.replace(attrs),\n replaceAll: attrs => this.replaceAll(attrs),\n clearSearch: () => this.clear()\n };\n }\n\n get findRegExp() {\n return RegExp(this.searchTerm, !this.options.caseSensitive ? 'gui' : 'gu');\n }\n\n get decorations() {\n return this.results.map(deco => Decoration.inline(deco.from, deco.to, {\n class: this.options.findClass\n }));\n }\n\n _search(doc) {\n this.results = [];\n const mergedTextNodes = [];\n let index = 0;\n\n if (!this.searchTerm) {\n return;\n }\n\n doc.descendants((node, pos) => {\n if (node.isText) {\n if (mergedTextNodes[index]) {\n mergedTextNodes[index] = {\n text: mergedTextNodes[index].text + node.text,\n pos: mergedTextNodes[index].pos\n };\n } else {\n mergedTextNodes[index] = {\n text: node.text,\n pos\n };\n }\n } else {\n index += 1;\n }\n });\n mergedTextNodes.forEach(({\n text,\n pos\n }) => {\n const search = this.findRegExp;\n let m; // eslint-disable-next-line no-cond-assign\n\n while (m = search.exec(text)) {\n if (m[0] === '') {\n break;\n }\n\n this.results.push({\n from: pos + m.index,\n to: pos + m.index + m[0].length\n });\n }\n });\n }\n\n replace(replace) {\n return (state, dispatch) => {\n const firstResult = this.results[0];\n\n if (!firstResult) {\n return;\n }\n\n const {\n from,\n to\n } = this.results[0];\n dispatch(state.tr.insertText(replace, from, to));\n this.editor.commands.find(this.searchTerm);\n };\n }\n\n rebaseNextResult(replace, index, lastOffset = 0) {\n const nextIndex = index + 1;\n\n if (!this.results[nextIndex]) {\n return null;\n }\n\n const {\n from: currentFrom,\n to: currentTo\n } = this.results[index];\n const offset = currentTo - currentFrom - replace.length + lastOffset;\n const {\n from,\n to\n } = this.results[nextIndex];\n this.results[nextIndex] = {\n to: to - offset,\n from: from - offset\n };\n return offset;\n }\n\n replaceAll(replace) {\n return ({\n tr\n }, dispatch) => {\n let offset;\n\n if (!this.results.length) {\n return;\n }\n\n this.results.forEach(({\n from,\n to\n }, index) => {\n tr.insertText(replace, from, to);\n offset = this.rebaseNextResult(replace, index, offset);\n });\n dispatch(tr);\n this.editor.commands.find(this.searchTerm);\n };\n }\n\n find(searchTerm) {\n return (state, dispatch) => {\n this.searchTerm = this.options.disableRegex ? searchTerm.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') : searchTerm;\n this.updateView(state, dispatch);\n };\n }\n\n clear() {\n return (state, dispatch) => {\n this.searchTerm = null;\n this.updateView(state, dispatch);\n };\n }\n\n updateView({\n tr\n }, dispatch) {\n this._updating = true;\n dispatch(tr);\n this._updating = false;\n }\n\n createDeco(doc) {\n this._search(doc);\n\n return this.decorations ? DecorationSet.create(doc, this.decorations) : [];\n }\n\n get plugins() {\n return [new Plugin({\n state: {\n init() {\n return DecorationSet.empty;\n },\n\n apply: (tr, old) => {\n if (this._updating || this.options.searching || tr.docChanged && this.options.alwaysSearch) {\n return this.createDeco(tr.doc);\n }\n\n if (tr.docChanged) {\n return old.map(tr.mapping, tr.doc);\n }\n\n return old;\n }\n },\n props: {\n decorations(state) {\n return this.getState(state);\n }\n\n }\n })];\n }\n\n}\n\nclass TrailingNode extends Extension {\n get name() {\n return 'trailing_node';\n }\n\n get defaultOptions() {\n return {\n node: 'paragraph',\n notAfter: ['paragraph']\n };\n }\n\n get plugins() {\n const plugin = new PluginKey(this.name);\n const disabledNodes = Object.entries(this.editor.schema.nodes).map(([, value]) => value).filter(node => this.options.notAfter.includes(node.name));\n return [new Plugin({\n key: plugin,\n view: () => ({\n update: view => {\n const {\n state\n } = view;\n const insertNodeAtEnd = plugin.getState(state);\n\n if (!insertNodeAtEnd) {\n return;\n }\n\n const {\n doc,\n schema,\n tr\n } = state;\n const type = schema.nodes[this.options.node];\n const transaction = tr.insert(doc.content.size, type.create());\n view.dispatch(transaction);\n }\n }),\n state: {\n init: (_, state) => {\n const lastNode = state.tr.doc.lastChild;\n return !nodeEqualsType({\n node: lastNode,\n types: disabledNodes\n });\n },\n apply: (tr, value) => {\n if (!tr.docChanged) {\n return value;\n }\n\n const lastNode = tr.doc.lastChild;\n return !nodeEqualsType({\n node: lastNode,\n types: disabledNodes\n });\n }\n }\n })];\n }\n\n}\n\nexport { Blockquote, Bold, BulletList, Code, CodeBlock, CodeBlockHighlight, Collaboration, Focus, HardBreak, Heading, HighlightPlugin as Highlight, History, HorizontalRule, Image, Italic, Link, ListItem, Mention, OrderedList, Placeholder, Search, Strike, SuggestionsPlugin as Suggestions, Table, TableCell, TableHeader, TableRow, TodoItem, TodoList, TrailingNode, Underline };\n"],"sourceRoot":""}