@blocknote/core 0.21.0 → 0.22.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 (391) hide show
  1. package/dist/blocknote.js +1023 -999
  2. package/dist/blocknote.js.map +1 -1
  3. package/dist/blocknote.umd.cjs +7 -7
  4. package/dist/blocknote.umd.cjs.map +1 -1
  5. package/dist/style.css +1 -1
  6. package/dist/tsconfig.tsbuildinfo +1 -1
  7. package/dist/webpack-stats.json +1 -1
  8. package/package.json +3 -3
  9. package/src/api/clipboard/__snapshots__/external/pasteEndOfParagraph.html +96 -0
  10. package/src/api/clipboard/__snapshots__/external/pasteEndOfParagraphText.html +96 -0
  11. package/src/api/clipboard/__snapshots__/external/pasteImage.html +111 -0
  12. package/src/api/clipboard/__snapshots__/external/pasteParagraphInCustomBlock.html +96 -0
  13. package/src/api/clipboard/__snapshots__/external/pasteTable.html +149 -0
  14. package/src/api/clipboard/__snapshots__/external/pasteTableInExistingTable.html +124 -0
  15. package/src/api/clipboard/__snapshots__/internal/paragraphInCustomBlock.html +1 -0
  16. package/src/api/clipboard/clipboardExternal.test.ts +161 -0
  17. package/src/api/clipboard/{clipboard.test.ts → clipboardInternal.test.ts} +60 -38
  18. package/src/api/clipboard/testUtil.ts +27 -0
  19. package/src/api/clipboard/toClipboard/copyExtension.ts +1 -0
  20. package/src/api/exporters/html/util/serializeBlocksExternalHTML.ts +7 -1
  21. package/src/api/exporters/html/util/serializeBlocksInternalHTML.ts +3 -1
  22. package/src/api/nodeConversions/nodeToBlock.ts +4 -1
  23. package/src/api/parsers/markdown/__snapshots__/pasted/styled.json +2 -2
  24. package/src/api/testUtil/partialBlockTestUtil.ts +4 -1
  25. package/src/blocks/HeadingBlockContent/HeadingBlockContent.ts +3 -19
  26. package/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.ts +3 -15
  27. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts +11 -3
  28. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +25 -5
  29. package/src/editor/Block.css +3 -3
  30. package/src/editor/BlockNoteEditor.test.ts +21 -1
  31. package/src/editor/editor.css +6 -6
  32. package/src/editor/transformPasted.ts +57 -4
  33. package/src/schema/blocks/createSpec.ts +1 -1
  34. package/src/schema/blocks/internal.ts +16 -6
  35. package/src/schema/inlineContent/internal.ts +4 -1
  36. package/src/schema/propTypes.ts +41 -18
  37. package/types/src/api/blockManipulation/setupTestEnv.d.ts +8 -0
  38. package/types/src/api/clipboard/clipboardInternal.test.d.ts +1 -0
  39. package/types/src/api/clipboard/testUtil.d.ts +509 -0
  40. package/types/src/api/testUtil/cases/customBlocks.d.ts +8 -0
  41. package/types/src/api/testUtil/cases/customInlineContent.d.ts +8 -0
  42. package/types/src/api/testUtil/cases/customStyles.d.ts +8 -0
  43. package/types/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.d.ts +12 -0
  44. package/types/src/blocks/defaultBlocks.d.ts +16 -0
  45. package/types/src/editor/transformPasted.d.ts +8 -4
  46. package/types/src/schema/propTypes.d.ts +20 -2
  47. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js +0 -30
  48. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js.map +0 -1
  49. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js +0 -99
  50. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js.map +0 -1
  51. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js +0 -97
  52. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js.map +0 -1
  53. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js +0 -88
  54. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js.map +0 -1
  55. package/dist/src/api/blockManipulation/commands/moveBlocks/moveBlocks.js +0 -219
  56. package/dist/src/api/blockManipulation/commands/moveBlocks/moveBlocks.js.map +0 -1
  57. package/dist/src/api/blockManipulation/commands/moveBlocks/moveBlocks.test.js +0 -175
  58. package/dist/src/api/blockManipulation/commands/moveBlocks/moveBlocks.test.js.map +0 -1
  59. package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js +0 -57
  60. package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js.map +0 -1
  61. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js +0 -5
  62. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js.map +0 -1
  63. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js +0 -31
  64. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js.map +0 -1
  65. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js +0 -71
  66. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js.map +0 -1
  67. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js +0 -157
  68. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js.map +0 -1
  69. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js +0 -27
  70. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js.map +0 -1
  71. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js +0 -67
  72. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js.map +0 -1
  73. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js +0 -148
  74. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js.map +0 -1
  75. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js +0 -252
  76. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js.map +0 -1
  77. package/dist/src/api/blockManipulation/getBlock/getBlock.js +0 -56
  78. package/dist/src/api/blockManipulation/getBlock/getBlock.js.map +0 -1
  79. package/dist/src/api/blockManipulation/insertContentAt.js +0 -64
  80. package/dist/src/api/blockManipulation/insertContentAt.js.map +0 -1
  81. package/dist/src/api/blockManipulation/selections/selection.js +0 -149
  82. package/dist/src/api/blockManipulation/selections/selection.js.map +0 -1
  83. package/dist/src/api/blockManipulation/selections/selection.test.js +0 -39
  84. package/dist/src/api/blockManipulation/selections/selection.test.js.map +0 -1
  85. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js +0 -79
  86. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js.map +0 -1
  87. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js +0 -33
  88. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js.map +0 -1
  89. package/dist/src/api/blockManipulation/setupTestEnv.js +0 -172
  90. package/dist/src/api/blockManipulation/setupTestEnv.js.map +0 -1
  91. package/dist/src/api/clipboard/clipboard.test.js +0 -249
  92. package/dist/src/api/clipboard/clipboard.test.js.map +0 -1
  93. package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js +0 -8
  94. package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js.map +0 -1
  95. package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js +0 -38
  96. package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js.map +0 -1
  97. package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js +0 -111
  98. package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js.map +0 -1
  99. package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js +0 -25
  100. package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js.map +0 -1
  101. package/dist/src/api/clipboard/fromClipboard/pasteExtension.js +0 -57
  102. package/dist/src/api/clipboard/fromClipboard/pasteExtension.js.map +0 -1
  103. package/dist/src/api/clipboard/toClipboard/copyExtension.js +0 -134
  104. package/dist/src/api/clipboard/toClipboard/copyExtension.js.map +0 -1
  105. package/dist/src/api/exporters/html/externalHTMLExporter.js +0 -35
  106. package/dist/src/api/exporters/html/externalHTMLExporter.js.map +0 -1
  107. package/dist/src/api/exporters/html/htmlConversion.test.js +0 -72
  108. package/dist/src/api/exporters/html/htmlConversion.test.js.map +0 -1
  109. package/dist/src/api/exporters/html/internalHTMLSerializer.js +0 -21
  110. package/dist/src/api/exporters/html/internalHTMLSerializer.js.map +0 -1
  111. package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js +0 -141
  112. package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js.map +0 -1
  113. package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js +0 -96
  114. package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js.map +0 -1
  115. package/dist/src/api/exporters/markdown/markdownExporter.js +0 -31
  116. package/dist/src/api/exporters/markdown/markdownExporter.js.map +0 -1
  117. package/dist/src/api/exporters/markdown/markdownExporter.test.js +0 -57
  118. package/dist/src/api/exporters/markdown/markdownExporter.test.js.map +0 -1
  119. package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js +0 -33
  120. package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js.map +0 -1
  121. package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js +0 -37
  122. package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js.map +0 -1
  123. package/dist/src/api/getBlockInfoFromPos.js +0 -165
  124. package/dist/src/api/getBlockInfoFromPos.js.map +0 -1
  125. package/dist/src/api/nodeConversions/blockToNode.js +0 -197
  126. package/dist/src/api/nodeConversions/blockToNode.js.map +0 -1
  127. package/dist/src/api/nodeConversions/fragmentToBlocks.js +0 -50
  128. package/dist/src/api/nodeConversions/fragmentToBlocks.js.map +0 -1
  129. package/dist/src/api/nodeConversions/nodeConversions.test.js +0 -54
  130. package/dist/src/api/nodeConversions/nodeConversions.test.js.map +0 -1
  131. package/dist/src/api/nodeConversions/nodeToBlock.js +0 -316
  132. package/dist/src/api/nodeConversions/nodeToBlock.js.map +0 -1
  133. package/dist/src/api/nodeUtil.js +0 -28
  134. package/dist/src/api/nodeUtil.js.map +0 -1
  135. package/dist/src/api/parsers/html/parseHTML.js +0 -19
  136. package/dist/src/api/parsers/html/parseHTML.js.map +0 -1
  137. package/dist/src/api/parsers/html/parseHTML.test.js +0 -470
  138. package/dist/src/api/parsers/html/parseHTML.test.js.map +0 -1
  139. package/dist/src/api/parsers/html/util/nestedLists.js +0 -106
  140. package/dist/src/api/parsers/html/util/nestedLists.js.map +0 -1
  141. package/dist/src/api/parsers/html/util/nestedLists.test.js +0 -166
  142. package/dist/src/api/parsers/html/util/nestedLists.test.js.map +0 -1
  143. package/dist/src/api/parsers/markdown/parseMarkdown.js +0 -52
  144. package/dist/src/api/parsers/markdown/parseMarkdown.js.map +0 -1
  145. package/dist/src/api/parsers/markdown/parseMarkdown.test.js +0 -112
  146. package/dist/src/api/parsers/markdown/parseMarkdown.test.js.map +0 -1
  147. package/dist/src/api/testUtil/cases/customBlocks.js +0 -313
  148. package/dist/src/api/testUtil/cases/customBlocks.js.map +0 -1
  149. package/dist/src/api/testUtil/cases/customInlineContent.js +0 -91
  150. package/dist/src/api/testUtil/cases/customInlineContent.js.map +0 -1
  151. package/dist/src/api/testUtil/cases/customStyles.js +0 -83
  152. package/dist/src/api/testUtil/cases/customStyles.js.map +0 -1
  153. package/dist/src/api/testUtil/cases/defaultSchema.js +0 -673
  154. package/dist/src/api/testUtil/cases/defaultSchema.js.map +0 -1
  155. package/dist/src/api/testUtil/index.js +0 -2
  156. package/dist/src/api/testUtil/index.js.map +0 -1
  157. package/dist/src/api/testUtil/partialBlockTestUtil.js +0 -114
  158. package/dist/src/api/testUtil/partialBlockTestUtil.js.map +0 -1
  159. package/dist/src/api/testUtil/paste.js +0 -29
  160. package/dist/src/api/testUtil/paste.js.map +0 -1
  161. package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js +0 -104
  162. package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js.map +0 -1
  163. package/dist/src/blocks/AudioBlockContent/parseAudioElement.js +0 -5
  164. package/dist/src/blocks/AudioBlockContent/parseAudioElement.js.map +0 -1
  165. package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js +0 -281
  166. package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js.map +0 -1
  167. package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js +0 -110
  168. package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js.map +0 -1
  169. package/dist/src/blocks/FileBlockContent/FileBlockContent.js +0 -71
  170. package/dist/src/blocks/FileBlockContent/FileBlockContent.js.map +0 -1
  171. package/dist/src/blocks/FileBlockContent/helpers/parse/parseEmbedElement.js +0 -5
  172. package/dist/src/blocks/FileBlockContent/helpers/parse/parseEmbedElement.js.map +0 -1
  173. package/dist/src/blocks/FileBlockContent/helpers/parse/parseFigureElement.js +0 -10
  174. package/dist/src/blocks/FileBlockContent/helpers/parse/parseFigureElement.js.map +0 -1
  175. package/dist/src/blocks/FileBlockContent/helpers/render/createAddFileButton.js +0 -39
  176. package/dist/src/blocks/FileBlockContent/helpers/render/createAddFileButton.js.map +0 -1
  177. package/dist/src/blocks/FileBlockContent/helpers/render/createFileBlockWrapper.js +0 -51
  178. package/dist/src/blocks/FileBlockContent/helpers/render/createFileBlockWrapper.js.map +0 -1
  179. package/dist/src/blocks/FileBlockContent/helpers/render/createFileNameWithIcon.js +0 -17
  180. package/dist/src/blocks/FileBlockContent/helpers/render/createFileNameWithIcon.js.map +0 -1
  181. package/dist/src/blocks/FileBlockContent/helpers/render/createResizableFileBlockWrapper.js +0 -147
  182. package/dist/src/blocks/FileBlockContent/helpers/render/createResizableFileBlockWrapper.js.map +0 -1
  183. package/dist/src/blocks/FileBlockContent/helpers/toExternalHTML/createFigureWithCaption.js +0 -9
  184. package/dist/src/blocks/FileBlockContent/helpers/toExternalHTML/createFigureWithCaption.js.map +0 -1
  185. package/dist/src/blocks/FileBlockContent/helpers/toExternalHTML/createLinkWithCaption.js +0 -11
  186. package/dist/src/blocks/FileBlockContent/helpers/toExternalHTML/createLinkWithCaption.js.map +0 -1
  187. package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js +0 -15
  188. package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js.map +0 -1
  189. package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js +0 -145
  190. package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js.map +0 -1
  191. package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js +0 -114
  192. package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js.map +0 -1
  193. package/dist/src/blocks/ImageBlockContent/parseImageElement.js +0 -6
  194. package/dist/src/blocks/ImageBlockContent/parseImageElement.js.map +0 -1
  195. package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js +0 -113
  196. package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js.map +0 -1
  197. package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js +0 -224
  198. package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js.map +0 -1
  199. package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js +0 -45
  200. package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js.map +0 -1
  201. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js +0 -58
  202. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js.map +0 -1
  203. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js +0 -130
  204. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js.map +0 -1
  205. package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js +0 -52
  206. package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js.map +0 -1
  207. package/dist/src/blocks/TableBlockContent/TableBlockContent.js +0 -129
  208. package/dist/src/blocks/TableBlockContent/TableBlockContent.js.map +0 -1
  209. package/dist/src/blocks/TableBlockContent/TableExtension.js +0 -64
  210. package/dist/src/blocks/TableBlockContent/TableExtension.js.map +0 -1
  211. package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js +0 -114
  212. package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js.map +0 -1
  213. package/dist/src/blocks/VideoBlockContent/parseVideoElement.js +0 -6
  214. package/dist/src/blocks/VideoBlockContent/parseVideoElement.js.map +0 -1
  215. package/dist/src/blocks/defaultBlockHelpers.js +0 -50
  216. package/dist/src/blocks/defaultBlockHelpers.js.map +0 -1
  217. package/dist/src/blocks/defaultBlockTypeGuards.js +0 -40
  218. package/dist/src/blocks/defaultBlockTypeGuards.js.map +0 -1
  219. package/dist/src/blocks/defaultBlocks.js +0 -50
  220. package/dist/src/blocks/defaultBlocks.js.map +0 -1
  221. package/dist/src/blocks/defaultProps.js +0 -19
  222. package/dist/src/blocks/defaultProps.js.map +0 -1
  223. package/dist/src/editor/BlockNoteEditor.js +0 -751
  224. package/dist/src/editor/BlockNoteEditor.js.map +0 -1
  225. package/dist/src/editor/BlockNoteEditor.test.js +0 -65
  226. package/dist/src/editor/BlockNoteEditor.test.js.map +0 -1
  227. package/dist/src/editor/BlockNoteExtensions.js +0 -192
  228. package/dist/src/editor/BlockNoteExtensions.js.map +0 -1
  229. package/dist/src/editor/BlockNoteSchema.js +0 -38
  230. package/dist/src/editor/BlockNoteSchema.js.map +0 -1
  231. package/dist/src/editor/BlockNoteTipTapEditor.js +0 -169
  232. package/dist/src/editor/BlockNoteTipTapEditor.js.map +0 -1
  233. package/dist/src/editor/cursorPositionTypes.js +0 -2
  234. package/dist/src/editor/cursorPositionTypes.js.map +0 -1
  235. package/dist/src/editor/defaultColors.js +0 -77
  236. package/dist/src/editor/defaultColors.js.map +0 -1
  237. package/dist/src/editor/selectionTypes.js +0 -2
  238. package/dist/src/editor/selectionTypes.js.map +0 -1
  239. package/dist/src/editor/transformPasted.js +0 -79
  240. package/dist/src/editor/transformPasted.js.map +0 -1
  241. package/dist/src/exporter/Exporter.js +0 -36
  242. package/dist/src/exporter/Exporter.js.map +0 -1
  243. package/dist/src/exporter/index.js +0 -3
  244. package/dist/src/exporter/index.js.map +0 -1
  245. package/dist/src/exporter/mapping.js +0 -12
  246. package/dist/src/exporter/mapping.js.map +0 -1
  247. package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js +0 -30
  248. package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js.map +0 -1
  249. package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js +0 -39
  250. package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js.map +0 -1
  251. package/dist/src/extensions/FilePanel/FilePanelPlugin.js +0 -131
  252. package/dist/src/extensions/FilePanel/FilePanelPlugin.js.map +0 -1
  253. package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js +0 -197
  254. package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js.map +0 -1
  255. package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js +0 -341
  256. package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js.map +0 -1
  257. package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js +0 -251
  258. package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js.map +0 -1
  259. package/dist/src/extensions/LinkToolbar/protocols.js +0 -14
  260. package/dist/src/extensions/LinkToolbar/protocols.js.map +0 -1
  261. package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js +0 -54
  262. package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js.map +0 -1
  263. package/dist/src/extensions/Placeholder/PlaceholderPlugin.js +0 -90
  264. package/dist/src/extensions/Placeholder/PlaceholderPlugin.js.map +0 -1
  265. package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js +0 -187
  266. package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js.map +0 -1
  267. package/dist/src/extensions/SideMenu/MultipleNodeSelection.js +0 -68
  268. package/dist/src/extensions/SideMenu/MultipleNodeSelection.js.map +0 -1
  269. package/dist/src/extensions/SideMenu/SideMenuPlugin.js +0 -347
  270. package/dist/src/extensions/SideMenu/SideMenuPlugin.js.map +0 -1
  271. package/dist/src/extensions/SideMenu/dragging.js +0 -135
  272. package/dist/src/extensions/SideMenu/dragging.js.map +0 -1
  273. package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js +0 -2
  274. package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js.map +0 -1
  275. package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js +0 -2
  276. package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js.map +0 -1
  277. package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js +0 -245
  278. package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js.map +0 -1
  279. package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js +0 -26
  280. package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js.map +0 -1
  281. package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js +0 -241
  282. package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js.map +0 -1
  283. package/dist/src/extensions/TableHandles/TableHandlesPlugin.js +0 -579
  284. package/dist/src/extensions/TableHandles/TableHandlesPlugin.js.map +0 -1
  285. package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js +0 -36
  286. package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js.map +0 -1
  287. package/dist/src/extensions/TextColor/TextColorExtension.js +0 -29
  288. package/dist/src/extensions/TextColor/TextColorExtension.js.map +0 -1
  289. package/dist/src/extensions/TextColor/TextColorMark.js +0 -37
  290. package/dist/src/extensions/TextColor/TextColorMark.js.map +0 -1
  291. package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js +0 -58
  292. package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js.map +0 -1
  293. package/dist/src/extensions/UniqueID/UniqueID.js +0 -283
  294. package/dist/src/extensions/UniqueID/UniqueID.js.map +0 -1
  295. package/dist/src/extensions/getDraggableBlockFromElement.js +0 -13
  296. package/dist/src/extensions/getDraggableBlockFromElement.js.map +0 -1
  297. package/dist/src/extensions-shared/UiElementPosition.js +0 -2
  298. package/dist/src/extensions-shared/UiElementPosition.js.map +0 -1
  299. package/dist/src/i18n/dictionary.js +0 -4
  300. package/dist/src/i18n/dictionary.js.map +0 -1
  301. package/dist/src/i18n/locales/ar.js +0 -298
  302. package/dist/src/i18n/locales/ar.js.map +0 -1
  303. package/dist/src/i18n/locales/de.js +0 -313
  304. package/dist/src/i18n/locales/de.js.map +0 -1
  305. package/dist/src/i18n/locales/en.js +0 -314
  306. package/dist/src/i18n/locales/en.js.map +0 -1
  307. package/dist/src/i18n/locales/es.js +0 -312
  308. package/dist/src/i18n/locales/es.js.map +0 -1
  309. package/dist/src/i18n/locales/fr.js +0 -313
  310. package/dist/src/i18n/locales/fr.js.map +0 -1
  311. package/dist/src/i18n/locales/hr.js +0 -308
  312. package/dist/src/i18n/locales/hr.js.map +0 -1
  313. package/dist/src/i18n/locales/index.js +0 -16
  314. package/dist/src/i18n/locales/index.js.map +0 -1
  315. package/dist/src/i18n/locales/is.js +0 -305
  316. package/dist/src/i18n/locales/is.js.map +0 -1
  317. package/dist/src/i18n/locales/ja.js +0 -333
  318. package/dist/src/i18n/locales/ja.js.map +0 -1
  319. package/dist/src/i18n/locales/ko.js +0 -326
  320. package/dist/src/i18n/locales/ko.js.map +0 -1
  321. package/dist/src/i18n/locales/nl.js +0 -313
  322. package/dist/src/i18n/locales/nl.js.map +0 -1
  323. package/dist/src/i18n/locales/pl.js +0 -297
  324. package/dist/src/i18n/locales/pl.js.map +0 -1
  325. package/dist/src/i18n/locales/pt.js +0 -305
  326. package/dist/src/i18n/locales/pt.js.map +0 -1
  327. package/dist/src/i18n/locales/ru.js +0 -340
  328. package/dist/src/i18n/locales/ru.js.map +0 -1
  329. package/dist/src/i18n/locales/vi.js +0 -312
  330. package/dist/src/i18n/locales/vi.js.map +0 -1
  331. package/dist/src/i18n/locales/zh.js +0 -346
  332. package/dist/src/i18n/locales/zh.js.map +0 -1
  333. package/dist/src/index.js +0 -63
  334. package/dist/src/index.js.map +0 -1
  335. package/dist/src/pm-nodes/BlockContainer.js +0 -72
  336. package/dist/src/pm-nodes/BlockContainer.js.map +0 -1
  337. package/dist/src/pm-nodes/BlockGroup.js +0 -43
  338. package/dist/src/pm-nodes/BlockGroup.js.map +0 -1
  339. package/dist/src/pm-nodes/Doc.js +0 -7
  340. package/dist/src/pm-nodes/Doc.js.map +0 -1
  341. package/dist/src/pm-nodes/index.js +0 -4
  342. package/dist/src/pm-nodes/index.js.map +0 -1
  343. package/dist/src/schema/blocks/createSpec.js +0 -126
  344. package/dist/src/schema/blocks/createSpec.js.map +0 -1
  345. package/dist/src/schema/blocks/internal.js +0 -147
  346. package/dist/src/schema/blocks/internal.js.map +0 -1
  347. package/dist/src/schema/blocks/types.js +0 -2
  348. package/dist/src/schema/blocks/types.js.map +0 -1
  349. package/dist/src/schema/index.js +0 -11
  350. package/dist/src/schema/index.js.map +0 -1
  351. package/dist/src/schema/inlineContent/createSpec.js +0 -64
  352. package/dist/src/schema/inlineContent/createSpec.js.map +0 -1
  353. package/dist/src/schema/inlineContent/internal.js +0 -52
  354. package/dist/src/schema/inlineContent/internal.js.map +0 -1
  355. package/dist/src/schema/inlineContent/types.js +0 -10
  356. package/dist/src/schema/inlineContent/types.js.map +0 -1
  357. package/dist/src/schema/propTypes.js +0 -2
  358. package/dist/src/schema/propTypes.js.map +0 -1
  359. package/dist/src/schema/styles/createSpec.js +0 -48
  360. package/dist/src/schema/styles/createSpec.js.map +0 -1
  361. package/dist/src/schema/styles/internal.js +0 -53
  362. package/dist/src/schema/styles/internal.js.map +0 -1
  363. package/dist/src/schema/styles/types.js +0 -2
  364. package/dist/src/schema/styles/types.js.map +0 -1
  365. package/dist/src/util/EventEmitter.js +0 -33
  366. package/dist/src/util/EventEmitter.js.map +0 -1
  367. package/dist/src/util/browser.js +0 -17
  368. package/dist/src/util/browser.js.map +0 -1
  369. package/dist/src/util/combineByGroup.js +0 -20
  370. package/dist/src/util/combineByGroup.js.map +0 -1
  371. package/dist/src/util/esmDependencies.js +0 -35
  372. package/dist/src/util/esmDependencies.js.map +0 -1
  373. package/dist/src/util/string.js +0 -14
  374. package/dist/src/util/string.js.map +0 -1
  375. package/dist/src/util/typescript.js +0 -12
  376. package/dist/src/util/typescript.js.map +0 -1
  377. /package/src/api/clipboard/__snapshots__/{childToParent.html → internal/childToParent.html} +0 -0
  378. /package/src/api/clipboard/__snapshots__/{childrenToNextParent.html → internal/childrenToNextParent.html} +0 -0
  379. /package/src/api/clipboard/__snapshots__/{childrenToNextParentsChildren.html → internal/childrenToNextParentsChildren.html} +0 -0
  380. /package/src/api/clipboard/__snapshots__/{image.html → internal/image.html} +0 -0
  381. /package/src/api/clipboard/__snapshots__/{multipleChildren.html → internal/multipleChildren.html} +0 -0
  382. /package/src/api/clipboard/__snapshots__/{multipleStyledText.html → internal/multipleStyledText.html} +0 -0
  383. /package/src/api/clipboard/__snapshots__/{nestedImage.html → internal/nestedImage.html} +0 -0
  384. /package/src/api/clipboard/__snapshots__/{partialChildToParent.html → internal/partialChildToParent.html} +0 -0
  385. /package/src/api/clipboard/__snapshots__/{styledText.html → internal/styledText.html} +0 -0
  386. /package/src/api/clipboard/__snapshots__/{tableAllCells.html → internal/tableAllCells.html} +0 -0
  387. /package/src/api/clipboard/__snapshots__/{tableCell.html → internal/tableCell.html} +0 -0
  388. /package/src/api/clipboard/__snapshots__/{tableCellText.html → internal/tableCellText.html} +0 -0
  389. /package/src/api/clipboard/__snapshots__/{tableRow.html → internal/tableRow.html} +0 -0
  390. /package/src/api/clipboard/__snapshots__/{unstyledText.html → internal/unstyledText.html} +0 -0
  391. /package/types/src/api/clipboard/{clipboard.test.d.ts → clipboardExternal.test.d.ts} +0 -0
@@ -0,0 +1,124 @@
1
+ [
2
+ {
3
+ "children": [],
4
+ "content": [
5
+ {
6
+ "styles": {},
7
+ "text": "Paragraph",
8
+ "type": "text",
9
+ },
10
+ ],
11
+ "id": "0",
12
+ "props": {
13
+ "backgroundColor": "default",
14
+ "textAlignment": "left",
15
+ "textColor": "default",
16
+ },
17
+ "type": "paragraph",
18
+ },
19
+ {
20
+ "children": [],
21
+ "content": {
22
+ "columnWidths": [
23
+ undefined,
24
+ undefined,
25
+ undefined,
26
+ ],
27
+ "rows": [
28
+ {
29
+ "cells": [
30
+ [
31
+ {
32
+ "styles": {},
33
+ "text": "Table Cell",
34
+ "type": "text",
35
+ },
36
+ ],
37
+ [
38
+ {
39
+ "styles": {},
40
+ "text": "Table Cell",
41
+ "type": "text",
42
+ },
43
+ ],
44
+ [],
45
+ ],
46
+ },
47
+ {
48
+ "cells": [
49
+ [
50
+ {
51
+ "styles": {},
52
+ "text": "Table Cell",
53
+ "type": "text",
54
+ },
55
+ ],
56
+ [
57
+ {
58
+ "styles": {},
59
+ "text": "Cell 1",
60
+ "type": "text",
61
+ },
62
+ ],
63
+ [
64
+ {
65
+ "styles": {},
66
+ "text": "Cell 2",
67
+ "type": "text",
68
+ },
69
+ ],
70
+ ],
71
+ },
72
+ {
73
+ "cells": [
74
+ [],
75
+ [
76
+ {
77
+ "styles": {},
78
+ "text": "Cell 3",
79
+ "type": "text",
80
+ },
81
+ ],
82
+ [
83
+ {
84
+ "styles": {},
85
+ "text": "Cell 4",
86
+ "type": "text",
87
+ },
88
+ ],
89
+ ],
90
+ },
91
+ ],
92
+ "type": "tableContent",
93
+ },
94
+ "id": "1",
95
+ "props": {
96
+ "textColor": "default",
97
+ },
98
+ "type": "table",
99
+ },
100
+ {
101
+ "children": [],
102
+ "content": [
103
+ {
104
+ "styles": {},
105
+ "text": "Custom Paragraph",
106
+ "type": "text",
107
+ },
108
+ ],
109
+ "id": "2",
110
+ "props": {},
111
+ "type": "customParagraph",
112
+ },
113
+ {
114
+ "children": [],
115
+ "content": [],
116
+ "id": "3",
117
+ "props": {
118
+ "backgroundColor": "default",
119
+ "textAlignment": "left",
120
+ "textColor": "default",
121
+ },
122
+ "type": "paragraph",
123
+ },
124
+ ]
@@ -0,0 +1,161 @@
1
+ import { Node } from "prosemirror-model";
2
+ import { Selection, TextSelection } from "prosemirror-state";
3
+ import { afterAll, beforeAll, beforeEach, describe, expect, it } from "vitest";
4
+
5
+ import { PartialBlock } from "../../blocks/defaultBlocks.js";
6
+ import { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
7
+ import { initializeESMDependencies } from "../../util/esmDependencies.js";
8
+ import { doPaste } from "../testUtil/paste.js";
9
+ import { schema } from "./testUtil.js";
10
+
11
+ type SelectionTestCase = {
12
+ testName: string;
13
+ createSelection: (doc: Node) => Selection;
14
+ } & (
15
+ | {
16
+ html: string;
17
+ }
18
+ | {
19
+ plainText: string;
20
+ }
21
+ );
22
+
23
+ // These tests are meant to test the pasting of external HTML in the editor.
24
+ // Each test case has an HTML string to be pasted, and a selection in the editor
25
+ // to paste at.
26
+ describe("Test external clipboard HTML", () => {
27
+ const initialContent: PartialBlock<typeof schema.blockSchema>[] = [
28
+ {
29
+ type: "paragraph",
30
+ content: "Paragraph",
31
+ },
32
+ {
33
+ type: "table",
34
+ content: {
35
+ type: "tableContent",
36
+ rows: [
37
+ {
38
+ cells: ["Table Cell", "Table Cell"],
39
+ },
40
+ {
41
+ cells: ["Table Cell", "Table Cell"],
42
+ },
43
+ ],
44
+ },
45
+ },
46
+ {
47
+ type: "customParagraph",
48
+ content: "Custom Paragraph",
49
+ },
50
+ {
51
+ type: "paragraph",
52
+ },
53
+ ];
54
+
55
+ let editor: BlockNoteEditor<typeof schema.blockSchema>;
56
+ const div = document.createElement("div");
57
+
58
+ beforeEach(() => {
59
+ editor.replaceBlocks(editor.document, initialContent);
60
+ });
61
+
62
+ beforeAll(async () => {
63
+ (window as any).__TEST_OPTIONS = (window as any).__TEST_OPTIONS || {};
64
+
65
+ editor = BlockNoteEditor.create({ schema });
66
+ editor.mount(div);
67
+
68
+ await initializeESMDependencies();
69
+ });
70
+
71
+ afterAll(() => {
72
+ editor.mount(undefined);
73
+ editor._tiptapEditor.destroy();
74
+ editor = undefined as any;
75
+
76
+ delete (window as Window & { __TEST_OPTIONS?: any }).__TEST_OPTIONS;
77
+ });
78
+
79
+ // Sets the editor selection to the given start and end positions, then
80
+ // pastes the HTML and compares it the document after to a snapshot.
81
+ async function testPasteExternalHTML(testCase: SelectionTestCase) {
82
+ if (!editor.prosemirrorView) {
83
+ throw new Error("Editor view not initialized.");
84
+ }
85
+
86
+ editor.dispatch(
87
+ editor._tiptapEditor.state.tr.setSelection(
88
+ testCase.createSelection(editor.prosemirrorView.state.doc)
89
+ )
90
+ );
91
+
92
+ doPaste(
93
+ editor.prosemirrorView,
94
+ "plainText" in testCase ? testCase.plainText : "",
95
+ "html" in testCase ? testCase.html : "",
96
+ "plainText" in testCase,
97
+ new ClipboardEvent("paste")
98
+ );
99
+
100
+ expect(editor.document).toMatchFileSnapshot(
101
+ `./__snapshots__/external/${testCase.testName}.html`
102
+ );
103
+ }
104
+
105
+ const testCases: SelectionTestCase[] = [
106
+ {
107
+ testName: "pasteEndOfParagraph",
108
+ createSelection: (doc) => TextSelection.create(doc, 12),
109
+ html: `<p>Paragraph</p>`,
110
+ },
111
+ {
112
+ testName: "pasteEndOfParagraphText",
113
+ createSelection: (doc) => TextSelection.create(doc, 12),
114
+ plainText: `Paragraph`,
115
+ },
116
+ {
117
+ testName: "pasteImage",
118
+ createSelection: (doc) => TextSelection.create(doc, 12),
119
+ html: `<img src="exampleURL">`,
120
+ },
121
+ {
122
+ testName: "pasteTable",
123
+ createSelection: (doc) => TextSelection.create(doc, 12),
124
+ html: `<table>
125
+ <tr>
126
+ <td>Cell 1</td>
127
+ <td>Cell 2</td>
128
+ </tr>
129
+ <tr>
130
+ <td>Cell 3</td>
131
+ <td>Cell 4</td>
132
+ </tr>
133
+ </table>`,
134
+ },
135
+ {
136
+ testName: "pasteTableInExistingTable",
137
+ createSelection: (doc) => TextSelection.create(doc, 73),
138
+ html: `<table>
139
+ <tr>
140
+ <td>Cell 1</td>
141
+ <td>Cell 2</td>
142
+ </tr>
143
+ <tr>
144
+ <td>Cell 3</td>
145
+ <td>Cell 4</td>
146
+ </tr>
147
+ </table>`,
148
+ },
149
+ {
150
+ testName: "pasteParagraphInCustomBlock",
151
+ createSelection: (doc) => TextSelection.create(doc, 80, 96),
152
+ html: `<p>Paragraph</p>`,
153
+ },
154
+ ];
155
+
156
+ for (const testCase of testCases) {
157
+ it(`${testCase.testName}`, async () => {
158
+ await testPasteExternalHTML(testCase);
159
+ });
160
+ }
161
+ });
@@ -7,11 +7,13 @@ import { PartialBlock } from "../../blocks/defaultBlocks.js";
7
7
  import { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
8
8
  import { initializeESMDependencies } from "../../util/esmDependencies.js";
9
9
  import { doPaste } from "../testUtil/paste.js";
10
+ import { schema } from "./testUtil.js";
10
11
  import { selectedFragmentToHTML } from "./toClipboard/copyExtension.js";
11
12
 
12
13
  type SelectionTestCase = {
13
14
  testName: string;
14
- createSelection: (doc: Node) => Selection;
15
+ createCopySelection: (doc: Node) => Selection;
16
+ createPasteSelection?: (doc: Node) => Selection;
15
17
  };
16
18
 
17
19
  // These tests are meant to test the copying of user selections in the editor.
@@ -19,7 +21,7 @@ type SelectionTestCase = {
19
21
  // as they are represented in the BlockNote API, whereas here we want to test
20
22
  // ProseMirror/TipTap selections directly.
21
23
  describe("Test ProseMirror selection clipboard HTML", () => {
22
- const initialContent: PartialBlock[] = [
24
+ const initialContent: PartialBlock<typeof schema.blockSchema>[] = [
23
25
  {
24
26
  type: "heading",
25
27
  props: {
@@ -138,9 +140,17 @@ describe("Test ProseMirror selection clipboard HTML", () => {
138
140
  // },
139
141
  // ],
140
142
  },
143
+ {
144
+ type: "paragraph",
145
+ content: "Paragraph",
146
+ },
147
+ {
148
+ type: "customParagraph",
149
+ content: "Paragraph",
150
+ },
141
151
  ];
142
152
 
143
- let editor: BlockNoteEditor;
153
+ let editor: BlockNoteEditor<typeof schema.blockSchema>;
144
154
  const div = document.createElement("div");
145
155
 
146
156
  beforeEach(() => {
@@ -150,7 +160,7 @@ describe("Test ProseMirror selection clipboard HTML", () => {
150
160
  beforeAll(async () => {
151
161
  (window as any).__TEST_OPTIONS = (window as any).__TEST_OPTIONS || {};
152
162
 
153
- editor = BlockNoteEditor.create();
163
+ editor = BlockNoteEditor.create({ schema });
154
164
  editor.mount(div);
155
165
 
156
166
  await initializeESMDependencies();
@@ -173,7 +183,7 @@ describe("Test ProseMirror selection clipboard HTML", () => {
173
183
 
174
184
  editor.dispatch(
175
185
  editor._tiptapEditor.state.tr.setSelection(
176
- testCase.createSelection(editor.prosemirrorView.state.doc)
186
+ testCase.createCopySelection(editor.prosemirrorView.state.doc)
177
187
  )
178
188
  );
179
189
 
@@ -183,9 +193,17 @@ describe("Test ProseMirror selection clipboard HTML", () => {
183
193
  );
184
194
 
185
195
  expect(externalHTML).toMatchFileSnapshot(
186
- `./__snapshots__/${testCase.testName}.html`
196
+ `./__snapshots__/internal/${testCase.testName}.html`
187
197
  );
188
198
 
199
+ if (testCase.createPasteSelection) {
200
+ editor.dispatch(
201
+ editor._tiptapEditor.state.tr.setSelection(
202
+ testCase.createPasteSelection(editor.prosemirrorView.state.doc)
203
+ )
204
+ );
205
+ }
206
+
189
207
  const originalDocument = editor.document;
190
208
  doPaste(
191
209
  editor.prosemirrorView,
@@ -201,81 +219,85 @@ describe("Test ProseMirror selection clipboard HTML", () => {
201
219
 
202
220
  const testCases: SelectionTestCase[] = [
203
221
  // TODO: Consider adding test cases for nested blocks & double nested blocks.
204
- // Selection spans all of first heading's children.
222
+ // Copy/paste all of first heading's children.
205
223
  {
206
224
  testName: "multipleChildren",
207
- createSelection: (doc) => TextSelection.create(doc, 16, 78),
225
+ createCopySelection: (doc) => TextSelection.create(doc, 16, 78),
208
226
  },
209
- // Selection spans from start of first heading to end of its first child.
227
+ // Copy/paste from start of first heading to end of its first child.
210
228
  {
211
229
  testName: "childToParent",
212
- createSelection: (doc) => TextSelection.create(doc, 3, 34),
230
+ createCopySelection: (doc) => TextSelection.create(doc, 3, 34),
213
231
  },
214
- // Selection spans from middle of first heading to the middle of its first
215
- // child.
232
+ // Copy/paste from middle of first heading to the middle of its first child.
216
233
  {
217
234
  testName: "partialChildToParent",
218
- createSelection: (doc) => TextSelection.create(doc, 6, 23),
235
+ createCopySelection: (doc) => TextSelection.create(doc, 6, 23),
219
236
  },
220
- // Selection spans from start of first heading's first child to end of
221
- // second heading's content (does not include second heading's children).
237
+ // Copy/paste from start of first heading's first child to end of second
238
+ // heading's content (does not include second heading's children).
222
239
  {
223
240
  testName: "childrenToNextParent",
224
- createSelection: (doc) => TextSelection.create(doc, 16, 93),
241
+ createCopySelection: (doc) => TextSelection.create(doc, 16, 93),
225
242
  },
226
- // Selection spans from start of first heading's first child to end of
227
- // second heading's last child.
243
+ // Copy/paste from start of first heading's first child to end of second
244
+ // heading's last child.
228
245
  {
229
246
  testName: "childrenToNextParentsChildren",
230
- createSelection: (doc) => TextSelection.create(doc, 16, 159),
247
+ createCopySelection: (doc) => TextSelection.create(doc, 16, 159),
231
248
  },
232
- // Selection spans "Regular" text inside third heading.
249
+ // Copy/paste "Regular" text inside third heading.
233
250
  {
234
251
  testName: "unstyledText",
235
- createSelection: (doc) => TextSelection.create(doc, 175, 182),
252
+ createCopySelection: (doc) => TextSelection.create(doc, 175, 182),
236
253
  },
237
- // Selection spans "Italic" text inside third heading.
254
+ // Copy/paste "Italic" text inside third heading.
238
255
  {
239
256
  testName: "styledText",
240
- createSelection: (doc) => TextSelection.create(doc, 169, 175),
257
+ createCopySelection: (doc) => TextSelection.create(doc, 169, 175),
241
258
  },
242
- // Selection spans third heading's content (does not include third heading's
259
+ // Copy/paste third heading's content (does not include third heading's
243
260
  // children).
244
261
  {
245
262
  testName: "multipleStyledText",
246
- createSelection: (doc) => TextSelection.create(doc, 165, 182),
263
+ createCopySelection: (doc) => TextSelection.create(doc, 165, 182),
247
264
  },
248
- // Selection spans the image block content.
265
+ // Copy/paste the image block content.
249
266
  {
250
267
  testName: "image",
251
- createSelection: (doc) => NodeSelection.create(doc, 185),
268
+ createCopySelection: (doc) => NodeSelection.create(doc, 185),
252
269
  },
253
- // Selection spans from start of third heading to end of it's last
254
- // descendant.
270
+ // Copy/paste from start of third heading to end of it's last descendant.
255
271
  {
256
272
  testName: "nestedImage",
257
- createSelection: (doc) => TextSelection.create(doc, 165, 205),
273
+ createCopySelection: (doc) => TextSelection.create(doc, 165, 205),
258
274
  },
259
- // Selection spans text in first cell of the table.
275
+ // Copy/paste text in first cell of the table.
260
276
  {
261
277
  testName: "tableCellText",
262
- createSelection: (doc) => TextSelection.create(doc, 216, 226),
278
+ createCopySelection: (doc) => TextSelection.create(doc, 216, 226),
263
279
  },
264
- // Selection spans first cell of the table.
280
+ // Copy/paste first cell of the table.
265
281
  // TODO: External HTML is wrapped in unnecessary `tr` element.
266
282
  {
267
283
  testName: "tableCell",
268
- createSelection: (doc) => CellSelection.create(doc, 214),
284
+ createCopySelection: (doc) => CellSelection.create(doc, 214),
269
285
  },
270
- // Selection spans first row of the table.
286
+ // Copy/paste first row of the table.
271
287
  {
272
288
  testName: "tableRow",
273
- createSelection: (doc) => CellSelection.create(doc, 214, 228),
289
+ createCopySelection: (doc) => CellSelection.create(doc, 214, 228),
274
290
  },
275
- // Selection spans all cells of the table.
291
+ // Copy/paste all cells of the table.
276
292
  {
277
293
  testName: "tableAllCells",
278
- createSelection: (doc) => CellSelection.create(doc, 214, 258),
294
+ createCopySelection: (doc) => CellSelection.create(doc, 214, 258),
295
+ },
296
+ // Copy regular paragraph content and paste over custom block content.
297
+ {
298
+ testName: "paragraphInCustomBlock",
299
+ createCopySelection: (doc) => TextSelection.create(doc, 277, 286),
300
+ createPasteSelection: (doc) => TextSelection.create(doc, 290, 299),
279
301
  },
280
302
  ];
281
303
 
@@ -0,0 +1,27 @@
1
+ import { createBlockSpec } from "../../schema/index.js";
2
+ import { BlockNoteSchema } from "../../editor/BlockNoteSchema.js";
3
+ import { defaultBlockSpecs } from "../../blocks/defaultBlocks.js";
4
+
5
+ const CustomParagraph = createBlockSpec(
6
+ {
7
+ type: "customParagraph",
8
+ content: "inline",
9
+ propSchema: {},
10
+ },
11
+ {
12
+ render: () => {
13
+ const customParagraph = document.createElement("p");
14
+
15
+ return {
16
+ dom: customParagraph,
17
+ contentDOM: customParagraph,
18
+ };
19
+ },
20
+ }
21
+ );
22
+ export const schema = BlockNoteSchema.create({
23
+ blockSpecs: {
24
+ ...defaultBlockSpecs,
25
+ customParagraph: CustomParagraph as any,
26
+ },
27
+ });
@@ -80,6 +80,7 @@ function fragmentToExternalHTML<
80
80
  editor.schema.styleSchema
81
81
  );
82
82
 
83
+ // Wrap in table to ensure correct parsing by spreadsheet applications
83
84
  externalHTML = `<table>${externalHTMLExporter.exportInlineContent(
84
85
  ic as any,
85
86
  {}
@@ -104,7 +104,9 @@ function serializeBlock<
104
104
  for (const [name, spec] of Object.entries(
105
105
  editor.schema.blockSchema[block.type as any].propSchema
106
106
  )) {
107
- (props as any)[name] = spec.default;
107
+ if (spec.default !== undefined) {
108
+ (props as any)[name] = spec.default;
109
+ }
108
110
  }
109
111
  }
110
112
 
@@ -172,6 +174,10 @@ function serializeBlock<
172
174
  if (listType) {
173
175
  if (fragment.lastChild?.nodeName !== listType) {
174
176
  const list = doc.createElement(listType);
177
+
178
+ if (listType === "OL" && props?.start && props?.start !== 1) {
179
+ list.setAttribute("start", props.start + "");
180
+ }
175
181
  fragment.append(list);
176
182
  }
177
183
  const li = doc.createElement("li");
@@ -78,7 +78,9 @@ function serializeBlock<
78
78
  for (const [name, spec] of Object.entries(
79
79
  editor.schema.blockSchema[block.type as any].propSchema
80
80
  )) {
81
- (props as any)[name] = spec.default;
81
+ if (spec.default !== undefined) {
82
+ (props as any)[name] = spec.default;
83
+ }
82
84
  }
83
85
  }
84
86
 
@@ -355,7 +355,10 @@ export function nodeToBlock<
355
355
  })) {
356
356
  const propSchema = blockSpec.propSchema;
357
357
 
358
- if (attr in propSchema) {
358
+ if (
359
+ attr in propSchema &&
360
+ !(propSchema[attr].default === undefined && value === undefined)
361
+ ) {
359
362
  props[attr] = value;
360
363
  }
361
364
  }
@@ -1,6 +1,6 @@
1
1
  [
2
2
  {
3
- "id": "2",
3
+ "id": "0",
4
4
  "type": "paragraph",
5
5
  "props": {
6
6
  "textColor": "default",
@@ -48,7 +48,7 @@
48
48
  "children": []
49
49
  },
50
50
  {
51
- "id": "3",
51
+ "id": "2",
52
52
  "type": "paragraph",
53
53
  "props": {
54
54
  "textColor": "default",
@@ -111,7 +111,10 @@ export function partialBlockToBlockForTesting<
111
111
 
112
112
  Object.entries(schema[partialBlock.type!].propSchema).forEach(
113
113
  ([propKey, propValue]) => {
114
- if (withDefaults.props[propKey] === undefined) {
114
+ if (
115
+ withDefaults.props[propKey] === undefined &&
116
+ propValue.default !== undefined
117
+ ) {
115
118
  (withDefaults.props as any)[propKey] = propValue.default;
116
119
  }
117
120
  }
@@ -5,6 +5,7 @@ import {
5
5
  PropSchema,
6
6
  createBlockSpecFromStronglyTypedTiptapNode,
7
7
  createStronglyTypedTiptapNode,
8
+ propsToAttributes,
8
9
  } from "../../schema/index.js";
9
10
  import { createDefaultBlockDOMOutputSpec } from "../defaultBlockHelpers.js";
10
11
  import { defaultProps } from "../defaultProps.js";
@@ -18,26 +19,9 @@ const HeadingBlockContent = createStronglyTypedTiptapNode({
18
19
  name: "heading",
19
20
  content: "inline*",
20
21
  group: "blockContent",
22
+
21
23
  addAttributes() {
22
- return {
23
- level: {
24
- default: 1,
25
- // instead of "level" attributes, use "data-level"
26
- parseHTML: (element) => {
27
- const attr = element.getAttribute("data-level")!;
28
- const parsed = parseInt(attr);
29
- if (isFinite(parsed)) {
30
- return parsed;
31
- }
32
- return undefined;
33
- },
34
- renderHTML: (attributes) => {
35
- return {
36
- "data-level": (attributes.level as number).toString(),
37
- };
38
- },
39
- },
40
- };
24
+ return propsToAttributes(headingPropSchema);
41
25
  },
42
26
 
43
27
  addInputRules() {
@@ -8,6 +8,7 @@ import {
8
8
  PropSchema,
9
9
  createBlockSpecFromStronglyTypedTiptapNode,
10
10
  createStronglyTypedTiptapNode,
11
+ propsToAttributes,
11
12
  } from "../../../schema/index.js";
12
13
  import { createDefaultBlockDOMOutputSpec } from "../../defaultBlockHelpers.js";
13
14
  import { defaultProps } from "../../defaultProps.js";
@@ -24,22 +25,9 @@ const checkListItemBlockContent = createStronglyTypedTiptapNode({
24
25
  name: "checkListItem",
25
26
  content: "inline*",
26
27
  group: "blockContent",
28
+
27
29
  addAttributes() {
28
- return {
29
- checked: {
30
- default: false,
31
- // instead of "checked" attributes, use "data-checked"
32
- parseHTML: (element) =>
33
- element.getAttribute("data-checked") === "true" || undefined,
34
- renderHTML: (attributes) => {
35
- return attributes.checked
36
- ? {
37
- "data-checked": (attributes.checked as boolean).toString(),
38
- }
39
- : {};
40
- },
41
- },
42
- };
30
+ return propsToAttributes(checkListItemPropSchema);
43
31
  },
44
32
 
45
33
  addInputRules() {