@witchcraft/editor 0.0.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 (593) hide show
  1. package/@types/@tiptap/core/index.d.ts +3 -0
  2. package/README.md +111 -0
  3. package/dist/module.d.mts +15 -0
  4. package/dist/module.json +9 -0
  5. package/dist/module.mjs +68 -0
  6. package/dist/runtime/assets/base.css +1 -0
  7. package/dist/runtime/assets/handle-arrow.svg +16 -0
  8. package/dist/runtime/assets/handle-border-circles-single.svg +44 -0
  9. package/dist/runtime/assets/handle-border-circles.svg +27 -0
  10. package/dist/runtime/assets/handle-temp.svg +1 -0
  11. package/dist/runtime/assets/utils.css +1 -0
  12. package/dist/runtime/components/CodeBlockThemePicker.d.vue.ts +12 -0
  13. package/dist/runtime/components/CodeBlockThemePicker.vue +123 -0
  14. package/dist/runtime/components/CodeBlockThemePicker.vue.d.ts +12 -0
  15. package/dist/runtime/components/Commands.d.vue.ts +10 -0
  16. package/dist/runtime/components/Commands.vue +60 -0
  17. package/dist/runtime/components/Commands.vue.d.ts +10 -0
  18. package/dist/runtime/components/Editor.d.vue.ts +40 -0
  19. package/dist/runtime/components/Editor.vue +208 -0
  20. package/dist/runtime/components/Editor.vue.d.ts +40 -0
  21. package/dist/runtime/components/EditorDemoApp.d.vue.ts +2 -0
  22. package/dist/runtime/components/EditorDemoApp.vue +104 -0
  23. package/dist/runtime/components/EditorDemoApp.vue.d.ts +2 -0
  24. package/dist/runtime/components/EditorDemoControls.d.vue.ts +12 -0
  25. package/dist/runtime/components/EditorDemoControls.vue +36 -0
  26. package/dist/runtime/components/EditorDemoControls.vue.d.ts +12 -0
  27. package/dist/runtime/components/TestWrapper.d.vue.ts +11 -0
  28. package/dist/runtime/components/TestWrapper.vue +63 -0
  29. package/dist/runtime/components/TestWrapper.vue.d.ts +11 -0
  30. package/dist/runtime/composables/useEditor.d.ts +9 -0
  31. package/dist/runtime/composables/useEditor.js +17 -0
  32. package/dist/runtime/composables/useWindowDebugging.d.ts +3 -0
  33. package/dist/runtime/composables/useWindowDebugging.js +16 -0
  34. package/dist/runtime/demo/App.d.vue.ts +2 -0
  35. package/dist/runtime/demo/App.vue +101 -0
  36. package/dist/runtime/demo/App.vue.d.ts +2 -0
  37. package/dist/runtime/demo/README.md +1 -0
  38. package/dist/runtime/demo/main.d.ts +1 -0
  39. package/dist/runtime/demo/main.js +4 -0
  40. package/dist/runtime/demo/tailwind.css +1 -0
  41. package/dist/runtime/env.d.ts +2 -0
  42. package/dist/runtime/injectionKeys.d.ts +6 -0
  43. package/dist/runtime/injectionKeys.js +3 -0
  44. package/dist/runtime/main.lib.d.ts +2 -0
  45. package/dist/runtime/main.lib.js +2 -0
  46. package/dist/runtime/pm/commands/backspace.d.ts +12 -0
  47. package/dist/runtime/pm/commands/backspace.js +26 -0
  48. package/dist/runtime/pm/commands/changeAttrs.d.ts +9 -0
  49. package/dist/runtime/pm/commands/changeAttrs.js +15 -0
  50. package/dist/runtime/pm/commands/deleteSelection.d.ts +9 -0
  51. package/dist/runtime/pm/commands/deleteSelection.js +8 -0
  52. package/dist/runtime/pm/commands/enter.d.ts +14 -0
  53. package/dist/runtime/pm/commands/enter.js +9 -0
  54. package/dist/runtime/pm/commands/insertBreak.d.ts +9 -0
  55. package/dist/runtime/pm/commands/insertBreak.js +22 -0
  56. package/dist/runtime/pm/features/Base/Base.d.ts +4 -0
  57. package/dist/runtime/pm/features/Base/Base.js +32 -0
  58. package/dist/runtime/pm/features/Base/commands/deleteNodes.d.ts +10 -0
  59. package/dist/runtime/pm/features/Base/commands/deleteNodes.js +29 -0
  60. package/dist/runtime/pm/features/Base/commands/setCursorVisible.d.ts +12 -0
  61. package/dist/runtime/pm/features/Base/commands/setCursorVisible.js +7 -0
  62. package/dist/runtime/pm/features/Base/plugins/debugSelectionPlugin.d.ts +9 -0
  63. package/dist/runtime/pm/features/Base/plugins/debugSelectionPlugin.js +48 -0
  64. package/dist/runtime/pm/features/Base/plugins/isCursorVisiblePlugin.d.ts +3 -0
  65. package/dist/runtime/pm/features/Base/plugins/isCursorVisiblePlugin.js +26 -0
  66. package/dist/runtime/pm/features/Base/plugins/isUsingTouchPlugin.d.ts +3 -0
  67. package/dist/runtime/pm/features/Base/plugins/isUsingTouchPlugin.js +38 -0
  68. package/dist/runtime/pm/features/Base/plugins/selectingIndicator.d.ts +5 -0
  69. package/dist/runtime/pm/features/Base/plugins/selectingIndicator.js +35 -0
  70. package/dist/runtime/pm/features/Base/plugins/unfocusedSelectionIndicatorPlugin.d.ts +33 -0
  71. package/dist/runtime/pm/features/Base/plugins/unfocusedSelectionIndicatorPlugin.js +66 -0
  72. package/dist/runtime/pm/features/Base/types.d.ts +3 -0
  73. package/dist/runtime/pm/features/Base/types.js +0 -0
  74. package/dist/runtime/pm/features/BaseShortcuts/BaseShortcuts.d.ts +3 -0
  75. package/dist/runtime/pm/features/BaseShortcuts/BaseShortcuts.js +34 -0
  76. package/dist/runtime/pm/features/Blockquote/Blockquote.d.ts +5 -0
  77. package/dist/runtime/pm/features/Blockquote/Blockquote.js +65 -0
  78. package/dist/runtime/pm/features/Blockquote/commands/blockquoteEnter.d.ts +11 -0
  79. package/dist/runtime/pm/features/Blockquote/commands/blockquoteEnter.js +31 -0
  80. package/dist/runtime/pm/features/Blockquote/commands/blockquoteShiftEnter.d.ts +11 -0
  81. package/dist/runtime/pm/features/Blockquote/commands/blockquoteShiftEnter.js +12 -0
  82. package/dist/runtime/pm/features/Blocks/Blocks.d.ts +2 -0
  83. package/dist/runtime/pm/features/Blocks/Blocks.js +2 -0
  84. package/dist/runtime/pm/features/Blocks/Item.d.ts +11 -0
  85. package/dist/runtime/pm/features/Blocks/Item.js +157 -0
  86. package/dist/runtime/pm/features/Blocks/List.d.ts +4 -0
  87. package/dist/runtime/pm/features/Blocks/List.js +59 -0
  88. package/dist/runtime/pm/features/Blocks/commands/changeItemType.d.ts +20 -0
  89. package/dist/runtime/pm/features/Blocks/commands/changeItemType.js +40 -0
  90. package/dist/runtime/pm/features/Blocks/commands/changeTypeAttr.d.ts +14 -0
  91. package/dist/runtime/pm/features/Blocks/commands/changeTypeAttr.js +28 -0
  92. package/dist/runtime/pm/features/Blocks/commands/copyOrMoveItem.d.ts +23 -0
  93. package/dist/runtime/pm/features/Blocks/commands/copyOrMoveItem.js +124 -0
  94. package/dist/runtime/pm/features/Blocks/commands/deleteItem.d.ts +12 -0
  95. package/dist/runtime/pm/features/Blocks/commands/deleteItem.js +8 -0
  96. package/dist/runtime/pm/features/Blocks/commands/indentItem.d.ts +12 -0
  97. package/dist/runtime/pm/features/Blocks/commands/indentItem.js +58 -0
  98. package/dist/runtime/pm/features/Blocks/commands/itemMenuCommands.d.ts +18 -0
  99. package/dist/runtime/pm/features/Blocks/commands/itemMenuCommands.js +40 -0
  100. package/dist/runtime/pm/features/Blocks/commands/moveItem.d.ts +12 -0
  101. package/dist/runtime/pm/features/Blocks/commands/moveItem.js +80 -0
  102. package/dist/runtime/pm/features/Blocks/commands/setNode.d.ts +20 -0
  103. package/dist/runtime/pm/features/Blocks/commands/setNode.js +87 -0
  104. package/dist/runtime/pm/features/Blocks/commands/splitItem.d.ts +17 -0
  105. package/dist/runtime/pm/features/Blocks/commands/splitItem.js +87 -0
  106. package/dist/runtime/pm/features/Blocks/commands/unindentItem.d.ts +12 -0
  107. package/dist/runtime/pm/features/Blocks/commands/unindentItem.js +42 -0
  108. package/dist/runtime/pm/features/Blocks/components/DragTreeHandle.d.vue.ts +0 -0
  109. package/dist/runtime/pm/features/Blocks/components/DragTreeHandle.vue +122 -0
  110. package/dist/runtime/pm/features/Blocks/components/DragTreeHandle.vue.d.ts +0 -0
  111. package/dist/runtime/pm/features/Blocks/components/ItemMenu.d.vue.ts +6 -0
  112. package/dist/runtime/pm/features/Blocks/components/ItemMenu.vue +78 -0
  113. package/dist/runtime/pm/features/Blocks/components/ItemMenu.vue.d.ts +6 -0
  114. package/dist/runtime/pm/features/Blocks/components/ItemNodeView.d.vue.ts +92 -0
  115. package/dist/runtime/pm/features/Blocks/components/ItemNodeView.vue +350 -0
  116. package/dist/runtime/pm/features/Blocks/components/ItemNodeView.vue.d.ts +92 -0
  117. package/dist/runtime/pm/features/Blocks/components/defaultItemMenu.d.ts +5 -0
  118. package/dist/runtime/pm/features/Blocks/components/defaultItemMenu.js +42 -0
  119. package/dist/runtime/pm/features/Blocks/composables/useDragWithThreshold.d.ts +1 -0
  120. package/dist/runtime/pm/features/Blocks/composables/useDragWithThreshold.js +0 -0
  121. package/dist/runtime/pm/features/Blocks/composables/useHandleHeight.d.ts +5 -0
  122. package/dist/runtime/pm/features/Blocks/composables/useHandleHeight.js +22 -0
  123. package/dist/runtime/pm/features/Blocks/composables/useHasChildren.d.ts +5 -0
  124. package/dist/runtime/pm/features/Blocks/composables/useHasChildren.js +10 -0
  125. package/dist/runtime/pm/features/Blocks/composables/useNodeStates.d.ts +7 -0
  126. package/dist/runtime/pm/features/Blocks/composables/useNodeStates.js +20 -0
  127. package/dist/runtime/pm/features/Blocks/itemMenuMenuItems.d.ts +20 -0
  128. package/dist/runtime/pm/features/Blocks/itemMenuMenuItems.js +138 -0
  129. package/dist/runtime/pm/features/Blocks/plugins/ensureLastItemIsContentPlugin.d.ts +11 -0
  130. package/dist/runtime/pm/features/Blocks/plugins/ensureLastItemIsContentPlugin.js +36 -0
  131. package/dist/runtime/pm/features/Blocks/plugins/itemBlockIdPlugin.d.ts +8 -0
  132. package/dist/runtime/pm/features/Blocks/plugins/itemBlockIdPlugin.js +30 -0
  133. package/dist/runtime/pm/features/Blocks/plugins/itemHasSingularSelectionPlugin.d.ts +3 -0
  134. package/dist/runtime/pm/features/Blocks/plugins/itemHasSingularSelectionPlugin.js +30 -0
  135. package/dist/runtime/pm/features/Blocks/plugins/itemMenuPlugin.d.ts +4 -0
  136. package/dist/runtime/pm/features/Blocks/plugins/itemMenuPlugin.js +17 -0
  137. package/dist/runtime/pm/features/Blocks/states/stateful.d.ts +2 -0
  138. package/dist/runtime/pm/features/Blocks/states/stateful.js +37 -0
  139. package/dist/runtime/pm/features/Blocks/states/task/cancelled.svg +32 -0
  140. package/dist/runtime/pm/features/Blocks/states/task/checked.svg +27 -0
  141. package/dist/runtime/pm/features/Blocks/states/task/checked2.svg +24 -0
  142. package/dist/runtime/pm/features/Blocks/states/task/partial.svg +24 -0
  143. package/dist/runtime/pm/features/Blocks/states/task/partial2.svg +31 -0
  144. package/dist/runtime/pm/features/Blocks/states/task/unchecked.svg +20 -0
  145. package/dist/runtime/pm/features/Blocks/types.d.ts +43 -0
  146. package/dist/runtime/pm/features/Blocks/types.js +2 -0
  147. package/dist/runtime/pm/features/Blocks/utils/createItemMenuCommandExecuter.d.ts +3 -0
  148. package/dist/runtime/pm/features/Blocks/utils/createItemMenuCommandExecuter.js +24 -0
  149. package/dist/runtime/pm/features/Blocks/utils/fixBlockIds.d.ts +4 -0
  150. package/dist/runtime/pm/features/Blocks/utils/fixBlockIds.js +23 -0
  151. package/dist/runtime/pm/features/Blocks/utils/isValidId.d.ts +2 -0
  152. package/dist/runtime/pm/features/Blocks/utils/isValidId.js +7 -0
  153. package/dist/runtime/pm/features/CodeBlock/CodeBlock.d.ts +16 -0
  154. package/dist/runtime/pm/features/CodeBlock/CodeBlock.js +91 -0
  155. package/dist/runtime/pm/features/CodeBlock/build/generateHighlightJsInfo.d.ts +1 -0
  156. package/dist/runtime/pm/features/CodeBlock/build/generateHighlightJsInfo.js +63 -0
  157. package/dist/runtime/pm/features/CodeBlock/commands/codeBlockEnterOrSplit.d.ts +9 -0
  158. package/dist/runtime/pm/features/CodeBlock/commands/codeBlockEnterOrSplit.js +28 -0
  159. package/dist/runtime/pm/features/CodeBlock/commands/codeBlockIndent.d.ts +9 -0
  160. package/dist/runtime/pm/features/CodeBlock/commands/codeBlockIndent.js +39 -0
  161. package/dist/runtime/pm/features/CodeBlock/commands/codeBlockUnindent.d.ts +9 -0
  162. package/dist/runtime/pm/features/CodeBlock/commands/codeBlockUnindent.js +50 -0
  163. package/dist/runtime/pm/features/CodeBlock/commands/focusCodeBlockLanguage.d.ts +9 -0
  164. package/dist/runtime/pm/features/CodeBlock/commands/focusCodeBlockLanguage.js +27 -0
  165. package/dist/runtime/pm/features/CodeBlock/components/CodeBlockView.d.vue.ts +92 -0
  166. package/dist/runtime/pm/features/CodeBlock/components/CodeBlockView.vue +112 -0
  167. package/dist/runtime/pm/features/CodeBlock/components/CodeBlockView.vue.d.ts +92 -0
  168. package/dist/runtime/pm/features/CodeBlock/composables/useAsyncCodeBlockHighlighting.d.ts +28 -0
  169. package/dist/runtime/pm/features/CodeBlock/composables/useAsyncCodeBlockHighlighting.js +137 -0
  170. package/dist/runtime/pm/features/CodeBlock/composables/useHighlightJsTheme.d.ts +37 -0
  171. package/dist/runtime/pm/features/CodeBlock/composables/useHighlightJsTheme.js +101 -0
  172. package/dist/runtime/pm/features/CodeBlock/highlightJsInfo.d.ts +17 -0
  173. package/dist/runtime/pm/features/CodeBlock/highlightJsInfo.js +711 -0
  174. package/dist/runtime/pm/features/CodeBlock/types.d.ts +4 -0
  175. package/dist/runtime/pm/features/CodeBlock/types.js +2 -0
  176. package/dist/runtime/pm/features/Collaboration/Collaboration.d.ts +66 -0
  177. package/dist/runtime/pm/features/Collaboration/Collaboration.js +169 -0
  178. package/dist/runtime/pm/features/CommandsMenus/CommandBar.d.ts +19 -0
  179. package/dist/runtime/pm/features/CommandsMenus/CommandBar.js +97 -0
  180. package/dist/runtime/pm/features/CommandsMenus/commandBarMenuItems.d.ts +20 -0
  181. package/dist/runtime/pm/features/CommandsMenus/commandBarMenuItems.js +188 -0
  182. package/dist/runtime/pm/features/CommandsMenus/components/CommandBar.d.vue.ts +8 -0
  183. package/dist/runtime/pm/features/CommandsMenus/components/CommandBar.vue +58 -0
  184. package/dist/runtime/pm/features/CommandsMenus/components/CommandBar.vue.d.ts +8 -0
  185. package/dist/runtime/pm/features/CommandsMenus/components/CommandBarItem.d.vue.ts +12 -0
  186. package/dist/runtime/pm/features/CommandsMenus/components/CommandBarItem.vue +42 -0
  187. package/dist/runtime/pm/features/CommandsMenus/components/CommandBarItem.vue.d.ts +12 -0
  188. package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuGroup.d.vue.ts +10 -0
  189. package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuGroup.vue +55 -0
  190. package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuGroup.vue.d.ts +10 -0
  191. package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuItem.d.vue.ts +11 -0
  192. package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuItem.vue +58 -0
  193. package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuItem.vue.d.ts +11 -0
  194. package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuList.d.vue.ts +11 -0
  195. package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuList.vue +54 -0
  196. package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuList.vue.d.ts +11 -0
  197. package/dist/runtime/pm/features/CommandsMenus/components/TextIcon.d.vue.ts +5 -0
  198. package/dist/runtime/pm/features/CommandsMenus/components/TextIcon.vue +13 -0
  199. package/dist/runtime/pm/features/CommandsMenus/components/TextIcon.vue.d.ts +5 -0
  200. package/dist/runtime/pm/features/CommandsMenus/icons/HighlightIcon.d.vue.ts +8 -0
  201. package/dist/runtime/pm/features/CommandsMenus/icons/HighlightIcon.vue +45 -0
  202. package/dist/runtime/pm/features/CommandsMenus/icons/HighlightIcon.vue.d.ts +8 -0
  203. package/dist/runtime/pm/features/CommandsMenus/icons/SubscriptIcon.d.vue.ts +2 -0
  204. package/dist/runtime/pm/features/CommandsMenus/icons/SubscriptIcon.vue +5 -0
  205. package/dist/runtime/pm/features/CommandsMenus/icons/SubscriptIcon.vue.d.ts +2 -0
  206. package/dist/runtime/pm/features/CommandsMenus/icons/SuperscriptIcon.d.vue.ts +2 -0
  207. package/dist/runtime/pm/features/CommandsMenus/icons/SuperscriptIcon.vue +5 -0
  208. package/dist/runtime/pm/features/CommandsMenus/icons/SuperscriptIcon.vue.d.ts +2 -0
  209. package/dist/runtime/pm/features/CommandsMenus/types.d.ts +61 -0
  210. package/dist/runtime/pm/features/CommandsMenus/types.js +5 -0
  211. package/dist/runtime/pm/features/CommandsMenus/utils/defaultCommandExecutor.d.ts +3 -0
  212. package/dist/runtime/pm/features/CommandsMenus/utils/defaultCommandExecutor.js +11 -0
  213. package/dist/runtime/pm/features/CommandsMenus/utils/findCommand.d.ts +10 -0
  214. package/dist/runtime/pm/features/CommandsMenus/utils/findCommand.js +16 -0
  215. package/dist/runtime/pm/features/CommandsMenus/utils/popupPositionModifier.d.ts +5 -0
  216. package/dist/runtime/pm/features/CommandsMenus/utils/popupPositionModifier.js +9 -0
  217. package/dist/runtime/pm/features/CommandsMenus/utils/popupVerticalPositioner.d.ts +5 -0
  218. package/dist/runtime/pm/features/CommandsMenus/utils/popupVerticalPositioner.js +11 -0
  219. package/dist/runtime/pm/features/Document/Document.d.ts +3 -0
  220. package/dist/runtime/pm/features/Document/Document.js +6 -0
  221. package/dist/runtime/pm/features/DocumentApi/DocumentApi.d.ts +85 -0
  222. package/dist/runtime/pm/features/DocumentApi/DocumentApi.js +161 -0
  223. package/dist/runtime/pm/features/DocumentApi/composables/useEditorContent.d.ts +13 -0
  224. package/dist/runtime/pm/features/DocumentApi/composables/useEditorContent.js +76 -0
  225. package/dist/runtime/pm/features/DocumentApi/composables/useTestDocumentApi.d.ts +23 -0
  226. package/dist/runtime/pm/features/DocumentApi/composables/useTestDocumentApi.js +70 -0
  227. package/dist/runtime/pm/features/DocumentApi/types.d.ts +133 -0
  228. package/dist/runtime/pm/features/DocumentApi/types.js +1 -0
  229. package/dist/runtime/pm/features/DocumentApi/utils/convertFullTransactionForPartialState.d.ts +3 -0
  230. package/dist/runtime/pm/features/DocumentApi/utils/convertFullTransactionForPartialState.js +37 -0
  231. package/dist/runtime/pm/features/DocumentApi/utils/convertTrForInstance.d.ts +4 -0
  232. package/dist/runtime/pm/features/DocumentApi/utils/convertTrForInstance.js +13 -0
  233. package/dist/runtime/pm/features/DocumentApi/utils/convertTransactionForFullState.d.ts +2 -0
  234. package/dist/runtime/pm/features/DocumentApi/utils/convertTransactionForFullState.js +22 -0
  235. package/dist/runtime/pm/features/DocumentApi/utils/copyMeta.d.ts +2 -0
  236. package/dist/runtime/pm/features/DocumentApi/utils/copyMeta.js +6 -0
  237. package/dist/runtime/pm/features/DocumentApi/utils/getEmbedJson.d.ts +1 -0
  238. package/dist/runtime/pm/features/DocumentApi/utils/getEmbedJson.js +14 -0
  239. package/dist/runtime/pm/features/DocumentApi/utils/getEmbedNodeFromDoc.d.ts +1 -0
  240. package/dist/runtime/pm/features/DocumentApi/utils/getEmbedNodeFromDoc.js +14 -0
  241. package/dist/runtime/pm/features/DocumentApi/utils/getStateEmbedRange.d.ts +9 -0
  242. package/dist/runtime/pm/features/DocumentApi/utils/getStateEmbedRange.js +19 -0
  243. package/dist/runtime/pm/features/DocumentApi/utils/isEmbedId.d.ts +2 -0
  244. package/dist/runtime/pm/features/DocumentApi/utils/isEmbedId.js +3 -0
  245. package/dist/runtime/pm/features/EmbeddedDocument/Embedded.d.ts +24 -0
  246. package/dist/runtime/pm/features/EmbeddedDocument/Embedded.js +73 -0
  247. package/dist/runtime/pm/features/EmbeddedDocument/EmbeddedDocument.d.ts +23 -0
  248. package/dist/runtime/pm/features/EmbeddedDocument/EmbeddedDocument.js +70 -0
  249. package/dist/runtime/pm/features/EmbeddedDocument/components/EmbeddedDocumentPicker.d.vue.ts +14 -0
  250. package/dist/runtime/pm/features/EmbeddedDocument/components/EmbeddedDocumentPicker.vue +171 -0
  251. package/dist/runtime/pm/features/EmbeddedDocument/components/EmbeddedDocumentPicker.vue.d.ts +14 -0
  252. package/dist/runtime/pm/features/EmbeddedDocument/components/EmbeddedNodeView.d.vue.ts +92 -0
  253. package/dist/runtime/pm/features/EmbeddedDocument/components/EmbeddedNodeView.vue +172 -0
  254. package/dist/runtime/pm/features/EmbeddedDocument/components/EmbeddedNodeView.vue.d.ts +92 -0
  255. package/dist/runtime/pm/features/EmbeddedDocument/composables/useEmbeddedEditor.d.ts +31 -0
  256. package/dist/runtime/pm/features/EmbeddedDocument/composables/useEmbeddedEditor.js +199 -0
  257. package/dist/runtime/pm/features/EmbeddedDocument/types.d.ts +49 -0
  258. package/dist/runtime/pm/features/EmbeddedDocument/types.js +6 -0
  259. package/dist/runtime/pm/features/EmbeddedDocument/utils/isEmbeddedBlock.d.ts +9 -0
  260. package/dist/runtime/pm/features/EmbeddedDocument/utils/isEmbeddedBlock.js +3 -0
  261. package/dist/runtime/pm/features/EmbeddedDocument/utils/redirectFromEmbedded.d.ts +28 -0
  262. package/dist/runtime/pm/features/EmbeddedDocument/utils/redirectFromEmbedded.js +17 -0
  263. package/dist/runtime/pm/features/FileLoader/FileLoader.d.ts +16 -0
  264. package/dist/runtime/pm/features/FileLoader/FileLoader.js +99 -0
  265. package/dist/runtime/pm/features/FileLoader/FileLoaderHandler/FileLoaderHandler.d.ts +28 -0
  266. package/dist/runtime/pm/features/FileLoader/FileLoaderHandler/FileLoaderHandler.js +69 -0
  267. package/dist/runtime/pm/features/FileLoader/FileLoaderHandler/TestFileLoaderHandler.d.ts +11 -0
  268. package/dist/runtime/pm/features/FileLoader/FileLoaderHandler/TestFileLoaderHandler.js +49 -0
  269. package/dist/runtime/pm/features/FileLoader/commands/insertFile.d.ts +17 -0
  270. package/dist/runtime/pm/features/FileLoader/commands/insertFile.js +39 -0
  271. package/dist/runtime/pm/features/FileLoader/components/FileLoaderNodeView.d.vue.ts +92 -0
  272. package/dist/runtime/pm/features/FileLoader/components/FileLoaderNodeView.vue +38 -0
  273. package/dist/runtime/pm/features/FileLoader/components/FileLoaderNodeView.vue.d.ts +92 -0
  274. package/dist/runtime/pm/features/FileLoader/plugins/fileLoaderPlugin.d.ts +5 -0
  275. package/dist/runtime/pm/features/FileLoader/plugins/fileLoaderPlugin.js +61 -0
  276. package/dist/runtime/pm/features/FileLoader/types.d.ts +73 -0
  277. package/dist/runtime/pm/features/FileLoader/types.js +0 -0
  278. package/dist/runtime/pm/features/FileLoader/utils/cleanupFileLoaderNode.d.ts +4 -0
  279. package/dist/runtime/pm/features/FileLoader/utils/cleanupFileLoaderNode.js +27 -0
  280. package/dist/runtime/pm/features/FileLoader/utils/cleanupFileLoaderNodes.d.ts +9 -0
  281. package/dist/runtime/pm/features/FileLoader/utils/cleanupFileLoaderNodes.js +22 -0
  282. package/dist/runtime/pm/features/FileLoader/utils/findLoadingNodePos.d.ts +2 -0
  283. package/dist/runtime/pm/features/FileLoader/utils/findLoadingNodePos.js +11 -0
  284. package/dist/runtime/pm/features/FileLoader/utils/optionsCheck.d.ts +3 -0
  285. package/dist/runtime/pm/features/FileLoader/utils/optionsCheck.js +8 -0
  286. package/dist/runtime/pm/features/FileLoader/utils/readAsDataUrl.d.ts +1 -0
  287. package/dist/runtime/pm/features/FileLoader/utils/readAsDataUrl.js +12 -0
  288. package/dist/runtime/pm/features/HardBreak/HardBreak.d.ts +5 -0
  289. package/dist/runtime/pm/features/HardBreak/HardBreak.js +14 -0
  290. package/dist/runtime/pm/features/Heading/Heading.d.ts +24 -0
  291. package/dist/runtime/pm/features/Heading/Heading.js +85 -0
  292. package/dist/runtime/pm/features/Heading/commands/changeLevelAttr.d.ts +16 -0
  293. package/dist/runtime/pm/features/Heading/commands/changeLevelAttr.js +33 -0
  294. package/dist/runtime/pm/features/Heading/types.d.ts +14 -0
  295. package/dist/runtime/pm/features/Heading/types.js +0 -0
  296. package/dist/runtime/pm/features/Highlight/Highlight.d.ts +72 -0
  297. package/dist/runtime/pm/features/Highlight/Highlight.js +163 -0
  298. package/dist/runtime/pm/features/Highlight/retyped/tiptapHighlight.d.ts +3 -0
  299. package/dist/runtime/pm/features/Highlight/retyped/tiptapHighlight.js +5 -0
  300. package/dist/runtime/pm/features/Highlight/types.d.ts +27 -0
  301. package/dist/runtime/pm/features/Highlight/types.js +2 -0
  302. package/dist/runtime/pm/features/History/History.d.ts +35 -0
  303. package/dist/runtime/pm/features/History/History.js +63 -0
  304. package/dist/runtime/pm/features/Iframe/Iframe.d.ts +21 -0
  305. package/dist/runtime/pm/features/Iframe/Iframe.js +127 -0
  306. package/dist/runtime/pm/features/Iframe/IframeParsers.d.ts +37 -0
  307. package/dist/runtime/pm/features/Iframe/IframeParsers.js +88 -0
  308. package/dist/runtime/pm/features/Iframe/components/IframeNodeView.d.vue.ts +92 -0
  309. package/dist/runtime/pm/features/Iframe/components/IframeNodeView.vue +82 -0
  310. package/dist/runtime/pm/features/Iframe/components/IframeNodeView.vue.d.ts +92 -0
  311. package/dist/runtime/pm/features/Iframe/types.d.ts +5 -0
  312. package/dist/runtime/pm/features/Iframe/types.js +0 -0
  313. package/dist/runtime/pm/features/Image/Image.d.ts +2 -0
  314. package/dist/runtime/pm/features/Image/Image.js +13 -0
  315. package/dist/runtime/pm/features/Link/Link.d.ts +38 -0
  316. package/dist/runtime/pm/features/Link/Link.js +241 -0
  317. package/dist/runtime/pm/features/Link/components/BubbleMenuExternalLink.d.vue.ts +28 -0
  318. package/dist/runtime/pm/features/Link/components/BubbleMenuExternalLink.vue +114 -0
  319. package/dist/runtime/pm/features/Link/components/BubbleMenuExternalLink.vue.d.ts +28 -0
  320. package/dist/runtime/pm/features/Link/components/BubbleMenuInternalLink.d.vue.ts +29 -0
  321. package/dist/runtime/pm/features/Link/components/BubbleMenuInternalLink.vue +107 -0
  322. package/dist/runtime/pm/features/Link/components/BubbleMenuInternalLink.vue.d.ts +29 -0
  323. package/dist/runtime/pm/features/Link/components/BubbleMenuLink.d.vue.ts +11 -0
  324. package/dist/runtime/pm/features/Link/components/BubbleMenuLink.vue +126 -0
  325. package/dist/runtime/pm/features/Link/components/BubbleMenuLink.vue.d.ts +11 -0
  326. package/dist/runtime/pm/features/Link/components/BubbleMenuLinkActions.d.vue.ts +18 -0
  327. package/dist/runtime/pm/features/Link/components/BubbleMenuLinkActions.vue +57 -0
  328. package/dist/runtime/pm/features/Link/components/BubbleMenuLinkActions.vue.d.ts +18 -0
  329. package/dist/runtime/pm/features/Link/types.d.ts +44 -0
  330. package/dist/runtime/pm/features/Link/types.js +3 -0
  331. package/dist/runtime/pm/features/Menus/Menus.d.ts +45 -0
  332. package/dist/runtime/pm/features/Menus/Menus.js +142 -0
  333. package/dist/runtime/pm/features/Menus/components/MarkMenuManager.d.vue.ts +6 -0
  334. package/dist/runtime/pm/features/Menus/components/MarkMenuManager.vue +166 -0
  335. package/dist/runtime/pm/features/Menus/components/MarkMenuManager.vue.d.ts +6 -0
  336. package/dist/runtime/pm/features/Menus/types.d.ts +51 -0
  337. package/dist/runtime/pm/features/Menus/types.js +3 -0
  338. package/dist/runtime/pm/features/Menus/utils/isMarkMenu.d.ts +2 -0
  339. package/dist/runtime/pm/features/Menus/utils/isMarkMenu.js +3 -0
  340. package/dist/runtime/pm/features/Tables/commands/tableEnter.d.ts +15 -0
  341. package/dist/runtime/pm/features/Tables/commands/tableEnter.js +19 -0
  342. package/dist/runtime/pm/features/Tables/index.d.ts +9 -0
  343. package/dist/runtime/pm/features/Tables/index.js +44 -0
  344. package/dist/runtime/pm/schema.d.ts +4 -0
  345. package/dist/runtime/pm/schema.js +80 -0
  346. package/dist/runtime/pm/testSchema.d.ts +5 -0
  347. package/dist/runtime/pm/testSchema.js +30 -0
  348. package/dist/runtime/pm/utils/createDropIndicator.d.ts +23 -0
  349. package/dist/runtime/pm/utils/createDropIndicator.js +32 -0
  350. package/dist/runtime/pm/utils/createStateOnlyPluginApply.d.ts +2 -0
  351. package/dist/runtime/pm/utils/createStateOnlyPluginApply.js +9 -0
  352. package/dist/runtime/pm/utils/createStateOnlyPluginObjApply.d.ts +2 -0
  353. package/dist/runtime/pm/utils/createStateOnlyPluginObjApply.js +14 -0
  354. package/dist/runtime/pm/utils/dropPointInfo.d.ts +56 -0
  355. package/dist/runtime/pm/utils/dropPointInfo.js +28 -0
  356. package/dist/runtime/pm/utils/findUpwards.d.ts +20 -0
  357. package/dist/runtime/pm/utils/findUpwards.js +18 -0
  358. package/dist/runtime/pm/utils/getChildChunks.d.ts +3 -0
  359. package/dist/runtime/pm/utils/getChildChunks.js +15 -0
  360. package/dist/runtime/pm/utils/getDiffReplacementRange.d.ts +20 -0
  361. package/dist/runtime/pm/utils/getDiffReplacementRange.js +9 -0
  362. package/dist/runtime/pm/utils/getElMaxVisualSize.d.ts +9 -0
  363. package/dist/runtime/pm/utils/getElMaxVisualSize.js +7 -0
  364. package/dist/runtime/pm/utils/getElPropertyAsInt.d.ts +1 -0
  365. package/dist/runtime/pm/utils/getElPropertyAsInt.js +8 -0
  366. package/dist/runtime/pm/utils/getGroupNodeNames.d.ts +2 -0
  367. package/dist/runtime/pm/utils/getGroupNodeNames.js +7 -0
  368. package/dist/runtime/pm/utils/getMarkPosition.d.ts +11 -0
  369. package/dist/runtime/pm/utils/getMarkPosition.js +34 -0
  370. package/dist/runtime/pm/utils/getMarksInSelection.d.ts +3 -0
  371. package/dist/runtime/pm/utils/getMarksInSelection.js +16 -0
  372. package/dist/runtime/pm/utils/getTypeByName.d.ts +2 -0
  373. package/dist/runtime/pm/utils/getTypeByName.js +5 -0
  374. package/dist/runtime/pm/utils/index.d.ts +15 -0
  375. package/dist/runtime/pm/utils/index.js +15 -0
  376. package/dist/runtime/pm/utils/internal/createNodeTypesList.d.ts +2 -0
  377. package/dist/runtime/pm/utils/internal/createNodeTypesList.js +17 -0
  378. package/dist/runtime/pm/utils/internal/debugMap.d.ts +7 -0
  379. package/dist/runtime/pm/utils/internal/debugMap.js +24 -0
  380. package/dist/runtime/pm/utils/internal/debugNode.d.ts +2 -0
  381. package/dist/runtime/pm/utils/internal/debugNode.js +18 -0
  382. package/dist/runtime/pm/utils/internal/debugSel.d.ts +5 -0
  383. package/dist/runtime/pm/utils/internal/debugSel.js +8 -0
  384. package/dist/runtime/pm/utils/internal/recurse.d.ts +2 -0
  385. package/dist/runtime/pm/utils/internal/recurse.js +39 -0
  386. package/dist/runtime/pm/utils/internal/stripBlockId.d.ts +2 -0
  387. package/dist/runtime/pm/utils/internal/stripBlockId.js +9 -0
  388. package/dist/runtime/pm/utils/mapSelection.d.ts +8 -0
  389. package/dist/runtime/pm/utils/mapSelection.js +12 -0
  390. package/dist/runtime/pm/utils/nodesBetween.d.ts +21 -0
  391. package/dist/runtime/pm/utils/nodesBetween.js +21 -0
  392. package/dist/runtime/pm/utils/pointToPmPoint.d.ts +2 -0
  393. package/dist/runtime/pm/utils/pointToPmPoint.js +3 -0
  394. package/dist/runtime/pm/utils/splitIntoChunks.d.ts +32 -0
  395. package/dist/runtime/pm/utils/splitIntoChunks.js +31 -0
  396. package/dist/runtime/testDocuments.d.ts +53 -0
  397. package/dist/runtime/testDocuments.js +122 -0
  398. package/dist/runtime/types/index.d.ts +53 -0
  399. package/dist/runtime/types/index.js +9 -0
  400. package/dist/types.d.mts +3 -0
  401. package/package.json +238 -0
  402. package/src/module.ts +101 -0
  403. package/src/runtime/assets/base.css +83 -0
  404. package/src/runtime/assets/handle-arrow.svg +16 -0
  405. package/src/runtime/assets/handle-border-circles-single.svg +44 -0
  406. package/src/runtime/assets/handle-border-circles.svg +27 -0
  407. package/src/runtime/assets/handle-temp.svg +1 -0
  408. package/src/runtime/assets/utils.css +9 -0
  409. package/src/runtime/components/CodeBlockThemePicker.vue +125 -0
  410. package/src/runtime/components/Commands.vue +67 -0
  411. package/src/runtime/components/Editor.vue +330 -0
  412. package/src/runtime/components/EditorDemoApp.vue +118 -0
  413. package/src/runtime/components/EditorDemoControls.vue +38 -0
  414. package/src/runtime/components/TestWrapper.vue +74 -0
  415. package/src/runtime/composables/useEditor.ts +29 -0
  416. package/src/runtime/composables/useWindowDebugging.ts +20 -0
  417. package/src/runtime/demo/App.vue +114 -0
  418. package/src/runtime/demo/README.md +1 -0
  419. package/src/runtime/demo/main.ts +8 -0
  420. package/src/runtime/demo/tailwind.css +4 -0
  421. package/src/runtime/env.d.ts +2 -0
  422. package/src/runtime/injectionKeys.ts +10 -0
  423. package/src/runtime/main.lib.ts +2 -0
  424. package/src/runtime/pm/commands/backspace.ts +44 -0
  425. package/src/runtime/pm/commands/changeAttrs.ts +37 -0
  426. package/src/runtime/pm/commands/deleteSelection.ts +22 -0
  427. package/src/runtime/pm/commands/enter.ts +27 -0
  428. package/src/runtime/pm/commands/insertBreak.ts +40 -0
  429. package/src/runtime/pm/features/Base/Base.ts +39 -0
  430. package/src/runtime/pm/features/Base/commands/deleteNodes.ts +54 -0
  431. package/src/runtime/pm/features/Base/commands/setCursorVisible.ts +24 -0
  432. package/src/runtime/pm/features/Base/plugins/debugSelectionPlugin.ts +57 -0
  433. package/src/runtime/pm/features/Base/plugins/isCursorVisiblePlugin.ts +28 -0
  434. package/src/runtime/pm/features/Base/plugins/isUsingTouchPlugin.ts +40 -0
  435. package/src/runtime/pm/features/Base/plugins/selectingIndicator.ts +38 -0
  436. package/src/runtime/pm/features/Base/plugins/unfocusedSelectionIndicatorPlugin.ts +107 -0
  437. package/src/runtime/pm/features/Base/types.ts +3 -0
  438. package/src/runtime/pm/features/BaseShortcuts/BaseShortcuts.ts +39 -0
  439. package/src/runtime/pm/features/Blockquote/Blockquote.ts +75 -0
  440. package/src/runtime/pm/features/Blockquote/commands/blockquoteEnter.ts +51 -0
  441. package/src/runtime/pm/features/Blockquote/commands/blockquoteShiftEnter.ts +26 -0
  442. package/src/runtime/pm/features/Blocks/Blocks.ts +3 -0
  443. package/src/runtime/pm/features/Blocks/Item.ts +176 -0
  444. package/src/runtime/pm/features/Blocks/List.ts +67 -0
  445. package/src/runtime/pm/features/Blocks/commands/changeItemType.ts +64 -0
  446. package/src/runtime/pm/features/Blocks/commands/changeTypeAttr.ts +47 -0
  447. package/src/runtime/pm/features/Blocks/commands/copyOrMoveItem.ts +179 -0
  448. package/src/runtime/pm/features/Blocks/commands/deleteItem.ts +24 -0
  449. package/src/runtime/pm/features/Blocks/commands/indentItem.ts +105 -0
  450. package/src/runtime/pm/features/Blocks/commands/itemMenuCommands.ts +62 -0
  451. package/src/runtime/pm/features/Blocks/commands/moveItem.ts +128 -0
  452. package/src/runtime/pm/features/Blocks/commands/setNode.ts +186 -0
  453. package/src/runtime/pm/features/Blocks/commands/splitItem.ts +116 -0
  454. package/src/runtime/pm/features/Blocks/commands/unindentItem.ts +82 -0
  455. package/src/runtime/pm/features/Blocks/components/DragTreeHandle.vue +142 -0
  456. package/src/runtime/pm/features/Blocks/components/ItemMenu.vue +88 -0
  457. package/src/runtime/pm/features/Blocks/components/ItemNodeView.vue +394 -0
  458. package/src/runtime/pm/features/Blocks/components/defaultItemMenu.ts +45 -0
  459. package/src/runtime/pm/features/Blocks/composables/useDragWithThreshold.ts +0 -0
  460. package/src/runtime/pm/features/Blocks/composables/useHandleHeight.ts +28 -0
  461. package/src/runtime/pm/features/Blocks/composables/useHasChildren.ts +14 -0
  462. package/src/runtime/pm/features/Blocks/composables/useNodeStates.ts +29 -0
  463. package/src/runtime/pm/features/Blocks/itemMenuMenuItems.ts +143 -0
  464. package/src/runtime/pm/features/Blocks/plugins/ensureLastItemIsContentPlugin.ts +52 -0
  465. package/src/runtime/pm/features/Blocks/plugins/itemBlockIdPlugin.ts +40 -0
  466. package/src/runtime/pm/features/Blocks/plugins/itemHasSingularSelectionPlugin.ts +32 -0
  467. package/src/runtime/pm/features/Blocks/plugins/itemMenuPlugin.ts +21 -0
  468. package/src/runtime/pm/features/Blocks/states/stateful.ts +41 -0
  469. package/src/runtime/pm/features/Blocks/states/task/cancelled.svg +32 -0
  470. package/src/runtime/pm/features/Blocks/states/task/checked.svg +27 -0
  471. package/src/runtime/pm/features/Blocks/states/task/checked2.svg +24 -0
  472. package/src/runtime/pm/features/Blocks/states/task/partial.svg +24 -0
  473. package/src/runtime/pm/features/Blocks/states/task/partial2.svg +31 -0
  474. package/src/runtime/pm/features/Blocks/states/task/unchecked.svg +20 -0
  475. package/src/runtime/pm/features/Blocks/types.ts +51 -0
  476. package/src/runtime/pm/features/Blocks/utils/createItemMenuCommandExecuter.ts +47 -0
  477. package/src/runtime/pm/features/Blocks/utils/fixBlockIds.ts +28 -0
  478. package/src/runtime/pm/features/Blocks/utils/isValidId.ts +8 -0
  479. package/src/runtime/pm/features/CodeBlock/CodeBlock.ts +104 -0
  480. package/src/runtime/pm/features/CodeBlock/build/generateHighlightJsInfo.js +63 -0
  481. package/src/runtime/pm/features/CodeBlock/commands/codeBlockEnterOrSplit.ts +55 -0
  482. package/src/runtime/pm/features/CodeBlock/commands/codeBlockIndent.ts +67 -0
  483. package/src/runtime/pm/features/CodeBlock/commands/codeBlockUnindent.ts +74 -0
  484. package/src/runtime/pm/features/CodeBlock/commands/focusCodeBlockLanguage.ts +44 -0
  485. package/src/runtime/pm/features/CodeBlock/components/CodeBlockView.vue +126 -0
  486. package/src/runtime/pm/features/CodeBlock/composables/useAsyncCodeBlockHighlighting.ts +185 -0
  487. package/src/runtime/pm/features/CodeBlock/composables/useHighlightJsTheme.ts +150 -0
  488. package/src/runtime/pm/features/CodeBlock/highlightJsInfo.ts +733 -0
  489. package/src/runtime/pm/features/CodeBlock/types.ts +7 -0
  490. package/src/runtime/pm/features/Collaboration/Collaboration.ts +295 -0
  491. package/src/runtime/pm/features/CommandsMenus/CommandBar.ts +130 -0
  492. package/src/runtime/pm/features/CommandsMenus/commandBarMenuItems.ts +209 -0
  493. package/src/runtime/pm/features/CommandsMenus/components/CommandBar.vue +63 -0
  494. package/src/runtime/pm/features/CommandsMenus/components/CommandBarItem.vue +48 -0
  495. package/src/runtime/pm/features/CommandsMenus/components/CommandMenuGroup.vue +59 -0
  496. package/src/runtime/pm/features/CommandsMenus/components/CommandMenuItem.vue +67 -0
  497. package/src/runtime/pm/features/CommandsMenus/components/CommandMenuList.vue +60 -0
  498. package/src/runtime/pm/features/CommandsMenus/components/TextIcon.vue +14 -0
  499. package/src/runtime/pm/features/CommandsMenus/icons/HighlightIcon.vue +51 -0
  500. package/src/runtime/pm/features/CommandsMenus/icons/SubscriptIcon.vue +5 -0
  501. package/src/runtime/pm/features/CommandsMenus/icons/SuperscriptIcon.vue +5 -0
  502. package/src/runtime/pm/features/CommandsMenus/types.ts +73 -0
  503. package/src/runtime/pm/features/CommandsMenus/utils/defaultCommandExecutor.ts +22 -0
  504. package/src/runtime/pm/features/CommandsMenus/utils/findCommand.ts +37 -0
  505. package/src/runtime/pm/features/CommandsMenus/utils/popupPositionModifier.ts +14 -0
  506. package/src/runtime/pm/features/CommandsMenus/utils/popupVerticalPositioner.ts +16 -0
  507. package/src/runtime/pm/features/Document/Document.ts +9 -0
  508. package/src/runtime/pm/features/DocumentApi/DocumentApi.ts +272 -0
  509. package/src/runtime/pm/features/DocumentApi/composables/useEditorContent.ts +105 -0
  510. package/src/runtime/pm/features/DocumentApi/composables/useTestDocumentApi.ts +95 -0
  511. package/src/runtime/pm/features/DocumentApi/types.ts +143 -0
  512. package/src/runtime/pm/features/DocumentApi/utils/convertFullTransactionForPartialState.ts +54 -0
  513. package/src/runtime/pm/features/DocumentApi/utils/convertTrForInstance.ts +24 -0
  514. package/src/runtime/pm/features/DocumentApi/utils/convertTransactionForFullState.ts +39 -0
  515. package/src/runtime/pm/features/DocumentApi/utils/copyMeta.ts +8 -0
  516. package/src/runtime/pm/features/DocumentApi/utils/getEmbedJson.ts +16 -0
  517. package/src/runtime/pm/features/DocumentApi/utils/getEmbedNodeFromDoc.ts +15 -0
  518. package/src/runtime/pm/features/DocumentApi/utils/getStateEmbedRange.ts +26 -0
  519. package/src/runtime/pm/features/DocumentApi/utils/isEmbedId.ts +5 -0
  520. package/src/runtime/pm/features/EmbeddedDocument/Embedded.ts +110 -0
  521. package/src/runtime/pm/features/EmbeddedDocument/EmbeddedDocument.ts +102 -0
  522. package/src/runtime/pm/features/EmbeddedDocument/components/EmbeddedDocumentPicker.vue +188 -0
  523. package/src/runtime/pm/features/EmbeddedDocument/components/EmbeddedNodeView.vue +187 -0
  524. package/src/runtime/pm/features/EmbeddedDocument/composables/useEmbeddedEditor.ts +302 -0
  525. package/src/runtime/pm/features/EmbeddedDocument/types.ts +61 -0
  526. package/src/runtime/pm/features/EmbeddedDocument/utils/isEmbeddedBlock.ts +12 -0
  527. package/src/runtime/pm/features/EmbeddedDocument/utils/redirectFromEmbedded.ts +48 -0
  528. package/src/runtime/pm/features/FileLoader/FileLoader.ts +120 -0
  529. package/src/runtime/pm/features/FileLoader/FileLoaderHandler/FileLoaderHandler.ts +100 -0
  530. package/src/runtime/pm/features/FileLoader/FileLoaderHandler/TestFileLoaderHandler.ts +61 -0
  531. package/src/runtime/pm/features/FileLoader/commands/insertFile.ts +87 -0
  532. package/src/runtime/pm/features/FileLoader/components/FileLoaderNodeView.vue +38 -0
  533. package/src/runtime/pm/features/FileLoader/plugins/fileLoaderPlugin.ts +70 -0
  534. package/src/runtime/pm/features/FileLoader/types.ts +91 -0
  535. package/src/runtime/pm/features/FileLoader/utils/cleanupFileLoaderNode.ts +39 -0
  536. package/src/runtime/pm/features/FileLoader/utils/cleanupFileLoaderNodes.ts +42 -0
  537. package/src/runtime/pm/features/FileLoader/utils/findLoadingNodePos.ts +16 -0
  538. package/src/runtime/pm/features/FileLoader/utils/optionsCheck.ts +16 -0
  539. package/src/runtime/pm/features/FileLoader/utils/readAsDataUrl.ts +12 -0
  540. package/src/runtime/pm/features/HardBreak/HardBreak.ts +21 -0
  541. package/src/runtime/pm/features/Heading/Heading.ts +130 -0
  542. package/src/runtime/pm/features/Heading/commands/changeLevelAttr.ts +55 -0
  543. package/src/runtime/pm/features/Heading/types.ts +17 -0
  544. package/src/runtime/pm/features/Highlight/Highlight.ts +234 -0
  545. package/src/runtime/pm/features/Highlight/retyped/tiptapHighlight.d.ts +3 -0
  546. package/src/runtime/pm/features/Highlight/retyped/tiptapHighlight.js +5 -0
  547. package/src/runtime/pm/features/Highlight/types.ts +25 -0
  548. package/src/runtime/pm/features/History/History.ts +112 -0
  549. package/src/runtime/pm/features/Iframe/Iframe.ts +163 -0
  550. package/src/runtime/pm/features/Iframe/IframeParsers.ts +116 -0
  551. package/src/runtime/pm/features/Iframe/components/IframeNodeView.vue +83 -0
  552. package/src/runtime/pm/features/Iframe/types.ts +7 -0
  553. package/src/runtime/pm/features/Image/Image.ts +16 -0
  554. package/src/runtime/pm/features/Link/Link.ts +313 -0
  555. package/src/runtime/pm/features/Link/components/BubbleMenuExternalLink.vue +125 -0
  556. package/src/runtime/pm/features/Link/components/BubbleMenuInternalLink.vue +130 -0
  557. package/src/runtime/pm/features/Link/components/BubbleMenuLink.vue +149 -0
  558. package/src/runtime/pm/features/Link/components/BubbleMenuLinkActions.vue +65 -0
  559. package/src/runtime/pm/features/Link/types.ts +53 -0
  560. package/src/runtime/pm/features/Menus/Menus.ts +195 -0
  561. package/src/runtime/pm/features/Menus/components/MarkMenuManager.vue +203 -0
  562. package/src/runtime/pm/features/Menus/types.ts +64 -0
  563. package/src/runtime/pm/features/Menus/utils/isMarkMenu.ts +5 -0
  564. package/src/runtime/pm/features/Tables/commands/tableEnter.ts +40 -0
  565. package/src/runtime/pm/features/Tables/index.ts +60 -0
  566. package/src/runtime/pm/schema.ts +128 -0
  567. package/src/runtime/pm/testSchema.ts +34 -0
  568. package/src/runtime/pm/utils/createDropIndicator.ts +61 -0
  569. package/src/runtime/pm/utils/createStateOnlyPluginApply.ts +11 -0
  570. package/src/runtime/pm/utils/createStateOnlyPluginObjApply.ts +16 -0
  571. package/src/runtime/pm/utils/dropPointInfo.ts +85 -0
  572. package/src/runtime/pm/utils/findUpwards.ts +43 -0
  573. package/src/runtime/pm/utils/getChildChunks.ts +24 -0
  574. package/src/runtime/pm/utils/getDiffReplacementRange.ts +32 -0
  575. package/src/runtime/pm/utils/getElMaxVisualSize.ts +14 -0
  576. package/src/runtime/pm/utils/getElPropertyAsInt.ts +8 -0
  577. package/src/runtime/pm/utils/getGroupNodeNames.ts +9 -0
  578. package/src/runtime/pm/utils/getMarkPosition.ts +57 -0
  579. package/src/runtime/pm/utils/getMarksInSelection.ts +19 -0
  580. package/src/runtime/pm/utils/getTypeByName.ts +7 -0
  581. package/src/runtime/pm/utils/index.ts +17 -0
  582. package/src/runtime/pm/utils/internal/createNodeTypesList.ts +25 -0
  583. package/src/runtime/pm/utils/internal/debugMap.ts +36 -0
  584. package/src/runtime/pm/utils/internal/debugNode.ts +38 -0
  585. package/src/runtime/pm/utils/internal/debugSel.ts +10 -0
  586. package/src/runtime/pm/utils/internal/recurse.ts +44 -0
  587. package/src/runtime/pm/utils/internal/stripBlockId.ts +10 -0
  588. package/src/runtime/pm/utils/mapSelection.ts +21 -0
  589. package/src/runtime/pm/utils/nodesBetween.ts +47 -0
  590. package/src/runtime/pm/utils/pointToPmPoint.ts +5 -0
  591. package/src/runtime/pm/utils/splitIntoChunks.ts +68 -0
  592. package/src/runtime/testDocuments.ts +130 -0
  593. package/src/runtime/types/index.ts +56 -0
@@ -0,0 +1,120 @@
1
+ import { mergeAttributes, Node } from "@tiptap/core"
2
+
3
+ import { insertFile } from "./commands/insertFile.js"
4
+ import { fileLoaderPlugin } from "./plugins/fileLoaderPlugin.js"
5
+ import type { FileLoaderExtensionOptions } from "./types.js"
6
+ import { optionsCheck } from "./utils/optionsCheck.js"
7
+
8
+ import { isValidId } from "../Blocks/utils/isValidId.js"
9
+
10
+ /**
11
+ * Provides a way to asynchronously load files into the editor and a node to display while they are loading.
12
+ *
13
+ * An {@link IFileLoaderHandler} interface should be passed to describe what to do with the file at each step. There is a default implementation at {@link FileLoaderHandler} that tries to handler as much as possible. See it for details.
14
+ *
15
+ * It also automatically removes fileLoader nodes when the document is loaded. You can disable this with the `cleanupOnLoad` option.
16
+ *
17
+ * To force the plugin to cleanup after the first load you can do `tr.setMeta("cleanFileLoaders")`.
18
+ *
19
+ * A basic node view that can preview images is provided but not configured.
20
+ *
21
+ */
22
+
23
+ // eslint-disable-next-line @typescript-eslint/naming-convention
24
+ export const FileLoader = Node.create<FileLoaderExtensionOptions>({
25
+ name: "fileLoader",
26
+ content: "",
27
+ marks: "",
28
+ group: "block",
29
+ addOptions() {
30
+ return {
31
+ cleanupOnLoad: true,
32
+ onDrop: undefined,
33
+ onPaste: undefined,
34
+ // there are checks on init to throw if the user didn't configure a handler
35
+ handler: undefined as any,
36
+ embeddedBlockCommandRedirect: undefined,
37
+ HTMLAttributes: {
38
+ class: `
39
+ rounded-sm
40
+ animate-pulse
41
+ bg-accent-200
42
+ text-accent-800
43
+ dark:bg-accent-700
44
+ dark:text-accent-300
45
+ px-2
46
+ `
47
+ }
48
+ }
49
+ },
50
+ addAttributes() {
51
+ return {
52
+ HTMLAttributes: {
53
+ default: { }
54
+ },
55
+ /** For the optional FileLoaderNodeView. */
56
+ preview: {
57
+ default: undefined
58
+ },
59
+ fileName: {
60
+ default: undefined
61
+ },
62
+ loading: {
63
+ default: true
64
+ },
65
+ loadingId: {
66
+ default: undefined
67
+ }
68
+ }
69
+ },
70
+ parseHTML() {
71
+ return [
72
+ {
73
+ tag: `div[type=${this.name}]`,
74
+ getAttrs: dom => {
75
+ const fileName = dom.getAttribute("file-name")
76
+ const loading = dom.getAttribute("file-loading")
77
+ const loadingId = dom.getAttribute("file-loading-id")
78
+ return {
79
+ fileName,
80
+ loadingId: isValidId(loadingId, 10) ? loadingId : undefined,
81
+ loading: loading === "true"
82
+ }
83
+ }
84
+ }
85
+ ]
86
+ },
87
+
88
+ // eslint-disable-next-line @typescript-eslint/naming-convention
89
+ renderHTML({ node, HTMLAttributes }) {
90
+ return [
91
+ "div",
92
+ mergeAttributes(
93
+ this.options.HTMLAttributes,
94
+ HTMLAttributes,
95
+ {
96
+ "file-loading-id": node.attrs.loadingId,
97
+ "file-name": node.attrs.fileName,
98
+ "file-loading": node.attrs.loading,
99
+ type: this.name
100
+ }
101
+ ),
102
+ `Loading "${node.attrs.fileName ?? "Unknown"}" ...`
103
+ ]
104
+ },
105
+ addCommands() {
106
+ optionsCheck(this.editor, this.options)
107
+ const self = this
108
+ return {
109
+ insertFile: insertFile(self.options.handler)
110
+ }
111
+ },
112
+ addProseMirrorPlugins() {
113
+ const self = this
114
+ return [
115
+ fileLoaderPlugin(self.editor, self.options)
116
+ ]
117
+ }
118
+ })
119
+
120
+ export type NodeFileLoaderName = "fileLoader"
@@ -0,0 +1,100 @@
1
+ import type { MakeOptional } from "@alanscodelog/utils/types"
2
+ import { unreachable } from "@alanscodelog/utils/unreachable"
3
+ import type { Editor } from "@tiptap/core"
4
+ import { nanoid } from "nanoid"
5
+
6
+ import { findUpwards } from "../../../utils/findUpwards.js"
7
+ import type { IFileLoaderHandler } from "../types.js"
8
+ import { cleanupFileLoaderNode } from "../utils/cleanupFileLoaderNode.js"
9
+
10
+ /**
11
+ * A partial implementation of {@link IFileLoaderHandler}.
12
+ *
13
+ * Using the defaults of this class, you only need to specify the handler's `loadFile` and `replaceLoadingNode` properties.
14
+ *
15
+ * It assumes the use of the {@link Item} extension since it uses the node to wrap the fileLoader node.
16
+ *
17
+ * To identify each fileLoader node and fetch it again once the file is loaded, it uses a 10 character nanoid.
18
+ */
19
+ export class FileLoaderHandler<
20
+ TFile extends File,
21
+ T = { file: TFile, result: string | ArrayBuffer | null },
22
+ TKey = string
23
+ >implements IFileLoaderHandler<TFile, T, TKey> {
24
+ loadFile: IFileLoaderHandler<TFile, T, TKey>["loadFile"]
25
+
26
+ onLoadError: IFileLoaderHandler<TFile, T, TKey>["onLoadError"]
27
+
28
+ insertPosition: IFileLoaderHandler<TFile, T, TKey>["insertPosition"]
29
+
30
+ insertLoadingNode: IFileLoaderHandler<TFile, T, TKey>["insertLoadingNode"]
31
+
32
+ replaceLoadingNode: IFileLoaderHandler<TFile, T, TKey>["replaceLoadingNode"]
33
+
34
+ filterFile: IFileLoaderHandler<TFile, T, TKey>["filterFile"]
35
+
36
+ constructor(
37
+ opts: MakeOptional<IFileLoaderHandler<TFile, T, TKey>, "onLoadError" | "insertPosition" | "insertLoadingNode">
38
+ ) {
39
+ this.loadFile = opts.loadFile
40
+ this.replaceLoadingNode = opts.replaceLoadingNode
41
+
42
+ if (opts.onLoadError) this.onLoadError = opts.onLoadError
43
+ else this.onLoadError = this.defaultOnLoadError
44
+ if (opts.insertPosition) this.insertPosition = opts.insertPosition
45
+ else this.insertPosition = this.defaultInsertPosition
46
+ if (opts.insertLoadingNode) this.insertLoadingNode = opts.insertLoadingNode
47
+ else this.insertLoadingNode = this.defaultInsertLoadingNode
48
+ if (opts.filterFile) this.filterFile = opts.filterFile
49
+ else this.filterFile = this.defaultFilterFile
50
+ }
51
+
52
+ defaultFilterFile(file: File): TFile | undefined {
53
+ return file as TFile
54
+ }
55
+
56
+ defaultInsertPosition(_file: TFile, editor: Editor, pos?: number): number | undefined {
57
+ const position = pos ?? editor.state.selection.anchor
58
+ const $insertionNode = findUpwards(editor.state.doc, position, $node => {
59
+ if ($node.node().type.name === "item") {
60
+ return true
61
+ }
62
+ return false
63
+ }).$pos
64
+ return $insertionNode ? $insertionNode.end() + 1 : undefined
65
+ }
66
+
67
+ defaultOnLoadError(_file: TFile, editor: Editor, pos: number | undefined): void {
68
+ if (pos === undefined) unreachable()
69
+ editor.commands.command(({ tr }) => {
70
+ cleanupFileLoaderNode(
71
+ tr,
72
+ pos,
73
+ editor.schema.nodes.fileLoader,
74
+ [
75
+ editor.state.schema.nodes.item,
76
+ editor.state.schema.nodes.list
77
+ ],
78
+ editor.schema.nodes.paragraph
79
+ )
80
+ return true
81
+ })
82
+ }
83
+
84
+ defaultInsertLoadingNode(file: TFile, editor: Editor, insertPos: number): TKey {
85
+ const attrs = {
86
+ loadingId: nanoid(10),
87
+ fileName: file.name,
88
+ loading: true
89
+ }
90
+ editor.commands.command(({ tr }) => {
91
+ const pm = editor.schema.nodes
92
+ tr.insert(insertPos, pm.item.create(
93
+ {},
94
+ pm.fileLoader.create(attrs)
95
+ ))
96
+ return true
97
+ })
98
+ return attrs.loadingId as TKey
99
+ }
100
+ }
@@ -0,0 +1,61 @@
1
+ import { delay } from "@alanscodelog/utils/delay"
2
+ import mime from "mime/lite"
3
+
4
+ import { FileLoaderHandler } from "./FileLoaderHandler.js"
5
+
6
+ import { findLoadingNodePos } from "../utils/findLoadingNodePos.js"
7
+ import { readAsDataUrl } from "../utils/readAsDataUrl.js"
8
+
9
+ export const testFileLoaderDelay = 2000
10
+ /** Instance of {@link FileLoaderHandler} for testing. */
11
+
12
+ // eslint-disable-next-line @typescript-eslint/naming-convention
13
+ export const TestFileLoaderHandler = new FileLoaderHandler({
14
+ filterFile: file => {
15
+ const mimeExtension = mime.getExtension(file.type)
16
+ if (!mimeExtension) return undefined
17
+ const normalizedMimeType = mime.getType(mimeExtension)
18
+ ;(file as any).parsedMime = normalizedMimeType
19
+
20
+ if (!normalizedMimeType?.startsWith("image")) return undefined
21
+ return file as File & { parsedMime: string }
22
+ },
23
+ replaceLoadingNode(editor, pos, res) {
24
+ const pm = editor.schema.nodes
25
+ const parsedMime = res.file.parsedMime
26
+ const returnVal = editor.commands.command(({ tr }) => {
27
+ if (parsedMime.startsWith("image")) {
28
+ tr.replaceWith(pos, pos + 1, pm.image.create({
29
+ src: res.result
30
+ }))
31
+ return true
32
+ }
33
+ tr.delete(pos, pos + 1)
34
+ // todo show warning
35
+ return false
36
+ })
37
+ return returnVal
38
+ },
39
+ loadFile: async (file, insertId, editor) => {
40
+ const result = await readAsDataUrl(file)
41
+ const replacePos = findLoadingNodePos(editor.state, insertId)
42
+
43
+ // preview the "upload"
44
+ if (replacePos !== undefined) {
45
+ editor.commands.command(({ tr }) => {
46
+ tr.setNodeAttribute(replacePos, "preview", result)
47
+ return true
48
+ })
49
+ }
50
+
51
+ if (file.parsedMime.startsWith("image")) {
52
+ // simulating a upload, using Math.random() to simulate different speeds
53
+ await delay(testFileLoaderDelay * Math.random())
54
+ return {
55
+ file,
56
+ result
57
+ }
58
+ }
59
+ return undefined
60
+ }
61
+ })
@@ -0,0 +1,87 @@
1
+ import type { Command } from "@tiptap/core"
2
+
3
+ import { redirectFromEmbedded } from "../../EmbeddedDocument/utils/redirectFromEmbedded.js"
4
+ import type { IFileLoaderHandler } from "../types.js"
5
+ import { findLoadingNodePos } from "../utils/findLoadingNodePos.js"
6
+
7
+ declare module "@tiptap/core" {
8
+
9
+ // eslint-disable-next-line @typescript-eslint/naming-convention
10
+ interface Commands<ReturnType> {
11
+ fileLoader: {
12
+ /**
13
+ * Insert a file into the editor using the FileLoader extension. The configured {@link IFileLoaderHandler} determines where exactly it's inserted (in an item node after by default).
14
+ *
15
+ * You can technically test if this will work with `can` but it's not 100% accurate. We only check if at least one file passes the file filter, not everything else.
16
+ *
17
+ * @redirectable
18
+ */
19
+ // this exists in part because I cannot get e2e tests with drop events to work
20
+ // see the FileLoader tests
21
+ // we also need inserFiles to be redirectable
22
+ insertFile(files: File[], pos?: number): ReturnType
23
+ }
24
+ }
25
+ }
26
+ export const insertFile = (
27
+ handler: IFileLoaderHandler<any, any>,
28
+ debug: boolean = false
29
+ ) => (
30
+ files: File[],
31
+ pos?: number
32
+ ): Command => ({ tr, editor, view, commands, dispatch }): boolean => {
33
+ const redirect = redirectFromEmbedded(view, "insertFile", { args: [files, pos], view, commands })
34
+ if (redirect.redirected) { return redirect.result as any }
35
+ // since the handler can call it's own new transactions
36
+ // if we don't prevent this one, we'll get a mismatched transaction error
37
+ if (dispatch) tr.setMeta("fileLoaderIgnore", true)
38
+
39
+ if (!dispatch) {
40
+ return files.some(file => handler.filterFile?.(file) ?? true)
41
+ }
42
+ // insert them in reverse so they show up in the correct order
43
+ void Promise.allSettled(files.reverse().map(async file => {
44
+ // eslint-disable-next-line no-console
45
+ if (debug) console.log(`insertFile for ${file.name}`, file)
46
+ const f = handler.filterFile ? handler.filterFile(file) : file
47
+ if (!f) return
48
+
49
+ // eslint-disable-next-line no-console
50
+ if (debug) console.log(`filterFile for ${file.name}`, f)
51
+
52
+ const insertPosition = handler.insertPosition(f, editor, pos)
53
+
54
+ // eslint-disable-next-line no-console
55
+ if (debug) console.log(`insertPosition for ${file.name}`, insertPosition)
56
+ if (insertPosition === undefined) return
57
+
58
+ const insertLoadingNode = handler.insertLoadingNode
59
+ const insertId = insertLoadingNode(f, editor, insertPosition, pos)
60
+
61
+ // eslint-disable-next-line no-console
62
+ if (debug) console.log(`insertId for ${file.name}`, insertId)
63
+ if (!insertId) return
64
+
65
+ const res = await handler.loadFile?.(f, insertId, editor)
66
+
67
+ // eslint-disable-next-line no-console
68
+ if (debug) console.log(`result for ${file.name}`, res)
69
+ if (!res) {
70
+ return handler.onLoadError(f, editor, undefined, new Error("fileLoader returned nothing."), insertId)
71
+ }
72
+
73
+ const replacePos = findLoadingNodePos(editor.state, insertId)
74
+
75
+ // eslint-disable-next-line no-console
76
+ if (debug) console.log(`replacePos for ${file.name}`, replacePos)
77
+ if (replacePos === undefined) {
78
+ return handler.onLoadError(f, editor, replacePos, new Error("Could not find node to replace."), insertId)
79
+ }
80
+
81
+ const replaceRes = handler.replaceLoadingNode(editor, replacePos, res as any, insertId)
82
+
83
+ // eslint-disable-next-line no-console
84
+ if (debug) console.log(`called replaceLoadingNode for ${file.name}, replaced node:`, replaceRes)
85
+ })).then(() => {})
86
+ return true
87
+ }
@@ -0,0 +1,38 @@
1
+ <template>
2
+ <!-- @vue-expect-error contenteditable exists -->
3
+ <node-view-wrapper
4
+ :class="twMerge(`
5
+ group/file-loader
6
+ rounded-sm
7
+ animate-pulse
8
+ bg-accent-200
9
+ text-accent-800
10
+ dark:bg-accent-700
11
+ dark:text-accent-300
12
+ px-2
13
+ flex
14
+ flex-col
15
+ items-center
16
+ gap-2
17
+ `
18
+ )"
19
+ contenteditable="false"
20
+ >
21
+ <div class="self-start">
22
+ {{ `Loading "${node.attrs.fileName ?? `Unknown`}" ...` }}
23
+ </div>
24
+ <img
25
+ v-if="node.attrs.preview"
26
+ class="!max-h-[200px] !max-w-[200px] mb-2"
27
+ :src="node.attrs.preview"
28
+ alt="Loading Image"
29
+ >
30
+ </node-view-wrapper>
31
+ </template>
32
+
33
+ <script setup lang="ts">
34
+ import { nodeViewProps, NodeViewWrapper } from "@tiptap/vue-3"
35
+ import { twMerge } from "tailwind-merge"
36
+
37
+ /* const props = */defineProps(nodeViewProps)
38
+ </script>
@@ -0,0 +1,70 @@
1
+ import type { Editor } from "@tiptap/core"
2
+ import { Plugin, PluginKey, type Transaction } from "@tiptap/pm/state"
3
+
4
+ import type { FileLoaderExtensionOptions } from "../types.js"
5
+ import { cleanupFileLoaderNodes } from "../utils/cleanupFileLoaderNodes.js"
6
+
7
+ export const fileLoaderPluginKey = new PluginKey("fileLoader")
8
+
9
+ export function fileLoaderPlugin(
10
+ editor: Editor,
11
+ options: Pick<FileLoaderExtensionOptions, "cleanupOnLoad">
12
+ ): Plugin<any> {
13
+ let cleaned = false
14
+ return new Plugin({
15
+ key: fileLoaderPluginKey,
16
+ /** See {@link DocumentApi} */
17
+ stateInit: (tr: Transaction) => {
18
+ if (!options.cleanupOnLoad) return
19
+ cleaned = true
20
+ return cleanupFileLoaderNodes(
21
+ tr,
22
+ editor.schema,
23
+ editor.state.schema.nodes.fileLoader,
24
+ [
25
+ editor.state.schema.nodes.item,
26
+ editor.state.schema.nodes.list
27
+ ],
28
+ editor.state.schema.nodes.paragraph
29
+ )
30
+ },
31
+ // in case the documentApi isn't being used to load documents
32
+ appendTransaction: (_, _oldState, newState) => {
33
+ if (!newState.tr.getMeta("cleanFileLoaders") && (!options.cleanupOnLoad || cleaned)) return
34
+ cleaned = true
35
+ return cleanupFileLoaderNodes(
36
+ newState.tr,
37
+ editor.schema,
38
+ editor.state.schema.nodes.fileLoader,
39
+ [
40
+ editor.state.schema.nodes.item,
41
+ editor.state.schema.nodes.list
42
+ ],
43
+ editor.state.schema.nodes.paragraph
44
+ )
45
+ },
46
+ filterTransaction: tr => {
47
+ if (tr.getMeta("fileLoaderIgnore")) return false
48
+ return true
49
+ },
50
+ props: {
51
+ handleDOMEvents: {
52
+ drop: (view, event) => {
53
+ event.preventDefault()
54
+ const pos = view.posAtCoords({ left: event.clientX, top: event.clientY })
55
+ if (!pos) return
56
+ const position = pos.inside > 0 ? pos.inside : pos.pos - 1
57
+ const files = Array.from(event.dataTransfer?.files ?? [])
58
+ void editor.commands.insertFile(files, position)
59
+ },
60
+ paste: (_view, event) => {
61
+ const files = Array.from(event.clipboardData?.files ?? [])
62
+ const htmlContent = event.clipboardData?.getData("text/html")
63
+ // let the editor handle it
64
+ if (htmlContent) return
65
+ void editor.commands.insertFile(files)
66
+ }
67
+ }
68
+ }
69
+ })
70
+ }
@@ -0,0 +1,91 @@
1
+ import type { Editor } from "@tiptap/core"
2
+
3
+ import type { HTMLAttributesOptions } from "../../../types/index.js"
4
+ import type { WithOnTriggerByEmbeddedBlockOptions } from "../EmbeddedDocument/types.js"
5
+
6
+ export interface FileLoaderExtensionOptions extends HTMLAttributesOptions, WithOnTriggerByEmbeddedBlockOptions {
7
+ /**
8
+ * By default, the plugin removes fileLoader nodes using {@link cleanupFileLoaderNodes} when the document is loaded. This can happen if the user interrupts a file load/upload/save and the document is saved with a fileLoader node.
9
+ *
10
+ * We can't keep a reference to the file they wanted to load without external work, so the nodes are removed.
11
+ */
12
+ cleanupOnLoad?: boolean
13
+ /** See {@link IFileLoaderHandler} */
14
+ handler: IFileLoaderHandler<File, any>
15
+ }
16
+
17
+ /**
18
+ * Helps handle the loading of files. Provides a way to adjust the insert position and takes care of keeping track of loading vs loaded nodes.
19
+ *
20
+ * See {@link FileLoaderHandler} for a partial implementation you can customize to create the interface.
21
+ *
22
+ * The insert handlers are called with the files in reverse order so that you can more easily insert them one after the other without position mapping.
23
+ */
24
+
25
+ // eslint-disable-next-line @typescript-eslint/naming-convention
26
+ export type IFileLoaderHandler<
27
+ TFile extends File,
28
+ T = { file: TFile, result: string | ArrayBuffer | null },
29
+ TKey = string
30
+ > = {
31
+ /**
32
+ * Should load/save/upload the file and return the information neccesary to create the loaded node.
33
+ *
34
+ * The `insertId` and `editor` are provided in case you're uploading the file or doing some other heavy operation and want to update the fileLoader node as soon as you can load the image.
35
+ *
36
+ * A `FileLoaderNodeView` is provided (but no pre-configured) for these purposes. If you set the node's `preview` property it will use it as the src for an image.
37
+ */
38
+ loadFile: (file: TFile, insertId: TKey, editor: Editor) => Promise<T | undefined>
39
+ /**
40
+ * This can be used to remove the loading node on errors.
41
+ *
42
+ * The default {@link FileLoaderHandler.onLoadError} uses {@link cleanupFileLoaderNodes} to remove the parent item node if possible, otherwise it turns the fileLoader node into a paragraph.
43
+ */
44
+ onLoadError: (
45
+ file: TFile,
46
+ editor: Editor,
47
+ pos: number | undefined,
48
+ error: Error,
49
+ loadingKey: TKey,
50
+ ) => void
51
+
52
+ /**
53
+ *
54
+ * Where to insert the fileLoader node.
55
+ *
56
+ * The default @{@link FileLoaderHandler.insertPosition} returns the position after the closest parent item node. The idea being one inserts a new item node there with a loading file node inside.
57
+ *
58
+ * You can override this by returning a different position. If no position is returned, no node is inserted.
59
+ */
60
+ insertPosition: (file: TFile, editor: Editor, pos?: number) => number | undefined
61
+ /**
62
+ * Given a file, should insert a fileLoader node with the `loadingId` set to a unique key that the extension can then use to find the node again. It should return this key if it inserted the node.
63
+ *
64
+ * Using the file name is not a good idea as it's not guaranteed to be unique if the user inserts the same item twice.
65
+ *
66
+ * The default {@link FileLoaderHandler.insertLoadingNode} inserts a new item node with a fileLoader node inside after in the closest viable position after the insertPos. It uses a nanoid for the loading id.
67
+ */
68
+ insertLoadingNode: (file: TFile, editor: Editor, insertPos: number, originalPos?: number) => TKey | undefined
69
+ /**
70
+ * After loading the file, if it's successful, this is passed the result and the position of the fileLoader node.
71
+ *
72
+ * Note that this position points at the node with those attributes, and not it's parent in the case of having inserted a wrapping node.
73
+ *
74
+ *
75
+ */
76
+ replaceLoadingNode: (
77
+ editor: Editor,
78
+ pos: number,
79
+ res: T,
80
+ loadingKey: TKey,
81
+ ) => void
82
+ /**
83
+ * Return the file (or whatever type you'd like) to allow the extension to handle it.
84
+ *
85
+ * If the function doesn't return anything, the file will be ignored.
86
+ * No fileLoader node will be created. The event will still be preventDefaulted.
87
+ *
88
+ * This can be used to filter out mime types you can't handle with a library like `mime`. Mime type filtering is not handled by the extension since it can be complicated.
89
+ */
90
+ filterFile: (file: File) => TFile | undefined
91
+ }
@@ -0,0 +1,39 @@
1
+ import type { NodeType, ResolvedPos } from "@tiptap/pm/model"
2
+ import type { Transaction } from "@tiptap/pm/state"
3
+
4
+ import { findUpwards } from "../../../utils/findUpwards.js"
5
+
6
+ /** Like {@link cleanupFileLoaderNodes} but for single nodes when you already know the position. Returns true if it deleted a node. */
7
+
8
+ export function cleanupFileLoaderNode(
9
+ tr: Transaction,
10
+ pos: number,
11
+ fileLoaderType: NodeType,
12
+ wrappingTypes: NodeType[],
13
+ replaceType: NodeType
14
+ ): boolean {
15
+ const node = tr.doc.nodeAt(pos)
16
+ if (!node) return false
17
+ if (node.type === fileLoaderType) {
18
+ let $parent: ResolvedPos | undefined
19
+ findUpwards(tr.doc, pos, $pos => {
20
+ if (wrappingTypes.includes($pos.parent.type)) {
21
+ if ($pos.parent.childCount === 1) {
22
+ $parent = $pos
23
+ } else {
24
+ return true
25
+ }
26
+ } else if ($parent) {
27
+ return true
28
+ }
29
+ return false
30
+ })
31
+ if ($parent) {
32
+ tr.delete($parent.start() - 1, $parent.end() + 1)
33
+ } else {
34
+ tr.replaceWith(pos, pos + node.nodeSize, replaceType.create())
35
+ }
36
+ return true
37
+ }
38
+ return false
39
+ }
@@ -0,0 +1,42 @@
1
+ import { unreachable } from "@alanscodelog/utils/unreachable"
2
+ import { getNodeType } from "@tiptap/core"
3
+ import type { NodeType, Schema } from "@tiptap/pm/model"
4
+ import type { Transaction } from "@tiptap/pm/state"
5
+
6
+ import { cleanupFileLoaderNode } from "./cleanupFileLoaderNode.js"
7
+
8
+ /**
9
+ * Removes all `fileLoader` nodes from the document.
10
+ *
11
+ * Searches up parent wrappers of the given `wrappingTypes`. If any exist and have no other children, they are removed.
12
+ */
13
+ export function cleanupFileLoaderNodes(
14
+ tr: Transaction,
15
+ schema: Schema,
16
+ fileLoaderTypeOrName: string | NodeType,
17
+ wrappingTypesOrNames: (string | NodeType)[],
18
+ replaceTypeOrName: string | NodeType,
19
+ callback: typeof cleanupFileLoaderNode = cleanupFileLoaderNode
20
+ ): Transaction {
21
+ const fileLoaderType = getNodeType(fileLoaderTypeOrName, schema)
22
+ const wrappingTypes = wrappingTypesOrNames.map(_ => getNodeType(_, schema))
23
+ const replaceType = getNodeType(replaceTypeOrName, schema)
24
+ const positions: number[] = []
25
+ tr.doc.descendants((node, pos) => {
26
+ if (node.type === fileLoaderType) {
27
+ positions.push(pos)
28
+ }
29
+ })
30
+ // reversed so that we don't need to map positions
31
+ // and also so we delete the deepest nodes first
32
+ // giving a chance for parents to be completely deleted
33
+ for (const pos of positions.reverse()) {
34
+ const mappedPos = tr.mapping.map(pos)
35
+ // todo remove
36
+ if (mappedPos !== pos) unreachable()
37
+ callback(tr, mappedPos, fileLoaderType, wrappingTypes, replaceType)
38
+ }
39
+ tr.setMeta("preventClearDocument", true)
40
+ tr.setMeta("addToHistory", false)
41
+ return tr
42
+ }
@@ -0,0 +1,16 @@
1
+ import type { EditorState } from "@tiptap/pm/state"
2
+
3
+ export function findLoadingNodePos(
4
+ state: EditorState,
5
+ loadingId: string
6
+ ): number | undefined {
7
+ let replacePos
8
+ state.doc.nodesBetween(0, state.doc.content.size - 1, (node, position) => {
9
+ if (node.attrs.loadingId === loadingId) {
10
+ replacePos = position
11
+ return false
12
+ }
13
+ return true
14
+ })
15
+ return replacePos
16
+ }
@@ -0,0 +1,16 @@
1
+ import type { Editor } from "@tiptap/core"
2
+
3
+ import type { FileLoaderExtensionOptions } from "../types.js"
4
+
5
+
6
+ export function optionsCheck(editor: Editor, options: FileLoaderExtensionOptions): void {
7
+ if (!options.handler) {
8
+ throw new Error("The FileLoader needs to be configered with a handler (see FileLoaderHandler).")
9
+ }
10
+ if ((!options.handler.insertLoadingNode
11
+ || !options.handler.onLoadError
12
+ || !options.handler?.insertPosition)
13
+ && editor.state.schema.nodes.item === undefined) {
14
+ throw new Error("Could not find item node in schema. Add the block extensions or specify a custom `handler.insertLoadingNode` function for the FileLoader.")
15
+ }
16
+ }