@blocknote/core 0.18.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (537) hide show
  1. package/README.md +2 -0
  2. package/dist/blocknote.js +3145 -2970
  3. package/dist/blocknote.js.map +1 -1
  4. package/dist/blocknote.umd.cjs +9 -9
  5. package/dist/blocknote.umd.cjs.map +1 -1
  6. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js +27 -0
  7. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js.map +1 -0
  8. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js +99 -0
  9. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js.map +1 -0
  10. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js +97 -0
  11. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js.map +1 -0
  12. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js +88 -0
  13. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js.map +1 -0
  14. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.js +116 -0
  15. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.js.map +1 -0
  16. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.test.js +110 -0
  17. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.test.js.map +1 -0
  18. package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js +57 -0
  19. package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js.map +1 -0
  20. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js +5 -0
  21. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js.map +1 -0
  22. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js +31 -0
  23. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js.map +1 -0
  24. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js +71 -0
  25. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js.map +1 -0
  26. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js +157 -0
  27. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js.map +1 -0
  28. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js +27 -0
  29. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js.map +1 -0
  30. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js +64 -0
  31. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js.map +1 -0
  32. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js +145 -0
  33. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js.map +1 -0
  34. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js +252 -0
  35. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js.map +1 -0
  36. package/dist/src/api/blockManipulation/insertContentAt.js +64 -0
  37. package/dist/src/api/blockManipulation/insertContentAt.js.map +1 -0
  38. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js +76 -0
  39. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js.map +1 -0
  40. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js +33 -0
  41. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js.map +1 -0
  42. package/dist/src/api/blockManipulation/setupTestEnv.js +172 -0
  43. package/dist/src/api/blockManipulation/setupTestEnv.js.map +1 -0
  44. package/dist/src/api/clipboard/clipboard.test.js +246 -0
  45. package/dist/src/api/clipboard/clipboard.test.js.map +1 -0
  46. package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js +8 -0
  47. package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js.map +1 -0
  48. package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js +38 -0
  49. package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js.map +1 -0
  50. package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js +111 -0
  51. package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js.map +1 -0
  52. package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js +26 -0
  53. package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js.map +1 -0
  54. package/dist/src/api/clipboard/fromClipboard/pasteExtension.js +57 -0
  55. package/dist/src/api/clipboard/fromClipboard/pasteExtension.js.map +1 -0
  56. package/dist/src/api/clipboard/toClipboard/copyExtension.js +132 -0
  57. package/dist/src/api/clipboard/toClipboard/copyExtension.js.map +1 -0
  58. package/dist/src/api/exporters/html/externalHTMLExporter.js +35 -0
  59. package/dist/src/api/exporters/html/externalHTMLExporter.js.map +1 -0
  60. package/dist/src/api/exporters/html/htmlConversion.test.js +72 -0
  61. package/dist/src/api/exporters/html/htmlConversion.test.js.map +1 -0
  62. package/dist/src/api/exporters/html/internalHTMLSerializer.js +21 -0
  63. package/dist/src/api/exporters/html/internalHTMLSerializer.js.map +1 -0
  64. package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js +141 -0
  65. package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js.map +1 -0
  66. package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js +96 -0
  67. package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js.map +1 -0
  68. package/dist/src/api/exporters/markdown/markdownExporter.js +31 -0
  69. package/dist/src/api/exporters/markdown/markdownExporter.js.map +1 -0
  70. package/dist/src/api/exporters/markdown/markdownExporter.test.js +57 -0
  71. package/dist/src/api/exporters/markdown/markdownExporter.test.js.map +1 -0
  72. package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js +33 -0
  73. package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js.map +1 -0
  74. package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js +37 -0
  75. package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js.map +1 -0
  76. package/dist/src/api/getBlockInfoFromPos.js +165 -0
  77. package/dist/src/api/getBlockInfoFromPos.js.map +1 -0
  78. package/dist/src/api/nodeConversions/blockToNode.js +197 -0
  79. package/dist/src/api/nodeConversions/blockToNode.js.map +1 -0
  80. package/dist/src/api/nodeConversions/fragmentToBlocks.js +50 -0
  81. package/dist/src/api/nodeConversions/fragmentToBlocks.js.map +1 -0
  82. package/dist/src/api/nodeConversions/nodeConversions.test.js +54 -0
  83. package/dist/src/api/nodeConversions/nodeConversions.test.js.map +1 -0
  84. package/dist/src/api/nodeConversions/nodeToBlock.js +316 -0
  85. package/dist/src/api/nodeConversions/nodeToBlock.js.map +1 -0
  86. package/dist/src/api/nodeUtil.js +28 -0
  87. package/dist/src/api/nodeUtil.js.map +1 -0
  88. package/dist/src/api/parsers/html/parseHTML.js +19 -0
  89. package/dist/src/api/parsers/html/parseHTML.js.map +1 -0
  90. package/dist/src/api/parsers/html/parseHTML.test.js +470 -0
  91. package/dist/src/api/parsers/html/parseHTML.test.js.map +1 -0
  92. package/dist/src/api/parsers/html/util/nestedLists.js +106 -0
  93. package/dist/src/api/parsers/html/util/nestedLists.js.map +1 -0
  94. package/dist/src/api/parsers/html/util/nestedLists.test.js +166 -0
  95. package/dist/src/api/parsers/html/util/nestedLists.test.js.map +1 -0
  96. package/dist/src/api/parsers/markdown/parseMarkdown.js +52 -0
  97. package/dist/src/api/parsers/markdown/parseMarkdown.js.map +1 -0
  98. package/dist/src/api/parsers/markdown/parseMarkdown.test.js +109 -0
  99. package/dist/src/api/parsers/markdown/parseMarkdown.test.js.map +1 -0
  100. package/dist/src/api/testUtil/cases/customBlocks.js +313 -0
  101. package/dist/src/api/testUtil/cases/customBlocks.js.map +1 -0
  102. package/dist/src/api/testUtil/cases/customInlineContent.js +91 -0
  103. package/dist/src/api/testUtil/cases/customInlineContent.js.map +1 -0
  104. package/dist/src/api/testUtil/cases/customStyles.js +83 -0
  105. package/dist/src/api/testUtil/cases/customStyles.js.map +1 -0
  106. package/dist/src/api/testUtil/cases/defaultSchema.js +673 -0
  107. package/dist/src/api/testUtil/cases/defaultSchema.js.map +1 -0
  108. package/dist/src/api/testUtil/index.js +2 -0
  109. package/dist/src/api/testUtil/index.js.map +1 -0
  110. package/dist/src/api/testUtil/partialBlockTestUtil.js +114 -0
  111. package/dist/src/api/testUtil/partialBlockTestUtil.js.map +1 -0
  112. package/dist/src/api/testUtil/paste.js +29 -0
  113. package/dist/src/api/testUtil/paste.js.map +1 -0
  114. package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js +97 -0
  115. package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js.map +1 -0
  116. package/dist/src/blocks/AudioBlockContent/audioBlockHelpers.js +5 -0
  117. package/dist/src/blocks/AudioBlockContent/audioBlockHelpers.js.map +1 -0
  118. package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js +273 -0
  119. package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js.map +1 -0
  120. package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js +90 -0
  121. package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js.map +1 -0
  122. package/dist/src/blocks/FileBlockContent/FileBlockContent.js +70 -0
  123. package/dist/src/blocks/FileBlockContent/FileBlockContent.js.map +1 -0
  124. package/dist/src/blocks/FileBlockContent/fileBlockHelpers.js +317 -0
  125. package/dist/src/blocks/FileBlockContent/fileBlockHelpers.js.map +1 -0
  126. package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js +15 -0
  127. package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js.map +1 -0
  128. package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js +145 -0
  129. package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js.map +1 -0
  130. package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js +106 -0
  131. package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js.map +1 -0
  132. package/dist/src/blocks/ImageBlockContent/imageBlockHelpers.js +6 -0
  133. package/dist/src/blocks/ImageBlockContent/imageBlockHelpers.js.map +1 -0
  134. package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js +113 -0
  135. package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js.map +1 -0
  136. package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js +224 -0
  137. package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js.map +1 -0
  138. package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js +45 -0
  139. package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js.map +1 -0
  140. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js +58 -0
  141. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js.map +1 -0
  142. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js +130 -0
  143. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js.map +1 -0
  144. package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js +52 -0
  145. package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js.map +1 -0
  146. package/dist/src/blocks/TableBlockContent/TableBlockContent.js +129 -0
  147. package/dist/src/blocks/TableBlockContent/TableBlockContent.js.map +1 -0
  148. package/dist/src/blocks/TableBlockContent/TableExtension.js +57 -0
  149. package/dist/src/blocks/TableBlockContent/TableExtension.js.map +1 -0
  150. package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js +103 -0
  151. package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js.map +1 -0
  152. package/dist/src/blocks/VideoBlockContent/videoBlockHelpers.js +6 -0
  153. package/dist/src/blocks/VideoBlockContent/videoBlockHelpers.js.map +1 -0
  154. package/dist/src/blocks/defaultBlockHelpers.js +50 -0
  155. package/dist/src/blocks/defaultBlockHelpers.js.map +1 -0
  156. package/dist/src/blocks/defaultBlockTypeGuards.js +40 -0
  157. package/dist/src/blocks/defaultBlockTypeGuards.js.map +1 -0
  158. package/dist/src/blocks/defaultBlocks.js +50 -0
  159. package/dist/src/blocks/defaultBlocks.js.map +1 -0
  160. package/dist/src/blocks/defaultProps.js +19 -0
  161. package/dist/src/blocks/defaultProps.js.map +1 -0
  162. package/dist/src/editor/BlockNoteEditor.js +746 -0
  163. package/dist/src/editor/BlockNoteEditor.js.map +1 -0
  164. package/dist/src/editor/BlockNoteEditor.test.js +65 -0
  165. package/dist/src/editor/BlockNoteEditor.test.js.map +1 -0
  166. package/dist/src/editor/BlockNoteExtensions.js +195 -0
  167. package/dist/src/editor/BlockNoteExtensions.js.map +1 -0
  168. package/dist/src/editor/BlockNoteSchema.js +38 -0
  169. package/dist/src/editor/BlockNoteSchema.js.map +1 -0
  170. package/dist/src/editor/BlockNoteTipTapEditor.js +169 -0
  171. package/dist/src/editor/BlockNoteTipTapEditor.js.map +1 -0
  172. package/dist/src/editor/cursorPositionTypes.js +2 -0
  173. package/dist/src/editor/cursorPositionTypes.js.map +1 -0
  174. package/dist/src/editor/defaultColors.js +77 -0
  175. package/dist/src/editor/defaultColors.js.map +1 -0
  176. package/dist/src/editor/selectionTypes.js +2 -0
  177. package/dist/src/editor/selectionTypes.js.map +1 -0
  178. package/dist/src/editor/transformPasted.js +79 -0
  179. package/dist/src/editor/transformPasted.js.map +1 -0
  180. package/dist/src/exporter/Exporter.js +36 -0
  181. package/dist/src/exporter/Exporter.js.map +1 -0
  182. package/dist/src/exporter/index.js +3 -0
  183. package/dist/src/exporter/index.js.map +1 -0
  184. package/dist/src/exporter/mapping.js +12 -0
  185. package/dist/src/exporter/mapping.js.map +1 -0
  186. package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js +30 -0
  187. package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js.map +1 -0
  188. package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js +39 -0
  189. package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js.map +1 -0
  190. package/dist/src/extensions/FilePanel/FilePanelPlugin.js +131 -0
  191. package/dist/src/extensions/FilePanel/FilePanelPlugin.js.map +1 -0
  192. package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js +195 -0
  193. package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js.map +1 -0
  194. package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js +339 -0
  195. package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js.map +1 -0
  196. package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js +247 -0
  197. package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js.map +1 -0
  198. package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js +54 -0
  199. package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js.map +1 -0
  200. package/dist/src/extensions/Placeholder/PlaceholderPlugin.js +84 -0
  201. package/dist/src/extensions/Placeholder/PlaceholderPlugin.js.map +1 -0
  202. package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js +187 -0
  203. package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js.map +1 -0
  204. package/dist/src/extensions/SideMenu/MultipleNodeSelection.js +68 -0
  205. package/dist/src/extensions/SideMenu/MultipleNodeSelection.js.map +1 -0
  206. package/dist/src/extensions/SideMenu/SideMenuPlugin.js +339 -0
  207. package/dist/src/extensions/SideMenu/SideMenuPlugin.js.map +1 -0
  208. package/dist/src/extensions/SideMenu/dragging.js +128 -0
  209. package/dist/src/extensions/SideMenu/dragging.js.map +1 -0
  210. package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js +2 -0
  211. package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js.map +1 -0
  212. package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js +2 -0
  213. package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js.map +1 -0
  214. package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js +245 -0
  215. package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js.map +1 -0
  216. package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js +26 -0
  217. package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js.map +1 -0
  218. package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js +244 -0
  219. package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js.map +1 -0
  220. package/dist/src/extensions/TableHandles/TableHandlesPlugin.js +553 -0
  221. package/dist/src/extensions/TableHandles/TableHandlesPlugin.js.map +1 -0
  222. package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js +36 -0
  223. package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js.map +1 -0
  224. package/dist/src/extensions/TextColor/TextColorExtension.js +29 -0
  225. package/dist/src/extensions/TextColor/TextColorExtension.js.map +1 -0
  226. package/dist/src/extensions/TextColor/TextColorMark.js +37 -0
  227. package/dist/src/extensions/TextColor/TextColorMark.js.map +1 -0
  228. package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js +58 -0
  229. package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js.map +1 -0
  230. package/dist/src/extensions/UniqueID/UniqueID.js +283 -0
  231. package/dist/src/extensions/UniqueID/UniqueID.js.map +1 -0
  232. package/dist/src/extensions/getDraggableBlockFromElement.js +13 -0
  233. package/dist/src/extensions/getDraggableBlockFromElement.js.map +1 -0
  234. package/dist/src/extensions-shared/UiElementPosition.js +2 -0
  235. package/dist/src/extensions-shared/UiElementPosition.js.map +1 -0
  236. package/dist/src/i18n/dictionary.js +4 -0
  237. package/dist/src/i18n/dictionary.js.map +1 -0
  238. package/dist/src/i18n/locales/ar.js +298 -0
  239. package/dist/src/i18n/locales/ar.js.map +1 -0
  240. package/dist/src/i18n/locales/de.js +313 -0
  241. package/dist/src/i18n/locales/de.js.map +1 -0
  242. package/dist/src/i18n/locales/en.js +314 -0
  243. package/dist/src/i18n/locales/en.js.map +1 -0
  244. package/dist/src/i18n/locales/es.js +312 -0
  245. package/dist/src/i18n/locales/es.js.map +1 -0
  246. package/dist/src/i18n/locales/fr.js +313 -0
  247. package/dist/src/i18n/locales/fr.js.map +1 -0
  248. package/dist/src/i18n/locales/hr.js +308 -0
  249. package/dist/src/i18n/locales/hr.js.map +1 -0
  250. package/dist/src/i18n/locales/index.js +16 -0
  251. package/dist/src/i18n/locales/index.js.map +1 -0
  252. package/dist/src/i18n/locales/is.js +305 -0
  253. package/dist/src/i18n/locales/is.js.map +1 -0
  254. package/dist/src/i18n/locales/ja.js +333 -0
  255. package/dist/src/i18n/locales/ja.js.map +1 -0
  256. package/dist/src/i18n/locales/ko.js +326 -0
  257. package/dist/src/i18n/locales/ko.js.map +1 -0
  258. package/dist/src/i18n/locales/nl.js +313 -0
  259. package/dist/src/i18n/locales/nl.js.map +1 -0
  260. package/dist/src/i18n/locales/pl.js +297 -0
  261. package/dist/src/i18n/locales/pl.js.map +1 -0
  262. package/dist/src/i18n/locales/pt.js +305 -0
  263. package/dist/src/i18n/locales/pt.js.map +1 -0
  264. package/dist/src/i18n/locales/ru.js +340 -0
  265. package/dist/src/i18n/locales/ru.js.map +1 -0
  266. package/dist/src/i18n/locales/vi.js +312 -0
  267. package/dist/src/i18n/locales/vi.js.map +1 -0
  268. package/dist/src/i18n/locales/zh.js +346 -0
  269. package/dist/src/i18n/locales/zh.js.map +1 -0
  270. package/dist/src/index.js +55 -0
  271. package/dist/src/index.js.map +1 -0
  272. package/dist/src/pm-nodes/BlockContainer.js +72 -0
  273. package/dist/src/pm-nodes/BlockContainer.js.map +1 -0
  274. package/dist/src/pm-nodes/BlockGroup.js +43 -0
  275. package/dist/src/pm-nodes/BlockGroup.js.map +1 -0
  276. package/dist/src/pm-nodes/Doc.js +7 -0
  277. package/dist/src/pm-nodes/Doc.js.map +1 -0
  278. package/dist/src/pm-nodes/index.js +4 -0
  279. package/dist/src/pm-nodes/index.js.map +1 -0
  280. package/dist/src/schema/blocks/createSpec.js +126 -0
  281. package/dist/src/schema/blocks/createSpec.js.map +1 -0
  282. package/dist/src/schema/blocks/internal.js +147 -0
  283. package/dist/src/schema/blocks/internal.js.map +1 -0
  284. package/dist/src/schema/blocks/types.js +2 -0
  285. package/dist/src/schema/blocks/types.js.map +1 -0
  286. package/dist/src/schema/index.js +11 -0
  287. package/dist/src/schema/index.js.map +1 -0
  288. package/dist/src/schema/inlineContent/createSpec.js +64 -0
  289. package/dist/src/schema/inlineContent/createSpec.js.map +1 -0
  290. package/dist/src/schema/inlineContent/internal.js +52 -0
  291. package/dist/src/schema/inlineContent/internal.js.map +1 -0
  292. package/dist/src/schema/inlineContent/types.js +10 -0
  293. package/dist/src/schema/inlineContent/types.js.map +1 -0
  294. package/dist/src/schema/propTypes.js +2 -0
  295. package/dist/src/schema/propTypes.js.map +1 -0
  296. package/dist/src/schema/styles/createSpec.js +48 -0
  297. package/dist/src/schema/styles/createSpec.js.map +1 -0
  298. package/dist/src/schema/styles/internal.js +53 -0
  299. package/dist/src/schema/styles/internal.js.map +1 -0
  300. package/dist/src/schema/styles/types.js +2 -0
  301. package/dist/src/schema/styles/types.js.map +1 -0
  302. package/dist/src/util/EventEmitter.js +33 -0
  303. package/dist/src/util/EventEmitter.js.map +1 -0
  304. package/dist/src/util/browser.js +17 -0
  305. package/dist/src/util/browser.js.map +1 -0
  306. package/dist/src/util/combineByGroup.js +20 -0
  307. package/dist/src/util/combineByGroup.js.map +1 -0
  308. package/dist/src/util/esmDependencies.js +35 -0
  309. package/dist/src/util/esmDependencies.js.map +1 -0
  310. package/dist/src/util/string.js +14 -0
  311. package/dist/src/util/string.js.map +1 -0
  312. package/dist/src/util/typescript.js +12 -0
  313. package/dist/src/util/typescript.js.map +1 -0
  314. package/dist/style.css +1 -1
  315. package/dist/tsconfig.tsbuildinfo +1 -0
  316. package/dist/webpack-stats.json +1 -1
  317. package/package.json +5 -5
  318. package/src/api/blockManipulation/commands/insertBlocks/__snapshots__/insertBlocks.test.ts.snap +0 -6
  319. package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.ts +2 -0
  320. package/src/api/blockManipulation/commands/mergeBlocks/__snapshots__/mergeBlocks.test.ts.snap +0 -5
  321. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.ts +2 -2
  322. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.ts +104 -39
  323. package/src/api/blockManipulation/commands/moveBlock/__snapshots__/moveBlock.test.ts.snap +0 -8
  324. package/src/api/blockManipulation/commands/moveBlock/moveBlock.test.ts +7 -3
  325. package/src/api/blockManipulation/commands/moveBlock/moveBlock.ts +3 -5
  326. package/src/api/blockManipulation/commands/nestBlock/nestBlock.ts +100 -0
  327. package/src/api/blockManipulation/commands/removeBlocks/__snapshots__/removeBlocks.test.ts.snap +439 -2
  328. package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.ts +6 -0
  329. package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.ts +2 -82
  330. package/src/api/blockManipulation/commands/replaceBlocks/__snapshots__/replaceBlocks.test.ts.snap +0 -8
  331. package/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.ts +96 -20
  332. package/src/api/blockManipulation/commands/splitBlock/__snapshots__/splitBlock.test.ts.snap +0 -6
  333. package/src/api/blockManipulation/commands/splitBlock/splitBlock.test.ts +8 -4
  334. package/src/api/blockManipulation/commands/splitBlock/splitBlock.ts +13 -12
  335. package/src/api/blockManipulation/commands/updateBlock/__snapshots__/updateBlock.test.ts.snap +0 -490
  336. package/src/api/blockManipulation/commands/updateBlock/updateBlock.test.ts +5 -5
  337. package/src/api/blockManipulation/commands/updateBlock/updateBlock.ts +192 -107
  338. package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.ts +48 -33
  339. package/src/api/clipboard/fromClipboard/acceptedMIMETypes.ts +1 -1
  340. package/src/api/clipboard/fromClipboard/handleFileInsertion.ts +7 -6
  341. package/src/api/clipboard/toClipboard/copyExtension.ts +1 -1
  342. package/src/api/exporters/html/htmlConversion.test.ts +1 -4
  343. package/src/api/exporters/html/util/serializeBlocksExternalHTML.ts +7 -1
  344. package/src/api/exporters/html/util/serializeBlocksInternalHTML.ts +56 -19
  345. package/src/api/exporters/markdown/markdownExporter.test.ts +1 -4
  346. package/src/api/getBlockInfoFromPos.ts +125 -80
  347. package/src/api/nodeConversions/blockToNode.ts +50 -25
  348. package/src/api/nodeConversions/fragmentToBlocks.ts +18 -0
  349. package/src/api/nodeConversions/nodeToBlock.ts +24 -21
  350. package/src/api/nodeUtil.ts +1 -1
  351. package/src/api/parsers/html/__snapshots__/parse-notion-html.json +1 -2
  352. package/src/api/testUtil/partialBlockTestUtil.ts +15 -3
  353. package/src/blocks/AudioBlockContent/AudioBlockContent.ts +4 -2
  354. package/src/blocks/FileBlockContent/fileBlockHelpers.ts +5 -4
  355. package/src/blocks/HeadingBlockContent/HeadingBlockContent.ts +35 -35
  356. package/src/blocks/ImageBlockContent/ImageBlockContent.ts +4 -2
  357. package/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +14 -12
  358. package/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.ts +28 -16
  359. package/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.ts +5 -3
  360. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts +11 -4
  361. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +13 -11
  362. package/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts +8 -9
  363. package/src/blocks/TableBlockContent/TableBlockContent.ts +0 -1
  364. package/src/blocks/VideoBlockContent/VideoBlockContent.ts +4 -2
  365. package/src/blocks/defaultBlockHelpers.ts +7 -2
  366. package/src/editor/Block.css +22 -1
  367. package/src/editor/BlockNoteEditor.test.ts +4 -7
  368. package/src/editor/BlockNoteEditor.ts +87 -61
  369. package/src/editor/BlockNoteExtensions.ts +92 -17
  370. package/src/editor/BlockNoteTipTapEditor.ts +8 -1
  371. package/src/editor/defaultColors.ts +77 -0
  372. package/src/editor/editor.css +10 -0
  373. package/src/editor/transformPasted.ts +6 -3
  374. package/src/exporter/Exporter.ts +101 -0
  375. package/src/exporter/index.ts +2 -0
  376. package/src/exporter/mapping.ts +75 -0
  377. package/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts +233 -53
  378. package/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.ts +45 -42
  379. package/src/extensions/Placeholder/PlaceholderPlugin.ts +94 -90
  380. package/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.ts +173 -169
  381. package/src/extensions/SideMenu/SideMenuPlugin.ts +141 -52
  382. package/src/extensions/SideMenu/dragging.ts +3 -54
  383. package/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts +4 -6
  384. package/src/extensions/TableHandles/TableHandlesPlugin.ts +1 -1
  385. package/src/extensions/TrailingNode/TrailingNodeExtension.ts +1 -1
  386. package/src/extensions/getDraggableBlockFromElement.ts +19 -0
  387. package/src/i18n/locales/de.ts +5 -5
  388. package/src/i18n/locales/pt.ts +5 -5
  389. package/src/index.ts +9 -5
  390. package/src/pm-nodes/BlockContainer.ts +1 -1
  391. package/src/pm-nodes/BlockGroup.ts +2 -2
  392. package/src/pm-nodes/README.md +127 -28
  393. package/src/schema/blocks/createSpec.ts +4 -1
  394. package/src/schema/blocks/internal.ts +12 -2
  395. package/src/schema/blocks/types.ts +1 -1
  396. package/src/util/combineByGroup.ts +25 -0
  397. package/types/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.d.ts +22 -2
  398. package/types/src/api/blockManipulation/commands/nestBlock/nestBlock.d.ts +5 -0
  399. package/types/src/api/blockManipulation/commands/removeBlocks/removeBlocks.d.ts +0 -3
  400. package/types/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.d.ts +4 -0
  401. package/types/src/api/blockManipulation/setupTestEnv.d.ts +0 -6
  402. package/types/src/api/clipboard/fromClipboard/acceptedMIMETypes.d.ts +1 -1
  403. package/types/src/api/getBlockInfoFromPos.d.ts +38 -13
  404. package/types/src/api/nodeConversions/blockToNode.d.ts +1 -1
  405. package/types/src/api/nodeConversions/nodeToBlock.d.ts +3 -1
  406. package/types/src/api/testUtil/cases/customBlocks.d.ts +0 -6
  407. package/types/src/api/testUtil/cases/customInlineContent.d.ts +0 -6
  408. package/types/src/api/testUtil/cases/customStyles.d.ts +0 -6
  409. package/types/src/api/testUtil/partialBlockTestUtil.d.ts +2 -1
  410. package/types/src/blocks/AudioBlockContent/AudioBlockContent.d.ts +1 -0
  411. package/types/src/blocks/FileBlockContent/fileBlockHelpers.d.ts +1 -0
  412. package/types/src/blocks/ImageBlockContent/ImageBlockContent.d.ts +1 -0
  413. package/types/src/blocks/TableBlockContent/TableBlockContent.d.ts +0 -9
  414. package/types/src/blocks/VideoBlockContent/VideoBlockContent.d.ts +1 -0
  415. package/types/src/blocks/defaultBlocks.d.ts +0 -12
  416. package/types/src/editor/BlockNoteEditor.d.ts +23 -5
  417. package/types/src/editor/BlockNoteExtensions.d.ts +14 -7
  418. package/types/src/editor/BlockNoteTipTapEditor.d.ts +1 -0
  419. package/types/src/editor/defaultColors.d.ts +76 -0
  420. package/types/src/exporter/Exporter.d.ts +43 -0
  421. package/types/src/exporter/index.d.ts +2 -0
  422. package/types/src/exporter/mapping.d.ts +30 -0
  423. package/types/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.d.ts +4 -1
  424. package/types/src/extensions/Placeholder/PlaceholderPlugin.d.ts +4 -1
  425. package/types/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.d.ts +4 -5
  426. package/types/src/extensions/SideMenu/SideMenuPlugin.d.ts +2 -1
  427. package/types/src/extensions/SideMenu/dragging.d.ts +1 -6
  428. package/types/src/extensions/getDraggableBlockFromElement.d.ts +5 -0
  429. package/types/src/index.d.ts +9 -5
  430. package/types/src/schema/blocks/createSpec.d.ts +1 -1
  431. package/types/src/schema/blocks/internal.d.ts +2 -2
  432. package/types/src/schema/blocks/types.d.ts +1 -1
  433. package/types/src/util/combineByGroup.d.ts +9 -0
  434. package/dist/angular-html-HQGguTAE.js +0 -33
  435. package/dist/angular-html-HQGguTAE.js.map +0 -1
  436. package/dist/angular-ts-q9PqJiJb.js +0 -22
  437. package/dist/angular-ts-q9PqJiJb.js.map +0 -1
  438. package/dist/astro-0iWgpDaK.js +0 -17
  439. package/dist/astro-0iWgpDaK.js.map +0 -1
  440. package/dist/blade-C3Z8AhvY.js +0 -19
  441. package/dist/blade-C3Z8AhvY.js.map +0 -1
  442. package/dist/c-TKJGJdXV.js +0 -7
  443. package/dist/c-TKJGJdXV.js.map +0 -1
  444. package/dist/coffee-CN_y6cG3.js +0 -9
  445. package/dist/coffee-CN_y6cG3.js.map +0 -1
  446. package/dist/cpp-Be_e67JE.js +0 -19
  447. package/dist/cpp-Be_e67JE.js.map +0 -1
  448. package/dist/css-DHLSoXzW.js +0 -7
  449. package/dist/css-DHLSoXzW.js.map +0 -1
  450. package/dist/glsl-8qSUIm5B.js +0 -9
  451. package/dist/glsl-8qSUIm5B.js.map +0 -1
  452. package/dist/graphql-D7_Dk2ma.js +0 -15
  453. package/dist/graphql-D7_Dk2ma.js.map +0 -1
  454. package/dist/haml-S3dmcfEW.js +0 -11
  455. package/dist/haml-S3dmcfEW.js.map +0 -1
  456. package/dist/handlebars-DaIrqVg3.js +0 -15
  457. package/dist/handlebars-DaIrqVg3.js.map +0 -1
  458. package/dist/html-Bx3A18fV.js +0 -11
  459. package/dist/html-Bx3A18fV.js.map +0 -1
  460. package/dist/html-derivative-Cf3KTZBS.js +0 -9
  461. package/dist/html-derivative-Cf3KTZBS.js.map +0 -1
  462. package/dist/http-BphR83YX.js +0 -15
  463. package/dist/http-BphR83YX.js.map +0 -1
  464. package/dist/imba-CmP25v0O.js +0 -9
  465. package/dist/imba-CmP25v0O.js.map +0 -1
  466. package/dist/java-Dg4kxH6C.js +0 -7
  467. package/dist/java-Dg4kxH6C.js.map +0 -1
  468. package/dist/javascript-CipAzIn1.js +0 -7
  469. package/dist/javascript-CipAzIn1.js.map +0 -1
  470. package/dist/jinja-tioldiz6.js +0 -12
  471. package/dist/jinja-tioldiz6.js.map +0 -1
  472. package/dist/jison-DWJFEE_I.js +0 -9
  473. package/dist/jison-DWJFEE_I.js.map +0 -1
  474. package/dist/json-_04EL6MS.js +0 -7
  475. package/dist/json-_04EL6MS.js.map +0 -1
  476. package/dist/json5-Dwmp5XFI.js +0 -7
  477. package/dist/json5-Dwmp5XFI.js.map +0 -1
  478. package/dist/jsonc-LqD5auy0.js +0 -7
  479. package/dist/jsonc-LqD5auy0.js.map +0 -1
  480. package/dist/jsonl-B4yVuYQH.js +0 -7
  481. package/dist/jsonl-B4yVuYQH.js.map +0 -1
  482. package/dist/jsx-Mg4WaD5k.js +0 -7
  483. package/dist/jsx-Mg4WaD5k.js.map +0 -1
  484. package/dist/julia-CWi-ZdpN.js +0 -17
  485. package/dist/julia-CWi-ZdpN.js.map +0 -1
  486. package/dist/less-BBvTHIGe.js +0 -7
  487. package/dist/less-BBvTHIGe.js.map +0 -1
  488. package/dist/markdown-DAXqtk9a.js +0 -7
  489. package/dist/markdown-DAXqtk9a.js.map +0 -1
  490. package/dist/marko-0aaNgUGV.js +0 -15
  491. package/dist/marko-0aaNgUGV.js.map +0 -1
  492. package/dist/mdc-hXJ2B4O0.js +0 -13
  493. package/dist/mdc-hXJ2B4O0.js.map +0 -1
  494. package/dist/mdx-CSCKbb_f.js +0 -7
  495. package/dist/mdx-CSCKbb_f.js.map +0 -1
  496. package/dist/php-B_-4RJ09.js +0 -19
  497. package/dist/php-B_-4RJ09.js.map +0 -1
  498. package/dist/postcss-SJfTvo_B.js +0 -7
  499. package/dist/postcss-SJfTvo_B.js.map +0 -1
  500. package/dist/pug-3q2tx0nf.js +0 -13
  501. package/dist/pug-3q2tx0nf.js.map +0 -1
  502. package/dist/python-Dpup1-fE.js +0 -7
  503. package/dist/python-Dpup1-fE.js.map +0 -1
  504. package/dist/r-Chyv38Fv.js +0 -7
  505. package/dist/r-Chyv38Fv.js.map +0 -1
  506. package/dist/regexp-BF0hfxNW.js +0 -7
  507. package/dist/regexp-BF0hfxNW.js.map +0 -1
  508. package/dist/sass-p2RMoqDT.js +0 -7
  509. package/dist/sass-p2RMoqDT.js.map +0 -1
  510. package/dist/scss-DmlHSoOY.js +0 -9
  511. package/dist/scss-DmlHSoOY.js.map +0 -1
  512. package/dist/shellscript-CZpPN8_x.js +0 -7
  513. package/dist/shellscript-CZpPN8_x.js.map +0 -1
  514. package/dist/sql-DtlkUz2m.js +0 -7
  515. package/dist/sql-DtlkUz2m.js.map +0 -1
  516. package/dist/stylus-DEr8eSLm.js +0 -7
  517. package/dist/stylus-DEr8eSLm.js.map +0 -1
  518. package/dist/svelte-BRIJF62h.js +0 -15
  519. package/dist/svelte-BRIJF62h.js.map +0 -1
  520. package/dist/ts-tags-qkUtuI0N.js +0 -42
  521. package/dist/ts-tags-qkUtuI0N.js.map +0 -1
  522. package/dist/tsx-DTfbgJxi.js +0 -7
  523. package/dist/tsx-DTfbgJxi.js.map +0 -1
  524. package/dist/typescript-CCd4aQHh.js +0 -7
  525. package/dist/typescript-CCd4aQHh.js.map +0 -1
  526. package/dist/vue-B3TdbERm.js +0 -32
  527. package/dist/vue-B3TdbERm.js.map +0 -1
  528. package/dist/vue-html-BGmTBZk0.js +0 -11
  529. package/dist/vue-html-BGmTBZk0.js.map +0 -1
  530. package/dist/wasm-VDIDph3E.js +0 -7
  531. package/dist/wasm-VDIDph3E.js.map +0 -1
  532. package/dist/wgsl-2np_U3Z8.js +0 -7
  533. package/dist/wgsl-2np_U3Z8.js.map +0 -1
  534. package/dist/xml-CNyphW9R.js +0 -9
  535. package/dist/xml-CNyphW9R.js.map +0 -1
  536. package/dist/yaml-DxFiVFcM.js +0 -7
  537. package/dist/yaml-DxFiVFcM.js.map +0 -1
@@ -0,0 +1,101 @@
1
+ import { BlockNoteSchema } from "../editor/BlockNoteSchema.js";
2
+ import { COLORS_DEFAULT } from "../editor/defaultColors.js";
3
+ import {
4
+ BlockFromConfig,
5
+ BlockSchema,
6
+ InlineContent,
7
+ InlineContentSchema,
8
+ StyleSchema,
9
+ StyledText,
10
+ Styles,
11
+ } from "../schema/index.js";
12
+
13
+ import type {
14
+ BlockMapping,
15
+ InlineContentMapping,
16
+ StyleMapping,
17
+ } from "./mapping.js";
18
+
19
+ export type ExporterOptions = {
20
+ /**
21
+ * A function that can be used to resolve files, images, etc.
22
+ * Exporters might need the binary contents of files like images,
23
+ * which might not always be available from the same origin as the main page.
24
+ * You can use this option to proxy requests through a server you control
25
+ * to avoid cross-origin (CORS) issues.
26
+ *
27
+ * @default uses a BlockNote hosted proxy (https://corsproxy.api.blocknotejs.org/)
28
+ * @param url - The URL of the file to resolve
29
+ * @returns A Promise that resolves to a string (the URL to use instead of the original)
30
+ * or a Blob (you can return the Blob directly if you have already fetched it)
31
+ */
32
+ resolveFileUrl?: (url: string) => Promise<string | Blob>;
33
+ /**
34
+ * Colors to use for background of blocks, font colors, and highlight colors
35
+ */
36
+ colors: typeof COLORS_DEFAULT;
37
+ };
38
+ export abstract class Exporter<
39
+ B extends BlockSchema,
40
+ I extends InlineContentSchema,
41
+ S extends StyleSchema,
42
+ RB,
43
+ RI,
44
+ RS,
45
+ TS
46
+ > {
47
+ public constructor(
48
+ _schema: BlockNoteSchema<B, I, S>, // only used for type inference
49
+ protected readonly mappings: {
50
+ blockMapping: BlockMapping<B, I, S, RB, RI>;
51
+ inlineContentMapping: InlineContentMapping<I, S, RI, TS>;
52
+ styleMapping: StyleMapping<S, RS>;
53
+ },
54
+ public readonly options: ExporterOptions
55
+ ) {}
56
+
57
+ public async resolveFile(url: string) {
58
+ if (!this.options?.resolveFileUrl) {
59
+ return (await fetch(url)).blob();
60
+ }
61
+ const ret = await this.options.resolveFileUrl(url);
62
+ if (ret instanceof Blob) {
63
+ return ret;
64
+ }
65
+ return (await fetch(ret)).blob();
66
+ }
67
+
68
+ public mapStyles(styles: Styles<S>) {
69
+ const stylesArray = Object.entries(styles).map(([key, value]) => {
70
+ const mappedStyle = this.mappings.styleMapping[key](value, this);
71
+ return mappedStyle;
72
+ });
73
+ return stylesArray;
74
+ }
75
+
76
+ public mapInlineContent(inlineContent: InlineContent<I, S>) {
77
+ return this.mappings.inlineContentMapping[inlineContent.type](
78
+ inlineContent,
79
+ this
80
+ );
81
+ }
82
+
83
+ public transformInlineContent(inlineContentArray: InlineContent<I, S>[]) {
84
+ return inlineContentArray.map((ic) => this.mapInlineContent(ic));
85
+ }
86
+
87
+ public abstract transformStyledText(styledText: StyledText<S>): TS;
88
+
89
+ public async mapBlock(
90
+ block: BlockFromConfig<B[keyof B], I, S>,
91
+ nestingLevel: number,
92
+ numberedListIndex: number
93
+ ) {
94
+ return this.mappings.blockMapping[block.type](
95
+ block,
96
+ this,
97
+ nestingLevel,
98
+ numberedListIndex
99
+ );
100
+ }
101
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./Exporter.js";
2
+ export * from "./mapping.js";
@@ -0,0 +1,75 @@
1
+ import { BlockNoteSchema } from "../editor/BlockNoteSchema.js";
2
+ import {
3
+ BlockFromConfigNoChildren,
4
+ BlockSchema,
5
+ InlineContentFromConfig,
6
+ InlineContentSchema,
7
+ StyleSchema,
8
+ Styles,
9
+ } from "../schema/index.js";
10
+ import type { Exporter } from "./Exporter.js";
11
+
12
+ /**
13
+ * Defines a mapping from all block types with a schema to a result type `R`.
14
+ */
15
+ export type BlockMapping<
16
+ B extends BlockSchema,
17
+ I extends InlineContentSchema,
18
+ S extends StyleSchema,
19
+ RB,
20
+ RI
21
+ > = {
22
+ [K in keyof B]: (
23
+ block: BlockFromConfigNoChildren<B[K], I, S>,
24
+ // we don't know the exact types that are supported by the exporter at this point,
25
+ // because the mapping only knows about converting certain types (which might be a subset of the supported types)
26
+ // this is why there are many `any` types here (same for types below)
27
+ exporter: Exporter<any, any, any, RB, RI, any, any>,
28
+ nestingLevel: number,
29
+ numberedListIndex?: number
30
+ ) => RB | Promise<RB>;
31
+ };
32
+
33
+ /**
34
+ * Defines a mapping from all inline content types with a schema to a result type R.
35
+ */
36
+ export type InlineContentMapping<
37
+ I extends InlineContentSchema,
38
+ S extends StyleSchema,
39
+ RI,
40
+ TS
41
+ > = {
42
+ [K in keyof I]: (
43
+ inlineContent: InlineContentFromConfig<I[K], S>,
44
+ exporter: Exporter<any, I, S, any, RI, any, TS>
45
+ ) => RI;
46
+ };
47
+
48
+ /**
49
+ * Defines a mapping from all style types with a schema to a result type R.
50
+ */
51
+ export type StyleMapping<S extends StyleSchema, RS> = {
52
+ [K in keyof S]: (
53
+ style: Styles<S>[K],
54
+ exporter: Exporter<any, any, any, any, any, RS, any>
55
+ ) => RS;
56
+ };
57
+
58
+ /**
59
+ * The mapping factory is a utility function to easily create mappings for
60
+ * a BlockNoteSchema. Using the factory makes it easier to get typescript code completion etc.
61
+ */
62
+ export function mappingFactory<
63
+ B extends BlockSchema,
64
+ I extends InlineContentSchema,
65
+ S extends StyleSchema
66
+ >(_schema: BlockNoteSchema<B, I, S>) {
67
+ return {
68
+ createBlockMapping: <R, RI>(mapping: BlockMapping<B, I, S, R, RI>) =>
69
+ mapping,
70
+ createInlineContentMapping: <R, RS>(
71
+ mapping: InlineContentMapping<I, S, R, RS>
72
+ ) => mapping,
73
+ createStyleMapping: <R>(mapping: StyleMapping<S, R>) => mapping,
74
+ };
75
+ }
@@ -1,16 +1,17 @@
1
1
  import { Extension } from "@tiptap/core";
2
2
 
3
3
  import { TextSelection } from "prosemirror-state";
4
+ import { ReplaceAroundStep } from "prosemirror-transform";
4
5
  import {
5
- getPrevBlockPos,
6
+ getBottomNestedBlockInfo,
7
+ getParentBlockInfo,
8
+ getPrevBlockInfo,
6
9
  mergeBlocksCommand,
7
10
  } from "../../api/blockManipulation/commands/mergeBlocks/mergeBlocks.js";
11
+ import { nestBlock } from "../../api/blockManipulation/commands/nestBlock/nestBlock.js";
8
12
  import { splitBlockCommand } from "../../api/blockManipulation/commands/splitBlock/splitBlock.js";
9
13
  import { updateBlockCommand } from "../../api/blockManipulation/commands/updateBlock/updateBlock.js";
10
- import {
11
- getBlockInfoFromResolvedPos,
12
- getBlockInfoFromSelection,
13
- } from "../../api/getBlockInfoFromPos.js";
14
+ import { getBlockInfoFromSelection } from "../../api/getBlockInfoFromPos.js";
14
15
  import { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
15
16
 
16
17
  export const KeyboardShortcutsExtension = Extension.create<{
@@ -32,6 +33,9 @@ export const KeyboardShortcutsExtension = Extension.create<{
32
33
  () =>
33
34
  commands.command(({ state }) => {
34
35
  const blockInfo = getBlockInfoFromSelection(state);
36
+ if (!blockInfo.isBlockContainer) {
37
+ return false;
38
+ }
35
39
 
36
40
  const selectionAtBlockStart =
37
41
  state.selection.from === blockInfo.blockContent.beforePos + 1;
@@ -42,7 +46,7 @@ export const KeyboardShortcutsExtension = Extension.create<{
42
46
  return commands.command(
43
47
  updateBlockCommand(
44
48
  this.options.editor,
45
- blockInfo.blockContainer.beforePos,
49
+ blockInfo.bnBlock.beforePos,
46
50
  {
47
51
  type: "paragraph",
48
52
  props: {},
@@ -56,7 +60,11 @@ export const KeyboardShortcutsExtension = Extension.create<{
56
60
  // Removes a level of nesting if the block is indented if the selection is at the start of the block.
57
61
  () =>
58
62
  commands.command(({ state }) => {
59
- const { blockContent } = getBlockInfoFromSelection(state);
63
+ const blockInfo = getBlockInfoFromSelection(state);
64
+ if (!blockInfo.isBlockContainer) {
65
+ return false;
66
+ }
67
+ const { blockContent } = blockInfo;
60
68
 
61
69
  const selectionAtBlockStart =
62
70
  state.selection.from === blockContent.beforePos + 1;
@@ -67,29 +75,23 @@ export const KeyboardShortcutsExtension = Extension.create<{
67
75
 
68
76
  return false;
69
77
  }),
70
- // Merges block with the previous one if it isn't indented, isn't the
71
- // first block in the doc, and the selection is at the start of the
78
+ // Merges block with the previous one if it isn't indented, and the selection is at the start of the
72
79
  // block. The target block for merging must contain inline content.
73
80
  () =>
74
81
  commands.command(({ state }) => {
75
- const { blockContainer, blockContent } =
76
- getBlockInfoFromSelection(state);
77
-
78
- const { depth } = state.doc.resolve(blockContainer.beforePos);
82
+ const blockInfo = getBlockInfoFromSelection(state);
83
+ if (!blockInfo.isBlockContainer) {
84
+ return false;
85
+ }
86
+ const { bnBlock: blockContainer, blockContent } = blockInfo;
79
87
 
80
88
  const selectionAtBlockStart =
81
89
  state.selection.from === blockContent.beforePos + 1;
82
90
  const selectionEmpty = state.selection.empty;
83
- const blockAtDocStart = blockContainer.beforePos === 1;
84
91
 
85
92
  const posBetweenBlocks = blockContainer.beforePos;
86
93
 
87
- if (
88
- !blockAtDocStart &&
89
- selectionAtBlockStart &&
90
- selectionEmpty &&
91
- depth === 1
92
- ) {
94
+ if (selectionAtBlockStart && selectionEmpty) {
93
95
  return chain()
94
96
  .command(mergeBlocksCommand(posBetweenBlocks))
95
97
  .scrollIntoView()
@@ -98,6 +100,165 @@ export const KeyboardShortcutsExtension = Extension.create<{
98
100
 
99
101
  return false;
100
102
  }),
103
+ () =>
104
+ commands.command(({ state, dispatch }) => {
105
+ // when at the start of a first block in a column
106
+ const blockInfo = getBlockInfoFromSelection(state);
107
+ if (!blockInfo.isBlockContainer) {
108
+ return false;
109
+ }
110
+
111
+ const selectionAtBlockStart =
112
+ state.selection.from === blockInfo.blockContent.beforePos + 1;
113
+
114
+ if (!selectionAtBlockStart) {
115
+ return false;
116
+ }
117
+
118
+ const prevBlockInfo = getPrevBlockInfo(
119
+ state.doc,
120
+ blockInfo.bnBlock.beforePos
121
+ );
122
+
123
+ if (prevBlockInfo) {
124
+ // should be no previous block
125
+ return false;
126
+ }
127
+
128
+ const parentBlockInfo = getParentBlockInfo(
129
+ state.doc,
130
+ blockInfo.bnBlock.beforePos
131
+ );
132
+
133
+ if (parentBlockInfo?.blockNoteType !== "column") {
134
+ return false;
135
+ }
136
+
137
+ const column = parentBlockInfo;
138
+
139
+ const columnList = getParentBlockInfo(
140
+ state.doc,
141
+ column.bnBlock.beforePos
142
+ );
143
+ if (columnList?.blockNoteType !== "columnList") {
144
+ throw new Error("parent of column is not a column list");
145
+ }
146
+
147
+ const shouldRemoveColumn =
148
+ column.childContainer!.node.childCount === 1;
149
+
150
+ const shouldRemoveColumnList =
151
+ shouldRemoveColumn &&
152
+ columnList.childContainer!.node.childCount === 2;
153
+
154
+ const isFirstColumn =
155
+ columnList.childContainer!.node.firstChild ===
156
+ column.bnBlock.node;
157
+
158
+ if (dispatch) {
159
+ const blockToMove = state.doc.slice(
160
+ blockInfo.bnBlock.beforePos,
161
+ blockInfo.bnBlock.afterPos,
162
+ false
163
+ );
164
+
165
+ /*
166
+ There are 3 different cases:
167
+ a) remove entire column list (if no columns would be remaining)
168
+ b) remove just a column (if no blocks inside a column would be remaining)
169
+ c) keep columns (if there are blocks remaining inside a column)
170
+
171
+ Each of these 3 cases has 2 sub-cases, depending on whether the backspace happens at the start of the first (most-left) column,
172
+ or at the start of a non-first column.
173
+ */
174
+ if (shouldRemoveColumnList) {
175
+ if (isFirstColumn) {
176
+ state.tr.step(
177
+ new ReplaceAroundStep(
178
+ // replace entire column list
179
+ columnList.bnBlock.beforePos,
180
+ columnList.bnBlock.afterPos,
181
+ // select content of remaining column:
182
+ column.bnBlock.afterPos + 1,
183
+ columnList.bnBlock.afterPos - 2,
184
+ blockToMove,
185
+ blockToMove.size, // append existing content to blockToMove
186
+ false
187
+ )
188
+ );
189
+ const pos = state.tr.doc.resolve(column.bnBlock.beforePos);
190
+ state.tr.setSelection(TextSelection.between(pos, pos));
191
+ } else {
192
+ // replaces the column list with the blockToMove slice, prepended with the content of the remaining column
193
+ state.tr.step(
194
+ new ReplaceAroundStep(
195
+ // replace entire column list
196
+ columnList.bnBlock.beforePos,
197
+ columnList.bnBlock.afterPos,
198
+ // select content of existing column:
199
+ columnList.bnBlock.beforePos + 2,
200
+ column.bnBlock.beforePos - 1,
201
+ blockToMove,
202
+ 0, // prepend existing content to blockToMove
203
+ false
204
+ )
205
+ );
206
+ const pos = state.tr.doc.resolve(
207
+ state.tr.mapping.map(column.bnBlock.beforePos - 1)
208
+ );
209
+ state.tr.setSelection(TextSelection.between(pos, pos));
210
+ }
211
+ } else if (shouldRemoveColumn) {
212
+ if (isFirstColumn) {
213
+ // delete column
214
+ state.tr.delete(
215
+ column.bnBlock.beforePos,
216
+ column.bnBlock.afterPos
217
+ );
218
+
219
+ // move before columnlist
220
+ state.tr.insert(
221
+ columnList.bnBlock.beforePos,
222
+ blockToMove.content
223
+ );
224
+
225
+ const pos = state.tr.doc.resolve(
226
+ columnList.bnBlock.beforePos
227
+ );
228
+ state.tr.setSelection(TextSelection.between(pos, pos));
229
+ } else {
230
+ // just delete the </column><column> closing and opening tags to merge the columns
231
+ state.tr.delete(
232
+ column.bnBlock.beforePos - 1,
233
+ column.bnBlock.beforePos + 1
234
+ );
235
+ }
236
+ } else {
237
+ // delete block
238
+ state.tr.delete(
239
+ blockInfo.bnBlock.beforePos,
240
+ blockInfo.bnBlock.afterPos
241
+ );
242
+ if (isFirstColumn) {
243
+ // move before columnlist
244
+ state.tr.insert(
245
+ columnList.bnBlock.beforePos - 1,
246
+ blockToMove.content
247
+ );
248
+ } else {
249
+ // append block to previous column
250
+ state.tr.insert(
251
+ column.bnBlock.beforePos - 1,
252
+ blockToMove.content
253
+ );
254
+ }
255
+ const pos = state.tr.doc.resolve(column.bnBlock.beforePos - 1);
256
+ state.tr.setSelection(TextSelection.between(pos, pos));
257
+ }
258
+ }
259
+
260
+ return true;
261
+ }),
101
262
  // Deletes previous block if it contains no content and isn't a table,
102
263
  // when the selection is empty and at the start of the block. Moves the
103
264
  // current block into the deleted block's place.
@@ -105,47 +266,49 @@ export const KeyboardShortcutsExtension = Extension.create<{
105
266
  commands.command(({ state }) => {
106
267
  const blockInfo = getBlockInfoFromSelection(state);
107
268
 
108
- const { depth } = state.doc.resolve(
109
- blockInfo.blockContainer.beforePos
110
- );
269
+ if (!blockInfo.isBlockContainer) {
270
+ // TODO
271
+ throw new Error(`todo`);
272
+ }
111
273
 
112
274
  const selectionAtBlockStart =
113
275
  state.selection.from === blockInfo.blockContent.beforePos + 1;
114
276
  const selectionEmpty = state.selection.empty;
115
- const blockAtDocStart = blockInfo.blockContainer.beforePos === 1;
116
277
 
117
- if (
118
- !blockAtDocStart &&
119
- selectionAtBlockStart &&
120
- selectionEmpty &&
121
- depth === 1
122
- ) {
123
- const prevBlockPos = getPrevBlockPos(
278
+ const prevBlockInfo = getPrevBlockInfo(
279
+ state.doc,
280
+ blockInfo.bnBlock.beforePos
281
+ );
282
+
283
+ if (prevBlockInfo && selectionAtBlockStart && selectionEmpty) {
284
+ const bottomBlock = getBottomNestedBlockInfo(
124
285
  state.doc,
125
- state.doc.resolve(blockInfo.blockContainer.beforePos)
126
- );
127
- const prevBlockInfo = getBlockInfoFromResolvedPos(
128
- state.doc.resolve(prevBlockPos.pos)
286
+ prevBlockInfo
129
287
  );
130
288
 
289
+ if (!bottomBlock.isBlockContainer) {
290
+ // TODO
291
+ throw new Error(`todo`);
292
+ }
293
+
131
294
  const prevBlockNotTableAndNoContent =
132
- prevBlockInfo.blockContent.node.type.spec.content === "" ||
133
- (prevBlockInfo.blockContent.node.type.spec.content ===
295
+ bottomBlock.blockContent.node.type.spec.content === "" ||
296
+ (bottomBlock.blockContent.node.type.spec.content ===
134
297
  "inline*" &&
135
- prevBlockInfo.blockContent.node.childCount === 0);
298
+ bottomBlock.blockContent.node.childCount === 0);
136
299
 
137
300
  if (prevBlockNotTableAndNoContent) {
138
301
  return chain()
139
302
  .cut(
140
303
  {
141
- from: blockInfo.blockContainer.beforePos,
142
- to: blockInfo.blockContainer.afterPos,
304
+ from: blockInfo.bnBlock.beforePos,
305
+ to: blockInfo.bnBlock.afterPos,
143
306
  },
144
- prevBlockInfo.blockContainer.afterPos
307
+ bottomBlock.bnBlock.afterPos
145
308
  )
146
309
  .deleteRange({
147
- from: prevBlockInfo.blockContainer.beforePos,
148
- to: prevBlockInfo.blockContainer.afterPos,
310
+ from: bottomBlock.bnBlock.beforePos,
311
+ to: bottomBlock.bnBlock.afterPos,
149
312
  })
150
313
  .run();
151
314
  }
@@ -165,8 +328,15 @@ export const KeyboardShortcutsExtension = Extension.create<{
165
328
  () =>
166
329
  commands.command(({ state }) => {
167
330
  // TODO: Change this to not rely on offsets & schema assumptions
168
- const { blockContainer, blockContent, blockGroup } =
169
- getBlockInfoFromSelection(state);
331
+ const blockInfo = getBlockInfoFromSelection(state);
332
+ if (!blockInfo.isBlockContainer) {
333
+ return false;
334
+ }
335
+ const {
336
+ bnBlock: blockContainer,
337
+ blockContent,
338
+ childContainer,
339
+ } = blockInfo;
170
340
 
171
341
  const { depth } = state.doc.resolve(blockContainer.beforePos);
172
342
  const blockAtDocEnd =
@@ -174,7 +344,7 @@ export const KeyboardShortcutsExtension = Extension.create<{
174
344
  const selectionAtBlockEnd =
175
345
  state.selection.from === blockContent.afterPos - 1;
176
346
  const selectionEmpty = state.selection.empty;
177
- const hasChildBlocks = blockGroup !== undefined;
347
+ const hasChildBlocks = childContainer !== undefined;
178
348
 
179
349
  if (
180
350
  !blockAtDocEnd &&
@@ -205,8 +375,11 @@ export const KeyboardShortcutsExtension = Extension.create<{
205
375
  // of the block.
206
376
  () =>
207
377
  commands.command(({ state }) => {
208
- const { blockContent, blockContainer } =
209
- getBlockInfoFromSelection(state);
378
+ const blockInfo = getBlockInfoFromSelection(state);
379
+ if (!blockInfo.isBlockContainer) {
380
+ return false;
381
+ }
382
+ const { bnBlock: blockContainer, blockContent } = blockInfo;
210
383
 
211
384
  const { depth } = state.doc.resolve(blockContainer.beforePos);
212
385
 
@@ -232,8 +405,11 @@ export const KeyboardShortcutsExtension = Extension.create<{
232
405
  // empty & at the start of the block.
233
406
  () =>
234
407
  commands.command(({ state, dispatch }) => {
235
- const { blockContainer, blockContent } =
236
- getBlockInfoFromSelection(state);
408
+ const blockInfo = getBlockInfoFromSelection(state);
409
+ if (!blockInfo.isBlockContainer) {
410
+ return false;
411
+ }
412
+ const { bnBlock: blockContainer, blockContent } = blockInfo;
237
413
 
238
414
  const selectionAtBlockStart =
239
415
  state.selection.$anchor.parentOffset === 0;
@@ -266,7 +442,11 @@ export const KeyboardShortcutsExtension = Extension.create<{
266
442
  // deletes the selection beforehand, if it's not empty.
267
443
  () =>
268
444
  commands.command(({ state, chain }) => {
269
- const { blockContent } = getBlockInfoFromSelection(state);
445
+ const blockInfo = getBlockInfoFromSelection(state);
446
+ if (!blockInfo.isBlockContainer) {
447
+ return false;
448
+ }
449
+ const { blockContent } = blockInfo;
270
450
 
271
451
  const selectionAtBlockStart =
272
452
  state.selection.$anchor.parentOffset === 0;
@@ -306,8 +486,8 @@ export const KeyboardShortcutsExtension = Extension.create<{
306
486
  // don't handle tabs if a toolbar is shown, so we can tab into / out of it
307
487
  return false;
308
488
  }
309
- this.editor.commands.sinkListItem("blockContainer");
310
- return true;
489
+ return nestBlock(this.options.editor);
490
+ // return true;
311
491
  },
312
492
  "Shift-Tab": () => {
313
493
  if (
@@ -15,51 +15,54 @@ const PLUGIN_KEY = new PluginKey("node-selection-keyboard");
15
15
  // While a more elegant solution would probably process transactions instead of
16
16
  // keystrokes, this brings us most of the way to Notion's UX without much added
17
17
  // complexity.
18
- export const NodeSelectionKeyboardPlugin = () => {
19
- return new Plugin({
20
- key: PLUGIN_KEY,
21
- props: {
22
- handleKeyDown: (view, event) => {
23
- // Checks for node selection
24
- if ("node" in view.state.selection) {
25
- // Checks if key press uses ctrl/meta modifier
26
- if (event.ctrlKey || event.metaKey) {
27
- return false;
28
- }
29
- // Checks if key press is alphanumeric
30
- if (event.key.length === 1) {
31
- event.preventDefault();
18
+ export class NodeSelectionKeyboardPlugin {
19
+ public readonly plugin: Plugin;
20
+ constructor() {
21
+ this.plugin = new Plugin({
22
+ key: PLUGIN_KEY,
23
+ props: {
24
+ handleKeyDown: (view, event) => {
25
+ // Checks for node selection
26
+ if ("node" in view.state.selection) {
27
+ // Checks if key press uses ctrl/meta modifier
28
+ if (event.ctrlKey || event.metaKey) {
29
+ return false;
30
+ }
31
+ // Checks if key press is alphanumeric
32
+ if (event.key.length === 1) {
33
+ event.preventDefault();
32
34
 
33
- return true;
34
- }
35
- // Checks if key press is Enter
36
- if (
37
- event.key === "Enter" &&
38
- !event.shiftKey &&
39
- !event.altKey &&
40
- !event.ctrlKey &&
41
- !event.metaKey
42
- ) {
43
- const tr = view.state.tr;
44
- view.dispatch(
45
- tr
46
- .insert(
47
- view.state.tr.selection.$to.after(),
48
- view.state.schema.nodes["paragraph"].create()
49
- )
50
- .setSelection(
51
- new TextSelection(
52
- tr.doc.resolve(view.state.tr.selection.$to.after() + 1)
35
+ return true;
36
+ }
37
+ // Checks if key press is Enter
38
+ if (
39
+ event.key === "Enter" &&
40
+ !event.shiftKey &&
41
+ !event.altKey &&
42
+ !event.ctrlKey &&
43
+ !event.metaKey
44
+ ) {
45
+ const tr = view.state.tr;
46
+ view.dispatch(
47
+ tr
48
+ .insert(
49
+ view.state.tr.selection.$to.after(),
50
+ view.state.schema.nodes["paragraph"].createChecked()
51
+ )
52
+ .setSelection(
53
+ new TextSelection(
54
+ tr.doc.resolve(view.state.tr.selection.$to.after() + 1)
55
+ )
53
56
  )
54
- )
55
- );
57
+ );
56
58
 
57
- return true;
59
+ return true;
60
+ }
58
61
  }
59
- }
60
62
 
61
- return false;
63
+ return false;
64
+ },
62
65
  },
63
- },
64
- });
65
- };
66
+ });
67
+ }
68
+ }