@blocknote/core 0.18.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (537) hide show
  1. package/README.md +2 -0
  2. package/dist/blocknote.js +3145 -2970
  3. package/dist/blocknote.js.map +1 -1
  4. package/dist/blocknote.umd.cjs +9 -9
  5. package/dist/blocknote.umd.cjs.map +1 -1
  6. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js +27 -0
  7. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js.map +1 -0
  8. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js +99 -0
  9. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js.map +1 -0
  10. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js +97 -0
  11. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js.map +1 -0
  12. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js +88 -0
  13. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js.map +1 -0
  14. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.js +116 -0
  15. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.js.map +1 -0
  16. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.test.js +110 -0
  17. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.test.js.map +1 -0
  18. package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js +57 -0
  19. package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js.map +1 -0
  20. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js +5 -0
  21. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js.map +1 -0
  22. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js +31 -0
  23. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js.map +1 -0
  24. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js +71 -0
  25. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js.map +1 -0
  26. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js +157 -0
  27. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js.map +1 -0
  28. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js +27 -0
  29. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js.map +1 -0
  30. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js +64 -0
  31. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js.map +1 -0
  32. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js +145 -0
  33. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js.map +1 -0
  34. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js +252 -0
  35. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js.map +1 -0
  36. package/dist/src/api/blockManipulation/insertContentAt.js +64 -0
  37. package/dist/src/api/blockManipulation/insertContentAt.js.map +1 -0
  38. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js +76 -0
  39. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js.map +1 -0
  40. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js +33 -0
  41. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js.map +1 -0
  42. package/dist/src/api/blockManipulation/setupTestEnv.js +172 -0
  43. package/dist/src/api/blockManipulation/setupTestEnv.js.map +1 -0
  44. package/dist/src/api/clipboard/clipboard.test.js +246 -0
  45. package/dist/src/api/clipboard/clipboard.test.js.map +1 -0
  46. package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js +8 -0
  47. package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js.map +1 -0
  48. package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js +38 -0
  49. package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js.map +1 -0
  50. package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js +111 -0
  51. package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js.map +1 -0
  52. package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js +26 -0
  53. package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js.map +1 -0
  54. package/dist/src/api/clipboard/fromClipboard/pasteExtension.js +57 -0
  55. package/dist/src/api/clipboard/fromClipboard/pasteExtension.js.map +1 -0
  56. package/dist/src/api/clipboard/toClipboard/copyExtension.js +132 -0
  57. package/dist/src/api/clipboard/toClipboard/copyExtension.js.map +1 -0
  58. package/dist/src/api/exporters/html/externalHTMLExporter.js +35 -0
  59. package/dist/src/api/exporters/html/externalHTMLExporter.js.map +1 -0
  60. package/dist/src/api/exporters/html/htmlConversion.test.js +72 -0
  61. package/dist/src/api/exporters/html/htmlConversion.test.js.map +1 -0
  62. package/dist/src/api/exporters/html/internalHTMLSerializer.js +21 -0
  63. package/dist/src/api/exporters/html/internalHTMLSerializer.js.map +1 -0
  64. package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js +141 -0
  65. package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js.map +1 -0
  66. package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js +96 -0
  67. package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js.map +1 -0
  68. package/dist/src/api/exporters/markdown/markdownExporter.js +31 -0
  69. package/dist/src/api/exporters/markdown/markdownExporter.js.map +1 -0
  70. package/dist/src/api/exporters/markdown/markdownExporter.test.js +57 -0
  71. package/dist/src/api/exporters/markdown/markdownExporter.test.js.map +1 -0
  72. package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js +33 -0
  73. package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js.map +1 -0
  74. package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js +37 -0
  75. package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js.map +1 -0
  76. package/dist/src/api/getBlockInfoFromPos.js +165 -0
  77. package/dist/src/api/getBlockInfoFromPos.js.map +1 -0
  78. package/dist/src/api/nodeConversions/blockToNode.js +197 -0
  79. package/dist/src/api/nodeConversions/blockToNode.js.map +1 -0
  80. package/dist/src/api/nodeConversions/fragmentToBlocks.js +50 -0
  81. package/dist/src/api/nodeConversions/fragmentToBlocks.js.map +1 -0
  82. package/dist/src/api/nodeConversions/nodeConversions.test.js +54 -0
  83. package/dist/src/api/nodeConversions/nodeConversions.test.js.map +1 -0
  84. package/dist/src/api/nodeConversions/nodeToBlock.js +316 -0
  85. package/dist/src/api/nodeConversions/nodeToBlock.js.map +1 -0
  86. package/dist/src/api/nodeUtil.js +28 -0
  87. package/dist/src/api/nodeUtil.js.map +1 -0
  88. package/dist/src/api/parsers/html/parseHTML.js +19 -0
  89. package/dist/src/api/parsers/html/parseHTML.js.map +1 -0
  90. package/dist/src/api/parsers/html/parseHTML.test.js +470 -0
  91. package/dist/src/api/parsers/html/parseHTML.test.js.map +1 -0
  92. package/dist/src/api/parsers/html/util/nestedLists.js +106 -0
  93. package/dist/src/api/parsers/html/util/nestedLists.js.map +1 -0
  94. package/dist/src/api/parsers/html/util/nestedLists.test.js +166 -0
  95. package/dist/src/api/parsers/html/util/nestedLists.test.js.map +1 -0
  96. package/dist/src/api/parsers/markdown/parseMarkdown.js +52 -0
  97. package/dist/src/api/parsers/markdown/parseMarkdown.js.map +1 -0
  98. package/dist/src/api/parsers/markdown/parseMarkdown.test.js +109 -0
  99. package/dist/src/api/parsers/markdown/parseMarkdown.test.js.map +1 -0
  100. package/dist/src/api/testUtil/cases/customBlocks.js +313 -0
  101. package/dist/src/api/testUtil/cases/customBlocks.js.map +1 -0
  102. package/dist/src/api/testUtil/cases/customInlineContent.js +91 -0
  103. package/dist/src/api/testUtil/cases/customInlineContent.js.map +1 -0
  104. package/dist/src/api/testUtil/cases/customStyles.js +83 -0
  105. package/dist/src/api/testUtil/cases/customStyles.js.map +1 -0
  106. package/dist/src/api/testUtil/cases/defaultSchema.js +673 -0
  107. package/dist/src/api/testUtil/cases/defaultSchema.js.map +1 -0
  108. package/dist/src/api/testUtil/index.js +2 -0
  109. package/dist/src/api/testUtil/index.js.map +1 -0
  110. package/dist/src/api/testUtil/partialBlockTestUtil.js +114 -0
  111. package/dist/src/api/testUtil/partialBlockTestUtil.js.map +1 -0
  112. package/dist/src/api/testUtil/paste.js +29 -0
  113. package/dist/src/api/testUtil/paste.js.map +1 -0
  114. package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js +97 -0
  115. package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js.map +1 -0
  116. package/dist/src/blocks/AudioBlockContent/audioBlockHelpers.js +5 -0
  117. package/dist/src/blocks/AudioBlockContent/audioBlockHelpers.js.map +1 -0
  118. package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js +273 -0
  119. package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js.map +1 -0
  120. package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js +90 -0
  121. package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js.map +1 -0
  122. package/dist/src/blocks/FileBlockContent/FileBlockContent.js +70 -0
  123. package/dist/src/blocks/FileBlockContent/FileBlockContent.js.map +1 -0
  124. package/dist/src/blocks/FileBlockContent/fileBlockHelpers.js +317 -0
  125. package/dist/src/blocks/FileBlockContent/fileBlockHelpers.js.map +1 -0
  126. package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js +15 -0
  127. package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js.map +1 -0
  128. package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js +145 -0
  129. package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js.map +1 -0
  130. package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js +106 -0
  131. package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js.map +1 -0
  132. package/dist/src/blocks/ImageBlockContent/imageBlockHelpers.js +6 -0
  133. package/dist/src/blocks/ImageBlockContent/imageBlockHelpers.js.map +1 -0
  134. package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js +113 -0
  135. package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js.map +1 -0
  136. package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js +224 -0
  137. package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js.map +1 -0
  138. package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js +45 -0
  139. package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js.map +1 -0
  140. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js +58 -0
  141. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js.map +1 -0
  142. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js +130 -0
  143. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js.map +1 -0
  144. package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js +52 -0
  145. package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js.map +1 -0
  146. package/dist/src/blocks/TableBlockContent/TableBlockContent.js +129 -0
  147. package/dist/src/blocks/TableBlockContent/TableBlockContent.js.map +1 -0
  148. package/dist/src/blocks/TableBlockContent/TableExtension.js +57 -0
  149. package/dist/src/blocks/TableBlockContent/TableExtension.js.map +1 -0
  150. package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js +103 -0
  151. package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js.map +1 -0
  152. package/dist/src/blocks/VideoBlockContent/videoBlockHelpers.js +6 -0
  153. package/dist/src/blocks/VideoBlockContent/videoBlockHelpers.js.map +1 -0
  154. package/dist/src/blocks/defaultBlockHelpers.js +50 -0
  155. package/dist/src/blocks/defaultBlockHelpers.js.map +1 -0
  156. package/dist/src/blocks/defaultBlockTypeGuards.js +40 -0
  157. package/dist/src/blocks/defaultBlockTypeGuards.js.map +1 -0
  158. package/dist/src/blocks/defaultBlocks.js +50 -0
  159. package/dist/src/blocks/defaultBlocks.js.map +1 -0
  160. package/dist/src/blocks/defaultProps.js +19 -0
  161. package/dist/src/blocks/defaultProps.js.map +1 -0
  162. package/dist/src/editor/BlockNoteEditor.js +746 -0
  163. package/dist/src/editor/BlockNoteEditor.js.map +1 -0
  164. package/dist/src/editor/BlockNoteEditor.test.js +65 -0
  165. package/dist/src/editor/BlockNoteEditor.test.js.map +1 -0
  166. package/dist/src/editor/BlockNoteExtensions.js +195 -0
  167. package/dist/src/editor/BlockNoteExtensions.js.map +1 -0
  168. package/dist/src/editor/BlockNoteSchema.js +38 -0
  169. package/dist/src/editor/BlockNoteSchema.js.map +1 -0
  170. package/dist/src/editor/BlockNoteTipTapEditor.js +169 -0
  171. package/dist/src/editor/BlockNoteTipTapEditor.js.map +1 -0
  172. package/dist/src/editor/cursorPositionTypes.js +2 -0
  173. package/dist/src/editor/cursorPositionTypes.js.map +1 -0
  174. package/dist/src/editor/defaultColors.js +77 -0
  175. package/dist/src/editor/defaultColors.js.map +1 -0
  176. package/dist/src/editor/selectionTypes.js +2 -0
  177. package/dist/src/editor/selectionTypes.js.map +1 -0
  178. package/dist/src/editor/transformPasted.js +79 -0
  179. package/dist/src/editor/transformPasted.js.map +1 -0
  180. package/dist/src/exporter/Exporter.js +36 -0
  181. package/dist/src/exporter/Exporter.js.map +1 -0
  182. package/dist/src/exporter/index.js +3 -0
  183. package/dist/src/exporter/index.js.map +1 -0
  184. package/dist/src/exporter/mapping.js +12 -0
  185. package/dist/src/exporter/mapping.js.map +1 -0
  186. package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js +30 -0
  187. package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js.map +1 -0
  188. package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js +39 -0
  189. package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js.map +1 -0
  190. package/dist/src/extensions/FilePanel/FilePanelPlugin.js +131 -0
  191. package/dist/src/extensions/FilePanel/FilePanelPlugin.js.map +1 -0
  192. package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js +195 -0
  193. package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js.map +1 -0
  194. package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js +339 -0
  195. package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js.map +1 -0
  196. package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js +247 -0
  197. package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js.map +1 -0
  198. package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js +54 -0
  199. package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js.map +1 -0
  200. package/dist/src/extensions/Placeholder/PlaceholderPlugin.js +84 -0
  201. package/dist/src/extensions/Placeholder/PlaceholderPlugin.js.map +1 -0
  202. package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js +187 -0
  203. package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js.map +1 -0
  204. package/dist/src/extensions/SideMenu/MultipleNodeSelection.js +68 -0
  205. package/dist/src/extensions/SideMenu/MultipleNodeSelection.js.map +1 -0
  206. package/dist/src/extensions/SideMenu/SideMenuPlugin.js +339 -0
  207. package/dist/src/extensions/SideMenu/SideMenuPlugin.js.map +1 -0
  208. package/dist/src/extensions/SideMenu/dragging.js +128 -0
  209. package/dist/src/extensions/SideMenu/dragging.js.map +1 -0
  210. package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js +2 -0
  211. package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js.map +1 -0
  212. package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js +2 -0
  213. package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js.map +1 -0
  214. package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js +245 -0
  215. package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js.map +1 -0
  216. package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js +26 -0
  217. package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js.map +1 -0
  218. package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js +244 -0
  219. package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js.map +1 -0
  220. package/dist/src/extensions/TableHandles/TableHandlesPlugin.js +553 -0
  221. package/dist/src/extensions/TableHandles/TableHandlesPlugin.js.map +1 -0
  222. package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js +36 -0
  223. package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js.map +1 -0
  224. package/dist/src/extensions/TextColor/TextColorExtension.js +29 -0
  225. package/dist/src/extensions/TextColor/TextColorExtension.js.map +1 -0
  226. package/dist/src/extensions/TextColor/TextColorMark.js +37 -0
  227. package/dist/src/extensions/TextColor/TextColorMark.js.map +1 -0
  228. package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js +58 -0
  229. package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js.map +1 -0
  230. package/dist/src/extensions/UniqueID/UniqueID.js +283 -0
  231. package/dist/src/extensions/UniqueID/UniqueID.js.map +1 -0
  232. package/dist/src/extensions/getDraggableBlockFromElement.js +13 -0
  233. package/dist/src/extensions/getDraggableBlockFromElement.js.map +1 -0
  234. package/dist/src/extensions-shared/UiElementPosition.js +2 -0
  235. package/dist/src/extensions-shared/UiElementPosition.js.map +1 -0
  236. package/dist/src/i18n/dictionary.js +4 -0
  237. package/dist/src/i18n/dictionary.js.map +1 -0
  238. package/dist/src/i18n/locales/ar.js +298 -0
  239. package/dist/src/i18n/locales/ar.js.map +1 -0
  240. package/dist/src/i18n/locales/de.js +313 -0
  241. package/dist/src/i18n/locales/de.js.map +1 -0
  242. package/dist/src/i18n/locales/en.js +314 -0
  243. package/dist/src/i18n/locales/en.js.map +1 -0
  244. package/dist/src/i18n/locales/es.js +312 -0
  245. package/dist/src/i18n/locales/es.js.map +1 -0
  246. package/dist/src/i18n/locales/fr.js +313 -0
  247. package/dist/src/i18n/locales/fr.js.map +1 -0
  248. package/dist/src/i18n/locales/hr.js +308 -0
  249. package/dist/src/i18n/locales/hr.js.map +1 -0
  250. package/dist/src/i18n/locales/index.js +16 -0
  251. package/dist/src/i18n/locales/index.js.map +1 -0
  252. package/dist/src/i18n/locales/is.js +305 -0
  253. package/dist/src/i18n/locales/is.js.map +1 -0
  254. package/dist/src/i18n/locales/ja.js +333 -0
  255. package/dist/src/i18n/locales/ja.js.map +1 -0
  256. package/dist/src/i18n/locales/ko.js +326 -0
  257. package/dist/src/i18n/locales/ko.js.map +1 -0
  258. package/dist/src/i18n/locales/nl.js +313 -0
  259. package/dist/src/i18n/locales/nl.js.map +1 -0
  260. package/dist/src/i18n/locales/pl.js +297 -0
  261. package/dist/src/i18n/locales/pl.js.map +1 -0
  262. package/dist/src/i18n/locales/pt.js +305 -0
  263. package/dist/src/i18n/locales/pt.js.map +1 -0
  264. package/dist/src/i18n/locales/ru.js +340 -0
  265. package/dist/src/i18n/locales/ru.js.map +1 -0
  266. package/dist/src/i18n/locales/vi.js +312 -0
  267. package/dist/src/i18n/locales/vi.js.map +1 -0
  268. package/dist/src/i18n/locales/zh.js +346 -0
  269. package/dist/src/i18n/locales/zh.js.map +1 -0
  270. package/dist/src/index.js +55 -0
  271. package/dist/src/index.js.map +1 -0
  272. package/dist/src/pm-nodes/BlockContainer.js +72 -0
  273. package/dist/src/pm-nodes/BlockContainer.js.map +1 -0
  274. package/dist/src/pm-nodes/BlockGroup.js +43 -0
  275. package/dist/src/pm-nodes/BlockGroup.js.map +1 -0
  276. package/dist/src/pm-nodes/Doc.js +7 -0
  277. package/dist/src/pm-nodes/Doc.js.map +1 -0
  278. package/dist/src/pm-nodes/index.js +4 -0
  279. package/dist/src/pm-nodes/index.js.map +1 -0
  280. package/dist/src/schema/blocks/createSpec.js +126 -0
  281. package/dist/src/schema/blocks/createSpec.js.map +1 -0
  282. package/dist/src/schema/blocks/internal.js +147 -0
  283. package/dist/src/schema/blocks/internal.js.map +1 -0
  284. package/dist/src/schema/blocks/types.js +2 -0
  285. package/dist/src/schema/blocks/types.js.map +1 -0
  286. package/dist/src/schema/index.js +11 -0
  287. package/dist/src/schema/index.js.map +1 -0
  288. package/dist/src/schema/inlineContent/createSpec.js +64 -0
  289. package/dist/src/schema/inlineContent/createSpec.js.map +1 -0
  290. package/dist/src/schema/inlineContent/internal.js +52 -0
  291. package/dist/src/schema/inlineContent/internal.js.map +1 -0
  292. package/dist/src/schema/inlineContent/types.js +10 -0
  293. package/dist/src/schema/inlineContent/types.js.map +1 -0
  294. package/dist/src/schema/propTypes.js +2 -0
  295. package/dist/src/schema/propTypes.js.map +1 -0
  296. package/dist/src/schema/styles/createSpec.js +48 -0
  297. package/dist/src/schema/styles/createSpec.js.map +1 -0
  298. package/dist/src/schema/styles/internal.js +53 -0
  299. package/dist/src/schema/styles/internal.js.map +1 -0
  300. package/dist/src/schema/styles/types.js +2 -0
  301. package/dist/src/schema/styles/types.js.map +1 -0
  302. package/dist/src/util/EventEmitter.js +33 -0
  303. package/dist/src/util/EventEmitter.js.map +1 -0
  304. package/dist/src/util/browser.js +17 -0
  305. package/dist/src/util/browser.js.map +1 -0
  306. package/dist/src/util/combineByGroup.js +20 -0
  307. package/dist/src/util/combineByGroup.js.map +1 -0
  308. package/dist/src/util/esmDependencies.js +35 -0
  309. package/dist/src/util/esmDependencies.js.map +1 -0
  310. package/dist/src/util/string.js +14 -0
  311. package/dist/src/util/string.js.map +1 -0
  312. package/dist/src/util/typescript.js +12 -0
  313. package/dist/src/util/typescript.js.map +1 -0
  314. package/dist/style.css +1 -1
  315. package/dist/tsconfig.tsbuildinfo +1 -0
  316. package/dist/webpack-stats.json +1 -1
  317. package/package.json +5 -5
  318. package/src/api/blockManipulation/commands/insertBlocks/__snapshots__/insertBlocks.test.ts.snap +0 -6
  319. package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.ts +2 -0
  320. package/src/api/blockManipulation/commands/mergeBlocks/__snapshots__/mergeBlocks.test.ts.snap +0 -5
  321. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.ts +2 -2
  322. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.ts +104 -39
  323. package/src/api/blockManipulation/commands/moveBlock/__snapshots__/moveBlock.test.ts.snap +0 -8
  324. package/src/api/blockManipulation/commands/moveBlock/moveBlock.test.ts +7 -3
  325. package/src/api/blockManipulation/commands/moveBlock/moveBlock.ts +3 -5
  326. package/src/api/blockManipulation/commands/nestBlock/nestBlock.ts +100 -0
  327. package/src/api/blockManipulation/commands/removeBlocks/__snapshots__/removeBlocks.test.ts.snap +439 -2
  328. package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.ts +6 -0
  329. package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.ts +2 -82
  330. package/src/api/blockManipulation/commands/replaceBlocks/__snapshots__/replaceBlocks.test.ts.snap +0 -8
  331. package/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.ts +96 -20
  332. package/src/api/blockManipulation/commands/splitBlock/__snapshots__/splitBlock.test.ts.snap +0 -6
  333. package/src/api/blockManipulation/commands/splitBlock/splitBlock.test.ts +8 -4
  334. package/src/api/blockManipulation/commands/splitBlock/splitBlock.ts +13 -12
  335. package/src/api/blockManipulation/commands/updateBlock/__snapshots__/updateBlock.test.ts.snap +0 -490
  336. package/src/api/blockManipulation/commands/updateBlock/updateBlock.test.ts +5 -5
  337. package/src/api/blockManipulation/commands/updateBlock/updateBlock.ts +192 -107
  338. package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.ts +48 -33
  339. package/src/api/clipboard/fromClipboard/acceptedMIMETypes.ts +1 -1
  340. package/src/api/clipboard/fromClipboard/handleFileInsertion.ts +7 -6
  341. package/src/api/clipboard/toClipboard/copyExtension.ts +1 -1
  342. package/src/api/exporters/html/htmlConversion.test.ts +1 -4
  343. package/src/api/exporters/html/util/serializeBlocksExternalHTML.ts +7 -1
  344. package/src/api/exporters/html/util/serializeBlocksInternalHTML.ts +56 -19
  345. package/src/api/exporters/markdown/markdownExporter.test.ts +1 -4
  346. package/src/api/getBlockInfoFromPos.ts +125 -80
  347. package/src/api/nodeConversions/blockToNode.ts +50 -25
  348. package/src/api/nodeConversions/fragmentToBlocks.ts +18 -0
  349. package/src/api/nodeConversions/nodeToBlock.ts +24 -21
  350. package/src/api/nodeUtil.ts +1 -1
  351. package/src/api/parsers/html/__snapshots__/parse-notion-html.json +1 -2
  352. package/src/api/testUtil/partialBlockTestUtil.ts +15 -3
  353. package/src/blocks/AudioBlockContent/AudioBlockContent.ts +4 -2
  354. package/src/blocks/FileBlockContent/fileBlockHelpers.ts +5 -4
  355. package/src/blocks/HeadingBlockContent/HeadingBlockContent.ts +35 -35
  356. package/src/blocks/ImageBlockContent/ImageBlockContent.ts +4 -2
  357. package/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +14 -12
  358. package/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.ts +28 -16
  359. package/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.ts +5 -3
  360. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts +11 -4
  361. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +13 -11
  362. package/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts +8 -9
  363. package/src/blocks/TableBlockContent/TableBlockContent.ts +0 -1
  364. package/src/blocks/VideoBlockContent/VideoBlockContent.ts +4 -2
  365. package/src/blocks/defaultBlockHelpers.ts +7 -2
  366. package/src/editor/Block.css +22 -1
  367. package/src/editor/BlockNoteEditor.test.ts +4 -7
  368. package/src/editor/BlockNoteEditor.ts +87 -61
  369. package/src/editor/BlockNoteExtensions.ts +92 -17
  370. package/src/editor/BlockNoteTipTapEditor.ts +8 -1
  371. package/src/editor/defaultColors.ts +77 -0
  372. package/src/editor/editor.css +10 -0
  373. package/src/editor/transformPasted.ts +6 -3
  374. package/src/exporter/Exporter.ts +101 -0
  375. package/src/exporter/index.ts +2 -0
  376. package/src/exporter/mapping.ts +75 -0
  377. package/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts +233 -53
  378. package/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.ts +45 -42
  379. package/src/extensions/Placeholder/PlaceholderPlugin.ts +94 -90
  380. package/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.ts +173 -169
  381. package/src/extensions/SideMenu/SideMenuPlugin.ts +141 -52
  382. package/src/extensions/SideMenu/dragging.ts +3 -54
  383. package/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts +4 -6
  384. package/src/extensions/TableHandles/TableHandlesPlugin.ts +1 -1
  385. package/src/extensions/TrailingNode/TrailingNodeExtension.ts +1 -1
  386. package/src/extensions/getDraggableBlockFromElement.ts +19 -0
  387. package/src/i18n/locales/de.ts +5 -5
  388. package/src/i18n/locales/pt.ts +5 -5
  389. package/src/index.ts +9 -5
  390. package/src/pm-nodes/BlockContainer.ts +1 -1
  391. package/src/pm-nodes/BlockGroup.ts +2 -2
  392. package/src/pm-nodes/README.md +127 -28
  393. package/src/schema/blocks/createSpec.ts +4 -1
  394. package/src/schema/blocks/internal.ts +12 -2
  395. package/src/schema/blocks/types.ts +1 -1
  396. package/src/util/combineByGroup.ts +25 -0
  397. package/types/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.d.ts +22 -2
  398. package/types/src/api/blockManipulation/commands/nestBlock/nestBlock.d.ts +5 -0
  399. package/types/src/api/blockManipulation/commands/removeBlocks/removeBlocks.d.ts +0 -3
  400. package/types/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.d.ts +4 -0
  401. package/types/src/api/blockManipulation/setupTestEnv.d.ts +0 -6
  402. package/types/src/api/clipboard/fromClipboard/acceptedMIMETypes.d.ts +1 -1
  403. package/types/src/api/getBlockInfoFromPos.d.ts +38 -13
  404. package/types/src/api/nodeConversions/blockToNode.d.ts +1 -1
  405. package/types/src/api/nodeConversions/nodeToBlock.d.ts +3 -1
  406. package/types/src/api/testUtil/cases/customBlocks.d.ts +0 -6
  407. package/types/src/api/testUtil/cases/customInlineContent.d.ts +0 -6
  408. package/types/src/api/testUtil/cases/customStyles.d.ts +0 -6
  409. package/types/src/api/testUtil/partialBlockTestUtil.d.ts +2 -1
  410. package/types/src/blocks/AudioBlockContent/AudioBlockContent.d.ts +1 -0
  411. package/types/src/blocks/FileBlockContent/fileBlockHelpers.d.ts +1 -0
  412. package/types/src/blocks/ImageBlockContent/ImageBlockContent.d.ts +1 -0
  413. package/types/src/blocks/TableBlockContent/TableBlockContent.d.ts +0 -9
  414. package/types/src/blocks/VideoBlockContent/VideoBlockContent.d.ts +1 -0
  415. package/types/src/blocks/defaultBlocks.d.ts +0 -12
  416. package/types/src/editor/BlockNoteEditor.d.ts +23 -5
  417. package/types/src/editor/BlockNoteExtensions.d.ts +14 -7
  418. package/types/src/editor/BlockNoteTipTapEditor.d.ts +1 -0
  419. package/types/src/editor/defaultColors.d.ts +76 -0
  420. package/types/src/exporter/Exporter.d.ts +43 -0
  421. package/types/src/exporter/index.d.ts +2 -0
  422. package/types/src/exporter/mapping.d.ts +30 -0
  423. package/types/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.d.ts +4 -1
  424. package/types/src/extensions/Placeholder/PlaceholderPlugin.d.ts +4 -1
  425. package/types/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.d.ts +4 -5
  426. package/types/src/extensions/SideMenu/SideMenuPlugin.d.ts +2 -1
  427. package/types/src/extensions/SideMenu/dragging.d.ts +1 -6
  428. package/types/src/extensions/getDraggableBlockFromElement.d.ts +5 -0
  429. package/types/src/index.d.ts +9 -5
  430. package/types/src/schema/blocks/createSpec.d.ts +1 -1
  431. package/types/src/schema/blocks/internal.d.ts +2 -2
  432. package/types/src/schema/blocks/types.d.ts +1 -1
  433. package/types/src/util/combineByGroup.d.ts +9 -0
  434. package/dist/angular-html-HQGguTAE.js +0 -33
  435. package/dist/angular-html-HQGguTAE.js.map +0 -1
  436. package/dist/angular-ts-q9PqJiJb.js +0 -22
  437. package/dist/angular-ts-q9PqJiJb.js.map +0 -1
  438. package/dist/astro-0iWgpDaK.js +0 -17
  439. package/dist/astro-0iWgpDaK.js.map +0 -1
  440. package/dist/blade-C3Z8AhvY.js +0 -19
  441. package/dist/blade-C3Z8AhvY.js.map +0 -1
  442. package/dist/c-TKJGJdXV.js +0 -7
  443. package/dist/c-TKJGJdXV.js.map +0 -1
  444. package/dist/coffee-CN_y6cG3.js +0 -9
  445. package/dist/coffee-CN_y6cG3.js.map +0 -1
  446. package/dist/cpp-Be_e67JE.js +0 -19
  447. package/dist/cpp-Be_e67JE.js.map +0 -1
  448. package/dist/css-DHLSoXzW.js +0 -7
  449. package/dist/css-DHLSoXzW.js.map +0 -1
  450. package/dist/glsl-8qSUIm5B.js +0 -9
  451. package/dist/glsl-8qSUIm5B.js.map +0 -1
  452. package/dist/graphql-D7_Dk2ma.js +0 -15
  453. package/dist/graphql-D7_Dk2ma.js.map +0 -1
  454. package/dist/haml-S3dmcfEW.js +0 -11
  455. package/dist/haml-S3dmcfEW.js.map +0 -1
  456. package/dist/handlebars-DaIrqVg3.js +0 -15
  457. package/dist/handlebars-DaIrqVg3.js.map +0 -1
  458. package/dist/html-Bx3A18fV.js +0 -11
  459. package/dist/html-Bx3A18fV.js.map +0 -1
  460. package/dist/html-derivative-Cf3KTZBS.js +0 -9
  461. package/dist/html-derivative-Cf3KTZBS.js.map +0 -1
  462. package/dist/http-BphR83YX.js +0 -15
  463. package/dist/http-BphR83YX.js.map +0 -1
  464. package/dist/imba-CmP25v0O.js +0 -9
  465. package/dist/imba-CmP25v0O.js.map +0 -1
  466. package/dist/java-Dg4kxH6C.js +0 -7
  467. package/dist/java-Dg4kxH6C.js.map +0 -1
  468. package/dist/javascript-CipAzIn1.js +0 -7
  469. package/dist/javascript-CipAzIn1.js.map +0 -1
  470. package/dist/jinja-tioldiz6.js +0 -12
  471. package/dist/jinja-tioldiz6.js.map +0 -1
  472. package/dist/jison-DWJFEE_I.js +0 -9
  473. package/dist/jison-DWJFEE_I.js.map +0 -1
  474. package/dist/json-_04EL6MS.js +0 -7
  475. package/dist/json-_04EL6MS.js.map +0 -1
  476. package/dist/json5-Dwmp5XFI.js +0 -7
  477. package/dist/json5-Dwmp5XFI.js.map +0 -1
  478. package/dist/jsonc-LqD5auy0.js +0 -7
  479. package/dist/jsonc-LqD5auy0.js.map +0 -1
  480. package/dist/jsonl-B4yVuYQH.js +0 -7
  481. package/dist/jsonl-B4yVuYQH.js.map +0 -1
  482. package/dist/jsx-Mg4WaD5k.js +0 -7
  483. package/dist/jsx-Mg4WaD5k.js.map +0 -1
  484. package/dist/julia-CWi-ZdpN.js +0 -17
  485. package/dist/julia-CWi-ZdpN.js.map +0 -1
  486. package/dist/less-BBvTHIGe.js +0 -7
  487. package/dist/less-BBvTHIGe.js.map +0 -1
  488. package/dist/markdown-DAXqtk9a.js +0 -7
  489. package/dist/markdown-DAXqtk9a.js.map +0 -1
  490. package/dist/marko-0aaNgUGV.js +0 -15
  491. package/dist/marko-0aaNgUGV.js.map +0 -1
  492. package/dist/mdc-hXJ2B4O0.js +0 -13
  493. package/dist/mdc-hXJ2B4O0.js.map +0 -1
  494. package/dist/mdx-CSCKbb_f.js +0 -7
  495. package/dist/mdx-CSCKbb_f.js.map +0 -1
  496. package/dist/php-B_-4RJ09.js +0 -19
  497. package/dist/php-B_-4RJ09.js.map +0 -1
  498. package/dist/postcss-SJfTvo_B.js +0 -7
  499. package/dist/postcss-SJfTvo_B.js.map +0 -1
  500. package/dist/pug-3q2tx0nf.js +0 -13
  501. package/dist/pug-3q2tx0nf.js.map +0 -1
  502. package/dist/python-Dpup1-fE.js +0 -7
  503. package/dist/python-Dpup1-fE.js.map +0 -1
  504. package/dist/r-Chyv38Fv.js +0 -7
  505. package/dist/r-Chyv38Fv.js.map +0 -1
  506. package/dist/regexp-BF0hfxNW.js +0 -7
  507. package/dist/regexp-BF0hfxNW.js.map +0 -1
  508. package/dist/sass-p2RMoqDT.js +0 -7
  509. package/dist/sass-p2RMoqDT.js.map +0 -1
  510. package/dist/scss-DmlHSoOY.js +0 -9
  511. package/dist/scss-DmlHSoOY.js.map +0 -1
  512. package/dist/shellscript-CZpPN8_x.js +0 -7
  513. package/dist/shellscript-CZpPN8_x.js.map +0 -1
  514. package/dist/sql-DtlkUz2m.js +0 -7
  515. package/dist/sql-DtlkUz2m.js.map +0 -1
  516. package/dist/stylus-DEr8eSLm.js +0 -7
  517. package/dist/stylus-DEr8eSLm.js.map +0 -1
  518. package/dist/svelte-BRIJF62h.js +0 -15
  519. package/dist/svelte-BRIJF62h.js.map +0 -1
  520. package/dist/ts-tags-qkUtuI0N.js +0 -42
  521. package/dist/ts-tags-qkUtuI0N.js.map +0 -1
  522. package/dist/tsx-DTfbgJxi.js +0 -7
  523. package/dist/tsx-DTfbgJxi.js.map +0 -1
  524. package/dist/typescript-CCd4aQHh.js +0 -7
  525. package/dist/typescript-CCd4aQHh.js.map +0 -1
  526. package/dist/vue-B3TdbERm.js +0 -32
  527. package/dist/vue-B3TdbERm.js.map +0 -1
  528. package/dist/vue-html-BGmTBZk0.js +0 -11
  529. package/dist/vue-html-BGmTBZk0.js.map +0 -1
  530. package/dist/wasm-VDIDph3E.js +0 -7
  531. package/dist/wasm-VDIDph3E.js.map +0 -1
  532. package/dist/wgsl-2np_U3Z8.js +0 -7
  533. package/dist/wgsl-2np_U3Z8.js.map +0 -1
  534. package/dist/xml-CNyphW9R.js +0 -9
  535. package/dist/xml-CNyphW9R.js.map +0 -1
  536. package/dist/yaml-DxFiVFcM.js +0 -7
  537. package/dist/yaml-DxFiVFcM.js.map +0 -1
@@ -4,110 +4,114 @@ import type { BlockNoteEditor } from "../../editor/BlockNoteEditor.js";
4
4
 
5
5
  const PLUGIN_KEY = new PluginKey(`blocknote-placeholder`);
6
6
 
7
- export const PlaceholderPlugin = (
8
- editor: BlockNoteEditor<any, any, any>,
9
- placeholders: Record<string | "default", string>
10
- ) => {
11
- return new Plugin({
12
- key: PLUGIN_KEY,
13
- view: () => {
14
- const styleEl = document.createElement("style");
15
- const nonce = editor._tiptapEditor.options.injectNonce;
16
- if (nonce) {
17
- styleEl.setAttribute("nonce", nonce);
18
- }
19
- if (editor._tiptapEditor.view.root instanceof ShadowRoot) {
20
- editor._tiptapEditor.view.root.append(styleEl);
21
- } else {
22
- editor._tiptapEditor.view.root.head.appendChild(styleEl);
23
- }
24
-
25
- const styleSheet = styleEl.sheet!;
26
-
27
- const getBaseSelector = (additionalSelectors = "") =>
28
- `.bn-block-content${additionalSelectors} .bn-inline-content:has(> .ProseMirror-trailingBreak:only-child):before`;
29
-
30
- const getSelector = (
31
- blockType: string | "default",
32
- mustBeFocused = true
33
- ) => {
34
- const mustBeFocusedSelector = mustBeFocused
35
- ? `[data-is-empty-and-focused]`
36
- : ``;
37
-
38
- if (blockType === "default") {
39
- return getBaseSelector(mustBeFocusedSelector);
7
+ export class PlaceholderPlugin {
8
+ public readonly plugin: Plugin;
9
+ constructor(
10
+ editor: BlockNoteEditor<any, any, any>,
11
+ placeholders: Record<string | "default", string>
12
+ ) {
13
+ this.plugin = new Plugin({
14
+ key: PLUGIN_KEY,
15
+ view: () => {
16
+ const styleEl = document.createElement("style");
17
+ const nonce = editor._tiptapEditor.options.injectNonce;
18
+ if (nonce) {
19
+ styleEl.setAttribute("nonce", nonce);
40
20
  }
21
+ if (editor._tiptapEditor.view.root instanceof ShadowRoot) {
22
+ editor._tiptapEditor.view.root.append(styleEl);
23
+ } else {
24
+ editor._tiptapEditor.view.root.head.appendChild(styleEl);
25
+ }
26
+
27
+ const styleSheet = styleEl.sheet!;
28
+
29
+ const getBaseSelector = (additionalSelectors = "") =>
30
+ `.bn-block-content${additionalSelectors} .bn-inline-content:has(> .ProseMirror-trailingBreak:only-child):before`;
41
31
 
42
- const blockTypeSelector = `[data-content-type="${blockType}"]`;
43
- return getBaseSelector(mustBeFocusedSelector + blockTypeSelector);
44
- };
32
+ const getSelector = (
33
+ blockType: string | "default",
34
+ mustBeFocused = true
35
+ ) => {
36
+ const mustBeFocusedSelector = mustBeFocused
37
+ ? `[data-is-empty-and-focused]`
38
+ : ``;
39
+
40
+ if (blockType === "default") {
41
+ return getBaseSelector(mustBeFocusedSelector);
42
+ }
45
43
 
46
- for (const [blockType, placeholder] of Object.entries(placeholders)) {
47
- const mustBeFocused = blockType === "default";
44
+ const blockTypeSelector = `[data-content-type="${blockType}"]`;
45
+ return getBaseSelector(mustBeFocusedSelector + blockTypeSelector);
46
+ };
48
47
 
49
- styleSheet.insertRule(
50
- `${getSelector(blockType, mustBeFocused)}{ content: ${JSON.stringify(
51
- placeholder
52
- )}; }`
53
- );
48
+ for (const [blockType, placeholder] of Object.entries(placeholders)) {
49
+ const mustBeFocused = blockType === "default";
54
50
 
55
- // For some reason, the placeholders which show when the block is focused
56
- // take priority over ones which show depending on block type, so we need
57
- // to make sure the block specific ones are also used when the block is
58
- // focused.
59
- if (!mustBeFocused) {
60
51
  styleSheet.insertRule(
61
- `${getSelector(blockType, true)}{ content: ${JSON.stringify(
62
- placeholder
63
- )}; }`
52
+ `${getSelector(
53
+ blockType,
54
+ mustBeFocused
55
+ )}{ content: ${JSON.stringify(placeholder)}; }`
64
56
  );
65
- }
66
- }
67
-
68
- return {
69
- destroy: () => {
70
- if (editor._tiptapEditor.view.root instanceof ShadowRoot) {
71
- editor._tiptapEditor.view.root.removeChild(styleEl);
72
- } else {
73
- editor._tiptapEditor.view.root.head.removeChild(styleEl);
57
+
58
+ // For some reason, the placeholders which show when the block is focused
59
+ // take priority over ones which show depending on block type, so we need
60
+ // to make sure the block specific ones are also used when the block is
61
+ // focused.
62
+ if (!mustBeFocused) {
63
+ styleSheet.insertRule(
64
+ `${getSelector(blockType, true)}{ content: ${JSON.stringify(
65
+ placeholder
66
+ )}; }`
67
+ );
74
68
  }
75
- },
76
- };
77
- },
78
- props: {
79
- // TODO: maybe also add placeholder for empty document ("e.g.: start writing..")
80
- decorations: (state) => {
81
- const { doc, selection } = state;
82
-
83
- if (!editor.isEditable) {
84
- return;
85
69
  }
86
70
 
87
- if (!selection.empty) {
88
- return;
89
- }
71
+ return {
72
+ destroy: () => {
73
+ if (editor._tiptapEditor.view.root instanceof ShadowRoot) {
74
+ editor._tiptapEditor.view.root.removeChild(styleEl);
75
+ } else {
76
+ editor._tiptapEditor.view.root.head.removeChild(styleEl);
77
+ }
78
+ },
79
+ };
80
+ },
81
+ props: {
82
+ // TODO: maybe also add placeholder for empty document ("e.g.: start writing..")
83
+ decorations: (state) => {
84
+ const { doc, selection } = state;
90
85
 
91
- // Don't show placeholder when the cursor is inside a code block
92
- if (selection.$from.parent.type.spec.code) {
93
- return;
94
- }
86
+ if (!editor.isEditable) {
87
+ return;
88
+ }
95
89
 
96
- const $pos = selection.$anchor;
97
- const node = $pos.parent;
90
+ if (!selection.empty) {
91
+ return;
92
+ }
98
93
 
99
- if (node.content.size > 0) {
100
- return null;
101
- }
94
+ // Don't show placeholder when the cursor is inside a code block
95
+ if (selection.$from.parent.type.spec.code) {
96
+ return;
97
+ }
102
98
 
103
- const before = $pos.before();
99
+ const $pos = selection.$anchor;
100
+ const node = $pos.parent;
104
101
 
105
- const dec = Decoration.node(before, before + node.nodeSize, {
106
- "data-is-empty-and-focused": "true",
107
- });
102
+ if (node.content.size > 0) {
103
+ return null;
104
+ }
105
+
106
+ const before = $pos.before();
108
107
 
109
- return DecorationSet.create(doc, [dec]);
108
+ const dec = Decoration.node(before, before + node.nodeSize, {
109
+ "data-is-empty-and-focused": "true",
110
+ });
111
+
112
+ return DecorationSet.create(doc, [dec]);
113
+ },
110
114
  },
111
- },
112
- });
113
- };
115
+ });
116
+ }
117
+ }
@@ -23,195 +23,199 @@ const nodeAttributes: Record<string, string> = {
23
23
  *
24
24
  * Solution: When attributes change on a node, this plugin sets a data-* attribute with the "previous" value. This way we can still use CSS transitions. (See block.module.css)
25
25
  */
26
- export const PreviousBlockTypePlugin = () => {
27
- let timeout: any;
28
- return new Plugin({
29
- key: PLUGIN_KEY,
30
- view(_editorView) {
31
- return {
32
- update: async (view, _prevState) => {
33
- if (this.key?.getState(view.state).updatedBlocks.size > 0) {
34
- // use setTimeout 0 to clear the decorations so that at least
35
- // for one DOM-render the decorations have been applied
36
- timeout = setTimeout(() => {
37
- view.dispatch(
38
- view.state.tr.setMeta(PLUGIN_KEY, { clearUpdate: true })
39
- );
40
- }, 0);
41
- }
42
- },
43
- destroy: () => {
44
- if (timeout) {
45
- clearTimeout(timeout);
46
- }
47
- },
48
- };
49
- },
50
- state: {
51
- init() {
26
+ export class PreviousBlockTypePlugin {
27
+ public readonly plugin: Plugin;
28
+ constructor() {
29
+ let timeout: ReturnType<typeof setTimeout>;
30
+ this.plugin = new Plugin({
31
+ key: PLUGIN_KEY,
32
+ view(_editorView) {
52
33
  return {
53
- // Block attributes, by block ID, from just before the previous transaction.
54
- prevTransactionOldBlockAttrs: {} as any,
55
- // Block attributes, by block ID, from just before the current transaction.
56
- currentTransactionOldBlockAttrs: {} as any,
57
- // Set of IDs of blocks whose attributes changed from the current transaction.
58
- updatedBlocks: new Set<string>(),
34
+ update: async (view, _prevState) => {
35
+ if (this.key?.getState(view.state).updatedBlocks.size > 0) {
36
+ // use setTimeout 0 to clear the decorations so that at least
37
+ // for one DOM-render the decorations have been applied
38
+ timeout = setTimeout(() => {
39
+ view.dispatch(
40
+ view.state.tr.setMeta(PLUGIN_KEY, { clearUpdate: true })
41
+ );
42
+ }, 0);
43
+ }
44
+ },
45
+ destroy: () => {
46
+ if (timeout) {
47
+ clearTimeout(timeout);
48
+ }
49
+ },
59
50
  };
60
51
  },
52
+ state: {
53
+ init() {
54
+ return {
55
+ // Block attributes, by block ID, from just before the previous transaction.
56
+ prevTransactionOldBlockAttrs: {} as any,
57
+ // Block attributes, by block ID, from just before the current transaction.
58
+ currentTransactionOldBlockAttrs: {} as any,
59
+ // Set of IDs of blocks whose attributes changed from the current transaction.
60
+ updatedBlocks: new Set<string>(),
61
+ };
62
+ },
61
63
 
62
- apply(transaction, prev, oldState, newState) {
63
- prev.currentTransactionOldBlockAttrs = {};
64
- prev.updatedBlocks.clear();
64
+ apply(transaction, prev, oldState, newState) {
65
+ prev.currentTransactionOldBlockAttrs = {};
66
+ prev.updatedBlocks.clear();
65
67
 
66
- if (!transaction.docChanged || oldState.doc.eq(newState.doc)) {
67
- return prev;
68
- }
69
-
70
- // TODO: Instead of iterating through the entire document, only check nodes affected by the transactions. Will
71
- // also probably require checking nodes affected by the previous transaction too.
72
- // We didn't get this to work yet:
73
- // const transform = combineTransactionSteps(oldState.doc, [transaction]);
74
- // // const { mapping } = transform;
75
- // const changes = getChangedRanges(transform);
76
- //
77
- // changes.forEach(({ oldRange, newRange }) => {
78
- // const oldNodes = findChildrenInRange(
79
- // oldState.doc,
80
- // oldRange,
81
- // (node) => node.attrs.id
82
- // );
83
- //
84
- // const newNodes = findChildrenInRange(
85
- // newState.doc,
86
- // newRange,
87
- // (node) => node.attrs.id
88
- // );
89
-
90
- const currentTransactionOriginalOldBlockAttrs = {} as any;
91
-
92
- const oldNodes = findChildren(oldState.doc, (node) => node.attrs.id);
93
- const oldNodesById = new Map(
94
- oldNodes.map((node) => [node.node.attrs.id, node])
95
- );
96
- const newNodes = findChildren(newState.doc, (node) => node.attrs.id);
97
-
98
- // Traverses all block containers in the new editor state.
99
- for (const node of newNodes) {
100
- const oldNode = oldNodesById.get(node.node.attrs.id);
101
-
102
- const oldContentNode = oldNode?.node.firstChild;
103
- const newContentNode = node.node.firstChild;
104
-
105
- if (oldNode && oldContentNode && newContentNode) {
106
- const newAttrs = {
107
- index: newContentNode.attrs.index,
108
- level: newContentNode.attrs.level,
109
- type: newContentNode.type.name,
110
- depth: newState.doc.resolve(node.pos).depth,
111
- };
112
-
113
- let oldAttrs = {
114
- index: oldContentNode.attrs.index,
115
- level: oldContentNode.attrs.level,
116
- type: oldContentNode.type.name,
117
- depth: oldState.doc.resolve(oldNode.pos).depth,
118
- };
119
-
120
- currentTransactionOriginalOldBlockAttrs[node.node.attrs.id] =
121
- oldAttrs;
122
-
123
- // Whenever a transaction is appended by the OrderedListItemIndexPlugin, it's given the metadata:
124
- // { "orderedListIndexing": true }
125
- // These appended transactions happen immediately after any transaction which causes ordered list item
126
- // indices to require updating, including those which trigger animations. Therefore, these animations are
127
- // immediately overridden when the PreviousBlockTypePlugin processes the appended transaction, despite only
128
- // the listItemIndex attribute changing. To solve this, oldAttrs must be edited for transactions with the
129
- // "orderedListIndexing" metadata, so the correct animation can be re-triggered.
130
- if (transaction.getMeta("numberedListIndexing")) {
131
- // If the block existed before the transaction, gets the attributes from before the previous transaction
132
- // (i.e. the transaction that caused list item indices to need updating).
133
- if (node.node.attrs.id in prev.prevTransactionOldBlockAttrs) {
134
- oldAttrs =
135
- prev.prevTransactionOldBlockAttrs[node.node.attrs.id];
68
+ if (!transaction.docChanged || oldState.doc.eq(newState.doc)) {
69
+ return prev;
70
+ }
71
+
72
+ // TODO: Instead of iterating through the entire document, only check nodes affected by the transactions. Will
73
+ // also probably require checking nodes affected by the previous transaction too.
74
+ // We didn't get this to work yet:
75
+ // const transform = combineTransactionSteps(oldState.doc, [transaction]);
76
+ // // const { mapping } = transform;
77
+ // const changes = getChangedRanges(transform);
78
+ //
79
+ // changes.forEach(({ oldRange, newRange }) => {
80
+ // const oldNodes = findChildrenInRange(
81
+ // oldState.doc,
82
+ // oldRange,
83
+ // (node) => node.attrs.id
84
+ // );
85
+ //
86
+ // const newNodes = findChildrenInRange(
87
+ // newState.doc,
88
+ // newRange,
89
+ // (node) => node.attrs.id
90
+ // );
91
+
92
+ const currentTransactionOriginalOldBlockAttrs = {} as any;
93
+
94
+ const oldNodes = findChildren(oldState.doc, (node) => node.attrs.id);
95
+ const oldNodesById = new Map(
96
+ oldNodes.map((node) => [node.node.attrs.id, node])
97
+ );
98
+ const newNodes = findChildren(newState.doc, (node) => node.attrs.id);
99
+
100
+ // Traverses all block containers in the new editor state.
101
+ for (const node of newNodes) {
102
+ const oldNode = oldNodesById.get(node.node.attrs.id);
103
+
104
+ const oldContentNode = oldNode?.node.firstChild;
105
+ const newContentNode = node.node.firstChild;
106
+
107
+ if (oldNode && oldContentNode && newContentNode) {
108
+ const newAttrs = {
109
+ index: newContentNode.attrs.index,
110
+ level: newContentNode.attrs.level,
111
+ type: newContentNode.type.name,
112
+ depth: newState.doc.resolve(node.pos).depth,
113
+ };
114
+
115
+ let oldAttrs = {
116
+ index: oldContentNode.attrs.index,
117
+ level: oldContentNode.attrs.level,
118
+ type: oldContentNode.type.name,
119
+ depth: oldState.doc.resolve(oldNode.pos).depth,
120
+ };
121
+
122
+ currentTransactionOriginalOldBlockAttrs[node.node.attrs.id] =
123
+ oldAttrs;
124
+
125
+ // Whenever a transaction is appended by the OrderedListItemIndexPlugin, it's given the metadata:
126
+ // { "orderedListIndexing": true }
127
+ // These appended transactions happen immediately after any transaction which causes ordered list item
128
+ // indices to require updating, including those which trigger animations. Therefore, these animations are
129
+ // immediately overridden when the PreviousBlockTypePlugin processes the appended transaction, despite only
130
+ // the listItemIndex attribute changing. To solve this, oldAttrs must be edited for transactions with the
131
+ // "orderedListIndexing" metadata, so the correct animation can be re-triggered.
132
+ if (transaction.getMeta("numberedListIndexing")) {
133
+ // If the block existed before the transaction, gets the attributes from before the previous transaction
134
+ // (i.e. the transaction that caused list item indices to need updating).
135
+ if (node.node.attrs.id in prev.prevTransactionOldBlockAttrs) {
136
+ oldAttrs =
137
+ prev.prevTransactionOldBlockAttrs[node.node.attrs.id];
138
+ }
139
+
140
+ // Stops list item indices themselves being animated (looks smoother), unless the block's content type is
141
+ // changing from a numbered list item to something else.
142
+ if (newAttrs.type === "numberedListItem") {
143
+ oldAttrs.index = newAttrs.index;
144
+ }
136
145
  }
137
146
 
138
- // Stops list item indices themselves being animated (looks smoother), unless the block's content type is
139
- // changing from a numbered list item to something else.
140
- if (newAttrs.type === "numberedListItem") {
141
- oldAttrs.index = newAttrs.index;
147
+ prev.currentTransactionOldBlockAttrs[node.node.attrs.id] =
148
+ oldAttrs;
149
+
150
+ // TODO: faster deep equal?
151
+ if (JSON.stringify(oldAttrs) !== JSON.stringify(newAttrs)) {
152
+ (oldAttrs as any)["depth-change"] =
153
+ oldAttrs.depth - newAttrs.depth;
154
+
155
+ // for debugging:
156
+ // console.log(
157
+ // "id:",
158
+ // node.node.attrs.id,
159
+ // "previousBlockTypePlugin changes detected, oldAttrs",
160
+ // oldAttrs,
161
+ // "new",
162
+ // newAttrs
163
+ // );
164
+
165
+ prev.updatedBlocks.add(node.node.attrs.id);
142
166
  }
143
167
  }
168
+ }
144
169
 
145
- prev.currentTransactionOldBlockAttrs[node.node.attrs.id] = oldAttrs;
170
+ prev.prevTransactionOldBlockAttrs =
171
+ currentTransactionOriginalOldBlockAttrs;
146
172
 
147
- // TODO: faster deep equal?
148
- if (JSON.stringify(oldAttrs) !== JSON.stringify(newAttrs)) {
149
- (oldAttrs as any)["depth-change"] =
150
- oldAttrs.depth - newAttrs.depth;
173
+ return prev;
174
+ },
175
+ },
176
+ props: {
177
+ decorations(state) {
178
+ const pluginState = (this as Plugin).getState(state);
179
+ if (pluginState.updatedBlocks.size === 0) {
180
+ return undefined;
181
+ }
151
182
 
152
- // for debugging:
153
- // console.log(
154
- // "id:",
155
- // node.node.attrs.id,
156
- // "previousBlockTypePlugin changes detected, oldAttrs",
157
- // oldAttrs,
158
- // "new",
159
- // newAttrs
160
- // );
183
+ const decorations: Decoration[] = [];
161
184
 
162
- prev.updatedBlocks.add(node.node.attrs.id);
185
+ state.doc.descendants((node, pos) => {
186
+ if (!node.attrs.id) {
187
+ return;
163
188
  }
164
- }
165
- }
166
189
 
167
- prev.prevTransactionOldBlockAttrs =
168
- currentTransactionOriginalOldBlockAttrs;
190
+ if (!pluginState.updatedBlocks.has(node.attrs.id)) {
191
+ return;
192
+ }
169
193
 
170
- return prev;
171
- },
172
- },
173
- props: {
174
- decorations(state) {
175
- const pluginState = (this as Plugin).getState(state);
176
- if (pluginState.updatedBlocks.size === 0) {
177
- return undefined;
178
- }
179
-
180
- const decorations: Decoration[] = [];
181
-
182
- state.doc.descendants((node, pos) => {
183
- if (!node.attrs.id) {
184
- return;
185
- }
194
+ const prevAttrs =
195
+ pluginState.currentTransactionOldBlockAttrs[node.attrs.id];
196
+ const decorationAttrs: any = {};
186
197
 
187
- if (!pluginState.updatedBlocks.has(node.attrs.id)) {
188
- return;
189
- }
190
-
191
- const prevAttrs =
192
- pluginState.currentTransactionOldBlockAttrs[node.attrs.id];
193
- const decorationAttrs: any = {};
198
+ for (const [nodeAttr, val] of Object.entries(prevAttrs)) {
199
+ decorationAttrs["data-prev-" + nodeAttributes[nodeAttr]] =
200
+ val || "none";
201
+ }
194
202
 
195
- for (const [nodeAttr, val] of Object.entries(prevAttrs)) {
196
- decorationAttrs["data-prev-" + nodeAttributes[nodeAttr]] =
197
- val || "none";
198
- }
203
+ // for debugging:
204
+ // console.log(
205
+ // "previousBlockTypePlugin committing decorations",
206
+ // decorationAttrs
207
+ // );
199
208
 
200
- // for debugging:
201
- // console.log(
202
- // "previousBlockTypePlugin committing decorations",
203
- // decorationAttrs
204
- // );
209
+ const decoration = Decoration.node(pos, pos + node.nodeSize, {
210
+ ...decorationAttrs,
211
+ });
205
212
 
206
- const decoration = Decoration.node(pos, pos + node.nodeSize, {
207
- ...decorationAttrs,
213
+ decorations.push(decoration);
208
214
  });
209
215
 
210
- decorations.push(decoration);
211
- });
212
-
213
- return DecorationSet.create(state.doc, decorations);
216
+ return DecorationSet.create(state.doc, decorations);
217
+ },
214
218
  },
215
- },
216
- });
217
- };
219
+ });
220
+ }
221
+ }