{"version":3,"file":"static/chunks/4ad82c5e-0b1fd3d6892f5c79.js","mappings":"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","sources":["webpack://_N_E/./node_modules/@codemirror/view/dist/index.js"],"sourcesContent":["import { MapMode, Text as Text$1, Facet, StateEffect, ChangeSet, EditorSelection, EditorState, CharCategory, Transaction, Prec, combineConfig, StateField } from '@codemirror/state';\nimport { StyleModule } from 'style-mod';\nimport { RangeSet, RangeValue, RangeSetBuilder } from '@codemirror/rangeset';\nexport { Range } from '@codemirror/rangeset';\nimport { Text, findClusterBreak, findColumn, codePointAt, countColumn } from '@codemirror/text';\nimport { keyName, base } from 'w3c-keyname';\n\nfunction getSelection(root) {\n let target;\n // Browsers differ on whether shadow roots have a getSelection\n // method. If it exists, use that, otherwise, call it on the\n // document.\n if (root.nodeType == 11) { // Shadow root\n target = root.getSelection ? root : root.ownerDocument;\n }\n else {\n target = root;\n }\n return target.getSelection();\n}\nfunction contains(dom, node) {\n return node ? dom == node || dom.contains(node.nodeType != 1 ? node.parentNode : node) : false;\n}\nfunction deepActiveElement() {\n let elt = document.activeElement;\n while (elt && elt.shadowRoot)\n elt = elt.shadowRoot.activeElement;\n return elt;\n}\nfunction hasSelection(dom, selection) {\n if (!selection.anchorNode)\n return false;\n try {\n // Firefox will raise 'permission denied' errors when accessing\n // properties of `sel.anchorNode` when it's in a generated CSS\n // element.\n return contains(dom, selection.anchorNode);\n }\n catch (_) {\n return false;\n }\n}\nfunction clientRectsFor(dom) {\n if (dom.nodeType == 3)\n return textRange(dom, 0, dom.nodeValue.length).getClientRects();\n else if (dom.nodeType == 1)\n return dom.getClientRects();\n else\n return [];\n}\n// Scans forward and backward through DOM positions equivalent to the\n// given one to see if the two are in the same place (i.e. after a\n// text node vs at the end of that text node)\nfunction isEquivalentPosition(node, off, targetNode, targetOff) {\n return targetNode ? (scanFor(node, off, targetNode, targetOff, -1) ||\n scanFor(node, off, targetNode, targetOff, 1)) : false;\n}\nfunction domIndex(node) {\n for (var index = 0;; index++) {\n node = node.previousSibling;\n if (!node)\n return index;\n }\n}\nfunction scanFor(node, off, targetNode, targetOff, dir) {\n for (;;) {\n if (node == targetNode && off == targetOff)\n return true;\n if (off == (dir < 0 ? 0 : maxOffset(node))) {\n if (node.nodeName == \"DIV\")\n return false;\n let parent = node.parentNode;\n if (!parent || parent.nodeType != 1)\n return false;\n off = domIndex(node) + (dir < 0 ? 0 : 1);\n node = parent;\n }\n else if (node.nodeType == 1) {\n node = node.childNodes[off + (dir < 0 ? -1 : 0)];\n if (node.nodeType == 1 && node.contentEditable == \"false\")\n return false;\n off = dir < 0 ? maxOffset(node) : 0;\n }\n else {\n return false;\n }\n }\n}\nfunction maxOffset(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nconst Rect0 = { left: 0, right: 0, top: 0, bottom: 0 };\nfunction flattenRect(rect, left) {\n let x = left ? rect.left : rect.right;\n return { left: x, right: x, top: rect.top, bottom: rect.bottom };\n}\nfunction windowRect(win) {\n return { left: 0, right: win.innerWidth,\n top: 0, bottom: win.innerHeight };\n}\nfunction scrollRectIntoView(dom, rect, side, x, y, xMargin, yMargin, ltr) {\n let doc = dom.ownerDocument, win = doc.defaultView;\n for (let cur = dom; cur;) {\n if (cur.nodeType == 1) { // Element\n let bounding, top = cur == doc.body;\n if (top) {\n bounding = windowRect(win);\n }\n else {\n if (cur.scrollHeight <= cur.clientHeight && cur.scrollWidth <= cur.clientWidth) {\n cur = cur.parentNode;\n continue;\n }\n let rect = cur.getBoundingClientRect();\n // Make sure scrollbar width isn't included in the rectangle\n bounding = { left: rect.left, right: rect.left + cur.clientWidth,\n top: rect.top, bottom: rect.top + cur.clientHeight };\n }\n let moveX = 0, moveY = 0;\n if (y == \"nearest\") {\n if (rect.top < bounding.top) {\n moveY = -(bounding.top - rect.top + yMargin);\n if (side > 0 && rect.bottom > bounding.bottom + moveY)\n moveY = rect.bottom - bounding.bottom + moveY + yMargin;\n }\n else if (rect.bottom > bounding.bottom) {\n moveY = rect.bottom - bounding.bottom + yMargin;\n if (side < 0 && (rect.top - moveY) < bounding.top)\n moveY = -(bounding.top + moveY - rect.top + yMargin);\n }\n }\n else {\n let rectHeight = rect.bottom - rect.top, boundingHeight = bounding.bottom - bounding.top;\n let targetTop = y == \"center\" && rectHeight <= boundingHeight ? rect.top + rectHeight / 2 - boundingHeight / 2 :\n y == \"start\" || y == \"center\" && side < 0 ? rect.top - yMargin :\n rect.bottom - boundingHeight + yMargin;\n moveY = targetTop - bounding.top;\n }\n if (x == \"nearest\") {\n if (rect.left < bounding.left) {\n moveX = -(bounding.left - rect.left + xMargin);\n if (side > 0 && rect.right > bounding.right + moveX)\n moveX = rect.right - bounding.right + moveX + xMargin;\n }\n else if (rect.right > bounding.right) {\n moveX = rect.right - bounding.right + xMargin;\n if (side < 0 && rect.left < bounding.left + moveX)\n moveX = -(bounding.left + moveX - rect.left + xMargin);\n }\n }\n else {\n let targetLeft = x == \"center\" ? rect.left + (rect.right - rect.left) / 2 - (bounding.right - bounding.left) / 2 :\n (x == \"start\") == ltr ? rect.left - xMargin :\n rect.right - (bounding.right - bounding.left) + xMargin;\n moveX = targetLeft - bounding.left;\n }\n if (moveX || moveY) {\n if (top) {\n win.scrollBy(moveX, moveY);\n }\n else {\n if (moveY) {\n let start = cur.scrollTop;\n cur.scrollTop += moveY;\n moveY = cur.scrollTop - start;\n }\n if (moveX) {\n let start = cur.scrollLeft;\n cur.scrollLeft += moveX;\n moveX = cur.scrollLeft - start;\n }\n rect = { left: rect.left - moveX, top: rect.top - moveY,\n right: rect.right - moveX, bottom: rect.bottom - moveY };\n }\n }\n if (top)\n break;\n cur = cur.assignedSlot || cur.parentNode;\n x = y = \"nearest\";\n }\n else if (cur.nodeType == 11) { // A shadow root\n cur = cur.host;\n }\n else {\n break;\n }\n }\n}\nclass DOMSelectionState {\n constructor() {\n this.anchorNode = null;\n this.anchorOffset = 0;\n this.focusNode = null;\n this.focusOffset = 0;\n }\n eq(domSel) {\n return this.anchorNode == domSel.anchorNode && this.anchorOffset == domSel.anchorOffset &&\n this.focusNode == domSel.focusNode && this.focusOffset == domSel.focusOffset;\n }\n setRange(range) {\n this.set(range.anchorNode, range.anchorOffset, range.focusNode, range.focusOffset);\n }\n set(anchorNode, anchorOffset, focusNode, focusOffset) {\n this.anchorNode = anchorNode;\n this.anchorOffset = anchorOffset;\n this.focusNode = focusNode;\n this.focusOffset = focusOffset;\n }\n}\nlet preventScrollSupported = null;\n// Feature-detects support for .focus({preventScroll: true}), and uses\n// a fallback kludge when not supported.\nfunction focusPreventScroll(dom) {\n if (dom.setActive)\n return dom.setActive(); // in IE\n if (preventScrollSupported)\n return dom.focus(preventScrollSupported);\n let stack = [];\n for (let cur = dom; cur; cur = cur.parentNode) {\n stack.push(cur, cur.scrollTop, cur.scrollLeft);\n if (cur == cur.ownerDocument)\n break;\n }\n dom.focus(preventScrollSupported == null ? {\n get preventScroll() {\n preventScrollSupported = { preventScroll: true };\n return true;\n }\n } : undefined);\n if (!preventScrollSupported) {\n preventScrollSupported = false;\n for (let i = 0; i < stack.length;) {\n let elt = stack[i++], top = stack[i++], left = stack[i++];\n if (elt.scrollTop != top)\n elt.scrollTop = top;\n if (elt.scrollLeft != left)\n elt.scrollLeft = left;\n }\n }\n}\nlet scratchRange;\nfunction textRange(node, from, to = from) {\n let range = scratchRange || (scratchRange = document.createRange());\n range.setEnd(node, to);\n range.setStart(node, from);\n return range;\n}\nfunction dispatchKey(elt, name, code) {\n let options = { key: name, code: name, keyCode: code, which: code, cancelable: true };\n let down = new KeyboardEvent(\"keydown\", options);\n down.synthetic = true;\n elt.dispatchEvent(down);\n let up = new KeyboardEvent(\"keyup\", options);\n up.synthetic = true;\n elt.dispatchEvent(up);\n return down.defaultPrevented || up.defaultPrevented;\n}\nfunction getRoot(node) {\n while (node) {\n if (node && (node.nodeType == 9 || node.nodeType == 11 && node.host))\n return node;\n node = node.assignedSlot || node.parentNode;\n }\n return null;\n}\nfunction clearAttributes(node) {\n while (node.attributes.length)\n node.removeAttributeNode(node.attributes[0]);\n}\n\nclass DOMPos {\n constructor(node, offset, precise = true) {\n this.node = node;\n this.offset = offset;\n this.precise = precise;\n }\n static before(dom, precise) { return new DOMPos(dom.parentNode, domIndex(dom), precise); }\n static after(dom, precise) { return new DOMPos(dom.parentNode, domIndex(dom) + 1, precise); }\n}\nconst noChildren = [];\nclass ContentView {\n constructor() {\n this.parent = null;\n this.dom = null;\n this.dirty = 2 /* Node */;\n }\n get editorView() {\n if (!this.parent)\n throw new Error(\"Accessing view in orphan content view\");\n return this.parent.editorView;\n }\n get overrideDOMText() { return null; }\n get posAtStart() {\n return this.parent ? this.parent.posBefore(this) : 0;\n }\n get posAtEnd() {\n return this.posAtStart + this.length;\n }\n posBefore(view) {\n let pos = this.posAtStart;\n for (let child of this.children) {\n if (child == view)\n return pos;\n pos += child.length + child.breakAfter;\n }\n throw new RangeError(\"Invalid child in posBefore\");\n }\n posAfter(view) {\n return this.posBefore(view) + view.length;\n }\n // Will return a rectangle directly before (when side < 0), after\n // (side > 0) or directly on (when the browser supports it) the\n // given position.\n coordsAt(_pos, _side) { return null; }\n sync(track) {\n if (this.dirty & 2 /* Node */) {\n let parent = this.dom;\n let prev = null, next;\n for (let child of this.children) {\n if (child.dirty) {\n if (!child.dom && (next = prev ? prev.nextSibling : parent.firstChild)) {\n let contentView = ContentView.get(next);\n if (!contentView || !contentView.parent && contentView.constructor == child.constructor)\n child.reuseDOM(next);\n }\n child.sync(track);\n child.dirty = 0 /* Not */;\n }\n next = prev ? prev.nextSibling : parent.firstChild;\n if (track && !track.written && track.node == parent && next != child.dom)\n track.written = true;\n if (child.dom.parentNode == parent) {\n while (next && next != child.dom)\n next = rm(next);\n }\n else {\n parent.insertBefore(child.dom, next);\n }\n prev = child.dom;\n }\n next = prev ? prev.nextSibling : parent.firstChild;\n if (next && track && track.node == parent)\n track.written = true;\n while (next)\n next = rm(next);\n }\n else if (this.dirty & 1 /* Child */) {\n for (let child of this.children)\n if (child.dirty) {\n child.sync(track);\n child.dirty = 0 /* Not */;\n }\n }\n }\n reuseDOM(_dom) { }\n localPosFromDOM(node, offset) {\n let after;\n if (node == this.dom) {\n after = this.dom.childNodes[offset];\n }\n else {\n let bias = maxOffset(node) == 0 ? 0 : offset == 0 ? -1 : 1;\n for (;;) {\n let parent = node.parentNode;\n if (parent == this.dom)\n break;\n if (bias == 0 && parent.firstChild != parent.lastChild) {\n if (node == parent.firstChild)\n bias = -1;\n else\n bias = 1;\n }\n node = parent;\n }\n if (bias < 0)\n after = node;\n else\n after = node.nextSibling;\n }\n if (after == this.dom.firstChild)\n return 0;\n while (after && !ContentView.get(after))\n after = after.nextSibling;\n if (!after)\n return this.length;\n for (let i = 0, pos = 0;; i++) {\n let child = this.children[i];\n if (child.dom == after)\n return pos;\n pos += child.length + child.breakAfter;\n }\n }\n domBoundsAround(from, to, offset = 0) {\n let fromI = -1, fromStart = -1, toI = -1, toEnd = -1;\n for (let i = 0, pos = offset, prevEnd = offset; i < this.children.length; i++) {\n let child = this.children[i], end = pos + child.length;\n if (pos < from && end > to)\n return child.domBoundsAround(from, to, pos);\n if (end >= from && fromI == -1) {\n fromI = i;\n fromStart = pos;\n }\n if (pos > to && child.dom.parentNode == this.dom) {\n toI = i;\n toEnd = prevEnd;\n break;\n }\n prevEnd = end;\n pos = end + child.breakAfter;\n }\n return { from: fromStart, to: toEnd < 0 ? offset + this.length : toEnd,\n startDOM: (fromI ? this.children[fromI - 1].dom.nextSibling : null) || this.dom.firstChild,\n endDOM: toI < this.children.length && toI >= 0 ? this.children[toI].dom : null };\n }\n markDirty(andParent = false) {\n this.dirty |= 2 /* Node */;\n this.markParentsDirty(andParent);\n }\n markParentsDirty(childList) {\n for (let parent = this.parent; parent; parent = parent.parent) {\n if (childList)\n parent.dirty |= 2 /* Node */;\n if (parent.dirty & 1 /* Child */)\n return;\n parent.dirty |= 1 /* Child */;\n childList = false;\n }\n }\n setParent(parent) {\n if (this.parent != parent) {\n this.parent = parent;\n if (this.dirty)\n this.markParentsDirty(true);\n }\n }\n setDOM(dom) {\n if (this.dom)\n this.dom.cmView = null;\n this.dom = dom;\n dom.cmView = this;\n }\n get rootView() {\n for (let v = this;;) {\n let parent = v.parent;\n if (!parent)\n return v;\n v = parent;\n }\n }\n replaceChildren(from, to, children = noChildren) {\n this.markDirty();\n for (let i = from; i < to; i++) {\n let child = this.children[i];\n if (child.parent == this)\n child.destroy();\n }\n this.children.splice(from, to - from, ...children);\n for (let i = 0; i < children.length; i++)\n children[i].setParent(this);\n }\n ignoreMutation(_rec) { return false; }\n ignoreEvent(_event) { return false; }\n childCursor(pos = this.length) {\n return new ChildCursor(this.children, pos, this.children.length);\n }\n childPos(pos, bias = 1) {\n return this.childCursor().findPos(pos, bias);\n }\n toString() {\n let name = this.constructor.name.replace(\"View\", \"\");\n return name + (this.children.length ? \"(\" + this.children.join() + \")\" :\n this.length ? \"[\" + (name == \"Text\" ? this.text : this.length) + \"]\" : \"\") +\n (this.breakAfter ? \"#\" : \"\");\n }\n static get(node) { return node.cmView; }\n get isEditable() { return true; }\n merge(from, to, source, hasStart, openStart, openEnd) {\n return false;\n }\n become(other) { return false; }\n // When this is a zero-length view with a side, this should return a\n // number <= 0 to indicate it is before its position, or a\n // number > 0 when after its position.\n getSide() { return 0; }\n destroy() {\n this.parent = null;\n }\n}\nContentView.prototype.breakAfter = 0;\n// Remove a DOM node and return its next sibling.\nfunction rm(dom) {\n let next = dom.nextSibling;\n dom.parentNode.removeChild(dom);\n return next;\n}\nclass ChildCursor {\n constructor(children, pos, i) {\n this.children = children;\n this.pos = pos;\n this.i = i;\n this.off = 0;\n }\n findPos(pos, bias = 1) {\n for (;;) {\n if (pos > this.pos || pos == this.pos &&\n (bias > 0 || this.i == 0 || this.children[this.i - 1].breakAfter)) {\n this.off = pos - this.pos;\n return this;\n }\n let next = this.children[--this.i];\n this.pos -= next.length + next.breakAfter;\n }\n }\n}\nfunction replaceRange(parent, fromI, fromOff, toI, toOff, insert, breakAtStart, openStart, openEnd) {\n let { children } = parent;\n let before = children.length ? children[fromI] : null;\n let last = insert.length ? insert[insert.length - 1] : null;\n let breakAtEnd = last ? last.breakAfter : breakAtStart;\n // Change within a single child\n if (fromI == toI && before && !breakAtStart && !breakAtEnd && insert.length < 2 &&\n before.merge(fromOff, toOff, insert.length ? last : null, fromOff == 0, openStart, openEnd))\n return;\n if (toI < children.length) {\n let after = children[toI];\n // Make sure the end of the child after the update is preserved in `after`\n if (after && toOff < after.length) {\n // If we're splitting a child, separate part of it to avoid that\n // being mangled when updating the child before the update.\n if (fromI == toI) {\n after = after.split(toOff);\n toOff = 0;\n }\n // If the element after the replacement should be merged with\n // the last replacing element, update `content`\n if (!breakAtEnd && last && after.merge(0, toOff, last, true, 0, openEnd)) {\n insert[insert.length - 1] = after;\n }\n else {\n // Remove the start of the after element, if necessary, and\n // add it to `content`.\n if (toOff)\n after.merge(0, toOff, null, false, 0, openEnd);\n insert.push(after);\n }\n }\n else if (after === null || after === void 0 ? void 0 : after.breakAfter) {\n // The element at `toI` is entirely covered by this range.\n // Preserve its line break, if any.\n if (last)\n last.breakAfter = 1;\n else\n breakAtStart = 1;\n }\n // Since we've handled the next element from the current elements\n // now, make sure `toI` points after that.\n toI++;\n }\n if (before) {\n before.breakAfter = breakAtStart;\n if (fromOff > 0) {\n if (!breakAtStart && insert.length && before.merge(fromOff, before.length, insert[0], false, openStart, 0)) {\n before.breakAfter = insert.shift().breakAfter;\n }\n else if (fromOff < before.length || before.children.length && before.children[before.children.length - 1].length == 0) {\n before.merge(fromOff, before.length, null, false, openStart, 0);\n }\n fromI++;\n }\n }\n // Try to merge widgets on the boundaries of the replacement\n while (fromI < toI && insert.length) {\n if (children[toI - 1].become(insert[insert.length - 1])) {\n toI--;\n insert.pop();\n openEnd = insert.length ? 0 : openStart;\n }\n else if (children[fromI].become(insert[0])) {\n fromI++;\n insert.shift();\n openStart = insert.length ? 0 : openEnd;\n }\n else {\n break;\n }\n }\n if (!insert.length && fromI && toI < children.length && !children[fromI - 1].breakAfter &&\n children[toI].merge(0, 0, children[fromI - 1], false, openStart, openEnd))\n fromI--;\n if (fromI < toI || insert.length)\n parent.replaceChildren(fromI, toI, insert);\n}\nfunction mergeChildrenInto(parent, from, to, insert, openStart, openEnd) {\n let cur = parent.childCursor();\n let { i: toI, off: toOff } = cur.findPos(to, 1);\n let { i: fromI, off: fromOff } = cur.findPos(from, -1);\n let dLen = from - to;\n for (let view of insert)\n dLen += view.length;\n parent.length += dLen;\n replaceRange(parent, fromI, fromOff, toI, toOff, insert, 0, openStart, openEnd);\n}\n\nlet nav = typeof navigator != \"undefined\" ? navigator : { userAgent: \"\", vendor: \"\", platform: \"\" };\nlet doc = typeof document != \"undefined\" ? document : { documentElement: { style: {} } };\nconst ie_edge = /*@__PURE__*//Edge\\/(\\d+)/.exec(nav.userAgent);\nconst ie_upto10 = /*@__PURE__*//MSIE \\d/.test(nav.userAgent);\nconst ie_11up = /*@__PURE__*//Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(nav.userAgent);\nconst ie = !!(ie_upto10 || ie_11up || ie_edge);\nconst gecko = !ie && /*@__PURE__*//gecko\\/(\\d+)/i.test(nav.userAgent);\nconst chrome = !ie && /*@__PURE__*//Chrome\\/(\\d+)/.exec(nav.userAgent);\nconst webkit = \"webkitFontSmoothing\" in doc.documentElement.style;\nconst safari = !ie && /*@__PURE__*//Apple Computer/.test(nav.vendor);\nconst ios = safari && (/*@__PURE__*//Mobile\\/\\w+/.test(nav.userAgent) || nav.maxTouchPoints > 2);\nvar browser = {\n mac: ios || /*@__PURE__*//Mac/.test(nav.platform),\n windows: /*@__PURE__*//Win/.test(nav.platform),\n linux: /*@__PURE__*//Linux|X11/.test(nav.platform),\n ie,\n ie_version: ie_upto10 ? doc.documentMode || 6 : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : 0,\n gecko,\n gecko_version: gecko ? +(/*@__PURE__*//Firefox\\/(\\d+)/.exec(nav.userAgent) || [0, 0])[1] : 0,\n chrome: !!chrome,\n chrome_version: chrome ? +chrome[1] : 0,\n ios,\n android: /*@__PURE__*//Android\\b/.test(nav.userAgent),\n webkit,\n safari,\n webkit_version: webkit ? +(/*@__PURE__*//\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1] : 0,\n tabSize: doc.documentElement.style.tabSize != null ? \"tab-size\" : \"-moz-tab-size\"\n};\n\nconst MaxJoinLen = 256;\nclass TextView extends ContentView {\n constructor(text) {\n super();\n this.text = text;\n }\n get length() { return this.text.length; }\n createDOM(textDOM) {\n this.setDOM(textDOM || document.createTextNode(this.text));\n }\n sync(track) {\n if (!this.dom)\n this.createDOM();\n if (this.dom.nodeValue != this.text) {\n if (track && track.node == this.dom)\n track.written = true;\n this.dom.nodeValue = this.text;\n }\n }\n reuseDOM(dom) {\n if (dom.nodeType == 3)\n this.createDOM(dom);\n }\n merge(from, to, source) {\n if (source && (!(source instanceof TextView) || this.length - (to - from) + source.length > MaxJoinLen))\n return false;\n this.text = this.text.slice(0, from) + (source ? source.text : \"\") + this.text.slice(to);\n this.markDirty();\n return true;\n }\n split(from) {\n let result = new TextView(this.text.slice(from));\n this.text = this.text.slice(0, from);\n this.markDirty();\n return result;\n }\n localPosFromDOM(node, offset) {\n return node == this.dom ? offset : offset ? this.text.length : 0;\n }\n domAtPos(pos) { return new DOMPos(this.dom, pos); }\n domBoundsAround(_from, _to, offset) {\n return { from: offset, to: offset + this.length, startDOM: this.dom, endDOM: this.dom.nextSibling };\n }\n coordsAt(pos, side) {\n return textCoords(this.dom, pos, side);\n }\n}\nclass MarkView extends ContentView {\n constructor(mark, children = [], length = 0) {\n super();\n this.mark = mark;\n this.children = children;\n this.length = length;\n for (let ch of children)\n ch.setParent(this);\n }\n setAttrs(dom) {\n clearAttributes(dom);\n if (this.mark.class)\n dom.className = this.mark.class;\n if (this.mark.attrs)\n for (let name in this.mark.attrs)\n dom.setAttribute(name, this.mark.attrs[name]);\n return dom;\n }\n reuseDOM(node) {\n if (node.nodeName == this.mark.tagName.toUpperCase()) {\n this.setDOM(node);\n this.dirty |= 4 /* Attrs */ | 2 /* Node */;\n }\n }\n sync(track) {\n if (!this.dom)\n this.setDOM(this.setAttrs(document.createElement(this.mark.tagName)));\n else if (this.dirty & 4 /* Attrs */)\n this.setAttrs(this.dom);\n super.sync(track);\n }\n merge(from, to, source, _hasStart, openStart, openEnd) {\n if (source && (!(source instanceof MarkView && source.mark.eq(this.mark)) ||\n (from && openStart <= 0) || (to < this.length && openEnd <= 0)))\n return false;\n mergeChildrenInto(this, from, to, source ? source.children : [], openStart - 1, openEnd - 1);\n this.markDirty();\n return true;\n }\n split(from) {\n let result = [], off = 0, detachFrom = -1, i = 0;\n for (let elt of this.children) {\n let end = off + elt.length;\n if (end > from)\n result.push(off < from ? elt.split(from - off) : elt);\n if (detachFrom < 0 && off >= from)\n detachFrom = i;\n off = end;\n i++;\n }\n let length = this.length - from;\n this.length = from;\n if (detachFrom > -1) {\n this.children.length = detachFrom;\n this.markDirty();\n }\n return new MarkView(this.mark, result, length);\n }\n domAtPos(pos) {\n return inlineDOMAtPos(this.dom, this.children, pos);\n }\n coordsAt(pos, side) {\n return coordsInChildren(this, pos, side);\n }\n}\nfunction textCoords(text, pos, side) {\n let length = text.nodeValue.length;\n if (pos > length)\n pos = length;\n let from = pos, to = pos, flatten = 0;\n if (pos == 0 && side < 0 || pos == length && side >= 0) {\n if (!(browser.chrome || browser.gecko)) { // These browsers reliably return valid rectangles for empty ranges\n if (pos) {\n from--;\n flatten = 1;\n } // FIXME this is wrong in RTL text\n else {\n to++;\n flatten = -1;\n }\n }\n }\n else {\n if (side < 0)\n from--;\n else\n to++;\n }\n let rects = textRange(text, from, to).getClientRects();\n if (!rects.length)\n return Rect0;\n let rect = rects[(flatten ? flatten < 0 : side >= 0) ? 0 : rects.length - 1];\n if (browser.safari && !flatten && rect.width == 0)\n rect = Array.prototype.find.call(rects, r => r.width) || rect;\n return flatten ? flattenRect(rect, flatten < 0) : rect || null;\n}\n// Also used for collapsed ranges that don't have a placeholder widget!\nclass WidgetView extends ContentView {\n constructor(widget, length, side) {\n super();\n this.widget = widget;\n this.length = length;\n this.side = side;\n this.prevWidget = null;\n }\n static create(widget, length, side) {\n return new (widget.customView || WidgetView)(widget, length, side);\n }\n split(from) {\n let result = WidgetView.create(this.widget, this.length - from, this.side);\n this.length -= from;\n return result;\n }\n sync() {\n if (!this.dom || !this.widget.updateDOM(this.dom)) {\n if (this.dom && this.prevWidget)\n this.prevWidget.destroy(this.dom);\n this.prevWidget = null;\n this.setDOM(this.widget.toDOM(this.editorView));\n this.dom.contentEditable = \"false\";\n }\n }\n getSide() { return this.side; }\n merge(from, to, source, hasStart, openStart, openEnd) {\n if (source && (!(source instanceof WidgetView) || !this.widget.compare(source.widget) ||\n from > 0 && openStart <= 0 || to < this.length && openEnd <= 0))\n return false;\n this.length = from + (source ? source.length : 0) + (this.length - to);\n return true;\n }\n become(other) {\n if (other.length == this.length && other instanceof WidgetView && other.side == this.side) {\n if (this.widget.constructor == other.widget.constructor) {\n if (!this.widget.eq(other.widget))\n this.markDirty(true);\n if (this.dom && !this.prevWidget)\n this.prevWidget = this.widget;\n this.widget = other.widget;\n return true;\n }\n }\n return false;\n }\n ignoreMutation() { return true; }\n ignoreEvent(event) { return this.widget.ignoreEvent(event); }\n get overrideDOMText() {\n if (this.length == 0)\n return Text.empty;\n let top = this;\n while (top.parent)\n top = top.parent;\n let view = top.editorView, text = view && view.state.doc, start = this.posAtStart;\n return text ? text.slice(start, start + this.length) : Text.empty;\n }\n domAtPos(pos) {\n return pos == 0 ? DOMPos.before(this.dom) : DOMPos.after(this.dom, pos == this.length);\n }\n domBoundsAround() { return null; }\n coordsAt(pos, side) {\n let rects = this.dom.getClientRects(), rect = null;\n if (!rects.length)\n return Rect0;\n for (let i = pos > 0 ? rects.length - 1 : 0;; i += (pos > 0 ? -1 : 1)) {\n rect = rects[i];\n if (pos > 0 ? i == 0 : i == rects.length - 1 || rect.top < rect.bottom)\n break;\n }\n return (pos == 0 && side > 0 || pos == this.length && side <= 0) ? rect : flattenRect(rect, pos == 0);\n }\n get isEditable() { return false; }\n destroy() {\n super.destroy();\n if (this.dom)\n this.widget.destroy(this.dom);\n }\n}\nclass CompositionView extends WidgetView {\n domAtPos(pos) {\n let { topView, text } = this.widget;\n if (!topView)\n return new DOMPos(text, Math.min(pos, text.nodeValue.length));\n return scanCompositionTree(pos, 0, topView, text, (v, p) => v.domAtPos(p), p => new DOMPos(text, Math.min(p, text.nodeValue.length)));\n }\n sync() { this.setDOM(this.widget.toDOM()); }\n localPosFromDOM(node, offset) {\n let { topView, text } = this.widget;\n if (!topView)\n return Math.min(offset, this.length);\n return posFromDOMInCompositionTree(node, offset, topView, text);\n }\n ignoreMutation() { return false; }\n get overrideDOMText() { return null; }\n coordsAt(pos, side) {\n let { topView, text } = this.widget;\n if (!topView)\n return textCoords(text, pos, side);\n return scanCompositionTree(pos, side, topView, text, (v, pos, side) => v.coordsAt(pos, side), (pos, side) => textCoords(text, pos, side));\n }\n destroy() {\n var _a;\n super.destroy();\n (_a = this.widget.topView) === null || _a === void 0 ? void 0 : _a.destroy();\n }\n get isEditable() { return true; }\n}\n// Uses the old structure of a chunk of content view frozen for\n// composition to try and find a reasonable DOM location for the given\n// offset.\nfunction scanCompositionTree(pos, side, view, text, enterView, fromText) {\n if (view instanceof MarkView) {\n for (let child of view.children) {\n let hasComp = contains(child.dom, text);\n let len = hasComp ? text.nodeValue.length : child.length;\n if (pos < len || pos == len && child.getSide() <= 0)\n return hasComp ? scanCompositionTree(pos, side, child, text, enterView, fromText) : enterView(child, pos, side);\n pos -= len;\n }\n return enterView(view, view.length, -1);\n }\n else if (view.dom == text) {\n return fromText(pos, side);\n }\n else {\n return enterView(view, pos, side);\n }\n}\nfunction posFromDOMInCompositionTree(node, offset, view, text) {\n if (view instanceof MarkView) {\n for (let child of view.children) {\n let pos = 0, hasComp = contains(child.dom, text);\n if (contains(child.dom, node))\n return pos + (hasComp ? posFromDOMInCompositionTree(node, offset, child, text) : child.localPosFromDOM(node, offset));\n pos += hasComp ? text.nodeValue.length : child.length;\n }\n }\n else if (view.dom == text) {\n return Math.min(offset, text.nodeValue.length);\n }\n return view.localPosFromDOM(node, offset);\n}\n// These are drawn around uneditable widgets to avoid a number of\n// browser bugs that show up when the cursor is directly next to\n// uneditable inline content.\nclass WidgetBufferView extends ContentView {\n constructor(side) {\n super();\n this.side = side;\n }\n get length() { return 0; }\n merge() { return false; }\n become(other) {\n return other instanceof WidgetBufferView && other.side == this.side;\n }\n split() { return new WidgetBufferView(this.side); }\n sync() {\n if (!this.dom) {\n let dom = document.createElement(\"img\");\n dom.className = \"cm-widgetBuffer\";\n dom.setAttribute(\"aria-hidden\", \"true\");\n this.setDOM(dom);\n }\n }\n getSide() { return this.side; }\n domAtPos(pos) { return DOMPos.before(this.dom); }\n localPosFromDOM() { return 0; }\n domBoundsAround() { return null; }\n coordsAt(pos) {\n let imgRect = this.dom.getBoundingClientRect();\n // Since the height doesn't correspond to text height, try\n // to borrow the height from some sibling node.\n let siblingRect = inlineSiblingRect(this, this.side > 0 ? -1 : 1);\n return siblingRect && siblingRect.top < imgRect.bottom && siblingRect.bottom > imgRect.top\n ? { left: imgRect.left, right: imgRect.right, top: siblingRect.top, bottom: siblingRect.bottom } : imgRect;\n }\n get overrideDOMText() {\n return Text.empty;\n }\n}\nTextView.prototype.children = WidgetView.prototype.children = WidgetBufferView.prototype.children = noChildren;\nfunction inlineSiblingRect(view, side) {\n let parent = view.parent, index = parent ? parent.children.indexOf(view) : -1;\n while (parent && index >= 0) {\n if (side < 0 ? index > 0 : index < parent.children.length) {\n let next = parent.children[index + side];\n if (next instanceof TextView) {\n let nextRect = next.coordsAt(side < 0 ? next.length : 0, side);\n if (nextRect)\n return nextRect;\n }\n index += side;\n }\n else if (parent instanceof MarkView && parent.parent) {\n index = parent.parent.children.indexOf(parent) + (side < 0 ? 0 : 1);\n parent = parent.parent;\n }\n else {\n let last = parent.dom.lastChild;\n if (last && last.nodeName == \"BR\")\n return last.getClientRects()[0];\n break;\n }\n }\n return undefined;\n}\nfunction inlineDOMAtPos(dom, children, pos) {\n let i = 0;\n for (let off = 0; i < children.length; i++) {\n let child = children[i], end = off + child.length;\n if (end == off && child.getSide() <= 0)\n continue;\n if (pos > off && pos < end && child.dom.parentNode == dom)\n return child.domAtPos(pos - off);\n if (pos <= off)\n break;\n off = end;\n }\n for (; i > 0; i--) {\n let before = children[i - 1].dom;\n if (before.parentNode == dom)\n return DOMPos.after(before);\n }\n return new DOMPos(dom, 0);\n}\n// Assumes `view`, if a mark view, has precisely 1 child.\nfunction joinInlineInto(parent, view, open) {\n let last, { children } = parent;\n if (open > 0 && view instanceof MarkView && children.length &&\n (last = children[children.length - 1]) instanceof MarkView && last.mark.eq(view.mark)) {\n joinInlineInto(last, view.children[0], open - 1);\n }\n else {\n children.push(view);\n view.setParent(parent);\n }\n parent.length += view.length;\n}\nfunction coordsInChildren(view, pos, side) {\n for (let off = 0, i = 0; i < view.children.length; i++) {\n let child = view.children[i], end = off + child.length, next;\n if ((side <= 0 || end == view.length || child.getSide() > 0 ? end >= pos : end > pos) &&\n (pos < end || i + 1 == view.children.length || (next = view.children[i + 1]).length || next.getSide() > 0)) {\n let flatten = 0;\n if (end == off) {\n if (child.getSide() <= 0)\n continue;\n flatten = side = -child.getSide();\n }\n let rect = child.coordsAt(Math.max(0, pos - off), side);\n return flatten && rect ? flattenRect(rect, side < 0) : rect;\n }\n off = end;\n }\n let last = view.dom.lastChild;\n if (!last)\n return view.dom.getBoundingClientRect();\n let rects = clientRectsFor(last);\n return rects[rects.length - 1] || null;\n}\n\nfunction combineAttrs(source, target) {\n for (let name in source) {\n if (name == \"class\" && target.class)\n target.class += \" \" + source.class;\n else if (name == \"style\" && target.style)\n target.style += \";\" + source.style;\n else\n target[name] = source[name];\n }\n return target;\n}\nfunction attrsEq(a, b) {\n if (a == b)\n return true;\n if (!a || !b)\n return false;\n let keysA = Object.keys(a), keysB = Object.keys(b);\n if (keysA.length != keysB.length)\n return false;\n for (let key of keysA) {\n if (keysB.indexOf(key) == -1 || a[key] !== b[key])\n return false;\n }\n return true;\n}\nfunction updateAttrs(dom, prev, attrs) {\n if (prev)\n for (let name in prev)\n if (!(attrs && name in attrs))\n dom.removeAttribute(name);\n if (attrs)\n for (let name in attrs)\n if (!(prev && prev[name] == attrs[name]))\n dom.setAttribute(name, attrs[name]);\n}\n\n/**\nWidgets added to the content are described by subclasses of this\nclass. Using a description object like that makes it possible to\ndelay creating of the DOM structure for a widget until it is\nneeded, and to avoid redrawing widgets even when the decorations\nthat define them are recreated.\n*/\nclass WidgetType {\n /**\n Compare this instance to another instance of the same type.\n (TypeScript can't express this, but only instances of the same\n specific class will be passed to this method.) This is used to\n avoid redrawing widgets when they are replaced by a new\n decoration of the same type. The default implementation just\n returns `false`, which will cause new instances of the widget to\n always be redrawn.\n */\n eq(_widget) { return false; }\n /**\n Update a DOM element created by a widget of the same type (but\n different, non-`eq` content) to reflect this widget. May return\n true to indicate that it could update, false to indicate it\n couldn't (in which case the widget will be redrawn). The default\n implementation just returns false.\n */\n updateDOM(_dom) { return false; }\n /**\n @internal\n */\n compare(other) {\n return this == other || this.constructor == other.constructor && this.eq(other);\n }\n /**\n The estimated height this widget will have, to be used when\n estimating the height of content that hasn't been drawn. May\n return -1 to indicate you don't know. The default implementation\n returns -1.\n */\n get estimatedHeight() { return -1; }\n /**\n Can be used to configure which kinds of events inside the widget\n should be ignored by the editor. The default is to ignore all\n events.\n */\n ignoreEvent(_event) { return true; }\n /**\n @internal\n */\n get customView() { return null; }\n /**\n This is called when the an instance of the widget is removed\n from the editor view.\n */\n destroy(_dom) { }\n}\n/**\nThe different types of blocks that can occur in an editor view.\n*/\nvar BlockType = /*@__PURE__*/(function (BlockType) {\n /**\n A line of text.\n */\n BlockType[BlockType[\"Text\"] = 0] = \"Text\";\n /**\n A block widget associated with the position after it.\n */\n BlockType[BlockType[\"WidgetBefore\"] = 1] = \"WidgetBefore\";\n /**\n A block widget associated with the position before it.\n */\n BlockType[BlockType[\"WidgetAfter\"] = 2] = \"WidgetAfter\";\n /**\n A block widget [replacing](https://codemirror.net/6/docs/ref/#view.Decoration^replace) a range of content.\n */\n BlockType[BlockType[\"WidgetRange\"] = 3] = \"WidgetRange\";\nreturn BlockType})(BlockType || (BlockType = {}));\n/**\nA decoration provides information on how to draw or style a piece\nof content. You'll usually use it wrapped in a\n[`Range`](https://codemirror.net/6/docs/ref/#rangeset.Range), which adds a start and end position.\n*/\nclass Decoration extends RangeValue {\n /**\n @internal\n */\n constructor(\n /**\n @internal\n */\n startSide, \n /**\n @internal\n */\n endSide, \n /**\n @internal\n */\n widget, \n /**\n The config object used to create this decoration. You can\n include additional properties in there to store metadata about\n your decoration.\n */\n spec) {\n super();\n this.startSide = startSide;\n this.endSide = endSide;\n this.widget = widget;\n this.spec = spec;\n }\n /**\n @internal\n */\n get heightRelevant() { return false; }\n /**\n Create a mark decoration, which influences the styling of the\n content in its range. Nested mark decorations will cause nested\n DOM elements to be created. Nesting order is determined by\n precedence of the [facet](https://codemirror.net/6/docs/ref/#view.EditorView^decorations) or\n (below the facet-provided decorations) [view\n plugin](https://codemirror.net/6/docs/ref/#view.PluginSpec.decorations). Such elements are split\n on line boundaries and on the boundaries of higher-precedence\n decorations.\n */\n static mark(spec) {\n return new MarkDecoration(spec);\n }\n /**\n Create a widget decoration, which adds an element at the given\n position.\n */\n static widget(spec) {\n let side = spec.side || 0, block = !!spec.block;\n side += block ? (side > 0 ? 300000000 /* BlockAfter */ : -400000000 /* BlockBefore */) : (side > 0 ? 100000000 /* InlineAfter */ : -100000000 /* InlineBefore */);\n return new PointDecoration(spec, side, side, block, spec.widget || null, false);\n }\n /**\n Create a replace decoration which replaces the given range with\n a widget, or simply hides it.\n */\n static replace(spec) {\n let block = !!spec.block, startSide, endSide;\n if (spec.isBlockGap) {\n startSide = -500000000 /* GapStart */;\n endSide = 400000000 /* GapEnd */;\n }\n else {\n let { start, end } = getInclusive(spec, block);\n startSide = (start ? (block ? -300000000 /* BlockIncStart */ : -1 /* InlineIncStart */) : 500000000 /* NonIncStart */) - 1;\n endSide = (end ? (block ? 200000000 /* BlockIncEnd */ : 1 /* InlineIncEnd */) : -600000000 /* NonIncEnd */) + 1;\n }\n return new PointDecoration(spec, startSide, endSide, block, spec.widget || null, true);\n }\n /**\n Create a line decoration, which can add DOM attributes to the\n line starting at the given position.\n */\n static line(spec) {\n return new LineDecoration(spec);\n }\n /**\n Build a [`DecorationSet`](https://codemirror.net/6/docs/ref/#view.DecorationSet) from the given\n decorated range or ranges. If the ranges aren't already sorted,\n pass `true` for `sort` to make the library sort them for you.\n */\n static set(of, sort = false) {\n return RangeSet.of(of, sort);\n }\n /**\n @internal\n */\n hasHeight() { return this.widget ? this.widget.estimatedHeight > -1 : false; }\n}\n/**\nThe empty set of decorations.\n*/\nDecoration.none = RangeSet.empty;\nclass MarkDecoration extends Decoration {\n constructor(spec) {\n let { start, end } = getInclusive(spec);\n super(start ? -1 /* InlineIncStart */ : 500000000 /* NonIncStart */, end ? 1 /* InlineIncEnd */ : -600000000 /* NonIncEnd */, null, spec);\n this.tagName = spec.tagName || \"span\";\n this.class = spec.class || \"\";\n this.attrs = spec.attributes || null;\n }\n eq(other) {\n return this == other ||\n other instanceof MarkDecoration &&\n this.tagName == other.tagName &&\n this.class == other.class &&\n attrsEq(this.attrs, other.attrs);\n }\n range(from, to = from) {\n if (from >= to)\n throw new RangeError(\"Mark decorations may not be empty\");\n return super.range(from, to);\n }\n}\nMarkDecoration.prototype.point = false;\nclass LineDecoration extends Decoration {\n constructor(spec) {\n super(-200000000 /* Line */, -200000000 /* Line */, null, spec);\n }\n eq(other) {\n return other instanceof LineDecoration && attrsEq(this.spec.attributes, other.spec.attributes);\n }\n range(from, to = from) {\n if (to != from)\n throw new RangeError(\"Line decoration ranges must be zero-length\");\n return super.range(from, to);\n }\n}\nLineDecoration.prototype.mapMode = MapMode.TrackBefore;\nLineDecoration.prototype.point = true;\nclass PointDecoration extends Decoration {\n constructor(spec, startSide, endSide, block, widget, isReplace) {\n super(startSide, endSide, widget, spec);\n this.block = block;\n this.isReplace = isReplace;\n this.mapMode = !block ? MapMode.TrackDel : startSide <= 0 ? MapMode.TrackBefore : MapMode.TrackAfter;\n }\n // Only relevant when this.block == true\n get type() {\n return this.startSide < this.endSide ? BlockType.WidgetRange\n : this.startSide <= 0 ? BlockType.WidgetBefore : BlockType.WidgetAfter;\n }\n get heightRelevant() { return this.block || !!this.widget && this.widget.estimatedHeight >= 5; }\n eq(other) {\n return other instanceof PointDecoration &&\n widgetsEq(this.widget, other.widget) &&\n this.block == other.block &&\n this.startSide == other.startSide && this.endSide == other.endSide;\n }\n range(from, to = from) {\n if (this.isReplace && (from > to || (from == to && this.startSide > 0 && this.endSide <= 0)))\n throw new RangeError(\"Invalid range for replacement decoration\");\n if (!this.isReplace && to != from)\n throw new RangeError(\"Widget decorations can only have zero-length ranges\");\n return super.range(from, to);\n }\n}\nPointDecoration.prototype.point = true;\nfunction getInclusive(spec, block = false) {\n let { inclusiveStart: start, inclusiveEnd: end } = spec;\n if (start == null)\n start = spec.inclusive;\n if (end == null)\n end = spec.inclusive;\n return { start: start !== null && start !== void 0 ? start : block, end: end !== null && end !== void 0 ? end : block };\n}\nfunction widgetsEq(a, b) {\n return a == b || !!(a && b && a.compare(b));\n}\nfunction addRange(from, to, ranges, margin = 0) {\n let last = ranges.length - 1;\n if (last >= 0 && ranges[last] + margin >= from)\n ranges[last] = Math.max(ranges[last], to);\n else\n ranges.push(from, to);\n}\n\nclass LineView extends ContentView {\n constructor() {\n super(...arguments);\n this.children = [];\n this.length = 0;\n this.prevAttrs = undefined;\n this.attrs = null;\n this.breakAfter = 0;\n }\n // Consumes source\n merge(from, to, source, hasStart, openStart, openEnd) {\n if (source) {\n if (!(source instanceof LineView))\n return false;\n if (!this.dom)\n source.transferDOM(this); // Reuse source.dom when appropriate\n }\n if (hasStart)\n this.setDeco(source ? source.attrs : null);\n mergeChildrenInto(this, from, to, source ? source.children : [], openStart, openEnd);\n return true;\n }\n split(at) {\n let end = new LineView;\n end.breakAfter = this.breakAfter;\n if (this.length == 0)\n return end;\n let { i, off } = this.childPos(at);\n if (off) {\n end.append(this.children[i].split(off), 0);\n this.children[i].merge(off, this.children[i].length, null, false, 0, 0);\n i++;\n }\n for (let j = i; j < this.children.length; j++)\n end.append(this.children[j], 0);\n while (i > 0 && this.children[i - 1].length == 0)\n this.children[--i].destroy();\n this.children.length = i;\n this.markDirty();\n this.length = at;\n return end;\n }\n transferDOM(other) {\n if (!this.dom)\n return;\n other.setDOM(this.dom);\n other.prevAttrs = this.prevAttrs === undefined ? this.attrs : this.prevAttrs;\n this.prevAttrs = undefined;\n this.dom = null;\n }\n setDeco(attrs) {\n if (!attrsEq(this.attrs, attrs)) {\n if (this.dom) {\n this.prevAttrs = this.attrs;\n this.markDirty();\n }\n this.attrs = attrs;\n }\n }\n append(child, openStart) {\n joinInlineInto(this, child, openStart);\n }\n // Only called when building a line view in ContentBuilder\n addLineDeco(deco) {\n let attrs = deco.spec.attributes, cls = deco.spec.class;\n if (attrs)\n this.attrs = combineAttrs(attrs, this.attrs || {});\n if (cls)\n this.attrs = combineAttrs({ class: cls }, this.attrs || {});\n }\n domAtPos(pos) {\n return inlineDOMAtPos(this.dom, this.children, pos);\n }\n reuseDOM(node) {\n if (node.nodeName == \"DIV\") {\n this.setDOM(node);\n this.dirty |= 4 /* Attrs */ | 2 /* Node */;\n }\n }\n sync(track) {\n var _a;\n if (!this.dom) {\n this.setDOM(document.createElement(\"div\"));\n this.dom.className = \"cm-line\";\n this.prevAttrs = this.attrs ? null : undefined;\n }\n else if (this.dirty & 4 /* Attrs */) {\n clearAttributes(this.dom);\n this.dom.className = \"cm-line\";\n this.prevAttrs = this.attrs ? null : undefined;\n }\n if (this.prevAttrs !== undefined) {\n updateAttrs(this.dom, this.prevAttrs, this.attrs);\n this.dom.classList.add(\"cm-line\");\n this.prevAttrs = undefined;\n }\n super.sync(track);\n let last = this.dom.lastChild;\n while (last && ContentView.get(last) instanceof MarkView)\n last = last.lastChild;\n if (!last || !this.length ||\n last.nodeName != \"BR\" && ((_a = ContentView.get(last)) === null || _a === void 0 ? void 0 : _a.isEditable) == false &&\n (!browser.ios || !this.children.some(ch => ch instanceof TextView))) {\n let hack = document.createElement(\"BR\");\n hack.cmIgnore = true;\n this.dom.appendChild(hack);\n }\n }\n measureTextSize() {\n if (this.children.length == 0 || this.length > 20)\n return null;\n let totalWidth = 0;\n for (let child of this.children) {\n if (!(child instanceof TextView))\n return null;\n let rects = clientRectsFor(child.dom);\n if (rects.length != 1)\n return null;\n totalWidth += rects[0].width;\n }\n return { lineHeight: this.dom.getBoundingClientRect().height,\n charWidth: totalWidth / this.length };\n }\n coordsAt(pos, side) {\n return coordsInChildren(this, pos, side);\n }\n become(_other) { return false; }\n get type() { return BlockType.Text; }\n static find(docView, pos) {\n for (let i = 0, off = 0; i < docView.children.length; i++) {\n let block = docView.children[i], end = off + block.length;\n if (end >= pos) {\n if (block instanceof LineView)\n return block;\n if (end > pos)\n break;\n }\n off = end + block.breakAfter;\n }\n return null;\n }\n}\nclass BlockWidgetView extends ContentView {\n constructor(widget, length, type) {\n super();\n this.widget = widget;\n this.length = length;\n this.type = type;\n this.breakAfter = 0;\n this.prevWidget = null;\n }\n merge(from, to, source, _takeDeco, openStart, openEnd) {\n if (source && (!(source instanceof BlockWidgetView) || !this.widget.compare(source.widget) ||\n from > 0 && openStart <= 0 || to < this.length && openEnd <= 0))\n return false;\n this.length = from + (source ? source.length : 0) + (this.length - to);\n return true;\n }\n domAtPos(pos) {\n return pos == 0 ? DOMPos.before(this.dom) : DOMPos.after(this.dom, pos == this.length);\n }\n split(at) {\n let len = this.length - at;\n this.length = at;\n let end = new BlockWidgetView(this.widget, len, this.type);\n end.breakAfter = this.breakAfter;\n return end;\n }\n get children() { return noChildren; }\n sync() {\n if (!this.dom || !this.widget.updateDOM(this.dom)) {\n if (this.dom && this.prevWidget)\n this.prevWidget.destroy(this.dom);\n this.prevWidget = null;\n this.setDOM(this.widget.toDOM(this.editorView));\n this.dom.contentEditable = \"false\";\n }\n }\n get overrideDOMText() {\n return this.parent ? this.parent.view.state.doc.slice(this.posAtStart, this.posAtEnd) : Text$1.empty;\n }\n domBoundsAround() { return null; }\n become(other) {\n if (other instanceof BlockWidgetView && other.type == this.type &&\n other.widget.constructor == this.widget.constructor) {\n if (!other.widget.eq(this.widget))\n this.markDirty(true);\n if (this.dom && !this.prevWidget)\n this.prevWidget = this.widget;\n this.widget = other.widget;\n this.length = other.length;\n this.breakAfter = other.breakAfter;\n return true;\n }\n return false;\n }\n ignoreMutation() { return true; }\n ignoreEvent(event) { return this.widget.ignoreEvent(event); }\n destroy() {\n super.destroy();\n if (this.dom)\n this.widget.destroy(this.dom);\n }\n}\n\nclass ContentBuilder {\n constructor(doc, pos, end, disallowBlockEffectsBelow) {\n this.doc = doc;\n this.pos = pos;\n this.end = end;\n this.disallowBlockEffectsBelow = disallowBlockEffectsBelow;\n this.content = [];\n this.curLine = null;\n this.breakAtStart = 0;\n this.pendingBuffer = 0 /* No */;\n // Set to false directly after a widget that covers the position after it\n this.atCursorPos = true;\n this.openStart = -1;\n this.openEnd = -1;\n this.text = \"\";\n this.textOff = 0;\n this.cursor = doc.iter();\n this.skip = pos;\n }\n posCovered() {\n if (this.content.length == 0)\n return !this.breakAtStart && this.doc.lineAt(this.pos).from != this.pos;\n let last = this.content[this.content.length - 1];\n return !last.breakAfter && !(last instanceof BlockWidgetView && last.type == BlockType.WidgetBefore);\n }\n getLine() {\n if (!this.curLine) {\n this.content.push(this.curLine = new LineView);\n this.atCursorPos = true;\n }\n return this.curLine;\n }\n flushBuffer(active) {\n if (this.pendingBuffer) {\n this.curLine.append(wrapMarks(new WidgetBufferView(-1), active), active.length);\n this.pendingBuffer = 0 /* No */;\n }\n }\n addBlockWidget(view) {\n this.flushBuffer([]);\n this.curLine = null;\n this.content.push(view);\n }\n finish(openEnd) {\n if (!openEnd)\n this.flushBuffer([]);\n else\n this.pendingBuffer = 0 /* No */;\n if (!this.posCovered())\n this.getLine();\n }\n buildText(length, active, openStart) {\n while (length > 0) {\n if (this.textOff == this.text.length) {\n let { value, lineBreak, done } = this.cursor.next(this.skip);\n this.skip = 0;\n if (done)\n throw new Error(\"Ran out of text content when drawing inline views\");\n if (lineBreak) {\n if (!this.posCovered())\n this.getLine();\n if (this.content.length)\n this.content[this.content.length - 1].breakAfter = 1;\n else\n this.breakAtStart = 1;\n this.flushBuffer([]);\n this.curLine = null;\n length--;\n continue;\n }\n else {\n this.text = value;\n this.textOff = 0;\n }\n }\n let take = Math.min(this.text.length - this.textOff, length, 512 /* Chunk */);\n this.flushBuffer(active.slice(0, openStart));\n this.getLine().append(wrapMarks(new TextView(this.text.slice(this.textOff, this.textOff + take)), active), openStart);\n this.atCursorPos = true;\n this.textOff += take;\n length -= take;\n openStart = 0;\n }\n }\n span(from, to, active, openStart) {\n this.buildText(to - from, active, openStart);\n this.pos = to;\n if (this.openStart < 0)\n this.openStart = openStart;\n }\n point(from, to, deco, active, openStart) {\n let len = to - from;\n if (deco instanceof PointDecoration) {\n if (deco.block) {\n let { type } = deco;\n if (type == BlockType.WidgetAfter && !this.posCovered())\n this.getLine();\n this.addBlockWidget(new BlockWidgetView(deco.widget || new NullWidget(\"div\"), len, type));\n }\n else {\n let view = WidgetView.create(deco.widget || new NullWidget(\"span\"), len, deco.startSide);\n let cursorBefore = this.atCursorPos && !view.isEditable && openStart <= active.length && (from < to || deco.startSide > 0);\n let cursorAfter = !view.isEditable && (from < to || deco.startSide <= 0);\n let line = this.getLine();\n if (this.pendingBuffer == 2 /* IfCursor */ && !cursorBefore)\n this.pendingBuffer = 0 /* No */;\n this.flushBuffer(active);\n if (cursorBefore) {\n line.append(wrapMarks(new WidgetBufferView(1), active), openStart);\n openStart = active.length + Math.max(0, openStart - active.length);\n }\n line.append(wrapMarks(view, active), openStart);\n this.atCursorPos = cursorAfter;\n this.pendingBuffer = !cursorAfter ? 0 /* No */ : from < to ? 1 /* Yes */ : 2 /* IfCursor */;\n }\n }\n else if (this.doc.lineAt(this.pos).from == this.pos) { // Line decoration\n this.getLine().addLineDeco(deco);\n }\n if (len) {\n // Advance the iterator past the replaced content\n if (this.textOff + len <= this.text.length) {\n this.textOff += len;\n }\n else {\n this.skip += len - (this.text.length - this.textOff);\n this.text = \"\";\n this.textOff = 0;\n }\n this.pos = to;\n }\n if (this.openStart < 0)\n this.openStart = openStart;\n }\n filterPoint(from, to, value, index) {\n if (index < this.disallowBlockEffectsBelow && value instanceof PointDecoration) {\n if (value.block)\n throw new RangeError(\"Block decorations may not be specified via plugins\");\n if (to > this.doc.lineAt(this.pos).to)\n throw new RangeError(\"Decorations that replace line breaks may not be specified via plugins\");\n }\n return true;\n }\n static build(text, from, to, decorations, pluginDecorationLength) {\n let builder = new ContentBuilder(text, from, to, pluginDecorationLength);\n builder.openEnd = RangeSet.spans(decorations, from, to, builder);\n if (builder.openStart < 0)\n builder.openStart = builder.openEnd;\n builder.finish(builder.openEnd);\n return builder;\n }\n}\nfunction wrapMarks(view, active) {\n for (let mark of active)\n view = new MarkView(mark, [view], view.length);\n return view;\n}\nclass NullWidget extends WidgetType {\n constructor(tag) {\n super();\n this.tag = tag;\n }\n eq(other) { return other.tag == this.tag; }\n toDOM() { return document.createElement(this.tag); }\n updateDOM(elt) { return elt.nodeName.toLowerCase() == this.tag; }\n}\n\nconst none = [];\nconst clickAddsSelectionRange = /*@__PURE__*/Facet.define();\nconst dragMovesSelection$1 = /*@__PURE__*/Facet.define();\nconst mouseSelectionStyle = /*@__PURE__*/Facet.define();\nconst exceptionSink = /*@__PURE__*/Facet.define();\nconst updateListener = /*@__PURE__*/Facet.define();\nconst inputHandler = /*@__PURE__*/Facet.define();\n// FIXME remove\nconst scrollTo = /*@__PURE__*/StateEffect.define({\n map: (range, changes) => range.map(changes)\n});\n// FIXME remove\nconst centerOn = /*@__PURE__*/StateEffect.define({\n map: (range, changes) => range.map(changes)\n});\nclass ScrollTarget {\n constructor(range, y = \"nearest\", x = \"nearest\", yMargin = 5, xMargin = 5) {\n this.range = range;\n this.y = y;\n this.x = x;\n this.yMargin = yMargin;\n this.xMargin = xMargin;\n }\n map(changes) {\n return changes.empty ? this : new ScrollTarget(this.range.map(changes), this.y, this.x, this.yMargin, this.xMargin);\n }\n}\nconst scrollIntoView = /*@__PURE__*/StateEffect.define({ map: (t, ch) => t.map(ch) });\n/**\nLog or report an unhandled exception in client code. Should\nprobably only be used by extension code that allows client code to\nprovide functions, and calls those functions in a context where an\nexception can't be propagated to calling code in a reasonable way\n(for example when in an event handler).\n\nEither calls a handler registered with\n[`EditorView.exceptionSink`](https://codemirror.net/6/docs/ref/#view.EditorView^exceptionSink),\n`window.onerror`, if defined, or `console.error` (in which case\nit'll pass `context`, when given, as first argument).\n*/\nfunction logException(state, exception, context) {\n let handler = state.facet(exceptionSink);\n if (handler.length)\n handler[0](exception);\n else if (window.onerror)\n window.onerror(String(exception), context, undefined, undefined, exception);\n else if (context)\n console.error(context + \":\", exception);\n else\n console.error(exception);\n}\nconst editable = /*@__PURE__*/Facet.define({ combine: values => values.length ? values[0] : true });\n/**\nUsed to [declare](https://codemirror.net/6/docs/ref/#view.PluginSpec.provide) which\n[fields](https://codemirror.net/6/docs/ref/#view.PluginValue) a [view plugin](https://codemirror.net/6/docs/ref/#view.ViewPlugin)\nprovides.\n*/\nclass PluginFieldProvider {\n /**\n @internal\n */\n constructor(\n /**\n @internal\n */\n field, \n /**\n @internal\n */\n get) {\n this.field = field;\n this.get = get;\n }\n}\n/**\nPlugin fields are a mechanism for allowing plugins to provide\nvalues that can be retrieved through the\n[`pluginField`](https://codemirror.net/6/docs/ref/#view.EditorView.pluginField) view method.\n*/\nclass PluginField {\n /**\n Create a [provider](https://codemirror.net/6/docs/ref/#view.PluginFieldProvider) for this field,\n to use with a plugin's [provide](https://codemirror.net/6/docs/ref/#view.PluginSpec.provide)\n option.\n */\n from(get) {\n return new PluginFieldProvider(this, get);\n }\n /**\n Define a new plugin field.\n */\n static define() { return new PluginField(); }\n}\n/**\nThis field can be used by plugins to provide\n[decorations](https://codemirror.net/6/docs/ref/#view.Decoration).\n\n**Note**: For reasons of data flow (plugins are only updated\nafter the viewport is computed), decorations produced by plugins\nare _not_ taken into account when predicting the vertical layout\nstructure of the editor. They **must not** introduce block\nwidgets (that will raise an error) or replacing decorations that\ncover line breaks (these will be ignored if they occur). Such\ndecorations, or others that cause a large amount of vertical\nsize shift compared to the undecorated content, should be\nprovided through the state-level [`decorations`\nfacet](https://codemirror.net/6/docs/ref/#view.EditorView^decorations) instead.\n*/\nPluginField.decorations = /*@__PURE__*/PluginField.define();\n/**\nUsed to provide ranges that should be treated as atoms as far as\ncursor motion is concerned. This causes methods like\n[`moveByChar`](https://codemirror.net/6/docs/ref/#view.EditorView.moveByChar) and\n[`moveVertically`](https://codemirror.net/6/docs/ref/#view.EditorView.moveVertically) (and the\ncommands built on top of them) to skip across such regions when\na selection endpoint would enter them. This does _not_ prevent\ndirect programmatic [selection\nupdates](https://codemirror.net/6/docs/ref/#state.TransactionSpec.selection) from moving into such\nregions.\n*/\nPluginField.atomicRanges = /*@__PURE__*/PluginField.define();\n/**\nPlugins can provide additional scroll margins (space around the\nsides of the scrolling element that should be considered\ninvisible) through this field. This can be useful when the\nplugin introduces elements that cover part of that element (for\nexample a horizontally fixed gutter).\n*/\nPluginField.scrollMargins = /*@__PURE__*/PluginField.define();\nlet nextPluginID = 0;\nconst viewPlugin = /*@__PURE__*/Facet.define();\n/**\nView plugins associate stateful values with a view. They can\ninfluence the way the content is drawn, and are notified of things\nthat happen in the view.\n*/\nclass ViewPlugin {\n constructor(\n /**\n @internal\n */\n id, \n /**\n @internal\n */\n create, \n /**\n @internal\n */\n fields) {\n this.id = id;\n this.create = create;\n this.fields = fields;\n this.extension = viewPlugin.of(this);\n }\n /**\n Define a plugin from a constructor function that creates the\n plugin's value, given an editor view.\n */\n static define(create, spec) {\n let { eventHandlers, provide, decorations } = spec || {};\n let fields = [];\n if (provide)\n for (let provider of Array.isArray(provide) ? provide : [provide])\n fields.push(provider);\n if (eventHandlers)\n fields.push(domEventHandlers.from((value) => ({ plugin: value, handlers: eventHandlers })));\n if (decorations)\n fields.push(PluginField.decorations.from(decorations));\n return new ViewPlugin(nextPluginID++, create, fields);\n }\n /**\n Create a plugin for a class whose constructor takes a single\n editor view as argument.\n */\n static fromClass(cls, spec) {\n return ViewPlugin.define(view => new cls(view), spec);\n }\n}\nconst domEventHandlers = /*@__PURE__*/PluginField.define();\nclass PluginInstance {\n constructor(spec) {\n this.spec = spec;\n // When starting an update, all plugins have this field set to the\n // update object, indicating they need to be updated. When finished\n // updating, it is set to `false`. Retrieving a plugin that needs to\n // be updated with `view.plugin` forces an eager update.\n this.mustUpdate = null;\n // This is null when the plugin is initially created, but\n // initialized on the first update.\n this.value = null;\n }\n takeField(type, target) {\n if (this.spec)\n for (let { field, get } of this.spec.fields)\n if (field == type)\n target.push(get(this.value));\n }\n update(view) {\n if (!this.value) {\n if (this.spec) {\n try {\n this.value = this.spec.create(view);\n }\n catch (e) {\n logException(view.state, e, \"CodeMirror plugin crashed\");\n this.deactivate();\n }\n }\n }\n else if (this.mustUpdate) {\n let update = this.mustUpdate;\n this.mustUpdate = null;\n if (this.value.update) {\n try {\n this.value.update(update);\n }\n catch (e) {\n logException(update.state, e, \"CodeMirror plugin crashed\");\n if (this.value.destroy)\n try {\n this.value.destroy();\n }\n catch (_) { }\n this.deactivate();\n }\n }\n }\n return this;\n }\n destroy(view) {\n var _a;\n if ((_a = this.value) === null || _a === void 0 ? void 0 : _a.destroy) {\n try {\n this.value.destroy();\n }\n catch (e) {\n logException(view.state, e, \"CodeMirror plugin crashed\");\n }\n }\n }\n deactivate() {\n this.spec = this.value = null;\n }\n}\nconst editorAttributes = /*@__PURE__*/Facet.define();\nconst contentAttributes = /*@__PURE__*/Facet.define();\n// Provide decorations\nconst decorations = /*@__PURE__*/Facet.define();\nconst styleModule = /*@__PURE__*/Facet.define();\nclass ChangedRange {\n constructor(fromA, toA, fromB, toB) {\n this.fromA = fromA;\n this.toA = toA;\n this.fromB = fromB;\n this.toB = toB;\n }\n join(other) {\n return new ChangedRange(Math.min(this.fromA, other.fromA), Math.max(this.toA, other.toA), Math.min(this.fromB, other.fromB), Math.max(this.toB, other.toB));\n }\n addToSet(set) {\n let i = set.length, me = this;\n for (; i > 0; i--) {\n let range = set[i - 1];\n if (range.fromA > me.toA)\n continue;\n if (range.toA < me.fromA)\n break;\n me = me.join(range);\n set.splice(i - 1, 1);\n }\n set.splice(i, 0, me);\n return set;\n }\n static extendWithRanges(diff, ranges) {\n if (ranges.length == 0)\n return diff;\n let result = [];\n for (let dI = 0, rI = 0, posA = 0, posB = 0;; dI++) {\n let next = dI == diff.length ? null : diff[dI], off = posA - posB;\n let end = next ? next.fromB : 1e9;\n while (rI < ranges.length && ranges[rI] < end) {\n let from = ranges[rI], to = ranges[rI + 1];\n let fromB = Math.max(posB, from), toB = Math.min(end, to);\n if (fromB <= toB)\n new ChangedRange(fromB + off, toB + off, fromB, toB).addToSet(result);\n if (to > end)\n break;\n else\n rI += 2;\n }\n if (!next)\n return result;\n new ChangedRange(next.fromA, next.toA, next.fromB, next.toB).addToSet(result);\n posA = next.toA;\n posB = next.toB;\n }\n }\n}\n/**\nView [plugins](https://codemirror.net/6/docs/ref/#view.ViewPlugin) are given instances of this\nclass, which describe what happened, whenever the view is updated.\n*/\nclass ViewUpdate {\n /**\n @internal\n */\n constructor(\n /**\n The editor view that the update is associated with.\n */\n view, \n /**\n The new editor state.\n */\n state, \n /**\n The transactions involved in the update. May be empty.\n */\n transactions = none) {\n this.view = view;\n this.state = state;\n this.transactions = transactions;\n /**\n @internal\n */\n this.flags = 0;\n this.startState = view.state;\n this.changes = ChangeSet.empty(this.startState.doc.length);\n for (let tr of transactions)\n this.changes = this.changes.compose(tr.changes);\n let changedRanges = [];\n this.changes.iterChangedRanges((fromA, toA, fromB, toB) => changedRanges.push(new ChangedRange(fromA, toA, fromB, toB)));\n this.changedRanges = changedRanges;\n let focus = view.hasFocus;\n if (focus != view.inputState.notifiedFocused) {\n view.inputState.notifiedFocused = focus;\n this.flags |= 1 /* Focus */;\n }\n }\n /**\n Tells you whether the [viewport](https://codemirror.net/6/docs/ref/#view.EditorView.viewport) or\n [visible ranges](https://codemirror.net/6/docs/ref/#view.EditorView.visibleRanges) changed in this\n update.\n */\n get viewportChanged() {\n return (this.flags & 4 /* Viewport */) > 0;\n }\n /**\n Indicates whether the height of an element in the editor changed\n in this update.\n */\n get heightChanged() {\n return (this.flags & 2 /* Height */) > 0;\n }\n /**\n Returns true when the document was modified or the size of the\n editor, or elements within the editor, changed.\n */\n get geometryChanged() {\n return this.docChanged || (this.flags & (8 /* Geometry */ | 2 /* Height */)) > 0;\n }\n /**\n True when this update indicates a focus change.\n */\n get focusChanged() {\n return (this.flags & 1 /* Focus */) > 0;\n }\n /**\n Whether the document changed in this update.\n */\n get docChanged() {\n return !this.changes.empty;\n }\n /**\n Whether the selection was explicitly set in this update.\n */\n get selectionSet() {\n return this.transactions.some(tr => tr.selection);\n }\n /**\n @internal\n */\n get empty() { return this.flags == 0 && this.transactions.length == 0; }\n}\n\n/**\nUsed to indicate [text direction](https://codemirror.net/6/docs/ref/#view.EditorView.textDirection).\n*/\nvar Direction = /*@__PURE__*/(function (Direction) {\n // (These are chosen to match the base levels, in bidi algorithm\n // terms, of spans in that direction.)\n /**\n Left-to-right.\n */\n Direction[Direction[\"LTR\"] = 0] = \"LTR\";\n /**\n Right-to-left.\n */\n Direction[Direction[\"RTL\"] = 1] = \"RTL\";\nreturn Direction})(Direction || (Direction = {}));\nconst LTR = Direction.LTR, RTL = Direction.RTL;\n// Decode a string with each type encoded as log2(type)\nfunction dec(str) {\n let result = [];\n for (let i = 0; i < str.length; i++)\n result.push(1 << +str[i]);\n return result;\n}\n// Character types for codepoints 0 to 0xf8\nconst LowTypes = /*@__PURE__*/dec(\"88888888888888888888888888888888888666888888787833333333337888888000000000000000000000000008888880000000000000000000000000088888888888888888888888888888888888887866668888088888663380888308888800000000000000000000000800000000000000000000000000000008\");\n// Character types for codepoints 0x600 to 0x6f9\nconst ArabicTypes = /*@__PURE__*/dec(\"4444448826627288999999999992222222222222222222222222222222222222222222222229999999999999999999994444444444644222822222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222999999949999999229989999223333333333\");\nconst Brackets = /*@__PURE__*/Object.create(null), BracketStack = [];\n// There's a lot more in\n// https://www.unicode.org/Public/UCD/latest/ucd/BidiBrackets.txt,\n// which are left out to keep code size down.\nfor (let p of [\"()\", \"[]\", \"{}\"]) {\n let l = /*@__PURE__*/p.charCodeAt(0), r = /*@__PURE__*/p.charCodeAt(1);\n Brackets[l] = r;\n Brackets[r] = -l;\n}\nfunction charType(ch) {\n return ch <= 0xf7 ? LowTypes[ch] :\n 0x590 <= ch && ch <= 0x5f4 ? 2 /* R */ :\n 0x600 <= ch && ch <= 0x6f9 ? ArabicTypes[ch - 0x600] :\n 0x6ee <= ch && ch <= 0x8ac ? 4 /* AL */ :\n 0x2000 <= ch && ch <= 0x200b ? 256 /* NI */ :\n ch == 0x200c ? 256 /* NI */ : 1 /* L */;\n}\nconst BidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n/**\nRepresents a contiguous range of text that has a single direction\n(as in left-to-right or right-to-left).\n*/\nclass BidiSpan {\n /**\n @internal\n */\n constructor(\n /**\n The start of the span (relative to the start of the line).\n */\n from, \n /**\n The end of the span.\n */\n to, \n /**\n The [\"bidi\n level\"](https://unicode.org/reports/tr9/#Basic_Display_Algorithm)\n of the span (in this context, 0 means\n left-to-right, 1 means right-to-left, 2 means left-to-right\n number inside right-to-left text).\n */\n level) {\n this.from = from;\n this.to = to;\n this.level = level;\n }\n /**\n The direction of this span.\n */\n get dir() { return this.level % 2 ? RTL : LTR; }\n /**\n @internal\n */\n side(end, dir) { return (this.dir == dir) == end ? this.to : this.from; }\n /**\n @internal\n */\n static find(order, index, level, assoc) {\n let maybe = -1;\n for (let i = 0; i < order.length; i++) {\n let span = order[i];\n if (span.from <= index && span.to >= index) {\n if (span.level == level)\n return i;\n // When multiple spans match, if assoc != 0, take the one that\n // covers that side, otherwise take the one with the minimum\n // level.\n if (maybe < 0 || (assoc != 0 ? (assoc < 0 ? span.from < index : span.to > index) : order[maybe].level > span.level))\n maybe = i;\n }\n }\n if (maybe < 0)\n throw new RangeError(\"Index out of range\");\n return maybe;\n }\n}\n// Reused array of character types\nconst types = [];\nfunction computeOrder(line, direction) {\n let len = line.length, outerType = direction == LTR ? 1 /* L */ : 2 /* R */, oppositeType = direction == LTR ? 2 /* R */ : 1 /* L */;\n if (!line || outerType == 1 /* L */ && !BidiRE.test(line))\n return trivialOrder(len);\n // W1. Examine each non-spacing mark (NSM) in the level run, and\n // change the type of the NSM to the type of the previous\n // character. If the NSM is at the start of the level run, it will\n // get the type of sor.\n // W2. Search backwards from each instance of a European number\n // until the first strong type (R, L, AL, or sor) is found. If an\n // AL is found, change the type of the European number to Arabic\n // number.\n // W3. Change all ALs to R.\n // (Left after this: L, R, EN, AN, ET, CS, NI)\n for (let i = 0, prev = outerType, prevStrong = outerType; i < len; i++) {\n let type = charType(line.charCodeAt(i));\n if (type == 512 /* NSM */)\n type = prev;\n else if (type == 8 /* EN */ && prevStrong == 4 /* AL */)\n type = 16 /* AN */;\n types[i] = type == 4 /* AL */ ? 2 /* R */ : type;\n if (type & 7 /* Strong */)\n prevStrong = type;\n prev = type;\n }\n // W5. A sequence of European terminators adjacent to European\n // numbers changes to all European numbers.\n // W6. Otherwise, separators and terminators change to Other\n // Neutral.\n // W7. Search backwards from each instance of a European number\n // until the first strong type (R, L, or sor) is found. If an L is\n // found, then change the type of the European number to L.\n // (Left after this: L, R, EN+AN, NI)\n for (let i = 0, prev = outerType, prevStrong = outerType; i < len; i++) {\n let type = types[i];\n if (type == 128 /* CS */) {\n if (i < len - 1 && prev == types[i + 1] && (prev & 24 /* Num */))\n type = types[i] = prev;\n else\n types[i] = 256 /* NI */;\n }\n else if (type == 64 /* ET */) {\n let end = i + 1;\n while (end < len && types[end] == 64 /* ET */)\n end++;\n let replace = (i && prev == 8 /* EN */) || (end < len && types[end] == 8 /* EN */) ? (prevStrong == 1 /* L */ ? 1 /* L */ : 8 /* EN */) : 256 /* NI */;\n for (let j = i; j < end; j++)\n types[j] = replace;\n i = end - 1;\n }\n else if (type == 8 /* EN */ && prevStrong == 1 /* L */) {\n types[i] = 1 /* L */;\n }\n prev = type;\n if (type & 7 /* Strong */)\n prevStrong = type;\n }\n // N0. Process bracket pairs in an isolating run sequence\n // sequentially in the logical order of the text positions of the\n // opening paired brackets using the logic given below. Within this\n // scope, bidirectional types EN and AN are treated as R.\n for (let i = 0, sI = 0, context = 0, ch, br, type; i < len; i++) {\n // Keeps [startIndex, type, strongSeen] triples for each open\n // bracket on BracketStack.\n if (br = Brackets[ch = line.charCodeAt(i)]) {\n if (br < 0) { // Closing bracket\n for (let sJ = sI - 3; sJ >= 0; sJ -= 3) {\n if (BracketStack[sJ + 1] == -br) {\n let flags = BracketStack[sJ + 2];\n let type = (flags & 2 /* EmbedInside */) ? outerType :\n !(flags & 4 /* OppositeInside */) ? 0 :\n (flags & 1 /* OppositeBefore */) ? oppositeType : outerType;\n if (type)\n types[i] = types[BracketStack[sJ]] = type;\n sI = sJ;\n break;\n }\n }\n }\n else if (BracketStack.length == 189 /* MaxDepth */) {\n break;\n }\n else {\n BracketStack[sI++] = i;\n BracketStack[sI++] = ch;\n BracketStack[sI++] = context;\n }\n }\n else if ((type = types[i]) == 2 /* R */ || type == 1 /* L */) {\n let embed = type == outerType;\n context = embed ? 0 : 1 /* OppositeBefore */;\n for (let sJ = sI - 3; sJ >= 0; sJ -= 3) {\n let cur = BracketStack[sJ + 2];\n if (cur & 2 /* EmbedInside */)\n break;\n if (embed) {\n BracketStack[sJ + 2] |= 2 /* EmbedInside */;\n }\n else {\n if (cur & 4 /* OppositeInside */)\n break;\n BracketStack[sJ + 2] |= 4 /* OppositeInside */;\n }\n }\n }\n }\n // N1. A sequence of neutrals takes the direction of the\n // surrounding strong text if the text on both sides has the same\n // direction. European and Arabic numbers act as if they were R in\n // terms of their influence on neutrals. Start-of-level-run (sor)\n // and end-of-level-run (eor) are used at level run boundaries.\n // N2. Any remaining neutrals take the embedding direction.\n // (Left after this: L, R, EN+AN)\n for (let i = 0; i < len; i++) {\n if (types[i] == 256 /* NI */) {\n let end = i + 1;\n while (end < len && types[end] == 256 /* NI */)\n end++;\n let beforeL = (i ? types[i - 1] : outerType) == 1 /* L */;\n let afterL = (end < len ? types[end] : outerType) == 1 /* L */;\n let replace = beforeL == afterL ? (beforeL ? 1 /* L */ : 2 /* R */) : outerType;\n for (let j = i; j < end; j++)\n types[j] = replace;\n i = end - 1;\n }\n }\n // Here we depart from the documented algorithm, in order to avoid\n // building up an actual levels array. Since there are only three\n // levels (0, 1, 2) in an implementation that doesn't take\n // explicit embedding into account, we can build up the order on\n // the fly, without following the level-based algorithm.\n let order = [];\n if (outerType == 1 /* L */) {\n for (let i = 0; i < len;) {\n let start = i, rtl = types[i++] != 1 /* L */;\n while (i < len && rtl == (types[i] != 1 /* L */))\n i++;\n if (rtl) {\n for (let j = i; j > start;) {\n let end = j, l = types[--j] != 2 /* R */;\n while (j > start && l == (types[j - 1] != 2 /* R */))\n j--;\n order.push(new BidiSpan(j, end, l ? 2 : 1));\n }\n }\n else {\n order.push(new BidiSpan(start, i, 0));\n }\n }\n }\n else {\n for (let i = 0; i < len;) {\n let start = i, rtl = types[i++] == 2 /* R */;\n while (i < len && rtl == (types[i] == 2 /* R */))\n i++;\n order.push(new BidiSpan(start, i, rtl ? 1 : 2));\n }\n }\n return order;\n}\nfunction trivialOrder(length) {\n return [new BidiSpan(0, length, 0)];\n}\nlet movedOver = \"\";\nfunction moveVisually(line, order, dir, start, forward) {\n var _a;\n let startIndex = start.head - line.from, spanI = -1;\n if (startIndex == 0) {\n if (!forward || !line.length)\n return null;\n if (order[0].level != dir) {\n startIndex = order[0].side(false, dir);\n spanI = 0;\n }\n }\n else if (startIndex == line.length) {\n if (forward)\n return null;\n let last = order[order.length - 1];\n if (last.level != dir) {\n startIndex = last.side(true, dir);\n spanI = order.length - 1;\n }\n }\n if (spanI < 0)\n spanI = BidiSpan.find(order, startIndex, (_a = start.bidiLevel) !== null && _a !== void 0 ? _a : -1, start.assoc);\n let span = order[spanI];\n // End of span. (But not end of line--that was checked for above.)\n if (startIndex == span.side(forward, dir)) {\n span = order[spanI += forward ? 1 : -1];\n startIndex = span.side(!forward, dir);\n }\n let indexForward = forward == (span.dir == dir);\n let nextIndex = findClusterBreak(line.text, startIndex, indexForward);\n movedOver = line.text.slice(Math.min(startIndex, nextIndex), Math.max(startIndex, nextIndex));\n if (nextIndex != span.side(forward, dir))\n return EditorSelection.cursor(nextIndex + line.from, indexForward ? -1 : 1, span.level);\n let nextSpan = spanI == (forward ? order.length - 1 : 0) ? null : order[spanI + (forward ? 1 : -1)];\n if (!nextSpan && span.level != dir)\n return EditorSelection.cursor(forward ? line.to : line.from, forward ? -1 : 1, dir);\n if (nextSpan && nextSpan.level < span.level)\n return EditorSelection.cursor(nextSpan.side(!forward, dir) + line.from, forward ? 1 : -1, nextSpan.level);\n return EditorSelection.cursor(nextIndex + line.from, forward ? -1 : 1, span.level);\n}\n\nconst LineBreakPlaceholder = \"\\uffff\";\nclass DOMReader {\n constructor(points, state) {\n this.points = points;\n this.text = \"\";\n this.lineSeparator = state.facet(EditorState.lineSeparator);\n }\n append(text) {\n this.text += text;\n }\n lineBreak() {\n this.text += LineBreakPlaceholder;\n }\n readRange(start, end) {\n if (!start)\n return this;\n let parent = start.parentNode;\n for (let cur = start;;) {\n this.findPointBefore(parent, cur);\n this.readNode(cur);\n let next = cur.nextSibling;\n if (next == end)\n break;\n let view = ContentView.get(cur), nextView = ContentView.get(next);\n if (view && nextView ? view.breakAfter :\n (view ? view.breakAfter : isBlockElement(cur)) ||\n (isBlockElement(next) && (cur.nodeName != \"BR\" || cur.cmIgnore)))\n this.lineBreak();\n cur = next;\n }\n this.findPointBefore(parent, end);\n return this;\n }\n readTextNode(node) {\n let text = node.nodeValue;\n for (let point of this.points)\n if (point.node == node)\n point.pos = this.text.length + Math.min(point.offset, text.length);\n for (let off = 0, re = this.lineSeparator ? null : /\\r\\n?|\\n/g;;) {\n let nextBreak = -1, breakSize = 1, m;\n if (this.lineSeparator) {\n nextBreak = text.indexOf(this.lineSeparator, off);\n breakSize = this.lineSeparator.length;\n }\n else if (m = re.exec(text)) {\n nextBreak = m.index;\n breakSize = m[0].length;\n }\n this.append(text.slice(off, nextBreak < 0 ? text.length : nextBreak));\n if (nextBreak < 0)\n break;\n this.lineBreak();\n if (breakSize > 1)\n for (let point of this.points)\n if (point.node == node && point.pos > this.text.length)\n point.pos -= breakSize - 1;\n off = nextBreak + breakSize;\n }\n }\n readNode(node) {\n if (node.cmIgnore)\n return;\n let view = ContentView.get(node);\n let fromView = view && view.overrideDOMText;\n if (fromView != null) {\n this.findPointInside(node, fromView.length);\n for (let i = fromView.iter(); !i.next().done;) {\n if (i.lineBreak)\n this.lineBreak();\n else\n this.append(i.value);\n }\n }\n else if (node.nodeType == 3) {\n this.readTextNode(node);\n }\n else if (node.nodeName == \"BR\") {\n if (node.nextSibling)\n this.lineBreak();\n }\n else if (node.nodeType == 1) {\n this.readRange(node.firstChild, null);\n }\n }\n findPointBefore(node, next) {\n for (let point of this.points)\n if (point.node == node && node.childNodes[point.offset] == next)\n point.pos = this.text.length;\n }\n findPointInside(node, maxLen) {\n for (let point of this.points)\n if (node.nodeType == 3 ? point.node == node : node.contains(point.node))\n point.pos = this.text.length + Math.min(maxLen, point.offset);\n }\n}\nfunction isBlockElement(node) {\n return node.nodeType == 1 && /^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\\d|SECTION|PRE)$/.test(node.nodeName);\n}\nclass DOMPoint {\n constructor(node, offset) {\n this.node = node;\n this.offset = offset;\n this.pos = -1;\n }\n}\n\nclass DocView extends ContentView {\n constructor(view) {\n super();\n this.view = view;\n this.compositionDeco = Decoration.none;\n this.decorations = [];\n this.pluginDecorationLength = 0;\n // Track a minimum width for the editor. When measuring sizes in\n // measureVisibleLineHeights, this is updated to point at the width\n // of a given element and its extent in the document. When a change\n // happens in that range, these are reset. That way, once we've seen\n // a line/element of a given length, we keep the editor wide enough\n // to fit at least that element, until it is changed, at which point\n // we forget it again.\n this.minWidth = 0;\n this.minWidthFrom = 0;\n this.minWidthTo = 0;\n // Track whether the DOM selection was set in a lossy way, so that\n // we don't mess it up when reading it back it\n this.impreciseAnchor = null;\n this.impreciseHead = null;\n this.forceSelection = false;\n // Used by the resize observer to ignore resizes that we caused\n // ourselves\n this.lastUpdate = Date.now();\n this.setDOM(view.contentDOM);\n this.children = [new LineView];\n this.children[0].setParent(this);\n this.updateDeco();\n this.updateInner([new ChangedRange(0, 0, 0, view.state.doc.length)], 0);\n }\n get root() { return this.view.root; }\n get editorView() { return this.view; }\n get length() { return this.view.state.doc.length; }\n // Update the document view to a given state. scrollIntoView can be\n // used as a hint to compute a new viewport that includes that\n // position, if we know the editor is going to scroll that position\n // into view.\n update(update) {\n let changedRanges = update.changedRanges;\n if (this.minWidth > 0 && changedRanges.length) {\n if (!changedRanges.every(({ fromA, toA }) => toA < this.minWidthFrom || fromA > this.minWidthTo)) {\n this.minWidth = this.minWidthFrom = this.minWidthTo = 0;\n }\n else {\n this.minWidthFrom = update.changes.mapPos(this.minWidthFrom, 1);\n this.minWidthTo = update.changes.mapPos(this.minWidthTo, 1);\n }\n }\n if (this.view.inputState.composing < 0)\n this.compositionDeco = Decoration.none;\n else if (update.transactions.length || this.dirty)\n this.compositionDeco = computeCompositionDeco(this.view, update.changes);\n // When the DOM nodes around the selection are moved to another\n // parent, Chrome sometimes reports a different selection through\n // getSelection than the one that it actually shows to the user.\n // This forces a selection update when lines are joined to work\n // around that. Issue #54\n if ((browser.ie || browser.chrome) && !this.compositionDeco.size && update &&\n update.state.doc.lines != update.startState.doc.lines)\n this.forceSelection = true;\n let prevDeco = this.decorations, deco = this.updateDeco();\n let decoDiff = findChangedDeco(prevDeco, deco, update.changes);\n changedRanges = ChangedRange.extendWithRanges(changedRanges, decoDiff);\n if (this.dirty == 0 /* Not */ && changedRanges.length == 0) {\n return false;\n }\n else {\n this.updateInner(changedRanges, update.startState.doc.length);\n if (update.transactions.length)\n this.lastUpdate = Date.now();\n return true;\n }\n }\n // Used by update and the constructor do perform the actual DOM\n // update\n updateInner(changes, oldLength) {\n this.view.viewState.mustMeasureContent = true;\n this.updateChildren(changes, oldLength);\n let { observer } = this.view;\n observer.ignore(() => {\n // Lock the height during redrawing, since Chrome sometimes\n // messes with the scroll position during DOM mutation (though\n // no relayout is triggered and I cannot imagine how it can\n // recompute the scroll position without a layout)\n this.dom.style.height = this.view.viewState.contentHeight + \"px\";\n this.dom.style.minWidth = this.minWidth ? this.minWidth + \"px\" : \"\";\n // Chrome will sometimes, when DOM mutations occur directly\n // around the selection, get confused and report a different\n // selection from the one it displays (issue #218). This tries\n // to detect that situation.\n let track = browser.chrome || browser.ios ? { node: observer.selectionRange.focusNode, written: false } : undefined;\n this.sync(track);\n this.dirty = 0 /* Not */;\n if (track && (track.written || observer.selectionRange.focusNode != track.node))\n this.forceSelection = true;\n this.dom.style.height = \"\";\n });\n let gaps = [];\n if (this.view.viewport.from || this.view.viewport.to < this.view.state.doc.length)\n for (let child of this.children)\n if (child instanceof BlockWidgetView && child.widget instanceof BlockGapWidget)\n gaps.push(child.dom);\n observer.updateGaps(gaps);\n }\n updateChildren(changes, oldLength) {\n let cursor = this.childCursor(oldLength);\n for (let i = changes.length - 1;; i--) {\n let next = i >= 0 ? changes[i] : null;\n if (!next)\n break;\n let { fromA, toA, fromB, toB } = next;\n let { content, breakAtStart, openStart, openEnd } = ContentBuilder.build(this.view.state.doc, fromB, toB, this.decorations, this.pluginDecorationLength);\n let { i: toI, off: toOff } = cursor.findPos(toA, 1);\n let { i: fromI, off: fromOff } = cursor.findPos(fromA, -1);\n replaceRange(this, fromI, fromOff, toI, toOff, content, breakAtStart, openStart, openEnd);\n }\n }\n // Sync the DOM selection to this.state.selection\n updateSelection(mustRead = false, fromPointer = false) {\n if (mustRead)\n this.view.observer.readSelectionRange();\n if (!(fromPointer || this.mayControlSelection()) ||\n browser.ios && this.view.inputState.rapidCompositionStart)\n return;\n let force = this.forceSelection;\n this.forceSelection = false;\n let main = this.view.state.selection.main;\n // FIXME need to handle the case where the selection falls inside a block range\n let anchor = this.domAtPos(main.anchor);\n let head = main.empty ? anchor : this.domAtPos(main.head);\n // Always reset on Firefox when next to an uneditable node to\n // avoid invisible cursor bugs (#111)\n if (browser.gecko && main.empty && betweenUneditable(anchor)) {\n let dummy = document.createTextNode(\"\");\n this.view.observer.ignore(() => anchor.node.insertBefore(dummy, anchor.node.childNodes[anchor.offset] || null));\n anchor = head = new DOMPos(dummy, 0);\n force = true;\n }\n let domSel = this.view.observer.selectionRange;\n // If the selection is already here, or in an equivalent position, don't touch it\n if (force || !domSel.focusNode ||\n !isEquivalentPosition(anchor.node, anchor.offset, domSel.anchorNode, domSel.anchorOffset) ||\n !isEquivalentPosition(head.node, head.offset, domSel.focusNode, domSel.focusOffset)) {\n this.view.observer.ignore(() => {\n // Chrome Android will hide the virtual keyboard when tapping\n // inside an uneditable node, and not bring it back when we\n // move the cursor to its proper position. This tries to\n // restore the keyboard by cycling focus.\n if (browser.android && browser.chrome && this.dom.contains(domSel.focusNode) &&\n inUneditable(domSel.focusNode, this.dom)) {\n this.dom.blur();\n this.dom.focus({ preventScroll: true });\n }\n let rawSel = getSelection(this.root);\n if (main.empty) {\n // Work around https://bugzilla.mozilla.org/show_bug.cgi?id=1612076\n if (browser.gecko) {\n let nextTo = nextToUneditable(anchor.node, anchor.offset);\n if (nextTo && nextTo != (1 /* Before */ | 2 /* After */)) {\n let text = nearbyTextNode(anchor.node, anchor.offset, nextTo == 1 /* Before */ ? 1 : -1);\n if (text)\n anchor = new DOMPos(text, nextTo == 1 /* Before */ ? 0 : text.nodeValue.length);\n }\n }\n rawSel.collapse(anchor.node, anchor.offset);\n if (main.bidiLevel != null && domSel.cursorBidiLevel != null)\n domSel.cursorBidiLevel = main.bidiLevel;\n }\n else if (rawSel.extend) {\n // Selection.extend can be used to create an 'inverted' selection\n // (one where the focus is before the anchor), but not all\n // browsers support it yet.\n rawSel.collapse(anchor.node, anchor.offset);\n rawSel.extend(head.node, head.offset);\n }\n else {\n // Primitive (IE) way\n let range = document.createRange();\n if (main.anchor > main.head)\n [anchor, head] = [head, anchor];\n range.setEnd(head.node, head.offset);\n range.setStart(anchor.node, anchor.offset);\n rawSel.removeAllRanges();\n rawSel.addRange(range);\n }\n });\n this.view.observer.setSelectionRange(anchor, head);\n }\n this.impreciseAnchor = anchor.precise ? null : new DOMPos(domSel.anchorNode, domSel.anchorOffset);\n this.impreciseHead = head.precise ? null : new DOMPos(domSel.focusNode, domSel.focusOffset);\n }\n enforceCursorAssoc() {\n if (this.compositionDeco.size)\n return;\n let cursor = this.view.state.selection.main;\n let sel = getSelection(this.root);\n if (!cursor.empty || !cursor.assoc || !sel.modify)\n return;\n let line = LineView.find(this, cursor.head);\n if (!line)\n return;\n let lineStart = line.posAtStart;\n if (cursor.head == lineStart || cursor.head == lineStart + line.length)\n return;\n let before = this.coordsAt(cursor.head, -1), after = this.coordsAt(cursor.head, 1);\n if (!before || !after || before.bottom > after.top)\n return;\n let dom = this.domAtPos(cursor.head + cursor.assoc);\n sel.collapse(dom.node, dom.offset);\n sel.modify(\"move\", cursor.assoc < 0 ? \"forward\" : \"backward\", \"lineboundary\");\n }\n mayControlSelection() {\n return this.view.state.facet(editable) ? this.root.activeElement == this.dom\n : hasSelection(this.dom, this.view.observer.selectionRange);\n }\n nearest(dom) {\n for (let cur = dom; cur;) {\n let domView = ContentView.get(cur);\n if (domView && domView.rootView == this)\n return domView;\n cur = cur.parentNode;\n }\n return null;\n }\n posFromDOM(node, offset) {\n let view = this.nearest(node);\n if (!view)\n throw new RangeError(\"Trying to find position for a DOM position outside of the document\");\n return view.localPosFromDOM(node, offset) + view.posAtStart;\n }\n domAtPos(pos) {\n let { i, off } = this.childCursor().findPos(pos, -1);\n for (; i < this.children.length - 1;) {\n let child = this.children[i];\n if (off < child.length || child instanceof LineView)\n break;\n i++;\n off = 0;\n }\n return this.children[i].domAtPos(off);\n }\n coordsAt(pos, side) {\n for (let off = this.length, i = this.children.length - 1;; i--) {\n let child = this.children[i], start = off - child.breakAfter - child.length;\n if (pos > start ||\n (pos == start && child.type != BlockType.WidgetBefore && child.type != BlockType.WidgetAfter &&\n (!i || side == 2 || this.children[i - 1].breakAfter ||\n (this.children[i - 1].type == BlockType.WidgetBefore && side > -2))))\n return child.coordsAt(pos - start, side);\n off = start;\n }\n }\n measureVisibleLineHeights() {\n let result = [], { from, to } = this.view.viewState.viewport;\n let contentWidth = this.view.contentDOM.clientWidth;\n let isWider = contentWidth > Math.max(this.view.scrollDOM.clientWidth, this.minWidth) + 1;\n let widest = -1;\n for (let pos = 0, i = 0; i < this.children.length; i++) {\n let child = this.children[i], end = pos + child.length;\n if (end > to)\n break;\n if (pos >= from) {\n let childRect = child.dom.getBoundingClientRect();\n result.push(childRect.height);\n if (isWider) {\n let last = child.dom.lastChild;\n let rects = last ? clientRectsFor(last) : [];\n if (rects.length) {\n let rect = rects[rects.length - 1];\n let width = this.view.textDirection == Direction.LTR ? rect.right - childRect.left\n : childRect.right - rect.left;\n if (width > widest) {\n widest = width;\n this.minWidth = contentWidth;\n this.minWidthFrom = pos;\n this.minWidthTo = end;\n }\n }\n }\n }\n pos = end + child.breakAfter;\n }\n return result;\n }\n measureTextSize() {\n for (let child of this.children) {\n if (child instanceof LineView) {\n let measure = child.measureTextSize();\n if (measure)\n return measure;\n }\n }\n // If no workable line exists, force a layout of a measurable element\n let dummy = document.createElement(\"div\"), lineHeight, charWidth;\n dummy.className = \"cm-line\";\n dummy.textContent = \"abc def ghi jkl mno pqr stu\";\n this.view.observer.ignore(() => {\n this.dom.appendChild(dummy);\n let rect = clientRectsFor(dummy.firstChild)[0];\n lineHeight = dummy.getBoundingClientRect().height;\n charWidth = rect ? rect.width / 27 : 7;\n dummy.remove();\n });\n return { lineHeight, charWidth };\n }\n childCursor(pos = this.length) {\n // Move back to start of last element when possible, so that\n // `ChildCursor.findPos` doesn't have to deal with the edge case\n // of being after the last element.\n let i = this.children.length;\n if (i)\n pos -= this.children[--i].length;\n return new ChildCursor(this.children, pos, i);\n }\n computeBlockGapDeco() {\n let deco = [], vs = this.view.viewState;\n for (let pos = 0, i = 0;; i++) {\n let next = i == vs.viewports.length ? null : vs.viewports[i];\n let end = next ? next.from - 1 : this.length;\n if (end > pos) {\n let height = vs.lineBlockAt(end).bottom - vs.lineBlockAt(pos).top;\n deco.push(Decoration.replace({\n widget: new BlockGapWidget(height),\n block: true,\n inclusive: true,\n isBlockGap: true,\n }).range(pos, end));\n }\n if (!next)\n break;\n pos = next.to + 1;\n }\n return Decoration.set(deco);\n }\n updateDeco() {\n let pluginDecorations = this.view.pluginField(PluginField.decorations);\n this.pluginDecorationLength = pluginDecorations.length;\n return this.decorations = [\n ...pluginDecorations,\n ...this.view.state.facet(decorations),\n this.compositionDeco,\n this.computeBlockGapDeco(),\n this.view.viewState.lineGapDeco\n ];\n }\n scrollIntoView(target) {\n let { range } = target;\n let rect = this.coordsAt(range.head, range.empty ? range.assoc : range.head > range.anchor ? -1 : 1), other;\n if (!rect)\n return;\n if (!range.empty && (other = this.coordsAt(range.anchor, range.anchor > range.head ? -1 : 1)))\n rect = { left: Math.min(rect.left, other.left), top: Math.min(rect.top, other.top),\n right: Math.max(rect.right, other.right), bottom: Math.max(rect.bottom, other.bottom) };\n let mLeft = 0, mRight = 0, mTop = 0, mBottom = 0;\n for (let margins of this.view.pluginField(PluginField.scrollMargins))\n if (margins) {\n let { left, right, top, bottom } = margins;\n if (left != null)\n mLeft = Math.max(mLeft, left);\n if (right != null)\n mRight = Math.max(mRight, right);\n if (top != null)\n mTop = Math.max(mTop, top);\n if (bottom != null)\n mBottom = Math.max(mBottom, bottom);\n }\n let targetRect = {\n left: rect.left - mLeft, top: rect.top - mTop,\n right: rect.right + mRight, bottom: rect.bottom + mBottom\n };\n scrollRectIntoView(this.view.scrollDOM, targetRect, range.head < range.anchor ? -1 : 1, target.x, target.y, target.xMargin, target.yMargin, this.view.textDirection == Direction.LTR);\n }\n}\nfunction betweenUneditable(pos) {\n return pos.node.nodeType == 1 && pos.node.firstChild &&\n (pos.offset == 0 || pos.node.childNodes[pos.offset - 1].contentEditable == \"false\") &&\n (pos.offset == pos.node.childNodes.length || pos.node.childNodes[pos.offset].contentEditable == \"false\");\n}\nclass BlockGapWidget extends WidgetType {\n constructor(height) {\n super();\n this.height = height;\n }\n toDOM() {\n let elt = document.createElement(\"div\");\n this.updateDOM(elt);\n return elt;\n }\n eq(other) { return other.height == this.height; }\n updateDOM(elt) {\n elt.style.height = this.height + \"px\";\n return true;\n }\n get estimatedHeight() { return this.height; }\n}\nfunction compositionSurroundingNode(view) {\n let sel = view.observer.selectionRange;\n let textNode = sel.focusNode && nearbyTextNode(sel.focusNode, sel.focusOffset, 0);\n if (!textNode)\n return null;\n let cView = view.docView.nearest(textNode);\n if (!cView)\n return null;\n if (cView instanceof LineView) {\n let topNode = textNode;\n while (topNode.parentNode != cView.dom)\n topNode = topNode.parentNode;\n let prev = topNode.previousSibling;\n while (prev && !ContentView.get(prev))\n prev = prev.previousSibling;\n let pos = prev ? ContentView.get(prev).posAtEnd : cView.posAtStart;\n return { from: pos, to: pos, node: topNode, text: textNode };\n }\n else {\n for (;;) {\n let { parent } = cView;\n if (!parent)\n return null;\n if (parent instanceof LineView)\n break;\n cView = parent;\n }\n let from = cView.posAtStart;\n return { from, to: from + cView.length, node: cView.dom, text: textNode };\n }\n}\nfunction computeCompositionDeco(view, changes) {\n let surrounding = compositionSurroundingNode(view);\n if (!surrounding)\n return Decoration.none;\n let { from, to, node, text: textNode } = surrounding;\n let newFrom = changes.mapPos(from, 1), newTo = Math.max(newFrom, changes.mapPos(to, -1));\n let { state } = view, text = node.nodeType == 3 ? node.nodeValue :\n new DOMReader([], state).readRange(node.firstChild, null).text;\n if (newTo - newFrom < text.length) {\n if (state.doc.sliceString(newFrom, Math.min(state.doc.length, newFrom + text.length), LineBreakPlaceholder) == text)\n newTo = newFrom + text.length;\n else if (state.doc.sliceString(Math.max(0, newTo - text.length), newTo, LineBreakPlaceholder) == text)\n newFrom = newTo - text.length;\n else\n return Decoration.none;\n }\n else if (state.doc.sliceString(newFrom, newTo, LineBreakPlaceholder) != text) {\n return Decoration.none;\n }\n let topView = ContentView.get(node);\n if (topView instanceof CompositionView)\n topView = topView.widget.topView;\n else if (topView)\n topView.parent = null;\n return Decoration.set(Decoration.replace({ widget: new CompositionWidget(node, textNode, topView) }).range(newFrom, newTo));\n}\nclass CompositionWidget extends WidgetType {\n constructor(top, text, topView) {\n super();\n this.top = top;\n this.text = text;\n this.topView = topView;\n }\n eq(other) { return this.top == other.top && this.text == other.text; }\n toDOM() { return this.top; }\n ignoreEvent() { return false; }\n get customView() { return CompositionView; }\n}\nfunction nearbyTextNode(node, offset, side) {\n for (;;) {\n if (node.nodeType == 3)\n return node;\n if (node.nodeType == 1 && offset > 0 && side <= 0) {\n node = node.childNodes[offset - 1];\n offset = maxOffset(node);\n }\n else if (node.nodeType == 1 && offset < node.childNodes.length && side >= 0) {\n node = node.childNodes[offset];\n offset = 0;\n }\n else {\n return null;\n }\n }\n}\nfunction nextToUneditable(node, offset) {\n if (node.nodeType != 1)\n return 0;\n return (offset && node.childNodes[offset - 1].contentEditable == \"false\" ? 1 /* Before */ : 0) |\n (offset < node.childNodes.length && node.childNodes[offset].contentEditable == \"false\" ? 2 /* After */ : 0);\n}\nclass DecorationComparator$1 {\n constructor() {\n this.changes = [];\n }\n compareRange(from, to) { addRange(from, to, this.changes); }\n comparePoint(from, to) { addRange(from, to, this.changes); }\n}\nfunction findChangedDeco(a, b, diff) {\n let comp = new DecorationComparator$1;\n RangeSet.compare(a, b, diff, comp);\n return comp.changes;\n}\nfunction inUneditable(node, inside) {\n for (let cur = node; cur && cur != inside; cur = cur.assignedSlot || cur.parentNode) {\n if (cur.nodeType == 1 && cur.contentEditable == 'false') {\n return true;\n }\n }\n return false;\n}\n\nfunction groupAt(state, pos, bias = 1) {\n let categorize = state.charCategorizer(pos);\n let line = state.doc.lineAt(pos), linePos = pos - line.from;\n if (line.length == 0)\n return EditorSelection.cursor(pos);\n if (linePos == 0)\n bias = 1;\n else if (linePos == line.length)\n bias = -1;\n let from = linePos, to = linePos;\n if (bias < 0)\n from = findClusterBreak(line.text, linePos, false);\n else\n to = findClusterBreak(line.text, linePos);\n let cat = categorize(line.text.slice(from, to));\n while (from > 0) {\n let prev = findClusterBreak(line.text, from, false);\n if (categorize(line.text.slice(prev, from)) != cat)\n break;\n from = prev;\n }\n while (to < line.length) {\n let next = findClusterBreak(line.text, to);\n if (categorize(line.text.slice(to, next)) != cat)\n break;\n to = next;\n }\n return EditorSelection.range(from + line.from, to + line.from);\n}\n// Search the DOM for the {node, offset} position closest to the given\n// coordinates. Very inefficient and crude, but can usually be avoided\n// by calling caret(Position|Range)FromPoint instead.\nfunction getdx(x, rect) {\n return rect.left > x ? rect.left - x : Math.max(0, x - rect.right);\n}\nfunction getdy(y, rect) {\n return rect.top > y ? rect.top - y : Math.max(0, y - rect.bottom);\n}\nfunction yOverlap(a, b) {\n return a.top < b.bottom - 1 && a.bottom > b.top + 1;\n}\nfunction upTop(rect, top) {\n return top < rect.top ? { top, left: rect.left, right: rect.right, bottom: rect.bottom } : rect;\n}\nfunction upBot(rect, bottom) {\n return bottom > rect.bottom ? { top: rect.top, left: rect.left, right: rect.right, bottom } : rect;\n}\nfunction domPosAtCoords(parent, x, y) {\n let closest, closestRect, closestX, closestY;\n let above, below, aboveRect, belowRect;\n for (let child = parent.firstChild; child; child = child.nextSibling) {\n let rects = clientRectsFor(child);\n for (let i = 0; i < rects.length; i++) {\n let rect = rects[i];\n if (closestRect && yOverlap(closestRect, rect))\n rect = upTop(upBot(rect, closestRect.bottom), closestRect.top);\n let dx = getdx(x, rect), dy = getdy(y, rect);\n if (dx == 0 && dy == 0)\n return child.nodeType == 3 ? domPosInText(child, x, y) : domPosAtCoords(child, x, y);\n if (!closest || closestY > dy || closestY == dy && closestX > dx) {\n closest = child;\n closestRect = rect;\n closestX = dx;\n closestY = dy;\n }\n if (dx == 0) {\n if (y > rect.bottom && (!aboveRect || aboveRect.bottom < rect.bottom)) {\n above = child;\n aboveRect = rect;\n }\n else if (y < rect.top && (!belowRect || belowRect.top > rect.top)) {\n below = child;\n belowRect = rect;\n }\n }\n else if (aboveRect && yOverlap(aboveRect, rect)) {\n aboveRect = upBot(aboveRect, rect.bottom);\n }\n else if (belowRect && yOverlap(belowRect, rect)) {\n belowRect = upTop(belowRect, rect.top);\n }\n }\n }\n if (aboveRect && aboveRect.bottom >= y) {\n closest = above;\n closestRect = aboveRect;\n }\n else if (belowRect && belowRect.top <= y) {\n closest = below;\n closestRect = belowRect;\n }\n if (!closest)\n return { node: parent, offset: 0 };\n let clipX = Math.max(closestRect.left, Math.min(closestRect.right, x));\n if (closest.nodeType == 3)\n return domPosInText(closest, clipX, y);\n if (!closestX && closest.contentEditable == \"true\")\n return domPosAtCoords(closest, clipX, y);\n let offset = Array.prototype.indexOf.call(parent.childNodes, closest) +\n (x >= (closestRect.left + closestRect.right) / 2 ? 1 : 0);\n return { node: parent, offset };\n}\nfunction domPosInText(node, x, y) {\n let len = node.nodeValue.length;\n let closestOffset = -1, closestDY = 1e9, generalSide = 0;\n for (let i = 0; i < len; i++) {\n let rects = textRange(node, i, i + 1).getClientRects();\n for (let j = 0; j < rects.length; j++) {\n let rect = rects[j];\n if (rect.top == rect.bottom)\n continue;\n if (!generalSide)\n generalSide = x - rect.left;\n let dy = (rect.top > y ? rect.top - y : y - rect.bottom) - 1;\n if (rect.left - 1 <= x && rect.right + 1 >= x && dy < closestDY) {\n let right = x >= (rect.left + rect.right) / 2, after = right;\n if (browser.chrome || browser.gecko) {\n // Check for RTL on browsers that support getting client\n // rects for empty ranges.\n let rectBefore = textRange(node, i).getBoundingClientRect();\n if (rectBefore.left == rect.right)\n after = !right;\n }\n if (dy <= 0)\n return { node, offset: i + (after ? 1 : 0) };\n closestOffset = i + (after ? 1 : 0);\n closestDY = dy;\n }\n }\n }\n return { node, offset: closestOffset > -1 ? closestOffset : generalSide > 0 ? node.nodeValue.length : 0 };\n}\nfunction posAtCoords(view, { x, y }, precise, bias = -1) {\n var _a;\n let content = view.contentDOM.getBoundingClientRect(), docTop = content.top + view.viewState.paddingTop;\n let block, { docHeight } = view.viewState;\n let yOffset = y - docTop;\n if (yOffset < 0)\n return 0;\n if (yOffset > docHeight)\n return view.state.doc.length;\n // Scan for a text block near the queried y position\n for (let halfLine = view.defaultLineHeight / 2, bounced = false;;) {\n block = view.elementAtHeight(yOffset);\n if (block.type == BlockType.Text)\n break;\n for (;;) {\n // Move the y position out of this block\n yOffset = bias > 0 ? block.bottom + halfLine : block.top - halfLine;\n if (yOffset >= 0 && yOffset <= docHeight)\n break;\n // If the document consists entirely of replaced widgets, we\n // won't find a text block, so return 0\n if (bounced)\n return precise ? null : 0;\n bounced = true;\n bias = -bias;\n }\n }\n y = docTop + yOffset;\n let lineStart = block.from;\n // If this is outside of the rendered viewport, we can't determine a position\n if (lineStart < view.viewport.from)\n return view.viewport.from == 0 ? 0 : precise ? null : posAtCoordsImprecise(view, content, block, x, y);\n if (lineStart > view.viewport.to)\n return view.viewport.to == view.state.doc.length ? view.state.doc.length :\n precise ? null : posAtCoordsImprecise(view, content, block, x, y);\n // Prefer ShadowRootOrDocument.elementFromPoint if present, fall back to document if not\n let doc = view.dom.ownerDocument;\n let root = view.root.elementFromPoint ? view.root : doc;\n let element = root.elementFromPoint(x, y);\n if (element && !view.contentDOM.contains(element))\n element = null;\n // If the element is unexpected, clip x at the sides of the content area and try again\n if (!element) {\n x = Math.max(content.left + 1, Math.min(content.right - 1, x));\n element = root.elementFromPoint(x, y);\n if (element && !view.contentDOM.contains(element))\n element = null;\n }\n // There's visible editor content under the point, so we can try\n // using caret(Position|Range)FromPoint as a shortcut\n let node, offset = -1;\n if (element && ((_a = view.docView.nearest(element)) === null || _a === void 0 ? void 0 : _a.isEditable) != false) {\n if (doc.caretPositionFromPoint) {\n let pos = doc.caretPositionFromPoint(x, y);\n if (pos)\n ({ offsetNode: node, offset } = pos);\n }\n else if (doc.caretRangeFromPoint) {\n let range = doc.caretRangeFromPoint(x, y);\n if (range) {\n ({ startContainer: node, startOffset: offset } = range);\n if (browser.safari && isSuspiciousCaretResult(node, offset, x))\n node = undefined;\n }\n }\n }\n // No luck, do our own (potentially expensive) search\n if (!node || !view.docView.dom.contains(node)) {\n let line = LineView.find(view.docView, lineStart);\n if (!line)\n return yOffset > block.top + block.height / 2 ? block.to : block.from;\n ({ node, offset } = domPosAtCoords(line.dom, x, y));\n }\n return view.docView.posFromDOM(node, offset);\n}\nfunction posAtCoordsImprecise(view, contentRect, block, x, y) {\n let into = Math.round((x - contentRect.left) * view.defaultCharacterWidth);\n if (view.lineWrapping && block.height > view.defaultLineHeight * 1.5) {\n let line = Math.floor((y - block.top) / view.defaultLineHeight);\n into += line * view.viewState.heightOracle.lineLength;\n }\n let content = view.state.sliceDoc(block.from, block.to);\n return block.from + findColumn(content, into, view.state.tabSize);\n}\n// In case of a high line height, Safari's caretRangeFromPoint treats\n// the space between lines as belonging to the last character of the\n// line before. This is used to detect such a result so that it can be\n// ignored (issue #401).\nfunction isSuspiciousCaretResult(node, offset, x) {\n let len;\n if (node.nodeType != 3 || offset != (len = node.nodeValue.length))\n return false;\n for (let next = node.nextSibling; next; next = next.nextSibling)\n if (next.nodeType != 1 || next.nodeName != \"BR\")\n return false;\n return textRange(node, len - 1, len).getBoundingClientRect().left > x;\n}\nfunction moveToLineBoundary(view, start, forward, includeWrap) {\n let line = view.state.doc.lineAt(start.head);\n let coords = !includeWrap || !view.lineWrapping ? null\n : view.coordsAtPos(start.assoc < 0 && start.head > line.from ? start.head - 1 : start.head);\n if (coords) {\n let editorRect = view.dom.getBoundingClientRect();\n let pos = view.posAtCoords({ x: forward == (view.textDirection == Direction.LTR) ? editorRect.right - 1 : editorRect.left + 1,\n y: (coords.top + coords.bottom) / 2 });\n if (pos != null)\n return EditorSelection.cursor(pos, forward ? -1 : 1);\n }\n let lineView = LineView.find(view.docView, start.head);\n let end = lineView ? (forward ? lineView.posAtEnd : lineView.posAtStart) : (forward ? line.to : line.from);\n return EditorSelection.cursor(end, forward ? -1 : 1);\n}\nfunction moveByChar(view, start, forward, by) {\n let line = view.state.doc.lineAt(start.head), spans = view.bidiSpans(line);\n for (let cur = start, check = null;;) {\n let next = moveVisually(line, spans, view.textDirection, cur, forward), char = movedOver;\n if (!next) {\n if (line.number == (forward ? view.state.doc.lines : 1))\n return cur;\n char = \"\\n\";\n line = view.state.doc.line(line.number + (forward ? 1 : -1));\n spans = view.bidiSpans(line);\n next = EditorSelection.cursor(forward ? line.from : line.to);\n }\n if (!check) {\n if (!by)\n return next;\n check = by(char);\n }\n else if (!check(char)) {\n return cur;\n }\n cur = next;\n }\n}\nfunction byGroup(view, pos, start) {\n let categorize = view.state.charCategorizer(pos);\n let cat = categorize(start);\n return (next) => {\n let nextCat = categorize(next);\n if (cat == CharCategory.Space)\n cat = nextCat;\n return cat == nextCat;\n };\n}\nfunction moveVertically(view, start, forward, distance) {\n let startPos = start.head, dir = forward ? 1 : -1;\n if (startPos == (forward ? view.state.doc.length : 0))\n return EditorSelection.cursor(startPos, start.assoc);\n let goal = start.goalColumn, startY;\n let rect = view.contentDOM.getBoundingClientRect();\n let startCoords = view.coordsAtPos(startPos), docTop = view.documentTop;\n if (startCoords) {\n if (goal == null)\n goal = startCoords.left - rect.left;\n startY = dir < 0 ? startCoords.top : startCoords.bottom;\n }\n else {\n let line = view.viewState.lineBlockAt(startPos - docTop);\n if (goal == null)\n goal = Math.min(rect.right - rect.left, view.defaultCharacterWidth * (startPos - line.from));\n startY = (dir < 0 ? line.top : line.bottom) + docTop;\n }\n let resolvedGoal = rect.left + goal;\n let dist = distance !== null && distance !== void 0 ? distance : (view.defaultLineHeight >> 1);\n for (let extra = 0;; extra += 10) {\n let curY = startY + (dist + extra) * dir;\n let pos = posAtCoords(view, { x: resolvedGoal, y: curY }, false, dir);\n if (curY < rect.top || curY > rect.bottom || (dir < 0 ? pos < startPos : pos > startPos))\n return EditorSelection.cursor(pos, start.assoc, undefined, goal);\n }\n}\nfunction skipAtoms(view, oldPos, pos) {\n let atoms = view.pluginField(PluginField.atomicRanges);\n for (;;) {\n let moved = false;\n for (let set of atoms) {\n set.between(pos.from - 1, pos.from + 1, (from, to, value) => {\n if (pos.from > from && pos.from < to) {\n pos = oldPos.from > pos.from ? EditorSelection.cursor(from, 1) : EditorSelection.cursor(to, -1);\n moved = true;\n }\n });\n }\n if (!moved)\n return pos;\n }\n}\n\n// This will also be where dragging info and such goes\nclass InputState {\n constructor(view) {\n this.lastKeyCode = 0;\n this.lastKeyTime = 0;\n // On iOS, some keys need to have their default behavior happen\n // (after which we retroactively handle them and reset the DOM) to\n // avoid messing up the virtual keyboard state.\n this.pendingIOSKey = undefined;\n this.lastSelectionOrigin = null;\n this.lastSelectionTime = 0;\n this.lastEscPress = 0;\n this.lastContextMenu = 0;\n this.scrollHandlers = [];\n this.registeredEvents = [];\n this.customHandlers = [];\n // -1 means not in a composition. Otherwise, this counts the number\n // of changes made during the composition. The count is used to\n // avoid treating the start state of the composition, before any\n // changes have been made, as part of the composition.\n this.composing = -1;\n // Tracks whether the next change should be marked as starting the\n // composition (null means no composition, true means next is the\n // first, false means first has already been marked for this\n // composition)\n this.compositionFirstChange = null;\n this.compositionEndedAt = 0;\n this.rapidCompositionStart = false;\n this.mouseSelection = null;\n for (let type in handlers) {\n let handler = handlers[type];\n view.contentDOM.addEventListener(type, (event) => {\n if (!eventBelongsToEditor(view, event) || this.ignoreDuringComposition(event))\n return;\n if (type == \"keydown\" && this.keydown(view, event))\n return;\n if (this.mustFlushObserver(event))\n view.observer.forceFlush();\n if (this.runCustomHandlers(type, view, event))\n event.preventDefault();\n else\n handler(view, event);\n });\n this.registeredEvents.push(type);\n }\n this.notifiedFocused = view.hasFocus;\n this.ensureHandlers(view);\n // On Safari adding an input event handler somehow prevents an\n // issue where the composition vanishes when you press enter.\n if (browser.safari)\n view.contentDOM.addEventListener(\"input\", () => null);\n }\n setSelectionOrigin(origin) {\n this.lastSelectionOrigin = origin;\n this.lastSelectionTime = Date.now();\n }\n ensureHandlers(view) {\n let handlers = this.customHandlers = view.pluginField(domEventHandlers);\n for (let set of handlers) {\n for (let type in set.handlers)\n if (this.registeredEvents.indexOf(type) < 0 && type != \"scroll\") {\n this.registeredEvents.push(type);\n view.contentDOM.addEventListener(type, (event) => {\n if (!eventBelongsToEditor(view, event))\n return;\n if (this.runCustomHandlers(type, view, event))\n event.preventDefault();\n });\n }\n }\n }\n runCustomHandlers(type, view, event) {\n for (let set of this.customHandlers) {\n let handler = set.handlers[type];\n if (handler) {\n try {\n if (handler.call(set.plugin, event, view) || event.defaultPrevented)\n return true;\n }\n catch (e) {\n logException(view.state, e);\n }\n }\n }\n return false;\n }\n runScrollHandlers(view, event) {\n for (let set of this.customHandlers) {\n let handler = set.handlers.scroll;\n if (handler) {\n try {\n handler.call(set.plugin, event, view);\n }\n catch (e) {\n logException(view.state, e);\n }\n }\n }\n }\n keydown(view, event) {\n // Must always run, even if a custom handler handled the event\n this.lastKeyCode = event.keyCode;\n this.lastKeyTime = Date.now();\n if (event.keyCode == 9 && Date.now() < this.lastEscPress + 2000)\n return true;\n // Chrome for Android usually doesn't fire proper key events, but\n // occasionally does, usually surrounded by a bunch of complicated\n // composition changes. When an enter or backspace key event is\n // seen, hold off on handling DOM events for a bit, and then\n // dispatch it.\n if (browser.android && browser.chrome && !event.synthetic &&\n (event.keyCode == 13 || event.keyCode == 8)) {\n view.observer.delayAndroidKey(event.key, event.keyCode);\n return true;\n }\n // Prevent the default behavior of Enter on iOS makes the\n // virtual keyboard get stuck in the wrong (lowercase)\n // state. So we let it go through, and then, in\n // applyDOMChange, notify key handlers of it and reset to\n // the state they produce.\n let pending;\n if (browser.ios && (pending = PendingKeys.find(key => key.keyCode == event.keyCode)) &&\n !(event.ctrlKey || event.altKey || event.metaKey) && !event.synthetic) {\n this.pendingIOSKey = pending;\n setTimeout(() => this.flushIOSKey(view), 250);\n return true;\n }\n return false;\n }\n flushIOSKey(view) {\n let key = this.pendingIOSKey;\n if (!key)\n return false;\n this.pendingIOSKey = undefined;\n return dispatchKey(view.contentDOM, key.key, key.keyCode);\n }\n ignoreDuringComposition(event) {\n if (!/^key/.test(event.type))\n return false;\n if (this.composing > 0)\n return true;\n // See https://www.stum.de/2016/06/24/handling-ime-events-in-javascript/.\n // On some input method editors (IMEs), the Enter key is used to\n // confirm character selection. On Safari, when Enter is pressed,\n // compositionend and keydown events are sometimes emitted in the\n // wrong order. The key event should still be ignored, even when\n // it happens after the compositionend event.\n if (browser.safari && Date.now() - this.compositionEndedAt < 500) {\n this.compositionEndedAt = 0;\n return true;\n }\n return false;\n }\n mustFlushObserver(event) {\n return (event.type == \"keydown\" && event.keyCode != 229) ||\n event.type == \"compositionend\" && !browser.ios;\n }\n startMouseSelection(mouseSelection) {\n if (this.mouseSelection)\n this.mouseSelection.destroy();\n this.mouseSelection = mouseSelection;\n }\n update(update) {\n if (this.mouseSelection)\n this.mouseSelection.update(update);\n if (update.transactions.length)\n this.lastKeyCode = this.lastSelectionTime = 0;\n }\n destroy() {\n if (this.mouseSelection)\n this.mouseSelection.destroy();\n }\n}\nconst PendingKeys = [\n { key: \"Backspace\", keyCode: 8, inputType: \"deleteContentBackward\" },\n { key: \"Enter\", keyCode: 13, inputType: \"insertParagraph\" },\n { key: \"Delete\", keyCode: 46, inputType: \"deleteContentForward\" }\n];\n// Key codes for modifier keys\nconst modifierCodes = [16, 17, 18, 20, 91, 92, 224, 225];\nclass MouseSelection {\n constructor(view, startEvent, style, mustSelect) {\n this.view = view;\n this.style = style;\n this.mustSelect = mustSelect;\n this.lastEvent = startEvent;\n let doc = view.contentDOM.ownerDocument;\n doc.addEventListener(\"mousemove\", this.move = this.move.bind(this));\n doc.addEventListener(\"mouseup\", this.up = this.up.bind(this));\n this.extend = startEvent.shiftKey;\n this.multiple = view.state.facet(EditorState.allowMultipleSelections) && addsSelectionRange(view, startEvent);\n this.dragMove = dragMovesSelection(view, startEvent);\n this.dragging = isInPrimarySelection(view, startEvent) && getClickType(startEvent) == 1 ? null : false;\n // When clicking outside of the selection, immediately apply the\n // effect of starting the selection\n if (this.dragging === false) {\n startEvent.preventDefault();\n this.select(startEvent);\n }\n }\n move(event) {\n if (event.buttons == 0)\n return this.destroy();\n if (this.dragging !== false)\n return;\n this.select(this.lastEvent = event);\n }\n up(event) {\n if (this.dragging == null)\n this.select(this.lastEvent);\n if (!this.dragging)\n event.preventDefault();\n this.destroy();\n }\n destroy() {\n let doc = this.view.contentDOM.ownerDocument;\n doc.removeEventListener(\"mousemove\", this.move);\n doc.removeEventListener(\"mouseup\", this.up);\n this.view.inputState.mouseSelection = null;\n }\n select(event) {\n let selection = this.style.get(event, this.extend, this.multiple);\n if (this.mustSelect || !selection.eq(this.view.state.selection) ||\n selection.main.assoc != this.view.state.selection.main.assoc)\n this.view.dispatch({\n selection,\n userEvent: \"select.pointer\",\n scrollIntoView: true\n });\n this.mustSelect = false;\n }\n update(update) {\n if (update.docChanged && this.dragging)\n this.dragging = this.dragging.map(update.changes);\n if (this.style.update(update))\n setTimeout(() => this.select(this.lastEvent), 20);\n }\n}\nfunction addsSelectionRange(view, event) {\n let facet = view.state.facet(clickAddsSelectionRange);\n return facet.length ? facet[0](event) : browser.mac ? event.metaKey : event.ctrlKey;\n}\nfunction dragMovesSelection(view, event) {\n let facet = view.state.facet(dragMovesSelection$1);\n return facet.length ? facet[0](event) : browser.mac ? !event.altKey : !event.ctrlKey;\n}\nfunction isInPrimarySelection(view, event) {\n let { main } = view.state.selection;\n if (main.empty)\n return false;\n // On boundary clicks, check whether the coordinates are inside the\n // selection's client rectangles\n let sel = getSelection(view.root);\n if (sel.rangeCount == 0)\n return true;\n let rects = sel.getRangeAt(0).getClientRects();\n for (let i = 0; i < rects.length; i++) {\n let rect = rects[i];\n if (rect.left <= event.clientX && rect.right >= event.clientX &&\n rect.top <= event.clientY && rect.bottom >= event.clientY)\n return true;\n }\n return false;\n}\nfunction eventBelongsToEditor(view, event) {\n if (!event.bubbles)\n return true;\n if (event.defaultPrevented)\n return false;\n for (let node = event.target, cView; node != view.contentDOM; node = node.parentNode)\n if (!node || node.nodeType == 11 || ((cView = ContentView.get(node)) && cView.ignoreEvent(event)))\n return false;\n return true;\n}\nconst handlers = /*@__PURE__*/Object.create(null);\n// This is very crude, but unfortunately both these browsers _pretend_\n// that they have a clipboard API—all the objects and methods are\n// there, they just don't work, and they are hard to test.\nconst brokenClipboardAPI = (browser.ie && browser.ie_version < 15) ||\n (browser.ios && browser.webkit_version < 604);\nfunction capturePaste(view) {\n let parent = view.dom.parentNode;\n if (!parent)\n return;\n let target = parent.appendChild(document.createElement(\"textarea\"));\n target.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n target.focus();\n setTimeout(() => {\n view.focus();\n target.remove();\n doPaste(view, target.value);\n }, 50);\n}\nfunction doPaste(view, input) {\n let { state } = view, changes, i = 1, text = state.toText(input);\n let byLine = text.lines == state.selection.ranges.length;\n let linewise = lastLinewiseCopy != null && state.selection.ranges.every(r => r.empty) && lastLinewiseCopy == text.toString();\n if (linewise) {\n let lastLine = -1;\n changes = state.changeByRange(range => {\n let line = state.doc.lineAt(range.from);\n if (line.from == lastLine)\n return { range };\n lastLine = line.from;\n let insert = state.toText((byLine ? text.line(i++).text : input) + state.lineBreak);\n return { changes: { from: line.from, insert },\n range: EditorSelection.cursor(range.from + insert.length) };\n });\n }\n else if (byLine) {\n changes = state.changeByRange(range => {\n let line = text.line(i++);\n return { changes: { from: range.from, to: range.to, insert: line.text },\n range: EditorSelection.cursor(range.from + line.length) };\n });\n }\n else {\n changes = state.replaceSelection(text);\n }\n view.dispatch(changes, {\n userEvent: \"input.paste\",\n scrollIntoView: true\n });\n}\nhandlers.keydown = (view, event) => {\n view.inputState.setSelectionOrigin(\"select\");\n if (event.keyCode == 27)\n view.inputState.lastEscPress = Date.now();\n else if (modifierCodes.indexOf(event.keyCode) < 0)\n view.inputState.lastEscPress = 0;\n};\nlet lastTouch = 0;\nhandlers.touchstart = (view, e) => {\n lastTouch = Date.now();\n view.inputState.setSelectionOrigin(\"select.pointer\");\n};\nhandlers.touchmove = view => {\n view.inputState.setSelectionOrigin(\"select.pointer\");\n};\nhandlers.mousedown = (view, event) => {\n view.observer.flush();\n if (lastTouch > Date.now() - 2000 && getClickType(event) == 1)\n return; // Ignore touch interaction\n let style = null;\n for (let makeStyle of view.state.facet(mouseSelectionStyle)) {\n style = makeStyle(view, event);\n if (style)\n break;\n }\n if (!style && event.button == 0)\n style = basicMouseSelection(view, event);\n if (style) {\n let mustFocus = view.root.activeElement != view.contentDOM;\n if (mustFocus)\n view.observer.ignore(() => focusPreventScroll(view.contentDOM));\n view.inputState.startMouseSelection(new MouseSelection(view, event, style, mustFocus));\n }\n};\nfunction rangeForClick(view, pos, bias, type) {\n if (type == 1) { // Single click\n return EditorSelection.cursor(pos, bias);\n }\n else if (type == 2) { // Double click\n return groupAt(view.state, pos, bias);\n }\n else { // Triple click\n let visual = LineView.find(view.docView, pos), line = view.state.doc.lineAt(visual ? visual.posAtEnd : pos);\n let from = visual ? visual.posAtStart : line.from, to = visual ? visual.posAtEnd : line.to;\n if (to < view.state.doc.length && to == line.to)\n to++;\n return EditorSelection.range(from, to);\n }\n}\nlet insideY = (y, rect) => y >= rect.top && y <= rect.bottom;\nlet inside = (x, y, rect) => insideY(y, rect) && x >= rect.left && x <= rect.right;\n// Try to determine, for the given coordinates, associated with the\n// given position, whether they are related to the element before or\n// the element after the position.\nfunction findPositionSide(view, pos, x, y) {\n let line = LineView.find(view.docView, pos);\n if (!line)\n return 1;\n let off = pos - line.posAtStart;\n // Line boundaries point into the line\n if (off == 0)\n return 1;\n if (off == line.length)\n return -1;\n // Positions on top of an element point at that element\n let before = line.coordsAt(off, -1);\n if (before && inside(x, y, before))\n return -1;\n let after = line.coordsAt(off, 1);\n if (after && inside(x, y, after))\n return 1;\n // This is probably a line wrap point. Pick before if the point is\n // beside it.\n return before && insideY(y, before) ? -1 : 1;\n}\nfunction queryPos(view, event) {\n let pos = view.posAtCoords({ x: event.clientX, y: event.clientY }, false);\n return { pos, bias: findPositionSide(view, pos, event.clientX, event.clientY) };\n}\nconst BadMouseDetail = browser.ie && browser.ie_version <= 11;\nlet lastMouseDown = null, lastMouseDownCount = 0, lastMouseDownTime = 0;\nfunction getClickType(event) {\n if (!BadMouseDetail)\n return event.detail;\n let last = lastMouseDown, lastTime = lastMouseDownTime;\n lastMouseDown = event;\n lastMouseDownTime = Date.now();\n return lastMouseDownCount = !last || (lastTime > Date.now() - 400 && Math.abs(last.clientX - event.clientX) < 2 &&\n Math.abs(last.clientY - event.clientY) < 2) ? (lastMouseDownCount + 1) % 3 : 1;\n}\nfunction basicMouseSelection(view, event) {\n let start = queryPos(view, event), type = getClickType(event);\n let startSel = view.state.selection;\n let last = start, lastEvent = event;\n return {\n update(update) {\n if (update.docChanged) {\n if (start)\n start.pos = update.changes.mapPos(start.pos);\n startSel = startSel.map(update.changes);\n lastEvent = null;\n }\n },\n get(event, extend, multiple) {\n let cur;\n if (lastEvent && event.clientX == lastEvent.clientX && event.clientY == lastEvent.clientY)\n cur = last;\n else {\n cur = last = queryPos(view, event);\n lastEvent = event;\n }\n if (!cur || !start)\n return startSel;\n let range = rangeForClick(view, cur.pos, cur.bias, type);\n if (start.pos != cur.pos && !extend) {\n let startRange = rangeForClick(view, start.pos, start.bias, type);\n let from = Math.min(startRange.from, range.from), to = Math.max(startRange.to, range.to);\n range = from < range.from ? EditorSelection.range(from, to) : EditorSelection.range(to, from);\n }\n if (extend)\n return startSel.replaceRange(startSel.main.extend(range.from, range.to));\n else if (multiple)\n return startSel.addRange(range);\n else\n return EditorSelection.create([range]);\n }\n };\n}\nhandlers.dragstart = (view, event) => {\n let { selection: { main } } = view.state;\n let { mouseSelection } = view.inputState;\n if (mouseSelection)\n mouseSelection.dragging = main;\n if (event.dataTransfer) {\n event.dataTransfer.setData(\"Text\", view.state.sliceDoc(main.from, main.to));\n event.dataTransfer.effectAllowed = \"copyMove\";\n }\n};\nfunction dropText(view, event, text, direct) {\n if (!text)\n return;\n let dropPos = view.posAtCoords({ x: event.clientX, y: event.clientY }, false);\n event.preventDefault();\n let { mouseSelection } = view.inputState;\n let del = direct && mouseSelection && mouseSelection.dragging && mouseSelection.dragMove ?\n { from: mouseSelection.dragging.from, to: mouseSelection.dragging.to } : null;\n let ins = { from: dropPos, insert: text };\n let changes = view.state.changes(del ? [del, ins] : ins);\n view.focus();\n view.dispatch({\n changes,\n selection: { anchor: changes.mapPos(dropPos, -1), head: changes.mapPos(dropPos, 1) },\n userEvent: del ? \"move.drop\" : \"input.drop\"\n });\n}\nhandlers.drop = (view, event) => {\n if (!event.dataTransfer)\n return;\n if (view.state.readOnly)\n return event.preventDefault();\n let files = event.dataTransfer.files;\n if (files && files.length) { // For a file drop, read the file's text.\n event.preventDefault();\n let text = Array(files.length), read = 0;\n let finishFile = () => {\n if (++read == files.length)\n dropText(view, event, text.filter(s => s != null).join(view.state.lineBreak), false);\n };\n for (let i = 0; i < files.length; i++) {\n let reader = new FileReader;\n reader.onerror = finishFile;\n reader.onload = () => {\n if (!/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(reader.result))\n text[i] = reader.result;\n finishFile();\n };\n reader.readAsText(files[i]);\n }\n }\n else {\n dropText(view, event, event.dataTransfer.getData(\"Text\"), true);\n }\n};\nhandlers.paste = (view, event) => {\n if (view.state.readOnly)\n return event.preventDefault();\n view.observer.flush();\n let data = brokenClipboardAPI ? null : event.clipboardData;\n if (data) {\n doPaste(view, data.getData(\"text/plain\"));\n event.preventDefault();\n }\n else {\n capturePaste(view);\n }\n};\nfunction captureCopy(view, text) {\n // The extra wrapper is somehow necessary on IE/Edge to prevent the\n // content from being mangled when it is put onto the clipboard\n let parent = view.dom.parentNode;\n if (!parent)\n return;\n let target = parent.appendChild(document.createElement(\"textarea\"));\n target.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n target.value = text;\n target.focus();\n target.selectionEnd = text.length;\n target.selectionStart = 0;\n setTimeout(() => {\n target.remove();\n view.focus();\n }, 50);\n}\nfunction copiedRange(state) {\n let content = [], ranges = [], linewise = false;\n for (let range of state.selection.ranges)\n if (!range.empty) {\n content.push(state.sliceDoc(range.from, range.to));\n ranges.push(range);\n }\n if (!content.length) {\n // Nothing selected, do a line-wise copy\n let upto = -1;\n for (let { from } of state.selection.ranges) {\n let line = state.doc.lineAt(from);\n if (line.number > upto) {\n content.push(line.text);\n ranges.push({ from: line.from, to: Math.min(state.doc.length, line.to + 1) });\n }\n upto = line.number;\n }\n linewise = true;\n }\n return { text: content.join(state.lineBreak), ranges, linewise };\n}\nlet lastLinewiseCopy = null;\nhandlers.copy = handlers.cut = (view, event) => {\n let { text, ranges, linewise } = copiedRange(view.state);\n if (!text && !linewise)\n return;\n lastLinewiseCopy = linewise ? text : null;\n let data = brokenClipboardAPI ? null : event.clipboardData;\n if (data) {\n event.preventDefault();\n data.clearData();\n data.setData(\"text/plain\", text);\n }\n else {\n captureCopy(view, text);\n }\n if (event.type == \"cut\" && !view.state.readOnly)\n view.dispatch({\n changes: ranges,\n scrollIntoView: true,\n userEvent: \"delete.cut\"\n });\n};\nhandlers.focus = handlers.blur = view => {\n setTimeout(() => {\n if (view.hasFocus != view.inputState.notifiedFocused)\n view.update([]);\n }, 10);\n};\nfunction forceClearComposition(view, rapid) {\n if (view.docView.compositionDeco.size) {\n view.inputState.rapidCompositionStart = rapid;\n try {\n view.update([]);\n }\n finally {\n view.inputState.rapidCompositionStart = false;\n }\n }\n}\nhandlers.compositionstart = handlers.compositionupdate = view => {\n if (view.inputState.compositionFirstChange == null)\n view.inputState.compositionFirstChange = true;\n if (view.inputState.composing < 0) {\n // FIXME possibly set a timeout to clear it again on Android\n view.inputState.composing = 0;\n if (view.docView.compositionDeco.size) {\n view.observer.flush();\n forceClearComposition(view, true);\n }\n }\n};\nhandlers.compositionend = view => {\n view.inputState.composing = -1;\n view.inputState.compositionEndedAt = Date.now();\n view.inputState.compositionFirstChange = null;\n setTimeout(() => {\n if (view.inputState.composing < 0)\n forceClearComposition(view, false);\n }, 50);\n};\nhandlers.contextmenu = view => {\n view.inputState.lastContextMenu = Date.now();\n};\nhandlers.beforeinput = (view, event) => {\n var _a;\n // Because Chrome Android doesn't fire useful key events, use\n // beforeinput to detect backspace (and possibly enter and delete,\n // but those usually don't even seem to fire beforeinput events at\n // the moment) and fake a key event for it.\n //\n // (preventDefault on beforeinput, though supported in the spec,\n // seems to do nothing at all on Chrome).\n let pending;\n if (browser.chrome && browser.android && (pending = PendingKeys.find(key => key.inputType == event.inputType))) {\n view.observer.delayAndroidKey(pending.key, pending.keyCode);\n if (pending.key == \"Backspace\" || pending.key == \"Delete\") {\n let startViewHeight = ((_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.height) || 0;\n setTimeout(() => {\n var _a;\n // Backspacing near uneditable nodes on Chrome Android sometimes\n // closes the virtual keyboard. This tries to crudely detect\n // that and refocus to get it back.\n if ((((_a = window.visualViewport) === null || _a === void 0 ? void 0 : _a.height) || 0) > startViewHeight + 10 && view.hasFocus) {\n view.contentDOM.blur();\n view.focus();\n }\n }, 100);\n }\n }\n};\n\nconst wrappingWhiteSpace = [\"pre-wrap\", \"normal\", \"pre-line\", \"break-spaces\"];\nclass HeightOracle {\n constructor() {\n this.doc = Text.empty;\n this.lineWrapping = false;\n this.direction = Direction.LTR;\n this.heightSamples = {};\n this.lineHeight = 14;\n this.charWidth = 7;\n this.lineLength = 30;\n // Used to track, during updateHeight, if any actual heights changed\n this.heightChanged = false;\n }\n heightForGap(from, to) {\n let lines = this.doc.lineAt(to).number - this.doc.lineAt(from).number + 1;\n if (this.lineWrapping)\n lines += Math.ceil(((to - from) - (lines * this.lineLength * 0.5)) / this.lineLength);\n return this.lineHeight * lines;\n }\n heightForLine(length) {\n if (!this.lineWrapping)\n return this.lineHeight;\n let lines = 1 + Math.max(0, Math.ceil((length - this.lineLength) / (this.lineLength - 5)));\n return lines * this.lineHeight;\n }\n setDoc(doc) { this.doc = doc; return this; }\n mustRefreshForStyle(whiteSpace, direction) {\n return (wrappingWhiteSpace.indexOf(whiteSpace) > -1) != this.lineWrapping || this.direction != direction;\n }\n mustRefreshForHeights(lineHeights) {\n let newHeight = false;\n for (let i = 0; i < lineHeights.length; i++) {\n let h = lineHeights[i];\n if (h < 0) {\n i++;\n }\n else if (!this.heightSamples[Math.floor(h * 10)]) { // Round to .1 pixels\n newHeight = true;\n this.heightSamples[Math.floor(h * 10)] = true;\n }\n }\n return newHeight;\n }\n refresh(whiteSpace, direction, lineHeight, charWidth, lineLength, knownHeights) {\n let lineWrapping = wrappingWhiteSpace.indexOf(whiteSpace) > -1;\n let changed = Math.round(lineHeight) != Math.round(this.lineHeight) ||\n this.lineWrapping != lineWrapping ||\n this.direction != direction;\n this.lineWrapping = lineWrapping;\n this.direction = direction;\n this.lineHeight = lineHeight;\n this.charWidth = charWidth;\n this.lineLength = lineLength;\n if (changed) {\n this.heightSamples = {};\n for (let i = 0; i < knownHeights.length; i++) {\n let h = knownHeights[i];\n if (h < 0)\n i++;\n else\n this.heightSamples[Math.floor(h * 10)] = true;\n }\n }\n return changed;\n }\n}\n// This object is used by `updateHeight` to make DOM measurements\n// arrive at the right nides. The `heights` array is a sequence of\n// block heights, starting from position `from`.\nclass MeasuredHeights {\n constructor(from, heights) {\n this.from = from;\n this.heights = heights;\n this.index = 0;\n }\n get more() { return this.index < this.heights.length; }\n}\n/**\nRecord used to represent information about a block-level element\nin the editor view.\n*/\nclass BlockInfo {\n /**\n @internal\n */\n constructor(\n /**\n The start of the element in the document.\n */\n from, \n /**\n The length of the element.\n */\n length, \n /**\n The top position of the element (relative to the top of the\n document).\n */\n top, \n /**\n Its height.\n */\n height, \n /**\n The type of element this is. When querying lines, this may be\n an array of all the blocks that make up the line.\n */\n type) {\n this.from = from;\n this.length = length;\n this.top = top;\n this.height = height;\n this.type = type;\n }\n /**\n The end of the element as a document position.\n */\n get to() { return this.from + this.length; }\n /**\n The bottom position of the element.\n */\n get bottom() { return this.top + this.height; }\n /**\n @internal\n */\n join(other) {\n let detail = (Array.isArray(this.type) ? this.type : [this])\n .concat(Array.isArray(other.type) ? other.type : [other]);\n return new BlockInfo(this.from, this.length + other.length, this.top, this.height + other.height, detail);\n }\n /**\n FIXME remove on next breaking release @internal\n */\n moveY(offset) {\n return !offset ? this : new BlockInfo(this.from, this.length, this.top + offset, this.height, Array.isArray(this.type) ? this.type.map(b => b.moveY(offset)) : this.type);\n }\n}\nvar QueryType = /*@__PURE__*/(function (QueryType) {\n QueryType[QueryType[\"ByPos\"] = 0] = \"ByPos\";\n QueryType[QueryType[\"ByHeight\"] = 1] = \"ByHeight\";\n QueryType[QueryType[\"ByPosNoHeight\"] = 2] = \"ByPosNoHeight\";\nreturn QueryType})(QueryType || (QueryType = {}));\nconst Epsilon = 1e-3;\nclass HeightMap {\n constructor(length, // The number of characters covered\n height, // Height of this part of the document\n flags = 2 /* Outdated */) {\n this.length = length;\n this.height = height;\n this.flags = flags;\n }\n get outdated() { return (this.flags & 2 /* Outdated */) > 0; }\n set outdated(value) { this.flags = (value ? 2 /* Outdated */ : 0) | (this.flags & ~2 /* Outdated */); }\n setHeight(oracle, height) {\n if (this.height != height) {\n if (Math.abs(this.height - height) > Epsilon)\n oracle.heightChanged = true;\n this.height = height;\n }\n }\n // Base case is to replace a leaf node, which simply builds a tree\n // from the new nodes and returns that (HeightMapBranch and\n // HeightMapGap override this to actually use from/to)\n replace(_from, _to, nodes) {\n return HeightMap.of(nodes);\n }\n // Again, these are base cases, and are overridden for branch and gap nodes.\n decomposeLeft(_to, result) { result.push(this); }\n decomposeRight(_from, result) { result.push(this); }\n applyChanges(decorations, oldDoc, oracle, changes) {\n let me = this;\n for (let i = changes.length - 1; i >= 0; i--) {\n let { fromA, toA, fromB, toB } = changes[i];\n let start = me.lineAt(fromA, QueryType.ByPosNoHeight, oldDoc, 0, 0);\n let end = start.to >= toA ? start : me.lineAt(toA, QueryType.ByPosNoHeight, oldDoc, 0, 0);\n toB += end.to - toA;\n toA = end.to;\n while (i > 0 && start.from <= changes[i - 1].toA) {\n fromA = changes[i - 1].fromA;\n fromB = changes[i - 1].fromB;\n i--;\n if (fromA < start.from)\n start = me.lineAt(fromA, QueryType.ByPosNoHeight, oldDoc, 0, 0);\n }\n fromB += start.from - fromA;\n fromA = start.from;\n let nodes = NodeBuilder.build(oracle, decorations, fromB, toB);\n me = me.replace(fromA, toA, nodes);\n }\n return me.updateHeight(oracle, 0);\n }\n static empty() { return new HeightMapText(0, 0); }\n // nodes uses null values to indicate the position of line breaks.\n // There are never line breaks at the start or end of the array, or\n // two line breaks next to each other, and the array isn't allowed\n // to be empty (same restrictions as return value from the builder).\n static of(nodes) {\n if (nodes.length == 1)\n return nodes[0];\n let i = 0, j = nodes.length, before = 0, after = 0;\n for (;;) {\n if (i == j) {\n if (before > after * 2) {\n let split = nodes[i - 1];\n if (split.break)\n nodes.splice(--i, 1, split.left, null, split.right);\n else\n nodes.splice(--i, 1, split.left, split.right);\n j += 1 + split.break;\n before -= split.size;\n }\n else if (after > before * 2) {\n let split = nodes[j];\n if (split.break)\n nodes.splice(j, 1, split.left, null, split.right);\n else\n nodes.splice(j, 1, split.left, split.right);\n j += 2 + split.break;\n after -= split.size;\n }\n else {\n break;\n }\n }\n else if (before < after) {\n let next = nodes[i++];\n if (next)\n before += next.size;\n }\n else {\n let next = nodes[--j];\n if (next)\n after += next.size;\n }\n }\n let brk = 0;\n if (nodes[i - 1] == null) {\n brk = 1;\n i--;\n }\n else if (nodes[i] == null) {\n brk = 1;\n j++;\n }\n return new HeightMapBranch(HeightMap.of(nodes.slice(0, i)), brk, HeightMap.of(nodes.slice(j)));\n }\n}\nHeightMap.prototype.size = 1;\nclass HeightMapBlock extends HeightMap {\n constructor(length, height, type) {\n super(length, height);\n this.type = type;\n }\n blockAt(_height, _doc, top, offset) {\n return new BlockInfo(offset, this.length, top, this.height, this.type);\n }\n lineAt(_value, _type, doc, top, offset) {\n return this.blockAt(0, doc, top, offset);\n }\n forEachLine(_from, _to, doc, top, offset, f) {\n f(this.blockAt(0, doc, top, offset));\n }\n updateHeight(oracle, offset = 0, _force = false, measured) {\n if (measured && measured.from <= offset && measured.more)\n this.setHeight(oracle, measured.heights[measured.index++]);\n this.outdated = false;\n return this;\n }\n toString() { return `block(${this.length})`; }\n}\nclass HeightMapText extends HeightMapBlock {\n constructor(length, height) {\n super(length, height, BlockType.Text);\n this.collapsed = 0; // Amount of collapsed content in the line\n this.widgetHeight = 0; // Maximum inline widget height\n }\n replace(_from, _to, nodes) {\n let node = nodes[0];\n if (nodes.length == 1 && (node instanceof HeightMapText || node instanceof HeightMapGap && (node.flags & 4 /* SingleLine */)) &&\n Math.abs(this.length - node.length) < 10) {\n if (node instanceof HeightMapGap)\n node = new HeightMapText(node.length, this.height);\n else\n node.height = this.height;\n if (!this.outdated)\n node.outdated = false;\n return node;\n }\n else {\n return HeightMap.of(nodes);\n }\n }\n updateHeight(oracle, offset = 0, force = false, measured) {\n if (measured && measured.from <= offset && measured.more)\n this.setHeight(oracle, measured.heights[measured.index++]);\n else if (force || this.outdated)\n this.setHeight(oracle, Math.max(this.widgetHeight, oracle.heightForLine(this.length - this.collapsed)));\n this.outdated = false;\n return this;\n }\n toString() {\n return `line(${this.length}${this.collapsed ? -this.collapsed : \"\"}${this.widgetHeight ? \":\" + this.widgetHeight : \"\"})`;\n }\n}\nclass HeightMapGap extends HeightMap {\n constructor(length) { super(length, 0); }\n lines(doc, offset) {\n let firstLine = doc.lineAt(offset).number, lastLine = doc.lineAt(offset + this.length).number;\n return { firstLine, lastLine, lineHeight: this.height / (lastLine - firstLine + 1) };\n }\n blockAt(height, doc, top, offset) {\n let { firstLine, lastLine, lineHeight } = this.lines(doc, offset);\n let line = Math.max(0, Math.min(lastLine - firstLine, Math.floor((height - top) / lineHeight)));\n let { from, length } = doc.line(firstLine + line);\n return new BlockInfo(from, length, top + lineHeight * line, lineHeight, BlockType.Text);\n }\n lineAt(value, type, doc, top, offset) {\n if (type == QueryType.ByHeight)\n return this.blockAt(value, doc, top, offset);\n if (type == QueryType.ByPosNoHeight) {\n let { from, to } = doc.lineAt(value);\n return new BlockInfo(from, to - from, 0, 0, BlockType.Text);\n }\n let { firstLine, lineHeight } = this.lines(doc, offset);\n let { from, length, number } = doc.lineAt(value);\n return new BlockInfo(from, length, top + lineHeight * (number - firstLine), lineHeight, BlockType.Text);\n }\n forEachLine(from, to, doc, top, offset, f) {\n let { firstLine, lineHeight } = this.lines(doc, offset);\n for (let pos = Math.max(from, offset), end = Math.min(offset + this.length, to); pos <= end;) {\n let line = doc.lineAt(pos);\n if (pos == from)\n top += lineHeight * (line.number - firstLine);\n f(new BlockInfo(line.from, line.length, top, lineHeight, BlockType.Text));\n top += lineHeight;\n pos = line.to + 1;\n }\n }\n replace(from, to, nodes) {\n let after = this.length - to;\n if (after > 0) {\n let last = nodes[nodes.length - 1];\n if (last instanceof HeightMapGap)\n nodes[nodes.length - 1] = new HeightMapGap(last.length + after);\n else\n nodes.push(null, new HeightMapGap(after - 1));\n }\n if (from > 0) {\n let first = nodes[0];\n if (first instanceof HeightMapGap)\n nodes[0] = new HeightMapGap(from + first.length);\n else\n nodes.unshift(new HeightMapGap(from - 1), null);\n }\n return HeightMap.of(nodes);\n }\n decomposeLeft(to, result) {\n result.push(new HeightMapGap(to - 1), null);\n }\n decomposeRight(from, result) {\n result.push(null, new HeightMapGap(this.length - from - 1));\n }\n updateHeight(oracle, offset = 0, force = false, measured) {\n let end = offset + this.length;\n if (measured && measured.from <= offset + this.length && measured.more) {\n // Fill in part of this gap with measured lines. We know there\n // can't be widgets or collapsed ranges in those lines, because\n // they would already have been added to the heightmap (gaps\n // only contain plain text).\n let nodes = [], pos = Math.max(offset, measured.from), singleHeight = -1;\n let wasChanged = oracle.heightChanged;\n if (measured.from > offset)\n nodes.push(new HeightMapGap(measured.from - offset - 1).updateHeight(oracle, offset));\n while (pos <= end && measured.more) {\n let len = oracle.doc.lineAt(pos).length;\n if (nodes.length)\n nodes.push(null);\n let height = measured.heights[measured.index++];\n if (singleHeight == -1)\n singleHeight = height;\n else if (Math.abs(height - singleHeight) >= Epsilon)\n singleHeight = -2;\n let line = new HeightMapText(len, height);\n line.outdated = false;\n nodes.push(line);\n pos += len + 1;\n }\n if (pos <= end)\n nodes.push(null, new HeightMapGap(end - pos).updateHeight(oracle, pos));\n let result = HeightMap.of(nodes);\n oracle.heightChanged = wasChanged || singleHeight < 0 || Math.abs(result.height - this.height) >= Epsilon ||\n Math.abs(singleHeight - this.lines(oracle.doc, offset).lineHeight) >= Epsilon;\n return result;\n }\n else if (force || this.outdated) {\n this.setHeight(oracle, oracle.heightForGap(offset, offset + this.length));\n this.outdated = false;\n }\n return this;\n }\n toString() { return `gap(${this.length})`; }\n}\nclass HeightMapBranch extends HeightMap {\n constructor(left, brk, right) {\n super(left.length + brk + right.length, left.height + right.height, brk | (left.outdated || right.outdated ? 2 /* Outdated */ : 0));\n this.left = left;\n this.right = right;\n this.size = left.size + right.size;\n }\n get break() { return this.flags & 1 /* Break */; }\n blockAt(height, doc, top, offset) {\n let mid = top + this.left.height;\n return height < mid ? this.left.blockAt(height, doc, top, offset)\n : this.right.blockAt(height, doc, mid, offset + this.left.length + this.break);\n }\n lineAt(value, type, doc, top, offset) {\n let rightTop = top + this.left.height, rightOffset = offset + this.left.length + this.break;\n let left = type == QueryType.ByHeight ? value < rightTop : value < rightOffset;\n let base = left ? this.left.lineAt(value, type, doc, top, offset)\n : this.right.lineAt(value, type, doc, rightTop, rightOffset);\n if (this.break || (left ? base.to < rightOffset : base.from > rightOffset))\n return base;\n let subQuery = type == QueryType.ByPosNoHeight ? QueryType.ByPosNoHeight : QueryType.ByPos;\n if (left)\n return base.join(this.right.lineAt(rightOffset, subQuery, doc, rightTop, rightOffset));\n else\n return this.left.lineAt(rightOffset, subQuery, doc, top, offset).join(base);\n }\n forEachLine(from, to, doc, top, offset, f) {\n let rightTop = top + this.left.height, rightOffset = offset + this.left.length + this.break;\n if (this.break) {\n if (from < rightOffset)\n this.left.forEachLine(from, to, doc, top, offset, f);\n if (to >= rightOffset)\n this.right.forEachLine(from, to, doc, rightTop, rightOffset, f);\n }\n else {\n let mid = this.lineAt(rightOffset, QueryType.ByPos, doc, top, offset);\n if (from < mid.from)\n this.left.forEachLine(from, mid.from - 1, doc, top, offset, f);\n if (mid.to >= from && mid.from <= to)\n f(mid);\n if (to > mid.to)\n this.right.forEachLine(mid.to + 1, to, doc, rightTop, rightOffset, f);\n }\n }\n replace(from, to, nodes) {\n let rightStart = this.left.length + this.break;\n if (to < rightStart)\n return this.balanced(this.left.replace(from, to, nodes), this.right);\n if (from > this.left.length)\n return this.balanced(this.left, this.right.replace(from - rightStart, to - rightStart, nodes));\n let result = [];\n if (from > 0)\n this.decomposeLeft(from, result);\n let left = result.length;\n for (let node of nodes)\n result.push(node);\n if (from > 0)\n mergeGaps(result, left - 1);\n if (to < this.length) {\n let right = result.length;\n this.decomposeRight(to, result);\n mergeGaps(result, right);\n }\n return HeightMap.of(result);\n }\n decomposeLeft(to, result) {\n let left = this.left.length;\n if (to <= left)\n return this.left.decomposeLeft(to, result);\n result.push(this.left);\n if (this.break) {\n left++;\n if (to >= left)\n result.push(null);\n }\n if (to > left)\n this.right.decomposeLeft(to - left, result);\n }\n decomposeRight(from, result) {\n let left = this.left.length, right = left + this.break;\n if (from >= right)\n return this.right.decomposeRight(from - right, result);\n if (from < left)\n this.left.decomposeRight(from, result);\n if (this.break && from < right)\n result.push(null);\n result.push(this.right);\n }\n balanced(left, right) {\n if (left.size > 2 * right.size || right.size > 2 * left.size)\n return HeightMap.of(this.break ? [left, null, right] : [left, right]);\n this.left = left;\n this.right = right;\n this.height = left.height + right.height;\n this.outdated = left.outdated || right.outdated;\n this.size = left.size + right.size;\n this.length = left.length + this.break + right.length;\n return this;\n }\n updateHeight(oracle, offset = 0, force = false, measured) {\n let { left, right } = this, rightStart = offset + left.length + this.break, rebalance = null;\n if (measured && measured.from <= offset + left.length && measured.more)\n rebalance = left = left.updateHeight(oracle, offset, force, measured);\n else\n left.updateHeight(oracle, offset, force);\n if (measured && measured.from <= rightStart + right.length && measured.more)\n rebalance = right = right.updateHeight(oracle, rightStart, force, measured);\n else\n right.updateHeight(oracle, rightStart, force);\n if (rebalance)\n return this.balanced(left, right);\n this.height = this.left.height + this.right.height;\n this.outdated = false;\n return this;\n }\n toString() { return this.left + (this.break ? \" \" : \"-\") + this.right; }\n}\nfunction mergeGaps(nodes, around) {\n let before, after;\n if (nodes[around] == null &&\n (before = nodes[around - 1]) instanceof HeightMapGap &&\n (after = nodes[around + 1]) instanceof HeightMapGap)\n nodes.splice(around - 1, 3, new HeightMapGap(before.length + 1 + after.length));\n}\nconst relevantWidgetHeight = 5;\nclass NodeBuilder {\n constructor(pos, oracle) {\n this.pos = pos;\n this.oracle = oracle;\n this.nodes = [];\n this.lineStart = -1;\n this.lineEnd = -1;\n this.covering = null;\n this.writtenTo = pos;\n }\n get isCovered() {\n return this.covering && this.nodes[this.nodes.length - 1] == this.covering;\n }\n span(_from, to) {\n if (this.lineStart > -1) {\n let end = Math.min(to, this.lineEnd), last = this.nodes[this.nodes.length - 1];\n if (last instanceof HeightMapText)\n last.length += end - this.pos;\n else if (end > this.pos || !this.isCovered)\n this.nodes.push(new HeightMapText(end - this.pos, -1));\n this.writtenTo = end;\n if (to > end) {\n this.nodes.push(null);\n this.writtenTo++;\n this.lineStart = -1;\n }\n }\n this.pos = to;\n }\n point(from, to, deco) {\n if (from < to || deco.heightRelevant) {\n let height = deco.widget ? deco.widget.estimatedHeight : 0;\n if (height < 0)\n height = this.oracle.lineHeight;\n let len = to - from;\n if (deco.block) {\n this.addBlock(new HeightMapBlock(len, height, deco.type));\n }\n else if (len || height >= relevantWidgetHeight) {\n this.addLineDeco(height, len);\n }\n }\n else if (to > from) {\n this.span(from, to);\n }\n if (this.lineEnd > -1 && this.lineEnd < this.pos)\n this.lineEnd = this.oracle.doc.lineAt(this.pos).to;\n }\n enterLine() {\n if (this.lineStart > -1)\n return;\n let { from, to } = this.oracle.doc.lineAt(this.pos);\n this.lineStart = from;\n this.lineEnd = to;\n if (this.writtenTo < from) {\n if (this.writtenTo < from - 1 || this.nodes[this.nodes.length - 1] == null)\n this.nodes.push(this.blankContent(this.writtenTo, from - 1));\n this.nodes.push(null);\n }\n if (this.pos > from)\n this.nodes.push(new HeightMapText(this.pos - from, -1));\n this.writtenTo = this.pos;\n }\n blankContent(from, to) {\n let gap = new HeightMapGap(to - from);\n if (this.oracle.doc.lineAt(from).to == to)\n gap.flags |= 4 /* SingleLine */;\n return gap;\n }\n ensureLine() {\n this.enterLine();\n let last = this.nodes.length ? this.nodes[this.nodes.length - 1] : null;\n if (last instanceof HeightMapText)\n return last;\n let line = new HeightMapText(0, -1);\n this.nodes.push(line);\n return line;\n }\n addBlock(block) {\n this.enterLine();\n if (block.type == BlockType.WidgetAfter && !this.isCovered)\n this.ensureLine();\n this.nodes.push(block);\n this.writtenTo = this.pos = this.pos + block.length;\n if (block.type != BlockType.WidgetBefore)\n this.covering = block;\n }\n addLineDeco(height, length) {\n let line = this.ensureLine();\n line.length += length;\n line.collapsed += length;\n line.widgetHeight = Math.max(line.widgetHeight, height);\n this.writtenTo = this.pos = this.pos + length;\n }\n finish(from) {\n let last = this.nodes.length == 0 ? null : this.nodes[this.nodes.length - 1];\n if (this.lineStart > -1 && !(last instanceof HeightMapText) && !this.isCovered)\n this.nodes.push(new HeightMapText(0, -1));\n else if (this.writtenTo < this.pos || last == null)\n this.nodes.push(this.blankContent(this.writtenTo, this.pos));\n let pos = from;\n for (let node of this.nodes) {\n if (node instanceof HeightMapText)\n node.updateHeight(this.oracle, pos);\n pos += node ? node.length : 1;\n }\n return this.nodes;\n }\n // Always called with a region that on both sides either stretches\n // to a line break or the end of the document.\n // The returned array uses null to indicate line breaks, but never\n // starts or ends in a line break, or has multiple line breaks next\n // to each other.\n static build(oracle, decorations, from, to) {\n let builder = new NodeBuilder(from, oracle);\n RangeSet.spans(decorations, from, to, builder, 0);\n return builder.finish(from);\n }\n}\nfunction heightRelevantDecoChanges(a, b, diff) {\n let comp = new DecorationComparator;\n RangeSet.compare(a, b, diff, comp, 0);\n return comp.changes;\n}\nclass DecorationComparator {\n constructor() {\n this.changes = [];\n }\n compareRange() { }\n comparePoint(from, to, a, b) {\n if (from < to || a && a.heightRelevant || b && b.heightRelevant)\n addRange(from, to, this.changes, 5);\n }\n}\n\nfunction visiblePixelRange(dom, paddingTop) {\n let rect = dom.getBoundingClientRect();\n let left = Math.max(0, rect.left), right = Math.min(innerWidth, rect.right);\n let top = Math.max(0, rect.top), bottom = Math.min(innerHeight, rect.bottom);\n let body = dom.ownerDocument.body;\n for (let parent = dom.parentNode; parent && parent != body;) {\n if (parent.nodeType == 1) {\n let elt = parent;\n let style = window.getComputedStyle(elt);\n if ((elt.scrollHeight > elt.clientHeight || elt.scrollWidth > elt.clientWidth) &&\n style.overflow != \"visible\") {\n let parentRect = elt.getBoundingClientRect();\n left = Math.max(left, parentRect.left);\n right = Math.min(right, parentRect.right);\n top = Math.max(top, parentRect.top);\n bottom = Math.min(bottom, parentRect.bottom);\n }\n parent = style.position == \"absolute\" || style.position == \"fixed\" ? elt.offsetParent : elt.parentNode;\n }\n else if (parent.nodeType == 11) { // Shadow root\n parent = parent.host;\n }\n else {\n break;\n }\n }\n return { left: left - rect.left, right: Math.max(left, right) - rect.left,\n top: top - (rect.top + paddingTop), bottom: Math.max(top, bottom) - (rect.top + paddingTop) };\n}\nfunction fullPixelRange(dom, paddingTop) {\n let rect = dom.getBoundingClientRect();\n return { left: 0, right: rect.right - rect.left,\n top: paddingTop, bottom: rect.bottom - (rect.top + paddingTop) };\n}\n// Line gaps are placeholder widgets used to hide pieces of overlong\n// lines within the viewport, as a kludge to keep the editor\n// responsive when a ridiculously long line is loaded into it.\nclass LineGap {\n constructor(from, to, size) {\n this.from = from;\n this.to = to;\n this.size = size;\n }\n static same(a, b) {\n if (a.length != b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n let gA = a[i], gB = b[i];\n if (gA.from != gB.from || gA.to != gB.to || gA.size != gB.size)\n return false;\n }\n return true;\n }\n draw(wrapping) {\n return Decoration.replace({ widget: new LineGapWidget(this.size, wrapping) }).range(this.from, this.to);\n }\n}\nclass LineGapWidget extends WidgetType {\n constructor(size, vertical) {\n super();\n this.size = size;\n this.vertical = vertical;\n }\n eq(other) { return other.size == this.size && other.vertical == this.vertical; }\n toDOM() {\n let elt = document.createElement(\"div\");\n if (this.vertical) {\n elt.style.height = this.size + \"px\";\n }\n else {\n elt.style.width = this.size + \"px\";\n elt.style.height = \"2px\";\n elt.style.display = \"inline-block\";\n }\n return elt;\n }\n get estimatedHeight() { return this.vertical ? this.size : -1; }\n}\nclass ViewState {\n constructor(state) {\n this.state = state;\n // These are contentDOM-local coordinates\n this.pixelViewport = { left: 0, right: window.innerWidth, top: 0, bottom: 0 };\n this.inView = true;\n this.paddingTop = 0;\n this.paddingBottom = 0;\n this.contentDOMWidth = 0;\n this.contentDOMHeight = 0;\n this.editorHeight = 0;\n this.editorWidth = 0;\n this.heightOracle = new HeightOracle;\n // See VP.MaxDOMHeight\n this.scaler = IdScaler;\n this.scrollTarget = null;\n // Briefly set to true when printing, to disable viewport limiting\n this.printing = false;\n // Flag set when editor content was redrawn, so that the next\n // measure stage knows it must read DOM layout\n this.mustMeasureContent = true;\n this.visibleRanges = [];\n // Cursor 'assoc' is only significant when the cursor is on a line\n // wrap point, where it must stick to the character that it is\n // associated with. Since browsers don't provide a reasonable\n // interface to set or query this, when a selection is set that\n // might cause this to be significant, this flag is set. The next\n // measure phase will check whether the cursor is on a line-wrapping\n // boundary and, if so, reset it to make sure it is positioned in\n // the right place.\n this.mustEnforceCursorAssoc = false;\n this.heightMap = HeightMap.empty().applyChanges(state.facet(decorations), Text.empty, this.heightOracle.setDoc(state.doc), [new ChangedRange(0, 0, 0, state.doc.length)]);\n this.viewport = this.getViewport(0, null);\n this.updateViewportLines();\n this.updateForViewport();\n this.lineGaps = this.ensureLineGaps([]);\n this.lineGapDeco = Decoration.set(this.lineGaps.map(gap => gap.draw(false)));\n this.computeVisibleRanges();\n }\n updateForViewport() {\n let viewports = [this.viewport], { main } = this.state.selection;\n for (let i = 0; i <= 1; i++) {\n let pos = i ? main.head : main.anchor;\n if (!viewports.some(({ from, to }) => pos >= from && pos <= to)) {\n let { from, to } = this.lineBlockAt(pos);\n viewports.push(new Viewport(from, to));\n }\n }\n this.viewports = viewports.sort((a, b) => a.from - b.from);\n this.scaler = this.heightMap.height <= 7000000 /* MaxDOMHeight */ ? IdScaler :\n new BigScaler(this.heightOracle.doc, this.heightMap, this.viewports);\n }\n updateViewportLines() {\n this.viewportLines = [];\n this.heightMap.forEachLine(this.viewport.from, this.viewport.to, this.state.doc, 0, 0, block => {\n this.viewportLines.push(this.scaler.scale == 1 ? block : scaleBlock(block, this.scaler));\n });\n }\n update(update, scrollTarget = null) {\n let prev = this.state;\n this.state = update.state;\n let newDeco = this.state.facet(decorations);\n let contentChanges = update.changedRanges;\n let heightChanges = ChangedRange.extendWithRanges(contentChanges, heightRelevantDecoChanges(update.startState.facet(decorations), newDeco, update ? update.changes : ChangeSet.empty(this.state.doc.length)));\n let prevHeight = this.heightMap.height;\n this.heightMap = this.heightMap.applyChanges(newDeco, prev.doc, this.heightOracle.setDoc(this.state.doc), heightChanges);\n if (this.heightMap.height != prevHeight)\n update.flags |= 2 /* Height */;\n let viewport = heightChanges.length ? this.mapViewport(this.viewport, update.changes) : this.viewport;\n if (scrollTarget && (scrollTarget.range.head < viewport.from || scrollTarget.range.head > viewport.to) ||\n !this.viewportIsAppropriate(viewport))\n viewport = this.getViewport(0, scrollTarget);\n let updateLines = !update.changes.empty || (update.flags & 2 /* Height */) ||\n viewport.from != this.viewport.from || viewport.to != this.viewport.to;\n this.viewport = viewport;\n this.updateForViewport();\n if (updateLines)\n this.updateViewportLines();\n if (this.lineGaps.length || this.viewport.to - this.viewport.from > 4000 /* DoubleMargin */)\n this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps, update.changes)));\n update.flags |= this.computeVisibleRanges();\n if (scrollTarget)\n this.scrollTarget = scrollTarget;\n if (!this.mustEnforceCursorAssoc && update.selectionSet && update.view.lineWrapping &&\n update.state.selection.main.empty && update.state.selection.main.assoc)\n this.mustEnforceCursorAssoc = true;\n }\n measure(view) {\n let dom = view.contentDOM, style = window.getComputedStyle(dom);\n let oracle = this.heightOracle;\n let whiteSpace = style.whiteSpace, direction = style.direction == \"rtl\" ? Direction.RTL : Direction.LTR;\n let refresh = this.heightOracle.mustRefreshForStyle(whiteSpace, direction);\n let measureContent = refresh || this.mustMeasureContent || this.contentDOMHeight != dom.clientHeight;\n let result = 0, bias = 0;\n if (this.editorWidth != view.scrollDOM.clientWidth) {\n if (oracle.lineWrapping)\n measureContent = true;\n this.editorWidth = view.scrollDOM.clientWidth;\n result |= 8 /* Geometry */;\n }\n if (measureContent) {\n this.mustMeasureContent = false;\n this.contentDOMHeight = dom.clientHeight;\n // Vertical padding\n let paddingTop = parseInt(style.paddingTop) || 0, paddingBottom = parseInt(style.paddingBottom) || 0;\n if (this.paddingTop != paddingTop || this.paddingBottom != paddingBottom) {\n result |= 8 /* Geometry */;\n this.paddingTop = paddingTop;\n this.paddingBottom = paddingBottom;\n }\n }\n // Pixel viewport\n let pixelViewport = (this.printing ? fullPixelRange : visiblePixelRange)(dom, this.paddingTop);\n let dTop = pixelViewport.top - this.pixelViewport.top, dBottom = pixelViewport.bottom - this.pixelViewport.bottom;\n this.pixelViewport = pixelViewport;\n let inView = this.pixelViewport.bottom > this.pixelViewport.top && this.pixelViewport.right > this.pixelViewport.left;\n if (inView != this.inView) {\n this.inView = inView;\n if (inView)\n measureContent = true;\n }\n if (!this.inView)\n return 0;\n let contentWidth = dom.clientWidth;\n if (this.contentDOMWidth != contentWidth || this.editorHeight != view.scrollDOM.clientHeight) {\n this.contentDOMWidth = contentWidth;\n this.editorHeight = view.scrollDOM.clientHeight;\n result |= 8 /* Geometry */;\n }\n if (measureContent) {\n let lineHeights = view.docView.measureVisibleLineHeights();\n if (oracle.mustRefreshForHeights(lineHeights))\n refresh = true;\n if (refresh || oracle.lineWrapping && Math.abs(contentWidth - this.contentDOMWidth) > oracle.charWidth) {\n let { lineHeight, charWidth } = view.docView.measureTextSize();\n refresh = oracle.refresh(whiteSpace, direction, lineHeight, charWidth, contentWidth / charWidth, lineHeights);\n if (refresh) {\n view.docView.minWidth = 0;\n result |= 8 /* Geometry */;\n }\n }\n if (dTop > 0 && dBottom > 0)\n bias = Math.max(dTop, dBottom);\n else if (dTop < 0 && dBottom < 0)\n bias = Math.min(dTop, dBottom);\n oracle.heightChanged = false;\n this.heightMap = this.heightMap.updateHeight(oracle, 0, refresh, new MeasuredHeights(this.viewport.from, lineHeights));\n if (oracle.heightChanged)\n result |= 2 /* Height */;\n }\n let viewportChange = !this.viewportIsAppropriate(this.viewport, bias) ||\n this.scrollTarget && (this.scrollTarget.range.head < this.viewport.from || this.scrollTarget.range.head > this.viewport.to);\n if (viewportChange)\n this.viewport = this.getViewport(bias, this.scrollTarget);\n this.updateForViewport();\n if ((result & 2 /* Height */) || viewportChange)\n this.updateViewportLines();\n if (this.lineGaps.length || this.viewport.to - this.viewport.from > 4000 /* DoubleMargin */)\n this.updateLineGaps(this.ensureLineGaps(refresh ? [] : this.lineGaps));\n result |= this.computeVisibleRanges();\n if (this.mustEnforceCursorAssoc) {\n this.mustEnforceCursorAssoc = false;\n // This is done in the read stage, because moving the selection\n // to a line end is going to trigger a layout anyway, so it\n // can't be a pure write. It should be rare that it does any\n // writing.\n view.docView.enforceCursorAssoc();\n }\n return result;\n }\n get visibleTop() { return this.scaler.fromDOM(this.pixelViewport.top); }\n get visibleBottom() { return this.scaler.fromDOM(this.pixelViewport.bottom); }\n getViewport(bias, scrollTarget) {\n // This will divide VP.Margin between the top and the\n // bottom, depending on the bias (the change in viewport position\n // since the last update). It'll hold a number between 0 and 1\n let marginTop = 0.5 - Math.max(-0.5, Math.min(0.5, bias / 1000 /* Margin */ / 2));\n let map = this.heightMap, doc = this.state.doc, { visibleTop, visibleBottom } = this;\n let viewport = new Viewport(map.lineAt(visibleTop - marginTop * 1000 /* Margin */, QueryType.ByHeight, doc, 0, 0).from, map.lineAt(visibleBottom + (1 - marginTop) * 1000 /* Margin */, QueryType.ByHeight, doc, 0, 0).to);\n // If scrollTarget is given, make sure the viewport includes that position\n if (scrollTarget) {\n let { head } = scrollTarget.range;\n if (head < viewport.from || head > viewport.to) {\n let viewHeight = Math.min(this.editorHeight, this.pixelViewport.bottom - this.pixelViewport.top);\n let block = map.lineAt(head, QueryType.ByPos, doc, 0, 0), topPos;\n if (scrollTarget.y == \"center\")\n topPos = (block.top + block.bottom) / 2 - viewHeight / 2;\n else if (scrollTarget.y == \"start\" || scrollTarget.y == \"nearest\" && head < viewport.from)\n topPos = block.top;\n else\n topPos = block.bottom - viewHeight;\n viewport = new Viewport(map.lineAt(topPos - 1000 /* Margin */ / 2, QueryType.ByHeight, doc, 0, 0).from, map.lineAt(topPos + viewHeight + 1000 /* Margin */ / 2, QueryType.ByHeight, doc, 0, 0).to);\n }\n }\n return viewport;\n }\n mapViewport(viewport, changes) {\n let from = changes.mapPos(viewport.from, -1), to = changes.mapPos(viewport.to, 1);\n return new Viewport(this.heightMap.lineAt(from, QueryType.ByPos, this.state.doc, 0, 0).from, this.heightMap.lineAt(to, QueryType.ByPos, this.state.doc, 0, 0).to);\n }\n // Checks if a given viewport covers the visible part of the\n // document and not too much beyond that.\n viewportIsAppropriate({ from, to }, bias = 0) {\n if (!this.inView)\n return true;\n let { top } = this.heightMap.lineAt(from, QueryType.ByPos, this.state.doc, 0, 0);\n let { bottom } = this.heightMap.lineAt(to, QueryType.ByPos, this.state.doc, 0, 0);\n let { visibleTop, visibleBottom } = this;\n return (from == 0 || top <= visibleTop - Math.max(10 /* MinCoverMargin */, Math.min(-bias, 250 /* MaxCoverMargin */))) &&\n (to == this.state.doc.length ||\n bottom >= visibleBottom + Math.max(10 /* MinCoverMargin */, Math.min(bias, 250 /* MaxCoverMargin */))) &&\n (top > visibleTop - 2 * 1000 /* Margin */ && bottom < visibleBottom + 2 * 1000 /* Margin */);\n }\n mapLineGaps(gaps, changes) {\n if (!gaps.length || changes.empty)\n return gaps;\n let mapped = [];\n for (let gap of gaps)\n if (!changes.touchesRange(gap.from, gap.to))\n mapped.push(new LineGap(changes.mapPos(gap.from), changes.mapPos(gap.to), gap.size));\n return mapped;\n }\n // Computes positions in the viewport where the start or end of a\n // line should be hidden, trying to reuse existing line gaps when\n // appropriate to avoid unneccesary redraws.\n // Uses crude character-counting for the positioning and sizing,\n // since actual DOM coordinates aren't always available and\n // predictable. Relies on generous margins (see LG.Margin) to hide\n // the artifacts this might produce from the user.\n ensureLineGaps(current) {\n let gaps = [];\n // This won't work at all in predominantly right-to-left text.\n if (this.heightOracle.direction != Direction.LTR)\n return gaps;\n for (let line of this.viewportLines) {\n if (line.length < 4000 /* DoubleMargin */)\n continue;\n let structure = lineStructure(line.from, line.to, this.state);\n if (structure.total < 4000 /* DoubleMargin */)\n continue;\n let viewFrom, viewTo;\n if (this.heightOracle.lineWrapping) {\n let marginHeight = (2000 /* Margin */ / this.heightOracle.lineLength) * this.heightOracle.lineHeight;\n viewFrom = findPosition(structure, (this.visibleTop - line.top - marginHeight) / line.height);\n viewTo = findPosition(structure, (this.visibleBottom - line.top + marginHeight) / line.height);\n }\n else {\n let totalWidth = structure.total * this.heightOracle.charWidth;\n let marginWidth = 2000 /* Margin */ * this.heightOracle.charWidth;\n viewFrom = findPosition(structure, (this.pixelViewport.left - marginWidth) / totalWidth);\n viewTo = findPosition(structure, (this.pixelViewport.right + marginWidth) / totalWidth);\n }\n let outside = [];\n if (viewFrom > line.from)\n outside.push({ from: line.from, to: viewFrom });\n if (viewTo < line.to)\n outside.push({ from: viewTo, to: line.to });\n let sel = this.state.selection.main;\n // Make sure the gaps don't cover a selection end\n if (sel.from >= line.from && sel.from <= line.to)\n cutRange(outside, sel.from - 10 /* SelectionMargin */, sel.from + 10 /* SelectionMargin */);\n if (!sel.empty && sel.to >= line.from && sel.to <= line.to)\n cutRange(outside, sel.to - 10 /* SelectionMargin */, sel.to + 10 /* SelectionMargin */);\n for (let { from, to } of outside)\n if (to - from > 1000 /* HalfMargin */) {\n gaps.push(find(current, gap => gap.from >= line.from && gap.to <= line.to &&\n Math.abs(gap.from - from) < 1000 /* HalfMargin */ && Math.abs(gap.to - to) < 1000 /* HalfMargin */) ||\n new LineGap(from, to, this.gapSize(line, from, to, structure)));\n }\n }\n return gaps;\n }\n gapSize(line, from, to, structure) {\n let fraction = findFraction(structure, to) - findFraction(structure, from);\n if (this.heightOracle.lineWrapping) {\n return line.height * fraction;\n }\n else {\n return structure.total * this.heightOracle.charWidth * fraction;\n }\n }\n updateLineGaps(gaps) {\n if (!LineGap.same(gaps, this.lineGaps)) {\n this.lineGaps = gaps;\n this.lineGapDeco = Decoration.set(gaps.map(gap => gap.draw(this.heightOracle.lineWrapping)));\n }\n }\n computeVisibleRanges() {\n let deco = this.state.facet(decorations);\n if (this.lineGaps.length)\n deco = deco.concat(this.lineGapDeco);\n let ranges = [];\n RangeSet.spans(deco, this.viewport.from, this.viewport.to, {\n span(from, to) { ranges.push({ from, to }); },\n point() { }\n }, 20);\n let changed = ranges.length != this.visibleRanges.length ||\n this.visibleRanges.some((r, i) => r.from != ranges[i].from || r.to != ranges[i].to);\n this.visibleRanges = ranges;\n return changed ? 4 /* Viewport */ : 0;\n }\n lineBlockAt(pos) {\n return (pos >= this.viewport.from && pos <= this.viewport.to && this.viewportLines.find(b => b.from <= pos && b.to >= pos)) ||\n scaleBlock(this.heightMap.lineAt(pos, QueryType.ByPos, this.state.doc, 0, 0), this.scaler);\n }\n lineBlockAtHeight(height) {\n return scaleBlock(this.heightMap.lineAt(this.scaler.fromDOM(height), QueryType.ByHeight, this.state.doc, 0, 0), this.scaler);\n }\n elementAtHeight(height) {\n return scaleBlock(this.heightMap.blockAt(this.scaler.fromDOM(height), this.state.doc, 0, 0), this.scaler);\n }\n get docHeight() {\n return this.scaler.toDOM(this.heightMap.height);\n }\n get contentHeight() {\n return this.docHeight + this.paddingTop + this.paddingBottom;\n }\n}\nclass Viewport {\n constructor(from, to) {\n this.from = from;\n this.to = to;\n }\n}\nfunction lineStructure(from, to, state) {\n let ranges = [], pos = from, total = 0;\n RangeSet.spans(state.facet(decorations), from, to, {\n span() { },\n point(from, to) {\n if (from > pos) {\n ranges.push({ from: pos, to: from });\n total += from - pos;\n }\n pos = to;\n }\n }, 20); // We're only interested in collapsed ranges of a significant size\n if (pos < to) {\n ranges.push({ from: pos, to });\n total += to - pos;\n }\n return { total, ranges };\n}\nfunction findPosition({ total, ranges }, ratio) {\n if (ratio <= 0)\n return ranges[0].from;\n if (ratio >= 1)\n return ranges[ranges.length - 1].to;\n let dist = Math.floor(total * ratio);\n for (let i = 0;; i++) {\n let { from, to } = ranges[i], size = to - from;\n if (dist <= size)\n return from + dist;\n dist -= size;\n }\n}\nfunction findFraction(structure, pos) {\n let counted = 0;\n for (let { from, to } of structure.ranges) {\n if (pos <= to) {\n counted += pos - from;\n break;\n }\n counted += to - from;\n }\n return counted / structure.total;\n}\nfunction cutRange(ranges, from, to) {\n for (let i = 0; i < ranges.length; i++) {\n let r = ranges[i];\n if (r.from < to && r.to > from) {\n let pieces = [];\n if (r.from < from)\n pieces.push({ from: r.from, to: from });\n if (r.to > to)\n pieces.push({ from: to, to: r.to });\n ranges.splice(i, 1, ...pieces);\n i += pieces.length - 1;\n }\n }\n}\nfunction find(array, f) {\n for (let val of array)\n if (f(val))\n return val;\n return undefined;\n}\n// Don't scale when the document height is within the range of what\n// the DOM can handle.\nconst IdScaler = {\n toDOM(n) { return n; },\n fromDOM(n) { return n; },\n scale: 1\n};\n// When the height is too big (> VP.MaxDOMHeight), scale down the\n// regions outside the viewports so that the total height is\n// VP.MaxDOMHeight.\nclass BigScaler {\n constructor(doc, heightMap, viewports) {\n let vpHeight = 0, base = 0, domBase = 0;\n this.viewports = viewports.map(({ from, to }) => {\n let top = heightMap.lineAt(from, QueryType.ByPos, doc, 0, 0).top;\n let bottom = heightMap.lineAt(to, QueryType.ByPos, doc, 0, 0).bottom;\n vpHeight += bottom - top;\n return { from, to, top, bottom, domTop: 0, domBottom: 0 };\n });\n this.scale = (7000000 /* MaxDOMHeight */ - vpHeight) / (heightMap.height - vpHeight);\n for (let obj of this.viewports) {\n obj.domTop = domBase + (obj.top - base) * this.scale;\n domBase = obj.domBottom = obj.domTop + (obj.bottom - obj.top);\n base = obj.bottom;\n }\n }\n toDOM(n) {\n for (let i = 0, base = 0, domBase = 0;; i++) {\n let vp = i < this.viewports.length ? this.viewports[i] : null;\n if (!vp || n < vp.top)\n return domBase + (n - base) * this.scale;\n if (n <= vp.bottom)\n return vp.domTop + (n - vp.top);\n base = vp.bottom;\n domBase = vp.domBottom;\n }\n }\n fromDOM(n) {\n for (let i = 0, base = 0, domBase = 0;; i++) {\n let vp = i < this.viewports.length ? this.viewports[i] : null;\n if (!vp || n < vp.domTop)\n return base + (n - domBase) / this.scale;\n if (n <= vp.domBottom)\n return vp.top + (n - vp.domTop);\n base = vp.bottom;\n domBase = vp.domBottom;\n }\n }\n}\nfunction scaleBlock(block, scaler) {\n if (scaler.scale == 1)\n return block;\n let bTop = scaler.toDOM(block.top), bBottom = scaler.toDOM(block.bottom);\n return new BlockInfo(block.from, block.length, bTop, bBottom - bTop, Array.isArray(block.type) ? block.type.map(b => scaleBlock(b, scaler)) : block.type);\n}\n\nconst theme = /*@__PURE__*/Facet.define({ combine: strs => strs.join(\" \") });\nconst darkTheme = /*@__PURE__*/Facet.define({ combine: values => values.indexOf(true) > -1 });\nconst baseThemeID = /*@__PURE__*/StyleModule.newName(), baseLightID = /*@__PURE__*/StyleModule.newName(), baseDarkID = /*@__PURE__*/StyleModule.newName();\nconst lightDarkIDs = { \"&light\": \".\" + baseLightID, \"&dark\": \".\" + baseDarkID };\nfunction buildTheme(main, spec, scopes) {\n return new StyleModule(spec, {\n finish(sel) {\n return /&/.test(sel) ? sel.replace(/&\\w*/, m => {\n if (m == \"&\")\n return main;\n if (!scopes || !scopes[m])\n throw new RangeError(`Unsupported selector: ${m}`);\n return scopes[m];\n }) : main + \" \" + sel;\n }\n });\n}\nconst baseTheme = /*@__PURE__*/buildTheme(\".\" + baseThemeID, {\n \"&.cm-editor\": {\n position: \"relative !important\",\n boxSizing: \"border-box\",\n \"&.cm-focused\": {\n // Provide a simple default outline to make sure a focused\n // editor is visually distinct. Can't leave the default behavior\n // because that will apply to the content element, which is\n // inside the scrollable container and doesn't include the\n // gutters. We also can't use an 'auto' outline, since those\n // are, for some reason, drawn behind the element content, which\n // will cause things like the active line background to cover\n // the outline (#297).\n outline: \"1px dotted #212121\"\n },\n display: \"flex !important\",\n flexDirection: \"column\"\n },\n \".cm-scroller\": {\n display: \"flex !important\",\n alignItems: \"flex-start !important\",\n fontFamily: \"monospace\",\n lineHeight: 1.4,\n height: \"100%\",\n overflowX: \"auto\",\n position: \"relative\",\n zIndex: 0\n },\n \".cm-content\": {\n margin: 0,\n flexGrow: 2,\n minHeight: \"100%\",\n display: \"block\",\n whiteSpace: \"pre\",\n wordWrap: \"normal\",\n boxSizing: \"border-box\",\n padding: \"4px 0\",\n outline: \"none\",\n \"&[contenteditable=true]\": {\n WebkitUserModify: \"read-write-plaintext-only\",\n }\n },\n \".cm-lineWrapping\": {\n whiteSpace_fallback: \"pre-wrap\",\n whiteSpace: \"break-spaces\",\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\"\n },\n \"&light .cm-content\": { caretColor: \"black\" },\n \"&dark .cm-content\": { caretColor: \"white\" },\n \".cm-line\": {\n display: \"block\",\n padding: \"0 2px 0 4px\"\n },\n \".cm-selectionLayer\": {\n zIndex: -1,\n contain: \"size style\"\n },\n \".cm-selectionBackground\": {\n position: \"absolute\",\n },\n \"&light .cm-selectionBackground\": {\n background: \"#d9d9d9\"\n },\n \"&dark .cm-selectionBackground\": {\n background: \"#222\"\n },\n \"&light.cm-focused .cm-selectionBackground\": {\n background: \"#d7d4f0\"\n },\n \"&dark.cm-focused .cm-selectionBackground\": {\n background: \"#233\"\n },\n \".cm-cursorLayer\": {\n zIndex: 100,\n contain: \"size style\",\n pointerEvents: \"none\"\n },\n \"&.cm-focused .cm-cursorLayer\": {\n animation: \"steps(1) cm-blink 1.2s infinite\"\n },\n // Two animations defined so that we can switch between them to\n // restart the animation without forcing another style\n // recomputation.\n \"@keyframes cm-blink\": { \"0%\": {}, \"50%\": { visibility: \"hidden\" }, \"100%\": {} },\n \"@keyframes cm-blink2\": { \"0%\": {}, \"50%\": { visibility: \"hidden\" }, \"100%\": {} },\n \".cm-cursor, .cm-dropCursor\": {\n position: \"absolute\",\n borderLeft: \"1.2px solid black\",\n marginLeft: \"-0.6px\",\n pointerEvents: \"none\",\n },\n \".cm-cursor\": {\n display: \"none\"\n },\n \"&dark .cm-cursor\": {\n borderLeftColor: \"#444\"\n },\n \"&.cm-focused .cm-cursor\": {\n display: \"block\"\n },\n \"&light .cm-activeLine\": { backgroundColor: \"#f3f9ff\" },\n \"&dark .cm-activeLine\": { backgroundColor: \"#223039\" },\n \"&light .cm-specialChar\": { color: \"red\" },\n \"&dark .cm-specialChar\": { color: \"#f78\" },\n \".cm-tab\": {\n display: \"inline-block\",\n overflow: \"hidden\",\n verticalAlign: \"bottom\"\n },\n \".cm-widgetBuffer\": {\n verticalAlign: \"text-top\",\n height: \"1em\",\n display: \"inline\"\n },\n \".cm-placeholder\": {\n color: \"#888\",\n display: \"inline-block\",\n verticalAlign: \"top\",\n },\n \".cm-button\": {\n verticalAlign: \"middle\",\n color: \"inherit\",\n fontSize: \"70%\",\n padding: \".2em 1em\",\n borderRadius: \"1px\"\n },\n \"&light .cm-button\": {\n backgroundImage: \"linear-gradient(#eff1f5, #d9d9df)\",\n border: \"1px solid #888\",\n \"&:active\": {\n backgroundImage: \"linear-gradient(#b4b4b4, #d0d3d6)\"\n }\n },\n \"&dark .cm-button\": {\n backgroundImage: \"linear-gradient(#393939, #111)\",\n border: \"1px solid #888\",\n \"&:active\": {\n backgroundImage: \"linear-gradient(#111, #333)\"\n }\n },\n \".cm-textfield\": {\n verticalAlign: \"middle\",\n color: \"inherit\",\n fontSize: \"70%\",\n border: \"1px solid silver\",\n padding: \".2em .5em\"\n },\n \"&light .cm-textfield\": {\n backgroundColor: \"white\"\n },\n \"&dark .cm-textfield\": {\n border: \"1px solid #555\",\n backgroundColor: \"inherit\"\n }\n}, lightDarkIDs);\n\nconst observeOptions = {\n childList: true,\n characterData: true,\n subtree: true,\n attributes: true,\n characterDataOldValue: true\n};\n// IE11 has very broken mutation observers, so we also listen to\n// DOMCharacterDataModified there\nconst useCharData = browser.ie && browser.ie_version <= 11;\nclass DOMObserver {\n constructor(view, onChange, onScrollChanged) {\n this.view = view;\n this.onChange = onChange;\n this.onScrollChanged = onScrollChanged;\n this.active = false;\n // The known selection. Kept in our own object, as opposed to just\n // directly accessing the selection because:\n // - Safari doesn't report the right selection in shadow DOM\n // - Reading from the selection forces a DOM layout\n // - This way, we can ignore selectionchange events if we have\n // already seen the 'new' selection\n this.selectionRange = new DOMSelectionState;\n // Set when a selection change is detected, cleared on flush\n this.selectionChanged = false;\n this.delayedFlush = -1;\n this.resizeTimeout = -1;\n this.queue = [];\n this.delayedAndroidKey = null;\n this.scrollTargets = [];\n this.intersection = null;\n this.resize = null;\n this.intersecting = false;\n this.gapIntersection = null;\n this.gaps = [];\n // Timeout for scheduling check of the parents that need scroll handlers\n this.parentCheck = -1;\n this.dom = view.contentDOM;\n this.observer = new MutationObserver(mutations => {\n for (let mut of mutations)\n this.queue.push(mut);\n // IE11 will sometimes (on typing over a selection or\n // backspacing out a single character text node) call the\n // observer callback before actually updating the DOM.\n //\n // Unrelatedly, iOS Safari will, when ending a composition,\n // sometimes first clear it, deliver the mutations, and then\n // reinsert the finished text. CodeMirror's handling of the\n // deletion will prevent the reinsertion from happening,\n // breaking composition.\n if ((browser.ie && browser.ie_version <= 11 || browser.ios && view.composing) &&\n mutations.some(m => m.type == \"childList\" && m.removedNodes.length ||\n m.type == \"characterData\" && m.oldValue.length > m.target.nodeValue.length))\n this.flushSoon();\n else\n this.flush();\n });\n if (useCharData)\n this.onCharData = (event) => {\n this.queue.push({ target: event.target,\n type: \"characterData\",\n oldValue: event.prevValue });\n this.flushSoon();\n };\n this.onSelectionChange = this.onSelectionChange.bind(this);\n window.addEventListener(\"resize\", this.onResize = this.onResize.bind(this));\n if (typeof ResizeObserver == \"function\") {\n this.resize = new ResizeObserver(() => {\n if (this.view.docView.lastUpdate < Date.now() - 75)\n this.onResize();\n });\n this.resize.observe(view.scrollDOM);\n }\n window.addEventListener(\"beforeprint\", this.onPrint = this.onPrint.bind(this));\n this.start();\n window.addEventListener(\"scroll\", this.onScroll = this.onScroll.bind(this));\n if (typeof IntersectionObserver == \"function\") {\n this.intersection = new IntersectionObserver(entries => {\n if (this.parentCheck < 0)\n this.parentCheck = setTimeout(this.listenForScroll.bind(this), 1000);\n if (entries.length > 0 && (entries[entries.length - 1].intersectionRatio > 0) != this.intersecting) {\n this.intersecting = !this.intersecting;\n if (this.intersecting != this.view.inView)\n this.onScrollChanged(document.createEvent(\"Event\"));\n }\n }, {});\n this.intersection.observe(this.dom);\n this.gapIntersection = new IntersectionObserver(entries => {\n if (entries.length > 0 && entries[entries.length - 1].intersectionRatio > 0)\n this.onScrollChanged(document.createEvent(\"Event\"));\n }, {});\n }\n this.listenForScroll();\n this.readSelectionRange();\n this.dom.ownerDocument.addEventListener(\"selectionchange\", this.onSelectionChange);\n }\n onScroll(e) {\n if (this.intersecting)\n this.flush(false);\n this.onScrollChanged(e);\n }\n onResize() {\n if (this.resizeTimeout < 0)\n this.resizeTimeout = setTimeout(() => {\n this.resizeTimeout = -1;\n this.view.requestMeasure();\n }, 50);\n }\n onPrint() {\n this.view.viewState.printing = true;\n this.view.measure();\n setTimeout(() => {\n this.view.viewState.printing = false;\n this.view.requestMeasure();\n }, 500);\n }\n updateGaps(gaps) {\n if (this.gapIntersection && (gaps.length != this.gaps.length || this.gaps.some((g, i) => g != gaps[i]))) {\n this.gapIntersection.disconnect();\n for (let gap of gaps)\n this.gapIntersection.observe(gap);\n this.gaps = gaps;\n }\n }\n onSelectionChange(event) {\n if (!this.readSelectionRange() || this.delayedAndroidKey)\n return;\n let { view } = this, sel = this.selectionRange;\n if (view.state.facet(editable) ? view.root.activeElement != this.dom : !hasSelection(view.dom, sel))\n return;\n let context = sel.anchorNode && view.docView.nearest(sel.anchorNode);\n if (context && context.ignoreEvent(event))\n return;\n // Deletions on IE11 fire their events in the wrong order, giving\n // us a selection change event before the DOM changes are\n // reported.\n // Chrome Android has a similar issue when backspacing out a\n // selection (#645).\n if ((browser.ie && browser.ie_version <= 11 || browser.android && browser.chrome) && !view.state.selection.main.empty &&\n // (Selection.isCollapsed isn't reliable on IE)\n sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset))\n this.flushSoon();\n else\n this.flush(false);\n }\n readSelectionRange() {\n let { root } = this.view, domSel = getSelection(root);\n // The Selection object is broken in shadow roots in Safari. See\n // https://github.com/codemirror/codemirror.next/issues/414\n let range = browser.safari && root.nodeType == 11 && deepActiveElement() == this.view.contentDOM &&\n safariSelectionRangeHack(this.view) || domSel;\n if (this.selectionRange.eq(range))\n return false;\n this.selectionRange.setRange(range);\n return this.selectionChanged = true;\n }\n setSelectionRange(anchor, head) {\n this.selectionRange.set(anchor.node, anchor.offset, head.node, head.offset);\n this.selectionChanged = false;\n }\n listenForScroll() {\n this.parentCheck = -1;\n let i = 0, changed = null;\n for (let dom = this.dom; dom;) {\n if (dom.nodeType == 1) {\n if (!changed && i < this.scrollTargets.length && this.scrollTargets[i] == dom)\n i++;\n else if (!changed)\n changed = this.scrollTargets.slice(0, i);\n if (changed)\n changed.push(dom);\n dom = dom.assignedSlot || dom.parentNode;\n }\n else if (dom.nodeType == 11) { // Shadow root\n dom = dom.host;\n }\n else {\n break;\n }\n }\n if (i < this.scrollTargets.length && !changed)\n changed = this.scrollTargets.slice(0, i);\n if (changed) {\n for (let dom of this.scrollTargets)\n dom.removeEventListener(\"scroll\", this.onScroll);\n for (let dom of this.scrollTargets = changed)\n dom.addEventListener(\"scroll\", this.onScroll);\n }\n }\n ignore(f) {\n if (!this.active)\n return f();\n try {\n this.stop();\n return f();\n }\n finally {\n this.start();\n this.clear();\n }\n }\n start() {\n if (this.active)\n return;\n this.observer.observe(this.dom, observeOptions);\n if (useCharData)\n this.dom.addEventListener(\"DOMCharacterDataModified\", this.onCharData);\n this.active = true;\n }\n stop() {\n if (!this.active)\n return;\n this.active = false;\n this.observer.disconnect();\n if (useCharData)\n this.dom.removeEventListener(\"DOMCharacterDataModified\", this.onCharData);\n }\n // Throw away any pending changes\n clear() {\n this.processRecords();\n this.queue.length = 0;\n this.selectionChanged = false;\n }\n // Chrome Android, especially in combination with GBoard, not only\n // doesn't reliably fire regular key events, but also often\n // surrounds the effect of enter or backspace with a bunch of\n // composition events that, when interrupted, cause text duplication\n // or other kinds of corruption. This hack makes the editor back off\n // from handling DOM changes for a moment when such a key is\n // detected (via beforeinput or keydown), and then dispatches the\n // key event, throwing away the DOM changes if it gets handled.\n delayAndroidKey(key, keyCode) {\n if (!this.delayedAndroidKey)\n requestAnimationFrame(() => {\n let key = this.delayedAndroidKey;\n this.delayedAndroidKey = null;\n let startState = this.view.state;\n if (dispatchKey(this.view.contentDOM, key.key, key.keyCode))\n this.processRecords();\n else\n this.flush();\n if (this.view.state == startState)\n this.view.update([]);\n });\n // Since backspace beforeinput is sometimes signalled spuriously,\n // Enter always takes precedence.\n if (!this.delayedAndroidKey || key == \"Enter\")\n this.delayedAndroidKey = { key, keyCode };\n }\n flushSoon() {\n if (this.delayedFlush < 0)\n this.delayedFlush = window.setTimeout(() => { this.delayedFlush = -1; this.flush(); }, 20);\n }\n forceFlush() {\n if (this.delayedFlush >= 0) {\n window.clearTimeout(this.delayedFlush);\n this.delayedFlush = -1;\n this.flush();\n }\n }\n processRecords() {\n let records = this.queue;\n for (let mut of this.observer.takeRecords())\n records.push(mut);\n if (records.length)\n this.queue = [];\n let from = -1, to = -1, typeOver = false;\n for (let record of records) {\n let range = this.readMutation(record);\n if (!range)\n continue;\n if (range.typeOver)\n typeOver = true;\n if (from == -1) {\n ({ from, to } = range);\n }\n else {\n from = Math.min(range.from, from);\n to = Math.max(range.to, to);\n }\n }\n return { from, to, typeOver };\n }\n // Apply pending changes, if any\n flush(readSelection = true) {\n // Completely hold off flushing when pending keys are set—the code\n // managing those will make sure processRecords is called and the\n // view is resynchronized after\n if (this.delayedFlush >= 0 || this.delayedAndroidKey)\n return;\n if (readSelection)\n this.readSelectionRange();\n let { from, to, typeOver } = this.processRecords();\n let newSel = this.selectionChanged && hasSelection(this.dom, this.selectionRange);\n if (from < 0 && !newSel)\n return;\n this.selectionChanged = false;\n let startState = this.view.state;\n this.onChange(from, to, typeOver);\n // The view wasn't updated\n if (this.view.state == startState)\n this.view.update([]);\n }\n readMutation(rec) {\n let cView = this.view.docView.nearest(rec.target);\n if (!cView || cView.ignoreMutation(rec))\n return null;\n cView.markDirty(rec.type == \"attributes\");\n if (rec.type == \"attributes\")\n cView.dirty |= 4 /* Attrs */;\n if (rec.type == \"childList\") {\n let childBefore = findChild(cView, rec.previousSibling || rec.target.previousSibling, -1);\n let childAfter = findChild(cView, rec.nextSibling || rec.target.nextSibling, 1);\n return { from: childBefore ? cView.posAfter(childBefore) : cView.posAtStart,\n to: childAfter ? cView.posBefore(childAfter) : cView.posAtEnd, typeOver: false };\n }\n else if (rec.type == \"characterData\") {\n return { from: cView.posAtStart, to: cView.posAtEnd, typeOver: rec.target.nodeValue == rec.oldValue };\n }\n else {\n return null;\n }\n }\n destroy() {\n var _a, _b, _c;\n this.stop();\n (_a = this.intersection) === null || _a === void 0 ? void 0 : _a.disconnect();\n (_b = this.gapIntersection) === null || _b === void 0 ? void 0 : _b.disconnect();\n (_c = this.resize) === null || _c === void 0 ? void 0 : _c.disconnect();\n for (let dom of this.scrollTargets)\n dom.removeEventListener(\"scroll\", this.onScroll);\n window.removeEventListener(\"scroll\", this.onScroll);\n window.removeEventListener(\"resize\", this.onResize);\n window.removeEventListener(\"beforeprint\", this.onPrint);\n this.dom.ownerDocument.removeEventListener(\"selectionchange\", this.onSelectionChange);\n clearTimeout(this.parentCheck);\n clearTimeout(this.resizeTimeout);\n }\n}\nfunction findChild(cView, dom, dir) {\n while (dom) {\n let curView = ContentView.get(dom);\n if (curView && curView.parent == cView)\n return curView;\n let parent = dom.parentNode;\n dom = parent != cView.dom ? parent : dir > 0 ? dom.nextSibling : dom.previousSibling;\n }\n return null;\n}\n// Used to work around a Safari Selection/shadow DOM bug (#414)\nfunction safariSelectionRangeHack(view) {\n let found = null;\n // Because Safari (at least in 2018-2021) doesn't provide regular\n // access to the selection inside a shadowroot, we have to perform a\n // ridiculous hack to get at it—using `execCommand` to trigger a\n // `beforeInput` event so that we can read the target range from the\n // event.\n function read(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n found = event.getTargetRanges()[0];\n }\n view.contentDOM.addEventListener(\"beforeinput\", read, true);\n document.execCommand(\"indent\");\n view.contentDOM.removeEventListener(\"beforeinput\", read, true);\n if (!found)\n return null;\n let anchorNode = found.startContainer, anchorOffset = found.startOffset;\n let focusNode = found.endContainer, focusOffset = found.endOffset;\n let curAnchor = view.docView.domAtPos(view.state.selection.main.anchor);\n // Since such a range doesn't distinguish between anchor and head,\n // use a heuristic that flips it around if its end matches the\n // current anchor.\n if (isEquivalentPosition(curAnchor.node, curAnchor.offset, focusNode, focusOffset))\n [anchorNode, anchorOffset, focusNode, focusOffset] = [focusNode, focusOffset, anchorNode, anchorOffset];\n return { anchorNode, anchorOffset, focusNode, focusOffset };\n}\n\nfunction applyDOMChange(view, start, end, typeOver) {\n let change, newSel;\n let sel = view.state.selection.main;\n if (start > -1) {\n let bounds = view.docView.domBoundsAround(start, end, 0);\n if (!bounds || view.state.readOnly)\n return;\n let { from, to } = bounds;\n let selPoints = view.docView.impreciseHead || view.docView.impreciseAnchor ? [] : selectionPoints(view);\n let reader = new DOMReader(selPoints, view.state);\n reader.readRange(bounds.startDOM, bounds.endDOM);\n let preferredPos = sel.from, preferredSide = null;\n // Prefer anchoring to end when Backspace is pressed (or, on\n // Android, when something was deleted)\n if (view.inputState.lastKeyCode === 8 && view.inputState.lastKeyTime > Date.now() - 100 ||\n browser.android && reader.text.length < to - from) {\n preferredPos = sel.to;\n preferredSide = \"end\";\n }\n let diff = findDiff(view.state.doc.sliceString(from, to, LineBreakPlaceholder), reader.text, preferredPos - from, preferredSide);\n if (diff) {\n // Chrome inserts two newlines when pressing shift-enter at the\n // end of a line. This drops one of those.\n if (browser.chrome && view.inputState.lastKeyCode == 13 &&\n diff.toB == diff.from + 2 && reader.text.slice(diff.from, diff.toB) == LineBreakPlaceholder + LineBreakPlaceholder)\n diff.toB--;\n change = { from: from + diff.from, to: from + diff.toA,\n insert: Text$1.of(reader.text.slice(diff.from, diff.toB).split(LineBreakPlaceholder)) };\n }\n newSel = selectionFromPoints(selPoints, from);\n }\n else if (view.hasFocus || !view.state.facet(editable)) {\n let domSel = view.observer.selectionRange;\n let { impreciseHead: iHead, impreciseAnchor: iAnchor } = view.docView;\n let head = iHead && iHead.node == domSel.focusNode && iHead.offset == domSel.focusOffset ||\n !contains(view.contentDOM, domSel.focusNode)\n ? view.state.selection.main.head\n : view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset);\n let anchor = iAnchor && iAnchor.node == domSel.anchorNode && iAnchor.offset == domSel.anchorOffset ||\n !contains(view.contentDOM, domSel.anchorNode)\n ? view.state.selection.main.anchor\n : view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset);\n if (head != sel.head || anchor != sel.anchor)\n newSel = EditorSelection.single(anchor, head);\n }\n if (!change && !newSel)\n return;\n // Heuristic to notice typing over a selected character\n if (!change && typeOver && !sel.empty && newSel && newSel.main.empty)\n change = { from: sel.from, to: sel.to, insert: view.state.doc.slice(sel.from, sel.to) };\n // If the change is inside the selection and covers most of it,\n // assume it is a selection replace (with identical characters at\n // the start/end not included in the diff)\n else if (change && change.from >= sel.from && change.to <= sel.to &&\n (change.from != sel.from || change.to != sel.to) &&\n (sel.to - sel.from) - (change.to - change.from) <= 4)\n change = {\n from: sel.from, to: sel.to,\n insert: view.state.doc.slice(sel.from, change.from).append(change.insert).append(view.state.doc.slice(change.to, sel.to))\n };\n if (change) {\n let startState = view.state;\n if (browser.ios && view.inputState.flushIOSKey(view))\n return;\n // Android browsers don't fire reasonable key events for enter,\n // backspace, or delete. So this detects changes that look like\n // they're caused by those keys, and reinterprets them as key\n // events. (Some of these keys are also handled by beforeinput\n // events and the pendingAndroidKey mechanism, but that's not\n // reliable in all situations.)\n if (browser.android &&\n ((change.from == sel.from && change.to == sel.to &&\n change.insert.length == 1 && change.insert.lines == 2 &&\n dispatchKey(view.contentDOM, \"Enter\", 13)) ||\n (change.from == sel.from - 1 && change.to == sel.to && change.insert.length == 0 &&\n dispatchKey(view.contentDOM, \"Backspace\", 8)) ||\n (change.from == sel.from && change.to == sel.to + 1 && change.insert.length == 0 &&\n dispatchKey(view.contentDOM, \"Delete\", 46))))\n return;\n let text = change.insert.toString();\n if (view.state.facet(inputHandler).some(h => h(view, change.from, change.to, text)))\n return;\n if (view.inputState.composing >= 0)\n view.inputState.composing++;\n let tr;\n if (change.from >= sel.from && change.to <= sel.to && change.to - change.from >= (sel.to - sel.from) / 3 &&\n (!newSel || newSel.main.empty && newSel.main.from == change.from + change.insert.length) &&\n view.inputState.composing < 0) {\n let before = sel.from < change.from ? startState.sliceDoc(sel.from, change.from) : \"\";\n let after = sel.to > change.to ? startState.sliceDoc(change.to, sel.to) : \"\";\n tr = startState.replaceSelection(view.state.toText(before + change.insert.sliceString(0, undefined, view.state.lineBreak) + after));\n }\n else {\n let changes = startState.changes(change);\n let mainSel = newSel && !startState.selection.main.eq(newSel.main) && newSel.main.to <= changes.newLength\n ? newSel.main : undefined;\n // Try to apply a composition change to all cursors\n if (startState.selection.ranges.length > 1 && view.inputState.composing >= 0 &&\n change.to <= sel.to && change.to >= sel.to - 10) {\n let replaced = view.state.sliceDoc(change.from, change.to);\n let compositionRange = compositionSurroundingNode(view) || view.state.doc.lineAt(sel.head);\n let offset = sel.to - change.to, size = sel.to - sel.from;\n tr = startState.changeByRange(range => {\n if (range.from == sel.from && range.to == sel.to)\n return { changes, range: mainSel || range.map(changes) };\n let to = range.to - offset, from = to - replaced.length;\n if (range.to - range.from != size || view.state.sliceDoc(from, to) != replaced ||\n // Unfortunately, there's no way to make multiple\n // changes in the same node work without aborting\n // composition, so cursors in the composition range are\n // ignored.\n compositionRange && range.to >= compositionRange.from && range.from <= compositionRange.to)\n return { range };\n let rangeChanges = startState.changes({ from, to, insert: change.insert }), selOff = range.to - sel.to;\n return {\n changes: rangeChanges,\n range: !mainSel ? range.map(rangeChanges) :\n EditorSelection.range(Math.max(0, mainSel.anchor + selOff), Math.max(0, mainSel.head + selOff))\n };\n });\n }\n else {\n tr = {\n changes,\n selection: mainSel && startState.selection.replaceRange(mainSel)\n };\n }\n }\n let userEvent = \"input.type\";\n if (view.composing) {\n userEvent += \".compose\";\n if (view.inputState.compositionFirstChange) {\n userEvent += \".start\";\n view.inputState.compositionFirstChange = false;\n }\n }\n view.dispatch(tr, { scrollIntoView: true, userEvent });\n }\n else if (newSel && !newSel.main.eq(sel)) {\n let scrollIntoView = false, userEvent = \"select\";\n if (view.inputState.lastSelectionTime > Date.now() - 50) {\n if (view.inputState.lastSelectionOrigin == \"select\")\n scrollIntoView = true;\n userEvent = view.inputState.lastSelectionOrigin;\n }\n view.dispatch({ selection: newSel, scrollIntoView, userEvent });\n }\n}\nfunction findDiff(a, b, preferredPos, preferredSide) {\n let minLen = Math.min(a.length, b.length);\n let from = 0;\n while (from < minLen && a.charCodeAt(from) == b.charCodeAt(from))\n from++;\n if (from == minLen && a.length == b.length)\n return null;\n let toA = a.length, toB = b.length;\n while (toA > 0 && toB > 0 && a.charCodeAt(toA - 1) == b.charCodeAt(toB - 1)) {\n toA--;\n toB--;\n }\n if (preferredSide == \"end\") {\n let adjust = Math.max(0, from - Math.min(toA, toB));\n preferredPos -= toA + adjust - from;\n }\n if (toA < from && a.length < b.length) {\n let move = preferredPos <= from && preferredPos >= toA ? from - preferredPos : 0;\n from -= move;\n toB = from + (toB - toA);\n toA = from;\n }\n else if (toB < from) {\n let move = preferredPos <= from && preferredPos >= toB ? from - preferredPos : 0;\n from -= move;\n toA = from + (toA - toB);\n toB = from;\n }\n return { from, toA, toB };\n}\nfunction selectionPoints(view) {\n let result = [];\n if (view.root.activeElement != view.contentDOM)\n return result;\n let { anchorNode, anchorOffset, focusNode, focusOffset } = view.observer.selectionRange;\n if (anchorNode) {\n result.push(new DOMPoint(anchorNode, anchorOffset));\n if (focusNode != anchorNode || focusOffset != anchorOffset)\n result.push(new DOMPoint(focusNode, focusOffset));\n }\n return result;\n}\nfunction selectionFromPoints(points, base) {\n if (points.length == 0)\n return null;\n let anchor = points[0].pos, head = points.length == 2 ? points[1].pos : anchor;\n return anchor > -1 && head > -1 ? EditorSelection.single(anchor + base, head + base) : null;\n}\n\n// The editor's update state machine looks something like this:\n//\n// Idle → Updating ⇆ Idle (unchecked) → Measuring → Idle\n// ↑ ↓\n// Updating (measure)\n//\n// The difference between 'Idle' and 'Idle (unchecked)' lies in\n// whether a layout check has been scheduled. A regular update through\n// the `update` method updates the DOM in a write-only fashion, and\n// relies on a check (scheduled with `requestAnimationFrame`) to make\n// sure everything is where it should be and the viewport covers the\n// visible code. That check continues to measure and then optionally\n// update until it reaches a coherent state.\n/**\nAn editor view represents the editor's user interface. It holds\nthe editable DOM surface, and possibly other elements such as the\nline number gutter. It handles events and dispatches state\ntransactions for editing actions.\n*/\nclass EditorView {\n /**\n Construct a new view. You'll usually want to put `view.dom` into\n your document after creating a view, so that the user can see\n it.\n */\n constructor(\n /**\n Initialization options.\n */\n config = {}) {\n this.plugins = [];\n this.pluginMap = new Map;\n this.editorAttrs = {};\n this.contentAttrs = {};\n this.bidiCache = [];\n this.destroyed = false;\n /**\n @internal\n */\n this.updateState = 2 /* Updating */;\n /**\n @internal\n */\n this.measureScheduled = -1;\n /**\n @internal\n */\n this.measureRequests = [];\n this.contentDOM = document.createElement(\"div\");\n this.scrollDOM = document.createElement(\"div\");\n this.scrollDOM.tabIndex = -1;\n this.scrollDOM.className = \"cm-scroller\";\n this.scrollDOM.appendChild(this.contentDOM);\n this.announceDOM = document.createElement(\"div\");\n this.announceDOM.style.cssText = \"position: absolute; top: -10000px\";\n this.announceDOM.setAttribute(\"aria-live\", \"polite\");\n this.dom = document.createElement(\"div\");\n this.dom.appendChild(this.announceDOM);\n this.dom.appendChild(this.scrollDOM);\n this._dispatch = config.dispatch || ((tr) => this.update([tr]));\n this.dispatch = this.dispatch.bind(this);\n this.root = (config.root || getRoot(config.parent) || document);\n this.viewState = new ViewState(config.state || EditorState.create());\n this.plugins = this.state.facet(viewPlugin).map(spec => new PluginInstance(spec));\n for (let plugin of this.plugins)\n plugin.update(this);\n this.observer = new DOMObserver(this, (from, to, typeOver) => {\n applyDOMChange(this, from, to, typeOver);\n }, event => {\n this.inputState.runScrollHandlers(this, event);\n if (this.observer.intersecting)\n this.measure();\n });\n this.inputState = new InputState(this);\n this.docView = new DocView(this);\n this.mountStyles();\n this.updateAttrs();\n this.updateState = 0 /* Idle */;\n this.requestMeasure();\n if (config.parent)\n config.parent.appendChild(this.dom);\n }\n /**\n The current editor state.\n */\n get state() { return this.viewState.state; }\n /**\n To be able to display large documents without consuming too much\n memory or overloading the browser, CodeMirror only draws the\n code that is visible (plus a margin around it) to the DOM. This\n property tells you the extent of the current drawn viewport, in\n document positions.\n */\n get viewport() { return this.viewState.viewport; }\n /**\n When there are, for example, large collapsed ranges in the\n viewport, its size can be a lot bigger than the actual visible\n content. Thus, if you are doing something like styling the\n content in the viewport, it is preferable to only do so for\n these ranges, which are the subset of the viewport that is\n actually drawn.\n */\n get visibleRanges() { return this.viewState.visibleRanges; }\n /**\n Returns false when the editor is entirely scrolled out of view\n or otherwise hidden.\n */\n get inView() { return this.viewState.inView; }\n /**\n Indicates whether the user is currently composing text via\n [IME](https://en.wikipedia.org/wiki/Input_method), and at least\n one change has been made in the current composition.\n */\n get composing() { return this.inputState.composing > 0; }\n /**\n Indicates whether the user is currently in composing state. Note\n that on some platforms, like Android, this will be the case a\n lot, since just putting the cursor on a word starts a\n composition there.\n */\n get compositionStarted() { return this.inputState.composing >= 0; }\n dispatch(...input) {\n this._dispatch(input.length == 1 && input[0] instanceof Transaction ? input[0]\n : this.state.update(...input));\n }\n /**\n Update the view for the given array of transactions. This will\n update the visible document and selection to match the state\n produced by the transactions, and notify view plugins of the\n change. You should usually call\n [`dispatch`](https://codemirror.net/6/docs/ref/#view.EditorView.dispatch) instead, which uses this\n as a primitive.\n */\n update(transactions) {\n if (this.updateState != 0 /* Idle */)\n throw new Error(\"Calls to EditorView.update are not allowed while an update is in progress\");\n let redrawn = false, update;\n let state = this.state;\n for (let tr of transactions) {\n if (tr.startState != state)\n throw new RangeError(\"Trying to update state with a transaction that doesn't start from the previous state.\");\n state = tr.state;\n }\n if (this.destroyed) {\n this.viewState.state = state;\n return;\n }\n // When the phrases change, redraw the editor\n if (state.facet(EditorState.phrases) != this.state.facet(EditorState.phrases))\n return this.setState(state);\n update = new ViewUpdate(this, state, transactions);\n let scrollTarget = this.viewState.scrollTarget;\n try {\n this.updateState = 2 /* Updating */;\n for (let tr of transactions) {\n if (scrollTarget)\n scrollTarget = scrollTarget.map(tr.changes);\n if (tr.scrollIntoView) {\n let { main } = tr.state.selection;\n scrollTarget = new ScrollTarget(main.empty ? main : EditorSelection.cursor(main.head, main.head > main.anchor ? -1 : 1));\n }\n for (let e of tr.effects) {\n if (e.is(scrollTo))\n scrollTarget = new ScrollTarget(e.value);\n else if (e.is(centerOn))\n scrollTarget = new ScrollTarget(e.value, \"center\");\n else if (e.is(scrollIntoView))\n scrollTarget = e.value;\n }\n }\n this.viewState.update(update, scrollTarget);\n this.bidiCache = CachedOrder.update(this.bidiCache, update.changes);\n if (!update.empty) {\n this.updatePlugins(update);\n this.inputState.update(update);\n }\n redrawn = this.docView.update(update);\n if (this.state.facet(styleModule) != this.styleModules)\n this.mountStyles();\n this.updateAttrs();\n this.showAnnouncements(transactions);\n this.docView.updateSelection(redrawn, transactions.some(tr => tr.isUserEvent(\"select.pointer\")));\n }\n finally {\n this.updateState = 0 /* Idle */;\n }\n if (update.startState.facet(theme) != update.state.facet(theme))\n this.viewState.mustMeasureContent = true;\n if (redrawn || scrollTarget || this.viewState.mustEnforceCursorAssoc || this.viewState.mustMeasureContent)\n this.requestMeasure();\n if (!update.empty)\n for (let listener of this.state.facet(updateListener))\n listener(update);\n }\n /**\n Reset the view to the given state. (This will cause the entire\n document to be redrawn and all view plugins to be reinitialized,\n so you should probably only use it when the new state isn't\n derived from the old state. Otherwise, use\n [`dispatch`](https://codemirror.net/6/docs/ref/#view.EditorView.dispatch) instead.)\n */\n setState(newState) {\n if (this.updateState != 0 /* Idle */)\n throw new Error(\"Calls to EditorView.setState are not allowed while an update is in progress\");\n if (this.destroyed) {\n this.viewState.state = newState;\n return;\n }\n this.updateState = 2 /* Updating */;\n let hadFocus = this.hasFocus;\n try {\n for (let plugin of this.plugins)\n plugin.destroy(this);\n this.viewState = new ViewState(newState);\n this.plugins = newState.facet(viewPlugin).map(spec => new PluginInstance(spec));\n this.pluginMap.clear();\n for (let plugin of this.plugins)\n plugin.update(this);\n this.docView = new DocView(this);\n this.inputState.ensureHandlers(this);\n this.mountStyles();\n this.updateAttrs();\n this.bidiCache = [];\n }\n finally {\n this.updateState = 0 /* Idle */;\n }\n if (hadFocus)\n this.focus();\n this.requestMeasure();\n }\n updatePlugins(update) {\n let prevSpecs = update.startState.facet(viewPlugin), specs = update.state.facet(viewPlugin);\n if (prevSpecs != specs) {\n let newPlugins = [];\n for (let spec of specs) {\n let found = prevSpecs.indexOf(spec);\n if (found < 0) {\n newPlugins.push(new PluginInstance(spec));\n }\n else {\n let plugin = this.plugins[found];\n plugin.mustUpdate = update;\n newPlugins.push(plugin);\n }\n }\n for (let plugin of this.plugins)\n if (plugin.mustUpdate != update)\n plugin.destroy(this);\n this.plugins = newPlugins;\n this.pluginMap.clear();\n this.inputState.ensureHandlers(this);\n }\n else {\n for (let p of this.plugins)\n p.mustUpdate = update;\n }\n for (let i = 0; i < this.plugins.length; i++)\n this.plugins[i].update(this);\n }\n /**\n @internal\n */\n measure(flush = true) {\n if (this.destroyed)\n return;\n if (this.measureScheduled > -1)\n cancelAnimationFrame(this.measureScheduled);\n this.measureScheduled = 0; // Prevent requestMeasure calls from scheduling another animation frame\n if (flush)\n this.observer.flush();\n let updated = null;\n try {\n for (let i = 0;; i++) {\n this.updateState = 1 /* Measuring */;\n let oldViewport = this.viewport;\n let changed = this.viewState.measure(this);\n if (!changed && !this.measureRequests.length && this.viewState.scrollTarget == null)\n break;\n if (i > 5) {\n console.warn(this.measureRequests.length\n ? \"Measure loop restarted more than 5 times\"\n : \"Viewport failed to stabilize\");\n break;\n }\n let measuring = [];\n // Only run measure requests in this cycle when the viewport didn't change\n if (!(changed & 4 /* Viewport */))\n [this.measureRequests, measuring] = [measuring, this.measureRequests];\n let measured = measuring.map(m => {\n try {\n return m.read(this);\n }\n catch (e) {\n logException(this.state, e);\n return BadMeasure;\n }\n });\n let update = new ViewUpdate(this, this.state), redrawn = false, scrolled = false;\n update.flags |= changed;\n if (!updated)\n updated = update;\n else\n updated.flags |= changed;\n this.updateState = 2 /* Updating */;\n if (!update.empty) {\n this.updatePlugins(update);\n this.inputState.update(update);\n this.updateAttrs();\n redrawn = this.docView.update(update);\n }\n for (let i = 0; i < measuring.length; i++)\n if (measured[i] != BadMeasure) {\n try {\n let m = measuring[i];\n if (m.write)\n m.write(measured[i], this);\n }\n catch (e) {\n logException(this.state, e);\n }\n }\n if (this.viewState.scrollTarget) {\n this.docView.scrollIntoView(this.viewState.scrollTarget);\n this.viewState.scrollTarget = null;\n scrolled = true;\n }\n if (redrawn)\n this.docView.updateSelection(true);\n if (this.viewport.from == oldViewport.from && this.viewport.to == oldViewport.to &&\n !scrolled && this.measureRequests.length == 0)\n break;\n }\n }\n finally {\n this.updateState = 0 /* Idle */;\n this.measureScheduled = -1;\n }\n if (updated && !updated.empty)\n for (let listener of this.state.facet(updateListener))\n listener(updated);\n }\n /**\n Get the CSS classes for the currently active editor themes.\n */\n get themeClasses() {\n return baseThemeID + \" \" +\n (this.state.facet(darkTheme) ? baseDarkID : baseLightID) + \" \" +\n this.state.facet(theme);\n }\n updateAttrs() {\n let editorAttrs = attrsFromFacet(this, editorAttributes, {\n class: \"cm-editor\" + (this.hasFocus ? \" cm-focused \" : \" \") + this.themeClasses\n });\n let contentAttrs = {\n spellcheck: \"false\",\n autocorrect: \"off\",\n autocapitalize: \"off\",\n translate: \"no\",\n contenteditable: !this.state.facet(editable) ? \"false\" : \"true\",\n class: \"cm-content\",\n style: `${browser.tabSize}: ${this.state.tabSize}`,\n role: \"textbox\",\n \"aria-multiline\": \"true\"\n };\n if (this.state.readOnly)\n contentAttrs[\"aria-readonly\"] = \"true\";\n attrsFromFacet(this, contentAttributes, contentAttrs);\n this.observer.ignore(() => {\n updateAttrs(this.contentDOM, this.contentAttrs, contentAttrs);\n updateAttrs(this.dom, this.editorAttrs, editorAttrs);\n });\n this.editorAttrs = editorAttrs;\n this.contentAttrs = contentAttrs;\n }\n showAnnouncements(trs) {\n let first = true;\n for (let tr of trs)\n for (let effect of tr.effects)\n if (effect.is(EditorView.announce)) {\n if (first)\n this.announceDOM.textContent = \"\";\n first = false;\n let div = this.announceDOM.appendChild(document.createElement(\"div\"));\n div.textContent = effect.value;\n }\n }\n mountStyles() {\n this.styleModules = this.state.facet(styleModule);\n StyleModule.mount(this.root, this.styleModules.concat(baseTheme).reverse());\n }\n readMeasured() {\n if (this.updateState == 2 /* Updating */)\n throw new Error(\"Reading the editor layout isn't allowed during an update\");\n if (this.updateState == 0 /* Idle */ && this.measureScheduled > -1)\n this.measure(false);\n }\n /**\n Schedule a layout measurement, optionally providing callbacks to\n do custom DOM measuring followed by a DOM write phase. Using\n this is preferable reading DOM layout directly from, for\n example, an event handler, because it'll make sure measuring and\n drawing done by other components is synchronized, avoiding\n unnecessary DOM layout computations.\n */\n requestMeasure(request) {\n if (this.measureScheduled < 0)\n this.measureScheduled = requestAnimationFrame(() => this.measure());\n if (request) {\n if (request.key != null)\n for (let i = 0; i < this.measureRequests.length; i++) {\n if (this.measureRequests[i].key === request.key) {\n this.measureRequests[i] = request;\n return;\n }\n }\n this.measureRequests.push(request);\n }\n }\n /**\n Collect all values provided by the active plugins for a given\n field.\n */\n pluginField(field) {\n let result = [];\n for (let plugin of this.plugins)\n plugin.update(this).takeField(field, result);\n return result;\n }\n /**\n Get the value of a specific plugin, if present. Note that\n plugins that crash can be dropped from a view, so even when you\n know you registered a given plugin, it is recommended to check\n the return value of this method.\n */\n plugin(plugin) {\n let known = this.pluginMap.get(plugin);\n if (known === undefined || known && known.spec != plugin)\n this.pluginMap.set(plugin, known = this.plugins.find(p => p.spec == plugin) || null);\n return known && known.update(this).value;\n }\n /**\n The top position of the document, in screen coordinates. This\n may be negative when the editor is scrolled down. Points\n directly to the top of the first line, not above the padding.\n */\n get documentTop() {\n return this.contentDOM.getBoundingClientRect().top + this.viewState.paddingTop;\n }\n /**\n Reports the padding above and below the document.\n */\n get documentPadding() {\n return { top: this.viewState.paddingTop, bottom: this.viewState.paddingBottom };\n }\n /**\n Find the line or block widget at the given vertical position.\n \n By default, this position is interpreted as a screen position,\n meaning `docTop` is set to the DOM top position of the editor\n content (forcing a layout). You can pass a different `docTop`\n value—for example 0 to interpret `height` as a document-relative\n position, or a precomputed document top\n (`view.contentDOM.getBoundingClientRect().top`) to limit layout\n queries.\n \n *Deprecated: use `elementAtHeight` instead.*\n */\n blockAtHeight(height, docTop) {\n let top = ensureTop(docTop, this);\n return this.elementAtHeight(height - top).moveY(top);\n }\n /**\n Find the text line or block widget at the given vertical\n position (which is interpreted as relative to the [top of the\n document](https://codemirror.net/6/docs/ref/#view.EditorView.documentTop)\n */\n elementAtHeight(height) {\n this.readMeasured();\n return this.viewState.elementAtHeight(height);\n }\n /**\n Find information for the visual line (see\n [`visualLineAt`](https://codemirror.net/6/docs/ref/#view.EditorView.visualLineAt)) at the given\n vertical position. The resulting block info might hold another\n array of block info structs in its `type` field if this line\n consists of more than one block.\n \n Defaults to treating `height` as a screen position. See\n [`blockAtHeight`](https://codemirror.net/6/docs/ref/#view.EditorView.blockAtHeight) for the\n interpretation of the `docTop` parameter.\n \n *Deprecated: use `lineBlockAtHeight` instead.*\n */\n visualLineAtHeight(height, docTop) {\n let top = ensureTop(docTop, this);\n return this.lineBlockAtHeight(height - top).moveY(top);\n }\n /**\n Find the line block (see\n [`lineBlockAt`](https://codemirror.net/6/docs/ref/#view.EditorView.lineBlockAt) at the given\n height.\n */\n lineBlockAtHeight(height) {\n this.readMeasured();\n return this.viewState.lineBlockAtHeight(height);\n }\n /**\n Iterate over the height information of the visual lines in the\n viewport. The heights of lines are reported relative to the\n given document top, which defaults to the screen position of the\n document (forcing a layout).\n \n *Deprecated: use `viewportLineBlocks` instead.*\n */\n viewportLines(f, docTop) {\n let top = ensureTop(docTop, this);\n for (let line of this.viewportLineBlocks)\n f(line.moveY(top));\n }\n /**\n Get the extent and vertical position of all [line\n blocks](https://codemirror.net/6/docs/ref/#view.EditorView.lineBlockAt) in the viewport. Positions\n are relative to the [top of the\n document](https://codemirror.net/6/docs/ref/#view.EditorView.documentTop);\n */\n get viewportLineBlocks() {\n return this.viewState.viewportLines;\n }\n /**\n Find the extent and height of the visual line (a range delimited\n on both sides by either non-[hidden](https://codemirror.net/6/docs/ref/#view.Decoration^range)\n line breaks, or the start/end of the document) at the given position.\n \n Vertical positions are computed relative to the `docTop`\n argument, which defaults to 0 for this method. You can pass\n `view.contentDOM.getBoundingClientRect().top` here to get screen\n coordinates.\n \n *Deprecated: use `lineBlockAt` instead.*\n */\n visualLineAt(pos, docTop = 0) {\n return this.lineBlockAt(pos).moveY(docTop + this.viewState.paddingTop);\n }\n /**\n Find the line block around the given document position. A line\n block is a range delimited on both sides by either a\n non-[hidden](https://codemirror.net/6/docs/ref/#view.Decoration^range) line breaks, or the\n start/end of the document. It will usually just hold a line of\n text, but may be broken into multiple textblocks by block\n widgets.\n */\n lineBlockAt(pos) {\n return this.viewState.lineBlockAt(pos);\n }\n /**\n The editor's total content height.\n */\n get contentHeight() {\n return this.viewState.contentHeight;\n }\n /**\n Move a cursor position by [grapheme\n cluster](https://codemirror.net/6/docs/ref/#text.findClusterBreak). `forward` determines whether\n the motion is away from the line start, or towards it. Motion in\n bidirectional text is in visual order, in the editor's [text\n direction](https://codemirror.net/6/docs/ref/#view.EditorView.textDirection). When the start\n position was the last one on the line, the returned position\n will be across the line break. If there is no further line, the\n original position is returned.\n \n By default, this method moves over a single cluster. The\n optional `by` argument can be used to move across more. It will\n be called with the first cluster as argument, and should return\n a predicate that determines, for each subsequent cluster,\n whether it should also be moved over.\n */\n moveByChar(start, forward, by) {\n return skipAtoms(this, start, moveByChar(this, start, forward, by));\n }\n /**\n Move a cursor position across the next group of either\n [letters](https://codemirror.net/6/docs/ref/#state.EditorState.charCategorizer) or non-letter\n non-whitespace characters.\n */\n moveByGroup(start, forward) {\n return skipAtoms(this, start, moveByChar(this, start, forward, initial => byGroup(this, start.head, initial)));\n }\n /**\n Move to the next line boundary in the given direction. If\n `includeWrap` is true, line wrapping is on, and there is a\n further wrap point on the current line, the wrap point will be\n returned. Otherwise this function will return the start or end\n of the line.\n */\n moveToLineBoundary(start, forward, includeWrap = true) {\n return moveToLineBoundary(this, start, forward, includeWrap);\n }\n /**\n Move a cursor position vertically. When `distance` isn't given,\n it defaults to moving to the next line (including wrapped\n lines). Otherwise, `distance` should provide a positive distance\n in pixels.\n \n When `start` has a\n [`goalColumn`](https://codemirror.net/6/docs/ref/#state.SelectionRange.goalColumn), the vertical\n motion will use that as a target horizontal position. Otherwise,\n the cursor's own horizontal position is used. The returned\n cursor will have its goal column set to whichever column was\n used.\n */\n moveVertically(start, forward, distance) {\n return skipAtoms(this, start, moveVertically(this, start, forward, distance));\n }\n // FIXME remove on next major version\n scrollPosIntoView(pos) {\n this.dispatch({ effects: scrollTo.of(EditorSelection.cursor(pos)) });\n }\n /**\n Find the DOM parent node and offset (child offset if `node` is\n an element, character offset when it is a text node) at the\n given document position.\n \n Note that for positions that aren't currently in\n `visibleRanges`, the resulting DOM position isn't necessarily\n meaningful (it may just point before or after a placeholder\n element).\n */\n domAtPos(pos) {\n return this.docView.domAtPos(pos);\n }\n /**\n Find the document position at the given DOM node. Can be useful\n for associating positions with DOM events. Will raise an error\n when `node` isn't part of the editor content.\n */\n posAtDOM(node, offset = 0) {\n return this.docView.posFromDOM(node, offset);\n }\n posAtCoords(coords, precise = true) {\n this.readMeasured();\n return posAtCoords(this, coords, precise);\n }\n /**\n Get the screen coordinates at the given document position.\n `side` determines whether the coordinates are based on the\n element before (-1) or after (1) the position (if no element is\n available on the given side, the method will transparently use\n another strategy to get reasonable coordinates).\n */\n coordsAtPos(pos, side = 1) {\n this.readMeasured();\n let rect = this.docView.coordsAt(pos, side);\n if (!rect || rect.left == rect.right)\n return rect;\n let line = this.state.doc.lineAt(pos), order = this.bidiSpans(line);\n let span = order[BidiSpan.find(order, pos - line.from, -1, side)];\n return flattenRect(rect, (span.dir == Direction.LTR) == (side > 0));\n }\n /**\n The default width of a character in the editor. May not\n accurately reflect the width of all characters (given variable\n width fonts or styling of invididual ranges).\n */\n get defaultCharacterWidth() { return this.viewState.heightOracle.charWidth; }\n /**\n The default height of a line in the editor. May not be accurate\n for all lines.\n */\n get defaultLineHeight() { return this.viewState.heightOracle.lineHeight; }\n /**\n The text direction\n ([`direction`](https://developer.mozilla.org/en-US/docs/Web/CSS/direction)\n CSS property) of the editor.\n */\n get textDirection() { return this.viewState.heightOracle.direction; }\n /**\n Whether this editor [wraps lines](https://codemirror.net/6/docs/ref/#view.EditorView.lineWrapping)\n (as determined by the\n [`white-space`](https://developer.mozilla.org/en-US/docs/Web/CSS/white-space)\n CSS property of its content element).\n */\n get lineWrapping() { return this.viewState.heightOracle.lineWrapping; }\n /**\n Returns the bidirectional text structure of the given line\n (which should be in the current document) as an array of span\n objects. The order of these spans matches the [text\n direction](https://codemirror.net/6/docs/ref/#view.EditorView.textDirection)—if that is\n left-to-right, the leftmost spans come first, otherwise the\n rightmost spans come first.\n */\n bidiSpans(line) {\n if (line.length > MaxBidiLine)\n return trivialOrder(line.length);\n let dir = this.textDirection;\n for (let entry of this.bidiCache)\n if (entry.from == line.from && entry.dir == dir)\n return entry.order;\n let order = computeOrder(line.text, this.textDirection);\n this.bidiCache.push(new CachedOrder(line.from, line.to, dir, order));\n return order;\n }\n /**\n Check whether the editor has focus.\n */\n get hasFocus() {\n var _a;\n // Safari return false for hasFocus when the context menu is open\n // or closing, which leads us to ignore selection changes from the\n // context menu because it looks like the editor isn't focused.\n // This kludges around that.\n return (document.hasFocus() || browser.safari && ((_a = this.inputState) === null || _a === void 0 ? void 0 : _a.lastContextMenu) > Date.now() - 3e4) &&\n this.root.activeElement == this.contentDOM;\n }\n /**\n Put focus on the editor.\n */\n focus() {\n this.observer.ignore(() => {\n focusPreventScroll(this.contentDOM);\n this.docView.updateSelection();\n });\n }\n /**\n Clean up this editor view, removing its element from the\n document, unregistering event handlers, and notifying\n plugins. The view instance can no longer be used after\n calling this.\n */\n destroy() {\n for (let plugin of this.plugins)\n plugin.destroy(this);\n this.plugins = [];\n this.inputState.destroy();\n this.dom.remove();\n this.observer.destroy();\n if (this.measureScheduled > -1)\n cancelAnimationFrame(this.measureScheduled);\n this.destroyed = true;\n }\n /**\n Returns an effect that can be\n [added](https://codemirror.net/6/docs/ref/#state.TransactionSpec.effects) to a transaction to\n cause it to scroll the given position or range into view.\n */\n static scrollIntoView(pos, options = {}) {\n return scrollIntoView.of(new ScrollTarget(typeof pos == \"number\" ? EditorSelection.cursor(pos) : pos, options.y, options.x, options.yMargin, options.xMargin));\n }\n /**\n Facet that can be used to add DOM event handlers. The value\n should be an object mapping event names to handler functions. The\n first such function to return true will be assumed to have handled\n that event, and no other handlers or built-in behavior will be\n activated for it.\n These are registered on the [content\n element](https://codemirror.net/6/docs/ref/#view.EditorView.contentDOM), except for `scroll`\n handlers, which will be called any time the editor's [scroll\n element](https://codemirror.net/6/docs/ref/#view.EditorView.scrollDOM) or one of its parent nodes\n is scrolled.\n */\n static domEventHandlers(handlers) {\n return ViewPlugin.define(() => ({}), { eventHandlers: handlers });\n }\n /**\n Create a theme extension. The first argument can be a\n [`style-mod`](https://github.com/marijnh/style-mod#documentation)\n style spec providing the styles for the theme. These will be\n prefixed with a generated class for the style.\n \n Because the selectors will be prefixed with a scope class, rule\n that directly match the editor's [wrapper\n element](https://codemirror.net/6/docs/ref/#view.EditorView.dom)—to which the scope class will be\n added—need to be explicitly differentiated by adding an `&` to\n the selector for that element—for example\n `&.cm-focused`.\n \n When `dark` is set to true, the theme will be marked as dark,\n which will cause the `&dark` rules from [base\n themes](https://codemirror.net/6/docs/ref/#view.EditorView^baseTheme) to be used (as opposed to\n `&light` when a light theme is active).\n */\n static theme(spec, options) {\n let prefix = StyleModule.newName();\n let result = [theme.of(prefix), styleModule.of(buildTheme(`.${prefix}`, spec))];\n if (options && options.dark)\n result.push(darkTheme.of(true));\n return result;\n }\n /**\n Create an extension that adds styles to the base theme. Like\n with [`theme`](https://codemirror.net/6/docs/ref/#view.EditorView^theme), use `&` to indicate the\n place of the editor wrapper element when directly targeting\n that. You can also use `&dark` or `&light` instead to only\n target editors with a dark or light theme.\n */\n static baseTheme(spec) {\n return Prec.lowest(styleModule.of(buildTheme(\".\" + baseThemeID, spec, lightDarkIDs)));\n }\n}\n/**\nEffect that can be [added](https://codemirror.net/6/docs/ref/#state.TransactionSpec.effects) to a\ntransaction to make it scroll the given range into view.\n\n*Deprecated*. Use [`scrollIntoView`](https://codemirror.net/6/docs/ref/#view.EditorView^scrollIntoView) instead.\n*/\nEditorView.scrollTo = scrollTo;\n/**\nEffect that makes the editor scroll the given range to the\ncenter of the visible view.\n\n*Deprecated*. Use [`scrollIntoView`](https://codemirror.net/6/docs/ref/#view.EditorView^scrollIntoView) instead.\n*/\nEditorView.centerOn = centerOn;\n/**\nFacet to add a [style\nmodule](https://github.com/marijnh/style-mod#documentation) to\nan editor view. The view will ensure that the module is\nmounted in its [document\nroot](https://codemirror.net/6/docs/ref/#view.EditorView.constructor^config.root).\n*/\nEditorView.styleModule = styleModule;\n/**\nAn input handler can override the way changes to the editable\nDOM content are handled. Handlers are passed the document\npositions between which the change was found, and the new\ncontent. When one returns true, no further input handlers are\ncalled and the default behavior is prevented.\n*/\nEditorView.inputHandler = inputHandler;\n/**\nAllows you to provide a function that should be called when the\nlibrary catches an exception from an extension (mostly from view\nplugins, but may be used by other extensions to route exceptions\nfrom user-code-provided callbacks). This is mostly useful for\ndebugging and logging. See [`logException`](https://codemirror.net/6/docs/ref/#view.logException).\n*/\nEditorView.exceptionSink = exceptionSink;\n/**\nA facet that can be used to register a function to be called\nevery time the view updates.\n*/\nEditorView.updateListener = updateListener;\n/**\nFacet that controls whether the editor content DOM is editable.\nWhen its highest-precedence value is `false`, the element will\nnot longer have its `contenteditable` attribute set. (Note that\nthis doesn't affect API calls that change the editor content,\neven when those are bound to keys or buttons. See the\n[`readOnly`](https://codemirror.net/6/docs/ref/#state.EditorState.readOnly) facet for that.)\n*/\nEditorView.editable = editable;\n/**\nAllows you to influence the way mouse selection happens. The\nfunctions in this facet will be called for a `mousedown` event\non the editor, and can return an object that overrides the way a\nselection is computed from that mouse click or drag.\n*/\nEditorView.mouseSelectionStyle = mouseSelectionStyle;\n/**\nFacet used to configure whether a given selection drag event\nshould move or copy the selection. The given predicate will be\ncalled with the `mousedown` event, and can return `true` when\nthe drag should move the content.\n*/\nEditorView.dragMovesSelection = dragMovesSelection$1;\n/**\nFacet used to configure whether a given selecting click adds\na new range to the existing selection or replaces it entirely.\n*/\nEditorView.clickAddsSelectionRange = clickAddsSelectionRange;\n/**\nA facet that determines which [decorations](https://codemirror.net/6/docs/ref/#view.Decoration)\nare shown in the view. See also [view\nplugins](https://codemirror.net/6/docs/ref/#view.EditorView^decorations), which have a separate\nmechanism for providing decorations.\n*/\nEditorView.decorations = decorations;\n/**\nThis facet records whether a dark theme is active. The extension\nreturned by [`theme`](https://codemirror.net/6/docs/ref/#view.EditorView^theme) automatically\nincludes an instance of this when the `dark` option is set to\ntrue.\n*/\nEditorView.darkTheme = darkTheme;\n/**\nFacet that provides additional DOM attributes for the editor's\neditable DOM element.\n*/\nEditorView.contentAttributes = contentAttributes;\n/**\nFacet that provides DOM attributes for the editor's outer\nelement.\n*/\nEditorView.editorAttributes = editorAttributes;\n/**\nAn extension that enables line wrapping in the editor (by\nsetting CSS `white-space` to `pre-wrap` in the content).\n*/\nEditorView.lineWrapping = /*@__PURE__*/EditorView.contentAttributes.of({ \"class\": \"cm-lineWrapping\" });\n/**\nState effect used to include screen reader announcements in a\ntransaction. These will be added to the DOM in a visually hidden\nelement with `aria-live=\"polite\"` set, and should be used to\ndescribe effects that are visually obvious but may not be\nnoticed by screen reader users (such as moving to the next\nsearch match).\n*/\nEditorView.announce = /*@__PURE__*/StateEffect.define();\n// Maximum line length for which we compute accurate bidi info\nconst MaxBidiLine = 4096;\n// FIXME remove this and its callers on next breaking release\nfunction ensureTop(given, view) {\n return (given == null ? view.contentDOM.getBoundingClientRect().top : given) + view.viewState.paddingTop;\n}\nconst BadMeasure = {};\nclass CachedOrder {\n constructor(from, to, dir, order) {\n this.from = from;\n this.to = to;\n this.dir = dir;\n this.order = order;\n }\n static update(cache, changes) {\n if (changes.empty)\n return cache;\n let result = [], lastDir = cache.length ? cache[cache.length - 1].dir : Direction.LTR;\n for (let i = Math.max(0, cache.length - 10); i < cache.length; i++) {\n let entry = cache[i];\n if (entry.dir == lastDir && !changes.touchesRange(entry.from, entry.to))\n result.push(new CachedOrder(changes.mapPos(entry.from, 1), changes.mapPos(entry.to, -1), entry.dir, entry.order));\n }\n return result;\n }\n}\nfunction attrsFromFacet(view, facet, base) {\n for (let sources = view.state.facet(facet), i = sources.length - 1; i >= 0; i--) {\n let source = sources[i], value = typeof source == \"function\" ? source(view) : source;\n if (value)\n combineAttrs(value, base);\n }\n return base;\n}\n\nconst currentPlatform = browser.mac ? \"mac\" : browser.windows ? \"win\" : browser.linux ? \"linux\" : \"key\";\nfunction normalizeKeyName(name, platform) {\n const parts = name.split(/-(?!$)/);\n let result = parts[parts.length - 1];\n if (result == \"Space\")\n result = \" \";\n let alt, ctrl, shift, meta;\n for (let i = 0; i < parts.length - 1; ++i) {\n const mod = parts[i];\n if (/^(cmd|meta|m)$/i.test(mod))\n meta = true;\n else if (/^a(lt)?$/i.test(mod))\n alt = true;\n else if (/^(c|ctrl|control)$/i.test(mod))\n ctrl = true;\n else if (/^s(hift)?$/i.test(mod))\n shift = true;\n else if (/^mod$/i.test(mod)) {\n if (platform == \"mac\")\n meta = true;\n else\n ctrl = true;\n }\n else\n throw new Error(\"Unrecognized modifier name: \" + mod);\n }\n if (alt)\n result = \"Alt-\" + result;\n if (ctrl)\n result = \"Ctrl-\" + result;\n if (meta)\n result = \"Meta-\" + result;\n if (shift)\n result = \"Shift-\" + result;\n return result;\n}\nfunction modifiers(name, event, shift) {\n if (event.altKey)\n name = \"Alt-\" + name;\n if (event.ctrlKey)\n name = \"Ctrl-\" + name;\n if (event.metaKey)\n name = \"Meta-\" + name;\n if (shift !== false && event.shiftKey)\n name = \"Shift-\" + name;\n return name;\n}\nconst handleKeyEvents = /*@__PURE__*/EditorView.domEventHandlers({\n keydown(event, view) {\n return runHandlers(getKeymap(view.state), event, view, \"editor\");\n }\n});\n/**\nFacet used for registering keymaps.\n\nYou can add multiple keymaps to an editor. Their priorities\ndetermine their precedence (the ones specified early or with high\npriority get checked first). When a handler has returned `true`\nfor a given key, no further handlers are called.\n*/\nconst keymap = /*@__PURE__*/Facet.define({ enables: handleKeyEvents });\nconst Keymaps = /*@__PURE__*/new WeakMap();\n// This is hidden behind an indirection, rather than directly computed\n// by the facet, to keep internal types out of the facet's type.\nfunction getKeymap(state) {\n let bindings = state.facet(keymap);\n let map = Keymaps.get(bindings);\n if (!map)\n Keymaps.set(bindings, map = buildKeymap(bindings.reduce((a, b) => a.concat(b), [])));\n return map;\n}\n/**\nRun the key handlers registered for a given scope. The event\nobject should be `\"keydown\"` event. Returns true if any of the\nhandlers handled it.\n*/\nfunction runScopeHandlers(view, event, scope) {\n return runHandlers(getKeymap(view.state), event, view, scope);\n}\nlet storedPrefix = null;\nconst PrefixTimeout = 4000;\nfunction buildKeymap(bindings, platform = currentPlatform) {\n let bound = Object.create(null);\n let isPrefix = Object.create(null);\n let checkPrefix = (name, is) => {\n let current = isPrefix[name];\n if (current == null)\n isPrefix[name] = is;\n else if (current != is)\n throw new Error(\"Key binding \" + name + \" is used both as a regular binding and as a multi-stroke prefix\");\n };\n let add = (scope, key, command, preventDefault) => {\n let scopeObj = bound[scope] || (bound[scope] = Object.create(null));\n let parts = key.split(/ (?!$)/).map(k => normalizeKeyName(k, platform));\n for (let i = 1; i < parts.length; i++) {\n let prefix = parts.slice(0, i).join(\" \");\n checkPrefix(prefix, true);\n if (!scopeObj[prefix])\n scopeObj[prefix] = {\n preventDefault: true,\n commands: [(view) => {\n let ourObj = storedPrefix = { view, prefix, scope };\n setTimeout(() => { if (storedPrefix == ourObj)\n storedPrefix = null; }, PrefixTimeout);\n return true;\n }]\n };\n }\n let full = parts.join(\" \");\n checkPrefix(full, false);\n let binding = scopeObj[full] || (scopeObj[full] = { preventDefault: false, commands: [] });\n binding.commands.push(command);\n if (preventDefault)\n binding.preventDefault = true;\n };\n for (let b of bindings) {\n let name = b[platform] || b.key;\n if (!name)\n continue;\n for (let scope of b.scope ? b.scope.split(\" \") : [\"editor\"]) {\n add(scope, name, b.run, b.preventDefault);\n if (b.shift)\n add(scope, \"Shift-\" + name, b.shift, b.preventDefault);\n }\n }\n return bound;\n}\nfunction runHandlers(map, event, view, scope) {\n let name = keyName(event), isChar = name.length == 1 && name != \" \";\n let prefix = \"\", fallthrough = false;\n if (storedPrefix && storedPrefix.view == view && storedPrefix.scope == scope) {\n prefix = storedPrefix.prefix + \" \";\n if (fallthrough = modifierCodes.indexOf(event.keyCode) < 0)\n storedPrefix = null;\n }\n let runFor = (binding) => {\n if (binding) {\n for (let cmd of binding.commands)\n if (cmd(view))\n return true;\n if (binding.preventDefault)\n fallthrough = true;\n }\n return false;\n };\n let scopeObj = map[scope], baseName;\n if (scopeObj) {\n if (runFor(scopeObj[prefix + modifiers(name, event, !isChar)]))\n return true;\n if (isChar && (event.shiftKey || event.altKey || event.metaKey) &&\n (baseName = base[event.keyCode]) && baseName != name) {\n if (runFor(scopeObj[prefix + modifiers(baseName, event, true)]))\n return true;\n }\n else if (isChar && event.shiftKey) {\n if (runFor(scopeObj[prefix + modifiers(name, event, true)]))\n return true;\n }\n }\n return fallthrough;\n}\n\nconst CanHidePrimary = !browser.ios; // FIXME test IE\nconst selectionConfig = /*@__PURE__*/Facet.define({\n combine(configs) {\n return combineConfig(configs, {\n cursorBlinkRate: 1200,\n drawRangeCursor: true\n }, {\n cursorBlinkRate: (a, b) => Math.min(a, b),\n drawRangeCursor: (a, b) => a || b\n });\n }\n});\n/**\nReturns an extension that hides the browser's native selection and\ncursor, replacing the selection with a background behind the text\n(with the `cm-selectionBackground` class), and the\ncursors with elements overlaid over the code (using\n`cm-cursor-primary` and `cm-cursor-secondary`).\n\nThis allows the editor to display secondary selection ranges, and\ntends to produce a type of selection more in line with that users\nexpect in a text editor (the native selection styling will often\nleave gaps between lines and won't fill the horizontal space after\na line when the selection continues past it).\n\nIt does have a performance cost, in that it requires an extra DOM\nlayout cycle for many updates (the selection is drawn based on DOM\nlayout information that's only available after laying out the\ncontent).\n*/\nfunction drawSelection(config = {}) {\n return [\n selectionConfig.of(config),\n drawSelectionPlugin,\n hideNativeSelection\n ];\n}\nclass Piece {\n constructor(left, top, width, height, className) {\n this.left = left;\n this.top = top;\n this.width = width;\n this.height = height;\n this.className = className;\n }\n draw() {\n let elt = document.createElement(\"div\");\n elt.className = this.className;\n this.adjust(elt);\n return elt;\n }\n adjust(elt) {\n elt.style.left = this.left + \"px\";\n elt.style.top = this.top + \"px\";\n if (this.width >= 0)\n elt.style.width = this.width + \"px\";\n elt.style.height = this.height + \"px\";\n }\n eq(p) {\n return this.left == p.left && this.top == p.top && this.width == p.width && this.height == p.height &&\n this.className == p.className;\n }\n}\nconst drawSelectionPlugin = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.view = view;\n this.rangePieces = [];\n this.cursors = [];\n this.measureReq = { read: this.readPos.bind(this), write: this.drawSel.bind(this) };\n this.selectionLayer = view.scrollDOM.appendChild(document.createElement(\"div\"));\n this.selectionLayer.className = \"cm-selectionLayer\";\n this.selectionLayer.setAttribute(\"aria-hidden\", \"true\");\n this.cursorLayer = view.scrollDOM.appendChild(document.createElement(\"div\"));\n this.cursorLayer.className = \"cm-cursorLayer\";\n this.cursorLayer.setAttribute(\"aria-hidden\", \"true\");\n view.requestMeasure(this.measureReq);\n this.setBlinkRate();\n }\n setBlinkRate() {\n this.cursorLayer.style.animationDuration = this.view.state.facet(selectionConfig).cursorBlinkRate + \"ms\";\n }\n update(update) {\n let confChanged = update.startState.facet(selectionConfig) != update.state.facet(selectionConfig);\n if (confChanged || update.selectionSet || update.geometryChanged || update.viewportChanged)\n this.view.requestMeasure(this.measureReq);\n if (update.transactions.some(tr => tr.scrollIntoView))\n this.cursorLayer.style.animationName = this.cursorLayer.style.animationName == \"cm-blink\" ? \"cm-blink2\" : \"cm-blink\";\n if (confChanged)\n this.setBlinkRate();\n }\n readPos() {\n let { state } = this.view, conf = state.facet(selectionConfig);\n let rangePieces = state.selection.ranges.map(r => r.empty ? [] : measureRange(this.view, r)).reduce((a, b) => a.concat(b));\n let cursors = [];\n for (let r of state.selection.ranges) {\n let prim = r == state.selection.main;\n if (r.empty ? !prim || CanHidePrimary : conf.drawRangeCursor) {\n let piece = measureCursor(this.view, r, prim);\n if (piece)\n cursors.push(piece);\n }\n }\n return { rangePieces, cursors };\n }\n drawSel({ rangePieces, cursors }) {\n if (rangePieces.length != this.rangePieces.length || rangePieces.some((p, i) => !p.eq(this.rangePieces[i]))) {\n this.selectionLayer.textContent = \"\";\n for (let p of rangePieces)\n this.selectionLayer.appendChild(p.draw());\n this.rangePieces = rangePieces;\n }\n if (cursors.length != this.cursors.length || cursors.some((c, i) => !c.eq(this.cursors[i]))) {\n let oldCursors = this.cursorLayer.children;\n if (oldCursors.length !== cursors.length) {\n this.cursorLayer.textContent = \"\";\n for (const c of cursors)\n this.cursorLayer.appendChild(c.draw());\n }\n else {\n cursors.forEach((c, idx) => c.adjust(oldCursors[idx]));\n }\n this.cursors = cursors;\n }\n }\n destroy() {\n this.selectionLayer.remove();\n this.cursorLayer.remove();\n }\n});\nconst themeSpec = {\n \".cm-line\": {\n \"& ::selection\": { backgroundColor: \"transparent !important\" },\n \"&::selection\": { backgroundColor: \"transparent !important\" }\n }\n};\nif (CanHidePrimary)\n themeSpec[\".cm-line\"].caretColor = \"transparent !important\";\nconst hideNativeSelection = /*@__PURE__*/Prec.highest(/*@__PURE__*/EditorView.theme(themeSpec));\nfunction getBase(view) {\n let rect = view.scrollDOM.getBoundingClientRect();\n let left = view.textDirection == Direction.LTR ? rect.left : rect.right - view.scrollDOM.clientWidth;\n return { left: left - view.scrollDOM.scrollLeft, top: rect.top - view.scrollDOM.scrollTop };\n}\nfunction wrappedLine(view, pos, inside) {\n let range = EditorSelection.cursor(pos);\n return { from: Math.max(inside.from, view.moveToLineBoundary(range, false, true).from),\n to: Math.min(inside.to, view.moveToLineBoundary(range, true, true).from),\n type: BlockType.Text };\n}\nfunction blockAt(view, pos) {\n let line = view.lineBlockAt(pos);\n if (Array.isArray(line.type))\n for (let l of line.type) {\n if (l.to > pos || l.to == pos && (l.to == line.to || l.type == BlockType.Text))\n return l;\n }\n return line;\n}\nfunction measureRange(view, range) {\n if (range.to <= view.viewport.from || range.from >= view.viewport.to)\n return [];\n let from = Math.max(range.from, view.viewport.from), to = Math.min(range.to, view.viewport.to);\n let ltr = view.textDirection == Direction.LTR;\n let content = view.contentDOM, contentRect = content.getBoundingClientRect(), base = getBase(view);\n let lineStyle = window.getComputedStyle(content.firstChild);\n let leftSide = contentRect.left + parseInt(lineStyle.paddingLeft) + Math.min(0, parseInt(lineStyle.textIndent));\n let rightSide = contentRect.right - parseInt(lineStyle.paddingRight);\n let startBlock = blockAt(view, from), endBlock = blockAt(view, to);\n let visualStart = startBlock.type == BlockType.Text ? startBlock : null;\n let visualEnd = endBlock.type == BlockType.Text ? endBlock : null;\n if (view.lineWrapping) {\n if (visualStart)\n visualStart = wrappedLine(view, from, visualStart);\n if (visualEnd)\n visualEnd = wrappedLine(view, to, visualEnd);\n }\n if (visualStart && visualEnd && visualStart.from == visualEnd.from) {\n return pieces(drawForLine(range.from, range.to, visualStart));\n }\n else {\n let top = visualStart ? drawForLine(range.from, null, visualStart) : drawForWidget(startBlock, false);\n let bottom = visualEnd ? drawForLine(null, range.to, visualEnd) : drawForWidget(endBlock, true);\n let between = [];\n if ((visualStart || startBlock).to < (visualEnd || endBlock).from - 1)\n between.push(piece(leftSide, top.bottom, rightSide, bottom.top));\n else if (top.bottom < bottom.top && view.elementAtHeight((top.bottom + bottom.top) / 2).type == BlockType.Text)\n top.bottom = bottom.top = (top.bottom + bottom.top) / 2;\n return pieces(top).concat(between).concat(pieces(bottom));\n }\n function piece(left, top, right, bottom) {\n return new Piece(left - base.left, top - base.top - 0.01 /* Epsilon */, right - left, bottom - top + 0.01 /* Epsilon */, \"cm-selectionBackground\");\n }\n function pieces({ top, bottom, horizontal }) {\n let pieces = [];\n for (let i = 0; i < horizontal.length; i += 2)\n pieces.push(piece(horizontal[i], top, horizontal[i + 1], bottom));\n return pieces;\n }\n // Gets passed from/to in line-local positions\n function drawForLine(from, to, line) {\n let top = 1e9, bottom = -1e9, horizontal = [];\n function addSpan(from, fromOpen, to, toOpen, dir) {\n // Passing 2/-2 is a kludge to force the view to return\n // coordinates on the proper side of block widgets, since\n // normalizing the side there, though appropriate for most\n // coordsAtPos queries, would break selection drawing.\n let fromCoords = view.coordsAtPos(from, (from == line.to ? -2 : 2));\n let toCoords = view.coordsAtPos(to, (to == line.from ? 2 : -2));\n top = Math.min(fromCoords.top, toCoords.top, top);\n bottom = Math.max(fromCoords.bottom, toCoords.bottom, bottom);\n if (dir == Direction.LTR)\n horizontal.push(ltr && fromOpen ? leftSide : fromCoords.left, ltr && toOpen ? rightSide : toCoords.right);\n else\n horizontal.push(!ltr && toOpen ? leftSide : toCoords.left, !ltr && fromOpen ? rightSide : fromCoords.right);\n }\n let start = from !== null && from !== void 0 ? from : line.from, end = to !== null && to !== void 0 ? to : line.to;\n // Split the range by visible range and document line\n for (let r of view.visibleRanges)\n if (r.to > start && r.from < end) {\n for (let pos = Math.max(r.from, start), endPos = Math.min(r.to, end);;) {\n let docLine = view.state.doc.lineAt(pos);\n for (let span of view.bidiSpans(docLine)) {\n let spanFrom = span.from + docLine.from, spanTo = span.to + docLine.from;\n if (spanFrom >= endPos)\n break;\n if (spanTo > pos)\n addSpan(Math.max(spanFrom, pos), from == null && spanFrom <= start, Math.min(spanTo, endPos), to == null && spanTo >= end, span.dir);\n }\n pos = docLine.to + 1;\n if (pos >= endPos)\n break;\n }\n }\n if (horizontal.length == 0)\n addSpan(start, from == null, end, to == null, view.textDirection);\n return { top, bottom, horizontal };\n }\n function drawForWidget(block, top) {\n let y = contentRect.top + (top ? block.top : block.bottom);\n return { top: y, bottom: y, horizontal: [] };\n }\n}\nfunction measureCursor(view, cursor, primary) {\n let pos = view.coordsAtPos(cursor.head, cursor.assoc || 1);\n if (!pos)\n return null;\n let base = getBase(view);\n return new Piece(pos.left - base.left, pos.top - base.top, -1, pos.bottom - pos.top, primary ? \"cm-cursor cm-cursor-primary\" : \"cm-cursor cm-cursor-secondary\");\n}\n\nconst setDropCursorPos = /*@__PURE__*/StateEffect.define({\n map(pos, mapping) { return pos == null ? null : mapping.mapPos(pos); }\n});\nconst dropCursorPos = /*@__PURE__*/StateField.define({\n create() { return null; },\n update(pos, tr) {\n if (pos != null)\n pos = tr.changes.mapPos(pos);\n return tr.effects.reduce((pos, e) => e.is(setDropCursorPos) ? e.value : pos, pos);\n }\n});\nconst drawDropCursor = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.view = view;\n this.cursor = null;\n this.measureReq = { read: this.readPos.bind(this), write: this.drawCursor.bind(this) };\n }\n update(update) {\n var _a;\n let cursorPos = update.state.field(dropCursorPos);\n if (cursorPos == null) {\n if (this.cursor != null) {\n (_a = this.cursor) === null || _a === void 0 ? void 0 : _a.remove();\n this.cursor = null;\n }\n }\n else {\n if (!this.cursor) {\n this.cursor = this.view.scrollDOM.appendChild(document.createElement(\"div\"));\n this.cursor.className = \"cm-dropCursor\";\n }\n if (update.startState.field(dropCursorPos) != cursorPos || update.docChanged || update.geometryChanged)\n this.view.requestMeasure(this.measureReq);\n }\n }\n readPos() {\n let pos = this.view.state.field(dropCursorPos);\n let rect = pos != null && this.view.coordsAtPos(pos);\n if (!rect)\n return null;\n let outer = this.view.scrollDOM.getBoundingClientRect();\n return {\n left: rect.left - outer.left + this.view.scrollDOM.scrollLeft,\n top: rect.top - outer.top + this.view.scrollDOM.scrollTop,\n height: rect.bottom - rect.top\n };\n }\n drawCursor(pos) {\n if (this.cursor) {\n if (pos) {\n this.cursor.style.left = pos.left + \"px\";\n this.cursor.style.top = pos.top + \"px\";\n this.cursor.style.height = pos.height + \"px\";\n }\n else {\n this.cursor.style.left = \"-100000px\";\n }\n }\n }\n destroy() {\n if (this.cursor)\n this.cursor.remove();\n }\n setDropPos(pos) {\n if (this.view.state.field(dropCursorPos) != pos)\n this.view.dispatch({ effects: setDropCursorPos.of(pos) });\n }\n}, {\n eventHandlers: {\n dragover(event) {\n this.setDropPos(this.view.posAtCoords({ x: event.clientX, y: event.clientY }));\n },\n dragleave(event) {\n if (event.target == this.view.contentDOM || !this.view.contentDOM.contains(event.relatedTarget))\n this.setDropPos(null);\n },\n dragend() {\n this.setDropPos(null);\n },\n drop() {\n this.setDropPos(null);\n }\n }\n});\n/**\nDraws a cursor at the current drop position when something is\ndragged over the editor.\n*/\nfunction dropCursor() {\n return [dropCursorPos, drawDropCursor];\n}\n\nfunction iterMatches(doc, re, from, to, f) {\n re.lastIndex = 0;\n for (let cursor = doc.iterRange(from, to), pos = from, m; !cursor.next().done; pos += cursor.value.length) {\n if (!cursor.lineBreak)\n while (m = re.exec(cursor.value))\n f(pos + m.index, pos + m.index + m[0].length, m);\n }\n}\nfunction matchRanges(view, maxLength) {\n let visible = view.visibleRanges;\n if (visible.length == 1 && visible[0].from == view.viewport.from &&\n visible[0].to == view.viewport.to)\n return visible;\n let result = [];\n for (let { from, to } of visible) {\n from = Math.max(view.state.doc.lineAt(from).from, from - maxLength);\n to = Math.min(view.state.doc.lineAt(to).to, to + maxLength);\n if (result.length && result[result.length - 1].to >= from)\n result[result.length - 1].to = to;\n else\n result.push({ from, to });\n }\n return result;\n}\n/**\nHelper class used to make it easier to maintain decorations on\nvisible code that matches a given regular expression. To be used\nin a [view plugin](https://codemirror.net/6/docs/ref/#view.ViewPlugin). Instances of this object\nrepresent a matching configuration.\n*/\nclass MatchDecorator {\n /**\n Create a decorator.\n */\n constructor(config) {\n let { regexp, decoration, boundary, maxLength = 1000 } = config;\n if (!regexp.global)\n throw new RangeError(\"The regular expression given to MatchDecorator should have its 'g' flag set\");\n this.regexp = regexp;\n this.getDeco = typeof decoration == \"function\" ? decoration : () => decoration;\n this.boundary = boundary;\n this.maxLength = maxLength;\n }\n /**\n Compute the full set of decorations for matches in the given\n view's viewport. You'll want to call this when initializing your\n plugin.\n */\n createDeco(view) {\n let build = new RangeSetBuilder();\n for (let { from, to } of matchRanges(view, this.maxLength))\n iterMatches(view.state.doc, this.regexp, from, to, (a, b, m) => build.add(a, b, this.getDeco(m, view, a)));\n return build.finish();\n }\n /**\n Update a set of decorations for a view update. `deco` _must_ be\n the set of decorations produced by _this_ `MatchDecorator` for\n the view state before the update.\n */\n updateDeco(update, deco) {\n let changeFrom = 1e9, changeTo = -1;\n if (update.docChanged)\n update.changes.iterChanges((_f, _t, from, to) => {\n if (to > update.view.viewport.from && from < update.view.viewport.to) {\n changeFrom = Math.min(from, changeFrom);\n changeTo = Math.max(to, changeTo);\n }\n });\n if (update.viewportChanged || changeTo - changeFrom > 1000)\n return this.createDeco(update.view);\n if (changeTo > -1)\n return this.updateRange(update.view, deco.map(update.changes), changeFrom, changeTo);\n return deco;\n }\n updateRange(view, deco, updateFrom, updateTo) {\n for (let r of view.visibleRanges) {\n let from = Math.max(r.from, updateFrom), to = Math.min(r.to, updateTo);\n if (to > from) {\n let fromLine = view.state.doc.lineAt(from), toLine = fromLine.to < to ? view.state.doc.lineAt(to) : fromLine;\n let start = Math.max(r.from, fromLine.from), end = Math.min(r.to, toLine.to);\n if (this.boundary) {\n for (; from > fromLine.from; from--)\n if (this.boundary.test(fromLine.text[from - 1 - fromLine.from])) {\n start = from;\n break;\n }\n for (; to < toLine.to; to++)\n if (this.boundary.test(toLine.text[to - toLine.from])) {\n end = to;\n break;\n }\n }\n let ranges = [], m;\n if (fromLine == toLine) {\n this.regexp.lastIndex = start - fromLine.from;\n while ((m = this.regexp.exec(fromLine.text)) && m.index < end - fromLine.from) {\n let pos = m.index + fromLine.from;\n ranges.push(this.getDeco(m, view, pos).range(pos, pos + m[0].length));\n }\n }\n else {\n iterMatches(view.state.doc, this.regexp, start, end, (from, to, m) => ranges.push(this.getDeco(m, view, from).range(from, to)));\n }\n deco = deco.update({ filterFrom: start, filterTo: end, filter: (from, to) => from < start || to > end, add: ranges });\n }\n }\n return deco;\n }\n}\n\nconst UnicodeRegexpSupport = /x/.unicode != null ? \"gu\" : \"g\";\nconst Specials = /*@__PURE__*/new RegExp(\"[\\u0000-\\u0008\\u000a-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b\\u200e\\u200f\\u2028\\u2029\\u202d\\u202e\\ufeff\\ufff9-\\ufffc]\", UnicodeRegexpSupport);\nconst Names = {\n 0: \"null\",\n 7: \"bell\",\n 8: \"backspace\",\n 10: \"newline\",\n 11: \"vertical tab\",\n 13: \"carriage return\",\n 27: \"escape\",\n 8203: \"zero width space\",\n 8204: \"zero width non-joiner\",\n 8205: \"zero width joiner\",\n 8206: \"left-to-right mark\",\n 8207: \"right-to-left mark\",\n 8232: \"line separator\",\n 8237: \"left-to-right override\",\n 8238: \"right-to-left override\",\n 8233: \"paragraph separator\",\n 65279: \"zero width no-break space\",\n 65532: \"object replacement\"\n};\nlet _supportsTabSize = null;\nfunction supportsTabSize() {\n var _a;\n if (_supportsTabSize == null && typeof document != \"undefined\" && document.body) {\n let styles = document.body.style;\n _supportsTabSize = ((_a = styles.tabSize) !== null && _a !== void 0 ? _a : styles.MozTabSize) != null;\n }\n return _supportsTabSize || false;\n}\nconst specialCharConfig = /*@__PURE__*/Facet.define({\n combine(configs) {\n let config = combineConfig(configs, {\n render: null,\n specialChars: Specials,\n addSpecialChars: null\n });\n if (config.replaceTabs = !supportsTabSize())\n config.specialChars = new RegExp(\"\\t|\" + config.specialChars.source, UnicodeRegexpSupport);\n if (config.addSpecialChars)\n config.specialChars = new RegExp(config.specialChars.source + \"|\" + config.addSpecialChars.source, UnicodeRegexpSupport);\n return config;\n }\n});\n/**\nReturns an extension that installs highlighting of special\ncharacters.\n*/\nfunction highlightSpecialChars(\n/**\nConfiguration options.\n*/\nconfig = {}) {\n return [specialCharConfig.of(config), specialCharPlugin()];\n}\nlet _plugin = null;\nfunction specialCharPlugin() {\n return _plugin || (_plugin = ViewPlugin.fromClass(class {\n constructor(view) {\n this.view = view;\n this.decorations = Decoration.none;\n this.decorationCache = Object.create(null);\n this.decorator = this.makeDecorator(view.state.facet(specialCharConfig));\n this.decorations = this.decorator.createDeco(view);\n }\n makeDecorator(conf) {\n return new MatchDecorator({\n regexp: conf.specialChars,\n decoration: (m, view, pos) => {\n let { doc } = view.state;\n let code = codePointAt(m[0], 0);\n if (code == 9) {\n let line = doc.lineAt(pos);\n let size = view.state.tabSize, col = countColumn(line.text, size, pos - line.from);\n return Decoration.replace({ widget: new TabWidget((size - (col % size)) * this.view.defaultCharacterWidth) });\n }\n return this.decorationCache[code] ||\n (this.decorationCache[code] = Decoration.replace({ widget: new SpecialCharWidget(conf, code) }));\n },\n boundary: conf.replaceTabs ? undefined : /[^]/\n });\n }\n update(update) {\n let conf = update.state.facet(specialCharConfig);\n if (update.startState.facet(specialCharConfig) != conf) {\n this.decorator = this.makeDecorator(conf);\n this.decorations = this.decorator.createDeco(update.view);\n }\n else {\n this.decorations = this.decorator.updateDeco(update, this.decorations);\n }\n }\n }, {\n decorations: v => v.decorations\n }));\n}\nconst DefaultPlaceholder = \"\\u2022\";\n// Assigns placeholder characters from the Control Pictures block to\n// ASCII control characters\nfunction placeholder$1(code) {\n if (code >= 32)\n return DefaultPlaceholder;\n if (code == 10)\n return \"\\u2424\";\n return String.fromCharCode(9216 + code);\n}\nclass SpecialCharWidget extends WidgetType {\n constructor(options, code) {\n super();\n this.options = options;\n this.code = code;\n }\n eq(other) { return other.code == this.code; }\n toDOM(view) {\n let ph = placeholder$1(this.code);\n let desc = view.state.phrase(\"Control character\") + \" \" + (Names[this.code] || \"0x\" + this.code.toString(16));\n let custom = this.options.render && this.options.render(this.code, desc, ph);\n if (custom)\n return custom;\n let span = document.createElement(\"span\");\n span.textContent = ph;\n span.title = desc;\n span.setAttribute(\"aria-label\", desc);\n span.className = \"cm-specialChar\";\n return span;\n }\n ignoreEvent() { return false; }\n}\nclass TabWidget extends WidgetType {\n constructor(width) {\n super();\n this.width = width;\n }\n eq(other) { return other.width == this.width; }\n toDOM() {\n let span = document.createElement(\"span\");\n span.textContent = \"\\t\";\n span.className = \"cm-tab\";\n span.style.width = this.width + \"px\";\n return span;\n }\n ignoreEvent() { return false; }\n}\n\nconst plugin = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor() {\n this.height = 1000;\n this.attrs = { style: \"padding-bottom: 1000px\" };\n }\n update(update) {\n let height = update.view.viewState.editorHeight - update.view.defaultLineHeight;\n if (height != this.height) {\n this.height = height;\n this.attrs = { style: `padding-bottom: ${height}px` };\n }\n }\n});\n/**\nReturns an extension that makes sure the content has a bottom\nmargin equivalent to the height of the editor, minus one line\nheight, so that every line in the document can be scrolled to the\ntop of the editor.\n\nThis is only meaningful when the editor is scrollable, and should\nnot be enabled in editors that take the size of their content.\n*/\nfunction scrollPastEnd() {\n return [plugin, contentAttributes.of(view => { var _a; return ((_a = view.plugin(plugin)) === null || _a === void 0 ? void 0 : _a.attrs) || null; })];\n}\n\n/**\nMark lines that have a cursor on them with the `\"cm-activeLine\"`\nDOM class.\n*/\nfunction highlightActiveLine() {\n return activeLineHighlighter;\n}\nconst lineDeco = /*@__PURE__*/Decoration.line({ class: \"cm-activeLine\" });\nconst activeLineHighlighter = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.decorations = this.getDeco(view);\n }\n update(update) {\n if (update.docChanged || update.selectionSet)\n this.decorations = this.getDeco(update.view);\n }\n getDeco(view) {\n let lastLineStart = -1, deco = [];\n for (let r of view.state.selection.ranges) {\n if (!r.empty)\n return Decoration.none;\n let line = view.lineBlockAt(r.head);\n if (line.from > lastLineStart) {\n deco.push(lineDeco.range(line.from));\n lastLineStart = line.from;\n }\n }\n return Decoration.set(deco);\n }\n}, {\n decorations: v => v.decorations\n});\n\nclass Placeholder extends WidgetType {\n constructor(content) {\n super();\n this.content = content;\n }\n toDOM() {\n let wrap = document.createElement(\"span\");\n wrap.className = \"cm-placeholder\";\n wrap.style.pointerEvents = \"none\";\n wrap.appendChild(typeof this.content == \"string\" ? document.createTextNode(this.content) : this.content);\n if (typeof this.content == \"string\")\n wrap.setAttribute(\"aria-label\", \"placeholder \" + this.content);\n else\n wrap.setAttribute(\"aria-hidden\", \"true\");\n return wrap;\n }\n ignoreEvent() { return false; }\n}\n/**\nExtension that enables a placeholder—a piece of example content\nto show when the editor is empty.\n*/\nfunction placeholder(content) {\n return ViewPlugin.fromClass(class {\n constructor(view) {\n this.view = view;\n this.placeholder = Decoration.set([Decoration.widget({ widget: new Placeholder(content), side: 1 }).range(0)]);\n }\n get decorations() { return this.view.state.doc.length ? Decoration.none : this.placeholder; }\n }, { decorations: v => v.decorations });\n}\n\n/**\n@internal\n*/\nconst __test = { HeightMap, HeightOracle, MeasuredHeights, QueryType, ChangedRange, computeOrder, moveVisually };\n\nexport { BidiSpan, BlockInfo, BlockType, Decoration, Direction, EditorView, MatchDecorator, PluginField, PluginFieldProvider, ViewPlugin, ViewUpdate, WidgetType, __test, drawSelection, dropCursor, highlightActiveLine, highlightSpecialChars, keymap, logException, placeholder, runScopeHandlers, scrollPastEnd };\n"],"names":["getSelection","root","target","nodeType","ownerDocument","contains","dom","node","parentNode","hasSelection","selection","anchorNode","_","clientRectsFor","textRange","nodeValue","length","getClientRects","isEquivalentPosition","off","targetNode","targetOff","scanFor","domIndex","index","previousSibling","dir","maxOffset","nodeName","parent","childNodes","contentEditable","Rect0","left","right","top","bottom","flattenRect","rect","x","windowRect","win","innerWidth","innerHeight","DOMSelectionState","constructor","this","anchorOffset","focusNode","focusOffset","eq","domSel","setRange","range","set","scratchRange","preventScrollSupported","focusPreventScroll","setActive","focus","stack","cur","push","scrollTop","scrollLeft","preventScroll","undefined","i","elt","from","to","document","createRange","setEnd","setStart","dispatchKey","name","code","options","key","keyCode","which","cancelable","down","KeyboardEvent","synthetic","dispatchEvent","up","defaultPrevented","clearAttributes","attributes","removeAttributeNode","DOMPos","offset","precise","static","noChildren","ContentView","dirty","editorView","Error","overrideDOMText","posAtStart","posBefore","posAtEnd","view","pos","child","children","breakAfter","RangeError","posAfter","coordsAt","_pos","_side","sync","track","next","prev","nextSibling","firstChild","contentView","get","reuseDOM","written","rm","insertBefore","_dom","localPosFromDOM","after","bias","lastChild","domBoundsAround","fromI","fromStart","toI","toEnd","prevEnd","end","startDOM","endDOM","markDirty","andParent","markParentsDirty","childList","setParent","setDOM","cmView","rootView","v","replaceChildren","destroy","splice","ignoreMutation","_rec","ignoreEvent","_event","childCursor","ChildCursor","childPos","findPos","toString","replace","join","text","isEditable","merge","source","hasStart","openStart","openEnd","become","other","getSide","removeChild","prototype","replaceRange","fromOff","toOff","insert","breakAtStart","before","last","breakAtEnd","split","shift","pop","mergeChildrenInto","dLen","nav","navigator","userAgent","vendor","platform","doc","documentElement","style","ie_edge","exec","ie_upto10","test","ie_11up","ie","gecko","chrome","webkit","safari","ios","maxTouchPoints","browser","mac","windows","linux","ie_version","documentMode","gecko_version","chrome_version","android","webkit_version","tabSize","TextView","super","createDOM","textDOM","createTextNode","slice","result","domAtPos","_from","_to","side","textCoords","MarkView","mark","ch","setAttrs","class","className","attrs","setAttribute","tagName","toUpperCase","createElement","_hasStart","detachFrom","inlineDOMAtPos","coordsInChildren","flatten","rects","width","Array","find","call","r","WidgetView","widget","prevWidget","customView","create","updateDOM","toDOM","compare","event","state","start","CompositionView","topView","scanCompositionTree","p","Math","min","posFromDOMInCompositionTree","_a","enterView","fromText","hasComp","len","WidgetBufferView","imgRect","getBoundingClientRect","siblingRect","indexOf","nextRect","inlineSiblingRect","joinInlineInto","open","max","combineAttrs","attrsEq","a","b","keysA","Object","keys","keysB","updateAttrs","removeAttribute","WidgetType","_widget","estimatedHeight","BlockType","Decoration","startSide","endSide","spec","heightRelevant","MarkDecoration","block","PointDecoration","isBlockGap","getInclusive","LineDecoration","of","sort","hasHeight","none","point","mapMode","isReplace","type","WidgetRange","WidgetBefore","WidgetAfter","inclusiveStart","inclusiveEnd","inclusive","addRange","ranges","margin","LineView","arguments","prevAttrs","transferDOM","setDeco","at","append","j","addLineDeco","deco","cls","classList","add","some","hack","cmIgnore","appendChild","measureTextSize","totalWidth","lineHeight","height","charWidth","_other","Text","docView","BlockWidgetView","_takeDeco","ContentBuilder","disallowBlockEffectsBelow","content","curLine","pendingBuffer","atCursorPos","textOff","cursor","iter","skip","posCovered","lineAt","getLine","flushBuffer","active","wrapMarks","addBlockWidget","finish","buildText","value","lineBreak","done","take","span","NullWidget","cursorBefore","cursorAfter","line","filterPoint","decorations","pluginDecorationLength","builder","tag","toLowerCase","clickAddsSelectionRange","dragMovesSelection$1","mouseSelectionStyle","exceptionSink","updateListener","inputHandler","scrollTo","map","changes","centerOn","ScrollTarget","y","yMargin","xMargin","empty","scrollIntoView","t","logException","exception","context","handler","facet","window","onerror","String","console","error","editable","combine","values","PluginFieldProvider","field","PluginField","define","atomicRanges","scrollMargins","nextPluginID","viewPlugin","ViewPlugin","id","fields","extension","eventHandlers","provide","provider","isArray","domEventHandlers","plugin","handlers","PluginInstance","mustUpdate","takeField","update","e","deactivate","editorAttributes","contentAttributes","styleModule","ChangedRange","fromA","toA","fromB","toB","addToSet","me","diff","dI","rI","posA","posB","ViewUpdate","transactions","flags","startState","tr","compose","changedRanges","iterChangedRanges","hasFocus","inputState","notifiedFocused","viewportChanged","heightChanged","geometryChanged","docChanged","focusChanged","selectionSet","Direction","LTR","RTL","dec","str","LowTypes","ArabicTypes","Brackets","BracketStack","l","charCodeAt","BidiRE","BidiSpan","level","order","assoc","maybe","types","computeOrder","direction","outerType","oppositeType","trivialOrder","prevStrong","br","sI","sJ","embed","beforeL","rtl","movedOver","moveVisually","forward","startIndex","head","spanI","bidiLevel","indexForward","nextIndex","nextSpan","LineBreakPlaceholder","DOMReader","points","lineSeparator","readRange","findPointBefore","readNode","nextView","isBlockElement","readTextNode","re","m","nextBreak","breakSize","fromView","findPointInside","maxLen","DOMPoint","DocView","compositionDeco","minWidth","minWidthFrom","minWidthTo","impreciseAnchor","impreciseHead","forceSelection","lastUpdate","Date","now","contentDOM","updateDeco","updateInner","every","mapPos","composing","surrounding","compositionSurroundingNode","textNode","newFrom","newTo","sliceString","CompositionWidget","computeCompositionDeco","size","lines","decoDiff","comp","DecorationComparator$1","findChangedDeco","extendWithRanges","oldLength","viewState","mustMeasureContent","updateChildren","observer","ignore","contentHeight","selectionRange","gaps","viewport","BlockGapWidget","updateGaps","build","updateSelection","mustRead","fromPointer","readSelectionRange","mayControlSelection","rapidCompositionStart","force","main","anchor","dummy","inside","assignedSlot","inUneditable","blur","rawSel","nextTo","nearbyTextNode","collapse","cursorBidiLevel","extend","removeAllRanges","setSelectionRange","enforceCursorAssoc","sel","modify","lineStart","activeElement","nearest","domView","posFromDOM","measureVisibleLineHeights","contentWidth","clientWidth","isWider","scrollDOM","widest","childRect","textDirection","measure","textContent","remove","computeBlockGapDeco","vs","viewports","lineBlockAt","pluginDecorations","pluginField","lineGapDeco","mLeft","mRight","mTop","mBottom","margins","targetRect","ltr","defaultView","bounding","body","scrollHeight","clientHeight","scrollWidth","moveX","moveY","rectHeight","boundingHeight","scrollBy","host","scrollRectIntoView","cView","topNode","compareRange","comparePoint","getdx","getdy","yOverlap","upTop","upBot","domPosAtCoords","closest","closestRect","closestX","closestY","above","below","aboveRect","belowRect","dx","dy","domPosInText","clipX","closestOffset","closestDY","generalSide","posAtCoords","docTop","paddingTop","docHeight","yOffset","halfLine","defaultLineHeight","bounced","elementAtHeight","posAtCoordsImprecise","elementFromPoint","element","caretPositionFromPoint","offsetNode","caretRangeFromPoint","startContainer","startOffset","isSuspiciousCaretResult","contentRect","into","round","defaultCharacterWidth","lineWrapping","floor","heightOracle","lineLength","sliceDoc","moveByChar","by","spans","bidiSpans","check","char","number","skipAtoms","oldPos","atoms","moved","between","InputState","lastKeyCode","lastKeyTime","pendingIOSKey","lastSelectionOrigin","lastSelectionTime","lastEscPress","lastContextMenu","scrollHandlers","registeredEvents","customHandlers","compositionFirstChange","compositionEndedAt","mouseSelection","addEventListener","eventBelongsToEditor","ignoreDuringComposition","keydown","mustFlushObserver","forceFlush","runCustomHandlers","preventDefault","ensureHandlers","setSelectionOrigin","origin","runScrollHandlers","scroll","delayAndroidKey","pending","PendingKeys","ctrlKey","altKey","metaKey","setTimeout","flushIOSKey","startMouseSelection","inputType","modifierCodes","MouseSelection","startEvent","mustSelect","lastEvent","move","bind","shiftKey","multiple","addsSelectionRange","dragMove","dragMovesSelection","dragging","rangeCount","getRangeAt","clientX","clientY","isInPrimarySelection","getClickType","select","buttons","removeEventListener","dispatch","userEvent","bubbles","brokenClipboardAPI","doPaste","input","toText","byLine","lastLinewiseCopy","lastLine","changeByRange","replaceSelection","lastTouch","rangeForClick","categorize","charCategorizer","linePos","cat","groupAt","visual","touchstart","touchmove","mousedown","flush","makeStyle","button","queryPos","startSel","startRange","basicMouseSelection","mustFocus","insideY","findPositionSide","BadMouseDetail","lastMouseDown","lastMouseDownCount","lastMouseDownTime","detail","lastTime","abs","dropText","direct","dropPos","del","ins","dragstart","dataTransfer","setData","effectAllowed","drop","readOnly","files","read","finishFile","filter","s","reader","FileReader","onload","readAsText","getData","paste","data","clipboardData","cssText","capturePaste","forceClearComposition","rapid","copy","cut","linewise","upto","copiedRange","clearData","selectionEnd","selectionStart","captureCopy","compositionstart","compositionupdate","compositionend","contextmenu","beforeinput","startViewHeight","visualViewport","wrappingWhiteSpace","HeightOracle","heightSamples","heightForGap","ceil","heightForLine","setDoc","mustRefreshForStyle","whiteSpace","mustRefreshForHeights","lineHeights","newHeight","h","refresh","knownHeights","changed","MeasuredHeights","heights","more","BlockInfo","concat","QueryType","Epsilon","HeightMap","outdated","setHeight","oracle","nodes","decomposeLeft","decomposeRight","applyChanges","oldDoc","ByPosNoHeight","NodeBuilder","updateHeight","HeightMapText","break","brk","HeightMapBranch","HeightMapBlock","blockAt","_height","_doc","_value","_type","forEachLine","f","_force","measured","collapsed","widgetHeight","HeightMapGap","firstLine","ByHeight","first","unshift","singleHeight","wasChanged","mid","rightTop","rightOffset","base","subQuery","ByPos","rightStart","balanced","mergeGaps","rebalance","around","lineEnd","covering","writtenTo","isCovered","addBlock","enterLine","blankContent","gap","ensureLine","DecorationComparator","visiblePixelRange","getComputedStyle","overflow","parentRect","position","offsetParent","fullPixelRange","LineGap","gA","gB","draw","wrapping","LineGapWidget","vertical","display","ViewState","pixelViewport","inView","paddingBottom","contentDOMWidth","contentDOMHeight","editorHeight","editorWidth","scaler","IdScaler","scrollTarget","printing","visibleRanges","mustEnforceCursorAssoc","heightMap","getViewport","updateViewportLines","updateForViewport","lineGaps","ensureLineGaps","computeVisibleRanges","Viewport","BigScaler","viewportLines","scale","scaleBlock","newDeco","contentChanges","heightChanges","heightRelevantDecoChanges","prevHeight","mapViewport","viewportIsAppropriate","updateLines","updateLineGaps","mapLineGaps","measureContent","parseInt","dTop","dBottom","viewportChange","visibleTop","fromDOM","visibleBottom","marginTop","topPos","viewHeight","mapped","touchesRange","current","viewFrom","viewTo","structure","lineStructure","total","marginHeight","findPosition","marginWidth","outside","cutRange","gapSize","fraction","findFraction","same","lineBlockAtHeight","ratio","dist","counted","pieces","array","val","n","vpHeight","domBase","domTop","domBottom","obj","vp","bTop","bBottom","theme","strs","darkTheme","baseThemeID","baseLightID","baseDarkID","lightDarkIDs","buildTheme","scopes","baseTheme","boxSizing","outline","flexDirection","alignItems","fontFamily","overflowX","zIndex","flexGrow","minHeight","wordWrap","padding","WebkitUserModify","whiteSpace_fallback","wordBreak","overflowWrap","caretColor","contain","background","pointerEvents","animation","visibility","borderLeft","marginLeft","borderLeftColor","backgroundColor","color","verticalAlign","fontSize","borderRadius","backgroundImage","border","observeOptions","characterData","subtree","characterDataOldValue","useCharData","DOMObserver","onChange","onScrollChanged","selectionChanged","delayedFlush","resizeTimeout","queue","delayedAndroidKey","scrollTargets","intersection","resize","intersecting","gapIntersection","parentCheck","MutationObserver","mutations","mut","removedNodes","oldValue","flushSoon","onCharData","prevValue","onSelectionChange","onResize","ResizeObserver","observe","onPrint","onScroll","IntersectionObserver","entries","listenForScroll","intersectionRatio","createEvent","requestMeasure","g","disconnect","shadowRoot","deepActiveElement","found","stopImmediatePropagation","getTargetRanges","execCommand","endContainer","endOffset","curAnchor","safariSelectionRangeHack","stop","clear","processRecords","requestAnimationFrame","clearTimeout","records","takeRecords","typeOver","record","readMutation","readSelection","newSel","rec","childBefore","findChild","childAfter","_b","_c","curView","applyDOMChange","change","bounds","selPoints","selectionPoints","preferredPos","preferredSide","minLen","findDiff","selectionFromPoints","iHead","iAnchor","mainSel","newLength","replaced","compositionRange","rangeChanges","selOff","EditorView","config","plugins","pluginMap","Map","editorAttrs","contentAttrs","bidiCache","destroyed","updateState","measureScheduled","measureRequests","tabIndex","announceDOM","_dispatch","getRoot","mountStyles","compositionStarted","redrawn","setState","effects","is","CachedOrder","updatePlugins","styleModules","showAnnouncements","isUserEvent","listener","newState","hadFocus","prevSpecs","specs","newPlugins","cancelAnimationFrame","updated","oldViewport","warn","measuring","BadMeasure","scrolled","write","themeClasses","attrsFromFacet","spellcheck","autocorrect","autocapitalize","translate","contenteditable","role","trs","effect","announce","reverse","readMeasured","request","known","documentTop","documentPadding","blockAtHeight","ensureTop","visualLineAtHeight","viewportLineBlocks","visualLineAt","moveByGroup","initial","nextCat","byGroup","moveToLineBoundary","includeWrap","coords","coordsAtPos","editorRect","lineView","moveVertically","distance","startPos","startY","goal","goalColumn","startCoords","resolvedGoal","extra","curY","scrollPosIntoView","posAtDOM","MaxBidiLine","entry","prefix","dark","given","cache","lastDir","sources","currentPlatform","modifiers","handleKeyEvents","runHandlers","getKeymap","keymap","enables","Keymaps","WeakMap","bindings","bound","isPrefix","checkPrefix","scope","command","scopeObj","parts","k","alt","ctrl","meta","mod","normalizeKeyName","commands","ourObj","storedPrefix","full","binding","run","buildKeymap","reduce","isChar","fallthrough","baseName","runFor","cmd","CanHidePrimary","themeSpec","iterMatches","lastIndex","iterRange","MatchDecorator","regexp","decoration","boundary","maxLength","global","getDeco","createDeco","visible","matchRanges","changeFrom","changeTo","iterChanges","_f","_t","updateRange","updateFrom","updateTo","fromLine","toLine","filterFrom","filterTo","UnicodeRegexpSupport","unicode","Specials","RegExp","Names","_supportsTabSize","specialCharConfig","configs","render","specialChars","addSpecialChars","replaceTabs","styles","MozTabSize","supportsTabSize","highlightSpecialChars","_plugin","fromClass","decorationCache","decorator","makeDecorator","conf","col","TabWidget","SpecialCharWidget","ph","fromCharCode","desc","phrase","custom","title","highlightActiveLine","activeLineHighlighter","lineDeco","lastLineStart"],"sourceRoot":""}