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 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;; parent = parentNode(parent)) {
203
+ for (var parent = startDOM || view.dom;;) {
204
204
  if (!parent) break;
205
- if (parent.nodeType != 1) continue;
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
- if (atTop || /^(fixed|sticky)$/.test(getComputedStyle(parent).position)) break;
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 serializeForClipboard(view, slice) {
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 = serializeForClipboard(view, slice),
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 = serializeForClipboard(view, draggedSlice),
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, TagParseRule, Slice, ResolvedPos, DOMParser, DOMSerializer } from 'prosemirror-model';
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, TagParseRule, Slice, ResolvedPos, DOMParser, DOMSerializer } from 'prosemirror-model';
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;; parent = parentNode(parent)) {
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
- if (atTop || /^(fixed|sticky)$/.test(getComputedStyle(parent).position))
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, __serializeForClipboard };
5807
+ export { Decoration, DecorationSet, EditorView, __endComposition, __parseFromClipboard };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prosemirror-view",
3
- "version": "1.37.2",
3
+ "version": "1.38.1",
4
4
  "description": "ProseMirror's view component",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
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;; parent = parentNode(parent)) {
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
- if (atTop || /^(fixed|sticky)$/.test(getComputedStyle(parent as HTMLElement).position)) break
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 { pmViewDesc?: ViewDesc }
10
+ interface Node {
11
+ /// @internal
12
+ pmViewDesc?: ViewDesc
13
+ }
11
14
  }
12
15
 
13
16
  /// A ViewMutationRecord represents a DOM