@blocknote/core 0.27.2 → 0.29.0

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 (388) hide show
  1. package/dist/blocknote.cjs +10 -10
  2. package/dist/blocknote.cjs.map +1 -1
  3. package/dist/blocknote.js +3032 -3118
  4. package/dist/blocknote.js.map +1 -1
  5. package/dist/locales.cjs +1 -1
  6. package/dist/locales.cjs.map +1 -1
  7. package/dist/locales.js +10 -10
  8. package/dist/locales.js.map +1 -1
  9. package/dist/tsconfig.tsbuildinfo +1 -1
  10. package/dist/webpack-stats.json +1 -1
  11. package/package.json +2 -2
  12. package/src/api/__snapshots__/blocks-deleted-nested-deep.json +26 -0
  13. package/src/api/__snapshots__/blocks-deleted-nested.json +68 -0
  14. package/src/api/__snapshots__/blocks-deleted.json +26 -0
  15. package/src/api/__snapshots__/blocks-inserted-nested.json +62 -0
  16. package/src/api/__snapshots__/blocks-inserted.json +20 -0
  17. package/src/api/__snapshots__/blocks-updated-content-inserted.json +42 -0
  18. package/src/api/__snapshots__/blocks-updated-multiple-insert.json +50 -0
  19. package/src/api/__snapshots__/blocks-updated-multiple.json +82 -0
  20. package/src/api/__snapshots__/blocks-updated-nested-deep.json +42 -0
  21. package/src/api/__snapshots__/blocks-updated-nested-multiple.json +118 -0
  22. package/src/api/__snapshots__/blocks-updated-nested.json +78 -0
  23. package/src/api/__snapshots__/blocks-updated-single.json +42 -0
  24. package/src/api/__snapshots__/blocks-updated.json +42 -0
  25. package/src/api/blockManipulation/__snapshots__/transactions.test.ts.snap +34 -0
  26. package/src/api/blockManipulation/commands/insertBlocks/__snapshots__/insertBlocks.test.ts.snap +312 -0
  27. package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.ts +127 -94
  28. package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.ts +19 -37
  29. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.ts +8 -6
  30. package/src/api/blockManipulation/commands/moveBlocks/moveBlocks.test.ts +25 -31
  31. package/src/api/blockManipulation/commands/moveBlocks/moveBlocks.ts +93 -91
  32. package/src/api/blockManipulation/commands/nestBlock/nestBlock.ts +16 -20
  33. package/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.ts +14 -1
  34. package/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.ts +18 -56
  35. package/src/api/blockManipulation/commands/splitBlock/splitBlock.test.ts +52 -46
  36. package/src/api/blockManipulation/commands/updateBlock/__snapshots__/updateBlock.test.ts.snap +1051 -0
  37. package/src/api/blockManipulation/commands/updateBlock/updateBlock.test.ts +247 -154
  38. package/src/api/blockManipulation/commands/updateBlock/updateBlock.ts +109 -142
  39. package/src/api/blockManipulation/getBlock/getBlock.ts +23 -48
  40. package/src/api/blockManipulation/insertContentAt.ts +4 -17
  41. package/src/api/blockManipulation/selections/selection.test.ts +32 -16
  42. package/src/api/blockManipulation/selections/selection.ts +25 -51
  43. package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.ts +35 -14
  44. package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.ts +34 -65
  45. package/src/api/clipboard/fromClipboard/handleFileInsertion.ts +8 -10
  46. package/src/api/clipboard/toClipboard/copyExtension.ts +7 -7
  47. package/src/api/exporters/html/util/serializeBlocksExternalHTML.ts +7 -16
  48. package/src/api/exporters/html/util/serializeBlocksInternalHTML.ts +3 -17
  49. package/src/api/getBlockInfoFromPos.ts +13 -1
  50. package/src/api/nodeConversions/blockToNode.ts +21 -10
  51. package/src/api/nodeConversions/fragmentToBlocks.ts +5 -18
  52. package/src/api/nodeConversions/nodeToBlock.ts +11 -8
  53. package/src/api/nodeUtil.test.ts +228 -0
  54. package/src/api/nodeUtil.ts +235 -2
  55. package/src/api/parsers/html/parseHTML.ts +2 -10
  56. package/src/api/parsers/markdown/parseMarkdown.ts +2 -8
  57. package/src/api/pmUtil.ts +54 -0
  58. package/src/api/positionMapping.test.ts +370 -0
  59. package/src/api/positionMapping.ts +114 -0
  60. package/src/blocks/FileBlockContent/helpers/render/createAddFileButton.ts +2 -2
  61. package/src/blocks/HeadingBlockContent/HeadingBlockContent.ts +9 -13
  62. package/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +5 -9
  63. package/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.ts +19 -31
  64. package/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.ts +10 -8
  65. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +9 -13
  66. package/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts +1 -1
  67. package/src/blocks/QuoteBlockContent/QuoteBlockContent.ts +5 -9
  68. package/src/blocks/defaultBlockHelpers.ts +1 -1
  69. package/src/editor/BlockNoteEditor.test.ts +1 -1
  70. package/src/editor/BlockNoteEditor.ts +259 -130
  71. package/src/editor/BlockNoteTipTapEditor.ts +91 -8
  72. package/src/extensions/Comments/CommentsPlugin.ts +32 -34
  73. package/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts +4 -8
  74. package/src/extensions/LinkToolbar/LinkToolbarPlugin.ts +12 -13
  75. package/src/extensions/ShowSelection/ShowSelectionPlugin.ts +1 -3
  76. package/src/extensions/SideMenu/MultipleNodeSelection.ts +3 -1
  77. package/src/extensions/SideMenu/dragging.ts +1 -1
  78. package/src/extensions/SuggestionMenu/SuggestionPlugin.ts +38 -25
  79. package/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts +8 -8
  80. package/src/extensions/TableHandles/TableHandlesPlugin.ts +150 -136
  81. package/src/i18n/locales/de.ts +10 -10
  82. package/src/index.ts +4 -3
  83. package/src/schema/inlineContent/createSpec.ts +1 -5
  84. package/types/src/api/blockManipulation/commands/insertBlocks/insertBlocks.d.ts +2 -2
  85. package/types/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.d.ts +4 -8
  86. package/types/src/api/blockManipulation/commands/updateBlock/updateBlock.d.ts +9 -10
  87. package/types/src/api/blockManipulation/getBlock/getBlock.d.ts +7 -7
  88. package/types/src/api/blockManipulation/insertContentAt.d.ts +5 -3
  89. package/types/src/api/blockManipulation/selections/selection.d.ts +3 -3
  90. package/types/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.d.ts +5 -5
  91. package/types/src/api/getBlockInfoFromPos.d.ts +8 -1
  92. package/types/src/api/nodeConversions/blockToNode.d.ts +3 -3
  93. package/types/src/api/nodeConversions/fragmentToBlocks.d.ts +1 -2
  94. package/types/src/api/nodeConversions/nodeToBlock.d.ts +2 -2
  95. package/types/src/api/nodeUtil.d.ts +67 -1
  96. package/types/src/api/parsers/html/parseHTML.d.ts +1 -1
  97. package/types/src/api/parsers/markdown/parseMarkdown.d.ts +1 -1
  98. package/types/src/api/pmUtil.d.ts +12 -0
  99. package/types/src/api/positionMapping.d.ts +25 -0
  100. package/types/src/editor/BlockNoteEditor.d.ts +72 -10
  101. package/types/src/editor/BlockNoteTipTapEditor.d.ts +15 -2
  102. package/types/src/extensions/TableHandles/TableHandlesPlugin.d.ts +1 -1
  103. package/types/src/index.d.ts +1 -2
  104. package/src/api/blockManipulation/commands/removeBlocks/__snapshots__/removeBlocks.test.ts.snap +0 -1859
  105. package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.ts +0 -40
  106. package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.ts +0 -20
  107. package/src/api/clipboard/__snapshots__/external/pasteEndOfParagraph.html +0 -138
  108. package/src/api/clipboard/__snapshots__/external/pasteEndOfParagraphText.html +0 -138
  109. package/src/api/clipboard/__snapshots__/external/pasteImage.html +0 -153
  110. package/src/api/clipboard/__snapshots__/external/pasteParagraphInCustomBlock.html +0 -138
  111. package/src/api/clipboard/__snapshots__/external/pasteTable.html +0 -233
  112. package/src/api/clipboard/__snapshots__/external/pasteTableInExistingTable.html +0 -216
  113. package/src/api/clipboard/__snapshots__/internal/basicBlocks.html +0 -1
  114. package/src/api/clipboard/__snapshots__/internal/basicBlocksWithProps.html +0 -1
  115. package/src/api/clipboard/__snapshots__/internal/childToParent.html +0 -1
  116. package/src/api/clipboard/__snapshots__/internal/childrenToNextParent.html +0 -1
  117. package/src/api/clipboard/__snapshots__/internal/childrenToNextParentsChildren.html +0 -1
  118. package/src/api/clipboard/__snapshots__/internal/image.html +0 -1
  119. package/src/api/clipboard/__snapshots__/internal/multipleChildren.html +0 -1
  120. package/src/api/clipboard/__snapshots__/internal/multipleStyledText.html +0 -1
  121. package/src/api/clipboard/__snapshots__/internal/nestedImage.html +0 -1
  122. package/src/api/clipboard/__snapshots__/internal/paragraphInCustomBlock.html +0 -1
  123. package/src/api/clipboard/__snapshots__/internal/partialChildToParent.html +0 -1
  124. package/src/api/clipboard/__snapshots__/internal/styledText.html +0 -1
  125. package/src/api/clipboard/__snapshots__/internal/tableAllCells.html +0 -1
  126. package/src/api/clipboard/__snapshots__/internal/tableCell.html +0 -1
  127. package/src/api/clipboard/__snapshots__/internal/tableCellText.html +0 -1
  128. package/src/api/clipboard/__snapshots__/internal/tableRow.html +0 -1
  129. package/src/api/clipboard/__snapshots__/internal/unstyledText.html +0 -1
  130. package/src/api/clipboard/clipboardExternal.test.ts +0 -161
  131. package/src/api/clipboard/clipboardInternal.test.ts +0 -435
  132. package/src/api/clipboard/testUtil.ts +0 -27
  133. package/src/api/exporters/html/__snapshots__/codeBlock/contains-newlines/external.html +0 -1
  134. package/src/api/exporters/html/__snapshots__/codeBlock/contains-newlines/internal.html +0 -3
  135. package/src/api/exporters/html/__snapshots__/codeBlock/defaultLanguage/external.html +0 -1
  136. package/src/api/exporters/html/__snapshots__/codeBlock/defaultLanguage/internal.html +0 -1
  137. package/src/api/exporters/html/__snapshots__/codeBlock/empty/external.html +0 -1
  138. package/src/api/exporters/html/__snapshots__/codeBlock/empty/internal.html +0 -1
  139. package/src/api/exporters/html/__snapshots__/codeBlock/python/external.html +0 -1
  140. package/src/api/exporters/html/__snapshots__/codeBlock/python/internal.html +0 -1
  141. package/src/api/exporters/html/__snapshots__/complex/misc/external.html +0 -1
  142. package/src/api/exporters/html/__snapshots__/complex/misc/internal.html +0 -1
  143. package/src/api/exporters/html/__snapshots__/customBlock/basic/external.html +0 -1
  144. package/src/api/exporters/html/__snapshots__/customBlock/basic/internal.html +0 -1
  145. package/src/api/exporters/html/__snapshots__/customParagraph/basic/external.html +0 -1
  146. package/src/api/exporters/html/__snapshots__/customParagraph/basic/internal.html +0 -1
  147. package/src/api/exporters/html/__snapshots__/customParagraph/lineBreaks/external.html +0 -1
  148. package/src/api/exporters/html/__snapshots__/customParagraph/lineBreaks/internal.html +0 -1
  149. package/src/api/exporters/html/__snapshots__/customParagraph/nested/external.html +0 -1
  150. package/src/api/exporters/html/__snapshots__/customParagraph/nested/internal.html +0 -1
  151. package/src/api/exporters/html/__snapshots__/customParagraph/styled/external.html +0 -1
  152. package/src/api/exporters/html/__snapshots__/customParagraph/styled/internal.html +0 -1
  153. package/src/api/exporters/html/__snapshots__/file/basic/external.html +0 -1
  154. package/src/api/exporters/html/__snapshots__/file/basic/internal.html +0 -1
  155. package/src/api/exporters/html/__snapshots__/file/button/external.html +0 -1
  156. package/src/api/exporters/html/__snapshots__/file/button/internal.html +0 -1
  157. package/src/api/exporters/html/__snapshots__/file/nested/external.html +0 -1
  158. package/src/api/exporters/html/__snapshots__/file/nested/internal.html +0 -1
  159. package/src/api/exporters/html/__snapshots__/file/noCaption/external.html +0 -1
  160. package/src/api/exporters/html/__snapshots__/file/noCaption/internal.html +0 -1
  161. package/src/api/exporters/html/__snapshots__/file/noName/external.html +0 -1
  162. package/src/api/exporters/html/__snapshots__/file/noName/internal.html +0 -1
  163. package/src/api/exporters/html/__snapshots__/fontSize/basic/external.html +0 -1
  164. package/src/api/exporters/html/__snapshots__/fontSize/basic/internal.html +0 -1
  165. package/src/api/exporters/html/__snapshots__/hardbreak/basic/external.html +0 -1
  166. package/src/api/exporters/html/__snapshots__/hardbreak/basic/internal.html +0 -1
  167. package/src/api/exporters/html/__snapshots__/hardbreak/between-links/external.html +0 -1
  168. package/src/api/exporters/html/__snapshots__/hardbreak/between-links/internal.html +0 -1
  169. package/src/api/exporters/html/__snapshots__/hardbreak/end/external.html +0 -1
  170. package/src/api/exporters/html/__snapshots__/hardbreak/end/internal.html +0 -1
  171. package/src/api/exporters/html/__snapshots__/hardbreak/link/external.html +0 -1
  172. package/src/api/exporters/html/__snapshots__/hardbreak/link/internal.html +0 -1
  173. package/src/api/exporters/html/__snapshots__/hardbreak/multiple/external.html +0 -1
  174. package/src/api/exporters/html/__snapshots__/hardbreak/multiple/internal.html +0 -1
  175. package/src/api/exporters/html/__snapshots__/hardbreak/only/external.html +0 -1
  176. package/src/api/exporters/html/__snapshots__/hardbreak/only/internal.html +0 -1
  177. package/src/api/exporters/html/__snapshots__/hardbreak/start/external.html +0 -1
  178. package/src/api/exporters/html/__snapshots__/hardbreak/start/internal.html +0 -1
  179. package/src/api/exporters/html/__snapshots__/hardbreak/styles/external.html +0 -1
  180. package/src/api/exporters/html/__snapshots__/hardbreak/styles/internal.html +0 -1
  181. package/src/api/exporters/html/__snapshots__/image/basic/external.html +0 -1
  182. package/src/api/exporters/html/__snapshots__/image/basic/internal.html +0 -1
  183. package/src/api/exporters/html/__snapshots__/image/button/external.html +0 -1
  184. package/src/api/exporters/html/__snapshots__/image/button/internal.html +0 -1
  185. package/src/api/exporters/html/__snapshots__/image/nested/external.html +0 -1
  186. package/src/api/exporters/html/__snapshots__/image/nested/internal.html +0 -1
  187. package/src/api/exporters/html/__snapshots__/image/noCaption/external.html +0 -1
  188. package/src/api/exporters/html/__snapshots__/image/noCaption/internal.html +0 -1
  189. package/src/api/exporters/html/__snapshots__/image/noName/external.html +0 -1
  190. package/src/api/exporters/html/__snapshots__/image/noName/internal.html +0 -1
  191. package/src/api/exporters/html/__snapshots__/image/noPreview/external.html +0 -1
  192. package/src/api/exporters/html/__snapshots__/image/noPreview/internal.html +0 -1
  193. package/src/api/exporters/html/__snapshots__/link/adjacent/external.html +0 -1
  194. package/src/api/exporters/html/__snapshots__/link/adjacent/internal.html +0 -1
  195. package/src/api/exporters/html/__snapshots__/link/basic/external.html +0 -1
  196. package/src/api/exporters/html/__snapshots__/link/basic/internal.html +0 -1
  197. package/src/api/exporters/html/__snapshots__/link/styled/external.html +0 -1
  198. package/src/api/exporters/html/__snapshots__/link/styled/internal.html +0 -1
  199. package/src/api/exporters/html/__snapshots__/lists/basic/external.html +0 -1
  200. package/src/api/exporters/html/__snapshots__/lists/basic/internal.html +0 -1
  201. package/src/api/exporters/html/__snapshots__/lists/nested/external.html +0 -1
  202. package/src/api/exporters/html/__snapshots__/lists/nested/internal.html +0 -1
  203. package/src/api/exporters/html/__snapshots__/mention/basic/external.html +0 -1
  204. package/src/api/exporters/html/__snapshots__/mention/basic/internal.html +0 -1
  205. package/src/api/exporters/html/__snapshots__/pageBreak/basic/external.html +0 -1
  206. package/src/api/exporters/html/__snapshots__/pageBreak/basic/internal.html +0 -1
  207. package/src/api/exporters/html/__snapshots__/paragraph/basic/external.html +0 -1
  208. package/src/api/exporters/html/__snapshots__/paragraph/basic/internal.html +0 -1
  209. package/src/api/exporters/html/__snapshots__/paragraph/empty/external.html +0 -1
  210. package/src/api/exporters/html/__snapshots__/paragraph/empty/internal.html +0 -1
  211. package/src/api/exporters/html/__snapshots__/paragraph/lineBreaks/external.html +0 -1
  212. package/src/api/exporters/html/__snapshots__/paragraph/lineBreaks/internal.html +0 -1
  213. package/src/api/exporters/html/__snapshots__/paragraph/nested/external.html +0 -1
  214. package/src/api/exporters/html/__snapshots__/paragraph/nested/internal.html +0 -1
  215. package/src/api/exporters/html/__snapshots__/paragraph/styled/external.html +0 -1
  216. package/src/api/exporters/html/__snapshots__/paragraph/styled/internal.html +0 -1
  217. package/src/api/exporters/html/__snapshots__/paste/parse-basic-block-types.json +0 -140
  218. package/src/api/exporters/html/__snapshots__/paste/parse-deep-nested-content.json +0 -240
  219. package/src/api/exporters/html/__snapshots__/paste/parse-div-with-inline-content.json +0 -91
  220. package/src/api/exporters/html/__snapshots__/paste/parse-divs.json +0 -19
  221. package/src/api/exporters/html/__snapshots__/paste/parse-fake-image-caption.json +0 -31
  222. package/src/api/exporters/html/__snapshots__/paste/parse-mixed-nested-lists.json +0 -70
  223. package/src/api/exporters/html/__snapshots__/paste/parse-nested-lists-with-paragraphs.json +0 -70
  224. package/src/api/exporters/html/__snapshots__/paste/parse-nested-lists.json +0 -70
  225. package/src/api/exporters/html/__snapshots__/simpleCustomParagraph/basic/external.html +0 -1
  226. package/src/api/exporters/html/__snapshots__/simpleCustomParagraph/basic/internal.html +0 -1
  227. package/src/api/exporters/html/__snapshots__/simpleCustomParagraph/nested/external.html +0 -1
  228. package/src/api/exporters/html/__snapshots__/simpleCustomParagraph/nested/internal.html +0 -1
  229. package/src/api/exporters/html/__snapshots__/simpleCustomParagraph/styled/external.html +0 -1
  230. package/src/api/exporters/html/__snapshots__/simpleCustomParagraph/styled/internal.html +0 -1
  231. package/src/api/exporters/html/__snapshots__/simpleFile/basic/external.html +0 -1
  232. package/src/api/exporters/html/__snapshots__/simpleFile/basic/internal.html +0 -1
  233. package/src/api/exporters/html/__snapshots__/simpleFile/button/external.html +0 -1
  234. package/src/api/exporters/html/__snapshots__/simpleFile/button/internal.html +0 -1
  235. package/src/api/exporters/html/__snapshots__/simpleFile/nested/external.html +0 -1
  236. package/src/api/exporters/html/__snapshots__/simpleFile/nested/internal.html +0 -1
  237. package/src/api/exporters/html/__snapshots__/simpleImage/basic/external.html +0 -1
  238. package/src/api/exporters/html/__snapshots__/simpleImage/basic/internal.html +0 -1
  239. package/src/api/exporters/html/__snapshots__/simpleImage/button/external.html +0 -1
  240. package/src/api/exporters/html/__snapshots__/simpleImage/button/internal.html +0 -1
  241. package/src/api/exporters/html/__snapshots__/simpleImage/nested/external.html +0 -1
  242. package/src/api/exporters/html/__snapshots__/simpleImage/nested/internal.html +0 -1
  243. package/src/api/exporters/html/__snapshots__/simpleImage/noCaption/external.html +0 -1
  244. package/src/api/exporters/html/__snapshots__/simpleImage/noCaption/internal.html +0 -1
  245. package/src/api/exporters/html/__snapshots__/simpleImage/noName/external.html +0 -1
  246. package/src/api/exporters/html/__snapshots__/simpleImage/noName/internal.html +0 -1
  247. package/src/api/exporters/html/__snapshots__/simpleImage/noPreview/external.html +0 -1
  248. package/src/api/exporters/html/__snapshots__/simpleImage/noPreview/internal.html +0 -1
  249. package/src/api/exporters/html/__snapshots__/small/basic/external.html +0 -1
  250. package/src/api/exporters/html/__snapshots__/small/basic/internal.html +0 -1
  251. package/src/api/exporters/html/__snapshots__/table/allColWidths/external.html +0 -1
  252. package/src/api/exporters/html/__snapshots__/table/allColWidths/internal.html +0 -1
  253. package/src/api/exporters/html/__snapshots__/table/basic/external.html +0 -1
  254. package/src/api/exporters/html/__snapshots__/table/basic/internal.html +0 -1
  255. package/src/api/exporters/html/__snapshots__/table/headerCols/external.html +0 -1
  256. package/src/api/exporters/html/__snapshots__/table/headerCols/internal.html +0 -1
  257. package/src/api/exporters/html/__snapshots__/table/headerRows/external.html +0 -1
  258. package/src/api/exporters/html/__snapshots__/table/headerRows/internal.html +0 -1
  259. package/src/api/exporters/html/__snapshots__/table/headersRows/external.html +0 -1
  260. package/src/api/exporters/html/__snapshots__/table/headersRows/internal.html +0 -1
  261. package/src/api/exporters/html/__snapshots__/table/mixedCellColors/external.html +0 -1
  262. package/src/api/exporters/html/__snapshots__/table/mixedCellColors/internal.html +0 -1
  263. package/src/api/exporters/html/__snapshots__/table/mixedColWidths/external.html +0 -1
  264. package/src/api/exporters/html/__snapshots__/table/mixedColWidths/internal.html +0 -1
  265. package/src/api/exporters/html/__snapshots__/table/mixedRowspansAndColspans/external.html +0 -1
  266. package/src/api/exporters/html/__snapshots__/table/mixedRowspansAndColspans/internal.html +0 -1
  267. package/src/api/exporters/html/__snapshots__/tag/basic/external.html +0 -1
  268. package/src/api/exporters/html/__snapshots__/tag/basic/internal.html +0 -1
  269. package/src/api/exporters/html/htmlConversion.test.ts +0 -110
  270. package/src/api/exporters/markdown/__snapshots__/codeBlock/contains-newlines/markdown.md +0 -4
  271. package/src/api/exporters/markdown/__snapshots__/codeBlock/defaultLanguage/markdown.md +0 -3
  272. package/src/api/exporters/markdown/__snapshots__/codeBlock/empty/markdown.md +0 -2
  273. package/src/api/exporters/markdown/__snapshots__/codeBlock/python/markdown.md +0 -3
  274. package/src/api/exporters/markdown/__snapshots__/complex/misc/markdown.md +0 -5
  275. package/src/api/exporters/markdown/__snapshots__/customBlock/basic/markdown.md +0 -5
  276. package/src/api/exporters/markdown/__snapshots__/customParagraph/basic/markdown.md +0 -1
  277. package/src/api/exporters/markdown/__snapshots__/customParagraph/lineBreaks/markdown.md +0 -1
  278. package/src/api/exporters/markdown/__snapshots__/customParagraph/nested/markdown.md +0 -5
  279. package/src/api/exporters/markdown/__snapshots__/customParagraph/styled/markdown.md +0 -1
  280. package/src/api/exporters/markdown/__snapshots__/file/basic/markdown.md +0 -3
  281. package/src/api/exporters/markdown/__snapshots__/file/button/markdown.md +0 -1
  282. package/src/api/exporters/markdown/__snapshots__/file/nested/markdown.md +0 -7
  283. package/src/api/exporters/markdown/__snapshots__/file/noCaption/markdown.md +0 -1
  284. package/src/api/exporters/markdown/__snapshots__/file/noName/markdown.md +0 -3
  285. package/src/api/exporters/markdown/__snapshots__/fontSize/basic/markdown.md +0 -1
  286. package/src/api/exporters/markdown/__snapshots__/hardbreak/basic/markdown.md +0 -2
  287. package/src/api/exporters/markdown/__snapshots__/hardbreak/between-links/markdown.md +0 -2
  288. package/src/api/exporters/markdown/__snapshots__/hardbreak/end/markdown.md +0 -1
  289. package/src/api/exporters/markdown/__snapshots__/hardbreak/link/markdown.md +0 -2
  290. package/src/api/exporters/markdown/__snapshots__/hardbreak/multiple/markdown.md +0 -3
  291. package/src/api/exporters/markdown/__snapshots__/hardbreak/only/markdown.md +0 -0
  292. package/src/api/exporters/markdown/__snapshots__/hardbreak/start/markdown.md +0 -1
  293. package/src/api/exporters/markdown/__snapshots__/hardbreak/styles/markdown.md +0 -2
  294. package/src/api/exporters/markdown/__snapshots__/image/basic/markdown.md +0 -3
  295. package/src/api/exporters/markdown/__snapshots__/image/button/markdown.md +0 -1
  296. package/src/api/exporters/markdown/__snapshots__/image/nested/markdown.md +0 -7
  297. package/src/api/exporters/markdown/__snapshots__/image/noCaption/markdown.md +0 -1
  298. package/src/api/exporters/markdown/__snapshots__/image/noName/markdown.md +0 -3
  299. package/src/api/exporters/markdown/__snapshots__/image/noPreview/markdown.md +0 -3
  300. package/src/api/exporters/markdown/__snapshots__/link/adjacent/markdown.md +0 -1
  301. package/src/api/exporters/markdown/__snapshots__/link/basic/markdown.md +0 -1
  302. package/src/api/exporters/markdown/__snapshots__/link/styled/markdown.md +0 -1
  303. package/src/api/exporters/markdown/__snapshots__/lists/basic/markdown.md +0 -10
  304. package/src/api/exporters/markdown/__snapshots__/lists/nested/markdown.md +0 -10
  305. package/src/api/exporters/markdown/__snapshots__/mention/basic/markdown.md +0 -1
  306. package/src/api/exporters/markdown/__snapshots__/pageBreak/basic/markdown.md +0 -0
  307. package/src/api/exporters/markdown/__snapshots__/paragraph/basic/markdown.md +0 -1
  308. package/src/api/exporters/markdown/__snapshots__/paragraph/empty/markdown.md +0 -0
  309. package/src/api/exporters/markdown/__snapshots__/paragraph/lineBreaks/markdown.md +0 -2
  310. package/src/api/exporters/markdown/__snapshots__/paragraph/nested/markdown.md +0 -5
  311. package/src/api/exporters/markdown/__snapshots__/paragraph/styled/markdown.md +0 -1
  312. package/src/api/exporters/markdown/__snapshots__/simpleCustomParagraph/basic/markdown.md +0 -1
  313. package/src/api/exporters/markdown/__snapshots__/simpleCustomParagraph/nested/markdown.md +0 -5
  314. package/src/api/exporters/markdown/__snapshots__/simpleCustomParagraph/styled/markdown.md +0 -1
  315. package/src/api/exporters/markdown/__snapshots__/simpleFile/basic/markdown.md +0 -3
  316. package/src/api/exporters/markdown/__snapshots__/simpleFile/button/markdown.md +0 -1
  317. package/src/api/exporters/markdown/__snapshots__/simpleFile/nested/markdown.md +0 -7
  318. package/src/api/exporters/markdown/__snapshots__/simpleImage/basic/markdown.md +0 -3
  319. package/src/api/exporters/markdown/__snapshots__/simpleImage/button/markdown.md +0 -1
  320. package/src/api/exporters/markdown/__snapshots__/simpleImage/nested/markdown.md +0 -7
  321. package/src/api/exporters/markdown/__snapshots__/simpleImage/noCaption/markdown.md +0 -1
  322. package/src/api/exporters/markdown/__snapshots__/simpleImage/noName/markdown.md +0 -3
  323. package/src/api/exporters/markdown/__snapshots__/simpleImage/noPreview/markdown.md +0 -3
  324. package/src/api/exporters/markdown/__snapshots__/small/basic/markdown.md +0 -1
  325. package/src/api/exporters/markdown/__snapshots__/table/allColWidths/markdown.md +0 -5
  326. package/src/api/exporters/markdown/__snapshots__/table/basic/markdown.md +0 -5
  327. package/src/api/exporters/markdown/__snapshots__/table/headerCols/markdown.md +0 -4
  328. package/src/api/exporters/markdown/__snapshots__/table/headerRows/markdown.md +0 -4
  329. package/src/api/exporters/markdown/__snapshots__/table/mixedCellColors/markdown.md +0 -5
  330. package/src/api/exporters/markdown/__snapshots__/table/mixedColWidths/markdown.md +0 -5
  331. package/src/api/exporters/markdown/__snapshots__/table/mixedRowspansAndColspans/markdown.md +0 -5
  332. package/src/api/exporters/markdown/__snapshots__/tag/basic/markdown.md +0 -1
  333. package/src/api/exporters/markdown/markdownExporter.test.ts +0 -86
  334. package/src/api/nodeConversions/__snapshots__/nodeConversions.test.ts.snap +0 -3473
  335. package/src/api/nodeConversions/nodeConversions.test.ts +0 -83
  336. package/src/api/parsers/html/__snapshots__/list-test.json +0 -177
  337. package/src/api/parsers/html/__snapshots__/parse-2-tables.json +0 -129
  338. package/src/api/parsers/html/__snapshots__/parse-basic-block-types.json +0 -142
  339. package/src/api/parsers/html/__snapshots__/parse-codeblocks.json +0 -62
  340. package/src/api/parsers/html/__snapshots__/parse-div-with-inline-content.json +0 -91
  341. package/src/api/parsers/html/__snapshots__/parse-divs.json +0 -121
  342. package/src/api/parsers/html/__snapshots__/parse-fake-image-caption.json +0 -33
  343. package/src/api/parsers/html/__snapshots__/parse-image-in-paragraph.json +0 -16
  344. package/src/api/parsers/html/__snapshots__/parse-mixed-nested-lists.json +0 -265
  345. package/src/api/parsers/html/__snapshots__/parse-nested-lists-with-paragraphs.json +0 -265
  346. package/src/api/parsers/html/__snapshots__/parse-nested-lists.json +0 -265
  347. package/src/api/parsers/html/__snapshots__/parse-notion-html.json +0 -565
  348. package/src/api/parsers/html/__snapshots__/parse-two-divs.json +0 -36
  349. package/src/api/parsers/html/parseHTML.test.ts +0 -563
  350. package/src/api/parsers/markdown/__snapshots__/complex.json +0 -353
  351. package/src/api/parsers/markdown/__snapshots__/issue-226-1.json +0 -71
  352. package/src/api/parsers/markdown/__snapshots__/issue-226-2.json +0 -144
  353. package/src/api/parsers/markdown/__snapshots__/nested.json +0 -72
  354. package/src/api/parsers/markdown/__snapshots__/non-nested.json +0 -71
  355. package/src/api/parsers/markdown/__snapshots__/pasted/complex.json +0 -319
  356. package/src/api/parsers/markdown/__snapshots__/pasted/issue-226-1.json +0 -81
  357. package/src/api/parsers/markdown/__snapshots__/pasted/issue-226-2.json +0 -165
  358. package/src/api/parsers/markdown/__snapshots__/pasted/nested.json +0 -81
  359. package/src/api/parsers/markdown/__snapshots__/pasted/non-nested.json +0 -81
  360. package/src/api/parsers/markdown/__snapshots__/pasted/styled.json +0 -61
  361. package/src/api/parsers/markdown/__snapshots__/pasted/whitespace bold.json +0 -42
  362. package/src/api/parsers/markdown/__snapshots__/styled.json +0 -58
  363. package/src/api/parsers/markdown/__snapshots__/whitespace bold.json +0 -19
  364. package/src/api/parsers/markdown/parseMarkdown.test.ts +0 -135
  365. package/src/api/testUtil/cases/customBlocks.ts +0 -342
  366. package/src/api/testUtil/cases/customInlineContent.ts +0 -113
  367. package/src/api/testUtil/cases/customStyles.ts +0 -102
  368. package/src/api/testUtil/cases/defaultSchema.ts +0 -1493
  369. package/src/api/testUtil/index.ts +0 -19
  370. package/src/api/testUtil/partialBlockTestUtil.ts +0 -198
  371. package/src/api/testUtil/paste.ts +0 -46
  372. package/types/src/api/blockManipulation/commands/removeBlocks/removeBlocks.d.ts +0 -4
  373. package/types/src/api/clipboard/clipboardInternal.test.d.ts +0 -1
  374. package/types/src/api/clipboard/testUtil.d.ts +0 -541
  375. package/types/src/api/exporters/html/htmlConversion.test.d.ts +0 -1
  376. package/types/src/api/exporters/markdown/markdownExporter.test.d.ts +0 -1
  377. package/types/src/api/nodeConversions/nodeConversions.test.d.ts +0 -1
  378. package/types/src/api/parsers/html/parseHTML.test.d.ts +0 -1
  379. package/types/src/api/parsers/markdown/parseMarkdown.test.d.ts +0 -1
  380. package/types/src/api/testUtil/cases/customBlocks.d.ts +0 -670
  381. package/types/src/api/testUtil/cases/customInlineContent.d.ts +0 -558
  382. package/types/src/api/testUtil/cases/customStyles.d.ts +0 -552
  383. package/types/src/api/testUtil/cases/defaultSchema.d.ts +0 -4
  384. package/types/src/api/testUtil/index.d.ts +0 -14
  385. package/types/src/api/testUtil/partialBlockTestUtil.d.ts +0 -9
  386. package/types/src/api/testUtil/paste.d.ts +0 -2
  387. /package/types/src/api/{blockManipulation/commands/removeBlocks/removeBlocks.test.d.ts → nodeUtil.test.d.ts} +0 -0
  388. /package/types/src/api/{clipboard/clipboardExternal.test.d.ts → positionMapping.test.d.ts} +0 -0
@@ -1,5 +1,4 @@
1
- import { EditorOptions, createDocument } from "@tiptap/core";
2
- // import "./blocknote.css";
1
+ import { Editor, EditorOptions, createDocument } from "@tiptap/core";
3
2
  import { Editor as TiptapEditor } from "@tiptap/core";
4
3
 
5
4
  import { Node } from "@tiptap/pm/model";
@@ -138,13 +137,83 @@ export class BlockNoteTipTapEditor extends TiptapEditor {
138
137
  return this._state;
139
138
  }
140
139
 
141
- dispatch(tr: Transaction) {
142
- if (this.view) {
143
- this.view.dispatch(tr);
144
- } else {
140
+ dispatch(transaction: Transaction) {
141
+ if (!this.view) {
145
142
  // before view has been initialized
146
- this._state = this.state.apply(tr);
143
+ this._state = this.state.apply(transaction);
144
+ return;
145
+ }
146
+ // This is a verbatim copy of the default dispatch method, but with the following changes:
147
+ // - We provide the appendedTransactions to a new `v3-update` event
148
+ // In the future, we can remove this dispatch method entirely and rely on the new `update` event signature which does what we want by providing the appendedTransactions
149
+ ////////////////////////////////////////////////////////////////////////////////
150
+ // if the editor / the view of the editor was destroyed
151
+ // the transaction should not be dispatched as there is no view anymore.
152
+ if (this.view.isDestroyed) {
153
+ return;
154
+ }
155
+
156
+ if (this.isCapturingTransaction) {
157
+ // Do the default capture behavior
158
+ (this as any).dispatchTransaction(transaction);
159
+
160
+ return;
161
+ }
162
+
163
+ const { state, transactions: appendedTransactions } =
164
+ this.state.applyTransaction(transaction);
165
+ const selectionHasChanged = !this.state.selection.eq(state.selection);
166
+
167
+ this.emit("beforeTransaction", {
168
+ editor: this,
169
+ transaction,
170
+ nextState: state,
171
+ });
172
+ this.view.updateState(state);
173
+ this.emit("transaction", {
174
+ editor: this,
175
+ transaction,
176
+ });
177
+
178
+ if (selectionHasChanged) {
179
+ this.emit("selectionUpdate", {
180
+ editor: this,
181
+ transaction,
182
+ });
183
+ }
184
+
185
+ const focus = transaction.getMeta("focus");
186
+ const blur = transaction.getMeta("blur");
187
+
188
+ if (focus) {
189
+ this.emit("focus", {
190
+ editor: this,
191
+ event: focus.event,
192
+ transaction,
193
+ });
194
+ }
195
+
196
+ if (blur) {
197
+ this.emit("blur", {
198
+ editor: this,
199
+ event: blur.event,
200
+ transaction,
201
+ });
147
202
  }
203
+
204
+ if (!transaction.docChanged || transaction.getMeta("preventUpdate")) {
205
+ return;
206
+ }
207
+
208
+ this.emit("update", {
209
+ editor: this,
210
+ transaction,
211
+ });
212
+ this.emit("v3-update", {
213
+ editor: this,
214
+ transaction,
215
+ appendedTransactions: appendedTransactions.slice(1),
216
+ });
148
217
  }
149
218
 
150
219
  /**
@@ -171,7 +240,7 @@ export class BlockNoteTipTapEditor extends TiptapEditor {
171
240
  {
172
241
  ...this.options.editorProps,
173
242
  // @ts-ignore
174
- dispatchTransaction: this.dispatchTransaction.bind(this),
243
+ dispatchTransaction: this.dispatch.bind(this),
175
244
  state: this.state,
176
245
  markViews,
177
246
  nodeViews: this.extensionManager.nodeViews,
@@ -228,3 +297,17 @@ export class BlockNoteTipTapEditor extends TiptapEditor {
228
297
  // (note: can probably be removed after tiptap upgrade fixed in 2.8.0)
229
298
  this.options.onPaste = this.options.onDrop = undefined;
230
299
  };
300
+
301
+ declare module "@tiptap/core" {
302
+ interface EditorEvents {
303
+ /**
304
+ * This is a custom event that will be emitted in Tiptap V3.
305
+ * We use it to provide the appendedTransactions, until Tiptap V3 is released.
306
+ */
307
+ "v3-update": {
308
+ editor: Editor;
309
+ transaction: Transaction;
310
+ appendedTransactions: Transaction[];
311
+ };
312
+ }
313
+ }
@@ -89,41 +89,39 @@ export class CommentsPlugin extends EventEmitter<any> {
89
89
  * when a thread is resolved or deleted, we need to update the marks to reflect the new state
90
90
  */
91
91
  private updateMarksFromThreads = (threads: Map<string, ThreadData>) => {
92
- const ttEditor = this.editor._tiptapEditor;
93
-
94
- ttEditor.state.doc.descendants((node, pos) => {
95
- node.marks.forEach((mark) => {
96
- if (mark.type.name === this.markType) {
97
- const markType = mark.type;
98
- const markThreadId = mark.attrs.threadId;
99
- const thread = threads.get(markThreadId);
100
- const isOrphan = !!(!thread || thread.resolved || thread.deletedAt);
101
-
102
- if (isOrphan !== mark.attrs.orphan) {
103
- const { tr } = ttEditor.state;
104
- const trimmedFrom = Math.max(pos, 0);
105
- const trimmedTo = Math.min(
106
- pos + node.nodeSize,
107
- ttEditor.state.doc.content.size - 1
108
- );
109
- tr.removeMark(trimmedFrom, trimmedTo, mark);
110
- tr.addMark(
111
- trimmedFrom,
112
- trimmedTo,
113
- markType.create({
114
- ...mark.attrs,
115
- orphan: isOrphan,
116
- })
117
- );
118
- ttEditor.dispatch(tr);
92
+ this.editor.transact((tr) => {
93
+ tr.doc.descendants((node, pos) => {
94
+ node.marks.forEach((mark) => {
95
+ if (mark.type.name === this.markType) {
96
+ const markType = mark.type;
97
+ const markThreadId = mark.attrs.threadId;
98
+ const thread = threads.get(markThreadId);
99
+ const isOrphan = !!(!thread || thread.resolved || thread.deletedAt);
100
+
101
+ if (isOrphan !== mark.attrs.orphan) {
102
+ const trimmedFrom = Math.max(pos, 0);
103
+ const trimmedTo = Math.min(
104
+ pos + node.nodeSize,
105
+ tr.doc.content.size - 1
106
+ );
107
+ tr.removeMark(trimmedFrom, trimmedTo, mark);
108
+ tr.addMark(
109
+ trimmedFrom,
110
+ trimmedTo,
111
+ markType.create({
112
+ ...mark.attrs,
113
+ orphan: isOrphan,
114
+ })
115
+ );
119
116
 
120
- if (isOrphan && this.selectedThreadId === markThreadId) {
121
- // unselect
122
- this.selectedThreadId = undefined;
123
- this.emitStateUpdate();
117
+ if (isOrphan && this.selectedThreadId === markThreadId) {
118
+ // unselect
119
+ this.selectedThreadId = undefined;
120
+ this.emitStateUpdate();
121
+ }
124
122
  }
125
123
  }
126
- }
124
+ });
127
125
  });
128
126
  });
129
127
  };
@@ -262,8 +260,8 @@ export class CommentsPlugin extends EventEmitter<any> {
262
260
  }
263
261
  this.selectedThreadId = threadId;
264
262
  this.emitStateUpdate();
265
- this.editor.dispatch(
266
- this.editor.prosemirrorView!.state.tr.setMeta(PLUGIN_KEY, {
263
+ this.editor.transact((tr) =>
264
+ tr.setMeta(PLUGIN_KEY, {
267
265
  name: SET_SELECTED_THREAD_ID,
268
266
  })
269
267
  );
@@ -45,14 +45,10 @@ export const KeyboardShortcutsExtension = Extension.create<{
45
45
 
46
46
  if (selectionAtBlockStart && !isParagraph) {
47
47
  return commands.command(
48
- updateBlockCommand(
49
- this.options.editor,
50
- blockInfo.bnBlock.beforePos,
51
- {
52
- type: "paragraph",
53
- props: {},
54
- }
55
- )
48
+ updateBlockCommand(blockInfo.bnBlock.beforePos, {
49
+ type: "paragraph",
50
+ props: {},
51
+ })
56
52
  );
57
53
  }
58
54
 
@@ -12,6 +12,7 @@ import {
12
12
  StyleSchema,
13
13
  } from "../../schema/index.js";
14
14
  import { EventEmitter } from "../../util/EventEmitter.js";
15
+ import { getPmSchema } from "../../api/pmUtil.js";
15
16
 
16
17
  export type LinkToolbarState = UiElementPosition & {
17
18
  // The hovered link's URL, and the text it's displayed with in the
@@ -153,17 +154,15 @@ class LinkToolbarView implements PluginView {
153
154
  };
154
155
 
155
156
  editLink(url: string, text: string) {
156
- const tr = this.pmView.state.tr.insertText(
157
- text,
158
- this.linkMarkRange!.from,
159
- this.linkMarkRange!.to
160
- );
161
- tr.addMark(
162
- this.linkMarkRange!.from,
163
- this.linkMarkRange!.from + text.length,
164
- this.pmView.state.schema.mark("link", { href: url })
165
- );
166
- this.editor.dispatch(tr);
157
+ this.editor.transact((tr) => {
158
+ const pmSchema = getPmSchema(tr);
159
+ tr.insertText(text, this.linkMarkRange!.from, this.linkMarkRange!.to);
160
+ tr.addMark(
161
+ this.linkMarkRange!.from,
162
+ this.linkMarkRange!.from + text.length,
163
+ pmSchema.mark("link", { href: url })
164
+ );
165
+ });
167
166
  this.pmView.focus();
168
167
 
169
168
  if (this.state?.show) {
@@ -173,8 +172,8 @@ class LinkToolbarView implements PluginView {
173
172
  }
174
173
 
175
174
  deleteLink() {
176
- this.editor.dispatch(
177
- this.pmView.state.tr
175
+ this.editor.transact((tr) =>
176
+ tr
178
177
  .removeMark(
179
178
  this.linkMarkRange!.from,
180
179
  this.linkMarkRange!.to,
@@ -41,9 +41,7 @@ export class ShowSelectionPlugin {
41
41
 
42
42
  this.enabled = enabled;
43
43
 
44
- this.editor.prosemirrorView?.dispatch(
45
- this.editor.prosemirrorView?.state.tr.setMeta(PLUGIN_KEY, {})
46
- );
44
+ this.editor.transact((tr) => tr.setMeta(PLUGIN_KEY, {}));
47
45
  }
48
46
 
49
47
  public getEnabled() {
@@ -82,6 +82,8 @@ export class MultipleNodeSelection extends Selection {
82
82
  }
83
83
 
84
84
  toJSON(): any {
85
- return { type: "node", anchor: this.anchor, head: this.head };
85
+ return { type: "multiple-node", anchor: this.anchor, head: this.head };
86
86
  }
87
87
  }
88
+
89
+ Selection.jsonID("multiple-node", MultipleNodeSelection);
@@ -201,7 +201,7 @@ export function dragStart<
201
201
 
202
202
  const externalHTMLExporter = createExternalHTMLExporter(schema, editor);
203
203
 
204
- const blocks = fragmentToBlocks(selectedSlice.content, editor.schema);
204
+ const blocks = fragmentToBlocks(selectedSlice.content);
205
205
  const externalHTML = externalHTMLExporter.exportBlocks(blocks, {});
206
206
 
207
207
  const plainText = cleanHTMLToMarkdown(externalHTML);
@@ -10,6 +10,7 @@ import {
10
10
  StyleSchema,
11
11
  } from "../../schema/index.js";
12
12
  import { EventEmitter } from "../../util/EventEmitter.js";
13
+ import { trackPosition } from "../../api/positionMapping.js";
13
14
 
14
15
  const findBlock = findParentNode((node) => node.type.name === "blockContainer");
15
16
 
@@ -114,9 +115,7 @@ class SuggestionMenuView<
114
115
  }
115
116
 
116
117
  closeMenu = () => {
117
- this.editor.dispatch(
118
- this.editor._tiptapEditor.state.tr.setMeta(suggestionMenuPluginKey, null)
119
- );
118
+ this.editor.transact((tr) => tr.setMeta(suggestionMenuPluginKey, null));
120
119
  };
121
120
 
122
121
  clearQuery = () => {
@@ -127,13 +126,14 @@ class SuggestionMenuView<
127
126
  this.editor._tiptapEditor
128
127
  .chain()
129
128
  .focus()
129
+ // TODO need to make an API for this
130
130
  .deleteRange({
131
131
  from:
132
- this.pluginState.queryStartPos! -
132
+ this.pluginState.queryStartPos() -
133
133
  (this.pluginState.deleteTriggerCharacter
134
134
  ? this.pluginState.triggerCharacter!.length
135
135
  : 0),
136
- to: this.editor._tiptapEditor.state.selection.from,
136
+ to: this.editor.transact((tr) => tr.selection.from),
137
137
  })
138
138
  .run();
139
139
  };
@@ -143,7 +143,7 @@ type SuggestionPluginState =
143
143
  | {
144
144
  triggerCharacter: string;
145
145
  deleteTriggerCharacter: boolean;
146
- queryStartPos: number;
146
+ queryStartPos: () => number;
147
147
  query: string;
148
148
  decorationId: string;
149
149
  ignoreQueryLength?: boolean;
@@ -195,7 +195,12 @@ export class SuggestionMenuProseMirrorPlugin<
195
195
  },
196
196
 
197
197
  // Apply changes to the plugin state from an editor transaction.
198
- apply(transaction, prev, _oldState, newState): SuggestionPluginState {
198
+ apply: (
199
+ transaction,
200
+ prev,
201
+ _oldState,
202
+ newState
203
+ ): SuggestionPluginState => {
199
204
  // TODO: More clearly define which transactions should be ignored.
200
205
  if (transaction.getMeta("orderedListIndexing") !== undefined) {
201
206
  return prev;
@@ -214,19 +219,30 @@ export class SuggestionMenuProseMirrorPlugin<
214
219
  ignoreQueryLength?: boolean;
215
220
  } | null = transaction.getMeta(suggestionMenuPluginKey);
216
221
 
217
- // Only opens a menu of no menu is already open
218
222
  if (
219
223
  typeof suggestionPluginTransactionMeta === "object" &&
220
- suggestionPluginTransactionMeta !== null &&
221
- prev === undefined
224
+ suggestionPluginTransactionMeta !== null
222
225
  ) {
226
+ if (prev) {
227
+ // Close the previous menu if it exists
228
+ this.closeMenu();
229
+ }
230
+ const trackedPosition = trackPosition(
231
+ editor,
232
+ newState.selection.from -
233
+ // Need to account for the trigger char that was inserted, so we offset the position by the length of the trigger character.
234
+ suggestionPluginTransactionMeta.triggerCharacter.length
235
+ );
223
236
  return {
224
237
  triggerCharacter:
225
238
  suggestionPluginTransactionMeta.triggerCharacter,
226
239
  deleteTriggerCharacter:
227
240
  suggestionPluginTransactionMeta.deleteTriggerCharacter !==
228
241
  false,
229
- queryStartPos: newState.selection.from,
242
+ // When reading the queryStartPos, we offset the result by the length of the trigger character, to make it easy on the caller
243
+ queryStartPos: () =>
244
+ trackedPosition() +
245
+ suggestionPluginTransactionMeta.triggerCharacter.length,
230
246
  query: "",
231
247
  decorationId: `id_${Math.floor(Math.random() * 0xffffffff)}`,
232
248
  ignoreQueryLength:
@@ -252,7 +268,11 @@ export class SuggestionMenuProseMirrorPlugin<
252
268
  transaction.getMeta("pointer") ||
253
269
  // Moving the caret before the character which triggered the menu should hide it.
254
270
  (prev.triggerCharacter !== undefined &&
255
- newState.selection.from < prev.queryStartPos!)
271
+ newState.selection.from < prev.queryStartPos()) ||
272
+ // Moving the caret to a new block should hide the menu.
273
+ !newState.selection.$from.sameParent(
274
+ newState.doc.resolve(prev.queryStartPos())
275
+ )
256
276
  ) {
257
277
  return undefined;
258
278
  }
@@ -261,7 +281,7 @@ export class SuggestionMenuProseMirrorPlugin<
261
281
 
262
282
  // Updates the current query.
263
283
  next.query = newState.doc.textBetween(
264
- prev.queryStartPos!,
284
+ prev.queryStartPos(),
265
285
  newState.selection.from
266
286
  );
267
287
 
@@ -271,21 +291,14 @@ export class SuggestionMenuProseMirrorPlugin<
271
291
 
272
292
  props: {
273
293
  handleTextInput(view, _from, _to, text) {
274
- const suggestionPluginState: SuggestionPluginState = (
275
- this as Plugin
276
- ).getState(view.state);
277
-
278
- if (
279
- triggerCharacters.includes(text) &&
280
- suggestionPluginState === undefined
281
- ) {
294
+ if (triggerCharacters.includes(text)) {
295
+ view.dispatch(view.state.tr.insertText(text));
282
296
  view.dispatch(
283
297
  view.state.tr
284
- .insertText(text)
285
- .scrollIntoView()
286
298
  .setMeta(suggestionMenuPluginKey, {
287
299
  triggerCharacter: text,
288
300
  })
301
+ .scrollIntoView()
289
302
  );
290
303
 
291
304
  return true;
@@ -324,9 +337,9 @@ export class SuggestionMenuProseMirrorPlugin<
324
337
  // Creates an inline decoration around the trigger character.
325
338
  return DecorationSet.create(state.doc, [
326
339
  Decoration.inline(
327
- suggestionPluginState.queryStartPos! -
340
+ suggestionPluginState.queryStartPos() -
328
341
  suggestionPluginState.triggerCharacter!.length,
329
- suggestionPluginState.queryStartPos!,
342
+ suggestionPluginState.queryStartPos(),
330
343
  {
331
344
  nodeName: "span",
332
345
  class: "bn-suggestion-decorator",
@@ -234,8 +234,8 @@ export function getDefaultSlashMenuItems<
234
234
  });
235
235
 
236
236
  // Immediately open the file toolbar
237
- editor.dispatch(
238
- editor._tiptapEditor.state.tr.setMeta(editor.filePanel!.plugin, {
237
+ editor.transact((tr) =>
238
+ tr.setMeta(editor.filePanel!.plugin, {
239
239
  block: insertedBlock,
240
240
  })
241
241
  );
@@ -253,8 +253,8 @@ export function getDefaultSlashMenuItems<
253
253
  });
254
254
 
255
255
  // Immediately open the file toolbar
256
- editor.dispatch(
257
- editor._tiptapEditor.state.tr.setMeta(editor.filePanel!.plugin, {
256
+ editor.transact((tr) =>
257
+ tr.setMeta(editor.filePanel!.plugin, {
258
258
  block: insertedBlock,
259
259
  })
260
260
  );
@@ -272,8 +272,8 @@ export function getDefaultSlashMenuItems<
272
272
  });
273
273
 
274
274
  // Immediately open the file toolbar
275
- editor.dispatch(
276
- editor._tiptapEditor.state.tr.setMeta(editor.filePanel!.plugin, {
275
+ editor.transact((tr) =>
276
+ tr.setMeta(editor.filePanel!.plugin, {
277
277
  block: insertedBlock,
278
278
  })
279
279
  );
@@ -291,8 +291,8 @@ export function getDefaultSlashMenuItems<
291
291
  });
292
292
 
293
293
  // Immediately open the file toolbar
294
- editor.dispatch(
295
- editor._tiptapEditor.state.tr.setMeta(editor.filePanel!.plugin, {
294
+ editor.transact((tr) =>
295
+ tr.setMeta(editor.filePanel!.plugin, {
296
296
  block: insertedBlock,
297
297
  })
298
298
  );