@handlewithcare/react-prosemirror 2.4.11 → 2.5.0
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/cjs/AbstractEditorView.js +4 -0
- package/dist/cjs/ReactEditorView.js +156 -0
- package/dist/cjs/StaticEditorView.js +86 -0
- package/dist/cjs/components/ChildNodeViews.js +59 -30
- package/dist/cjs/components/CustomNodeView.js +9 -25
- package/dist/cjs/components/DocNodeView.js +6 -15
- package/dist/cjs/components/MarkView.js +1 -2
- package/dist/cjs/components/NativeWidgetView.js +2 -3
- package/dist/cjs/components/NodeView.js +1 -1
- package/dist/cjs/components/ProseMirror.js +11 -14
- package/dist/cjs/components/ReactNodeView.js +3 -4
- package/dist/cjs/components/SeparatorHackView.js +1 -2
- package/dist/cjs/components/TextNodeView.js +4 -5
- package/dist/cjs/components/TrailingHackView.js +1 -2
- package/dist/cjs/components/WidgetView.js +2 -4
- package/dist/cjs/constants.js +33 -0
- package/dist/cjs/hooks/useEditor.js +32 -230
- package/dist/cjs/hooks/useEditorEffect.js +2 -2
- package/dist/cjs/hooks/useEditorEventCallback.js +8 -5
- package/dist/cjs/hooks/useNodeViewDescriptor.js +10 -10
- package/dist/cjs/hooks/useReactKeys.js +1 -1
- package/dist/cjs/testing/editorViewTestHelpers.js +0 -2
- package/dist/cjs/viewdesc.js +10 -9
- package/dist/esm/AbstractEditorView.js +1 -0
- package/dist/esm/ReactEditorView.js +156 -0
- package/dist/esm/StaticEditorView.js +76 -0
- package/dist/esm/components/ChildNodeViews.js +60 -32
- package/dist/esm/components/CustomNodeView.js +9 -25
- package/dist/esm/components/DocNodeView.js +6 -15
- package/dist/esm/components/MarkView.js +1 -2
- package/dist/esm/components/NativeWidgetView.js +2 -3
- package/dist/esm/components/NodeView.js +1 -1
- package/dist/esm/components/ProseMirror.js +11 -14
- package/dist/esm/components/ReactNodeView.js +3 -4
- package/dist/esm/components/SeparatorHackView.js +1 -2
- package/dist/esm/components/TextNodeView.js +4 -5
- package/dist/esm/components/TrailingHackView.js +1 -2
- package/dist/esm/components/WidgetView.js +2 -4
- package/dist/esm/constants.js +15 -0
- package/dist/esm/hooks/useEditor.js +28 -219
- package/dist/esm/hooks/useEditorEffect.js +2 -2
- package/dist/esm/hooks/useEditorEventCallback.js +8 -5
- package/dist/esm/hooks/useNodeViewDescriptor.js +10 -10
- package/dist/esm/hooks/useReactKeys.js +1 -1
- package/dist/esm/testing/editorViewTestHelpers.js +0 -2
- package/dist/esm/viewdesc.js +3 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/AbstractEditorView.d.ts +27 -0
- package/dist/types/ReactEditorView.d.ts +79 -0
- package/dist/types/StaticEditorView.d.ts +24 -0
- package/dist/types/components/ChildNodeViews.d.ts +2 -2
- package/dist/types/components/CustomNodeView.d.ts +2 -2
- package/dist/types/components/DocNodeView.d.ts +2 -5
- package/dist/types/components/MarkView.d.ts +2 -2
- package/dist/types/components/NativeWidgetView.d.ts +2 -2
- package/dist/types/components/NodeView.d.ts +2 -2
- package/dist/types/components/ReactNodeView.d.ts +2 -2
- package/dist/types/components/SeparatorHackView.d.ts +2 -2
- package/dist/types/components/TextNodeView.d.ts +4 -3
- package/dist/types/components/TrailingHackView.d.ts +2 -2
- package/dist/types/components/WidgetView.d.ts +2 -2
- package/dist/types/constants.d.ts +4 -0
- package/dist/types/contexts/EditorContext.d.ts +6 -4
- package/dist/types/decorations/computeDocDeco.d.ts +3 -2
- package/dist/types/decorations/viewDecorations.d.ts +3 -2
- package/dist/types/hooks/useEditor.d.ts +5 -46
- package/dist/types/hooks/useNodeViewDescriptor.d.ts +1 -1
- package/dist/types/hooks/useReactKeys.d.ts +1 -1
- package/dist/types/props.d.ts +26 -26
- package/dist/types/viewdesc.d.ts +6 -5
- package/package.json +6 -2
- package/dist/cjs/components/__tests__/ProseMirror.composition.test.js +0 -398
- package/dist/cjs/components/__tests__/ProseMirror.domchange.test.js +0 -270
- package/dist/cjs/components/__tests__/ProseMirror.draw-decoration.test.js +0 -1010
- package/dist/cjs/components/__tests__/ProseMirror.draw.test.js +0 -337
- package/dist/cjs/components/__tests__/ProseMirror.node-view.test.js +0 -315
- package/dist/cjs/components/__tests__/ProseMirror.selection.test.js +0 -444
- package/dist/cjs/components/__tests__/ProseMirror.test.js +0 -382
- package/dist/cjs/contexts/__tests__/DeferredLayoutEffects.test.js +0 -141
- package/dist/cjs/hooks/__tests__/useEditorViewLayoutEffect.test.js +0 -108
- package/dist/cjs/plugins/__tests__/reactKeys.test.js +0 -81
- package/dist/cjs/selection/SelectionDOMObserver.js +0 -171
- package/dist/cjs/selection/hasFocusAndSelection.js +0 -35
- package/dist/cjs/selection/selectionFromDOM.js +0 -77
- package/dist/cjs/selection/selectionToDOM.js +0 -226
- package/dist/cjs/ssr.js +0 -85
- package/dist/esm/components/__tests__/ProseMirror.composition.test.js +0 -395
- package/dist/esm/components/__tests__/ProseMirror.domchange.test.js +0 -266
- package/dist/esm/components/__tests__/ProseMirror.draw-decoration.test.js +0 -967
- package/dist/esm/components/__tests__/ProseMirror.draw.test.js +0 -294
- package/dist/esm/components/__tests__/ProseMirror.node-view.test.js +0 -272
- package/dist/esm/components/__tests__/ProseMirror.selection.test.js +0 -440
- package/dist/esm/components/__tests__/ProseMirror.test.js +0 -339
- package/dist/esm/contexts/__tests__/DeferredLayoutEffects.test.js +0 -98
- package/dist/esm/hooks/__tests__/useEditorViewLayoutEffect.test.js +0 -99
- package/dist/esm/plugins/__tests__/reactKeys.test.js +0 -77
- package/dist/esm/selection/SelectionDOMObserver.js +0 -161
- package/dist/esm/selection/hasFocusAndSelection.js +0 -17
- package/dist/esm/selection/selectionFromDOM.js +0 -59
- package/dist/esm/selection/selectionToDOM.js +0 -196
- package/dist/esm/ssr.js +0 -82
- package/dist/types/hooks/__tests__/useEditorViewLayoutEffect.test.d.ts +0 -1
- package/dist/types/selection/SelectionDOMObserver.d.ts +0 -33
- package/dist/types/selection/hasFocusAndSelection.d.ts +0 -3
- package/dist/types/selection/selectionFromDOM.d.ts +0 -4
- package/dist/types/selection/selectionToDOM.d.ts +0 -9
- package/dist/types/ssr.d.ts +0 -19
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-non-null-assertion */ "use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
const _prosemirrorModel = require("prosemirror-model");
|
|
6
|
-
const _prosemirrorState = require("prosemirror-state");
|
|
7
|
-
const _reactKeysJs = require("../reactKeys.js");
|
|
8
|
-
const schema = new _prosemirrorModel.Schema({
|
|
9
|
-
nodes: {
|
|
10
|
-
doc: {
|
|
11
|
-
content: "block+"
|
|
12
|
-
},
|
|
13
|
-
paragraph: {
|
|
14
|
-
group: "block",
|
|
15
|
-
content: "inline*"
|
|
16
|
-
},
|
|
17
|
-
list: {
|
|
18
|
-
group: "block",
|
|
19
|
-
content: "list_item+"
|
|
20
|
-
},
|
|
21
|
-
list_item: {
|
|
22
|
-
content: "inline*"
|
|
23
|
-
},
|
|
24
|
-
text: {
|
|
25
|
-
group: "inline"
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
describe("reactNodeViewPlugin", ()=>{
|
|
30
|
-
it("should create a unique key for each node", ()=>{
|
|
31
|
-
const editorState = _prosemirrorState.EditorState.create({
|
|
32
|
-
doc: schema.topNodeType.create(null, [
|
|
33
|
-
schema.nodes.paragraph.create(),
|
|
34
|
-
schema.nodes.paragraph.create(),
|
|
35
|
-
schema.nodes.paragraph.create()
|
|
36
|
-
]),
|
|
37
|
-
plugins: [
|
|
38
|
-
(0, _reactKeysJs.reactKeys)()
|
|
39
|
-
]
|
|
40
|
-
});
|
|
41
|
-
const pluginState = _reactKeysJs.reactKeysPluginKey.getState(editorState);
|
|
42
|
-
expect(pluginState.posToKey.size).toBe(3);
|
|
43
|
-
});
|
|
44
|
-
it("should maintain key stability when possible", ()=>{
|
|
45
|
-
const initialEditorState = _prosemirrorState.EditorState.create({
|
|
46
|
-
doc: schema.topNodeType.create(null, [
|
|
47
|
-
schema.nodes.paragraph.create({}, schema.text("Hello")),
|
|
48
|
-
schema.nodes.paragraph.create(),
|
|
49
|
-
schema.nodes.paragraph.create()
|
|
50
|
-
]),
|
|
51
|
-
plugins: [
|
|
52
|
-
(0, _reactKeysJs.reactKeys)()
|
|
53
|
-
]
|
|
54
|
-
});
|
|
55
|
-
const initialPluginState = _reactKeysJs.reactKeysPluginKey.getState(initialEditorState);
|
|
56
|
-
const nextEditorState = initialEditorState.apply(initialEditorState.tr.insertText(", world!", 6));
|
|
57
|
-
const nextPluginState = _reactKeysJs.reactKeysPluginKey.getState(nextEditorState);
|
|
58
|
-
expect(Array.from(initialPluginState.keyToPos.keys())).toEqual(Array.from(nextPluginState.keyToPos.keys()));
|
|
59
|
-
});
|
|
60
|
-
it("should create unique keys for new nodes", ()=>{
|
|
61
|
-
const initialEditorState = _prosemirrorState.EditorState.create({
|
|
62
|
-
doc: schema.topNodeType.create(null, [
|
|
63
|
-
schema.nodes.paragraph.create(),
|
|
64
|
-
schema.nodes.paragraph.create(),
|
|
65
|
-
schema.nodes.paragraph.create()
|
|
66
|
-
]),
|
|
67
|
-
plugins: [
|
|
68
|
-
(0, _reactKeysJs.reactKeys)()
|
|
69
|
-
]
|
|
70
|
-
});
|
|
71
|
-
const initialPluginState = _reactKeysJs.reactKeysPluginKey.getState(initialEditorState);
|
|
72
|
-
const nextEditorState = initialEditorState.apply(initialEditorState.tr.insert(0, schema.nodes.list.createAndFill()));
|
|
73
|
-
const nextPluginState = _reactKeysJs.reactKeysPluginKey.getState(nextEditorState);
|
|
74
|
-
// Adds new keys for new nodes
|
|
75
|
-
expect(nextPluginState.keyToPos.size).toBe(5);
|
|
76
|
-
// Maintains keys for previous nodes that are still there
|
|
77
|
-
Array.from(initialPluginState.keyToPos.keys()).forEach((key)=>{
|
|
78
|
-
expect(Array.from(nextPluginState.keyToPos.keys())).toContain(key);
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
});
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "SelectionDOMObserver", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return SelectionDOMObserver;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _prosemirrorstate = require("prosemirror-state");
|
|
12
|
-
const _browser = require("../browser.js");
|
|
13
|
-
const _dom = require("../dom.js");
|
|
14
|
-
const _hasFocusAndSelection = require("./hasFocusAndSelection.js");
|
|
15
|
-
const _selectionFromDOM = require("./selectionFromDOM.js");
|
|
16
|
-
const _selectionToDOM = require("./selectionToDOM.js");
|
|
17
|
-
let SelectionState = class SelectionState {
|
|
18
|
-
anchorNode = null;
|
|
19
|
-
anchorOffset = 0;
|
|
20
|
-
focusNode = null;
|
|
21
|
-
focusOffset = 0;
|
|
22
|
-
set(sel) {
|
|
23
|
-
this.anchorNode = sel.anchorNode;
|
|
24
|
-
this.anchorOffset = sel.anchorOffset;
|
|
25
|
-
this.focusNode = sel.focusNode;
|
|
26
|
-
this.focusOffset = sel.focusOffset;
|
|
27
|
-
}
|
|
28
|
-
clear() {
|
|
29
|
-
this.anchorNode = this.focusNode = null;
|
|
30
|
-
}
|
|
31
|
-
eq(sel) {
|
|
32
|
-
return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset && sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset;
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
let SelectionDOMObserver = class SelectionDOMObserver {
|
|
36
|
-
view;
|
|
37
|
-
flushingSoon;
|
|
38
|
-
currentSelection;
|
|
39
|
-
suppressingSelectionUpdates;
|
|
40
|
-
constructor(view){
|
|
41
|
-
this.view = view;
|
|
42
|
-
this.flushingSoon = -1;
|
|
43
|
-
this.currentSelection = new SelectionState();
|
|
44
|
-
this.suppressingSelectionUpdates = false;
|
|
45
|
-
this.view = view;
|
|
46
|
-
this.onSelectionChange = this.onSelectionChange.bind(this);
|
|
47
|
-
}
|
|
48
|
-
connectSelection() {
|
|
49
|
-
this.view.dom.ownerDocument.addEventListener("selectionchange", this.onSelectionChange);
|
|
50
|
-
}
|
|
51
|
-
disconnectSelection() {
|
|
52
|
-
this.view.dom.ownerDocument.removeEventListener("selectionchange", this.onSelectionChange);
|
|
53
|
-
}
|
|
54
|
-
stop() {
|
|
55
|
-
this.disconnectSelection();
|
|
56
|
-
}
|
|
57
|
-
start() {
|
|
58
|
-
this.connectSelection();
|
|
59
|
-
}
|
|
60
|
-
suppressSelectionUpdates() {
|
|
61
|
-
this.suppressingSelectionUpdates = true;
|
|
62
|
-
setTimeout(()=>this.suppressingSelectionUpdates = false, 50);
|
|
63
|
-
}
|
|
64
|
-
setCurSelection() {
|
|
65
|
-
// @ts-expect-error Internal method
|
|
66
|
-
this.currentSelection.set(this.view.domSelectionRange());
|
|
67
|
-
}
|
|
68
|
-
ignoreSelectionChange(sel) {
|
|
69
|
-
if (!sel.focusNode) return true;
|
|
70
|
-
const ancestors = new Set();
|
|
71
|
-
let container;
|
|
72
|
-
for(let scan = sel.focusNode; scan; scan = (0, _dom.parentNode)(scan))ancestors.add(scan);
|
|
73
|
-
for(let scan = sel.anchorNode; scan; scan = (0, _dom.parentNode)(scan))if (ancestors.has(scan)) {
|
|
74
|
-
container = scan;
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
77
|
-
// @ts-expect-error Internal property (docView)
|
|
78
|
-
const desc = container && this.view.docView.nearestDesc(container);
|
|
79
|
-
if (desc && desc.ignoreMutation({
|
|
80
|
-
type: "selection",
|
|
81
|
-
target: container?.nodeType == 3 ? container?.parentNode : container
|
|
82
|
-
})) {
|
|
83
|
-
this.setCurSelection();
|
|
84
|
-
return true;
|
|
85
|
-
}
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
registerMutation() {
|
|
89
|
-
// pass
|
|
90
|
-
}
|
|
91
|
-
flushSoon() {
|
|
92
|
-
if (this.flushingSoon < 0) this.flushingSoon = window.setTimeout(()=>{
|
|
93
|
-
this.flushingSoon = -1;
|
|
94
|
-
this.flush();
|
|
95
|
-
}, 20);
|
|
96
|
-
}
|
|
97
|
-
updateSelection() {
|
|
98
|
-
const { view } = this;
|
|
99
|
-
const compositionID = // @ts-expect-error Internal property (input)
|
|
100
|
-
view.input.compositionPendingChanges || // @ts-expect-error Internal property (input)
|
|
101
|
-
(view.composing ? view.input.compositionID : 0);
|
|
102
|
-
// @ts-expect-error Internal property (input)
|
|
103
|
-
view.input.compositionPendingChanges = 0;
|
|
104
|
-
const origin = // @ts-expect-error Internal property (input)
|
|
105
|
-
view.input.lastSelectionTime > Date.now() - 50 ? view.input.lastSelectionOrigin : null;
|
|
106
|
-
const newSel = (0, _selectionFromDOM.selectionFromDOM)(view, origin);
|
|
107
|
-
if (newSel && !view.state.selection.eq(newSel)) {
|
|
108
|
-
const tr = view.state.tr.setSelection(newSel);
|
|
109
|
-
if (origin == "pointer") tr.setMeta("pointer", true);
|
|
110
|
-
else if (origin == "key") tr.scrollIntoView();
|
|
111
|
-
if (compositionID) tr.setMeta("composition", compositionID);
|
|
112
|
-
view.dispatch(tr);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
selectionToDOM() {
|
|
116
|
-
const { view } = this;
|
|
117
|
-
(0, _selectionToDOM.selectionToDOM)(view);
|
|
118
|
-
// @ts-expect-error Internal property (domSelectionRange)
|
|
119
|
-
const sel = view.domSelectionRange();
|
|
120
|
-
this.currentSelection.set(sel);
|
|
121
|
-
}
|
|
122
|
-
flush() {
|
|
123
|
-
const { view } = this;
|
|
124
|
-
// @ts-expect-error Internal property (docView)
|
|
125
|
-
if (!view.docView || this.flushingSoon > -1) return;
|
|
126
|
-
// @ts-expect-error Internal property (domSelectionRange)
|
|
127
|
-
const sel = view.domSelectionRange();
|
|
128
|
-
const newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && (0, _hasFocusAndSelection.hasFocusAndSelection)(view) && !this.ignoreSelectionChange(sel);
|
|
129
|
-
let readSel = null;
|
|
130
|
-
// If it looks like the browser has reset the selection to the
|
|
131
|
-
// start of the document after focus, restore the selection from
|
|
132
|
-
// the state
|
|
133
|
-
if (newSel && // @ts-expect-error Internal property (input)
|
|
134
|
-
view.input.lastFocus > Date.now() - 200 && // @ts-expect-error Internal property (input)
|
|
135
|
-
Math.max(view.input.lastTouch, view.input.lastClick.time) < Date.now() - 300 && (0, _dom.selectionCollapsed)(sel) && (readSel = (0, _selectionFromDOM.selectionFromDOM)(view)) && readSel.eq(_prosemirrorstate.Selection.near(view.state.doc.resolve(0), 1))) {
|
|
136
|
-
// @ts-expect-error Internal property (input)
|
|
137
|
-
view.input.lastFocus = 0;
|
|
138
|
-
(0, _selectionToDOM.selectionToDOM)(view);
|
|
139
|
-
this.currentSelection.set(sel);
|
|
140
|
-
// @ts-expect-error Internal property (scrollToSelection)
|
|
141
|
-
view.scrollToSelection();
|
|
142
|
-
} else if (newSel) {
|
|
143
|
-
this.updateSelection();
|
|
144
|
-
if (!this.currentSelection.eq(sel)) (0, _selectionToDOM.selectionToDOM)(view);
|
|
145
|
-
this.currentSelection.set(sel);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
forceFlush() {
|
|
149
|
-
if (this.flushingSoon > -1) {
|
|
150
|
-
window.clearTimeout(this.flushingSoon);
|
|
151
|
-
this.flushingSoon = -1;
|
|
152
|
-
this.flush();
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
onSelectionChange() {
|
|
156
|
-
if (!(0, _hasFocusAndSelection.hasFocusAndSelection)(this.view)) return;
|
|
157
|
-
if (this.view.composing) return;
|
|
158
|
-
if (this.suppressingSelectionUpdates) return (0, _selectionToDOM.selectionToDOM)(this.view);
|
|
159
|
-
// Deletions on IE11 fire their events in the wrong order, giving
|
|
160
|
-
// us a selection change event before the DOM changes are
|
|
161
|
-
// reported.
|
|
162
|
-
if (_browser.browser.ie && _browser.browser.ie_version <= 11 && !this.view.state.selection.empty) {
|
|
163
|
-
// @ts-expect-error Internal method
|
|
164
|
-
const sel = this.view.domSelectionRange();
|
|
165
|
-
// Selection.isCollapsed isn't reliable on IE
|
|
166
|
-
if (sel.focusNode && (0, _selectionToDOM.isEquivalentPosition)(sel.focusNode, sel.focusOffset, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
167
|
-
sel.anchorNode, sel.anchorOffset)) return this.flushSoon();
|
|
168
|
-
}
|
|
169
|
-
this.flush();
|
|
170
|
-
}
|
|
171
|
-
};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
function _export(target, all) {
|
|
6
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
get: all[name]
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
_export(exports, {
|
|
12
|
-
hasFocusAndSelection: function() {
|
|
13
|
-
return hasFocusAndSelection;
|
|
14
|
-
},
|
|
15
|
-
hasSelection: function() {
|
|
16
|
-
return hasSelection;
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
function hasFocusAndSelection(view) {
|
|
20
|
-
if (view.editable && !view.hasFocus()) return false;
|
|
21
|
-
return hasSelection(view);
|
|
22
|
-
}
|
|
23
|
-
function hasSelection(view) {
|
|
24
|
-
// @ts-expect-error Internal method
|
|
25
|
-
const sel = view.domSelectionRange();
|
|
26
|
-
if (!sel.anchorNode) return false;
|
|
27
|
-
try {
|
|
28
|
-
// Firefox will raise 'permission denied' errors when accessing
|
|
29
|
-
// properties of `sel.anchorNode` when it's in a generated CSS
|
|
30
|
-
// element.
|
|
31
|
-
return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) && (view.editable || view.dom.contains(sel.focusNode?.nodeType == 3 ? sel.focusNode?.parentNode : sel.focusNode));
|
|
32
|
-
} catch (_) {
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
function _export(target, all) {
|
|
6
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
get: all[name]
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
_export(exports, {
|
|
12
|
-
selectionBetween: function() {
|
|
13
|
-
return selectionBetween;
|
|
14
|
-
},
|
|
15
|
-
selectionFromDOM: function() {
|
|
16
|
-
return selectionFromDOM;
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
const _prosemirrorstate = require("prosemirror-state");
|
|
20
|
-
const _dom = require("../dom.js");
|
|
21
|
-
function selectionBetween(view, $anchor, $head, bias) {
|
|
22
|
-
return view.someProp("createSelectionBetween", (f)=>f(view, $anchor, $head)) || _prosemirrorstate.TextSelection.between($anchor, $head, bias);
|
|
23
|
-
}
|
|
24
|
-
function selectionFromDOM(view) {
|
|
25
|
-
let origin = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : null;
|
|
26
|
-
// @ts-expect-error Internal method
|
|
27
|
-
const domSel = view.domSelectionRange(), doc = view.state.doc;
|
|
28
|
-
if (!domSel.focusNode) return null;
|
|
29
|
-
// @ts-expect-error Internal method
|
|
30
|
-
let nearestDesc = view.docView.nearestDesc(domSel.focusNode);
|
|
31
|
-
const inWidget = nearestDesc && nearestDesc.size == 0;
|
|
32
|
-
// @ts-expect-error Internal method
|
|
33
|
-
let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1);
|
|
34
|
-
if (head < 0) return null;
|
|
35
|
-
let $head = doc.resolve(head), anchor, selection;
|
|
36
|
-
if ((0, _dom.selectionCollapsed)(domSel)) {
|
|
37
|
-
anchor = head;
|
|
38
|
-
while(nearestDesc && !nearestDesc.node)nearestDesc = nearestDesc.parent;
|
|
39
|
-
const nearestDescNode = nearestDesc.node;
|
|
40
|
-
if (nearestDesc && nearestDescNode.isAtom && _prosemirrorstate.NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent && !(nearestDescNode.isInline && (0, _dom.isOnEdge)(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {
|
|
41
|
-
const pos = nearestDesc.posBefore;
|
|
42
|
-
selection = new _prosemirrorstate.NodeSelection(head == pos ? $head : doc.resolve(pos));
|
|
43
|
-
}
|
|
44
|
-
} else {
|
|
45
|
-
if (// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
46
|
-
domSel instanceof view.dom.ownerDocument.defaultView.Selection && domSel.rangeCount > 1) {
|
|
47
|
-
let min = head, max = head;
|
|
48
|
-
for(let i = 0; i < domSel.rangeCount; i++){
|
|
49
|
-
const range = domSel.getRangeAt(i);
|
|
50
|
-
min = Math.min(min, // @ts-expect-error Internal method
|
|
51
|
-
view.docView.posFromDOM(range.startContainer, range.startOffset, 1));
|
|
52
|
-
max = Math.max(max, // @ts-expect-error Internal method
|
|
53
|
-
view.docView.posFromDOM(range.endContainer, range.endOffset, -1));
|
|
54
|
-
}
|
|
55
|
-
if (min < 0) return null;
|
|
56
|
-
[anchor, head] = max == view.state.selection.anchor ? [
|
|
57
|
-
max,
|
|
58
|
-
min
|
|
59
|
-
] : [
|
|
60
|
-
min,
|
|
61
|
-
max
|
|
62
|
-
];
|
|
63
|
-
$head = doc.resolve(head);
|
|
64
|
-
} else {
|
|
65
|
-
// @ts-expect-error Internal method
|
|
66
|
-
anchor = view.docView.posFromDOM(// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
67
|
-
domSel.anchorNode, domSel.anchorOffset, 1);
|
|
68
|
-
}
|
|
69
|
-
if (anchor < 0) return null;
|
|
70
|
-
}
|
|
71
|
-
const $anchor = doc.resolve(anchor);
|
|
72
|
-
if (!selection) {
|
|
73
|
-
const bias = origin == "pointer" || view.state.selection.head < $head.pos && !inWidget ? 1 : -1;
|
|
74
|
-
selection = selectionBetween(view, $anchor, $head, bias);
|
|
75
|
-
}
|
|
76
|
-
return selection;
|
|
77
|
-
}
|
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
function _export(target, all) {
|
|
6
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
get: all[name]
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
_export(exports, {
|
|
12
|
-
domIndex: function() {
|
|
13
|
-
return domIndex;
|
|
14
|
-
},
|
|
15
|
-
hasBlockDesc: function() {
|
|
16
|
-
return hasBlockDesc;
|
|
17
|
-
},
|
|
18
|
-
hasSelection: function() {
|
|
19
|
-
return hasSelection;
|
|
20
|
-
},
|
|
21
|
-
isEquivalentPosition: function() {
|
|
22
|
-
return isEquivalentPosition;
|
|
23
|
-
},
|
|
24
|
-
nodeSize: function() {
|
|
25
|
-
return nodeSize;
|
|
26
|
-
},
|
|
27
|
-
selectionToDOM: function() {
|
|
28
|
-
return selectionToDOM;
|
|
29
|
-
},
|
|
30
|
-
syncNodeSelection: function() {
|
|
31
|
-
return syncNodeSelection;
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
const _prosemirrorstate = require("prosemirror-state");
|
|
35
|
-
const _browser = require("../browser.js");
|
|
36
|
-
const isEquivalentPosition = function(node, off, targetNode, targetOff) {
|
|
37
|
-
return targetNode && (scanFor(node, off, targetNode, targetOff, -1) || scanFor(node, off, targetNode, targetOff, 1));
|
|
38
|
-
};
|
|
39
|
-
function hasBlockDesc(dom) {
|
|
40
|
-
let desc;
|
|
41
|
-
for(let cur = dom; cur; cur = cur.parentNode)if (desc = cur.pmViewDesc) break;
|
|
42
|
-
return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom);
|
|
43
|
-
}
|
|
44
|
-
const atomElements = /^(img|br|input|textarea|hr)$/i;
|
|
45
|
-
function scanFor(node, off, targetNode, targetOff, dir) {
|
|
46
|
-
for(;;){
|
|
47
|
-
if (node == targetNode && off == targetOff) return true;
|
|
48
|
-
if (off == (dir < 0 ? 0 : nodeSize(node))) {
|
|
49
|
-
const parent = node.parentNode;
|
|
50
|
-
if (!parent || parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) || node.contentEditable == "false") return false;
|
|
51
|
-
off = domIndex(node) + (dir < 0 ? 0 : 1);
|
|
52
|
-
node = parent;
|
|
53
|
-
} else if (node.nodeType == 1) {
|
|
54
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
55
|
-
node = node.childNodes[off + (dir < 0 ? -1 : 0)];
|
|
56
|
-
if (node.contentEditable == "false") return false;
|
|
57
|
-
off = dir < 0 ? nodeSize(node) : 0;
|
|
58
|
-
} else {
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
const domIndex = function(node) {
|
|
64
|
-
let n = node;
|
|
65
|
-
for(let index = 0;; index++){
|
|
66
|
-
n = n.previousSibling;
|
|
67
|
-
if (!n) return index;
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
function nodeSize(node) {
|
|
71
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
72
|
-
return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;
|
|
73
|
-
}
|
|
74
|
-
function syncNodeSelection(view, sel) {
|
|
75
|
-
const v = view;
|
|
76
|
-
if (sel instanceof _prosemirrorstate.NodeSelection) {
|
|
77
|
-
const desc = v.docView.descAt(sel.from);
|
|
78
|
-
if (desc != v.lastSelectedViewDesc) {
|
|
79
|
-
clearNodeSelection(v);
|
|
80
|
-
if (desc) desc.selectNode();
|
|
81
|
-
v.lastSelectedViewDesc = desc;
|
|
82
|
-
}
|
|
83
|
-
} else {
|
|
84
|
-
clearNodeSelection(v);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
// Clear all DOM statefulness of the last node selection.
|
|
88
|
-
function clearNodeSelection(view) {
|
|
89
|
-
const v = view;
|
|
90
|
-
if (v.lastSelectedViewDesc) {
|
|
91
|
-
if (v.lastSelectedViewDesc.parent) v.lastSelectedViewDesc.deselectNode();
|
|
92
|
-
v.lastSelectedViewDesc = undefined;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
function hasSelection(view) {
|
|
96
|
-
const v = view;
|
|
97
|
-
const sel = v.domSelectionRange();
|
|
98
|
-
if (!sel.anchorNode) return false;
|
|
99
|
-
try {
|
|
100
|
-
// Firefox will raise 'permission denied' errors when accessing
|
|
101
|
-
// properties of `sel.anchorNode` when it's in a generated CSS
|
|
102
|
-
// element.
|
|
103
|
-
return v.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) && (v.editable || v.dom.contains(// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
104
|
-
sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode));
|
|
105
|
-
} catch (_) {
|
|
106
|
-
return false;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
function editorOwnsSelection(view) {
|
|
110
|
-
return view.editable ? view.hasFocus() : hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom);
|
|
111
|
-
}
|
|
112
|
-
function selectCursorWrapper(view) {
|
|
113
|
-
const v = view;
|
|
114
|
-
const domSel = v.domSelection(), range = document.createRange();
|
|
115
|
-
if (!domSel) return;
|
|
116
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
117
|
-
const node = v.cursorWrapper.dom, img = node.nodeName == "IMG";
|
|
118
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
119
|
-
if (img) range.setStart(node.parentNode, domIndex(node) + 1);
|
|
120
|
-
else range.setStart(node, 0);
|
|
121
|
-
range.collapse(true);
|
|
122
|
-
domSel.removeAllRanges();
|
|
123
|
-
domSel.addRange(range);
|
|
124
|
-
// Kludge to kill 'control selection' in IE11 when selecting an
|
|
125
|
-
// invisible cursor wrapper, since that would result in those weird
|
|
126
|
-
// resize handles and a selection that considers the absolutely
|
|
127
|
-
// positioned wrapper, rather than the root editable node, the
|
|
128
|
-
// focused element.
|
|
129
|
-
if (!img && !v.state.selection.visible && _browser.browser.ie && _browser.browser.ie_version <= 11) {
|
|
130
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
131
|
-
node.disabled = true;
|
|
132
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
133
|
-
node.disabled = false;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
function temporarilyEditableNear(view, pos) {
|
|
137
|
-
const v = view;
|
|
138
|
-
const { node, offset } = v.docView.domFromPos(pos, 0);
|
|
139
|
-
const after = offset < node.childNodes.length ? node.childNodes[offset] : null;
|
|
140
|
-
const before = offset ? node.childNodes[offset - 1] : null;
|
|
141
|
-
if (_browser.browser.safari && after && after.contentEditable == "false") return setEditable(after);
|
|
142
|
-
if ((!after || after.contentEditable == "false") && (!before || before.contentEditable == "false")) {
|
|
143
|
-
if (after) return setEditable(after);
|
|
144
|
-
else if (before) return setEditable(before);
|
|
145
|
-
}
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
function setEditable(element) {
|
|
149
|
-
element.contentEditable = "true";
|
|
150
|
-
if (_browser.browser.safari && element.draggable) {
|
|
151
|
-
element.draggable = false;
|
|
152
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
153
|
-
element.wasDraggable = true;
|
|
154
|
-
}
|
|
155
|
-
return element;
|
|
156
|
-
}
|
|
157
|
-
function resetEditable(element) {
|
|
158
|
-
element.contentEditable = "false";
|
|
159
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
160
|
-
if (element.wasDraggable) {
|
|
161
|
-
element.draggable = true;
|
|
162
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
163
|
-
element.wasDraggable = null;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
function removeClassOnSelectionChange(view) {
|
|
167
|
-
const v = view;
|
|
168
|
-
const doc = v.dom.ownerDocument;
|
|
169
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
170
|
-
doc.removeEventListener("selectionchange", v.input.hideSelectionGuard);
|
|
171
|
-
const domSel = v.domSelectionRange();
|
|
172
|
-
const node = domSel.anchorNode, offset = domSel.anchorOffset;
|
|
173
|
-
doc.addEventListener("selectionchange", v.input.hideSelectionGuard = ()=>{
|
|
174
|
-
if (domSel.anchorNode != node || domSel.anchorOffset != offset) {
|
|
175
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
176
|
-
doc.removeEventListener("selectionchange", v.input.hideSelectionGuard);
|
|
177
|
-
setTimeout(()=>{
|
|
178
|
-
if (!editorOwnsSelection(v) || v.state.selection.visible) v.dom.classList.remove("ProseMirror-hideselection");
|
|
179
|
-
}, 20);
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
const brokenSelectBetweenUneditable = _browser.browser.safari || _browser.browser.chrome && _browser.browser.chrome_version < 63;
|
|
184
|
-
function selectionToDOM(view) {
|
|
185
|
-
let force = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
|
|
186
|
-
const v = view;
|
|
187
|
-
const sel = v.state.selection;
|
|
188
|
-
syncNodeSelection(v, sel);
|
|
189
|
-
if (!editorOwnsSelection(v)) return;
|
|
190
|
-
// The delayed drag selection causes issues with Cell Selections
|
|
191
|
-
// in Safari. And the drag selection delay is to workarond issues
|
|
192
|
-
// which only present in Chrome.
|
|
193
|
-
if (!force && v.input.mouseDown && v.input.mouseDown.allowDefault && _browser.browser.chrome) {
|
|
194
|
-
const domSel = v.domSelectionRange(), curSel = v.domObserver.currentSelection;
|
|
195
|
-
if (domSel.anchorNode && curSel.anchorNode && isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset)) {
|
|
196
|
-
v.input.mouseDown.delayedSelectionSync = true;
|
|
197
|
-
v.domObserver.setCurSelection();
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
v.domObserver.disconnectSelection();
|
|
202
|
-
if (v.cursorWrapper) {
|
|
203
|
-
selectCursorWrapper(v);
|
|
204
|
-
} else {
|
|
205
|
-
const { anchor, head } = sel;
|
|
206
|
-
let resetEditableFrom;
|
|
207
|
-
let resetEditableTo;
|
|
208
|
-
if (brokenSelectBetweenUneditable && !(sel instanceof _prosemirrorstate.TextSelection)) {
|
|
209
|
-
if (!sel.$from.parent.inlineContent) resetEditableFrom = temporarilyEditableNear(v, sel.from);
|
|
210
|
-
if (!sel.empty && !sel.$from.parent.inlineContent) resetEditableTo = temporarilyEditableNear(v, sel.to);
|
|
211
|
-
}
|
|
212
|
-
v.docView.setSelection(anchor, head, v, force);
|
|
213
|
-
if (brokenSelectBetweenUneditable) {
|
|
214
|
-
if (resetEditableFrom) resetEditable(resetEditableFrom);
|
|
215
|
-
if (resetEditableTo) resetEditable(resetEditableTo);
|
|
216
|
-
}
|
|
217
|
-
if (sel.visible) {
|
|
218
|
-
v.dom.classList.remove("ProseMirror-hideselection");
|
|
219
|
-
} else {
|
|
220
|
-
v.dom.classList.add("ProseMirror-hideselection");
|
|
221
|
-
if ("onselectionchange" in document) removeClassOnSelectionChange(v);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
v.domObserver.setCurSelection();
|
|
225
|
-
v.domObserver.connectSelection();
|
|
226
|
-
}
|
package/dist/cjs/ssr.js
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-empty-function */ /**
|
|
2
|
-
* @fileoverview
|
|
3
|
-
*
|
|
4
|
-
* Stubs for ProseMirror View during SSR. These are extremely
|
|
5
|
-
* barebones, because they _do not need to actually work_. They
|
|
6
|
-
* just need to prevent errors from being thrown when ProseMirror
|
|
7
|
-
* View attemps to access these APIs while constructing the
|
|
8
|
-
* initial EditorView. None of these APIs are necessary for SSR to
|
|
9
|
-
* work properly, so it's fine that they're all no-ops.
|
|
10
|
-
*/ "use strict";
|
|
11
|
-
Object.defineProperty(exports, "__esModule", {
|
|
12
|
-
value: true
|
|
13
|
-
});
|
|
14
|
-
Object.defineProperty(exports, "setSsrStubs", {
|
|
15
|
-
enumerable: true,
|
|
16
|
-
get: function() {
|
|
17
|
-
return setSsrStubs;
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
let ClassList = class ClassList {
|
|
21
|
-
add() {}
|
|
22
|
-
remove() {}
|
|
23
|
-
};
|
|
24
|
-
let ElementStub = class ElementStub {
|
|
25
|
-
get parent() {
|
|
26
|
-
return new ElementStub();
|
|
27
|
-
}
|
|
28
|
-
get parentNode() {
|
|
29
|
-
return new ElementStub();
|
|
30
|
-
}
|
|
31
|
-
nodeName = "div";
|
|
32
|
-
appendChild() {
|
|
33
|
-
return new ElementStub();
|
|
34
|
-
}
|
|
35
|
-
setAttribute() {}
|
|
36
|
-
hasAttribute() {
|
|
37
|
-
return false;
|
|
38
|
-
}
|
|
39
|
-
insertBefore() {}
|
|
40
|
-
get classList() {
|
|
41
|
-
return new ClassList();
|
|
42
|
-
}
|
|
43
|
-
get ownerDocument() {
|
|
44
|
-
return new DocumentStub();
|
|
45
|
-
}
|
|
46
|
-
style = {};
|
|
47
|
-
addEventListener() {}
|
|
48
|
-
removeEventListener() {}
|
|
49
|
-
replaceChildren() {}
|
|
50
|
-
};
|
|
51
|
-
let DocumentStub = class DocumentStub {
|
|
52
|
-
createElement() {
|
|
53
|
-
return new ElementStub();
|
|
54
|
-
}
|
|
55
|
-
addEventListener() {}
|
|
56
|
-
removeEventListener() {}
|
|
57
|
-
get documentElement() {
|
|
58
|
-
return new ElementStub();
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
function setSsrStubs() {
|
|
62
|
-
const prevWindow = globalThis.window;
|
|
63
|
-
// @ts-expect-error HACK - EditorView checks for window.MutationObserver
|
|
64
|
-
// in its constructor, which breaks SSR. We temporarily set window
|
|
65
|
-
// to an empty object to prevent an error from being thrown, and then
|
|
66
|
-
// clean it up so that other isomorphic code doesn't get confused about
|
|
67
|
-
// whether there's a functioning global window object
|
|
68
|
-
globalThis.window ??= {
|
|
69
|
-
visualViewport: null
|
|
70
|
-
};
|
|
71
|
-
const prevDocument = globalThis.document;
|
|
72
|
-
// @ts-expect-error HACK: This is only used during SSR, and only
|
|
73
|
-
// to prevent outright errors when ProseMirror View attempts to
|
|
74
|
-
// access document properties either on import or when constructing
|
|
75
|
-
// the EditorView.
|
|
76
|
-
globalThis.document ??= new DocumentStub();
|
|
77
|
-
return function cleanupSsrStubs() {
|
|
78
|
-
if (globalThis.window !== prevWindow) {
|
|
79
|
-
globalThis.window = prevWindow;
|
|
80
|
-
}
|
|
81
|
-
if (globalThis.document !== prevDocument) {
|
|
82
|
-
globalThis.document = prevDocument;
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
}
|