@blocknote/core 0.21.0 → 0.23.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 (444) hide show
  1. package/dist/blocknote.js +2320 -1692
  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/basicBlocks.html +1 -0
  16. package/src/api/clipboard/__snapshots__/internal/basicBlocksWithProps.html +1 -0
  17. package/src/api/clipboard/__snapshots__/internal/paragraphInCustomBlock.html +1 -0
  18. package/src/api/clipboard/clipboardExternal.test.ts +161 -0
  19. package/src/api/clipboard/{clipboard.test.ts → clipboardInternal.test.ts} +186 -38
  20. package/src/api/clipboard/testUtil.ts +27 -0
  21. package/src/api/clipboard/toClipboard/copyExtension.ts +1 -0
  22. package/src/api/exporters/html/__snapshots__/pageBreak/basic/external.html +1 -0
  23. package/src/api/exporters/html/__snapshots__/pageBreak/basic/internal.html +1 -0
  24. package/src/api/exporters/html/util/serializeBlocksExternalHTML.ts +7 -1
  25. package/src/api/exporters/html/util/serializeBlocksInternalHTML.ts +3 -1
  26. package/src/api/exporters/markdown/__snapshots__/pageBreak/basic/markdown.md +0 -0
  27. package/src/api/nodeConversions/__snapshots__/nodeConversions.test.ts.snap +16 -0
  28. package/src/api/nodeConversions/nodeToBlock.ts +4 -1
  29. package/src/api/parsers/html/__snapshots__/parse-codeblocks.json +62 -0
  30. package/src/api/parsers/html/parseHTML.test.ts +9 -0
  31. package/src/api/parsers/markdown/__snapshots__/pasted/styled.json +2 -2
  32. package/src/api/testUtil/cases/defaultSchema.ts +15 -1
  33. package/src/api/testUtil/partialBlockTestUtil.ts +4 -1
  34. package/src/blocks/CodeBlockContent/CodeBlockContent.ts +32 -11
  35. package/src/blocks/HeadingBlockContent/HeadingBlockContent.ts +3 -28
  36. package/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +1 -1
  37. package/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.ts +4 -16
  38. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts +11 -3
  39. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +26 -6
  40. package/src/blocks/PageBreakBlockContent/PageBreakBlockContent.ts +49 -0
  41. package/src/blocks/PageBreakBlockContent/getPageBreakSlashMenuItems.ts +45 -0
  42. package/src/blocks/PageBreakBlockContent/schema.ts +40 -0
  43. package/src/editor/Block.css +18 -4
  44. package/src/editor/BlockNoteEditor.test.ts +21 -1
  45. package/src/editor/BlockNoteEditor.ts +17 -0
  46. package/src/editor/BlockNoteExtensions.ts +111 -16
  47. package/src/editor/editor.css +28 -13
  48. package/src/editor/transformPasted.ts +57 -4
  49. package/src/extensions/SideMenu/SideMenuPlugin.ts +115 -23
  50. package/src/extensions/SideMenu/dragging.ts +0 -1
  51. package/src/extensions/SuggestionMenu/DefaultSuggestionItem.ts +1 -1
  52. package/src/i18n/locales/ar.ts +6 -0
  53. package/src/i18n/locales/de.ts +6 -0
  54. package/src/i18n/locales/en.ts +6 -0
  55. package/src/i18n/locales/es.ts +6 -0
  56. package/src/i18n/locales/fr.ts +47 -17
  57. package/src/i18n/locales/hr.ts +72 -54
  58. package/src/i18n/locales/index.ts +1 -0
  59. package/src/i18n/locales/is.ts +6 -0
  60. package/src/i18n/locales/it.ts +315 -0
  61. package/src/i18n/locales/ja.ts +6 -0
  62. package/src/i18n/locales/ko.ts +6 -0
  63. package/src/i18n/locales/nl.ts +6 -0
  64. package/src/i18n/locales/pl.ts +6 -0
  65. package/src/i18n/locales/pt.ts +6 -0
  66. package/src/i18n/locales/ru.ts +6 -0
  67. package/src/i18n/locales/vi.ts +6 -0
  68. package/src/i18n/locales/zh.ts +6 -0
  69. package/src/index.ts +3 -0
  70. package/src/schema/blocks/createSpec.ts +1 -1
  71. package/src/schema/blocks/internal.ts +16 -6
  72. package/src/schema/inlineContent/internal.ts +4 -1
  73. package/src/schema/propTypes.ts +41 -18
  74. package/types/src/api/blockManipulation/setupTestEnv.d.ts +8 -0
  75. package/types/src/api/clipboard/clipboardInternal.test.d.ts +1 -0
  76. package/types/src/api/clipboard/testUtil.d.ts +509 -0
  77. package/types/src/api/testUtil/cases/customBlocks.d.ts +8 -0
  78. package/types/src/api/testUtil/cases/customInlineContent.d.ts +8 -0
  79. package/types/src/api/testUtil/cases/customStyles.d.ts +8 -0
  80. package/types/src/api/testUtil/cases/defaultSchema.d.ts +2 -1
  81. package/types/src/blocks/CodeBlockContent/CodeBlockContent.d.ts +2 -0
  82. package/types/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.d.ts +12 -0
  83. package/types/src/blocks/PageBreakBlockContent/PageBreakBlockContent.d.ts +31 -0
  84. package/types/src/blocks/PageBreakBlockContent/getPageBreakSlashMenuItems.d.ts +8 -0
  85. package/types/src/blocks/PageBreakBlockContent/schema.d.ts +86 -0
  86. package/types/src/blocks/defaultBlocks.d.ts +16 -0
  87. package/types/src/editor/BlockNoteEditor.d.ts +15 -0
  88. package/types/src/editor/BlockNoteExtensions.d.ts +2 -0
  89. package/types/src/editor/transformPasted.d.ts +8 -4
  90. package/types/src/extensions/SideMenu/SideMenuPlugin.d.ts +25 -5
  91. package/types/src/extensions/SuggestionMenu/DefaultSuggestionItem.d.ts +1 -1
  92. package/types/src/i18n/locales/de.d.ts +6 -0
  93. package/types/src/i18n/locales/en.d.ts +6 -0
  94. package/types/src/i18n/locales/es.d.ts +6 -0
  95. package/types/src/i18n/locales/hr.d.ts +6 -0
  96. package/types/src/i18n/locales/index.d.ts +1 -0
  97. package/types/src/i18n/locales/it.d.ts +245 -0
  98. package/types/src/index.d.ts +3 -0
  99. package/types/src/schema/propTypes.d.ts +20 -2
  100. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js +0 -30
  101. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js.map +0 -1
  102. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js +0 -99
  103. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js.map +0 -1
  104. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js +0 -97
  105. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js.map +0 -1
  106. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js +0 -88
  107. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js.map +0 -1
  108. package/dist/src/api/blockManipulation/commands/moveBlocks/moveBlocks.js +0 -219
  109. package/dist/src/api/blockManipulation/commands/moveBlocks/moveBlocks.js.map +0 -1
  110. package/dist/src/api/blockManipulation/commands/moveBlocks/moveBlocks.test.js +0 -175
  111. package/dist/src/api/blockManipulation/commands/moveBlocks/moveBlocks.test.js.map +0 -1
  112. package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js +0 -57
  113. package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js.map +0 -1
  114. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js +0 -5
  115. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js.map +0 -1
  116. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js +0 -31
  117. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js.map +0 -1
  118. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js +0 -71
  119. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js.map +0 -1
  120. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js +0 -157
  121. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js.map +0 -1
  122. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js +0 -27
  123. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js.map +0 -1
  124. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js +0 -67
  125. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js.map +0 -1
  126. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js +0 -148
  127. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js.map +0 -1
  128. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js +0 -252
  129. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js.map +0 -1
  130. package/dist/src/api/blockManipulation/getBlock/getBlock.js +0 -56
  131. package/dist/src/api/blockManipulation/getBlock/getBlock.js.map +0 -1
  132. package/dist/src/api/blockManipulation/insertContentAt.js +0 -64
  133. package/dist/src/api/blockManipulation/insertContentAt.js.map +0 -1
  134. package/dist/src/api/blockManipulation/selections/selection.js +0 -149
  135. package/dist/src/api/blockManipulation/selections/selection.js.map +0 -1
  136. package/dist/src/api/blockManipulation/selections/selection.test.js +0 -39
  137. package/dist/src/api/blockManipulation/selections/selection.test.js.map +0 -1
  138. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js +0 -79
  139. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js.map +0 -1
  140. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js +0 -33
  141. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js.map +0 -1
  142. package/dist/src/api/blockManipulation/setupTestEnv.js +0 -172
  143. package/dist/src/api/blockManipulation/setupTestEnv.js.map +0 -1
  144. package/dist/src/api/clipboard/clipboard.test.js +0 -249
  145. package/dist/src/api/clipboard/clipboard.test.js.map +0 -1
  146. package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js +0 -8
  147. package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js.map +0 -1
  148. package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js +0 -38
  149. package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js.map +0 -1
  150. package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js +0 -111
  151. package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js.map +0 -1
  152. package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js +0 -25
  153. package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js.map +0 -1
  154. package/dist/src/api/clipboard/fromClipboard/pasteExtension.js +0 -57
  155. package/dist/src/api/clipboard/fromClipboard/pasteExtension.js.map +0 -1
  156. package/dist/src/api/clipboard/toClipboard/copyExtension.js +0 -134
  157. package/dist/src/api/clipboard/toClipboard/copyExtension.js.map +0 -1
  158. package/dist/src/api/exporters/html/externalHTMLExporter.js +0 -35
  159. package/dist/src/api/exporters/html/externalHTMLExporter.js.map +0 -1
  160. package/dist/src/api/exporters/html/htmlConversion.test.js +0 -72
  161. package/dist/src/api/exporters/html/htmlConversion.test.js.map +0 -1
  162. package/dist/src/api/exporters/html/internalHTMLSerializer.js +0 -21
  163. package/dist/src/api/exporters/html/internalHTMLSerializer.js.map +0 -1
  164. package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js +0 -141
  165. package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js.map +0 -1
  166. package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js +0 -96
  167. package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js.map +0 -1
  168. package/dist/src/api/exporters/markdown/markdownExporter.js +0 -31
  169. package/dist/src/api/exporters/markdown/markdownExporter.js.map +0 -1
  170. package/dist/src/api/exporters/markdown/markdownExporter.test.js +0 -57
  171. package/dist/src/api/exporters/markdown/markdownExporter.test.js.map +0 -1
  172. package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js +0 -33
  173. package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js.map +0 -1
  174. package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js +0 -37
  175. package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js.map +0 -1
  176. package/dist/src/api/getBlockInfoFromPos.js +0 -165
  177. package/dist/src/api/getBlockInfoFromPos.js.map +0 -1
  178. package/dist/src/api/nodeConversions/blockToNode.js +0 -197
  179. package/dist/src/api/nodeConversions/blockToNode.js.map +0 -1
  180. package/dist/src/api/nodeConversions/fragmentToBlocks.js +0 -50
  181. package/dist/src/api/nodeConversions/fragmentToBlocks.js.map +0 -1
  182. package/dist/src/api/nodeConversions/nodeConversions.test.js +0 -54
  183. package/dist/src/api/nodeConversions/nodeConversions.test.js.map +0 -1
  184. package/dist/src/api/nodeConversions/nodeToBlock.js +0 -316
  185. package/dist/src/api/nodeConversions/nodeToBlock.js.map +0 -1
  186. package/dist/src/api/nodeUtil.js +0 -28
  187. package/dist/src/api/nodeUtil.js.map +0 -1
  188. package/dist/src/api/parsers/html/parseHTML.js +0 -19
  189. package/dist/src/api/parsers/html/parseHTML.js.map +0 -1
  190. package/dist/src/api/parsers/html/parseHTML.test.js +0 -470
  191. package/dist/src/api/parsers/html/parseHTML.test.js.map +0 -1
  192. package/dist/src/api/parsers/html/util/nestedLists.js +0 -106
  193. package/dist/src/api/parsers/html/util/nestedLists.js.map +0 -1
  194. package/dist/src/api/parsers/html/util/nestedLists.test.js +0 -166
  195. package/dist/src/api/parsers/html/util/nestedLists.test.js.map +0 -1
  196. package/dist/src/api/parsers/markdown/parseMarkdown.js +0 -52
  197. package/dist/src/api/parsers/markdown/parseMarkdown.js.map +0 -1
  198. package/dist/src/api/parsers/markdown/parseMarkdown.test.js +0 -112
  199. package/dist/src/api/parsers/markdown/parseMarkdown.test.js.map +0 -1
  200. package/dist/src/api/testUtil/cases/customBlocks.js +0 -313
  201. package/dist/src/api/testUtil/cases/customBlocks.js.map +0 -1
  202. package/dist/src/api/testUtil/cases/customInlineContent.js +0 -91
  203. package/dist/src/api/testUtil/cases/customInlineContent.js.map +0 -1
  204. package/dist/src/api/testUtil/cases/customStyles.js +0 -83
  205. package/dist/src/api/testUtil/cases/customStyles.js.map +0 -1
  206. package/dist/src/api/testUtil/cases/defaultSchema.js +0 -673
  207. package/dist/src/api/testUtil/cases/defaultSchema.js.map +0 -1
  208. package/dist/src/api/testUtil/index.js +0 -2
  209. package/dist/src/api/testUtil/index.js.map +0 -1
  210. package/dist/src/api/testUtil/partialBlockTestUtil.js +0 -114
  211. package/dist/src/api/testUtil/partialBlockTestUtil.js.map +0 -1
  212. package/dist/src/api/testUtil/paste.js +0 -29
  213. package/dist/src/api/testUtil/paste.js.map +0 -1
  214. package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js +0 -104
  215. package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js.map +0 -1
  216. package/dist/src/blocks/AudioBlockContent/parseAudioElement.js +0 -5
  217. package/dist/src/blocks/AudioBlockContent/parseAudioElement.js.map +0 -1
  218. package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js +0 -281
  219. package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js.map +0 -1
  220. package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js +0 -110
  221. package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js.map +0 -1
  222. package/dist/src/blocks/FileBlockContent/FileBlockContent.js +0 -71
  223. package/dist/src/blocks/FileBlockContent/FileBlockContent.js.map +0 -1
  224. package/dist/src/blocks/FileBlockContent/helpers/parse/parseEmbedElement.js +0 -5
  225. package/dist/src/blocks/FileBlockContent/helpers/parse/parseEmbedElement.js.map +0 -1
  226. package/dist/src/blocks/FileBlockContent/helpers/parse/parseFigureElement.js +0 -10
  227. package/dist/src/blocks/FileBlockContent/helpers/parse/parseFigureElement.js.map +0 -1
  228. package/dist/src/blocks/FileBlockContent/helpers/render/createAddFileButton.js +0 -39
  229. package/dist/src/blocks/FileBlockContent/helpers/render/createAddFileButton.js.map +0 -1
  230. package/dist/src/blocks/FileBlockContent/helpers/render/createFileBlockWrapper.js +0 -51
  231. package/dist/src/blocks/FileBlockContent/helpers/render/createFileBlockWrapper.js.map +0 -1
  232. package/dist/src/blocks/FileBlockContent/helpers/render/createFileNameWithIcon.js +0 -17
  233. package/dist/src/blocks/FileBlockContent/helpers/render/createFileNameWithIcon.js.map +0 -1
  234. package/dist/src/blocks/FileBlockContent/helpers/render/createResizableFileBlockWrapper.js +0 -147
  235. package/dist/src/blocks/FileBlockContent/helpers/render/createResizableFileBlockWrapper.js.map +0 -1
  236. package/dist/src/blocks/FileBlockContent/helpers/toExternalHTML/createFigureWithCaption.js +0 -9
  237. package/dist/src/blocks/FileBlockContent/helpers/toExternalHTML/createFigureWithCaption.js.map +0 -1
  238. package/dist/src/blocks/FileBlockContent/helpers/toExternalHTML/createLinkWithCaption.js +0 -11
  239. package/dist/src/blocks/FileBlockContent/helpers/toExternalHTML/createLinkWithCaption.js.map +0 -1
  240. package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js +0 -15
  241. package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js.map +0 -1
  242. package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js +0 -145
  243. package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js.map +0 -1
  244. package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js +0 -114
  245. package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js.map +0 -1
  246. package/dist/src/blocks/ImageBlockContent/parseImageElement.js +0 -6
  247. package/dist/src/blocks/ImageBlockContent/parseImageElement.js.map +0 -1
  248. package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js +0 -113
  249. package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js.map +0 -1
  250. package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js +0 -224
  251. package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js.map +0 -1
  252. package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js +0 -45
  253. package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js.map +0 -1
  254. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js +0 -58
  255. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js.map +0 -1
  256. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js +0 -130
  257. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js.map +0 -1
  258. package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js +0 -52
  259. package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js.map +0 -1
  260. package/dist/src/blocks/TableBlockContent/TableBlockContent.js +0 -129
  261. package/dist/src/blocks/TableBlockContent/TableBlockContent.js.map +0 -1
  262. package/dist/src/blocks/TableBlockContent/TableExtension.js +0 -64
  263. package/dist/src/blocks/TableBlockContent/TableExtension.js.map +0 -1
  264. package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js +0 -114
  265. package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js.map +0 -1
  266. package/dist/src/blocks/VideoBlockContent/parseVideoElement.js +0 -6
  267. package/dist/src/blocks/VideoBlockContent/parseVideoElement.js.map +0 -1
  268. package/dist/src/blocks/defaultBlockHelpers.js +0 -50
  269. package/dist/src/blocks/defaultBlockHelpers.js.map +0 -1
  270. package/dist/src/blocks/defaultBlockTypeGuards.js +0 -40
  271. package/dist/src/blocks/defaultBlockTypeGuards.js.map +0 -1
  272. package/dist/src/blocks/defaultBlocks.js +0 -50
  273. package/dist/src/blocks/defaultBlocks.js.map +0 -1
  274. package/dist/src/blocks/defaultProps.js +0 -19
  275. package/dist/src/blocks/defaultProps.js.map +0 -1
  276. package/dist/src/editor/BlockNoteEditor.js +0 -751
  277. package/dist/src/editor/BlockNoteEditor.js.map +0 -1
  278. package/dist/src/editor/BlockNoteEditor.test.js +0 -65
  279. package/dist/src/editor/BlockNoteEditor.test.js.map +0 -1
  280. package/dist/src/editor/BlockNoteExtensions.js +0 -192
  281. package/dist/src/editor/BlockNoteExtensions.js.map +0 -1
  282. package/dist/src/editor/BlockNoteSchema.js +0 -38
  283. package/dist/src/editor/BlockNoteSchema.js.map +0 -1
  284. package/dist/src/editor/BlockNoteTipTapEditor.js +0 -169
  285. package/dist/src/editor/BlockNoteTipTapEditor.js.map +0 -1
  286. package/dist/src/editor/cursorPositionTypes.js +0 -2
  287. package/dist/src/editor/cursorPositionTypes.js.map +0 -1
  288. package/dist/src/editor/defaultColors.js +0 -77
  289. package/dist/src/editor/defaultColors.js.map +0 -1
  290. package/dist/src/editor/selectionTypes.js +0 -2
  291. package/dist/src/editor/selectionTypes.js.map +0 -1
  292. package/dist/src/editor/transformPasted.js +0 -79
  293. package/dist/src/editor/transformPasted.js.map +0 -1
  294. package/dist/src/exporter/Exporter.js +0 -36
  295. package/dist/src/exporter/Exporter.js.map +0 -1
  296. package/dist/src/exporter/index.js +0 -3
  297. package/dist/src/exporter/index.js.map +0 -1
  298. package/dist/src/exporter/mapping.js +0 -12
  299. package/dist/src/exporter/mapping.js.map +0 -1
  300. package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js +0 -30
  301. package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js.map +0 -1
  302. package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js +0 -39
  303. package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js.map +0 -1
  304. package/dist/src/extensions/FilePanel/FilePanelPlugin.js +0 -131
  305. package/dist/src/extensions/FilePanel/FilePanelPlugin.js.map +0 -1
  306. package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js +0 -197
  307. package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js.map +0 -1
  308. package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js +0 -341
  309. package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js.map +0 -1
  310. package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js +0 -251
  311. package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js.map +0 -1
  312. package/dist/src/extensions/LinkToolbar/protocols.js +0 -14
  313. package/dist/src/extensions/LinkToolbar/protocols.js.map +0 -1
  314. package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js +0 -54
  315. package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js.map +0 -1
  316. package/dist/src/extensions/Placeholder/PlaceholderPlugin.js +0 -90
  317. package/dist/src/extensions/Placeholder/PlaceholderPlugin.js.map +0 -1
  318. package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js +0 -187
  319. package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js.map +0 -1
  320. package/dist/src/extensions/SideMenu/MultipleNodeSelection.js +0 -68
  321. package/dist/src/extensions/SideMenu/MultipleNodeSelection.js.map +0 -1
  322. package/dist/src/extensions/SideMenu/SideMenuPlugin.js +0 -347
  323. package/dist/src/extensions/SideMenu/SideMenuPlugin.js.map +0 -1
  324. package/dist/src/extensions/SideMenu/dragging.js +0 -135
  325. package/dist/src/extensions/SideMenu/dragging.js.map +0 -1
  326. package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js +0 -2
  327. package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js.map +0 -1
  328. package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js +0 -2
  329. package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js.map +0 -1
  330. package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js +0 -245
  331. package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js.map +0 -1
  332. package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js +0 -26
  333. package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js.map +0 -1
  334. package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js +0 -241
  335. package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js.map +0 -1
  336. package/dist/src/extensions/TableHandles/TableHandlesPlugin.js +0 -579
  337. package/dist/src/extensions/TableHandles/TableHandlesPlugin.js.map +0 -1
  338. package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js +0 -36
  339. package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js.map +0 -1
  340. package/dist/src/extensions/TextColor/TextColorExtension.js +0 -29
  341. package/dist/src/extensions/TextColor/TextColorExtension.js.map +0 -1
  342. package/dist/src/extensions/TextColor/TextColorMark.js +0 -37
  343. package/dist/src/extensions/TextColor/TextColorMark.js.map +0 -1
  344. package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js +0 -58
  345. package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js.map +0 -1
  346. package/dist/src/extensions/UniqueID/UniqueID.js +0 -283
  347. package/dist/src/extensions/UniqueID/UniqueID.js.map +0 -1
  348. package/dist/src/extensions/getDraggableBlockFromElement.js +0 -13
  349. package/dist/src/extensions/getDraggableBlockFromElement.js.map +0 -1
  350. package/dist/src/extensions-shared/UiElementPosition.js +0 -2
  351. package/dist/src/extensions-shared/UiElementPosition.js.map +0 -1
  352. package/dist/src/i18n/dictionary.js +0 -4
  353. package/dist/src/i18n/dictionary.js.map +0 -1
  354. package/dist/src/i18n/locales/ar.js +0 -298
  355. package/dist/src/i18n/locales/ar.js.map +0 -1
  356. package/dist/src/i18n/locales/de.js +0 -313
  357. package/dist/src/i18n/locales/de.js.map +0 -1
  358. package/dist/src/i18n/locales/en.js +0 -314
  359. package/dist/src/i18n/locales/en.js.map +0 -1
  360. package/dist/src/i18n/locales/es.js +0 -312
  361. package/dist/src/i18n/locales/es.js.map +0 -1
  362. package/dist/src/i18n/locales/fr.js +0 -313
  363. package/dist/src/i18n/locales/fr.js.map +0 -1
  364. package/dist/src/i18n/locales/hr.js +0 -308
  365. package/dist/src/i18n/locales/hr.js.map +0 -1
  366. package/dist/src/i18n/locales/index.js +0 -16
  367. package/dist/src/i18n/locales/index.js.map +0 -1
  368. package/dist/src/i18n/locales/is.js +0 -305
  369. package/dist/src/i18n/locales/is.js.map +0 -1
  370. package/dist/src/i18n/locales/ja.js +0 -333
  371. package/dist/src/i18n/locales/ja.js.map +0 -1
  372. package/dist/src/i18n/locales/ko.js +0 -326
  373. package/dist/src/i18n/locales/ko.js.map +0 -1
  374. package/dist/src/i18n/locales/nl.js +0 -313
  375. package/dist/src/i18n/locales/nl.js.map +0 -1
  376. package/dist/src/i18n/locales/pl.js +0 -297
  377. package/dist/src/i18n/locales/pl.js.map +0 -1
  378. package/dist/src/i18n/locales/pt.js +0 -305
  379. package/dist/src/i18n/locales/pt.js.map +0 -1
  380. package/dist/src/i18n/locales/ru.js +0 -340
  381. package/dist/src/i18n/locales/ru.js.map +0 -1
  382. package/dist/src/i18n/locales/vi.js +0 -312
  383. package/dist/src/i18n/locales/vi.js.map +0 -1
  384. package/dist/src/i18n/locales/zh.js +0 -346
  385. package/dist/src/i18n/locales/zh.js.map +0 -1
  386. package/dist/src/index.js +0 -63
  387. package/dist/src/index.js.map +0 -1
  388. package/dist/src/pm-nodes/BlockContainer.js +0 -72
  389. package/dist/src/pm-nodes/BlockContainer.js.map +0 -1
  390. package/dist/src/pm-nodes/BlockGroup.js +0 -43
  391. package/dist/src/pm-nodes/BlockGroup.js.map +0 -1
  392. package/dist/src/pm-nodes/Doc.js +0 -7
  393. package/dist/src/pm-nodes/Doc.js.map +0 -1
  394. package/dist/src/pm-nodes/index.js +0 -4
  395. package/dist/src/pm-nodes/index.js.map +0 -1
  396. package/dist/src/schema/blocks/createSpec.js +0 -126
  397. package/dist/src/schema/blocks/createSpec.js.map +0 -1
  398. package/dist/src/schema/blocks/internal.js +0 -147
  399. package/dist/src/schema/blocks/internal.js.map +0 -1
  400. package/dist/src/schema/blocks/types.js +0 -2
  401. package/dist/src/schema/blocks/types.js.map +0 -1
  402. package/dist/src/schema/index.js +0 -11
  403. package/dist/src/schema/index.js.map +0 -1
  404. package/dist/src/schema/inlineContent/createSpec.js +0 -64
  405. package/dist/src/schema/inlineContent/createSpec.js.map +0 -1
  406. package/dist/src/schema/inlineContent/internal.js +0 -52
  407. package/dist/src/schema/inlineContent/internal.js.map +0 -1
  408. package/dist/src/schema/inlineContent/types.js +0 -10
  409. package/dist/src/schema/inlineContent/types.js.map +0 -1
  410. package/dist/src/schema/propTypes.js +0 -2
  411. package/dist/src/schema/propTypes.js.map +0 -1
  412. package/dist/src/schema/styles/createSpec.js +0 -48
  413. package/dist/src/schema/styles/createSpec.js.map +0 -1
  414. package/dist/src/schema/styles/internal.js +0 -53
  415. package/dist/src/schema/styles/internal.js.map +0 -1
  416. package/dist/src/schema/styles/types.js +0 -2
  417. package/dist/src/schema/styles/types.js.map +0 -1
  418. package/dist/src/util/EventEmitter.js +0 -33
  419. package/dist/src/util/EventEmitter.js.map +0 -1
  420. package/dist/src/util/browser.js +0 -17
  421. package/dist/src/util/browser.js.map +0 -1
  422. package/dist/src/util/combineByGroup.js +0 -20
  423. package/dist/src/util/combineByGroup.js.map +0 -1
  424. package/dist/src/util/esmDependencies.js +0 -35
  425. package/dist/src/util/esmDependencies.js.map +0 -1
  426. package/dist/src/util/string.js +0 -14
  427. package/dist/src/util/string.js.map +0 -1
  428. package/dist/src/util/typescript.js +0 -12
  429. package/dist/src/util/typescript.js.map +0 -1
  430. /package/src/api/clipboard/__snapshots__/{childToParent.html → internal/childToParent.html} +0 -0
  431. /package/src/api/clipboard/__snapshots__/{childrenToNextParent.html → internal/childrenToNextParent.html} +0 -0
  432. /package/src/api/clipboard/__snapshots__/{childrenToNextParentsChildren.html → internal/childrenToNextParentsChildren.html} +0 -0
  433. /package/src/api/clipboard/__snapshots__/{image.html → internal/image.html} +0 -0
  434. /package/src/api/clipboard/__snapshots__/{multipleChildren.html → internal/multipleChildren.html} +0 -0
  435. /package/src/api/clipboard/__snapshots__/{multipleStyledText.html → internal/multipleStyledText.html} +0 -0
  436. /package/src/api/clipboard/__snapshots__/{nestedImage.html → internal/nestedImage.html} +0 -0
  437. /package/src/api/clipboard/__snapshots__/{partialChildToParent.html → internal/partialChildToParent.html} +0 -0
  438. /package/src/api/clipboard/__snapshots__/{styledText.html → internal/styledText.html} +0 -0
  439. /package/src/api/clipboard/__snapshots__/{tableAllCells.html → internal/tableAllCells.html} +0 -0
  440. /package/src/api/clipboard/__snapshots__/{tableCell.html → internal/tableCell.html} +0 -0
  441. /package/src/api/clipboard/__snapshots__/{tableCellText.html → internal/tableCellText.html} +0 -0
  442. /package/src/api/clipboard/__snapshots__/{tableRow.html → internal/tableRow.html} +0 -0
  443. /package/src/api/clipboard/__snapshots__/{unstyledText.html → internal/unstyledText.html} +0 -0
  444. /package/types/src/api/clipboard/{clipboard.test.d.ts → clipboardExternal.test.d.ts} +0 -0
@@ -114,13 +114,13 @@ NESTED BLOCKS
114
114
  }
115
115
 
116
116
  /* HEADINGS*/
117
- [data-level="1"] {
117
+ [data-content-type="heading"] {
118
118
  --level: 3em;
119
119
  }
120
- [data-level="2"] {
120
+ [data-content-type="heading"][data-level="2"] {
121
121
  --level: 2em;
122
122
  }
123
- [data-level="3"] {
123
+ [data-content-type="heading"][data-level="3"] {
124
124
  --level: 1.3em;
125
125
  }
126
126
 
@@ -308,6 +308,20 @@ NESTED BLOCKS
308
308
  transition-delay: 0.1s;
309
309
  }
310
310
 
311
+ /* PAGE BREAK */
312
+ .bn-block-content[data-content-type="pageBreak"] > div {
313
+ width: 100%;
314
+ height: 0;
315
+ border-top: dotted rgb(125, 121, 122) 2px;
316
+ margin-block: 11px;
317
+ }
318
+
319
+ @media print {
320
+ .bn-block-content[data-content-type="pageBreak"] > div {
321
+ page-break-after: always;
322
+ }
323
+ }
324
+
311
325
  /* FILES */
312
326
 
313
327
  /* Element that wraps content for all file blocks */
@@ -336,7 +350,7 @@ NESTED BLOCKS
336
350
 
337
351
  .bn-editor[contenteditable="true"] [data-file-block] .bn-add-file-button:hover,
338
352
  [data-file-block] .bn-file-name-with-icon:hover,
339
- .ProseMirror-selectednode .bn-file-name-with-icon{
353
+ .ProseMirror-selectednode .bn-file-name-with-icon {
340
354
  background-color: rgb(225, 225, 225);
341
355
  }
342
356
 
@@ -71,6 +71,26 @@ it("adds id attribute when requested", async () => {
71
71
  );
72
72
  editor.replaceBlocks(editor.document, blocks);
73
73
  expect(await editor.blocksToFullHTML(editor.document)).toMatchInlineSnapshot(
74
- `"<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1" id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1" id="1"><div class="bn-block-content" data-content-type="paragraph"><p class="bn-inline-content">This is a normal text</p></div></div></div><div class="bn-block-outer" data-node-type="blockOuter" data-id="2" id="2"><div class="bn-block" data-node-type="blockContainer" data-id="2" id="2"><div class="bn-block-content" data-content-type="heading" data-level="1"><h1 class="bn-inline-content">And this is a large heading</h1></div></div></div></div>"`
74
+ `"<div class="bn-block-group" data-node-type="blockGroup"><div class="bn-block-outer" data-node-type="blockOuter" data-id="1" id="1"><div class="bn-block" data-node-type="blockContainer" data-id="1" id="1"><div class="bn-block-content" data-content-type="paragraph"><p class="bn-inline-content">This is a normal text</p></div></div></div><div class="bn-block-outer" data-node-type="blockOuter" data-id="2" id="2"><div class="bn-block" data-node-type="blockContainer" data-id="2" id="2"><div class="bn-block-content" data-content-type="heading"><h1 class="bn-inline-content">And this is a large heading</h1></div></div></div></div>"`
75
75
  );
76
76
  });
77
+
78
+ it("block prop types", () => {
79
+ // this test checks whether the block props are correctly typed in typescript
80
+ const editor = BlockNoteEditor.create();
81
+ const block = editor.document[0];
82
+ if (block.type === "paragraph") {
83
+ // @ts-expect-error
84
+ const level = block.props.level; // doesn't have level prop
85
+
86
+ // eslint-disable-next-line
87
+ expect(level).toBe(undefined);
88
+ }
89
+
90
+ if (block.type === "heading") {
91
+ const level = block.props.level; // does have level prop
92
+
93
+ // eslint-disable-next-line
94
+ expect(level).toBe(1);
95
+ }
96
+ });
@@ -196,6 +196,13 @@ export type BlockNoteEditorOptions<
196
196
  * Optional function to customize how cursors of users are rendered
197
197
  */
198
198
  renderCursor?: (user: any) => HTMLElement;
199
+ /**
200
+ * Optional flag to set when the user label should be shown with the default
201
+ * collaboration cursor. Setting to "always" will always show the label,
202
+ * while "activity" will only show the label when the user moves the cursor
203
+ * or types. Defaults to "activity".
204
+ */
205
+ showCursorLabels?: "always" | "activity";
199
206
  };
200
207
 
201
208
  /**
@@ -245,6 +252,15 @@ export type BlockNoteEditorOptions<
245
252
  @default "prefer-navigate-ui"
246
253
  */
247
254
  tabBehavior: "prefer-navigate-ui" | "prefer-indent";
255
+
256
+ /**
257
+ * The detection mode for showing the side menu - "viewport" always shows the
258
+ * side menu for the block next to the mouse cursor, while "editor" only shows
259
+ * it when hovering the editor or the side menu itself.
260
+ *
261
+ * @default "viewport"
262
+ */
263
+ sideMenuDetection: "viewport" | "editor";
248
264
  };
249
265
 
250
266
  const blockNoteTipTapOptions = {
@@ -423,6 +439,7 @@ export class BlockNoteEditor<
423
439
  dropCursor: this.options.dropCursor ?? dropCursor,
424
440
  placeholders: newOptions.placeholders,
425
441
  tabBehavior: newOptions.tabBehavior,
442
+ sideMenuDetection: newOptions.sideMenuDetection || "viewport",
426
443
  });
427
444
 
428
445
  // add extensions from _tiptapOptions
@@ -1,4 +1,5 @@
1
1
  import { AnyExtension, Extension, extensions } from "@tiptap/core";
2
+ import { Awareness } from "y-protocols/awareness";
2
3
 
3
4
  import type { BlockNoteEditor, BlockNoteExtension } from "./BlockNoteEditor.js";
4
5
 
@@ -64,6 +65,7 @@ type ExtensionOptions<
64
65
  };
65
66
  provider: any;
66
67
  renderCursor?: (user: any) => HTMLElement;
68
+ showCursorLabels?: "always" | "activity";
67
69
  };
68
70
  disableExtensions: string[] | undefined;
69
71
  setIdAttribute?: boolean;
@@ -72,6 +74,7 @@ type ExtensionOptions<
72
74
  dropCursor: (opts: any) => Plugin;
73
75
  placeholders: Record<string | "default", string>;
74
76
  tabBehavior?: "prefer-navigate-ui" | "prefer-indent";
77
+ sideMenuDetection: "viewport" | "editor";
75
78
  };
76
79
 
77
80
  /**
@@ -97,7 +100,10 @@ export const getBlockNoteExtensions = <
97
100
  opts.editor
98
101
  );
99
102
  ret["linkToolbar"] = new LinkToolbarProsemirrorPlugin(opts.editor);
100
- ret["sideMenu"] = new SideMenuProsemirrorPlugin(opts.editor);
103
+ ret["sideMenu"] = new SideMenuProsemirrorPlugin(
104
+ opts.editor,
105
+ opts.sideMenuDetection
106
+ );
101
107
  ret["suggestionMenus"] = new SuggestionMenuProseMirrorPlugin(opts.editor);
102
108
  ret["filePanel"] = new FilePanelProsemirrorPlugin(opts.editor as any);
103
109
  ret["placeholder"] = new PlaceholderPlugin(opts.editor, opts.placeholders);
@@ -246,25 +252,114 @@ const getTipTapExtensions = <
246
252
  fragment: opts.collaboration.fragment,
247
253
  })
248
254
  );
249
- if (opts.collaboration.provider?.awareness) {
250
- const defaultRender = (user: { color: string; name: string }) => {
251
- const cursor = document.createElement("span");
252
255
 
253
- cursor.classList.add("collaboration-cursor__caret");
254
- cursor.setAttribute("style", `border-color: ${user.color}`);
256
+ const awareness = opts.collaboration?.provider.awareness as Awareness;
257
+
258
+ if (awareness) {
259
+ const cursors = new Map<
260
+ number,
261
+ { element: HTMLElement; hideTimeout: NodeJS.Timeout | undefined }
262
+ >();
263
+
264
+ if (opts.collaboration.showCursorLabels !== "always") {
265
+ awareness.on(
266
+ "change",
267
+ ({
268
+ updated,
269
+ }: {
270
+ added: Array<number>;
271
+ updated: Array<number>;
272
+ removed: Array<number>;
273
+ }) => {
274
+ for (const clientID of updated) {
275
+ const cursor = cursors.get(clientID);
276
+
277
+ if (cursor) {
278
+ cursor.element.setAttribute("data-active", "");
279
+
280
+ if (cursor.hideTimeout) {
281
+ clearTimeout(cursor.hideTimeout);
282
+ }
283
+
284
+ cursors.set(clientID, {
285
+ element: cursor.element,
286
+ hideTimeout: setTimeout(() => {
287
+ cursor.element.removeAttribute("data-active");
288
+ }, 2000),
289
+ });
290
+ }
291
+ }
292
+ }
293
+ );
294
+ }
295
+
296
+ const createCursor = (clientID: number, name: string, color: string) => {
297
+ const cursorElement = document.createElement("span");
298
+
299
+ cursorElement.classList.add("collaboration-cursor__caret");
300
+ cursorElement.setAttribute("style", `border-color: ${color}`);
301
+ if (opts.collaboration?.showCursorLabels === "always") {
302
+ cursorElement.setAttribute("data-active", "");
303
+ }
304
+
305
+ const labelElement = document.createElement("span");
306
+
307
+ labelElement.classList.add("collaboration-cursor__label");
308
+ labelElement.setAttribute("style", `background-color: ${color}`);
309
+ labelElement.insertBefore(document.createTextNode(name), null);
310
+
311
+ cursorElement.insertBefore(document.createTextNode("\u2060"), null); // Non-breaking space
312
+ cursorElement.insertBefore(labelElement, null);
313
+ cursorElement.insertBefore(document.createTextNode("\u2060"), null); // Non-breaking space
314
+
315
+ cursors.set(clientID, {
316
+ element: cursorElement,
317
+ hideTimeout: undefined,
318
+ });
319
+
320
+ if (opts.collaboration?.showCursorLabels !== "always") {
321
+ cursorElement.addEventListener("mouseenter", () => {
322
+ const cursor = cursors.get(clientID)!;
323
+ cursor.element.setAttribute("data-active", "");
324
+
325
+ if (cursor.hideTimeout) {
326
+ clearTimeout(cursor.hideTimeout);
327
+ cursors.set(clientID, {
328
+ element: cursor.element,
329
+ hideTimeout: undefined,
330
+ });
331
+ }
332
+ });
333
+
334
+ cursorElement.addEventListener("mouseleave", () => {
335
+ const cursor = cursors.get(clientID)!;
336
+
337
+ cursors.set(clientID, {
338
+ element: cursor.element,
339
+ hideTimeout: setTimeout(() => {
340
+ cursor.element.removeAttribute("data-active");
341
+ }, 2000),
342
+ });
343
+ });
344
+ }
345
+
346
+ return cursors.get(clientID)!;
347
+ };
348
+
349
+ const defaultRender = (user: { color: string; name: string }) => {
350
+ const clientState = [...awareness.getStates().entries()].find(
351
+ (state) => state[1].user === user
352
+ );
255
353
 
256
- const label = document.createElement("span");
354
+ if (!clientState) {
355
+ throw new Error("Could not find client state for user");
356
+ }
257
357
 
258
- label.classList.add("collaboration-cursor__label");
259
- label.setAttribute("style", `background-color: ${user.color}`);
260
- label.insertBefore(document.createTextNode(user.name), null);
358
+ const clientID = clientState[0];
261
359
 
262
- const nonbreakingSpace1 = document.createTextNode("\u2060");
263
- const nonbreakingSpace2 = document.createTextNode("\u2060");
264
- cursor.insertBefore(nonbreakingSpace1, null);
265
- cursor.insertBefore(label, null);
266
- cursor.insertBefore(nonbreakingSpace2, null);
267
- return cursor;
360
+ return (
361
+ cursors.get(clientID) || createCursor(clientID, user.name, user.color)
362
+ ).element;
268
363
  };
269
364
  tiptapExtensions.push(
270
365
  CollaborationCursor.configure({
@@ -83,7 +83,6 @@ Tippy popups that are appended to document.body directly
83
83
  border-right: 1px solid #0d0d0d;
84
84
  margin-left: -1px;
85
85
  margin-right: -1px;
86
- pointer-events: none;
87
86
  position: relative;
88
87
  word-break: normal;
89
88
  white-space: nowrap !important;
@@ -92,24 +91,40 @@ Tippy popups that are appended to document.body directly
92
91
  /* Render the username above the caret */
93
92
  .collaboration-cursor__label {
94
93
  border-radius: 3px 3px 3px 0;
95
- color: #0d0d0d;
96
94
  font-size: 12px;
97
95
  font-style: normal;
98
96
  font-weight: 600;
99
- left: -1px;
100
97
  line-height: normal;
101
- padding: 0.1rem 0.3rem;
98
+ left: -1px;
99
+ overflow: hidden;
102
100
  position: absolute;
103
- top: -1.4em;
104
- user-select: none;
105
101
  white-space: nowrap;
102
+
103
+ color: transparent;
104
+ max-height: 4px;
105
+ max-width: 4px;
106
+ padding: 0;
107
+ top: 0;
108
+
109
+ transition: all 0.2s;
110
+
111
+ }
112
+
113
+ .collaboration-cursor__caret[data-active] > .collaboration-cursor__label {
114
+ color: #0d0d0d;
115
+ max-height: 1.1rem;
116
+ max-width: 20rem;
117
+ padding: 0.1rem 0.3rem;
118
+ top: -14px;
119
+
120
+ transition: all 0.2s;
106
121
  }
107
122
 
108
123
  /* .tableWrapper {
109
124
  padding
110
125
  } */
111
126
 
112
- .ProseMirror .tableWrapper {
127
+ .bn-editor [data-content-type="table"] .tableWrapper {
113
128
  position: relative;
114
129
  top: -16px;
115
130
  left: -16px;
@@ -119,7 +134,7 @@ Tippy popups that are appended to document.body directly
119
134
  overflow-y: hidden;
120
135
  }
121
136
 
122
- .ProseMirror .tableWrapper-inner {
137
+ .bn-editor [data-content-type="table"] .tableWrapper-inner {
123
138
  /* position: relative; */
124
139
  /* top: -16px;
125
140
  left: -16px; */
@@ -127,17 +142,17 @@ Tippy popups that are appended to document.body directly
127
142
  }
128
143
 
129
144
  /* table related: */
130
- .bn-editor table {
145
+ .bn-editor [data-content-type="table"] table {
131
146
  width: auto !important;
132
147
  word-break: break-word;
133
148
  }
134
- .bn-editor th,
135
- .bn-editor td {
149
+ .bn-editor [data-content-type="table"] th,
150
+ .bn-editor [data-content-type="table"] td {
136
151
  border: 1px solid #ddd;
137
- padding: 3px 5px;
152
+ padding: 5px 10px;
138
153
  }
139
154
 
140
- .bn-editor th {
155
+ .bn-editor [data-content-type="table"] th {
141
156
  font-weight: bold;
142
157
  text-align: left;
143
158
  }
@@ -1,6 +1,8 @@
1
1
  import { Fragment, Schema, Slice } from "@tiptap/pm/model";
2
2
  import { EditorView } from "@tiptap/pm/view";
3
3
 
4
+ import { getBlockInfoFromSelection } from "../api/getBlockInfoFromPos.js";
5
+
4
6
  // helper function to remove a child from a fragment
5
7
  function removeChild(node: Fragment, n: number) {
6
8
  const children: any[] = [];
@@ -49,16 +51,25 @@ export function wrapTableRows(f: Fragment, schema: Schema) {
49
51
  /**
50
52
  * fix for https://github.com/ProseMirror/prosemirror/issues/1430#issuecomment-1822570821
51
53
  *
52
- * Without this fix, pasting two paragraphs would cause the second one to be indented in the other
53
- * this fix wraps every element in the slice in it's own blockContainer, to prevent Prosemirror from nesting the
54
- * elements on paste.
54
+ * This fix wraps pasted ProseMirror nodes in their own `blockContainer` nodes
55
+ * in most cases. This is to ensure that ProseMirror inserts them as separate
56
+ * blocks, which it sometimes doesn't do because it doesn't have enough context
57
+ * about the hierarchy of the pasted nodes. The issue can be seen when pasting
58
+ * e.g. an image or two consecutive paragraphs, where PM tries to nest the
59
+ * pasted block(s) when it shouldn't.
55
60
  *
56
- * The exception is when we encounter blockGroups with listitems, because those actually should be nested
61
+ * However, the fix is not applied in a few cases. See `shouldApplyFix` for
62
+ * which cases are excluded.
57
63
  */
58
64
  export function transformPasted(slice: Slice, view: EditorView) {
59
65
  let f = Fragment.from(slice.content);
60
66
  f = wrapTableRows(f, view.state.schema);
61
67
 
68
+ if (!shouldApplyFix(f, view)) {
69
+ // Don't apply the fix.
70
+ return new Slice(f, slice.openStart, slice.openEnd);
71
+ }
72
+
62
73
  for (let i = 0; i < f.childCount; i++) {
63
74
  if (f.child(i).type.spec.group === "blockContent") {
64
75
  const content = [f.child(i)];
@@ -92,3 +103,45 @@ export function transformPasted(slice: Slice, view: EditorView) {
92
103
  }
93
104
  return new Slice(f, slice.openStart, slice.openEnd);
94
105
  }
106
+
107
+ /**
108
+ * Used in `transformPasted` to check if the fix there should be applied, i.e.
109
+ * if the pasted fragment should be wrapped in a `blockContainer` node. This
110
+ * will explicitly tell ProseMirror to treat it as a separate block.
111
+ */
112
+ function shouldApplyFix(fragment: Fragment, view: EditorView) {
113
+ const nodeHasSingleChild = fragment.childCount === 1;
114
+ const nodeHasInlineContent =
115
+ fragment.firstChild?.type.spec.content === "inline*";
116
+ const nodeHasTableContent =
117
+ fragment.firstChild?.type.spec.content === "tableRow+";
118
+
119
+ if (nodeHasSingleChild) {
120
+ if (nodeHasInlineContent) {
121
+ // Case when we paste a single node with inline content, e.g. a paragraph
122
+ // or heading. We want to insert the content in-line for better UX instead
123
+ // of a separate block, so we return false.
124
+ return false;
125
+ }
126
+
127
+ if (nodeHasTableContent) {
128
+ // Not ideal that we check selection here, as `transformPasted` is called
129
+ // for both paste and drop events. Drop events can potentially cause
130
+ // issues as they don't always happen at the current selection.
131
+ const blockInfo = getBlockInfoFromSelection(view.state);
132
+ if (blockInfo.isBlockContainer) {
133
+ const selectedBlockHasTableContent =
134
+ blockInfo.blockContent.node.type.spec.content === "tableRow+";
135
+
136
+ // Case for when we paste a single node with table content, i.e. a
137
+ // table. Normally, we return true as we want to ensure the table is
138
+ // inserted as a separate block. However, if the selection is in an
139
+ // existing table, we return false, as we want the content of the pasted
140
+ // table to be added to the existing one for better UX.
141
+ return !selectedBlockHasTableContent;
142
+ }
143
+ }
144
+ }
145
+
146
+ return true;
147
+ }