@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,187 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<!-- @vue-expect-error -->
|
|
3
|
+
<node-view-wrapper
|
|
4
|
+
:class="`
|
|
5
|
+
group/embedded-doc
|
|
6
|
+
relative
|
|
7
|
+
after:pointer-events-none
|
|
8
|
+
after:content-['']
|
|
9
|
+
after:absolute after:inset-0
|
|
10
|
+
after:border after:border-neutral-500 after:rounded-sm
|
|
11
|
+
after:drop-shadow-xs
|
|
12
|
+
focus-within:after:border-accent-500
|
|
13
|
+
focus:after:border-accent-500
|
|
14
|
+
`"
|
|
15
|
+
tabindex="0"
|
|
16
|
+
v-bind="{
|
|
17
|
+
...node.attrs,
|
|
18
|
+
embedId: undefined,
|
|
19
|
+
embedDocId: node.attrs.embedId.docId,
|
|
20
|
+
embedBlockId: node.attrs.embedId.blockId
|
|
21
|
+
}"
|
|
22
|
+
@pointerdown="setEditorSelection"
|
|
23
|
+
>
|
|
24
|
+
<div
|
|
25
|
+
class="text-sm relative"
|
|
26
|
+
contenteditable="false"
|
|
27
|
+
>
|
|
28
|
+
<div
|
|
29
|
+
class="bg-neutral-100 dark:bg-neutral-900 flex p-1 gap-2 no-wrap justify-between align-center"
|
|
30
|
+
contenteditable="false"
|
|
31
|
+
>
|
|
32
|
+
<div
|
|
33
|
+
v-if="name"
|
|
34
|
+
class="pl-1"
|
|
35
|
+
>
|
|
36
|
+
File: {{ name }}
|
|
37
|
+
</div>
|
|
38
|
+
<div
|
|
39
|
+
v-else
|
|
40
|
+
class="pl-1 text-center w-full"
|
|
41
|
+
>
|
|
42
|
+
Blank Embed
|
|
43
|
+
</div>
|
|
44
|
+
<!-- @vue-expect-error -->
|
|
45
|
+
<WButton
|
|
46
|
+
v-if="editor?.isEditable"
|
|
47
|
+
title="Change embed link."
|
|
48
|
+
:border="true"
|
|
49
|
+
@click="showChangeEmbed = true"
|
|
50
|
+
>
|
|
51
|
+
<WIcon><i-fa-solid-link class="w-[0.7rem]"/></WIcon>
|
|
52
|
+
</WButton>
|
|
53
|
+
<!-- @vue-expect-error -->
|
|
54
|
+
<WPopup
|
|
55
|
+
:use-backdrop="true"
|
|
56
|
+
:preferred-horizontal="['center-screen']"
|
|
57
|
+
:preferred-vertical="['center-screen']"
|
|
58
|
+
class="backdrop:bg-neutral-900/50 backdrop:dark:bg-neutral-100/50"
|
|
59
|
+
v-model="showChangeEmbed"
|
|
60
|
+
>
|
|
61
|
+
<template #popup="{ extractEl }">
|
|
62
|
+
<EmbeddedDocumentPicker
|
|
63
|
+
:is-shown="showChangeEmbed"
|
|
64
|
+
:embed-id="embedId"
|
|
65
|
+
v-extract-root-el="extractEl"
|
|
66
|
+
@submit="pickEmbed"
|
|
67
|
+
@cancel="showChangeEmbed = false"
|
|
68
|
+
/>
|
|
69
|
+
</template>
|
|
70
|
+
>
|
|
71
|
+
</WPopup>
|
|
72
|
+
</div>
|
|
73
|
+
<Transition>
|
|
74
|
+
<div
|
|
75
|
+
v-if="showUndoWarning"
|
|
76
|
+
class="absolute inset-0 bg-red-100 dark:bg-red-900 text-red-600 dark:text-red-400 px-2"
|
|
77
|
+
contenteditable="false"
|
|
78
|
+
>
|
|
79
|
+
Warning: Undo applied to document part that is not visible/embedded.
|
|
80
|
+
</div>
|
|
81
|
+
</Transition>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div v-if="!name"/>
|
|
85
|
+
<div
|
|
86
|
+
v-else-if="isEmbeddedTooDeep"
|
|
87
|
+
class="px-2 text-center"
|
|
88
|
+
contenteditable="false"
|
|
89
|
+
>
|
|
90
|
+
Cannot preview nested content deeper than one level.
|
|
91
|
+
</div>
|
|
92
|
+
<div
|
|
93
|
+
v-else-if="isRecursivelyEmbedded"
|
|
94
|
+
class="px-2 text-center"
|
|
95
|
+
contenteditable="false"
|
|
96
|
+
>
|
|
97
|
+
Cannot preview recursively embedded content.
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
<template
|
|
101
|
+
v-else-if="content"
|
|
102
|
+
>
|
|
103
|
+
<component
|
|
104
|
+
:is-embedded="true"
|
|
105
|
+
:content="content"
|
|
106
|
+
:editor-options="editorOptions"
|
|
107
|
+
:is="editorComponent"
|
|
108
|
+
ref="editorWrapper"
|
|
109
|
+
/>
|
|
110
|
+
</template>
|
|
111
|
+
<div
|
|
112
|
+
v-else
|
|
113
|
+
class="px-2 text-center"
|
|
114
|
+
>
|
|
115
|
+
{{ isLoading ? "Loading..." : "Could not find reference to wanted block." }}
|
|
116
|
+
</div>
|
|
117
|
+
</node-view-wrapper>
|
|
118
|
+
</template>
|
|
119
|
+
|
|
120
|
+
<script setup lang="ts">
|
|
121
|
+
import { nodeViewProps, NodeViewWrapper } from "@tiptap/vue-3"
|
|
122
|
+
import WIcon from "@witchcraft/ui/components/Icon"
|
|
123
|
+
import WButton from "@witchcraft/ui/components/LibButton"
|
|
124
|
+
import WPopup from "@witchcraft/ui/components/LibPopup"
|
|
125
|
+
import { vExtractRootEl } from "@witchcraft/ui/directives/vExtractRootEl"
|
|
126
|
+
import { computed, inject, ref, watch } from "vue"
|
|
127
|
+
|
|
128
|
+
import EmbeddedDocumentPicker from "./EmbeddedDocumentPicker.vue"
|
|
129
|
+
|
|
130
|
+
import IFaSolidLink from "~icons/fa-solid/link"
|
|
131
|
+
|
|
132
|
+
import Editor from "../../../../components/Editor.vue"
|
|
133
|
+
import type { MaybeEmbedId } from "../../DocumentApi/types.js"
|
|
134
|
+
import { useEmbeddedEditor } from "../composables/useEmbeddedEditor.js"
|
|
135
|
+
import { embeddedEditorComponentInjectionKey } from "../types.js"
|
|
136
|
+
|
|
137
|
+
const props = defineProps(nodeViewProps)
|
|
138
|
+
|
|
139
|
+
const editorComponent = inject(embeddedEditorComponentInjectionKey, Editor)
|
|
140
|
+
const editorWrapper = ref<InstanceType<typeof Editor> | null>(null)
|
|
141
|
+
// const el = ref<HTMLElement | null>(null)
|
|
142
|
+
const innerEditor = computed(() => editorWrapper.value?.editor)
|
|
143
|
+
|
|
144
|
+
const embedId = computed(() => props.node.attrs.embedId as MaybeEmbedId)
|
|
145
|
+
const showChangeEmbed = ref(false)
|
|
146
|
+
|
|
147
|
+
function pickEmbed(newEmbedId: MaybeEmbedId): void {
|
|
148
|
+
showChangeEmbed.value = false
|
|
149
|
+
props.updateAttributes({ ...props.node.attrs, embedId: { ...newEmbedId } })
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function setEditorSelection(): void {
|
|
153
|
+
const pos = props.getPos()
|
|
154
|
+
if (props.editor.state.selection.from !== pos && pos) {
|
|
155
|
+
props.editor?.commands.setNodeSelection(pos)
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function autoFocusOnSelection(): void {
|
|
160
|
+
if (props.editor.state.selection.from === props.getPos()
|
|
161
|
+
&& document.activeElement !== innerEditor.value?.view.dom
|
|
162
|
+
) {
|
|
163
|
+
innerEditor.value?.commands.focus()
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
watch([() => props.editor.state.selection.from, innerEditor], () => {
|
|
168
|
+
autoFocusOnSelection()
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
const {
|
|
172
|
+
content,
|
|
173
|
+
// api,
|
|
174
|
+
isEmbeddedTooDeep,
|
|
175
|
+
// isEmbeddedBlock,
|
|
176
|
+
isRecursivelyEmbedded,
|
|
177
|
+
showUndoWarning,
|
|
178
|
+
name,
|
|
179
|
+
isLoading,
|
|
180
|
+
editorOptions
|
|
181
|
+
} = useEmbeddedEditor(
|
|
182
|
+
embedId,
|
|
183
|
+
innerEditor,
|
|
184
|
+
props.editor,
|
|
185
|
+
props.getPos
|
|
186
|
+
)
|
|
187
|
+
</script>
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { castType } from "@alanscodelog/utils/castType"
|
|
2
|
+
import type { Content, Editor, EditorOptions } from "@tiptap/core"
|
|
3
|
+
import type { EditorState, Transaction } from "@tiptap/pm/state"
|
|
4
|
+
import { computed, type ComputedRef, inject, onBeforeUnmount, onMounted, provide, type Ref, ref, type ShallowRef, watch } from "vue"
|
|
5
|
+
|
|
6
|
+
import { getDiffReplacementRange } from "../../../utils/getDiffReplacementRange.js"
|
|
7
|
+
import { type DocId, documentApiInjectionKey, type DocumentApiInterface, type EmbedId, type MaybeEmbedId, type OnUpdateDocumentCallback } from "../../DocumentApi/types.js"
|
|
8
|
+
import { convertFullTransactionForPartialState } from "../../DocumentApi/utils/convertFullTransactionForPartialState.js"
|
|
9
|
+
import { getStateEmbedRange } from "../../DocumentApi/utils/getStateEmbedRange.js"
|
|
10
|
+
import { isEmbedId } from "../../DocumentApi/utils/isEmbedId.js"
|
|
11
|
+
import { Embedded } from "../Embedded.js"
|
|
12
|
+
import { embededEditorOptionsInjectionKey, isDeepEmbeddedInjectionKey, isEmbeddedBlockInjectionKey, isEmbeddedInjectionKey, parentEditorIdInjectionKey } from "../types.js"
|
|
13
|
+
|
|
14
|
+
type WarningState = {
|
|
15
|
+
smallTimeout: number | undefined
|
|
16
|
+
timeout: number | undefined
|
|
17
|
+
justWarned: boolean
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function defaultOnUndoWarning(
|
|
21
|
+
r: Ref<boolean>,
|
|
22
|
+
state: WarningState,
|
|
23
|
+
undoTimeouts: [number, number] = [50, 2000]
|
|
24
|
+
): void {
|
|
25
|
+
clearTimeout(state.smallTimeout)
|
|
26
|
+
clearTimeout(state.timeout)
|
|
27
|
+
r.value = false
|
|
28
|
+
// the key is getting held
|
|
29
|
+
if (state.justWarned) {
|
|
30
|
+
r.value = true
|
|
31
|
+
}
|
|
32
|
+
state.justWarned = true
|
|
33
|
+
|
|
34
|
+
// makes it do a little flash
|
|
35
|
+
state.smallTimeout = setTimeout(() => {
|
|
36
|
+
state.justWarned = false
|
|
37
|
+
r.value = true
|
|
38
|
+
clearTimeout(state.timeout)
|
|
39
|
+
state.timeout = setTimeout(() => {
|
|
40
|
+
r.value = false
|
|
41
|
+
}, undoTimeouts[1]) as any as number
|
|
42
|
+
}, undoTimeouts[0]) as any as number
|
|
43
|
+
}
|
|
44
|
+
function defaultOnUndoOk(r: Ref<boolean>, state: WarningState): void {
|
|
45
|
+
clearTimeout(state.smallTimeout)
|
|
46
|
+
clearTimeout(state.timeout)
|
|
47
|
+
r.value = false
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Sets up nearly everything for the embedded editor nodeview. */
|
|
51
|
+
export function useEmbeddedEditor(
|
|
52
|
+
embedIdRef: ComputedRef<MaybeEmbedId> | Ref<MaybeEmbedId>,
|
|
53
|
+
/* The embedded editor instance. */
|
|
54
|
+
editor: ShallowRef<Editor | undefined>,
|
|
55
|
+
/* The root editor instance, for forwarding commands the embedded editor can't handle. See {@link Embedded}. */
|
|
56
|
+
rootEditor: Editor,
|
|
57
|
+
/** For forwarding commands the embedded editor can't handle. See {@link Embedded}. */
|
|
58
|
+
getPos: () => number | undefined,
|
|
59
|
+
{
|
|
60
|
+
undoTimeouts = [50, 2000],
|
|
61
|
+
selfSymbol = Symbol(`embedded-editor`),
|
|
62
|
+
onUndoWarning,
|
|
63
|
+
onUndoOk,
|
|
64
|
+
alwaysLoad = false,
|
|
65
|
+
injectIsEmbedded = true,
|
|
66
|
+
injectIsDeepEmbedded = true
|
|
67
|
+
}: {
|
|
68
|
+
/* The small and normal timeouts for the default undo warning functions. */
|
|
69
|
+
undoTimeouts?: [number, number]
|
|
70
|
+
|
|
71
|
+
/* This function will be called with the returned undoWarning ref when an undo would happen outside the embedded block.
|
|
72
|
+
*
|
|
73
|
+
* The default function will set the ref to false for 50ms (the small timeout), then true for 2000 (the normal timeout) so there is a brief flash with each undo. If it's called again before the 50ms, it will set the ref to true, so as to not flash when the undo key is held.
|
|
74
|
+
*/
|
|
75
|
+
onUndoWarning?: ((ref: Ref<boolean>) => void)
|
|
76
|
+
/* This function will be called with the returned undoWarning ref when an undo would happen inside the embedded block.
|
|
77
|
+
*
|
|
78
|
+
* The default function will set the ref to false and clear the timeouts of the default warning function.
|
|
79
|
+
* */
|
|
80
|
+
onUndoOk?: ((ref: Ref<boolean>) => void)
|
|
81
|
+
/* A symbol to identify the embedded node view instance by. */
|
|
82
|
+
selfSymbol?: symbol
|
|
83
|
+
/** By default, documents will not be loaded if they are embedded too deeply or recursively embedded. Passing true will ignore all checks and load them anyways. This also usually requires disabling the injections with the `injectIsEmbedded` and `injectIsDeepEmbedded` options. */
|
|
84
|
+
alwaysLoad?: boolean
|
|
85
|
+
/** By default, the composable injects the `isEmbedded*InjectionKey`s. Passing false will not inject them. */
|
|
86
|
+
injectIsEmbedded?: boolean
|
|
87
|
+
/** By default, the composable injects `isDeepEmbeddedInjectionKey` with true if it is false. Passing false will not inject it. */
|
|
88
|
+
injectIsDeepEmbedded?: boolean
|
|
89
|
+
} = {}
|
|
90
|
+
): {
|
|
91
|
+
content: Ref<Content | null>
|
|
92
|
+
api: DocumentApiInterface
|
|
93
|
+
selfSymbol: symbol
|
|
94
|
+
isEmbeddedTooDeep: boolean
|
|
95
|
+
isEmbeddedBlock?: Ref<boolean>
|
|
96
|
+
isRecursivelyEmbedded: ComputedRef<boolean>
|
|
97
|
+
showUndoWarning: Ref<boolean>
|
|
98
|
+
/** If name is undefined, the embed is a new embed without a document id. */
|
|
99
|
+
name: ComputedRef<string | undefined>
|
|
100
|
+
isLoading: Ref<boolean>
|
|
101
|
+
/** The root editor needs to provide it's options so we can pass them to the embedded editor. If we don't, extra extensions (e.g. BaseShortcuts) and options won't be registered on the embedded editor. See the `embeddedEditorOptionsInjectionKey` for why `autofocus` is ommitted. */
|
|
102
|
+
editorOptions: Partial<Omit<EditorOptions, "autofocus">>
|
|
103
|
+
} {
|
|
104
|
+
const showUndoWarning = ref(false)
|
|
105
|
+
const content = ref<Content | null>(null)
|
|
106
|
+
const api = inject(documentApiInjectionKey)
|
|
107
|
+
if (!api) {
|
|
108
|
+
throw new Error("No embed api provided.")
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const editorOptions = inject(embededEditorOptionsInjectionKey)
|
|
112
|
+
if (!editorOptions) {
|
|
113
|
+
throw new Error("No editor options provided.")
|
|
114
|
+
}
|
|
115
|
+
editorOptions.extensions = [
|
|
116
|
+
...(editorOptions.extensions ?? []).filter(ext => ext.name !== Embedded.name),
|
|
117
|
+
Embedded.configure({
|
|
118
|
+
rootEditor,
|
|
119
|
+
getPos,
|
|
120
|
+
getEmbedId: () => embedIdRef.value
|
|
121
|
+
})
|
|
122
|
+
]
|
|
123
|
+
|
|
124
|
+
const isEmbeddedTooDeep = inject(isDeepEmbeddedInjectionKey, false)
|
|
125
|
+
if (injectIsDeepEmbedded && !isEmbeddedTooDeep) {
|
|
126
|
+
provide(isDeepEmbeddedInjectionKey, true)
|
|
127
|
+
}
|
|
128
|
+
const isEmbeddedBlock = computed(() => !!embedIdRef.value.blockId)
|
|
129
|
+
if (injectIsEmbedded) {
|
|
130
|
+
provide(isEmbeddedInjectionKey, true)
|
|
131
|
+
provide(isEmbeddedBlockInjectionKey, isEmbeddedBlock)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const parentId = inject(parentEditorIdInjectionKey, undefined)
|
|
135
|
+
const isRecursivelyEmbedded = computed(() => parentId?.value === embedIdRef.value.docId)
|
|
136
|
+
|
|
137
|
+
const isLoading = ref(false)
|
|
138
|
+
|
|
139
|
+
const name = computed(() => isEmbedId(embedIdRef.value) ? api.getEmbedTitle(embedIdRef.value) : undefined)
|
|
140
|
+
|
|
141
|
+
const warningState: WarningState = {
|
|
142
|
+
smallTimeout: undefined,
|
|
143
|
+
timeout: undefined,
|
|
144
|
+
justWarned: false
|
|
145
|
+
}
|
|
146
|
+
function forwardDispatchToFullState(tr?: Transaction): void {
|
|
147
|
+
castType<EmbedId>(embedIdRef.value)
|
|
148
|
+
const stateBefore = api!.getFromCache(embedIdRef.value)
|
|
149
|
+
if (!stateBefore) {
|
|
150
|
+
throw new Error("Expected stateBefore to exist.")
|
|
151
|
+
}
|
|
152
|
+
if (!tr) return
|
|
153
|
+
const diff = getDiffReplacementRange(stateBefore.doc, tr.doc)
|
|
154
|
+
const { start, end } = getStateEmbedRange(tr.doc, embedIdRef.value)
|
|
155
|
+
if (diff && end !== undefined && start !== undefined
|
|
156
|
+
&& (diff.start < start || diff.end > end)
|
|
157
|
+
) {
|
|
158
|
+
onUndoWarning
|
|
159
|
+
? onUndoWarning(showUndoWarning)
|
|
160
|
+
: defaultOnUndoWarning(showUndoWarning, warningState, undoTimeouts)
|
|
161
|
+
} else {
|
|
162
|
+
onUndoOk
|
|
163
|
+
? onUndoOk(showUndoWarning)
|
|
164
|
+
: defaultOnUndoOk(showUndoWarning, warningState)
|
|
165
|
+
}
|
|
166
|
+
// forwarded transactions bypass the on transaction hook
|
|
167
|
+
// so we set ignore to false
|
|
168
|
+
// and don't pass our symbol here
|
|
169
|
+
// so we can receive the transaction and update the embedded document
|
|
170
|
+
// we also don't convert the transaction's steps
|
|
171
|
+
tr.setMeta("no-step-convert", true)
|
|
172
|
+
tr.setMeta("no-schema-convert", true)
|
|
173
|
+
if (!embedIdRef.value.blockId) {
|
|
174
|
+
tr.setMeta("no-step-convert", true)
|
|
175
|
+
}
|
|
176
|
+
api!.updateDocument?.(
|
|
177
|
+
embedIdRef.value,
|
|
178
|
+
tr,
|
|
179
|
+
undefined
|
|
180
|
+
)
|
|
181
|
+
}
|
|
182
|
+
function onTransaction({ transaction }: { transaction: Transaction }): void {
|
|
183
|
+
castType<EmbedId>(embedIdRef.value)
|
|
184
|
+
if (!transaction.docChanged || transaction.getMeta("ignore")) {
|
|
185
|
+
return
|
|
186
|
+
}
|
|
187
|
+
if (!embedIdRef.value.blockId) {
|
|
188
|
+
transaction.setMeta("no-step-convert", true)
|
|
189
|
+
}
|
|
190
|
+
api!.updateDocument?.(
|
|
191
|
+
embedIdRef.value,
|
|
192
|
+
transaction,
|
|
193
|
+
selfSymbol
|
|
194
|
+
)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const onUpdateDocument: OnUpdateDocumentCallback = (
|
|
198
|
+
incomingEmbedId: DocId,
|
|
199
|
+
tr: Transaction,
|
|
200
|
+
_stateBefore: EditorState,
|
|
201
|
+
_incomingState: EditorState,
|
|
202
|
+
incomingSelfSymbol?: symbol
|
|
203
|
+
): void => {
|
|
204
|
+
castType<EmbedId>(embedIdRef.value)
|
|
205
|
+
if (
|
|
206
|
+
incomingSelfSymbol === selfSymbol
|
|
207
|
+
|| embedIdRef.value.docId !== incomingEmbedId.docId
|
|
208
|
+
|| !tr.docChanged
|
|
209
|
+
|| tr.getMeta("ignore")
|
|
210
|
+
) {
|
|
211
|
+
return
|
|
212
|
+
}
|
|
213
|
+
if (content.value) {
|
|
214
|
+
const convertedTr = convertFullTransactionForPartialState(
|
|
215
|
+
editor.value!.state!,
|
|
216
|
+
tr,
|
|
217
|
+
embedIdRef.value
|
|
218
|
+
)
|
|
219
|
+
if (convertedTr) {
|
|
220
|
+
if (!convertedTr.before.eq(editor.value!.state.doc)) {
|
|
221
|
+
return
|
|
222
|
+
}
|
|
223
|
+
editor.value!.view.dispatch(convertedTr)
|
|
224
|
+
} else {
|
|
225
|
+
// the link got broken, the node was deleted
|
|
226
|
+
unloadDocument(embedIdRef.value, { partial: true })
|
|
227
|
+
}
|
|
228
|
+
} else {
|
|
229
|
+
void loadDocument(embedIdRef.value, { partial: true })
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
let attached = false
|
|
233
|
+
async function loadDocument(embedId: MaybeEmbedId, { partial = false }: { partial?: boolean } = {}): Promise<void> {
|
|
234
|
+
if (!isEmbedId(embedId)) return
|
|
235
|
+
if (!alwaysLoad && (isRecursivelyEmbedded.value || isEmbeddedTooDeep)) return
|
|
236
|
+
if (!partial) {
|
|
237
|
+
isLoading.value = true
|
|
238
|
+
await api!.load(embedId)
|
|
239
|
+
}
|
|
240
|
+
const res = api!.getEmbeddedContent?.(embedId)
|
|
241
|
+
if (!res) return
|
|
242
|
+
if (!partial) {
|
|
243
|
+
api!.addEventListener?.("update", onUpdateDocument)
|
|
244
|
+
}
|
|
245
|
+
content.value = res
|
|
246
|
+
|
|
247
|
+
watch(editor, () => {
|
|
248
|
+
// void nextTick(() => {
|
|
249
|
+
// this needs to be set if the document changes
|
|
250
|
+
// because the editor gets unmounted and
|
|
251
|
+
// a new version of the extension
|
|
252
|
+
// without the callbacks is created
|
|
253
|
+
editor.value!.commands.setHistoryRedirect(
|
|
254
|
+
() => api!.getFromCache(embedId),
|
|
255
|
+
forwardDispatchToFullState
|
|
256
|
+
)
|
|
257
|
+
// wait for the editor to exist
|
|
258
|
+
editor.value?.on("transaction", onTransaction)
|
|
259
|
+
isLoading.value = false
|
|
260
|
+
attached = true
|
|
261
|
+
}, { once: true })
|
|
262
|
+
}
|
|
263
|
+
function unloadDocument(embedId: MaybeEmbedId, { partial = false }: { partial?: boolean } = {}): void {
|
|
264
|
+
if (!isEmbedId(embedId)) return
|
|
265
|
+
if (!alwaysLoad && (isRecursivelyEmbedded.value || isEmbeddedTooDeep)) return
|
|
266
|
+
editor.value?.off("transaction", onTransaction)
|
|
267
|
+
if (!partial && attached) {
|
|
268
|
+
api!.removeEventListener?.("update", onUpdateDocument)
|
|
269
|
+
api!.unload(embedId)
|
|
270
|
+
attached = false
|
|
271
|
+
}
|
|
272
|
+
// the extension is destroyed when the editor is unmounted
|
|
273
|
+
editor.value?.commands.setHistoryRedirect(undefined, undefined)
|
|
274
|
+
content.value = null
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
watch(embedIdRef, (newVal, oldVal) => {
|
|
278
|
+
if (newVal.docId !== oldVal.docId || newVal.blockId !== oldVal.blockId) {
|
|
279
|
+
unloadDocument(oldVal)
|
|
280
|
+
void loadDocument(newVal)
|
|
281
|
+
}
|
|
282
|
+
})
|
|
283
|
+
|
|
284
|
+
onMounted(async () => {
|
|
285
|
+
await loadDocument(embedIdRef.value)
|
|
286
|
+
})
|
|
287
|
+
onBeforeUnmount(() => {
|
|
288
|
+
unloadDocument(embedIdRef.value)
|
|
289
|
+
})
|
|
290
|
+
return {
|
|
291
|
+
content,
|
|
292
|
+
api,
|
|
293
|
+
selfSymbol,
|
|
294
|
+
isEmbeddedTooDeep,
|
|
295
|
+
isEmbeddedBlock,
|
|
296
|
+
isRecursivelyEmbedded,
|
|
297
|
+
showUndoWarning,
|
|
298
|
+
name,
|
|
299
|
+
isLoading,
|
|
300
|
+
editorOptions
|
|
301
|
+
}
|
|
302
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Dispatch, Editor, EditorOptions } from "@tiptap/core"
|
|
2
|
+
import type { ComputedRef, InjectionKey, Ref } from "vue"
|
|
3
|
+
|
|
4
|
+
import type { MaybeEmbedId } from "../DocumentApi/types.js"
|
|
5
|
+
|
|
6
|
+
export interface EmbeddedDocumentNodeOptions extends WithOnTriggerByEmbeddedBlockOptions {
|
|
7
|
+
rootEditor: Editor
|
|
8
|
+
/** Provided by the embedded node view. */
|
|
9
|
+
getPos: () => number | undefined
|
|
10
|
+
getEmbedId: () => MaybeEmbedId
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** Tells the editor and embedded doc view whether it's deeply embedded (more than one level) or not. */
|
|
14
|
+
export const isDeepEmbeddedInjectionKey = Symbol("isEmbeddedInjectionKey") as InjectionKey<boolean>
|
|
15
|
+
/** Tells the editor and embedded doc view whether it's embedded or not. */
|
|
16
|
+
export const isEmbeddedInjectionKey = Symbol("isEmbeddedInjectionKey") as InjectionKey<boolean>
|
|
17
|
+
|
|
18
|
+
/* Tells the editor whether it's a single block embed so it can set the right class on the wrapper. See {@link isEmbeddedBlock}. */
|
|
19
|
+
export const isEmbeddedBlockInjectionKey = Symbol("isEmbeddedBlockInjectionKey") as InjectionKey<ComputedRef<boolean> | Ref<boolean>>
|
|
20
|
+
|
|
21
|
+
/** Injects the editor component to use for embedded editors. */
|
|
22
|
+
export const embeddedEditorComponentInjectionKey = Symbol("embeddedEditorComponentInjectionKey") as InjectionKey<new (...args: any) => { editor?: Editor }>
|
|
23
|
+
|
|
24
|
+
/** Injects the parent editor id so the embedded editor can know who is embedding it (to track recursive/disallowed embeds). */
|
|
25
|
+
export const parentEditorIdInjectionKey = Symbol("parentEditorIdInjectionKey") as InjectionKey<Ref<string | undefined>>
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Injects the editor options so the embedded editor can use the same ones as it's parent.
|
|
29
|
+
*
|
|
30
|
+
* Note that autofocus is always disabled for embedded editors, hence it's omission.
|
|
31
|
+
*/
|
|
32
|
+
export const embededEditorOptionsInjectionKey = Symbol("embededEditorOptionsInjectionKey") as InjectionKey<Partial<Omit<EditorOptions, "autofocus">>>
|
|
33
|
+
|
|
34
|
+
export type WithOnTriggerByEmbeddedBlockOptions = {
|
|
35
|
+
/**
|
|
36
|
+
* When the editor is embedded and it's embedding a single block, certain commands are nullified and just return true and do nothing because they would break the embedding (e.g. enter, split, indent, etc).
|
|
37
|
+
*
|
|
38
|
+
* All such commands forward to the `embeddedCommandRedirect` command if it's available (otherwise a warning is logged). The `Embedded` extension takes care of registering this redirect and can redirect some of the commands to the root editor, but not all of them.
|
|
39
|
+
*
|
|
40
|
+
* You can use this function to handle the redirection yourself. You will get passed both editor instances (root and embedded) to facilitate communication. If you can handle the command, you should return a boolean as with a regular command. Otherwise you can return undefined to let the default handler take care of it.
|
|
41
|
+
*
|
|
42
|
+
* Note that if the change moves the node, the component will get remounted and the embedded editor will no longer exist (to, for example, focus it).
|
|
43
|
+
*
|
|
44
|
+
* The included EmbeddedNodeView takes care of auto-focusing when the selection matches it's position. So as a workaround for focus at least, you can use `tr.setNodeSelection(nodePos + offset)`. Note the use of `offset`. The node's position will have probably changed depending on the command so you will need to know how much to offset it or have some way to find it's position again. While the embedId is provided, it's not guaranteed there is only one node embedding that id, there might be multiple. A better way is to first find the parent embedding item id before executing your command, note the `blockId`, then use it to find the node again.
|
|
45
|
+
*
|
|
46
|
+
* See {@link redirectFromEmbedded} for creating redirectable commands.
|
|
47
|
+
*/
|
|
48
|
+
embeddedBlockCommandRedirect?: (
|
|
49
|
+
commandName: string,
|
|
50
|
+
args: any,
|
|
51
|
+
context: {
|
|
52
|
+
editor: Editor
|
|
53
|
+
rootEditor: Editor
|
|
54
|
+
nodePos: number | undefined
|
|
55
|
+
embedId: MaybeEmbedId
|
|
56
|
+
dispatch: Dispatch
|
|
57
|
+
}
|
|
58
|
+
) => boolean | undefined
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export type OnTriggerByEmbeddedBlock = WithOnTriggerByEmbeddedBlockOptions["embeddedBlockCommandRedirect"]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EditorView } from "@tiptap/pm/view"
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns whether the current view is a block embed embedded in another view.
|
|
5
|
+
*
|
|
6
|
+
* This is done by checking if the immediate parent has the class `editor-is-embedded-block` which the editor component adds when it receives the {@link isEmbeddedBlockInjectionKey} injection key.
|
|
7
|
+
*
|
|
8
|
+
* We cannot do this via state since a document can be both embedded and not embedded at the same time.
|
|
9
|
+
*/
|
|
10
|
+
export function isEmbeddedBlock(view: EditorView): boolean {
|
|
11
|
+
return view.dom.parentElement?.classList.contains("editor-is-embedded-block") ?? false
|
|
12
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { SingleCommands } from "@tiptap/core"
|
|
2
|
+
import type { EditorView } from "@tiptap/pm/view"
|
|
3
|
+
|
|
4
|
+
import { isEmbeddedBlock } from "./isEmbeddedBlock.js"
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Commands that can split a block or modify it's position (indent/unindent) should not be called when the editor is in embedded block mode.
|
|
8
|
+
*
|
|
9
|
+
* This takes care of redirecting the command if possible (see {@link WithOnTriggerByEmbeddedBlockOptions.onTriggerByEmbeddedBlock}), otherwise it logs a warning.
|
|
10
|
+
*
|
|
11
|
+
* If the command should not be called at all and offers no redirect, don't pass the redirect parameter and it will log a different warning.
|
|
12
|
+
*
|
|
13
|
+
* You can use it in a command like this:
|
|
14
|
+
*
|
|
15
|
+
* ```ts
|
|
16
|
+
* commandName: (arg:any) => ({ commands, view, dispatch }) => {
|
|
17
|
+
* const redirect = isEmbeddedBlock(view, "commandName", { args:[arg], view, commands, dispatch }))
|
|
18
|
+
* if (redirect.redirected) { return redirect.result }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function redirectFromEmbedded(
|
|
23
|
+
view: EditorView,
|
|
24
|
+
name: string,
|
|
25
|
+
redirect?: {
|
|
26
|
+
args: any[]
|
|
27
|
+
view: EditorView
|
|
28
|
+
commands: SingleCommands
|
|
29
|
+
}
|
|
30
|
+
): { redirected: true, result: any } | { redirected: false } {
|
|
31
|
+
if (isEmbeddedBlock(view)) {
|
|
32
|
+
if (redirect && "embeddedCommandRedirect" in redirect.commands) {
|
|
33
|
+
const result = redirect.commands.embeddedCommandRedirect(
|
|
34
|
+
name,
|
|
35
|
+
redirect.args
|
|
36
|
+
)
|
|
37
|
+
return { redirected: true, result }
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// eslint-disable-next-line no-console
|
|
41
|
+
console.warn(redirect
|
|
42
|
+
? `Command ${name} called from an embedded editor. This command supports command redirection, but no "embeddedCommandRedirect" command found. Command ignored (returning true to prevent further action).`
|
|
43
|
+
: `Command ${name} should not be called from an embedded editor. Command ignored (returning true to prevent further action).`
|
|
44
|
+
)
|
|
45
|
+
return { redirected: true, result: true }
|
|
46
|
+
}
|
|
47
|
+
return { redirected: false }
|
|
48
|
+
}
|