prosemirror-view 1.37.2 → 1.38.1
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/CHANGELOG.md +16 -0
- package/dist/index.cjs +16 -8
- package/dist/index.d.cts +14 -100
- package/dist/index.d.ts +14 -100
- package/dist/index.js +19 -8
- package/package.json +1 -1
- package/src/domcoords.ts +5 -3
- package/src/index.ts +10 -2
- package/src/viewdesc.ts +4 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
+
## 1.38.1 (2025-03-04)
|
|
2
|
+
|
|
3
|
+
### Bug fixes
|
|
4
|
+
|
|
5
|
+
Fix a regression in 1.38.0 that breaks scrolling back to the selection after Chrome tries to reset it on focus.
|
|
6
|
+
|
|
7
|
+
Remove some internally used types from the public type declaration files. Include file extension in web test local imports
|
|
8
|
+
|
|
9
|
+
Fix an issue where scrolling the cursor into view could inappropriately scroll parent nodes of absolutely positioned elements.
|
|
10
|
+
|
|
11
|
+
## 1.38.0 (2025-02-12)
|
|
12
|
+
|
|
13
|
+
### New features
|
|
14
|
+
|
|
15
|
+
The clipboard serialization logic is now available as a `serializeToClipboard` method on the view object.
|
|
16
|
+
|
|
1
17
|
## 1.37.2 (2025-01-22)
|
|
2
18
|
|
|
3
19
|
### Bug fixes
|
package/dist/index.cjs
CHANGED
|
@@ -200,9 +200,12 @@ function scrollRectIntoView(view, rect, startDOM) {
|
|
|
200
200
|
var scrollThreshold = view.someProp("scrollThreshold") || 0,
|
|
201
201
|
scrollMargin = view.someProp("scrollMargin") || 5;
|
|
202
202
|
var doc = view.dom.ownerDocument;
|
|
203
|
-
for (var parent = startDOM || view.dom;;
|
|
203
|
+
for (var parent = startDOM || view.dom;;) {
|
|
204
204
|
if (!parent) break;
|
|
205
|
-
if (parent.nodeType != 1)
|
|
205
|
+
if (parent.nodeType != 1) {
|
|
206
|
+
parent = parentNode(parent);
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
206
209
|
var elt = parent;
|
|
207
210
|
var atTop = elt == doc.body;
|
|
208
211
|
var bounding = atTop ? windowRect(doc) : clientRect(elt);
|
|
@@ -228,7 +231,9 @@ function scrollRectIntoView(view, rect, startDOM) {
|
|
|
228
231
|
};
|
|
229
232
|
}
|
|
230
233
|
}
|
|
231
|
-
|
|
234
|
+
var pos = atTop ? "fixed" : getComputedStyle(parent).position;
|
|
235
|
+
if (/^(fixed|sticky)$/.test(pos)) break;
|
|
236
|
+
parent = pos == "absolute" ? parent.offsetParent : parentNode(parent);
|
|
232
237
|
}
|
|
233
238
|
}
|
|
234
239
|
function storeScrollPos(view) {
|
|
@@ -2609,7 +2614,7 @@ function captureKeyDown(view, event) {
|
|
|
2609
2614
|
}
|
|
2610
2615
|
return false;
|
|
2611
2616
|
}
|
|
2612
|
-
function
|
|
2617
|
+
function _serializeForClipboard(view, slice) {
|
|
2613
2618
|
view.someProp("transformCopied", function (f) {
|
|
2614
2619
|
slice = f(slice, view);
|
|
2615
2620
|
});
|
|
@@ -3354,7 +3359,7 @@ handlers.copy = editHandlers.cut = function (view, _event) {
|
|
|
3354
3359
|
if (sel.empty) return;
|
|
3355
3360
|
var data = brokenClipboardAPI ? null : event.clipboardData;
|
|
3356
3361
|
var slice = sel.content(),
|
|
3357
|
-
_serializeForClipboar =
|
|
3362
|
+
_serializeForClipboar = _serializeForClipboard(view, slice),
|
|
3358
3363
|
dom = _serializeForClipboar.dom,
|
|
3359
3364
|
text = _serializeForClipboar.text;
|
|
3360
3365
|
if (data) {
|
|
@@ -3430,7 +3435,7 @@ handlers.dragstart = function (view, _event) {
|
|
|
3430
3435
|
if (desc && desc.node.type.spec.draggable && desc != view.docView) node = prosemirrorState.NodeSelection.create(view.state.doc, desc.posBefore);
|
|
3431
3436
|
}
|
|
3432
3437
|
var draggedSlice = (node || view.state.selection).content();
|
|
3433
|
-
var _serializeForClipboar2 =
|
|
3438
|
+
var _serializeForClipboar2 = _serializeForClipboard(view, draggedSlice),
|
|
3434
3439
|
dom = _serializeForClipboar2.dom,
|
|
3435
3440
|
text = _serializeForClipboar2.text,
|
|
3436
3441
|
slice = _serializeForClipboar2.slice;
|
|
@@ -4812,7 +4817,6 @@ function isSurrogatePair(str) {
|
|
|
4812
4817
|
b = str.charCodeAt(1);
|
|
4813
4818
|
return a >= 0xDC00 && a <= 0xDFFF && b >= 0xD800 && b <= 0xDBFF;
|
|
4814
4819
|
}
|
|
4815
|
-
var __serializeForClipboard = serializeForClipboard;
|
|
4816
4820
|
var __parseFromClipboard = parseFromClipboard;
|
|
4817
4821
|
var __endComposition = endComposition;
|
|
4818
4822
|
var EditorView = function () {
|
|
@@ -5124,6 +5128,11 @@ var EditorView = function () {
|
|
|
5124
5128
|
value: function pasteText(text, event) {
|
|
5125
5129
|
return doPaste(this, text, null, true, event || new ClipboardEvent("paste"));
|
|
5126
5130
|
}
|
|
5131
|
+
}, {
|
|
5132
|
+
key: "serializeForClipboard",
|
|
5133
|
+
value: function serializeForClipboard(slice) {
|
|
5134
|
+
return _serializeForClipboard(this, slice);
|
|
5135
|
+
}
|
|
5127
5136
|
}, {
|
|
5128
5137
|
key: "destroy",
|
|
5129
5138
|
value: function destroy() {
|
|
@@ -5242,4 +5251,3 @@ exports.DecorationSet = DecorationSet;
|
|
|
5242
5251
|
exports.EditorView = EditorView;
|
|
5243
5252
|
exports.__endComposition = __endComposition;
|
|
5244
5253
|
exports.__parseFromClipboard = __parseFromClipboard;
|
|
5245
|
-
exports.__serializeForClipboard = __serializeForClipboard;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EditorState, Transaction, Selection, Plugin } from 'prosemirror-state';
|
|
2
|
-
import { Mark, Node,
|
|
2
|
+
import { Mark, Node, Slice, ResolvedPos, DOMParser, DOMSerializer } from 'prosemirror-model';
|
|
3
3
|
import { Mapping } from 'prosemirror-transform';
|
|
4
4
|
|
|
5
5
|
type DOMNode = InstanceType<typeof window.Node>;
|
|
@@ -234,7 +234,6 @@ declare class DecorationGroup implements DecorationSource {
|
|
|
234
234
|
|
|
235
235
|
declare global {
|
|
236
236
|
interface Node {
|
|
237
|
-
pmViewDesc?: ViewDesc;
|
|
238
237
|
}
|
|
239
238
|
}
|
|
240
239
|
/**
|
|
@@ -361,104 +360,6 @@ interface MarkView {
|
|
|
361
360
|
*/
|
|
362
361
|
destroy?: () => void;
|
|
363
362
|
}
|
|
364
|
-
declare class ViewDesc {
|
|
365
|
-
parent: ViewDesc | undefined;
|
|
366
|
-
children: ViewDesc[];
|
|
367
|
-
dom: DOMNode;
|
|
368
|
-
contentDOM: HTMLElement | null;
|
|
369
|
-
dirty: number;
|
|
370
|
-
node: Node | null;
|
|
371
|
-
constructor(parent: ViewDesc | undefined, children: ViewDesc[], dom: DOMNode, contentDOM: HTMLElement | null);
|
|
372
|
-
matchesWidget(widget: Decoration): boolean;
|
|
373
|
-
matchesMark(mark: Mark): boolean;
|
|
374
|
-
matchesNode(node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource): boolean;
|
|
375
|
-
matchesHack(nodeName: string): boolean;
|
|
376
|
-
parseRule(): Omit<TagParseRule, "tag"> | null;
|
|
377
|
-
stopEvent(event: Event): boolean;
|
|
378
|
-
get size(): number;
|
|
379
|
-
get border(): number;
|
|
380
|
-
destroy(): void;
|
|
381
|
-
posBeforeChild(child: ViewDesc): number;
|
|
382
|
-
get posBefore(): number;
|
|
383
|
-
get posAtStart(): number;
|
|
384
|
-
get posAfter(): number;
|
|
385
|
-
get posAtEnd(): number;
|
|
386
|
-
localPosFromDOM(dom: DOMNode, offset: number, bias: number): number;
|
|
387
|
-
nearestDesc(dom: DOMNode): ViewDesc | undefined;
|
|
388
|
-
nearestDesc(dom: DOMNode, onlyNodes: true): NodeViewDesc | undefined;
|
|
389
|
-
getDesc(dom: DOMNode): ViewDesc | undefined;
|
|
390
|
-
posFromDOM(dom: DOMNode, offset: number, bias: number): number;
|
|
391
|
-
descAt(pos: number): ViewDesc | undefined;
|
|
392
|
-
domFromPos(pos: number, side: number): {
|
|
393
|
-
node: DOMNode;
|
|
394
|
-
offset: number;
|
|
395
|
-
atom?: number;
|
|
396
|
-
};
|
|
397
|
-
parseRange(from: number, to: number, base?: number): {
|
|
398
|
-
node: DOMNode;
|
|
399
|
-
from: number;
|
|
400
|
-
to: number;
|
|
401
|
-
fromOffset: number;
|
|
402
|
-
toOffset: number;
|
|
403
|
-
};
|
|
404
|
-
emptyChildAt(side: number): boolean;
|
|
405
|
-
domAfterPos(pos: number): DOMNode;
|
|
406
|
-
setSelection(anchor: number, head: number, view: EditorView, force?: boolean): void;
|
|
407
|
-
ignoreMutation(mutation: ViewMutationRecord): boolean;
|
|
408
|
-
get contentLost(): boolean | null;
|
|
409
|
-
markDirty(from: number, to: number): void;
|
|
410
|
-
markParentsDirty(): void;
|
|
411
|
-
get domAtom(): boolean;
|
|
412
|
-
get ignoreForCoords(): boolean;
|
|
413
|
-
isText(text: string): boolean;
|
|
414
|
-
}
|
|
415
|
-
declare class NodeViewDesc extends ViewDesc {
|
|
416
|
-
node: Node;
|
|
417
|
-
outerDeco: readonly Decoration[];
|
|
418
|
-
innerDeco: DecorationSource;
|
|
419
|
-
readonly nodeDOM: DOMNode;
|
|
420
|
-
constructor(parent: ViewDesc | undefined, node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource, dom: DOMNode, contentDOM: HTMLElement | null, nodeDOM: DOMNode, view: EditorView, pos: number);
|
|
421
|
-
static create(parent: ViewDesc | undefined, node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource, view: EditorView, pos: number): NodeViewDesc | TextViewDesc;
|
|
422
|
-
parseRule(): Omit<TagParseRule, "tag"> | null;
|
|
423
|
-
matchesNode(node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource): boolean;
|
|
424
|
-
get size(): number;
|
|
425
|
-
get border(): 0 | 1;
|
|
426
|
-
updateChildren(view: EditorView, pos: number): void;
|
|
427
|
-
localCompositionInfo(view: EditorView, pos: number): {
|
|
428
|
-
node: Text;
|
|
429
|
-
pos: number;
|
|
430
|
-
text: string;
|
|
431
|
-
} | null;
|
|
432
|
-
protectLocalComposition(view: EditorView, { node, pos, text }: {
|
|
433
|
-
node: Text;
|
|
434
|
-
pos: number;
|
|
435
|
-
text: string;
|
|
436
|
-
}): void;
|
|
437
|
-
update(node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource, view: EditorView): boolean;
|
|
438
|
-
updateInner(node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource, view: EditorView): void;
|
|
439
|
-
updateOuterDeco(outerDeco: readonly Decoration[]): void;
|
|
440
|
-
selectNode(): void;
|
|
441
|
-
deselectNode(): void;
|
|
442
|
-
get domAtom(): boolean;
|
|
443
|
-
}
|
|
444
|
-
declare class TextViewDesc extends NodeViewDesc {
|
|
445
|
-
constructor(parent: ViewDesc | undefined, node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource, dom: DOMNode, nodeDOM: DOMNode, view: EditorView);
|
|
446
|
-
parseRule(): {
|
|
447
|
-
skip: any;
|
|
448
|
-
};
|
|
449
|
-
update(node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource, view: EditorView): boolean;
|
|
450
|
-
inParent(): boolean;
|
|
451
|
-
domFromPos(pos: number): {
|
|
452
|
-
node: globalThis.Node;
|
|
453
|
-
offset: number;
|
|
454
|
-
};
|
|
455
|
-
localPosFromDOM(dom: DOMNode, offset: number, bias: number): number;
|
|
456
|
-
ignoreMutation(mutation: ViewMutationRecord): boolean;
|
|
457
|
-
slice(from: number, to: number, view: EditorView): TextViewDesc;
|
|
458
|
-
markDirty(from: number, to: number): void;
|
|
459
|
-
get domAtom(): boolean;
|
|
460
|
-
isText(text: string): boolean;
|
|
461
|
-
}
|
|
462
363
|
|
|
463
364
|
/**
|
|
464
365
|
An editor view manages the DOM structure that represents an
|
|
@@ -650,6 +551,19 @@ declare class EditorView {
|
|
|
650
551
|
*/
|
|
651
552
|
pasteText(text: string, event?: ClipboardEvent): boolean;
|
|
652
553
|
/**
|
|
554
|
+
Serialize the given slice as it would be if it was copied from
|
|
555
|
+
this editor. Returns a DOM element that contains a
|
|
556
|
+
representation of the slice as its children, a textual
|
|
557
|
+
representation, and the transformed slice (which can be
|
|
558
|
+
different from the given input due to hooks like
|
|
559
|
+
[`transformCopied`](https://prosemirror.net/docs/ref/#view.EditorProps.transformCopied)).
|
|
560
|
+
*/
|
|
561
|
+
serializeForClipboard(slice: Slice): {
|
|
562
|
+
dom: HTMLElement;
|
|
563
|
+
text: string;
|
|
564
|
+
slice: Slice;
|
|
565
|
+
};
|
|
566
|
+
/**
|
|
653
567
|
Removes the editor from the DOM and destroys all [node
|
|
654
568
|
views](https://prosemirror.net/docs/ref/#view.NodeView).
|
|
655
569
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EditorState, Transaction, Selection, Plugin } from 'prosemirror-state';
|
|
2
|
-
import { Mark, Node,
|
|
2
|
+
import { Mark, Node, Slice, ResolvedPos, DOMParser, DOMSerializer } from 'prosemirror-model';
|
|
3
3
|
import { Mapping } from 'prosemirror-transform';
|
|
4
4
|
|
|
5
5
|
type DOMNode = InstanceType<typeof window.Node>;
|
|
@@ -234,7 +234,6 @@ declare class DecorationGroup implements DecorationSource {
|
|
|
234
234
|
|
|
235
235
|
declare global {
|
|
236
236
|
interface Node {
|
|
237
|
-
pmViewDesc?: ViewDesc;
|
|
238
237
|
}
|
|
239
238
|
}
|
|
240
239
|
/**
|
|
@@ -361,104 +360,6 @@ interface MarkView {
|
|
|
361
360
|
*/
|
|
362
361
|
destroy?: () => void;
|
|
363
362
|
}
|
|
364
|
-
declare class ViewDesc {
|
|
365
|
-
parent: ViewDesc | undefined;
|
|
366
|
-
children: ViewDesc[];
|
|
367
|
-
dom: DOMNode;
|
|
368
|
-
contentDOM: HTMLElement | null;
|
|
369
|
-
dirty: number;
|
|
370
|
-
node: Node | null;
|
|
371
|
-
constructor(parent: ViewDesc | undefined, children: ViewDesc[], dom: DOMNode, contentDOM: HTMLElement | null);
|
|
372
|
-
matchesWidget(widget: Decoration): boolean;
|
|
373
|
-
matchesMark(mark: Mark): boolean;
|
|
374
|
-
matchesNode(node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource): boolean;
|
|
375
|
-
matchesHack(nodeName: string): boolean;
|
|
376
|
-
parseRule(): Omit<TagParseRule, "tag"> | null;
|
|
377
|
-
stopEvent(event: Event): boolean;
|
|
378
|
-
get size(): number;
|
|
379
|
-
get border(): number;
|
|
380
|
-
destroy(): void;
|
|
381
|
-
posBeforeChild(child: ViewDesc): number;
|
|
382
|
-
get posBefore(): number;
|
|
383
|
-
get posAtStart(): number;
|
|
384
|
-
get posAfter(): number;
|
|
385
|
-
get posAtEnd(): number;
|
|
386
|
-
localPosFromDOM(dom: DOMNode, offset: number, bias: number): number;
|
|
387
|
-
nearestDesc(dom: DOMNode): ViewDesc | undefined;
|
|
388
|
-
nearestDesc(dom: DOMNode, onlyNodes: true): NodeViewDesc | undefined;
|
|
389
|
-
getDesc(dom: DOMNode): ViewDesc | undefined;
|
|
390
|
-
posFromDOM(dom: DOMNode, offset: number, bias: number): number;
|
|
391
|
-
descAt(pos: number): ViewDesc | undefined;
|
|
392
|
-
domFromPos(pos: number, side: number): {
|
|
393
|
-
node: DOMNode;
|
|
394
|
-
offset: number;
|
|
395
|
-
atom?: number;
|
|
396
|
-
};
|
|
397
|
-
parseRange(from: number, to: number, base?: number): {
|
|
398
|
-
node: DOMNode;
|
|
399
|
-
from: number;
|
|
400
|
-
to: number;
|
|
401
|
-
fromOffset: number;
|
|
402
|
-
toOffset: number;
|
|
403
|
-
};
|
|
404
|
-
emptyChildAt(side: number): boolean;
|
|
405
|
-
domAfterPos(pos: number): DOMNode;
|
|
406
|
-
setSelection(anchor: number, head: number, view: EditorView, force?: boolean): void;
|
|
407
|
-
ignoreMutation(mutation: ViewMutationRecord): boolean;
|
|
408
|
-
get contentLost(): boolean | null;
|
|
409
|
-
markDirty(from: number, to: number): void;
|
|
410
|
-
markParentsDirty(): void;
|
|
411
|
-
get domAtom(): boolean;
|
|
412
|
-
get ignoreForCoords(): boolean;
|
|
413
|
-
isText(text: string): boolean;
|
|
414
|
-
}
|
|
415
|
-
declare class NodeViewDesc extends ViewDesc {
|
|
416
|
-
node: Node;
|
|
417
|
-
outerDeco: readonly Decoration[];
|
|
418
|
-
innerDeco: DecorationSource;
|
|
419
|
-
readonly nodeDOM: DOMNode;
|
|
420
|
-
constructor(parent: ViewDesc | undefined, node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource, dom: DOMNode, contentDOM: HTMLElement | null, nodeDOM: DOMNode, view: EditorView, pos: number);
|
|
421
|
-
static create(parent: ViewDesc | undefined, node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource, view: EditorView, pos: number): NodeViewDesc | TextViewDesc;
|
|
422
|
-
parseRule(): Omit<TagParseRule, "tag"> | null;
|
|
423
|
-
matchesNode(node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource): boolean;
|
|
424
|
-
get size(): number;
|
|
425
|
-
get border(): 0 | 1;
|
|
426
|
-
updateChildren(view: EditorView, pos: number): void;
|
|
427
|
-
localCompositionInfo(view: EditorView, pos: number): {
|
|
428
|
-
node: Text;
|
|
429
|
-
pos: number;
|
|
430
|
-
text: string;
|
|
431
|
-
} | null;
|
|
432
|
-
protectLocalComposition(view: EditorView, { node, pos, text }: {
|
|
433
|
-
node: Text;
|
|
434
|
-
pos: number;
|
|
435
|
-
text: string;
|
|
436
|
-
}): void;
|
|
437
|
-
update(node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource, view: EditorView): boolean;
|
|
438
|
-
updateInner(node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource, view: EditorView): void;
|
|
439
|
-
updateOuterDeco(outerDeco: readonly Decoration[]): void;
|
|
440
|
-
selectNode(): void;
|
|
441
|
-
deselectNode(): void;
|
|
442
|
-
get domAtom(): boolean;
|
|
443
|
-
}
|
|
444
|
-
declare class TextViewDesc extends NodeViewDesc {
|
|
445
|
-
constructor(parent: ViewDesc | undefined, node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource, dom: DOMNode, nodeDOM: DOMNode, view: EditorView);
|
|
446
|
-
parseRule(): {
|
|
447
|
-
skip: any;
|
|
448
|
-
};
|
|
449
|
-
update(node: Node, outerDeco: readonly Decoration[], innerDeco: DecorationSource, view: EditorView): boolean;
|
|
450
|
-
inParent(): boolean;
|
|
451
|
-
domFromPos(pos: number): {
|
|
452
|
-
node: globalThis.Node;
|
|
453
|
-
offset: number;
|
|
454
|
-
};
|
|
455
|
-
localPosFromDOM(dom: DOMNode, offset: number, bias: number): number;
|
|
456
|
-
ignoreMutation(mutation: ViewMutationRecord): boolean;
|
|
457
|
-
slice(from: number, to: number, view: EditorView): TextViewDesc;
|
|
458
|
-
markDirty(from: number, to: number): void;
|
|
459
|
-
get domAtom(): boolean;
|
|
460
|
-
isText(text: string): boolean;
|
|
461
|
-
}
|
|
462
363
|
|
|
463
364
|
/**
|
|
464
365
|
An editor view manages the DOM structure that represents an
|
|
@@ -650,6 +551,19 @@ declare class EditorView {
|
|
|
650
551
|
*/
|
|
651
552
|
pasteText(text: string, event?: ClipboardEvent): boolean;
|
|
652
553
|
/**
|
|
554
|
+
Serialize the given slice as it would be if it was copied from
|
|
555
|
+
this editor. Returns a DOM element that contains a
|
|
556
|
+
representation of the slice as its children, a textual
|
|
557
|
+
representation, and the transformed slice (which can be
|
|
558
|
+
different from the given input due to hooks like
|
|
559
|
+
[`transformCopied`](https://prosemirror.net/docs/ref/#view.EditorProps.transformCopied)).
|
|
560
|
+
*/
|
|
561
|
+
serializeForClipboard(slice: Slice): {
|
|
562
|
+
dom: HTMLElement;
|
|
563
|
+
text: string;
|
|
564
|
+
slice: Slice;
|
|
565
|
+
};
|
|
566
|
+
/**
|
|
653
567
|
Removes the editor from the DOM and destroys all [node
|
|
654
568
|
views](https://prosemirror.net/docs/ref/#view.NodeView).
|
|
655
569
|
*/
|
package/dist/index.js
CHANGED
|
@@ -201,11 +201,13 @@ function clientRect(node) {
|
|
|
201
201
|
function scrollRectIntoView(view, rect, startDOM) {
|
|
202
202
|
let scrollThreshold = view.someProp("scrollThreshold") || 0, scrollMargin = view.someProp("scrollMargin") || 5;
|
|
203
203
|
let doc = view.dom.ownerDocument;
|
|
204
|
-
for (let parent = startDOM || view.dom;;
|
|
204
|
+
for (let parent = startDOM || view.dom;;) {
|
|
205
205
|
if (!parent)
|
|
206
206
|
break;
|
|
207
|
-
if (parent.nodeType != 1)
|
|
207
|
+
if (parent.nodeType != 1) {
|
|
208
|
+
parent = parentNode(parent);
|
|
208
209
|
continue;
|
|
210
|
+
}
|
|
209
211
|
let elt = parent;
|
|
210
212
|
let atTop = elt == doc.body;
|
|
211
213
|
let bounding = atTop ? windowRect(doc) : clientRect(elt);
|
|
@@ -234,8 +236,10 @@ function scrollRectIntoView(view, rect, startDOM) {
|
|
|
234
236
|
rect = { left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY };
|
|
235
237
|
}
|
|
236
238
|
}
|
|
237
|
-
|
|
239
|
+
let pos = atTop ? "fixed" : getComputedStyle(parent).position;
|
|
240
|
+
if (/^(fixed|sticky)$/.test(pos))
|
|
238
241
|
break;
|
|
242
|
+
parent = pos == "absolute" ? parent.offsetParent : parentNode(parent);
|
|
239
243
|
}
|
|
240
244
|
}
|
|
241
245
|
// Store the scroll position of the editor's parent nodes, along with
|
|
@@ -5207,10 +5211,6 @@ function isSurrogatePair(str) {
|
|
|
5207
5211
|
return a >= 0xDC00 && a <= 0xDFFF && b >= 0xD800 && b <= 0xDBFF;
|
|
5208
5212
|
}
|
|
5209
5213
|
|
|
5210
|
-
/**
|
|
5211
|
-
@internal
|
|
5212
|
-
*/
|
|
5213
|
-
const __serializeForClipboard = serializeForClipboard;
|
|
5214
5214
|
/**
|
|
5215
5215
|
@internal
|
|
5216
5216
|
*/
|
|
@@ -5660,6 +5660,17 @@ class EditorView {
|
|
|
5660
5660
|
return doPaste(this, text, null, true, event || new ClipboardEvent("paste"));
|
|
5661
5661
|
}
|
|
5662
5662
|
/**
|
|
5663
|
+
Serialize the given slice as it would be if it was copied from
|
|
5664
|
+
this editor. Returns a DOM element that contains a
|
|
5665
|
+
representation of the slice as its children, a textual
|
|
5666
|
+
representation, and the transformed slice (which can be
|
|
5667
|
+
different from the given input due to hooks like
|
|
5668
|
+
[`transformCopied`](https://prosemirror.net/docs/ref/#view.EditorProps.transformCopied)).
|
|
5669
|
+
*/
|
|
5670
|
+
serializeForClipboard(slice) {
|
|
5671
|
+
return serializeForClipboard(this, slice);
|
|
5672
|
+
}
|
|
5673
|
+
/**
|
|
5663
5674
|
Removes the editor from the DOM and destroys all [node
|
|
5664
5675
|
views](https://prosemirror.net/docs/ref/#view.NodeView).
|
|
5665
5676
|
*/
|
|
@@ -5793,4 +5804,4 @@ function checkStateComponent(plugin) {
|
|
|
5793
5804
|
throw new RangeError("Plugins passed directly to the view must not have a state component");
|
|
5794
5805
|
}
|
|
5795
5806
|
|
|
5796
|
-
export { Decoration, DecorationSet, EditorView, __endComposition, __parseFromClipboard
|
|
5807
|
+
export { Decoration, DecorationSet, EditorView, __endComposition, __parseFromClipboard };
|
package/package.json
CHANGED
package/src/domcoords.ts
CHANGED
|
@@ -32,9 +32,9 @@ function clientRect(node: HTMLElement): Rect {
|
|
|
32
32
|
export function scrollRectIntoView(view: EditorView, rect: Rect, startDOM: Node) {
|
|
33
33
|
let scrollThreshold = view.someProp("scrollThreshold") || 0, scrollMargin = view.someProp("scrollMargin") || 5
|
|
34
34
|
let doc = view.dom.ownerDocument
|
|
35
|
-
for (let parent: Node | null = startDOM || view.dom;;
|
|
35
|
+
for (let parent: Node | null = startDOM || view.dom;;) {
|
|
36
36
|
if (!parent) break
|
|
37
|
-
if (parent.nodeType != 1) continue
|
|
37
|
+
if (parent.nodeType != 1) { parent = parentNode(parent); continue }
|
|
38
38
|
let elt = parent as HTMLElement
|
|
39
39
|
let atTop = elt == doc.body
|
|
40
40
|
let bounding = atTop ? windowRect(doc) : clientRect(elt as HTMLElement)
|
|
@@ -60,7 +60,9 @@ export function scrollRectIntoView(view: EditorView, rect: Rect, startDOM: Node)
|
|
|
60
60
|
rect = {left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY}
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
-
|
|
63
|
+
let pos: string = atTop ? "fixed" : getComputedStyle(parent as HTMLElement).position
|
|
64
|
+
if (/^(fixed|sticky)$/.test(pos)) break
|
|
65
|
+
parent = pos == "absolute" ? (parent as HTMLElement).offsetParent : parentNode(parent)
|
|
64
66
|
}
|
|
65
67
|
}
|
|
66
68
|
|
package/src/index.ts
CHANGED
|
@@ -20,8 +20,6 @@ export {NodeView, MarkView, ViewMutationRecord} from "./viewdesc"
|
|
|
20
20
|
import {serializeForClipboard, parseFromClipboard} from "./clipboard"
|
|
21
21
|
import {endComposition} from "./input"
|
|
22
22
|
/// @internal
|
|
23
|
-
export const __serializeForClipboard = serializeForClipboard
|
|
24
|
-
/// @internal
|
|
25
23
|
export const __parseFromClipboard = parseFromClipboard
|
|
26
24
|
/// @internal
|
|
27
25
|
export const __endComposition = endComposition
|
|
@@ -446,6 +444,16 @@ export class EditorView {
|
|
|
446
444
|
return doPaste(this, text, null, true, event || new ClipboardEvent("paste"))
|
|
447
445
|
}
|
|
448
446
|
|
|
447
|
+
/// Serialize the given slice as it would be if it was copied from
|
|
448
|
+
/// this editor. Returns a DOM element that contains a
|
|
449
|
+
/// representation of the slice as its children, a textual
|
|
450
|
+
/// representation, and the transformed slice (which can be
|
|
451
|
+
/// different from the given input due to hooks like
|
|
452
|
+
/// [`transformCopied`](#view.EditorProps.transformCopied)).
|
|
453
|
+
serializeForClipboard(slice: Slice): {dom: HTMLElement, text: string, slice: Slice} {
|
|
454
|
+
return serializeForClipboard(this, slice)
|
|
455
|
+
}
|
|
456
|
+
|
|
449
457
|
/// Removes the editor from the DOM and destroys all [node
|
|
450
458
|
/// views](#view.NodeView).
|
|
451
459
|
destroy() {
|
package/src/viewdesc.ts
CHANGED
|
@@ -7,7 +7,10 @@ import {Decoration, DecorationSource, WidgetConstructor, WidgetType, NodeType} f
|
|
|
7
7
|
import {EditorView} from "./index"
|
|
8
8
|
|
|
9
9
|
declare global {
|
|
10
|
-
interface Node {
|
|
10
|
+
interface Node {
|
|
11
|
+
/// @internal
|
|
12
|
+
pmViewDesc?: ViewDesc
|
|
13
|
+
}
|
|
11
14
|
}
|
|
12
15
|
|
|
13
16
|
/// A ViewMutationRecord represents a DOM
|