@handlewithcare/react-prosemirror 2.4.12 → 2.5.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.
Files changed (149) hide show
  1. package/dist/cjs/AbstractEditorView.js +4 -0
  2. package/dist/cjs/ReactEditorView.js +156 -0
  3. package/dist/cjs/StaticEditorView.js +86 -0
  4. package/dist/cjs/components/ChildNodeViews.js +58 -29
  5. package/dist/cjs/components/CustomNodeView.js +77 -137
  6. package/dist/cjs/{hooks/useNodePos.js → components/DefaultNodeView.js} +24 -26
  7. package/dist/cjs/components/DocNodeView.js +33 -41
  8. package/dist/cjs/components/MarkView.js +1 -2
  9. package/dist/cjs/components/NativeWidgetView.js +2 -3
  10. package/dist/cjs/components/NodeView.js +31 -21
  11. package/dist/cjs/components/ProseMirror.js +25 -17
  12. package/dist/cjs/components/ProseMirrorDoc.js +7 -27
  13. package/dist/cjs/components/ReactNodeView.js +98 -61
  14. package/dist/cjs/components/SeparatorHackView.js +1 -2
  15. package/dist/cjs/components/TextNodeView.js +4 -5
  16. package/dist/cjs/components/TrailingHackView.js +1 -2
  17. package/dist/cjs/components/WidgetView.js +2 -4
  18. package/dist/cjs/constants.js +33 -0
  19. package/dist/cjs/hooks/useEditor.js +33 -229
  20. package/dist/cjs/hooks/useEditorEffect.js +2 -2
  21. package/dist/cjs/hooks/useEditorEventCallback.js +8 -5
  22. package/dist/cjs/hooks/useIgnoreMutation.js +1 -1
  23. package/dist/cjs/hooks/useNodeViewDescriptor.js +123 -80
  24. package/dist/cjs/hooks/useReactKeys.js +1 -1
  25. package/dist/cjs/hooks/useSelectNode.js +9 -7
  26. package/dist/cjs/hooks/useStopEvent.js +1 -1
  27. package/dist/cjs/plugins/beforeInputPlugin.js +12 -0
  28. package/dist/cjs/testing/editorViewTestHelpers.js +0 -2
  29. package/dist/cjs/viewdesc.js +104 -25
  30. package/dist/esm/AbstractEditorView.js +1 -0
  31. package/dist/esm/ReactEditorView.js +156 -0
  32. package/dist/esm/StaticEditorView.js +76 -0
  33. package/dist/esm/components/ChildNodeViews.js +59 -31
  34. package/dist/esm/components/CustomNodeView.js +78 -138
  35. package/dist/esm/components/DefaultNodeView.js +16 -0
  36. package/dist/esm/components/DocNodeView.js +33 -41
  37. package/dist/esm/components/MarkView.js +1 -2
  38. package/dist/esm/components/NativeWidgetView.js +2 -3
  39. package/dist/esm/components/NodeView.js +32 -22
  40. package/dist/esm/components/ProseMirror.js +25 -17
  41. package/dist/esm/components/ProseMirrorDoc.js +7 -28
  42. package/dist/esm/components/ReactNodeView.js +99 -62
  43. package/dist/esm/components/SeparatorHackView.js +1 -2
  44. package/dist/esm/components/TextNodeView.js +4 -5
  45. package/dist/esm/components/TrailingHackView.js +1 -2
  46. package/dist/esm/components/WidgetView.js +2 -4
  47. package/dist/esm/constants.js +15 -0
  48. package/dist/esm/hooks/useEditor.js +29 -218
  49. package/dist/esm/hooks/useEditorEffect.js +2 -2
  50. package/dist/esm/hooks/useEditorEventCallback.js +8 -5
  51. package/dist/esm/hooks/useIgnoreMutation.js +1 -1
  52. package/dist/esm/hooks/useNodeViewDescriptor.js +125 -82
  53. package/dist/esm/hooks/useReactKeys.js +1 -1
  54. package/dist/esm/hooks/useSelectNode.js +9 -7
  55. package/dist/esm/hooks/useStopEvent.js +1 -1
  56. package/dist/esm/plugins/beforeInputPlugin.js +12 -0
  57. package/dist/esm/testing/editorViewTestHelpers.js +0 -2
  58. package/dist/esm/viewdesc.js +94 -18
  59. package/dist/tsconfig.tsbuildinfo +1 -1
  60. package/dist/types/AbstractEditorView.d.ts +27 -0
  61. package/dist/types/ReactEditorView.d.ts +80 -0
  62. package/dist/types/StaticEditorView.d.ts +24 -0
  63. package/dist/types/components/ChildNodeViews.d.ts +2 -2
  64. package/dist/types/components/CustomNodeView.d.ts +3 -3
  65. package/dist/types/components/DefaultNodeView.d.ts +3 -0
  66. package/dist/types/components/DocNodeView.d.ts +9 -17
  67. package/dist/types/components/MarkView.d.ts +2 -2
  68. package/dist/types/components/NativeWidgetView.d.ts +2 -2
  69. package/dist/types/components/NodeView.d.ts +5 -5
  70. package/dist/types/components/NodeViewComponentProps.d.ts +3 -4
  71. package/dist/types/components/ProseMirrorDoc.d.ts +14 -8
  72. package/dist/types/components/ReactNodeView.d.ts +4 -2
  73. package/dist/types/components/SeparatorHackView.d.ts +2 -2
  74. package/dist/types/components/TextNodeView.d.ts +4 -3
  75. package/dist/types/components/TrailingHackView.d.ts +2 -2
  76. package/dist/types/components/WidgetView.d.ts +2 -2
  77. package/dist/types/constants.d.ts +4 -0
  78. package/dist/types/contexts/EditorContext.d.ts +6 -4
  79. package/dist/types/contexts/IgnoreMutationContext.d.ts +2 -1
  80. package/dist/types/contexts/NodeViewContext.d.ts +3 -1
  81. package/dist/types/contexts/SelectNodeContext.d.ts +3 -1
  82. package/dist/types/contexts/StopEventContext.d.ts +2 -1
  83. package/dist/types/decorations/computeDocDeco.d.ts +3 -2
  84. package/dist/types/decorations/viewDecorations.d.ts +3 -2
  85. package/dist/types/hooks/useEditor.d.ts +5 -46
  86. package/dist/types/hooks/useNodeViewDescriptor.d.ts +18 -10
  87. package/dist/types/hooks/useReactKeys.d.ts +1 -1
  88. package/dist/types/hooks/useSelectNode.d.ts +2 -1
  89. package/dist/types/props.d.ts +3 -3
  90. package/dist/types/viewdesc.d.ts +29 -11
  91. package/package.json +7 -3
  92. package/dist/cjs/components/Editor.js +0 -28
  93. package/dist/cjs/components/NodeViews.js +0 -73
  94. package/dist/cjs/components/__tests__/LayoutGroup.test.js +0 -141
  95. package/dist/cjs/components/__tests__/ProseMirror.test.js +0 -255
  96. package/dist/cjs/contexts/NodeViewsContext.js +0 -10
  97. package/dist/cjs/hooks/__tests__/useEditorViewLayoutEffect.test.js +0 -107
  98. package/dist/cjs/hooks/__tests__/useNodeViews.test.js +0 -159
  99. package/dist/cjs/hooks/useClientOnly.js +0 -19
  100. package/dist/cjs/hooks/useEditorView.js +0 -100
  101. package/dist/cjs/hooks/useNodeViews.js +0 -100
  102. package/dist/cjs/nodeViews/createReactNodeViewConstructor.js +0 -244
  103. package/dist/cjs/nodeViews/phrasingContentTags.js +0 -57
  104. package/dist/cjs/plugins/__tests__/react.test.js +0 -139
  105. package/dist/cjs/plugins/react.js +0 -71
  106. package/dist/cjs/selection/SelectionDOMObserver.js +0 -171
  107. package/dist/cjs/selection/hasFocusAndSelection.js +0 -35
  108. package/dist/cjs/selection/selectionFromDOM.js +0 -77
  109. package/dist/cjs/selection/selectionToDOM.js +0 -226
  110. package/dist/cjs/ssr.js +0 -85
  111. package/dist/esm/components/Editor.js +0 -15
  112. package/dist/esm/components/NodeViews.js +0 -26
  113. package/dist/esm/components/__tests__/LayoutGroup.test.js +0 -98
  114. package/dist/esm/components/__tests__/ProseMirror.test.js +0 -207
  115. package/dist/esm/contexts/NodeViewsContext.js +0 -9
  116. package/dist/esm/hooks/__tests__/useEditorViewLayoutEffect.test.js +0 -98
  117. package/dist/esm/hooks/__tests__/useNodeViews.test.js +0 -116
  118. package/dist/esm/hooks/useClientOnly.js +0 -9
  119. package/dist/esm/hooks/useEditorView.js +0 -99
  120. package/dist/esm/hooks/useNodePos.js +0 -16
  121. package/dist/esm/hooks/useNodeViews.js +0 -53
  122. package/dist/esm/nodeViews/createReactNodeViewConstructor.js +0 -214
  123. package/dist/esm/nodeViews/phrasingContentTags.js +0 -49
  124. package/dist/esm/plugins/__tests__/react.test.js +0 -135
  125. package/dist/esm/plugins/react.js +0 -64
  126. package/dist/esm/selection/SelectionDOMObserver.js +0 -161
  127. package/dist/esm/selection/hasFocusAndSelection.js +0 -17
  128. package/dist/esm/selection/selectionFromDOM.js +0 -59
  129. package/dist/esm/selection/selectionToDOM.js +0 -196
  130. package/dist/esm/ssr.js +0 -82
  131. package/dist/types/components/Editor.d.ts +0 -7
  132. package/dist/types/components/NodeViews.d.ts +0 -6
  133. package/dist/types/components/__tests__/LayoutGroup.test.d.ts +0 -1
  134. package/dist/types/contexts/NodeViewsContext.d.ts +0 -19
  135. package/dist/types/hooks/__tests__/useEditorViewLayoutEffect.test.d.ts +0 -1
  136. package/dist/types/hooks/__tests__/useNodeViews.test.d.ts +0 -1
  137. package/dist/types/hooks/useClientOnly.d.ts +0 -1
  138. package/dist/types/hooks/useEditorView.d.ts +0 -23
  139. package/dist/types/hooks/useNodePos.d.ts +0 -9
  140. package/dist/types/hooks/useNodeViews.d.ts +0 -5
  141. package/dist/types/nodeViews/createReactNodeViewConstructor.d.ts +0 -48
  142. package/dist/types/nodeViews/phrasingContentTags.d.ts +0 -1
  143. package/dist/types/plugins/__tests__/react.test.d.ts +0 -1
  144. package/dist/types/plugins/react.d.ts +0 -21
  145. package/dist/types/selection/SelectionDOMObserver.d.ts +0 -33
  146. package/dist/types/selection/hasFocusAndSelection.d.ts +0 -3
  147. package/dist/types/selection/selectionFromDOM.d.ts +0 -4
  148. package/dist/types/selection/selectionToDOM.d.ts +0 -9
  149. package/dist/types/ssr.d.ts +0 -19
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import { Fragment } from "prosemirror-model";
2
2
  import { browser } from "./browser.js";
3
- import { domIndex, isEquivalentPosition } from "./selection/selectionToDOM.js";
3
+ import { domIndex, isEquivalentPosition } from "./dom.js";
4
4
  // View descriptions are data structures that describe the DOM that is
5
5
  // used to represent the editor's content. They are used for:
6
6
  //
@@ -82,7 +82,9 @@ export class ViewDesc {
82
82
  return 0;
83
83
  }
84
84
  destroy() {
85
- // pass
85
+ this.parent = undefined;
86
+ if (this.dom.pmViewDesc == this) this.dom.pmViewDesc = undefined;
87
+ for(let i = 0; i < this.children.length; i++)this.children[i].destroy();
86
88
  }
87
89
  posBeforeChild(child) {
88
90
  for(let i = 0, pos = this.posAtStart;; i++){
@@ -332,7 +334,6 @@ export class ViewDesc {
332
334
  let anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1);
333
335
  let headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1);
334
336
  const domSel = view.root.getSelection();
335
- // @ts-expect-error - Internal method domSelectionRange
336
337
  const selRange = view.domSelectionRange();
337
338
  let brKludge = false;
338
339
  // On Firefox, using Selection.collapse to put the cursor after a
@@ -542,15 +543,8 @@ export class NodeViewDesc extends ViewDesc {
542
543
  outerDeco;
543
544
  innerDeco;
544
545
  nodeDOM;
545
- stopEvent;
546
- selectNode;
547
- deselectNode;
548
- ignoreMutation;
549
- constructor(parent, children, getPos, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, stopEvent, selectNode, deselectNode, ignoreMutation){
550
- super(parent, children, getPos, dom, contentDOM), this.node = node, this.outerDeco = outerDeco, this.innerDeco = innerDeco, this.nodeDOM = nodeDOM, this.stopEvent = stopEvent, this.selectNode = selectNode, this.deselectNode = deselectNode, this.ignoreMutation = ignoreMutation;
551
- }
552
- updateOuterDeco() {
553
- // pass
546
+ constructor(parent, children, getPos, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM){
547
+ super(parent, children, getPos, dom, contentDOM), this.node = node, this.outerDeco = outerDeco, this.innerDeco = innerDeco, this.nodeDOM = nodeDOM;
554
548
  }
555
549
  parseRule() {
556
550
  // Experimental kludge to allow opt-in re-parsing of nodes
@@ -594,22 +588,46 @@ export class NodeViewDesc extends ViewDesc {
594
588
  get border() {
595
589
  return this.node.isLeaf ? 0 : 1;
596
590
  }
591
+ updateChildren(_view, _pos) {
592
+ // Omitted to avoid reproducing lots of unused code.
593
+ // Overidden elsewhere in case this is ever vendored.
594
+ }
597
595
  // If this desc must be updated to match the given node decoration,
598
596
  // do so and return true.
599
- update(_node, _outerDeco, _innerDeco, _view) {
597
+ update(node, outerDeco, innerDeco, view) {
598
+ if (this.dirty == NODE_DIRTY || !node.sameMarkup(this.node)) return false;
599
+ this.updateInner(node, outerDeco, innerDeco, view);
600
600
  return true;
601
601
  }
602
+ updateInner(node, outerDeco, innerDeco, view) {
603
+ this.updateOuterDeco(outerDeco);
604
+ this.node = node;
605
+ this.innerDeco = innerDeco;
606
+ if (this.contentDOM) this.updateChildren(view, this.posAtStart);
607
+ this.dirty = NOT_DIRTY;
608
+ }
609
+ updateOuterDeco(outerDeco) {
610
+ this.outerDeco = outerDeco;
611
+ }
612
+ // Mark this node as being the selected node.
613
+ selectNode() {
614
+ if (this.nodeDOM.nodeType == 1) this.nodeDOM.classList.add("ProseMirror-selectednode");
615
+ if (this.contentDOM || !this.node.type.spec.draggable) this.dom.draggable = true;
616
+ }
617
+ // Remove selected node marking from this node.
618
+ deselectNode() {
619
+ if (this.nodeDOM.nodeType == 1) {
620
+ this.nodeDOM.classList.remove("ProseMirror-selectednode");
621
+ if (this.contentDOM || !this.node.type.spec.draggable) this.dom.removeAttribute("draggable");
622
+ }
623
+ }
602
624
  get domAtom() {
603
625
  return this.node.isAtom;
604
626
  }
605
627
  }
606
628
  export class TextViewDesc extends NodeViewDesc {
607
629
  constructor(parent, children, getPos, node, outerDeco, innerDeco, dom, nodeDOM){
608
- super(parent, children, getPos, node, outerDeco, innerDeco, dom, null, nodeDOM, ()=>false, ()=>{
609
- /* Text nodes can't have node selections */ }, ()=>{
610
- /* Text nodes can't have node selections */ }, (mutation)=>{
611
- return mutation.type != "characterData" && mutation.type != "selection";
612
- });
630
+ super(parent, children, getPos, node, outerDeco, innerDeco, dom, null, nodeDOM);
613
631
  }
614
632
  parseRule() {
615
633
  let skip = this.nodeDOM.parentNode;
@@ -619,6 +637,7 @@ export class TextViewDesc extends NodeViewDesc {
619
637
  };
620
638
  }
621
639
  update(_node, _outerDeco, _innerDeco, _view) {
640
+ this.dirty = NOT_DIRTY;
622
641
  return true;
623
642
  }
624
643
  inParent() {
@@ -662,6 +681,63 @@ export class TrailingHackViewDesc extends ViewDesc {
662
681
  return this.dom.nodeName == "IMG";
663
682
  }
664
683
  }
684
+ // A separate subclass is used for customized node views, so that the
685
+ // extra checks only have to be made for nodes that are actually
686
+ // customized.
687
+ let CustomNodeViewDesc = class CustomNodeViewDesc extends NodeViewDesc {
688
+ spec;
689
+ constructor(parent, children, getPos, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec){
690
+ super(parent, children, getPos, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM), this.spec = spec;
691
+ }
692
+ // A custom `update` method gets to decide whether the update goes
693
+ // through. If it does, and there's a `contentDOM` node, our logic
694
+ // updates the children.
695
+ update(node, outerDeco, innerDeco, view) {
696
+ if (this.dirty == NODE_DIRTY) return false;
697
+ if (this.spec.update && (this.node.type == node.type || this.spec.multiType)) {
698
+ const result = this.spec.update(node, outerDeco, innerDeco);
699
+ if (result) this.updateInner(node, outerDeco, innerDeco, view);
700
+ return result;
701
+ } else if (!this.contentDOM && !node.isLeaf) {
702
+ return false;
703
+ } else {
704
+ return super.update(node, outerDeco, innerDeco, view);
705
+ }
706
+ }
707
+ selectNode() {
708
+ this.spec.selectNode ? this.spec.selectNode() : super.selectNode();
709
+ }
710
+ deselectNode() {
711
+ this.spec.deselectNode ? this.spec.deselectNode() : super.deselectNode();
712
+ }
713
+ setSelection(anchor, head, view, force) {
714
+ this.spec.setSelection ? this.spec.setSelection(anchor, head, view.root) : super.setSelection(anchor, head, view, force);
715
+ }
716
+ destroy() {
717
+ if (this.spec.destroy) this.spec.destroy();
718
+ super.destroy();
719
+ }
720
+ stopEvent(event) {
721
+ return this.spec.stopEvent ? this.spec.stopEvent(event) : false;
722
+ }
723
+ ignoreMutation(mutation) {
724
+ return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation);
725
+ }
726
+ };
727
+ export class ReactNodeViewDesc extends CustomNodeViewDesc {
728
+ updateChildren(_view, _pos) {
729
+ // React has already updated the children.
730
+ }
731
+ updateOuterDeco(outerDeco) {
732
+ // React has already updated the decorations.
733
+ this.outerDeco = outerDeco;
734
+ }
735
+ destroy() {
736
+ // React has already destroyed the children (if needed).
737
+ this.children = [];
738
+ super.destroy();
739
+ }
740
+ }
665
741
  function sameOuterDeco(a, b) {
666
742
  if (a.length != b.length) return false;
667
743
  // @ts-expect-error ...