prosemirror-view 1.38.1 → 1.39.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,15 @@
1
+ ## 1.39.1 (2025-04-04)
2
+
3
+ ## 1.39.0 (2025-04-04)
4
+
5
+ ### Bug fixes
6
+
7
+ Fix an issue where, with some types of schemas, pressing Enter on Android with a Chinese keyboard wouldn't properly detect the Enter press.
8
+
9
+ ### New features
10
+
11
+ The new `dragCopies` prop can be used to configure whether a drag event inside the editor copies or moves content.
12
+
1
13
  ## 1.38.1 (2025-03-04)
2
14
 
3
15
  ### Bug fixes
package/dist/index.cjs CHANGED
@@ -3420,6 +3420,12 @@ var Dragging = _createClass(function Dragging(slice, move, node) {
3420
3420
  this.node = node;
3421
3421
  });
3422
3422
  var dragCopyModifier = mac ? "altKey" : "ctrlKey";
3423
+ function dragMoves(view, event) {
3424
+ var moves = view.someProp("dragCopies", function (test) {
3425
+ return !test(event);
3426
+ });
3427
+ return moves != null ? moves : !event[dragCopyModifier];
3428
+ }
3423
3429
  handlers.dragstart = function (view, _event) {
3424
3430
  var event = _event;
3425
3431
  var mouseDown = view.input.mouseDown;
@@ -3443,7 +3449,7 @@ handlers.dragstart = function (view, _event) {
3443
3449
  event.dataTransfer.setData(brokenClipboardAPI ? "Text" : "text/html", dom.innerHTML);
3444
3450
  event.dataTransfer.effectAllowed = "copyMove";
3445
3451
  if (!brokenClipboardAPI) event.dataTransfer.setData("text/plain", text);
3446
- view.dragging = new Dragging(slice, !event[dragCopyModifier], node);
3452
+ view.dragging = new Dragging(slice, dragMoves(view, event), node);
3447
3453
  };
3448
3454
  handlers.dragend = function (view) {
3449
3455
  var dragging = view.dragging;
@@ -3470,7 +3476,7 @@ editHandlers.drop = function (view, _event) {
3470
3476
  } else {
3471
3477
  slice = parseFromClipboard(view, getText(event.dataTransfer), brokenClipboardAPI ? null : event.dataTransfer.getData("text/html"), false, $mouse);
3472
3478
  }
3473
- var move = !!(dragging && !event[dragCopyModifier]);
3479
+ var move = !!(dragging && dragMoves(view, event));
3474
3480
  if (view.someProp("handleDrop", function (f) {
3475
3481
  return f(view, event, slice || prosemirrorModel.Slice.empty, move);
3476
3482
  })) {
@@ -4662,7 +4668,7 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
4662
4668
  var nextSel;
4663
4669
  if ((ios && view.input.lastIOSEnter > Date.now() - 225 && (!inlineChange || addedNodes.some(function (n) {
4664
4670
  return n.nodeName == "DIV" || n.nodeName == "P";
4665
- })) || !inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) && (nextSel = prosemirrorState.Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) && nextSel.head == $to.pos) && view.someProp("handleKeyDown", function (f) {
4671
+ })) || !inlineChange && $from.pos < parse.doc.content.size && (!$from.sameParent($to) || !$from.parent.inlineContent) && (nextSel = prosemirrorState.Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) && nextSel.head > $from.pos) && view.someProp("handleKeyDown", function (f) {
4666
4672
  return f(view, keyEvent(13, "Enter"));
4667
4673
  })) {
4668
4674
  view.input.lastIOSEnter = 0;
package/dist/index.d.cts CHANGED
@@ -699,6 +699,12 @@ interface EditorProps<P = any> {
699
699
  */
700
700
  handleScrollToSelection?: (this: P, view: EditorView) => boolean;
701
701
  /**
702
+ Determines whether an in-editor drag event should copy or move
703
+ the selection. When not given, the event's `altKey` property is
704
+ used on macOS, `ctrlKey` on other platforms.
705
+ */
706
+ dragCopies?: (event: DragEvent) => boolean;
707
+ /**
702
708
  Can be used to override the way a selection is created when
703
709
  reading a DOM selection between the given anchor and head.
704
710
  */
package/dist/index.d.ts CHANGED
@@ -699,6 +699,12 @@ interface EditorProps<P = any> {
699
699
  */
700
700
  handleScrollToSelection?: (this: P, view: EditorView) => boolean;
701
701
  /**
702
+ Determines whether an in-editor drag event should copy or move
703
+ the selection. When not given, the event's `altKey` property is
704
+ used on macOS, `ctrlKey` on other platforms.
705
+ */
706
+ dragCopies?: (event: DragEvent) => boolean;
707
+ /**
702
708
  Can be used to override the way a selection is created when
703
709
  reading a DOM selection between the given anchor and head.
704
710
  */
package/dist/index.js CHANGED
@@ -3676,6 +3676,10 @@ class Dragging {
3676
3676
  }
3677
3677
  }
3678
3678
  const dragCopyModifier = mac ? "altKey" : "ctrlKey";
3679
+ function dragMoves(view, event) {
3680
+ let moves = view.someProp("dragCopies", test => !test(event));
3681
+ return moves != null ? moves : !event[dragCopyModifier];
3682
+ }
3679
3683
  handlers.dragstart = (view, _event) => {
3680
3684
  let event = _event;
3681
3685
  let mouseDown = view.input.mouseDown;
@@ -3705,7 +3709,7 @@ handlers.dragstart = (view, _event) => {
3705
3709
  event.dataTransfer.effectAllowed = "copyMove";
3706
3710
  if (!brokenClipboardAPI)
3707
3711
  event.dataTransfer.setData("text/plain", text);
3708
- view.dragging = new Dragging(slice, !event[dragCopyModifier], node);
3712
+ view.dragging = new Dragging(slice, dragMoves(view, event), node);
3709
3713
  };
3710
3714
  handlers.dragend = view => {
3711
3715
  let dragging = view.dragging;
@@ -3732,7 +3736,7 @@ editHandlers.drop = (view, _event) => {
3732
3736
  else {
3733
3737
  slice = parseFromClipboard(view, getText(event.dataTransfer), brokenClipboardAPI ? null : event.dataTransfer.getData("text/html"), false, $mouse);
3734
3738
  }
3735
- let move = !!(dragging && !event[dragCopyModifier]);
3739
+ let move = !!(dragging && dragMoves(view, event));
3736
3740
  if (view.someProp("handleDrop", f => f(view, event, slice || Slice.empty, move))) {
3737
3741
  event.preventDefault();
3738
3742
  return;
@@ -5017,9 +5021,10 @@ function readDOMChange(view, from, to, typeOver, addedNodes) {
5017
5021
  // as being an iOS enter press), just dispatch an Enter key instead.
5018
5022
  if (((ios && view.input.lastIOSEnter > Date.now() - 225 &&
5019
5023
  (!inlineChange || addedNodes.some(n => n.nodeName == "DIV" || n.nodeName == "P"))) ||
5020
- (!inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) &&
5024
+ (!inlineChange && $from.pos < parse.doc.content.size &&
5025
+ (!$from.sameParent($to) || !$from.parent.inlineContent) &&
5021
5026
  (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&
5022
- nextSel.head == $to.pos)) &&
5027
+ nextSel.head > $from.pos)) &&
5023
5028
  view.someProp("handleKeyDown", f => f(view, keyEvent(13, "Enter")))) {
5024
5029
  view.input.lastIOSEnter = 0;
5025
5030
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prosemirror-view",
3
- "version": "1.38.1",
3
+ "version": "1.39.1",
4
4
  "description": "ProseMirror's view component",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
package/src/domchange.ts CHANGED
@@ -181,9 +181,10 @@ export function readDOMChange(view: EditorView, from: number, to: number, typeOv
181
181
  // as being an iOS enter press), just dispatch an Enter key instead.
182
182
  if (((browser.ios && view.input.lastIOSEnter > Date.now() - 225 &&
183
183
  (!inlineChange || addedNodes.some(n => n.nodeName == "DIV" || n.nodeName == "P"))) ||
184
- (!inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) &&
184
+ (!inlineChange && $from.pos < parse.doc.content.size &&
185
+ (!$from.sameParent($to) || !$from.parent.inlineContent) &&
185
186
  (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&
186
- nextSel.head == $to.pos)) &&
187
+ nextSel.head > $from.pos)) &&
187
188
  view.someProp("handleKeyDown", f => f(view, keyEvent(13, "Enter")))) {
188
189
  view.input.lastIOSEnter = 0
189
190
  return
package/src/index.ts CHANGED
@@ -51,7 +51,7 @@ export class EditorView {
51
51
  private prevDirectPlugins: readonly Plugin[] = []
52
52
  private pluginViews: PluginView[] = []
53
53
  /// @internal
54
- domObserver!: DOMObserver
54
+ declare domObserver: DOMObserver
55
55
  /// Holds `true` when a hack node is needed in Firefox to prevent the
56
56
  /// [space is eaten issue](https://github.com/ProseMirror/prosemirror/issues/651)
57
57
  /// @internal
@@ -673,6 +673,11 @@ export interface EditorProps<P = any> {
673
673
  /// handlers or the default behavior should be tried.
674
674
  handleScrollToSelection?: (this: P, view: EditorView) => boolean
675
675
 
676
+ /// Determines whether an in-editor drag event should copy or move
677
+ /// the selection. When not given, the event's `altKey` property is
678
+ /// used on macOS, `ctrlKey` on other platforms.
679
+ dragCopies?: (event: DragEvent) => boolean
680
+
676
681
  /// Can be used to override the way a selection is created when
677
682
  /// reading a DOM selection between the given anchor and head.
678
683
  createSelectionBetween?: (this: P, view: EditorView, anchor: ResolvedPos, head: ResolvedPos) => Selection | null
package/src/input.ts CHANGED
@@ -660,6 +660,11 @@ export class Dragging {
660
660
 
661
661
  const dragCopyModifier: keyof DragEvent = browser.mac ? "altKey" : "ctrlKey"
662
662
 
663
+ function dragMoves(view: EditorView, event: DragEvent) {
664
+ let moves = view.someProp("dragCopies", test => !test(event))
665
+ return moves != null ? moves : !event[dragCopyModifier]
666
+ }
667
+
663
668
  handlers.dragstart = (view, _event) => {
664
669
  let event = _event as DragEvent
665
670
  let mouseDown = view.input.mouseDown
@@ -687,7 +692,7 @@ handlers.dragstart = (view, _event) => {
687
692
  // See https://github.com/ProseMirror/prosemirror/issues/1156
688
693
  event.dataTransfer.effectAllowed = "copyMove"
689
694
  if (!brokenClipboardAPI) event.dataTransfer.setData("text/plain", text)
690
- view.dragging = new Dragging(slice, !event[dragCopyModifier], node)
695
+ view.dragging = new Dragging(slice, dragMoves(view, event), node)
691
696
  }
692
697
 
693
698
  handlers.dragend = view => {
@@ -716,7 +721,7 @@ editHandlers.drop = (view, _event) => {
716
721
  slice = parseFromClipboard(view, getText(event.dataTransfer),
717
722
  brokenClipboardAPI ? null : event.dataTransfer.getData("text/html"), false, $mouse)
718
723
  }
719
- let move = !!(dragging && !event[dragCopyModifier])
724
+ let move = !!(dragging && dragMoves(view, event))
720
725
  if (view.someProp("handleDrop", f => f(view, event, slice || Slice.empty, move))) {
721
726
  event.preventDefault()
722
727
  return
package/src/viewdesc.ts CHANGED
@@ -135,7 +135,7 @@ const NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3
135
135
  // basic structure and shared methods.
136
136
  export class ViewDesc {
137
137
  dirty = NOT_DIRTY
138
- node!: Node | null
138
+ declare node: Node | null
139
139
 
140
140
  constructor(
141
141
  public parent: ViewDesc | undefined,