@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
@@ -22,8 +22,7 @@ import {
22
22
  nestBlock,
23
23
  unnestBlock,
24
24
  } from "../api/blockManipulation/commands/nestBlock/nestBlock.js";
25
- import { removeBlocks } from "../api/blockManipulation/commands/removeBlocks/removeBlocks.js";
26
- import { replaceBlocks } from "../api/blockManipulation/commands/replaceBlocks/replaceBlocks.js";
25
+ import { removeAndInsertBlocks } from "../api/blockManipulation/commands/replaceBlocks/replaceBlocks.js";
27
26
  import { updateBlock } from "../api/blockManipulation/commands/updateBlock/updateBlock.js";
28
27
  import {
29
28
  getBlock,
@@ -94,18 +93,27 @@ import {
94
93
  import { Dictionary } from "../i18n/dictionary.js";
95
94
  import { en } from "../i18n/locales/index.js";
96
95
 
97
- import { Plugin, TextSelection, Transaction } from "@tiptap/pm/state";
96
+ import {
97
+ TextSelection,
98
+ type Command,
99
+ type Plugin,
100
+ type Transaction,
101
+ } from "@tiptap/pm/state";
98
102
  import { dropCursor } from "prosemirror-dropcursor";
99
103
  import { EditorView } from "prosemirror-view";
100
104
  import { ySyncPluginKey } from "y-prosemirror";
101
105
  import { createInternalHTMLSerializer } from "../api/exporters/html/internalHTMLSerializer.js";
102
106
  import { inlineContentToNodes } from "../api/nodeConversions/blockToNode.js";
103
107
  import { nodeToBlock } from "../api/nodeConversions/nodeToBlock.js";
108
+ import {
109
+ BlocksChanged,
110
+ getBlocksChangedByTransaction,
111
+ } from "../api/nodeUtil.js";
112
+ import { nestedListsToBlockNoteStructure } from "../api/parsers/html/util/nestedLists.js";
113
+ import { CodeBlockOptions } from "../blocks/CodeBlockContent/CodeBlockContent.js";
104
114
  import type { ThreadStore, User } from "../comments/index.js";
105
115
  import "../style.css";
106
116
  import { EventEmitter } from "../util/EventEmitter.js";
107
- import { CodeBlockOptions } from "../blocks/CodeBlockContent/CodeBlockContent.js";
108
- import { nestedListsToBlockNoteStructure } from "../api/parsers/html/util/nestedLists.js";
109
117
 
110
118
  export type BlockNoteExtensionFactory = (
111
119
  editor: BlockNoteEditor<any, any, any>
@@ -117,6 +125,12 @@ export type BlockNoteExtension =
117
125
  plugin: Plugin;
118
126
  };
119
127
 
128
+ export type BlockCache<
129
+ BSchema extends BlockSchema = any,
130
+ ISchema extends InlineContentSchema = any,
131
+ SSchema extends StyleSchema = any
132
+ > = WeakMap<Node, Block<BSchema, ISchema, SSchema>>;
133
+
120
134
  export type BlockNoteEditorOptions<
121
135
  BSchema extends BlockSchema,
122
136
  ISchema extends InlineContentSchema,
@@ -416,7 +430,7 @@ export class BlockNoteEditor<
416
430
  * This is especially useful when we want to keep track of the same block across multiple operations,
417
431
  * with this cache, blocks stay the same object reference (referential equality with ===).
418
432
  */
419
- public blockCache = new WeakMap<Node, Block<any, any, any>>();
433
+ public blockCache: BlockCache = new WeakMap();
420
434
 
421
435
  /**
422
436
  * The dictionary contains translations for the editor.
@@ -723,12 +737,127 @@ export class BlockNoteEditor<
723
737
  // but we still need the schema
724
738
  this.pmSchema = getSchema(tiptapOptions.extensions!);
725
739
  }
740
+ this.pmSchema.cached.blockNoteEditor = this;
726
741
  this.emit("create");
727
742
  }
728
743
 
729
- dispatch = (tr: Transaction) => {
730
- this._tiptapEditor.dispatch(tr);
731
- };
744
+ /**
745
+ * Stores the currently active transaction, which is the accumulated transaction from all {@link dispatch} calls during a {@link transact} calls
746
+ */
747
+ private activeTransaction: Transaction | null = null;
748
+
749
+ /**
750
+ * Execute a prosemirror command. This is mostly for backwards compatibility with older code.
751
+ *
752
+ * @note You should prefer the {@link transact} method when possible, as it will automatically handle the dispatching of the transaction and work across blocknote transactions.
753
+ *
754
+ * @example
755
+ * ```ts
756
+ * editor.exec((state, dispatch, view) => {
757
+ * dispatch(state.tr.insertText("Hello, world!"));
758
+ * });
759
+ * ```
760
+ */
761
+ public exec(command: Command) {
762
+ if (this.activeTransaction) {
763
+ throw new Error(
764
+ "`exec` should not be called within a `transact` call, move the `exec` call outside of the `transact` call"
765
+ );
766
+ }
767
+ const state = this._tiptapEditor.state;
768
+ const view = this._tiptapEditor.view;
769
+ const dispatch = (tr: Transaction) => this._tiptapEditor.dispatch(tr);
770
+
771
+ return command(state, dispatch, view);
772
+ }
773
+
774
+ /**
775
+ * Check if a command can be executed. A command should return `false` if it is not valid in the current state.
776
+ *
777
+ * @example
778
+ * ```ts
779
+ * if (editor.canExec(command)) {
780
+ * // show button
781
+ * } else {
782
+ * // hide button
783
+ * }
784
+ * ```
785
+ */
786
+ public canExec(command: Command): boolean {
787
+ if (this.activeTransaction) {
788
+ throw new Error(
789
+ "`canExec` should not be called within a `transact` call, move the `canExec` call outside of the `transact` call"
790
+ );
791
+ }
792
+ const state = this._tiptapEditor.state;
793
+ const view = this._tiptapEditor.view;
794
+
795
+ return command(state, undefined, view);
796
+ }
797
+
798
+ /**
799
+ * Execute a function within a "blocknote transaction".
800
+ * All changes to the editor within the transaction will be grouped together, so that
801
+ * we can dispatch them as a single operation (thus creating only a single undo step)
802
+ *
803
+ * @note There is no need to dispatch the transaction, as it will be automatically dispatched when the callback is complete.
804
+ *
805
+ * @example
806
+ * ```ts
807
+ * // All changes to the editor will be grouped together
808
+ * editor.transact((tr) => {
809
+ * tr.insertText("Hello, world!");
810
+ * // These two operations will be grouped together in a single undo step
811
+ * editor.transact((tr) => {
812
+ * tr.insertText("Hello, world!");
813
+ * });
814
+ * });
815
+ * ```
816
+ */
817
+ public transact<T>(
818
+ callback: (
819
+ /**
820
+ * The current active transaction, this will automatically be dispatched to the editor when the callback is complete
821
+ * If another `transact` call is made within the callback, it will be passed the same transaction as the parent call.
822
+ */
823
+ tr: Transaction
824
+ ) => T
825
+ ): T {
826
+ if (this.activeTransaction) {
827
+ // Already in a transaction, so we can just callback immediately
828
+ return callback(this.activeTransaction);
829
+ }
830
+
831
+ try {
832
+ // Enter transaction mode, by setting a starting transaction
833
+ this.activeTransaction = this._tiptapEditor.state.tr;
834
+
835
+ // Capture all dispatch'd transactions
836
+ const result = callback(this.activeTransaction);
837
+
838
+ // Any transactions captured by the `dispatch` call will be stored in `this.activeTransaction`
839
+ const activeTr = this.activeTransaction;
840
+
841
+ this.activeTransaction = null;
842
+ if (
843
+ activeTr &&
844
+ // Only dispatch if the transaction was actually modified in some way
845
+ (activeTr.docChanged ||
846
+ activeTr.selectionSet ||
847
+ activeTr.scrolledIntoView ||
848
+ activeTr.storedMarksSet ||
849
+ !activeTr.isGeneric)
850
+ ) {
851
+ // Dispatch the transaction if it was modified
852
+ this._tiptapEditor.dispatch(activeTr);
853
+ }
854
+
855
+ return result;
856
+ } finally {
857
+ // We wrap this in a finally block to ensure we don't disable future transactions just because of an error in the callback
858
+ this.activeTransaction = null;
859
+ }
860
+ }
732
861
 
733
862
  /**
734
863
  * Mount the editor to a parent DOM element. Call mount(undefined) to clean up
@@ -749,13 +878,6 @@ export class BlockNoteEditor<
749
878
  return this._tiptapEditor.view;
750
879
  }
751
880
 
752
- /**
753
- * Get the underlying prosemirror state
754
- */
755
- public get prosemirrorState() {
756
- return this._tiptapEditor.state;
757
- }
758
-
759
881
  public get domElement() {
760
882
  return this.prosemirrorView?.dom as HTMLDivElement | undefined;
761
883
  }
@@ -802,23 +924,17 @@ export class BlockNoteEditor<
802
924
  * @returns A snapshot of all top-level (non-nested) blocks in the editor.
803
925
  */
804
926
  public get document(): Block<BSchema, ISchema, SSchema>[] {
805
- const blocks: Block<BSchema, ISchema, SSchema>[] = [];
806
-
807
- this.prosemirrorState.doc.firstChild!.descendants((node) => {
808
- blocks.push(
809
- nodeToBlock(
810
- node,
811
- this.schema.blockSchema,
812
- this.schema.inlineContentSchema,
813
- this.schema.styleSchema,
814
- this.blockCache
815
- )
816
- );
927
+ return this.transact((tr) => {
928
+ const blocks: Block<BSchema, ISchema, SSchema>[] = [];
817
929
 
818
- return false;
819
- });
930
+ tr.doc.firstChild!.descendants((node) => {
931
+ blocks.push(nodeToBlock(node, this.pmSchema));
932
+
933
+ return false;
934
+ });
820
935
 
821
- return blocks;
936
+ return blocks;
937
+ });
822
938
  }
823
939
 
824
940
  /**
@@ -831,7 +947,7 @@ export class BlockNoteEditor<
831
947
  public getBlock(
832
948
  blockIdentifier: BlockIdentifier
833
949
  ): Block<BSchema, ISchema, SSchema> | undefined {
834
- return getBlock(this, blockIdentifier);
950
+ return this.transact((tr) => getBlock(tr.doc, blockIdentifier));
835
951
  }
836
952
 
837
953
  /**
@@ -846,7 +962,7 @@ export class BlockNoteEditor<
846
962
  public getPrevBlock(
847
963
  blockIdentifier: BlockIdentifier
848
964
  ): Block<BSchema, ISchema, SSchema> | undefined {
849
- return getPrevBlock(this, blockIdentifier);
965
+ return this.transact((tr) => getPrevBlock(tr.doc, blockIdentifier));
850
966
  }
851
967
 
852
968
  /**
@@ -860,7 +976,7 @@ export class BlockNoteEditor<
860
976
  public getNextBlock(
861
977
  blockIdentifier: BlockIdentifier
862
978
  ): Block<BSchema, ISchema, SSchema> | undefined {
863
- return getNextBlock(this, blockIdentifier);
979
+ return this.transact((tr) => getNextBlock(tr.doc, blockIdentifier));
864
980
  }
865
981
 
866
982
  /**
@@ -873,7 +989,7 @@ export class BlockNoteEditor<
873
989
  public getParentBlock(
874
990
  blockIdentifier: BlockIdentifier
875
991
  ): Block<BSchema, ISchema, SSchema> | undefined {
876
- return getParentBlock(this, blockIdentifier);
992
+ return this.transact((tr) => getParentBlock(tr.doc, blockIdentifier));
877
993
  }
878
994
 
879
995
  /**
@@ -943,7 +1059,7 @@ export class BlockNoteEditor<
943
1059
  ISchema,
944
1060
  SSchema
945
1061
  > {
946
- return getTextCursorPosition(this);
1062
+ return this.transact((tr) => getTextCursorPosition(tr));
947
1063
  }
948
1064
 
949
1065
  /**
@@ -956,18 +1072,25 @@ export class BlockNoteEditor<
956
1072
  targetBlock: BlockIdentifier,
957
1073
  placement: "start" | "end" = "start"
958
1074
  ) {
959
- setTextCursorPosition(this, targetBlock, placement);
1075
+ return this.transact((tr) =>
1076
+ setTextCursorPosition(tr, targetBlock, placement)
1077
+ );
960
1078
  }
961
1079
 
962
1080
  /**
963
1081
  * Gets a snapshot of the current selection.
964
1082
  */
965
1083
  public getSelection(): Selection<BSchema, ISchema, SSchema> | undefined {
966
- return getSelection(this);
1084
+ return this.transact((tr) => getSelection(tr));
967
1085
  }
968
1086
 
1087
+ /**
1088
+ * Sets the selection to a range of blocks.
1089
+ * @param startBlock The identifier of the block that should be the start of the selection.
1090
+ * @param endBlock The identifier of the block that should be the end of the selection.
1091
+ */
969
1092
  public setSelection(startBlock: BlockIdentifier, endBlock: BlockIdentifier) {
970
- setSelection(this, startBlock, endBlock);
1093
+ return this.transact((tr) => setSelection(tr, startBlock, endBlock));
971
1094
  }
972
1095
 
973
1096
  /**
@@ -1016,7 +1139,9 @@ export class BlockNoteEditor<
1016
1139
  referenceBlock: BlockIdentifier,
1017
1140
  placement: "before" | "after" = "before"
1018
1141
  ) {
1019
- return insertBlocks(this, blocksToInsert, referenceBlock, placement);
1142
+ return this.transact((tr) =>
1143
+ insertBlocks(tr, blocksToInsert, referenceBlock, placement)
1144
+ );
1020
1145
  }
1021
1146
 
1022
1147
  /**
@@ -1030,7 +1155,7 @@ export class BlockNoteEditor<
1030
1155
  blockToUpdate: BlockIdentifier,
1031
1156
  update: PartialBlock<BSchema, ISchema, SSchema>
1032
1157
  ) {
1033
- return updateBlock(this, blockToUpdate, update);
1158
+ return this.transact((tr) => updateBlock(tr, blockToUpdate, update));
1034
1159
  }
1035
1160
 
1036
1161
  /**
@@ -1038,7 +1163,9 @@ export class BlockNoteEditor<
1038
1163
  * @param blocksToRemove An array of identifiers for existing blocks that should be removed.
1039
1164
  */
1040
1165
  public removeBlocks(blocksToRemove: BlockIdentifier[]) {
1041
- return removeBlocks(this, blocksToRemove);
1166
+ return this.transact(
1167
+ (tr) => removeAndInsertBlocks(tr, blocksToRemove, []).removedBlocks
1168
+ );
1042
1169
  }
1043
1170
 
1044
1171
  /**
@@ -1052,7 +1179,9 @@ export class BlockNoteEditor<
1052
1179
  blocksToRemove: BlockIdentifier[],
1053
1180
  blocksToInsert: PartialBlock<BSchema, ISchema, SSchema>[]
1054
1181
  ) {
1055
- return replaceBlocks(this, blocksToRemove, blocksToInsert);
1182
+ return this.transact((tr) =>
1183
+ removeAndInsertBlocks(tr, blocksToRemove, blocksToInsert)
1184
+ );
1056
1185
  }
1057
1186
 
1058
1187
  /**
@@ -1061,52 +1190,52 @@ export class BlockNoteEditor<
1061
1190
  * @param content can be a string, or array of partial inline content elements
1062
1191
  */
1063
1192
  public insertInlineContent(content: PartialInlineContent<ISchema, SSchema>) {
1064
- const nodes = inlineContentToNodes(
1065
- content,
1066
- this.pmSchema,
1067
- this.schema.styleSchema
1068
- );
1069
-
1070
- insertContentAt(
1071
- {
1072
- from: this._tiptapEditor.state.selection.from,
1073
- to: this._tiptapEditor.state.selection.to,
1074
- },
1075
- nodes,
1076
- this
1077
- );
1193
+ const nodes = inlineContentToNodes(content, this.pmSchema);
1194
+
1195
+ this.transact((tr) => {
1196
+ insertContentAt(
1197
+ tr,
1198
+ {
1199
+ from: tr.selection.from,
1200
+ to: tr.selection.to,
1201
+ },
1202
+ nodes
1203
+ );
1204
+ });
1078
1205
  }
1079
1206
 
1080
1207
  /**
1081
1208
  * Gets the active text styles at the text cursor position or at the end of the current selection if it's active.
1082
1209
  */
1083
1210
  public getActiveStyles() {
1084
- const styles: Styles<SSchema> = {};
1085
- const marks = this._tiptapEditor.state.selection.$to.marks();
1086
-
1087
- for (const mark of marks) {
1088
- const config = this.schema.styleSchema[mark.type.name];
1089
- if (!config) {
1090
- if (
1091
- // Links are not considered styles in blocknote
1092
- mark.type.name !== "link" &&
1093
- // "blocknoteIgnore" tagged marks (such as comments) are also not considered BlockNote "styles"
1094
- !mark.type.spec.blocknoteIgnore
1095
- ) {
1096
- // eslint-disable-next-line no-console
1097
- console.warn("mark not found in styleschema", mark.type.name);
1211
+ return this.transact((tr) => {
1212
+ const styles: Styles<SSchema> = {};
1213
+ const marks = tr.selection.$to.marks();
1214
+
1215
+ for (const mark of marks) {
1216
+ const config = this.schema.styleSchema[mark.type.name];
1217
+ if (!config) {
1218
+ if (
1219
+ // Links are not considered styles in blocknote
1220
+ mark.type.name !== "link" &&
1221
+ // "blocknoteIgnore" tagged marks (such as comments) are also not considered BlockNote "styles"
1222
+ !mark.type.spec.blocknoteIgnore
1223
+ ) {
1224
+ // eslint-disable-next-line no-console
1225
+ console.warn("mark not found in styleschema", mark.type.name);
1226
+ }
1227
+
1228
+ continue;
1229
+ }
1230
+ if (config.propSchema === "boolean") {
1231
+ (styles as any)[config.type] = true;
1232
+ } else {
1233
+ (styles as any)[config.type] = mark.attrs.stringValue;
1098
1234
  }
1099
-
1100
- continue;
1101
- }
1102
- if (config.propSchema === "boolean") {
1103
- (styles as any)[config.type] = true;
1104
- } else {
1105
- (styles as any)[config.type] = mark.attrs.stringValue;
1106
1235
  }
1107
- }
1108
1236
 
1109
- return styles;
1237
+ return styles;
1238
+ });
1110
1239
  }
1111
1240
 
1112
1241
  /**
@@ -1163,10 +1292,9 @@ export class BlockNoteEditor<
1163
1292
  * Gets the currently selected text.
1164
1293
  */
1165
1294
  public getSelectedText() {
1166
- return this._tiptapEditor.state.doc.textBetween(
1167
- this._tiptapEditor.state.selection.from,
1168
- this._tiptapEditor.state.selection.to
1169
- );
1295
+ return this.transact((tr) => {
1296
+ return tr.doc.textBetween(tr.selection.from, tr.selection.to);
1297
+ });
1170
1298
  }
1171
1299
 
1172
1300
  /**
@@ -1185,21 +1313,20 @@ export class BlockNoteEditor<
1185
1313
  if (url === "") {
1186
1314
  return;
1187
1315
  }
1188
-
1189
- const { from, to } = this._tiptapEditor.state.selection;
1190
1316
  const mark = this.pmSchema.mark("link", { href: url });
1317
+ this.transact((tr) => {
1318
+ const { from, to } = tr.selection;
1191
1319
 
1192
- this.dispatch(
1193
- text
1194
- ? this._tiptapEditor.state.tr
1195
- .insertText(text, from, to)
1196
- .addMark(from, from + text.length, mark)
1197
- : this._tiptapEditor.state.tr
1198
- .setSelection(
1199
- TextSelection.create(this._tiptapEditor.state.tr.doc, to)
1200
- )
1201
- .addMark(from, to, mark)
1202
- );
1320
+ if (text) {
1321
+ tr.insertText(text, from, to).addMark(from, from + text.length, mark);
1322
+ } else {
1323
+ tr.setSelection(TextSelection.create(tr.doc, to)).addMark(
1324
+ from,
1325
+ to,
1326
+ mark
1327
+ );
1328
+ }
1329
+ });
1203
1330
  }
1204
1331
 
1205
1332
  /**
@@ -1236,7 +1363,7 @@ export class BlockNoteEditor<
1236
1363
  * current blocks share a common parent, moves them out of & before it.
1237
1364
  */
1238
1365
  public moveBlocksUp() {
1239
- moveBlocksUp(this);
1366
+ return moveBlocksUp(this);
1240
1367
  }
1241
1368
 
1242
1369
  /**
@@ -1245,7 +1372,7 @@ export class BlockNoteEditor<
1245
1372
  * current blocks share a common parent, moves them out of & after it.
1246
1373
  */
1247
1374
  public moveBlocksDown() {
1248
- moveBlocksDown(this);
1375
+ return moveBlocksDown(this);
1249
1376
  }
1250
1377
 
1251
1378
  /**
@@ -1287,13 +1414,7 @@ export class BlockNoteEditor<
1287
1414
  public async tryParseHTMLToBlocks(
1288
1415
  html: string
1289
1416
  ): Promise<Block<BSchema, ISchema, SSchema>[]> {
1290
- return HTMLToBlocks(
1291
- html,
1292
- this.schema.blockSchema,
1293
- this.schema.inlineContentSchema,
1294
- this.schema.styleSchema,
1295
- this.pmSchema
1296
- );
1417
+ return HTMLToBlocks(html, this.pmSchema);
1297
1418
  }
1298
1419
 
1299
1420
  /**
@@ -1318,13 +1439,7 @@ export class BlockNoteEditor<
1318
1439
  public async tryParseMarkdownToBlocks(
1319
1440
  markdown: string
1320
1441
  ): Promise<Block<BSchema, ISchema, SSchema>[]> {
1321
- return markdownToBlocks(
1322
- markdown,
1323
- this.schema.blockSchema,
1324
- this.schema.inlineContentSchema,
1325
- this.schema.styleSchema,
1326
- this.pmSchema
1327
- );
1442
+ return markdownToBlocks(markdown, this.pmSchema);
1328
1443
  }
1329
1444
 
1330
1445
  /**
@@ -1346,21 +1461,38 @@ export class BlockNoteEditor<
1346
1461
  * @returns A function to remove the callback.
1347
1462
  */
1348
1463
  public onChange(
1349
- callback: (editor: BlockNoteEditor<BSchema, ISchema, SSchema>) => void
1464
+ callback: (
1465
+ editor: BlockNoteEditor<BSchema, ISchema, SSchema>,
1466
+ context: {
1467
+ /**
1468
+ * Returns the blocks that were inserted, updated, or deleted by the change that occurred.
1469
+ */
1470
+ getChanges(): BlocksChanged<BSchema, ISchema, SSchema>;
1471
+ }
1472
+ ) => void
1350
1473
  ) {
1351
1474
  if (this.headless) {
1352
1475
  // Note: would be nice if this is possible in headless mode as well
1353
1476
  return;
1354
1477
  }
1355
1478
 
1356
- const cb = () => {
1357
- callback(this);
1479
+ const cb = ({
1480
+ transaction,
1481
+ appendedTransactions,
1482
+ }: {
1483
+ transaction: Transaction;
1484
+ appendedTransactions: Transaction[];
1485
+ }) => {
1486
+ callback(this, {
1487
+ getChanges: () =>
1488
+ getBlocksChangedByTransaction(transaction, appendedTransactions),
1489
+ });
1358
1490
  };
1359
1491
 
1360
- this._tiptapEditor.on("update", cb);
1492
+ this._tiptapEditor.on("v3-update", cb);
1361
1493
 
1362
1494
  return () => {
1363
- this._tiptapEditor.off("update", cb);
1495
+ this._tiptapEditor.off("v3-update", cb);
1364
1496
  };
1365
1497
  }
1366
1498
 
@@ -1451,24 +1583,21 @@ export class BlockNoteEditor<
1451
1583
  ignoreQueryLength?: boolean;
1452
1584
  }
1453
1585
  ) {
1454
- const tr = this.prosemirrorView?.state.tr;
1455
- if (!tr) {
1586
+ if (!this.prosemirrorView) {
1456
1587
  return;
1457
1588
  }
1458
1589
 
1459
- const transaction =
1460
- pluginState && pluginState.deleteTriggerCharacter
1461
- ? tr.insertText(triggerCharacter)
1462
- : tr;
1463
-
1464
- this.prosemirrorView.focus();
1465
- this.prosemirrorView.dispatch(
1466
- transaction.scrollIntoView().setMeta(this.suggestionMenus.plugin, {
1590
+ this.focus();
1591
+ this.transact((tr) => {
1592
+ if (pluginState?.deleteTriggerCharacter) {
1593
+ tr.insertText(triggerCharacter);
1594
+ }
1595
+ tr.scrollIntoView().setMeta(this.suggestionMenus.plugin, {
1467
1596
  triggerCharacter: triggerCharacter,
1468
1597
  deleteTriggerCharacter: pluginState?.deleteTriggerCharacter || false,
1469
1598
  ignoreQueryLength: pluginState?.ignoreQueryLength || false,
1470
- })
1471
- );
1599
+ });
1600
+ });
1472
1601
  }
1473
1602
 
1474
1603
  // `forceSelectionVisible` determines whether the editor selection is shows