{"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) -> [, \"Lorem\", \"image.jpg\"]\n * ![](image.jpg \"Ipsum\") -> [, \"\", \"image.jpg\", \"Ipsum\"]\n * ![Lorem](image.jpg \"Ipsum\") -> [, \"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":""}