@tiptap/core 2.0.0-beta.22 → 2.0.0-beta.220

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 (344) hide show
  1. package/README.md +2 -2
  2. package/dist/index.cjs +4354 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.js +4264 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.umd.js +4352 -0
  7. package/dist/index.umd.js.map +1 -0
  8. package/dist/packages/core/src/CommandManager.d.ts +14 -7
  9. package/dist/packages/core/src/Editor.d.ts +27 -22
  10. package/dist/packages/core/src/EventEmitter.d.ts +8 -4
  11. package/dist/packages/core/src/Extension.d.ts +93 -21
  12. package/dist/packages/core/src/ExtensionManager.d.ts +8 -14
  13. package/dist/packages/core/src/InputRule.d.ts +42 -0
  14. package/dist/packages/core/src/Mark.d.ts +132 -24
  15. package/dist/packages/core/src/Node.d.ts +150 -26
  16. package/dist/packages/core/src/NodeView.d.ts +11 -15
  17. package/dist/packages/core/src/PasteRule.d.ts +42 -0
  18. package/dist/packages/core/src/Tracker.d.ts +11 -0
  19. package/dist/packages/core/src/commands/blur.d.ts +3 -3
  20. package/dist/packages/core/src/commands/clearContent.d.ts +3 -3
  21. package/dist/packages/core/src/commands/clearNodes.d.ts +3 -3
  22. package/dist/packages/core/src/commands/command.d.ts +2 -2
  23. package/dist/packages/core/src/commands/createParagraphNear.d.ts +3 -3
  24. package/dist/packages/core/src/commands/deleteCurrentNode.d.ts +12 -0
  25. package/dist/packages/core/src/commands/deleteNode.d.ts +13 -0
  26. package/dist/packages/core/src/commands/deleteRange.d.ts +3 -3
  27. package/dist/packages/core/src/commands/deleteSelection.d.ts +3 -3
  28. package/dist/packages/core/src/commands/enter.d.ts +3 -3
  29. package/dist/packages/core/src/commands/exitCode.d.ts +3 -3
  30. package/dist/packages/core/src/commands/extendMarkRange.d.ts +4 -4
  31. package/dist/packages/core/src/commands/first.d.ts +3 -3
  32. package/dist/packages/core/src/commands/focus.d.ts +5 -3
  33. package/dist/packages/core/src/commands/forEach.d.ts +14 -0
  34. package/dist/packages/core/src/commands/index.d.ts +50 -0
  35. package/dist/packages/core/src/commands/insertContent.d.ts +7 -3
  36. package/dist/packages/core/src/commands/insertContentAt.d.ts +16 -0
  37. package/dist/packages/core/src/commands/join.d.ts +33 -0
  38. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +3 -3
  39. package/dist/packages/core/src/commands/lift.d.ts +4 -4
  40. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +3 -3
  41. package/dist/packages/core/src/commands/liftListItem.d.ts +4 -4
  42. package/dist/packages/core/src/commands/newlineInCode.d.ts +3 -3
  43. package/dist/packages/core/src/commands/resetAttributes.d.ts +4 -4
  44. package/dist/packages/core/src/commands/scrollIntoView.d.ts +3 -3
  45. package/dist/packages/core/src/commands/selectAll.d.ts +3 -3
  46. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +3 -3
  47. package/dist/packages/core/src/commands/selectNodeForward.d.ts +3 -3
  48. package/dist/packages/core/src/commands/selectParentNode.d.ts +3 -3
  49. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +12 -0
  50. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +12 -0
  51. package/dist/packages/core/src/commands/setContent.d.ts +4 -3
  52. package/dist/packages/core/src/commands/setMark.d.ts +4 -4
  53. package/dist/packages/core/src/commands/setMeta.d.ts +12 -0
  54. package/dist/packages/core/src/commands/setNode.d.ts +4 -4
  55. package/dist/packages/core/src/commands/setNodeSelection.d.ts +12 -0
  56. package/dist/packages/core/src/commands/setTextSelection.d.ts +12 -0
  57. package/dist/packages/core/src/commands/sinkListItem.d.ts +4 -4
  58. package/dist/packages/core/src/commands/splitBlock.d.ts +3 -3
  59. package/dist/packages/core/src/commands/splitListItem.d.ts +4 -4
  60. package/dist/packages/core/src/commands/toggleList.d.ts +4 -4
  61. package/dist/packages/core/src/commands/toggleMark.d.ts +9 -4
  62. package/dist/packages/core/src/commands/toggleNode.d.ts +4 -4
  63. package/dist/packages/core/src/commands/toggleWrap.d.ts +4 -4
  64. package/dist/packages/core/src/commands/undoInputRule.d.ts +3 -3
  65. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +3 -3
  66. package/dist/packages/core/src/commands/unsetMark.d.ts +9 -4
  67. package/dist/packages/core/src/commands/updateAttributes.d.ts +4 -4
  68. package/dist/packages/core/src/commands/wrapIn.d.ts +4 -4
  69. package/dist/packages/core/src/commands/wrapInList.d.ts +4 -4
  70. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  71. package/dist/packages/core/src/extensions/commands.d.ts +2 -99
  72. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  73. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  74. package/dist/packages/core/src/extensions/index.d.ts +1 -0
  75. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  76. package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
  77. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +7 -0
  78. package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
  79. package/dist/packages/core/src/helpers/createDocument.d.ts +3 -4
  80. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +4 -5
  81. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
  82. package/dist/packages/core/src/helpers/findChildren.d.ts +3 -8
  83. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +6 -0
  84. package/dist/packages/core/src/helpers/findParentNode.d.ts +3 -4
  85. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +3 -3
  86. package/dist/packages/core/src/helpers/generateHTML.d.ts +2 -2
  87. package/dist/packages/core/src/helpers/generateJSON.d.ts +2 -0
  88. package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
  89. package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -0
  90. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +2 -2
  91. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +11 -0
  92. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +8 -0
  93. package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -0
  94. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
  95. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +3 -4
  96. package/dist/packages/core/src/helpers/getMarkRange.d.ts +2 -2
  97. package/dist/packages/core/src/helpers/getMarkType.d.ts +2 -2
  98. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +2 -2
  99. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +3 -4
  100. package/dist/packages/core/src/helpers/getNodeType.d.ts +2 -2
  101. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +3 -3
  102. package/dist/packages/core/src/helpers/getSchema.d.ts +2 -2
  103. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +3 -0
  104. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +2 -2
  105. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +2 -2
  106. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +2 -2
  107. package/dist/packages/core/src/helpers/getText.d.ts +6 -0
  108. package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
  109. package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +2 -0
  110. package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +3 -0
  111. package/dist/packages/core/src/helpers/index.d.ts +47 -0
  112. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +2 -2
  113. package/dist/packages/core/src/helpers/isActive.d.ts +2 -3
  114. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  115. package/dist/packages/core/src/helpers/isList.d.ts +1 -1
  116. package/dist/packages/core/src/helpers/isMarkActive.d.ts +3 -4
  117. package/dist/packages/core/src/helpers/isNodeActive.d.ts +3 -4
  118. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +2 -2
  119. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +2 -2
  120. package/dist/packages/core/src/helpers/isTextSelection.d.ts +2 -2
  121. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -0
  122. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +4 -0
  123. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +2 -2
  124. package/dist/packages/core/src/helpers/splitExtensions.d.ts +6 -6
  125. package/dist/packages/core/src/index.d.ts +14 -23
  126. package/dist/packages/core/src/inputRules/index.d.ts +5 -0
  127. package/dist/packages/core/src/inputRules/markInputRule.d.ts +12 -3
  128. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +12 -3
  129. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  130. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  131. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +27 -0
  132. package/dist/packages/core/src/pasteRules/index.d.ts +3 -0
  133. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +12 -3
  134. package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +12 -0
  135. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
  136. package/dist/packages/core/src/style.d.ts +1 -2
  137. package/dist/packages/core/src/types.d.ts +122 -62
  138. package/dist/packages/core/src/utilities/callOrReturn.d.ts +2 -1
  139. package/dist/packages/core/src/utilities/createStyleTag.d.ts +1 -1
  140. package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -2
  141. package/dist/packages/core/src/utilities/elementFromString.d.ts +1 -1
  142. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +1 -0
  143. package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
  144. package/dist/packages/core/src/utilities/fromString.d.ts +1 -1
  145. package/dist/packages/core/src/utilities/index.d.ts +20 -0
  146. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  147. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  148. package/dist/packages/core/src/utilities/isMacOS.d.ts +1 -0
  149. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  150. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  151. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  152. package/dist/packages/core/src/utilities/isString.d.ts +1 -0
  153. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -0
  154. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -2
  155. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -2
  156. package/dist/packages/core/src/utilities/minMax.d.ts +1 -1
  157. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -2
  158. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +8 -0
  159. package/package.json +29 -24
  160. package/src/CommandManager.ts +76 -86
  161. package/src/Editor.ts +121 -79
  162. package/src/EventEmitter.ts +14 -4
  163. package/src/Extension.ts +276 -112
  164. package/src/ExtensionManager.ts +252 -110
  165. package/src/InputRule.ts +260 -0
  166. package/src/Mark.ts +394 -152
  167. package/src/Node.ts +433 -176
  168. package/src/NodeView.ts +144 -67
  169. package/src/PasteRule.ts +240 -0
  170. package/src/Tracker.ts +38 -0
  171. package/src/commands/blur.ts +12 -6
  172. package/src/commands/clearContent.ts +3 -3
  173. package/src/commands/clearNodes.ts +31 -19
  174. package/src/commands/command.ts +2 -2
  175. package/src/commands/createParagraphNear.ts +5 -4
  176. package/src/commands/deleteCurrentNode.ts +41 -0
  177. package/src/commands/deleteNode.ts +37 -0
  178. package/src/commands/deleteRange.ts +3 -3
  179. package/src/commands/deleteSelection.ts +5 -4
  180. package/src/commands/enter.ts +3 -3
  181. package/src/commands/exitCode.ts +5 -4
  182. package/src/commands/extendMarkRange.ts +16 -12
  183. package/src/commands/first.ts +3 -3
  184. package/src/commands/focus.ts +47 -44
  185. package/src/commands/forEach.ts +24 -0
  186. package/src/commands/index.ts +50 -0
  187. package/src/commands/insertContent.ts +17 -24
  188. package/src/commands/insertContentAt.ts +102 -0
  189. package/src/commands/join.ts +53 -0
  190. package/src/commands/keyboardShortcut.ts +6 -6
  191. package/src/commands/lift.ts +8 -7
  192. package/src/commands/liftEmptyBlock.ts +5 -4
  193. package/src/commands/liftListItem.ts +7 -6
  194. package/src/commands/newlineInCode.ts +5 -4
  195. package/src/commands/resetAttributes.ts +18 -12
  196. package/src/commands/scrollIntoView.ts +3 -3
  197. package/src/commands/selectAll.ts +8 -6
  198. package/src/commands/selectNodeBackward.ts +5 -4
  199. package/src/commands/selectNodeForward.ts +5 -4
  200. package/src/commands/selectParentNode.ts +5 -4
  201. package/src/commands/selectTextblockEnd.ts +20 -0
  202. package/src/commands/selectTextblockStart.ts +20 -0
  203. package/src/commands/setContent.ts +9 -16
  204. package/src/commands/setMark.ts +90 -14
  205. package/src/commands/setMeta.ts +18 -0
  206. package/src/commands/setNode.ts +32 -8
  207. package/src/commands/setNodeSelection.ts +27 -0
  208. package/src/commands/setTextSelection.ts +31 -0
  209. package/src/commands/sinkListItem.ts +7 -6
  210. package/src/commands/splitBlock.ts +31 -41
  211. package/src/commands/splitListItem.ts +58 -29
  212. package/src/commands/toggleList.ts +109 -20
  213. package/src/commands/toggleMark.ts +19 -8
  214. package/src/commands/toggleNode.ts +11 -6
  215. package/src/commands/toggleWrap.ts +10 -10
  216. package/src/commands/undoInputRule.ts +34 -5
  217. package/src/commands/unsetAllMarks.ts +7 -11
  218. package/src/commands/unsetMark.ts +36 -23
  219. package/src/commands/updateAttributes.ts +27 -15
  220. package/src/commands/wrapIn.ts +7 -12
  221. package/src/commands/wrapInList.ts +7 -6
  222. package/src/extensions/clipboardTextSerializer.ts +15 -36
  223. package/src/extensions/commands.ts +3 -147
  224. package/src/extensions/editable.ts +2 -1
  225. package/src/extensions/focusEvents.ts +4 -6
  226. package/src/extensions/index.ts +1 -0
  227. package/src/extensions/keymap.ts +106 -13
  228. package/src/extensions/tabindex.ts +18 -0
  229. package/src/helpers/combineTransactionSteps.ts +21 -0
  230. package/src/helpers/createChainableState.ts +38 -0
  231. package/src/helpers/createDocument.ts +5 -6
  232. package/src/helpers/createNodeFromContent.ts +20 -28
  233. package/src/helpers/defaultBlockAt.ts +13 -0
  234. package/src/helpers/findChildren.ts +3 -7
  235. package/src/helpers/findChildrenInRange.ts +36 -0
  236. package/src/helpers/findParentNode.ts +4 -3
  237. package/src/helpers/findParentNodeClosestToPos.ts +13 -7
  238. package/src/helpers/generateHTML.ts +7 -6
  239. package/src/helpers/generateJSON.ts +12 -0
  240. package/src/helpers/generateText.ts +27 -0
  241. package/src/helpers/getAttributes.ts +26 -0
  242. package/src/helpers/getAttributesFromExtensions.ts +42 -14
  243. package/src/helpers/getChangedRanges.ts +83 -0
  244. package/src/helpers/getDebugJSON.ts +54 -0
  245. package/src/helpers/getExtensionField.ts +25 -0
  246. package/src/helpers/getHTMLFromFragment.ts +5 -6
  247. package/src/helpers/getMarkAttributes.ts +18 -11
  248. package/src/helpers/getMarkRange.ts +41 -8
  249. package/src/helpers/getMarkType.ts +8 -2
  250. package/src/helpers/getMarksBetween.ts +34 -10
  251. package/src/helpers/getNodeAttributes.ts +14 -13
  252. package/src/helpers/getNodeType.ts +8 -2
  253. package/src/helpers/getRenderedAttributes.ts +9 -7
  254. package/src/helpers/getSchema.ts +7 -133
  255. package/src/helpers/getSchemaByResolvedExtensions.ts +192 -0
  256. package/src/helpers/getSchemaTypeByName.ts +3 -11
  257. package/src/helpers/getSchemaTypeNameByName.ts +2 -2
  258. package/src/helpers/getSplittedAttributes.ts +4 -4
  259. package/src/helpers/getText.ts +19 -0
  260. package/src/helpers/getTextBetween.ts +46 -0
  261. package/src/helpers/getTextContentFromNodes.ts +26 -0
  262. package/src/helpers/getTextSerializersFromSchema.ts +11 -0
  263. package/src/helpers/index.ts +47 -0
  264. package/src/helpers/injectExtensionAttributesToParseRule.ts +22 -23
  265. package/src/helpers/isActive.ts +10 -6
  266. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  267. package/src/helpers/isList.ts +14 -7
  268. package/src/helpers/isMarkActive.ts +49 -27
  269. package/src/helpers/isNodeActive.ts +29 -39
  270. package/src/helpers/isNodeEmpty.ts +2 -2
  271. package/src/helpers/isNodeSelection.ts +3 -4
  272. package/src/helpers/isTextSelection.ts +3 -4
  273. package/src/helpers/posToDOMRect.ts +35 -0
  274. package/src/helpers/resolveFocusPosition.ts +42 -0
  275. package/src/helpers/selectionToInsertionEnd.ts +3 -3
  276. package/src/helpers/splitExtensions.ts +3 -3
  277. package/src/index.ts +15 -26
  278. package/src/inputRules/index.ts +5 -0
  279. package/src/inputRules/markInputRule.ts +59 -40
  280. package/src/inputRules/nodeInputRule.ts +45 -12
  281. package/src/inputRules/textInputRule.ts +35 -0
  282. package/src/inputRules/textblockTypeInputRule.ts +37 -0
  283. package/src/inputRules/wrappingInputRule.ts +84 -0
  284. package/src/pasteRules/index.ts +3 -0
  285. package/src/pasteRules/markPasteRule.ts +61 -53
  286. package/src/pasteRules/nodePasteRule.ts +37 -0
  287. package/src/pasteRules/textPasteRule.ts +35 -0
  288. package/src/style.ts +16 -3
  289. package/src/types.ts +175 -97
  290. package/src/utilities/callOrReturn.ts +6 -3
  291. package/src/utilities/createStyleTag.ts +12 -1
  292. package/src/utilities/deleteProps.ts +2 -4
  293. package/src/utilities/elementFromString.ts +4 -5
  294. package/src/utilities/escapeForRegEx.ts +4 -0
  295. package/src/utilities/findDuplicates.ts +5 -0
  296. package/src/utilities/fromString.ts +2 -2
  297. package/src/utilities/index.ts +20 -0
  298. package/src/utilities/isEmptyObject.ts +2 -2
  299. package/src/utilities/isFunction.ts +3 -0
  300. package/src/utilities/isMacOS.ts +5 -0
  301. package/src/utilities/isNumber.ts +3 -0
  302. package/src/utilities/isPlainObject.ts +8 -5
  303. package/src/utilities/isRegExp.ts +3 -0
  304. package/src/utilities/isString.ts +3 -0
  305. package/src/utilities/isiOS.ts +12 -0
  306. package/src/utilities/mergeAttributes.ts +2 -3
  307. package/src/utilities/mergeDeep.ts +2 -3
  308. package/src/utilities/minMax.ts +1 -1
  309. package/src/utilities/objectIncludes.ts +17 -5
  310. package/src/utilities/removeDuplicates.ts +15 -0
  311. package/CHANGELOG.md +0 -373
  312. package/LICENSE.md +0 -21
  313. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  314. package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
  315. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  316. package/dist/packages/core/src/commands/joinBackward.d.ts +0 -12
  317. package/dist/packages/core/src/commands/joinForward.d.ts +0 -12
  318. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  319. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  320. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  321. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  322. package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
  323. package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
  324. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  325. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  326. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  327. package/dist/tiptap-core.cjs.js +0 -3048
  328. package/dist/tiptap-core.cjs.js.map +0 -1
  329. package/dist/tiptap-core.esm.js +0 -3021
  330. package/dist/tiptap-core.esm.js.map +0 -1
  331. package/dist/tiptap-core.umd.js +0 -3045
  332. package/dist/tiptap-core.umd.js.map +0 -1
  333. package/src/commands/insertHTML.ts +0 -30
  334. package/src/commands/insertNode.ts +0 -33
  335. package/src/commands/insertText.ts +0 -22
  336. package/src/commands/joinBackward.ts +0 -17
  337. package/src/commands/joinForward.ts +0 -17
  338. package/src/commands/replace.ts +0 -20
  339. package/src/commands/replaceRange.ts +0 -36
  340. package/src/commands/resetNodeAttributes.ts +0 -33
  341. package/src/commands/updateNodeAttributes.ts +0 -35
  342. package/src/utilities/isClass.ts +0 -7
  343. package/src/utilities/isObject.ts +0 -10
  344. package/src/utilities/removeElement.ts +0 -5
package/src/NodeView.ts CHANGED
@@ -1,43 +1,44 @@
1
- import { Decoration, NodeView as ProseMirrorNodeView } from 'prosemirror-view'
2
- import { NodeSelection } from 'prosemirror-state'
3
- import { Node as ProseMirrorNode } from 'prosemirror-model'
1
+ import { Node as ProseMirrorNode } from '@tiptap/pm/model'
2
+ import { NodeSelection } from '@tiptap/pm/state'
3
+ import { NodeView as ProseMirrorNodeView } from '@tiptap/pm/view'
4
+
4
5
  import { Editor as CoreEditor } from './Editor'
5
6
  import { Node } from './Node'
6
- import { NodeViewRendererProps } from './types'
7
-
8
- interface NodeViewRendererOptions {
9
- stopEvent: ((event: Event) => boolean) | null,
10
- update: ((node: ProseMirrorNode, decorations: Decoration[]) => boolean) | null,
11
- }
12
-
13
- export class NodeView<Component, Editor extends CoreEditor = CoreEditor> implements ProseMirrorNodeView {
14
-
7
+ import { DecorationWithType, NodeViewRendererOptions, NodeViewRendererProps } from './types'
8
+ import { isiOS } from './utilities/isiOS'
9
+
10
+ export class NodeView<
11
+ Component,
12
+ NodeEditor extends CoreEditor = CoreEditor,
13
+ Options extends NodeViewRendererOptions = NodeViewRendererOptions,
14
+ > implements ProseMirrorNodeView {
15
15
  component: Component
16
16
 
17
- editor: Editor
17
+ editor: NodeEditor
18
+
19
+ options: Options
18
20
 
19
21
  extension: Node
20
22
 
21
23
  node: ProseMirrorNode
22
24
 
23
- decorations: Decoration[]
25
+ decorations: DecorationWithType[]
24
26
 
25
27
  getPos: any
26
28
 
27
29
  isDragging = false
28
30
 
29
- options: NodeViewRendererOptions = {
30
- stopEvent: null,
31
- update: null,
32
- }
33
-
34
- constructor(component: Component, props: NodeViewRendererProps, options?: Partial<NodeViewRendererOptions>) {
31
+ constructor(component: Component, props: NodeViewRendererProps, options?: Partial<Options>) {
35
32
  this.component = component
36
- this.options = { ...this.options, ...options }
37
- this.editor = props.editor as Editor
33
+ this.editor = props.editor as NodeEditor
34
+ this.options = {
35
+ stopEvent: null,
36
+ ignoreMutation: null,
37
+ ...options,
38
+ } as Options
38
39
  this.extension = props.extension
39
40
  this.node = props.node
40
- this.decorations = props.decorations
41
+ this.decorations = props.decorations as DecorationWithType[]
41
42
  this.getPos = props.getPos
42
43
  this.mount()
43
44
  }
@@ -47,29 +48,48 @@ export class NodeView<Component, Editor extends CoreEditor = CoreEditor> impleme
47
48
  return
48
49
  }
49
50
 
50
- get dom(): Element | null {
51
- return null
51
+ get dom(): HTMLElement {
52
+ return this.editor.view.dom as HTMLElement
52
53
  }
53
54
 
54
- get contentDOM(): Element | null {
55
+ get contentDOM(): HTMLElement | null {
55
56
  return null
56
57
  }
57
58
 
58
59
  onDragStart(event: DragEvent) {
59
- if (!this.dom) {
60
+ const { view } = this.editor
61
+ const target = event.target as HTMLElement
62
+
63
+ // get the drag handle element
64
+ // `closest` is not available for text nodes so we may have to use its parent
65
+ const dragHandle = target.nodeType === 3
66
+ ? target.parentElement?.closest('[data-drag-handle]')
67
+ : target.closest('[data-drag-handle]')
68
+
69
+ if (!this.dom || this.contentDOM?.contains(target) || !dragHandle) {
60
70
  return
61
71
  }
62
72
 
63
- const { view } = this.editor
64
- const target = (event.target as HTMLElement)
73
+ let x = 0
74
+ let y = 0
65
75
 
66
- if (this.contentDOM?.contains(target)) {
67
- return
76
+ // calculate offset for drag element if we use a different drag handle element
77
+ if (this.dom !== dragHandle) {
78
+ const domBox = this.dom.getBoundingClientRect()
79
+ const handleBox = dragHandle.getBoundingClientRect()
80
+
81
+ // In React, we have to go through nativeEvent to reach offsetX/offsetY.
82
+ const offsetX = event.offsetX ?? (event as any).nativeEvent?.offsetX
83
+ const offsetY = event.offsetY ?? (event as any).nativeEvent?.offsetY
84
+
85
+ x = handleBox.x - domBox.x + offsetX
86
+ y = handleBox.y - domBox.y + offsetY
68
87
  }
69
88
 
70
- // sometimes `event.target` is not the `dom` element
71
- event.dataTransfer?.setDragImage(this.dom, 0, 0)
89
+ event.dataTransfer?.setDragImage(this.dom, x, y)
72
90
 
91
+ // we need to tell ProseMirror that we want to move the whole node
92
+ // so we create a NodeSelection
73
93
  const selection = NodeSelection.create(view.state.doc, this.getPos())
74
94
  const transaction = view.state.tr.setSelection(selection)
75
95
 
@@ -82,10 +102,10 @@ export class NodeView<Component, Editor extends CoreEditor = CoreEditor> impleme
82
102
  }
83
103
 
84
104
  if (typeof this.options.stopEvent === 'function') {
85
- return this.options.stopEvent(event)
105
+ return this.options.stopEvent({ event })
86
106
  }
87
107
 
88
- const target = (event.target as HTMLElement)
108
+ const target = event.target as HTMLElement
89
109
  const isInElement = this.dom.contains(target) && !this.contentDOM?.contains(target)
90
110
 
91
111
  // any event from child nodes should be handled by ProseMirror
@@ -93,11 +113,12 @@ export class NodeView<Component, Editor extends CoreEditor = CoreEditor> impleme
93
113
  return false
94
114
  }
95
115
 
96
- const isInput = ['INPUT', 'BUTTON', 'SELECT', 'TEXTAREA'].includes(target.tagName)
97
- || target.isContentEditable
116
+ const isDragEvent = event.type.startsWith('drag')
117
+ const isDropEvent = event.type === 'drop'
118
+ const isInput = ['INPUT', 'BUTTON', 'SELECT', 'TEXTAREA'].includes(target.tagName) || target.isContentEditable
98
119
 
99
120
  // any input event within node views should be ignored by ProseMirror
100
- if (isInput) {
121
+ if (isInput && !isDropEvent && !isDragEvent) {
101
122
  return true
102
123
  }
103
124
 
@@ -109,7 +130,6 @@ export class NodeView<Component, Editor extends CoreEditor = CoreEditor> impleme
109
130
  const isPasteEvent = event.type === 'paste'
110
131
  const isCutEvent = event.type === 'cut'
111
132
  const isClickEvent = event.type === 'mousedown'
112
- const isDragEvent = event.type.startsWith('drag') || event.type === 'drop'
113
133
 
114
134
  // ProseMirror tries to drag selectable nodes
115
135
  // even if `draggable` is set to `false`
@@ -126,25 +146,41 @@ export class NodeView<Component, Editor extends CoreEditor = CoreEditor> impleme
126
146
  // we have to store that dragging started
127
147
  if (isDraggable && isEditable && !isDragging && isClickEvent) {
128
148
  const dragHandle = target.closest('[data-drag-handle]')
129
- const isValidDragHandle = dragHandle
130
- && (this.dom === dragHandle || (this.dom.contains(dragHandle)))
149
+ const isValidDragHandle = dragHandle && (this.dom === dragHandle || this.dom.contains(dragHandle))
131
150
 
132
151
  if (isValidDragHandle) {
133
152
  this.isDragging = true
134
153
 
135
- document.addEventListener('dragend', () => {
136
- this.isDragging = false
137
- }, { once: true })
138
-
139
- document.addEventListener('mouseup', () => {
140
- this.isDragging = false
141
- }, { once: true })
154
+ document.addEventListener(
155
+ 'dragend',
156
+ () => {
157
+ this.isDragging = false
158
+ },
159
+ { once: true },
160
+ )
161
+
162
+ document.addEventListener(
163
+ 'drop',
164
+ () => {
165
+ this.isDragging = false
166
+ },
167
+ { once: true },
168
+ )
169
+
170
+ document.addEventListener(
171
+ 'mouseup',
172
+ () => {
173
+ this.isDragging = false
174
+ },
175
+ { once: true },
176
+ )
142
177
  }
143
178
  }
144
179
 
145
180
  // these events are handled by prosemirror
146
181
  if (
147
182
  isDragging
183
+ || isDropEvent
148
184
  || isCopyEvent
149
185
  || isPasteEvent
150
186
  || isCutEvent
@@ -156,38 +192,79 @@ export class NodeView<Component, Editor extends CoreEditor = CoreEditor> impleme
156
192
  return true
157
193
  }
158
194
 
159
- ignoreMutation(mutation: MutationRecord | { type: 'selection', target: Element }) {
160
- if (mutation.type === 'selection') {
161
- if (this.node.isLeaf) {
162
- return true
163
- }
195
+ ignoreMutation(mutation: MutationRecord | { type: 'selection'; target: Element }) {
196
+ if (!this.dom || !this.contentDOM) {
197
+ return true
198
+ }
164
199
 
200
+ if (typeof this.options.ignoreMutation === 'function') {
201
+ return this.options.ignoreMutation({ mutation })
202
+ }
203
+
204
+ // a leaf/atom node is like a black box for ProseMirror
205
+ // and should be fully handled by the node view
206
+ if (this.node.isLeaf || this.node.isAtom) {
207
+ return true
208
+ }
209
+
210
+ // ProseMirror should handle any selections
211
+ if (mutation.type === 'selection') {
165
212
  return false
166
213
  }
167
214
 
168
- if (!this.contentDOM) {
215
+ // try to prevent a bug on iOS that will break node views on enter
216
+ // this is because ProseMirror can’t preventDispatch on enter
217
+ // this will lead to a re-render of the node view on enter
218
+ // see: https://github.com/ueberdosis/tiptap/issues/1214
219
+ if (
220
+ this.dom.contains(mutation.target)
221
+ && mutation.type === 'childList'
222
+ && isiOS()
223
+ && this.editor.isFocused
224
+ ) {
225
+ const changedNodes = [
226
+ ...Array.from(mutation.addedNodes),
227
+ ...Array.from(mutation.removedNodes),
228
+ ] as HTMLElement[]
229
+
230
+ // we’ll check if every changed node is contentEditable
231
+ // to make sure it’s probably mutated by ProseMirror
232
+ if (changedNodes.every(node => node.isContentEditable)) {
233
+ return false
234
+ }
235
+ }
236
+
237
+ // we will allow mutation contentDOM with attributes
238
+ // so we can for example adding classes within our node view
239
+ if (this.contentDOM === mutation.target && mutation.type === 'attributes') {
169
240
  return true
170
241
  }
171
242
 
172
- const contentDOMHasChanged = !this.contentDOM.contains(mutation.target)
173
- || this.contentDOM === mutation.target
243
+ // ProseMirror should handle any changes within contentDOM
244
+ if (this.contentDOM.contains(mutation.target)) {
245
+ return false
246
+ }
174
247
 
175
- return contentDOMHasChanged
248
+ return true
176
249
  }
177
250
 
178
251
  updateAttributes(attributes: {}) {
179
- if (!this.editor.view.editable) {
180
- return
181
- }
252
+ this.editor.commands.command(({ tr }) => {
253
+ const pos = this.getPos()
182
254
 
183
- const { state } = this.editor.view
184
- const pos = this.getPos()
185
- const transaction = state.tr.setNodeMarkup(pos, undefined, {
186
- ...this.node.attrs,
187
- ...attributes,
188
- })
255
+ tr.setNodeMarkup(pos, undefined, {
256
+ ...this.node.attrs,
257
+ ...attributes,
258
+ })
189
259
 
190
- this.editor.view.dispatch(transaction)
260
+ return true
261
+ })
191
262
  }
192
263
 
264
+ deleteNode(): void {
265
+ const from = this.getPos()
266
+ const to = from + this.node.nodeSize
267
+
268
+ this.editor.commands.deleteRange({ from, to })
269
+ }
193
270
  }
@@ -0,0 +1,240 @@
1
+ import { EditorState, Plugin } from '@tiptap/pm/state'
2
+
3
+ import { CommandManager } from './CommandManager'
4
+ import { Editor } from './Editor'
5
+ import { createChainableState } from './helpers/createChainableState'
6
+ import {
7
+ CanCommands,
8
+ ChainedCommands,
9
+ ExtendedRegExpMatchArray,
10
+ Range,
11
+ SingleCommands,
12
+ } from './types'
13
+ import { isNumber } from './utilities/isNumber'
14
+ import { isRegExp } from './utilities/isRegExp'
15
+
16
+ export type PasteRuleMatch = {
17
+ index: number
18
+ text: string
19
+ replaceWith?: string
20
+ match?: RegExpMatchArray
21
+ data?: Record<string, any>
22
+ }
23
+
24
+ export type PasteRuleFinder = RegExp | ((text: string) => PasteRuleMatch[] | null | undefined)
25
+
26
+ export class PasteRule {
27
+ find: PasteRuleFinder
28
+
29
+ handler: (props: {
30
+ state: EditorState
31
+ range: Range
32
+ match: ExtendedRegExpMatchArray
33
+ commands: SingleCommands
34
+ chain: () => ChainedCommands
35
+ can: () => CanCommands
36
+ }) => void | null
37
+
38
+ constructor(config: {
39
+ find: PasteRuleFinder
40
+ handler: (props: {
41
+ state: EditorState
42
+ range: Range
43
+ match: ExtendedRegExpMatchArray
44
+ commands: SingleCommands
45
+ chain: () => ChainedCommands
46
+ can: () => CanCommands
47
+ }) => void | null
48
+ }) {
49
+ this.find = config.find
50
+ this.handler = config.handler
51
+ }
52
+ }
53
+
54
+ const pasteRuleMatcherHandler = (
55
+ text: string,
56
+ find: PasteRuleFinder,
57
+ ): ExtendedRegExpMatchArray[] => {
58
+ if (isRegExp(find)) {
59
+ return [...text.matchAll(find)]
60
+ }
61
+
62
+ const matches = find(text)
63
+
64
+ if (!matches) {
65
+ return []
66
+ }
67
+
68
+ return matches.map(pasteRuleMatch => {
69
+ const result: ExtendedRegExpMatchArray = [pasteRuleMatch.text]
70
+
71
+ result.index = pasteRuleMatch.index
72
+ result.input = text
73
+ result.data = pasteRuleMatch.data
74
+
75
+ if (pasteRuleMatch.replaceWith) {
76
+ if (!pasteRuleMatch.text.includes(pasteRuleMatch.replaceWith)) {
77
+ console.warn(
78
+ '[tiptap warn]: "pasteRuleMatch.replaceWith" must be part of "pasteRuleMatch.text".',
79
+ )
80
+ }
81
+
82
+ result.push(pasteRuleMatch.replaceWith)
83
+ }
84
+
85
+ return result
86
+ })
87
+ }
88
+
89
+ function run(config: {
90
+ editor: Editor
91
+ state: EditorState
92
+ from: number
93
+ to: number
94
+ rule: PasteRule
95
+ }): boolean {
96
+ const {
97
+ editor, state, from, to, rule,
98
+ } = config
99
+
100
+ const { commands, chain, can } = new CommandManager({
101
+ editor,
102
+ state,
103
+ })
104
+
105
+ const handlers: (void | null)[] = []
106
+
107
+ state.doc.nodesBetween(from, to, (node, pos) => {
108
+ if (!node.isTextblock || node.type.spec.code) {
109
+ return
110
+ }
111
+
112
+ const resolvedFrom = Math.max(from, pos)
113
+ const resolvedTo = Math.min(to, pos + node.content.size)
114
+ const textToMatch = node.textBetween(resolvedFrom - pos, resolvedTo - pos, undefined, '\ufffc')
115
+
116
+ const matches = pasteRuleMatcherHandler(textToMatch, rule.find)
117
+
118
+ matches.forEach(match => {
119
+ if (match.index === undefined) {
120
+ return
121
+ }
122
+
123
+ const start = resolvedFrom + match.index + 1
124
+ const end = start + match[0].length
125
+ const range = {
126
+ from: state.tr.mapping.map(start),
127
+ to: state.tr.mapping.map(end),
128
+ }
129
+
130
+ const handler = rule.handler({
131
+ state,
132
+ range,
133
+ match,
134
+ commands,
135
+ chain,
136
+ can,
137
+ })
138
+
139
+ handlers.push(handler)
140
+ })
141
+ })
142
+
143
+ const success = handlers.every(handler => handler !== null)
144
+
145
+ return success
146
+ }
147
+
148
+ /**
149
+ * Create an paste rules plugin. When enabled, it will cause pasted
150
+ * text that matches any of the given rules to trigger the rule’s
151
+ * action.
152
+ */
153
+ export function pasteRulesPlugin(props: { editor: Editor; rules: PasteRule[] }): Plugin[] {
154
+ const { editor, rules } = props
155
+ let dragSourceElement: Element | null = null
156
+ let isPastedFromProseMirror = false
157
+ let isDroppedFromProseMirror = false
158
+
159
+ const plugins = rules.map(rule => {
160
+ return new Plugin({
161
+ // we register a global drag handler to track the current drag source element
162
+ view(view) {
163
+ const handleDragstart = (event: DragEvent) => {
164
+ dragSourceElement = view.dom.parentElement?.contains(event.target as Element)
165
+ ? view.dom.parentElement
166
+ : null
167
+ }
168
+
169
+ window.addEventListener('dragstart', handleDragstart)
170
+
171
+ return {
172
+ destroy() {
173
+ window.removeEventListener('dragstart', handleDragstart)
174
+ },
175
+ }
176
+ },
177
+
178
+ props: {
179
+ handleDOMEvents: {
180
+ drop: view => {
181
+ isDroppedFromProseMirror = dragSourceElement === view.dom.parentElement
182
+
183
+ return false
184
+ },
185
+
186
+ paste: (view, event: Event) => {
187
+ const html = (event as ClipboardEvent).clipboardData?.getData('text/html')
188
+
189
+ isPastedFromProseMirror = !!html?.includes('data-pm-slice')
190
+
191
+ return false
192
+ },
193
+ },
194
+ },
195
+
196
+ appendTransaction: (transactions, oldState, state) => {
197
+ const transaction = transactions[0]
198
+ const isPaste = transaction.getMeta('uiEvent') === 'paste' && !isPastedFromProseMirror
199
+ const isDrop = transaction.getMeta('uiEvent') === 'drop' && !isDroppedFromProseMirror
200
+
201
+ if (!isPaste && !isDrop) {
202
+ return
203
+ }
204
+
205
+ // stop if there is no changed range
206
+ const from = oldState.doc.content.findDiffStart(state.doc.content)
207
+ const to = oldState.doc.content.findDiffEnd(state.doc.content)
208
+
209
+ if (!isNumber(from) || !to || from === to.b) {
210
+ return
211
+ }
212
+
213
+ // build a chainable state
214
+ // so we can use a single transaction for all paste rules
215
+ const tr = state.tr
216
+ const chainableState = createChainableState({
217
+ state,
218
+ transaction: tr,
219
+ })
220
+
221
+ const handler = run({
222
+ editor,
223
+ state: chainableState,
224
+ from: Math.max(from - 1, 0),
225
+ to: to.b - 1,
226
+ rule,
227
+ })
228
+
229
+ // stop if there are no changes
230
+ if (!handler || !tr.steps.length) {
231
+ return
232
+ }
233
+
234
+ return tr
235
+ },
236
+ })
237
+ })
238
+
239
+ return plugins
240
+ }
package/src/Tracker.ts ADDED
@@ -0,0 +1,38 @@
1
+ import { Transaction } from '@tiptap/pm/state'
2
+
3
+ export interface TrackerResult {
4
+ position: number
5
+ deleted: boolean
6
+ }
7
+
8
+ export class Tracker {
9
+ transaction: Transaction
10
+
11
+ currentStep: number
12
+
13
+ constructor(transaction: Transaction) {
14
+ this.transaction = transaction
15
+ this.currentStep = this.transaction.steps.length
16
+ }
17
+
18
+ map(position: number): TrackerResult {
19
+ let deleted = false
20
+
21
+ const mappedPosition = this.transaction.steps
22
+ .slice(this.currentStep)
23
+ .reduce((newPosition, step) => {
24
+ const mapResult = step.getMap().mapResult(newPosition)
25
+
26
+ if (mapResult.deleted) {
27
+ deleted = true
28
+ }
29
+
30
+ return mapResult.pos
31
+ }, position)
32
+
33
+ return {
34
+ position: mappedPosition,
35
+ deleted,
36
+ }
37
+ }
38
+ }
@@ -1,20 +1,26 @@
1
- import { Command, RawCommands } from '../types'
1
+ import { RawCommands } from '../types'
2
2
 
3
3
  declare module '@tiptap/core' {
4
- interface Commands {
4
+ interface Commands<ReturnType> {
5
5
  blur: {
6
6
  /**
7
7
  * Removes focus from the editor.
8
8
  */
9
- blur: () => Command,
9
+ blur: () => ReturnType,
10
10
  }
11
11
  }
12
12
  }
13
13
 
14
- export const blur: RawCommands['blur'] = () => ({ view }) => {
15
- const element = view.dom as HTMLElement
14
+ export const blur: RawCommands['blur'] = () => ({ editor, view }) => {
15
+ requestAnimationFrame(() => {
16
+ if (!editor.isDestroyed) {
17
+ (view.dom as HTMLElement).blur()
16
18
 
17
- element.blur()
19
+ // Browsers should remove the caret on blur but safari does not.
20
+ // See: https://github.com/ueberdosis/tiptap/issues/2405
21
+ window?.getSelection()?.removeAllRanges()
22
+ }
23
+ })
18
24
 
19
25
  return true
20
26
  }
@@ -1,12 +1,12 @@
1
- import { Command, RawCommands } from '../types'
1
+ import { RawCommands } from '../types'
2
2
 
3
3
  declare module '@tiptap/core' {
4
- interface Commands {
4
+ interface Commands<ReturnType> {
5
5
  clearContent: {
6
6
  /**
7
7
  * Clear the whole document.
8
8
  */
9
- clearContent: (emitUpdate: Boolean) => Command,
9
+ clearContent: (emitUpdate?: boolean) => ReturnType,
10
10
  }
11
11
  }
12
12
  }