@blocknote/core 0.18.0 → 0.19.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 (508) hide show
  1. package/dist/blocknote.js +2191 -2068
  2. package/dist/blocknote.js.map +1 -1
  3. package/dist/blocknote.umd.cjs +9 -9
  4. package/dist/blocknote.umd.cjs.map +1 -1
  5. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js +27 -0
  6. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js.map +1 -0
  7. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js +99 -0
  8. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js.map +1 -0
  9. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js +97 -0
  10. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js.map +1 -0
  11. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js +88 -0
  12. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js.map +1 -0
  13. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.js +116 -0
  14. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.js.map +1 -0
  15. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.test.js +106 -0
  16. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.test.js.map +1 -0
  17. package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js +57 -0
  18. package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js.map +1 -0
  19. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js +43 -0
  20. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js.map +1 -0
  21. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js +27 -0
  22. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js.map +1 -0
  23. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js +29 -0
  24. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js.map +1 -0
  25. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js +157 -0
  26. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js.map +1 -0
  27. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js +27 -0
  28. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js.map +1 -0
  29. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js +64 -0
  30. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js.map +1 -0
  31. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js +145 -0
  32. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js.map +1 -0
  33. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js +252 -0
  34. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js.map +1 -0
  35. package/dist/src/api/blockManipulation/insertContentAt.js +64 -0
  36. package/dist/src/api/blockManipulation/insertContentAt.js.map +1 -0
  37. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js +76 -0
  38. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js.map +1 -0
  39. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js +33 -0
  40. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js.map +1 -0
  41. package/dist/src/api/blockManipulation/setupTestEnv.js +172 -0
  42. package/dist/src/api/blockManipulation/setupTestEnv.js.map +1 -0
  43. package/dist/src/api/clipboard/clipboard.test.js +246 -0
  44. package/dist/src/api/clipboard/clipboard.test.js.map +1 -0
  45. package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js +8 -0
  46. package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js.map +1 -0
  47. package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js +38 -0
  48. package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js.map +1 -0
  49. package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js +109 -0
  50. package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js.map +1 -0
  51. package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js +26 -0
  52. package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js.map +1 -0
  53. package/dist/src/api/clipboard/fromClipboard/pasteExtension.js +57 -0
  54. package/dist/src/api/clipboard/fromClipboard/pasteExtension.js.map +1 -0
  55. package/dist/src/api/clipboard/toClipboard/copyExtension.js +132 -0
  56. package/dist/src/api/clipboard/toClipboard/copyExtension.js.map +1 -0
  57. package/dist/src/api/exporters/html/externalHTMLExporter.js +35 -0
  58. package/dist/src/api/exporters/html/externalHTMLExporter.js.map +1 -0
  59. package/dist/src/api/exporters/html/htmlConversion.test.js +72 -0
  60. package/dist/src/api/exporters/html/htmlConversion.test.js.map +1 -0
  61. package/dist/src/api/exporters/html/internalHTMLSerializer.js +21 -0
  62. package/dist/src/api/exporters/html/internalHTMLSerializer.js.map +1 -0
  63. package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js +141 -0
  64. package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js.map +1 -0
  65. package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js +96 -0
  66. package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js.map +1 -0
  67. package/dist/src/api/exporters/markdown/markdownExporter.js +31 -0
  68. package/dist/src/api/exporters/markdown/markdownExporter.js.map +1 -0
  69. package/dist/src/api/exporters/markdown/markdownExporter.test.js +57 -0
  70. package/dist/src/api/exporters/markdown/markdownExporter.test.js.map +1 -0
  71. package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js +33 -0
  72. package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js.map +1 -0
  73. package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js +37 -0
  74. package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js.map +1 -0
  75. package/dist/src/api/getBlockInfoFromPos.js +171 -0
  76. package/dist/src/api/getBlockInfoFromPos.js.map +1 -0
  77. package/dist/src/api/nodeConversions/blockToNode.js +197 -0
  78. package/dist/src/api/nodeConversions/blockToNode.js.map +1 -0
  79. package/dist/src/api/nodeConversions/fragmentToBlocks.js +50 -0
  80. package/dist/src/api/nodeConversions/fragmentToBlocks.js.map +1 -0
  81. package/dist/src/api/nodeConversions/nodeConversions.test.js +54 -0
  82. package/dist/src/api/nodeConversions/nodeConversions.test.js.map +1 -0
  83. package/dist/src/api/nodeConversions/nodeToBlock.js +316 -0
  84. package/dist/src/api/nodeConversions/nodeToBlock.js.map +1 -0
  85. package/dist/src/api/nodeUtil.js +28 -0
  86. package/dist/src/api/nodeUtil.js.map +1 -0
  87. package/dist/src/api/parsers/html/parseHTML.js +19 -0
  88. package/dist/src/api/parsers/html/parseHTML.js.map +1 -0
  89. package/dist/src/api/parsers/html/parseHTML.test.js +470 -0
  90. package/dist/src/api/parsers/html/parseHTML.test.js.map +1 -0
  91. package/dist/src/api/parsers/html/util/nestedLists.js +106 -0
  92. package/dist/src/api/parsers/html/util/nestedLists.js.map +1 -0
  93. package/dist/src/api/parsers/html/util/nestedLists.test.js +166 -0
  94. package/dist/src/api/parsers/html/util/nestedLists.test.js.map +1 -0
  95. package/dist/src/api/parsers/markdown/parseMarkdown.js +52 -0
  96. package/dist/src/api/parsers/markdown/parseMarkdown.js.map +1 -0
  97. package/dist/src/api/parsers/markdown/parseMarkdown.test.js +109 -0
  98. package/dist/src/api/parsers/markdown/parseMarkdown.test.js.map +1 -0
  99. package/dist/src/api/testUtil/cases/customBlocks.js +313 -0
  100. package/dist/src/api/testUtil/cases/customBlocks.js.map +1 -0
  101. package/dist/src/api/testUtil/cases/customInlineContent.js +91 -0
  102. package/dist/src/api/testUtil/cases/customInlineContent.js.map +1 -0
  103. package/dist/src/api/testUtil/cases/customStyles.js +83 -0
  104. package/dist/src/api/testUtil/cases/customStyles.js.map +1 -0
  105. package/dist/src/api/testUtil/cases/defaultSchema.js +673 -0
  106. package/dist/src/api/testUtil/cases/defaultSchema.js.map +1 -0
  107. package/dist/src/api/testUtil/index.js +2 -0
  108. package/dist/src/api/testUtil/index.js.map +1 -0
  109. package/dist/src/api/testUtil/partialBlockTestUtil.js +114 -0
  110. package/dist/src/api/testUtil/partialBlockTestUtil.js.map +1 -0
  111. package/dist/src/api/testUtil/paste.js +29 -0
  112. package/dist/src/api/testUtil/paste.js.map +1 -0
  113. package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js +97 -0
  114. package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js.map +1 -0
  115. package/dist/src/blocks/AudioBlockContent/audioBlockHelpers.js +5 -0
  116. package/dist/src/blocks/AudioBlockContent/audioBlockHelpers.js.map +1 -0
  117. package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js +273 -0
  118. package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js.map +1 -0
  119. package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js +90 -0
  120. package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js.map +1 -0
  121. package/dist/src/blocks/FileBlockContent/FileBlockContent.js +70 -0
  122. package/dist/src/blocks/FileBlockContent/FileBlockContent.js.map +1 -0
  123. package/dist/src/blocks/FileBlockContent/fileBlockHelpers.js +317 -0
  124. package/dist/src/blocks/FileBlockContent/fileBlockHelpers.js.map +1 -0
  125. package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js +15 -0
  126. package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js.map +1 -0
  127. package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js +141 -0
  128. package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js.map +1 -0
  129. package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js +106 -0
  130. package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js.map +1 -0
  131. package/dist/src/blocks/ImageBlockContent/imageBlockHelpers.js +6 -0
  132. package/dist/src/blocks/ImageBlockContent/imageBlockHelpers.js.map +1 -0
  133. package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js +111 -0
  134. package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js.map +1 -0
  135. package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js +218 -0
  136. package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js.map +1 -0
  137. package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js +41 -0
  138. package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js.map +1 -0
  139. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js +58 -0
  140. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js.map +1 -0
  141. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js +128 -0
  142. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js.map +1 -0
  143. package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js +51 -0
  144. package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js.map +1 -0
  145. package/dist/src/blocks/TableBlockContent/TableBlockContent.js +130 -0
  146. package/dist/src/blocks/TableBlockContent/TableBlockContent.js.map +1 -0
  147. package/dist/src/blocks/TableBlockContent/TableExtension.js +57 -0
  148. package/dist/src/blocks/TableBlockContent/TableExtension.js.map +1 -0
  149. package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js +103 -0
  150. package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js.map +1 -0
  151. package/dist/src/blocks/VideoBlockContent/videoBlockHelpers.js +6 -0
  152. package/dist/src/blocks/VideoBlockContent/videoBlockHelpers.js.map +1 -0
  153. package/dist/src/blocks/defaultBlockHelpers.js +50 -0
  154. package/dist/src/blocks/defaultBlockHelpers.js.map +1 -0
  155. package/dist/src/blocks/defaultBlockTypeGuards.js +40 -0
  156. package/dist/src/blocks/defaultBlockTypeGuards.js.map +1 -0
  157. package/dist/src/blocks/defaultBlocks.js +50 -0
  158. package/dist/src/blocks/defaultBlocks.js.map +1 -0
  159. package/dist/src/blocks/defaultProps.js +19 -0
  160. package/dist/src/blocks/defaultProps.js.map +1 -0
  161. package/dist/src/editor/BlockNoteEditor.js +750 -0
  162. package/dist/src/editor/BlockNoteEditor.js.map +1 -0
  163. package/dist/src/editor/BlockNoteEditor.test.js +65 -0
  164. package/dist/src/editor/BlockNoteEditor.test.js.map +1 -0
  165. package/dist/src/editor/BlockNoteExtensions.js +149 -0
  166. package/dist/src/editor/BlockNoteExtensions.js.map +1 -0
  167. package/dist/src/editor/BlockNoteSchema.js +38 -0
  168. package/dist/src/editor/BlockNoteSchema.js.map +1 -0
  169. package/dist/src/editor/BlockNoteTipTapEditor.js +169 -0
  170. package/dist/src/editor/BlockNoteTipTapEditor.js.map +1 -0
  171. package/dist/src/editor/cursorPositionTypes.js +2 -0
  172. package/dist/src/editor/cursorPositionTypes.js.map +1 -0
  173. package/dist/src/editor/defaultColors.js +77 -0
  174. package/dist/src/editor/defaultColors.js.map +1 -0
  175. package/dist/src/editor/selectionTypes.js +2 -0
  176. package/dist/src/editor/selectionTypes.js.map +1 -0
  177. package/dist/src/editor/transformPasted.js +79 -0
  178. package/dist/src/editor/transformPasted.js.map +1 -0
  179. package/dist/src/exporter/Exporter.js +36 -0
  180. package/dist/src/exporter/Exporter.js.map +1 -0
  181. package/dist/src/exporter/index.js +3 -0
  182. package/dist/src/exporter/index.js.map +1 -0
  183. package/dist/src/exporter/mapping.js +12 -0
  184. package/dist/src/exporter/mapping.js.map +1 -0
  185. package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js +30 -0
  186. package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js.map +1 -0
  187. package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js +39 -0
  188. package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js.map +1 -0
  189. package/dist/src/extensions/FilePanel/FilePanelPlugin.js +131 -0
  190. package/dist/src/extensions/FilePanel/FilePanelPlugin.js.map +1 -0
  191. package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js +195 -0
  192. package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js.map +1 -0
  193. package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js +309 -0
  194. package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js.map +1 -0
  195. package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js +247 -0
  196. package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js.map +1 -0
  197. package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js +51 -0
  198. package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js.map +1 -0
  199. package/dist/src/extensions/Placeholder/PlaceholderPlugin.js +81 -0
  200. package/dist/src/extensions/Placeholder/PlaceholderPlugin.js.map +1 -0
  201. package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js +183 -0
  202. package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js.map +1 -0
  203. package/dist/src/extensions/SideMenu/MultipleNodeSelection.js +68 -0
  204. package/dist/src/extensions/SideMenu/MultipleNodeSelection.js.map +1 -0
  205. package/dist/src/extensions/SideMenu/SideMenuPlugin.js +339 -0
  206. package/dist/src/extensions/SideMenu/SideMenuPlugin.js.map +1 -0
  207. package/dist/src/extensions/SideMenu/dragging.js +128 -0
  208. package/dist/src/extensions/SideMenu/dragging.js.map +1 -0
  209. package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js +2 -0
  210. package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js.map +1 -0
  211. package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js +2 -0
  212. package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js.map +1 -0
  213. package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js +245 -0
  214. package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js.map +1 -0
  215. package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js +26 -0
  216. package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js.map +1 -0
  217. package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js +244 -0
  218. package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js.map +1 -0
  219. package/dist/src/extensions/TableHandles/TableHandlesPlugin.js +553 -0
  220. package/dist/src/extensions/TableHandles/TableHandlesPlugin.js.map +1 -0
  221. package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js +36 -0
  222. package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js.map +1 -0
  223. package/dist/src/extensions/TextColor/TextColorExtension.js +29 -0
  224. package/dist/src/extensions/TextColor/TextColorExtension.js.map +1 -0
  225. package/dist/src/extensions/TextColor/TextColorMark.js +37 -0
  226. package/dist/src/extensions/TextColor/TextColorMark.js.map +1 -0
  227. package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js +58 -0
  228. package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js.map +1 -0
  229. package/dist/src/extensions/UniqueID/UniqueID.js +283 -0
  230. package/dist/src/extensions/UniqueID/UniqueID.js.map +1 -0
  231. package/dist/src/extensions/getDraggableBlockFromElement.js +13 -0
  232. package/dist/src/extensions/getDraggableBlockFromElement.js.map +1 -0
  233. package/dist/src/extensions-shared/UiElementPosition.js +2 -0
  234. package/dist/src/extensions-shared/UiElementPosition.js.map +1 -0
  235. package/dist/src/i18n/dictionary.js +4 -0
  236. package/dist/src/i18n/dictionary.js.map +1 -0
  237. package/dist/src/i18n/locales/ar.js +298 -0
  238. package/dist/src/i18n/locales/ar.js.map +1 -0
  239. package/dist/src/i18n/locales/de.js +313 -0
  240. package/dist/src/i18n/locales/de.js.map +1 -0
  241. package/dist/src/i18n/locales/en.js +314 -0
  242. package/dist/src/i18n/locales/en.js.map +1 -0
  243. package/dist/src/i18n/locales/es.js +312 -0
  244. package/dist/src/i18n/locales/es.js.map +1 -0
  245. package/dist/src/i18n/locales/fr.js +313 -0
  246. package/dist/src/i18n/locales/fr.js.map +1 -0
  247. package/dist/src/i18n/locales/hr.js +308 -0
  248. package/dist/src/i18n/locales/hr.js.map +1 -0
  249. package/dist/src/i18n/locales/index.js +16 -0
  250. package/dist/src/i18n/locales/index.js.map +1 -0
  251. package/dist/src/i18n/locales/is.js +305 -0
  252. package/dist/src/i18n/locales/is.js.map +1 -0
  253. package/dist/src/i18n/locales/ja.js +333 -0
  254. package/dist/src/i18n/locales/ja.js.map +1 -0
  255. package/dist/src/i18n/locales/ko.js +326 -0
  256. package/dist/src/i18n/locales/ko.js.map +1 -0
  257. package/dist/src/i18n/locales/nl.js +313 -0
  258. package/dist/src/i18n/locales/nl.js.map +1 -0
  259. package/dist/src/i18n/locales/pl.js +297 -0
  260. package/dist/src/i18n/locales/pl.js.map +1 -0
  261. package/dist/src/i18n/locales/pt.js +305 -0
  262. package/dist/src/i18n/locales/pt.js.map +1 -0
  263. package/dist/src/i18n/locales/ru.js +340 -0
  264. package/dist/src/i18n/locales/ru.js.map +1 -0
  265. package/dist/src/i18n/locales/vi.js +312 -0
  266. package/dist/src/i18n/locales/vi.js.map +1 -0
  267. package/dist/src/i18n/locales/zh.js +346 -0
  268. package/dist/src/i18n/locales/zh.js.map +1 -0
  269. package/dist/src/index.js +55 -0
  270. package/dist/src/index.js.map +1 -0
  271. package/dist/src/pm-nodes/BlockContainer.js +72 -0
  272. package/dist/src/pm-nodes/BlockContainer.js.map +1 -0
  273. package/dist/src/pm-nodes/BlockGroup.js +43 -0
  274. package/dist/src/pm-nodes/BlockGroup.js.map +1 -0
  275. package/dist/src/pm-nodes/Doc.js +7 -0
  276. package/dist/src/pm-nodes/Doc.js.map +1 -0
  277. package/dist/src/pm-nodes/index.js +4 -0
  278. package/dist/src/pm-nodes/index.js.map +1 -0
  279. package/dist/src/schema/blocks/createSpec.js +126 -0
  280. package/dist/src/schema/blocks/createSpec.js.map +1 -0
  281. package/dist/src/schema/blocks/internal.js +147 -0
  282. package/dist/src/schema/blocks/internal.js.map +1 -0
  283. package/dist/src/schema/blocks/types.js +2 -0
  284. package/dist/src/schema/blocks/types.js.map +1 -0
  285. package/dist/src/schema/index.js +11 -0
  286. package/dist/src/schema/index.js.map +1 -0
  287. package/dist/src/schema/inlineContent/createSpec.js +64 -0
  288. package/dist/src/schema/inlineContent/createSpec.js.map +1 -0
  289. package/dist/src/schema/inlineContent/internal.js +52 -0
  290. package/dist/src/schema/inlineContent/internal.js.map +1 -0
  291. package/dist/src/schema/inlineContent/types.js +10 -0
  292. package/dist/src/schema/inlineContent/types.js.map +1 -0
  293. package/dist/src/schema/propTypes.js +2 -0
  294. package/dist/src/schema/propTypes.js.map +1 -0
  295. package/dist/src/schema/styles/createSpec.js +48 -0
  296. package/dist/src/schema/styles/createSpec.js.map +1 -0
  297. package/dist/src/schema/styles/internal.js +53 -0
  298. package/dist/src/schema/styles/internal.js.map +1 -0
  299. package/dist/src/schema/styles/types.js +2 -0
  300. package/dist/src/schema/styles/types.js.map +1 -0
  301. package/dist/src/util/EventEmitter.js +33 -0
  302. package/dist/src/util/EventEmitter.js.map +1 -0
  303. package/dist/src/util/browser.js +17 -0
  304. package/dist/src/util/browser.js.map +1 -0
  305. package/dist/src/util/combineByGroup.js +20 -0
  306. package/dist/src/util/combineByGroup.js.map +1 -0
  307. package/dist/src/util/esmDependencies.js +35 -0
  308. package/dist/src/util/esmDependencies.js.map +1 -0
  309. package/dist/src/util/string.js +14 -0
  310. package/dist/src/util/string.js.map +1 -0
  311. package/dist/src/util/typescript.js +12 -0
  312. package/dist/src/util/typescript.js.map +1 -0
  313. package/dist/style.css +1 -1
  314. package/dist/tsconfig.tsbuildinfo +1 -0
  315. package/dist/webpack-stats.json +1 -1
  316. package/package.json +5 -5
  317. package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.ts +2 -0
  318. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.ts +2 -2
  319. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.ts +104 -39
  320. package/src/api/blockManipulation/commands/moveBlock/moveBlock.ts +3 -5
  321. package/src/api/blockManipulation/commands/nestBlock/nestBlock.ts +100 -0
  322. package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.ts +1 -1
  323. package/src/api/blockManipulation/commands/splitBlock/splitBlock.test.ts +8 -4
  324. package/src/api/blockManipulation/commands/splitBlock/splitBlock.ts +11 -7
  325. package/src/api/blockManipulation/commands/updateBlock/updateBlock.test.ts +5 -5
  326. package/src/api/blockManipulation/commands/updateBlock/updateBlock.ts +192 -107
  327. package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.ts +48 -33
  328. package/src/api/clipboard/fromClipboard/handleFileInsertion.ts +1 -1
  329. package/src/api/clipboard/toClipboard/copyExtension.ts +1 -1
  330. package/src/api/exporters/html/htmlConversion.test.ts +1 -4
  331. package/src/api/exporters/html/util/serializeBlocksExternalHTML.ts +7 -1
  332. package/src/api/exporters/html/util/serializeBlocksInternalHTML.ts +56 -19
  333. package/src/api/exporters/markdown/markdownExporter.test.ts +1 -4
  334. package/src/api/getBlockInfoFromPos.ts +113 -58
  335. package/src/api/nodeConversions/blockToNode.ts +50 -25
  336. package/src/api/nodeConversions/fragmentToBlocks.ts +18 -0
  337. package/src/api/nodeConversions/nodeToBlock.ts +24 -21
  338. package/src/api/nodeUtil.ts +1 -1
  339. package/src/api/testUtil/partialBlockTestUtil.ts +15 -3
  340. package/src/blocks/AudioBlockContent/AudioBlockContent.ts +4 -2
  341. package/src/blocks/FileBlockContent/fileBlockHelpers.ts +5 -4
  342. package/src/blocks/HeadingBlockContent/HeadingBlockContent.ts +19 -31
  343. package/src/blocks/ImageBlockContent/ImageBlockContent.ts +4 -2
  344. package/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +5 -9
  345. package/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.ts +6 -10
  346. package/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.ts +1 -1
  347. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts +11 -4
  348. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +5 -9
  349. package/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts +4 -8
  350. package/src/blocks/VideoBlockContent/VideoBlockContent.ts +4 -2
  351. package/src/blocks/defaultBlockHelpers.ts +7 -2
  352. package/src/editor/Block.css +22 -1
  353. package/src/editor/BlockNoteEditor.test.ts +2 -2
  354. package/src/editor/BlockNoteEditor.ts +18 -21
  355. package/src/editor/BlockNoteExtensions.ts +2 -3
  356. package/src/editor/BlockNoteTipTapEditor.ts +8 -1
  357. package/src/editor/defaultColors.ts +77 -0
  358. package/src/editor/editor.css +10 -0
  359. package/src/editor/transformPasted.ts +6 -3
  360. package/src/exporter/Exporter.ts +101 -0
  361. package/src/exporter/index.ts +2 -0
  362. package/src/exporter/mapping.ts +75 -0
  363. package/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts +201 -48
  364. package/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.ts +1 -1
  365. package/src/extensions/SideMenu/SideMenuPlugin.ts +141 -52
  366. package/src/extensions/SideMenu/dragging.ts +3 -54
  367. package/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts +4 -6
  368. package/src/extensions/TableHandles/TableHandlesPlugin.ts +1 -1
  369. package/src/extensions/TrailingNode/TrailingNodeExtension.ts +1 -1
  370. package/src/extensions/getDraggableBlockFromElement.ts +19 -0
  371. package/src/i18n/locales/de.ts +5 -5
  372. package/src/i18n/locales/pt.ts +5 -5
  373. package/src/index.ts +9 -5
  374. package/src/pm-nodes/BlockContainer.ts +1 -1
  375. package/src/pm-nodes/BlockGroup.ts +2 -2
  376. package/src/pm-nodes/README.md +127 -28
  377. package/src/schema/blocks/createSpec.ts +4 -1
  378. package/src/schema/blocks/internal.ts +12 -2
  379. package/src/schema/blocks/types.ts +1 -1
  380. package/src/util/combineByGroup.ts +25 -0
  381. package/types/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.d.ts +22 -2
  382. package/types/src/api/blockManipulation/commands/nestBlock/nestBlock.d.ts +5 -0
  383. package/types/src/api/getBlockInfoFromPos.d.ts +55 -5
  384. package/types/src/api/nodeConversions/blockToNode.d.ts +1 -1
  385. package/types/src/api/nodeConversions/nodeToBlock.d.ts +3 -1
  386. package/types/src/api/testUtil/partialBlockTestUtil.d.ts +2 -1
  387. package/types/src/blocks/AudioBlockContent/AudioBlockContent.d.ts +1 -0
  388. package/types/src/blocks/FileBlockContent/fileBlockHelpers.d.ts +1 -0
  389. package/types/src/blocks/ImageBlockContent/ImageBlockContent.d.ts +1 -0
  390. package/types/src/blocks/VideoBlockContent/VideoBlockContent.d.ts +1 -0
  391. package/types/src/editor/BlockNoteEditor.d.ts +4 -3
  392. package/types/src/editor/BlockNoteTipTapEditor.d.ts +1 -0
  393. package/types/src/editor/defaultColors.d.ts +76 -0
  394. package/types/src/exporter/Exporter.d.ts +43 -0
  395. package/types/src/exporter/index.d.ts +2 -0
  396. package/types/src/exporter/mapping.d.ts +30 -0
  397. package/types/src/extensions/SideMenu/SideMenuPlugin.d.ts +2 -1
  398. package/types/src/extensions/SideMenu/dragging.d.ts +1 -6
  399. package/types/src/extensions/getDraggableBlockFromElement.d.ts +5 -0
  400. package/types/src/index.d.ts +9 -5
  401. package/types/src/schema/blocks/createSpec.d.ts +1 -1
  402. package/types/src/schema/blocks/internal.d.ts +2 -2
  403. package/types/src/schema/blocks/types.d.ts +1 -1
  404. package/types/src/util/combineByGroup.d.ts +9 -0
  405. package/dist/angular-html-HQGguTAE.js +0 -33
  406. package/dist/angular-html-HQGguTAE.js.map +0 -1
  407. package/dist/angular-ts-q9PqJiJb.js +0 -22
  408. package/dist/angular-ts-q9PqJiJb.js.map +0 -1
  409. package/dist/astro-0iWgpDaK.js +0 -17
  410. package/dist/astro-0iWgpDaK.js.map +0 -1
  411. package/dist/blade-C3Z8AhvY.js +0 -19
  412. package/dist/blade-C3Z8AhvY.js.map +0 -1
  413. package/dist/c-TKJGJdXV.js +0 -7
  414. package/dist/c-TKJGJdXV.js.map +0 -1
  415. package/dist/coffee-CN_y6cG3.js +0 -9
  416. package/dist/coffee-CN_y6cG3.js.map +0 -1
  417. package/dist/cpp-Be_e67JE.js +0 -19
  418. package/dist/cpp-Be_e67JE.js.map +0 -1
  419. package/dist/css-DHLSoXzW.js +0 -7
  420. package/dist/css-DHLSoXzW.js.map +0 -1
  421. package/dist/glsl-8qSUIm5B.js +0 -9
  422. package/dist/glsl-8qSUIm5B.js.map +0 -1
  423. package/dist/graphql-D7_Dk2ma.js +0 -15
  424. package/dist/graphql-D7_Dk2ma.js.map +0 -1
  425. package/dist/haml-S3dmcfEW.js +0 -11
  426. package/dist/haml-S3dmcfEW.js.map +0 -1
  427. package/dist/handlebars-DaIrqVg3.js +0 -15
  428. package/dist/handlebars-DaIrqVg3.js.map +0 -1
  429. package/dist/html-Bx3A18fV.js +0 -11
  430. package/dist/html-Bx3A18fV.js.map +0 -1
  431. package/dist/html-derivative-Cf3KTZBS.js +0 -9
  432. package/dist/html-derivative-Cf3KTZBS.js.map +0 -1
  433. package/dist/http-BphR83YX.js +0 -15
  434. package/dist/http-BphR83YX.js.map +0 -1
  435. package/dist/imba-CmP25v0O.js +0 -9
  436. package/dist/imba-CmP25v0O.js.map +0 -1
  437. package/dist/java-Dg4kxH6C.js +0 -7
  438. package/dist/java-Dg4kxH6C.js.map +0 -1
  439. package/dist/javascript-CipAzIn1.js +0 -7
  440. package/dist/javascript-CipAzIn1.js.map +0 -1
  441. package/dist/jinja-tioldiz6.js +0 -12
  442. package/dist/jinja-tioldiz6.js.map +0 -1
  443. package/dist/jison-DWJFEE_I.js +0 -9
  444. package/dist/jison-DWJFEE_I.js.map +0 -1
  445. package/dist/json-_04EL6MS.js +0 -7
  446. package/dist/json-_04EL6MS.js.map +0 -1
  447. package/dist/json5-Dwmp5XFI.js +0 -7
  448. package/dist/json5-Dwmp5XFI.js.map +0 -1
  449. package/dist/jsonc-LqD5auy0.js +0 -7
  450. package/dist/jsonc-LqD5auy0.js.map +0 -1
  451. package/dist/jsonl-B4yVuYQH.js +0 -7
  452. package/dist/jsonl-B4yVuYQH.js.map +0 -1
  453. package/dist/jsx-Mg4WaD5k.js +0 -7
  454. package/dist/jsx-Mg4WaD5k.js.map +0 -1
  455. package/dist/julia-CWi-ZdpN.js +0 -17
  456. package/dist/julia-CWi-ZdpN.js.map +0 -1
  457. package/dist/less-BBvTHIGe.js +0 -7
  458. package/dist/less-BBvTHIGe.js.map +0 -1
  459. package/dist/markdown-DAXqtk9a.js +0 -7
  460. package/dist/markdown-DAXqtk9a.js.map +0 -1
  461. package/dist/marko-0aaNgUGV.js +0 -15
  462. package/dist/marko-0aaNgUGV.js.map +0 -1
  463. package/dist/mdc-hXJ2B4O0.js +0 -13
  464. package/dist/mdc-hXJ2B4O0.js.map +0 -1
  465. package/dist/mdx-CSCKbb_f.js +0 -7
  466. package/dist/mdx-CSCKbb_f.js.map +0 -1
  467. package/dist/php-B_-4RJ09.js +0 -19
  468. package/dist/php-B_-4RJ09.js.map +0 -1
  469. package/dist/postcss-SJfTvo_B.js +0 -7
  470. package/dist/postcss-SJfTvo_B.js.map +0 -1
  471. package/dist/pug-3q2tx0nf.js +0 -13
  472. package/dist/pug-3q2tx0nf.js.map +0 -1
  473. package/dist/python-Dpup1-fE.js +0 -7
  474. package/dist/python-Dpup1-fE.js.map +0 -1
  475. package/dist/r-Chyv38Fv.js +0 -7
  476. package/dist/r-Chyv38Fv.js.map +0 -1
  477. package/dist/regexp-BF0hfxNW.js +0 -7
  478. package/dist/regexp-BF0hfxNW.js.map +0 -1
  479. package/dist/sass-p2RMoqDT.js +0 -7
  480. package/dist/sass-p2RMoqDT.js.map +0 -1
  481. package/dist/scss-DmlHSoOY.js +0 -9
  482. package/dist/scss-DmlHSoOY.js.map +0 -1
  483. package/dist/shellscript-CZpPN8_x.js +0 -7
  484. package/dist/shellscript-CZpPN8_x.js.map +0 -1
  485. package/dist/sql-DtlkUz2m.js +0 -7
  486. package/dist/sql-DtlkUz2m.js.map +0 -1
  487. package/dist/stylus-DEr8eSLm.js +0 -7
  488. package/dist/stylus-DEr8eSLm.js.map +0 -1
  489. package/dist/svelte-BRIJF62h.js +0 -15
  490. package/dist/svelte-BRIJF62h.js.map +0 -1
  491. package/dist/ts-tags-qkUtuI0N.js +0 -42
  492. package/dist/ts-tags-qkUtuI0N.js.map +0 -1
  493. package/dist/tsx-DTfbgJxi.js +0 -7
  494. package/dist/tsx-DTfbgJxi.js.map +0 -1
  495. package/dist/typescript-CCd4aQHh.js +0 -7
  496. package/dist/typescript-CCd4aQHh.js.map +0 -1
  497. package/dist/vue-B3TdbERm.js +0 -32
  498. package/dist/vue-B3TdbERm.js.map +0 -1
  499. package/dist/vue-html-BGmTBZk0.js +0 -11
  500. package/dist/vue-html-BGmTBZk0.js.map +0 -1
  501. package/dist/wasm-VDIDph3E.js +0 -7
  502. package/dist/wasm-VDIDph3E.js.map +0 -1
  503. package/dist/wgsl-2np_U3Z8.js +0 -7
  504. package/dist/wgsl-2np_U3Z8.js.map +0 -1
  505. package/dist/xml-CNyphW9R.js +0 -9
  506. package/dist/xml-CNyphW9R.js.map +0 -1
  507. package/dist/yaml-DxFiVFcM.js +0 -7
  508. package/dist/yaml-DxFiVFcM.js.map +0 -1
@@ -1,6 +1,7 @@
1
- import { Fragment, Node as PMNode, Slice } from "prosemirror-model";
1
+ import { Fragment, NodeType, Node as PMNode, Slice } from "prosemirror-model";
2
2
  import { EditorState } from "prosemirror-state";
3
3
 
4
+ import { ReplaceStep } from "prosemirror-transform";
4
5
  import { Block, PartialBlock } from "../../../../blocks/defaultBlocks.js";
5
6
  import { BlockNoteEditor } from "../../../../editor/BlockNoteEditor.js";
6
7
  import {
@@ -10,7 +11,10 @@ import {
10
11
  import { InlineContentSchema } from "../../../../schema/inlineContent/types.js";
11
12
  import { StyleSchema } from "../../../../schema/styles/types.js";
12
13
  import { UnreachableCaseError } from "../../../../util/typescript.js";
13
- import { getBlockInfoFromResolvedPos } from "../../../getBlockInfoFromPos.js";
14
+ import {
15
+ BlockInfo,
16
+ getBlockInfoFromResolvedPos,
17
+ } from "../../../getBlockInfoFromPos.js";
14
18
  import {
15
19
  blockToNode,
16
20
  inlineContentToNodes,
@@ -36,128 +40,74 @@ export const updateBlockCommand =
36
40
  state: EditorState;
37
41
  dispatch: ((args?: any) => any) | undefined;
38
42
  }) => {
39
- const { blockContainer, blockContent, blockGroup } =
40
- getBlockInfoFromResolvedPos(state.doc.resolve(posBeforeBlock));
43
+ const blockInfo = getBlockInfoFromResolvedPos(
44
+ state.doc.resolve(posBeforeBlock)
45
+ );
41
46
 
42
47
  if (dispatch) {
43
48
  // Adds blockGroup node with child blocks if necessary.
44
- if (block.children !== undefined) {
45
- const childNodes = [];
46
-
47
- // Creates ProseMirror nodes for each child block, including their descendants.
48
- for (const child of block.children) {
49
- childNodes.push(
50
- blockToNode(child, state.schema, editor.schema.styleSchema)
51
- );
52
- }
53
-
54
- // Checks if a blockGroup node already exists.
55
- if (blockGroup) {
56
- // Replaces all child nodes in the existing blockGroup with the ones created earlier.
57
- state.tr.replace(
58
- blockGroup.beforePos + 1,
59
- blockGroup.afterPos - 1,
60
- new Slice(Fragment.from(childNodes), 0, 0)
61
- );
62
- } else {
63
- // Inserts a new blockGroup containing the child nodes created earlier.
64
- state.tr.insert(
65
- blockContent.afterPos,
66
- state.schema.nodes["blockGroup"].create({}, childNodes)
67
- );
68
- }
69
- }
70
-
71
- const oldType = blockContent.node.type.name;
72
- const newType = block.type || oldType;
73
49
 
74
- // The code below determines the new content of the block.
75
- // or "keep" to keep as-is
76
- let content: PMNode[] | "keep" = "keep";
50
+ const oldNodeType = state.schema.nodes[blockInfo.blockNoteType];
51
+ const newNodeType =
52
+ state.schema.nodes[block.type || blockInfo.blockNoteType];
53
+ const newBnBlockNodeType = newNodeType.isInGroup("bnBlock")
54
+ ? newNodeType
55
+ : state.schema.nodes["blockContainer"];
77
56
 
78
- // Has there been any custom content provided?
79
- if (block.content) {
80
- if (typeof block.content === "string") {
81
- // Adds a single text node with no marks to the content.
82
- content = inlineContentToNodes(
83
- [block.content],
84
- state.schema,
85
- editor.schema.styleSchema
86
- );
87
- } else if (Array.isArray(block.content)) {
88
- // Adds a text node with the provided styles converted into marks to the content,
89
- // for each InlineContent object.
90
- content = inlineContentToNodes(
91
- block.content,
92
- state.schema,
93
- editor.schema.styleSchema
94
- );
95
- } else if (block.content.type === "tableContent") {
96
- content = tableContentToNodes(
97
- block.content,
98
- state.schema,
99
- editor.schema.styleSchema
100
- );
101
- } else {
102
- throw new UnreachableCaseError(block.content.type);
103
- }
57
+ if (blockInfo.isBlockContainer && newNodeType.isInGroup("blockContent")) {
58
+ updateChildren(block, state, editor, blockInfo);
59
+ // The code below determines the new content of the block.
60
+ // or "keep" to keep as-is
61
+ updateBlockContentNode(
62
+ block,
63
+ state,
64
+ editor,
65
+ oldNodeType,
66
+ newNodeType,
67
+ blockInfo
68
+ );
69
+ } else if (
70
+ !blockInfo.isBlockContainer &&
71
+ newNodeType.isInGroup("bnBlock")
72
+ ) {
73
+ updateChildren(block, state, editor, blockInfo);
74
+ // old node was a bnBlock type (like column or columnList) and new block as well
75
+ // No op, we just update the bnBlock below (at end of function) and have already updated the children
104
76
  } else {
105
- // no custom content has been provided, use existing content IF possible
106
-
107
- // Since some block types contain inline content and others don't,
108
- // we either need to call setNodeMarkup to just update type &
109
- // attributes, or replaceWith to replace the whole blockContent.
110
- const oldContentType = state.schema.nodes[oldType].spec.content;
111
- const newContentType = state.schema.nodes[newType].spec.content;
112
-
113
- if (oldContentType === "") {
114
- // keep old content, because it's empty anyway and should be compatible with
115
- // any newContentType
116
- } else if (newContentType !== oldContentType) {
117
- // the content type changed, replace the previous content
118
- content = [];
119
- } else {
120
- // keep old content, because the content type is the same and should be compatible
121
- }
122
- }
77
+ // switching from blockContainer to non-blockContainer or v.v.
78
+ // currently breaking for column slash menu items converting empty block
79
+ // to column.
123
80
 
124
- // Now, changes the blockContent node type and adds the provided props
125
- // as attributes. Also preserves all existing attributes that are
126
- // compatible with the new type.
127
- //
128
- // Use either setNodeMarkup or replaceWith depending on whether the
129
- // content is being replaced or not.
130
- if (content === "keep") {
131
- // use setNodeMarkup to only update the type and attributes
132
- state.tr.setNodeMarkup(
133
- blockContent.beforePos,
134
- block.type === undefined ? undefined : state.schema.nodes[block.type],
135
- {
136
- ...blockContent.node.attrs,
137
- ...block.props,
138
- }
81
+ // currently, we calculate the new node and replace the entire node with the desired new node.
82
+ // for this, we do a nodeToBlock on the existing block to get the children.
83
+ // it would be cleaner to use a ReplaceAroundStep, but this is a bit simpler and it's quite an edge case
84
+ const existingBlock = nodeToBlock(
85
+ blockInfo.bnBlock.node,
86
+ editor.schema.blockSchema,
87
+ editor.schema.inlineContentSchema,
88
+ editor.schema.styleSchema,
89
+ editor.blockCache
139
90
  );
140
- } else {
141
- // use replaceWith to replace the content and the block itself
142
- // also reset the selection since replacing the block content
143
- // sets it to the next block.
144
91
  state.tr.replaceWith(
145
- blockContent.beforePos,
146
- blockContent.afterPos,
147
- state.schema.nodes[newType].create(
92
+ blockInfo.bnBlock.beforePos,
93
+ blockInfo.bnBlock.afterPos,
94
+ blockToNode(
148
95
  {
149
- ...blockContent.node.attrs,
150
- ...block.props,
96
+ children: existingBlock.children, // if no children are passed in, use existing children
97
+ ...block,
151
98
  },
152
- content
99
+ state.schema,
100
+ editor.schema.styleSchema
153
101
  )
154
102
  );
103
+
104
+ return true;
155
105
  }
156
106
 
157
107
  // Adds all provided props as attributes to the parent blockContainer node too, and also preserves existing
158
108
  // attributes.
159
- state.tr.setNodeMarkup(blockContainer.beforePos, undefined, {
160
- ...blockContainer.node.attrs,
109
+ state.tr.setNodeMarkup(blockInfo.bnBlock.beforePos, newBnBlockNodeType, {
110
+ ...blockInfo.bnBlock.node.attrs,
161
111
  ...block.props,
162
112
  });
163
113
  }
@@ -165,6 +115,141 @@ export const updateBlockCommand =
165
115
  return true;
166
116
  };
167
117
 
118
+ function updateBlockContentNode<
119
+ BSchema extends BlockSchema,
120
+ I extends InlineContentSchema,
121
+ S extends StyleSchema
122
+ >(
123
+ block: PartialBlock<BSchema, I, S>,
124
+ state: EditorState,
125
+ editor: BlockNoteEditor<BSchema, I, S>,
126
+ oldNodeType: NodeType,
127
+ newNodeType: NodeType,
128
+ blockInfo: {
129
+ childContainer?:
130
+ | { node: PMNode; beforePos: number; afterPos: number }
131
+ | undefined;
132
+ blockContent: { node: PMNode; beforePos: number; afterPos: number };
133
+ }
134
+ ) {
135
+ let content: PMNode[] | "keep" = "keep";
136
+
137
+ // Has there been any custom content provided?
138
+ if (block.content) {
139
+ if (typeof block.content === "string") {
140
+ // Adds a single text node with no marks to the content.
141
+ content = inlineContentToNodes(
142
+ [block.content],
143
+ state.schema,
144
+ editor.schema.styleSchema
145
+ );
146
+ } else if (Array.isArray(block.content)) {
147
+ // Adds a text node with the provided styles converted into marks to the content,
148
+ // for each InlineContent object.
149
+ content = inlineContentToNodes(
150
+ block.content,
151
+ state.schema,
152
+ editor.schema.styleSchema
153
+ );
154
+ } else if (block.content.type === "tableContent") {
155
+ content = tableContentToNodes(
156
+ block.content,
157
+ state.schema,
158
+ editor.schema.styleSchema
159
+ );
160
+ } else {
161
+ throw new UnreachableCaseError(block.content.type);
162
+ }
163
+ } else {
164
+ // no custom content has been provided, use existing content IF possible
165
+ // Since some block types contain inline content and others don't,
166
+ // we either need to call setNodeMarkup to just update type &
167
+ // attributes, or replaceWith to replace the whole blockContent.
168
+ if (oldNodeType.spec.content === "") {
169
+ // keep old content, because it's empty anyway and should be compatible with
170
+ // any newContentType
171
+ } else if (newNodeType.spec.content !== oldNodeType.spec.content) {
172
+ // the content type changed, replace the previous content
173
+ content = [];
174
+ } else {
175
+ // keep old content, because the content type is the same and should be compatible
176
+ }
177
+ }
178
+
179
+ // Now, changes the blockContent node type and adds the provided props
180
+ // as attributes. Also preserves all existing attributes that are
181
+ // compatible with the new type.
182
+ //
183
+ // Use either setNodeMarkup or replaceWith depending on whether the
184
+ // content is being replaced or not.
185
+ if (content === "keep") {
186
+ // use setNodeMarkup to only update the type and attributes
187
+ state.tr.setNodeMarkup(
188
+ blockInfo.blockContent.beforePos,
189
+ block.type === undefined ? undefined : state.schema.nodes[block.type],
190
+ {
191
+ ...blockInfo.blockContent.node.attrs,
192
+ ...block.props,
193
+ }
194
+ );
195
+ } else {
196
+ // use replaceWith to replace the content and the block itself
197
+ // also reset the selection since replacing the block content
198
+ // sets it to the next block.
199
+ state.tr.replaceWith(
200
+ blockInfo.blockContent.beforePos,
201
+ blockInfo.blockContent.afterPos,
202
+ newNodeType.createChecked(
203
+ {
204
+ ...blockInfo.blockContent.node.attrs,
205
+ ...block.props,
206
+ },
207
+ content
208
+ )
209
+ );
210
+ }
211
+ }
212
+
213
+ function updateChildren<
214
+ BSchema extends BlockSchema,
215
+ I extends InlineContentSchema,
216
+ S extends StyleSchema
217
+ >(
218
+ block: PartialBlock<BSchema, I, S>,
219
+ state: EditorState,
220
+ editor: BlockNoteEditor<BSchema, I, S>,
221
+ blockInfo: BlockInfo
222
+ ) {
223
+ if (block.children !== undefined) {
224
+ const childNodes = block.children.map((child) => {
225
+ return blockToNode(child, state.schema, editor.schema.styleSchema);
226
+ });
227
+
228
+ // Checks if a blockGroup node already exists.
229
+ if (blockInfo.childContainer) {
230
+ // Replaces all child nodes in the existing blockGroup with the ones created earlier.
231
+
232
+ // use a replacestep to avoid the fitting algorithm
233
+ state.tr.step(
234
+ new ReplaceStep(
235
+ blockInfo.childContainer.beforePos + 1,
236
+ blockInfo.childContainer.afterPos - 1,
237
+ new Slice(Fragment.from(childNodes), 0, 0)
238
+ )
239
+ );
240
+ } else {
241
+ if (!blockInfo.isBlockContainer) {
242
+ throw new Error("impossible");
243
+ }
244
+ // Inserts a new blockGroup containing the child nodes created earlier.
245
+ state.tr.insert(
246
+ blockInfo.blockContent.afterPos,
247
+ state.schema.nodes["blockGroup"].createChecked({}, childNodes)
248
+ );
249
+ }
250
+ }
251
+ }
252
+
168
253
  export function updateBlock<
169
254
  BSchema extends BlockSchema,
170
255
  I extends InlineContentSchema,
@@ -21,30 +21,31 @@ export function getTextCursorPosition<
21
21
  I extends InlineContentSchema,
22
22
  S extends StyleSchema
23
23
  >(editor: BlockNoteEditor<BSchema, I, S>): TextCursorPosition<BSchema, I, S> {
24
- const { blockContainer } = getBlockInfoFromSelection(
25
- editor._tiptapEditor.state
26
- );
24
+ const { bnBlock } = getBlockInfoFromSelection(editor._tiptapEditor.state);
27
25
 
28
- const resolvedPos = editor._tiptapEditor.state.doc.resolve(
29
- blockContainer.beforePos
30
- );
26
+ const resolvedPos = editor._tiptapEditor.state.doc.resolve(bnBlock.beforePos);
31
27
  // Gets previous blockContainer node at the same nesting level, if the current node isn't the first child.
32
28
  const prevNode = resolvedPos.nodeBefore;
33
29
 
34
30
  // Gets next blockContainer node at the same nesting level, if the current node isn't the last child.
35
31
  const nextNode = editor._tiptapEditor.state.doc.resolve(
36
- blockContainer.afterPos
32
+ bnBlock.afterPos
37
33
  ).nodeAfter;
38
34
 
39
35
  // Gets parent blockContainer node, if the current node is nested.
40
36
  let parentNode: Node | undefined = undefined;
41
37
  if (resolvedPos.depth > 1) {
42
- parentNode = resolvedPos.node(resolvedPos.depth - 1);
38
+ // for nodes nested in bnBlocks
39
+ parentNode = resolvedPos.node();
40
+ if (!parentNode.type.isInGroup("bnBlock")) {
41
+ // for blockGroups, we need to go one level up
42
+ parentNode = resolvedPos.node(resolvedPos.depth - 1);
43
+ }
43
44
  }
44
45
 
45
46
  return {
46
47
  block: nodeToBlock(
47
- blockContainer.node,
48
+ bnBlock.node,
48
49
  editor.schema.blockSchema,
49
50
  editor.schema.inlineContentSchema,
50
51
  editor.schema.styleSchema,
@@ -95,36 +96,50 @@ export function setTextCursorPosition<
95
96
  const id = typeof targetBlock === "string" ? targetBlock : targetBlock.id;
96
97
 
97
98
  const posInfo = getNodeById(id, editor._tiptapEditor.state.doc);
98
- const { blockContent } = getBlockInfo(posInfo);
99
+ const info = getBlockInfo(posInfo);
99
100
 
100
101
  const contentType: "none" | "inline" | "table" =
101
- editor.schema.blockSchema[blockContent.node.type.name]!.content;
102
-
103
- if (contentType === "none") {
104
- editor._tiptapEditor.commands.setNodeSelection(blockContent.beforePos);
105
- return;
106
- }
102
+ editor.schema.blockSchema[info.blockNoteType]!.content;
107
103
 
108
- if (contentType === "inline") {
109
- if (placement === "start") {
110
- editor._tiptapEditor.commands.setTextSelection(
111
- blockContent.beforePos + 1
112
- );
113
- } else {
114
- editor._tiptapEditor.commands.setTextSelection(blockContent.afterPos - 1);
104
+ if (info.isBlockContainer) {
105
+ const blockContent = info.blockContent;
106
+ if (contentType === "none") {
107
+ editor._tiptapEditor.commands.setNodeSelection(blockContent.beforePos);
108
+ return;
115
109
  }
116
- } else if (contentType === "table") {
117
- if (placement === "start") {
118
- // Need to offset the position as we have to get through the `tableRow`
119
- // and `tableCell` nodes to get to the `tableParagraph` node we want to
120
- // set the selection in.
121
- editor._tiptapEditor.commands.setTextSelection(
122
- blockContent.beforePos + 4
123
- );
110
+
111
+ if (contentType === "inline") {
112
+ if (placement === "start") {
113
+ editor._tiptapEditor.commands.setTextSelection(
114
+ blockContent.beforePos + 1
115
+ );
116
+ } else {
117
+ editor._tiptapEditor.commands.setTextSelection(
118
+ blockContent.afterPos - 1
119
+ );
120
+ }
121
+ } else if (contentType === "table") {
122
+ if (placement === "start") {
123
+ // Need to offset the position as we have to get through the `tableRow`
124
+ // and `tableCell` nodes to get to the `tableParagraph` node we want to
125
+ // set the selection in.
126
+ editor._tiptapEditor.commands.setTextSelection(
127
+ blockContent.beforePos + 4
128
+ );
129
+ } else {
130
+ editor._tiptapEditor.commands.setTextSelection(
131
+ blockContent.afterPos - 4
132
+ );
133
+ }
124
134
  } else {
125
- editor._tiptapEditor.commands.setTextSelection(blockContent.afterPos - 4);
135
+ throw new UnreachableCaseError(contentType);
126
136
  }
127
137
  } else {
128
- throw new UnreachableCaseError(contentType);
138
+ const child =
139
+ placement === "start"
140
+ ? info.childContainer.node.firstChild!
141
+ : info.childContainer.node.lastChild!;
142
+
143
+ setTextCursorPosition(editor, child.attrs.id, placement);
129
144
  }
130
145
  }
@@ -144,7 +144,7 @@ export async function handleFileInsertion<
144
144
 
145
145
  insertedBlockId = editor.insertBlocks(
146
146
  [fileBlock],
147
- blockInfo.blockContainer.node.attrs.id,
147
+ blockInfo.bnBlock.node.attrs.id,
148
148
  "after"
149
149
  )[0].id;
150
150
  } else {
@@ -49,7 +49,7 @@ function fragmentToExternalHTML<
49
49
  isWithinBlockContent =
50
50
  children.find(
51
51
  (child) =>
52
- child.type.name === "blockContainer" ||
52
+ child.type.isInGroup("bnBlock") ||
53
53
  child.type.name === "blockGroup" ||
54
54
  child.type.spec.group === "blockContent"
55
55
  ) === undefined;
@@ -42,10 +42,7 @@ async function convertToHTMLAndCompareSnapshots<
42
42
  expect(internalHTML).toMatchFileSnapshot(internalHTMLSnapshotPath);
43
43
 
44
44
  // turn the internalHTML back into blocks, and make sure no data was lost
45
- const fullBlocks = partialBlocksToBlocksForTesting(
46
- editor.schema.blockSchema,
47
- blocks
48
- );
45
+ const fullBlocks = partialBlocksToBlocksForTesting(editor.schema, blocks);
49
46
  const parsed = await editor.tryParseHTMLToBlocks(internalHTML);
50
47
 
51
48
  expect(parsed).toStrictEqual(fullBlocks);
@@ -205,7 +205,13 @@ function serializeBlock<
205
205
  }
206
206
  }
207
207
 
208
- fragment.append(childFragment);
208
+ if (editor.pmSchema.nodes[block.type as any].isInGroup("blockContent")) {
209
+ // default "blockContainer" style blocks are flattened (no "nested block" support) for externalHTML, so append the child fragment to the outer fragment
210
+ fragment.append(childFragment);
211
+ } else {
212
+ // for columns / column lists, do use nesting
213
+ ret.contentDOM?.append(childFragment);
214
+ }
209
215
  }
210
216
  }
211
217
 
@@ -82,16 +82,6 @@ function serializeBlock<
82
82
  }
83
83
  }
84
84
 
85
- const bc = BC_NODE.spec?.toDOM?.(
86
- BC_NODE.create({
87
- id: block.id,
88
- ...props,
89
- })
90
- ) as {
91
- dom: HTMLElement;
92
- contentDOM?: HTMLElement;
93
- };
94
-
95
85
  const impl = editor.blockImplementations[block.type as any].implementation;
96
86
  const ret = impl.toInternalHTML({ ...block, props } as any, editor as any);
97
87
 
@@ -115,6 +105,33 @@ function serializeBlock<
115
105
  ret.contentDOM.appendChild(ic);
116
106
  }
117
107
 
108
+ const pmType = editor.pmSchema.nodes[block.type as any];
109
+
110
+ if (pmType.isInGroup("bnBlock")) {
111
+ if (block.children && block.children.length > 0) {
112
+ const fragment = serializeBlocks(
113
+ editor,
114
+ block.children,
115
+ serializer,
116
+ options
117
+ );
118
+
119
+ ret.contentDOM?.append(fragment);
120
+ }
121
+ return ret.dom;
122
+ }
123
+
124
+ // wrap the block in a blockContainer
125
+ const bc = BC_NODE.spec?.toDOM?.(
126
+ BC_NODE.create({
127
+ id: block.id,
128
+ ...props,
129
+ })
130
+ ) as {
131
+ dom: HTMLElement;
132
+ contentDOM?: HTMLElement;
133
+ };
134
+
118
135
  bc.contentDOM?.appendChild(ret.dom);
119
136
 
120
137
  if (block.children && block.children.length > 0) {
@@ -125,7 +142,7 @@ function serializeBlock<
125
142
  return bc.dom;
126
143
  }
127
144
 
128
- export const serializeBlocksInternalHTML = <
145
+ function serializeBlocks<
129
146
  BSchema extends BlockSchema,
130
147
  I extends InlineContentSchema,
131
148
  S extends StyleSchema
@@ -134,13 +151,9 @@ export const serializeBlocksInternalHTML = <
134
151
  blocks: PartialBlock<BSchema, I, S>[],
135
152
  serializer: DOMSerializer,
136
153
  options?: { document?: Document }
137
- ) => {
138
- const BG_NODE = editor.pmSchema.nodes["blockGroup"];
139
-
140
- const bg = BG_NODE.spec!.toDOM!(BG_NODE.create({})) as {
141
- dom: HTMLElement;
142
- contentDOM?: HTMLElement;
143
- };
154
+ ) {
155
+ const doc = options?.document ?? document;
156
+ const fragment = doc.createDocumentFragment();
144
157
 
145
158
  let listIndex = 0;
146
159
  for (const block of blocks) {
@@ -156,8 +169,32 @@ export const serializeBlocksInternalHTML = <
156
169
  listIndex,
157
170
  options
158
171
  );
159
- bg.contentDOM!.appendChild(blockDOM);
172
+ fragment.appendChild(blockDOM);
160
173
  }
161
174
 
175
+ return fragment;
176
+ }
177
+
178
+ export const serializeBlocksInternalHTML = <
179
+ BSchema extends BlockSchema,
180
+ I extends InlineContentSchema,
181
+ S extends StyleSchema
182
+ >(
183
+ editor: BlockNoteEditor<BSchema, I, S>,
184
+ blocks: PartialBlock<BSchema, I, S>[],
185
+ serializer: DOMSerializer,
186
+ options?: { document?: Document }
187
+ ) => {
188
+ const BG_NODE = editor.pmSchema.nodes["blockGroup"];
189
+
190
+ const bg = BG_NODE.spec!.toDOM!(BG_NODE.create({})) as {
191
+ dom: HTMLElement;
192
+ contentDOM?: HTMLElement;
193
+ };
194
+
195
+ const fragment = serializeBlocks(editor, blocks, serializer, options);
196
+
197
+ bg.contentDOM?.appendChild(fragment);
198
+
162
199
  return bg.dom;
163
200
  };
@@ -22,10 +22,7 @@ async function convertToMarkdownAndCompareSnapshots<
22
22
  snapshotDirectory: string,
23
23
  snapshotName: string
24
24
  ) {
25
- const fullBlocks = partialBlocksToBlocksForTesting(
26
- editor.schema.blockSchema,
27
- blocks
28
- );
25
+ const fullBlocks = partialBlocksToBlocksForTesting(editor.schema, blocks);
29
26
  const md = await editor.blocksToMarkdownLossy(fullBlocks);
30
27
  const snapshotPath =
31
28
  "./__snapshots__/" +