@stesura/react-prosemirror 3.2.11-stesura.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 (296) hide show
  1. package/LICENSE.txt +21 -0
  2. package/README.md +939 -0
  3. package/dist/cjs/AbstractEditorView.js +4 -0
  4. package/dist/cjs/ReactEditorView.js +194 -0
  5. package/dist/cjs/StaticEditorView.js +89 -0
  6. package/dist/cjs/browser.js +53 -0
  7. package/dist/cjs/commands/reorderSiblings.js +72 -0
  8. package/dist/cjs/components/ChildNodeViews.js +418 -0
  9. package/dist/cjs/components/CursorWrapper.js +84 -0
  10. package/dist/cjs/components/EditorStateSelectorsProvider.js +90 -0
  11. package/dist/cjs/components/LayoutGroup.js +112 -0
  12. package/dist/cjs/components/NativeWidgetView.js +108 -0
  13. package/dist/cjs/components/OutputSpec.js +121 -0
  14. package/dist/cjs/components/ProseMirror.js +146 -0
  15. package/dist/cjs/components/ProseMirrorDoc.js +74 -0
  16. package/dist/cjs/components/SeparatorHackView.js +99 -0
  17. package/dist/cjs/components/TextNodeView.js +113 -0
  18. package/dist/cjs/components/TrailingHackView.js +87 -0
  19. package/dist/cjs/components/WidgetView.js +94 -0
  20. package/dist/cjs/components/WidgetViewComponentProps.js +4 -0
  21. package/dist/cjs/components/marks/DefaultMarkView.js +70 -0
  22. package/dist/cjs/components/marks/MarkView.js +85 -0
  23. package/dist/cjs/components/marks/MarkViewComponentProps.js +4 -0
  24. package/dist/cjs/components/marks/MarkViewConstructorView.js +116 -0
  25. package/dist/cjs/components/marks/ReactMarkView.js +109 -0
  26. package/dist/cjs/components/nodes/DefaultNodeView.js +68 -0
  27. package/dist/cjs/components/nodes/DocNodeView.js +97 -0
  28. package/dist/cjs/components/nodes/NodeView.js +129 -0
  29. package/dist/cjs/components/nodes/NodeViewComponentProps.js +4 -0
  30. package/dist/cjs/components/nodes/NodeViewConstructorView.js +145 -0
  31. package/dist/cjs/components/nodes/ReactNodeView.js +189 -0
  32. package/dist/cjs/constants.js +33 -0
  33. package/dist/cjs/contexts/ChildDescriptionsContext.js +19 -0
  34. package/dist/cjs/contexts/EditorContext.js +12 -0
  35. package/dist/cjs/contexts/EditorStateContext.js +12 -0
  36. package/dist/cjs/contexts/EditorStateStoreContext.js +45 -0
  37. package/dist/cjs/contexts/IgnoreMutationContext.js +12 -0
  38. package/dist/cjs/contexts/LayoutGroupContext.js +12 -0
  39. package/dist/cjs/contexts/NodeViewContext.js +12 -0
  40. package/dist/cjs/contexts/RenderStoreContext.js +54 -0
  41. package/dist/cjs/contexts/SelectNodeContext.js +12 -0
  42. package/dist/cjs/contexts/StopEventContext.js +12 -0
  43. package/dist/cjs/decorations/ReactWidgetType.js +58 -0
  44. package/dist/cjs/decorations/computeDocDeco.js +44 -0
  45. package/dist/cjs/decorations/internalTypes.js +4 -0
  46. package/dist/cjs/decorations/iterDeco.js +91 -0
  47. package/dist/cjs/decorations/viewDecorations.js +155 -0
  48. package/dist/cjs/dom.js +147 -0
  49. package/dist/cjs/findDOMNode.js +46 -0
  50. package/dist/cjs/hooks/useClientLayoutEffect.js +19 -0
  51. package/dist/cjs/hooks/useComponentEventListeners.js +72 -0
  52. package/dist/cjs/hooks/useEditor.js +130 -0
  53. package/dist/cjs/hooks/useEditorEffect.js +39 -0
  54. package/dist/cjs/hooks/useEditorEventCallback.js +38 -0
  55. package/dist/cjs/hooks/useEditorEventListener.js +34 -0
  56. package/dist/cjs/hooks/useEditorState.js +18 -0
  57. package/dist/cjs/hooks/useEditorStateSelector.js +17 -0
  58. package/dist/cjs/hooks/useEffectEvent.js +34 -0
  59. package/dist/cjs/hooks/useForceUpdate.js +15 -0
  60. package/dist/cjs/hooks/useIgnoreMutation.js +24 -0
  61. package/dist/cjs/hooks/useIsComposingIn.js +25 -0
  62. package/dist/cjs/hooks/useIsEditorStatic.js +15 -0
  63. package/dist/cjs/hooks/useIsNodeSelected.js +21 -0
  64. package/dist/cjs/hooks/useLayoutGroupEffect.js +20 -0
  65. package/dist/cjs/hooks/useMarkViewDescription.js +134 -0
  66. package/dist/cjs/hooks/useNodePos.js +18 -0
  67. package/dist/cjs/hooks/useNodeViewDescription.js +154 -0
  68. package/dist/cjs/hooks/useReactKeys.js +17 -0
  69. package/dist/cjs/hooks/useSelectNode.js +30 -0
  70. package/dist/cjs/hooks/useSetDom.js +57 -0
  71. package/dist/cjs/hooks/useStopEvent.js +24 -0
  72. package/dist/cjs/index.js +85 -0
  73. package/dist/cjs/package.json +3 -0
  74. package/dist/cjs/plugins/beforeInputPlugin.js +356 -0
  75. package/dist/cjs/plugins/reactKeys.js +121 -0
  76. package/dist/cjs/props.js +283 -0
  77. package/dist/cjs/refs.js +28 -0
  78. package/dist/cjs/testing/editorViewTestHelpers.js +109 -0
  79. package/dist/cjs/testing/setupProseMirrorView.js +94 -0
  80. package/dist/cjs/tiptap/ReactProseMirrorNodeView.js +26 -0
  81. package/dist/cjs/tiptap/TiptapEditor.js +34 -0
  82. package/dist/cjs/tiptap/TiptapEditorContent.js +143 -0
  83. package/dist/cjs/tiptap/TiptapEditorView.js +130 -0
  84. package/dist/cjs/tiptap/contexts/TiptapEditorContext.js +12 -0
  85. package/dist/cjs/tiptap/extensions/ReactProseMirror.js +40 -0
  86. package/dist/cjs/tiptap/extensions/ReactProseMirrorCommands.js +21 -0
  87. package/dist/cjs/tiptap/extensions/commands/updateAttributes.js +104 -0
  88. package/dist/cjs/tiptap/hooks/useEditor.js +318 -0
  89. package/dist/cjs/tiptap/hooks/useIsInReactProseMirror.js +15 -0
  90. package/dist/cjs/tiptap/hooks/useTiptapEditor.js +35 -0
  91. package/dist/cjs/tiptap/hooks/useTiptapEditorEffect.js +35 -0
  92. package/dist/cjs/tiptap/hooks/useTiptapEditorEventCallback.js +35 -0
  93. package/dist/cjs/tiptap/index.js +48 -0
  94. package/dist/cjs/tiptap/tiptapNodeView.js +245 -0
  95. package/dist/cjs/viewdesc.js +862 -0
  96. package/dist/esm/AbstractEditorView.js +1 -0
  97. package/dist/esm/ReactEditorView.js +194 -0
  98. package/dist/esm/StaticEditorView.js +79 -0
  99. package/dist/esm/browser.js +43 -0
  100. package/dist/esm/commands/reorderSiblings.js +63 -0
  101. package/dist/esm/components/ChildNodeViews.js +359 -0
  102. package/dist/esm/components/CursorWrapper.js +33 -0
  103. package/dist/esm/components/EditorStateSelectorsProvider.js +31 -0
  104. package/dist/esm/components/LayoutGroup.js +67 -0
  105. package/dist/esm/components/NativeWidgetView.js +57 -0
  106. package/dist/esm/components/OutputSpec.js +71 -0
  107. package/dist/esm/components/ProseMirror.js +95 -0
  108. package/dist/esm/components/ProseMirrorDoc.js +15 -0
  109. package/dist/esm/components/SeparatorHackView.js +48 -0
  110. package/dist/esm/components/TextNodeView.js +103 -0
  111. package/dist/esm/components/TrailingHackView.js +36 -0
  112. package/dist/esm/components/WidgetView.js +43 -0
  113. package/dist/esm/components/WidgetViewComponentProps.js +1 -0
  114. package/dist/esm/components/marks/DefaultMarkView.js +19 -0
  115. package/dist/esm/components/marks/MarkView.js +34 -0
  116. package/dist/esm/components/marks/MarkViewComponentProps.js +1 -0
  117. package/dist/esm/components/marks/MarkViewConstructorView.js +65 -0
  118. package/dist/esm/components/marks/ReactMarkView.js +58 -0
  119. package/dist/esm/components/nodes/DefaultNodeView.js +17 -0
  120. package/dist/esm/components/nodes/DocNodeView.js +46 -0
  121. package/dist/esm/components/nodes/NodeView.js +67 -0
  122. package/dist/esm/components/nodes/NodeViewComponentProps.js +1 -0
  123. package/dist/esm/components/nodes/NodeViewConstructorView.js +94 -0
  124. package/dist/esm/components/nodes/ReactNodeView.js +138 -0
  125. package/dist/esm/constants.js +15 -0
  126. package/dist/esm/contexts/ChildDescriptionsContext.js +9 -0
  127. package/dist/esm/contexts/EditorContext.js +7 -0
  128. package/dist/esm/contexts/EditorStateContext.js +2 -0
  129. package/dist/esm/contexts/EditorStateStoreContext.js +27 -0
  130. package/dist/esm/contexts/IgnoreMutationContext.js +2 -0
  131. package/dist/esm/contexts/LayoutGroupContext.js +2 -0
  132. package/dist/esm/contexts/NodeViewContext.js +2 -0
  133. package/dist/esm/contexts/RenderStoreContext.js +33 -0
  134. package/dist/esm/contexts/SelectNodeContext.js +2 -0
  135. package/dist/esm/contexts/StopEventContext.js +2 -0
  136. package/dist/esm/decorations/ReactWidgetType.js +40 -0
  137. package/dist/esm/decorations/computeDocDeco.js +44 -0
  138. package/dist/esm/decorations/internalTypes.js +1 -0
  139. package/dist/esm/decorations/iterDeco.js +85 -0
  140. package/dist/esm/decorations/viewDecorations.js +155 -0
  141. package/dist/esm/dom.js +110 -0
  142. package/dist/esm/findDOMNode.js +31 -0
  143. package/dist/esm/hooks/useClientLayoutEffect.js +9 -0
  144. package/dist/esm/hooks/useComponentEventListeners.js +87 -0
  145. package/dist/esm/hooks/useEditor.js +128 -0
  146. package/dist/esm/hooks/useEditorEffect.js +46 -0
  147. package/dist/esm/hooks/useEditorEventCallback.js +38 -0
  148. package/dist/esm/hooks/useEditorEventListener.js +28 -0
  149. package/dist/esm/hooks/useEditorState.js +10 -0
  150. package/dist/esm/hooks/useEditorStateSelector.js +14 -0
  151. package/dist/esm/hooks/useEffectEvent.js +24 -0
  152. package/dist/esm/hooks/useForceUpdate.js +8 -0
  153. package/dist/esm/hooks/useIgnoreMutation.js +14 -0
  154. package/dist/esm/hooks/useIsComposingIn.js +17 -0
  155. package/dist/esm/hooks/useIsEditorStatic.js +8 -0
  156. package/dist/esm/hooks/useIsNodeSelected.js +11 -0
  157. package/dist/esm/hooks/useLayoutGroupEffect.js +10 -0
  158. package/dist/esm/hooks/useMarkViewDescription.js +124 -0
  159. package/dist/esm/hooks/useNodePos.js +15 -0
  160. package/dist/esm/hooks/useNodeViewDescription.js +144 -0
  161. package/dist/esm/hooks/useReactKeys.js +7 -0
  162. package/dist/esm/hooks/useSelectNode.js +20 -0
  163. package/dist/esm/hooks/useSetDom.js +47 -0
  164. package/dist/esm/hooks/useStopEvent.js +14 -0
  165. package/dist/esm/index.js +19 -0
  166. package/dist/esm/plugins/beforeInputPlugin.js +346 -0
  167. package/dist/esm/plugins/reactKeys.js +106 -0
  168. package/dist/esm/props.js +267 -0
  169. package/dist/esm/refs.js +18 -0
  170. package/dist/esm/testing/editorViewTestHelpers.js +86 -0
  171. package/dist/esm/testing/setupProseMirrorView.js +76 -0
  172. package/dist/esm/tiptap/ReactProseMirrorNodeView.js +22 -0
  173. package/dist/esm/tiptap/TiptapEditor.js +24 -0
  174. package/dist/esm/tiptap/TiptapEditorContent.js +99 -0
  175. package/dist/esm/tiptap/TiptapEditorView.js +76 -0
  176. package/dist/esm/tiptap/contexts/TiptapEditorContext.js +2 -0
  177. package/dist/esm/tiptap/extensions/ReactProseMirror.js +30 -0
  178. package/dist/esm/tiptap/extensions/ReactProseMirrorCommands.js +11 -0
  179. package/dist/esm/tiptap/extensions/commands/updateAttributes.js +96 -0
  180. package/dist/esm/tiptap/hooks/useEditor.js +308 -0
  181. package/dist/esm/tiptap/hooks/useIsInReactProseMirror.js +9 -0
  182. package/dist/esm/tiptap/hooks/useTiptapEditor.js +31 -0
  183. package/dist/esm/tiptap/hooks/useTiptapEditorEffect.js +42 -0
  184. package/dist/esm/tiptap/hooks/useTiptapEditorEventCallback.js +35 -0
  185. package/dist/esm/tiptap/index.js +9 -0
  186. package/dist/esm/tiptap/tiptapNodeView.js +211 -0
  187. package/dist/esm/viewdesc.js +844 -0
  188. package/dist/tsconfig.tsbuildinfo +1 -0
  189. package/dist/types/AbstractEditorView.d.ts +28 -0
  190. package/dist/types/ReactEditorView.d.ts +102 -0
  191. package/dist/types/StaticEditorView.d.ts +26 -0
  192. package/dist/types/__tests__/viewdesc.test.d.ts +1 -0
  193. package/dist/types/browser.d.ts +15 -0
  194. package/dist/types/commands/__tests__/reorderSiblings.test.d.ts +1 -0
  195. package/dist/types/commands/reorderSiblings.d.ts +14 -0
  196. package/dist/types/components/ChildNodeViews.d.ts +9 -0
  197. package/dist/types/components/CursorWrapper.d.ts +3 -0
  198. package/dist/types/components/EditorStateSelectorsProvider.d.ts +10 -0
  199. package/dist/types/components/LayoutGroup.d.ts +12 -0
  200. package/dist/types/components/NativeWidgetView.d.ts +8 -0
  201. package/dist/types/components/OutputSpec.d.ts +10 -0
  202. package/dist/types/components/ProseMirror.d.ts +14 -0
  203. package/dist/types/components/ProseMirrorDoc.d.ts +16 -0
  204. package/dist/types/components/SeparatorHackView.d.ts +6 -0
  205. package/dist/types/components/TextNodeView.d.ts +27 -0
  206. package/dist/types/components/TrailingHackView.d.ts +6 -0
  207. package/dist/types/components/WidgetView.d.ts +8 -0
  208. package/dist/types/components/WidgetViewComponentProps.d.ts +7 -0
  209. package/dist/types/components/__tests__/ProseMirror.composition.test.d.ts +17 -0
  210. package/dist/types/components/__tests__/ProseMirror.domchange.test.d.ts +1 -0
  211. package/dist/types/components/__tests__/ProseMirror.draw-decoration.test.d.ts +1 -0
  212. package/dist/types/components/__tests__/ProseMirror.draw.test.d.ts +1 -0
  213. package/dist/types/components/__tests__/ProseMirror.memory-leak.test.d.ts +6 -0
  214. package/dist/types/components/__tests__/ProseMirror.mobile.test.d.ts +1 -0
  215. package/dist/types/components/__tests__/ProseMirror.node-view.test.d.ts +1 -0
  216. package/dist/types/components/__tests__/ProseMirror.selection.test.d.ts +1 -0
  217. package/dist/types/components/__tests__/ProseMirror.test.d.ts +1 -0
  218. package/dist/types/components/__tests__/stableContexts.test.d.ts +10 -0
  219. package/dist/types/components/marks/DefaultMarkView.d.ts +3 -0
  220. package/dist/types/components/marks/MarkView.d.ts +10 -0
  221. package/dist/types/components/marks/MarkViewComponentProps.d.ts +11 -0
  222. package/dist/types/components/marks/MarkViewConstructorView.d.ts +12 -0
  223. package/dist/types/components/marks/ReactMarkView.d.ts +12 -0
  224. package/dist/types/components/nodes/DefaultNodeView.d.ts +3 -0
  225. package/dist/types/components/nodes/DocNodeView.d.ts +12 -0
  226. package/dist/types/components/nodes/NodeView.d.ts +14 -0
  227. package/dist/types/components/nodes/NodeViewComponentProps.d.ts +13 -0
  228. package/dist/types/components/nodes/NodeViewConstructorView.d.ts +12 -0
  229. package/dist/types/components/nodes/ReactNodeView.d.ts +13 -0
  230. package/dist/types/constants.d.ts +4 -0
  231. package/dist/types/contexts/ChildDescriptionsContext.d.ts +7 -0
  232. package/dist/types/contexts/EditorContext.d.ts +18 -0
  233. package/dist/types/contexts/EditorStateContext.d.ts +2 -0
  234. package/dist/types/contexts/EditorStateStoreContext.d.ts +9 -0
  235. package/dist/types/contexts/IgnoreMutationContext.d.ts +5 -0
  236. package/dist/types/contexts/LayoutGroupContext.d.ts +5 -0
  237. package/dist/types/contexts/NodeViewContext.d.ts +9 -0
  238. package/dist/types/contexts/RenderStoreContext.d.ts +24 -0
  239. package/dist/types/contexts/SelectNodeContext.d.ts +5 -0
  240. package/dist/types/contexts/StopEventContext.d.ts +5 -0
  241. package/dist/types/contexts/__tests__/DeferredLayoutEffects.test.d.ts +1 -0
  242. package/dist/types/decorations/ReactWidgetType.d.ts +40 -0
  243. package/dist/types/decorations/computeDocDeco.d.ts +14 -0
  244. package/dist/types/decorations/internalTypes.d.ts +20 -0
  245. package/dist/types/decorations/iterDeco.d.ts +3 -0
  246. package/dist/types/decorations/viewDecorations.d.ts +14 -0
  247. package/dist/types/dom.d.ts +22 -0
  248. package/dist/types/findDOMNode.d.ts +3 -0
  249. package/dist/types/hooks/__tests__/useEditorEffect.test.d.ts +1 -0
  250. package/dist/types/hooks/useClientLayoutEffect.d.ts +2 -0
  251. package/dist/types/hooks/useComponentEventListeners.d.ts +34 -0
  252. package/dist/types/hooks/useEditor.d.ts +37 -0
  253. package/dist/types/hooks/useEditorEffect.d.ts +21 -0
  254. package/dist/types/hooks/useEditorEventCallback.d.ts +13 -0
  255. package/dist/types/hooks/useEditorEventListener.d.ts +8 -0
  256. package/dist/types/hooks/useEditorState.d.ts +5 -0
  257. package/dist/types/hooks/useEditorStateSelector.d.ts +10 -0
  258. package/dist/types/hooks/useEffectEvent.d.ts +1 -0
  259. package/dist/types/hooks/useForceUpdate.d.ts +5 -0
  260. package/dist/types/hooks/useIgnoreMutation.d.ts +2 -0
  261. package/dist/types/hooks/useIsComposingIn.d.ts +4 -0
  262. package/dist/types/hooks/useIsEditorStatic.d.ts +5 -0
  263. package/dist/types/hooks/useIsNodeSelected.d.ts +1 -0
  264. package/dist/types/hooks/useLayoutGroupEffect.d.ts +3 -0
  265. package/dist/types/hooks/useMarkViewDescription.d.ts +15 -0
  266. package/dist/types/hooks/useNodePos.d.ts +9 -0
  267. package/dist/types/hooks/useNodeViewDescription.d.ts +16 -0
  268. package/dist/types/hooks/useReactKeys.d.ts +2 -0
  269. package/dist/types/hooks/useSelectNode.d.ts +2 -0
  270. package/dist/types/hooks/useSetDom.d.ts +2 -0
  271. package/dist/types/hooks/useStopEvent.d.ts +2 -0
  272. package/dist/types/index.d.ts +21 -0
  273. package/dist/types/plugins/__tests__/reactKeys.test.d.ts +1 -0
  274. package/dist/types/plugins/beforeInputPlugin.d.ts +2 -0
  275. package/dist/types/plugins/reactKeys.d.ts +23 -0
  276. package/dist/types/props.d.ts +1173 -0
  277. package/dist/types/refs.d.ts +2 -0
  278. package/dist/types/testing/editorViewTestHelpers.d.ts +24 -0
  279. package/dist/types/testing/setupProseMirrorView.d.ts +2 -0
  280. package/dist/types/tiptap/ReactProseMirrorNodeView.d.ts +15 -0
  281. package/dist/types/tiptap/TiptapEditor.d.ts +6 -0
  282. package/dist/types/tiptap/TiptapEditorContent.d.ts +28 -0
  283. package/dist/types/tiptap/TiptapEditorView.d.ts +16 -0
  284. package/dist/types/tiptap/contexts/TiptapEditorContext.d.ts +6 -0
  285. package/dist/types/tiptap/extensions/ReactProseMirror.d.ts +9 -0
  286. package/dist/types/tiptap/extensions/ReactProseMirrorCommands.d.ts +2 -0
  287. package/dist/types/tiptap/extensions/commands/updateAttributes.d.ts +24 -0
  288. package/dist/types/tiptap/hooks/useEditor.d.ts +38 -0
  289. package/dist/types/tiptap/hooks/useIsInReactProseMirror.d.ts +6 -0
  290. package/dist/types/tiptap/hooks/useTiptapEditor.d.ts +11 -0
  291. package/dist/types/tiptap/hooks/useTiptapEditorEffect.d.ts +21 -0
  292. package/dist/types/tiptap/hooks/useTiptapEditorEventCallback.d.ts +13 -0
  293. package/dist/types/tiptap/index.d.ts +9 -0
  294. package/dist/types/tiptap/tiptapNodeView.d.ts +50 -0
  295. package/dist/types/viewdesc.d.ts +179 -0
  296. package/package.json +167 -0
@@ -0,0 +1,356 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "beforeInputPlugin", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return beforeInputPlugin;
9
+ }
10
+ });
11
+ const _prosemirrormodel = require("prosemirror-model");
12
+ const _prosemirrorstate = require("prosemirror-state");
13
+ const _ReactEditorView = require("../ReactEditorView.js");
14
+ const _browser = require("../browser.js");
15
+ const _CursorWrapper = require("../components/CursorWrapper.js");
16
+ const _ReactWidgetType = require("../decorations/ReactWidgetType.js");
17
+ const _viewdesc = require("../viewdesc.js");
18
+ const _reactKeys = require("./reactKeys.js");
19
+ function insertText(view, eventData) {
20
+ let options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
21
+ if (eventData === null) return false;
22
+ const from = options.from ?? view.state.selection.from;
23
+ const to = options.to ?? view.state.selection.to;
24
+ if (view.someProp("handleTextInput", (f)=>f(view, from, to, eventData, ()=>view.state.tr.insertText(eventData, from, to)))) {
25
+ return true;
26
+ }
27
+ const { tr } = view.state;
28
+ if (options.marks) tr.ensureMarks(options.marks);
29
+ tr.insertText(eventData, from, to);
30
+ view.dispatch(tr);
31
+ return true;
32
+ }
33
+ // Taken from https://github.com/ProseMirror/prosemirror-gapcursor/blob/master/src/index.ts#L67-L84
34
+ // This is a hack that, when a composition starts while a gap cursor
35
+ // is active, quickly creates an inline context for the composition to
36
+ // happen in, to avoid it being aborted by the DOM selection being
37
+ // moved into a valid position.
38
+ //
39
+ // We can't rely on the actual hack from prosemirror-gapcursor, because
40
+ // it happens too late. We snapshot the DOM during compositionstart, but
41
+ // the gapcursor hack runs in beforeinput (after compositionstart).
42
+ function handleGapCursorComposition(view) {
43
+ // @ts-expect-error Internal property - jsonID
44
+ if (!(view.state.selection.jsonID === "gapcursor")) {
45
+ return;
46
+ }
47
+ const { $from } = view.state.selection;
48
+ const insert = $from.parent.contentMatchAt($from.index())// All schemas _must_ have a text node type
49
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
50
+ .findWrapping(view.state.schema.nodes.text);
51
+ if (!insert) return;
52
+ let fragment = _prosemirrormodel.Fragment.empty;
53
+ for(let i = insert.length - 1; i >= 0; i--){
54
+ fragment = _prosemirrormodel.Fragment.from(// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
55
+ insert[i].createAndFill(null, fragment));
56
+ }
57
+ const tr = view.state.tr.replace($from.pos, $from.pos, new _prosemirrormodel.Slice(fragment, 0, 0));
58
+ tr.setSelection(_prosemirrorstate.TextSelection.near(tr.doc.resolve($from.pos + 1)));
59
+ view.dispatch(tr);
60
+ }
61
+ const observeOptions = {
62
+ childList: true,
63
+ characterData: true,
64
+ characterDataOldValue: true,
65
+ attributes: true,
66
+ attributeOldValue: true,
67
+ subtree: true
68
+ };
69
+ function beforeInputPlugin() {
70
+ let observer = null;
71
+ let preCompositionSnapshot = null;
72
+ function teardownComposition(view, endedAt) {
73
+ view.input.composing = false;
74
+ if (observer) {
75
+ if (view.input.compositionNode && view.dom.contains(view.input.compositionNode)) {
76
+ view.domObserver.queue.push(...observer.takeRecords());
77
+ view.domObserver.flush();
78
+ } else {
79
+ const freezeFrom = _reactKeys.reactKeysPluginKey.getState(view.state)?.freezeFrom;
80
+ const frozenNode = freezeFrom == null ? null : view.state.doc.nodeAt(freezeFrom);
81
+ if (freezeFrom != null && frozenNode != null && preCompositionSnapshot) {
82
+ // This is a little hacky — it only works because we always abort
83
+ // compositions if the node after freezeFrom changes, so we can
84
+ // be sure that if a composition was canceled by the user/browser,
85
+ // the content hasn't changed since the composition started
86
+ view.dispatch(view.state.tr.replaceWith(freezeFrom + 1, freezeFrom + 1 + frozenNode.content.size, preCompositionSnapshot));
87
+ }
88
+ }
89
+ observer.disconnect();
90
+ observer = null;
91
+ }
92
+ view.input.compositionEndedAt = endedAt;
93
+ view.input.compositionNode = null;
94
+ view.input.compositionNodes = [];
95
+ view.input.compositionID++;
96
+ }
97
+ function teardownCompositionAndUnfreeze(view, event) {
98
+ teardownComposition(view, event.timeStamp);
99
+ view.dispatch(view.state.tr.setMeta(_reactKeys.reactKeysPluginKey, {
100
+ cursorWrapper: null,
101
+ freezeFrom: null
102
+ }));
103
+ }
104
+ return new _prosemirrorstate.Plugin({
105
+ view () {
106
+ return {
107
+ update (view) {
108
+ if (!(view instanceof _ReactEditorView.ReactEditorView)) return;
109
+ const frozen = _reactKeys.reactKeysPluginKey.getState(view.state)?.freezeFrom != null;
110
+ if (observer && view.composing && !frozen) {
111
+ teardownComposition(view, Date.now());
112
+ }
113
+ }
114
+ };
115
+ },
116
+ props: {
117
+ handleDOMEvents: {
118
+ compositionstart (view) {
119
+ if (!(view instanceof _ReactEditorView.ReactEditorView)) return false;
120
+ const storedMarks = view.state.selection.empty ? view.state.storedMarks : view.state.storedMarks ?? (view.state.selection instanceof _prosemirrorstate.TextSelection ? view.state.selection.$from.marksAcross(view.state.selection.$to) : null);
121
+ view.dispatch(view.state.tr.deleteSelection().setStoredMarks(storedMarks));
122
+ handleGapCursorComposition(view);
123
+ const { selection } = view.state;
124
+ const tr = view.state.tr.delete(selection.from, selection.to);
125
+ const $from = tr.doc.resolve(tr.mapping.map(selection.from));
126
+ const isEmptyTextblock = $from.parent.isTextblock && $from.parent.childCount === 0;
127
+ if (storedMarks != null || _browser.browser.safari && isEmptyTextblock) {
128
+ view.dispatch(view.state.tr.setMeta(_reactKeys.reactKeysPluginKey, {
129
+ cursorWrapper: (0, _ReactWidgetType.widget)(view.state.selection.from, _CursorWrapper.CursorWrapper, {
130
+ key: "cursor-wrapper",
131
+ ...storedMarks !== null && {
132
+ marks: storedMarks
133
+ },
134
+ side: 0,
135
+ raw: true
136
+ })
137
+ }));
138
+ // Pin the DOM cursor to PM's canonical position before the IME
139
+ // captures wherever the browser happened to leave it. Without this,
140
+ // a cursor at a mark boundary lands in either the left or right text
141
+ // node depending on the user's last navigation direction, and the
142
+ // IME composes into whichever one it found.
143
+ } else if (view.state.selection.empty && view.domSelection()) {
144
+ view.domObserver.disconnectSelection();
145
+ try {
146
+ view.docView.setSelection(view.state.selection.anchor, view.state.selection.head, view, true // force — skip the isEquivalentPosition early-return
147
+ );
148
+ } finally{
149
+ view.domObserver.setCurSelection();
150
+ view.domObserver.connectSelection();
151
+ }
152
+ }
153
+ const freezeFrom = view.state.selection.$from.before();
154
+ view.dispatch(view.state.tr.setMeta(_reactKeys.reactKeysPluginKey, {
155
+ freezeFrom
156
+ }));
157
+ const frozenDom = view.nodeDOM(freezeFrom);
158
+ if (!frozenDom) {
159
+ view.dispatch(view.state.tr.setMeta(_reactKeys.reactKeysPluginKey, {
160
+ cursorWrapper: null,
161
+ freezeFrom: null
162
+ }));
163
+ return false;
164
+ }
165
+ preCompositionSnapshot = view.state.doc.nodeAt(freezeFrom)?.content ?? null;
166
+ view.input.composing = true;
167
+ observer = new MutationObserver((records)=>{
168
+ if (_reactKeys.reactKeysPluginKey.getState(view.state)?.freezeFrom == null) {
169
+ return;
170
+ }
171
+ view.domObserver.queue.push(...records);
172
+ view.domObserver.flush();
173
+ syncCompositionViewDescs(view);
174
+ });
175
+ observer.observe(frozenDom, observeOptions);
176
+ return true;
177
+ },
178
+ compositionupdate () {
179
+ return true;
180
+ },
181
+ compositionend (view, event) {
182
+ if (!(view instanceof _ReactEditorView.ReactEditorView)) return false;
183
+ if (!view.composing) return false;
184
+ teardownCompositionAndUnfreeze(view, event);
185
+ return true;
186
+ },
187
+ contextmenu (view, event) {
188
+ if (!(view instanceof _ReactEditorView.ReactEditorView)) return false;
189
+ if (!view.composing) return false;
190
+ teardownCompositionAndUnfreeze(view, event);
191
+ return false;
192
+ },
193
+ mousedown (view, event) {
194
+ if (!(view instanceof _ReactEditorView.ReactEditorView)) return false;
195
+ if (!view.composing) return false;
196
+ teardownCompositionAndUnfreeze(view, event);
197
+ return false;
198
+ },
199
+ touchstart (view, event) {
200
+ if (!(view instanceof _ReactEditorView.ReactEditorView)) return false;
201
+ if (!view.composing) return false;
202
+ teardownCompositionAndUnfreeze(view, event);
203
+ return false;
204
+ },
205
+ beforeinput (view, event) {
206
+ if (event.inputType !== "insertFromComposition") {
207
+ event.preventDefault();
208
+ }
209
+ switch(event.inputType){
210
+ case "insertParagraph":
211
+ case "insertLineBreak":
212
+ {
213
+ // ProseMirror-view has a hack that runs the Enter event handlers
214
+ // on iOS, to avoid a bug in Safari with calling event.preventDefault() on
215
+ // Enter events.
216
+ //
217
+ // We want to prevent that hack, because we run the Enter event handlers
218
+ // here, where there is no such bug. So we set this flag, which prosemirror-view
219
+ // uses to check whether it should run the deferred event handlers.
220
+ view.input.lastIOSEnter = 0;
221
+ // Fire a synthetic keydown event to trigger ProseMirror's keymap
222
+ const keyEvent = new KeyboardEvent("keydown", {
223
+ bubbles: true,
224
+ cancelable: true,
225
+ key: "Enter",
226
+ code: "Enter",
227
+ keyCode: 13,
228
+ shiftKey: event.inputType === "insertLineBreak"
229
+ });
230
+ // Use someProp to directly call ProseMirror handlers
231
+ return view.someProp("handleKeyDown", (f)=>f(view, keyEvent)) ?? false;
232
+ }
233
+ case "insertReplacementText":
234
+ {
235
+ const ranges = event.getTargetRanges();
236
+ event.dataTransfer?.items[0]?.getAsString((data)=>{
237
+ for (const range of ranges){
238
+ const from = view.posAtDOM(range.startContainer, range.startOffset, 1);
239
+ const to = view.posAtDOM(range.endContainer, range.endOffset, 1);
240
+ insertText(view, data, {
241
+ from,
242
+ to
243
+ });
244
+ }
245
+ });
246
+ break;
247
+ }
248
+ case "insertText":
249
+ {
250
+ const ranges = event.getTargetRanges();
251
+ if (ranges.length === 0 || ranges.length === 1 && ranges[0] && ranges[0].collapsed) {
252
+ insertText(view, event.data);
253
+ } else {
254
+ for (const range of ranges){
255
+ const from = view.posAtDOM(range.startContainer, range.startOffset, 1);
256
+ const to = view.posAtDOM(range.endContainer, range.endOffset, 1);
257
+ insertText(view, event.data, {
258
+ from,
259
+ to
260
+ });
261
+ }
262
+ }
263
+ break;
264
+ }
265
+ case "deleteWordBackward":
266
+ case "deleteHardLineBackward":
267
+ case "deleteSoftLineBackward":
268
+ case "deleteContentBackward":
269
+ case "deleteWordForward":
270
+ case "deleteHardLineForward":
271
+ case "deleteSoftLineForward":
272
+ case "deleteContentForward":
273
+ case "deleteContent":
274
+ {
275
+ const targetRanges = event.getTargetRanges();
276
+ const { tr } = view.state;
277
+ for (const range of targetRanges){
278
+ const start = view.posAtDOM(range.startContainer, range.startOffset);
279
+ const end = view.posAtDOM(range.endContainer, range.endOffset);
280
+ const { doc } = view.state;
281
+ const marks = doc.resolve(start).marksAcross(doc.resolve(end));
282
+ tr.delete(start, end);
283
+ if (marks) {
284
+ tr.ensureMarks(marks);
285
+ }
286
+ }
287
+ view.dispatch(tr);
288
+ break;
289
+ }
290
+ default:
291
+ {
292
+ break;
293
+ }
294
+ }
295
+ return true;
296
+ }
297
+ }
298
+ }
299
+ });
300
+ }
301
+ function syncCompositionViewDescs(view) {
302
+ const compositionNode = view.domObserver.lastChangedTextNode;
303
+ if (!compositionNode) return;
304
+ const freezeFrom = _reactKeys.reactKeysPluginKey.getState(view.state)?.freezeFrom;
305
+ if (freezeFrom == null) return;
306
+ const compositionBlock = view.state.doc.nodeAt(freezeFrom);
307
+ if (!compositionBlock) return;
308
+ const compositionBlockDesc = view.docView.descAt(freezeFrom);
309
+ if (!compositionBlockDesc) return;
310
+ const desc = view.docView.nearestDesc(compositionNode);
311
+ compositionBlockDesc.node = compositionBlock;
312
+ if (desc instanceof _viewdesc.TextViewDesc) {
313
+ if (compositionNode.nodeValue && desc.node.text !== compositionNode.nodeValue) {
314
+ desc.node = view.state.schema.text(compositionNode.nodeValue, desc.node.marks);
315
+ desc.nodeDOM = compositionNode;
316
+ compositionNode.pmViewDesc = desc;
317
+ }
318
+ return;
319
+ }
320
+ if (desc instanceof _viewdesc.CompositionViewDesc) {
321
+ if (compositionNode.nodeValue != null && desc.text !== compositionNode.nodeValue) {
322
+ desc.dom = compositionNode;
323
+ desc.textDOM = compositionNode;
324
+ desc.text = compositionNode.nodeValue;
325
+ compositionNode.pmViewDesc = desc;
326
+ }
327
+ return;
328
+ }
329
+ const parentDesc = desc?.contentDOM ? desc : compositionBlockDesc;
330
+ const children = parentDesc.children;
331
+ // Drop any text or composition desc in this container whose DOM the
332
+ // IME has detached. This covers two cases: a TextViewDesc the IME subsumed
333
+ // into the composition node, and (on Safari, which replaces the whole text
334
+ // node on each composition update) any orphaned composition view
335
+ // desc(s) left over from the previous composition steps.
336
+ for(let i = children.length - 1; i >= 0; i--){
337
+ const c = children[i];
338
+ if (!(c instanceof _viewdesc.TextViewDesc) && !(c instanceof _viewdesc.CompositionViewDesc)) {
339
+ continue;
340
+ }
341
+ const dom = c.dom;
342
+ if (view.dom.contains(dom)) continue;
343
+ children.splice(i, 1);
344
+ }
345
+ const contentStart = freezeFrom + 1;
346
+ const { from, to } = view.state.selection;
347
+ const textPos = (0, _viewdesc.findTextInFragment)(compositionBlock.content, compositionNode.nodeValue ?? "", from - contentStart, to - contentStart);
348
+ if (textPos < 0) return;
349
+ const startPos = contentStart + textPos;
350
+ let topDOM = compositionNode;
351
+ while(topDOM.parentNode && topDOM.parentNode !== parentDesc.contentDOM){
352
+ topDOM = topDOM.parentNode;
353
+ }
354
+ const insertIndex = children.findLastIndex((c)=>c.posBefore <= startPos) + 1;
355
+ children.splice(insertIndex, 0, new _viewdesc.CompositionViewDesc(parentDesc, ()=>startPos, topDOM, compositionNode, compositionNode.nodeValue ?? ""));
356
+ }
@@ -0,0 +1,121 @@
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
+ createNodeKey: function() {
13
+ return createNodeKey;
14
+ },
15
+ reactKeys: function() {
16
+ return reactKeys;
17
+ },
18
+ reactKeysPluginKey: function() {
19
+ return reactKeysPluginKey;
20
+ }
21
+ });
22
+ const _prosemirrorstate = require("prosemirror-state");
23
+ const _prosemirrortransform = require("prosemirror-transform");
24
+ const _prosemirrorview = require("prosemirror-view");
25
+ const _ReactWidgetType = require("../decorations/ReactWidgetType.js");
26
+ // These steps keep every node's size, so no node moves, appears or
27
+ // disappears. Mark steps are not among them: they can split text nodes,
28
+ // which then need keys.
29
+ const keepsNodePositions = (step)=>step instanceof _prosemirrortransform.AttrStep || step instanceof _prosemirrortransform.DocAttrStep || step instanceof _prosemirrortransform.AddNodeMarkStep || step instanceof _prosemirrortransform.RemoveNodeMarkStep;
30
+ function createNodeKey() {
31
+ const key = Math.floor(Math.random() * 0xffffffffffff).toString(16);
32
+ return key;
33
+ }
34
+ const reactKeysPluginKey = new _prosemirrorstate.PluginKey("@handlewithcare/react-prosemirror/reactKeys");
35
+ function reactKeys() {
36
+ return new _prosemirrorstate.Plugin({
37
+ key: reactKeysPluginKey,
38
+ state: {
39
+ init (_, state) {
40
+ const next = {
41
+ posToKey: new Map(),
42
+ keyToPos: new Map(),
43
+ cursorWrapper: null,
44
+ freezeFrom: null
45
+ };
46
+ state.doc.descendants((_, pos)=>{
47
+ const key = createNodeKey();
48
+ next.posToKey.set(pos, key);
49
+ next.keyToPos.set(key, pos);
50
+ return true;
51
+ });
52
+ return next;
53
+ },
54
+ /**
55
+ * Keeps node keys stable across transactions.
56
+ *
57
+ * To accomplish this, we map each node position forwards
58
+ * through the transaction to identify its current position,
59
+ * and assign its key to that new position, dropping it if the
60
+ * node was deleted.
61
+ */ apply (tr, value, oldState, newState) {
62
+ const meta = tr.getMeta(reactKeysPluginKey);
63
+ const overrides = meta && "overrides" in meta ? meta.overrides : {};
64
+ const cursorWrapper = meta && "cursorWrapper" in meta ? meta.cursorWrapper : undefined;
65
+ const freezeFrom = meta && "freezeFrom" in meta ? meta.freezeFrom : undefined;
66
+ const next = {
67
+ posToKey: new Map(),
68
+ keyToPos: new Map(),
69
+ cursorWrapper: cursorWrapper === undefined ? value.cursorWrapper ? (0, _ReactWidgetType.widget)(tr.mapping.map(value.cursorWrapper.from, -1), value.cursorWrapper.type.Component, value.cursorWrapper.spec) : null : cursorWrapper,
70
+ freezeFrom: freezeFrom === undefined ? value.freezeFrom !== null ? tr.mapping.map(value.freezeFrom, -1) : null : freezeFrom
71
+ };
72
+ if (value.freezeFrom !== null && next.freezeFrom !== null && tr.getMeta("composition") == null) {
73
+ const oldBlock = oldState.doc.nodeAt(value.freezeFrom);
74
+ const newBlock = newState.doc.nodeAt(next.freezeFrom);
75
+ if (newBlock && !oldBlock?.eq(newBlock)) {
76
+ next.freezeFrom = null;
77
+ next.cursorWrapper = null;
78
+ }
79
+ }
80
+ if (!tr.docChanged || !meta?.overrides && tr.steps.every(keepsNodePositions)) {
81
+ return {
82
+ ...value,
83
+ cursorWrapper: next.cursorWrapper,
84
+ freezeFrom: next.freezeFrom
85
+ };
86
+ }
87
+ const posToKeyEntries = Array.from(value.posToKey.entries()).sort((param, param1)=>{
88
+ let [a] = param, [b] = param1;
89
+ return a - b;
90
+ });
91
+ for (const [pos, key] of posToKeyEntries){
92
+ const override = overrides?.[pos];
93
+ const { pos: newPos, deleted } = override === undefined ? tr.mapping.mapResult(pos) : {
94
+ pos: override,
95
+ deleted: false
96
+ };
97
+ if (deleted) continue;
98
+ next.posToKey.set(newPos, key);
99
+ next.keyToPos.set(key, newPos);
100
+ }
101
+ newState.doc.descendants((_, pos)=>{
102
+ if (next.posToKey.has(pos)) return true;
103
+ const key = createNodeKey();
104
+ next.posToKey.set(pos, key);
105
+ next.keyToPos.set(key, pos);
106
+ return true;
107
+ });
108
+ return next;
109
+ }
110
+ },
111
+ props: {
112
+ decorations (state) {
113
+ const deco = reactKeysPluginKey.getState(state)?.cursorWrapper;
114
+ if (!deco) return _prosemirrorview.DecorationSet.empty;
115
+ return _prosemirrorview.DecorationSet.create(state.doc, [
116
+ deco
117
+ ]);
118
+ }
119
+ }
120
+ });
121
+ }