@blocknote/core 0.17.1 → 0.19.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 (490) hide show
  1. package/dist/blocknote.js +2774 -1804
  2. package/dist/blocknote.js.map +1 -1
  3. package/dist/blocknote.umd.cjs +9 -6
  4. package/dist/blocknote.umd.cjs.map +1 -1
  5. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js +27 -0
  6. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.js.map +1 -0
  7. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js +99 -0
  8. package/dist/src/api/blockManipulation/commands/insertBlocks/insertBlocks.test.js.map +1 -0
  9. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js +97 -0
  10. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.js.map +1 -0
  11. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js +88 -0
  12. package/dist/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.js.map +1 -0
  13. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.js +116 -0
  14. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.js.map +1 -0
  15. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.test.js +106 -0
  16. package/dist/src/api/blockManipulation/commands/moveBlock/moveBlock.test.js.map +1 -0
  17. package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js +57 -0
  18. package/dist/src/api/blockManipulation/commands/nestBlock/nestBlock.js.map +1 -0
  19. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js +43 -0
  20. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.js.map +1 -0
  21. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js +27 -0
  22. package/dist/src/api/blockManipulation/commands/removeBlocks/removeBlocks.test.js.map +1 -0
  23. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js +29 -0
  24. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.js.map +1 -0
  25. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js +157 -0
  26. package/dist/src/api/blockManipulation/commands/replaceBlocks/replaceBlocks.test.js.map +1 -0
  27. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js +27 -0
  28. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.js.map +1 -0
  29. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js +64 -0
  30. package/dist/src/api/blockManipulation/commands/splitBlock/splitBlock.test.js.map +1 -0
  31. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js +145 -0
  32. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.js.map +1 -0
  33. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js +252 -0
  34. package/dist/src/api/blockManipulation/commands/updateBlock/updateBlock.test.js.map +1 -0
  35. package/dist/src/api/blockManipulation/insertContentAt.js +64 -0
  36. package/dist/src/api/blockManipulation/insertContentAt.js.map +1 -0
  37. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js +76 -0
  38. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.js.map +1 -0
  39. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js +33 -0
  40. package/dist/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.test.js.map +1 -0
  41. package/dist/src/api/blockManipulation/setupTestEnv.js +172 -0
  42. package/dist/src/api/blockManipulation/setupTestEnv.js.map +1 -0
  43. package/dist/src/api/clipboard/clipboard.test.js +246 -0
  44. package/dist/src/api/clipboard/clipboard.test.js.map +1 -0
  45. package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js +8 -0
  46. package/dist/src/api/clipboard/fromClipboard/acceptedMIMETypes.js.map +1 -0
  47. package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js +38 -0
  48. package/dist/src/api/clipboard/fromClipboard/fileDropExtension.js.map +1 -0
  49. package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js +109 -0
  50. package/dist/src/api/clipboard/fromClipboard/handleFileInsertion.js.map +1 -0
  51. package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js +26 -0
  52. package/dist/src/api/clipboard/fromClipboard/handleVSCodePaste.js.map +1 -0
  53. package/dist/src/api/clipboard/fromClipboard/pasteExtension.js +57 -0
  54. package/dist/src/api/clipboard/fromClipboard/pasteExtension.js.map +1 -0
  55. package/dist/src/api/clipboard/toClipboard/copyExtension.js +132 -0
  56. package/dist/src/api/clipboard/toClipboard/copyExtension.js.map +1 -0
  57. package/dist/src/api/exporters/html/externalHTMLExporter.js +35 -0
  58. package/dist/src/api/exporters/html/externalHTMLExporter.js.map +1 -0
  59. package/dist/src/api/exporters/html/htmlConversion.test.js +72 -0
  60. package/dist/src/api/exporters/html/htmlConversion.test.js.map +1 -0
  61. package/dist/src/api/exporters/html/internalHTMLSerializer.js +21 -0
  62. package/dist/src/api/exporters/html/internalHTMLSerializer.js.map +1 -0
  63. package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js +141 -0
  64. package/dist/src/api/exporters/html/util/serializeBlocksExternalHTML.js.map +1 -0
  65. package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js +96 -0
  66. package/dist/src/api/exporters/html/util/serializeBlocksInternalHTML.js.map +1 -0
  67. package/dist/src/api/exporters/markdown/markdownExporter.js +31 -0
  68. package/dist/src/api/exporters/markdown/markdownExporter.js.map +1 -0
  69. package/dist/src/api/exporters/markdown/markdownExporter.test.js +57 -0
  70. package/dist/src/api/exporters/markdown/markdownExporter.test.js.map +1 -0
  71. package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js +33 -0
  72. package/dist/src/api/exporters/markdown/removeUnderlinesRehypePlugin.js.map +1 -0
  73. package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js +37 -0
  74. package/dist/src/api/exporters/markdown/util/addSpacesToCheckboxesRehypePlugin.js.map +1 -0
  75. package/dist/src/api/getBlockInfoFromPos.js +171 -0
  76. package/dist/src/api/getBlockInfoFromPos.js.map +1 -0
  77. package/dist/src/api/nodeConversions/blockToNode.js +197 -0
  78. package/dist/src/api/nodeConversions/blockToNode.js.map +1 -0
  79. package/dist/src/api/nodeConversions/fragmentToBlocks.js +50 -0
  80. package/dist/src/api/nodeConversions/fragmentToBlocks.js.map +1 -0
  81. package/dist/src/api/nodeConversions/nodeConversions.test.js +54 -0
  82. package/dist/src/api/nodeConversions/nodeConversions.test.js.map +1 -0
  83. package/dist/src/api/nodeConversions/nodeToBlock.js +316 -0
  84. package/dist/src/api/nodeConversions/nodeToBlock.js.map +1 -0
  85. package/dist/src/api/nodeUtil.js +28 -0
  86. package/dist/src/api/nodeUtil.js.map +1 -0
  87. package/dist/src/api/parsers/html/parseHTML.js +19 -0
  88. package/dist/src/api/parsers/html/parseHTML.js.map +1 -0
  89. package/dist/src/api/parsers/html/parseHTML.test.js +470 -0
  90. package/dist/src/api/parsers/html/parseHTML.test.js.map +1 -0
  91. package/dist/src/api/parsers/html/util/nestedLists.js +106 -0
  92. package/dist/src/api/parsers/html/util/nestedLists.js.map +1 -0
  93. package/dist/src/api/parsers/html/util/nestedLists.test.js +166 -0
  94. package/dist/src/api/parsers/html/util/nestedLists.test.js.map +1 -0
  95. package/dist/src/api/parsers/markdown/parseMarkdown.js +52 -0
  96. package/dist/src/api/parsers/markdown/parseMarkdown.js.map +1 -0
  97. package/dist/src/api/parsers/markdown/parseMarkdown.test.js +109 -0
  98. package/dist/src/api/parsers/markdown/parseMarkdown.test.js.map +1 -0
  99. package/dist/src/api/testUtil/cases/customBlocks.js +313 -0
  100. package/dist/src/api/testUtil/cases/customBlocks.js.map +1 -0
  101. package/dist/src/api/testUtil/cases/customInlineContent.js +91 -0
  102. package/dist/src/api/testUtil/cases/customInlineContent.js.map +1 -0
  103. package/dist/src/api/testUtil/cases/customStyles.js +83 -0
  104. package/dist/src/api/testUtil/cases/customStyles.js.map +1 -0
  105. package/dist/src/api/testUtil/cases/defaultSchema.js +673 -0
  106. package/dist/src/api/testUtil/cases/defaultSchema.js.map +1 -0
  107. package/dist/src/api/testUtil/index.js +2 -0
  108. package/dist/src/api/testUtil/index.js.map +1 -0
  109. package/dist/src/api/testUtil/partialBlockTestUtil.js +114 -0
  110. package/dist/src/api/testUtil/partialBlockTestUtil.js.map +1 -0
  111. package/dist/src/api/testUtil/paste.js +29 -0
  112. package/dist/src/api/testUtil/paste.js.map +1 -0
  113. package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js +97 -0
  114. package/dist/src/blocks/AudioBlockContent/AudioBlockContent.js.map +1 -0
  115. package/dist/src/blocks/AudioBlockContent/audioBlockHelpers.js +5 -0
  116. package/dist/src/blocks/AudioBlockContent/audioBlockHelpers.js.map +1 -0
  117. package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js +273 -0
  118. package/dist/src/blocks/CodeBlockContent/CodeBlockContent.js.map +1 -0
  119. package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js +90 -0
  120. package/dist/src/blocks/CodeBlockContent/defaultSupportedLanguages.js.map +1 -0
  121. package/dist/src/blocks/FileBlockContent/FileBlockContent.js +70 -0
  122. package/dist/src/blocks/FileBlockContent/FileBlockContent.js.map +1 -0
  123. package/dist/src/blocks/FileBlockContent/fileBlockHelpers.js +317 -0
  124. package/dist/src/blocks/FileBlockContent/fileBlockHelpers.js.map +1 -0
  125. package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js +15 -0
  126. package/dist/src/blocks/FileBlockContent/uploadToTmpFilesDotOrg_DEV_ONLY.js.map +1 -0
  127. package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js +141 -0
  128. package/dist/src/blocks/HeadingBlockContent/HeadingBlockContent.js.map +1 -0
  129. package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js +106 -0
  130. package/dist/src/blocks/ImageBlockContent/ImageBlockContent.js.map +1 -0
  131. package/dist/src/blocks/ImageBlockContent/imageBlockHelpers.js +6 -0
  132. package/dist/src/blocks/ImageBlockContent/imageBlockHelpers.js.map +1 -0
  133. package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js +111 -0
  134. package/dist/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.js.map +1 -0
  135. package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js +218 -0
  136. package/dist/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.js.map +1 -0
  137. package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js +41 -0
  138. package/dist/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.js.map +1 -0
  139. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js +58 -0
  140. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.js.map +1 -0
  141. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js +128 -0
  142. package/dist/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.js.map +1 -0
  143. package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js +51 -0
  144. package/dist/src/blocks/ParagraphBlockContent/ParagraphBlockContent.js.map +1 -0
  145. package/dist/src/blocks/TableBlockContent/TableBlockContent.js +130 -0
  146. package/dist/src/blocks/TableBlockContent/TableBlockContent.js.map +1 -0
  147. package/dist/src/blocks/TableBlockContent/TableExtension.js +57 -0
  148. package/dist/src/blocks/TableBlockContent/TableExtension.js.map +1 -0
  149. package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js +103 -0
  150. package/dist/src/blocks/VideoBlockContent/VideoBlockContent.js.map +1 -0
  151. package/dist/src/blocks/VideoBlockContent/videoBlockHelpers.js +6 -0
  152. package/dist/src/blocks/VideoBlockContent/videoBlockHelpers.js.map +1 -0
  153. package/dist/src/blocks/defaultBlockHelpers.js +50 -0
  154. package/dist/src/blocks/defaultBlockHelpers.js.map +1 -0
  155. package/dist/src/blocks/defaultBlockTypeGuards.js +40 -0
  156. package/dist/src/blocks/defaultBlockTypeGuards.js.map +1 -0
  157. package/dist/src/blocks/defaultBlocks.js +50 -0
  158. package/dist/src/blocks/defaultBlocks.js.map +1 -0
  159. package/dist/src/blocks/defaultProps.js +19 -0
  160. package/dist/src/blocks/defaultProps.js.map +1 -0
  161. package/dist/src/editor/BlockNoteEditor.js +750 -0
  162. package/dist/src/editor/BlockNoteEditor.js.map +1 -0
  163. package/dist/src/editor/BlockNoteEditor.test.js +65 -0
  164. package/dist/src/editor/BlockNoteEditor.test.js.map +1 -0
  165. package/dist/src/editor/BlockNoteExtensions.js +149 -0
  166. package/dist/src/editor/BlockNoteExtensions.js.map +1 -0
  167. package/dist/src/editor/BlockNoteSchema.js +38 -0
  168. package/dist/src/editor/BlockNoteSchema.js.map +1 -0
  169. package/dist/src/editor/BlockNoteTipTapEditor.js +169 -0
  170. package/dist/src/editor/BlockNoteTipTapEditor.js.map +1 -0
  171. package/dist/src/editor/cursorPositionTypes.js +2 -0
  172. package/dist/src/editor/cursorPositionTypes.js.map +1 -0
  173. package/dist/src/editor/defaultColors.js +77 -0
  174. package/dist/src/editor/defaultColors.js.map +1 -0
  175. package/dist/src/editor/selectionTypes.js +2 -0
  176. package/dist/src/editor/selectionTypes.js.map +1 -0
  177. package/dist/src/editor/transformPasted.js +79 -0
  178. package/dist/src/editor/transformPasted.js.map +1 -0
  179. package/dist/src/exporter/Exporter.js +36 -0
  180. package/dist/src/exporter/Exporter.js.map +1 -0
  181. package/dist/src/exporter/index.js +3 -0
  182. package/dist/src/exporter/index.js.map +1 -0
  183. package/dist/src/exporter/mapping.js +12 -0
  184. package/dist/src/exporter/mapping.js.map +1 -0
  185. package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js +30 -0
  186. package/dist/src/extensions/BackgroundColor/BackgroundColorExtension.js.map +1 -0
  187. package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js +39 -0
  188. package/dist/src/extensions/BackgroundColor/BackgroundColorMark.js.map +1 -0
  189. package/dist/src/extensions/FilePanel/FilePanelPlugin.js +131 -0
  190. package/dist/src/extensions/FilePanel/FilePanelPlugin.js.map +1 -0
  191. package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js +195 -0
  192. package/dist/src/extensions/FormattingToolbar/FormattingToolbarPlugin.js.map +1 -0
  193. package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js +309 -0
  194. package/dist/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.js.map +1 -0
  195. package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js +247 -0
  196. package/dist/src/extensions/LinkToolbar/LinkToolbarPlugin.js.map +1 -0
  197. package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js +51 -0
  198. package/dist/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.js.map +1 -0
  199. package/dist/src/extensions/Placeholder/PlaceholderPlugin.js +81 -0
  200. package/dist/src/extensions/Placeholder/PlaceholderPlugin.js.map +1 -0
  201. package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js +183 -0
  202. package/dist/src/extensions/PreviousBlockType/PreviousBlockTypePlugin.js.map +1 -0
  203. package/dist/src/extensions/SideMenu/MultipleNodeSelection.js +68 -0
  204. package/dist/src/extensions/SideMenu/MultipleNodeSelection.js.map +1 -0
  205. package/dist/src/extensions/SideMenu/SideMenuPlugin.js +339 -0
  206. package/dist/src/extensions/SideMenu/SideMenuPlugin.js.map +1 -0
  207. package/dist/src/extensions/SideMenu/dragging.js +128 -0
  208. package/dist/src/extensions/SideMenu/dragging.js.map +1 -0
  209. package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js +2 -0
  210. package/dist/src/extensions/SuggestionMenu/DefaultGridSuggestionItem.js.map +1 -0
  211. package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js +2 -0
  212. package/dist/src/extensions/SuggestionMenu/DefaultSuggestionItem.js.map +1 -0
  213. package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js +245 -0
  214. package/dist/src/extensions/SuggestionMenu/SuggestionPlugin.js.map +1 -0
  215. package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js +26 -0
  216. package/dist/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.js.map +1 -0
  217. package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js +244 -0
  218. package/dist/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.js.map +1 -0
  219. package/dist/src/extensions/TableHandles/TableHandlesPlugin.js +553 -0
  220. package/dist/src/extensions/TableHandles/TableHandlesPlugin.js.map +1 -0
  221. package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js +36 -0
  222. package/dist/src/extensions/TextAlignment/TextAlignmentExtension.js.map +1 -0
  223. package/dist/src/extensions/TextColor/TextColorExtension.js +29 -0
  224. package/dist/src/extensions/TextColor/TextColorExtension.js.map +1 -0
  225. package/dist/src/extensions/TextColor/TextColorMark.js +37 -0
  226. package/dist/src/extensions/TextColor/TextColorMark.js.map +1 -0
  227. package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js +58 -0
  228. package/dist/src/extensions/TrailingNode/TrailingNodeExtension.js.map +1 -0
  229. package/dist/src/extensions/UniqueID/UniqueID.js +283 -0
  230. package/dist/src/extensions/UniqueID/UniqueID.js.map +1 -0
  231. package/dist/src/extensions/getDraggableBlockFromElement.js +13 -0
  232. package/dist/src/extensions/getDraggableBlockFromElement.js.map +1 -0
  233. package/dist/src/extensions-shared/UiElementPosition.js +2 -0
  234. package/dist/src/extensions-shared/UiElementPosition.js.map +1 -0
  235. package/dist/src/i18n/dictionary.js +4 -0
  236. package/dist/src/i18n/dictionary.js.map +1 -0
  237. package/dist/src/i18n/locales/ar.js +298 -0
  238. package/dist/src/i18n/locales/ar.js.map +1 -0
  239. package/dist/src/i18n/locales/de.js +313 -0
  240. package/dist/src/i18n/locales/de.js.map +1 -0
  241. package/dist/src/i18n/locales/en.js +314 -0
  242. package/dist/src/i18n/locales/en.js.map +1 -0
  243. package/dist/src/i18n/locales/es.js +312 -0
  244. package/dist/src/i18n/locales/es.js.map +1 -0
  245. package/dist/src/i18n/locales/fr.js +313 -0
  246. package/dist/src/i18n/locales/fr.js.map +1 -0
  247. package/dist/src/i18n/locales/hr.js +308 -0
  248. package/dist/src/i18n/locales/hr.js.map +1 -0
  249. package/dist/src/i18n/locales/index.js +16 -0
  250. package/dist/src/i18n/locales/index.js.map +1 -0
  251. package/dist/src/i18n/locales/is.js +305 -0
  252. package/dist/src/i18n/locales/is.js.map +1 -0
  253. package/dist/src/i18n/locales/ja.js +333 -0
  254. package/dist/src/i18n/locales/ja.js.map +1 -0
  255. package/dist/src/i18n/locales/ko.js +326 -0
  256. package/dist/src/i18n/locales/ko.js.map +1 -0
  257. package/dist/src/i18n/locales/nl.js +313 -0
  258. package/dist/src/i18n/locales/nl.js.map +1 -0
  259. package/dist/src/i18n/locales/pl.js +297 -0
  260. package/dist/src/i18n/locales/pl.js.map +1 -0
  261. package/dist/src/i18n/locales/pt.js +305 -0
  262. package/dist/src/i18n/locales/pt.js.map +1 -0
  263. package/dist/src/i18n/locales/ru.js +340 -0
  264. package/dist/src/i18n/locales/ru.js.map +1 -0
  265. package/dist/src/i18n/locales/vi.js +312 -0
  266. package/dist/src/i18n/locales/vi.js.map +1 -0
  267. package/dist/src/i18n/locales/zh.js +346 -0
  268. package/dist/src/i18n/locales/zh.js.map +1 -0
  269. package/dist/src/index.js +55 -0
  270. package/dist/src/index.js.map +1 -0
  271. package/dist/src/pm-nodes/BlockContainer.js +72 -0
  272. package/dist/src/pm-nodes/BlockContainer.js.map +1 -0
  273. package/dist/src/pm-nodes/BlockGroup.js +43 -0
  274. package/dist/src/pm-nodes/BlockGroup.js.map +1 -0
  275. package/dist/src/pm-nodes/Doc.js +7 -0
  276. package/dist/src/pm-nodes/Doc.js.map +1 -0
  277. package/dist/src/pm-nodes/index.js +4 -0
  278. package/dist/src/pm-nodes/index.js.map +1 -0
  279. package/dist/src/schema/blocks/createSpec.js +126 -0
  280. package/dist/src/schema/blocks/createSpec.js.map +1 -0
  281. package/dist/src/schema/blocks/internal.js +147 -0
  282. package/dist/src/schema/blocks/internal.js.map +1 -0
  283. package/dist/src/schema/blocks/types.js +2 -0
  284. package/dist/src/schema/blocks/types.js.map +1 -0
  285. package/dist/src/schema/index.js +11 -0
  286. package/dist/src/schema/index.js.map +1 -0
  287. package/dist/src/schema/inlineContent/createSpec.js +64 -0
  288. package/dist/src/schema/inlineContent/createSpec.js.map +1 -0
  289. package/dist/src/schema/inlineContent/internal.js +52 -0
  290. package/dist/src/schema/inlineContent/internal.js.map +1 -0
  291. package/dist/src/schema/inlineContent/types.js +10 -0
  292. package/dist/src/schema/inlineContent/types.js.map +1 -0
  293. package/dist/src/schema/propTypes.js +2 -0
  294. package/dist/src/schema/propTypes.js.map +1 -0
  295. package/dist/src/schema/styles/createSpec.js +48 -0
  296. package/dist/src/schema/styles/createSpec.js.map +1 -0
  297. package/dist/src/schema/styles/internal.js +53 -0
  298. package/dist/src/schema/styles/internal.js.map +1 -0
  299. package/dist/src/schema/styles/types.js +2 -0
  300. package/dist/src/schema/styles/types.js.map +1 -0
  301. package/dist/src/util/EventEmitter.js +33 -0
  302. package/dist/src/util/EventEmitter.js.map +1 -0
  303. package/dist/src/util/browser.js +17 -0
  304. package/dist/src/util/browser.js.map +1 -0
  305. package/dist/src/util/combineByGroup.js +20 -0
  306. package/dist/src/util/combineByGroup.js.map +1 -0
  307. package/dist/src/util/esmDependencies.js +35 -0
  308. package/dist/src/util/esmDependencies.js.map +1 -0
  309. package/dist/src/util/string.js +14 -0
  310. package/dist/src/util/string.js.map +1 -0
  311. package/dist/src/util/typescript.js +12 -0
  312. package/dist/src/util/typescript.js.map +1 -0
  313. package/dist/style.css +1 -1
  314. package/dist/tsconfig.tsbuildinfo +1 -0
  315. package/dist/webpack-stats.json +1 -1
  316. package/package.json +9 -7
  317. package/src/api/blockManipulation/commands/insertBlocks/__snapshots__/insertBlocks.test.ts.snap +30 -0
  318. package/src/api/blockManipulation/commands/insertBlocks/insertBlocks.ts +2 -0
  319. package/src/api/blockManipulation/commands/mergeBlocks/__snapshots__/mergeBlocks.test.ts.snap +25 -0
  320. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.test.ts +2 -2
  321. package/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.ts +104 -39
  322. package/src/api/blockManipulation/commands/moveBlock/__snapshots__/moveBlock.test.ts.snap +40 -0
  323. package/src/api/blockManipulation/commands/moveBlock/moveBlock.ts +3 -5
  324. package/src/api/blockManipulation/commands/nestBlock/nestBlock.ts +100 -0
  325. package/src/api/blockManipulation/commands/removeBlocks/__snapshots__/removeBlocks.test.ts.snap +10 -0
  326. package/src/api/blockManipulation/commands/removeBlocks/removeBlocks.ts +1 -1
  327. package/src/api/blockManipulation/commands/replaceBlocks/__snapshots__/replaceBlocks.test.ts.snap +40 -0
  328. package/src/api/blockManipulation/commands/splitBlock/__snapshots__/splitBlock.test.ts.snap +30 -0
  329. package/src/api/blockManipulation/commands/splitBlock/splitBlock.test.ts +8 -4
  330. package/src/api/blockManipulation/commands/splitBlock/splitBlock.ts +11 -7
  331. package/src/api/blockManipulation/commands/updateBlock/__snapshots__/updateBlock.test.ts.snap +87 -0
  332. package/src/api/blockManipulation/commands/updateBlock/updateBlock.test.ts +5 -5
  333. package/src/api/blockManipulation/commands/updateBlock/updateBlock.ts +192 -107
  334. package/src/api/blockManipulation/selections/textCursorPosition/textCursorPosition.ts +48 -33
  335. package/src/api/clipboard/clipboard.test.ts +1 -1
  336. package/src/api/clipboard/fromClipboard/acceptedMIMETypes.ts +1 -0
  337. package/src/api/clipboard/fromClipboard/handleFileInsertion.ts +1 -1
  338. package/src/api/clipboard/fromClipboard/handleVSCodePaste.ts +49 -0
  339. package/src/api/clipboard/fromClipboard/pasteExtension.ts +6 -0
  340. package/src/api/clipboard/toClipboard/copyExtension.ts +1 -1
  341. package/src/api/exporters/html/__snapshots__/codeBlock/defaultLanguage/external.html +1 -0
  342. package/src/api/exporters/html/__snapshots__/codeBlock/defaultLanguage/internal.html +1 -0
  343. package/src/api/exporters/html/__snapshots__/codeBlock/empty/external.html +1 -0
  344. package/src/api/exporters/html/__snapshots__/codeBlock/empty/internal.html +1 -0
  345. package/src/api/exporters/html/__snapshots__/codeBlock/python/external.html +1 -0
  346. package/src/api/exporters/html/__snapshots__/codeBlock/python/internal.html +1 -0
  347. package/src/api/exporters/html/__snapshots__/image/basic/internal.html +1 -1
  348. package/src/api/exporters/html/__snapshots__/image/nested/internal.html +1 -1
  349. package/src/api/exporters/html/__snapshots__/image/noName/internal.html +1 -1
  350. package/src/api/exporters/html/__snapshots__/image/noPreview/internal.html +1 -1
  351. package/src/api/exporters/html/__snapshots__/lists/basic/internal.html +1 -1
  352. package/src/api/exporters/html/__snapshots__/lists/nested/internal.html +1 -1
  353. package/src/api/exporters/html/__snapshots__/simpleImage/basic/external.html +1 -1
  354. package/src/api/exporters/html/__snapshots__/simpleImage/basic/internal.html +1 -1
  355. package/src/api/exporters/html/__snapshots__/simpleImage/nested/external.html +1 -1
  356. package/src/api/exporters/html/__snapshots__/simpleImage/nested/internal.html +1 -1
  357. package/src/api/exporters/html/__snapshots__/simpleImage/noCaption/external.html +1 -1
  358. package/src/api/exporters/html/__snapshots__/simpleImage/noName/external.html +1 -1
  359. package/src/api/exporters/html/__snapshots__/simpleImage/noName/internal.html +1 -1
  360. package/src/api/exporters/html/__snapshots__/simpleImage/noPreview/external.html +1 -1
  361. package/src/api/exporters/html/__snapshots__/simpleImage/noPreview/internal.html +1 -1
  362. package/src/api/exporters/html/__snapshots__/table/allColWidths/external.html +1 -0
  363. package/src/api/exporters/html/__snapshots__/table/allColWidths/internal.html +1 -0
  364. package/src/api/exporters/html/__snapshots__/table/basic/external.html +1 -0
  365. package/src/api/exporters/html/__snapshots__/table/basic/internal.html +1 -0
  366. package/src/api/exporters/html/__snapshots__/table/mixedColWidths/external.html +1 -0
  367. package/src/api/exporters/html/__snapshots__/table/mixedColWidths/internal.html +1 -0
  368. package/src/api/exporters/html/htmlConversion.test.ts +1 -4
  369. package/src/api/exporters/html/internalHTMLSerializer.ts +2 -7
  370. package/src/api/exporters/html/util/serializeBlocksExternalHTML.ts +7 -1
  371. package/src/api/exporters/html/util/serializeBlocksInternalHTML.ts +75 -33
  372. package/src/api/exporters/markdown/__snapshots__/codeBlock/defaultLanguage/markdown.md +3 -0
  373. package/src/api/exporters/markdown/__snapshots__/codeBlock/empty/markdown.md +2 -0
  374. package/src/api/exporters/markdown/__snapshots__/codeBlock/python/markdown.md +3 -0
  375. package/src/api/exporters/markdown/__snapshots__/table/allColWidths/markdown.md +5 -0
  376. package/src/api/exporters/markdown/__snapshots__/table/basic/markdown.md +5 -0
  377. package/src/api/exporters/markdown/__snapshots__/table/mixedColWidths/markdown.md +5 -0
  378. package/src/api/exporters/markdown/markdownExporter.test.ts +1 -4
  379. package/src/api/getBlockInfoFromPos.ts +113 -58
  380. package/src/api/nodeConversions/__snapshots__/nodeConversions.test.ts.snap +711 -0
  381. package/src/api/nodeConversions/blockToNode.ts +62 -26
  382. package/src/api/nodeConversions/fragmentToBlocks.ts +18 -0
  383. package/src/api/nodeConversions/nodeToBlock.ts +35 -22
  384. package/src/api/nodeUtil.ts +1 -1
  385. package/src/api/parsers/html/__snapshots__/parse-notion-html.json +5 -0
  386. package/src/api/parsers/markdown/parseMarkdown.ts +1 -1
  387. package/src/api/testUtil/cases/defaultSchema.ts +95 -0
  388. package/src/api/testUtil/partialBlockTestUtil.ts +41 -4
  389. package/src/blocks/AudioBlockContent/AudioBlockContent.ts +4 -2
  390. package/src/blocks/CodeBlockContent/CodeBlockContent.ts +369 -0
  391. package/src/blocks/CodeBlockContent/defaultSupportedLanguages.ts +96 -0
  392. package/src/blocks/FileBlockContent/fileBlockHelpers.ts +10 -2
  393. package/src/blocks/HeadingBlockContent/HeadingBlockContent.ts +19 -31
  394. package/src/blocks/ImageBlockContent/ImageBlockContent.ts +4 -2
  395. package/src/blocks/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +5 -9
  396. package/src/blocks/ListItemBlockContent/CheckListItemBlockContent/CheckListItemBlockContent.ts +6 -10
  397. package/src/blocks/ListItemBlockContent/ListItemKeyboardShortcuts.ts +1 -1
  398. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListIndexingPlugin.ts +11 -4
  399. package/src/blocks/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +5 -9
  400. package/src/blocks/ParagraphBlockContent/ParagraphBlockContent.ts +4 -8
  401. package/src/blocks/TableBlockContent/TableBlockContent.ts +83 -8
  402. package/src/blocks/TableBlockContent/TableExtension.ts +10 -1
  403. package/src/blocks/VideoBlockContent/VideoBlockContent.ts +4 -2
  404. package/src/blocks/defaultBlockHelpers.ts +7 -2
  405. package/src/blocks/defaultBlocks.ts +4 -0
  406. package/src/editor/Block.css +71 -3
  407. package/src/editor/BlockNoteEditor.test.ts +2 -2
  408. package/src/editor/BlockNoteEditor.ts +18 -21
  409. package/src/editor/BlockNoteExtensions.ts +2 -3
  410. package/src/editor/BlockNoteTipTapEditor.ts +8 -1
  411. package/src/editor/defaultColors.ts +77 -0
  412. package/src/editor/editor.css +43 -5
  413. package/src/editor/transformPasted.ts +6 -3
  414. package/src/exporter/Exporter.ts +101 -0
  415. package/src/exporter/index.ts +2 -0
  416. package/src/exporter/mapping.ts +75 -0
  417. package/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +8 -0
  418. package/src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts +201 -48
  419. package/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.ts +1 -1
  420. package/src/extensions/Placeholder/PlaceholderPlugin.ts +5 -0
  421. package/src/extensions/SideMenu/SideMenuPlugin.ts +141 -52
  422. package/src/extensions/SideMenu/dragging.ts +3 -54
  423. package/src/extensions/SuggestionMenu/SuggestionPlugin.ts +5 -0
  424. package/src/extensions/SuggestionMenu/getDefaultEmojiPickerItems.ts +2 -1
  425. package/src/extensions/SuggestionMenu/getDefaultSlashMenuItems.ts +22 -6
  426. package/src/extensions/TableHandles/TableHandlesPlugin.ts +225 -120
  427. package/src/extensions/TrailingNode/TrailingNodeExtension.ts +1 -1
  428. package/src/extensions/getDraggableBlockFromElement.ts +19 -0
  429. package/src/i18n/locales/ar.ts +6 -0
  430. package/src/i18n/locales/de.ts +299 -294
  431. package/src/i18n/locales/en.ts +6 -0
  432. package/src/i18n/locales/es.ts +310 -274
  433. package/src/i18n/locales/fr.ts +6 -0
  434. package/src/i18n/locales/is.ts +6 -0
  435. package/src/i18n/locales/ja.ts +6 -0
  436. package/src/i18n/locales/ko.ts +6 -0
  437. package/src/i18n/locales/nl.ts +6 -0
  438. package/src/i18n/locales/pl.ts +6 -0
  439. package/src/i18n/locales/pt.ts +10 -4
  440. package/src/i18n/locales/ru.ts +6 -0
  441. package/src/i18n/locales/vi.ts +6 -0
  442. package/src/i18n/locales/zh.ts +6 -0
  443. package/src/index.ts +9 -0
  444. package/src/pm-nodes/BlockContainer.ts +1 -1
  445. package/src/pm-nodes/BlockGroup.ts +2 -2
  446. package/src/pm-nodes/README.md +127 -28
  447. package/src/schema/blocks/createSpec.ts +4 -1
  448. package/src/schema/blocks/internal.ts +12 -2
  449. package/src/schema/blocks/types.ts +3 -1
  450. package/src/util/combineByGroup.ts +25 -0
  451. package/types/src/api/blockManipulation/commands/mergeBlocks/mergeBlocks.d.ts +22 -2
  452. package/types/src/api/blockManipulation/commands/nestBlock/nestBlock.d.ts +5 -0
  453. package/types/src/api/blockManipulation/setupTestEnv.d.ts +22 -8
  454. package/types/src/api/clipboard/fromClipboard/acceptedMIMETypes.d.ts +1 -1
  455. package/types/src/api/clipboard/fromClipboard/handleVSCodePaste.d.ts +3 -0
  456. package/types/src/api/exporters/html/util/serializeBlocksInternalHTML.d.ts +2 -3
  457. package/types/src/api/getBlockInfoFromPos.d.ts +55 -5
  458. package/types/src/api/nodeConversions/blockToNode.d.ts +1 -1
  459. package/types/src/api/nodeConversions/nodeToBlock.d.ts +3 -1
  460. package/types/src/api/testUtil/cases/customBlocks.d.ts +22 -8
  461. package/types/src/api/testUtil/cases/customInlineContent.d.ts +22 -8
  462. package/types/src/api/testUtil/cases/customStyles.d.ts +22 -8
  463. package/types/src/api/testUtil/partialBlockTestUtil.d.ts +2 -1
  464. package/types/src/blocks/AudioBlockContent/AudioBlockContent.d.ts +1 -0
  465. package/types/src/blocks/CodeBlockContent/CodeBlockContent.d.ts +57 -0
  466. package/types/src/blocks/CodeBlockContent/defaultSupportedLanguages.d.ts +6 -0
  467. package/types/src/blocks/FileBlockContent/fileBlockHelpers.d.ts +1 -0
  468. package/types/src/blocks/ImageBlockContent/ImageBlockContent.d.ts +1 -0
  469. package/types/src/blocks/TableBlockContent/TableBlockContent.d.ts +0 -12
  470. package/types/src/blocks/TableBlockContent/TableExtension.d.ts +3 -0
  471. package/types/src/blocks/VideoBlockContent/VideoBlockContent.d.ts +1 -0
  472. package/types/src/blocks/defaultBlocks.d.ts +45 -16
  473. package/types/src/editor/BlockNoteEditor.d.ts +4 -3
  474. package/types/src/editor/BlockNoteTipTapEditor.d.ts +1 -0
  475. package/types/src/editor/defaultColors.d.ts +76 -0
  476. package/types/src/exporter/Exporter.d.ts +43 -0
  477. package/types/src/exporter/index.d.ts +2 -0
  478. package/types/src/exporter/mapping.d.ts +30 -0
  479. package/types/src/extensions/SideMenu/SideMenuPlugin.d.ts +2 -1
  480. package/types/src/extensions/SideMenu/dragging.d.ts +1 -6
  481. package/types/src/extensions/TableHandles/TableHandlesPlugin.d.ts +9 -5
  482. package/types/src/extensions/getDraggableBlockFromElement.d.ts +5 -0
  483. package/types/src/i18n/locales/de.d.ts +6 -0
  484. package/types/src/i18n/locales/en.d.ts +6 -0
  485. package/types/src/i18n/locales/es.d.ts +6 -0
  486. package/types/src/index.d.ts +6 -0
  487. package/types/src/schema/blocks/createSpec.d.ts +1 -1
  488. package/types/src/schema/blocks/internal.d.ts +2 -2
  489. package/types/src/schema/blocks/types.d.ts +3 -1
  490. package/types/src/util/combineByGroup.d.ts +9 -0
@@ -0,0 +1,309 @@
1
+ import { Extension } from "@tiptap/core";
2
+ import { TextSelection } from "prosemirror-state";
3
+ import { ReplaceAroundStep } from "prosemirror-transform";
4
+ import { getBottomNestedBlockInfo, getParentBlockInfo, getPrevBlockInfo, mergeBlocksCommand, } from "../../api/blockManipulation/commands/mergeBlocks/mergeBlocks.js";
5
+ import { nestBlock } from "../../api/blockManipulation/commands/nestBlock/nestBlock.js";
6
+ import { splitBlockCommand } from "../../api/blockManipulation/commands/splitBlock/splitBlock.js";
7
+ import { updateBlockCommand } from "../../api/blockManipulation/commands/updateBlock/updateBlock.js";
8
+ import { getBlockInfoFromSelection } from "../../api/getBlockInfoFromPos.js";
9
+ export const KeyboardShortcutsExtension = Extension.create({
10
+ priority: 50,
11
+ // TODO: The shortcuts need a refactor. Do we want to use a command priority
12
+ // design as there is now, or clump the logic into a single function?
13
+ addKeyboardShortcuts() {
14
+ // handleBackspace is partially adapted from https://github.com/ueberdosis/tiptap/blob/ed56337470efb4fd277128ab7ef792b37cfae992/packages/core/src/extensions/keymap.ts
15
+ const handleBackspace = () => this.editor.commands.first(({ chain, commands }) => [
16
+ // Deletes the selection if it's not empty.
17
+ () => commands.deleteSelection(),
18
+ // Undoes an input rule if one was triggered in the last editor state change.
19
+ () => commands.undoInputRule(),
20
+ // Reverts block content type to a paragraph if the selection is at the start of the block.
21
+ () => commands.command(({ state }) => {
22
+ const blockInfo = getBlockInfoFromSelection(state);
23
+ const selectionAtBlockStart = state.selection.from === blockInfo.blockContent.beforePos + 1;
24
+ const isParagraph = blockInfo.blockContent.node.type.name === "paragraph";
25
+ if (selectionAtBlockStart && !isParagraph) {
26
+ return commands.command(updateBlockCommand(this.options.editor, blockInfo.bnBlock.beforePos, {
27
+ type: "paragraph",
28
+ props: {},
29
+ }));
30
+ }
31
+ return false;
32
+ }),
33
+ // Removes a level of nesting if the block is indented if the selection is at the start of the block.
34
+ () => commands.command(({ state }) => {
35
+ const { blockContent } = getBlockInfoFromSelection(state);
36
+ const selectionAtBlockStart = state.selection.from === blockContent.beforePos + 1;
37
+ if (selectionAtBlockStart) {
38
+ return commands.liftListItem("blockContainer");
39
+ }
40
+ return false;
41
+ }),
42
+ // Merges block with the previous one if it isn't indented, and the selection is at the start of the
43
+ // block. The target block for merging must contain inline content.
44
+ () => commands.command(({ state }) => {
45
+ const { bnBlock: blockContainer, blockContent } = getBlockInfoFromSelection(state);
46
+ const selectionAtBlockStart = state.selection.from === blockContent.beforePos + 1;
47
+ const selectionEmpty = state.selection.empty;
48
+ const posBetweenBlocks = blockContainer.beforePos;
49
+ if (selectionAtBlockStart && selectionEmpty) {
50
+ return chain()
51
+ .command(mergeBlocksCommand(posBetweenBlocks))
52
+ .scrollIntoView()
53
+ .run();
54
+ }
55
+ return false;
56
+ }),
57
+ () => commands.command(({ state, dispatch }) => {
58
+ // when at the start of a first block in a column
59
+ const blockInfo = getBlockInfoFromSelection(state);
60
+ const selectionAtBlockStart = state.selection.from === blockInfo.blockContent.beforePos + 1;
61
+ if (!selectionAtBlockStart) {
62
+ return false;
63
+ }
64
+ const prevBlockInfo = getPrevBlockInfo(state.doc, blockInfo.bnBlock.beforePos);
65
+ if (prevBlockInfo) {
66
+ // should be no previous block
67
+ return false;
68
+ }
69
+ const parentBlockInfo = getParentBlockInfo(state.doc, blockInfo.bnBlock.beforePos);
70
+ if (parentBlockInfo?.blockNoteType !== "column") {
71
+ return false;
72
+ }
73
+ const column = parentBlockInfo;
74
+ const columnList = getParentBlockInfo(state.doc, column.bnBlock.beforePos);
75
+ if (columnList?.blockNoteType !== "columnList") {
76
+ throw new Error("parent of column is not a column list");
77
+ }
78
+ const shouldRemoveColumn = column.childContainer.node.childCount === 1;
79
+ const shouldRemoveColumnList = shouldRemoveColumn &&
80
+ columnList.childContainer.node.childCount === 2;
81
+ const isFirstColumn = columnList.childContainer.node.firstChild ===
82
+ column.bnBlock.node;
83
+ if (dispatch) {
84
+ const blockToMove = state.doc.slice(blockInfo.bnBlock.beforePos, blockInfo.bnBlock.afterPos, false);
85
+ /*
86
+ There are 3 different cases:
87
+ a) remove entire column list (if no columns would be remaining)
88
+ b) remove just a column (if no blocks inside a column would be remaining)
89
+ c) keep columns (if there are blocks remaining inside a column)
90
+
91
+ Each of these 3 cases has 2 sub-cases, depending on whether the backspace happens at the start of the first (most-left) column,
92
+ or at the start of a non-first column.
93
+ */
94
+ if (shouldRemoveColumnList) {
95
+ if (isFirstColumn) {
96
+ state.tr.step(new ReplaceAroundStep(
97
+ // replace entire column list
98
+ columnList.bnBlock.beforePos, columnList.bnBlock.afterPos,
99
+ // select content of remaining column:
100
+ column.bnBlock.afterPos + 1, columnList.bnBlock.afterPos - 2, blockToMove, blockToMove.size, // append existing content to blockToMove
101
+ false));
102
+ const pos = state.tr.doc.resolve(column.bnBlock.beforePos);
103
+ state.tr.setSelection(TextSelection.between(pos, pos));
104
+ }
105
+ else {
106
+ // replaces the column list with the blockToMove slice, prepended with the content of the remaining column
107
+ state.tr.step(new ReplaceAroundStep(
108
+ // replace entire column list
109
+ columnList.bnBlock.beforePos, columnList.bnBlock.afterPos,
110
+ // select content of existing column:
111
+ columnList.bnBlock.beforePos + 2, column.bnBlock.beforePos - 1, blockToMove, 0, // prepend existing content to blockToMove
112
+ false));
113
+ const pos = state.tr.doc.resolve(state.tr.mapping.map(column.bnBlock.beforePos - 1));
114
+ state.tr.setSelection(TextSelection.between(pos, pos));
115
+ }
116
+ }
117
+ else if (shouldRemoveColumn) {
118
+ if (isFirstColumn) {
119
+ // delete column
120
+ state.tr.delete(column.bnBlock.beforePos, column.bnBlock.afterPos);
121
+ // move before columnlist
122
+ state.tr.insert(columnList.bnBlock.beforePos, blockToMove.content);
123
+ const pos = state.tr.doc.resolve(columnList.bnBlock.beforePos);
124
+ state.tr.setSelection(TextSelection.between(pos, pos));
125
+ }
126
+ else {
127
+ // just delete the </column><column> closing and opening tags to merge the columns
128
+ state.tr.delete(column.bnBlock.beforePos - 1, column.bnBlock.beforePos + 1);
129
+ }
130
+ }
131
+ else {
132
+ // delete block
133
+ state.tr.delete(blockInfo.bnBlock.beforePos, blockInfo.bnBlock.afterPos);
134
+ if (isFirstColumn) {
135
+ // move before columnlist
136
+ state.tr.insert(columnList.bnBlock.beforePos - 1, blockToMove.content);
137
+ }
138
+ else {
139
+ // append block to previous column
140
+ state.tr.insert(column.bnBlock.beforePos - 1, blockToMove.content);
141
+ }
142
+ const pos = state.tr.doc.resolve(column.bnBlock.beforePos - 1);
143
+ state.tr.setSelection(TextSelection.between(pos, pos));
144
+ }
145
+ }
146
+ return true;
147
+ }),
148
+ // Deletes previous block if it contains no content and isn't a table,
149
+ // when the selection is empty and at the start of the block. Moves the
150
+ // current block into the deleted block's place.
151
+ () => commands.command(({ state }) => {
152
+ const blockInfo = getBlockInfoFromSelection(state);
153
+ if (!blockInfo.isBlockContainer) {
154
+ // TODO
155
+ throw new Error(`todo`);
156
+ }
157
+ const selectionAtBlockStart = state.selection.from === blockInfo.blockContent.beforePos + 1;
158
+ const selectionEmpty = state.selection.empty;
159
+ const prevBlockInfo = getPrevBlockInfo(state.doc, blockInfo.bnBlock.beforePos);
160
+ if (prevBlockInfo && selectionAtBlockStart && selectionEmpty) {
161
+ const bottomBlock = getBottomNestedBlockInfo(state.doc, prevBlockInfo);
162
+ if (!bottomBlock.isBlockContainer) {
163
+ // TODO
164
+ throw new Error(`todo`);
165
+ }
166
+ const prevBlockNotTableAndNoContent = bottomBlock.blockContent.node.type.spec.content === "" ||
167
+ (bottomBlock.blockContent.node.type.spec.content ===
168
+ "inline*" &&
169
+ bottomBlock.blockContent.node.childCount === 0);
170
+ if (prevBlockNotTableAndNoContent) {
171
+ return chain()
172
+ .cut({
173
+ from: blockInfo.bnBlock.beforePos,
174
+ to: blockInfo.bnBlock.afterPos,
175
+ }, bottomBlock.bnBlock.afterPos)
176
+ .deleteRange({
177
+ from: bottomBlock.bnBlock.beforePos,
178
+ to: bottomBlock.bnBlock.afterPos,
179
+ })
180
+ .run();
181
+ }
182
+ }
183
+ return false;
184
+ }),
185
+ ]);
186
+ const handleDelete = () => this.editor.commands.first(({ commands }) => [
187
+ // Deletes the selection if it's not empty.
188
+ () => commands.deleteSelection(),
189
+ // Merges block with the next one (at the same nesting level or lower),
190
+ // if one exists, the block has no children, and the selection is at the
191
+ // end of the block.
192
+ () => commands.command(({ state }) => {
193
+ // TODO: Change this to not rely on offsets & schema assumptions
194
+ const { bnBlock: blockContainer, blockContent, childContainer, } = getBlockInfoFromSelection(state);
195
+ const { depth } = state.doc.resolve(blockContainer.beforePos);
196
+ const blockAtDocEnd = blockContainer.afterPos === state.doc.nodeSize - 3;
197
+ const selectionAtBlockEnd = state.selection.from === blockContent.afterPos - 1;
198
+ const selectionEmpty = state.selection.empty;
199
+ const hasChildBlocks = childContainer !== undefined;
200
+ if (!blockAtDocEnd &&
201
+ selectionAtBlockEnd &&
202
+ selectionEmpty &&
203
+ !hasChildBlocks) {
204
+ let oldDepth = depth;
205
+ let newPos = blockContainer.afterPos + 1;
206
+ let newDepth = state.doc.resolve(newPos).depth;
207
+ while (newDepth < oldDepth) {
208
+ oldDepth = newDepth;
209
+ newPos += 2;
210
+ newDepth = state.doc.resolve(newPos).depth;
211
+ }
212
+ return commands.command(mergeBlocksCommand(newPos - 1));
213
+ }
214
+ return false;
215
+ }),
216
+ ]);
217
+ const handleEnter = () => this.editor.commands.first(({ commands }) => [
218
+ // Removes a level of nesting if the block is empty & indented, while the selection is also empty & at the start
219
+ // of the block.
220
+ () => commands.command(({ state }) => {
221
+ const { blockContent, bnBlock: blockContainer } = getBlockInfoFromSelection(state);
222
+ const { depth } = state.doc.resolve(blockContainer.beforePos);
223
+ const selectionAtBlockStart = state.selection.$anchor.parentOffset === 0;
224
+ const selectionEmpty = state.selection.anchor === state.selection.head;
225
+ const blockEmpty = blockContent.node.childCount === 0;
226
+ const blockIndented = depth > 1;
227
+ if (selectionAtBlockStart &&
228
+ selectionEmpty &&
229
+ blockEmpty &&
230
+ blockIndented) {
231
+ return commands.liftListItem("blockContainer");
232
+ }
233
+ return false;
234
+ }),
235
+ // Creates a new block and moves the selection to it if the current one is empty, while the selection is also
236
+ // empty & at the start of the block.
237
+ () => commands.command(({ state, dispatch }) => {
238
+ const { bnBlock: blockContainer, blockContent } = getBlockInfoFromSelection(state);
239
+ const selectionAtBlockStart = state.selection.$anchor.parentOffset === 0;
240
+ const selectionEmpty = state.selection.anchor === state.selection.head;
241
+ const blockEmpty = blockContent.node.childCount === 0;
242
+ if (selectionAtBlockStart && selectionEmpty && blockEmpty) {
243
+ const newBlockInsertionPos = blockContainer.afterPos;
244
+ const newBlockContentPos = newBlockInsertionPos + 2;
245
+ if (dispatch) {
246
+ const newBlock = state.schema.nodes["blockContainer"].createAndFill();
247
+ state.tr
248
+ .insert(newBlockInsertionPos, newBlock)
249
+ .scrollIntoView();
250
+ state.tr.setSelection(new TextSelection(state.doc.resolve(newBlockContentPos)));
251
+ }
252
+ return true;
253
+ }
254
+ return false;
255
+ }),
256
+ // Splits the current block, moving content inside that's after the cursor to a new text block below. Also
257
+ // deletes the selection beforehand, if it's not empty.
258
+ () => commands.command(({ state, chain }) => {
259
+ const { blockContent } = getBlockInfoFromSelection(state);
260
+ const selectionAtBlockStart = state.selection.$anchor.parentOffset === 0;
261
+ const blockEmpty = blockContent.node.childCount === 0;
262
+ if (!blockEmpty) {
263
+ chain()
264
+ .deleteSelection()
265
+ .command(splitBlockCommand(state.selection.from, selectionAtBlockStart, selectionAtBlockStart))
266
+ .run();
267
+ return true;
268
+ }
269
+ return false;
270
+ }),
271
+ ]);
272
+ return {
273
+ Backspace: handleBackspace,
274
+ Delete: handleDelete,
275
+ Enter: handleEnter,
276
+ // Always returning true for tab key presses ensures they're not captured by the browser. Otherwise, they blur the
277
+ // editor since the browser will try to use tab for keyboard navigation.
278
+ Tab: () => {
279
+ if (this.options.editor.formattingToolbar?.shown ||
280
+ this.options.editor.linkToolbar?.shown ||
281
+ this.options.editor.filePanel?.shown) {
282
+ // don't handle tabs if a toolbar is shown, so we can tab into / out of it
283
+ return false;
284
+ }
285
+ return nestBlock(this.options.editor);
286
+ // return true;
287
+ },
288
+ "Shift-Tab": () => {
289
+ if (this.options.editor.formattingToolbar?.shown ||
290
+ this.options.editor.linkToolbar?.shown ||
291
+ this.options.editor.filePanel?.shown) {
292
+ // don't handle tabs if a toolbar is shown, so we can tab into / out of it
293
+ return false;
294
+ }
295
+ this.editor.commands.liftListItem("blockContainer");
296
+ return true;
297
+ },
298
+ "Shift-Mod-ArrowUp": () => {
299
+ this.options.editor.moveBlockUp();
300
+ return true;
301
+ },
302
+ "Shift-Mod-ArrowDown": () => {
303
+ this.options.editor.moveBlockDown();
304
+ return true;
305
+ },
306
+ };
307
+ },
308
+ });
309
+ //# sourceMappingURL=KeyboardShortcutsExtension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyboardShortcutsExtension.js","sourceRoot":"","sources":["../../../../src/extensions/KeyboardShortcuts/KeyboardShortcutsExtension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,247 @@
1
+ import { getMarkRange, posToDOMRect } from "@tiptap/core";
2
+ import { Plugin, PluginKey } from "prosemirror-state";
3
+ import { EventEmitter } from "../../util/EventEmitter.js";
4
+ class LinkToolbarView {
5
+ editor;
6
+ pmView;
7
+ state;
8
+ emitUpdate;
9
+ menuUpdateTimer;
10
+ startMenuUpdateTimer;
11
+ stopMenuUpdateTimer;
12
+ mouseHoveredLinkMark;
13
+ mouseHoveredLinkMarkRange;
14
+ keyboardHoveredLinkMark;
15
+ keyboardHoveredLinkMarkRange;
16
+ linkMark;
17
+ linkMarkRange;
18
+ constructor(editor, pmView, emitUpdate) {
19
+ this.editor = editor;
20
+ this.pmView = pmView;
21
+ this.emitUpdate = () => {
22
+ if (!this.state) {
23
+ throw new Error("Attempting to update uninitialized link toolbar");
24
+ }
25
+ emitUpdate(this.state);
26
+ };
27
+ this.startMenuUpdateTimer = () => {
28
+ this.menuUpdateTimer = setTimeout(() => {
29
+ this.update();
30
+ }, 250);
31
+ };
32
+ this.stopMenuUpdateTimer = () => {
33
+ if (this.menuUpdateTimer) {
34
+ clearTimeout(this.menuUpdateTimer);
35
+ this.menuUpdateTimer = undefined;
36
+ }
37
+ return false;
38
+ };
39
+ this.pmView.dom.addEventListener("mouseover", this.mouseOverHandler);
40
+ this.pmView.root.addEventListener("click", this.clickHandler, true);
41
+ // Setting capture=true ensures that any parent container of the editor that
42
+ // gets scrolled will trigger the scroll event. Scroll events do not bubble
43
+ // and so won't propagate to the document by default.
44
+ this.pmView.root.addEventListener("scroll", this.scrollHandler, true);
45
+ }
46
+ mouseOverHandler = (event) => {
47
+ // Resets the link mark currently hovered by the mouse cursor.
48
+ this.mouseHoveredLinkMark = undefined;
49
+ this.mouseHoveredLinkMarkRange = undefined;
50
+ this.stopMenuUpdateTimer();
51
+ if (event.target instanceof HTMLAnchorElement &&
52
+ event.target.nodeName === "A") {
53
+ // Finds link mark at the hovered element's position to update mouseHoveredLinkMark and
54
+ // mouseHoveredLinkMarkRange.
55
+ const hoveredLinkElement = event.target;
56
+ const posInHoveredLinkMark = this.pmView.posAtDOM(hoveredLinkElement, 0) + 1;
57
+ const resolvedPosInHoveredLinkMark = this.pmView.state.doc.resolve(posInHoveredLinkMark);
58
+ const marksAtPos = resolvedPosInHoveredLinkMark.marks();
59
+ for (const mark of marksAtPos) {
60
+ if (mark.type.name === this.pmView.state.schema.mark("link").type.name) {
61
+ this.mouseHoveredLinkMark = mark;
62
+ this.mouseHoveredLinkMarkRange =
63
+ getMarkRange(resolvedPosInHoveredLinkMark, mark.type, mark.attrs) ||
64
+ undefined;
65
+ break;
66
+ }
67
+ }
68
+ }
69
+ this.startMenuUpdateTimer();
70
+ return false;
71
+ };
72
+ clickHandler = (event) => {
73
+ const editorWrapper = this.pmView.dom.parentElement;
74
+ if (
75
+ // Toolbar is open.
76
+ this.linkMark &&
77
+ // An element is clicked.
78
+ event &&
79
+ event.target &&
80
+ // The clicked element is not the editor.
81
+ !(editorWrapper === event.target ||
82
+ editorWrapper.contains(event.target))) {
83
+ if (this.state?.show) {
84
+ this.state.show = false;
85
+ this.emitUpdate();
86
+ }
87
+ }
88
+ };
89
+ scrollHandler = () => {
90
+ if (this.linkMark !== undefined) {
91
+ if (this.state?.show) {
92
+ this.state.referencePos = posToDOMRect(this.pmView, this.linkMarkRange.from, this.linkMarkRange.to);
93
+ this.emitUpdate();
94
+ }
95
+ }
96
+ };
97
+ editLink(url, text) {
98
+ const tr = this.pmView.state.tr.insertText(text, this.linkMarkRange.from, this.linkMarkRange.to);
99
+ tr.addMark(this.linkMarkRange.from, this.linkMarkRange.from + text.length, this.pmView.state.schema.mark("link", { href: url }));
100
+ this.editor.dispatch(tr);
101
+ this.pmView.focus();
102
+ if (this.state?.show) {
103
+ this.state.show = false;
104
+ this.emitUpdate();
105
+ }
106
+ }
107
+ deleteLink() {
108
+ this.editor.dispatch(this.pmView.state.tr
109
+ .removeMark(this.linkMarkRange.from, this.linkMarkRange.to, this.linkMark.type)
110
+ .setMeta("preventAutolink", true));
111
+ this.pmView.focus();
112
+ if (this.state?.show) {
113
+ this.state.show = false;
114
+ this.emitUpdate();
115
+ }
116
+ }
117
+ update() {
118
+ if (!this.pmView.hasFocus()) {
119
+ return;
120
+ }
121
+ // Saves the currently hovered link mark before it's updated.
122
+ const prevLinkMark = this.linkMark;
123
+ // Resets the currently hovered link mark.
124
+ this.linkMark = undefined;
125
+ this.linkMarkRange = undefined;
126
+ // Resets the link mark currently hovered by the keyboard cursor.
127
+ this.keyboardHoveredLinkMark = undefined;
128
+ this.keyboardHoveredLinkMarkRange = undefined;
129
+ // Finds link mark at the editor selection's position to update keyboardHoveredLinkMark and
130
+ // keyboardHoveredLinkMarkRange.
131
+ if (this.pmView.state.selection.empty) {
132
+ const marksAtPos = this.pmView.state.selection.$from.marks();
133
+ for (const mark of marksAtPos) {
134
+ if (mark.type.name === this.pmView.state.schema.mark("link").type.name) {
135
+ this.keyboardHoveredLinkMark = mark;
136
+ this.keyboardHoveredLinkMarkRange =
137
+ getMarkRange(this.pmView.state.selection.$from, mark.type, mark.attrs) || undefined;
138
+ break;
139
+ }
140
+ }
141
+ }
142
+ if (this.mouseHoveredLinkMark) {
143
+ this.linkMark = this.mouseHoveredLinkMark;
144
+ this.linkMarkRange = this.mouseHoveredLinkMarkRange;
145
+ }
146
+ // Keyboard cursor position takes precedence over mouse hovered link.
147
+ if (this.keyboardHoveredLinkMark) {
148
+ this.linkMark = this.keyboardHoveredLinkMark;
149
+ this.linkMarkRange = this.keyboardHoveredLinkMarkRange;
150
+ }
151
+ if (this.linkMark && this.editor.isEditable) {
152
+ this.state = {
153
+ show: true,
154
+ referencePos: posToDOMRect(this.pmView, this.linkMarkRange.from, this.linkMarkRange.to),
155
+ url: this.linkMark.attrs.href,
156
+ text: this.pmView.state.doc.textBetween(this.linkMarkRange.from, this.linkMarkRange.to),
157
+ };
158
+ this.emitUpdate();
159
+ return;
160
+ }
161
+ // Hides menu.
162
+ if (this.state?.show &&
163
+ prevLinkMark &&
164
+ (!this.linkMark || !this.editor.isEditable)) {
165
+ this.state.show = false;
166
+ this.emitUpdate();
167
+ return;
168
+ }
169
+ }
170
+ closeMenu = () => {
171
+ if (this.state?.show) {
172
+ this.state.show = false;
173
+ this.emitUpdate();
174
+ }
175
+ };
176
+ destroy() {
177
+ this.pmView.dom.removeEventListener("mouseover", this.mouseOverHandler);
178
+ this.pmView.root.removeEventListener("scroll", this.scrollHandler, true);
179
+ this.pmView.root.removeEventListener("click", this.clickHandler, true);
180
+ }
181
+ }
182
+ export const linkToolbarPluginKey = new PluginKey("LinkToolbarPlugin");
183
+ export class LinkToolbarProsemirrorPlugin extends EventEmitter {
184
+ view;
185
+ plugin;
186
+ constructor(editor) {
187
+ super();
188
+ this.plugin = new Plugin({
189
+ key: linkToolbarPluginKey,
190
+ view: (editorView) => {
191
+ this.view = new LinkToolbarView(editor, editorView, (state) => {
192
+ this.emit("update", state);
193
+ });
194
+ return this.view;
195
+ },
196
+ props: {
197
+ handleKeyDown: (_view, event) => {
198
+ if (event.key === "Escape" && this.shown) {
199
+ this.view.closeMenu();
200
+ return true;
201
+ }
202
+ return false;
203
+ },
204
+ },
205
+ });
206
+ }
207
+ onUpdate(callback) {
208
+ return this.on("update", callback);
209
+ }
210
+ /**
211
+ * Edit the currently hovered link.
212
+ */
213
+ editLink = (url, text) => {
214
+ this.view.editLink(url, text);
215
+ };
216
+ /**
217
+ * Delete the currently hovered link.
218
+ */
219
+ deleteLink = () => {
220
+ this.view.deleteLink();
221
+ };
222
+ /**
223
+ * When hovering on/off links using the mouse cursor, the link toolbar will
224
+ * open & close with a delay.
225
+ *
226
+ * This function starts the delay timer, and should be used for when the mouse
227
+ * cursor enters the link toolbar.
228
+ */
229
+ startHideTimer = () => {
230
+ this.view.startMenuUpdateTimer();
231
+ };
232
+ /**
233
+ * When hovering on/off links using the mouse cursor, the link toolbar will
234
+ * open & close with a delay.
235
+ *
236
+ * This function stops the delay timer, and should be used for when the mouse
237
+ * cursor exits the link toolbar.
238
+ */
239
+ stopHideTimer = () => {
240
+ this.view.stopMenuUpdateTimer();
241
+ };
242
+ get shown() {
243
+ return this.view?.state?.show || false;
244
+ }
245
+ closeMenu = () => this.view.closeMenu();
246
+ }
247
+ //# sourceMappingURL=LinkToolbarPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkToolbarPlugin.js","sourceRoot":"","sources":["../../../../src/extensions/LinkToolbar/LinkToolbarPlugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { Plugin, PluginKey, TextSelection } from "prosemirror-state";
2
+ const PLUGIN_KEY = new PluginKey("node-selection-keyboard");
3
+ // By default, typing with a node selection active will cause ProseMirror to
4
+ // replace the node with one that contains editable content. This plugin blocks
5
+ // this behaviour without also blocking things like keyboard shortcuts:
6
+ //
7
+ // - Lets through key presses that do not include alphanumeric characters. This
8
+ // includes things like backspace/delete/home/end/etc.
9
+ // - Lets through any key presses that include ctrl/meta keys. These will be
10
+ // shortcuts of some kind like ctrl+C/mod+C.
11
+ // - Special case for Enter key which creates a new paragraph block below and
12
+ // sets the selection to it. This is just to bring the UX closer to Notion
13
+ //
14
+ // While a more elegant solution would probably process transactions instead of
15
+ // keystrokes, this brings us most of the way to Notion's UX without much added
16
+ // complexity.
17
+ export const NodeSelectionKeyboardPlugin = () => {
18
+ return new Plugin({
19
+ key: PLUGIN_KEY,
20
+ props: {
21
+ handleKeyDown: (view, event) => {
22
+ // Checks for node selection
23
+ if ("node" in view.state.selection) {
24
+ // Checks if key press uses ctrl/meta modifier
25
+ if (event.ctrlKey || event.metaKey) {
26
+ return false;
27
+ }
28
+ // Checks if key press is alphanumeric
29
+ if (event.key.length === 1) {
30
+ event.preventDefault();
31
+ return true;
32
+ }
33
+ // Checks if key press is Enter
34
+ if (event.key === "Enter" &&
35
+ !event.shiftKey &&
36
+ !event.altKey &&
37
+ !event.ctrlKey &&
38
+ !event.metaKey) {
39
+ const tr = view.state.tr;
40
+ view.dispatch(tr
41
+ .insert(view.state.tr.selection.$to.after(), view.state.schema.nodes["paragraph"].createChecked())
42
+ .setSelection(new TextSelection(tr.doc.resolve(view.state.tr.selection.$to.after() + 1))));
43
+ return true;
44
+ }
45
+ }
46
+ return false;
47
+ },
48
+ },
49
+ });
50
+ };
51
+ //# sourceMappingURL=NodeSelectionKeyboardPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeSelectionKeyboardPlugin.js","sourceRoot":"","sources":["../../../../src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboardPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAErE,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,yBAAyB,CAAC,CAAC;AAC5D,4EAA4E;AAC5E,+EAA+E;AAC/E,uEAAuE;AACvE,EAAE;AACF,+EAA+E;AAC/E,sDAAsD;AACtD,4EAA4E;AAC5E,4CAA4C;AAC5C,6EAA6E;AAC7E,0EAA0E;AAC1E,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,cAAc;AACd,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,EAAE;IAC9C,OAAO,IAAI,MAAM,CAAC;QAChB,GAAG,EAAE,UAAU;QACf,KAAK,EAAE;YACL,aAAa,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC7B,4BAA4B;gBAC5B,IAAI,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;oBACnC,8CAA8C;oBAC9C,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;wBACnC,OAAO,KAAK,CAAC;oBACf,CAAC;oBACD,sCAAsC;oBACtC,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC3B,KAAK,CAAC,cAAc,EAAE,CAAC;wBAEvB,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,+BAA+B;oBAC/B,IACE,KAAK,CAAC,GAAG,KAAK,OAAO;wBACrB,CAAC,KAAK,CAAC,QAAQ;wBACf,CAAC,KAAK,CAAC,MAAM;wBACb,CAAC,KAAK,CAAC,OAAO;wBACd,CAAC,KAAK,CAAC,OAAO,EACd,CAAC;wBACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;wBACzB,IAAI,CAAC,QAAQ,CACX,EAAE;6BACC,MAAM,CACL,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CACrD;6BACA,YAAY,CACX,IAAI,aAAa,CACf,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CACxD,CACF,CACJ,CAAC;wBAEF,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;gBAED,OAAO,KAAK,CAAC;YACf,CAAC;SACF;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}