@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.
- package/@types/@tiptap/core/index.d.ts +3 -0
- package/README.md +111 -0
- package/dist/module.d.mts +15 -0
- package/dist/module.json +9 -0
- package/dist/module.mjs +68 -0
- package/dist/runtime/assets/base.css +1 -0
- package/dist/runtime/assets/handle-arrow.svg +16 -0
- package/dist/runtime/assets/handle-border-circles-single.svg +44 -0
- package/dist/runtime/assets/handle-border-circles.svg +27 -0
- package/dist/runtime/assets/handle-temp.svg +1 -0
- package/dist/runtime/assets/utils.css +1 -0
- package/dist/runtime/components/CodeBlockThemePicker.d.vue.ts +12 -0
- package/dist/runtime/components/CodeBlockThemePicker.vue +123 -0
- package/dist/runtime/components/CodeBlockThemePicker.vue.d.ts +12 -0
- package/dist/runtime/components/Commands.d.vue.ts +10 -0
- package/dist/runtime/components/Commands.vue +60 -0
- package/dist/runtime/components/Commands.vue.d.ts +10 -0
- package/dist/runtime/components/Editor.d.vue.ts +40 -0
- package/dist/runtime/components/Editor.vue +208 -0
- package/dist/runtime/components/Editor.vue.d.ts +40 -0
- package/dist/runtime/components/EditorDemoApp.d.vue.ts +2 -0
- package/dist/runtime/components/EditorDemoApp.vue +104 -0
- package/dist/runtime/components/EditorDemoApp.vue.d.ts +2 -0
- package/dist/runtime/components/EditorDemoControls.d.vue.ts +12 -0
- package/dist/runtime/components/EditorDemoControls.vue +36 -0
- package/dist/runtime/components/EditorDemoControls.vue.d.ts +12 -0
- package/dist/runtime/components/TestWrapper.d.vue.ts +11 -0
- package/dist/runtime/components/TestWrapper.vue +63 -0
- package/dist/runtime/components/TestWrapper.vue.d.ts +11 -0
- package/dist/runtime/composables/useEditor.d.ts +9 -0
- package/dist/runtime/composables/useEditor.js +17 -0
- package/dist/runtime/composables/useWindowDebugging.d.ts +3 -0
- package/dist/runtime/composables/useWindowDebugging.js +16 -0
- package/dist/runtime/demo/App.d.vue.ts +2 -0
- package/dist/runtime/demo/App.vue +101 -0
- package/dist/runtime/demo/App.vue.d.ts +2 -0
- package/dist/runtime/demo/README.md +1 -0
- package/dist/runtime/demo/main.d.ts +1 -0
- package/dist/runtime/demo/main.js +4 -0
- package/dist/runtime/demo/tailwind.css +1 -0
- package/dist/runtime/env.d.ts +2 -0
- package/dist/runtime/injectionKeys.d.ts +6 -0
- package/dist/runtime/injectionKeys.js +3 -0
- package/dist/runtime/main.lib.d.ts +2 -0
- package/dist/runtime/main.lib.js +2 -0
- package/dist/runtime/pm/commands/backspace.d.ts +12 -0
- package/dist/runtime/pm/commands/backspace.js +26 -0
- package/dist/runtime/pm/commands/changeAttrs.d.ts +9 -0
- package/dist/runtime/pm/commands/changeAttrs.js +15 -0
- package/dist/runtime/pm/commands/deleteSelection.d.ts +9 -0
- package/dist/runtime/pm/commands/deleteSelection.js +8 -0
- package/dist/runtime/pm/commands/enter.d.ts +14 -0
- package/dist/runtime/pm/commands/enter.js +9 -0
- package/dist/runtime/pm/commands/insertBreak.d.ts +9 -0
- package/dist/runtime/pm/commands/insertBreak.js +22 -0
- package/dist/runtime/pm/features/Base/Base.d.ts +4 -0
- package/dist/runtime/pm/features/Base/Base.js +32 -0
- package/dist/runtime/pm/features/Base/commands/deleteNodes.d.ts +10 -0
- package/dist/runtime/pm/features/Base/commands/deleteNodes.js +29 -0
- package/dist/runtime/pm/features/Base/commands/setCursorVisible.d.ts +12 -0
- package/dist/runtime/pm/features/Base/commands/setCursorVisible.js +7 -0
- package/dist/runtime/pm/features/Base/plugins/debugSelectionPlugin.d.ts +9 -0
- package/dist/runtime/pm/features/Base/plugins/debugSelectionPlugin.js +48 -0
- package/dist/runtime/pm/features/Base/plugins/isCursorVisiblePlugin.d.ts +3 -0
- package/dist/runtime/pm/features/Base/plugins/isCursorVisiblePlugin.js +26 -0
- package/dist/runtime/pm/features/Base/plugins/isUsingTouchPlugin.d.ts +3 -0
- package/dist/runtime/pm/features/Base/plugins/isUsingTouchPlugin.js +38 -0
- package/dist/runtime/pm/features/Base/plugins/selectingIndicator.d.ts +5 -0
- package/dist/runtime/pm/features/Base/plugins/selectingIndicator.js +35 -0
- package/dist/runtime/pm/features/Base/plugins/unfocusedSelectionIndicatorPlugin.d.ts +33 -0
- package/dist/runtime/pm/features/Base/plugins/unfocusedSelectionIndicatorPlugin.js +66 -0
- package/dist/runtime/pm/features/Base/types.d.ts +3 -0
- package/dist/runtime/pm/features/Base/types.js +0 -0
- package/dist/runtime/pm/features/BaseShortcuts/BaseShortcuts.d.ts +3 -0
- package/dist/runtime/pm/features/BaseShortcuts/BaseShortcuts.js +34 -0
- package/dist/runtime/pm/features/Blockquote/Blockquote.d.ts +5 -0
- package/dist/runtime/pm/features/Blockquote/Blockquote.js +65 -0
- package/dist/runtime/pm/features/Blockquote/commands/blockquoteEnter.d.ts +11 -0
- package/dist/runtime/pm/features/Blockquote/commands/blockquoteEnter.js +31 -0
- package/dist/runtime/pm/features/Blockquote/commands/blockquoteShiftEnter.d.ts +11 -0
- package/dist/runtime/pm/features/Blockquote/commands/blockquoteShiftEnter.js +12 -0
- package/dist/runtime/pm/features/Blocks/Blocks.d.ts +2 -0
- package/dist/runtime/pm/features/Blocks/Blocks.js +2 -0
- package/dist/runtime/pm/features/Blocks/Item.d.ts +11 -0
- package/dist/runtime/pm/features/Blocks/Item.js +157 -0
- package/dist/runtime/pm/features/Blocks/List.d.ts +4 -0
- package/dist/runtime/pm/features/Blocks/List.js +59 -0
- package/dist/runtime/pm/features/Blocks/commands/changeItemType.d.ts +20 -0
- package/dist/runtime/pm/features/Blocks/commands/changeItemType.js +40 -0
- package/dist/runtime/pm/features/Blocks/commands/changeTypeAttr.d.ts +14 -0
- package/dist/runtime/pm/features/Blocks/commands/changeTypeAttr.js +28 -0
- package/dist/runtime/pm/features/Blocks/commands/copyOrMoveItem.d.ts +23 -0
- package/dist/runtime/pm/features/Blocks/commands/copyOrMoveItem.js +124 -0
- package/dist/runtime/pm/features/Blocks/commands/deleteItem.d.ts +12 -0
- package/dist/runtime/pm/features/Blocks/commands/deleteItem.js +8 -0
- package/dist/runtime/pm/features/Blocks/commands/indentItem.d.ts +12 -0
- package/dist/runtime/pm/features/Blocks/commands/indentItem.js +58 -0
- package/dist/runtime/pm/features/Blocks/commands/itemMenuCommands.d.ts +18 -0
- package/dist/runtime/pm/features/Blocks/commands/itemMenuCommands.js +40 -0
- package/dist/runtime/pm/features/Blocks/commands/moveItem.d.ts +12 -0
- package/dist/runtime/pm/features/Blocks/commands/moveItem.js +80 -0
- package/dist/runtime/pm/features/Blocks/commands/setNode.d.ts +20 -0
- package/dist/runtime/pm/features/Blocks/commands/setNode.js +87 -0
- package/dist/runtime/pm/features/Blocks/commands/splitItem.d.ts +17 -0
- package/dist/runtime/pm/features/Blocks/commands/splitItem.js +87 -0
- package/dist/runtime/pm/features/Blocks/commands/unindentItem.d.ts +12 -0
- package/dist/runtime/pm/features/Blocks/commands/unindentItem.js +42 -0
- package/dist/runtime/pm/features/Blocks/components/DragTreeHandle.d.vue.ts +0 -0
- package/dist/runtime/pm/features/Blocks/components/DragTreeHandle.vue +122 -0
- package/dist/runtime/pm/features/Blocks/components/DragTreeHandle.vue.d.ts +0 -0
- package/dist/runtime/pm/features/Blocks/components/ItemMenu.d.vue.ts +6 -0
- package/dist/runtime/pm/features/Blocks/components/ItemMenu.vue +78 -0
- package/dist/runtime/pm/features/Blocks/components/ItemMenu.vue.d.ts +6 -0
- package/dist/runtime/pm/features/Blocks/components/ItemNodeView.d.vue.ts +92 -0
- package/dist/runtime/pm/features/Blocks/components/ItemNodeView.vue +350 -0
- package/dist/runtime/pm/features/Blocks/components/ItemNodeView.vue.d.ts +92 -0
- package/dist/runtime/pm/features/Blocks/components/defaultItemMenu.d.ts +5 -0
- package/dist/runtime/pm/features/Blocks/components/defaultItemMenu.js +42 -0
- package/dist/runtime/pm/features/Blocks/composables/useDragWithThreshold.d.ts +1 -0
- package/dist/runtime/pm/features/Blocks/composables/useDragWithThreshold.js +0 -0
- package/dist/runtime/pm/features/Blocks/composables/useHandleHeight.d.ts +5 -0
- package/dist/runtime/pm/features/Blocks/composables/useHandleHeight.js +22 -0
- package/dist/runtime/pm/features/Blocks/composables/useHasChildren.d.ts +5 -0
- package/dist/runtime/pm/features/Blocks/composables/useHasChildren.js +10 -0
- package/dist/runtime/pm/features/Blocks/composables/useNodeStates.d.ts +7 -0
- package/dist/runtime/pm/features/Blocks/composables/useNodeStates.js +20 -0
- package/dist/runtime/pm/features/Blocks/itemMenuMenuItems.d.ts +20 -0
- package/dist/runtime/pm/features/Blocks/itemMenuMenuItems.js +138 -0
- package/dist/runtime/pm/features/Blocks/plugins/ensureLastItemIsContentPlugin.d.ts +11 -0
- package/dist/runtime/pm/features/Blocks/plugins/ensureLastItemIsContentPlugin.js +36 -0
- package/dist/runtime/pm/features/Blocks/plugins/itemBlockIdPlugin.d.ts +8 -0
- package/dist/runtime/pm/features/Blocks/plugins/itemBlockIdPlugin.js +30 -0
- package/dist/runtime/pm/features/Blocks/plugins/itemHasSingularSelectionPlugin.d.ts +3 -0
- package/dist/runtime/pm/features/Blocks/plugins/itemHasSingularSelectionPlugin.js +30 -0
- package/dist/runtime/pm/features/Blocks/plugins/itemMenuPlugin.d.ts +4 -0
- package/dist/runtime/pm/features/Blocks/plugins/itemMenuPlugin.js +17 -0
- package/dist/runtime/pm/features/Blocks/states/stateful.d.ts +2 -0
- package/dist/runtime/pm/features/Blocks/states/stateful.js +37 -0
- package/dist/runtime/pm/features/Blocks/states/task/cancelled.svg +32 -0
- package/dist/runtime/pm/features/Blocks/states/task/checked.svg +27 -0
- package/dist/runtime/pm/features/Blocks/states/task/checked2.svg +24 -0
- package/dist/runtime/pm/features/Blocks/states/task/partial.svg +24 -0
- package/dist/runtime/pm/features/Blocks/states/task/partial2.svg +31 -0
- package/dist/runtime/pm/features/Blocks/states/task/unchecked.svg +20 -0
- package/dist/runtime/pm/features/Blocks/types.d.ts +43 -0
- package/dist/runtime/pm/features/Blocks/types.js +2 -0
- package/dist/runtime/pm/features/Blocks/utils/createItemMenuCommandExecuter.d.ts +3 -0
- package/dist/runtime/pm/features/Blocks/utils/createItemMenuCommandExecuter.js +24 -0
- package/dist/runtime/pm/features/Blocks/utils/fixBlockIds.d.ts +4 -0
- package/dist/runtime/pm/features/Blocks/utils/fixBlockIds.js +23 -0
- package/dist/runtime/pm/features/Blocks/utils/isValidId.d.ts +2 -0
- package/dist/runtime/pm/features/Blocks/utils/isValidId.js +7 -0
- package/dist/runtime/pm/features/CodeBlock/CodeBlock.d.ts +16 -0
- package/dist/runtime/pm/features/CodeBlock/CodeBlock.js +91 -0
- package/dist/runtime/pm/features/CodeBlock/build/generateHighlightJsInfo.d.ts +1 -0
- package/dist/runtime/pm/features/CodeBlock/build/generateHighlightJsInfo.js +63 -0
- package/dist/runtime/pm/features/CodeBlock/commands/codeBlockEnterOrSplit.d.ts +9 -0
- package/dist/runtime/pm/features/CodeBlock/commands/codeBlockEnterOrSplit.js +28 -0
- package/dist/runtime/pm/features/CodeBlock/commands/codeBlockIndent.d.ts +9 -0
- package/dist/runtime/pm/features/CodeBlock/commands/codeBlockIndent.js +39 -0
- package/dist/runtime/pm/features/CodeBlock/commands/codeBlockUnindent.d.ts +9 -0
- package/dist/runtime/pm/features/CodeBlock/commands/codeBlockUnindent.js +50 -0
- package/dist/runtime/pm/features/CodeBlock/commands/focusCodeBlockLanguage.d.ts +9 -0
- package/dist/runtime/pm/features/CodeBlock/commands/focusCodeBlockLanguage.js +27 -0
- package/dist/runtime/pm/features/CodeBlock/components/CodeBlockView.d.vue.ts +92 -0
- package/dist/runtime/pm/features/CodeBlock/components/CodeBlockView.vue +112 -0
- package/dist/runtime/pm/features/CodeBlock/components/CodeBlockView.vue.d.ts +92 -0
- package/dist/runtime/pm/features/CodeBlock/composables/useAsyncCodeBlockHighlighting.d.ts +28 -0
- package/dist/runtime/pm/features/CodeBlock/composables/useAsyncCodeBlockHighlighting.js +137 -0
- package/dist/runtime/pm/features/CodeBlock/composables/useHighlightJsTheme.d.ts +37 -0
- package/dist/runtime/pm/features/CodeBlock/composables/useHighlightJsTheme.js +101 -0
- package/dist/runtime/pm/features/CodeBlock/highlightJsInfo.d.ts +17 -0
- package/dist/runtime/pm/features/CodeBlock/highlightJsInfo.js +711 -0
- package/dist/runtime/pm/features/CodeBlock/types.d.ts +4 -0
- package/dist/runtime/pm/features/CodeBlock/types.js +2 -0
- package/dist/runtime/pm/features/Collaboration/Collaboration.d.ts +66 -0
- package/dist/runtime/pm/features/Collaboration/Collaboration.js +169 -0
- package/dist/runtime/pm/features/CommandsMenus/CommandBar.d.ts +19 -0
- package/dist/runtime/pm/features/CommandsMenus/CommandBar.js +97 -0
- package/dist/runtime/pm/features/CommandsMenus/commandBarMenuItems.d.ts +20 -0
- package/dist/runtime/pm/features/CommandsMenus/commandBarMenuItems.js +188 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandBar.d.vue.ts +8 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandBar.vue +58 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandBar.vue.d.ts +8 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandBarItem.d.vue.ts +12 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandBarItem.vue +42 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandBarItem.vue.d.ts +12 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuGroup.d.vue.ts +10 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuGroup.vue +55 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuGroup.vue.d.ts +10 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuItem.d.vue.ts +11 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuItem.vue +58 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuItem.vue.d.ts +11 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuList.d.vue.ts +11 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuList.vue +54 -0
- package/dist/runtime/pm/features/CommandsMenus/components/CommandMenuList.vue.d.ts +11 -0
- package/dist/runtime/pm/features/CommandsMenus/components/TextIcon.d.vue.ts +5 -0
- package/dist/runtime/pm/features/CommandsMenus/components/TextIcon.vue +13 -0
- package/dist/runtime/pm/features/CommandsMenus/components/TextIcon.vue.d.ts +5 -0
- package/dist/runtime/pm/features/CommandsMenus/icons/HighlightIcon.d.vue.ts +8 -0
- package/dist/runtime/pm/features/CommandsMenus/icons/HighlightIcon.vue +45 -0
- package/dist/runtime/pm/features/CommandsMenus/icons/HighlightIcon.vue.d.ts +8 -0
- package/dist/runtime/pm/features/CommandsMenus/icons/SubscriptIcon.d.vue.ts +2 -0
- package/dist/runtime/pm/features/CommandsMenus/icons/SubscriptIcon.vue +5 -0
- package/dist/runtime/pm/features/CommandsMenus/icons/SubscriptIcon.vue.d.ts +2 -0
- package/dist/runtime/pm/features/CommandsMenus/icons/SuperscriptIcon.d.vue.ts +2 -0
- package/dist/runtime/pm/features/CommandsMenus/icons/SuperscriptIcon.vue +5 -0
- package/dist/runtime/pm/features/CommandsMenus/icons/SuperscriptIcon.vue.d.ts +2 -0
- package/dist/runtime/pm/features/CommandsMenus/types.d.ts +61 -0
- package/dist/runtime/pm/features/CommandsMenus/types.js +5 -0
- package/dist/runtime/pm/features/CommandsMenus/utils/defaultCommandExecutor.d.ts +3 -0
- package/dist/runtime/pm/features/CommandsMenus/utils/defaultCommandExecutor.js +11 -0
- package/dist/runtime/pm/features/CommandsMenus/utils/findCommand.d.ts +10 -0
- package/dist/runtime/pm/features/CommandsMenus/utils/findCommand.js +16 -0
- package/dist/runtime/pm/features/CommandsMenus/utils/popupPositionModifier.d.ts +5 -0
- package/dist/runtime/pm/features/CommandsMenus/utils/popupPositionModifier.js +9 -0
- package/dist/runtime/pm/features/CommandsMenus/utils/popupVerticalPositioner.d.ts +5 -0
- package/dist/runtime/pm/features/CommandsMenus/utils/popupVerticalPositioner.js +11 -0
- package/dist/runtime/pm/features/Document/Document.d.ts +3 -0
- package/dist/runtime/pm/features/Document/Document.js +6 -0
- package/dist/runtime/pm/features/DocumentApi/DocumentApi.d.ts +85 -0
- package/dist/runtime/pm/features/DocumentApi/DocumentApi.js +161 -0
- package/dist/runtime/pm/features/DocumentApi/composables/useEditorContent.d.ts +13 -0
- package/dist/runtime/pm/features/DocumentApi/composables/useEditorContent.js +76 -0
- package/dist/runtime/pm/features/DocumentApi/composables/useTestDocumentApi.d.ts +23 -0
- package/dist/runtime/pm/features/DocumentApi/composables/useTestDocumentApi.js +70 -0
- package/dist/runtime/pm/features/DocumentApi/types.d.ts +133 -0
- package/dist/runtime/pm/features/DocumentApi/types.js +1 -0
- package/dist/runtime/pm/features/DocumentApi/utils/convertFullTransactionForPartialState.d.ts +3 -0
- package/dist/runtime/pm/features/DocumentApi/utils/convertFullTransactionForPartialState.js +37 -0
- package/dist/runtime/pm/features/DocumentApi/utils/convertTrForInstance.d.ts +4 -0
- package/dist/runtime/pm/features/DocumentApi/utils/convertTrForInstance.js +13 -0
- package/dist/runtime/pm/features/DocumentApi/utils/convertTransactionForFullState.d.ts +2 -0
- package/dist/runtime/pm/features/DocumentApi/utils/convertTransactionForFullState.js +22 -0
- package/dist/runtime/pm/features/DocumentApi/utils/copyMeta.d.ts +2 -0
- package/dist/runtime/pm/features/DocumentApi/utils/copyMeta.js +6 -0
- package/dist/runtime/pm/features/DocumentApi/utils/getEmbedJson.d.ts +1 -0
- package/dist/runtime/pm/features/DocumentApi/utils/getEmbedJson.js +14 -0
- package/dist/runtime/pm/features/DocumentApi/utils/getEmbedNodeFromDoc.d.ts +1 -0
- package/dist/runtime/pm/features/DocumentApi/utils/getEmbedNodeFromDoc.js +14 -0
- package/dist/runtime/pm/features/DocumentApi/utils/getStateEmbedRange.d.ts +9 -0
- package/dist/runtime/pm/features/DocumentApi/utils/getStateEmbedRange.js +19 -0
- package/dist/runtime/pm/features/DocumentApi/utils/isEmbedId.d.ts +2 -0
- package/dist/runtime/pm/features/DocumentApi/utils/isEmbedId.js +3 -0
- package/dist/runtime/pm/features/EmbeddedDocument/Embedded.d.ts +24 -0
- package/dist/runtime/pm/features/EmbeddedDocument/Embedded.js +73 -0
- package/dist/runtime/pm/features/EmbeddedDocument/EmbeddedDocument.d.ts +23 -0
- package/dist/runtime/pm/features/EmbeddedDocument/EmbeddedDocument.js +70 -0
- package/dist/runtime/pm/features/EmbeddedDocument/components/EmbeddedDocumentPicker.d.vue.ts +14 -0
- package/dist/runtime/pm/features/EmbeddedDocument/components/EmbeddedDocumentPicker.vue +171 -0
- package/dist/runtime/pm/features/EmbeddedDocument/components/EmbeddedDocumentPicker.vue.d.ts +14 -0
- package/dist/runtime/pm/features/EmbeddedDocument/components/EmbeddedNodeView.d.vue.ts +92 -0
- package/dist/runtime/pm/features/EmbeddedDocument/components/EmbeddedNodeView.vue +172 -0
- package/dist/runtime/pm/features/EmbeddedDocument/components/EmbeddedNodeView.vue.d.ts +92 -0
- package/dist/runtime/pm/features/EmbeddedDocument/composables/useEmbeddedEditor.d.ts +31 -0
- package/dist/runtime/pm/features/EmbeddedDocument/composables/useEmbeddedEditor.js +199 -0
- package/dist/runtime/pm/features/EmbeddedDocument/types.d.ts +49 -0
- package/dist/runtime/pm/features/EmbeddedDocument/types.js +6 -0
- package/dist/runtime/pm/features/EmbeddedDocument/utils/isEmbeddedBlock.d.ts +9 -0
- package/dist/runtime/pm/features/EmbeddedDocument/utils/isEmbeddedBlock.js +3 -0
- package/dist/runtime/pm/features/EmbeddedDocument/utils/redirectFromEmbedded.d.ts +28 -0
- package/dist/runtime/pm/features/EmbeddedDocument/utils/redirectFromEmbedded.js +17 -0
- package/dist/runtime/pm/features/FileLoader/FileLoader.d.ts +16 -0
- package/dist/runtime/pm/features/FileLoader/FileLoader.js +99 -0
- package/dist/runtime/pm/features/FileLoader/FileLoaderHandler/FileLoaderHandler.d.ts +28 -0
- package/dist/runtime/pm/features/FileLoader/FileLoaderHandler/FileLoaderHandler.js +69 -0
- package/dist/runtime/pm/features/FileLoader/FileLoaderHandler/TestFileLoaderHandler.d.ts +11 -0
- package/dist/runtime/pm/features/FileLoader/FileLoaderHandler/TestFileLoaderHandler.js +49 -0
- package/dist/runtime/pm/features/FileLoader/commands/insertFile.d.ts +17 -0
- package/dist/runtime/pm/features/FileLoader/commands/insertFile.js +39 -0
- package/dist/runtime/pm/features/FileLoader/components/FileLoaderNodeView.d.vue.ts +92 -0
- package/dist/runtime/pm/features/FileLoader/components/FileLoaderNodeView.vue +38 -0
- package/dist/runtime/pm/features/FileLoader/components/FileLoaderNodeView.vue.d.ts +92 -0
- package/dist/runtime/pm/features/FileLoader/plugins/fileLoaderPlugin.d.ts +5 -0
- package/dist/runtime/pm/features/FileLoader/plugins/fileLoaderPlugin.js +61 -0
- package/dist/runtime/pm/features/FileLoader/types.d.ts +73 -0
- package/dist/runtime/pm/features/FileLoader/types.js +0 -0
- package/dist/runtime/pm/features/FileLoader/utils/cleanupFileLoaderNode.d.ts +4 -0
- package/dist/runtime/pm/features/FileLoader/utils/cleanupFileLoaderNode.js +27 -0
- package/dist/runtime/pm/features/FileLoader/utils/cleanupFileLoaderNodes.d.ts +9 -0
- package/dist/runtime/pm/features/FileLoader/utils/cleanupFileLoaderNodes.js +22 -0
- package/dist/runtime/pm/features/FileLoader/utils/findLoadingNodePos.d.ts +2 -0
- package/dist/runtime/pm/features/FileLoader/utils/findLoadingNodePos.js +11 -0
- package/dist/runtime/pm/features/FileLoader/utils/optionsCheck.d.ts +3 -0
- package/dist/runtime/pm/features/FileLoader/utils/optionsCheck.js +8 -0
- package/dist/runtime/pm/features/FileLoader/utils/readAsDataUrl.d.ts +1 -0
- package/dist/runtime/pm/features/FileLoader/utils/readAsDataUrl.js +12 -0
- package/dist/runtime/pm/features/HardBreak/HardBreak.d.ts +5 -0
- package/dist/runtime/pm/features/HardBreak/HardBreak.js +14 -0
- package/dist/runtime/pm/features/Heading/Heading.d.ts +24 -0
- package/dist/runtime/pm/features/Heading/Heading.js +85 -0
- package/dist/runtime/pm/features/Heading/commands/changeLevelAttr.d.ts +16 -0
- package/dist/runtime/pm/features/Heading/commands/changeLevelAttr.js +33 -0
- package/dist/runtime/pm/features/Heading/types.d.ts +14 -0
- package/dist/runtime/pm/features/Heading/types.js +0 -0
- package/dist/runtime/pm/features/Highlight/Highlight.d.ts +72 -0
- package/dist/runtime/pm/features/Highlight/Highlight.js +163 -0
- package/dist/runtime/pm/features/Highlight/retyped/tiptapHighlight.d.ts +3 -0
- package/dist/runtime/pm/features/Highlight/retyped/tiptapHighlight.js +5 -0
- package/dist/runtime/pm/features/Highlight/types.d.ts +27 -0
- package/dist/runtime/pm/features/Highlight/types.js +2 -0
- package/dist/runtime/pm/features/History/History.d.ts +35 -0
- package/dist/runtime/pm/features/History/History.js +63 -0
- package/dist/runtime/pm/features/Iframe/Iframe.d.ts +21 -0
- package/dist/runtime/pm/features/Iframe/Iframe.js +127 -0
- package/dist/runtime/pm/features/Iframe/IframeParsers.d.ts +37 -0
- package/dist/runtime/pm/features/Iframe/IframeParsers.js +88 -0
- package/dist/runtime/pm/features/Iframe/components/IframeNodeView.d.vue.ts +92 -0
- package/dist/runtime/pm/features/Iframe/components/IframeNodeView.vue +82 -0
- package/dist/runtime/pm/features/Iframe/components/IframeNodeView.vue.d.ts +92 -0
- package/dist/runtime/pm/features/Iframe/types.d.ts +5 -0
- package/dist/runtime/pm/features/Iframe/types.js +0 -0
- package/dist/runtime/pm/features/Image/Image.d.ts +2 -0
- package/dist/runtime/pm/features/Image/Image.js +13 -0
- package/dist/runtime/pm/features/Link/Link.d.ts +38 -0
- package/dist/runtime/pm/features/Link/Link.js +241 -0
- package/dist/runtime/pm/features/Link/components/BubbleMenuExternalLink.d.vue.ts +28 -0
- package/dist/runtime/pm/features/Link/components/BubbleMenuExternalLink.vue +114 -0
- package/dist/runtime/pm/features/Link/components/BubbleMenuExternalLink.vue.d.ts +28 -0
- package/dist/runtime/pm/features/Link/components/BubbleMenuInternalLink.d.vue.ts +29 -0
- package/dist/runtime/pm/features/Link/components/BubbleMenuInternalLink.vue +107 -0
- package/dist/runtime/pm/features/Link/components/BubbleMenuInternalLink.vue.d.ts +29 -0
- package/dist/runtime/pm/features/Link/components/BubbleMenuLink.d.vue.ts +11 -0
- package/dist/runtime/pm/features/Link/components/BubbleMenuLink.vue +126 -0
- package/dist/runtime/pm/features/Link/components/BubbleMenuLink.vue.d.ts +11 -0
- package/dist/runtime/pm/features/Link/components/BubbleMenuLinkActions.d.vue.ts +18 -0
- package/dist/runtime/pm/features/Link/components/BubbleMenuLinkActions.vue +57 -0
- package/dist/runtime/pm/features/Link/components/BubbleMenuLinkActions.vue.d.ts +18 -0
- package/dist/runtime/pm/features/Link/types.d.ts +44 -0
- package/dist/runtime/pm/features/Link/types.js +3 -0
- package/dist/runtime/pm/features/Menus/Menus.d.ts +45 -0
- package/dist/runtime/pm/features/Menus/Menus.js +142 -0
- package/dist/runtime/pm/features/Menus/components/MarkMenuManager.d.vue.ts +6 -0
- package/dist/runtime/pm/features/Menus/components/MarkMenuManager.vue +166 -0
- package/dist/runtime/pm/features/Menus/components/MarkMenuManager.vue.d.ts +6 -0
- package/dist/runtime/pm/features/Menus/types.d.ts +51 -0
- package/dist/runtime/pm/features/Menus/types.js +3 -0
- package/dist/runtime/pm/features/Menus/utils/isMarkMenu.d.ts +2 -0
- package/dist/runtime/pm/features/Menus/utils/isMarkMenu.js +3 -0
- package/dist/runtime/pm/features/Tables/commands/tableEnter.d.ts +15 -0
- package/dist/runtime/pm/features/Tables/commands/tableEnter.js +19 -0
- package/dist/runtime/pm/features/Tables/index.d.ts +9 -0
- package/dist/runtime/pm/features/Tables/index.js +44 -0
- package/dist/runtime/pm/schema.d.ts +4 -0
- package/dist/runtime/pm/schema.js +80 -0
- package/dist/runtime/pm/testSchema.d.ts +5 -0
- package/dist/runtime/pm/testSchema.js +30 -0
- package/dist/runtime/pm/utils/createDropIndicator.d.ts +23 -0
- package/dist/runtime/pm/utils/createDropIndicator.js +32 -0
- package/dist/runtime/pm/utils/createStateOnlyPluginApply.d.ts +2 -0
- package/dist/runtime/pm/utils/createStateOnlyPluginApply.js +9 -0
- package/dist/runtime/pm/utils/createStateOnlyPluginObjApply.d.ts +2 -0
- package/dist/runtime/pm/utils/createStateOnlyPluginObjApply.js +14 -0
- package/dist/runtime/pm/utils/dropPointInfo.d.ts +56 -0
- package/dist/runtime/pm/utils/dropPointInfo.js +28 -0
- package/dist/runtime/pm/utils/findUpwards.d.ts +20 -0
- package/dist/runtime/pm/utils/findUpwards.js +18 -0
- package/dist/runtime/pm/utils/getChildChunks.d.ts +3 -0
- package/dist/runtime/pm/utils/getChildChunks.js +15 -0
- package/dist/runtime/pm/utils/getDiffReplacementRange.d.ts +20 -0
- package/dist/runtime/pm/utils/getDiffReplacementRange.js +9 -0
- package/dist/runtime/pm/utils/getElMaxVisualSize.d.ts +9 -0
- package/dist/runtime/pm/utils/getElMaxVisualSize.js +7 -0
- package/dist/runtime/pm/utils/getElPropertyAsInt.d.ts +1 -0
- package/dist/runtime/pm/utils/getElPropertyAsInt.js +8 -0
- package/dist/runtime/pm/utils/getGroupNodeNames.d.ts +2 -0
- package/dist/runtime/pm/utils/getGroupNodeNames.js +7 -0
- package/dist/runtime/pm/utils/getMarkPosition.d.ts +11 -0
- package/dist/runtime/pm/utils/getMarkPosition.js +34 -0
- package/dist/runtime/pm/utils/getMarksInSelection.d.ts +3 -0
- package/dist/runtime/pm/utils/getMarksInSelection.js +16 -0
- package/dist/runtime/pm/utils/getTypeByName.d.ts +2 -0
- package/dist/runtime/pm/utils/getTypeByName.js +5 -0
- package/dist/runtime/pm/utils/index.d.ts +15 -0
- package/dist/runtime/pm/utils/index.js +15 -0
- package/dist/runtime/pm/utils/internal/createNodeTypesList.d.ts +2 -0
- package/dist/runtime/pm/utils/internal/createNodeTypesList.js +17 -0
- package/dist/runtime/pm/utils/internal/debugMap.d.ts +7 -0
- package/dist/runtime/pm/utils/internal/debugMap.js +24 -0
- package/dist/runtime/pm/utils/internal/debugNode.d.ts +2 -0
- package/dist/runtime/pm/utils/internal/debugNode.js +18 -0
- package/dist/runtime/pm/utils/internal/debugSel.d.ts +5 -0
- package/dist/runtime/pm/utils/internal/debugSel.js +8 -0
- package/dist/runtime/pm/utils/internal/recurse.d.ts +2 -0
- package/dist/runtime/pm/utils/internal/recurse.js +39 -0
- package/dist/runtime/pm/utils/internal/stripBlockId.d.ts +2 -0
- package/dist/runtime/pm/utils/internal/stripBlockId.js +9 -0
- package/dist/runtime/pm/utils/mapSelection.d.ts +8 -0
- package/dist/runtime/pm/utils/mapSelection.js +12 -0
- package/dist/runtime/pm/utils/nodesBetween.d.ts +21 -0
- package/dist/runtime/pm/utils/nodesBetween.js +21 -0
- package/dist/runtime/pm/utils/pointToPmPoint.d.ts +2 -0
- package/dist/runtime/pm/utils/pointToPmPoint.js +3 -0
- package/dist/runtime/pm/utils/splitIntoChunks.d.ts +32 -0
- package/dist/runtime/pm/utils/splitIntoChunks.js +31 -0
- package/dist/runtime/testDocuments.d.ts +53 -0
- package/dist/runtime/testDocuments.js +122 -0
- package/dist/runtime/types/index.d.ts +53 -0
- package/dist/runtime/types/index.js +9 -0
- package/dist/types.d.mts +3 -0
- package/package.json +238 -0
- package/src/module.ts +101 -0
- package/src/runtime/assets/base.css +83 -0
- package/src/runtime/assets/handle-arrow.svg +16 -0
- package/src/runtime/assets/handle-border-circles-single.svg +44 -0
- package/src/runtime/assets/handle-border-circles.svg +27 -0
- package/src/runtime/assets/handle-temp.svg +1 -0
- package/src/runtime/assets/utils.css +9 -0
- package/src/runtime/components/CodeBlockThemePicker.vue +125 -0
- package/src/runtime/components/Commands.vue +67 -0
- package/src/runtime/components/Editor.vue +330 -0
- package/src/runtime/components/EditorDemoApp.vue +118 -0
- package/src/runtime/components/EditorDemoControls.vue +38 -0
- package/src/runtime/components/TestWrapper.vue +74 -0
- package/src/runtime/composables/useEditor.ts +29 -0
- package/src/runtime/composables/useWindowDebugging.ts +20 -0
- package/src/runtime/demo/App.vue +114 -0
- package/src/runtime/demo/README.md +1 -0
- package/src/runtime/demo/main.ts +8 -0
- package/src/runtime/demo/tailwind.css +4 -0
- package/src/runtime/env.d.ts +2 -0
- package/src/runtime/injectionKeys.ts +10 -0
- package/src/runtime/main.lib.ts +2 -0
- package/src/runtime/pm/commands/backspace.ts +44 -0
- package/src/runtime/pm/commands/changeAttrs.ts +37 -0
- package/src/runtime/pm/commands/deleteSelection.ts +22 -0
- package/src/runtime/pm/commands/enter.ts +27 -0
- package/src/runtime/pm/commands/insertBreak.ts +40 -0
- package/src/runtime/pm/features/Base/Base.ts +39 -0
- package/src/runtime/pm/features/Base/commands/deleteNodes.ts +54 -0
- package/src/runtime/pm/features/Base/commands/setCursorVisible.ts +24 -0
- package/src/runtime/pm/features/Base/plugins/debugSelectionPlugin.ts +57 -0
- package/src/runtime/pm/features/Base/plugins/isCursorVisiblePlugin.ts +28 -0
- package/src/runtime/pm/features/Base/plugins/isUsingTouchPlugin.ts +40 -0
- package/src/runtime/pm/features/Base/plugins/selectingIndicator.ts +38 -0
- package/src/runtime/pm/features/Base/plugins/unfocusedSelectionIndicatorPlugin.ts +107 -0
- package/src/runtime/pm/features/Base/types.ts +3 -0
- package/src/runtime/pm/features/BaseShortcuts/BaseShortcuts.ts +39 -0
- package/src/runtime/pm/features/Blockquote/Blockquote.ts +75 -0
- package/src/runtime/pm/features/Blockquote/commands/blockquoteEnter.ts +51 -0
- package/src/runtime/pm/features/Blockquote/commands/blockquoteShiftEnter.ts +26 -0
- package/src/runtime/pm/features/Blocks/Blocks.ts +3 -0
- package/src/runtime/pm/features/Blocks/Item.ts +176 -0
- package/src/runtime/pm/features/Blocks/List.ts +67 -0
- package/src/runtime/pm/features/Blocks/commands/changeItemType.ts +64 -0
- package/src/runtime/pm/features/Blocks/commands/changeTypeAttr.ts +47 -0
- package/src/runtime/pm/features/Blocks/commands/copyOrMoveItem.ts +179 -0
- package/src/runtime/pm/features/Blocks/commands/deleteItem.ts +24 -0
- package/src/runtime/pm/features/Blocks/commands/indentItem.ts +105 -0
- package/src/runtime/pm/features/Blocks/commands/itemMenuCommands.ts +62 -0
- package/src/runtime/pm/features/Blocks/commands/moveItem.ts +128 -0
- package/src/runtime/pm/features/Blocks/commands/setNode.ts +186 -0
- package/src/runtime/pm/features/Blocks/commands/splitItem.ts +116 -0
- package/src/runtime/pm/features/Blocks/commands/unindentItem.ts +82 -0
- package/src/runtime/pm/features/Blocks/components/DragTreeHandle.vue +142 -0
- package/src/runtime/pm/features/Blocks/components/ItemMenu.vue +88 -0
- package/src/runtime/pm/features/Blocks/components/ItemNodeView.vue +394 -0
- package/src/runtime/pm/features/Blocks/components/defaultItemMenu.ts +45 -0
- package/src/runtime/pm/features/Blocks/composables/useDragWithThreshold.ts +0 -0
- package/src/runtime/pm/features/Blocks/composables/useHandleHeight.ts +28 -0
- package/src/runtime/pm/features/Blocks/composables/useHasChildren.ts +14 -0
- package/src/runtime/pm/features/Blocks/composables/useNodeStates.ts +29 -0
- package/src/runtime/pm/features/Blocks/itemMenuMenuItems.ts +143 -0
- package/src/runtime/pm/features/Blocks/plugins/ensureLastItemIsContentPlugin.ts +52 -0
- package/src/runtime/pm/features/Blocks/plugins/itemBlockIdPlugin.ts +40 -0
- package/src/runtime/pm/features/Blocks/plugins/itemHasSingularSelectionPlugin.ts +32 -0
- package/src/runtime/pm/features/Blocks/plugins/itemMenuPlugin.ts +21 -0
- package/src/runtime/pm/features/Blocks/states/stateful.ts +41 -0
- package/src/runtime/pm/features/Blocks/states/task/cancelled.svg +32 -0
- package/src/runtime/pm/features/Blocks/states/task/checked.svg +27 -0
- package/src/runtime/pm/features/Blocks/states/task/checked2.svg +24 -0
- package/src/runtime/pm/features/Blocks/states/task/partial.svg +24 -0
- package/src/runtime/pm/features/Blocks/states/task/partial2.svg +31 -0
- package/src/runtime/pm/features/Blocks/states/task/unchecked.svg +20 -0
- package/src/runtime/pm/features/Blocks/types.ts +51 -0
- package/src/runtime/pm/features/Blocks/utils/createItemMenuCommandExecuter.ts +47 -0
- package/src/runtime/pm/features/Blocks/utils/fixBlockIds.ts +28 -0
- package/src/runtime/pm/features/Blocks/utils/isValidId.ts +8 -0
- package/src/runtime/pm/features/CodeBlock/CodeBlock.ts +104 -0
- package/src/runtime/pm/features/CodeBlock/build/generateHighlightJsInfo.js +63 -0
- package/src/runtime/pm/features/CodeBlock/commands/codeBlockEnterOrSplit.ts +55 -0
- package/src/runtime/pm/features/CodeBlock/commands/codeBlockIndent.ts +67 -0
- package/src/runtime/pm/features/CodeBlock/commands/codeBlockUnindent.ts +74 -0
- package/src/runtime/pm/features/CodeBlock/commands/focusCodeBlockLanguage.ts +44 -0
- package/src/runtime/pm/features/CodeBlock/components/CodeBlockView.vue +126 -0
- package/src/runtime/pm/features/CodeBlock/composables/useAsyncCodeBlockHighlighting.ts +185 -0
- package/src/runtime/pm/features/CodeBlock/composables/useHighlightJsTheme.ts +150 -0
- package/src/runtime/pm/features/CodeBlock/highlightJsInfo.ts +733 -0
- package/src/runtime/pm/features/CodeBlock/types.ts +7 -0
- package/src/runtime/pm/features/Collaboration/Collaboration.ts +295 -0
- package/src/runtime/pm/features/CommandsMenus/CommandBar.ts +130 -0
- package/src/runtime/pm/features/CommandsMenus/commandBarMenuItems.ts +209 -0
- package/src/runtime/pm/features/CommandsMenus/components/CommandBar.vue +63 -0
- package/src/runtime/pm/features/CommandsMenus/components/CommandBarItem.vue +48 -0
- package/src/runtime/pm/features/CommandsMenus/components/CommandMenuGroup.vue +59 -0
- package/src/runtime/pm/features/CommandsMenus/components/CommandMenuItem.vue +67 -0
- package/src/runtime/pm/features/CommandsMenus/components/CommandMenuList.vue +60 -0
- package/src/runtime/pm/features/CommandsMenus/components/TextIcon.vue +14 -0
- package/src/runtime/pm/features/CommandsMenus/icons/HighlightIcon.vue +51 -0
- package/src/runtime/pm/features/CommandsMenus/icons/SubscriptIcon.vue +5 -0
- package/src/runtime/pm/features/CommandsMenus/icons/SuperscriptIcon.vue +5 -0
- package/src/runtime/pm/features/CommandsMenus/types.ts +73 -0
- package/src/runtime/pm/features/CommandsMenus/utils/defaultCommandExecutor.ts +22 -0
- package/src/runtime/pm/features/CommandsMenus/utils/findCommand.ts +37 -0
- package/src/runtime/pm/features/CommandsMenus/utils/popupPositionModifier.ts +14 -0
- package/src/runtime/pm/features/CommandsMenus/utils/popupVerticalPositioner.ts +16 -0
- package/src/runtime/pm/features/Document/Document.ts +9 -0
- package/src/runtime/pm/features/DocumentApi/DocumentApi.ts +272 -0
- package/src/runtime/pm/features/DocumentApi/composables/useEditorContent.ts +105 -0
- package/src/runtime/pm/features/DocumentApi/composables/useTestDocumentApi.ts +95 -0
- package/src/runtime/pm/features/DocumentApi/types.ts +143 -0
- package/src/runtime/pm/features/DocumentApi/utils/convertFullTransactionForPartialState.ts +54 -0
- package/src/runtime/pm/features/DocumentApi/utils/convertTrForInstance.ts +24 -0
- package/src/runtime/pm/features/DocumentApi/utils/convertTransactionForFullState.ts +39 -0
- package/src/runtime/pm/features/DocumentApi/utils/copyMeta.ts +8 -0
- package/src/runtime/pm/features/DocumentApi/utils/getEmbedJson.ts +16 -0
- package/src/runtime/pm/features/DocumentApi/utils/getEmbedNodeFromDoc.ts +15 -0
- package/src/runtime/pm/features/DocumentApi/utils/getStateEmbedRange.ts +26 -0
- package/src/runtime/pm/features/DocumentApi/utils/isEmbedId.ts +5 -0
- package/src/runtime/pm/features/EmbeddedDocument/Embedded.ts +110 -0
- package/src/runtime/pm/features/EmbeddedDocument/EmbeddedDocument.ts +102 -0
- package/src/runtime/pm/features/EmbeddedDocument/components/EmbeddedDocumentPicker.vue +188 -0
- package/src/runtime/pm/features/EmbeddedDocument/components/EmbeddedNodeView.vue +187 -0
- package/src/runtime/pm/features/EmbeddedDocument/composables/useEmbeddedEditor.ts +302 -0
- package/src/runtime/pm/features/EmbeddedDocument/types.ts +61 -0
- package/src/runtime/pm/features/EmbeddedDocument/utils/isEmbeddedBlock.ts +12 -0
- package/src/runtime/pm/features/EmbeddedDocument/utils/redirectFromEmbedded.ts +48 -0
- package/src/runtime/pm/features/FileLoader/FileLoader.ts +120 -0
- package/src/runtime/pm/features/FileLoader/FileLoaderHandler/FileLoaderHandler.ts +100 -0
- package/src/runtime/pm/features/FileLoader/FileLoaderHandler/TestFileLoaderHandler.ts +61 -0
- package/src/runtime/pm/features/FileLoader/commands/insertFile.ts +87 -0
- package/src/runtime/pm/features/FileLoader/components/FileLoaderNodeView.vue +38 -0
- package/src/runtime/pm/features/FileLoader/plugins/fileLoaderPlugin.ts +70 -0
- package/src/runtime/pm/features/FileLoader/types.ts +91 -0
- package/src/runtime/pm/features/FileLoader/utils/cleanupFileLoaderNode.ts +39 -0
- package/src/runtime/pm/features/FileLoader/utils/cleanupFileLoaderNodes.ts +42 -0
- package/src/runtime/pm/features/FileLoader/utils/findLoadingNodePos.ts +16 -0
- package/src/runtime/pm/features/FileLoader/utils/optionsCheck.ts +16 -0
- package/src/runtime/pm/features/FileLoader/utils/readAsDataUrl.ts +12 -0
- package/src/runtime/pm/features/HardBreak/HardBreak.ts +21 -0
- package/src/runtime/pm/features/Heading/Heading.ts +130 -0
- package/src/runtime/pm/features/Heading/commands/changeLevelAttr.ts +55 -0
- package/src/runtime/pm/features/Heading/types.ts +17 -0
- package/src/runtime/pm/features/Highlight/Highlight.ts +234 -0
- package/src/runtime/pm/features/Highlight/retyped/tiptapHighlight.d.ts +3 -0
- package/src/runtime/pm/features/Highlight/retyped/tiptapHighlight.js +5 -0
- package/src/runtime/pm/features/Highlight/types.ts +25 -0
- package/src/runtime/pm/features/History/History.ts +112 -0
- package/src/runtime/pm/features/Iframe/Iframe.ts +163 -0
- package/src/runtime/pm/features/Iframe/IframeParsers.ts +116 -0
- package/src/runtime/pm/features/Iframe/components/IframeNodeView.vue +83 -0
- package/src/runtime/pm/features/Iframe/types.ts +7 -0
- package/src/runtime/pm/features/Image/Image.ts +16 -0
- package/src/runtime/pm/features/Link/Link.ts +313 -0
- package/src/runtime/pm/features/Link/components/BubbleMenuExternalLink.vue +125 -0
- package/src/runtime/pm/features/Link/components/BubbleMenuInternalLink.vue +130 -0
- package/src/runtime/pm/features/Link/components/BubbleMenuLink.vue +149 -0
- package/src/runtime/pm/features/Link/components/BubbleMenuLinkActions.vue +65 -0
- package/src/runtime/pm/features/Link/types.ts +53 -0
- package/src/runtime/pm/features/Menus/Menus.ts +195 -0
- package/src/runtime/pm/features/Menus/components/MarkMenuManager.vue +203 -0
- package/src/runtime/pm/features/Menus/types.ts +64 -0
- package/src/runtime/pm/features/Menus/utils/isMarkMenu.ts +5 -0
- package/src/runtime/pm/features/Tables/commands/tableEnter.ts +40 -0
- package/src/runtime/pm/features/Tables/index.ts +60 -0
- package/src/runtime/pm/schema.ts +128 -0
- package/src/runtime/pm/testSchema.ts +34 -0
- package/src/runtime/pm/utils/createDropIndicator.ts +61 -0
- package/src/runtime/pm/utils/createStateOnlyPluginApply.ts +11 -0
- package/src/runtime/pm/utils/createStateOnlyPluginObjApply.ts +16 -0
- package/src/runtime/pm/utils/dropPointInfo.ts +85 -0
- package/src/runtime/pm/utils/findUpwards.ts +43 -0
- package/src/runtime/pm/utils/getChildChunks.ts +24 -0
- package/src/runtime/pm/utils/getDiffReplacementRange.ts +32 -0
- package/src/runtime/pm/utils/getElMaxVisualSize.ts +14 -0
- package/src/runtime/pm/utils/getElPropertyAsInt.ts +8 -0
- package/src/runtime/pm/utils/getGroupNodeNames.ts +9 -0
- package/src/runtime/pm/utils/getMarkPosition.ts +57 -0
- package/src/runtime/pm/utils/getMarksInSelection.ts +19 -0
- package/src/runtime/pm/utils/getTypeByName.ts +7 -0
- package/src/runtime/pm/utils/index.ts +17 -0
- package/src/runtime/pm/utils/internal/createNodeTypesList.ts +25 -0
- package/src/runtime/pm/utils/internal/debugMap.ts +36 -0
- package/src/runtime/pm/utils/internal/debugNode.ts +38 -0
- package/src/runtime/pm/utils/internal/debugSel.ts +10 -0
- package/src/runtime/pm/utils/internal/recurse.ts +44 -0
- package/src/runtime/pm/utils/internal/stripBlockId.ts +10 -0
- package/src/runtime/pm/utils/mapSelection.ts +21 -0
- package/src/runtime/pm/utils/nodesBetween.ts +47 -0
- package/src/runtime/pm/utils/pointToPmPoint.ts +5 -0
- package/src/runtime/pm/utils/splitIntoChunks.ts +68 -0
- package/src/runtime/testDocuments.ts +130 -0
- 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
|
+
}
|