prosemirror-view 1.23.13 → 1.24.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +5733 -0
- package/dist/index.d.ts +799 -0
- package/dist/index.es.js +41 -41
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +4823 -5139
- package/dist/index.js.map +1 -1
- package/package.json +14 -14
- package/src/README.md +2 -0
- package/src/browser.ts +23 -0
- package/src/{capturekeys.js → capturekeys.ts} +38 -37
- package/src/{clipboard.js → clipboard.ts} +44 -41
- package/src/{decoration.js → decoration.ts} +313 -268
- package/src/{dom.js → dom.ts} +27 -24
- package/src/{domchange.js → domchange.ts} +38 -36
- package/src/{domcoords.js → domcoords.ts} +120 -99
- package/src/{domobserver.js → domobserver.ts} +41 -28
- package/src/index.ts +705 -0
- package/src/{input.js → input.ts} +203 -183
- package/src/{selection.js → selection.ts} +54 -48
- package/src/{viewdesc.js → viewdesc.ts} +342 -336
- package/rollup.config.js +0 -14
- package/src/browser.js +0 -23
- package/src/index.js +0 -668
|
@@ -1,25 +1,29 @@
|
|
|
1
|
-
import {TextSelection, NodeSelection} from "prosemirror-state"
|
|
1
|
+
import {TextSelection, NodeSelection, Selection} from "prosemirror-state"
|
|
2
|
+
import {ResolvedPos} from "prosemirror-model"
|
|
2
3
|
|
|
3
|
-
import browser from "./browser"
|
|
4
|
+
import * as browser from "./browser"
|
|
4
5
|
import {selectionCollapsed, isEquivalentPosition, domIndex, isOnEdge} from "./dom"
|
|
6
|
+
import {EditorView} from "./index"
|
|
7
|
+
import {NodeViewDesc} from "./viewdesc"
|
|
5
8
|
|
|
6
|
-
export function selectionFromDOM(view, origin) {
|
|
7
|
-
let domSel = view.
|
|
9
|
+
export function selectionFromDOM(view: EditorView, origin: string | null = null) {
|
|
10
|
+
let domSel = view.domSelection(), doc = view.state.doc
|
|
8
11
|
if (!domSel.focusNode) return null
|
|
9
12
|
let nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0
|
|
10
|
-
let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset)
|
|
13
|
+
let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1)
|
|
11
14
|
if (head < 0) return null
|
|
12
15
|
let $head = doc.resolve(head), $anchor, selection
|
|
13
16
|
if (selectionCollapsed(domSel)) {
|
|
14
17
|
$anchor = $head
|
|
15
18
|
while (nearestDesc && !nearestDesc.node) nearestDesc = nearestDesc.parent
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
let nearestDescNode = (nearestDesc as NodeViewDesc).node
|
|
20
|
+
if (nearestDesc && nearestDescNode.isAtom && NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent
|
|
21
|
+
&& !(nearestDescNode.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {
|
|
18
22
|
let pos = nearestDesc.posBefore
|
|
19
23
|
selection = new NodeSelection(head == pos ? $head : doc.resolve(pos))
|
|
20
24
|
}
|
|
21
25
|
} else {
|
|
22
|
-
let anchor = view.docView.posFromDOM(domSel.anchorNode
|
|
26
|
+
let anchor = view.docView.posFromDOM(domSel.anchorNode!, domSel.anchorOffset, 1)
|
|
23
27
|
if (anchor < 0) return null
|
|
24
28
|
$anchor = doc.resolve(anchor)
|
|
25
29
|
}
|
|
@@ -31,12 +35,12 @@ export function selectionFromDOM(view, origin) {
|
|
|
31
35
|
return selection
|
|
32
36
|
}
|
|
33
37
|
|
|
34
|
-
function editorOwnsSelection(view) {
|
|
38
|
+
function editorOwnsSelection(view: EditorView) {
|
|
35
39
|
return view.editable ? view.hasFocus() :
|
|
36
40
|
hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom)
|
|
37
41
|
}
|
|
38
42
|
|
|
39
|
-
export function selectionToDOM(view, force) {
|
|
43
|
+
export function selectionToDOM(view: EditorView, force = false) {
|
|
40
44
|
let sel = view.state.selection
|
|
41
45
|
syncNodeSelection(view, sel)
|
|
42
46
|
|
|
@@ -45,11 +49,12 @@ export function selectionToDOM(view, force) {
|
|
|
45
49
|
// The delayed drag selection causes issues with Cell Selections
|
|
46
50
|
// in Safari. And the drag selection delay is to workarond issues
|
|
47
51
|
// which only present in Chrome.
|
|
48
|
-
if (!force && view.mouseDown && view.mouseDown.allowDefault && browser.chrome) {
|
|
49
|
-
let domSel = view.
|
|
50
|
-
if (domSel.anchorNode &&
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
if (!force && view.input.mouseDown && view.input.mouseDown.allowDefault && browser.chrome) {
|
|
53
|
+
let domSel = view.domSelection(), curSel = view.domObserver.currentSelection
|
|
54
|
+
if (domSel.anchorNode && curSel.anchorNode &&
|
|
55
|
+
isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset,
|
|
56
|
+
curSel.anchorNode, curSel.anchorOffset)) {
|
|
57
|
+
view.input.mouseDown.delayedSelectionSync = true
|
|
53
58
|
view.domObserver.setCurSelection()
|
|
54
59
|
return
|
|
55
60
|
}
|
|
@@ -90,36 +95,37 @@ export function selectionToDOM(view, force) {
|
|
|
90
95
|
|
|
91
96
|
const brokenSelectBetweenUneditable = browser.safari || browser.chrome && browser.chrome_version < 63
|
|
92
97
|
|
|
93
|
-
function temporarilyEditableNear(view, pos) {
|
|
98
|
+
function temporarilyEditableNear(view: EditorView, pos: number) {
|
|
94
99
|
let {node, offset} = view.docView.domFromPos(pos, 0)
|
|
95
100
|
let after = offset < node.childNodes.length ? node.childNodes[offset] : null
|
|
96
101
|
let before = offset ? node.childNodes[offset - 1] : null
|
|
97
|
-
if (browser.safari && after && after.contentEditable == "false") return setEditable(after)
|
|
98
|
-
if ((!after || after
|
|
99
|
-
|
|
100
|
-
|
|
102
|
+
if (browser.safari && after && (after as HTMLElement).contentEditable == "false") return setEditable(after as HTMLElement)
|
|
103
|
+
if ((!after || (after as HTMLElement).contentEditable == "false") &&
|
|
104
|
+
(!before || (before as HTMLElement).contentEditable == "false")) {
|
|
105
|
+
if (after) return setEditable(after as HTMLElement)
|
|
106
|
+
else if (before) return setEditable(before as HTMLElement)
|
|
101
107
|
}
|
|
102
108
|
}
|
|
103
109
|
|
|
104
|
-
function setEditable(element) {
|
|
110
|
+
function setEditable(element: HTMLElement) {
|
|
105
111
|
element.contentEditable = "true"
|
|
106
|
-
if (browser.safari && element.draggable) { element.draggable = false; element.wasDraggable = true }
|
|
112
|
+
if (browser.safari && element.draggable) { element.draggable = false; (element as any).wasDraggable = true }
|
|
107
113
|
return element
|
|
108
114
|
}
|
|
109
115
|
|
|
110
|
-
function resetEditable(element) {
|
|
116
|
+
function resetEditable(element: HTMLElement) {
|
|
111
117
|
element.contentEditable = "false"
|
|
112
|
-
if (element.wasDraggable) { element.draggable = true; element.wasDraggable = null }
|
|
118
|
+
if ((element as any).wasDraggable) { element.draggable = true; (element as any).wasDraggable = null }
|
|
113
119
|
}
|
|
114
120
|
|
|
115
|
-
function removeClassOnSelectionChange(view) {
|
|
121
|
+
function removeClassOnSelectionChange(view: EditorView) {
|
|
116
122
|
let doc = view.dom.ownerDocument
|
|
117
|
-
doc.removeEventListener("selectionchange", view.hideSelectionGuard)
|
|
118
|
-
let domSel = view.
|
|
123
|
+
doc.removeEventListener("selectionchange", view.input.hideSelectionGuard!)
|
|
124
|
+
let domSel = view.domSelection()
|
|
119
125
|
let node = domSel.anchorNode, offset = domSel.anchorOffset
|
|
120
|
-
doc.addEventListener("selectionchange", view.hideSelectionGuard = () => {
|
|
126
|
+
doc.addEventListener("selectionchange", view.input.hideSelectionGuard = () => {
|
|
121
127
|
if (domSel.anchorNode != node || domSel.anchorOffset != offset) {
|
|
122
|
-
doc.removeEventListener("selectionchange", view.hideSelectionGuard)
|
|
128
|
+
doc.removeEventListener("selectionchange", view.input.hideSelectionGuard!)
|
|
123
129
|
setTimeout(() => {
|
|
124
130
|
if (!editorOwnsSelection(view) || view.state.selection.visible)
|
|
125
131
|
view.dom.classList.remove("ProseMirror-hideselection")
|
|
@@ -128,10 +134,10 @@ function removeClassOnSelectionChange(view) {
|
|
|
128
134
|
})
|
|
129
135
|
}
|
|
130
136
|
|
|
131
|
-
function selectCursorWrapper(view) {
|
|
132
|
-
let domSel = view.
|
|
133
|
-
let node = view.cursorWrapper
|
|
134
|
-
if (img) range.setEnd(node.parentNode
|
|
137
|
+
function selectCursorWrapper(view: EditorView) {
|
|
138
|
+
let domSel = view.domSelection(), range = document.createRange()
|
|
139
|
+
let node = view.cursorWrapper!.dom, img = node.nodeName == "IMG"
|
|
140
|
+
if (img) range.setEnd(node.parentNode!, domIndex(node) + 1)
|
|
135
141
|
else range.setEnd(node, 0)
|
|
136
142
|
range.collapse(false)
|
|
137
143
|
domSel.removeAllRanges()
|
|
@@ -142,17 +148,17 @@ function selectCursorWrapper(view) {
|
|
|
142
148
|
// positioned wrapper, rather than the root editable node, the
|
|
143
149
|
// focused element.
|
|
144
150
|
if (!img && !view.state.selection.visible && browser.ie && browser.ie_version <= 11) {
|
|
145
|
-
node.disabled = true
|
|
146
|
-
node.disabled = false
|
|
151
|
+
;(node as any).disabled = true
|
|
152
|
+
;(node as any).disabled = false
|
|
147
153
|
}
|
|
148
154
|
}
|
|
149
155
|
|
|
150
|
-
export function syncNodeSelection(view, sel) {
|
|
156
|
+
export function syncNodeSelection(view: EditorView, sel: Selection) {
|
|
151
157
|
if (sel instanceof NodeSelection) {
|
|
152
158
|
let desc = view.docView.descAt(sel.from)
|
|
153
159
|
if (desc != view.lastSelectedViewDesc) {
|
|
154
160
|
clearNodeSelection(view)
|
|
155
|
-
if (desc) desc.selectNode()
|
|
161
|
+
if (desc) (desc as NodeViewDesc).selectNode()
|
|
156
162
|
view.lastSelectedViewDesc = desc
|
|
157
163
|
}
|
|
158
164
|
} else {
|
|
@@ -161,40 +167,40 @@ export function syncNodeSelection(view, sel) {
|
|
|
161
167
|
}
|
|
162
168
|
|
|
163
169
|
// Clear all DOM statefulness of the last node selection.
|
|
164
|
-
function clearNodeSelection(view) {
|
|
170
|
+
function clearNodeSelection(view: EditorView) {
|
|
165
171
|
if (view.lastSelectedViewDesc) {
|
|
166
172
|
if (view.lastSelectedViewDesc.parent)
|
|
167
|
-
view.lastSelectedViewDesc.deselectNode()
|
|
168
|
-
view.lastSelectedViewDesc =
|
|
173
|
+
(view.lastSelectedViewDesc as NodeViewDesc).deselectNode()
|
|
174
|
+
view.lastSelectedViewDesc = undefined
|
|
169
175
|
}
|
|
170
176
|
}
|
|
171
177
|
|
|
172
|
-
export function selectionBetween(view, $anchor, $head, bias) {
|
|
178
|
+
export function selectionBetween(view: EditorView, $anchor: ResolvedPos, $head: ResolvedPos, bias?: number) {
|
|
173
179
|
return view.someProp("createSelectionBetween", f => f(view, $anchor, $head))
|
|
174
180
|
|| TextSelection.between($anchor, $head, bias)
|
|
175
181
|
}
|
|
176
182
|
|
|
177
|
-
export function hasFocusAndSelection(view) {
|
|
183
|
+
export function hasFocusAndSelection(view: EditorView) {
|
|
178
184
|
if (view.editable && view.root.activeElement != view.dom) return false
|
|
179
185
|
return hasSelection(view)
|
|
180
186
|
}
|
|
181
187
|
|
|
182
|
-
export function hasSelection(view) {
|
|
183
|
-
let sel = view.
|
|
188
|
+
export function hasSelection(view: EditorView) {
|
|
189
|
+
let sel = view.domSelection()
|
|
184
190
|
if (!sel.anchorNode) return false
|
|
185
191
|
try {
|
|
186
192
|
// Firefox will raise 'permission denied' errors when accessing
|
|
187
193
|
// properties of `sel.anchorNode` when it's in a generated CSS
|
|
188
194
|
// element.
|
|
189
195
|
return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&
|
|
190
|
-
(view.editable || view.dom.contains(sel.focusNode
|
|
196
|
+
(view.editable || view.dom.contains(sel.focusNode!.nodeType == 3 ? sel.focusNode!.parentNode : sel.focusNode))
|
|
191
197
|
} catch(_) {
|
|
192
198
|
return false
|
|
193
199
|
}
|
|
194
200
|
}
|
|
195
201
|
|
|
196
|
-
export function anchorInRightPlace(view) {
|
|
202
|
+
export function anchorInRightPlace(view: EditorView) {
|
|
197
203
|
let anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0)
|
|
198
|
-
let domSel = view.
|
|
199
|
-
return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode
|
|
204
|
+
let domSel = view.domSelection()
|
|
205
|
+
return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode!, domSel.anchorOffset)
|
|
200
206
|
}
|