@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,195 @@
|
|
|
1
|
+
import { type Command, Extension } from "@tiptap/core"
|
|
2
|
+
import { type EditorState, Plugin, type PluginKey } from "@tiptap/pm/state"
|
|
3
|
+
|
|
4
|
+
import { type Menu, menusPluginKey, type OpenMenuInfo } from "./types.js"
|
|
5
|
+
|
|
6
|
+
import { createStateOnlyPluginObjApply } from "../../utils/createStateOnlyPluginObjApply.js"
|
|
7
|
+
|
|
8
|
+
declare module "@tiptap/core" {
|
|
9
|
+
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
11
|
+
interface Commands<ReturnType> {
|
|
12
|
+
menus: {
|
|
13
|
+
/** Can be used to close the open menu. Use force to close pinned menus. */
|
|
14
|
+
closeOtherMenus: (forceUnpin?: boolean) => ReturnType
|
|
15
|
+
/** This will temporarily open and "pin" the menu, disabling the auto-prioritizing, until it's closed with `force: true`. */
|
|
16
|
+
pinOpenMenu: (options: Pick<OpenMenuInfo, "name">) => ReturnType
|
|
17
|
+
/**
|
|
18
|
+
* Register a menu to be hnadled by the Menus extension.
|
|
19
|
+
*
|
|
20
|
+
* The ideal place to register them is usually in the onCreate hook of the extension. Do not do it from addProseMirrorPlugins as this will cause the menus to be registered more times than they should be.
|
|
21
|
+
*
|
|
22
|
+
* To be technical, this happens because the DocumentApi creates a state using a copy of the editor's plugins from the extension manager. The problem is not the copy but that the plugin property is actually a getter that calls `addProseMirrorPlugins` so the functon must not have side-effects.
|
|
23
|
+
*/
|
|
24
|
+
registerMenu: <TPluginKey extends PluginKey<any>>(menu: Menu<TPluginKey>) => ReturnType
|
|
25
|
+
/**
|
|
26
|
+
* Since most mark menus don't have a close command, this is can be used to temporarily disable them.
|
|
27
|
+
*
|
|
28
|
+
* This should not be used to more permanantly turn off mark menus, as internally this is used to temporarily disable AND enable them. All optional mark menus have options to disable them.
|
|
29
|
+
*/
|
|
30
|
+
disableMarkMenus: () => ReturnType
|
|
31
|
+
/**
|
|
32
|
+
* Enables showing of mark menus again.
|
|
33
|
+
*/
|
|
34
|
+
enableMarkMenus: () => ReturnType
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Helps coordinate the display of different menus, never allowing more than one to be opened, sorting by priority, and autoclosing others. \*.
|
|
42
|
+
*
|
|
43
|
+
* If this extension is available, extensions with menus will register themselves, some with a higher priority than others.
|
|
44
|
+
*
|
|
45
|
+
* On each transaction, the extension will check in order of priority if any of the registered menus should be opened and save which menu that is to it's `menusPluginKey`, closing other open menus.
|
|
46
|
+
*
|
|
47
|
+
* The MarkMenuManager component is used in the editor wrapper to easily display "mark" menus with the help of this extension. If it is not used, they won't show since they must be added manually. The commponent reads the saved state and if the menu is a mark menu and a renderer has been provided for it using the `menusInjectionKey`, it renders the menu. The editor wrapper provides the `menus` option which takes care of providing the menus.
|
|
48
|
+
*
|
|
49
|
+
* \* Note that menus may choose to not implement or not provide a close command. In cases like "mark" menus this is fine if using the MarkMenuManager since it will only ever display one menu, but can otherwise break the intended purpose of the extension.
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-empty-object-type
|
|
53
|
+
export const Menus = Extension.create<{}, { menus: Menu[] }>({
|
|
54
|
+
name: "menus",
|
|
55
|
+
addStorage() {
|
|
56
|
+
return {
|
|
57
|
+
menus: []
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
addCommands() {
|
|
61
|
+
return {
|
|
62
|
+
enableMarkMenus: (): Command => ({ tr, dispatch }) => {
|
|
63
|
+
if (dispatch) {
|
|
64
|
+
tr.setMeta(menusPluginKey, {
|
|
65
|
+
canShow: true
|
|
66
|
+
})
|
|
67
|
+
}
|
|
68
|
+
return true
|
|
69
|
+
},
|
|
70
|
+
disableMarkMenus: (): Command => ({ tr, dispatch }) => {
|
|
71
|
+
if (dispatch) {
|
|
72
|
+
tr.setMeta(menusPluginKey, {
|
|
73
|
+
canShow: false
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
return true
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
registerMenu: <TPluginKey extends PluginKey<any>>(menu: Menu<TPluginKey>): Command => () => {
|
|
80
|
+
const menus = this.storage.menus
|
|
81
|
+
const existingIndex = menus.findIndex(m => m.name === menu.name)
|
|
82
|
+
if (existingIndex >= 0) {
|
|
83
|
+
// eslint-disable-next-line no-console
|
|
84
|
+
console.warn("Menu already registered, replacing.", {
|
|
85
|
+
existing: menus[existingIndex],
|
|
86
|
+
new: menu
|
|
87
|
+
})
|
|
88
|
+
menus.splice(existingIndex, 1, menu)
|
|
89
|
+
}
|
|
90
|
+
menus.push(menu)
|
|
91
|
+
menus.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0))
|
|
92
|
+
return true
|
|
93
|
+
},
|
|
94
|
+
unregisterMenu: (menu: Menu): Command => ({ tr }) => {
|
|
95
|
+
const menus = this.storage.menus
|
|
96
|
+
const index = menus.indexOf(menu)
|
|
97
|
+
if (index !== -1) {
|
|
98
|
+
menus.splice(index, 1)
|
|
99
|
+
tr.setMeta(menusPluginKey, { menus })
|
|
100
|
+
return true
|
|
101
|
+
}
|
|
102
|
+
return false
|
|
103
|
+
},
|
|
104
|
+
pinOpenMenu: (options: Pick<OpenMenuInfo, "name">): Command => ({ dispatch, tr, commands }) => {
|
|
105
|
+
const menus = this.storage.menus
|
|
106
|
+
const menu = menus.find(m => m.name === options.name)
|
|
107
|
+
if (!menu) {
|
|
108
|
+
// eslint-disable-next-line no-console
|
|
109
|
+
console.warn("Menu to open not found.", options)
|
|
110
|
+
return false
|
|
111
|
+
}
|
|
112
|
+
commands.closeOtherMenus(true)
|
|
113
|
+
if (dispatch) {
|
|
114
|
+
tr.setMeta(menusPluginKey, {
|
|
115
|
+
state: true,
|
|
116
|
+
pin: true,
|
|
117
|
+
menu
|
|
118
|
+
})
|
|
119
|
+
}
|
|
120
|
+
return true
|
|
121
|
+
},
|
|
122
|
+
closeOtherMenus: (forceUnpin: boolean = false): Command => ({ dispatch, tr, state, commands }) => {
|
|
123
|
+
const other = menusPluginKey.getState(state)
|
|
124
|
+
if (other?.pin && !forceUnpin) return false
|
|
125
|
+
const otherMenu = other?.menu
|
|
126
|
+
if (otherMenu?.closeCommand) {
|
|
127
|
+
commands[otherMenu.closeCommand]()
|
|
128
|
+
if (dispatch) {
|
|
129
|
+
tr.setMeta(menusPluginKey, {
|
|
130
|
+
state: false,
|
|
131
|
+
menu: undefined
|
|
132
|
+
})
|
|
133
|
+
}
|
|
134
|
+
return true
|
|
135
|
+
}
|
|
136
|
+
return false
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
addProseMirrorPlugins() {
|
|
141
|
+
const self = this
|
|
142
|
+
return [
|
|
143
|
+
new Plugin({
|
|
144
|
+
key: menusPluginKey,
|
|
145
|
+
state: {
|
|
146
|
+
init() {
|
|
147
|
+
return {
|
|
148
|
+
state: false,
|
|
149
|
+
pin: false,
|
|
150
|
+
canShow: true
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
apply: createStateOnlyPluginObjApply(menusPluginKey)
|
|
154
|
+
},
|
|
155
|
+
appendTransaction(trs, oldState, newState) {
|
|
156
|
+
const menuWasSetByTrs = trs.some(tr => tr.getMeta(menusPluginKey))
|
|
157
|
+
if (menuWasSetByTrs) return undefined
|
|
158
|
+
const menus = self.storage.menus
|
|
159
|
+
const activeMenu = getActiveMenu(menus, newState)
|
|
160
|
+
const value = menusPluginKey.getState(newState)
|
|
161
|
+
const valueWas = menusPluginKey.getState(oldState)
|
|
162
|
+
if (valueWas?.pin) { return undefined }
|
|
163
|
+
if (value?.state !== !!activeMenu || value?.menu?.name !== activeMenu?.name) {
|
|
164
|
+
return newState.tr.setMeta(menusPluginKey, {
|
|
165
|
+
state: !!activeMenu,
|
|
166
|
+
menu: activeMenu
|
|
167
|
+
? {
|
|
168
|
+
name: activeMenu.name,
|
|
169
|
+
type: activeMenu.type,
|
|
170
|
+
closeCommand: activeMenu.closeCommand
|
|
171
|
+
}
|
|
172
|
+
: undefined
|
|
173
|
+
})
|
|
174
|
+
}
|
|
175
|
+
return undefined
|
|
176
|
+
}
|
|
177
|
+
})
|
|
178
|
+
]
|
|
179
|
+
}
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
function getActiveMenu(menus: Menu[] | undefined, state: EditorState): Menu | undefined {
|
|
183
|
+
if (!menus) return undefined
|
|
184
|
+
for (const menu of menus) {
|
|
185
|
+
const menuState = menu.pluginKey.getState(state)
|
|
186
|
+
if (menuState === undefined) {
|
|
187
|
+
// eslint-disable-next-line no-console
|
|
188
|
+
console.warn("Menu plugin state is undefined. Did you register a plugin with this key?", menu.pluginKey, menu.name)
|
|
189
|
+
}
|
|
190
|
+
if (menu.canShow(state, menuState)) {
|
|
191
|
+
return menu
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return undefined
|
|
195
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<!-- @vue-expect-error -->
|
|
3
|
+
<WPopup
|
|
4
|
+
:model-value="!!activeMarkMenu"
|
|
5
|
+
:preferred-horizontal="['center-most']"
|
|
6
|
+
:preferred-vertical="['top-most']"
|
|
7
|
+
:modify-position="modifyPopupToMenuBounds"
|
|
8
|
+
:use-backdrop="false"
|
|
9
|
+
class="[&>div]:transition-[left,top] duration-30"
|
|
10
|
+
ref="popupComponent"
|
|
11
|
+
>
|
|
12
|
+
<template #popup="{ extractEl }">
|
|
13
|
+
<div
|
|
14
|
+
tabindex="0"
|
|
15
|
+
class="p-2"
|
|
16
|
+
:ref="_ => { extractEl(_); menuEl = _ as HTMLElement }"
|
|
17
|
+
@keydown.esc="close"
|
|
18
|
+
>
|
|
19
|
+
<component
|
|
20
|
+
v-if="menuRenderer?.component"
|
|
21
|
+
:editor="editor"
|
|
22
|
+
:is="menuRenderer.component"
|
|
23
|
+
ref="component"
|
|
24
|
+
v-bind="menuRenderer?.props?.(editor as any) ?? { editor }"
|
|
25
|
+
@close="close"
|
|
26
|
+
@copy="copy"
|
|
27
|
+
/>
|
|
28
|
+
</div>
|
|
29
|
+
</template>
|
|
30
|
+
</WPopup>
|
|
31
|
+
</template>
|
|
32
|
+
|
|
33
|
+
<script setup lang="ts">
|
|
34
|
+
import type { Editor } from "@tiptap/vue-3"
|
|
35
|
+
import WPopup from "@witchcraft/ui/components/LibPopup"
|
|
36
|
+
import { copy } from "@witchcraft/ui/helpers/copy"
|
|
37
|
+
import type { IPopupReference, PopupPositionModifier, SimpleDOMRect } from "@witchcraft/ui/types"
|
|
38
|
+
import {
|
|
39
|
+
computed,
|
|
40
|
+
inject,
|
|
41
|
+
nextTick,
|
|
42
|
+
ref,
|
|
43
|
+
useTemplateRef,
|
|
44
|
+
watch,
|
|
45
|
+
watchEffect
|
|
46
|
+
} from "vue"
|
|
47
|
+
|
|
48
|
+
import { findUpwards } from "../../../utils/findUpwards.js"
|
|
49
|
+
import { type MenuRenderInfo, menusInjectionKey, menusPluginKey } from "../types.js"
|
|
50
|
+
|
|
51
|
+
const props = withDefaults(defineProps<{
|
|
52
|
+
editor: Editor
|
|
53
|
+
}>(), {
|
|
54
|
+
})
|
|
55
|
+
const menus = inject(menusInjectionKey, ref({} as Record<string, MenuRenderInfo>))
|
|
56
|
+
|
|
57
|
+
const activeMarkMenu = ref<string | undefined>()
|
|
58
|
+
const menuRenderer = computed(() => {
|
|
59
|
+
if (!activeMarkMenu.value) return undefined
|
|
60
|
+
const menuCompInfo = menus?.value?.[activeMarkMenu.value]
|
|
61
|
+
return menuCompInfo
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
const popupComponent = useTemplateRef("popupComponent")
|
|
65
|
+
const menuEl = ref<HTMLElement | null>(null)
|
|
66
|
+
const virtualEditorEl = ref<IPopupReference | null>(null)
|
|
67
|
+
const virtualCursorEl = ref<IPopupReference | null>(null)
|
|
68
|
+
|
|
69
|
+
function virtualCursorGetBoundingClientRect(): SimpleDOMRect {
|
|
70
|
+
const opts = menuRenderer.value?.popupOptions
|
|
71
|
+
const selection = props.editor.state.selection
|
|
72
|
+
const doc = props.editor.state.doc
|
|
73
|
+
const $fromItem = findUpwards(doc, selection.from, $pos => $pos.node().type.name === "item")?.$pos
|
|
74
|
+
|
|
75
|
+
const end = props.editor.view.coordsAtPos(selection.to)
|
|
76
|
+
const start = props.editor.view.coordsAtPos(selection.from)
|
|
77
|
+
// attempt to pin to the top of the item if it's close enough
|
|
78
|
+
const itemStart = props.editor.view.coordsAtPos($fromItem?.pos ?? selection.from)
|
|
79
|
+
const pinToItemDistance = typeof opts?.pinToItemDistance === "function"
|
|
80
|
+
? opts?.pinToItemDistance(props.editor.state as any)
|
|
81
|
+
: opts?.pinToItemDistance ?? 0
|
|
82
|
+
// absolute just in case, doubts it's possible
|
|
83
|
+
const itemStartIsShortDistance = Math.abs(start.top - itemStart.top) < pinToItemDistance
|
|
84
|
+
|
|
85
|
+
const leftMost = Math.min(start.left, end.left)
|
|
86
|
+
const rightMost = Math.max(start.right, end.right)
|
|
87
|
+
const topMost = Math.min(start.top, end.top, itemStartIsShortDistance ? itemStart.top : Infinity)
|
|
88
|
+
const bottomMost = Math.max(start.bottom, end.bottom)
|
|
89
|
+
return {
|
|
90
|
+
x: leftMost,
|
|
91
|
+
y: topMost,
|
|
92
|
+
top: topMost,
|
|
93
|
+
bottom: bottomMost,
|
|
94
|
+
left: leftMost,
|
|
95
|
+
right: rightMost,
|
|
96
|
+
width: rightMost - leftMost,
|
|
97
|
+
height: bottomMost - topMost
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function virtualEditorGetBoundingClientRect(): SimpleDOMRect {
|
|
102
|
+
// constrain it horizontally to the editor
|
|
103
|
+
// but not vertically
|
|
104
|
+
// this is so we can later modify the position when we know the height of the menu
|
|
105
|
+
// so at most it's allowed to be one menu height above the editor unless it hit the window already (which is handled here)
|
|
106
|
+
// it being below shouldn't be a problem since we're using top-most positioning
|
|
107
|
+
// it's guarded against below anyways
|
|
108
|
+
const editorRect = props.editor.view.dom.getBoundingClientRect()
|
|
109
|
+
const bodyRect = document.body.getBoundingClientRect()
|
|
110
|
+
return {
|
|
111
|
+
x: editorRect.x,
|
|
112
|
+
left: editorRect.left,
|
|
113
|
+
right: editorRect.right,
|
|
114
|
+
width: editorRect.width,
|
|
115
|
+
|
|
116
|
+
y: 0,
|
|
117
|
+
top: 0,
|
|
118
|
+
bottom: bodyRect.bottom,
|
|
119
|
+
height: bodyRect.height
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const modifyPopupToMenuBounds: PopupPositionModifier = (pos, reference, popup, _bg, space) => {
|
|
124
|
+
const editorRect = props.editor.view.dom.closest(".editor-wrapper")?.getBoundingClientRect()
|
|
125
|
+
if (!editorRect) {
|
|
126
|
+
throw new Error("MarkMenuManager: The wrapping scrollable editor component must have the `editor-wrapper` class for mark menus to work as they need to know the position of the scrollable wrapper.")
|
|
127
|
+
}
|
|
128
|
+
const yMin = Math.max(editorRect.top - popup.height, 0)
|
|
129
|
+
if (pos.y < yMin) pos.y = yMin
|
|
130
|
+
|
|
131
|
+
// under no circumstances should the menu be over the cursor
|
|
132
|
+
// the popup menu algorithm doesn't allow for not covering the reference element
|
|
133
|
+
// so we manually stick it above/below
|
|
134
|
+
if (reference && pos.y + popup.height > reference.top) {
|
|
135
|
+
pos.y = space.bottom > space.top
|
|
136
|
+
? reference.bottom
|
|
137
|
+
: reference.top - popup.height
|
|
138
|
+
}
|
|
139
|
+
return pos
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function close(e?: Event): void {
|
|
143
|
+
e?.preventDefault()
|
|
144
|
+
props.editor.commands.closeOtherMenus()
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function documentRefocusBlur(e: Event) {
|
|
148
|
+
document.removeEventListener("focus", documentRefocusBlur)
|
|
149
|
+
checkMenuBlur(e)
|
|
150
|
+
}
|
|
151
|
+
function checkMenuBlur(e: Event) {
|
|
152
|
+
if ("relatedTarget" in e) {
|
|
153
|
+
// allow window to lose focus and menu to stay open if it was focused
|
|
154
|
+
// only blur if when we focus back we're outside the menu
|
|
155
|
+
if (e.relatedTarget === null) {
|
|
156
|
+
document.addEventListener("focus", documentRefocusBlur)
|
|
157
|
+
} else if (!menuEl.value?.contains(e.relatedTarget as Node)) {
|
|
158
|
+
close(e)
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
watchEffect(() => {
|
|
164
|
+
if (activeMarkMenu.value) {
|
|
165
|
+
document.addEventListener("click", checkMenuBlur)
|
|
166
|
+
virtualCursorEl.value = { getBoundingClientRect: virtualCursorGetBoundingClientRect }
|
|
167
|
+
popupComponent.value?.setReference(virtualCursorEl.value)
|
|
168
|
+
virtualEditorEl.value = { getBoundingClientRect: virtualEditorGetBoundingClientRect }
|
|
169
|
+
popupComponent.value?.setBackground(virtualEditorEl.value)
|
|
170
|
+
} else {
|
|
171
|
+
document.removeEventListener("click", checkMenuBlur)
|
|
172
|
+
virtualCursorEl.value = null
|
|
173
|
+
popupComponent.value?.setReference(virtualCursorEl.value!)
|
|
174
|
+
virtualEditorEl.value = null
|
|
175
|
+
popupComponent.value?.setBackground(virtualEditorEl.value)
|
|
176
|
+
}
|
|
177
|
+
})
|
|
178
|
+
const recompute = () => {
|
|
179
|
+
nextTick(() => {
|
|
180
|
+
popupComponent.value?.recompute()
|
|
181
|
+
})
|
|
182
|
+
}
|
|
183
|
+
function updateState() {
|
|
184
|
+
const state = menusPluginKey.getState(props.editor.state)
|
|
185
|
+
if (state?.menu?.type === "mark" && state.canShow) {
|
|
186
|
+
activeMarkMenu.value = state?.menu?.name
|
|
187
|
+
recompute()
|
|
188
|
+
} else {
|
|
189
|
+
activeMarkMenu.value = undefined
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// mmm feels weird when moving upwards
|
|
194
|
+
// const debouncedRecompute = throttle(recompute, 1000, { leading: true, trailing: true })
|
|
195
|
+
// menu is mounted once then hidden so we have to listen directly
|
|
196
|
+
// also tiptap's shouldShow does not work well
|
|
197
|
+
// hooking into transactions directly to avoid issues
|
|
198
|
+
watch(() => props.editor, (newVal, oldVal) => {
|
|
199
|
+
oldVal.off("transaction", updateState)
|
|
200
|
+
newVal.on("transaction", updateState)
|
|
201
|
+
})
|
|
202
|
+
props.editor.on("transaction", updateState)
|
|
203
|
+
</script>
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Editor } from "@tiptap/core"
|
|
2
|
+
import { type EditorState, PluginKey } from "@tiptap/pm/state"
|
|
3
|
+
import type { Component, InjectionKey, Ref } from "vue"
|
|
4
|
+
|
|
5
|
+
export interface MenuCloseCommands {
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Menus describe how to close them again with this key.
|
|
9
|
+
*
|
|
10
|
+
* It can be used by other menus to close any open menus before opening itself (see {@link closeOtherMenus}).
|
|
11
|
+
*
|
|
12
|
+
* The close command must not need to take any arguments.
|
|
13
|
+
*
|
|
14
|
+
* You can extend the `MenuCloseCommands` interface to add more commands.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export const menusPluginKey = new PluginKey<MenusPluginState>("menus")
|
|
18
|
+
export type MenusPluginState = {
|
|
19
|
+
state: boolean
|
|
20
|
+
menu?: OpenMenuInfo
|
|
21
|
+
pin: boolean
|
|
22
|
+
canShow: boolean
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface BaseMenu<
|
|
26
|
+
T extends PluginKey<any> | undefined = PluginKey<any> | undefined
|
|
27
|
+
> {
|
|
28
|
+
name: string
|
|
29
|
+
closeCommand: keyof MenuCloseCommands | undefined
|
|
30
|
+
type: "context" | "floating" | "mark"
|
|
31
|
+
pluginKey: T extends PluginKey<any> ? T : never
|
|
32
|
+
priority?: number
|
|
33
|
+
canShow: T extends PluginKey<any> ? (state: EditorState, pluginState: ReturnType<T["getState"]>) => boolean : never
|
|
34
|
+
}
|
|
35
|
+
export type OpenMenuInfo = Omit<BaseMenu, "pluginKey" | "canShow">
|
|
36
|
+
export interface ContextMenu<
|
|
37
|
+
T extends PluginKey<any> | undefined = PluginKey<any> | undefined
|
|
38
|
+
> extends BaseMenu<T> {
|
|
39
|
+
type: "context"
|
|
40
|
+
}
|
|
41
|
+
export interface FloatingMenu<
|
|
42
|
+
T extends PluginKey<any> | undefined = PluginKey<any> | undefined
|
|
43
|
+
> extends BaseMenu<T> {
|
|
44
|
+
type: "floating"
|
|
45
|
+
}
|
|
46
|
+
export interface MarkMenu<
|
|
47
|
+
T extends PluginKey<any> = PluginKey<any>
|
|
48
|
+
> extends BaseMenu<T> {
|
|
49
|
+
type: "mark"
|
|
50
|
+
}
|
|
51
|
+
export type Menu<T extends PluginKey<any> = PluginKey<any>> = MarkMenu<T> | FloatingMenu<T> | ContextMenu<T>
|
|
52
|
+
|
|
53
|
+
export type MenuRenderInfo = {
|
|
54
|
+
props?: (editor: Editor) => Record<string, any>
|
|
55
|
+
component: Component
|
|
56
|
+
popupOptions?: {
|
|
57
|
+
/**
|
|
58
|
+
* Attempts to pin the mark menu to the top of the item if the cursor is this close or less to it. Set to a number greater than zero or return a number greater than 0 to enable it.
|
|
59
|
+
*/
|
|
60
|
+
pinToItemDistance?: number | ((state: EditorState) => number)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export const menusInjectionKey = Symbol("menusInjectionKey") as InjectionKey<(Ref<Record<string, MenuRenderInfo>>)>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type Command, getNodeType } from "@tiptap/core"
|
|
2
|
+
import type { NodeType } from "@tiptap/pm/model"
|
|
3
|
+
|
|
4
|
+
declare module "@tiptap/core" {
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
6
|
+
interface Commands<ReturnType> {
|
|
7
|
+
tableEnter: {
|
|
8
|
+
/**
|
|
9
|
+
* Handles enter in a table. Splits the table at the next row, inserting a default item, or if it can't, after the table. Does not delete the selection as it's just weird since delete in a table just clears them.
|
|
10
|
+
*
|
|
11
|
+
* @redirectable
|
|
12
|
+
*/
|
|
13
|
+
tableEnter: (pos?: number) => ReturnType
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const tableEnter = (
|
|
19
|
+
tableTypesOrNames: (string | NodeType)[] = ["table", "tableRow", "tableCell", "tableHeader"],
|
|
20
|
+
itemTypeOrName: string | NodeType = "item"
|
|
21
|
+
) => (pos?: number): Command => ({ state, dispatch, tr }) => {
|
|
22
|
+
const itemType = getNodeType(itemTypeOrName, state.schema)
|
|
23
|
+
const tableType = tableTypesOrNames.map(name => getNodeType(name, state.schema))
|
|
24
|
+
const { $from, empty } = state.selection
|
|
25
|
+
const $pos = pos !== undefined ? tr.doc.resolve(pos) : $from
|
|
26
|
+
const parent = $pos.node(-1)
|
|
27
|
+
if (tableType.includes(parent.type)) {
|
|
28
|
+
const item = itemType.createAndFill()
|
|
29
|
+
if (!item) return false
|
|
30
|
+
if (dispatch) {
|
|
31
|
+
if (pos === undefined && !empty) {
|
|
32
|
+
// its just weird
|
|
33
|
+
// tr.delete($from.pos, $to.pos);
|
|
34
|
+
}
|
|
35
|
+
tr.insert($from.after(-2), item)
|
|
36
|
+
}
|
|
37
|
+
return true
|
|
38
|
+
}
|
|
39
|
+
return false
|
|
40
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Table as TiptapTable,
|
|
3
|
+
TableCell as TiptapTableCell,
|
|
4
|
+
TableHeader as TiptapTableHeader,
|
|
5
|
+
TableRow as TiptapTableRow
|
|
6
|
+
} from "@tiptap/extension-table"
|
|
7
|
+
|
|
8
|
+
import { tableEnter } from "./commands/tableEnter.js"
|
|
9
|
+
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
11
|
+
export const TableRow = TiptapTableRow.extend({
|
|
12
|
+
// force table rows to contain something, otherwise create and fill won't work as expected
|
|
13
|
+
content: "(tableCell | tableHeader)+",
|
|
14
|
+
addKeyboardShortcuts() {
|
|
15
|
+
return {}
|
|
16
|
+
}
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
20
|
+
export const TableCell = TiptapTableCell.extend({
|
|
21
|
+
content: "block",
|
|
22
|
+
addKeyboardShortcuts() {
|
|
23
|
+
return {}
|
|
24
|
+
}
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
28
|
+
export const TableHeader = TiptapTableHeader.extend({
|
|
29
|
+
content: "block",
|
|
30
|
+
addKeyboardShortcuts() {
|
|
31
|
+
return {}
|
|
32
|
+
}
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
36
|
+
export const Table = TiptapTable.extend({
|
|
37
|
+
addOptions() {
|
|
38
|
+
return {
|
|
39
|
+
...(this as any).parent?.(),
|
|
40
|
+
resizable: true,
|
|
41
|
+
lastColumnResizable: false
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
addCommands() {
|
|
45
|
+
return {
|
|
46
|
+
tableEnter: tableEnter()
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
addKeyboardShortcuts() {
|
|
50
|
+
return {}
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
55
|
+
export const TableExtensions = [Table, TableRow, TableCell, TableHeader]
|
|
56
|
+
|
|
57
|
+
export type NodeTableName = "table"
|
|
58
|
+
export type NodeTableRowName = "tableRow"
|
|
59
|
+
export type NodeTableCellName = "tableCell"
|
|
60
|
+
export type NodeTableHeaderName = "tableHeader"
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { type EditorOptions, type Extension, getSchema, type Mark, type Node } from "@tiptap/core"
|
|
2
|
+
import { Bold } from "@tiptap/extension-bold"
|
|
3
|
+
import { Code } from "@tiptap/extension-code"
|
|
4
|
+
import { Dropcursor } from "@tiptap/extension-dropcursor"
|
|
5
|
+
import { Gapcursor } from "@tiptap/extension-gapcursor"
|
|
6
|
+
import { Italic } from "@tiptap/extension-italic"
|
|
7
|
+
import { Paragraph } from "@tiptap/extension-paragraph"
|
|
8
|
+
import { Strike } from "@tiptap/extension-strike"
|
|
9
|
+
import { Subscript } from "@tiptap/extension-subscript"
|
|
10
|
+
import { Superscript } from "@tiptap/extension-superscript"
|
|
11
|
+
import { Text } from "@tiptap/extension-text"
|
|
12
|
+
import { Underline } from "@tiptap/extension-underline"
|
|
13
|
+
import type { Schema } from "@tiptap/pm/model"
|
|
14
|
+
|
|
15
|
+
import { Base } from "./features/Base/Base.js"
|
|
16
|
+
import { Blockquote, Cite, type NodeBlockquoteName, type NodeCiteName } from "./features/Blockquote/Blockquote.js"
|
|
17
|
+
import { Item, type NodeItemName } from "./features/Blocks/Item.js"
|
|
18
|
+
import { List, type NodeListName } from "./features/Blocks/List.js"
|
|
19
|
+
import { CodeBlock, type NodeCodeBlockName } from "./features/CodeBlock/CodeBlock.js"
|
|
20
|
+
import { CommandBar } from "./features/CommandsMenus/CommandBar.js"
|
|
21
|
+
import { Document, type NodeDocumentName } from "./features/Document/Document.js"
|
|
22
|
+
import { EmbeddedDocument, type NodeEmbeddedDocumentName } from "./features/EmbeddedDocument/EmbeddedDocument.js"
|
|
23
|
+
import { HardBreak } from "./features/HardBreak/HardBreak.js"
|
|
24
|
+
import { Heading, type NodeHeadingName } from "./features/Heading/Heading.js"
|
|
25
|
+
import { Highlight, type MarkHighlightName } from "./features/Highlight/Highlight.js"
|
|
26
|
+
import { History } from "./features/History/History.js"
|
|
27
|
+
import { Iframe, type NodeIframeName } from "./features/Iframe/Iframe.js"
|
|
28
|
+
import { Image } from "./features/Image/Image.js"
|
|
29
|
+
import { Link } from "./features/Link/Link.js"
|
|
30
|
+
import { Menus } from "./features/Menus/Menus.js"
|
|
31
|
+
import { type NodeTableCellName, type NodeTableHeaderName, type NodeTableName, type NodeTableRowName, TableExtensions } from "./features/Tables/index.js"
|
|
32
|
+
|
|
33
|
+
function stripShortcuts<T extends Node | Mark | Extension>(c: T): T {
|
|
34
|
+
return c.extend({
|
|
35
|
+
addKeyboardShortcuts() {
|
|
36
|
+
return {}
|
|
37
|
+
}
|
|
38
|
+
}) as any
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const extensions: EditorOptions["extensions"] = [
|
|
42
|
+
Document,
|
|
43
|
+
Gapcursor,
|
|
44
|
+
Dropcursor,
|
|
45
|
+
// custom
|
|
46
|
+
stripShortcuts(Paragraph.extend({
|
|
47
|
+
group: "block"
|
|
48
|
+
})),
|
|
49
|
+
CommandBar,
|
|
50
|
+
Base,
|
|
51
|
+
List,
|
|
52
|
+
Item,
|
|
53
|
+
Heading,
|
|
54
|
+
CodeBlock,
|
|
55
|
+
Iframe,
|
|
56
|
+
EmbeddedDocument,
|
|
57
|
+
Link, // needs to be before other marks so we don't get link splitting
|
|
58
|
+
HardBreak,
|
|
59
|
+
Image,
|
|
60
|
+
Highlight,
|
|
61
|
+
...TableExtensions,
|
|
62
|
+
...[
|
|
63
|
+
|
|
64
|
+
// do not use configured extensions here
|
|
65
|
+
// see https://github.com/ueberdosis/tiptap/issues/4081
|
|
66
|
+
|
|
67
|
+
Text,
|
|
68
|
+
// styling
|
|
69
|
+
Blockquote,
|
|
70
|
+
Cite,
|
|
71
|
+
Code,
|
|
72
|
+
Italic,
|
|
73
|
+
Underline,
|
|
74
|
+
Strike,
|
|
75
|
+
Subscript,
|
|
76
|
+
Superscript,
|
|
77
|
+
|
|
78
|
+
Bold,
|
|
79
|
+
// embedding
|
|
80
|
+
// other
|
|
81
|
+
History
|
|
82
|
+
].map(e => stripShortcuts(e)),
|
|
83
|
+
Menus
|
|
84
|
+
]
|
|
85
|
+
|
|
86
|
+
// mostly for the test builder, so we can have proper typing
|
|
87
|
+
// though the tests should use the full testExtensions
|
|
88
|
+
type NodeParagraphName = "paragraph"
|
|
89
|
+
type NodeTextName = "text"
|
|
90
|
+
type MarkHardBreakName = "hardBreak"
|
|
91
|
+
type MarkUnderlineName = "underline"
|
|
92
|
+
type MarkStrikeName = "strike"
|
|
93
|
+
type MarkSubscriptName = "subscript"
|
|
94
|
+
type MarkSuperscriptName = "superscript"
|
|
95
|
+
type MarkCodeName = "code"
|
|
96
|
+
type MarkItalicName = "italic"
|
|
97
|
+
type MarkBoldName = "bold"
|
|
98
|
+
type NodeImageName = "image"
|
|
99
|
+
|
|
100
|
+
const _schema = getSchema(extensions) as Schema<
|
|
101
|
+
NodeListName
|
|
102
|
+
| NodeItemName
|
|
103
|
+
| NodeHeadingName
|
|
104
|
+
| NodeDocumentName
|
|
105
|
+
| NodeCodeBlockName
|
|
106
|
+
| NodeIframeName
|
|
107
|
+
| NodeEmbeddedDocumentName
|
|
108
|
+
| NodeParagraphName
|
|
109
|
+
| NodeTextName
|
|
110
|
+
| NodeImageName
|
|
111
|
+
| NodeTableName
|
|
112
|
+
| NodeTableHeaderName
|
|
113
|
+
| NodeTableRowName
|
|
114
|
+
| NodeTableCellName
|
|
115
|
+
| NodeBlockquoteName
|
|
116
|
+
| NodeCiteName,
|
|
117
|
+
| MarkHardBreakName
|
|
118
|
+
| MarkHighlightName
|
|
119
|
+
| MarkUnderlineName
|
|
120
|
+
| MarkStrikeName
|
|
121
|
+
| MarkSubscriptName
|
|
122
|
+
| MarkSuperscriptName
|
|
123
|
+
| MarkCodeName
|
|
124
|
+
| MarkItalicName
|
|
125
|
+
| MarkBoldName
|
|
126
|
+
| MarkHighlightName
|
|
127
|
+
>
|
|
128
|
+
export const schema = _schema
|