@blocknote/core 0.15.11 → 0.17.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 (292) hide show
  1. package/dist/blocknote.js +3349 -2773
  2. package/dist/blocknote.js.map +1 -1
  3. package/dist/blocknote.umd.cjs +6 -6
  4. package/dist/blocknote.umd.cjs.map +1 -1
  5. package/dist/webpack-stats.json +1 -1
  6. package/package.json +5 -2
  7. package/src/api/blockManipulation/commands/insertBlocks/__snapshots__/insertBlocks.test.ts.snap +3087 -0
  8. package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.ts +132 -0
  9. package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.ts +71 -0
  10. package/src/api/blockManipulation/commands/mergeBlocks/__snapshots__/mergeBlocks.test.ts.snap +2276 -0
  11. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.ts +131 -0
  12. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.ts +103 -0
  13. package/src/api/blockManipulation/commands/moveBlock/__snapshots__/moveBlock.test.ts.snap +3767 -0
  14. package/src/api/blockManipulation/commands/moveBlock/moveBlock.test.ts +192 -0
  15. package/src/api/blockManipulation/commands/moveBlock/moveBlock.ts +178 -0
  16. package/src/api/blockManipulation/commands/removeBlocks/__snapshots__/removeBlocks.test.ts.snap +1136 -0
  17. package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.ts +34 -0
  18. package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.ts +100 -0
  19. package/src/api/blockManipulation/commands/replaceBlocks/__snapshots__/replaceBlocks.test.ts.snap +4931 -0
  20. package/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.ts +222 -0
  21. package/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.ts +70 -0
  22. package/src/api/blockManipulation/commands/splitBlock/__snapshots__/splitBlock.test.ts.snap +2924 -0
  23. package/src/api/blockManipulation/commands/splitBlock/splitBlock.test.ts +136 -0
  24. package/src/api/blockManipulation/commands/splitBlock/splitBlock.ts +48 -0
  25. package/src/api/blockManipulation/commands/updateBlock/__snapshots__/updateBlock.test.ts.snap +8376 -0
  26. package/src/api/blockManipulation/commands/updateBlock/updateBlock.test.ts +300 -0
  27. package/src/api/blockManipulation/commands/updateBlock/updateBlock.ts +199 -0
  28. package/src/api/blockManipulation/insertContentAt.ts +96 -0
  29. package/src/api/blockManipulation/selections/textCursorPosition/__snapshots__/textCursorPosition.test.ts.snap +316 -0
  30. package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.ts +53 -0
  31. package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.ts +130 -0
  32. package/src/api/blockManipulation/setupTestEnv.ts +179 -0
  33. package/src/api/clipboard/__snapshots__/childToParent.html +1 -0
  34. package/src/api/clipboard/__snapshots__/childrenToNextParent.html +1 -0
  35. package/src/api/clipboard/__snapshots__/childrenToNextParentsChildren.html +1 -0
  36. package/src/api/clipboard/__snapshots__/image.html +1 -0
  37. package/src/api/clipboard/__snapshots__/multipleStyledText.html +1 -0
  38. package/src/api/clipboard/__snapshots__/nestedImage.html +1 -0
  39. package/src/api/clipboard/__snapshots__/partialChildToParent.html +1 -0
  40. package/src/api/clipboard/__snapshots__/styledText.html +1 -0
  41. package/src/api/clipboard/__snapshots__/tableAllCells.html +1 -0
  42. package/src/api/clipboard/__snapshots__/tableCell.html +1 -0
  43. package/src/api/clipboard/__snapshots__/tableCellText.html +1 -0
  44. package/src/api/clipboard/__snapshots__/tableRow.html +1 -0
  45. package/src/api/clipboard/__snapshots__/unstyledText.html +1 -0
  46. package/src/api/clipboard/clipboard.test.ts +283 -0
  47. package/src/api/{parsers → clipboard/fromClipboard}/fileDropExtension.ts +8 -4
  48. package/src/api/{parsers → clipboard/fromClipboard}/handleFileInsertion.ts +12 -7
  49. package/src/api/{parsers → clipboard/fromClipboard}/pasteExtension.ts +19 -8
  50. package/src/api/clipboard/toClipboard/copyExtension.ts +243 -0
  51. package/src/api/exporters/html/__snapshots__/complex/misc/external.html +1 -1
  52. package/src/api/exporters/html/__snapshots__/lists/basic/external.html +1 -1
  53. package/src/api/exporters/html/__snapshots__/lists/nested/external.html +1 -1
  54. package/src/api/exporters/html/externalHTMLExporter.ts +42 -87
  55. package/src/api/exporters/html/htmlConversion.test.ts +19 -156
  56. package/src/api/exporters/html/internalHTMLSerializer.ts +21 -69
  57. package/src/api/exporters/html/util/serializeBlocksExternalHTML.ts +263 -0
  58. package/src/api/exporters/html/util/serializeBlocksInternalHTML.ts +158 -0
  59. package/src/api/exporters/markdown/markdownExporter.test.ts +10 -10
  60. package/src/api/exporters/markdown/markdownExporter.ts +11 -7
  61. package/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.ts +2 -2
  62. package/src/api/getBlockInfoFromPos.ts +172 -90
  63. package/src/api/nodeConversions/blockToNode.ts +257 -0
  64. package/src/api/nodeConversions/fragmentToBlocks.ts +60 -0
  65. package/src/api/nodeConversions/nodeConversions.test.ts +9 -8
  66. package/src/api/nodeConversions/{nodeConversions.ts → nodeToBlock.ts} +20 -262
  67. package/src/api/parsers/html/parseHTML.test.ts +5 -8
  68. package/src/api/parsers/html/parseHTML.ts +8 -4
  69. package/src/api/parsers/html/util/nestedLists.test.ts +2 -2
  70. package/src/api/parsers/markdown/__snapshots__/pasted/complex.json +319 -0
  71. package/src/api/parsers/markdown/__snapshots__/pasted/issue-226-1.json +81 -0
  72. package/src/api/parsers/{html/__snapshots__/paste/parse-deep-nested-content.json → markdown/__snapshots__/pasted/issue-226-2.json} +35 -110
  73. package/src/api/parsers/markdown/__snapshots__/pasted/nested.json +81 -0
  74. package/src/api/parsers/markdown/__snapshots__/pasted/non-nested.json +81 -0
  75. package/src/api/parsers/markdown/__snapshots__/pasted/styled.json +61 -0
  76. package/src/api/parsers/markdown/parseMarkdown.test.ts +16 -1
  77. package/src/api/parsers/markdown/parseMarkdown.ts +8 -4
  78. package/src/api/testUtil/cases/customBlocks.ts +11 -11
  79. package/src/api/testUtil/cases/customInlineContent.ts +6 -6
  80. package/src/api/testUtil/cases/customStyles.ts +6 -6
  81. package/src/api/testUtil/cases/defaultSchema.ts +4 -4
  82. package/src/api/testUtil/index.ts +6 -6
  83. package/src/api/testUtil/partialBlockTestUtil.ts +5 -5
  84. package/src/api/testUtil/paste.ts +46 -0
  85. package/src/blocks/AudioBlockContent/AudioBlockContent.ts +5 -5
  86. package/src/blocks/FileBlockContent/FileBlockContent.ts +4 -4
  87. package/src/blocks/FileBlockContent/fileBlockHelpers.ts +2 -2
  88. package/src/blocks/HeadingBlockContent/HeadingBlockContent.ts +61 -39
  89. package/src/blocks/ImageBlockContent/ImageBlockContent.ts +5 -5
  90. package/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +30 -18
  91. package/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.ts +67 -33
  92. package/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.ts +23 -19
  93. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts +22 -24
  94. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +31 -19
  95. package/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts +16 -11
  96. package/src/blocks/TableBlockContent/TableBlockContent.ts +4 -5
  97. package/src/blocks/VideoBlockContent/VideoBlockContent.ts +5 -5
  98. package/src/blocks/defaultBlockHelpers.ts +4 -4
  99. package/src/blocks/defaultBlockTypeGuards.ts +5 -5
  100. package/src/blocks/defaultBlocks.ts +13 -13
  101. package/src/blocks/defaultProps.ts +1 -1
  102. package/src/editor/BlockNoteEditor.test.ts +14 -7
  103. package/src/editor/BlockNoteEditor.ts +82 -149
  104. package/src/editor/BlockNoteExtensions.ts +15 -11
  105. package/src/editor/BlockNoteSchema.ts +7 -7
  106. package/src/editor/BlockNoteTipTapEditor.ts +5 -3
  107. package/src/editor/cursorPositionTypes.ts +7 -2
  108. package/src/editor/selectionTypes.ts +6 -2
  109. package/src/editor/transformPasted.ts +34 -2
  110. package/src/extensions/BackgroundColor/BackgroundColorExtension.ts +1 -1
  111. package/src/extensions/BackgroundColor/BackgroundColorMark.ts +1 -1
  112. package/src/extensions/FilePanel/FilePanelPlugin.ts +4 -4
  113. package/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +8 -4
  114. package/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts +333 -0
  115. package/src/extensions/LinkToolbar/LinkToolbarPlugin.ts +9 -4
  116. package/src/extensions/{NonEditableBlocks/NonEditableBlockPlugin.ts → NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.ts} +2 -2
  117. package/src/extensions/Placeholder/PlaceholderPlugin.ts +1 -1
  118. package/src/extensions/SideMenu/SideMenuPlugin.ts +72 -402
  119. package/src/extensions/SideMenu/dragging.ts +251 -0
  120. package/src/extensions/SuggestionMenu/DefaultSuggestionItem.ts +1 -1
  121. package/src/extensions/SuggestionMenu/SuggestionPlugin.ts +8 -4
  122. package/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.ts +8 -4
  123. package/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts +19 -15
  124. package/src/extensions/TableHandles/TableHandlesPlugin.ts +11 -7
  125. package/src/extensions/TextColor/TextColorExtension.ts +1 -1
  126. package/src/extensions/TextColor/TextColorMark.ts +1 -1
  127. package/src/i18n/dictionary.ts +1 -1
  128. package/src/i18n/locales/ar.ts +1 -1
  129. package/src/i18n/locales/fr.ts +1 -1
  130. package/src/i18n/locales/hr.ts +308 -0
  131. package/src/i18n/locales/index.ts +15 -14
  132. package/src/i18n/locales/is.ts +1 -1
  133. package/src/i18n/locales/ja.ts +1 -1
  134. package/src/i18n/locales/ko.ts +1 -1
  135. package/src/i18n/locales/nl.ts +1 -1
  136. package/src/i18n/locales/pl.ts +1 -1
  137. package/src/i18n/locales/pt.ts +1 -1
  138. package/src/i18n/locales/ru.ts +1 -1
  139. package/src/i18n/locales/vi.ts +1 -1
  140. package/src/i18n/locales/zh.ts +1 -1
  141. package/src/index.ts +45 -44
  142. package/src/pm-nodes/BlockContainer.ts +3 -647
  143. package/src/pm-nodes/BlockGroup.ts +2 -2
  144. package/src/pm-nodes/index.ts +3 -3
  145. package/src/schema/blocks/createSpec.ts +24 -14
  146. package/src/schema/blocks/internal.ts +9 -9
  147. package/src/schema/blocks/types.ts +4 -4
  148. package/src/schema/index.ts +10 -10
  149. package/src/schema/inlineContent/createSpec.ts +9 -10
  150. package/src/schema/inlineContent/internal.ts +3 -3
  151. package/src/schema/inlineContent/types.ts +2 -2
  152. package/src/schema/styles/createSpec.ts +4 -3
  153. package/src/schema/styles/internal.ts +1 -1
  154. package/types/src/api/blockManipulation/commands/insertBlocks/insertBlocks.d.ts +4 -0
  155. package/types/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.d.ts +7 -0
  156. package/types/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.d.ts +1 -0
  157. package/types/src/api/blockManipulation/commands/moveBlock/moveBlock.d.ts +5 -0
  158. package/types/src/api/blockManipulation/commands/moveBlock/moveBlock.test.d.ts +1 -0
  159. package/types/src/api/blockManipulation/commands/removeBlocks/removeBlocks.d.ts +7 -0
  160. package/types/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.d.ts +1 -0
  161. package/types/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.d.ts +7 -0
  162. package/types/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.d.ts +1 -0
  163. package/types/src/api/blockManipulation/commands/splitBlock/splitBlock.d.ts +5 -0
  164. package/types/src/api/blockManipulation/commands/splitBlock/splitBlock.test.d.ts +1 -0
  165. package/types/src/api/blockManipulation/commands/updateBlock/updateBlock.d.ts +11 -0
  166. package/types/src/api/blockManipulation/commands/updateBlock/updateBlock.test.d.ts +1 -0
  167. package/types/src/api/blockManipulation/insertContentAt.d.ts +6 -0
  168. package/types/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.d.ts +5 -0
  169. package/types/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.d.ts +1 -0
  170. package/types/src/api/blockManipulation/setupTestEnv.d.ts +492 -0
  171. package/types/src/api/clipboard/clipboard.test.d.ts +1 -0
  172. package/types/src/api/clipboard/fromClipboard/fileDropExtension.d.ts +6 -0
  173. package/types/src/api/{parsers → clipboard/fromClipboard}/handleFileInsertion.d.ts +2 -2
  174. package/types/src/api/clipboard/fromClipboard/pasteExtension.d.ts +6 -0
  175. package/types/src/api/clipboard/toClipboard/copyExtension.d.ts +12 -0
  176. package/types/src/api/exporters/html/externalHTMLExporter.d.ts +7 -8
  177. package/types/src/api/exporters/html/internalHTMLSerializer.d.ts +6 -10
  178. package/types/src/api/exporters/html/util/serializeBlocksExternalHTML.d.ts +10 -0
  179. package/types/src/api/exporters/html/util/serializeBlocksInternalHTML.d.ts +11 -0
  180. package/types/src/api/exporters/markdown/markdownExporter.d.ts +3 -3
  181. package/types/src/api/getBlockInfoFromPos.d.ts +63 -20
  182. package/types/src/api/nodeConversions/blockToNode.d.ts +15 -0
  183. package/types/src/api/nodeConversions/fragmentToBlocks.d.ts +7 -0
  184. package/types/src/api/nodeConversions/nodeToBlock.d.ts +16 -0
  185. package/types/src/api/parsers/html/parseHTML.d.ts +2 -2
  186. package/types/src/api/parsers/markdown/parseMarkdown.d.ts +2 -2
  187. package/types/src/api/testUtil/cases/customBlocks.d.ts +39 -39
  188. package/types/src/api/testUtil/cases/customInlineContent.d.ts +35 -35
  189. package/types/src/api/testUtil/cases/customStyles.d.ts +35 -35
  190. package/types/src/api/testUtil/cases/defaultSchema.d.ts +2 -2
  191. package/types/src/api/testUtil/index.d.ts +6 -6
  192. package/types/src/api/testUtil/partialBlockTestUtil.d.ts +4 -4
  193. package/types/src/api/testUtil/paste.d.ts +2 -0
  194. package/types/src/blocks/AudioBlockContent/AudioBlockContent.d.ts +4 -4
  195. package/types/src/blocks/FileBlockContent/FileBlockContent.d.ts +4 -4
  196. package/types/src/blocks/FileBlockContent/fileBlockHelpers.d.ts +2 -2
  197. package/types/src/blocks/HeadingBlockContent/HeadingBlockContent.d.ts +2 -2
  198. package/types/src/blocks/ImageBlockContent/ImageBlockContent.d.ts +4 -4
  199. package/types/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.d.ts +2 -2
  200. package/types/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.d.ts +2 -2
  201. package/types/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.d.ts +2 -2
  202. package/types/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.d.ts +2 -2
  203. package/types/src/blocks/ParagraphBlockContent/ParagraphBlockContent.d.ts +2 -2
  204. package/types/src/blocks/TableBlockContent/TableBlockContent.d.ts +2 -2
  205. package/types/src/blocks/VideoBlockContent/VideoBlockContent.d.ts +4 -4
  206. package/types/src/blocks/defaultBlockHelpers.d.ts +3 -3
  207. package/types/src/blocks/defaultBlockTypeGuards.d.ts +4 -4
  208. package/types/src/blocks/defaultBlocks.d.ts +38 -38
  209. package/types/src/blocks/defaultProps.d.ts +1 -1
  210. package/types/src/editor/BlockNoteEditor.d.ts +28 -16
  211. package/types/src/editor/BlockNoteExtensions.d.ts +3 -3
  212. package/types/src/editor/BlockNoteSchema.d.ts +4 -4
  213. package/types/src/editor/BlockNoteTipTapEditor.d.ts +2 -2
  214. package/types/src/editor/cursorPositionTypes.d.ts +3 -2
  215. package/types/src/editor/selectionTypes.d.ts +2 -2
  216. package/types/src/editor/transformPasted.d.ts +8 -1
  217. package/types/src/extensions/BackgroundColor/BackgroundColorMark.d.ts +1 -1
  218. package/types/src/extensions/FilePanel/FilePanelPlugin.d.ts +4 -4
  219. package/types/src/extensions/FormattingToolbar/FormattingToolbarPlugin.d.ts +4 -4
  220. package/types/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.d.ts +5 -0
  221. package/types/src/extensions/LinkToolbar/LinkToolbarPlugin.d.ts +4 -4
  222. package/types/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.d.ts +2 -0
  223. package/types/src/extensions/Placeholder/PlaceholderPlugin.d.ts +1 -1
  224. package/types/src/extensions/SideMenu/SideMenuPlugin.d.ts +12 -28
  225. package/types/src/extensions/SideMenu/dragging.d.ts +17 -0
  226. package/types/src/extensions/SuggestionMenu/DefaultSuggestionItem.d.ts +1 -1
  227. package/types/src/extensions/SuggestionMenu/SuggestionPlugin.d.ts +4 -4
  228. package/types/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.d.ts +3 -3
  229. package/types/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.d.ts +4 -4
  230. package/types/src/extensions/TableHandles/TableHandlesPlugin.d.ts +4 -4
  231. package/types/src/extensions/TextColor/TextColorMark.d.ts +1 -1
  232. package/types/src/i18n/dictionary.d.ts +1 -1
  233. package/types/src/i18n/locales/ar.d.ts +1 -1
  234. package/types/src/i18n/locales/fr.d.ts +1 -1
  235. package/types/src/i18n/locales/hr.d.ts +239 -0
  236. package/types/src/i18n/locales/index.d.ts +15 -14
  237. package/types/src/i18n/locales/is.d.ts +1 -1
  238. package/types/src/i18n/locales/ja.d.ts +1 -1
  239. package/types/src/i18n/locales/ko.d.ts +1 -1
  240. package/types/src/i18n/locales/nl.d.ts +1 -1
  241. package/types/src/i18n/locales/pl.d.ts +1 -1
  242. package/types/src/i18n/locales/pt.d.ts +1 -1
  243. package/types/src/i18n/locales/ru.d.ts +1 -1
  244. package/types/src/i18n/locales/vi.d.ts +1 -1
  245. package/types/src/i18n/locales/zh.d.ts +1 -1
  246. package/types/src/index.d.ts +45 -44
  247. package/types/src/pm-nodes/BlockContainer.d.ts +2 -16
  248. package/types/src/pm-nodes/BlockGroup.d.ts +1 -1
  249. package/types/src/pm-nodes/index.d.ts +3 -3
  250. package/types/src/schema/blocks/createSpec.d.ts +5 -5
  251. package/types/src/schema/blocks/internal.d.ts +5 -5
  252. package/types/src/schema/blocks/types.d.ts +4 -4
  253. package/types/src/schema/index.d.ts +10 -10
  254. package/types/src/schema/inlineContent/createSpec.d.ts +3 -3
  255. package/types/src/schema/inlineContent/internal.d.ts +2 -2
  256. package/types/src/schema/inlineContent/types.d.ts +2 -2
  257. package/types/src/schema/styles/createSpec.d.ts +1 -1
  258. package/types/src/schema/styles/internal.d.ts +1 -1
  259. package/src/api/blockManipulation/__snapshots__/blockManipulation.test.ts.snap +0 -714
  260. package/src/api/blockManipulation/blockManipulation.test.ts +0 -292
  261. package/src/api/blockManipulation/blockManipulation.ts +0 -350
  262. package/src/api/exporters/copyExtension.ts +0 -164
  263. package/src/api/exporters/html/__snapshots_fragment_edge_cases__/selectionLeavesBlockChildren.html +0 -1
  264. package/src/api/exporters/html/__snapshots_fragment_edge_cases__/selectionSpansBlocksChildren.html +0 -1
  265. package/src/api/exporters/html/util/sharedHTMLConversion.ts +0 -130
  266. package/src/api/exporters/html/util/simplifyBlocksRehypePlugin.ts +0 -218
  267. package/src/api/getCurrentBlockContentType.ts +0 -14
  268. package/src/api/parsers/html/__snapshots__/paste/parse-google-docs-html.json +0 -476
  269. package/types/src/api/blockManipulation/blockManipulation.d.ts +0 -14
  270. package/types/src/api/exporters/copyExtension.d.ts +0 -6
  271. package/types/src/api/exporters/html/util/sharedHTMLConversion.d.ts +0 -9
  272. package/types/src/api/exporters/html/util/simplifyBlocksRehypePlugin.d.ts +0 -16
  273. package/types/src/api/getCurrentBlockContentType.d.ts +0 -2
  274. package/types/src/api/nodeConversions/nodeConversions.d.ts +0 -24
  275. package/types/src/api/parsers/fileDropExtension.d.ts +0 -6
  276. package/types/src/api/parsers/pasteExtension.d.ts +0 -6
  277. package/types/src/extensions/NonEditableBlocks/NonEditableBlockPlugin.d.ts +0 -2
  278. /package/src/api/{exporters/html/__snapshots_fragment_edge_cases__/selectionWithinBlockChildren.html → clipboard/__snapshots__/multipleChildren.html} +0 -0
  279. /package/src/api/{parsers → clipboard/fromClipboard}/acceptedMIMETypes.ts +0 -0
  280. /package/src/api/parsers/html/__snapshots__/{paste/list-test.json → list-test.json} +0 -0
  281. /package/src/api/parsers/html/__snapshots__/{paste/parse-basic-block-types.json → parse-basic-block-types.json} +0 -0
  282. /package/src/api/parsers/html/__snapshots__/{paste/parse-div-with-inline-content.json → parse-div-with-inline-content.json} +0 -0
  283. /package/src/api/parsers/html/__snapshots__/{paste/parse-divs.json → parse-divs.json} +0 -0
  284. /package/src/api/parsers/html/__snapshots__/{paste/parse-fake-image-caption.json → parse-fake-image-caption.json} +0 -0
  285. /package/src/api/parsers/html/__snapshots__/{paste/parse-image-in-paragraph.json → parse-image-in-paragraph.json} +0 -0
  286. /package/src/api/parsers/html/__snapshots__/{paste/parse-mixed-nested-lists.json → parse-mixed-nested-lists.json} +0 -0
  287. /package/src/api/parsers/html/__snapshots__/{paste/parse-nested-lists-with-paragraphs.json → parse-nested-lists-with-paragraphs.json} +0 -0
  288. /package/src/api/parsers/html/__snapshots__/{paste/parse-nested-lists.json → parse-nested-lists.json} +0 -0
  289. /package/src/api/parsers/html/__snapshots__/{paste/parse-notion-html.json → parse-notion-html.json} +0 -0
  290. /package/src/api/parsers/html/__snapshots__/{paste/parse-two-divs.json → parse-two-divs.json} +0 -0
  291. /package/types/src/api/blockManipulation/{blockManipulation.test.d.ts → commands/insertBlocks/insertBlocks.test.d.ts} +0 -0
  292. /package/types/src/api/{parsers → clipboard/fromClipboard}/acceptedMIMETypes.d.ts +0 -0
@@ -1,15 +1,15 @@
1
1
  import { EditorState, Plugin, PluginKey, PluginView } from "prosemirror-state";
2
2
  import { EditorView } from "prosemirror-view";
3
3
 
4
- import type { BlockNoteEditor } from "../../editor/BlockNoteEditor";
5
- import { UiElementPosition } from "../../extensions-shared/UiElementPosition";
4
+ import type { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
5
+ import { UiElementPosition } from "../../extensions-shared/UiElementPosition.js";
6
6
  import type {
7
7
  BlockFromConfig,
8
8
  FileBlockConfig,
9
9
  InlineContentSchema,
10
10
  StyleSchema,
11
- } from "../../schema";
12
- import { EventEmitter } from "../../util/EventEmitter";
11
+ } from "../../schema/index.js";
12
+ import { EventEmitter } from "../../util/EventEmitter.js";
13
13
 
14
14
  export type FilePanelState<
15
15
  I extends InlineContentSchema,
@@ -2,10 +2,14 @@ import { isNodeSelection, isTextSelection, posToDOMRect } from "@tiptap/core";
2
2
  import { EditorState, Plugin, PluginKey, PluginView } from "prosemirror-state";
3
3
  import { EditorView } from "prosemirror-view";
4
4
 
5
- import type { BlockNoteEditor } from "../../editor/BlockNoteEditor";
6
- import { UiElementPosition } from "../../extensions-shared/UiElementPosition";
7
- import { BlockSchema, InlineContentSchema, StyleSchema } from "../../schema";
8
- import { EventEmitter } from "../../util/EventEmitter";
5
+ import type { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
6
+ import { UiElementPosition } from "../../extensions-shared/UiElementPosition.js";
7
+ import {
8
+ BlockSchema,
9
+ InlineContentSchema,
10
+ StyleSchema,
11
+ } from "../../schema/index.js";
12
+ import { EventEmitter } from "../../util/EventEmitter.js";
9
13
 
10
14
  export type FormattingToolbarState = UiElementPosition;
11
15
 
@@ -0,0 +1,333 @@
1
+ import { Extension } from "@tiptap/core";
2
+
3
+ import { TextSelection } from "prosemirror-state";
4
+ import {
5
+ getPrevBlockPos,
6
+ mergeBlocksCommand,
7
+ } from "../../api/blockManipulation/commands/mergeBlocks/mergeBlocks.js";
8
+ import { splitBlockCommand } from "../../api/blockManipulation/commands/splitBlock/splitBlock.js";
9
+ import { updateBlockCommand } from "../../api/blockManipulation/commands/updateBlock/updateBlock.js";
10
+ import {
11
+ getBlockInfoFromResolvedPos,
12
+ getBlockInfoFromSelection,
13
+ } from "../../api/getBlockInfoFromPos.js";
14
+ import { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
15
+
16
+ export const KeyboardShortcutsExtension = Extension.create<{
17
+ editor: BlockNoteEditor<any, any, any>;
18
+ }>({
19
+ priority: 50,
20
+
21
+ // TODO: The shortcuts need a refactor. Do we want to use a command priority
22
+ // design as there is now, or clump the logic into a single function?
23
+ addKeyboardShortcuts() {
24
+ // handleBackspace is partially adapted from https://github.com/ueberdosis/tiptap/blob/ed56337470efb4fd277128ab7ef792b37cfae992/packages/core/src/extensions/keymap.ts
25
+ const handleBackspace = () =>
26
+ this.editor.commands.first(({ chain, commands }) => [
27
+ // Deletes the selection if it's not empty.
28
+ () => commands.deleteSelection(),
29
+ // Undoes an input rule if one was triggered in the last editor state change.
30
+ () => commands.undoInputRule(),
31
+ // Reverts block content type to a paragraph if the selection is at the start of the block.
32
+ () =>
33
+ commands.command(({ state }) => {
34
+ const blockInfo = getBlockInfoFromSelection(state);
35
+
36
+ const selectionAtBlockStart =
37
+ state.selection.from === blockInfo.blockContent.beforePos + 1;
38
+ const isParagraph =
39
+ blockInfo.blockContent.node.type.name === "paragraph";
40
+
41
+ if (selectionAtBlockStart && !isParagraph) {
42
+ return commands.command(
43
+ updateBlockCommand(
44
+ this.options.editor,
45
+ blockInfo.blockContainer.beforePos,
46
+ {
47
+ type: "paragraph",
48
+ props: {},
49
+ }
50
+ )
51
+ );
52
+ }
53
+
54
+ return false;
55
+ }),
56
+ // Removes a level of nesting if the block is indented if the selection is at the start of the block.
57
+ () =>
58
+ commands.command(({ state }) => {
59
+ const { blockContent } = getBlockInfoFromSelection(state);
60
+
61
+ const selectionAtBlockStart =
62
+ state.selection.from === blockContent.beforePos + 1;
63
+
64
+ if (selectionAtBlockStart) {
65
+ return commands.liftListItem("blockContainer");
66
+ }
67
+
68
+ return false;
69
+ }),
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
72
+ // block. The target block for merging must contain inline content.
73
+ () =>
74
+ commands.command(({ state }) => {
75
+ const { blockContainer, blockContent } =
76
+ getBlockInfoFromSelection(state);
77
+
78
+ const { depth } = state.doc.resolve(blockContainer.beforePos);
79
+
80
+ const selectionAtBlockStart =
81
+ state.selection.from === blockContent.beforePos + 1;
82
+ const selectionEmpty = state.selection.empty;
83
+ const blockAtDocStart = blockContainer.beforePos === 1;
84
+
85
+ const posBetweenBlocks = blockContainer.beforePos;
86
+
87
+ if (
88
+ !blockAtDocStart &&
89
+ selectionAtBlockStart &&
90
+ selectionEmpty &&
91
+ depth === 1
92
+ ) {
93
+ return chain()
94
+ .command(mergeBlocksCommand(posBetweenBlocks))
95
+ .scrollIntoView()
96
+ .run();
97
+ }
98
+
99
+ return false;
100
+ }),
101
+ // Deletes previous block if it contains no content and isn't a table,
102
+ // when the selection is empty and at the start of the block. Moves the
103
+ // current block into the deleted block's place.
104
+ () =>
105
+ commands.command(({ state }) => {
106
+ const blockInfo = getBlockInfoFromSelection(state);
107
+
108
+ const { depth } = state.doc.resolve(
109
+ blockInfo.blockContainer.beforePos
110
+ );
111
+
112
+ const selectionAtBlockStart =
113
+ state.selection.from === blockInfo.blockContent.beforePos + 1;
114
+ const selectionEmpty = state.selection.empty;
115
+ const blockAtDocStart = blockInfo.blockContainer.beforePos === 1;
116
+
117
+ const prevBlockPos = getPrevBlockPos(
118
+ state.doc,
119
+ state.doc.resolve(blockInfo.blockContainer.beforePos)
120
+ );
121
+ const prevBlockInfo = getBlockInfoFromResolvedPos(
122
+ state.doc.resolve(prevBlockPos.pos)
123
+ );
124
+
125
+ const prevBlockNotTableAndNoContent =
126
+ prevBlockInfo.blockContent.node.type.spec.content === "" ||
127
+ (prevBlockInfo.blockContent.node.type.spec.content ===
128
+ "inline*" &&
129
+ prevBlockInfo.blockContent.node.childCount === 0);
130
+
131
+ if (
132
+ !blockAtDocStart &&
133
+ selectionAtBlockStart &&
134
+ selectionEmpty &&
135
+ depth === 1 &&
136
+ prevBlockNotTableAndNoContent
137
+ ) {
138
+ return chain()
139
+ .cut(
140
+ {
141
+ from: blockInfo.blockContainer.beforePos,
142
+ to: blockInfo.blockContainer.afterPos,
143
+ },
144
+ prevBlockInfo.blockContainer.afterPos
145
+ )
146
+ .deleteRange({
147
+ from: prevBlockInfo.blockContainer.beforePos,
148
+ to: prevBlockInfo.blockContainer.afterPos,
149
+ })
150
+ .run();
151
+ }
152
+
153
+ return false;
154
+ }),
155
+ ]);
156
+
157
+ const handleDelete = () =>
158
+ this.editor.commands.first(({ commands }) => [
159
+ // Deletes the selection if it's not empty.
160
+ () => commands.deleteSelection(),
161
+ // Merges block with the next one (at the same nesting level or lower),
162
+ // if one exists, the block has no children, and the selection is at the
163
+ // end of the block.
164
+ () =>
165
+ commands.command(({ state }) => {
166
+ // TODO: Change this to not rely on offsets & schema assumptions
167
+ const { blockContainer, blockContent, blockGroup } =
168
+ getBlockInfoFromSelection(state);
169
+
170
+ const { depth } = state.doc.resolve(blockContainer.beforePos);
171
+ const blockAtDocEnd =
172
+ blockContainer.afterPos === state.doc.nodeSize - 3;
173
+ const selectionAtBlockEnd =
174
+ state.selection.from === blockContent.afterPos - 1;
175
+ const selectionEmpty = state.selection.empty;
176
+ const hasChildBlocks = blockGroup !== undefined;
177
+
178
+ if (
179
+ !blockAtDocEnd &&
180
+ selectionAtBlockEnd &&
181
+ selectionEmpty &&
182
+ !hasChildBlocks
183
+ ) {
184
+ let oldDepth = depth;
185
+ let newPos = blockContainer.afterPos + 1;
186
+ let newDepth = state.doc.resolve(newPos).depth;
187
+
188
+ while (newDepth < oldDepth) {
189
+ oldDepth = newDepth;
190
+ newPos += 2;
191
+ newDepth = state.doc.resolve(newPos).depth;
192
+ }
193
+
194
+ return commands.command(mergeBlocksCommand(newPos - 1));
195
+ }
196
+
197
+ return false;
198
+ }),
199
+ ]);
200
+
201
+ const handleEnter = () =>
202
+ this.editor.commands.first(({ commands }) => [
203
+ // Removes a level of nesting if the block is empty & indented, while the selection is also empty & at the start
204
+ // of the block.
205
+ () =>
206
+ commands.command(({ state }) => {
207
+ const { blockContent, blockContainer } =
208
+ getBlockInfoFromSelection(state);
209
+
210
+ const { depth } = state.doc.resolve(blockContainer.beforePos);
211
+
212
+ const selectionAtBlockStart =
213
+ state.selection.$anchor.parentOffset === 0;
214
+ const selectionEmpty =
215
+ state.selection.anchor === state.selection.head;
216
+ const blockEmpty = blockContent.node.childCount === 0;
217
+ const blockIndented = depth > 1;
218
+
219
+ if (
220
+ selectionAtBlockStart &&
221
+ selectionEmpty &&
222
+ blockEmpty &&
223
+ blockIndented
224
+ ) {
225
+ return commands.liftListItem("blockContainer");
226
+ }
227
+
228
+ return false;
229
+ }),
230
+ // Creates a new block and moves the selection to it if the current one is empty, while the selection is also
231
+ // empty & at the start of the block.
232
+ () =>
233
+ commands.command(({ state, dispatch }) => {
234
+ const { blockContainer, blockContent } =
235
+ getBlockInfoFromSelection(state);
236
+
237
+ const selectionAtBlockStart =
238
+ state.selection.$anchor.parentOffset === 0;
239
+ const selectionEmpty =
240
+ state.selection.anchor === state.selection.head;
241
+ const blockEmpty = blockContent.node.childCount === 0;
242
+
243
+ if (selectionAtBlockStart && selectionEmpty && blockEmpty) {
244
+ const newBlockInsertionPos = blockContainer.afterPos;
245
+ const newBlockContentPos = newBlockInsertionPos + 2;
246
+
247
+ if (dispatch) {
248
+ const newBlock =
249
+ state.schema.nodes["blockContainer"].createAndFill()!;
250
+
251
+ state.tr
252
+ .insert(newBlockInsertionPos, newBlock)
253
+ .scrollIntoView();
254
+ state.tr.setSelection(
255
+ new TextSelection(state.doc.resolve(newBlockContentPos))
256
+ );
257
+ }
258
+
259
+ return true;
260
+ }
261
+
262
+ return false;
263
+ }),
264
+ // Splits the current block, moving content inside that's after the cursor to a new text block below. Also
265
+ // deletes the selection beforehand, if it's not empty.
266
+ () =>
267
+ commands.command(({ state, chain }) => {
268
+ const { blockContent } = getBlockInfoFromSelection(state);
269
+
270
+ const selectionAtBlockStart =
271
+ state.selection.$anchor.parentOffset === 0;
272
+ const blockEmpty = blockContent.node.childCount === 0;
273
+
274
+ if (!blockEmpty) {
275
+ chain()
276
+ .deleteSelection()
277
+ .command(
278
+ splitBlockCommand(
279
+ state.selection.from,
280
+ selectionAtBlockStart,
281
+ selectionAtBlockStart
282
+ )
283
+ )
284
+ .run();
285
+
286
+ return true;
287
+ }
288
+
289
+ return false;
290
+ }),
291
+ ]);
292
+
293
+ return {
294
+ Backspace: handleBackspace,
295
+ Delete: handleDelete,
296
+ Enter: handleEnter,
297
+ // Always returning true for tab key presses ensures they're not captured by the browser. Otherwise, they blur the
298
+ // editor since the browser will try to use tab for keyboard navigation.
299
+ Tab: () => {
300
+ if (
301
+ this.options.editor.formattingToolbar?.shown ||
302
+ this.options.editor.linkToolbar?.shown ||
303
+ this.options.editor.filePanel?.shown
304
+ ) {
305
+ // don't handle tabs if a toolbar is shown, so we can tab into / out of it
306
+ return false;
307
+ }
308
+ this.editor.commands.sinkListItem("blockContainer");
309
+ return true;
310
+ },
311
+ "Shift-Tab": () => {
312
+ if (
313
+ this.options.editor.formattingToolbar?.shown ||
314
+ this.options.editor.linkToolbar?.shown ||
315
+ this.options.editor.filePanel?.shown
316
+ ) {
317
+ // don't handle tabs if a toolbar is shown, so we can tab into / out of it
318
+ return false;
319
+ }
320
+ this.editor.commands.liftListItem("blockContainer");
321
+ return true;
322
+ },
323
+ "Shift-Mod-ArrowUp": () => {
324
+ this.options.editor.moveBlockUp();
325
+ return true;
326
+ },
327
+ "Shift-Mod-ArrowDown": () => {
328
+ this.options.editor.moveBlockDown();
329
+ return true;
330
+ },
331
+ };
332
+ },
333
+ });
@@ -1,12 +1,17 @@
1
1
  import { getMarkRange, posToDOMRect, Range } from "@tiptap/core";
2
+
2
3
  import { EditorView } from "@tiptap/pm/view";
3
4
  import { Mark } from "prosemirror-model";
4
5
  import { Plugin, PluginKey, PluginView } from "prosemirror-state";
5
6
 
6
- import type { BlockNoteEditor } from "../../editor/BlockNoteEditor";
7
- import { UiElementPosition } from "../../extensions-shared/UiElementPosition";
8
- import { BlockSchema, InlineContentSchema, StyleSchema } from "../../schema";
9
- import { EventEmitter } from "../../util/EventEmitter";
7
+ import type { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
8
+ import { UiElementPosition } from "../../extensions-shared/UiElementPosition.js";
9
+ import {
10
+ BlockSchema,
11
+ InlineContentSchema,
12
+ StyleSchema,
13
+ } from "../../schema/index.js";
14
+ import { EventEmitter } from "../../util/EventEmitter.js";
10
15
 
11
16
  export type LinkToolbarState = UiElementPosition & {
12
17
  // The hovered link's URL, and the text it's displayed with in the
@@ -1,6 +1,6 @@
1
1
  import { Plugin, PluginKey, TextSelection } from "prosemirror-state";
2
2
 
3
- const PLUGIN_KEY = new PluginKey("non-editable-block");
3
+ const PLUGIN_KEY = new PluginKey("node-selection-keyboard");
4
4
  // By default, typing with a node selection active will cause ProseMirror to
5
5
  // replace the node with one that contains editable content. This plugin blocks
6
6
  // this behaviour without also blocking things like keyboard shortcuts:
@@ -15,7 +15,7 @@ const PLUGIN_KEY = new PluginKey("non-editable-block");
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 NonEditableBlockPlugin = () => {
18
+ export const NodeSelectionKeyboardPlugin = () => {
19
19
  return new Plugin({
20
20
  key: PLUGIN_KEY,
21
21
  props: {
@@ -1,6 +1,6 @@
1
1
  import { Plugin, PluginKey } from "prosemirror-state";
2
2
  import { Decoration, DecorationSet } from "prosemirror-view";
3
- import type { BlockNoteEditor } from "../../editor/BlockNoteEditor";
3
+ import type { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
4
4
 
5
5
  const PLUGIN_KEY = new PluginKey(`blocknote-placeholder`);
6
6