From 2adc6a60d21a1da92897b9a5a692f5e28d46cf37 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sat, 2 Aug 2025 19:09:06 -0700 Subject: [PATCH 01/21] Tiptap3 migration - WIP --- .../components/bubble-menu/bubble-menu.tsx | 19 +- .../components/callout/callout-menu.tsx | 22 +- .../components/code-block/code-block-view.tsx | 1 + .../editor/components/drawio/drawio-menu.tsx | 51 +- .../editor/components/drawio/drawio-view.tsx | 1 + .../components/excalidraw/excalidraw-menu.tsx | 53 +- .../components/excalidraw/excalidraw-view.tsx | 1 + .../editor/components/image/image-menu.tsx | 23 +- .../editor/components/link/link-menu.tsx | 14 +- .../components/mention/mention-list.tsx | 1 + .../components/mention/mention-suggestion.ts | 1 + .../search-and-replace-dialog.tsx | 2 + .../components/slash-menu/menu-items.ts | 3 + .../components/table/table-cell-menu.tsx | 17 +- .../editor/components/table/table-menu.tsx | 52 +- .../editor/components/video/video-menu.tsx | 23 +- .../features/editor/extensions/extensions.ts | 28 +- .../src/features/editor/page-editor.tsx | 39 +- .../page-history/components/history-list.tsx | 2 +- .../collaboration/collaboration.gateway.ts | 4 +- .../src/collaboration/collaboration.util.ts | 5 +- .../extensions/authentication.extension.ts | 2 +- package.json | 73 +- .../editor-ext/src/lib/custom-code-block.ts | 81 -- .../custom-code-block/custom-code-block.ts | 106 ++ .../src/lib/custom-code-block/index.ts | 1 + .../lib/custom-code-block/lowlight-plugin.ts | 159 +++ .../editor-ext/src/lib/details/details.ts | 1 + .../search-and-replace/search-and-replace.ts | 34 +- packages/editor-ext/src/lib/table/cell.ts | 15 +- packages/editor-ext/src/lib/table/header.ts | 2 +- packages/editor-ext/src/lib/table/row.ts | 2 +- packages/editor-ext/src/lib/table/table.ts | 20 +- packages/editor-ext/src/lib/utils.ts | 6 +- pnpm-lock.yaml | 1002 ++++++++--------- 35 files changed, 983 insertions(+), 883 deletions(-) delete mode 100644 packages/editor-ext/src/lib/custom-code-block.ts create mode 100644 packages/editor-ext/src/lib/custom-code-block/custom-code-block.ts create mode 100644 packages/editor-ext/src/lib/custom-code-block/index.ts create mode 100644 packages/editor-ext/src/lib/custom-code-block/lowlight-plugin.ts diff --git a/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx b/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx index 3b7692f4..67cae1a7 100644 --- a/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx +++ b/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx @@ -1,9 +1,5 @@ -import { - BubbleMenu, - BubbleMenuProps, - isNodeSelection, - useEditor, -} from "@tiptap/react"; +import { BubbleMenu, BubbleMenuProps } from "@tiptap/react/menus"; +import { isNodeSelection, useEditor } from "@tiptap/react"; import { FC, useEffect, useRef, useState } from "react"; import { IconBold, @@ -114,14 +110,9 @@ export const EditorBubbleMenu: FC = (props) => { } return isTextSelected(editor); }, - tippyOptions: { - moveTransition: "transform 0.15s ease-out", - onCreate: (instance) => { - instance.popper.firstChild?.addEventListener("blur", (event) => { - event.preventDefault(); - event.stopImmediatePropagation(); - }); - }, + options: { + placement: "top", + offset: 8, onHide: () => { setIsNodeSelectorOpen(false); setIsTextAlignmentOpen(false); diff --git a/apps/client/src/features/editor/components/callout/callout-menu.tsx b/apps/client/src/features/editor/components/callout/callout-menu.tsx index 56dea233..843afbd8 100644 --- a/apps/client/src/features/editor/components/callout/callout-menu.tsx +++ b/apps/client/src/features/editor/components/callout/callout-menu.tsx @@ -1,8 +1,5 @@ -import { - BubbleMenu as BaseBubbleMenu, - findParentNode, - posToDOMRect, -} from "@tiptap/react"; +import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; +import { findParentNode, posToDOMRect } from "@tiptap/react"; import React, { useCallback } from "react"; import { Node as PMNode } from "prosemirror-model"; import { @@ -55,20 +52,17 @@ export function CalloutMenu({ editor }: EditorMenuProps) { }, [editor], ); - return ( diff --git a/apps/client/src/features/editor/components/code-block/code-block-view.tsx b/apps/client/src/features/editor/components/code-block/code-block-view.tsx index 07ad2ad0..130016a3 100644 --- a/apps/client/src/features/editor/components/code-block/code-block-view.tsx +++ b/apps/client/src/features/editor/components/code-block/code-block-view.tsx @@ -90,6 +90,7 @@ export default function CodeBlockView(props: NodeViewProps) { node.textContent.length > 0 } > + {/* @ts-ignore */} diff --git a/apps/client/src/features/editor/components/drawio/drawio-menu.tsx b/apps/client/src/features/editor/components/drawio/drawio-menu.tsx index 76771b10..afa7dd58 100644 --- a/apps/client/src/features/editor/components/drawio/drawio-menu.tsx +++ b/apps/client/src/features/editor/components/drawio/drawio-menu.tsx @@ -1,16 +1,12 @@ -import { - BubbleMenu as BaseBubbleMenu, - findParentNode, - posToDOMRect, -} from '@tiptap/react'; -import { useCallback } from 'react'; -import { sticky } from 'tippy.js'; -import { Node as PMNode } from 'prosemirror-model'; +import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; +import { findParentNode, posToDOMRect } from "@tiptap/react"; +import { useCallback } from "react"; +import { Node as PMNode } from "prosemirror-model"; import { EditorMenuProps, ShouldShowProps, -} from '@/features/editor/components/table/types/types.ts'; -import { NodeWidthResize } from '@/features/editor/components/common/node-width-resize.tsx'; +} from "@/features/editor/components/table/types/types.ts"; +import { NodeWidthResize } from "@/features/editor/components/common/node-width-resize.tsx"; export function DrawioMenu({ editor }: EditorMenuProps) { const shouldShow = useCallback( @@ -19,14 +15,14 @@ export function DrawioMenu({ editor }: EditorMenuProps) { return false; } - return editor.isActive('drawio') && editor.getAttributes('drawio')?.src; + return editor.isActive("drawio") && editor.getAttributes("drawio")?.src; }, - [editor] + [editor], ); const getReferenceClientRect = useCallback(() => { const { selection } = editor.state; - const predicate = (node: PMNode) => node.type.name === 'drawio'; + const predicate = (node: PMNode) => node.type.name === "drawio"; const parent = findParentNode(predicate)(selection); if (parent) { @@ -39,9 +35,9 @@ export function DrawioMenu({ editor }: EditorMenuProps) { const onWidthChange = useCallback( (value: number) => { - editor.commands.updateAttributes('drawio', { width: `${value}%` }); + editor.commands.updateAttributes("drawio", { width: `${value}%` }); }, - [editor] + [editor], ); return ( @@ -49,29 +45,26 @@ export function DrawioMenu({ editor }: EditorMenuProps) { editor={editor} pluginKey={`drawio-menu}`} updateDelay={0} - tippyOptions={{ - getReferenceClientRect, - offset: [0, 8], - zIndex: 99, - popperOptions: { - modifiers: [{ name: 'flip', enabled: false }], - }, - plugins: [sticky], - sticky: 'popper', + options={{ + //getReferenceClientRect, + placement: "bottom", + offset: 8, + // zIndex: 99, + flip: false, }} shouldShow={shouldShow} >
- {editor.getAttributes('drawio')?.width && ( + {editor.getAttributes("drawio")?.width && ( )}
diff --git a/apps/client/src/features/editor/components/drawio/drawio-view.tsx b/apps/client/src/features/editor/components/drawio/drawio-view.tsx index 468e26a0..ce61b9e2 100644 --- a/apps/client/src/features/editor/components/drawio/drawio-view.tsx +++ b/apps/client/src/features/editor/components/drawio/drawio-view.tsx @@ -66,6 +66,7 @@ export default function DrawioView(props: NodeViewProps) { const fileName = "diagram.drawio.svg"; const drawioSVGFile = await svgStringToFile(svgString, fileName); + //@ts-ignore const pageId = editor.storage?.pageId; let attachment: IAttachment = null; diff --git a/apps/client/src/features/editor/components/excalidraw/excalidraw-menu.tsx b/apps/client/src/features/editor/components/excalidraw/excalidraw-menu.tsx index 5672e4f8..0e82e86d 100644 --- a/apps/client/src/features/editor/components/excalidraw/excalidraw-menu.tsx +++ b/apps/client/src/features/editor/components/excalidraw/excalidraw-menu.tsx @@ -1,16 +1,12 @@ -import { - BubbleMenu as BaseBubbleMenu, - findParentNode, - posToDOMRect, -} from '@tiptap/react'; -import { useCallback } from 'react'; -import { sticky } from 'tippy.js'; -import { Node as PMNode } from 'prosemirror-model'; +import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; +import { findParentNode, posToDOMRect } from "@tiptap/react"; +import { useCallback } from "react"; +import { Node as PMNode } from "prosemirror-model"; import { EditorMenuProps, ShouldShowProps, -} from '@/features/editor/components/table/types/types.ts'; -import { NodeWidthResize } from '@/features/editor/components/common/node-width-resize.tsx'; +} from "@/features/editor/components/table/types/types.ts"; +import { NodeWidthResize } from "@/features/editor/components/common/node-width-resize.tsx"; export function ExcalidrawMenu({ editor }: EditorMenuProps) { const shouldShow = useCallback( @@ -19,14 +15,16 @@ export function ExcalidrawMenu({ editor }: EditorMenuProps) { return false; } - return editor.isActive('excalidraw') && editor.getAttributes('excalidraw')?.src; + return ( + editor.isActive("excalidraw") && editor.getAttributes("excalidraw")?.src + ); }, - [editor] + [editor], ); const getReferenceClientRect = useCallback(() => { const { selection } = editor.state; - const predicate = (node: PMNode) => node.type.name === 'excalidraw'; + const predicate = (node: PMNode) => node.type.name === "excalidraw"; const parent = findParentNode(predicate)(selection); if (parent) { @@ -39,9 +37,9 @@ export function ExcalidrawMenu({ editor }: EditorMenuProps) { const onWidthChange = useCallback( (value: number) => { - editor.commands.updateAttributes('excalidraw', { width: `${value}%` }); + editor.commands.updateAttributes("excalidraw", { width: `${value}%` }); }, - [editor] + [editor], ); return ( @@ -49,29 +47,26 @@ export function ExcalidrawMenu({ editor }: EditorMenuProps) { editor={editor} pluginKey={`excalidraw-menu}`} updateDelay={0} - tippyOptions={{ - getReferenceClientRect, - offset: [0, 8], - zIndex: 99, - popperOptions: { - modifiers: [{ name: 'flip', enabled: false }], - }, - plugins: [sticky], - sticky: 'popper', + options={{ + //getReferenceClientRect, + placement: "bottom", + offset: 8, + // zIndex: 99, + flip: false, }} shouldShow={shouldShow} >
- {editor.getAttributes('excalidraw')?.width && ( + {editor.getAttributes("excalidraw")?.width && ( )}
diff --git a/apps/client/src/features/editor/components/excalidraw/excalidraw-view.tsx b/apps/client/src/features/editor/components/excalidraw/excalidraw-view.tsx index d898e5a2..0f48b0bb 100644 --- a/apps/client/src/features/editor/components/excalidraw/excalidraw-view.tsx +++ b/apps/client/src/features/editor/components/excalidraw/excalidraw-view.tsx @@ -98,6 +98,7 @@ export default function ExcalidrawView(props: NodeViewProps) { const fileName = "diagram.excalidraw.svg"; const excalidrawSvgFile = await svgStringToFile(svgString, fileName); + // @ts-ignore const pageId = editor.storage?.pageId; let attachment: IAttachment = null; diff --git a/apps/client/src/features/editor/components/image/image-menu.tsx b/apps/client/src/features/editor/components/image/image-menu.tsx index abb1c1ca..59599b79 100644 --- a/apps/client/src/features/editor/components/image/image-menu.tsx +++ b/apps/client/src/features/editor/components/image/image-menu.tsx @@ -1,10 +1,6 @@ -import { - BubbleMenu as BaseBubbleMenu, - findParentNode, - posToDOMRect, -} from "@tiptap/react"; +import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; +import { findParentNode, posToDOMRect } from "@tiptap/react"; import React, { useCallback } from "react"; -import { sticky } from "tippy.js"; import { Node as PMNode } from "prosemirror-model"; import { EditorMenuProps, @@ -85,15 +81,12 @@ export function ImageMenu({ editor }: EditorMenuProps) { editor={editor} pluginKey={`image-menu}`} updateDelay={0} - tippyOptions={{ - getReferenceClientRect, - offset: [0, 8], - zIndex: 99, - popperOptions: { - modifiers: [{ name: "flip", enabled: false }], - }, - plugins: [sticky], - sticky: "popper", + options={{ + // getReferenceClientRect, + placement: "bottom", + offset: 8, + //zIndex: 99, + flip: false, }} shouldShow={shouldShow} > diff --git a/apps/client/src/features/editor/components/link/link-menu.tsx b/apps/client/src/features/editor/components/link/link-menu.tsx index 7cdd2f0f..041e5c3d 100644 --- a/apps/client/src/features/editor/components/link/link-menu.tsx +++ b/apps/client/src/features/editor/components/link/link-menu.tsx @@ -1,4 +1,5 @@ -import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react"; +import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; +import { offset } from "@floating-ui/dom"; import React, { useCallback, useState } from "react"; import { EditorMenuProps } from "@/features/editor/components/table/types/types.ts"; import { LinkEditorPanel } from "@/features/editor/components/link/link-editor-panel.tsx"; @@ -50,16 +51,13 @@ export function LinkMenu({ editor, appendTo }: EditorMenuProps) { editor={editor} pluginKey={`link-menu}`} updateDelay={0} - tippyOptions={{ - appendTo: () => { - return appendTo?.current; - }, - onHidden: () => { + options={{ + onHide: () => { setShowEdit(false); }, placement: "bottom", - offset: [0, 5], - zIndex: 101, + offset: 5, + // zIndex: 101, }} shouldShow={shouldShow} > diff --git a/apps/client/src/features/editor/components/mention/mention-list.tsx b/apps/client/src/features/editor/components/mention/mention-list.tsx index 389c2ce5..0bd95597 100644 --- a/apps/client/src/features/editor/components/mention/mention-list.tsx +++ b/apps/client/src/features/editor/components/mention/mention-list.tsx @@ -106,6 +106,7 @@ const MentionList = forwardRef((props, ref) => { setRenderItems(items); // update editor storage + //@ts-ignore props.editor.storage.mentionItems = items; } }, [suggestion, isLoading]); diff --git a/apps/client/src/features/editor/components/mention/mention-suggestion.ts b/apps/client/src/features/editor/components/mention/mention-suggestion.ts index 11710639..fe2adf26 100644 --- a/apps/client/src/features/editor/components/mention/mention-suggestion.ts +++ b/apps/client/src/features/editor/components/mention/mention-suggestion.ts @@ -73,6 +73,7 @@ const mentionRenderItems = () => { // destroy component if space is greater 3 without a match if ( whitespaceCount > 3 && + //@ts-ignore props.editor.storage.mentionItems.length === 0 ) { popup?.[0]?.destroy(); diff --git a/apps/client/src/features/editor/components/search-and-replace/search-and-replace-dialog.tsx b/apps/client/src/features/editor/components/search-and-replace/search-and-replace-dialog.tsx index df6f0031..f5c17661 100644 --- a/apps/client/src/features/editor/components/search-and-replace/search-and-replace-dialog.tsx +++ b/apps/client/src/features/editor/components/search-and-replace/search-and-replace-dialog.tsx @@ -73,6 +73,8 @@ function SearchAndReplaceDialog({ editor, editable = true }: PageFindDialogDialo if (!editor) return; const { results, resultIndex } = editor.storage.searchAndReplace; + //TODO: check type error + //@ts-ignore const position: Range = results[resultIndex]; if (!position) return; diff --git a/apps/client/src/features/editor/components/slash-menu/menu-items.ts b/apps/client/src/features/editor/components/slash-menu/menu-items.ts index 42bed5c1..6e6d5c33 100644 --- a/apps/client/src/features/editor/components/slash-menu/menu-items.ts +++ b/apps/client/src/features/editor/components/slash-menu/menu-items.ts @@ -159,6 +159,7 @@ const CommandGroups: SlashMenuGroupedItemsType = { command: ({ editor, range }) => { editor.chain().focus().deleteRange(range).run(); + // @ts-ignore const pageId = editor.storage?.pageId; if (!pageId) return; @@ -186,6 +187,7 @@ const CommandGroups: SlashMenuGroupedItemsType = { command: ({ editor, range }) => { editor.chain().focus().deleteRange(range).run(); + // @ts-ignore const pageId = editor.storage?.pageId; if (!pageId) return; @@ -211,6 +213,7 @@ const CommandGroups: SlashMenuGroupedItemsType = { command: ({ editor, range }) => { editor.chain().focus().deleteRange(range).run(); + // @ts-ignore const pageId = editor.storage?.pageId; if (!pageId) return; diff --git a/apps/client/src/features/editor/components/table/table-cell-menu.tsx b/apps/client/src/features/editor/components/table/table-cell-menu.tsx index 2ea2e8dd..593f76b1 100644 --- a/apps/client/src/features/editor/components/table/table-cell-menu.tsx +++ b/apps/client/src/features/editor/components/table/table-cell-menu.tsx @@ -1,4 +1,4 @@ -import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react"; +import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; import React, { useCallback } from "react"; import { @@ -57,19 +57,20 @@ export const TableCellMenu = React.memo( editor={editor} pluginKey="table-cell-menu" updateDelay={0} - tippyOptions={{ - appendTo: () => { - return appendTo?.current; - }, - offset: [0, 15], - zIndex: 99, + options={{ + //appendTo: () => { + // return appendTo?.current; + // }, + placement: "bottom", + offset: 15, + //zIndex: 99, }} shouldShow={shouldShow} > - + - + - + - + diff --git a/apps/client/src/features/editor/extensions/extensions.ts b/apps/client/src/features/editor/extensions/extensions.ts index 922bcd59..09430ce8 100644 --- a/apps/client/src/features/editor/extensions/extensions.ts +++ b/apps/client/src/features/editor/extensions/extensions.ts @@ -1,9 +1,13 @@ import { StarterKit } from "@tiptap/starter-kit"; -import { Placeholder } from "@tiptap/extension-placeholder"; import { TextAlign } from "@tiptap/extension-text-align"; -import { TaskList } from "@tiptap/extension-task-list"; -import { TaskItem } from "@tiptap/extension-task-item"; -import { Underline } from "@tiptap/extension-underline"; +import { + TaskList, + TaskItem, +} from "@tiptap/extension-list"; +import { + Placeholder, + CharacterCount, +} from "@tiptap/extensions"; import { Superscript } from "@tiptap/extension-superscript"; import SubScript from "@tiptap/extension-subscript"; import { Highlight } from "@tiptap/extension-highlight"; @@ -12,7 +16,7 @@ import { TextStyle } from "@tiptap/extension-text-style"; import { Color } from "@tiptap/extension-color"; import SlashCommand from "@/features/editor/extensions/slash-command"; import { Collaboration } from "@tiptap/extension-collaboration"; -import { CollaborationCursor } from "@tiptap/extension-collaboration-cursor"; +import { CollaborationCaret } from "@tiptap/extension-collaboration-caret"; import { HocuspocusProvider } from "@hocuspocus/provider"; import { Comment, @@ -73,7 +77,6 @@ import MentionView from "@/features/editor/components/mention/mention-view.tsx"; import i18n from "@/i18n.ts"; import { MarkdownClipboard } from "@/features/editor/extensions/markdown-clipboard.ts"; import EmojiCommand from "./emoji-command"; -import { CharacterCount } from "@tiptap/extension-character-count"; import { countWords } from "alfaaz"; const lowlight = createLowlight(common); @@ -90,7 +93,7 @@ lowlight.register("scala", scala); export const mainExtensions = [ StarterKit.configure({ - history: false, + undoRedo: false, dropcursor: { width: 3, color: "#70CFF8", @@ -101,6 +104,8 @@ export const mainExtensions = [ spellcheck: false, }, }, + link: false, + trailingNode: false, }), Placeholder.configure({ placeholder: ({ node }) => { @@ -122,7 +127,6 @@ export const mainExtensions = [ TaskItem.configure({ nested: true, }), - Underline, LinkExtension.configure({ openOnClick: false, }), @@ -221,17 +225,17 @@ export const mainExtensions = [ SearchAndReplace.extend({ addKeyboardShortcuts() { return { - 'Mod-f': () => { + "Mod-f": () => { const event = new CustomEvent("openFindDialogFromEditor", {}); document.dispatchEvent(event); return true; }, - 'Escape': () => { + Escape: () => { const event = new CustomEvent("closeFindDialogFromEditor", {}); document.dispatchEvent(event); return true; }, - } + }; }, }).configure(), ] as any; @@ -242,7 +246,7 @@ export const collabExtensions: CollabExtensions = (provider, user) => [ Collaboration.configure({ document: provider.document, }), - CollaborationCursor.configure({ + CollaborationCaret.configure({ provider, user: { name: user.name, diff --git a/apps/client/src/features/editor/page-editor.tsx b/apps/client/src/features/editor/page-editor.tsx index 5d88b208..d8036333 100644 --- a/apps/client/src/features/editor/page-editor.tsx +++ b/apps/client/src/features/editor/page-editor.tsx @@ -75,7 +75,7 @@ export default function PageEditor({ const [isLocalSynced, setLocalSynced] = useState(false); const [isRemoteSynced, setRemoteSynced] = useState(false); const [yjsConnectionStatus, setYjsConnectionStatus] = useAtom( - yjsConnectionStatusAtom + yjsConnectionStatusAtom, ); const menuContainerRef = useRef(null); const documentName = `page.${pageId}`; @@ -100,6 +100,7 @@ export default function PageEditor({ // Track when collaborative provider is ready and synced const [collabReady, setCollabReady] = useState(false); + /* useEffect(() => { if ( remoteProvider?.status === WebSocketStatus.Connected && @@ -109,6 +110,7 @@ export default function PageEditor({ setCollabReady(true); } }, [remoteProvider?.status, isLocalSynced, isRemoteSynced]); + */ useEffect(() => { if (!providersRef.current) { @@ -119,8 +121,8 @@ export default function PageEditor({ url: collaborationURL, document: ydoc, token: collabQuery?.token, - connect: true, - preserveConnection: false, + //connect: true, + //preserveConnection: false, onAuthenticationFailed: (auth: onAuthenticationFailedParameters) => { const payload = jwtDecode(collabQuery?.token); const now = Date.now().valueOf() / 1000; @@ -137,11 +139,11 @@ export default function PageEditor({ }); } }, - onStatus: (status) => { - if (status.status === "connected") { - setYjsConnectionStatus(status.status); - } - }, + //onStatus: (status) => { + // if (status.status === "connected") { + // setYjsConnectionStatus(status.status); + // } + // }, }); remote.on("synced", () => setRemoteSynced(true)); remote.on("disconnect", () => { @@ -176,13 +178,14 @@ export default function PageEditor({ */ // Only connect/disconnect on tab/idle, not destroy + /* useEffect(() => { if (!providersReady || !providersRef.current) return; const remoteProvider = providersRef.current.remote; if ( isIdle && documentState === "hidden" && - remoteProvider.status === WebSocketStatus.Connected + remoteProvider === WebSocketStatus.Connected ) { remoteProvider.disconnect(); setIsCollabReady(false); @@ -197,6 +200,7 @@ export default function PageEditor({ setTimeout(() => setIsCollabReady(true), 500); } }, [isIdle, documentState, providersReady, resetIdle]); + */ const extensions = useMemo(() => { if (!remoteProvider || !currentUser?.user) return mainExtensions; @@ -217,7 +221,7 @@ export default function PageEditor({ scrollMargin: 80, handleDOMEvents: { keydown: (_view, event) => { - if ((event.ctrlKey || event.metaKey) && event.code === 'KeyS') { + if ((event.ctrlKey || event.metaKey) && event.code === "KeyS") { event.preventDefault(); return true; } @@ -252,6 +256,7 @@ export default function PageEditor({ if (editor) { // @ts-ignore setEditor(editor); + // @ts-ignore editor.storage.pageId = pageId; } }, @@ -262,7 +267,7 @@ export default function PageEditor({ debouncedUpdateContent(editorJson); }, }, - [pageId, editable, remoteProvider] + [pageId, editable, remoteProvider], ); const debouncedUpdateContent = useDebouncedCallback((newContent: any) => { @@ -300,7 +305,7 @@ export default function PageEditor({ return () => { document.removeEventListener( "ACTIVE_COMMENT_EVENT", - handleActiveCommentEvent + handleActiveCommentEvent, ); }; }, []); @@ -311,6 +316,7 @@ export default function PageEditor({ setAsideState({ tab: "", isAsideOpen: false }); }, [pageId]); + /* useEffect(() => { if (remoteProvider?.status === WebSocketStatus.Connecting) { const timeout = setTimeout(() => { @@ -319,9 +325,10 @@ export default function PageEditor({ return () => clearTimeout(timeout); } }, [remoteProvider?.status]); - +*/ const isSynced = isLocalSynced && isRemoteSynced; + /* useEffect(() => { const collabReadyTimeout = setTimeout(() => { if ( @@ -334,6 +341,7 @@ export default function PageEditor({ }, 500); return () => clearTimeout(collabReadyTimeout); }, [isRemoteSynced, isLocalSynced, remoteProvider?.status]); + */ useEffect(() => { // Only honor user default page edit mode preference and permissions @@ -351,8 +359,9 @@ export default function PageEditor({ }, [userPageEditMode, editor, editable]); const hasConnectedOnceRef = useRef(false); - const [showStatic, setShowStatic] = useState(true); + const [showStatic, setShowStatic] = useState(false); + /* useEffect(() => { if ( !hasConnectedOnceRef.current && @@ -361,7 +370,7 @@ export default function PageEditor({ hasConnectedOnceRef.current = true; setShowStatic(false); } - }, [remoteProvider?.status]); + }, [remoteProvider?.status]);*/ if (showStatic) { return ( diff --git a/apps/client/src/features/page-history/components/history-list.tsx b/apps/client/src/features/page-history/components/history-list.tsx index af178eac..7b0d9ea2 100644 --- a/apps/client/src/features/page-history/components/history-list.tsx +++ b/apps/client/src/features/page-history/components/history-list.tsx @@ -67,7 +67,7 @@ function HistoryList({ pageId }: Props) { mainEditorTitle .chain() .clearContent() - .setContent(activeHistoryData.title, true) + .setContent(activeHistoryData.title, { emitUpdate: true }) .run(); mainEditor .chain() diff --git a/apps/server/src/collaboration/collaboration.gateway.ts b/apps/server/src/collaboration/collaboration.gateway.ts index 3f894572..f1d50671 100644 --- a/apps/server/src/collaboration/collaboration.gateway.ts +++ b/apps/server/src/collaboration/collaboration.gateway.ts @@ -26,7 +26,7 @@ export class CollaborationGateway { ) { this.redisConfig = parseRedisUrl(this.environmentService.getRedisUrl()); - this.hocuspocus = HocuspocusServer.configure({ + this.hocuspocus = new Hocuspocus({ debounce: 10000, maxDebounce: 45000, unloadImmediately: false, @@ -65,6 +65,6 @@ export class CollaborationGateway { } async destroy(): Promise { - await this.hocuspocus.destroy(); + //await this.hocuspocus.destroy(); } } diff --git a/apps/server/src/collaboration/collaboration.util.ts b/apps/server/src/collaboration/collaboration.util.ts index 099d615e..9fff8cf1 100644 --- a/apps/server/src/collaboration/collaboration.util.ts +++ b/apps/server/src/collaboration/collaboration.util.ts @@ -1,8 +1,5 @@ import { StarterKit } from '@tiptap/starter-kit'; import { TextAlign } from '@tiptap/extension-text-align'; -import { TaskList } from '@tiptap/extension-task-list'; -import { TaskItem } from '@tiptap/extension-task-item'; -import { Underline } from '@tiptap/extension-underline'; import { Superscript } from '@tiptap/extension-superscript'; import SubScript from '@tiptap/extension-subscript'; import { Highlight } from '@tiptap/extension-highlight'; @@ -10,6 +7,7 @@ import { Typography } from '@tiptap/extension-typography'; import { TextStyle } from '@tiptap/extension-text-style'; import { Color } from '@tiptap/extension-color'; import { Youtube } from '@tiptap/extension-youtube'; +import { TaskList, TaskItem } from '@tiptap/extension-list'; import { Callout, Comment, @@ -51,7 +49,6 @@ export const tiptapExtensions = [ TaskItem.configure({ nested: true, }), - Underline, LinkExtension, Superscript, SubScript, diff --git a/apps/server/src/collaboration/extensions/authentication.extension.ts b/apps/server/src/collaboration/extensions/authentication.extension.ts index 1a42bd97..04a360f7 100644 --- a/apps/server/src/collaboration/extensions/authentication.extension.ts +++ b/apps/server/src/collaboration/extensions/authentication.extension.ts @@ -69,7 +69,7 @@ export class AuthenticationExtension implements Extension { } if (userSpaceRole === SpaceRole.READER) { - data.connection.readOnly = true; + data.connectionConfig.readOnly = true; this.logger.debug(`User granted readonly access to page: ${pageId}`); } diff --git a/package.json b/package.json index 4b14083e..0653a1b7 100644 --- a/package.json +++ b/package.json @@ -20,53 +20,50 @@ "dependencies": { "@braintree/sanitize-url": "^7.1.0", "@docmost/editor-ext": "workspace:*", - "@hocuspocus/extension-redis": "^2.15.2", - "@hocuspocus/provider": "^2.15.2", - "@hocuspocus/server": "^2.15.2", - "@hocuspocus/transformer": "^2.15.2", + "@floating-ui/dom": "^1.7.3", + "@hocuspocus/extension-redis": "^3.2.2", + "@hocuspocus/provider": "^3.2.2", + "@hocuspocus/server": "^3.2.2", + "@hocuspocus/transformer": "^3.2.2", "@joplin/turndown": "^4.0.74", "@joplin/turndown-plugin-gfm": "^1.0.56", "@sindresorhus/slugify": "1.1.0", - "@tiptap/core": "^2.10.3", - "@tiptap/extension-code-block": "^2.10.3", - "@tiptap/extension-code-block-lowlight": "^2.10.3", - "@tiptap/extension-collaboration": "^2.10.3", - "@tiptap/extension-collaboration-cursor": "^2.10.3", - "@tiptap/extension-color": "^2.10.3", - "@tiptap/extension-document": "^2.10.3", - "@tiptap/extension-heading": "^2.10.3", - "@tiptap/extension-highlight": "^2.10.3", - "@tiptap/extension-history": "^2.10.3", - "@tiptap/extension-image": "^2.10.3", - "@tiptap/extension-link": "^2.10.3", - "@tiptap/extension-list-item": "^2.10.3", - "@tiptap/extension-list-keymap": "^2.10.3", - "@tiptap/extension-placeholder": "^2.10.3", - "@tiptap/extension-subscript": "^2.10.3", - "@tiptap/extension-superscript": "^2.10.3", - "@tiptap/extension-table": "^2.10.3", - "@tiptap/extension-table-cell": "^2.10.3", - "@tiptap/extension-table-header": "^2.10.3", - "@tiptap/extension-table-row": "^2.10.3", - "@tiptap/extension-task-item": "^2.10.3", - "@tiptap/extension-task-list": "^2.10.3", - "@tiptap/extension-text": "^2.10.3", - "@tiptap/extension-text-align": "^2.10.3", - "@tiptap/extension-text-style": "^2.10.3", - "@tiptap/extension-typography": "^2.10.3", - "@tiptap/extension-underline": "^2.10.3", - "@tiptap/extension-youtube": "^2.10.3", - "@tiptap/html": "^2.10.3", - "@tiptap/pm": "^2.10.3", - "@tiptap/react": "^2.10.3", - "@tiptap/starter-kit": "^2.10.3", - "@tiptap/suggestion": "^2.10.3", + "@tiptap/core": "^3.0.9", + "@tiptap/extension-code-block": "^3.0.9", + "@tiptap/extension-collaboration": "^3.0.9", + "@tiptap/extension-collaboration-caret": "^3.0.9", + "@tiptap/extension-color": "^3.0.9", + "@tiptap/extension-document": "^3.0.9", + "@tiptap/extension-heading": "^3.0.9", + "@tiptap/extension-highlight": "^3.0.9", + "@tiptap/extension-history": "^3.0.9", + "@tiptap/extension-image": "^3.0.9", + "@tiptap/extension-link": "^3.0.9", + "@tiptap/extension-list": "^3.0.9", + "@tiptap/extension-list-item": "^3.0.9", + "@tiptap/extension-list-keymap": "^3.0.9", + "@tiptap/extension-placeholder": "^3.0.9", + "@tiptap/extension-subscript": "^3.0.9", + "@tiptap/extension-superscript": "^3.0.9", + "@tiptap/extension-table": "^3.0.9", + "@tiptap/extension-text": "^3.0.9", + "@tiptap/extension-text-align": "^3.0.9", + "@tiptap/extension-text-style": "^3.0.9", + "@tiptap/extension-typography": "^3.0.9", + "@tiptap/extension-youtube": "^3.0.9", + "@tiptap/html": "^3.0.9", + "@tiptap/pm": "^3.0.9", + "@tiptap/react": "^3.0.9", + "@tiptap/starter-kit": "^3.0.9", + "@tiptap/suggestion": "^3.0.9", "@types/qrcode": "^1.5.5", "bytes": "^3.1.2", + "core": "link:highlight.js/lib/core", "cross-env": "^7.0.3", "date-fns": "^4.1.0", "dompurify": "^3.2.6", "fractional-indexing-jittered": "^1.0.0", + "highlight.js": "^11.11.1", "ioredis": "^5.4.1", "jszip": "^3.10.1", "linkifyjs": "^4.3.2", diff --git a/packages/editor-ext/src/lib/custom-code-block.ts b/packages/editor-ext/src/lib/custom-code-block.ts deleted file mode 100644 index 702e98a9..00000000 --- a/packages/editor-ext/src/lib/custom-code-block.ts +++ /dev/null @@ -1,81 +0,0 @@ -import CodeBlockLowlight, { - CodeBlockLowlightOptions, -} from "@tiptap/extension-code-block-lowlight"; -import { ReactNodeViewRenderer } from "@tiptap/react"; - -export interface CustomCodeBlockOptions extends CodeBlockLowlightOptions { - view: any; -} - -const TAB_CHAR = "\u00A0\u00A0"; - -export const CustomCodeBlock = CodeBlockLowlight.extend( - { - selectable: true, - - addOptions() { - return { - ...this.parent?.(), - view: null, - }; - }, - - addKeyboardShortcuts() { - return { - ...this.parent?.(), - Tab: () => { - if (this.editor.isActive("codeBlock")) { - this.editor - .chain() - .command(({ tr }) => { - tr.insertText(TAB_CHAR); - return true; - }) - .run(); - return true; - } - }, - "Mod-a": () => { - if (this.editor.isActive("codeBlock")) { - const { state } = this.editor; - const { $from } = state.selection; - - let codeBlockNode = null; - let codeBlockPos = null; - let depth = 0; - - for (depth = $from.depth; depth > 0; depth--) { - const node = $from.node(depth); - if (node.type.name === "codeBlock") { - codeBlockNode = node; - codeBlockPos = $from.start(depth) - 1; - break; - } - } - - if (codeBlockNode && codeBlockPos !== null) { - const codeBlockStart = codeBlockPos; - const codeBlockEnd = codeBlockPos + codeBlockNode.nodeSize; - - const contentStart = codeBlockStart + 1; - const contentEnd = codeBlockEnd - 1; - - this.editor.commands.setTextSelection({ - from: contentStart, - to: contentEnd, - }); - - return true; - } - } - - return false; - }, - }; - }, - - addNodeView() { - return ReactNodeViewRenderer(this.options.view); - }, - } -); diff --git a/packages/editor-ext/src/lib/custom-code-block/custom-code-block.ts b/packages/editor-ext/src/lib/custom-code-block/custom-code-block.ts new file mode 100644 index 00000000..12f25989 --- /dev/null +++ b/packages/editor-ext/src/lib/custom-code-block/custom-code-block.ts @@ -0,0 +1,106 @@ +import type { CodeBlockOptions } from '@tiptap/extension-code-block' +import CodeBlock from '@tiptap/extension-code-block' + +import { LowlightPlugin } from './lowlight-plugin.js' +import { ReactNodeViewRenderer } from '@tiptap/react'; + +export interface CodeBlockLowlightOptions extends CodeBlockOptions { + /** + * The lowlight instance. + */ + lowlight: any, + view: any; +} + +const TAB_CHAR = "\u00A0\u00A0"; + +/** + * This extension allows you to highlight code blocks with lowlight. + * @see https://tiptap.dev/api/nodes/code-block-lowlight + */ +export const CustomCodeBlock = CodeBlock.extend({ + selectable: true, + + addOptions() { + return { + ...this.parent?.(), + lowlight: {}, + languageClassPrefix: 'language-', + exitOnTripleEnter: true, + exitOnArrowDown: true, + defaultLanguage: null, + HTMLAttributes: {}, + view: null, + } + }, + + addKeyboardShortcuts() { + return { + ...this.parent?.(), + Tab: () => { + if (this.editor.isActive("codeBlock")) { + this.editor + .chain() + .command(({ tr }) => { + tr.insertText(TAB_CHAR); + return true; + }) + .run(); + return true; + } + }, + "Mod-a": () => { + if (this.editor.isActive("codeBlock")) { + const { state } = this.editor; + const { $from } = state.selection; + + let codeBlockNode = null; + let codeBlockPos = null; + let depth = 0; + + for (depth = $from.depth; depth > 0; depth--) { + const node = $from.node(depth); + if (node.type.name === "codeBlock") { + codeBlockNode = node; + codeBlockPos = $from.start(depth) - 1; + break; + } + } + + if (codeBlockNode && codeBlockPos !== null) { + const codeBlockStart = codeBlockPos; + const codeBlockEnd = codeBlockPos + codeBlockNode.nodeSize; + + const contentStart = codeBlockStart + 1; + const contentEnd = codeBlockEnd - 1; + + this.editor.commands.setTextSelection({ + from: contentStart, + to: contentEnd, + }); + + return true; + } + } + + return false; + }, + }; + }, + + + addNodeView() { + return ReactNodeViewRenderer(this.options.view); + }, + + addProseMirrorPlugins() { + return [ + ...(this.parent?.() || []), + LowlightPlugin({ + name: this.name, + lowlight: this.options.lowlight, + defaultLanguage: this.options.defaultLanguage, + }), + ] + }, +}) \ No newline at end of file diff --git a/packages/editor-ext/src/lib/custom-code-block/index.ts b/packages/editor-ext/src/lib/custom-code-block/index.ts new file mode 100644 index 00000000..f6e3470f --- /dev/null +++ b/packages/editor-ext/src/lib/custom-code-block/index.ts @@ -0,0 +1 @@ +export { CustomCodeBlock } from "./custom-code-block"; diff --git a/packages/editor-ext/src/lib/custom-code-block/lowlight-plugin.ts b/packages/editor-ext/src/lib/custom-code-block/lowlight-plugin.ts new file mode 100644 index 00000000..505b8f20 --- /dev/null +++ b/packages/editor-ext/src/lib/custom-code-block/lowlight-plugin.ts @@ -0,0 +1,159 @@ +import { findChildren } from '@tiptap/core' +import type { Node as ProsemirrorNode } from '@tiptap/pm/model' +import { Plugin, PluginKey } from '@tiptap/pm/state' +import { Decoration, DecorationSet } from '@tiptap/pm/view' +// @ts-ignore +import highlight from 'highlight.js/lib/core' + +function parseNodes(nodes: any[], className: string[] = []): { text: string; classes: string[] }[] { + return nodes + .map(node => { + const classes = [...className, ...(node.properties ? node.properties.className : [])] + + if (node.children) { + return parseNodes(node.children, classes) + } + + return { + text: node.value, + classes, + } + }) + .flat() +} + +function getHighlightNodes(result: any) { + // `.value` for lowlight v1, `.children` for lowlight v2 + return result.value || result.children || [] +} + +function registered(aliasOrLanguage: string) { + return Boolean(highlight.getLanguage(aliasOrLanguage)) +} + +function getDecorations({ + doc, + name, + lowlight, + defaultLanguage, +}: { + doc: ProsemirrorNode + name: string + lowlight: any + defaultLanguage: string | null | undefined +}) { + const decorations: Decoration[] = [] + + findChildren(doc, node => node.type.name === name).forEach(block => { + let from = block.pos + 1 + const language = block.node.attrs.language || defaultLanguage + const languages = lowlight.listLanguages() + + const nodes = + language && (languages.includes(language) || registered(language) || lowlight.registered?.(language)) + ? getHighlightNodes(lowlight.highlight(language, block.node.textContent)) + : getHighlightNodes(lowlight.highlightAuto(block.node.textContent)) + + parseNodes(nodes).forEach(node => { + const to = from + node.text.length + + if (node.classes.length) { + const decoration = Decoration.inline(from, to, { + class: node.classes.join(' '), + }) + + decorations.push(decoration) + } + + from = to + }) + }) + + return DecorationSet.create(doc, decorations) +} + +// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type +function isFunction(param: any): param is Function { + return typeof param === 'function' +} + +export function LowlightPlugin({ + name, + lowlight, + defaultLanguage, +}: { + name: string + lowlight: any + defaultLanguage: string | null | undefined +}) { + if (!['highlight', 'highlightAuto', 'listLanguages'].every(api => isFunction(lowlight[api]))) { + throw Error('You should provide an instance of lowlight to use the code-block-lowlight extension') + } + + const lowlightPlugin: Plugin = new Plugin({ + key: new PluginKey('lowlight'), + + state: { + init: (_, { doc }) => + getDecorations({ + doc, + name, + lowlight, + defaultLanguage, + }), + apply: (transaction, decorationSet, oldState, newState) => { + const oldNodeName = oldState.selection.$head.parent.type.name + const newNodeName = newState.selection.$head.parent.type.name + const oldNodes = findChildren(oldState.doc, node => node.type.name === name) + const newNodes = findChildren(newState.doc, node => node.type.name === name) + + if ( + transaction.docChanged && + // Apply decorations if: + // selection includes named node, + ([oldNodeName, newNodeName].includes(name) || + // OR transaction adds/removes named node, + newNodes.length !== oldNodes.length || + // OR transaction has changes that completely encapsulte a node + // (for example, a transaction that affects the entire document). + // Such transactions can happen during collab syncing via y-prosemirror, for example. + transaction.steps.some(step => { + // @ts-ignore + return ( + // @ts-ignore + step.from !== undefined && + // @ts-ignore + step.to !== undefined && + oldNodes.some(node => { + // @ts-ignore + return ( + // @ts-ignore + node.pos >= step.from && + // @ts-ignore + node.pos + node.node.nodeSize <= step.to + ) + }) + ) + })) + ) { + return getDecorations({ + doc: transaction.doc, + name, + lowlight, + defaultLanguage, + }) + } + + return decorationSet.map(transaction.mapping, transaction.doc) + }, + }, + + props: { + decorations(state) { + return lowlightPlugin.getState(state) + }, + }, + }) + + return lowlightPlugin +} \ No newline at end of file diff --git a/packages/editor-ext/src/lib/details/details.ts b/packages/editor-ext/src/lib/details/details.ts index b28c4de7..41c66dca 100644 --- a/packages/editor-ext/src/lib/details/details.ts +++ b/packages/editor-ext/src/lib/details/details.ts @@ -27,6 +27,7 @@ export const Details = Node.create({ content: "detailsSummary detailsContent", defining: true, isolating: true, + // @ts-ignore allowGapCursor: false, addOptions() { return { diff --git a/packages/editor-ext/src/lib/search-and-replace/search-and-replace.ts b/packages/editor-ext/src/lib/search-and-replace/search-and-replace.ts index ca66958f..1ed7632d 100644 --- a/packages/editor-ext/src/lib/search-and-replace/search-and-replace.ts +++ b/packages/editor-ext/src/lib/search-and-replace/search-and-replace.ts @@ -31,6 +31,9 @@ import { import { Node as PMNode, Mark } from "@tiptap/pm/model"; declare module "@tiptap/core" { + interface Storage { + searchAndReplace: SearchAndReplaceStorage; + } interface Commands { search: { /** @@ -184,21 +187,21 @@ const replace = ( if (dispatch) { const tr = state.tr; - + // Get all marks that span the text being replaced const marksSet = new Set(); state.doc.nodesBetween(from, to, (node) => { if (node.isText && node.marks) { - node.marks.forEach(mark => marksSet.add(mark)); + node.marks.forEach((mark) => marksSet.add(mark)); } }); - + const marks = Array.from(marksSet); - + // Delete the old text and insert new text with preserved marks tr.delete(from, to); tr.insert(from, state.schema.text(replaceTerm, marks)); - + dispatch(tr); } }; @@ -215,17 +218,17 @@ const replaceAll = ( // Process replacements in reverse order to avoid position shifting issues for (let i = resultsCopy.length - 1; i >= 0; i -= 1) { const { from, to } = resultsCopy[i]; - + // Get all marks that span the text being replaced const marksSet = new Set(); tr.doc.nodesBetween(from, to, (node) => { if (node.isText && node.marks) { - node.marks.forEach(mark => marksSet.add(mark)); + node.marks.forEach((mark) => marksSet.add(mark)); } }); - + const marks = Array.from(marksSet); - + // Delete and insert with preserved marks tr.delete(from, to); tr.insert(from, tr.doc.type.schema.text(replaceTerm, marks)); @@ -352,10 +355,17 @@ export const SearchAndReplace = Extension.create< // The results will be recalculated by the plugin, but we need to ensure // the index doesn't exceed the new bounds setTimeout(() => { - const newResultsLength = editor.storage.searchAndReplace.results.length; - if (newResultsLength > 0 && editor.storage.searchAndReplace.resultIndex >= newResultsLength) { + const newResultsLength = + editor.storage.searchAndReplace.results.length; + if ( + newResultsLength > 0 && + editor.storage.searchAndReplace.resultIndex >= newResultsLength + ) { // Keep the same position if possible, otherwise go to the last result - editor.storage.searchAndReplace.resultIndex = Math.min(resultIndex, newResultsLength - 1); + editor.storage.searchAndReplace.resultIndex = Math.min( + resultIndex, + newResultsLength - 1, + ); } }, 0); diff --git a/packages/editor-ext/src/lib/table/cell.ts b/packages/editor-ext/src/lib/table/cell.ts index 25a311b9..a96bc7b0 100644 --- a/packages/editor-ext/src/lib/table/cell.ts +++ b/packages/editor-ext/src/lib/table/cell.ts @@ -1,9 +1,10 @@ -import { TableCell as TiptapTableCell } from "@tiptap/extension-table-cell"; +import { TableCell as TiptapTableCell } from "@tiptap/extension-table"; export const TableCell = TiptapTableCell.extend({ name: "tableCell", - content: "(paragraph | heading | bulletList | orderedList | taskList | blockquote | callout | image | video | attachment | mathBlock | details | codeBlock)+", - + content: + "(paragraph | heading | bulletList | orderedList | taskList | blockquote | callout | image | video | attachment | mathBlock | details | codeBlock)+", + addAttributes() { return { ...this.parent?.(), @@ -16,19 +17,21 @@ export const TableCell = TiptapTableCell.extend({ } return { style: `background-color: ${attributes.backgroundColor}`, - 'data-background-color': attributes.backgroundColor, + "data-background-color": attributes.backgroundColor, }; }, }, backgroundColorName: { default: null, - parseHTML: (element) => element.getAttribute('data-background-color-name') || null, + parseHTML: (element) => + element.getAttribute("data-background-color-name") || null, renderHTML: (attributes) => { if (!attributes.backgroundColorName) { return {}; } return { - 'data-background-color-name': attributes.backgroundColorName.toLowerCase(), + "data-background-color-name": + attributes.backgroundColorName.toLowerCase(), }; }, }, diff --git a/packages/editor-ext/src/lib/table/header.ts b/packages/editor-ext/src/lib/table/header.ts index 399a8cf0..6f338be0 100644 --- a/packages/editor-ext/src/lib/table/header.ts +++ b/packages/editor-ext/src/lib/table/header.ts @@ -1,4 +1,4 @@ -import { TableHeader as TiptapTableHeader } from "@tiptap/extension-table-header"; +import { TableHeader as TiptapTableHeader } from "@tiptap/extension-table"; export const TableHeader = TiptapTableHeader.extend({ name: "tableHeader", diff --git a/packages/editor-ext/src/lib/table/row.ts b/packages/editor-ext/src/lib/table/row.ts index 3aa67dcd..c01866e7 100644 --- a/packages/editor-ext/src/lib/table/row.ts +++ b/packages/editor-ext/src/lib/table/row.ts @@ -1,4 +1,4 @@ -import TiptapTableRow from "@tiptap/extension-table-row"; +import { TableRow as TiptapTableRow } from "@tiptap/extension-table"; export const TableRow = TiptapTableRow.extend({ allowGapCursor: false, diff --git a/packages/editor-ext/src/lib/table/table.ts b/packages/editor-ext/src/lib/table/table.ts index 549847b8..19e39977 100644 --- a/packages/editor-ext/src/lib/table/table.ts +++ b/packages/editor-ext/src/lib/table/table.ts @@ -1,29 +1,33 @@ -import Table from "@tiptap/extension-table"; +import { Table } from "@tiptap/extension-table"; import { Editor } from "@tiptap/core"; const LIST_TYPES = ["bulletList", "orderedList", "taskList"]; function isInList(editor: Editor): boolean { const { $from } = editor.state.selection; - + for (let depth = $from.depth; depth > 0; depth--) { const node = $from.node(depth); if (LIST_TYPES.includes(node.type.name)) { return true; } } - + return false; } function handleListIndent(editor: Editor): boolean { - return editor.commands.sinkListItem("listItem") || - editor.commands.sinkListItem("taskItem"); + return ( + editor.commands.sinkListItem("listItem") || + editor.commands.sinkListItem("taskItem") + ); } function handleListOutdent(editor: Editor): boolean { - return editor.commands.liftListItem("listItem") || - editor.commands.liftListItem("taskItem"); + return ( + editor.commands.liftListItem("listItem") || + editor.commands.liftListItem("taskItem") + ); } export const CustomTable = Table.extend({ @@ -62,4 +66,4 @@ export const CustomTable = Table.extend({ }, }; }, -}); \ No newline at end of file +}); diff --git a/packages/editor-ext/src/lib/utils.ts b/packages/editor-ext/src/lib/utils.ts index 31cccc64..27ba8ede 100644 --- a/packages/editor-ext/src/lib/utils.ts +++ b/packages/editor-ext/src/lib/utils.ts @@ -1,10 +1,10 @@ -// @ts-nocheck import { Editor, findParentNode, isTextSelection } from "@tiptap/core"; -import { Selection, Transaction } from "@tiptap/pm/state"; +import { EditorState, Selection, Transaction } from '@tiptap/pm/state'; import { CellSelection, TableMap } from "@tiptap/pm/tables"; import { Node, ResolvedPos } from "@tiptap/pm/model"; -import Table from "@tiptap/extension-table"; +import { Table } from "@tiptap/extension-table"; import { sanitizeUrl as braintreeSanitizeUrl } from "@braintree/sanitize-url"; +import { EditorView } from '@tiptap/pm/view'; export const isRectSelected = (rect: any) => (selection: CellSelection) => { const map = TableMap.get(selection.$anchorCell.node(-1)); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b9fdc892..b78ab192 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,18 +22,21 @@ importers: '@docmost/editor-ext': specifier: workspace:* version: link:packages/editor-ext + '@floating-ui/dom': + specifier: ^1.7.3 + version: 1.7.3 '@hocuspocus/extension-redis': - specifier: ^2.15.2 - version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + specifier: ^3.2.2 + version: 3.2.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/provider': - specifier: ^2.15.2 - version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + specifier: ^3.2.2 + version: 3.2.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/server': - specifier: ^2.15.2 - version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + specifier: ^3.2.2 + version: 3.2.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/transformer': - specifier: ^2.15.2 - version: 2.15.2(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) + specifier: ^3.2.2 + version: 3.2.2(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) '@joplin/turndown': specifier: ^4.0.74 version: 4.0.74 @@ -44,113 +47,98 @@ importers: specifier: 1.1.0 version: 1.1.0 '@tiptap/core': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/pm@2.14.0) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/pm@3.0.9) '@tiptap/extension-code-block': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-code-block-lowlight': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/extension-code-block@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(highlight.js@11.11.1)(lowlight@3.3.0) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) '@tiptap/extension-collaboration': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)) - '@tiptap/extension-collaboration-cursor': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) + '@tiptap/extension-collaboration-caret': + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)) '@tiptap/extension-color': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/extension-text-style@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/extension-text-style@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))) '@tiptap/extension-document': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) '@tiptap/extension-heading': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) '@tiptap/extension-highlight': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) '@tiptap/extension-history': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) '@tiptap/extension-image': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) '@tiptap/extension-link': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extension-list': + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) '@tiptap/extension-list-item': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) '@tiptap/extension-list-keymap': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) '@tiptap/extension-placeholder': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) '@tiptap/extension-subscript': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) '@tiptap/extension-superscript': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) '@tiptap/extension-table': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-table-cell': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-table-header': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-table-row': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-task-item': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-task-list': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) '@tiptap/extension-text': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) '@tiptap/extension-text-align': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) '@tiptap/extension-text-style': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) '@tiptap/extension-typography': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-underline': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) '@tiptap/extension-youtube': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) '@tiptap/html': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(happy-dom@15.11.7) '@tiptap/pm': - specifier: ^2.10.3 - version: 2.14.0 + specifier: ^3.0.9 + version: 3.0.9 '@tiptap/react': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^3.0.9 + version: 3.0.9(@floating-ui/dom@1.7.3)(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tiptap/starter-kit': - specifier: ^2.10.3 - version: 2.14.0 + specifier: ^3.0.9 + version: 3.0.9 '@tiptap/suggestion': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) '@types/qrcode': specifier: ^1.5.5 version: 1.5.5 bytes: specifier: ^3.1.2 version: 3.1.2 + core: + specifier: link:highlight.js/lib/core + version: link:highlight.js/lib/core cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -163,6 +151,9 @@ importers: fractional-indexing-jittered: specifier: ^1.0.0 version: 1.0.0 + highlight.js: + specifier: ^11.11.1 + version: 11.11.1 ioredis: specifier: ^5.4.1 version: 5.4.1 @@ -256,7 +247,7 @@ importers: version: 5.80.6(react@18.3.1) '@tiptap/extension-character-count': specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) + version: 2.14.0(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) alfaaz: specifier: ^1.1.0 version: 1.1.0 @@ -692,7 +683,11 @@ importers: specifier: ^8.24.1 version: 8.24.1(eslint@9.20.1(jiti@1.21.0))(typescript@5.7.3) - packages/editor-ext: {} + packages/editor-ext: + dependencies: + '@tiptap/extension-code-block': + specifier: ^3.0.9 + version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) packages: @@ -2186,11 +2181,11 @@ packages: '@fastify/static@8.2.0': resolution: {integrity: sha512-PejC/DtT7p1yo3p+W7LiUtLMsV8fEvxAK15sozHy9t8kwo5r0uLYmhV/inURmGz1SkHZFz/8CNtHLPyhKcx4SQ==} - '@floating-ui/core@1.5.3': - resolution: {integrity: sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==} + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} - '@floating-ui/dom@1.6.3': - resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + '@floating-ui/dom@1.7.3': + resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==} '@floating-ui/react-dom@2.1.2': resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} @@ -2204,35 +2199,38 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@floating-ui/utils@0.2.8': resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - '@hocuspocus/common@2.15.2': - resolution: {integrity: sha512-wU1wxXNnQQMXyeL3mdSDYiQsm/r/QyJVjjQhF7sUBrLnjdsN7bA1cvfcSvJBr1ymrMSeYRmUL3UlQmEHEOaP7w==} + '@hocuspocus/common@3.2.2': + resolution: {integrity: sha512-zOyjooBM9H+mIY6JpvK2eFdY1HAv/CQFO4N+t6ozlDxSHOsQfYSkmqPfv8PqtVC11BVBMLtp6yB6ssp56Dz6Sw==} - '@hocuspocus/extension-redis@2.15.2': - resolution: {integrity: sha512-2BNBLnDEQq2v3uQSidBSdUOIbHhH383SGxn+hmy6tDQfrt2hLE4MwilgDdcCO0FKOCYaJrV7HyKu6/WyzLbAOg==} + '@hocuspocus/extension-redis@3.2.2': + resolution: {integrity: sha512-fcOBBA6Y72KShsmknwZH/IsnV3nLuEpLae3lb/P+mlMYtkXfdWRvfO/BrLkdwaKUrWg0JkVWkAfURTwh3B4pcg==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 - '@hocuspocus/provider@2.15.2': - resolution: {integrity: sha512-mdBurviyaUd7bQx4vMIE39WqRJDTpfFelHOVXr7w/jA8G1E7K7lxQ9/DacSrbg+9o8s+1z1+SerZiUjaToaBJg==} + '@hocuspocus/provider@3.2.2': + resolution: {integrity: sha512-Msa3ZFQZ4hAhBX/iMjTMKU7ogCODzB53dLm26OVmIM01iwkIibU11TUEOfV0qSN8g1xvbIFU8yxSrC/Tx/JMBQ==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 - '@hocuspocus/server@2.15.2': - resolution: {integrity: sha512-+fLRVswg+bkgfHqJ+wFgywivw3H08WMOtVvJF7dJzWT2ZR/Sc3nDMFh2KqMF6Ygh4z6mt23xr7SKIm3eP1zoLA==} + '@hocuspocus/server@3.2.2': + resolution: {integrity: sha512-uPVyaewsJYYp/U9Zt42Hh3CZsoNtji6Q809jFQQlrYXTOlFNwshErBxpi8hjChla2BvIZn129PgICZeoPdYBbQ==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 - '@hocuspocus/transformer@2.15.2': - resolution: {integrity: sha512-FAo/rt0kch+YeBBp/iit74q+4RV6YRjdZXmvE0/Aw+n/nSW1W0ZNGXnhncfm8qP0CuXnss/Aw8dpfEPZKUWDJw==} + '@hocuspocus/transformer@3.2.2': + resolution: {integrity: sha512-HcCLasMbBOU/MaWfb+PCcCKwROj6Zpy2xLbiwqoAJ4tyQvuN5rinWGbXIhevtz7RjfTGMk4L2McCSYVxfjxB7A==} peerDependencies: - '@tiptap/core': ^2.6.4 - '@tiptap/pm': ^2.6.4 + '@tiptap/core': ^3.0.1 + '@tiptap/pm': ^3.0.1 y-prosemirror: ^1.2.1 yjs: ^13.6.8 @@ -2392,6 +2390,9 @@ packages: '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + '@ioredis/commands@1.3.0': + resolution: {integrity: sha512-M/T6Zewn7sDaBQEqIZ8Rb+i9y8qfGmq+5SDFSf9sA2lUZTmdDLVdOiQaeDp+Q4wElZ9HG1GAX5KhDaidp6LQsQ==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -3477,6 +3478,12 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + '@sesamecare-oss/redlock@1.4.0': + resolution: {integrity: sha512-2z589R+yxKLN4CgKxP1oN4dsg6Y548SE4bVYam/R0kHk7Q9VrQ9l66q+k1ehhSLLY4or9hcchuF9/MhuuZdjJg==} + engines: {node: '>=16'} + peerDependencies: + ioredis: '>=5' + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -3809,31 +3816,31 @@ packages: peerDependencies: react: ^18 || ^19 - '@tiptap/core@2.14.0': - resolution: {integrity: sha512-MBSMzGYRFlwYCocvx3dU7zpCBSDQ0qWByNtStaEzuBUgzCJ6wn2DP/xG0cMcLmE3Ia0VLM4nwbLOAAvBXOtylA==} + '@tiptap/core@3.0.9': + resolution: {integrity: sha512-1zdDyILerBcD3P0fu8kCtPLOFj0R5utjexCQ2CZ46pckn/Wk4V+WUBARzhG5Yz2JDkmJIUIcmLBVrL6G1rjJWg==} peerDependencies: - '@tiptap/pm': ^2.7.0 + '@tiptap/pm': ^3.0.9 - '@tiptap/extension-blockquote@2.14.0': - resolution: {integrity: sha512-AwqPP0jLYNioKxakiVw0vlfH/ceGFbV+SGoqBbPSGFPRdSbHhxHDNBlTtiThmT3N2PiVwXAD9xislJV+WY4GUA==} + '@tiptap/extension-blockquote@3.0.9': + resolution: {integrity: sha512-dGhMWb6GIjgIUuLQDhSlHT6yB4YvnYqe01nHzEvcbSii75KOcLwboVnqxw4p+gsDZLvZRGv/6bZBJh7GKZa8OQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-bold@2.14.0': - resolution: {integrity: sha512-8DWwelH55H8KtLECSIv0wh8x/F/6lpagV/pMvT+Azujad0oqK+1iAPKU/kLgjXbFSkisrpV6KSwQts5neCtfRQ==} + '@tiptap/extension-bold@3.0.9': + resolution: {integrity: sha512-rVULIFt9ZO+fO5ty9zuC3HwY3knxUw7q9JBztpKPfQQCuIJ+iQnOfB8NtI3L8hxVSxhIR1pqr8B3S/8vlpXbVg==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-bubble-menu@2.14.0': - resolution: {integrity: sha512-sN15n0RjPh+2Asvxs7l47hVEvX6c0aPempU8QQWcPUlHoGf1D/XkyHXy6GWVPSxZ5Rj5uAwgKvhHsG/FJ/YGKQ==} + '@tiptap/extension-bubble-menu@3.0.9': + resolution: {integrity: sha512-fZQfdSbKJl3J+Yi+s8NrcLBgXHOaGVD4g+vn+orTPUlZdG9FWvEoon8DexOdK9OvYnW6QMM7kS8whOgpogVyUQ==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 - '@tiptap/extension-bullet-list@2.14.0': - resolution: {integrity: sha512-SWnL4bP8Mm/mWN42AMQNoqYE0V6LgSBTVsHwwAki2wIUQdr9HyoAnohvHy3IME56NMwoyZyo+Mzl45wOqUxziA==} + '@tiptap/extension-bullet-list@3.0.9': + resolution: {integrity: sha512-Aob5TVfrtoEzfTm3wl7lognmWia6EEilOxLihSGISCvI4FTndJg+mwhumduQeYCLWkF9i/DR87m2/3EbjR3R4Q==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extension-list': ^3.0.9 '@tiptap/extension-character-count@2.14.0': resolution: {integrity: sha512-aTCobbF9yIXOntVTdjzJ4G5V0TJKeeIDW8RFMdTVr5o0R/woSZ27cXiPGdS7XxpN6gY9vlNzYe79CcNBDTzLfA==} @@ -3841,239 +3848,227 @@ packages: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-code-block-lowlight@2.14.0': - resolution: {integrity: sha512-jGcVOkcThwzLdXf56zYkmB0tcB8Xy3S+ImS3kDzaccdem6qCG05JeE33K8bfPqh99OU1QqO9XdHNO9x77A2jug==} + '@tiptap/extension-code-block@3.0.9': + resolution: {integrity: sha512-H692k9sHIE3rR3S+BIknQXsLb8HSojk+7gQ5DV0hYajSzpJ02OUL4AnNlpMuSgZuaq+ljpN4sT8kCIzIE1kQxw==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/extension-code-block': ^2.7.0 - '@tiptap/pm': ^2.7.0 - highlight.js: ^11 - lowlight: ^2 || ^3 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 - '@tiptap/extension-code-block@2.14.0': - resolution: {integrity: sha512-LRYYZeh8U2XgfTsJ4houB9s9cVRt7PRfVa4MaCeOYKfowVOKQh67yV5oom8Azk9XrMPkPxDmMmdPAEPxeVYFvw==} + '@tiptap/extension-code@3.0.9': + resolution: {integrity: sha512-jMo7crwLIefwy13WI2FzxlyJN9AbLNsESFbJuv/KPzjpN7uzPKYsE33Uy2IZD5hPoHtA5UmAUfbz0HzWtWy5Yw==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-code@2.14.0': - resolution: {integrity: sha512-kyo02mnzqgwXayMcyRA/fHQgb+nMmQQpIt1irZwjtEoFZshA7NnY/6b5SJmRcxQ4/X4r2Y2Ha2sWmOcEkLmt4A==} + '@tiptap/extension-collaboration-caret@3.0.9': + resolution: {integrity: sha512-TkCikMZq1bV0NasT5tWl6IwPHYCvriaL8luGH9QQwWOTOgEJ07TxhXwWBCo7mybwu2FRuqiY8X2QDzDe7hiIbQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 + '@tiptap/y-tiptap': ^3.0.0-beta.3 - '@tiptap/extension-collaboration-cursor@2.14.0': - resolution: {integrity: sha512-TfdHPW/npLSsu9AMSyPhA9I084jNhou/Xph0HgzlibEOeeGZP9EAmozAceTv8YdFytoUqW/T7YKeoMEkVSJwqA==} + '@tiptap/extension-collaboration@3.0.9': + resolution: {integrity: sha512-zACNmSFuEMp1G89mFs18wuQzfk769HJMFr1z/SiPw1/yM2By8uy7UKgMqVmmQ7OYTIIvCE8zq0whyBrOUpnOJg==} peerDependencies: - '@tiptap/core': ^2.7.0 - y-prosemirror: ^1.2.11 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 + '@tiptap/y-tiptap': ^3.0.0-beta.3 + yjs: ^13 - '@tiptap/extension-collaboration@2.14.0': - resolution: {integrity: sha512-eYErqs/YwS5yifyPg511Tx8Qy7AOJTqzVpS0RXVKFWTJvwK2dRc77LqThdpouO6j2utjFf44vf80ti1+9wetZA==} + '@tiptap/extension-color@3.0.9': + resolution: {integrity: sha512-cA68vy5lZwBVqBLMEDL6rjKIBPXRV+sUjmV+UokJcguAUTerHLK0dAHcbKRp9hJ6KF6z1KAOC7u3ZBhyjibC1w==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - y-prosemirror: ^1.2.11 + '@tiptap/extension-text-style': ^3.0.9 - '@tiptap/extension-color@2.14.0': - resolution: {integrity: sha512-sY+eWIbkCMAwOGH7pQ1ZuNqkqMaaHE+TsJwA7bQ6VhI2gGhhqGjT/DfmJMUen8FSdzuPoWlgtuXXCeOO6FOduw==} + '@tiptap/extension-document@3.0.9': + resolution: {integrity: sha512-DB/R5e6QvuGhY8EhCkfNjR2xQfz/TOWoxfQGhDuy5U+oK3WBwCcHq9t5+nbSCMHtKfi/i49aHKDvv7TQCpuP0w==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/extension-text-style': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-document@2.14.0': - resolution: {integrity: sha512-qwEgpPIJ3AgXdEtRTr88hODbXRdt14VAwLj27PTSqexB5V7Ra1Jy7iQDhqRwBCoUomVywBsWYxkSuDisSRG+9w==} + '@tiptap/extension-dropcursor@3.0.9': + resolution: {integrity: sha512-+P+1nfeCtPLj3OHNiATOL3UyM2omZ8+ac6MKm+FxunRAZZsHzbEFUYYdLF7prEmaf0z0c1k4LKSWpbrIX92pKA==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extensions': ^3.0.9 - '@tiptap/extension-dropcursor@2.14.0': - resolution: {integrity: sha512-FIh5cdPuoPKvZ0GqSKhzMZGixm05ac3hSgqhMNCBZmXX459qBUI9CvDl/uzSnY9koBDeLVV3HYMthWQQLSXl9A==} + '@tiptap/extension-floating-menu@3.0.9': + resolution: {integrity: sha512-WYQ3mW6G0zxoni6TegpQ46a1Qe1zj8Ev5sBH79H4Mbf0qsc7MOq07jLjipv9M0EJJPUi0cfkQlwfV41nH1ue/g==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 - '@tiptap/extension-floating-menu@2.14.0': - resolution: {integrity: sha512-Khx7M7RfZlD1/T/PUlpJmao6FtEBa2L6td2hhaW1USflwGJGk0U/ud4UEqh+aZoJZrkot/EMhEvzmORF3nq+xw==} + '@tiptap/extension-gapcursor@3.0.9': + resolution: {integrity: sha512-+jy7Z/V6nOtvWin+zJYYoRwEYDOHDlF34Ey1T7A8aRcJlPeAQhoB1Ek7R3Rd3nsuByz70IfQapDvkbhY1nkNvQ==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/extensions': ^3.0.9 - '@tiptap/extension-gapcursor@2.14.0': - resolution: {integrity: sha512-as+SqC39FRshw4Fm1XVlrdSXveiusf5xiC4nuefLmXsUxO7Yx67x8jS0/VQbxWTLHZ6R1YEW8prLtnxGmVLCAQ==} + '@tiptap/extension-hard-break@3.0.9': + resolution: {integrity: sha512-PWNYsUwVsMWt/R5/OWjfGb+7DQT0DvH+1owBimRq0pWZepg8qkz1jdPGgsRmUFyERRsXeEpgj3VaQfrgbyUfrA==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-hard-break@2.14.0': - resolution: {integrity: sha512-A8c8n8881iBq3AusNqibh6Hloybr+FgYdg4Lg4jNxbbEaL0WhyLFge1bWlGVpbHXFqdv5YldMUAu6Rop3FhNvw==} + '@tiptap/extension-heading@3.0.9': + resolution: {integrity: sha512-LRLCIt87fvDZ5CdkinzhkCwRz5ax6FlsjJzG32MJ3wXyvVslqeLXBvH28JFUZEyzgcd/SnYmYxnef5+yvAX61g==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-heading@2.14.0': - resolution: {integrity: sha512-vM//6G3Ox3mxPv9eilhrDqylELCc8kEP1aQ4xUuOw7vCidjNtGggOa1ERnnpV2dCa2A9E8y4FHtN4Xh29stXQg==} + '@tiptap/extension-highlight@3.0.9': + resolution: {integrity: sha512-22cCRUMRCLYiGMw1boLGygAghtMs/QjC7Y4HLfwFurJ4d8S8FDD1YU6Iz6mzINIfhqEvke2u+9Wi3AydM/SIow==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-highlight@2.14.0': - resolution: {integrity: sha512-21eouZEuCBFrpGeefnnU9yJ1SH32L9gSlT9MOJXBSXCX5HFskNLdN8Q4cQSyRXSt6r5kEz1GG5a4I805/U2TMQ==} + '@tiptap/extension-history@3.0.9': + resolution: {integrity: sha512-wTSNy85Kla77y9zSUrNEGUVkqCWK9fU+Dsq8wH1A7Xrgi7vBPGkzhy8jpA8+CYtd6xI6c9IiuZrX+x44vjBlSw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extensions': ^3.0.9 - '@tiptap/extension-history@2.14.0': - resolution: {integrity: sha512-/qnOHQFCEPfkb3caykqd+sqzEC2gx30EQB/mM7+5kIG7CQy7XXaGjFAEaqzE1xJ783Q2E7GVk4JxWM+3NhYSLw==} + '@tiptap/extension-horizontal-rule@3.0.9': + resolution: {integrity: sha512-jPNCOte0y9R3Y4PiEA/CRGgRk8WoL700Mnn8NPVHa4juUjvMl1qxL8hdnW/k8cxhrBA8tV0qcq82+/Vqq6jSfA==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 - '@tiptap/extension-horizontal-rule@2.14.0': - resolution: {integrity: sha512-OrKWgHOhmJtVHjPYaEJetNLiNEvrI85lTrGxzeQa+a8ACb93h4svyHe9J+LHs5pKkXDQFcpYEXJntu0LVLLiDw==} + '@tiptap/extension-image@3.0.9': + resolution: {integrity: sha512-/2igN/oIF58zqX5fcg00bf6qGLcQyXHysl5I8GiurkvO95d+SQTlYbJneSRUpt6CgrUKbhRnMBPVubmapgg+Zw==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-image@2.14.0': - resolution: {integrity: sha512-pYCUzZBgsxIvVGTzuW03cPz6PIrAo26xpoxqq4W090uMVoK0SgY5W5y0IqCdw4QyLkJ2/oNSFNc2EP9jVi1CcQ==} + '@tiptap/extension-italic@3.0.9': + resolution: {integrity: sha512-Gt4FbMtZerzKpit8+FvIjIQ3CBD559/FFC+kOT9y8JHlINeqWyh/bgHuaA/9/XtHphOQiA7NDwOiuPh4KIKpqA==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-italic@2.14.0': - resolution: {integrity: sha512-yEw2S+smoVR8DMYQMAWckVW2Sstf7z5+GBZ8zm8NMGhMKb1JFCPZUv5KTTIPnq7ZrKuuZHvjN9+Ef1dRYD8T2A==} + '@tiptap/extension-link@3.0.9': + resolution: {integrity: sha512-cOsG3vpct7/JuenxCePDj5dlaSUEe2eK/g/jlRixgW4Llx5DvG2yj8+gha4MHdCUp/MrUBR4M+NJk1dOOSKXGw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 - '@tiptap/extension-link@2.14.0': - resolution: {integrity: sha512-fsqW7eRD2xoD6xy7eFrNPAdIuZ3eicA4jKC45Vcft/Xky0DJoIehlVBLxsPbfmv3f27EBrtPkg5+msLXkLyzJA==} + '@tiptap/extension-list-item@3.0.9': + resolution: {integrity: sha512-K+ogk1BH/eYhsK9nSTXNdIXlxQcXzty6h1QFiZNr9XmaLk+q4NZFHR5FVz3EJ7QXyw+Gv/2FQn+T2Q/GpbMxZQ==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/extension-list': ^3.0.9 - '@tiptap/extension-list-item@2.14.0': - resolution: {integrity: sha512-t1jXDPEd82sC6vZVE/12/CB52uuiydCIcRfwdh21xNgBMckToKO9S0K6XEp4ROtrKQdlIH2JDVPfpUBvVrYN8Q==} + '@tiptap/extension-list-keymap@3.0.9': + resolution: {integrity: sha512-naz4+EFzLN695f53GATiglPOc5SOLBm1DNhhUHZNlrUVfDtKmrdbo8t9a/NhAE6Ne/pfg5tbuS+OKuvbJaJcAg==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extension-list': ^3.0.9 - '@tiptap/extension-list-keymap@2.14.0': - resolution: {integrity: sha512-1M+MyX7yELwdzPgkeQ2Mx2+BImi5I9sKRaAsPthjVNVcH7W6QNCFUPQA0y18Bq6LhqthzD3lhd4G52ABLR+UgA==} + '@tiptap/extension-list@3.0.9': + resolution: {integrity: sha512-y5JQoFmVR+6FhDdEz2oFIMkURSRSDhCtsrlNWdUpSTGnTAa2WZT7nEhHcIMSGvYU3t0fkfLQ9yTMSaQZFa5GLA==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 - '@tiptap/extension-ordered-list@2.14.0': - resolution: {integrity: sha512-QUZcyuW9AKvSfpFHcGmbyRCqxcpY0VNf0xipEtogxbA+JDDw3ZSPqU1dUgz9wk00RahPTwNDdY5aVjdQ5N4N9Q==} + '@tiptap/extension-ordered-list@3.0.9': + resolution: {integrity: sha512-ACubdGc/y/rKPEgHTO7hDSg547wRRA+Es7c/rQgjrkpI///LBJQfixyUvNg2UNNPttNsavF/CUwhshCeo9MeBA==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extension-list': ^3.0.9 - '@tiptap/extension-paragraph@2.14.0': - resolution: {integrity: sha512-bsQesVpgvDS2e+wr2fp59QO7rWRp2FqcJvBafwXS3Br9U5Mx3eFYryx4wC7cUnhlhUwX5pmaoA7zISgV9dZDgg==} + '@tiptap/extension-paragraph@3.0.9': + resolution: {integrity: sha512-K5zGg4zLxxqAG0BgtRpLvKclYSGoSSuU1Fza0M5MwUgrFA0S2q4JnLB1czQ77S4pfb3hpScIe50fwJzZmIUEQw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-placeholder@2.14.0': - resolution: {integrity: sha512-xzfjHvuukbch4i5O/5uyS2K2QgNEaMKi6e6GExTTgVwnFjKfJmgTqee33tt5JCqSItBvtSZlU3SX/vpiaIof+w==} + '@tiptap/extension-placeholder@3.0.9': + resolution: {integrity: sha512-OgDVijDrNFDJpe/1/yMx6VFEmGBt0vE6ZWw5kGkM4NVfOxhRvv6mSZXio269dc9oBSjmyTISKaI1JAYVCfyJIw==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/extensions': ^3.0.9 - '@tiptap/extension-strike@2.14.0': - resolution: {integrity: sha512-rD5d/IL3XPfBOrHRHxt+b+0X1jbIbWONGiad/3sX0ZYQD3PandtCWboH40r/J5tFksebuY12dVYyYQKgLpDBOQ==} + '@tiptap/extension-strike@3.0.9': + resolution: {integrity: sha512-2TBQ9P/FGe+/34ckfwP+eCdb4vbxDVZ5qD0piDIR9Ws5QI5IdtW90pNO4roxiPeRdVFrhTbFPEIuL0tg4NQRmg==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-subscript@2.14.0': - resolution: {integrity: sha512-1gQucSZ6WqhKukc8YA7ZfQzBYaVY00F6G7+trD2iWSm6EpiabaUVP0vMjuonIiujTioEwe04KmZuC9ZLbEU9dQ==} + '@tiptap/extension-subscript@3.0.9': + resolution: {integrity: sha512-FJi6TH5VnAGtqD7c8TX0JJGkabVTC69lEoSel8RUbK9P+NHk0hh1PEyCjHSNhGinepoB6GIi6+skvXHIkJb5xw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 - '@tiptap/extension-superscript@2.14.0': - resolution: {integrity: sha512-BnsqY9TxN15KxxoX1rulL0sV0Wu3umD4Un0E90LZ5G/QRrVUeohAuOiraqRJ4GnJPVJBR2H0+7Sg5sKqYuIpnQ==} + '@tiptap/extension-superscript@3.0.9': + resolution: {integrity: sha512-an3ZLXkgO9eLxRDeWelxlzCSdGlVptPMfcg/d315SnjBKRhXJbBirLxQsYfb5CF/cGJ56Qj3TvewfKPITP5POw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 - '@tiptap/extension-table-cell@2.14.0': - resolution: {integrity: sha512-DkSNAAkMI/ymPgO8y8Gv0MDVcbd2gk7xrSyicIDNoDFFXp15VasInGW8mvyM+CgvlurGB2N+PkYncPtfb4XNuQ==} + '@tiptap/extension-table@3.0.9': + resolution: {integrity: sha512-jygDvj9MIwMlzs2c+4MZwXCXI6sc7LcKgPFoJ93qiCn6CZrDwaX3XzxXi0VAg7MexsUi1nVaGZQk/gv+Pf3rKw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 - '@tiptap/extension-table-header@2.14.0': - resolution: {integrity: sha512-wX6/+t0iCo3KrqK2OjK0vbFeL76Pq+VpobGt+oM8lcxsENnsa6a0s3wdd1QEVLVPlj+WMFQggAG80Rf17+iDxA==} + '@tiptap/extension-text-align@3.0.9': + resolution: {integrity: sha512-QQBk8orIdntL3tPzGkKIqEogqArvO/x4dfvbAA2K0DqvS9uGJ3Qp4X6Twv+BIHLjeyhZl/z48vEMB+bjwvqg+w==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-table-row@2.14.0': - resolution: {integrity: sha512-a1GvCIju9xETIQu664lVQNftHqpPdRmwYp+1QzY82v3zHClso+tTLPeBSlbDdUscSmv3yZXgGML20IiOoR2l2Q==} + '@tiptap/extension-text-style@3.0.9': + resolution: {integrity: sha512-x7SZLS537c7w789n8re0IktmkBZqz98dux/hwpFAcC4oL06YPjFG7Dy9mAiKcsKqKWI0eAyTQvMybz+TJusBbw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-table@2.14.0': - resolution: {integrity: sha512-X/wH3XKxi5+G7cB+lHt3fPMWIJ30IBkzrJZYapJ8d4p2JxMNIU1Nyu+8K6204d0hF6SVWY8hvb/Jq/WgHtoCFA==} + '@tiptap/extension-text@3.0.9': + resolution: {integrity: sha512-yWdz4aW1nu5YGcinxfu3FXiwMnP/7jp+s7dFXhq9m/6zhDUD2+qyUwhJfIU4Tcz+BGdVHqoNgOA3QXLMA6jyFA==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-task-item@2.14.0': - resolution: {integrity: sha512-MFE928s1J2ACyjOlkx52D/+r6aqz6c516C0tvnP2vzrkijFaSMNY4Xg7L1wTinzIdijh184AYQpyw7LezJa1ug==} + '@tiptap/extension-typography@3.0.9': + resolution: {integrity: sha512-vlOdZidm05AJJ2tMJXVh9ICtlutbvs+2+A7nmsGAnAqbErcleFYimaLFaWucCPsPnUz04pa4qMtW8jF2WIJQYg==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-task-list@2.14.0': - resolution: {integrity: sha512-o2VELXgkDIHS15pnF1W2OFfxZGvo9V6RcwjzCYUS0mqMF9TTbfHwddRcv4t3pifpMO3sWhspVARavJAGaP5zdQ==} + '@tiptap/extension-underline@3.0.9': + resolution: {integrity: sha512-xLR5NbnxlEJmvfb4Aj8wCbTmh/ycnPsSDeP8+TAsdAYxypSA6BP6G0t4d4NWreqAq+tq6QV6Eh0+YDN0G1VZxw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-text-align@2.14.0': - resolution: {integrity: sha512-9Wth4sAq2lYVWvQA0Qy095fsnPEavBv1FKWzVEyurwEQB7ZQsf/MRGmCNFnUXXy12w1G9UOanS4KkJ4C64+Ccw==} + '@tiptap/extension-youtube@3.0.9': + resolution: {integrity: sha512-9buHygO7zPOCzuR65FgenKwwk2BrcBRelin5xtC+TweugKDXY9+XmvKnGrY6Lz12dxbFh+G4RAhWMZHFt+gBIQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 - '@tiptap/extension-text-style@2.14.0': - resolution: {integrity: sha512-dl0oi2i0rjLpBqTf4wGy6SLidvPpjxLcmX727pwJlCklkFJVDf8wSFeD4ddxJXiD2Rwef0D/lkcwXSY73CoDcA==} + '@tiptap/extensions@3.0.9': + resolution: {integrity: sha512-IyTcPnZXUf0nxDkC+CCWh10vzn81Kq50euV/ivk8IyPr15hxPiT3Zk1LmCI10Pqf4Bwgz38XUIWtToDfIeEgpg==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 - '@tiptap/extension-text@2.14.0': - resolution: {integrity: sha512-rHny566nGZHq61zRLwQ9BPG55W/O+eDKwUJl+LhrLiVWwzpvAl9QQYixtoxJKOY48VK41PKwxe3bgDYgNs/Fhg==} + '@tiptap/html@3.0.9': + resolution: {integrity: sha512-DJotl3aHrfxoOlyNsOhBPuSMsghm1pv/vgHQvo1MxgP0+sBpx7zjxMuydMU87ywGcgaEpUSbE52NJQLgtbXJ5A==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 + happy-dom: ^18.0.1 - '@tiptap/extension-typography@2.14.0': - resolution: {integrity: sha512-1pokT94zu1ogJEmGNR+LwjR08iUbO9NZvm3SfPyXc5S1uoQgX3BE5LEwCRtu0Uu528CL9/Pq27wyYkYiSVM8FQ==} + '@tiptap/pm@3.0.9': + resolution: {integrity: sha512-cJdnpGyirRxwi6M4IkyapEK/jhcjFXdfX3uhJp/4uVH1dynNXalV0gE/YnH/yt55kzwvG9OUrwOQt+t1iXgNog==} + + '@tiptap/react@3.0.9': + resolution: {integrity: sha512-BbvWPSgYGvd9m8fPXKI81gf9KP+1SMCPpscbtbbhPyxiW2ziY+jwo+i7MwVI73P89hWAJCy/43UnOde438HmOA==} peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-underline@2.14.0': - resolution: {integrity: sha512-rlBasbwElFikaL5qPyp3OeoEBH2p9Dve0K6liqIWF4i9cECH2Bm53y2S0enVEe01hmgQEWmoYK+fq67rxr3XsQ==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-youtube@2.14.0': - resolution: {integrity: sha512-kryHjsjlIV2B6rS0Mnv9AqAyCCaeNWE1XDAWyYfhWQSmQkfaxSZU3rMnh3BMvSsVsdv5mtyxyBqBTrQA2sBSaw==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/html@2.14.0': - resolution: {integrity: sha512-Lw6mb3yJTsGd+q23KLKVJRpsT/0BEcKsUxzaEKimunKrZknZLsHVbZNa2hxS0IzaJqDogG2+NRutpD/E2NJGDg==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - - '@tiptap/pm@2.14.0': - resolution: {integrity: sha512-cnsfaIlvTFCDtLP/A2Fd3LmpttgY0O/tuTM2fC71vetONz83wUTYT+aD9uvxdX0GkSocoh840b0TsEazbBxhpA==} - - '@tiptap/react@2.14.0': - resolution: {integrity: sha512-6mtksbT2+EWXFLdHVFag9PSoh0GXPmL97Cm+4sJoyECUmBkAyoErapAccmZIljyMaVIHBYpYkNdp9Pw1B73ezw==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@2.14.0': - resolution: {integrity: sha512-Z1bKAfHl14quRI3McmdU+bs675jp6/iexEQTI9M9oHa6l3McFF38g9N3xRpPPX02MX83DghsUPupndUW/yJvEQ==} + '@tiptap/starter-kit@3.0.9': + resolution: {integrity: sha512-CYg6tV5fYOvkP1gyATkJJj+nFYmwjDKLipQc/r0D/tHKypxefENrm4G7mf4B78zsB/izfk5mW3iujvyeod6EcQ==} - '@tiptap/suggestion@2.14.0': - resolution: {integrity: sha512-AXzEw0KYIyg5id8gz5geIffnBtkZqan5MWe29rGo3gXTfKH+Ik8tWbZdnlMVheycsUCllrymDRei4zw9DqVqkQ==} + '@tiptap/suggestion@3.0.9': + resolution: {integrity: sha512-irthqfUybezo3IwR6AXvyyTOtkzwfvvst58VXZtTnR1nN6NEcrs3TQoY3bGKGbN83bdiquKh6aU2nLnZfAhoXg==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.0.9 + '@tiptap/pm': ^3.0.9 + + '@tiptap/y-tiptap@3.0.0': + resolution: {integrity: sha512-HIeJZCj+KYJde2x6fONzo4o6kd7gW7eonwhQsv2p2VQnUgwNXMVhN+D6Z3AH/2i541Sq33y1PO4U/1ThCPjqbA==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + prosemirror-model: ^1.7.1 + prosemirror-state: ^1.2.3 + prosemirror-view: ^1.9.10 + y-protocols: ^1.0.1 + yjs: ^13.5.38 '@tokenizer/inflate@0.2.7': resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} @@ -4927,9 +4922,6 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -5602,10 +5594,6 @@ packages: delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - denque@1.5.1: - resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==} - engines: {node: '>=0.10'} - denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -5770,10 +5758,6 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - entities@5.0.0: - resolution: {integrity: sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA==} - engines: {node: '>=0.12'} - entities@6.0.1: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} @@ -6456,14 +6440,14 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - ioredis@4.28.5: - resolution: {integrity: sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==} - engines: {node: '>=6'} - ioredis@5.4.1: resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} engines: {node: '>=12.22.0'} + ioredis@5.7.0: + resolution: {integrity: sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==} + engines: {node: '>=12.22.0'} + ipaddr.js@2.2.0: resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} engines: {node: '>= 10'} @@ -7046,11 +7030,6 @@ packages: engines: {node: '>=16'} hasBin: true - lib0@0.2.98: - resolution: {integrity: sha512-XteTiNO0qEXqqweWx+b21p/fBnNHUA1NwAtJNJek1oPrewEZs2uiT4gWivHKr9GqCjDPAhchz0UQO8NwU3bBNA==} - engines: {node: '>=16'} - hasBin: true - libphonenumber-js@1.10.58: resolution: {integrity: sha512-53A0IpJFL9LdHbpeatwizf8KSwPICrqn9H0g3Y7WQ+Jgeu9cQ4Ew3WrRtrLBu/CX2lXd5+rgT01/tGlkbkzOjw==} @@ -7105,9 +7084,6 @@ packages: lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -7703,10 +7679,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -8128,8 +8100,8 @@ packages: prosemirror-schema-basic@1.2.3: resolution: {integrity: sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==} - prosemirror-schema-list@1.4.1: - resolution: {integrity: sha512-jbDyaP/6AFfDfu70VzySsD75Om2t3sXTOdl5+31Wlxlg62td1haUpty/ybajSfJ1pkGadlOfwQq9kgW5IMo1Rg==} + prosemirror-schema-list@1.5.1: + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} prosemirror-state@1.4.3: resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} @@ -8382,9 +8354,6 @@ packages: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} - redis-commands@1.7.0: - resolution: {integrity: sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==} - redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} @@ -8393,10 +8362,6 @@ packages: resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} engines: {node: '>=4'} - redlock@4.2.0: - resolution: {integrity: sha512-j+oQlG+dOwcetUt2WJWttu4CZVeRzUrcVcISFmEmfyuwCVSJ93rDT7YSgg7H7rnxwoRyk/jU46kycVka5tW7jA==} - engines: {node: '>=8.0.0'} - redux@4.2.1: resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} @@ -9267,6 +9232,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + utf8-byte-length@1.0.4: resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} @@ -9659,10 +9629,6 @@ packages: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} - zeed-dom@0.15.1: - resolution: {integrity: sha512-dtZ0aQSFyZmoJS0m06/xBN1SazUBPL5HpzlAcs/KcRW0rzadYw12deQBjeMhGKMMeGEp7bA9vmikMLaO4exBcg==} - engines: {node: '>=14.13.1'} - zod@3.25.56: resolution: {integrity: sha512-rd6eEF3BTNvQnR2e2wwolfTmUTnp70aUTqr0oaGbHifzC3BKJsoV+Gat8vxUMR1hwOKBs6El+qWehrHbCpW6SQ==} @@ -11844,18 +11810,18 @@ snapshots: fastq: 1.17.1 glob: 11.0.1 - '@floating-ui/core@1.5.3': + '@floating-ui/core@1.7.3': dependencies: - '@floating-ui/utils': 0.2.8 + '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.6.3': + '@floating-ui/dom@1.7.3': dependencies: - '@floating-ui/core': 1.5.3 - '@floating-ui/utils': 0.2.8 + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/dom': 1.6.3 + '@floating-ui/dom': 1.7.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -11867,19 +11833,21 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tabbable: 6.2.0 + '@floating-ui/utils@0.2.10': {} + '@floating-ui/utils@0.2.8': {} - '@hocuspocus/common@2.15.2': + '@hocuspocus/common@3.2.2': dependencies: - lib0: 0.2.98 + lib0: 0.2.108 - '@hocuspocus/extension-redis@2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/extension-redis@3.2.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/server': 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) - ioredis: 4.28.5 + '@hocuspocus/server': 3.2.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@sesamecare-oss/redlock': 1.4.0(ioredis@5.7.0) + ioredis: 5.7.0 kleur: 4.1.5 lodash.debounce: 4.0.8 - redlock: 4.2.0 uuid: 11.1.0 y-protocols: 1.0.6(yjs@13.6.27) yjs: 13.6.27 @@ -11888,11 +11856,11 @@ snapshots: - supports-color - utf-8-validate - '@hocuspocus/provider@2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/provider@3.2.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/common': 2.15.2 + '@hocuspocus/common': 3.2.2 '@lifeomic/attempt': 3.0.3 - lib0: 0.2.98 + lib0: 0.2.108 ws: 8.18.2 y-protocols: 1.0.6(yjs@13.6.27) yjs: 13.6.27 @@ -11900,12 +11868,12 @@ snapshots: - bufferutil - utf-8-validate - '@hocuspocus/server@2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/server@3.2.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/common': 2.15.2 + '@hocuspocus/common': 3.2.2 async-lock: 1.4.1 kleur: 4.1.5 - lib0: 0.2.98 + lib0: 0.2.108 uuid: 11.1.0 ws: 8.18.2 y-protocols: 1.0.6(yjs@13.6.27) @@ -11914,11 +11882,11 @@ snapshots: - bufferutil - utf-8-validate - '@hocuspocus/transformer@2.15.2(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/transformer@3.2.2(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 - '@tiptap/starter-kit': 2.14.0 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 + '@tiptap/starter-kit': 3.0.9 y-prosemirror: 1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) yjs: 13.6.27 @@ -12081,6 +12049,8 @@ snapshots: '@ioredis/commands@1.2.0': {} + '@ioredis/commands@1.3.0': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -13185,6 +13155,10 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 + '@sesamecare-oss/redlock@1.4.0(ioredis@5.7.0)': + dependencies: + ioredis: 5.7.0 + '@sinclair/typebox@0.27.8': {} '@sindresorhus/slugify@1.1.0': @@ -13633,212 +13607,194 @@ snapshots: '@tanstack/query-core': 5.80.6 react: 18.3.1 - '@tiptap/core@2.14.0(@tiptap/pm@2.14.0)': + '@tiptap/core@3.0.9(@tiptap/pm@3.0.9)': dependencies: - '@tiptap/pm': 2.14.0 + '@tiptap/pm': 3.0.9 - '@tiptap/extension-blockquote@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-blockquote@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-bold@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-bold@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-bubble-menu@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-bubble-menu@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 - tippy.js: 6.3.7 + '@floating-ui/dom': 1.7.3 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 + optional: true - '@tiptap/extension-bullet-list@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-bullet-list@3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/extension-list': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) - '@tiptap/extension-character-count@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-character-count@2.14.0(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 - '@tiptap/extension-code-block-lowlight@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/extension-code-block@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(highlight.js@11.11.1)(lowlight@3.3.0)': + '@tiptap/extension-code-block@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/extension-code-block': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 - highlight.js: 11.11.1 - lowlight: 3.3.0 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 - '@tiptap/extension-code-block@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-code@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-code@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-collaboration-caret@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 + '@tiptap/y-tiptap': 3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) - '@tiptap/extension-collaboration-cursor@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))': + '@tiptap/extension-collaboration@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - y-prosemirror: 1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 + '@tiptap/y-tiptap': 3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + yjs: 13.6.27 - '@tiptap/extension-collaboration@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))': + '@tiptap/extension-color@3.0.9(@tiptap/extension-text-style@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 - y-prosemirror: 1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@tiptap/extension-text-style': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) - '@tiptap/extension-color@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/extension-text-style@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)))': + '@tiptap/extension-document@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/extension-text-style': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-document@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-dropcursor@3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/extensions': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) - '@tiptap/extension-dropcursor@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-floating-menu@3.0.9(@floating-ui/dom@1.7.3)(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@floating-ui/dom': 1.7.3 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 + optional: true - '@tiptap/extension-floating-menu@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-gapcursor@3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 - tippy.js: 6.3.7 + '@tiptap/extensions': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) - '@tiptap/extension-gapcursor@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-hard-break@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-hard-break@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-heading@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-heading@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-highlight@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-highlight@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-history@3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/extensions': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) - '@tiptap/extension-history@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-horizontal-rule@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 - '@tiptap/extension-horizontal-rule@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-image@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-image@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-italic@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-italic@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-link@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - - '@tiptap/extension-link@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': - dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 linkifyjs: 4.3.2 - '@tiptap/extension-list-item@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-list-item@3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/extension-list': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) - '@tiptap/extension-list-keymap@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-list-keymap@3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/extension-list': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) - '@tiptap/extension-ordered-list@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 - '@tiptap/extension-paragraph@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-ordered-list@3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/extension-list': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) - '@tiptap/extension-placeholder@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-paragraph@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-strike@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-placeholder@3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/extensions': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) - '@tiptap/extension-subscript@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-strike@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-superscript@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-subscript@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 - '@tiptap/extension-table-cell@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-superscript@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 - '@tiptap/extension-table-header@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-table@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 - '@tiptap/extension-table-row@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-text-align@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-table@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-text-style@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-task-item@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-text@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-task-list@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-typography@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-text-align@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-underline@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-text-style@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-youtube@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-text@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 - '@tiptap/extension-typography@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/html@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(happy-dom@15.11.7)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 + happy-dom: 15.11.7 - '@tiptap/extension-underline@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': - dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - - '@tiptap/extension-youtube@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': - dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - - '@tiptap/html@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': - dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 - zeed-dom: 0.15.1 - - '@tiptap/pm@2.14.0': + '@tiptap/pm@3.0.9': dependencies: prosemirror-changeset: 2.3.1 prosemirror-collab: 1.3.1 @@ -13852,53 +13808,68 @@ snapshots: prosemirror-menu: 1.2.4 prosemirror-model: 1.25.1 prosemirror-schema-basic: 1.2.3 - prosemirror-schema-list: 1.4.1 + prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.3 prosemirror-tables: 1.7.1 prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0) prosemirror-transform: 1.10.4 prosemirror-view: 1.40.0 - '@tiptap/react@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tiptap/react@3.0.9(@floating-ui/dom@1.7.3)(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/extension-bubble-menu': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-floating-menu': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 '@types/use-sync-external-store': 0.0.6 fast-deep-equal: 3.1.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - use-sync-external-store: 1.2.2(react@18.3.1) + use-sync-external-store: 1.5.0(react@18.3.1) + optionalDependencies: + '@tiptap/extension-bubble-menu': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extension-floating-menu': 3.0.9(@floating-ui/dom@1.7.3)(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + transitivePeerDependencies: + - '@floating-ui/dom' - '@tiptap/starter-kit@2.14.0': + '@tiptap/starter-kit@3.0.9': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/extension-blockquote': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-bold': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-bullet-list': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-code': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-code-block': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-document': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-dropcursor': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-gapcursor': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-hard-break': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-heading': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-history': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-horizontal-rule': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-italic': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-list-item': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-ordered-list': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-paragraph': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-strike': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-text': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-text-style': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/extension-blockquote': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + '@tiptap/extension-bold': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + '@tiptap/extension-bullet-list': 3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) + '@tiptap/extension-code': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + '@tiptap/extension-code-block': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extension-document': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + '@tiptap/extension-dropcursor': 3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) + '@tiptap/extension-gapcursor': 3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) + '@tiptap/extension-hard-break': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + '@tiptap/extension-heading': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + '@tiptap/extension-horizontal-rule': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extension-italic': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + '@tiptap/extension-link': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extension-list': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extension-list-item': 3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) + '@tiptap/extension-list-keymap': 3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) + '@tiptap/extension-ordered-list': 3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) + '@tiptap/extension-paragraph': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + '@tiptap/extension-strike': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + '@tiptap/extension-text': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + '@tiptap/extension-underline': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + '@tiptap/extensions': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 - '@tiptap/suggestion@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/suggestion@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/pm': 3.0.9 + + '@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + dependencies: + lib0: 0.2.108 + prosemirror-model: 1.25.1 + prosemirror-state: 1.4.3 + prosemirror-view: 1.40.0 + y-protocols: 1.0.6(yjs@13.6.27) + yjs: 13.6.27 '@tokenizer/inflate@0.2.7': dependencies: @@ -14994,8 +14965,6 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - bluebird@3.7.2: {} - boolbase@1.0.0: {} bowser@2.11.0: {} @@ -15710,8 +15679,6 @@ snapshots: delegates@1.0.0: {} - denque@1.5.1: {} - denque@2.1.0: {} depd@2.0.0: {} @@ -15887,8 +15854,6 @@ snapshots: entities@4.5.0: {} - entities@5.0.0: {} - entities@6.0.1: {} errno@0.1.8: @@ -16769,27 +16734,25 @@ snapshots: dependencies: loose-envify: 1.4.0 - ioredis@4.28.5: + ioredis@5.4.1: dependencies: + '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.3.7 - denque: 1.5.1 + debug: 4.3.4 + denque: 2.1.0 lodash.defaults: 4.2.0 - lodash.flatten: 4.4.0 lodash.isarguments: 3.1.0 - p-map: 2.1.0 - redis-commands: 1.7.0 redis-errors: 1.2.0 redis-parser: 3.0.0 standard-as-callback: 2.1.0 transitivePeerDependencies: - supports-color - ioredis@5.4.1: + ioredis@5.7.0: dependencies: - '@ioredis/commands': 1.2.0 + '@ioredis/commands': 1.3.0 cluster-key-slot: 1.1.2 - debug: 4.3.4 + debug: 4.4.0 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -17553,10 +17516,6 @@ snapshots: dependencies: isomorphic.js: 0.2.5 - lib0@0.2.98: - dependencies: - isomorphic.js: 0.2.5 - libphonenumber-js@1.10.58: {} lie@3.3.0: @@ -17604,8 +17563,6 @@ snapshots: lodash.defaults@4.2.0: {} - lodash.flatten@4.4.0: {} - lodash.includes@4.3.0: {} lodash.isarguments@3.1.0: {} @@ -18331,8 +18288,6 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@2.1.0: {} - p-try@2.2.0: {} package-json-from-dist@1.0.0: {} @@ -18761,7 +18716,7 @@ snapshots: dependencies: prosemirror-model: 1.25.1 - prosemirror-schema-list@1.4.1: + prosemirror-schema-list@1.5.1: dependencies: prosemirror-model: 1.25.1 prosemirror-state: 1.4.3 @@ -19052,18 +19007,12 @@ snapshots: dependencies: resolve: 1.22.8 - redis-commands@1.7.0: {} - redis-errors@1.2.0: {} redis-parser@3.0.0: dependencies: redis-errors: 1.2.0 - redlock@4.2.0: - dependencies: - bluebird: 3.7.2 - redux@4.2.1: dependencies: '@babel/runtime': 7.25.6 @@ -20000,6 +19949,10 @@ snapshots: dependencies: react: 18.3.1 + use-sync-external-store@1.5.0(react@18.3.1): + dependencies: + react: 18.3.1 + utf8-byte-length@1.0.4: {} util-deprecate@1.0.2: {} @@ -20350,11 +20303,6 @@ snapshots: yoctocolors-cjs@2.1.2: {} - zeed-dom@0.15.1: - dependencies: - css-what: 6.1.0 - entities: 5.0.0 - zod@3.25.56: {} zustand@4.5.6(@types/react@18.3.12)(react@18.3.1): From 63ea2f7663af2e1c73022e5d30ec779e8c99598c Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sun, 3 Aug 2025 18:24:55 -0700 Subject: [PATCH 02/21] fix collaboration --- .../src/features/editor/page-editor.tsx | 83 +++++++++++-------- package.json | 1 - pnpm-lock.yaml | 9 +- 3 files changed, 48 insertions(+), 45 deletions(-) diff --git a/apps/client/src/features/editor/page-editor.tsx b/apps/client/src/features/editor/page-editor.tsx index d8036333..3893ea5e 100644 --- a/apps/client/src/features/editor/page-editor.tsx +++ b/apps/client/src/features/editor/page-editor.tsx @@ -4,6 +4,7 @@ import { IndexeddbPersistence } from "y-indexeddb"; import * as Y from "yjs"; import { HocuspocusProvider, + onStatusParameters, onAuthenticationFailedParameters, WebSocketStatus, } from "@hocuspocus/provider"; @@ -72,7 +73,7 @@ export default function PageEditor({ ydocRef.current = new Y.Doc(); } const ydoc = ydocRef.current; - const [isLocalSynced, setLocalSynced] = useState(false); + const [isLocalSynced, setIsLocalSynced] = useState(false); const [isRemoteSynced, setRemoteSynced] = useState(false); const [yjsConnectionStatus, setYjsConnectionStatus] = useAtom( yjsConnectionStatusAtom, @@ -100,29 +101,31 @@ export default function PageEditor({ // Track when collaborative provider is ready and synced const [collabReady, setCollabReady] = useState(false); - /* + useEffect(() => { if ( - remoteProvider?.status === WebSocketStatus.Connected && + remoteProvider?.configuration.websocketProvider.status === + WebSocketStatus.Connected && isLocalSynced && isRemoteSynced ) { setCollabReady(true); } - }, [remoteProvider?.status, isLocalSynced, isRemoteSynced]); - */ + }, [ + remoteProvider?.configuration.websocketProvider.status, + isLocalSynced, + isRemoteSynced, + ]); useEffect(() => { if (!providersRef.current) { const local = new IndexeddbPersistence(documentName, ydoc); - local.on("synced", () => setLocalSynced(true)); + local.on("synced", () => setIsLocalSynced(true)); const remote = new HocuspocusProvider({ name: documentName, url: collaborationURL, document: ydoc, token: collabQuery?.token, - //connect: true, - //preserveConnection: false, onAuthenticationFailed: (auth: onAuthenticationFailedParameters) => { const payload = jwtDecode(collabQuery?.token); const now = Date.now().valueOf() / 1000; @@ -130,25 +133,28 @@ export default function PageEditor({ if (isTokenExpired) { refetchCollabToken().then((result) => { if (result.data?.token) { - remote.disconnect(); + remote.configuration.websocketProvider.disconnect(); setTimeout(() => { remote.configuration.token = result.data.token; - remote.connect(); + remote.configuration.websocketProvider.connect(); }, 100); } }); } }, - //onStatus: (status) => { - // if (status.status === "connected") { - // setYjsConnectionStatus(status.status); - // } - // }, }); + remote.on("synced", () => setRemoteSynced(true)); - remote.on("disconnect", () => { - setYjsConnectionStatus(WebSocketStatus.Disconnected); - }); + + const handleSocketStatus = (status: onStatusParameters) => { + if (status.status === "connected") { + setYjsConnectionStatus(WebSocketStatus.Connected); + } else if (status.status === "disconnected") { + setYjsConnectionStatus(WebSocketStatus.Disconnected); + } + }; + remote.configuration.websocketProvider.on("status", handleSocketStatus); + providersRef.current = { local, remote }; setProvidersReady(true); } else { @@ -178,29 +184,29 @@ export default function PageEditor({ */ // Only connect/disconnect on tab/idle, not destroy - /* useEffect(() => { if (!providersReady || !providersRef.current) return; const remoteProvider = providersRef.current.remote; if ( isIdle && documentState === "hidden" && - remoteProvider === WebSocketStatus.Connected + remoteProvider.configuration.websocketProvider.status === + WebSocketStatus.Connected ) { - remoteProvider.disconnect(); + remoteProvider.configuration.websocketProvider.disconnect(); setIsCollabReady(false); return; } if ( documentState === "visible" && - remoteProvider.status === WebSocketStatus.Disconnected + remoteProvider.configuration.websocketProvider.status === + WebSocketStatus.Disconnected ) { resetIdle(); - remoteProvider.connect(); + remoteProvider.configuration.websocketProvider.connect(); setTimeout(() => setIsCollabReady(true), 500); } }, [isIdle, documentState, providersReady, resetIdle]); - */ const extensions = useMemo(() => { if (!remoteProvider || !currentUser?.user) return mainExtensions; @@ -316,32 +322,37 @@ export default function PageEditor({ setAsideState({ tab: "", isAsideOpen: false }); }, [pageId]); - /* useEffect(() => { - if (remoteProvider?.status === WebSocketStatus.Connecting) { + if ( + remoteProvider?.configuration.websocketProvider.status === + WebSocketStatus.Connecting + ) { const timeout = setTimeout(() => { setYjsConnectionStatus(WebSocketStatus.Disconnected); }, 5000); return () => clearTimeout(timeout); } - }, [remoteProvider?.status]); -*/ + }, [remoteProvider?.configuration.websocketProvider.status]); + const isSynced = isLocalSynced && isRemoteSynced; - /* useEffect(() => { const collabReadyTimeout = setTimeout(() => { if ( !isCollabReady && isSynced && - remoteProvider?.status === WebSocketStatus.Connected + remoteProvider?.configuration.websocketProvider.status === + WebSocketStatus.Connected ) { setIsCollabReady(true); } }, 500); return () => clearTimeout(collabReadyTimeout); - }, [isRemoteSynced, isLocalSynced, remoteProvider?.status]); - */ + }, [ + isRemoteSynced, + isLocalSynced, + remoteProvider?.configuration.websocketProvider.status, + ]); useEffect(() => { // Only honor user default page edit mode preference and permissions @@ -359,18 +370,18 @@ export default function PageEditor({ }, [userPageEditMode, editor, editable]); const hasConnectedOnceRef = useRef(false); - const [showStatic, setShowStatic] = useState(false); + const [showStatic, setShowStatic] = useState(true); - /* useEffect(() => { if ( !hasConnectedOnceRef.current && - remoteProvider?.status === WebSocketStatus.Connected + remoteProvider?.configuration.websocketProvider.status === + WebSocketStatus.Connected ) { hasConnectedOnceRef.current = true; setShowStatic(false); } - }, [remoteProvider?.status]);*/ + }, [remoteProvider?.configuration.websocketProvider.status]); if (showStatic) { return ( diff --git a/package.json b/package.json index 0653a1b7..76165682 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,6 @@ "@tiptap/suggestion": "^3.0.9", "@types/qrcode": "^1.5.5", "bytes": "^3.1.2", - "core": "link:highlight.js/lib/core", "cross-env": "^7.0.3", "date-fns": "^4.1.0", "dompurify": "^3.2.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b78ab192..2707f75c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -136,9 +136,6 @@ importers: bytes: specifier: ^3.1.2 version: 3.1.2 - core: - specifier: link:highlight.js/lib/core - version: link:highlight.js/lib/core cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -683,11 +680,7 @@ importers: specifier: ^8.24.1 version: 8.24.1(eslint@9.20.1(jiti@1.21.0))(typescript@5.7.3) - packages/editor-ext: - dependencies: - '@tiptap/extension-code-block': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + packages/editor-ext: {} packages: From 6f83f32d5c954daba94494af7833de6a58661c03 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sun, 3 Aug 2025 18:34:32 -0700 Subject: [PATCH 03/21] remove unused code --- .../client/src/features/editor/page-editor.tsx | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/apps/client/src/features/editor/page-editor.tsx b/apps/client/src/features/editor/page-editor.tsx index 3893ea5e..dd88a0ef 100644 --- a/apps/client/src/features/editor/page-editor.tsx +++ b/apps/client/src/features/editor/page-editor.tsx @@ -99,24 +99,6 @@ export default function PageEditor({ const localProvider = providersRef.current?.local; const remoteProvider = providersRef.current?.remote; - // Track when collaborative provider is ready and synced - const [collabReady, setCollabReady] = useState(false); - - useEffect(() => { - if ( - remoteProvider?.configuration.websocketProvider.status === - WebSocketStatus.Connected && - isLocalSynced && - isRemoteSynced - ) { - setCollabReady(true); - } - }, [ - remoteProvider?.configuration.websocketProvider.status, - isLocalSynced, - isRemoteSynced, - ]); - useEffect(() => { if (!providersRef.current) { const local = new IndexeddbPersistence(documentName, ydoc); From 0e1d4e5eee43e521ab2bfee611e2316e2b5513c0 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sun, 3 Aug 2025 19:01:28 -0700 Subject: [PATCH 04/21] fix flicker --- apps/client/src/features/editor/page-editor.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/client/src/features/editor/page-editor.tsx b/apps/client/src/features/editor/page-editor.tsx index dd88a0ef..b13e0092 100644 --- a/apps/client/src/features/editor/page-editor.tsx +++ b/apps/client/src/features/editor/page-editor.tsx @@ -355,15 +355,20 @@ export default function PageEditor({ const [showStatic, setShowStatic] = useState(true); useEffect(() => { + // Wait for both connection and sync before switching from static editor if ( !hasConnectedOnceRef.current && remoteProvider?.configuration.websocketProvider.status === - WebSocketStatus.Connected + WebSocketStatus.Connected && + isLocalSynced // Also wait for local sync to complete ) { hasConnectedOnceRef.current = true; - setShowStatic(false); + // Small delay to ensure smooth transition + setTimeout(() => { + setShowStatic(false); + }, 100); } - }, [remoteProvider?.configuration.websocketProvider.status]); + }, [remoteProvider?.configuration.websocketProvider.status, isLocalSynced]); if (showStatic) { return ( From 23e8ab032e4c01b65d0a142adf1e65bb365c8d48 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sun, 3 Aug 2025 19:01:50 -0700 Subject: [PATCH 05/21] disable duplicate extensions --- apps/server/src/collaboration/collaboration.util.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/server/src/collaboration/collaboration.util.ts b/apps/server/src/collaboration/collaboration.util.ts index 9fff8cf1..8c30b49c 100644 --- a/apps/server/src/collaboration/collaboration.util.ts +++ b/apps/server/src/collaboration/collaboration.util.ts @@ -42,6 +42,8 @@ import { Node } from '@tiptap/pm/model'; export const tiptapExtensions = [ StarterKit.configure({ codeBlock: false, + link: false, + trailingNode: false, }), Comment, TextAlign.configure({ types: ['heading', 'paragraph'] }), From 71dfcf6bced0d022e8309c6b7a3113dfee1a6b39 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Thu, 14 Aug 2025 23:29:48 -0700 Subject: [PATCH 06/21] update tiptap version --- apps/server/src/ee | 2 +- package.json | 64 ++-- pnpm-lock.yaml | 722 ++++++++++++++++++++++----------------------- 3 files changed, 394 insertions(+), 394 deletions(-) diff --git a/apps/server/src/ee b/apps/server/src/ee index 7e9c376a..fbc01d80 160000 --- a/apps/server/src/ee +++ b/apps/server/src/ee @@ -1 +1 @@ -Subproject commit 7e9c376ab84a2e05b9a565a9d819b0e0d60d472e +Subproject commit fbc01d808f3edd7d16a64c21251a0bcb720f1ba4 diff --git a/package.json b/package.json index 76165682..41ceec9c 100644 --- a/package.json +++ b/package.json @@ -21,41 +21,41 @@ "@braintree/sanitize-url": "^7.1.0", "@docmost/editor-ext": "workspace:*", "@floating-ui/dom": "^1.7.3", - "@hocuspocus/extension-redis": "^3.2.2", - "@hocuspocus/provider": "^3.2.2", - "@hocuspocus/server": "^3.2.2", - "@hocuspocus/transformer": "^3.2.2", + "@hocuspocus/extension-redis": "^3.2.3", + "@hocuspocus/provider": "^3.2.3", + "@hocuspocus/server": "^3.2.3", + "@hocuspocus/transformer": "^3.2.3", "@joplin/turndown": "^4.0.74", "@joplin/turndown-plugin-gfm": "^1.0.56", "@sindresorhus/slugify": "1.1.0", - "@tiptap/core": "^3.0.9", - "@tiptap/extension-code-block": "^3.0.9", - "@tiptap/extension-collaboration": "^3.0.9", - "@tiptap/extension-collaboration-caret": "^3.0.9", - "@tiptap/extension-color": "^3.0.9", - "@tiptap/extension-document": "^3.0.9", - "@tiptap/extension-heading": "^3.0.9", - "@tiptap/extension-highlight": "^3.0.9", - "@tiptap/extension-history": "^3.0.9", - "@tiptap/extension-image": "^3.0.9", - "@tiptap/extension-link": "^3.0.9", - "@tiptap/extension-list": "^3.0.9", - "@tiptap/extension-list-item": "^3.0.9", - "@tiptap/extension-list-keymap": "^3.0.9", - "@tiptap/extension-placeholder": "^3.0.9", - "@tiptap/extension-subscript": "^3.0.9", - "@tiptap/extension-superscript": "^3.0.9", - "@tiptap/extension-table": "^3.0.9", - "@tiptap/extension-text": "^3.0.9", - "@tiptap/extension-text-align": "^3.0.9", - "@tiptap/extension-text-style": "^3.0.9", - "@tiptap/extension-typography": "^3.0.9", - "@tiptap/extension-youtube": "^3.0.9", - "@tiptap/html": "^3.0.9", - "@tiptap/pm": "^3.0.9", - "@tiptap/react": "^3.0.9", - "@tiptap/starter-kit": "^3.0.9", - "@tiptap/suggestion": "^3.0.9", + "@tiptap/core": "^3.2.0", + "@tiptap/extension-code-block": "^3.2.0", + "@tiptap/extension-collaboration": "^3.2.0", + "@tiptap/extension-collaboration-caret": "^3.2.0", + "@tiptap/extension-color": "^3.2.0", + "@tiptap/extension-document": "^3.2.0", + "@tiptap/extension-heading": "^3.2.0", + "@tiptap/extension-highlight": "^3.2.0", + "@tiptap/extension-history": "^3.2.0", + "@tiptap/extension-image": "^3.2.0", + "@tiptap/extension-link": "^3.2.0", + "@tiptap/extension-list": "^3.2.0", + "@tiptap/extension-list-item": "^3.2.0", + "@tiptap/extension-list-keymap": "^3.2.0", + "@tiptap/extension-placeholder": "^3.2.0", + "@tiptap/extension-subscript": "^3.2.0", + "@tiptap/extension-superscript": "^3.2.0", + "@tiptap/extension-table": "^3.2.0", + "@tiptap/extension-text": "^3.2.0", + "@tiptap/extension-text-align": "^3.2.0", + "@tiptap/extension-text-style": "^3.2.0", + "@tiptap/extension-typography": "^3.2.0", + "@tiptap/extension-youtube": "^3.2.0", + "@tiptap/html": "^3.2.0", + "@tiptap/pm": "^3.2.0", + "@tiptap/react": "^3.2.0", + "@tiptap/starter-kit": "^3.2.0", + "@tiptap/suggestion": "^3.2.0", "@types/qrcode": "^1.5.5", "bytes": "^3.1.2", "cross-env": "^7.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2707f75c..cc793919 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,17 +26,17 @@ importers: specifier: ^1.7.3 version: 1.7.3 '@hocuspocus/extension-redis': - specifier: ^3.2.2 - version: 3.2.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + specifier: ^3.2.3 + version: 3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/provider': - specifier: ^3.2.2 - version: 3.2.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + specifier: ^3.2.3 + version: 3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/server': - specifier: ^3.2.2 - version: 3.2.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + specifier: ^3.2.3 + version: 3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/transformer': - specifier: ^3.2.2 - version: 3.2.2(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) + specifier: ^3.2.3 + version: 3.2.3(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) '@joplin/turndown': specifier: ^4.0.74 version: 4.0.74 @@ -47,89 +47,89 @@ importers: specifier: 1.1.0 version: 1.1.0 '@tiptap/core': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/pm@3.0.9) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/pm@3.2.0) '@tiptap/extension-code-block': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) '@tiptap/extension-collaboration': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) '@tiptap/extension-collaboration-caret': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)) '@tiptap/extension-color': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/extension-text-style@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/extension-text-style@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))) '@tiptap/extension-document': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) '@tiptap/extension-heading': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) '@tiptap/extension-highlight': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) '@tiptap/extension-history': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/extensions@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)) '@tiptap/extension-image': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) '@tiptap/extension-link': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) '@tiptap/extension-list': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) '@tiptap/extension-list-item': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/extension-list@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)) '@tiptap/extension-list-keymap': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/extension-list@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)) '@tiptap/extension-placeholder': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/extensions@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)) '@tiptap/extension-subscript': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) '@tiptap/extension-superscript': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) '@tiptap/extension-table': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) '@tiptap/extension-text': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) '@tiptap/extension-text-align': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) '@tiptap/extension-text-style': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) '@tiptap/extension-typography': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) '@tiptap/extension-youtube': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) '@tiptap/html': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(happy-dom@15.11.7) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)(happy-dom@15.11.7) '@tiptap/pm': - specifier: ^3.0.9 - version: 3.0.9 + specifier: ^3.2.0 + version: 3.2.0 '@tiptap/react': - specifier: ^3.0.9 - version: 3.0.9(@floating-ui/dom@1.7.3)(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^3.2.0 + version: 3.2.0(@floating-ui/dom@1.7.3)(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tiptap/starter-kit': - specifier: ^3.0.9 - version: 3.0.9 + specifier: ^3.2.0 + version: 3.2.0 '@tiptap/suggestion': - specifier: ^3.0.9 - version: 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + specifier: ^3.2.0 + version: 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) '@types/qrcode': specifier: ^1.5.5 version: 1.5.5 @@ -244,7 +244,7 @@ importers: version: 5.80.6(react@18.3.1) '@tiptap/extension-character-count': specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + version: 2.14.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) alfaaz: specifier: ^1.1.0 version: 1.1.0 @@ -2198,29 +2198,29 @@ packages: '@floating-ui/utils@0.2.8': resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - '@hocuspocus/common@3.2.2': - resolution: {integrity: sha512-zOyjooBM9H+mIY6JpvK2eFdY1HAv/CQFO4N+t6ozlDxSHOsQfYSkmqPfv8PqtVC11BVBMLtp6yB6ssp56Dz6Sw==} + '@hocuspocus/common@3.2.3': + resolution: {integrity: sha512-P8COsx2HVXS7NbDEKe9KSt5Hd1A95hZhyTabiNPlU/Pi+7K1RJuHqIkIRr4oIxGzujvpLq/LSwBHP4NYUk+cGA==} - '@hocuspocus/extension-redis@3.2.2': - resolution: {integrity: sha512-fcOBBA6Y72KShsmknwZH/IsnV3nLuEpLae3lb/P+mlMYtkXfdWRvfO/BrLkdwaKUrWg0JkVWkAfURTwh3B4pcg==} + '@hocuspocus/extension-redis@3.2.3': + resolution: {integrity: sha512-keHKNPBiQBMSOS4ZuKnD15pfOUD5phr8mhW68P9IRIlJcrW8FJG2NBtW8oR38wKMzRtXKG3eKrs03B2KLteScA==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 - '@hocuspocus/provider@3.2.2': - resolution: {integrity: sha512-Msa3ZFQZ4hAhBX/iMjTMKU7ogCODzB53dLm26OVmIM01iwkIibU11TUEOfV0qSN8g1xvbIFU8yxSrC/Tx/JMBQ==} + '@hocuspocus/provider@3.2.3': + resolution: {integrity: sha512-M62Fly7s6sKKGGFze46fypjV3jv2Y2l8PA6/+IgbQRWH275p8NjGP1U7yMOxi52PLFrgaEoy+fQyW93iJ2jqaw==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 - '@hocuspocus/server@3.2.2': - resolution: {integrity: sha512-uPVyaewsJYYp/U9Zt42Hh3CZsoNtji6Q809jFQQlrYXTOlFNwshErBxpi8hjChla2BvIZn129PgICZeoPdYBbQ==} + '@hocuspocus/server@3.2.3': + resolution: {integrity: sha512-JVidUfVWQJXC2ngDAMvrAK99V5NoGo/5/R/VvJU6bkOwHKfvl/UpFQjP9FwIiDQ/Uwj9P0mQr1gyWs2Tx4k7/w==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 - '@hocuspocus/transformer@3.2.2': - resolution: {integrity: sha512-HcCLasMbBOU/MaWfb+PCcCKwROj6Zpy2xLbiwqoAJ4tyQvuN5rinWGbXIhevtz7RjfTGMk4L2McCSYVxfjxB7A==} + '@hocuspocus/transformer@3.2.3': + resolution: {integrity: sha512-gpClIVctiTvad7Q/ON9uFShpgm2BLlx09SGSlmyu1ddMA6Vbky9YD1lSq+ioj17z0TYaehyF7w6bBxmooAzUfA==} peerDependencies: '@tiptap/core': ^3.0.1 '@tiptap/pm': ^3.0.1 @@ -3809,31 +3809,31 @@ packages: peerDependencies: react: ^18 || ^19 - '@tiptap/core@3.0.9': - resolution: {integrity: sha512-1zdDyILerBcD3P0fu8kCtPLOFj0R5utjexCQ2CZ46pckn/Wk4V+WUBARzhG5Yz2JDkmJIUIcmLBVrL6G1rjJWg==} + '@tiptap/core@3.2.0': + resolution: {integrity: sha512-1Dk1AIwzJejcyi4FOEcKoBSLMkHMfxeDiQ0daG51eS1IZ1ZSF+Xlhg9OD5sAjbUTGQjK1HfU6kGwS9wJcR/9ZQ==} peerDependencies: - '@tiptap/pm': ^3.0.9 + '@tiptap/pm': ^3.2.0 - '@tiptap/extension-blockquote@3.0.9': - resolution: {integrity: sha512-dGhMWb6GIjgIUuLQDhSlHT6yB4YvnYqe01nHzEvcbSii75KOcLwboVnqxw4p+gsDZLvZRGv/6bZBJh7GKZa8OQ==} + '@tiptap/extension-blockquote@3.2.0': + resolution: {integrity: sha512-ivOvkzkpj/+1i6cZwUr1M+T/knci2XMl8NW/Q6g70Kx2TinEoFjOGnDi34j1mVznyzhxVlY9jm3Xvv4s2+Ni/w==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-bold@3.0.9': - resolution: {integrity: sha512-rVULIFt9ZO+fO5ty9zuC3HwY3knxUw7q9JBztpKPfQQCuIJ+iQnOfB8NtI3L8hxVSxhIR1pqr8B3S/8vlpXbVg==} + '@tiptap/extension-bold@3.2.0': + resolution: {integrity: sha512-YuwK/muBzc0r7VFV0CcnF5Otg90zfUW2D5x+KpSF0e9bUBltSvitHgRaKWFwbPAgXYwkh6+ftxEazbXeqyTv8Q==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-bubble-menu@3.0.9': - resolution: {integrity: sha512-fZQfdSbKJl3J+Yi+s8NrcLBgXHOaGVD4g+vn+orTPUlZdG9FWvEoon8DexOdK9OvYnW6QMM7kS8whOgpogVyUQ==} + '@tiptap/extension-bubble-menu@3.2.0': + resolution: {integrity: sha512-ZTE/h7Bv/dWrnEdUcvff79aEsPSYnx7s311z5xFKmNaIg8OaSEypCNKav7+2ttSBt03HcSCm7cRUY0b8yY2Y+w==} peerDependencies: - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 - '@tiptap/extension-bullet-list@3.0.9': - resolution: {integrity: sha512-Aob5TVfrtoEzfTm3wl7lognmWia6EEilOxLihSGISCvI4FTndJg+mwhumduQeYCLWkF9i/DR87m2/3EbjR3R4Q==} + '@tiptap/extension-bullet-list@3.2.0': + resolution: {integrity: sha512-xfQp2tpotSQ6pU627j20Bu+Ahgvjqe3uMVmczqjJ3V9Ze9xbiKFKJ2foC6mjQ1gfEGXkUE4AL5mVRBCWcfK8oQ==} peerDependencies: - '@tiptap/extension-list': ^3.0.9 + '@tiptap/extension-list': ^3.2.0 '@tiptap/extension-character-count@2.14.0': resolution: {integrity: sha512-aTCobbF9yIXOntVTdjzJ4G5V0TJKeeIDW8RFMdTVr5o0R/woSZ27cXiPGdS7XxpN6gY9vlNzYe79CcNBDTzLfA==} @@ -3841,217 +3841,217 @@ packages: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-code-block@3.0.9': - resolution: {integrity: sha512-H692k9sHIE3rR3S+BIknQXsLb8HSojk+7gQ5DV0hYajSzpJ02OUL4AnNlpMuSgZuaq+ljpN4sT8kCIzIE1kQxw==} + '@tiptap/extension-code-block@3.2.0': + resolution: {integrity: sha512-rGkwir451oAegeTMZw0h0JwfLfbexrgXDWw5eUpQ32/5M3n07HU2+EamTSKt7VW76AxdlehEfsd7yo+FkuVlWA==} peerDependencies: - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 - '@tiptap/extension-code@3.0.9': - resolution: {integrity: sha512-jMo7crwLIefwy13WI2FzxlyJN9AbLNsESFbJuv/KPzjpN7uzPKYsE33Uy2IZD5hPoHtA5UmAUfbz0HzWtWy5Yw==} + '@tiptap/extension-code@3.2.0': + resolution: {integrity: sha512-8eUeWzT0YNxvT9yh6p9mRziUmZjiRqHeQhHbcRYDM7gdFKb0mgsWPxiaonns0sdj7WW1vP6g0M80PC+HYCIO+g==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-collaboration-caret@3.0.9': - resolution: {integrity: sha512-TkCikMZq1bV0NasT5tWl6IwPHYCvriaL8luGH9QQwWOTOgEJ07TxhXwWBCo7mybwu2FRuqiY8X2QDzDe7hiIbQ==} + '@tiptap/extension-collaboration-caret@3.2.0': + resolution: {integrity: sha512-8RHGFvQ5bd1weuwQKoFAmlcVT7AZOffNKifsPUm2H3qCdFLkHqIBcB7Ld+HbJROZaJTHarWGcnlnbuqWsgZqHw==} peerDependencies: - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 '@tiptap/y-tiptap': ^3.0.0-beta.3 - '@tiptap/extension-collaboration@3.0.9': - resolution: {integrity: sha512-zACNmSFuEMp1G89mFs18wuQzfk769HJMFr1z/SiPw1/yM2By8uy7UKgMqVmmQ7OYTIIvCE8zq0whyBrOUpnOJg==} + '@tiptap/extension-collaboration@3.2.0': + resolution: {integrity: sha512-UanbdUp0WpGAlHAtRm9QpEvQuo/J5Cx6GXdhqPN6739wl0fQ+EudLF4L3xUevg9fCi7uL+vfK/j2bAdDbQDmRA==} peerDependencies: - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 '@tiptap/y-tiptap': ^3.0.0-beta.3 yjs: ^13 - '@tiptap/extension-color@3.0.9': - resolution: {integrity: sha512-cA68vy5lZwBVqBLMEDL6rjKIBPXRV+sUjmV+UokJcguAUTerHLK0dAHcbKRp9hJ6KF6z1KAOC7u3ZBhyjibC1w==} + '@tiptap/extension-color@3.2.0': + resolution: {integrity: sha512-MAWKy01g+FnStL8N+shBjiZH9auY3COrSJarNsXbv7lt6L9rJpCi0pkdPkcjfSaP0bkA/QuHFO98LOVT0brmpw==} peerDependencies: - '@tiptap/extension-text-style': ^3.0.9 + '@tiptap/extension-text-style': ^3.2.0 - '@tiptap/extension-document@3.0.9': - resolution: {integrity: sha512-DB/R5e6QvuGhY8EhCkfNjR2xQfz/TOWoxfQGhDuy5U+oK3WBwCcHq9t5+nbSCMHtKfi/i49aHKDvv7TQCpuP0w==} + '@tiptap/extension-document@3.2.0': + resolution: {integrity: sha512-2SQoew2HtOwuORpk8l7NjKDzsCBotMsij9vRSTp4nwoa4ZFGwmlVMsNIaKq/E/GuS7oiejmUUROsiD3w1stPKw==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-dropcursor@3.0.9': - resolution: {integrity: sha512-+P+1nfeCtPLj3OHNiATOL3UyM2omZ8+ac6MKm+FxunRAZZsHzbEFUYYdLF7prEmaf0z0c1k4LKSWpbrIX92pKA==} + '@tiptap/extension-dropcursor@3.2.0': + resolution: {integrity: sha512-fyTfePUfyfD/s+3BauAkhJh+3HvQ3hI/mblbNKHAi9u+QqlB+a0W04I027XWag8F76DTp2clGkZunlxHYHas4g==} peerDependencies: - '@tiptap/extensions': ^3.0.9 + '@tiptap/extensions': ^3.2.0 - '@tiptap/extension-floating-menu@3.0.9': - resolution: {integrity: sha512-WYQ3mW6G0zxoni6TegpQ46a1Qe1zj8Ev5sBH79H4Mbf0qsc7MOq07jLjipv9M0EJJPUi0cfkQlwfV41nH1ue/g==} + '@tiptap/extension-floating-menu@3.2.0': + resolution: {integrity: sha512-CZJztT6eC8QKNwx+89PeJGhxSsGeU04/fPS18/y2DP4bEumrfTEq7jbtholJsLqErpghOdmm0XS+byYI6Dk9pg==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 - '@tiptap/extension-gapcursor@3.0.9': - resolution: {integrity: sha512-+jy7Z/V6nOtvWin+zJYYoRwEYDOHDlF34Ey1T7A8aRcJlPeAQhoB1Ek7R3Rd3nsuByz70IfQapDvkbhY1nkNvQ==} + '@tiptap/extension-gapcursor@3.2.0': + resolution: {integrity: sha512-LUElisCLru8kAOMtihJ6nRbJ+Fml2S8GOhiry3GBRRdMpGT+Hzy2pAd9TsuNsyIdqKH+yM1lLRyquW7maaNc5g==} peerDependencies: - '@tiptap/extensions': ^3.0.9 + '@tiptap/extensions': ^3.2.0 - '@tiptap/extension-hard-break@3.0.9': - resolution: {integrity: sha512-PWNYsUwVsMWt/R5/OWjfGb+7DQT0DvH+1owBimRq0pWZepg8qkz1jdPGgsRmUFyERRsXeEpgj3VaQfrgbyUfrA==} + '@tiptap/extension-hard-break@3.2.0': + resolution: {integrity: sha512-97CFsZK5vMHoWQzAP3thKD86dFDXqagXMs7vIKVK+SErwC3eR5KXmpvS5v5hi+iNs0I8+c+es6km+ZNMaUudKA==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-heading@3.0.9': - resolution: {integrity: sha512-LRLCIt87fvDZ5CdkinzhkCwRz5ax6FlsjJzG32MJ3wXyvVslqeLXBvH28JFUZEyzgcd/SnYmYxnef5+yvAX61g==} + '@tiptap/extension-heading@3.2.0': + resolution: {integrity: sha512-bgvRBeqrVZ9rnzOrlLVsr+2S6UR3m9SAPqkdPUr0eFeC2MnaK6FVapiOx1HoQRNyGY7Cw7QBZQVsWhYmEfJpbQ==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-highlight@3.0.9': - resolution: {integrity: sha512-22cCRUMRCLYiGMw1boLGygAghtMs/QjC7Y4HLfwFurJ4d8S8FDD1YU6Iz6mzINIfhqEvke2u+9Wi3AydM/SIow==} + '@tiptap/extension-highlight@3.2.0': + resolution: {integrity: sha512-1TrV+NBZH+mlcx7ynupXETXA31PqpHfBzZazinX7+wart8nr67N1QSVCZccFadYmHm7qSkpjwiTF6m0hiWiDOA==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-history@3.0.9': - resolution: {integrity: sha512-wTSNy85Kla77y9zSUrNEGUVkqCWK9fU+Dsq8wH1A7Xrgi7vBPGkzhy8jpA8+CYtd6xI6c9IiuZrX+x44vjBlSw==} + '@tiptap/extension-history@3.2.0': + resolution: {integrity: sha512-mWFMUYQffHiuUXZDi7Rr1BFHvTSqjmU94Vf5xaWoCV4+Bk5DzuOB7NxDSAliec+JURbEjiTinRYcSLmAGbRZOQ==} peerDependencies: - '@tiptap/extensions': ^3.0.9 + '@tiptap/extensions': ^3.2.0 - '@tiptap/extension-horizontal-rule@3.0.9': - resolution: {integrity: sha512-jPNCOte0y9R3Y4PiEA/CRGgRk8WoL700Mnn8NPVHa4juUjvMl1qxL8hdnW/k8cxhrBA8tV0qcq82+/Vqq6jSfA==} + '@tiptap/extension-horizontal-rule@3.2.0': + resolution: {integrity: sha512-ttMzFO/WoRVpqfhDAZyIg1nBxgkDOXy1thE6xpfSQAEi0m7zbVEkp4OkATgt0meM69YNxJaEyzQjGztybMBgBw==} peerDependencies: - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 - '@tiptap/extension-image@3.0.9': - resolution: {integrity: sha512-/2igN/oIF58zqX5fcg00bf6qGLcQyXHysl5I8GiurkvO95d+SQTlYbJneSRUpt6CgrUKbhRnMBPVubmapgg+Zw==} + '@tiptap/extension-image@3.2.0': + resolution: {integrity: sha512-1jFWdrMXkWDfCeM4857wUd0pe6eCeDRmEJgtuZkfdvUALNYdyADdX6cWUjC7JBG8zGYFmp2XUryLQGHjNTB+iw==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-italic@3.0.9': - resolution: {integrity: sha512-Gt4FbMtZerzKpit8+FvIjIQ3CBD559/FFC+kOT9y8JHlINeqWyh/bgHuaA/9/XtHphOQiA7NDwOiuPh4KIKpqA==} + '@tiptap/extension-italic@3.2.0': + resolution: {integrity: sha512-5OTX5Z3h7zrKcjj0snE8y+2a8dZ5G6GdZKVI1tedeDBfyUFqMSkvTZ/ygYenJ/zRkMvC9gz337ZU872IWx+ung==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-link@3.0.9': - resolution: {integrity: sha512-cOsG3vpct7/JuenxCePDj5dlaSUEe2eK/g/jlRixgW4Llx5DvG2yj8+gha4MHdCUp/MrUBR4M+NJk1dOOSKXGw==} + '@tiptap/extension-link@3.2.0': + resolution: {integrity: sha512-ye9n73aFv9q/Adv6clFgV00hif7/rhsYf8gXpwmq5So/4teyOC7yp8Fg77CG2r8vZNhiJviZq6U6jlHVIBeTnw==} peerDependencies: - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 - '@tiptap/extension-list-item@3.0.9': - resolution: {integrity: sha512-K+ogk1BH/eYhsK9nSTXNdIXlxQcXzty6h1QFiZNr9XmaLk+q4NZFHR5FVz3EJ7QXyw+Gv/2FQn+T2Q/GpbMxZQ==} + '@tiptap/extension-list-item@3.2.0': + resolution: {integrity: sha512-v4cvZEWO9jQGCYUCJughMOpu5c0+9mjieTemwdF+Dd2q16WLonFx7+4YJkymB38YDaUi6dO1HFRtMKuGQRxlsg==} peerDependencies: - '@tiptap/extension-list': ^3.0.9 + '@tiptap/extension-list': ^3.2.0 - '@tiptap/extension-list-keymap@3.0.9': - resolution: {integrity: sha512-naz4+EFzLN695f53GATiglPOc5SOLBm1DNhhUHZNlrUVfDtKmrdbo8t9a/NhAE6Ne/pfg5tbuS+OKuvbJaJcAg==} + '@tiptap/extension-list-keymap@3.2.0': + resolution: {integrity: sha512-R9r6CJpuwCFrfRQ+mU+m9vyujMjnu6C10J+8engQyvVtkc4KrgnHcABoyCkDJcZe36KRgz7mL0T6wqCezPD9lQ==} peerDependencies: - '@tiptap/extension-list': ^3.0.9 + '@tiptap/extension-list': ^3.2.0 - '@tiptap/extension-list@3.0.9': - resolution: {integrity: sha512-y5JQoFmVR+6FhDdEz2oFIMkURSRSDhCtsrlNWdUpSTGnTAa2WZT7nEhHcIMSGvYU3t0fkfLQ9yTMSaQZFa5GLA==} + '@tiptap/extension-list@3.2.0': + resolution: {integrity: sha512-/3ZL9MpgDnEOv8tPwFwW3ct/TBbxZg3r3rN9noLHOR+YgiZKwbpMt9pDSJGu8y++rzT3vIHVmRRp0xFOXBvptQ==} peerDependencies: - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 - '@tiptap/extension-ordered-list@3.0.9': - resolution: {integrity: sha512-ACubdGc/y/rKPEgHTO7hDSg547wRRA+Es7c/rQgjrkpI///LBJQfixyUvNg2UNNPttNsavF/CUwhshCeo9MeBA==} + '@tiptap/extension-ordered-list@3.2.0': + resolution: {integrity: sha512-ditrS5HVX3ugx8R/4h2cHl8KOSnF1/T3caVvLpPccgbbTJNC8WldHJK/VvX/OusDO9DmbCMQiC8vIAagHMInhg==} peerDependencies: - '@tiptap/extension-list': ^3.0.9 + '@tiptap/extension-list': ^3.2.0 - '@tiptap/extension-paragraph@3.0.9': - resolution: {integrity: sha512-K5zGg4zLxxqAG0BgtRpLvKclYSGoSSuU1Fza0M5MwUgrFA0S2q4JnLB1czQ77S4pfb3hpScIe50fwJzZmIUEQw==} + '@tiptap/extension-paragraph@3.2.0': + resolution: {integrity: sha512-RQ6mu06nVP9xEVULE64oWH9MT92mQhHVwJpnkYQuc7XEe3KgPYVbUmaLWMzJbjBOnAhTBC4k37Wwk0JKiTUBNQ==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-placeholder@3.0.9': - resolution: {integrity: sha512-OgDVijDrNFDJpe/1/yMx6VFEmGBt0vE6ZWw5kGkM4NVfOxhRvv6mSZXio269dc9oBSjmyTISKaI1JAYVCfyJIw==} + '@tiptap/extension-placeholder@3.2.0': + resolution: {integrity: sha512-+yswlhZDJrCad2VXYe2NOZ9miMHFuIT7jGnKRCjIWiGpnRgB0FBSI7fjVBl1HmCDaSdVd+p0fOMHLTGYO5Fkdw==} peerDependencies: - '@tiptap/extensions': ^3.0.9 + '@tiptap/extensions': ^3.2.0 - '@tiptap/extension-strike@3.0.9': - resolution: {integrity: sha512-2TBQ9P/FGe+/34ckfwP+eCdb4vbxDVZ5qD0piDIR9Ws5QI5IdtW90pNO4roxiPeRdVFrhTbFPEIuL0tg4NQRmg==} + '@tiptap/extension-strike@3.2.0': + resolution: {integrity: sha512-gIfaIJmvQNBxjvtJfNQ8LhvWuGEFVFDMJxLa80speY4ngsDYZ3K8Ea4+0FTctKJVIXEZ5cDoHZR96ELkQMPzWA==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-subscript@3.0.9': - resolution: {integrity: sha512-FJi6TH5VnAGtqD7c8TX0JJGkabVTC69lEoSel8RUbK9P+NHk0hh1PEyCjHSNhGinepoB6GIi6+skvXHIkJb5xw==} + '@tiptap/extension-subscript@3.2.0': + resolution: {integrity: sha512-TsuHktvPGEJVc555FVZPi1AvzaN+/O2QEgoWsIVtRlrarBxxN3bKnn1Lj80/KVqsDzPmq5G9fxz799kelUhuJQ==} peerDependencies: - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 - '@tiptap/extension-superscript@3.0.9': - resolution: {integrity: sha512-an3ZLXkgO9eLxRDeWelxlzCSdGlVptPMfcg/d315SnjBKRhXJbBirLxQsYfb5CF/cGJ56Qj3TvewfKPITP5POw==} + '@tiptap/extension-superscript@3.2.0': + resolution: {integrity: sha512-NuWJaStcVx+KDXmDk0WLyKU7RJxbnF9/mCeIsgdc/9RQ9njvaAQkxjGx1F4wDiLhuizTGpxEcjbDM2zxTbUz6Q==} peerDependencies: - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 - '@tiptap/extension-table@3.0.9': - resolution: {integrity: sha512-jygDvj9MIwMlzs2c+4MZwXCXI6sc7LcKgPFoJ93qiCn6CZrDwaX3XzxXi0VAg7MexsUi1nVaGZQk/gv+Pf3rKw==} + '@tiptap/extension-table@3.2.0': + resolution: {integrity: sha512-dmhy6WvD2FIowOPPOCfWQfj9tvv0Mp1g1jZ7/GOi6bubUKO9W0wU+9c39yr/lCx7REABSxT5oEdk/2vlPPRT0w==} peerDependencies: - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 - '@tiptap/extension-text-align@3.0.9': - resolution: {integrity: sha512-QQBk8orIdntL3tPzGkKIqEogqArvO/x4dfvbAA2K0DqvS9uGJ3Qp4X6Twv+BIHLjeyhZl/z48vEMB+bjwvqg+w==} + '@tiptap/extension-text-align@3.2.0': + resolution: {integrity: sha512-fnS4O92cyQWMUFdmiNkrKYzxbf8jBzxGFZMVir3Ihh1pKtTGfoz3d6gYMayb+kqMZDgt/JmWnZdb/mLjSzD42w==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-text-style@3.0.9': - resolution: {integrity: sha512-x7SZLS537c7w789n8re0IktmkBZqz98dux/hwpFAcC4oL06YPjFG7Dy9mAiKcsKqKWI0eAyTQvMybz+TJusBbw==} + '@tiptap/extension-text-style@3.2.0': + resolution: {integrity: sha512-jr5mItJNQUVF/aY39k74uJ3Q3qJVBlm5c9ID+gTlNjvotRfNH2Pl3MOxWj/O2O4ou8JlynK8XZfa2bWguzk63g==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-text@3.0.9': - resolution: {integrity: sha512-yWdz4aW1nu5YGcinxfu3FXiwMnP/7jp+s7dFXhq9m/6zhDUD2+qyUwhJfIU4Tcz+BGdVHqoNgOA3QXLMA6jyFA==} + '@tiptap/extension-text@3.2.0': + resolution: {integrity: sha512-VDQPjVr6zd3MGh8+xPIIj+fuIhnws9tpAmP7jvBep+0tL7P2RYpN2NSj0zqeStHPcGfv9iMuXEuuMkEsi5gIZg==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-typography@3.0.9': - resolution: {integrity: sha512-vlOdZidm05AJJ2tMJXVh9ICtlutbvs+2+A7nmsGAnAqbErcleFYimaLFaWucCPsPnUz04pa4qMtW8jF2WIJQYg==} + '@tiptap/extension-typography@3.2.0': + resolution: {integrity: sha512-6q8hcj+K/EU4WGmHuxwLcGeEnQ1zXh5QQLH3pgT1r/iDtZTdWjLBabZxJkTP7xBOfAH/xoQj+sRbuWeKBtf+xQ==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-underline@3.0.9': - resolution: {integrity: sha512-xLR5NbnxlEJmvfb4Aj8wCbTmh/ycnPsSDeP8+TAsdAYxypSA6BP6G0t4d4NWreqAq+tq6QV6Eh0+YDN0G1VZxw==} + '@tiptap/extension-underline@3.2.0': + resolution: {integrity: sha512-0ObBGqgeOAhQpNdNRJcu23GVQodtVp5dBYNC9vSW+mcJPRQy3Sc+kv59pqyrH0qV4SwtzzeKQSHuNaQpMPOU5A==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extension-youtube@3.0.9': - resolution: {integrity: sha512-9buHygO7zPOCzuR65FgenKwwk2BrcBRelin5xtC+TweugKDXY9+XmvKnGrY6Lz12dxbFh+G4RAhWMZHFt+gBIQ==} + '@tiptap/extension-youtube@3.2.0': + resolution: {integrity: sha512-avWJTvLfoLoqQcQvJyn3zVBx+5/Ca50ayd4We9MAqZvo7R+H/yXFPFM4Sn9b/kqQ12qHWxG+4Vsl4K9S9XtGMA==} peerDependencies: - '@tiptap/core': ^3.0.9 + '@tiptap/core': ^3.2.0 - '@tiptap/extensions@3.0.9': - resolution: {integrity: sha512-IyTcPnZXUf0nxDkC+CCWh10vzn81Kq50euV/ivk8IyPr15hxPiT3Zk1LmCI10Pqf4Bwgz38XUIWtToDfIeEgpg==} + '@tiptap/extensions@3.2.0': + resolution: {integrity: sha512-voEvFhStH1fxw6PF5Hb7kj7PH+BMYM3d0S6d/V0bNdGB7mMsILruXkXIsxvP8Dkskv07Xmfs+iU6pdVy0hWD7Q==} peerDependencies: - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 - '@tiptap/html@3.0.9': - resolution: {integrity: sha512-DJotl3aHrfxoOlyNsOhBPuSMsghm1pv/vgHQvo1MxgP0+sBpx7zjxMuydMU87ywGcgaEpUSbE52NJQLgtbXJ5A==} + '@tiptap/html@3.2.0': + resolution: {integrity: sha512-9zr3o8yKJXBHSDMsQgS8AqsbaiBA376Yh19uZQAsmRow8+h8iRQrzW9sOtZqozRFtqPTFENt25S9oiLu5S9Dqw==} peerDependencies: - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 happy-dom: ^18.0.1 - '@tiptap/pm@3.0.9': - resolution: {integrity: sha512-cJdnpGyirRxwi6M4IkyapEK/jhcjFXdfX3uhJp/4uVH1dynNXalV0gE/YnH/yt55kzwvG9OUrwOQt+t1iXgNog==} + '@tiptap/pm@3.2.0': + resolution: {integrity: sha512-2UTlVts1Q7snQaUlxUtXfwEndNgcBcEIf74f1aEzcLzJRwBRRexCS6M0n+F50IifoB0OVBZENMBv1X/YXIPGPA==} - '@tiptap/react@3.0.9': - resolution: {integrity: sha512-BbvWPSgYGvd9m8fPXKI81gf9KP+1SMCPpscbtbbhPyxiW2ziY+jwo+i7MwVI73P89hWAJCy/43UnOde438HmOA==} + '@tiptap/react@3.2.0': + resolution: {integrity: sha512-rsro1+1yP3vLJ+YAQpWhJv/WftBr3hCGTfK6168jeX5INSjulUgALpA57o4rzp3LoNDwKreWu9iSp1JS4rsjFA==} peerDependencies: - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@3.0.9': - resolution: {integrity: sha512-CYg6tV5fYOvkP1gyATkJJj+nFYmwjDKLipQc/r0D/tHKypxefENrm4G7mf4B78zsB/izfk5mW3iujvyeod6EcQ==} + '@tiptap/starter-kit@3.2.0': + resolution: {integrity: sha512-hcA12kqxVz1ypNqXhTUStQHWmDFmd2nm8NPmQmepK5T/T2FVXhVhhGSN8KsCR8sYFr3TwOk9utszxQLkT4AwOA==} - '@tiptap/suggestion@3.0.9': - resolution: {integrity: sha512-irthqfUybezo3IwR6AXvyyTOtkzwfvvst58VXZtTnR1nN6NEcrs3TQoY3bGKGbN83bdiquKh6aU2nLnZfAhoXg==} + '@tiptap/suggestion@3.2.0': + resolution: {integrity: sha512-AEkZPsn9Fn3p/3e6LIz8dyF3npU0JjVa2rCGqj/MmmvX9MD2fRYhiTCT1y7q9Q9/4wB4+CiOT7Mt4sWiijEkxw==} peerDependencies: - '@tiptap/core': ^3.0.9 - '@tiptap/pm': ^3.0.9 + '@tiptap/core': ^3.2.0 + '@tiptap/pm': ^3.2.0 '@tiptap/y-tiptap@3.0.0': resolution: {integrity: sha512-HIeJZCj+KYJde2x6fONzo4o6kd7gW7eonwhQsv2p2VQnUgwNXMVhN+D6Z3AH/2i541Sq33y1PO4U/1ThCPjqbA==} @@ -11830,13 +11830,13 @@ snapshots: '@floating-ui/utils@0.2.8': {} - '@hocuspocus/common@3.2.2': + '@hocuspocus/common@3.2.3': dependencies: lib0: 0.2.108 - '@hocuspocus/extension-redis@3.2.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/extension-redis@3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/server': 3.2.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@hocuspocus/server': 3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@sesamecare-oss/redlock': 1.4.0(ioredis@5.7.0) ioredis: 5.7.0 kleur: 4.1.5 @@ -11849,9 +11849,9 @@ snapshots: - supports-color - utf-8-validate - '@hocuspocus/provider@3.2.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/provider@3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/common': 3.2.2 + '@hocuspocus/common': 3.2.3 '@lifeomic/attempt': 3.0.3 lib0: 0.2.108 ws: 8.18.2 @@ -11861,9 +11861,9 @@ snapshots: - bufferutil - utf-8-validate - '@hocuspocus/server@3.2.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/server@3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/common': 3.2.2 + '@hocuspocus/common': 3.2.3 async-lock: 1.4.1 kleur: 4.1.5 lib0: 0.2.108 @@ -11875,11 +11875,11 @@ snapshots: - bufferutil - utf-8-validate - '@hocuspocus/transformer@3.2.2(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/transformer@3.2.3(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 - '@tiptap/starter-kit': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 + '@tiptap/starter-kit': 3.2.0 y-prosemirror: 1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) yjs: 13.6.27 @@ -13600,194 +13600,194 @@ snapshots: '@tanstack/query-core': 5.80.6 react: 18.3.1 - '@tiptap/core@3.0.9(@tiptap/pm@3.0.9)': + '@tiptap/core@3.2.0(@tiptap/pm@3.2.0)': dependencies: - '@tiptap/pm': 3.0.9 + '@tiptap/pm': 3.2.0 - '@tiptap/extension-blockquote@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-blockquote@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-bold@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-bold@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-bubble-menu@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': + '@tiptap/extension-bubble-menu@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)': dependencies: '@floating-ui/dom': 1.7.3 - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 optional: true - '@tiptap/extension-bullet-list@3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': + '@tiptap/extension-bullet-list@3.2.0(@tiptap/extension-list@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/extension-list': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extension-list': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) - '@tiptap/extension-character-count@2.14.0(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': + '@tiptap/extension-character-count@2.14.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 - '@tiptap/extension-code-block@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': + '@tiptap/extension-code-block@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 - '@tiptap/extension-code@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-code@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-collaboration-caret@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))': + '@tiptap/extension-collaboration-caret@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 '@tiptap/y-tiptap': 3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) - '@tiptap/extension-collaboration@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': + '@tiptap/extension-collaboration@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 '@tiptap/y-tiptap': 3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) yjs: 13.6.27 - '@tiptap/extension-color@3.0.9(@tiptap/extension-text-style@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)))': + '@tiptap/extension-color@3.2.0(@tiptap/extension-text-style@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)))': dependencies: - '@tiptap/extension-text-style': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) + '@tiptap/extension-text-style': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) - '@tiptap/extension-document@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-document@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-dropcursor@3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': + '@tiptap/extension-dropcursor@3.2.0(@tiptap/extensions@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/extensions': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extensions': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) - '@tiptap/extension-floating-menu@3.0.9(@floating-ui/dom@1.7.3)(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': + '@tiptap/extension-floating-menu@3.2.0(@floating-ui/dom@1.7.3)(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)': dependencies: '@floating-ui/dom': 1.7.3 - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 optional: true - '@tiptap/extension-gapcursor@3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': + '@tiptap/extension-gapcursor@3.2.0(@tiptap/extensions@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/extensions': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extensions': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) - '@tiptap/extension-hard-break@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-hard-break@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-heading@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-heading@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-highlight@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-highlight@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-history@3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': + '@tiptap/extension-history@3.2.0(@tiptap/extensions@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/extensions': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extensions': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) - '@tiptap/extension-horizontal-rule@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': + '@tiptap/extension-horizontal-rule@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 - '@tiptap/extension-image@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-image@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-italic@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-italic@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-link@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': + '@tiptap/extension-link@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 linkifyjs: 4.3.2 - '@tiptap/extension-list-item@3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': + '@tiptap/extension-list-item@3.2.0(@tiptap/extension-list@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/extension-list': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extension-list': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) - '@tiptap/extension-list-keymap@3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': + '@tiptap/extension-list-keymap@3.2.0(@tiptap/extension-list@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/extension-list': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extension-list': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) - '@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': + '@tiptap/extension-list@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 - '@tiptap/extension-ordered-list@3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': + '@tiptap/extension-ordered-list@3.2.0(@tiptap/extension-list@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/extension-list': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extension-list': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) - '@tiptap/extension-paragraph@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-paragraph@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-placeholder@3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9))': + '@tiptap/extension-placeholder@3.2.0(@tiptap/extensions@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/extensions': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extensions': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) - '@tiptap/extension-strike@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-strike@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-subscript@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': + '@tiptap/extension-subscript@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 - '@tiptap/extension-superscript@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': + '@tiptap/extension-superscript@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 - '@tiptap/extension-table@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': + '@tiptap/extension-table@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 - '@tiptap/extension-text-align@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-text-align@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-text-style@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-text-style@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-text@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-text@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-typography@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-typography@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-underline@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-underline@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extension-youtube@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))': + '@tiptap/extension-youtube@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) - '@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': + '@tiptap/extensions@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 - '@tiptap/html@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(happy-dom@15.11.7)': + '@tiptap/html@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)(happy-dom@15.11.7)': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 happy-dom: 15.11.7 - '@tiptap/pm@3.0.9': + '@tiptap/pm@3.2.0': dependencies: prosemirror-changeset: 2.3.1 prosemirror-collab: 1.3.1 @@ -13808,52 +13808,52 @@ snapshots: prosemirror-transform: 1.10.4 prosemirror-view: 1.40.0 - '@tiptap/react@3.0.9(@floating-ui/dom@1.7.3)(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tiptap/react@3.2.0(@floating-ui/dom@1.7.3)(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 '@types/use-sync-external-store': 0.0.6 fast-deep-equal: 3.1.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.5.0(react@18.3.1) optionalDependencies: - '@tiptap/extension-bubble-menu': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) - '@tiptap/extension-floating-menu': 3.0.9(@floating-ui/dom@1.7.3)(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) + '@tiptap/extension-bubble-menu': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) + '@tiptap/extension-floating-menu': 3.2.0(@floating-ui/dom@1.7.3)(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) transitivePeerDependencies: - '@floating-ui/dom' - '@tiptap/starter-kit@3.0.9': + '@tiptap/starter-kit@3.2.0': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/extension-blockquote': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) - '@tiptap/extension-bold': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) - '@tiptap/extension-bullet-list': 3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) - '@tiptap/extension-code': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) - '@tiptap/extension-code-block': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) - '@tiptap/extension-document': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) - '@tiptap/extension-dropcursor': 3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) - '@tiptap/extension-gapcursor': 3.0.9(@tiptap/extensions@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) - '@tiptap/extension-hard-break': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) - '@tiptap/extension-heading': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) - '@tiptap/extension-horizontal-rule': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) - '@tiptap/extension-italic': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) - '@tiptap/extension-link': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) - '@tiptap/extension-list': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) - '@tiptap/extension-list-item': 3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) - '@tiptap/extension-list-keymap': 3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) - '@tiptap/extension-ordered-list': 3.0.9(@tiptap/extension-list@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)) - '@tiptap/extension-paragraph': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) - '@tiptap/extension-strike': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) - '@tiptap/extension-text': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) - '@tiptap/extension-underline': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9)) - '@tiptap/extensions': 3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/extension-blockquote': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) + '@tiptap/extension-bold': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) + '@tiptap/extension-bullet-list': 3.2.0(@tiptap/extension-list@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)) + '@tiptap/extension-code': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) + '@tiptap/extension-code-block': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) + '@tiptap/extension-document': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) + '@tiptap/extension-dropcursor': 3.2.0(@tiptap/extensions@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)) + '@tiptap/extension-gapcursor': 3.2.0(@tiptap/extensions@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)) + '@tiptap/extension-hard-break': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) + '@tiptap/extension-heading': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) + '@tiptap/extension-horizontal-rule': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) + '@tiptap/extension-italic': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) + '@tiptap/extension-link': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) + '@tiptap/extension-list': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) + '@tiptap/extension-list-item': 3.2.0(@tiptap/extension-list@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)) + '@tiptap/extension-list-keymap': 3.2.0(@tiptap/extension-list@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)) + '@tiptap/extension-ordered-list': 3.2.0(@tiptap/extension-list@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)) + '@tiptap/extension-paragraph': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) + '@tiptap/extension-strike': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) + '@tiptap/extension-text': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) + '@tiptap/extension-underline': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0)) + '@tiptap/extensions': 3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 - '@tiptap/suggestion@3.0.9(@tiptap/core@3.0.9(@tiptap/pm@3.0.9))(@tiptap/pm@3.0.9)': + '@tiptap/suggestion@3.2.0(@tiptap/core@3.2.0(@tiptap/pm@3.2.0))(@tiptap/pm@3.2.0)': dependencies: - '@tiptap/core': 3.0.9(@tiptap/pm@3.0.9) - '@tiptap/pm': 3.0.9 + '@tiptap/core': 3.2.0(@tiptap/pm@3.2.0) + '@tiptap/pm': 3.2.0 '@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: From c2cd412ac7ea77908bba5742e5f9eaed0756cc96 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Fri, 15 Aug 2025 01:19:05 -0700 Subject: [PATCH 07/21] Switch to useEditorState - Set shouldRerenderOnTransaction to false --- .../components/bubble-menu/bubble-menu.tsx | 45 ++++++++++++----- .../components/bubble-menu/color-selector.tsx | 35 +++++++++++-- .../components/bubble-menu/node-selector.tsx | 48 +++++++++++++----- .../bubble-menu/text-alignment-selector.tsx | 39 +++++++++++---- .../components/callout/callout-menu.tsx | 48 ++++++++++-------- .../editor/components/image/image-menu.tsx | 34 ++++++++++--- .../table/table-background-color.tsx | 50 ++++++++++++------- .../components/table/table-text-alignment.tsx | 30 +++++++++-- .../editor/components/video/video-menu.tsx | 34 ++++++++++--- .../src/features/editor/page-editor.tsx | 2 +- 10 files changed, 263 insertions(+), 102 deletions(-) diff --git a/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx b/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx index 67cae1a7..0f6153dc 100644 --- a/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx +++ b/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx @@ -1,5 +1,6 @@ import { BubbleMenu, BubbleMenuProps } from "@tiptap/react/menus"; -import { isNodeSelection, useEditor } from "@tiptap/react"; +import { isNodeSelection, useEditorState } from "@tiptap/react"; +import type { Editor } from "@tiptap/react"; import { FC, useEffect, useRef, useState } from "react"; import { IconBold, @@ -33,7 +34,7 @@ export interface BubbleMenuItem { } type EditorBubbleMenuProps = Omit & { - editor: ReturnType; + editor: Editor | null; }; export const EditorBubbleMenu: FC = (props) => { @@ -42,38 +43,61 @@ export const EditorBubbleMenu: FC = (props) => { const [, setDraftCommentId] = useAtom(draftCommentIdAtom); const showCommentPopupRef = useRef(showCommentPopup); + const [isNodeSelectorOpen, setIsNodeSelectorOpen] = useState(false); + const [isTextAlignmentSelectorOpen, setIsTextAlignmentOpen] = useState(false); + const [isColorSelectorOpen, setIsColorSelectorOpen] = useState(false); + const [isLinkSelectorOpen, setIsLinkSelectorOpen] = useState(false); + useEffect(() => { showCommentPopupRef.current = showCommentPopup; }, [showCommentPopup]); + const editorState = useEditorState({ + editor: props.editor, + selector: ctx => { + if (!props.editor) { + return null; + } + + return { + isBold: ctx.editor.isActive("bold"), + isItalic: ctx.editor.isActive("italic"), + isUnderline: ctx.editor.isActive("underline"), + isStrike: ctx.editor.isActive("strike"), + isCode: ctx.editor.isActive("code"), + isComment: ctx.editor.isActive("comment"), + }; + }, + }); + const items: BubbleMenuItem[] = [ { name: "Bold", - isActive: () => props.editor.isActive("bold"), + isActive: () => editorState.isBold, command: () => props.editor.chain().focus().toggleBold().run(), icon: IconBold, }, { name: "Italic", - isActive: () => props.editor.isActive("italic"), + isActive: () => editorState.isItalic, command: () => props.editor.chain().focus().toggleItalic().run(), icon: IconItalic, }, { name: "Underline", - isActive: () => props.editor.isActive("underline"), + isActive: () => editorState.isUnderline, command: () => props.editor.chain().focus().toggleUnderline().run(), icon: IconUnderline, }, { name: "Strike", - isActive: () => props.editor.isActive("strike"), + isActive: () => editorState.isStrike, command: () => props.editor.chain().focus().toggleStrike().run(), icon: IconStrikethrough, }, { name: "Code", - isActive: () => props.editor.isActive("code"), + isActive: () => editorState.isCode, command: () => props.editor.chain().focus().toggleCode().run(), icon: IconCode, }, @@ -81,7 +105,7 @@ export const EditorBubbleMenu: FC = (props) => { const commentItem: BubbleMenuItem = { name: "Comment", - isActive: () => props.editor.isActive("comment"), + isActive: () => editorState.isComment, command: () => { const commentId = uuid7(); @@ -122,11 +146,6 @@ export const EditorBubbleMenu: FC = (props) => { }, }; - const [isNodeSelectorOpen, setIsNodeSelectorOpen] = useState(false); - const [isTextAlignmentSelectorOpen, setIsTextAlignmentOpen] = useState(false); - const [isColorSelectorOpen, setIsColorSelectorOpen] = useState(false); - const [isLinkSelectorOpen, setIsLinkSelectorOpen] = useState(false); - return (
diff --git a/apps/client/src/features/editor/components/bubble-menu/color-selector.tsx b/apps/client/src/features/editor/components/bubble-menu/color-selector.tsx index 1148e0f4..34d466b2 100644 --- a/apps/client/src/features/editor/components/bubble-menu/color-selector.tsx +++ b/apps/client/src/features/editor/components/bubble-menu/color-selector.tsx @@ -9,7 +9,8 @@ import { Text, Tooltip, } from "@mantine/core"; -import { useEditor } from "@tiptap/react"; +import type { Editor } from "@tiptap/react"; +import { useEditorState } from "@tiptap/react"; import { useTranslation } from "react-i18next"; export interface BubbleColorMenuItem { @@ -18,7 +19,7 @@ export interface BubbleColorMenuItem { } interface ColorSelectorProps { - editor: ReturnType; + editor: Editor | null; isOpen: boolean; setIsOpen: Dispatch>; } @@ -108,12 +109,36 @@ export const ColorSelector: FC = ({ setIsOpen, }) => { const { t } = useTranslation(); + + const editorState = useEditorState({ + editor, + selector: ctx => { + if (!ctx.editor) { + return null; + } + + const activeColors: Record = {}; + TEXT_COLORS.forEach(({ color }) => { + activeColors[`text_${color}`] = ctx.editor.isActive("textStyle", { color }); + }); + HIGHLIGHT_COLORS.forEach(({ color }) => { + activeColors[`highlight_${color}`] = ctx.editor.isActive("highlight", { color }); + }); + + return activeColors; + }, + }); + + if (!editor || !editorState) { + return null; + } + const activeColorItem = TEXT_COLORS.find(({ color }) => - editor.isActive("textStyle", { color }), + editorState[`text_${color}`] ); const activeHighlightItem = HIGHLIGHT_COLORS.find(({ color }) => - editor.isActive("highlight", { color }), + editorState[`highlight_${color}`] ); return ( @@ -151,7 +176,7 @@ export const ColorSelector: FC = ({ justify="left" fullWidth rightSection={ - editor.isActive("textStyle", { color }) && ( + editorState[`text_${color}`] && ( ) } diff --git a/apps/client/src/features/editor/components/bubble-menu/node-selector.tsx b/apps/client/src/features/editor/components/bubble-menu/node-selector.tsx index bc2eb702..57f34a44 100644 --- a/apps/client/src/features/editor/components/bubble-menu/node-selector.tsx +++ b/apps/client/src/features/editor/components/bubble-menu/node-selector.tsx @@ -13,11 +13,12 @@ import { IconTypography, } from "@tabler/icons-react"; import { Popover, Button, ScrollArea } from "@mantine/core"; -import { useEditor } from "@tiptap/react"; +import type { Editor } from "@tiptap/react"; +import { useEditorState } from "@tiptap/react"; import { useTranslation } from "react-i18next"; interface NodeSelectorProps { - editor: ReturnType; + editor: Editor | null; isOpen: boolean; setIsOpen: Dispatch>; } @@ -36,6 +37,27 @@ export const NodeSelector: FC = ({ }) => { const { t } = useTranslation(); + const editorState = useEditorState({ + editor, + selector: ctx => { + if (!editor) { + return null; + } + + return { + isParagraph: ctx.editor.isActive("paragraph"), + isBulletList: ctx.editor.isActive("bulletList"), + isOrderedList: ctx.editor.isActive("orderedList"), + isHeading1: ctx.editor.isActive("heading", { level: 1 }), + isHeading2: ctx.editor.isActive("heading", { level: 2 }), + isHeading3: ctx.editor.isActive("heading", { level: 3 }), + isTaskItem: ctx.editor.isActive("taskItem"), + isBlockquote: ctx.editor.isActive("blockquote"), + isCodeBlock: ctx.editor.isActive("codeBlock"), + }; + }, + }); + const items: BubbleMenuItem[] = [ { name: "Text", @@ -43,45 +65,45 @@ export const NodeSelector: FC = ({ command: () => editor.chain().focus().toggleNode("paragraph", "paragraph").run(), isActive: () => - editor.isActive("paragraph") && - !editor.isActive("bulletList") && - !editor.isActive("orderedList"), + editorState.isParagraph && + !editorState.isBulletList && + !editorState.isOrderedList, }, { name: "Heading 1", icon: IconH1, command: () => editor.chain().focus().toggleHeading({ level: 1 }).run(), - isActive: () => editor.isActive("heading", { level: 1 }), + isActive: () => editorState.isHeading1, }, { name: "Heading 2", icon: IconH2, command: () => editor.chain().focus().toggleHeading({ level: 2 }).run(), - isActive: () => editor.isActive("heading", { level: 2 }), + isActive: () => editorState.isHeading2, }, { name: "Heading 3", icon: IconH3, command: () => editor.chain().focus().toggleHeading({ level: 3 }).run(), - isActive: () => editor.isActive("heading", { level: 3 }), + isActive: () => editorState.isHeading3, }, { name: "To-do List", icon: IconCheckbox, command: () => editor.chain().focus().toggleTaskList().run(), - isActive: () => editor.isActive("taskItem"), + isActive: () => editorState.isTaskItem, }, { name: "Bullet List", icon: IconList, command: () => editor.chain().focus().toggleBulletList().run(), - isActive: () => editor.isActive("bulletList"), + isActive: () => editorState.isBulletList, }, { name: "Numbered List", icon: IconListNumbers, command: () => editor.chain().focus().toggleOrderedList().run(), - isActive: () => editor.isActive("orderedList"), + isActive: () => editorState.isOrderedList, }, { name: "Blockquote", @@ -93,13 +115,13 @@ export const NodeSelector: FC = ({ .toggleNode("paragraph", "paragraph") .toggleBlockquote() .run(), - isActive: () => editor.isActive("blockquote"), + isActive: () => editorState.isBlockquote, }, { name: "Code", icon: IconCode, command: () => editor.chain().focus().toggleCodeBlock().run(), - isActive: () => editor.isActive("codeBlock"), + isActive: () => editorState.isCodeBlock, }, ]; diff --git a/apps/client/src/features/editor/components/bubble-menu/text-alignment-selector.tsx b/apps/client/src/features/editor/components/bubble-menu/text-alignment-selector.tsx index 8330684b..ae35eb48 100644 --- a/apps/client/src/features/editor/components/bubble-menu/text-alignment-selector.tsx +++ b/apps/client/src/features/editor/components/bubble-menu/text-alignment-selector.tsx @@ -8,11 +8,12 @@ import { IconChevronDown, } from "@tabler/icons-react"; import { Popover, Button, ScrollArea, rem } from "@mantine/core"; -import { useEditor } from "@tiptap/react"; +import type { Editor } from "@tiptap/react"; +import { useEditorState } from "@tiptap/react"; import { useTranslation } from "react-i18next"; interface TextAlignmentProps { - editor: ReturnType; + editor: Editor | null; isOpen: boolean; setIsOpen: Dispatch>; } @@ -31,36 +32,54 @@ export const TextAlignmentSelector: FC = ({ }) => { const { t } = useTranslation(); + const editorState = useEditorState({ + editor, + selector: ctx => { + if (!ctx.editor) { + return null; + } + + return { + isAlignLeft: ctx.editor.isActive({ textAlign: "left" }), + isAlignCenter: ctx.editor.isActive({ textAlign: "center" }), + isAlignRight: ctx.editor.isActive({ textAlign: "right" }), + isAlignJustify: ctx.editor.isActive({ textAlign: "justify" }), + }; + }, + }); + + if (!editor || !editorState) { + return null; + } + const items: BubbleMenuItem[] = [ { name: "Align left", - isActive: () => editor.isActive({ textAlign: "left" }), + isActive: () => editorState.isAlignLeft, command: () => editor.chain().focus().setTextAlign("left").run(), icon: IconAlignLeft, }, { name: "Align center", - isActive: () => editor.isActive({ textAlign: "center" }), + isActive: () => editorState.isAlignCenter, command: () => editor.chain().focus().setTextAlign("center").run(), icon: IconAlignCenter, }, { name: "Align right", - isActive: () => editor.isActive({ textAlign: "right" }), + isActive: () => editorState.isAlignRight, command: () => editor.chain().focus().setTextAlign("right").run(), icon: IconAlignRight, }, { name: "Justify", - isActive: () => editor.isActive({ textAlign: "justify" }), + isActive: () => editorState.isAlignJustify, command: () => editor.chain().focus().setTextAlign("justify").run(), icon: IconAlignJustified, }, ]; - const activeItem = items.filter((item) => item.isActive()).pop() ?? { - name: "Multiple", - }; + const activeItem = items.filter((item) => item.isActive()).pop() ?? items[0]; return ( @@ -73,7 +92,7 @@ export const TextAlignmentSelector: FC = ({ rightSection={} onClick={() => setIsOpen(!isOpen)} > - + diff --git a/apps/client/src/features/editor/components/callout/callout-menu.tsx b/apps/client/src/features/editor/components/callout/callout-menu.tsx index 843afbd8..12683bf4 100644 --- a/apps/client/src/features/editor/components/callout/callout-menu.tsx +++ b/apps/client/src/features/editor/components/callout/callout-menu.tsx @@ -1,5 +1,5 @@ import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; -import { findParentNode, posToDOMRect } from "@tiptap/react"; +import { findParentNode, posToDOMRect, useEditorState } from "@tiptap/react"; import React, { useCallback } from "react"; import { Node as PMNode } from "prosemirror-model"; import { @@ -18,6 +18,24 @@ import { useTranslation } from "react-i18next"; export function CalloutMenu({ editor }: EditorMenuProps) { const { t } = useTranslation(); + + const editorState = useEditorState({ + editor, + selector: (ctx) => { + if (!ctx.editor) { + return null; + } + + return { + isCallout: ctx.editor.isActive("callout"), + isInfo: ctx.editor.isActive("callout", { type: "info" }), + isSuccess: ctx.editor.isActive("callout", { type: "success" }), + isWarning: ctx.editor.isActive("callout", { type: "warning" }), + isDanger: ctx.editor.isActive("callout", { type: "danger" }), + }; + }, + }); + const shouldShow = useCallback( ({ state }: ShouldShowProps) => { if (!state) { @@ -58,10 +76,10 @@ export function CalloutMenu({ editor }: EditorMenuProps) { pluginKey={`callout-menu}`} updateDelay={0} options={{ - // getReferenceClientRect, + // getReferenceClientRect, placement: "right-end", - // offset: 233, - // zIndex: 99, + // offset: 233, + // zIndex: 99, flip: false, }} shouldShow={shouldShow} @@ -72,9 +90,7 @@ export function CalloutMenu({ editor }: EditorMenuProps) { onClick={() => setCalloutType("info")} size="lg" aria-label={t("Info")} - variant={ - editor.isActive("callout", { type: "info" }) ? "light" : "default" - } + variant={editorState?.isInfo ? "light" : "default"} > @@ -85,11 +101,7 @@ export function CalloutMenu({ editor }: EditorMenuProps) { onClick={() => setCalloutType("success")} size="lg" aria-label={t("Success")} - variant={ - editor.isActive("callout", { type: "success" }) - ? "light" - : "default" - } + variant={editorState?.isSuccess ? "light" : "default"} > @@ -100,11 +112,7 @@ export function CalloutMenu({ editor }: EditorMenuProps) { onClick={() => setCalloutType("warning")} size="lg" aria-label={t("Warning")} - variant={ - editor.isActive("callout", { type: "warning" }) - ? "light" - : "default" - } + variant={editorState?.isWarning ? "light" : "default"} > @@ -115,11 +123,7 @@ export function CalloutMenu({ editor }: EditorMenuProps) { onClick={() => setCalloutType("danger")} size="lg" aria-label={t("Danger")} - variant={ - editor.isActive("callout", { type: "danger" }) - ? "light" - : "default" - } + variant={editorState?.isDanger ? "light" : "default"} > diff --git a/apps/client/src/features/editor/components/image/image-menu.tsx b/apps/client/src/features/editor/components/image/image-menu.tsx index 59599b79..a75c109c 100644 --- a/apps/client/src/features/editor/components/image/image-menu.tsx +++ b/apps/client/src/features/editor/components/image/image-menu.tsx @@ -1,5 +1,5 @@ import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; -import { findParentNode, posToDOMRect } from "@tiptap/react"; +import { findParentNode, posToDOMRect, useEditorState } from "@tiptap/react"; import React, { useCallback } from "react"; import { Node as PMNode } from "prosemirror-model"; import { @@ -17,6 +17,26 @@ import { useTranslation } from "react-i18next"; export function ImageMenu({ editor }: EditorMenuProps) { const { t } = useTranslation(); + + const editorState = useEditorState({ + editor, + selector: ctx => { + if (!ctx.editor) { + return null; + } + + const imageAttrs = ctx.editor.getAttributes("image"); + + return { + isImage: ctx.editor.isActive("image"), + isAlignLeft: ctx.editor.isActive("image", { align: "left" }), + isAlignCenter: ctx.editor.isActive("image", { align: "center" }), + isAlignRight: ctx.editor.isActive("image", { align: "right" }), + imageWidth: imageAttrs?.width ? parseInt(imageAttrs.width) : null, + }; + }, + }); + const shouldShow = useCallback( ({ state }: ShouldShowProps) => { if (!state) { @@ -97,7 +117,7 @@ export function ImageMenu({ editor }: EditorMenuProps) { size="lg" aria-label={t("Align left")} variant={ - editor.isActive("image", { align: "left" }) ? "light" : "default" + editorState?.isAlignLeft ? "light" : "default" } > @@ -110,9 +130,7 @@ export function ImageMenu({ editor }: EditorMenuProps) { size="lg" aria-label={t("Align center")} variant={ - editor.isActive("image", { align: "center" }) - ? "light" - : "default" + editorState?.isAlignCenter ? "light" : "default" } > @@ -125,7 +143,7 @@ export function ImageMenu({ editor }: EditorMenuProps) { size="lg" aria-label={t("Align right")} variant={ - editor.isActive("image", { align: "right" }) ? "light" : "default" + editorState?.isAlignRight ? "light" : "default" } > @@ -133,10 +151,10 @@ export function ImageMenu({ editor }: EditorMenuProps) { - {editor.getAttributes("image")?.width && ( + {editorState?.imageWidth && ( )} diff --git a/apps/client/src/features/editor/components/table/table-background-color.tsx b/apps/client/src/features/editor/components/table/table-background-color.tsx index 204f0b02..107a3474 100644 --- a/apps/client/src/features/editor/components/table/table-background-color.tsx +++ b/apps/client/src/features/editor/components/table/table-background-color.tsx @@ -9,7 +9,8 @@ import { Tooltip, UnstyledButton, } from "@mantine/core"; -import { useEditor } from "@tiptap/react"; +import type { Editor } from "@tiptap/react"; +import { useEditorState } from "@tiptap/react"; import { useTranslation } from "react-i18next"; export interface TableColorItem { @@ -18,7 +19,7 @@ export interface TableColorItem { } interface TableBackgroundColorProps { - editor: ReturnType; + editor: Editor | null; } const TABLE_COLORS: TableColorItem[] = [ @@ -37,6 +38,34 @@ export const TableBackgroundColor: FC = ({ }) => { const { t } = useTranslation(); const [opened, setOpened] = React.useState(false); + + const editorState = useEditorState({ + editor, + selector: ctx => { + if (!ctx.editor) { + return null; + } + + let currentColor = ""; + if (ctx.editor.isActive("tableCell")) { + const attrs = ctx.editor.getAttributes("tableCell"); + currentColor = attrs.backgroundColor || ""; + } else if (ctx.editor.isActive("tableHeader")) { + const attrs = ctx.editor.getAttributes("tableHeader"); + currentColor = attrs.backgroundColor || ""; + } + + return { + currentColor, + isTableCell: ctx.editor.isActive("tableCell"), + isTableHeader: ctx.editor.isActive("tableHeader"), + }; + }, + }); + + if (!editor || !editorState) { + return null; + } const setTableCellBackground = (color: string, colorName: string) => { editor @@ -54,20 +83,7 @@ export const TableBackgroundColor: FC = ({ setOpened(false); }; - // Get current cell's background color - const getCurrentColor = () => { - if (editor.isActive("tableCell")) { - const attrs = editor.getAttributes("tableCell"); - return attrs.backgroundColor || ""; - } - if (editor.isActive("tableHeader")) { - const attrs = editor.getAttributes("tableHeader"); - return attrs.backgroundColor || ""; - } - return ""; - }; - - const currentColor = getCurrentColor(); + const currentColor = editorState.currentColor; return ( = ({ cursor: "pointer", }} > - {currentColor === item.color && ( + {editorState.currentColor === item.color && ( ; + editor: Editor | null; } interface AlignmentItem { @@ -31,26 +32,45 @@ interface AlignmentItem { export const TableTextAlignment: FC = ({ editor }) => { const { t } = useTranslation(); const [opened, setOpened] = React.useState(false); + + const editorState = useEditorState({ + editor, + selector: ctx => { + if (!ctx.editor) { + return null; + } + + return { + isAlignLeft: ctx.editor.isActive({ textAlign: "left" }), + isAlignCenter: ctx.editor.isActive({ textAlign: "center" }), + isAlignRight: ctx.editor.isActive({ textAlign: "right" }), + }; + }, + }); + + if (!editor || !editorState) { + return null; + } const items: AlignmentItem[] = [ { name: "Align left", value: "left", - isActive: () => editor.isActive({ textAlign: "left" }), + isActive: () => editorState.isAlignLeft, command: () => editor.chain().focus().setTextAlign("left").run(), icon: IconAlignLeft, }, { name: "Align center", value: "center", - isActive: () => editor.isActive({ textAlign: "center" }), + isActive: () => editorState.isAlignCenter, command: () => editor.chain().focus().setTextAlign("center").run(), icon: IconAlignCenter, }, { name: "Align right", value: "right", - isActive: () => editor.isActive({ textAlign: "right" }), + isActive: () => editorState.isAlignRight, command: () => editor.chain().focus().setTextAlign("right").run(), icon: IconAlignRight, }, diff --git a/apps/client/src/features/editor/components/video/video-menu.tsx b/apps/client/src/features/editor/components/video/video-menu.tsx index a2a696a7..c58de114 100644 --- a/apps/client/src/features/editor/components/video/video-menu.tsx +++ b/apps/client/src/features/editor/components/video/video-menu.tsx @@ -1,5 +1,5 @@ import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; -import { findParentNode, posToDOMRect } from "@tiptap/react"; +import { findParentNode, posToDOMRect, useEditorState } from "@tiptap/react"; import React, { useCallback } from "react"; import { Node as PMNode } from "prosemirror-model"; import { @@ -17,6 +17,26 @@ import { useTranslation } from "react-i18next"; export function VideoMenu({ editor }: EditorMenuProps) { const { t } = useTranslation(); + + const editorState = useEditorState({ + editor, + selector: ctx => { + if (!ctx.editor) { + return null; + } + + const videoAttrs = ctx.editor.getAttributes("video"); + + return { + isVideo: ctx.editor.isActive("video"), + isAlignLeft: ctx.editor.isActive("video", { align: "left" }), + isAlignCenter: ctx.editor.isActive("video", { align: "center" }), + isAlignRight: ctx.editor.isActive("video", { align: "right" }), + videoWidth: videoAttrs?.width ? parseInt(videoAttrs.width) : null, + }; + }, + }); + const shouldShow = useCallback( ({ state }: ShouldShowProps) => { if (!state) { @@ -97,7 +117,7 @@ export function VideoMenu({ editor }: EditorMenuProps) { size="lg" aria-label={t("Align left")} variant={ - editor.isActive("video", { align: "left" }) ? "light" : "default" + editorState?.isAlignLeft ? "light" : "default" } > @@ -110,9 +130,7 @@ export function VideoMenu({ editor }: EditorMenuProps) { size="lg" aria-label={t("Align center")} variant={ - editor.isActive("video", { align: "center" }) - ? "light" - : "default" + editorState?.isAlignCenter ? "light" : "default" } > @@ -125,7 +143,7 @@ export function VideoMenu({ editor }: EditorMenuProps) { size="lg" aria-label={t("Align right")} variant={ - editor.isActive("video", { align: "right" }) ? "light" : "default" + editorState?.isAlignRight ? "light" : "default" } > @@ -133,10 +151,10 @@ export function VideoMenu({ editor }: EditorMenuProps) { - {editor.getAttributes("video")?.width && ( + {editorState?.videoWidth && ( )} diff --git a/apps/client/src/features/editor/page-editor.tsx b/apps/client/src/features/editor/page-editor.tsx index b13e0092..b969f6e1 100644 --- a/apps/client/src/features/editor/page-editor.tsx +++ b/apps/client/src/features/editor/page-editor.tsx @@ -203,7 +203,7 @@ export default function PageEditor({ extensions, editable, immediatelyRender: true, - shouldRerenderOnTransaction: true, + shouldRerenderOnTransaction: false, editorProps: { scrollThreshold: 80, scrollMargin: 80, From bf17289ab2bf1d2b4d2abe6bde20faf38dbc8e86 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Fri, 15 Aug 2025 02:06:59 -0700 Subject: [PATCH 08/21] fix editable state --- apps/client/src/features/editor/page-editor.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/client/src/features/editor/page-editor.tsx b/apps/client/src/features/editor/page-editor.tsx index b969f6e1..d6be6884 100644 --- a/apps/client/src/features/editor/page-editor.tsx +++ b/apps/client/src/features/editor/page-editor.tsx @@ -8,7 +8,7 @@ import { onAuthenticationFailedParameters, WebSocketStatus, } from "@hocuspocus/provider"; -import { EditorContent, EditorProvider, useEditor } from "@tiptap/react"; +import { EditorContent, EditorProvider, useEditor, useEditorState } from "@tiptap/react"; import { collabExtensions, mainExtensions, @@ -257,6 +257,14 @@ export default function PageEditor({ }, [pageId, editable, remoteProvider], ); + + // Track editor's editable state since shouldRerenderOnTransaction is false + const editorIsEditable = useEditorState({ + editor, + selector: ctx => { + return ctx.editor?.isEditable ?? false; + }, + }); const debouncedUpdateContent = useDebouncedCallback((newContent: any) => { const pageData = queryClient.getQueryData(["pages", slugId]); @@ -390,7 +398,7 @@ export default function PageEditor({ )} - {editor && editor.isEditable && ( + {editor && editorIsEditable && (
From a0814ef49a1773b777370b0f9cbb9f0811b9662d Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Mon, 18 Aug 2025 13:45:41 -0700 Subject: [PATCH 09/21] add tippyoptions for reference --- .../components/callout/callout-menu.tsx | 8 ++++++ .../editor/components/drawio/drawio-menu.tsx | 9 +++++++ .../components/excalidraw/excalidraw-menu.tsx | 12 +++++++++ .../editor/components/image/image-menu.tsx | 18 ++++++++++--- .../components/table/table-cell-menu.tsx | 1 + .../editor/components/table/table-menu.tsx | 27 +++++++++++++++++++ 6 files changed, 71 insertions(+), 4 deletions(-) diff --git a/apps/client/src/features/editor/components/callout/callout-menu.tsx b/apps/client/src/features/editor/components/callout/callout-menu.tsx index 12683bf4..d658ecd3 100644 --- a/apps/client/src/features/editor/components/callout/callout-menu.tsx +++ b/apps/client/src/features/editor/components/callout/callout-menu.tsx @@ -82,6 +82,14 @@ export function CalloutMenu({ editor }: EditorMenuProps) { // zIndex: 99, flip: false, }} + //tippyOptions={{ + // getReferenceClientRect, + // offset: [0, 10], + // placement: "bottom", + // zIndex: 99, + // popperOptions: { + // modifiers: [{ name: "flip", enabled: false }], + // }, shouldShow={shouldShow} > diff --git a/apps/client/src/features/editor/components/drawio/drawio-menu.tsx b/apps/client/src/features/editor/components/drawio/drawio-menu.tsx index afa7dd58..14b06ed5 100644 --- a/apps/client/src/features/editor/components/drawio/drawio-menu.tsx +++ b/apps/client/src/features/editor/components/drawio/drawio-menu.tsx @@ -52,6 +52,15 @@ export function DrawioMenu({ editor }: EditorMenuProps) { // zIndex: 99, flip: false, }} + // tippyOptions={{ + // getReferenceClientRect, + // offset: [0, 8], + // zIndex: 99, + // popperOptions: { + // modifiers: [{ name: 'flip', enabled: false }], + // }, + // plugins: [sticky], + // sticky: 'popper', shouldShow={shouldShow} >
{ if (!ctx.editor) { return null; } - + const imageAttrs = ctx.editor.getAttributes("image"); - + return { isImage: ctx.editor.isActive("image"), isAlignLeft: ctx.editor.isActive("image", { align: "left" }), @@ -36,7 +36,7 @@ export function ImageMenu({ editor }: EditorMenuProps) { }; }, }); - + const shouldShow = useCallback( ({ state }: ShouldShowProps) => { if (!state) { @@ -108,6 +108,16 @@ export function ImageMenu({ editor }: EditorMenuProps) { //zIndex: 99, flip: false, }} + // tippyOptions={{ + // getReferenceClientRect, + // offset: [0, 8], + // zIndex: 99, + // popperOptions: { + // modifiers: [{ name: "flip", enabled: false }], + // }, + // plugins: [sticky], + // sticky: "popper", + // }} shouldShow={shouldShow} > diff --git a/apps/client/src/features/editor/components/table/table-cell-menu.tsx b/apps/client/src/features/editor/components/table/table-cell-menu.tsx index 593f76b1..c50ad2b3 100644 --- a/apps/client/src/features/editor/components/table/table-cell-menu.tsx +++ b/apps/client/src/features/editor/components/table/table-cell-menu.tsx @@ -65,6 +65,7 @@ export const TableCellMenu = React.memo( offset: 15, //zIndex: 99, }} + shouldShow={shouldShow} > diff --git a/apps/client/src/features/editor/components/table/table-menu.tsx b/apps/client/src/features/editor/components/table/table-menu.tsx index 317a43ef..643f67d1 100644 --- a/apps/client/src/features/editor/components/table/table-menu.tsx +++ b/apps/client/src/features/editor/components/table/table-menu.tsx @@ -95,6 +95,33 @@ export const TableMenu = React.memo( offset: 15, //zIndex: 99, }} + //tippyOptions={{ + // getReferenceClientRect: getReferenceClientRect, + // offset: [0, 15], + // zIndex: 99, + // popperOptions: { + // modifiers: [ + // { + // name: "preventOverflow", + // enabled: true, + // options: { + // altAxis: true, + // boundary: "clippingParents", + // padding: 8, + // }, + // }, + // { + // name: "flip", + // enabled: true, + // options: { + // boundary: editor.options.element, + // fallbackPlacements: ["top", "bottom"], + // padding: { top: 35, left: 8, right: 8, bottom: -Infinity }, + // }, + // }, + // ], + // }, + // }} shouldShow={shouldShow} > From e7e85e9fddb032707139d45603dd8b7083a29893 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Wed, 10 Sep 2025 04:19:04 +0100 Subject: [PATCH 10/21] merge main --- .../components/subpages/subpages-menu.tsx | 12 +- .../components/subpages/subpages-view.tsx | 1 + .../features/editor/extensions/extensions.ts | 19 +- .../features/editor/readonly-page-editor.tsx | 1 + apps/server/src/ee | 2 +- package.json | 56 +- pnpm-lock.yaml | 1402 ++++++++++------- 7 files changed, 864 insertions(+), 629 deletions(-) diff --git a/apps/client/src/features/editor/components/subpages/subpages-menu.tsx b/apps/client/src/features/editor/components/subpages/subpages-menu.tsx index 6cc017e2..2341d4be 100644 --- a/apps/client/src/features/editor/components/subpages/subpages-menu.tsx +++ b/apps/client/src/features/editor/components/subpages/subpages-menu.tsx @@ -1,15 +1,11 @@ -import { - BubbleMenu as BaseBubbleMenu, - posToDOMRect, - findParentNode, -} from "@tiptap/react"; +import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; +import { posToDOMRect, findParentNode } from "@tiptap/react"; import { Node as PMNode } from "@tiptap/pm/model"; import React, { useCallback } from "react"; import { ActionIcon, Tooltip } from "@mantine/core"; import { IconTrash } from "@tabler/icons-react"; import { useTranslation } from "react-i18next"; import { Editor } from "@tiptap/core"; -import { sticky } from "tippy.js"; interface SubpagesMenuProps { editor: Editor; @@ -64,7 +60,7 @@ export const SubpagesMenu = React.memo( editor={editor} pluginKey={`subpages-menu}`} updateDelay={0} - tippyOptions={{ + /* tippyOptions={{ getReferenceClientRect, offset: [0, 8], zIndex: 99, @@ -73,7 +69,7 @@ export const SubpagesMenu = React.memo( }, plugins: [sticky], sticky: "popper", - }} + }}*/ shouldShow={shouldShow} > diff --git a/apps/client/src/features/editor/components/subpages/subpages-view.tsx b/apps/client/src/features/editor/components/subpages/subpages-view.tsx index 525e2ec9..2c2c1d2f 100644 --- a/apps/client/src/features/editor/components/subpages/subpages-view.tsx +++ b/apps/client/src/features/editor/components/subpages/subpages-view.tsx @@ -19,6 +19,7 @@ export default function SubpagesView(props: NodeViewProps) { const { spaceSlug, shareId } = useParams(); const { t } = useTranslation(); + //@ts-ignore const currentPageId = editor.storage.pageId; // Get subpages from shared tree if we're in a shared context diff --git a/apps/client/src/features/editor/extensions/extensions.ts b/apps/client/src/features/editor/extensions/extensions.ts index c82d3397..b39aeaec 100644 --- a/apps/client/src/features/editor/extensions/extensions.ts +++ b/apps/client/src/features/editor/extensions/extensions.ts @@ -1,13 +1,7 @@ import { StarterKit } from "@tiptap/starter-kit"; import { TextAlign } from "@tiptap/extension-text-align"; -import { - TaskList, - TaskItem, -} from "@tiptap/extension-list"; -import { - Placeholder, - CharacterCount, -} from "@tiptap/extensions"; +import { TaskList, TaskItem } from "@tiptap/extension-list"; +import { Placeholder, CharacterCount } from "@tiptap/extensions"; import { Superscript } from "@tiptap/extension-superscript"; import SubScript from "@tiptap/extension-subscript"; import { Highlight } from "@tiptap/extension-highlight"; @@ -17,6 +11,7 @@ import { Color } from "@tiptap/extension-color"; import SlashCommand from "@/features/editor/extensions/slash-command"; import { Collaboration } from "@tiptap/extension-collaboration"; import { CollaborationCaret } from "@tiptap/extension-collaboration-caret"; + import { HocuspocusProvider } from "@hocuspocus/provider"; import { Comment, @@ -42,8 +37,8 @@ import { Embed, SearchAndReplace, Mention, - Subpages, TableDndExtension, + Subpages, } from "@docmost/editor-ext"; import { randomElement, @@ -63,7 +58,6 @@ import CodeBlockView from "@/features/editor/components/code-block/code-block-vi import DrawioView from "../components/drawio/drawio-view"; import ExcalidrawView from "@/features/editor/components/excalidraw/excalidraw-view.tsx"; import EmbedView from "@/features/editor/components/embed/embed-view.tsx"; -import SubpagesView from "@/features/editor/components/subpages/subpages-view.tsx"; import plaintext from "highlight.js/lib/languages/plaintext"; import powershell from "highlight.js/lib/languages/powershell"; import abap from "highlightjs-sap-abap"; @@ -81,6 +75,7 @@ import i18n from "@/i18n.ts"; import { MarkdownClipboard } from "@/features/editor/extensions/markdown-clipboard.ts"; import EmojiCommand from "./emoji-command"; import { countWords } from "alfaaz"; +import SubpagesView from "@/features/editor/components/subpages/subpages-view.tsx"; const lowlight = createLowlight(common); lowlight.register("mermaid", plaintext); @@ -97,6 +92,8 @@ lowlight.register("scala", scala); export const mainExtensions = [ StarterKit.configure({ undoRedo: false, + link: false, + trailingNode: false, dropcursor: { width: 3, color: "#70CFF8", @@ -107,8 +104,6 @@ export const mainExtensions = [ spellcheck: false, }, }, - link: false, - trailingNode: false, }), Placeholder.configure({ placeholder: ({ node }) => { diff --git a/apps/client/src/features/editor/readonly-page-editor.tsx b/apps/client/src/features/editor/readonly-page-editor.tsx index c1352354..60bbeb1b 100644 --- a/apps/client/src/features/editor/readonly-page-editor.tsx +++ b/apps/client/src/features/editor/readonly-page-editor.tsx @@ -55,6 +55,7 @@ export default function ReadonlyPageEditor({ onCreate={({ editor }) => { if (editor) { if (pageId) { + // @ts-ignore editor.storage.pageId = pageId; } // @ts-ignore diff --git a/apps/server/src/ee b/apps/server/src/ee index e71f70c2..d90ce7a2 160000 --- a/apps/server/src/ee +++ b/apps/server/src/ee @@ -1 +1 @@ -Subproject commit e71f70c29950efc02f9fe795b7d4b4c9d1060db4 +Subproject commit d90ce7a20f20575c4afa74b0373a18e9555ed0fe diff --git a/package.json b/package.json index f4dcb771..0f653ab8 100644 --- a/package.json +++ b/package.json @@ -28,34 +28,34 @@ "@joplin/turndown": "^4.0.74", "@joplin/turndown-plugin-gfm": "^1.0.56", "@sindresorhus/slugify": "1.1.0", - "@tiptap/core": "^3.2.0", - "@tiptap/extension-code-block": "^3.2.0", - "@tiptap/extension-collaboration": "^3.2.0", - "@tiptap/extension-collaboration-caret": "^3.2.0", - "@tiptap/extension-color": "^3.2.0", - "@tiptap/extension-document": "^3.2.0", - "@tiptap/extension-heading": "^3.2.0", - "@tiptap/extension-highlight": "^3.2.0", - "@tiptap/extension-history": "^3.2.0", - "@tiptap/extension-image": "^3.2.0", - "@tiptap/extension-link": "^3.2.0", - "@tiptap/extension-list": "^3.2.0", - "@tiptap/extension-list-item": "^3.2.0", - "@tiptap/extension-list-keymap": "^3.2.0", - "@tiptap/extension-placeholder": "^3.2.0", - "@tiptap/extension-subscript": "^3.2.0", - "@tiptap/extension-superscript": "^3.2.0", - "@tiptap/extension-table": "^3.2.0", - "@tiptap/extension-text": "^3.2.0", - "@tiptap/extension-text-align": "^3.2.0", - "@tiptap/extension-text-style": "^3.2.0", - "@tiptap/extension-typography": "^3.2.0", - "@tiptap/extension-youtube": "^3.2.0", - "@tiptap/html": "^3.2.0", - "@tiptap/pm": "^3.2.0", - "@tiptap/react": "^3.2.0", - "@tiptap/starter-kit": "^3.2.0", - "@tiptap/suggestion": "^3.2.0", + "@tiptap/core": "^3.4.2", + "@tiptap/extension-code-block": "^3.4.2", + "@tiptap/extension-collaboration": "^3.4.2", + "@tiptap/extension-collaboration-caret": "^3.4.2", + "@tiptap/extension-color": "^3.4.2", + "@tiptap/extension-document": "^3.4.2", + "@tiptap/extension-heading": "^3.4.2", + "@tiptap/extension-highlight": "^3.4.2", + "@tiptap/extension-history": "^3.4.2", + "@tiptap/extension-image": "^3.4.2", + "@tiptap/extension-link": "^3.4.2", + "@tiptap/extension-list": "^3.4.2", + "@tiptap/extension-list-item": "^3.4.2", + "@tiptap/extension-list-keymap": "^3.4.2", + "@tiptap/extension-placeholder": "^3.4.2", + "@tiptap/extension-subscript": "^3.4.2", + "@tiptap/extension-superscript": "^3.4.2", + "@tiptap/extension-table": "^3.4.2", + "@tiptap/extension-text": "^3.4.2", + "@tiptap/extension-text-align": "^3.4.2", + "@tiptap/extension-text-style": "^3.4.2", + "@tiptap/extension-typography": "^3.4.2", + "@tiptap/extension-youtube": "^3.4.2", + "@tiptap/html": "^3.4.2", + "@tiptap/pm": "^3.4.2", + "@tiptap/react": "^3.4.2", + "@tiptap/starter-kit": "^3.4.2", + "@tiptap/suggestion": "^3.4.2", "@types/qrcode": "^1.5.5", "bytes": "^3.1.2", "cross-env": "^7.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b9fdc892..1baaa646 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,18 +22,21 @@ importers: '@docmost/editor-ext': specifier: workspace:* version: link:packages/editor-ext + '@floating-ui/dom': + specifier: ^1.7.3 + version: 1.7.3 '@hocuspocus/extension-redis': - specifier: ^2.15.2 - version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + specifier: ^3.2.3 + version: 3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/provider': - specifier: ^2.15.2 - version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + specifier: ^3.2.3 + version: 3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/server': - specifier: ^2.15.2 - version: 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + specifier: ^3.2.3 + version: 3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/transformer': - specifier: ^2.15.2 - version: 2.15.2(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) + specifier: ^3.2.3 + version: 3.2.3(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) '@joplin/turndown': specifier: ^4.0.74 version: 4.0.74 @@ -44,107 +47,89 @@ importers: specifier: 1.1.0 version: 1.1.0 '@tiptap/core': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/pm@2.14.0) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/pm@3.4.2) '@tiptap/extension-code-block': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-code-block-lowlight': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/extension-code-block@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(highlight.js@11.11.1)(lowlight@3.3.0) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) '@tiptap/extension-collaboration': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)) - '@tiptap/extension-collaboration-cursor': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) + '@tiptap/extension-collaboration-caret': + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)) '@tiptap/extension-color': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/extension-text-style@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/extension-text-style@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))) '@tiptap/extension-document': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) '@tiptap/extension-heading': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) '@tiptap/extension-highlight': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) '@tiptap/extension-history': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) '@tiptap/extension-image': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) '@tiptap/extension-link': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extension-list': + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) '@tiptap/extension-list-item': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) '@tiptap/extension-list-keymap': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) '@tiptap/extension-placeholder': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) '@tiptap/extension-subscript': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) '@tiptap/extension-superscript': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) '@tiptap/extension-table': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-table-cell': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-table-header': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-table-row': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-task-item': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-task-list': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) '@tiptap/extension-text': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) '@tiptap/extension-text-align': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) '@tiptap/extension-text-style': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) '@tiptap/extension-typography': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-underline': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) '@tiptap/extension-youtube': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) '@tiptap/html': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(happy-dom@15.11.7) '@tiptap/pm': - specifier: ^2.10.3 - version: 2.14.0 + specifier: ^3.4.2 + version: 3.4.2 '@tiptap/react': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^3.4.2 + version: 3.4.2(@floating-ui/dom@1.7.3)(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tiptap/starter-kit': - specifier: ^2.10.3 - version: 2.14.0 + specifier: ^3.4.2 + version: 3.4.2 '@tiptap/suggestion': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) + specifier: ^3.4.2 + version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) '@types/qrcode': specifier: ^1.5.5 version: 1.5.5 @@ -163,6 +148,9 @@ importers: fractional-indexing-jittered: specifier: ^1.0.0 version: 1.0.0 + highlight.js: + specifier: ^11.11.1 + version: 11.11.1 ioredis: specifier: ^5.4.1 version: 5.4.1 @@ -256,7 +244,7 @@ importers: version: 5.80.6(react@18.3.1) '@tiptap/extension-character-count': specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) + version: 2.14.0(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) alfaaz: specifier: ^1.1.0 version: 1.1.0 @@ -303,8 +291,8 @@ importers: specifier: ^1.3.0 version: 1.3.0(@mantine/form@8.1.3(react@18.3.1))(zod@3.25.56) mermaid: - specifier: ^11.6.0 - version: 11.6.0 + specifier: ^11.11.0 + version: 11.11.0 mitt: specifier: ^3.0.1 version: 3.0.1 @@ -531,6 +519,12 @@ importers: kysely-migration-cli: specifier: ^0.4.2 version: 0.4.2 + ldapts: + specifier: ^7.4.0 + version: 7.4.0 + mammoth: + specifier: ^1.10.0 + version: 1.10.0 mime-types: specifier: ^2.1.35 version: 2.1.35 @@ -558,6 +552,9 @@ importers: passport-jwt: specifier: ^4.0.1 version: 4.0.1 + pdfjs-dist: + specifier: ^5.4.54 + version: 5.4.54 pg: specifier: ^8.16.0 version: 8.16.0 @@ -725,11 +722,11 @@ packages: resolution: {integrity: sha512-AP6FvhMybCYs3gs+vzEAzSU1K//AFT3SVTRFv+C3WMO5dLeAHeGzM8I2dxD5EHQQtqIE/8apP6CxGrnpA5YlFg==} engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@antfu/install-pkg@0.4.1': - resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==} + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - '@antfu/utils@0.7.10': - resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + '@antfu/utils@9.2.0': + resolution: {integrity: sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==} '@asamuzakjp/css-color@2.8.3': resolution: {integrity: sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==} @@ -2189,9 +2186,15 @@ packages: '@floating-ui/core@1.5.3': resolution: {integrity: sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==} + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + '@floating-ui/dom@1.6.3': resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + '@floating-ui/dom@1.7.3': + resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==} + '@floating-ui/react-dom@2.1.2': resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} peerDependencies: @@ -2204,35 +2207,38 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@floating-ui/utils@0.2.8': resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - '@hocuspocus/common@2.15.2': - resolution: {integrity: sha512-wU1wxXNnQQMXyeL3mdSDYiQsm/r/QyJVjjQhF7sUBrLnjdsN7bA1cvfcSvJBr1ymrMSeYRmUL3UlQmEHEOaP7w==} + '@hocuspocus/common@3.2.3': + resolution: {integrity: sha512-P8COsx2HVXS7NbDEKe9KSt5Hd1A95hZhyTabiNPlU/Pi+7K1RJuHqIkIRr4oIxGzujvpLq/LSwBHP4NYUk+cGA==} - '@hocuspocus/extension-redis@2.15.2': - resolution: {integrity: sha512-2BNBLnDEQq2v3uQSidBSdUOIbHhH383SGxn+hmy6tDQfrt2hLE4MwilgDdcCO0FKOCYaJrV7HyKu6/WyzLbAOg==} + '@hocuspocus/extension-redis@3.2.3': + resolution: {integrity: sha512-keHKNPBiQBMSOS4ZuKnD15pfOUD5phr8mhW68P9IRIlJcrW8FJG2NBtW8oR38wKMzRtXKG3eKrs03B2KLteScA==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 - '@hocuspocus/provider@2.15.2': - resolution: {integrity: sha512-mdBurviyaUd7bQx4vMIE39WqRJDTpfFelHOVXr7w/jA8G1E7K7lxQ9/DacSrbg+9o8s+1z1+SerZiUjaToaBJg==} + '@hocuspocus/provider@3.2.3': + resolution: {integrity: sha512-M62Fly7s6sKKGGFze46fypjV3jv2Y2l8PA6/+IgbQRWH275p8NjGP1U7yMOxi52PLFrgaEoy+fQyW93iJ2jqaw==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 - '@hocuspocus/server@2.15.2': - resolution: {integrity: sha512-+fLRVswg+bkgfHqJ+wFgywivw3H08WMOtVvJF7dJzWT2ZR/Sc3nDMFh2KqMF6Ygh4z6mt23xr7SKIm3eP1zoLA==} + '@hocuspocus/server@3.2.3': + resolution: {integrity: sha512-JVidUfVWQJXC2ngDAMvrAK99V5NoGo/5/R/VvJU6bkOwHKfvl/UpFQjP9FwIiDQ/Uwj9P0mQr1gyWs2Tx4k7/w==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 - '@hocuspocus/transformer@2.15.2': - resolution: {integrity: sha512-FAo/rt0kch+YeBBp/iit74q+4RV6YRjdZXmvE0/Aw+n/nSW1W0ZNGXnhncfm8qP0CuXnss/Aw8dpfEPZKUWDJw==} + '@hocuspocus/transformer@3.2.3': + resolution: {integrity: sha512-gpClIVctiTvad7Q/ON9uFShpgm2BLlx09SGSlmyu1ddMA6Vbky9YD1lSq+ioj17z0TYaehyF7w6bBxmooAzUfA==} peerDependencies: - '@tiptap/core': ^2.6.4 - '@tiptap/pm': ^2.6.4 + '@tiptap/core': ^3.0.1 + '@tiptap/pm': ^3.0.1 y-prosemirror: ^1.2.1 yjs: ^13.6.8 @@ -2259,8 +2265,8 @@ packages: '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@2.1.33': - resolution: {integrity: sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==} + '@iconify/utils@3.0.1': + resolution: {integrity: sha512-A78CUEnFGX8I/WlILxJCuIJXloL0j/OJ9PSchPAfCargEIKmUBWvvEMmKWB5oONwiUqlNt+5eRufdkLxeHIWYw==} '@inquirer/checkbox@4.1.2': resolution: {integrity: sha512-PL9ixC5YsPXzXhAZFUPmkXGxfgjkdfZdPEPPmt4kFwQ4LBMDG9n/nHXYRGGZSKZJs+d1sGKWgS2GiPzVRKUdtQ==} @@ -2392,6 +2398,9 @@ packages: '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + '@ioredis/commands@1.3.1': + resolution: {integrity: sha512-bYtU8avhGIcje3IhvF9aSjsa5URMZBHnwKtOvXsT4sfYy9gppW11gLPT/9oNqlJZD47yPKveQFTAFWpHjKvUoQ==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2571,8 +2580,8 @@ packages: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true - '@mermaid-js/parser@0.4.0': - resolution: {integrity: sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA==} + '@mermaid-js/parser@0.6.2': + resolution: {integrity: sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==} '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2': resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==} @@ -2604,6 +2613,70 @@ packages: cpu: [x64] os: [win32] + '@napi-rs/canvas-android-arm64@0.1.77': + resolution: {integrity: sha512-jC8YX0rbAnu9YrLK1A52KM2HX9EDjrJSCLVuBf9Dsov4IC6GgwMLS2pwL9GFLJnSZBFgdwnA84efBehHT9eshA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/canvas-darwin-arm64@0.1.77': + resolution: {integrity: sha512-VFaCaCgAV0+hPwXajDIiHaaGx4fVCuUVYp/CxCGXmTGz699ngIEBx3Sa2oDp0uk3X+6RCRLueb7vD44BKBiPIg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/canvas-darwin-x64@0.1.77': + resolution: {integrity: sha512-uD2NSkf6I4S3o0POJDwweK85FE4rfLNA2N714MgiEEMMw5AmupfSJGgpYzcyEXtPzdaca6rBfKcqNvzR1+EyLQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.77': + resolution: {integrity: sha512-03GxMMZGhHRQxiA4gyoKT6iQSz8xnA6T9PAfg/WNJnbkVMFZG782DwUJUb39QIZ1uE1euMCPnDgWAJ092MmgJQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/canvas-linux-arm64-gnu@0.1.77': + resolution: {integrity: sha512-ZO+d2gRU9JU1Bb7SgJcJ1k9wtRMCpSWjJAJ+2phhu0Lw5As8jYXXXmLKmMTGs1bOya2dBMYDLzwp7KS/S/+aCA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-arm64-musl@0.1.77': + resolution: {integrity: sha512-S1KtnP1+nWs2RApzNkdNf8X4trTLrHaY7FivV61ZRaL8NvuGOkSkKa+gWN2iedIGFEDz6gecpl/JAUSewwFXYg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.77': + resolution: {integrity: sha512-A4YIKFYUwDtrSzCtdCAO5DYmRqlhCVKHdpq0+dBGPnIEhOQDFkPBTfoTAjO3pjlEnorlfKmNMOH21sKQg2esGA==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/canvas-linux-x64-gnu@0.1.77': + resolution: {integrity: sha512-Lt6Sef5l0+5O1cSZ8ysO0JI+x+rSrqZyXs5f7+kVkCAOVq8X5WTcDVbvWvEs2aRhrWTp5y25Jf2Bn+3IcNHOuQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-linux-x64-musl@0.1.77': + resolution: {integrity: sha512-NiNFvC+D+omVeJ3IjYlIbyt/igONSABVe9z0ZZph29epHgZYu4eHwV9osfpRt1BGGOAM8LkFrHk4LBdn2EDymA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-win32-x64-msvc@0.1.77': + resolution: {integrity: sha512-fP6l0hZiWykyjvpZTS3sI46iib8QEflbPakNoUijtwyxRuOPTTBfzAWZUz5z2vKpJJ/8r305wnZeZ8lhsBHY5A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/canvas@0.1.77': + resolution: {integrity: sha512-N9w2DkEKE1AXGp3q55GBOP6BEoFrqChDiFqJtKViTpQCWNOSVuMz7LkoGehbnpxtidppbsC36P0kCZNqJKs29w==} + engines: {node: '>= 10'} + '@napi-rs/wasm-runtime@0.2.4': resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} @@ -3477,6 +3550,12 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + '@sesamecare-oss/redlock@1.4.0': + resolution: {integrity: sha512-2z589R+yxKLN4CgKxP1oN4dsg6Y548SE4bVYam/R0kHk7Q9VrQ9l66q+k1ehhSLLY4or9hcchuF9/MhuuZdjJg==} + engines: {node: '>=16'} + peerDependencies: + ioredis: '>=5' + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -3809,31 +3888,31 @@ packages: peerDependencies: react: ^18 || ^19 - '@tiptap/core@2.14.0': - resolution: {integrity: sha512-MBSMzGYRFlwYCocvx3dU7zpCBSDQ0qWByNtStaEzuBUgzCJ6wn2DP/xG0cMcLmE3Ia0VLM4nwbLOAAvBXOtylA==} + '@tiptap/core@3.4.2': + resolution: {integrity: sha512-OYU0VoFiMoIsMfQibyuNf1dk3ERvUK/eBKsfMnEr8Tr3+l0ltg+xxjiLe/U0NHR/A0myvNXqc2zyVxtyDRYPGg==} peerDependencies: - '@tiptap/pm': ^2.7.0 + '@tiptap/pm': ^3.4.2 - '@tiptap/extension-blockquote@2.14.0': - resolution: {integrity: sha512-AwqPP0jLYNioKxakiVw0vlfH/ceGFbV+SGoqBbPSGFPRdSbHhxHDNBlTtiThmT3N2PiVwXAD9xislJV+WY4GUA==} + '@tiptap/extension-blockquote@3.4.2': + resolution: {integrity: sha512-v7tONi9eTVHK8s6ligSMz1ATy72zQNNrI0A7EmX9kTcUodVl44i0Tw+mgGyeMEKo+oSX88yPhD+lKXKUVleRHA==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-bold@2.14.0': - resolution: {integrity: sha512-8DWwelH55H8KtLECSIv0wh8x/F/6lpagV/pMvT+Azujad0oqK+1iAPKU/kLgjXbFSkisrpV6KSwQts5neCtfRQ==} + '@tiptap/extension-bold@3.4.2': + resolution: {integrity: sha512-/TYN0jFlXul/D9TSqh4i5vnZR5AmptOc6SJCYZAoi/U7qF4D2xtuAic+lkW0p60Gtrgqgap666scvVCnpnJlzQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-bubble-menu@2.14.0': - resolution: {integrity: sha512-sN15n0RjPh+2Asvxs7l47hVEvX6c0aPempU8QQWcPUlHoGf1D/XkyHXy6GWVPSxZ5Rj5uAwgKvhHsG/FJ/YGKQ==} + '@tiptap/extension-bubble-menu@3.4.2': + resolution: {integrity: sha512-N8rbb6H5qfXMRdudB3Uz4kUjfGf3bcIbu20/4emRFajILvhnbobvmYGPsWxVVS4UL0tKETCfEuTVaflWy+ZrmQ==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 - '@tiptap/extension-bullet-list@2.14.0': - resolution: {integrity: sha512-SWnL4bP8Mm/mWN42AMQNoqYE0V6LgSBTVsHwwAki2wIUQdr9HyoAnohvHy3IME56NMwoyZyo+Mzl45wOqUxziA==} + '@tiptap/extension-bullet-list@3.4.2': + resolution: {integrity: sha512-j7hPCaULln7w90KMyvcubM51bQrmmzHKQJcs/EccN6rhsL3hqJ4fIiyGRKhGbv4QVXzqwLJXNkQusOKDchi8pw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extension-list': ^3.4.2 '@tiptap/extension-character-count@2.14.0': resolution: {integrity: sha512-aTCobbF9yIXOntVTdjzJ4G5V0TJKeeIDW8RFMdTVr5o0R/woSZ27cXiPGdS7XxpN6gY9vlNzYe79CcNBDTzLfA==} @@ -3841,239 +3920,229 @@ packages: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-code-block-lowlight@2.14.0': - resolution: {integrity: sha512-jGcVOkcThwzLdXf56zYkmB0tcB8Xy3S+ImS3kDzaccdem6qCG05JeE33K8bfPqh99OU1QqO9XdHNO9x77A2jug==} + '@tiptap/extension-code-block@3.4.2': + resolution: {integrity: sha512-H5Y8Rs3EnH9u5gkxEikUWTyBf1WmttPSmEsEmBh0a6Lj9m3NxAbOEvKszibkqJNvfQdpomKCMQU6w/OXiZC/DQ==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/extension-code-block': ^2.7.0 - '@tiptap/pm': ^2.7.0 - highlight.js: ^11 - lowlight: ^2 || ^3 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 - '@tiptap/extension-code-block@2.14.0': - resolution: {integrity: sha512-LRYYZeh8U2XgfTsJ4houB9s9cVRt7PRfVa4MaCeOYKfowVOKQh67yV5oom8Azk9XrMPkPxDmMmdPAEPxeVYFvw==} + '@tiptap/extension-code@3.4.2': + resolution: {integrity: sha512-7A/ihn8ayA7K6CzETmWFVzixyOVRVSviRMIleNGknBtF6C4bmqfuwBa2KAonylv5ws0JZfQRQU7itrHE8FVdEg==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-code@2.14.0': - resolution: {integrity: sha512-kyo02mnzqgwXayMcyRA/fHQgb+nMmQQpIt1irZwjtEoFZshA7NnY/6b5SJmRcxQ4/X4r2Y2Ha2sWmOcEkLmt4A==} + '@tiptap/extension-collaboration-caret@3.4.2': + resolution: {integrity: sha512-+lg/7UnIMIbmwmA5IUkTQDFypcIuCzGmdo2oNVxKz1WS6boNefVGiqhXv+l7/RRdL1g5HvmWypsTznShQIU2TA==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 + '@tiptap/y-tiptap': ^3.0.0-beta.3 - '@tiptap/extension-collaboration-cursor@2.14.0': - resolution: {integrity: sha512-TfdHPW/npLSsu9AMSyPhA9I084jNhou/Xph0HgzlibEOeeGZP9EAmozAceTv8YdFytoUqW/T7YKeoMEkVSJwqA==} + '@tiptap/extension-collaboration@3.4.2': + resolution: {integrity: sha512-VS/wiWwrEmyy1emqGF+yStpo58xPYgF440U9ciFMyB2nRI+4DIbsmt0yQz3eczzXEQ3oeSTSIC9nnW+RVZ1FNw==} peerDependencies: - '@tiptap/core': ^2.7.0 - y-prosemirror: ^1.2.11 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 + '@tiptap/y-tiptap': ^3.0.0-beta.3 + yjs: ^13 - '@tiptap/extension-collaboration@2.14.0': - resolution: {integrity: sha512-eYErqs/YwS5yifyPg511Tx8Qy7AOJTqzVpS0RXVKFWTJvwK2dRc77LqThdpouO6j2utjFf44vf80ti1+9wetZA==} + '@tiptap/extension-color@3.4.2': + resolution: {integrity: sha512-FvgmGQfi+aFffD2N2Ffn9q2r0TObaG4oSfnv3dxR5xVgRTT0KL5doxdD4i+RmX9OC8uchW6TGVlK5Fy+bOZBrw==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - y-prosemirror: ^1.2.11 + '@tiptap/extension-text-style': ^3.4.2 - '@tiptap/extension-color@2.14.0': - resolution: {integrity: sha512-sY+eWIbkCMAwOGH7pQ1ZuNqkqMaaHE+TsJwA7bQ6VhI2gGhhqGjT/DfmJMUen8FSdzuPoWlgtuXXCeOO6FOduw==} + '@tiptap/extension-document@3.4.2': + resolution: {integrity: sha512-y6XfihmKYrqUEAeyZkkF39/dBqvjf7TavCPVPaN42agjFYukiZExgtDb+xkagxdbDzf1F8327CyoAqNajhj79Q==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/extension-text-style': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-document@2.14.0': - resolution: {integrity: sha512-qwEgpPIJ3AgXdEtRTr88hODbXRdt14VAwLj27PTSqexB5V7Ra1Jy7iQDhqRwBCoUomVywBsWYxkSuDisSRG+9w==} + '@tiptap/extension-dropcursor@3.4.2': + resolution: {integrity: sha512-BHjfpusRvxsa8aV1C0O0mNNjBGWfa1uwolHflCOb4PNkh9nGU0htuaPYTS4fGEVVKOhOC9qsp0hUHSejWL1E6g==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extensions': ^3.4.2 - '@tiptap/extension-dropcursor@2.14.0': - resolution: {integrity: sha512-FIh5cdPuoPKvZ0GqSKhzMZGixm05ac3hSgqhMNCBZmXX459qBUI9CvDl/uzSnY9koBDeLVV3HYMthWQQLSXl9A==} + '@tiptap/extension-floating-menu@3.4.2': + resolution: {integrity: sha512-2jDugvR7e506fDfmO22cHU0XnRyBsvig8XNSBPEcXyP3xy53kxiaCF4CzRC8DyzuC7u1NilII27TnwV5iM+9Pg==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 - '@tiptap/extension-floating-menu@2.14.0': - resolution: {integrity: sha512-Khx7M7RfZlD1/T/PUlpJmao6FtEBa2L6td2hhaW1USflwGJGk0U/ud4UEqh+aZoJZrkot/EMhEvzmORF3nq+xw==} + '@tiptap/extension-gapcursor@3.4.2': + resolution: {integrity: sha512-cn85HNyqaZpY0QPmETyB0QS/B24rFQxvtOLL1gf0hLFvTp7kuMYTFcU6CgDibr4uDu2hBBXhgTRTOl2e3bN8Xw==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/extensions': ^3.4.2 - '@tiptap/extension-gapcursor@2.14.0': - resolution: {integrity: sha512-as+SqC39FRshw4Fm1XVlrdSXveiusf5xiC4nuefLmXsUxO7Yx67x8jS0/VQbxWTLHZ6R1YEW8prLtnxGmVLCAQ==} + '@tiptap/extension-hard-break@3.4.2': + resolution: {integrity: sha512-h5CfGZyUrhzUCXwYgmxUaQKsu+zZC2iDpJkJK9TH7PobWkN3fFPfmc1D2LrDyYI24G8ozzqHQissAQl4JEag5w==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-hard-break@2.14.0': - resolution: {integrity: sha512-A8c8n8881iBq3AusNqibh6Hloybr+FgYdg4Lg4jNxbbEaL0WhyLFge1bWlGVpbHXFqdv5YldMUAu6Rop3FhNvw==} + '@tiptap/extension-heading@3.4.2': + resolution: {integrity: sha512-8Gbc52jjDVhVbXoNNVXeIkfMP3sHCfqW/GqYjZ9onYPYk1GD4DkSAMH9naRJ8g/+Z6lOkKM+ySF/gtdAVOnBTQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-heading@2.14.0': - resolution: {integrity: sha512-vM//6G3Ox3mxPv9eilhrDqylELCc8kEP1aQ4xUuOw7vCidjNtGggOa1ERnnpV2dCa2A9E8y4FHtN4Xh29stXQg==} + '@tiptap/extension-highlight@3.4.2': + resolution: {integrity: sha512-jLPTmTuMQTP4nhCWG9XL1QKoOv8a7XG6NrqtBO/8+wHPGrl+C9Qb+QxrJrbrpsC7IadNVccp6hF4qAGAaVLtQg==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-highlight@2.14.0': - resolution: {integrity: sha512-21eouZEuCBFrpGeefnnU9yJ1SH32L9gSlT9MOJXBSXCX5HFskNLdN8Q4cQSyRXSt6r5kEz1GG5a4I805/U2TMQ==} + '@tiptap/extension-history@3.4.2': + resolution: {integrity: sha512-z18QsAyqkYfrKa84vo7mTrBfP6L7SCzUQM/veITGlgJqY0oXgEJMZHbTUMBIS8vl40/6pjkOMH94JGB87qxzsQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extensions': ^3.4.2 - '@tiptap/extension-history@2.14.0': - resolution: {integrity: sha512-/qnOHQFCEPfkb3caykqd+sqzEC2gx30EQB/mM7+5kIG7CQy7XXaGjFAEaqzE1xJ783Q2E7GVk4JxWM+3NhYSLw==} + '@tiptap/extension-horizontal-rule@3.4.2': + resolution: {integrity: sha512-LK56R4ZR/B6nMxdyiDWuV6nk5akX8/2OXp29ZuX34BBYkFNjLBF9evGCHDy60az43JrSi/wwTUDafAxdO9S2Ig==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 - '@tiptap/extension-horizontal-rule@2.14.0': - resolution: {integrity: sha512-OrKWgHOhmJtVHjPYaEJetNLiNEvrI85lTrGxzeQa+a8ACb93h4svyHe9J+LHs5pKkXDQFcpYEXJntu0LVLLiDw==} + '@tiptap/extension-image@3.4.2': + resolution: {integrity: sha512-76pWwe2WEPw/LMEh+QTEJRGKM5YLAJfmt64DOlO887YH6uXjTn5tKJ3gedz+0ZM4NhHh61JbfXcdTFEhkMxMZA==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-image@2.14.0': - resolution: {integrity: sha512-pYCUzZBgsxIvVGTzuW03cPz6PIrAo26xpoxqq4W090uMVoK0SgY5W5y0IqCdw4QyLkJ2/oNSFNc2EP9jVi1CcQ==} + '@tiptap/extension-italic@3.4.2': + resolution: {integrity: sha512-X+ySvBlO2bpJJWgaZKVesh/GV5VtBchYZizEBUaPvkgYsS+s0Ujwz3YQvszX/JnfJ4k239D9S+bpJi4dTN5Utw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-italic@2.14.0': - resolution: {integrity: sha512-yEw2S+smoVR8DMYQMAWckVW2Sstf7z5+GBZ8zm8NMGhMKb1JFCPZUv5KTTIPnq7ZrKuuZHvjN9+Ef1dRYD8T2A==} + '@tiptap/extension-link@3.4.2': + resolution: {integrity: sha512-BNewJ6A6sHWzOlRhTtCp5ZLy8IguH54eEidntIbjSqV1nXwZot60PVdB+d53Mbz2SJJkdSrfbI7Kj0V1BTh6gA==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 - '@tiptap/extension-link@2.14.0': - resolution: {integrity: sha512-fsqW7eRD2xoD6xy7eFrNPAdIuZ3eicA4jKC45Vcft/Xky0DJoIehlVBLxsPbfmv3f27EBrtPkg5+msLXkLyzJA==} + '@tiptap/extension-list-item@3.4.2': + resolution: {integrity: sha512-OrRKIYih4Wc+TofAAgukpMEzq8k3BH6WY7QzPtxti58aji+euNYznt2YQm8m1oJdMECYOaREV4cwXvmES6rk8A==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/extension-list': ^3.4.2 - '@tiptap/extension-list-item@2.14.0': - resolution: {integrity: sha512-t1jXDPEd82sC6vZVE/12/CB52uuiydCIcRfwdh21xNgBMckToKO9S0K6XEp4ROtrKQdlIH2JDVPfpUBvVrYN8Q==} + '@tiptap/extension-list-keymap@3.4.2': + resolution: {integrity: sha512-VbtrCeoN64ByHL2jQUx2Zya+u8JxEvsRTelr8hksSGRrrZyahG1JESpu7Z2Y8Qjo5NEfSivWuEw9kbLCXsjvjw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extension-list': ^3.4.2 - '@tiptap/extension-list-keymap@2.14.0': - resolution: {integrity: sha512-1M+MyX7yELwdzPgkeQ2Mx2+BImi5I9sKRaAsPthjVNVcH7W6QNCFUPQA0y18Bq6LhqthzD3lhd4G52ABLR+UgA==} + '@tiptap/extension-list@3.4.2': + resolution: {integrity: sha512-ribIYMre1EB6TdyNhEBbO23p2f+UQj5KghbtcI4wYmthjnN+LOag+dUM5sBAiUhUyBlmc4MC1As06yWTu2hzqQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 - '@tiptap/extension-ordered-list@2.14.0': - resolution: {integrity: sha512-QUZcyuW9AKvSfpFHcGmbyRCqxcpY0VNf0xipEtogxbA+JDDw3ZSPqU1dUgz9wk00RahPTwNDdY5aVjdQ5N4N9Q==} + '@tiptap/extension-ordered-list@3.4.2': + resolution: {integrity: sha512-q9w7fQ26PZkbS3iD4h4HpoFoI5ap5jyYeGBugyhgGdHeF3luKiorleSY7m8NNmLlB6FWfDZZqPBWhrZgzPdFiQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/extension-list': ^3.4.2 - '@tiptap/extension-paragraph@2.14.0': - resolution: {integrity: sha512-bsQesVpgvDS2e+wr2fp59QO7rWRp2FqcJvBafwXS3Br9U5Mx3eFYryx4wC7cUnhlhUwX5pmaoA7zISgV9dZDgg==} + '@tiptap/extension-paragraph@3.4.2': + resolution: {integrity: sha512-M4M+N5Sit82HUK9rp662ZL1X/MMkD3zMnD8i5gV0Gj1T+YwToAGBIdte7n9QoAcNZr1cOdjAveI+HzOw6UA6SQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-placeholder@2.14.0': - resolution: {integrity: sha512-xzfjHvuukbch4i5O/5uyS2K2QgNEaMKi6e6GExTTgVwnFjKfJmgTqee33tt5JCqSItBvtSZlU3SX/vpiaIof+w==} + '@tiptap/extension-placeholder@3.4.2': + resolution: {integrity: sha512-it4BIl2quDLIBM3I1y618kvOHYgcWBaf9VvLTN2SzTAt35cn5ySOFBOxM2eSr8HG1WigdL9eIL/y1hENsdQrqw==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/extensions': ^3.4.2 - '@tiptap/extension-strike@2.14.0': - resolution: {integrity: sha512-rD5d/IL3XPfBOrHRHxt+b+0X1jbIbWONGiad/3sX0ZYQD3PandtCWboH40r/J5tFksebuY12dVYyYQKgLpDBOQ==} + '@tiptap/extension-strike@3.4.2': + resolution: {integrity: sha512-bgdq2eW5omli+rv6PHErDME1YocT1BHkiWvRV5pRYyTz5TZTgYujA0Qn2DjsW1baFike0oG3ToLAxH5RnViDoQ==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-subscript@2.14.0': - resolution: {integrity: sha512-1gQucSZ6WqhKukc8YA7ZfQzBYaVY00F6G7+trD2iWSm6EpiabaUVP0vMjuonIiujTioEwe04KmZuC9ZLbEU9dQ==} + '@tiptap/extension-subscript@3.4.2': + resolution: {integrity: sha512-SakjoT34eXr7EDZPkuBnqWeUD3hF7NLM2F3XY73cNA+XOyZ/MzH/alCZ+9qzFVaOgMshMkR6JzXvNrlGh6RRnA==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 - '@tiptap/extension-superscript@2.14.0': - resolution: {integrity: sha512-BnsqY9TxN15KxxoX1rulL0sV0Wu3umD4Un0E90LZ5G/QRrVUeohAuOiraqRJ4GnJPVJBR2H0+7Sg5sKqYuIpnQ==} + '@tiptap/extension-superscript@3.4.2': + resolution: {integrity: sha512-WPKoEunJC/9euyZYrGMwXRi0xKQ6Pv78Gj5klKdiIDmgS+haATy3thUrfS58fYwBX3k0uAs+eATNEB1nvOiJhA==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 - '@tiptap/extension-table-cell@2.14.0': - resolution: {integrity: sha512-DkSNAAkMI/ymPgO8y8Gv0MDVcbd2gk7xrSyicIDNoDFFXp15VasInGW8mvyM+CgvlurGB2N+PkYncPtfb4XNuQ==} + '@tiptap/extension-table@3.4.2': + resolution: {integrity: sha512-7fDsn+ovqjtsJ+B5aNdMoTzMIlY8NqMXzp96EMoOu2/hVo0CtPzEfDWZ5r2ehLo3KJvtNDLihnKLw2hwKL7rAg==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 - '@tiptap/extension-table-header@2.14.0': - resolution: {integrity: sha512-wX6/+t0iCo3KrqK2OjK0vbFeL76Pq+VpobGt+oM8lcxsENnsa6a0s3wdd1QEVLVPlj+WMFQggAG80Rf17+iDxA==} + '@tiptap/extension-text-align@3.4.2': + resolution: {integrity: sha512-PAZPwYTaH/BYvVHmK+53VvYIGV5JzmQyycYdy5JHc8EiczBBJ88HtG/hH8ZViRAXsiONld3ANF8HWyvgMSyILw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-table-row@2.14.0': - resolution: {integrity: sha512-a1GvCIju9xETIQu664lVQNftHqpPdRmwYp+1QzY82v3zHClso+tTLPeBSlbDdUscSmv3yZXgGML20IiOoR2l2Q==} + '@tiptap/extension-text-style@3.4.2': + resolution: {integrity: sha512-ioCf7VxWj2t+seC2vfzGtGlcToGKpwz6R5HMpo6/CSBDTZc5LsPTiJqJ6R6ahjqWwAKHI6SzlW5vtS36OywDzw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-table@2.14.0': - resolution: {integrity: sha512-X/wH3XKxi5+G7cB+lHt3fPMWIJ30IBkzrJZYapJ8d4p2JxMNIU1Nyu+8K6204d0hF6SVWY8hvb/Jq/WgHtoCFA==} + '@tiptap/extension-text@3.4.2': + resolution: {integrity: sha512-g7F1utUaVibr0ohnvfj4zJh6lofP5mQY+6sE2CDsHD1IE5VcBGh7ONWUMzAAGzi9oHtKSqpzPiUfw1BtmF8/+Q==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-task-item@2.14.0': - resolution: {integrity: sha512-MFE928s1J2ACyjOlkx52D/+r6aqz6c516C0tvnP2vzrkijFaSMNY4Xg7L1wTinzIdijh184AYQpyw7LezJa1ug==} + '@tiptap/extension-typography@3.4.2': + resolution: {integrity: sha512-prI4UIjxylUjynFHbKsVpXK8K5OpRz86FFyZOLiCVjbZEo21WOprweyS7EAgCoQJOlo/FxTDWb7zSjp4UUBk9A==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-task-list@2.14.0': - resolution: {integrity: sha512-o2VELXgkDIHS15pnF1W2OFfxZGvo9V6RcwjzCYUS0mqMF9TTbfHwddRcv4t3pifpMO3sWhspVARavJAGaP5zdQ==} + '@tiptap/extension-underline@3.4.2': + resolution: {integrity: sha512-kOOYE81n7w8yFt63UDjPq3hFoPXIGwcIbXOZCaB77tmLy4Cfy7ewa0oVnzunCXsGJs1Je4NbIqFnJq0H2KyUPw==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-text-align@2.14.0': - resolution: {integrity: sha512-9Wth4sAq2lYVWvQA0Qy095fsnPEavBv1FKWzVEyurwEQB7ZQsf/MRGmCNFnUXXy12w1G9UOanS4KkJ4C64+Ccw==} + '@tiptap/extension-youtube@3.4.2': + resolution: {integrity: sha512-3WMhCEbzlx2TyYe3xXrsTRVxC9p7GNFcCKCT+8WJQY6vnqqwXv6JhZL/fsuneZivKDL8gyn75EZTcHS5DV/WAA==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 - '@tiptap/extension-text-style@2.14.0': - resolution: {integrity: sha512-dl0oi2i0rjLpBqTf4wGy6SLidvPpjxLcmX727pwJlCklkFJVDf8wSFeD4ddxJXiD2Rwef0D/lkcwXSY73CoDcA==} + '@tiptap/extensions@3.4.2': + resolution: {integrity: sha512-0EOPKVU0whK4tw7TenmJe0M+DfV8Fjj0b6ZO0hqq2rOFWtBRUdRd7QLdg8XUk70D1BbZ52kO0ggM4zZqhW/57A==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 - '@tiptap/extension-text@2.14.0': - resolution: {integrity: sha512-rHny566nGZHq61zRLwQ9BPG55W/O+eDKwUJl+LhrLiVWwzpvAl9QQYixtoxJKOY48VK41PKwxe3bgDYgNs/Fhg==} + '@tiptap/html@3.4.2': + resolution: {integrity: sha512-rFfHYCcLOEkDDq+KRjt9rDu3oGU1ExjnhRzFleoJX4HhpOUQQjaE/vE3YLcwJLR8V+n0XJzocwL6wlIk4jkG7g==} peerDependencies: - '@tiptap/core': ^2.7.0 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 + happy-dom: ^18.0.1 - '@tiptap/extension-typography@2.14.0': - resolution: {integrity: sha512-1pokT94zu1ogJEmGNR+LwjR08iUbO9NZvm3SfPyXc5S1uoQgX3BE5LEwCRtu0Uu528CL9/Pq27wyYkYiSVM8FQ==} + '@tiptap/pm@3.4.2': + resolution: {integrity: sha512-cU1DYb1vnpAZhe7R578PfSCh9FbZDf/zR3wuhc6QOkZjGertTgG9ge7pn0RZnJeX4U9hO1WWJ5eOIPoalotlcA==} + + '@tiptap/react@3.4.2': + resolution: {integrity: sha512-kNcn+uNMs76GXYLBtEwR5pE357MdCKvIAQ3Oobq+//rrynRK/RP2IlRpybTWhrn/y7d4nD0DfHbFnhDpokoJIQ==} peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-underline@2.14.0': - resolution: {integrity: sha512-rlBasbwElFikaL5qPyp3OeoEBH2p9Dve0K6liqIWF4i9cECH2Bm53y2S0enVEe01hmgQEWmoYK+fq67rxr3XsQ==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-youtube@2.14.0': - resolution: {integrity: sha512-kryHjsjlIV2B6rS0Mnv9AqAyCCaeNWE1XDAWyYfhWQSmQkfaxSZU3rMnh3BMvSsVsdv5mtyxyBqBTrQA2sBSaw==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/html@2.14.0': - resolution: {integrity: sha512-Lw6mb3yJTsGd+q23KLKVJRpsT/0BEcKsUxzaEKimunKrZknZLsHVbZNa2hxS0IzaJqDogG2+NRutpD/E2NJGDg==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - - '@tiptap/pm@2.14.0': - resolution: {integrity: sha512-cnsfaIlvTFCDtLP/A2Fd3LmpttgY0O/tuTM2fC71vetONz83wUTYT+aD9uvxdX0GkSocoh840b0TsEazbBxhpA==} - - '@tiptap/react@2.14.0': - resolution: {integrity: sha512-6mtksbT2+EWXFLdHVFag9PSoh0GXPmL97Cm+4sJoyECUmBkAyoErapAccmZIljyMaVIHBYpYkNdp9Pw1B73ezw==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@2.14.0': - resolution: {integrity: sha512-Z1bKAfHl14quRI3McmdU+bs675jp6/iexEQTI9M9oHa6l3McFF38g9N3xRpPPX02MX83DghsUPupndUW/yJvEQ==} + '@tiptap/starter-kit@3.4.2': + resolution: {integrity: sha512-qfw9RljtZNLpqj+lnkgxok+ksCV/OR4rBX7QSJXaQYVJuid2tXejFj7vqsJQaf1Z6zT9swdk7js92qlwjCO0BQ==} - '@tiptap/suggestion@2.14.0': - resolution: {integrity: sha512-AXzEw0KYIyg5id8gz5geIffnBtkZqan5MWe29rGo3gXTfKH+Ik8tWbZdnlMVheycsUCllrymDRei4zw9DqVqkQ==} + '@tiptap/suggestion@3.4.2': + resolution: {integrity: sha512-sljtfiDtdAsbPOwrXrFGf64D6sXUjeU3Iz5v3TvN7TVJKozkZ/gaMkPRl+WC1CGwC6BnzQVDBEEa1e+aApV0mA==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.4.2 + '@tiptap/pm': ^3.4.2 + + '@tiptap/y-tiptap@3.0.0': + resolution: {integrity: sha512-HIeJZCj+KYJde2x6fONzo4o6kd7gW7eonwhQsv2p2VQnUgwNXMVhN+D6Z3AH/2i541Sq33y1PO4U/1ThCPjqbA==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + prosemirror-model: ^1.7.1 + prosemirror-state: ^1.2.3 + prosemirror-view: ^1.9.10 + y-protocols: ^1.0.1 + yjs: ^13.5.38 '@tokenizer/inflate@0.2.7': resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} @@ -4097,6 +4166,9 @@ packages: '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@types/asn1@0.2.4': + resolution: {integrity: sha512-V91DSJ2l0h0gRhVP4oBfBzRBN9lAbPUkGDMCnwedqPKX2d84aAMc9CulOvxdw1f7DfEYx99afab+Rsm3e52jhA==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -4673,6 +4745,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + address@1.2.2: resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} engines: {node: '>= 10.0.0'} @@ -4821,6 +4898,9 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + async-lock@1.4.1: resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} @@ -4927,8 +5007,8 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + bluebird@3.4.7: + resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -5219,6 +5299,9 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -5552,6 +5635,15 @@ packages: supports-color: optional: true + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -5602,10 +5694,6 @@ packages: delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - denque@1.5.1: - resolution: {integrity: sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==} - engines: {node: '>=0.10'} - denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -5658,6 +5746,9 @@ packages: dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dingbat-to-unicode@1.0.1: + resolution: {integrity: sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==} + dnd-core@14.0.1: resolution: {integrity: sha512-+PVS2VPTgKFPYWo3vAFEA8WPbTf7/xo43TifH9G8S1KqnrQu0o77A3unrF5yOugy4mIz7K5wAVFHUcha7wsz6A==} @@ -5706,6 +5797,9 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} + duck@0.1.12: + resolution: {integrity: sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -5770,10 +5864,6 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - entities@5.0.0: - resolution: {integrity: sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA==} - engines: {node: '>=0.12'} - entities@6.0.1: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} @@ -5967,6 +6057,9 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -6456,14 +6549,14 @@ packages: invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - ioredis@4.28.5: - resolution: {integrity: sha512-3GYo0GJtLqgNXj4YhrisLaNNvWSNwSS2wS4OELGfGxH8I69+XfNdnmV1AyN+ZqMh0i7eX+SWjrwFKDBDgfBC1A==} - engines: {node: '>=6'} - ioredis@5.4.1: resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} engines: {node: '>=12.22.0'} + ioredis@5.7.0: + resolution: {integrity: sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==} + engines: {node: '>=12.22.0'} + ipaddr.js@2.2.0: resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} engines: {node: '>= 10'} @@ -7020,6 +7113,10 @@ packages: layout-base@2.0.1: resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + ldapts@7.4.0: + resolution: {integrity: sha512-QLgx2pLvxMXY1nCc85Fx+cwVJDvC0sQ3l4CJZSl1FJ/iV8Ypfl6m+5xz4lm1lhoXcUlvhPqxEoyIj/8LR6ut+A==} + engines: {node: '>=18'} + leac@0.6.0: resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} @@ -7046,11 +7143,6 @@ packages: engines: {node: '>=16'} hasBin: true - lib0@0.2.98: - resolution: {integrity: sha512-XteTiNO0qEXqqweWx+b21p/fBnNHUA1NwAtJNJek1oPrewEZs2uiT4gWivHKr9GqCjDPAhchz0UQO8NwU3bBNA==} - engines: {node: '>=16'} - hasBin: true - libphonenumber-js@1.10.58: resolution: {integrity: sha512-53A0IpJFL9LdHbpeatwizf8KSwPICrqn9H0g3Y7WQ+Jgeu9cQ4Ew3WrRtrLBu/CX2lXd5+rgT01/tGlkbkzOjw==} @@ -7081,8 +7173,8 @@ packages: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} - local-pkg@0.5.1: - resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} locate-path@5.0.0: @@ -7105,9 +7197,6 @@ packages: lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -7156,6 +7245,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + lop@0.4.2: + resolution: {integrity: sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==} + lowlight@3.3.0: resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==} @@ -7202,6 +7294,11 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + mammoth@1.10.0: + resolution: {integrity: sha512-9HOmqt8uJ5rz7q8XrECU5gRjNftCq4GNG0YIrA6f9iQPCeLgpvgcmRBHi9NQWJQIpT/MAXeg1oKliAK1xoB3eg==} + engines: {node: '>=12.0.0'} + hasBin: true + mantine-form-zod-resolver@1.3.0: resolution: {integrity: sha512-XlXXkJCYuUuOllW0zedYW+m/lbdFQ/bso1Vz+pJOYkxgjhoGvzN2EXWCS2+0iTOT9Q7WnOwWvHmvpTJN3PxSXw==} engines: {node: '>=16.6.0'} @@ -7259,8 +7356,8 @@ packages: mermaid@10.9.3: resolution: {integrity: sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==} - mermaid@11.6.0: - resolution: {integrity: sha512-PE8hGUy1LDlWIHWBP05SFdqUHGmRcCcK4IzpOKPE35eOw+G9zZgcnMpyunJVUEOgb//KBORPjysKndw8bFLuRg==} + mermaid@11.11.0: + resolution: {integrity: sha512-9lb/VNkZqWTRjVgCV+l1N+t4kyi94y+l5xrmBmbbxZYkfRl5hEDaTPMOcaWKCl1McG8nBEaMlWwkcAEEgjhBgg==} methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} @@ -7414,8 +7511,8 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.3: - resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -7661,6 +7758,9 @@ packages: optics-ts@2.4.1: resolution: {integrity: sha512-HaYzMHvC80r7U/LqAd4hQyopDezC60PO2qF5GuIwALut2cl5rK1VWHsqTp0oqoJJWjiv6uXKqsO+Q2OO0C3MmQ==} + option@0.2.4: + resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==} + optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -7703,10 +7803,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -7714,8 +7810,8 @@ packages: package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} - package-manager-detector@0.2.5: - resolution: {integrity: sha512-3dS7y28uua+UDbRCLBqltMBrbI+A5U2mI9YuxHRxIWYmLj3DwntEBmERYzIAQ4DMeuCUOBSak7dBHHoXKpOTYQ==} + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -7803,12 +7899,16 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} pause@0.0.1: resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} + pdfjs-dist@5.4.54: + resolution: {integrity: sha512-TBAiTfQw89gU/Z4LW98Vahzd2/LoCFprVGvGbTgFt+QCB1F+woyOPmNNVgLa6djX9Z9GGTnj7qE1UzpOVJiINw==} + engines: {node: '>=20.16.0 || >=22.3.0'} + peberminta@0.9.0: resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} @@ -7913,8 +8013,11 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - pkg-types@1.2.1: - resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} @@ -8128,8 +8231,8 @@ packages: prosemirror-schema-basic@1.2.3: resolution: {integrity: sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==} - prosemirror-schema-list@1.4.1: - resolution: {integrity: sha512-jbDyaP/6AFfDfu70VzySsD75Om2t3sXTOdl5+31Wlxlg62td1haUpty/ybajSfJ1pkGadlOfwQq9kgW5IMo1Rg==} + prosemirror-schema-list@1.5.1: + resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} prosemirror-state@1.4.3: resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} @@ -8182,6 +8285,9 @@ packages: resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} engines: {node: '>=0.6'} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -8382,9 +8488,6 @@ packages: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} - redis-commands@1.7.0: - resolution: {integrity: sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==} - redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} @@ -8393,10 +8496,6 @@ packages: resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} engines: {node: '>=4'} - redlock@4.2.0: - resolution: {integrity: sha512-j+oQlG+dOwcetUt2WJWttu4CZVeRzUrcVcISFmEmfyuwCVSJ93rDT7YSgg7H7rnxwoRyk/jU46kycVka5tW7jA==} - engines: {node: '>=8.0.0'} - redux@4.2.1: resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} @@ -8747,6 +8846,9 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} + strict-event-emitter-types@2.0.0: + resolution: {integrity: sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -8917,8 +9019,8 @@ packages: thread-stream@3.0.2: resolution: {integrity: sha512-cBL4xF2A3lSINV4rD5tyqnKH4z/TgWPvT+NaVhJDSwK962oo/Ye7cHSMbDzwcu7tAE1SfU6Q4XtV6Hucmi6Hlw==} - tinyexec@0.3.1: - resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} tinyglobby@0.2.12: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} @@ -8986,6 +9088,10 @@ packages: resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} engines: {node: '>=18'} + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -9159,8 +9265,8 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} uid2@0.0.4: resolution: {integrity: sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==} @@ -9180,6 +9286,9 @@ packages: unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + underscore@1.13.7: + resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} + undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} @@ -9267,6 +9376,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-sync-external-store@1.5.0: + resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + utf8-byte-length@1.0.4: resolution: {integrity: sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==} @@ -9440,6 +9554,10 @@ packages: resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} engines: {node: '>=18'} + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -9544,6 +9662,10 @@ packages: resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} engines: {node: '>=4.0.0'} + xmlbuilder@10.1.1: + resolution: {integrity: sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==} + engines: {node: '>=4.0'} + xmlbuilder@11.0.1: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} @@ -9659,10 +9781,6 @@ packages: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} - zeed-dom@0.15.1: - resolution: {integrity: sha512-dtZ0aQSFyZmoJS0m06/xBN1SazUBPL5HpzlAcs/KcRW0rzadYw12deQBjeMhGKMMeGEp7bA9vmikMLaO4exBcg==} - engines: {node: '>=14.13.1'} - zod@3.25.56: resolution: {integrity: sha512-rd6eEF3BTNvQnR2e2wwolfTmUTnp70aUTqr0oaGbHifzC3BKJsoV+Gat8vxUMR1hwOKBs6El+qWehrHbCpW6SQ==} @@ -9725,12 +9843,12 @@ snapshots: transitivePeerDependencies: - chokidar - '@antfu/install-pkg@0.4.1': + '@antfu/install-pkg@1.1.0': dependencies: - package-manager-detector: 0.2.5 - tinyexec: 0.3.1 + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 - '@antfu/utils@0.7.10': {} + '@antfu/utils@9.2.0': {} '@asamuzakjp/css-color@2.8.3': dependencies: @@ -10309,7 +10427,7 @@ snapshots: '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.3.7 + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -10349,7 +10467,7 @@ snapshots: '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -10369,7 +10487,7 @@ snapshots: '@babel/traverse': 7.27.0 '@babel/types': 7.27.0 convert-source-map: 2.0.0 - debug: 4.3.7 + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -11848,11 +11966,20 @@ snapshots: dependencies: '@floating-ui/utils': 0.2.8 + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + '@floating-ui/dom@1.6.3': dependencies: '@floating-ui/core': 1.5.3 '@floating-ui/utils': 0.2.8 + '@floating-ui/dom@1.7.3': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/dom': 1.6.3 @@ -11867,19 +11994,21 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tabbable: 6.2.0 + '@floating-ui/utils@0.2.10': {} + '@floating-ui/utils@0.2.8': {} - '@hocuspocus/common@2.15.2': + '@hocuspocus/common@3.2.3': dependencies: - lib0: 0.2.98 + lib0: 0.2.108 - '@hocuspocus/extension-redis@2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/extension-redis@3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/server': 2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) - ioredis: 4.28.5 + '@hocuspocus/server': 3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@sesamecare-oss/redlock': 1.4.0(ioredis@5.7.0) + ioredis: 5.7.0 kleur: 4.1.5 lodash.debounce: 4.0.8 - redlock: 4.2.0 uuid: 11.1.0 y-protocols: 1.0.6(yjs@13.6.27) yjs: 13.6.27 @@ -11888,11 +12017,11 @@ snapshots: - supports-color - utf-8-validate - '@hocuspocus/provider@2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/provider@3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/common': 2.15.2 + '@hocuspocus/common': 3.2.3 '@lifeomic/attempt': 3.0.3 - lib0: 0.2.98 + lib0: 0.2.108 ws: 8.18.2 y-protocols: 1.0.6(yjs@13.6.27) yjs: 13.6.27 @@ -11900,12 +12029,12 @@ snapshots: - bufferutil - utf-8-validate - '@hocuspocus/server@2.15.2(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/server@3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@hocuspocus/common': 2.15.2 + '@hocuspocus/common': 3.2.3 async-lock: 1.4.1 kleur: 4.1.5 - lib0: 0.2.98 + lib0: 0.2.108 uuid: 11.1.0 ws: 8.18.2 y-protocols: 1.0.6(yjs@13.6.27) @@ -11914,11 +12043,11 @@ snapshots: - bufferutil - utf-8-validate - '@hocuspocus/transformer@2.15.2(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/transformer@3.2.3(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 - '@tiptap/starter-kit': 2.14.0 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 + '@tiptap/starter-kit': 3.4.2 y-prosemirror: 1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) yjs: 13.6.27 @@ -11937,15 +12066,16 @@ snapshots: '@iconify/types@2.0.0': {} - '@iconify/utils@2.1.33': + '@iconify/utils@3.0.1': dependencies: - '@antfu/install-pkg': 0.4.1 - '@antfu/utils': 0.7.10 + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 9.2.0 '@iconify/types': 2.0.0 - debug: 4.4.0 + debug: 4.4.1 + globals: 15.15.0 kolorist: 1.8.0 - local-pkg: 0.5.1 - mlly: 1.7.3 + local-pkg: 1.1.2 + mlly: 1.8.0 transitivePeerDependencies: - supports-color @@ -12081,6 +12211,8 @@ snapshots: '@ioredis/commands@1.2.0': {} + '@ioredis/commands@1.3.1': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -12383,7 +12515,7 @@ snapshots: - encoding - supports-color - '@mermaid-js/parser@0.4.0': + '@mermaid-js/parser@0.6.2': dependencies: langium: 3.3.1 @@ -12405,6 +12537,50 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2': optional: true + '@napi-rs/canvas-android-arm64@0.1.77': + optional: true + + '@napi-rs/canvas-darwin-arm64@0.1.77': + optional: true + + '@napi-rs/canvas-darwin-x64@0.1.77': + optional: true + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.77': + optional: true + + '@napi-rs/canvas-linux-arm64-gnu@0.1.77': + optional: true + + '@napi-rs/canvas-linux-arm64-musl@0.1.77': + optional: true + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.77': + optional: true + + '@napi-rs/canvas-linux-x64-gnu@0.1.77': + optional: true + + '@napi-rs/canvas-linux-x64-musl@0.1.77': + optional: true + + '@napi-rs/canvas-win32-x64-msvc@0.1.77': + optional: true + + '@napi-rs/canvas@0.1.77': + optionalDependencies: + '@napi-rs/canvas-android-arm64': 0.1.77 + '@napi-rs/canvas-darwin-arm64': 0.1.77 + '@napi-rs/canvas-darwin-x64': 0.1.77 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.77 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.77 + '@napi-rs/canvas-linux-arm64-musl': 0.1.77 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.77 + '@napi-rs/canvas-linux-x64-gnu': 0.1.77 + '@napi-rs/canvas-linux-x64-musl': 0.1.77 + '@napi-rs/canvas-win32-x64-msvc': 0.1.77 + optional: true + '@napi-rs/wasm-runtime@0.2.4': dependencies: '@emnapi/core': 1.2.0 @@ -13185,6 +13361,10 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 + '@sesamecare-oss/redlock@1.4.0(ioredis@5.7.0)': + dependencies: + ioredis: 5.7.0 + '@sinclair/typebox@0.27.8': {} '@sindresorhus/slugify@1.1.0': @@ -13633,212 +13813,194 @@ snapshots: '@tanstack/query-core': 5.80.6 react: 18.3.1 - '@tiptap/core@2.14.0(@tiptap/pm@2.14.0)': + '@tiptap/core@3.4.2(@tiptap/pm@3.4.2)': dependencies: - '@tiptap/pm': 2.14.0 + '@tiptap/pm': 3.4.2 - '@tiptap/extension-blockquote@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-blockquote@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-bold@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-bold@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-bubble-menu@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-bubble-menu@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 - tippy.js: 6.3.7 + '@floating-ui/dom': 1.7.3 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 + optional: true - '@tiptap/extension-bullet-list@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-bullet-list@3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/extension-list': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) - '@tiptap/extension-character-count@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-character-count@2.14.0(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 - '@tiptap/extension-code-block-lowlight@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/extension-code-block@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(highlight.js@11.11.1)(lowlight@3.3.0)': + '@tiptap/extension-code-block@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/extension-code-block': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 - highlight.js: 11.11.1 - lowlight: 3.3.0 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 - '@tiptap/extension-code-block@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-code@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-code@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-collaboration-caret@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 + '@tiptap/y-tiptap': 3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) - '@tiptap/extension-collaboration-cursor@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))': + '@tiptap/extension-collaboration@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - y-prosemirror: 1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 + '@tiptap/y-tiptap': 3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + yjs: 13.6.27 - '@tiptap/extension-collaboration@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))': + '@tiptap/extension-color@3.4.2(@tiptap/extension-text-style@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 - y-prosemirror: 1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@tiptap/extension-text-style': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) - '@tiptap/extension-color@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/extension-text-style@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)))': + '@tiptap/extension-document@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/extension-text-style': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-document@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-dropcursor@3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/extensions': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) - '@tiptap/extension-dropcursor@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-floating-menu@3.4.2(@floating-ui/dom@1.7.3)(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@floating-ui/dom': 1.7.3 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 + optional: true - '@tiptap/extension-floating-menu@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-gapcursor@3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 - tippy.js: 6.3.7 + '@tiptap/extensions': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) - '@tiptap/extension-gapcursor@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-hard-break@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-hard-break@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-heading@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-heading@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-highlight@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-highlight@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-history@3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/extensions': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) - '@tiptap/extension-history@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-horizontal-rule@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 - '@tiptap/extension-horizontal-rule@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-image@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-image@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-italic@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-italic@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-link@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - - '@tiptap/extension-link@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': - dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 linkifyjs: 4.3.2 - '@tiptap/extension-list-item@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-list-item@3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/extension-list': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) - '@tiptap/extension-list-keymap@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-list-keymap@3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/extension-list': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) - '@tiptap/extension-ordered-list@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 - '@tiptap/extension-paragraph@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-ordered-list@3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/extension-list': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) - '@tiptap/extension-placeholder@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-paragraph@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-strike@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-placeholder@3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/extensions': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) - '@tiptap/extension-subscript@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-strike@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-superscript@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-subscript@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 - '@tiptap/extension-table-cell@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-superscript@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 - '@tiptap/extension-table-header@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-table@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 - '@tiptap/extension-table-row@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-text-align@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-table@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-text-style@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-task-item@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/extension-text@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-task-list@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-typography@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-text-align@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-underline@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-text-style@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extension-youtube@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-text@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 - '@tiptap/extension-typography@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': + '@tiptap/html@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(happy-dom@15.11.7)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 + happy-dom: 15.11.7 - '@tiptap/extension-underline@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': - dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - - '@tiptap/extension-youtube@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))': - dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - - '@tiptap/html@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': - dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 - zeed-dom: 0.15.1 - - '@tiptap/pm@2.14.0': + '@tiptap/pm@3.4.2': dependencies: prosemirror-changeset: 2.3.1 prosemirror-collab: 1.3.1 @@ -13852,53 +14014,70 @@ snapshots: prosemirror-menu: 1.2.4 prosemirror-model: 1.25.1 prosemirror-schema-basic: 1.2.3 - prosemirror-schema-list: 1.4.1 + prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.3 prosemirror-tables: 1.7.1 prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0) prosemirror-transform: 1.10.4 prosemirror-view: 1.40.0 - '@tiptap/react@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tiptap/react@3.4.2(@floating-ui/dom@1.7.3)(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/extension-bubble-menu': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-floating-menu': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 '@types/use-sync-external-store': 0.0.6 fast-deep-equal: 3.1.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - use-sync-external-store: 1.2.2(react@18.3.1) + use-sync-external-store: 1.5.0(react@18.3.1) + optionalDependencies: + '@tiptap/extension-bubble-menu': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extension-floating-menu': 3.4.2(@floating-ui/dom@1.7.3)(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + transitivePeerDependencies: + - '@floating-ui/dom' - '@tiptap/starter-kit@2.14.0': + '@tiptap/starter-kit@3.4.2': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/extension-blockquote': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-bold': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-bullet-list': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-code': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-code-block': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-document': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-dropcursor': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-gapcursor': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-hard-break': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-heading': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-history': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-horizontal-rule': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0) - '@tiptap/extension-italic': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-list-item': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-ordered-list': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-paragraph': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-strike': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-text': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/extension-text-style': 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0)) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/extension-blockquote': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + '@tiptap/extension-bold': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + '@tiptap/extension-bullet-list': 3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) + '@tiptap/extension-code': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + '@tiptap/extension-code-block': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extension-document': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + '@tiptap/extension-dropcursor': 3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) + '@tiptap/extension-gapcursor': 3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) + '@tiptap/extension-hard-break': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + '@tiptap/extension-heading': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + '@tiptap/extension-horizontal-rule': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extension-italic': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + '@tiptap/extension-link': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extension-list': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extension-list-item': 3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) + '@tiptap/extension-list-keymap': 3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) + '@tiptap/extension-ordered-list': 3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) + '@tiptap/extension-paragraph': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + '@tiptap/extension-strike': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + '@tiptap/extension-text': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + '@tiptap/extension-underline': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + '@tiptap/extensions': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 - '@tiptap/suggestion@2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)': + '@tiptap/suggestion@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': dependencies: - '@tiptap/core': 2.14.0(@tiptap/pm@2.14.0) - '@tiptap/pm': 2.14.0 + '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/pm': 3.4.2 + + '@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + dependencies: + lib0: 0.2.108 + prosemirror-model: 1.25.1 + prosemirror-state: 1.4.3 + prosemirror-view: 1.40.0 + y-protocols: 1.0.6(yjs@13.6.27) + yjs: 13.6.27 '@tokenizer/inflate@0.2.7': dependencies: @@ -13922,6 +14101,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@types/asn1@0.2.4': + dependencies: + '@types/node': 22.13.4 + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.26.2 @@ -14378,7 +14561,7 @@ snapshots: '@typescript-eslint/types': 8.17.0 '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) '@typescript-eslint/visitor-keys': 8.17.0 - debug: 4.3.7 + debug: 4.4.0 eslint: 9.15.0(jiti@1.21.0) optionalDependencies: typescript: 5.7.2 @@ -14391,7 +14574,7 @@ snapshots: '@typescript-eslint/types': 8.24.1 '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3) '@typescript-eslint/visitor-keys': 8.24.1 - debug: 4.3.7 + debug: 4.4.0 eslint: 9.20.1(jiti@1.21.0) typescript: 5.7.3 transitivePeerDependencies: @@ -14453,7 +14636,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.24.1 '@typescript-eslint/visitor-keys': 8.24.1 - debug: 4.3.7 + debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.4 @@ -14643,6 +14826,8 @@ snapshots: acorn@8.14.0: {} + acorn@8.15.0: {} + address@1.2.2: {} agent-base@6.0.2: @@ -14809,6 +14994,10 @@ snapshots: asap@2.0.6: {} + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + async-lock@1.4.1: {} async@3.2.5: {} @@ -14994,7 +15183,7 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - bluebird@3.7.2: {} + bluebird@3.4.7: {} boolbase@1.0.0: {} @@ -15303,6 +15492,8 @@ snapshots: confbox@0.1.8: {} + confbox@0.2.2: {} + config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -15668,6 +15859,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.1: + dependencies: + ms: 2.1.3 + decamelize@1.2.0: {} decimal.js@10.4.3: {} @@ -15710,8 +15905,6 @@ snapshots: delegates@1.0.0: {} - denque@1.5.1: {} - denque@2.1.0: {} depd@2.0.0: {} @@ -15727,7 +15920,7 @@ snapshots: detect-port@1.5.1: dependencies: address: 1.2.2 - debug: 4.3.7 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -15750,6 +15943,8 @@ snapshots: dijkstrajs@1.0.3: {} + dingbat-to-unicode@1.0.1: {} + dnd-core@14.0.1: dependencies: '@react-dnd/asap': 4.0.1 @@ -15807,6 +16002,10 @@ snapshots: dotenv@16.4.7: {} + duck@0.1.12: + dependencies: + underscore: 1.13.7 + eastasianwidth@0.2.0: {} ecdsa-sig-formatter@1.0.11: @@ -15848,7 +16047,7 @@ snapshots: engine.io-client@6.6.2: dependencies: '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 + debug: 4.3.7 engine.io-parser: 5.2.2 ws: 8.17.1 xmlhttprequest-ssl: 2.1.2 @@ -15868,7 +16067,7 @@ snapshots: base64id: 2.0.0 cookie: 0.7.2 cors: 2.8.5 - debug: 4.3.4 + debug: 4.3.7 engine.io-parser: 5.2.2 ws: 8.17.1 transitivePeerDependencies: @@ -15887,8 +16086,6 @@ snapshots: entities@4.5.0: {} - entities@5.0.0: {} - entities@6.0.1: {} errno@0.1.8: @@ -16243,6 +16440,8 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 + exsolve@1.0.7: {} + external-editor@3.1.0: dependencies: chardet: 0.7.0 @@ -16769,27 +16968,25 @@ snapshots: dependencies: loose-envify: 1.4.0 - ioredis@4.28.5: + ioredis@5.4.1: dependencies: + '@ioredis/commands': 1.2.0 cluster-key-slot: 1.1.2 - debug: 4.3.7 - denque: 1.5.1 + debug: 4.3.4 + denque: 2.1.0 lodash.defaults: 4.2.0 - lodash.flatten: 4.4.0 lodash.isarguments: 3.1.0 - p-map: 2.1.0 - redis-commands: 1.7.0 redis-errors: 1.2.0 redis-parser: 3.0.0 standard-as-callback: 2.1.0 transitivePeerDependencies: - supports-color - ioredis@5.4.1: + ioredis@5.7.0: dependencies: - '@ioredis/commands': 1.2.0 + '@ioredis/commands': 1.3.1 cluster-key-slot: 1.1.2 - debug: 4.3.4 + debug: 4.4.1 denque: 2.1.0 lodash.defaults: 4.2.0 lodash.isarguments: 3.1.0 @@ -17521,6 +17718,17 @@ snapshots: layout-base@2.0.1: {} + ldapts@7.4.0: + dependencies: + '@types/asn1': 0.2.4 + asn1: 0.2.6 + debug: 4.4.0 + strict-event-emitter-types: 2.0.0 + uuid: 11.1.0 + whatwg-url: 14.2.0 + transitivePeerDependencies: + - supports-color + leac@0.6.0: {} less@4.2.0: @@ -17553,10 +17761,6 @@ snapshots: dependencies: isomorphic.js: 0.2.5 - lib0@0.2.98: - dependencies: - isomorphic.js: 0.2.5 - libphonenumber-js@1.10.58: {} lie@3.3.0: @@ -17583,10 +17787,11 @@ snapshots: loader-runner@4.3.0: {} - local-pkg@0.5.1: + local-pkg@1.1.2: dependencies: - mlly: 1.7.3 - pkg-types: 1.2.1 + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 locate-path@5.0.0: dependencies: @@ -17604,8 +17809,6 @@ snapshots: lodash.defaults@4.2.0: {} - lodash.flatten@4.4.0: {} - lodash.includes@4.3.0: {} lodash.isarguments@3.1.0: {} @@ -17641,6 +17844,12 @@ snapshots: dependencies: js-tokens: 4.0.0 + lop@0.4.2: + dependencies: + duck: 0.1.12 + option: 0.2.4 + underscore: 1.13.7 + lowlight@3.3.0: dependencies: '@types/hast': 3.0.4 @@ -17687,6 +17896,19 @@ snapshots: dependencies: tmpl: 1.0.5 + mammoth@1.10.0: + dependencies: + '@xmldom/xmldom': 0.8.10 + argparse: 1.0.10 + base64-js: 1.5.1 + bluebird: 3.4.7 + dingbat-to-unicode: 1.0.1 + jszip: 3.10.1 + lop: 0.4.2 + path-is-absolute: 1.0.1 + underscore: 1.13.7 + xmlbuilder: 10.1.1 + mantine-form-zod-resolver@1.3.0(@mantine/form@8.1.3(react@18.3.1))(zod@3.25.56): dependencies: '@mantine/form': 8.1.3(react@18.3.1) @@ -17770,11 +17992,11 @@ snapshots: transitivePeerDependencies: - supports-color - mermaid@11.6.0: + mermaid@11.11.0: dependencies: '@braintree/sanitize-url': 7.1.0 - '@iconify/utils': 2.1.33 - '@mermaid-js/parser': 0.4.0 + '@iconify/utils': 3.0.1 + '@mermaid-js/parser': 0.6.2 '@types/d3': 7.4.3 cytoscape: 3.30.2 cytoscape-cose-bilkent: 4.1.0(cytoscape@3.30.2) @@ -17998,12 +18220,12 @@ snapshots: mkdirp@1.0.4: {} - mlly@1.7.3: + mlly@1.8.0: dependencies: - acorn: 8.14.0 - pathe: 1.1.2 - pkg-types: 1.2.1 - ufo: 1.5.4 + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 mri@1.2.0: {} @@ -18271,6 +18493,8 @@ snapshots: optics-ts@2.4.1: {} + option@0.2.4: {} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 @@ -18331,13 +18555,11 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@2.1.0: {} - p-try@2.2.0: {} package-json-from-dist@1.0.0: {} - package-manager-detector@0.2.5: {} + package-manager-detector@1.3.0: {} pako@1.0.11: {} @@ -18428,10 +18650,14 @@ snapshots: path-type@4.0.0: {} - pathe@1.1.2: {} + pathe@2.0.3: {} pause@0.0.1: {} + pdfjs-dist@5.4.54: + optionalDependencies: + '@napi-rs/canvas': 0.1.77 + peberminta@0.9.0: {} peek-readable@7.0.0: {} @@ -18539,11 +18765,17 @@ snapshots: dependencies: find-up: 4.1.0 - pkg-types@1.2.1: + pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.7.3 - pathe: 1.1.2 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 pluralize@8.0.0: {} @@ -18761,7 +18993,7 @@ snapshots: dependencies: prosemirror-model: 1.25.1 - prosemirror-schema-list@1.4.1: + prosemirror-schema-list@1.5.1: dependencies: prosemirror-model: 1.25.1 prosemirror-state: 1.4.3 @@ -18824,6 +19056,8 @@ snapshots: dependencies: side-channel: 1.0.6 + quansync@0.2.11: {} + queue-microtask@1.2.3: {} quick-format-unescaped@4.0.4: {} @@ -19052,18 +19286,12 @@ snapshots: dependencies: resolve: 1.22.8 - redis-commands@1.7.0: {} - redis-errors@1.2.0: {} redis-parser@3.0.0: dependencies: redis-errors: 1.2.0 - redlock@4.2.0: - dependencies: - bluebird: 3.7.2 - redux@4.2.1: dependencies: '@babel/runtime': 7.25.6 @@ -19367,7 +19595,7 @@ snapshots: socket.io-adapter@2.5.4: dependencies: - debug: 4.3.4 + debug: 4.3.7 ws: 8.11.0 transitivePeerDependencies: - bufferutil @@ -19388,7 +19616,7 @@ snapshots: socket.io-parser@4.2.4: dependencies: '@socket.io/component-emitter': 3.1.0 - debug: 4.3.4 + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -19464,6 +19692,8 @@ snapshots: streamsearch@1.1.0: {} + strict-event-emitter-types@2.0.0: {} + string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -19660,7 +19890,7 @@ snapshots: dependencies: real-require: 0.2.0 - tinyexec@0.3.1: {} + tinyexec@1.0.1: {} tinyglobby@0.2.12: dependencies: @@ -19723,6 +19953,10 @@ snapshots: dependencies: punycode: 2.3.1 + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + tree-kill@1.2.2: {} truncate-utf8-bytes@1.0.2: @@ -19914,7 +20148,7 @@ snapshots: uc.micro@2.1.0: {} - ufo@1.5.4: {} + ufo@1.6.1: {} uid2@0.0.4: {} @@ -19933,6 +20167,8 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.1.0 + underscore@1.13.7: {} + undici-types@6.20.0: {} undici@7.10.0: {} @@ -20000,6 +20236,10 @@ snapshots: dependencies: react: 18.3.1 + use-sync-external-store@1.5.0(react@18.3.1): + dependencies: + react: 18.3.1 + utf8-byte-length@1.0.4: {} util-deprecate@1.0.2: {} @@ -20147,6 +20387,11 @@ snapshots: tr46: 5.0.0 webidl-conversions: 7.0.0 + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -20255,6 +20500,8 @@ snapshots: sax: 1.4.1 xmlbuilder: 11.0.1 + xmlbuilder@10.1.1: {} + xmlbuilder@11.0.1: {} xmlbuilder@15.1.1: {} @@ -20350,11 +20597,6 @@ snapshots: yoctocolors-cjs@2.1.2: {} - zeed-dom@0.15.1: - dependencies: - css-what: 6.1.0 - entities: 5.0.0 - zod@3.25.56: {} zustand@4.5.6(@types/react@18.3.12)(react@18.3.1): From 83ce9cf24086326531f955e3e73f05a56c814b62 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Fri, 26 Sep 2025 18:52:49 +0100 Subject: [PATCH 11/21] tiptap 3.6.1 --- apps/server/src/ee | 2 +- package.json | 56 +- .../src/lib/table/dnd/dnd-extension.ts | 531 +++++++------- pnpm-lock.yaml | 674 +++++++++--------- 4 files changed, 651 insertions(+), 612 deletions(-) diff --git a/apps/server/src/ee b/apps/server/src/ee index d90ce7a2..3af21def 160000 --- a/apps/server/src/ee +++ b/apps/server/src/ee @@ -1 +1 @@ -Subproject commit d90ce7a20f20575c4afa74b0373a18e9555ed0fe +Subproject commit 3af21def15eb7ea7eb400086eeaf97991938a5fd diff --git a/package.json b/package.json index 0f653ab8..f6a78084 100644 --- a/package.json +++ b/package.json @@ -28,34 +28,34 @@ "@joplin/turndown": "^4.0.74", "@joplin/turndown-plugin-gfm": "^1.0.56", "@sindresorhus/slugify": "1.1.0", - "@tiptap/core": "^3.4.2", - "@tiptap/extension-code-block": "^3.4.2", - "@tiptap/extension-collaboration": "^3.4.2", - "@tiptap/extension-collaboration-caret": "^3.4.2", - "@tiptap/extension-color": "^3.4.2", - "@tiptap/extension-document": "^3.4.2", - "@tiptap/extension-heading": "^3.4.2", - "@tiptap/extension-highlight": "^3.4.2", - "@tiptap/extension-history": "^3.4.2", - "@tiptap/extension-image": "^3.4.2", - "@tiptap/extension-link": "^3.4.2", - "@tiptap/extension-list": "^3.4.2", - "@tiptap/extension-list-item": "^3.4.2", - "@tiptap/extension-list-keymap": "^3.4.2", - "@tiptap/extension-placeholder": "^3.4.2", - "@tiptap/extension-subscript": "^3.4.2", - "@tiptap/extension-superscript": "^3.4.2", - "@tiptap/extension-table": "^3.4.2", - "@tiptap/extension-text": "^3.4.2", - "@tiptap/extension-text-align": "^3.4.2", - "@tiptap/extension-text-style": "^3.4.2", - "@tiptap/extension-typography": "^3.4.2", - "@tiptap/extension-youtube": "^3.4.2", - "@tiptap/html": "^3.4.2", - "@tiptap/pm": "^3.4.2", - "@tiptap/react": "^3.4.2", - "@tiptap/starter-kit": "^3.4.2", - "@tiptap/suggestion": "^3.4.2", + "@tiptap/core": "^3.6.1", + "@tiptap/extension-code-block": "^3.6.1", + "@tiptap/extension-collaboration": "^3.6.1", + "@tiptap/extension-collaboration-caret": "^3.6.1", + "@tiptap/extension-color": "^3.6.1", + "@tiptap/extension-document": "^3.6.1", + "@tiptap/extension-heading": "^3.6.1", + "@tiptap/extension-highlight": "^3.6.1", + "@tiptap/extension-history": "^3.6.1", + "@tiptap/extension-image": "^3.6.1", + "@tiptap/extension-link": "^3.6.1", + "@tiptap/extension-list": "^3.6.1", + "@tiptap/extension-list-item": "^3.6.1", + "@tiptap/extension-list-keymap": "^3.6.1", + "@tiptap/extension-placeholder": "^3.6.1", + "@tiptap/extension-subscript": "^3.6.1", + "@tiptap/extension-superscript": "^3.6.1", + "@tiptap/extension-table": "^3.6.1", + "@tiptap/extension-text": "^3.6.1", + "@tiptap/extension-text-align": "^3.6.1", + "@tiptap/extension-text-style": "^3.6.1", + "@tiptap/extension-typography": "^3.6.1", + "@tiptap/extension-youtube": "^3.6.1", + "@tiptap/html": "^3.6.1", + "@tiptap/pm": "^3.6.1", + "@tiptap/react": "^3.6.1", + "@tiptap/starter-kit": "^3.6.1", + "@tiptap/suggestion": "^3.6.1", "@types/qrcode": "^1.5.5", "bytes": "^3.1.2", "cross-env": "^7.0.3", diff --git a/packages/editor-ext/src/lib/table/dnd/dnd-extension.ts b/packages/editor-ext/src/lib/table/dnd/dnd-extension.ts index b4ac2950..1ad57ec1 100644 --- a/packages/editor-ext/src/lib/table/dnd/dnd-extension.ts +++ b/packages/editor-ext/src/lib/table/dnd/dnd-extension.ts @@ -1,7 +1,12 @@ import { Editor, Extension } from "@tiptap/core"; import { PluginKey, Plugin, PluginSpec } from "@tiptap/pm/state"; import { EditorProps, EditorView } from "@tiptap/pm/view"; -import { DraggingDOMs, getDndRelatedDOMs, getHoveringCell, HoveringCellInfo } from "./utils"; +import { + DraggingDOMs, + getDndRelatedDOMs, + getHoveringCell, + HoveringCellInfo, +} from "./utils"; import { getDragOverColumn, getDragOverRow } from "./calc-drag-over"; import { moveColumn, moveRow } from "../utils"; import { PreviewController } from "./preview/preview-controller"; @@ -10,268 +15,302 @@ import { DragHandleController } from "./handle/drag-handle-controller"; import { EmptyImageController } from "./handle/empty-image-controller"; import { AutoScrollController } from "./auto-scroll-controller"; -export const TableDndKey = new PluginKey('table-drag-and-drop') +export const TableDndKey = new PluginKey("table-drag-and-drop"); class TableDragHandlePluginSpec implements PluginSpec { - key = TableDndKey - props: EditorProps> + key = TableDndKey; + props: EditorProps>; - private _colDragHandle: HTMLElement; - private _rowDragHandle: HTMLElement; - private _hoveringCell?: HoveringCellInfo; - private _disposables: (() => void)[] = []; - private _draggingCoords: { x: number; y: number } = { x: 0, y: 0 }; - private _dragging = false; - private _draggingDirection: 'col' | 'row' = 'col'; - private _draggingIndex = -1; - private _droppingIndex = -1; - private _draggingDOMs?: DraggingDOMs | undefined - private _startCoords: { x: number; y: number } = { x: 0, y: 0 }; - private _previewController: PreviewController; - private _dropIndicatorController: DropIndicatorController; - private _dragHandleController: DragHandleController; - private _emptyImageController: EmptyImageController; - private _autoScrollController: AutoScrollController; + private _colDragHandle: HTMLElement; + private _rowDragHandle: HTMLElement; + private _hoveringCell?: HoveringCellInfo; + private _disposables: (() => void)[] = []; + private _draggingCoords: { x: number; y: number } = { x: 0, y: 0 }; + private _dragging = false; + private _draggingDirection: "col" | "row" = "col"; + private _draggingIndex = -1; + private _droppingIndex = -1; + private _draggingDOMs?: DraggingDOMs | undefined; + private _startCoords: { x: number; y: number } = { x: 0, y: 0 }; + private _previewController: PreviewController; + private _dropIndicatorController: DropIndicatorController; + private _dragHandleController: DragHandleController; + private _emptyImageController: EmptyImageController; + private _autoScrollController: AutoScrollController; - constructor(public editor: Editor) { - this.props = { - handleDOMEvents: { - pointerover: this._pointerOver, - } - } + constructor(public editor: Editor) { + this.props = { + handleDOMEvents: { + pointerover: this._pointerOver, + }, + }; - this._dragHandleController = new DragHandleController(); - this._colDragHandle = this._dragHandleController.colDragHandle; - this._rowDragHandle = this._dragHandleController.rowDragHandle; + this._dragHandleController = new DragHandleController(); + this._colDragHandle = this._dragHandleController.colDragHandle; + this._rowDragHandle = this._dragHandleController.rowDragHandle; - this._previewController = new PreviewController(); - this._dropIndicatorController = new DropIndicatorController(); - this._emptyImageController = new EmptyImageController(); + this._previewController = new PreviewController(); + this._dropIndicatorController = new DropIndicatorController(); + this._emptyImageController = new EmptyImageController(); - this._autoScrollController = new AutoScrollController(); + this._autoScrollController = new AutoScrollController(); - this._bindDragEvents(); + this._bindDragEvents(); + } + + view = () => { + const wrapper = this.editor.options.element; + //@ts-ignore + wrapper.appendChild(this._colDragHandle); + //@ts-ignore + wrapper.appendChild(this._rowDragHandle); + //@ts-ignore + wrapper.appendChild(this._previewController.previewRoot); + //@ts-ignore + wrapper.appendChild(this._dropIndicatorController.dropIndicatorRoot); + + return { + update: this.update, + destroy: this.destroy, + }; + }; + + update = () => {}; + + destroy = () => { + if (!this.editor.isDestroyed) return; + this._dragHandleController.destroy(); + this._emptyImageController.destroy(); + this._previewController.destroy(); + this._dropIndicatorController.destroy(); + this._autoScrollController.stop(); + + this._disposables.forEach((disposable) => disposable()); + }; + + private _pointerOver = (view: EditorView, event: PointerEvent) => { + if (this._dragging) return; + + // Don't show drag handles in readonly mode + if (!this.editor.isEditable) { + this._dragHandleController.hide(); + return; } - view = () => { - const wrapper = this.editor.options.element; - wrapper.appendChild(this._colDragHandle) - wrapper.appendChild(this._rowDragHandle) - wrapper.appendChild(this._previewController.previewRoot) - wrapper.appendChild(this._dropIndicatorController.dropIndicatorRoot) + const hoveringCell = getHoveringCell(view, event); + this._hoveringCell = hoveringCell; + if (!hoveringCell) { + this._dragHandleController.hide(); + } else { + this._dragHandleController.show(this.editor, hoveringCell); + } + }; - return { - update: this.update, - destroy: this.destroy, - } + private _onDragColStart = (event: DragEvent) => { + this._onDragStart(event, "col"); + }; + + private _onDraggingCol = (event: DragEvent) => { + const draggingDOMs = this._draggingDOMs; + if (!draggingDOMs) return; + + this._draggingCoords = { x: event.clientX, y: event.clientY }; + this._previewController.onDragging( + draggingDOMs, + this._draggingCoords.x, + this._draggingCoords.y, + "col", + ); + + this._autoScrollController.checkXAutoScroll(event.clientX, draggingDOMs); + + const direction = + this._startCoords.x > this._draggingCoords.x ? "left" : "right"; + const dragOverColumn = getDragOverColumn( + draggingDOMs.table, + this._draggingCoords.x, + ); + if (!dragOverColumn) return; + + const [col, index] = dragOverColumn; + this._droppingIndex = index; + this._dropIndicatorController.onDragging(col, direction, "col"); + }; + + private _onDragRowStart = (event: DragEvent) => { + this._onDragStart(event, "row"); + }; + + private _onDraggingRow = (event: DragEvent) => { + const draggingDOMs = this._draggingDOMs; + if (!draggingDOMs) return; + + this._draggingCoords = { x: event.clientX, y: event.clientY }; + this._previewController.onDragging( + draggingDOMs, + this._draggingCoords.x, + this._draggingCoords.y, + "row", + ); + + this._autoScrollController.checkYAutoScroll(event.clientY); + + const direction = + this._startCoords.y > this._draggingCoords.y ? "up" : "down"; + const dragOverRow = getDragOverRow( + draggingDOMs.table, + this._draggingCoords.y, + ); + if (!dragOverRow) return; + + const [row, index] = dragOverRow; + this._droppingIndex = index; + this._dropIndicatorController.onDragging(row, direction, "row"); + }; + + private _onDragEnd = () => { + this._dragging = false; + this._draggingIndex = -1; + this._droppingIndex = -1; + this._startCoords = { x: 0, y: 0 }; + this._autoScrollController.stop(); + this._dropIndicatorController.onDragEnd(); + this._previewController.onDragEnd(); + }; + + private _bindDragEvents = () => { + this._colDragHandle.addEventListener("dragstart", this._onDragColStart); + this._disposables.push(() => { + this._colDragHandle.removeEventListener( + "dragstart", + this._onDragColStart, + ); + }); + + this._colDragHandle.addEventListener("dragend", this._onDragEnd); + this._disposables.push(() => { + this._colDragHandle.removeEventListener("dragend", this._onDragEnd); + }); + + this._rowDragHandle.addEventListener("dragstart", this._onDragRowStart); + this._disposables.push(() => { + this._rowDragHandle.removeEventListener( + "dragstart", + this._onDragRowStart, + ); + }); + + this._rowDragHandle.addEventListener("dragend", this._onDragEnd); + this._disposables.push(() => { + this._rowDragHandle.removeEventListener("dragend", this._onDragEnd); + }); + + const ownerDocument = this.editor.view.dom?.ownerDocument; + if (ownerDocument) { + // To make `drop` event work, we need to prevent the default behavior of the + // `dragover` event for drop zone. Here we set the whole document as the + // drop zone so that even the mouse moves outside the editor, the `drop` + // event will still be triggered. + ownerDocument.addEventListener("drop", this._onDrop); + ownerDocument.addEventListener("dragover", this._onDrag); + this._disposables.push(() => { + ownerDocument.removeEventListener("drop", this._onDrop); + ownerDocument.removeEventListener("dragover", this._onDrag); + }); + } + }; + + private _onDragStart = (event: DragEvent, type: "col" | "row") => { + const dataTransfer = event.dataTransfer; + if (dataTransfer) { + dataTransfer.effectAllowed = "move"; + this._emptyImageController.hideDragImage(dataTransfer); + } + this._dragging = true; + this._draggingDirection = type; + this._startCoords = { x: event.clientX, y: event.clientY }; + const draggingIndex = + (type === "col" + ? this._hoveringCell?.colIndex + : this._hoveringCell?.rowIndex) ?? 0; + + this._draggingIndex = draggingIndex; + + const relatedDoms = getDndRelatedDOMs( + this.editor.view, + this._hoveringCell?.cellPos, + draggingIndex, + type, + ); + this._draggingDOMs = relatedDoms; + + const index = + type === "col" + ? this._hoveringCell?.colIndex + : this._hoveringCell?.rowIndex; + + this._previewController.onDragStart(relatedDoms, index, type); + this._dropIndicatorController.onDragStart(relatedDoms, type); + }; + + private _onDrag = (event: DragEvent) => { + event.preventDefault(); + if (!this._dragging) return; + if (this._draggingDirection === "col") { + this._onDraggingCol(event); + } else { + this._onDraggingRow(event); + } + }; + + private _onDrop = () => { + if (!this._dragging) return; + const direction = this._draggingDirection; + const from = this._draggingIndex; + const to = this._droppingIndex; + const tr = this.editor.state.tr; + const pos = this.editor.state.selection.from; + + if (direction === "col") { + const canMove = moveColumn({ + tr, + originIndex: from, + targetIndex: to, + select: true, + pos, + }); + if (canMove) { + this.editor.view.dispatch(tr); + } + + return; } - update = () => {} + if (direction === "row") { + const canMove = moveRow({ + tr, + originIndex: from, + targetIndex: to, + select: true, + pos, + }); + if (canMove) { + this.editor.view.dispatch(tr); + } - destroy = () => { - if (!this.editor.isDestroyed) return; - this._dragHandleController.destroy(); - this._emptyImageController.destroy(); - this._previewController.destroy(); - this._dropIndicatorController.destroy(); - this._autoScrollController.stop(); - - this._disposables.forEach(disposable => disposable()); - } - - private _pointerOver = (view: EditorView, event: PointerEvent) => { - if (this._dragging) return; - - // Don't show drag handles in readonly mode - if (!this.editor.isEditable) { - this._dragHandleController.hide(); - return; - } - - const hoveringCell = getHoveringCell(view, event) - this._hoveringCell = hoveringCell; - if (!hoveringCell) { - this._dragHandleController.hide(); - } else { - this._dragHandleController.show(this.editor, hoveringCell); - } - } - - private _onDragColStart = (event: DragEvent) => { - this._onDragStart(event, 'col'); - } - - private _onDraggingCol = (event: DragEvent) => { - const draggingDOMs = this._draggingDOMs; - if (!draggingDOMs) return; - - this._draggingCoords = { x: event.clientX, y: event.clientY }; - this._previewController.onDragging(draggingDOMs, this._draggingCoords.x, this._draggingCoords.y, 'col'); - - this._autoScrollController.checkXAutoScroll(event.clientX, draggingDOMs); - - const direction = this._startCoords.x > this._draggingCoords.x ? 'left' : 'right'; - const dragOverColumn = getDragOverColumn(draggingDOMs.table, this._draggingCoords.x); - if (!dragOverColumn) return; - - const [col, index] = dragOverColumn; - this._droppingIndex = index; - this._dropIndicatorController.onDragging(col, direction, 'col'); - } - - private _onDragRowStart = (event: DragEvent) => { - this._onDragStart(event, 'row'); - } - - private _onDraggingRow = (event: DragEvent) => { - const draggingDOMs = this._draggingDOMs; - if (!draggingDOMs) return; - - this._draggingCoords = { x: event.clientX, y: event.clientY }; - this._previewController.onDragging(draggingDOMs, this._draggingCoords.x, this._draggingCoords.y, 'row'); - - this._autoScrollController.checkYAutoScroll(event.clientY); - - const direction = this._startCoords.y > this._draggingCoords.y ? 'up' : 'down'; - const dragOverRow = getDragOverRow(draggingDOMs.table, this._draggingCoords.y); - if (!dragOverRow) return; - - const [row, index] = dragOverRow; - this._droppingIndex = index; - this._dropIndicatorController.onDragging(row, direction, 'row'); - } - - private _onDragEnd = () => { - this._dragging = false; - this._draggingIndex = -1; - this._droppingIndex = -1; - this._startCoords = { x: 0, y: 0 }; - this._autoScrollController.stop(); - this._dropIndicatorController.onDragEnd(); - this._previewController.onDragEnd(); - } - - private _bindDragEvents = () => { - this._colDragHandle.addEventListener('dragstart', this._onDragColStart); - this._disposables.push(() => { - this._colDragHandle.removeEventListener('dragstart', this._onDragColStart); - }) - - this._colDragHandle.addEventListener('dragend', this._onDragEnd); - this._disposables.push(() => { - this._colDragHandle.removeEventListener('dragend', this._onDragEnd); - }) - - this._rowDragHandle.addEventListener('dragstart', this._onDragRowStart); - this._disposables.push(() => { - this._rowDragHandle.removeEventListener('dragstart', this._onDragRowStart); - }) - - this._rowDragHandle.addEventListener('dragend', this._onDragEnd); - this._disposables.push(() => { - this._rowDragHandle.removeEventListener('dragend', this._onDragEnd); - }) - - const ownerDocument = this.editor.view.dom?.ownerDocument - if (ownerDocument) { - // To make `drop` event work, we need to prevent the default behavior of the - // `dragover` event for drop zone. Here we set the whole document as the - // drop zone so that even the mouse moves outside the editor, the `drop` - // event will still be triggered. - ownerDocument.addEventListener('drop', this._onDrop); - ownerDocument.addEventListener('dragover', this._onDrag); - this._disposables.push(() => { - ownerDocument.removeEventListener('drop', this._onDrop); - ownerDocument.removeEventListener('dragover', this._onDrag); - }); - } - } - - private _onDragStart = (event: DragEvent, type: 'col' | 'row') => { - const dataTransfer = event.dataTransfer; - if (dataTransfer) { - dataTransfer.effectAllowed = 'move'; - this._emptyImageController.hideDragImage(dataTransfer); - } - this._dragging = true; - this._draggingDirection = type; - this._startCoords = { x: event.clientX, y: event.clientY }; - const draggingIndex = (type === 'col' ? this._hoveringCell?.colIndex : this._hoveringCell?.rowIndex) ?? 0; - - this._draggingIndex = draggingIndex; - - const relatedDoms = getDndRelatedDOMs( - this.editor.view, - this._hoveringCell?.cellPos, - draggingIndex, - type - ) - this._draggingDOMs = relatedDoms; - - const index = type === 'col' ? this._hoveringCell?.colIndex : this._hoveringCell?.rowIndex; - - this._previewController.onDragStart(relatedDoms, index, type); - this._dropIndicatorController.onDragStart(relatedDoms, type); - } - - private _onDrag = (event: DragEvent) => { - event.preventDefault() - if (!this._dragging) return; - if (this._draggingDirection === 'col') { - this._onDraggingCol(event); - } else { - this._onDraggingRow(event); - } - } - - private _onDrop = () => { - if (!this._dragging) return; - const direction = this._draggingDirection; - const from = this._draggingIndex; - const to = this._droppingIndex; - const tr = this.editor.state.tr; - const pos = this.editor.state.selection.from; - - if (direction === 'col') { - const canMove = moveColumn({ - tr, - originIndex: from, - targetIndex: to, - select: true, - pos, - }) - if (canMove) { - this.editor.view.dispatch(tr); - } - - return; - } - - if (direction === 'row') { - const canMove = moveRow({ - tr, - originIndex: from, - targetIndex: to, - select: true, - pos, - }) - if (canMove) { - this.editor.view.dispatch(tr); - } - - return; - } + return; } + }; } export const TableDndExtension = Extension.create({ - name: 'table-drag-and-drop', - addProseMirrorPlugins() { - const editor = this.editor + name: "table-drag-and-drop", + addProseMirrorPlugins() { + const editor = this.editor; - const dragHandlePluginSpec = new TableDragHandlePluginSpec(editor) - const dragHandlePlugin = new Plugin(dragHandlePluginSpec) + const dragHandlePluginSpec = new TableDragHandlePluginSpec(editor); + const dragHandlePlugin = new Plugin(dragHandlePluginSpec); - return [dragHandlePlugin] - } -}) + return [dragHandlePlugin]; + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1baaa646..24c77b94 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,7 +36,7 @@ importers: version: 3.2.3(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) '@hocuspocus/transformer': specifier: ^3.2.3 - version: 3.2.3(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) + version: 3.2.3(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) '@joplin/turndown': specifier: ^4.0.74 version: 4.0.74 @@ -47,89 +47,89 @@ importers: specifier: 1.1.0 version: 1.1.0 '@tiptap/core': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/pm@3.4.2) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/pm@3.6.1) '@tiptap/extension-code-block': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) '@tiptap/extension-collaboration': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) '@tiptap/extension-collaboration-caret': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)) '@tiptap/extension-color': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/extension-text-style@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/extension-text-style@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))) '@tiptap/extension-document': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) '@tiptap/extension-heading': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) '@tiptap/extension-highlight': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) '@tiptap/extension-history': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)) '@tiptap/extension-image': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) '@tiptap/extension-link': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) '@tiptap/extension-list': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) '@tiptap/extension-list-item': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)) '@tiptap/extension-list-keymap': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)) '@tiptap/extension-placeholder': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)) '@tiptap/extension-subscript': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) '@tiptap/extension-superscript': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) '@tiptap/extension-table': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) '@tiptap/extension-text': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) '@tiptap/extension-text-align': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) '@tiptap/extension-text-style': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) '@tiptap/extension-typography': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) '@tiptap/extension-youtube': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) '@tiptap/html': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(happy-dom@15.11.7) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(happy-dom@15.11.7) '@tiptap/pm': - specifier: ^3.4.2 - version: 3.4.2 + specifier: ^3.6.1 + version: 3.6.1 '@tiptap/react': - specifier: ^3.4.2 - version: 3.4.2(@floating-ui/dom@1.7.3)(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^3.6.1 + version: 3.6.1(@floating-ui/dom@1.7.3)(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tiptap/starter-kit': - specifier: ^3.4.2 - version: 3.4.2 + specifier: ^3.6.1 + version: 3.6.1 '@tiptap/suggestion': - specifier: ^3.4.2 - version: 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + specifier: ^3.6.1 + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) '@types/qrcode': specifier: ^1.5.5 version: 1.5.5 @@ -244,7 +244,7 @@ importers: version: 5.80.6(react@18.3.1) '@tiptap/extension-character-count': specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + version: 2.14.0(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) alfaaz: specifier: ^1.1.0 version: 1.1.0 @@ -3888,31 +3888,31 @@ packages: peerDependencies: react: ^18 || ^19 - '@tiptap/core@3.4.2': - resolution: {integrity: sha512-OYU0VoFiMoIsMfQibyuNf1dk3ERvUK/eBKsfMnEr8Tr3+l0ltg+xxjiLe/U0NHR/A0myvNXqc2zyVxtyDRYPGg==} + '@tiptap/core@3.6.1': + resolution: {integrity: sha512-Ascvlh0PmScOJyPxcgPOqFLSOruY/7JjPYdTyqShOIks1S2dr3w8A07omQCmeEHI0mX9L2eZyR2qXwFlyMdfEA==} peerDependencies: - '@tiptap/pm': ^3.4.2 + '@tiptap/pm': ^3.6.1 - '@tiptap/extension-blockquote@3.4.2': - resolution: {integrity: sha512-v7tONi9eTVHK8s6ligSMz1ATy72zQNNrI0A7EmX9kTcUodVl44i0Tw+mgGyeMEKo+oSX88yPhD+lKXKUVleRHA==} + '@tiptap/extension-blockquote@3.6.1': + resolution: {integrity: sha512-/2oa6GfL1eo2NOZ0Eyr+z56esZTDQDE2g3yz68BRJ7d4qWOLECm7an8R/lUex9qFNfpoI+XolSRmbsMzsnvsFA==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-bold@3.4.2': - resolution: {integrity: sha512-/TYN0jFlXul/D9TSqh4i5vnZR5AmptOc6SJCYZAoi/U7qF4D2xtuAic+lkW0p60Gtrgqgap666scvVCnpnJlzQ==} + '@tiptap/extension-bold@3.6.1': + resolution: {integrity: sha512-sverZOvkPB0D4GEJ8c8OlIA7jsY40AS6grXZERTBSKsAJQI+dwuq+dfe9oo8T6U0Lv0MaLO4UgxU9lB/UmST2Q==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-bubble-menu@3.4.2': - resolution: {integrity: sha512-N8rbb6H5qfXMRdudB3Uz4kUjfGf3bcIbu20/4emRFajILvhnbobvmYGPsWxVVS4UL0tKETCfEuTVaflWy+ZrmQ==} + '@tiptap/extension-bubble-menu@3.6.1': + resolution: {integrity: sha512-0x8waHgxi5soPzKnzimVuIBRz5HUA+OLjbxwPKHrV9mDGK0biDCIG140+Qm+LfCBWnc50+5oLUpfG5PSOcwjhA==} peerDependencies: - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 - '@tiptap/extension-bullet-list@3.4.2': - resolution: {integrity: sha512-j7hPCaULln7w90KMyvcubM51bQrmmzHKQJcs/EccN6rhsL3hqJ4fIiyGRKhGbv4QVXzqwLJXNkQusOKDchi8pw==} + '@tiptap/extension-bullet-list@3.6.1': + resolution: {integrity: sha512-0CxnGXsQdtk+1CDuNjQ8Q3F+7VRoMXWrDKv23+EHp/zkp0Mv9gJx77AMU3RwUZdrvNL4UP6hllb+11eM2Qi5xQ==} peerDependencies: - '@tiptap/extension-list': ^3.4.2 + '@tiptap/extension-list': ^3.6.1 '@tiptap/extension-character-count@2.14.0': resolution: {integrity: sha512-aTCobbF9yIXOntVTdjzJ4G5V0TJKeeIDW8RFMdTVr5o0R/woSZ27cXiPGdS7XxpN6gY9vlNzYe79CcNBDTzLfA==} @@ -3920,219 +3920,219 @@ packages: '@tiptap/core': ^2.7.0 '@tiptap/pm': ^2.7.0 - '@tiptap/extension-code-block@3.4.2': - resolution: {integrity: sha512-H5Y8Rs3EnH9u5gkxEikUWTyBf1WmttPSmEsEmBh0a6Lj9m3NxAbOEvKszibkqJNvfQdpomKCMQU6w/OXiZC/DQ==} + '@tiptap/extension-code-block@3.6.1': + resolution: {integrity: sha512-9UFxNYUZHFH0lr1ionpPEJgfMpsaE6RpeBLTGotCh3Ls4Qmd//1wKS/H5fm1T74rLFVrRaPCAQXEB7tPWZbfng==} peerDependencies: - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 - '@tiptap/extension-code@3.4.2': - resolution: {integrity: sha512-7A/ihn8ayA7K6CzETmWFVzixyOVRVSviRMIleNGknBtF6C4bmqfuwBa2KAonylv5ws0JZfQRQU7itrHE8FVdEg==} + '@tiptap/extension-code@3.6.1': + resolution: {integrity: sha512-9uDCXFqt8hcdeYIO65ao0U83o/OhChwTreJ/wTSJkp1eeO3D5zxYkrORLsD/ukNhRr15BhU47226elwfC2wLTg==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-collaboration-caret@3.4.2': - resolution: {integrity: sha512-+lg/7UnIMIbmwmA5IUkTQDFypcIuCzGmdo2oNVxKz1WS6boNefVGiqhXv+l7/RRdL1g5HvmWypsTznShQIU2TA==} + '@tiptap/extension-collaboration-caret@3.6.1': + resolution: {integrity: sha512-if/YS2LdDi4T5vHo4VlUXyytDN2kkZbphJqYrkFINLsWZJ6wBUrM3QfWQQqAtFDpMLsQBSiq+EbmzeQNp6l/5w==} peerDependencies: - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 '@tiptap/y-tiptap': ^3.0.0-beta.3 - '@tiptap/extension-collaboration@3.4.2': - resolution: {integrity: sha512-VS/wiWwrEmyy1emqGF+yStpo58xPYgF440U9ciFMyB2nRI+4DIbsmt0yQz3eczzXEQ3oeSTSIC9nnW+RVZ1FNw==} + '@tiptap/extension-collaboration@3.6.1': + resolution: {integrity: sha512-c0hkH/90pf/3Aevy2MgW7Hg2yeV4fkeOFoBWEu5nwA1YeulJL+usGQrudhpBSgzAvpv94OZXkdVQjJwRq1hvzg==} peerDependencies: - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 '@tiptap/y-tiptap': ^3.0.0-beta.3 yjs: ^13 - '@tiptap/extension-color@3.4.2': - resolution: {integrity: sha512-FvgmGQfi+aFffD2N2Ffn9q2r0TObaG4oSfnv3dxR5xVgRTT0KL5doxdD4i+RmX9OC8uchW6TGVlK5Fy+bOZBrw==} + '@tiptap/extension-color@3.6.1': + resolution: {integrity: sha512-WCq4DRxawCsb0oeZQFGPMKCy1Vc8Wvob7BeUhtHeZtlZNkzFenVSYE8kBwK+J+rbvuaQxaPB10VejOC8NWcqtA==} peerDependencies: - '@tiptap/extension-text-style': ^3.4.2 + '@tiptap/extension-text-style': ^3.6.1 - '@tiptap/extension-document@3.4.2': - resolution: {integrity: sha512-y6XfihmKYrqUEAeyZkkF39/dBqvjf7TavCPVPaN42agjFYukiZExgtDb+xkagxdbDzf1F8327CyoAqNajhj79Q==} + '@tiptap/extension-document@3.6.1': + resolution: {integrity: sha512-PT084IHWHhmZ058Svcr+9l6Ih9m7uql8jJ23Jv1khtBg4WysDY+SPNNjZhFgWIaA1jZ/Ml7lqkGwWaON1749og==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-dropcursor@3.4.2': - resolution: {integrity: sha512-BHjfpusRvxsa8aV1C0O0mNNjBGWfa1uwolHflCOb4PNkh9nGU0htuaPYTS4fGEVVKOhOC9qsp0hUHSejWL1E6g==} + '@tiptap/extension-dropcursor@3.6.1': + resolution: {integrity: sha512-JOTQfvW8r6FNd9G7+q7c0XwSDoNJQIhXRltY5m5GHT37EN60pMS2eIFYNAnBMNu7yZ6H6uxRnGmMLsnnn+2LCw==} peerDependencies: - '@tiptap/extensions': ^3.4.2 + '@tiptap/extensions': ^3.6.1 - '@tiptap/extension-floating-menu@3.4.2': - resolution: {integrity: sha512-2jDugvR7e506fDfmO22cHU0XnRyBsvig8XNSBPEcXyP3xy53kxiaCF4CzRC8DyzuC7u1NilII27TnwV5iM+9Pg==} + '@tiptap/extension-floating-menu@3.6.1': + resolution: {integrity: sha512-vY2WYPDwlOFOSGrlHufRQ6pQETVb6E7+4zjuaqTgWKc2YwDeiIf+w8pRuIeFyMmRJ0oMyIs+TqWQf4Fg0dlt/A==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 - '@tiptap/extension-gapcursor@3.4.2': - resolution: {integrity: sha512-cn85HNyqaZpY0QPmETyB0QS/B24rFQxvtOLL1gf0hLFvTp7kuMYTFcU6CgDibr4uDu2hBBXhgTRTOl2e3bN8Xw==} + '@tiptap/extension-gapcursor@3.6.1': + resolution: {integrity: sha512-DzOxPQbUoZ+01xRLVmvzsZDMJMJBPXblQPnIVjAw0aqovpAx0XBMNJVHl6OfYLIjs8T9aKAJdE8N3KfjgJr7BA==} peerDependencies: - '@tiptap/extensions': ^3.4.2 + '@tiptap/extensions': ^3.6.1 - '@tiptap/extension-hard-break@3.4.2': - resolution: {integrity: sha512-h5CfGZyUrhzUCXwYgmxUaQKsu+zZC2iDpJkJK9TH7PobWkN3fFPfmc1D2LrDyYI24G8ozzqHQissAQl4JEag5w==} + '@tiptap/extension-hard-break@3.6.1': + resolution: {integrity: sha512-lGY+EVJQDtw3EUPYy5kxlnzB3oYVh0wKVNUOBeUv23oOURFldOYcPv5ZVT8dXPqLZPVeeAYHlqxzXgd8iZ6sKw==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-heading@3.4.2': - resolution: {integrity: sha512-8Gbc52jjDVhVbXoNNVXeIkfMP3sHCfqW/GqYjZ9onYPYk1GD4DkSAMH9naRJ8g/+Z6lOkKM+ySF/gtdAVOnBTQ==} + '@tiptap/extension-heading@3.6.1': + resolution: {integrity: sha512-EsJrPUPxQqPwJNuboX/Z/l+f2YleJWYMJ75TyCfBrPhOkcaXasiUSyfK/qm9NxcFOGPTgnTMAhE9PfQ04eptQQ==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-highlight@3.4.2': - resolution: {integrity: sha512-jLPTmTuMQTP4nhCWG9XL1QKoOv8a7XG6NrqtBO/8+wHPGrl+C9Qb+QxrJrbrpsC7IadNVccp6hF4qAGAaVLtQg==} + '@tiptap/extension-highlight@3.6.1': + resolution: {integrity: sha512-sNzwL0OZRpxAef9LE4SS3AbNyMBsxyGw3MJF34+Bdcu2VpaqoM3XFn664cD7iAsyTJI9eY0eLhZTMcKsdAlBaw==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-history@3.4.2': - resolution: {integrity: sha512-z18QsAyqkYfrKa84vo7mTrBfP6L7SCzUQM/veITGlgJqY0oXgEJMZHbTUMBIS8vl40/6pjkOMH94JGB87qxzsQ==} + '@tiptap/extension-history@3.6.1': + resolution: {integrity: sha512-zEL3mbzwsjGEP5Sg6DCpKlP+ZhHO5Q/IWg6Wqjm64o8WFPnBgGjyr3CyFUpaNr79Op0CxT7Cd6uh248l39I1dA==} peerDependencies: - '@tiptap/extensions': ^3.4.2 + '@tiptap/extensions': ^3.6.1 - '@tiptap/extension-horizontal-rule@3.4.2': - resolution: {integrity: sha512-LK56R4ZR/B6nMxdyiDWuV6nk5akX8/2OXp29ZuX34BBYkFNjLBF9evGCHDy60az43JrSi/wwTUDafAxdO9S2Ig==} + '@tiptap/extension-horizontal-rule@3.6.1': + resolution: {integrity: sha512-fadO1GWVNzl7WcfL0SODHQcz9krNmV9H4TvbVbOnl9FxlWgEm0NcP43j0DQVMlGAhbUHGjDY6Sf85qrkPtbstw==} peerDependencies: - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 - '@tiptap/extension-image@3.4.2': - resolution: {integrity: sha512-76pWwe2WEPw/LMEh+QTEJRGKM5YLAJfmt64DOlO887YH6uXjTn5tKJ3gedz+0ZM4NhHh61JbfXcdTFEhkMxMZA==} + '@tiptap/extension-image@3.6.1': + resolution: {integrity: sha512-3ze2Et/p9YwQ34RkX8cIuClNiGup0/OfTy22GtjGPMpRPTSt8LTwz9vUEmENCdwfFYidyNSoh2rXA1gXKRfNFQ==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-italic@3.4.2': - resolution: {integrity: sha512-X+ySvBlO2bpJJWgaZKVesh/GV5VtBchYZizEBUaPvkgYsS+s0Ujwz3YQvszX/JnfJ4k239D9S+bpJi4dTN5Utw==} + '@tiptap/extension-italic@3.6.1': + resolution: {integrity: sha512-rb5AvhT+IZ8PjXpnG7cir92zQYWOj6gH/icMkOyi/4jtuRSWRMCOO3nh/eVqK6xL0sa7e57fLIliepm4PBJy+Q==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-link@3.4.2': - resolution: {integrity: sha512-BNewJ6A6sHWzOlRhTtCp5ZLy8IguH54eEidntIbjSqV1nXwZot60PVdB+d53Mbz2SJJkdSrfbI7Kj0V1BTh6gA==} + '@tiptap/extension-link@3.6.1': + resolution: {integrity: sha512-jT85DLWC64yakmlsYz0mRbeDCiseoG0Ad8uxMIXYjsKNmAcAQWkoJ6oyA728YSGvh7fxMYNrWxa/A+raPvpnjQ==} peerDependencies: - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 - '@tiptap/extension-list-item@3.4.2': - resolution: {integrity: sha512-OrRKIYih4Wc+TofAAgukpMEzq8k3BH6WY7QzPtxti58aji+euNYznt2YQm8m1oJdMECYOaREV4cwXvmES6rk8A==} + '@tiptap/extension-list-item@3.6.1': + resolution: {integrity: sha512-xNHs1fgt2gmkgDcyzU4Qb9t2mLmPx+z3KGsxwn5O2LUvjR5OkToNrpUX08aY3psBCB7gYZpwLafGP2TKVa6DlA==} peerDependencies: - '@tiptap/extension-list': ^3.4.2 + '@tiptap/extension-list': ^3.6.1 - '@tiptap/extension-list-keymap@3.4.2': - resolution: {integrity: sha512-VbtrCeoN64ByHL2jQUx2Zya+u8JxEvsRTelr8hksSGRrrZyahG1JESpu7Z2Y8Qjo5NEfSivWuEw9kbLCXsjvjw==} + '@tiptap/extension-list-keymap@3.6.1': + resolution: {integrity: sha512-jbpG0qc7s45Bl17yM8NrxxlwWjmTwID6gxkwVV+Zrgt2JzZ8VN/+O1ux5Rg8o448IKHmq2hS0NeakyqVT+ntAA==} peerDependencies: - '@tiptap/extension-list': ^3.4.2 + '@tiptap/extension-list': ^3.6.1 - '@tiptap/extension-list@3.4.2': - resolution: {integrity: sha512-ribIYMre1EB6TdyNhEBbO23p2f+UQj5KghbtcI4wYmthjnN+LOag+dUM5sBAiUhUyBlmc4MC1As06yWTu2hzqQ==} + '@tiptap/extension-list@3.6.1': + resolution: {integrity: sha512-eMUp/ZsxZHr4bpyoyXsw8S00GXs/Ys2egN7jkKOgRA5Px1JpASgSp7bcG5R0ItBZ7z7LhNTWfaE+jfRJ1hgkZQ==} peerDependencies: - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 - '@tiptap/extension-ordered-list@3.4.2': - resolution: {integrity: sha512-q9w7fQ26PZkbS3iD4h4HpoFoI5ap5jyYeGBugyhgGdHeF3luKiorleSY7m8NNmLlB6FWfDZZqPBWhrZgzPdFiQ==} + '@tiptap/extension-ordered-list@3.6.1': + resolution: {integrity: sha512-8gpQ6TrpJC6olW1Wg5JSsTYfeD0ykntlp7T/EzFz9790+B66W1tIvP8A57f1iq5Upmmx1NJv8V5tQ1F5OZEYVQ==} peerDependencies: - '@tiptap/extension-list': ^3.4.2 + '@tiptap/extension-list': ^3.6.1 - '@tiptap/extension-paragraph@3.4.2': - resolution: {integrity: sha512-M4M+N5Sit82HUK9rp662ZL1X/MMkD3zMnD8i5gV0Gj1T+YwToAGBIdte7n9QoAcNZr1cOdjAveI+HzOw6UA6SQ==} + '@tiptap/extension-paragraph@3.6.1': + resolution: {integrity: sha512-daINH5O/GHBtQnCmDdpiYDSgdvasV2fmv5aljKG1uI56iN770vyUde3NCIYTk6EYCA8COFMWKFfxK8D2JJDdCg==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-placeholder@3.4.2': - resolution: {integrity: sha512-it4BIl2quDLIBM3I1y618kvOHYgcWBaf9VvLTN2SzTAt35cn5ySOFBOxM2eSr8HG1WigdL9eIL/y1hENsdQrqw==} + '@tiptap/extension-placeholder@3.6.1': + resolution: {integrity: sha512-AhNI+75OqoJKtt5SChzacbPco9jnfV9rkHCF4yVenlK0Z3IQ/iOgAjLUbYqveXzNmLdhyt7lZn3yaCPXwCldJA==} peerDependencies: - '@tiptap/extensions': ^3.4.2 + '@tiptap/extensions': ^3.6.1 - '@tiptap/extension-strike@3.4.2': - resolution: {integrity: sha512-bgdq2eW5omli+rv6PHErDME1YocT1BHkiWvRV5pRYyTz5TZTgYujA0Qn2DjsW1baFike0oG3ToLAxH5RnViDoQ==} + '@tiptap/extension-strike@3.6.1': + resolution: {integrity: sha512-iSx0k/QZkiFoGVLJksMrDgwYSE4ntljEt5qys9gkU6PP3LDUicaYjpVcFN93F1ycxQ7LyQRVq9azRxQ+tIT35Q==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-subscript@3.4.2': - resolution: {integrity: sha512-SakjoT34eXr7EDZPkuBnqWeUD3hF7NLM2F3XY73cNA+XOyZ/MzH/alCZ+9qzFVaOgMshMkR6JzXvNrlGh6RRnA==} + '@tiptap/extension-subscript@3.6.1': + resolution: {integrity: sha512-GxJB9+JQq+x1Z+ykn1pm3G3M73gXZfhqzraI47jYinqOftv/DHZ6sPxgQJFVInlAseMD5KdqWmJ7YlXWVJisRQ==} peerDependencies: - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 - '@tiptap/extension-superscript@3.4.2': - resolution: {integrity: sha512-WPKoEunJC/9euyZYrGMwXRi0xKQ6Pv78Gj5klKdiIDmgS+haATy3thUrfS58fYwBX3k0uAs+eATNEB1nvOiJhA==} + '@tiptap/extension-superscript@3.6.1': + resolution: {integrity: sha512-Zwpr+5alDail0GAe+u1TWVbprpJcRLbHpDZq1fro3ea3KdtQjr8TcXPBVRvJ+66URahAT2BxKTQ5esruKj2cBQ==} peerDependencies: - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 - '@tiptap/extension-table@3.4.2': - resolution: {integrity: sha512-7fDsn+ovqjtsJ+B5aNdMoTzMIlY8NqMXzp96EMoOu2/hVo0CtPzEfDWZ5r2ehLo3KJvtNDLihnKLw2hwKL7rAg==} + '@tiptap/extension-table@3.6.1': + resolution: {integrity: sha512-DRVy+hqysOWeB6RCaveV06+eTpq8JnBFowx8fkAdcyyLVPEaeZvnIvulL8vMYJjSOqxJ7rCLoqhK2N6CXbewiQ==} peerDependencies: - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 - '@tiptap/extension-text-align@3.4.2': - resolution: {integrity: sha512-PAZPwYTaH/BYvVHmK+53VvYIGV5JzmQyycYdy5JHc8EiczBBJ88HtG/hH8ZViRAXsiONld3ANF8HWyvgMSyILw==} + '@tiptap/extension-text-align@3.6.1': + resolution: {integrity: sha512-zegYnbKAPGV5FcPWefucBWfirbROSLl52qkl6+5okHDyeGOKBmo1FPZieikopK+kTmwgzRQZUyCejybQQuW2ZA==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-text-style@3.4.2': - resolution: {integrity: sha512-ioCf7VxWj2t+seC2vfzGtGlcToGKpwz6R5HMpo6/CSBDTZc5LsPTiJqJ6R6ahjqWwAKHI6SzlW5vtS36OywDzw==} + '@tiptap/extension-text-style@3.6.1': + resolution: {integrity: sha512-aWmziUtNP6DnY0aKSt6HS7DcJgfP6zuAbVEuUsHLZAy4c9DAtKZbFuwLvIY7TvSG9haAKD8TWc8TATEpSct0UQ==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-text@3.4.2': - resolution: {integrity: sha512-g7F1utUaVibr0ohnvfj4zJh6lofP5mQY+6sE2CDsHD1IE5VcBGh7ONWUMzAAGzi9oHtKSqpzPiUfw1BtmF8/+Q==} + '@tiptap/extension-text@3.6.1': + resolution: {integrity: sha512-B/UMoYhg9C12JnCJI5oRoJx4yKVsBQQ4cnb3iaRfvXzm1sUQPOsLjK75kLQGKDfVWYMwj13InSXZ+WD+BVuLvA==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-typography@3.4.2': - resolution: {integrity: sha512-prI4UIjxylUjynFHbKsVpXK8K5OpRz86FFyZOLiCVjbZEo21WOprweyS7EAgCoQJOlo/FxTDWb7zSjp4UUBk9A==} + '@tiptap/extension-typography@3.6.1': + resolution: {integrity: sha512-zAL3uO5A2/3raoApI0YYHE+HbK1cx92gfakUREDfzWG45M6C+D7TCIX320qvqUhzjVWK+qrFaWQddAX5w8VQJA==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-underline@3.4.2': - resolution: {integrity: sha512-kOOYE81n7w8yFt63UDjPq3hFoPXIGwcIbXOZCaB77tmLy4Cfy7ewa0oVnzunCXsGJs1Je4NbIqFnJq0H2KyUPw==} + '@tiptap/extension-underline@3.6.1': + resolution: {integrity: sha512-I1A2PHyKX9D/FtlP4qBmG7HN81zndFB9Qf+7sZub6L7gS4IiHwtu0bj48uwhAyoZZzxm+bDvdZvGVrZWjhbFCg==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extension-youtube@3.4.2': - resolution: {integrity: sha512-3WMhCEbzlx2TyYe3xXrsTRVxC9p7GNFcCKCT+8WJQY6vnqqwXv6JhZL/fsuneZivKDL8gyn75EZTcHS5DV/WAA==} + '@tiptap/extension-youtube@3.6.1': + resolution: {integrity: sha512-5SQthR8hLhS7u2XoPfba0aYU94OXkyE3KD7p1AsCbbajdeV9UTOvZekRb4Fw2AcbvmXK2dB3NnC/s4oH/giXLw==} peerDependencies: - '@tiptap/core': ^3.4.2 + '@tiptap/core': ^3.6.1 - '@tiptap/extensions@3.4.2': - resolution: {integrity: sha512-0EOPKVU0whK4tw7TenmJe0M+DfV8Fjj0b6ZO0hqq2rOFWtBRUdRd7QLdg8XUk70D1BbZ52kO0ggM4zZqhW/57A==} + '@tiptap/extensions@3.6.1': + resolution: {integrity: sha512-2k5h4mhEBZ6sSEPgJSTXi+xB2fYIEQaqq3jLOk3Po9wQsCDLk4+HT6N/5HIjry+q3xoct/WQ9FZ9w9UTTdyLMQ==} peerDependencies: - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 - '@tiptap/html@3.4.2': - resolution: {integrity: sha512-rFfHYCcLOEkDDq+KRjt9rDu3oGU1ExjnhRzFleoJX4HhpOUQQjaE/vE3YLcwJLR8V+n0XJzocwL6wlIk4jkG7g==} + '@tiptap/html@3.6.1': + resolution: {integrity: sha512-aic1EmKBwePFGy9svBoIPXgk7BD+pea5NzNKgQzXo3madZ0uPXnrazyLSpfQn3dgXwa9dXDB0XTuOp3jGo/SaQ==} peerDependencies: - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 happy-dom: ^18.0.1 - '@tiptap/pm@3.4.2': - resolution: {integrity: sha512-cU1DYb1vnpAZhe7R578PfSCh9FbZDf/zR3wuhc6QOkZjGertTgG9ge7pn0RZnJeX4U9hO1WWJ5eOIPoalotlcA==} + '@tiptap/pm@3.6.1': + resolution: {integrity: sha512-4F3qKhLQYlHGfayO0dQD3hiX3VeSCkdoKQQ+gIegNhwX5IWboQleVMueo7rcKN8WarTkysbYnILcWgx5OYcKew==} - '@tiptap/react@3.4.2': - resolution: {integrity: sha512-kNcn+uNMs76GXYLBtEwR5pE357MdCKvIAQ3Oobq+//rrynRK/RP2IlRpybTWhrn/y7d4nD0DfHbFnhDpokoJIQ==} + '@tiptap/react@3.6.1': + resolution: {integrity: sha512-5J1a1JNxhuMYrrAb2NZfs7AX/Pc6xBvVQJnNJ6vR9QZWlBgSe67iJK/bh8KPB7jxrzbItKQ2Brp3v46QLZXPDw==} peerDependencies: - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@3.4.2': - resolution: {integrity: sha512-qfw9RljtZNLpqj+lnkgxok+ksCV/OR4rBX7QSJXaQYVJuid2tXejFj7vqsJQaf1Z6zT9swdk7js92qlwjCO0BQ==} + '@tiptap/starter-kit@3.6.1': + resolution: {integrity: sha512-gmQCHEcZxjnVqTInhNx3z7Vuvz+mmIVcXiCSLd5cA9/8PkHo3ttxijfc3lXe4V2ed6RPBWU/FUHFxcUmxqc5Vg==} - '@tiptap/suggestion@3.4.2': - resolution: {integrity: sha512-sljtfiDtdAsbPOwrXrFGf64D6sXUjeU3Iz5v3TvN7TVJKozkZ/gaMkPRl+WC1CGwC6BnzQVDBEEa1e+aApV0mA==} + '@tiptap/suggestion@3.6.1': + resolution: {integrity: sha512-C2bDamOCqcWbyB4Ogvk1pCUkbrnIMOsVYyt8sd1JsjZUA/QYTBWt8Bt/3venI1mx6ad47oCsU16KDQRKKfu+cA==} peerDependencies: - '@tiptap/core': ^3.4.2 - '@tiptap/pm': ^3.4.2 + '@tiptap/core': ^3.6.1 + '@tiptap/pm': ^3.6.1 '@tiptap/y-tiptap@3.0.0': resolution: {integrity: sha512-HIeJZCj+KYJde2x6fONzo4o6kd7gW7eonwhQsv2p2VQnUgwNXMVhN+D6Z3AH/2i541Sq33y1PO4U/1ThCPjqbA==} @@ -12043,11 +12043,11 @@ snapshots: - bufferutil - utf-8-validate - '@hocuspocus/transformer@3.2.3(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/transformer@3.2.3(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(y-prosemirror@1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 - '@tiptap/starter-kit': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 + '@tiptap/starter-kit': 3.6.1 y-prosemirror: 1.2.3(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) yjs: 13.6.27 @@ -13813,194 +13813,194 @@ snapshots: '@tanstack/query-core': 5.80.6 react: 18.3.1 - '@tiptap/core@3.4.2(@tiptap/pm@3.4.2)': + '@tiptap/core@3.6.1(@tiptap/pm@3.6.1)': dependencies: - '@tiptap/pm': 3.4.2 + '@tiptap/pm': 3.6.1 - '@tiptap/extension-blockquote@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-blockquote@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-bold@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-bold@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-bubble-menu@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': + '@tiptap/extension-bubble-menu@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)': dependencies: '@floating-ui/dom': 1.7.3 - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 optional: true - '@tiptap/extension-bullet-list@3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': + '@tiptap/extension-bullet-list@3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/extension-list': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extension-list': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) - '@tiptap/extension-character-count@2.14.0(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': + '@tiptap/extension-character-count@2.14.0(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 - '@tiptap/extension-code-block@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': + '@tiptap/extension-code-block@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 - '@tiptap/extension-code@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-code@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-collaboration-caret@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))': + '@tiptap/extension-collaboration-caret@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 '@tiptap/y-tiptap': 3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) - '@tiptap/extension-collaboration@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': + '@tiptap/extension-collaboration@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 '@tiptap/y-tiptap': 3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) yjs: 13.6.27 - '@tiptap/extension-color@3.4.2(@tiptap/extension-text-style@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)))': + '@tiptap/extension-color@3.6.1(@tiptap/extension-text-style@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)))': dependencies: - '@tiptap/extension-text-style': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) + '@tiptap/extension-text-style': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) - '@tiptap/extension-document@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-document@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-dropcursor@3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': + '@tiptap/extension-dropcursor@3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/extensions': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extensions': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) - '@tiptap/extension-floating-menu@3.4.2(@floating-ui/dom@1.7.3)(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': + '@tiptap/extension-floating-menu@3.6.1(@floating-ui/dom@1.7.3)(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)': dependencies: '@floating-ui/dom': 1.7.3 - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 optional: true - '@tiptap/extension-gapcursor@3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': + '@tiptap/extension-gapcursor@3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/extensions': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extensions': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) - '@tiptap/extension-hard-break@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-hard-break@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-heading@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-heading@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-highlight@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-highlight@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-history@3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': + '@tiptap/extension-history@3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/extensions': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extensions': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) - '@tiptap/extension-horizontal-rule@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': + '@tiptap/extension-horizontal-rule@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 - '@tiptap/extension-image@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-image@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-italic@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-italic@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-link@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': + '@tiptap/extension-link@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 linkifyjs: 4.3.2 - '@tiptap/extension-list-item@3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': + '@tiptap/extension-list-item@3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/extension-list': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extension-list': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) - '@tiptap/extension-list-keymap@3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': + '@tiptap/extension-list-keymap@3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/extension-list': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extension-list': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) - '@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': + '@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 - '@tiptap/extension-ordered-list@3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': + '@tiptap/extension-ordered-list@3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/extension-list': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extension-list': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) - '@tiptap/extension-paragraph@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-paragraph@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-placeholder@3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2))': + '@tiptap/extension-placeholder@3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/extensions': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extensions': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) - '@tiptap/extension-strike@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-strike@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-subscript@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': + '@tiptap/extension-subscript@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 - '@tiptap/extension-superscript@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': + '@tiptap/extension-superscript@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 - '@tiptap/extension-table@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': + '@tiptap/extension-table@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 - '@tiptap/extension-text-align@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-text-align@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-text-style@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-text-style@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-text@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-text@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-typography@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-typography@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-underline@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-underline@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extension-youtube@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))': + '@tiptap/extension-youtube@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) - '@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': + '@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 - '@tiptap/html@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(happy-dom@15.11.7)': + '@tiptap/html@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(happy-dom@15.11.7)': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 happy-dom: 15.11.7 - '@tiptap/pm@3.4.2': + '@tiptap/pm@3.6.1': dependencies: prosemirror-changeset: 2.3.1 prosemirror-collab: 1.3.1 @@ -14021,10 +14021,10 @@ snapshots: prosemirror-transform: 1.10.4 prosemirror-view: 1.40.0 - '@tiptap/react@3.4.2(@floating-ui/dom@1.7.3)(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tiptap/react@3.6.1(@floating-ui/dom@1.7.3)(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 '@types/react': 18.3.12 '@types/react-dom': 18.3.1 '@types/use-sync-external-store': 0.0.6 @@ -14033,42 +14033,42 @@ snapshots: react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.5.0(react@18.3.1) optionalDependencies: - '@tiptap/extension-bubble-menu': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) - '@tiptap/extension-floating-menu': 3.4.2(@floating-ui/dom@1.7.3)(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) + '@tiptap/extension-bubble-menu': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) + '@tiptap/extension-floating-menu': 3.6.1(@floating-ui/dom@1.7.3)(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) transitivePeerDependencies: - '@floating-ui/dom' - '@tiptap/starter-kit@3.4.2': + '@tiptap/starter-kit@3.6.1': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/extension-blockquote': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) - '@tiptap/extension-bold': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) - '@tiptap/extension-bullet-list': 3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) - '@tiptap/extension-code': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) - '@tiptap/extension-code-block': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) - '@tiptap/extension-document': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) - '@tiptap/extension-dropcursor': 3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) - '@tiptap/extension-gapcursor': 3.4.2(@tiptap/extensions@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) - '@tiptap/extension-hard-break': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) - '@tiptap/extension-heading': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) - '@tiptap/extension-horizontal-rule': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) - '@tiptap/extension-italic': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) - '@tiptap/extension-link': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) - '@tiptap/extension-list': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) - '@tiptap/extension-list-item': 3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) - '@tiptap/extension-list-keymap': 3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) - '@tiptap/extension-ordered-list': 3.4.2(@tiptap/extension-list@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)) - '@tiptap/extension-paragraph': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) - '@tiptap/extension-strike': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) - '@tiptap/extension-text': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) - '@tiptap/extension-underline': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2)) - '@tiptap/extensions': 3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/extension-blockquote': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) + '@tiptap/extension-bold': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) + '@tiptap/extension-bullet-list': 3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)) + '@tiptap/extension-code': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) + '@tiptap/extension-code-block': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) + '@tiptap/extension-document': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) + '@tiptap/extension-dropcursor': 3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)) + '@tiptap/extension-gapcursor': 3.6.1(@tiptap/extensions@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)) + '@tiptap/extension-hard-break': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) + '@tiptap/extension-heading': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) + '@tiptap/extension-horizontal-rule': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) + '@tiptap/extension-italic': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) + '@tiptap/extension-link': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) + '@tiptap/extension-list': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) + '@tiptap/extension-list-item': 3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)) + '@tiptap/extension-list-keymap': 3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)) + '@tiptap/extension-ordered-list': 3.6.1(@tiptap/extension-list@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)) + '@tiptap/extension-paragraph': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) + '@tiptap/extension-strike': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) + '@tiptap/extension-text': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) + '@tiptap/extension-underline': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) + '@tiptap/extensions': 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 - '@tiptap/suggestion@3.4.2(@tiptap/core@3.4.2(@tiptap/pm@3.4.2))(@tiptap/pm@3.4.2)': + '@tiptap/suggestion@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)': dependencies: - '@tiptap/core': 3.4.2(@tiptap/pm@3.4.2) - '@tiptap/pm': 3.4.2 + '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) + '@tiptap/pm': 3.6.1 '@tiptap/y-tiptap@3.0.0(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': dependencies: From d31d1f7bbdf08a1661e714c69f4d31e9b04f464a Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sat, 27 Sep 2025 14:50:27 +0100 Subject: [PATCH 12/21] fix bubble menu --- .../components/bubble-menu/bubble-menu.tsx | 2 +- .../components/callout/callout-menu.tsx | 32 +- .../editor/components/drawio/drawio-menu.tsx | 54 +-- .../components/excalidraw/excalidraw-menu.tsx | 57 +-- .../editor/components/image/image-menu.tsx | 54 ++- .../components/table/table-cell-menu.tsx | 22 +- .../editor/components/table/table-menu.tsx | 65 ++-- .../editor/components/video/video-menu.tsx | 35 +- .../features/editor/extensions/extensions.ts | 1 + packages/editor-ext/src/index.ts | 1 + .../tippy-bubble-menu/bubble-menu-plugin.ts | 349 ++++++++++++++++++ .../tippy-bubble-menu/bubble-menu-react.tsx | 72 ++++ .../src/lib/tippy-bubble-menu/index.ts | 1 + packages/editor-ext/tsconfig.json | 1 + 14 files changed, 587 insertions(+), 159 deletions(-) create mode 100644 packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-plugin.ts create mode 100644 packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-react.tsx create mode 100644 packages/editor-ext/src/lib/tippy-bubble-menu/index.ts diff --git a/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx b/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx index 0f6153dc..412f2bd7 100644 --- a/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx +++ b/apps/client/src/features/editor/components/bubble-menu/bubble-menu.tsx @@ -147,7 +147,7 @@ export const EditorBubbleMenu: FC = (props) => { }; return ( - +
{ if (!state) { @@ -50,17 +49,28 @@ export function CalloutMenu({ editor }: EditorMenuProps) { [editor], ); - const getReferenceClientRect = useCallback(() => { + const getReferencedVirtualElement = useCallback(() => { const { selection } = editor.state; const predicate = (node: PMNode) => node.type.name === "callout"; const parent = findParentNode(predicate)(selection); if (parent) { const dom = editor.view.nodeDOM(parent?.pos) as HTMLElement; - return dom.getBoundingClientRect(); + const domRect = dom.getBoundingClientRect(); + return { + getBoundingClientRect: () => domRect, + getClientRects: () => [domRect], + }; } - return posToDOMRect(editor.view, selection.from, selection.to); + console.log('callout') + + + const domRect = posToDOMRect(editor.view, selection.from, selection.to); + return { + getBoundingClientRect: () => domRect, + getClientRects: () => [domRect], + }; }, [editor]); const setCalloutType = useCallback( @@ -109,21 +119,13 @@ export function CalloutMenu({ editor }: EditorMenuProps) { editor={editor} pluginKey={`callout-menu}`} updateDelay={0} + getReferencedVirtualElement={getReferencedVirtualElement} options={{ - // getReferenceClientRect, - placement: "right-end", - // offset: 233, + placement: "bottom", + // offset: 233, // // offset: [0, 10], // zIndex: 99, flip: false, }} - //tippyOptions={{ - // getReferenceClientRect, - // offset: [0, 10], - // placement: "bottom", - // zIndex: 99, - // popperOptions: { - // modifiers: [{ name: "flip", enabled: false }], - // }, shouldShow={shouldShow} > diff --git a/apps/client/src/features/editor/components/drawio/drawio-menu.tsx b/apps/client/src/features/editor/components/drawio/drawio-menu.tsx index 14b06ed5..e5fbb13e 100644 --- a/apps/client/src/features/editor/components/drawio/drawio-menu.tsx +++ b/apps/client/src/features/editor/components/drawio/drawio-menu.tsx @@ -1,5 +1,5 @@ import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; -import { findParentNode, posToDOMRect } from "@tiptap/react"; +import { findParentNode, posToDOMRect, useEditorState } from "@tiptap/react"; import { useCallback } from "react"; import { Node as PMNode } from "prosemirror-model"; import { @@ -20,17 +20,40 @@ export function DrawioMenu({ editor }: EditorMenuProps) { [editor], ); - const getReferenceClientRect = useCallback(() => { + const editorState = useEditorState({ + editor, + selector: (ctx) => { + if (!ctx.editor) { + return null; + } + + const drawioAttr = ctx.editor.getAttributes("drawio"); + return { + isDrawio: ctx.editor.isActive("drawio"), + width: drawioAttr?.width ? parseInt(drawioAttr.width) : null, + }; + }, + }); + + const getReferencedVirtualElement = useCallback(() => { const { selection } = editor.state; const predicate = (node: PMNode) => node.type.name === "drawio"; const parent = findParentNode(predicate)(selection); if (parent) { const dom = editor.view.nodeDOM(parent?.pos) as HTMLElement; - return dom.getBoundingClientRect(); + const domRect = dom.getBoundingClientRect(); + return { + getBoundingClientRect: () => domRect, + getClientRects: () => [domRect], + }; } - return posToDOMRect(editor.view, selection.from, selection.to); + const domRect = posToDOMRect(editor.view, selection.from, selection.to); + return { + getBoundingClientRect: () => domRect, + getClientRects: () => [domRect], + }; }, [editor]); const onWidthChange = useCallback( @@ -43,24 +66,14 @@ export function DrawioMenu({ editor }: EditorMenuProps) { return (
- {editor.getAttributes("drawio")?.width && ( - + {editorState?.width && ( + )}
diff --git a/apps/client/src/features/editor/components/excalidraw/excalidraw-menu.tsx b/apps/client/src/features/editor/components/excalidraw/excalidraw-menu.tsx index 1717f223..b651f38f 100644 --- a/apps/client/src/features/editor/components/excalidraw/excalidraw-menu.tsx +++ b/apps/client/src/features/editor/components/excalidraw/excalidraw-menu.tsx @@ -1,5 +1,5 @@ import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; -import { findParentNode, posToDOMRect } from "@tiptap/react"; +import { findParentNode, posToDOMRect, useEditorState } from "@tiptap/react"; import { useCallback } from "react"; import { Node as PMNode } from "prosemirror-model"; import { @@ -22,17 +22,40 @@ export function ExcalidrawMenu({ editor }: EditorMenuProps) { [editor], ); - const getReferenceClientRect = useCallback(() => { + const editorState = useEditorState({ + editor, + selector: (ctx) => { + if (!ctx.editor) { + return null; + } + + const excalidrawAttr = ctx.editor.getAttributes("excalidraw"); + return { + isExcalidraw: ctx.editor.isActive("excalidraw"), + width: excalidrawAttr?.width ? parseInt(excalidrawAttr.width) : null, + }; + }, + }); + + const getReferencedVirtualElement = useCallback(() => { const { selection } = editor.state; const predicate = (node: PMNode) => node.type.name === "excalidraw"; const parent = findParentNode(predicate)(selection); if (parent) { const dom = editor.view.nodeDOM(parent?.pos) as HTMLElement; - return dom.getBoundingClientRect(); + const domRect = dom.getBoundingClientRect(); + return { + getBoundingClientRect: () => domRect, + getClientRects: () => [domRect], + }; } - return posToDOMRect(editor.view, selection.from, selection.to); + const domRect = posToDOMRect(editor.view, selection.from, selection.to); + return { + getBoundingClientRect: () => domRect, + getClientRects: () => [domRect], + }; }, [editor]); const onWidthChange = useCallback( @@ -45,27 +68,14 @@ export function ExcalidrawMenu({ editor }: EditorMenuProps) { return (
- {editor.getAttributes("excalidraw")?.width && ( - + {editorState?.width && ( + )}
diff --git a/apps/client/src/features/editor/components/image/image-menu.tsx b/apps/client/src/features/editor/components/image/image-menu.tsx index 6795037c..2c206ae3 100644 --- a/apps/client/src/features/editor/components/image/image-menu.tsx +++ b/apps/client/src/features/editor/components/image/image-menu.tsx @@ -20,7 +20,7 @@ export function ImageMenu({ editor }: EditorMenuProps) { const editorState = useEditorState({ editor, - selector: ctx => { + selector: (ctx) => { if (!ctx.editor) { return null; } @@ -32,7 +32,7 @@ export function ImageMenu({ editor }: EditorMenuProps) { isAlignLeft: ctx.editor.isActive("image", { align: "left" }), isAlignCenter: ctx.editor.isActive("image", { align: "center" }), isAlignRight: ctx.editor.isActive("image", { align: "right" }), - imageWidth: imageAttrs?.width ? parseInt(imageAttrs.width) : null, + width: imageAttrs?.width ? parseInt(imageAttrs.width) : null, }; }, }); @@ -48,17 +48,25 @@ export function ImageMenu({ editor }: EditorMenuProps) { [editor], ); - const getReferenceClientRect = useCallback(() => { + const getReferencedVirtualElement = useCallback(() => { const { selection } = editor.state; const predicate = (node: PMNode) => node.type.name === "image"; const parent = findParentNode(predicate)(selection); if (parent) { const dom = editor.view.nodeDOM(parent?.pos) as HTMLElement; - return dom.getBoundingClientRect(); + const domRect = dom.getBoundingClientRect(); + return { + getBoundingClientRect: () => domRect, + getClientRects: () => [domRect], + }; } - return posToDOMRect(editor.view, selection.from, selection.to); + const domRect = posToDOMRect(editor.view, selection.from, selection.to); + return { + getBoundingClientRect: () => domRect, + getClientRects: () => [domRect], + }; }, [editor]); const alignImageLeft = useCallback(() => { @@ -99,25 +107,14 @@ export function ImageMenu({ editor }: EditorMenuProps) { return ( @@ -126,9 +123,7 @@ export function ImageMenu({ editor }: EditorMenuProps) { onClick={alignImageLeft} size="lg" aria-label={t("Align left")} - variant={ - editorState?.isAlignLeft ? "light" : "default" - } + variant={editorState?.isAlignLeft ? "light" : "default"} > @@ -139,9 +134,7 @@ export function ImageMenu({ editor }: EditorMenuProps) { onClick={alignImageCenter} size="lg" aria-label={t("Align center")} - variant={ - editorState?.isAlignCenter ? "light" : "default" - } + variant={editorState?.isAlignCenter ? "light" : "default"} > @@ -152,20 +145,15 @@ export function ImageMenu({ editor }: EditorMenuProps) { onClick={alignImageRight} size="lg" aria-label={t("Align right")} - variant={ - editorState?.isAlignRight ? "light" : "default" - } + variant={editorState?.isAlignRight ? "light" : "default"} > - {editorState?.imageWidth && ( - + {editorState?.width && ( + )} ); diff --git a/apps/client/src/features/editor/components/table/table-cell-menu.tsx b/apps/client/src/features/editor/components/table/table-cell-menu.tsx index c50ad2b3..4f56c764 100644 --- a/apps/client/src/features/editor/components/table/table-cell-menu.tsx +++ b/apps/client/src/features/editor/components/table/table-cell-menu.tsx @@ -1,11 +1,9 @@ -import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; import React, { useCallback } from "react"; - import { EditorMenuProps, ShouldShowProps, } from "@/features/editor/components/table/types/types.ts"; -import { isCellSelection } from "@docmost/editor-ext"; +import { isCellSelection, TiptapTippyBubbleMenu } from '@docmost/editor-ext'; import { ActionIcon, Tooltip } from "@mantine/core"; import { IconBoxMargin, @@ -53,19 +51,17 @@ export const TableCellMenu = React.memo( }, [editor]); return ( - { - // return appendTo?.current; - // }, - placement: "bottom", - offset: 15, - //zIndex: 99, + tippyOptions={{ + appendTo: () => { + return appendTo?.current; + }, + offset: [0, 15], + zIndex: 99, }} - shouldShow={shouldShow} > @@ -127,7 +123,7 @@ export const TableCellMenu = React.memo( - + ); }, ); diff --git a/apps/client/src/features/editor/components/table/table-menu.tsx b/apps/client/src/features/editor/components/table/table-menu.tsx index 643f67d1..2cfe63c9 100644 --- a/apps/client/src/features/editor/components/table/table-menu.tsx +++ b/apps/client/src/features/editor/components/table/table-menu.tsx @@ -1,8 +1,6 @@ -import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; import { posToDOMRect, findParentNode } from "@tiptap/react"; import { Node as PMNode } from "@tiptap/pm/model"; import React, { useCallback } from "react"; - import { EditorMenuProps, ShouldShowProps, @@ -19,7 +17,7 @@ import { IconTableRow, IconTrashX, } from "@tabler/icons-react"; -import { isCellSelection } from "@docmost/editor-ext"; +import { isCellSelection, TiptapTippyBubbleMenu } from "@docmost/editor-ext"; import { useTranslation } from "react-i18next"; export const TableMenu = React.memo( @@ -86,42 +84,37 @@ export const TableMenu = React.memo( }, [editor]); return ( - @@ -225,7 +218,7 @@ export const TableMenu = React.memo( - + ); }, ); diff --git a/apps/client/src/features/editor/components/video/video-menu.tsx b/apps/client/src/features/editor/components/video/video-menu.tsx index c58de114..5bad1ed9 100644 --- a/apps/client/src/features/editor/components/video/video-menu.tsx +++ b/apps/client/src/features/editor/components/video/video-menu.tsx @@ -17,26 +17,26 @@ import { useTranslation } from "react-i18next"; export function VideoMenu({ editor }: EditorMenuProps) { const { t } = useTranslation(); - + const editorState = useEditorState({ editor, selector: ctx => { if (!ctx.editor) { return null; } - + const videoAttrs = ctx.editor.getAttributes("video"); - + return { isVideo: ctx.editor.isActive("video"), isAlignLeft: ctx.editor.isActive("video", { align: "left" }), isAlignCenter: ctx.editor.isActive("video", { align: "center" }), isAlignRight: ctx.editor.isActive("video", { align: "right" }), - videoWidth: videoAttrs?.width ? parseInt(videoAttrs.width) : null, + width: videoAttrs?.width ? parseInt(videoAttrs.width) : null, }; }, }); - + const shouldShow = useCallback( ({ state }: ShouldShowProps) => { if (!state) { @@ -48,17 +48,25 @@ export function VideoMenu({ editor }: EditorMenuProps) { [editor], ); - const getReferenceClientRect = useCallback(() => { + const getReferencedVirtualElement = useCallback(() => { const { selection } = editor.state; const predicate = (node: PMNode) => node.type.name === "video"; const parent = findParentNode(predicate)(selection); if (parent) { const dom = editor.view.nodeDOM(parent?.pos) as HTMLElement; - return dom.getBoundingClientRect(); + const domRect = dom.getBoundingClientRect(); + return { + getBoundingClientRect: () => domRect, + getClientRects: () => [domRect], + }; } - return posToDOMRect(editor.view, selection.from, selection.to); + const domRect = posToDOMRect(editor.view, selection.from, selection.to); + return { + getBoundingClientRect: () => domRect, + getClientRects: () => [domRect], + }; }, [editor]); const alignVideoLeft = useCallback(() => { @@ -99,13 +107,12 @@ export function VideoMenu({ editor }: EditorMenuProps) { return (
- {editorState?.videoWidth && ( + {editorState?.width && ( )} diff --git a/apps/client/src/features/editor/extensions/extensions.ts b/apps/client/src/features/editor/extensions/extensions.ts index 49e0df0b..ecba77e9 100644 --- a/apps/client/src/features/editor/extensions/extensions.ts +++ b/apps/client/src/features/editor/extensions/extensions.ts @@ -197,6 +197,7 @@ export const mainExtensions = [ }), CustomCodeBlock.configure({ view: CodeBlockView, + //@ts-ignore lowlight, HTMLAttributes: { spellcheck: false, diff --git a/packages/editor-ext/src/index.ts b/packages/editor-ext/src/index.ts index a0efaa1b..2ace4511 100644 --- a/packages/editor-ext/src/index.ts +++ b/packages/editor-ext/src/index.ts @@ -20,3 +20,4 @@ export * from "./lib/markdown"; export * from "./lib/search-and-replace"; export * from "./lib/embed-provider"; export * from "./lib/subpages"; +export * from "./lib/tippy-bubble-menu"; diff --git a/packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-plugin.ts b/packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-plugin.ts new file mode 100644 index 00000000..f9d6d092 --- /dev/null +++ b/packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-plugin.ts @@ -0,0 +1,349 @@ +// Source: https://github.com/ueberdosis/tiptap/blob/v2/packages/extension-bubble-menu/src/bubble-menu-plugin.ts - MIT +import { + Editor, + isNodeSelection, + isTextSelection, + posToDOMRect, +} from "@tiptap/core"; +import { EditorState, Plugin, PluginKey } from "@tiptap/pm/state"; +import { EditorView } from "@tiptap/pm/view"; +import tippy, { Instance, Props } from "tippy.js"; + +export interface BubbleMenuPluginProps { + /** + * The plugin key. + * @type {PluginKey | string} + * @default 'bubbleMenu' + */ + pluginKey: PluginKey | string; + + /** + * The editor instance. + */ + editor: Editor; + + /** + * The DOM element that contains your menu. + * @type {HTMLElement} + * @default null + */ + element: HTMLElement; + + /** + * The options for the tippy.js instance. + * @see https://atomiks.github.io/tippyjs/v6/all-props/ + */ + tippyOptions?: Partial; + + /** + * The delay in milliseconds before the menu should be updated. + * This can be useful to prevent performance issues. + * @type {number} + * @default 250 + */ + updateDelay?: number; + + /** + * A function that determines whether the menu should be shown or not. + * If this function returns `false`, the menu will be hidden, otherwise it will be shown. + */ + shouldShow?: + | ((props: { + editor: Editor; + element: HTMLElement; + view: EditorView; + state: EditorState; + oldState?: EditorState; + from: number; + to: number; + }) => boolean) + | null; +} + +export type BubbleMenuViewProps = BubbleMenuPluginProps & { + view: EditorView; +}; + +export class BubbleMenuView { + public editor: Editor; + + public element: HTMLElement; + + public view: EditorView; + + public preventHide = false; + + public tippy: Instance | undefined; + + public tippyOptions?: Partial; + + public updateDelay: number; + + private updateDebounceTimer: number | undefined; + + public shouldShow: Exclude = ({ + view, + state, + from, + to, + }) => { + const { doc, selection } = state; + const { empty } = selection; + + // Sometime check for `empty` is not enough. + // Doubleclick an empty paragraph returns a node size of 2. + // So we check also for an empty text size. + const isEmptyTextBlock = + !doc.textBetween(from, to).length && isTextSelection(state.selection); + + // When clicking on a element inside the bubble menu the editor "blur" event + // is called and the bubble menu item is focussed. In this case we should + // consider the menu as part of the editor and keep showing the menu + const isChildOfMenu = this.element.contains(document.activeElement); + + const hasEditorFocus = view.hasFocus() || isChildOfMenu; + + if ( + !hasEditorFocus || + empty || + isEmptyTextBlock || + !this.editor.isEditable + ) { + return false; + } + + return true; + }; + + constructor({ + editor, + element, + view, + tippyOptions = {}, + updateDelay = 250, + shouldShow, + }: BubbleMenuViewProps) { + this.editor = editor; + this.element = element; + this.view = view; + this.updateDelay = updateDelay; + + if (shouldShow) { + this.shouldShow = shouldShow; + } + + this.element.addEventListener("mousedown", this.mousedownHandler, { + capture: true, + }); + this.view.dom.addEventListener("dragstart", this.dragstartHandler); + this.editor.on("focus", this.focusHandler); + this.editor.on("blur", this.blurHandler); + this.tippyOptions = tippyOptions; + // Detaches menu content from its current parent + this.element.remove(); + this.element.style.visibility = "visible"; + } + + mousedownHandler = () => { + this.preventHide = true; + }; + + dragstartHandler = () => { + this.hide(); + }; + + focusHandler = () => { + // we use `setTimeout` to make sure `selection` is already updated + setTimeout(() => this.update(this.editor.view)); + }; + + blurHandler = ({ event }: { event: FocusEvent }) => { + if (this.preventHide) { + this.preventHide = false; + + return; + } + + if ( + event?.relatedTarget && + this.element.parentNode?.contains(event.relatedTarget as Node) + ) { + return; + } + + if (event?.relatedTarget === this.editor.view.dom) { + return; + } + + this.hide(); + }; + + tippyBlurHandler = (event: FocusEvent) => { + this.blurHandler({ event }); + }; + + createTooltip() { + const { element: editorElement } = this.editor.options; + //@ts-ignore + const editorIsAttached = !!editorElement.parentElement; + + this.element.tabIndex = 0; + + if (this.tippy || !editorIsAttached) { + return; + } + + //@ts-ignore + this.tippy = tippy(editorElement, { + duration: 0, + getReferenceClientRect: null, + content: this.element, + interactive: true, + trigger: "manual", + placement: "top", + hideOnClick: "toggle", + ...this.tippyOptions, + }); + + // maybe we have to hide tippy on its own blur event as well + if (this.tippy.popper.firstChild) { + (this.tippy.popper.firstChild as HTMLElement).addEventListener( + "blur", + this.tippyBlurHandler, + ); + } + } + + update(view: EditorView, oldState?: EditorState) { + const { state } = view; + const hasValidSelection = state.selection.from !== state.selection.to; + + if (this.updateDelay > 0 && hasValidSelection) { + this.handleDebouncedUpdate(view, oldState); + return; + } + + const selectionChanged = !oldState?.selection.eq(view.state.selection); + const docChanged = !oldState?.doc.eq(view.state.doc); + + this.updateHandler(view, selectionChanged, docChanged, oldState); + } + + handleDebouncedUpdate = (view: EditorView, oldState?: EditorState) => { + const selectionChanged = !oldState?.selection.eq(view.state.selection); + const docChanged = !oldState?.doc.eq(view.state.doc); + + if (!selectionChanged && !docChanged) { + return; + } + + if (this.updateDebounceTimer) { + clearTimeout(this.updateDebounceTimer); + } + + this.updateDebounceTimer = window.setTimeout(() => { + this.updateHandler(view, selectionChanged, docChanged, oldState); + }, this.updateDelay); + }; + + updateHandler = ( + view: EditorView, + selectionChanged: boolean, + docChanged: boolean, + oldState?: EditorState, + ) => { + const { state, composing } = view; + const { selection } = state; + + const isSame = !selectionChanged && !docChanged; + + if (composing || isSame) { + return; + } + + this.createTooltip(); + + // support for CellSelections + const { ranges } = selection; + const from = Math.min(...ranges.map((range) => range.$from.pos)); + const to = Math.max(...ranges.map((range) => range.$to.pos)); + + const shouldShow = this.shouldShow?.({ + editor: this.editor, + element: this.element, + view, + state, + oldState, + from, + to, + }); + + if (!shouldShow) { + this.hide(); + + return; + } + + this.tippy?.setProps({ + getReferenceClientRect: + this.tippyOptions?.getReferenceClientRect || + (() => { + if (isNodeSelection(state.selection)) { + let node = view.nodeDOM(from) as HTMLElement; + + if (node) { + const nodeViewWrapper = node.dataset.nodeViewWrapper + ? node + : node.querySelector("[data-node-view-wrapper]"); + + if (nodeViewWrapper) { + node = nodeViewWrapper.firstChild as HTMLElement; + } + + if (node) { + return node.getBoundingClientRect(); + } + } + } + + return posToDOMRect(view, from, to); + }), + }); + + this.show(); + }; + + show() { + this.tippy?.show(); + } + + hide() { + this.tippy?.hide(); + } + + destroy() { + if (this.tippy?.popper.firstChild) { + (this.tippy.popper.firstChild as HTMLElement).removeEventListener( + "blur", + this.tippyBlurHandler, + ); + } + this.tippy?.destroy(); + this.element.removeEventListener("mousedown", this.mousedownHandler, { + capture: true, + }); + this.view.dom.removeEventListener("dragstart", this.dragstartHandler); + this.editor.off("focus", this.focusHandler); + this.editor.off("blur", this.blurHandler); + } +} + +export const BubbleMenuPlugin = (options: BubbleMenuPluginProps) => { + return new Plugin({ + key: + typeof options.pluginKey === "string" + ? new PluginKey(options.pluginKey) + : options.pluginKey, + view: (view) => new BubbleMenuView({ view, ...options }), + }); +}; diff --git a/packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-react.tsx b/packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-react.tsx new file mode 100644 index 00000000..d2f7b008 --- /dev/null +++ b/packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-react.tsx @@ -0,0 +1,72 @@ +// Source: https://github.com/ueberdosis/tiptap/blob/v2/packages/react/src/BubbleMenu.tsx - MIT +import { BubbleMenuPlugin, BubbleMenuPluginProps } from "./bubble-menu-plugin"; +import React, { useEffect, useState } from "react"; +import { useCurrentEditor } from "@tiptap/react"; + +type Optional = Pick, K> & Omit; + +export type BubbleMenuProps = Omit< + Optional, + "element" | "editor" +> & { + editor: BubbleMenuPluginProps["editor"] | null; + className?: string; + children: React.ReactNode; + updateDelay?: number; +}; + +export const BubbleMenu = (props: BubbleMenuProps) => { + const [element, setElement] = useState(null); + const { editor: currentEditor } = useCurrentEditor(); + + useEffect(() => { + if (!element) { + return; + } + + if (props.editor?.isDestroyed || currentEditor?.isDestroyed) { + return; + } + + const { + pluginKey = "bubbleMenu", + editor, + tippyOptions = {}, + updateDelay, + shouldShow = null, + } = props; + + const menuEditor = editor || currentEditor; + + if (!menuEditor) { + console.warn( + "BubbleMenu component is not rendered inside of an editor component or does not have editor prop.", + ); + return; + } + + const plugin = BubbleMenuPlugin({ + updateDelay, + editor: menuEditor, + element, + pluginKey, + shouldShow, + tippyOptions, + }); + + menuEditor.registerPlugin(plugin); + return () => { + menuEditor.unregisterPlugin(pluginKey); + }; + }, [props.editor, currentEditor, element]); + + return ( +
+ {props.children} +
+ ); +}; diff --git a/packages/editor-ext/src/lib/tippy-bubble-menu/index.ts b/packages/editor-ext/src/lib/tippy-bubble-menu/index.ts new file mode 100644 index 00000000..b385802d --- /dev/null +++ b/packages/editor-ext/src/lib/tippy-bubble-menu/index.ts @@ -0,0 +1 @@ +export { BubbleMenu as TiptapTippyBubbleMenu } from "./bubble-menu-react"; diff --git a/packages/editor-ext/tsconfig.json b/packages/editor-ext/tsconfig.json index efbfcd61..974fea06 100644 --- a/packages/editor-ext/tsconfig.json +++ b/packages/editor-ext/tsconfig.json @@ -8,6 +8,7 @@ "experimentalDecorators": true, "allowSyntheticDefaultImports": true, "target": "ES2022", + "jsx": "react-jsx", "sourceMap": true, "outDir": "./dist", "baseUrl": "./", From 3af1482a31c1554965b7779e038e871be1e0fa53 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sat, 27 Sep 2025 21:10:40 +0100 Subject: [PATCH 13/21] fix converter --- apps/server/package.json | 2 +- .../src/collaboration/collaboration.util.ts | 3 +- .../helpers/prosemirror/html/generateHTML.ts | 38 ++++++++----- .../helpers/prosemirror/html/generateJSON.ts | 56 +++++++++++++++---- .../prosemirror/html/getHTMLFromFragment.ts | 43 ++++++++++++++ pnpm-lock.yaml | 39 +++++++++---- 6 files changed, 142 insertions(+), 39 deletions(-) create mode 100644 apps/server/src/common/helpers/prosemirror/html/getHTMLFromFragment.ts diff --git a/apps/server/package.json b/apps/server/package.json index 71865a07..0c5ea90e 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -62,7 +62,7 @@ "class-validator": "^0.14.1", "cookie": "^1.0.2", "fs-extra": "^11.3.0", - "happy-dom": "^15.11.6", + "happy-dom": "^18.0.1", "jsonwebtoken": "^9.0.2", "kysely": "^0.28.2", "kysely-migration-cli": "^0.4.2", diff --git a/apps/server/src/collaboration/collaboration.util.ts b/apps/server/src/collaboration/collaboration.util.ts index 73afd7a5..387a4350 100644 --- a/apps/server/src/collaboration/collaboration.util.ts +++ b/apps/server/src/collaboration/collaboration.util.ts @@ -34,10 +34,11 @@ import { } from '@docmost/editor-ext'; import { generateText, getSchema, JSONContent } from '@tiptap/core'; import { generateHTML } from '../common/helpers/prosemirror/html'; +import { generateJSON } from '../common/helpers/prosemirror/html'; // @tiptap/html library works best for generating prosemirror json state but not HTML // see: https://github.com/ueberdosis/tiptap/issues/5352 // see:https://github.com/ueberdosis/tiptap/issues/4089 -import { generateJSON } from '@tiptap/html'; +//import { generateJSON } from '@tiptap/html'; import { Node } from '@tiptap/pm/model'; export const tiptapExtensions = [ diff --git a/apps/server/src/common/helpers/prosemirror/html/generateHTML.ts b/apps/server/src/common/helpers/prosemirror/html/generateHTML.ts index 3622ed4c..52196aa2 100644 --- a/apps/server/src/common/helpers/prosemirror/html/generateHTML.ts +++ b/apps/server/src/common/helpers/prosemirror/html/generateHTML.ts @@ -1,21 +1,29 @@ -import { Extensions, getSchema, JSONContent } from '@tiptap/core'; -import { DOMSerializer, Node } from '@tiptap/pm/model'; -import { Window } from 'happy-dom'; +import { type Extensions, type JSONContent, getSchema } from '@tiptap/core'; +import { Node } from '@tiptap/pm/model'; +import { getHTMLFromFragment } from './getHTMLFromFragment'; +/** + * This function generates HTML from a ProseMirror JSON content object. + * + * @remarks **Important**: This function requires `happy-dom` to be installed in your project. + * @param doc - The ProseMirror JSON content object. + * @param extensions - The Tiptap extensions used to build the schema. + * @returns The generated HTML string. + * @example + * ```js + * const html = generateHTML(doc, extensions) + * console.log(html) + * ``` + */ export function generateHTML(doc: JSONContent, extensions: Extensions): string { + if (typeof window !== 'undefined') { + throw new Error( + 'generateHTML can only be used in a Node environment\nIf you want to use this in a browser environment, use the `@tiptap/html` import instead.', + ); + } + const schema = getSchema(extensions); const contentNode = Node.fromJSON(schema, doc); - const window = new Window(); - - const fragment = DOMSerializer.fromSchema(schema).serializeFragment( - contentNode.content, - { - document: window.document as unknown as Document, - }, - ); - - const serializer = new window.XMLSerializer(); - // @ts-ignore - return serializer.serializeToString(fragment as unknown as Node); + return getHTMLFromFragment(contentNode, schema); } diff --git a/apps/server/src/common/helpers/prosemirror/html/generateJSON.ts b/apps/server/src/common/helpers/prosemirror/html/generateJSON.ts index 23d66119..bd6e735c 100644 --- a/apps/server/src/common/helpers/prosemirror/html/generateJSON.ts +++ b/apps/server/src/common/helpers/prosemirror/html/generateJSON.ts @@ -1,21 +1,55 @@ -import { Extensions, getSchema } from '@tiptap/core'; -import { DOMParser, ParseOptions } from '@tiptap/pm/model'; +import type { Extensions } from '@tiptap/core'; +import { getSchema } from '@tiptap/core'; +import { type ParseOptions, DOMParser as PMDOMParser } from '@tiptap/pm/model'; import { Window } from 'happy-dom'; -// this function does not work as intended -// it has issues with closing tags +/** + * Generates a JSON object from the given HTML string and converts it into a Prosemirror node with content. + * @remarks **Important**: This function requires `happy-dom` to be installed in your project. + * @param {string} html - The HTML string to be converted into a Prosemirror node. + * @param {Extensions} extensions - The extensions to be used for generating the schema. + * @param {ParseOptions} options - The options to be supplied to the parser. + * @returns {Promise>} - A promise with the generated JSON object. + * @example + * const html = '

Hello, world!

' + * const extensions = [...] + * const json = generateJSON(html, extensions) + * console.log(json) // { type: 'doc', content: [{ type: 'paragraph', content: [{ type: 'text', text: 'Hello, world!' }] }] } + */ export function generateJSON( html: string, extensions: Extensions, options?: ParseOptions, ): Record { - const schema = getSchema(extensions); + if (typeof window !== 'undefined') { + throw new Error( + 'generateJSON can only be used in a Node environment\nIf you want to use this in a browser environment, use the `@tiptap/html` import instead.', + ); + } - const window = new Window(); - const document = window.document; - document.body.innerHTML = html; + const localWindow = new Window(); + const localDOMParser = new localWindow.DOMParser(); + let result: Record; - return DOMParser.fromSchema(schema) - .parse(document as never, options) - .toJSON(); + try { + const schema = getSchema(extensions); + let doc: ReturnType | null = null; + + const htmlString = `${html}`; + doc = localDOMParser.parseFromString(htmlString, 'text/html'); + + if (!doc) { + throw new Error('Failed to parse HTML string'); + } + + result = PMDOMParser.fromSchema(schema) + .parse(doc.body as unknown as Node, options) + .toJSON(); + } finally { + // clean up happy-dom to avoid memory leaks + localWindow.happyDOM.abort(); + localWindow.happyDOM.close(); + } + + return result; } diff --git a/apps/server/src/common/helpers/prosemirror/html/getHTMLFromFragment.ts b/apps/server/src/common/helpers/prosemirror/html/getHTMLFromFragment.ts new file mode 100644 index 00000000..8398b689 --- /dev/null +++ b/apps/server/src/common/helpers/prosemirror/html/getHTMLFromFragment.ts @@ -0,0 +1,43 @@ +import type { Node, Schema } from '@tiptap/pm/model' +import { DOMSerializer } from '@tiptap/pm/model'; +import { Window } from 'happy-dom' + +/** + * Returns the HTML string representation of a given document node. + * + * @remarks **Important**: This function requires `happy-dom` to be installed in your project. + * @param doc - The document node to serialize. + * @param schema - The Prosemirror schema to use for serialization. + * @returns A promise containing the HTML string representation of the document fragment. + * + * @example + * ```typescript + * const html = getHTMLFromFragment(doc, schema) + * ``` + */ +export function getHTMLFromFragment(doc: Node, schema: Schema, options?: { document?: Document }): string { + if (options?.document) { + const wrap = options.document.createElement('div') + + DOMSerializer.fromSchema(schema).serializeFragment(doc.content, { document: options.document }, wrap) + return wrap.innerHTML + } + + const localWindow = new Window() + let result: string + + try { + const fragment = DOMSerializer.fromSchema(schema).serializeFragment(doc.content, { + document: localWindow.document as unknown as Document, + }) + + const serializer = new localWindow.XMLSerializer() + result = serializer.serializeToString(fragment as any) + } finally { + // clean up happy-dom to avoid memory leaks + localWindow.happyDOM.abort() + localWindow.happyDOM.close() + } + + return result +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 93c56e17..08ba0316 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -117,7 +117,7 @@ importers: version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1)) '@tiptap/html': specifier: ^3.6.1 - version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(happy-dom@15.11.7) + version: 3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(happy-dom@18.0.1) '@tiptap/pm': specifier: ^3.6.1 version: 3.6.1 @@ -508,8 +508,8 @@ importers: specifier: ^11.3.0 version: 11.3.0 happy-dom: - specifier: ^15.11.6 - version: 15.11.7 + specifier: ^18.0.1 + version: 18.0.1 jsonwebtoken: specifier: ^9.0.2 version: 9.0.2 @@ -4531,6 +4531,9 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@20.19.17': + resolution: {integrity: sha512-gfehUI8N1z92kygssiuWvLiwcbOB3IRktR6hTDgJlXMYh5OvkPSRmgfoBUmfZt+vhwJtX7v1Yw4KvvAf7c5QKQ==} + '@types/node@22.10.0': resolution: {integrity: sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==} @@ -4621,6 +4624,9 @@ packages: '@types/validator@13.12.0': resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@types/ws@8.5.14': resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==} @@ -6510,9 +6516,9 @@ packages: hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} - happy-dom@15.11.7: - resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} - engines: {node: '>=18.0.0'} + happy-dom@18.0.1: + resolution: {integrity: sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==} + engines: {node: '>=20.0.0'} has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -9441,6 +9447,9 @@ packages: undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici@7.10.0: resolution: {integrity: sha512-u5otvFBOBZvmdjWLVW+5DAc9Nkq8f24g0O9oY7qw2JVIF1VocIFoyz9JFkuVOS2j41AufeO0xnlweJ2RLT8nGw==} engines: {node: '>=20.18.1'} @@ -14234,11 +14243,11 @@ snapshots: '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) '@tiptap/pm': 3.6.1 - '@tiptap/html@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(happy-dom@15.11.7)': + '@tiptap/html@3.6.1(@tiptap/core@3.6.1(@tiptap/pm@3.6.1))(@tiptap/pm@3.6.1)(happy-dom@18.0.1)': dependencies: '@tiptap/core': 3.6.1(@tiptap/pm@3.6.1) '@tiptap/pm': 3.6.1 - happy-dom: 15.11.7 + happy-dom: 18.0.1 '@tiptap/pm@3.6.1': dependencies: @@ -14626,6 +14635,10 @@ snapshots: '@types/ms@2.1.0': {} + '@types/node@20.19.17': + dependencies: + undici-types: 6.21.0 + '@types/node@22.10.0': dependencies: undici-types: 6.20.0 @@ -14738,6 +14751,8 @@ snapshots: '@types/validator@13.12.0': {} + '@types/whatwg-mimetype@3.0.2': {} + '@types/ws@8.5.14': dependencies: '@types/node': 22.13.4 @@ -17039,10 +17054,10 @@ snapshots: hachure-fill@0.5.2: {} - happy-dom@15.11.7: + happy-dom@18.0.1: dependencies: - entities: 4.5.0 - webidl-conversions: 7.0.0 + '@types/node': 20.19.17 + '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 has-bigints@1.0.2: {} @@ -20458,6 +20473,8 @@ snapshots: undici-types@6.20.0: {} + undici-types@6.21.0: {} + undici@7.10.0: {} unicode-canonical-property-names-ecmascript@2.0.0: {} From 1cbd2854bb4f8c18a49dff3e793235c61db542b7 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sun, 28 Sep 2025 20:51:57 +0100 Subject: [PATCH 14/21] fix menus --- .../components/callout/callout-menu.tsx | 6 ++--- .../editor/components/drawio/drawio-menu.tsx | 1 + .../components/excalidraw/excalidraw-menu.tsx | 1 + .../editor/components/image/image-menu.tsx | 1 + .../editor/components/link/link-menu.tsx | 27 ++++++++++++++----- .../editor/components/link/link-preview.tsx | 1 + .../components/subpages/subpages-menu.tsx | 2 +- .../editor/components/video/video-menu.tsx | 1 + apps/server/src/ee | 2 +- 9 files changed, 30 insertions(+), 12 deletions(-) diff --git a/apps/client/src/features/editor/components/callout/callout-menu.tsx b/apps/client/src/features/editor/components/callout/callout-menu.tsx index 9c9c1c98..e1bd6069 100644 --- a/apps/client/src/features/editor/components/callout/callout-menu.tsx +++ b/apps/client/src/features/editor/components/callout/callout-menu.tsx @@ -50,6 +50,7 @@ export function CalloutMenu({ editor }: EditorMenuProps) { ); const getReferencedVirtualElement = useCallback(() => { + if (!editor) return; const { selection } = editor.state; const predicate = (node: PMNode) => node.type.name === "callout"; const parent = findParentNode(predicate)(selection); @@ -63,9 +64,6 @@ export function CalloutMenu({ editor }: EditorMenuProps) { }; } - console.log('callout') - - const domRect = posToDOMRect(editor.view, selection.from, selection.to); return { getBoundingClientRect: () => domRect, @@ -117,7 +115,7 @@ export function CalloutMenu({ editor }: EditorMenuProps) { return ( { + if (!editor) return; const { selection } = editor.state; const predicate = (node: PMNode) => node.type.name === "drawio"; const parent = findParentNode(predicate)(selection); diff --git a/apps/client/src/features/editor/components/excalidraw/excalidraw-menu.tsx b/apps/client/src/features/editor/components/excalidraw/excalidraw-menu.tsx index b651f38f..06e79515 100644 --- a/apps/client/src/features/editor/components/excalidraw/excalidraw-menu.tsx +++ b/apps/client/src/features/editor/components/excalidraw/excalidraw-menu.tsx @@ -38,6 +38,7 @@ export function ExcalidrawMenu({ editor }: EditorMenuProps) { }); const getReferencedVirtualElement = useCallback(() => { + if (!editor) return; const { selection } = editor.state; const predicate = (node: PMNode) => node.type.name === "excalidraw"; const parent = findParentNode(predicate)(selection); diff --git a/apps/client/src/features/editor/components/image/image-menu.tsx b/apps/client/src/features/editor/components/image/image-menu.tsx index 2c206ae3..6f2c9b9c 100644 --- a/apps/client/src/features/editor/components/image/image-menu.tsx +++ b/apps/client/src/features/editor/components/image/image-menu.tsx @@ -49,6 +49,7 @@ export function ImageMenu({ editor }: EditorMenuProps) { ); const getReferencedVirtualElement = useCallback(() => { + if (!editor) return; const { selection } = editor.state; const predicate = (node: PMNode) => node.type.name === "image"; const parent = findParentNode(predicate)(selection); diff --git a/apps/client/src/features/editor/components/link/link-menu.tsx b/apps/client/src/features/editor/components/link/link-menu.tsx index 041e5c3d..a5205a04 100644 --- a/apps/client/src/features/editor/components/link/link-menu.tsx +++ b/apps/client/src/features/editor/components/link/link-menu.tsx @@ -1,10 +1,10 @@ import { BubbleMenu as BaseBubbleMenu } from "@tiptap/react/menus"; -import { offset } from "@floating-ui/dom"; import React, { useCallback, useState } from "react"; import { EditorMenuProps } from "@/features/editor/components/table/types/types.ts"; import { LinkEditorPanel } from "@/features/editor/components/link/link-editor-panel.tsx"; import { LinkPreviewPanel } from "@/features/editor/components/link/link-preview.tsx"; import { Card } from "@mantine/core"; +import { useEditorState } from "@tiptap/react"; export function LinkMenu({ editor, appendTo }: EditorMenuProps) { const [showEdit, setShowEdit] = useState(false); @@ -13,7 +13,19 @@ export function LinkMenu({ editor, appendTo }: EditorMenuProps) { return editor.isActive("link"); }, [editor]); - const { href: link } = editor.getAttributes("link"); + const editorState = useEditorState({ + editor, + selector: (ctx) => { + if (!ctx.editor) { + return null; + } + + const link = ctx.editor.getAttributes("link"); + return { + href: link.href, + }; + }, + }); const handleEdit = useCallback(() => { setShowEdit(true); @@ -49,7 +61,7 @@ export function LinkMenu({ editor, appendTo }: EditorMenuProps) { return ( { @@ -57,7 +69,7 @@ export function LinkMenu({ editor, appendTo }: EditorMenuProps) { }, placement: "bottom", offset: 5, - // zIndex: 101, + // zIndex: 101, }} shouldShow={shouldShow} > @@ -68,11 +80,14 @@ export function LinkMenu({ editor, appendTo }: EditorMenuProps) { padding="xs" bg="var(--mantine-color-body)" > - + ) : ( diff --git a/apps/client/src/features/editor/components/link/link-preview.tsx b/apps/client/src/features/editor/components/link/link-preview.tsx index 8b0de952..2a7b42a0 100644 --- a/apps/client/src/features/editor/components/link/link-preview.tsx +++ b/apps/client/src/features/editor/components/link/link-preview.tsx @@ -34,6 +34,7 @@ export const LinkPreviewPanel = ({ rel="noopener noreferrer" className={classes.link} > + ss {url} diff --git a/apps/client/src/features/editor/components/subpages/subpages-menu.tsx b/apps/client/src/features/editor/components/subpages/subpages-menu.tsx index 2341d4be..eb9bfd9d 100644 --- a/apps/client/src/features/editor/components/subpages/subpages-menu.tsx +++ b/apps/client/src/features/editor/components/subpages/subpages-menu.tsx @@ -58,7 +58,7 @@ export const SubpagesMenu = React.memo( return ( { + if (!editor) return; const { selection } = editor.state; const predicate = (node: PMNode) => node.type.name === "video"; const parent = findParentNode(predicate)(selection); diff --git a/apps/server/src/ee b/apps/server/src/ee index 3af21def..d2ead431 160000 --- a/apps/server/src/ee +++ b/apps/server/src/ee @@ -1 +1 @@ -Subproject commit 3af21def15eb7ea7eb400086eeaf97991938a5fd +Subproject commit d2ead431819025e735e8b8e63d6d898d76c417e6 From 5fc04aa7df9098f7b11763a396aae8a8708b5b97 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Sat, 13 Dec 2025 01:05:34 +0000 Subject: [PATCH 15/21] fix collaboration caret css --- apps/client/src/features/editor/styles/collaboration.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/client/src/features/editor/styles/collaboration.css b/apps/client/src/features/editor/styles/collaboration.css index 4a43ac25..a13d2180 100644 --- a/apps/client/src/features/editor/styles/collaboration.css +++ b/apps/client/src/features/editor/styles/collaboration.css @@ -1,5 +1,5 @@ /* Give a remote user a caret */ -.collaboration-cursor__caret { +.collaboration-carets__caret { border-left: 1px solid #0d0d0d; border-right: 1px solid #0d0d0d; margin-left: -1px; @@ -10,7 +10,7 @@ } /* Render the username above the caret */ -.collaboration-cursor__label { +.collaboration-carets__label { border-radius: 3px 3px 3px 0; color: #0d0d0d; font-size: 0.75rem; From 601ed88931eb7933e807c32db608fe0451f13d57 Mon Sep 17 00:00:00 2001 From: Arek Nawo Date: Thu, 8 Jan 2026 22:51:28 +0100 Subject: [PATCH 16/21] fix: Set `isInitialized` to force immediate react node view rendering --- apps/client/package.json | 2 +- .../features/editor/extensions/extensions.ts | 3 + package.json | 66 +- .../src/lib/attachment/attachment.ts | 5 +- .../editor-ext/src/lib/callout/callout.ts | 7 +- .../custom-code-block/custom-code-block.ts | 22 +- packages/editor-ext/src/lib/drawio.ts | 46 +- packages/editor-ext/src/lib/embed.ts | 49 +- packages/editor-ext/src/lib/excalidraw.ts | 58 +- packages/editor-ext/src/lib/image/image.ts | 5 +- .../editor-ext/src/lib/math/math-block.ts | 3 + .../editor-ext/src/lib/math/math-inline.ts | 3 + .../editor-ext/src/lib/subpages/subpages.ts | 5 +- packages/editor-ext/src/lib/video/video.ts | 9 +- pnpm-lock.yaml | 833 +++++++++--------- 15 files changed, 562 insertions(+), 554 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index db92ac24..02c80183 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -16,6 +16,7 @@ "@emoji-mart/data": "^1.2.1", "@emoji-mart/react": "^1.1.1", "@excalidraw/excalidraw": "0.18.0-864353b", + "@floating-ui/dom": "^1.7.3", "@mantine/core": "^8.1.3", "@mantine/dates": "^8.3.2", "@mantine/form": "^8.1.3", @@ -25,7 +26,6 @@ "@mantine/spotlight": "^8.1.3", "@tabler/icons-react": "^3.34.0", "@tanstack/react-query": "^5.80.6", - "@tiptap/extension-character-count": "^2.10.3", "alfaaz": "^1.1.0", "axios": "^1.13.2", "clsx": "^2.1.1", diff --git a/apps/client/src/features/editor/extensions/extensions.ts b/apps/client/src/features/editor/extensions/extensions.ts index d6da26f3..547aeed6 100644 --- a/apps/client/src/features/editor/extensions/extensions.ts +++ b/apps/client/src/features/editor/extensions/extensions.ts @@ -166,6 +166,9 @@ export const mainExtensions = [ }, }).extend({ addNodeView() { + // Force the react node view to render immediately using flush sync (https://github.com/ueberdosis/tiptap/blob/b4db352f839e1d82f9add6ee7fb45561336286d8/packages/react/src/ReactRenderer.tsx#L183-L191) + this.editor.isInitialized = true; + return ReactNodeViewRenderer(MentionView); }, }), diff --git a/package.json b/package.json index 5b14428c..86333599 100644 --- a/package.json +++ b/package.json @@ -21,42 +21,40 @@ "@braintree/sanitize-url": "^7.1.0", "@docmost/editor-ext": "workspace:*", "@floating-ui/dom": "^1.7.3", - "@hocuspocus/extension-redis": "3.4.1", - "@hocuspocus/provider": "3.4.1", - "@hocuspocus/server": "3.4.1", - "@hocuspocus/transformer": "3.4.1", + "@hocuspocus/extension-redis": "3.4.3", + "@hocuspocus/provider": "3.4.3", + "@hocuspocus/server": "3.4.3", + "@hocuspocus/transformer": "3.4.3", "@joplin/turndown": "^4.0.74", "@joplin/turndown-plugin-gfm": "^1.0.56", "@sindresorhus/slugify": "1.1.0", - "@tiptap/core": "3.13.0", - "@tiptap/extension-code-block": "3.13.0", - "@tiptap/extension-collaboration": "3.13.0", - "@tiptap/extension-collaboration-caret": "3.13.0", - "@tiptap/extension-color": "3.13.0", - "@tiptap/extension-document": "3.13.0", - "@tiptap/extension-heading": "3.13.0", - "@tiptap/extension-highlight": "3.13.0", - "@tiptap/extension-history": "3.13.0", - "@tiptap/extension-image": "3.13.0", - "@tiptap/extension-link": "3.13.0", - "@tiptap/extension-list": "3.13.0", - "@tiptap/extension-list-item": "3.13.0", - "@tiptap/extension-list-keymap": "3.13.0", - "@tiptap/extension-placeholder": "3.13.0", - "@tiptap/extension-subscript": "3.13.0", - "@tiptap/extension-superscript": "3.13.0", - "@tiptap/extension-table": "3.13.0", - "@tiptap/extension-text": "3.13.0", - "@tiptap/extension-text-align": "3.13.0", - "@tiptap/extension-text-style": "3.13.0", - "@tiptap/extension-typography": "3.13.0", - "@tiptap/extension-unique-id": "^3.13.0", - "@tiptap/extension-youtube": "3.13.0", - "@tiptap/html": "3.13.0", - "@tiptap/pm": "3.13.0", - "@tiptap/react": "3.13.0", - "@tiptap/starter-kit": "3.13.0", - "@tiptap/suggestion": "3.13.0", + "@tiptap/core": "3.15.3", + "@tiptap/extension-code-block": "3.15.3", + "@tiptap/extension-collaboration": "3.15.3", + "@tiptap/extension-collaboration-caret": "3.15.3", + "@tiptap/extension-color": "3.15.3", + "@tiptap/extension-document": "3.15.3", + "@tiptap/extension-heading": "3.15.3", + "@tiptap/extension-highlight": "3.15.3", + "@tiptap/extension-history": "3.15.3", + "@tiptap/extension-image": "3.15.3", + "@tiptap/extension-link": "3.15.3", + "@tiptap/extension-list": "3.15.3", + "@tiptap/extension-placeholder": "3.15.3", + "@tiptap/extension-subscript": "3.15.3", + "@tiptap/extension-superscript": "3.15.3", + "@tiptap/extension-table": "3.15.3", + "@tiptap/extension-text": "3.15.3", + "@tiptap/extension-text-align": "3.15.3", + "@tiptap/extension-text-style": "3.15.3", + "@tiptap/extension-typography": "3.15.3", + "@tiptap/extension-unique-id": "^3.15.3", + "@tiptap/extension-youtube": "3.15.3", + "@tiptap/html": "3.15.3", + "@tiptap/pm": "3.15.3", + "@tiptap/react": "3.15.3", + "@tiptap/starter-kit": "3.15.3", + "@tiptap/suggestion": "3.15.3", "@types/qrcode": "^1.5.5", "bytes": "^3.1.2", "cross-env": "^7.0.3", @@ -73,7 +71,7 @@ "uuid": "^11.1.0", "y-indexeddb": "^9.0.12", "y-prosemirror": "1.3.7", - "yjs": "^13.6.27" + "yjs": "^13.6.29" }, "devDependencies": { "@nx/js": "20.4.5", diff --git a/packages/editor-ext/src/lib/attachment/attachment.ts b/packages/editor-ext/src/lib/attachment/attachment.ts index 5231c897..bd1814f5 100644 --- a/packages/editor-ext/src/lib/attachment/attachment.ts +++ b/packages/editor-ext/src/lib/attachment/attachment.ts @@ -92,7 +92,7 @@ export const Attachment = Node.create({ mergeAttributes( { "data-type": this.name }, this.options.HTMLAttributes, - HTMLAttributes, + HTMLAttributes ), [ "a", @@ -120,6 +120,9 @@ export const Attachment = Node.create({ }, addNodeView() { + // Force the react node view to render immediately using flush sync (https://github.com/ueberdosis/tiptap/blob/b4db352f839e1d82f9add6ee7fb45561336286d8/packages/react/src/ReactRenderer.tsx#L183-L191) + this.editor.isInitialized = true; + return ReactNodeViewRenderer(this.options.view); }, diff --git a/packages/editor-ext/src/lib/callout/callout.ts b/packages/editor-ext/src/lib/callout/callout.ts index 97c5dfcc..1dc4d800 100644 --- a/packages/editor-ext/src/lib/callout/callout.ts +++ b/packages/editor-ext/src/lib/callout/callout.ts @@ -87,7 +87,7 @@ export const Callout = Node.create({ mergeAttributes( { "data-type": this.name }, this.options.HTMLAttributes, - HTMLAttributes, + HTMLAttributes ), 0, ]; @@ -130,6 +130,9 @@ export const Callout = Node.create({ }, addNodeView() { + // Force the react node view to render immediately using flush sync (https://github.com/ueberdosis/tiptap/blob/b4db352f839e1d82f9add6ee7fb45561336286d8/packages/react/src/ReactRenderer.tsx#L183-L191) + this.editor.isInitialized = true; + return ReactNodeViewRenderer(this.options.view); }, @@ -193,7 +196,7 @@ export const Callout = Node.create({ tr.delete(pos, pos + nodeSize); tr.setSelection( - TextSelection.near(tr.doc.resolve(previousPosition - 1)), + TextSelection.near(tr.doc.resolve(previousPosition - 1)) ); tr.insert(previousPosition - 1, content); diff --git a/packages/editor-ext/src/lib/custom-code-block/custom-code-block.ts b/packages/editor-ext/src/lib/custom-code-block/custom-code-block.ts index 12f25989..ba9fe9c1 100644 --- a/packages/editor-ext/src/lib/custom-code-block/custom-code-block.ts +++ b/packages/editor-ext/src/lib/custom-code-block/custom-code-block.ts @@ -1,14 +1,14 @@ -import type { CodeBlockOptions } from '@tiptap/extension-code-block' -import CodeBlock from '@tiptap/extension-code-block' +import type { CodeBlockOptions } from "@tiptap/extension-code-block"; +import CodeBlock from "@tiptap/extension-code-block"; -import { LowlightPlugin } from './lowlight-plugin.js' -import { ReactNodeViewRenderer } from '@tiptap/react'; +import { LowlightPlugin } from "./lowlight-plugin.js"; +import { ReactNodeViewRenderer } from "@tiptap/react"; export interface CodeBlockLowlightOptions extends CodeBlockOptions { /** * The lowlight instance. */ - lowlight: any, + lowlight: any; view: any; } @@ -25,13 +25,13 @@ export const CustomCodeBlock = CodeBlock.extend({ return { ...this.parent?.(), lowlight: {}, - languageClassPrefix: 'language-', + languageClassPrefix: "language-", exitOnTripleEnter: true, exitOnArrowDown: true, defaultLanguage: null, HTMLAttributes: {}, view: null, - } + }; }, addKeyboardShortcuts() { @@ -88,8 +88,10 @@ export const CustomCodeBlock = CodeBlock.extend({ }; }, - addNodeView() { + // Force the react node view to render immediately using flush sync (https://github.com/ueberdosis/tiptap/blob/b4db352f839e1d82f9add6ee7fb45561336286d8/packages/react/src/ReactRenderer.tsx#L183-L191) + this.editor.isInitialized = true; + return ReactNodeViewRenderer(this.options.view); }, @@ -101,6 +103,6 @@ export const CustomCodeBlock = CodeBlock.extend({ lowlight: this.options.lowlight, defaultLanguage: this.options.defaultLanguage, }), - ] + ]; }, -}) \ No newline at end of file +}); diff --git a/packages/editor-ext/src/lib/drawio.ts b/packages/editor-ext/src/lib/drawio.ts index 319853b2..3cc041a2 100644 --- a/packages/editor-ext/src/lib/drawio.ts +++ b/packages/editor-ext/src/lib/drawio.ts @@ -41,45 +41,45 @@ export const Drawio = Node.create({ addAttributes() { return { src: { - default: '', - parseHTML: (element) => element.getAttribute('data-src'), + default: "", + parseHTML: (element) => element.getAttribute("data-src"), renderHTML: (attributes) => ({ - 'data-src': attributes.src, + "data-src": attributes.src, }), }, title: { default: undefined, - parseHTML: (element) => element.getAttribute('data-title'), + parseHTML: (element) => element.getAttribute("data-title"), renderHTML: (attributes: DrawioAttributes) => ({ - 'data-title': attributes.title, + "data-title": attributes.title, }), }, width: { - default: '100%', - parseHTML: (element) => element.getAttribute('data-width'), + default: "100%", + parseHTML: (element) => element.getAttribute("data-width"), renderHTML: (attributes: DrawioAttributes) => ({ - 'data-width': attributes.width, + "data-width": attributes.width, }), }, size: { default: null, - parseHTML: (element) => element.getAttribute('data-size'), + parseHTML: (element) => element.getAttribute("data-size"), renderHTML: (attributes: DrawioAttributes) => ({ - 'data-size': attributes.size, + "data-size": attributes.size, }), }, align: { - default: 'center', - parseHTML: (element) => element.getAttribute('data-align'), + default: "center", + parseHTML: (element) => element.getAttribute("data-align"), renderHTML: (attributes: DrawioAttributes) => ({ - 'data-align': attributes.align, + "data-align": attributes.align, }), }, attachmentId: { default: undefined, - parseHTML: (element) => element.getAttribute('data-attachment-id'), + parseHTML: (element) => element.getAttribute("data-attachment-id"), renderHTML: (attributes: DrawioAttributes) => ({ - 'data-attachment-id': attributes.attachmentId, + "data-attachment-id": attributes.attachmentId, }), }, }; @@ -95,13 +95,20 @@ export const Drawio = Node.create({ renderHTML({ HTMLAttributes }) { return [ - 'div', + "div", mergeAttributes( - { 'data-type': this.name }, + { "data-type": this.name }, this.options.HTMLAttributes, HTMLAttributes ), - ['img', { src: HTMLAttributes['data-src'], alt: HTMLAttributes['data-title'], width: HTMLAttributes['data-width'] }], + [ + "img", + { + src: HTMLAttributes["data-src"], + alt: HTMLAttributes["data-title"], + width: HTMLAttributes["data-width"], + }, + ], ]; }, @@ -119,6 +126,9 @@ export const Drawio = Node.create({ }, addNodeView() { + // Force the react node view to render immediately using flush sync (https://github.com/ueberdosis/tiptap/blob/b4db352f839e1d82f9add6ee7fb45561336286d8/packages/react/src/ReactRenderer.tsx#L183-L191) + this.editor.isInitialized = true; + return ReactNodeViewRenderer(this.options.view); }, }); diff --git a/packages/editor-ext/src/lib/embed.ts b/packages/editor-ext/src/lib/embed.ts index 47fc251e..a93648b1 100644 --- a/packages/editor-ext/src/lib/embed.ts +++ b/packages/editor-ext/src/lib/embed.ts @@ -1,6 +1,6 @@ -import { Node, mergeAttributes } from '@tiptap/core'; -import { ReactNodeViewRenderer } from '@tiptap/react'; -import { sanitizeUrl } from './utils'; +import { Node, mergeAttributes } from "@tiptap/core"; +import { ReactNodeViewRenderer } from "@tiptap/react"; +import { sanitizeUrl } from "./utils"; export interface EmbedOptions { HTMLAttributes: Record; @@ -14,7 +14,7 @@ export interface EmbedAttributes { height?: number; } -declare module '@tiptap/core' { +declare module "@tiptap/core" { interface Commands { embeds: { setEmbed: (attributes?: EmbedAttributes) => ReturnType; @@ -23,9 +23,9 @@ declare module '@tiptap/core' { } export const Embed = Node.create({ - name: 'embed', + name: "embed", inline: false, - group: 'block', + group: "block", isolating: true, atom: true, defining: true, @@ -40,41 +40,41 @@ export const Embed = Node.create({ addAttributes() { return { src: { - default: '', + default: "", parseHTML: (element) => { - const src = element.getAttribute('data-src'); + const src = element.getAttribute("data-src"); return sanitizeUrl(src); }, renderHTML: (attributes: EmbedAttributes) => ({ - 'data-src': sanitizeUrl(attributes.src), + "data-src": sanitizeUrl(attributes.src), }), }, provider: { - default: '', - parseHTML: (element) => element.getAttribute('data-provider'), + default: "", + parseHTML: (element) => element.getAttribute("data-provider"), renderHTML: (attributes: EmbedAttributes) => ({ - 'data-provider': attributes.provider, + "data-provider": attributes.provider, }), }, align: { - default: 'center', - parseHTML: (element) => element.getAttribute('data-align'), + default: "center", + parseHTML: (element) => element.getAttribute("data-align"), renderHTML: (attributes: EmbedAttributes) => ({ - 'data-align': attributes.align, + "data-align": attributes.align, }), }, width: { default: 640, - parseHTML: (element) => element.getAttribute('data-width'), + parseHTML: (element) => element.getAttribute("data-width"), renderHTML: (attributes: EmbedAttributes) => ({ - 'data-width': attributes.width, + "data-width": attributes.width, }), }, height: { default: 480, - parseHTML: (element) => element.getAttribute('data-height'), + parseHTML: (element) => element.getAttribute("data-height"), renderHTML: (attributes: EmbedAttributes) => ({ - 'data-height': attributes.height, + "data-height": attributes.height, }), }, }; @@ -91,13 +91,13 @@ export const Embed = Node.create({ renderHTML({ HTMLAttributes }) { const src = HTMLAttributes["data-src"]; const safeHref = sanitizeUrl(src); - + return [ "div", mergeAttributes( { "data-type": this.name }, this.options.HTMLAttributes, - HTMLAttributes, + HTMLAttributes ), [ "a", @@ -120,9 +120,9 @@ export const Embed = Node.create({ ...attrs, src: sanitizeUrl(attrs.src), }; - + return commands.insertContent({ - type: 'embed', + type: "embed", attrs: validatedAttrs, }); }, @@ -130,6 +130,9 @@ export const Embed = Node.create({ }, addNodeView() { + // Force the react node view to render immediately using flush sync (https://github.com/ueberdosis/tiptap/blob/b4db352f839e1d82f9add6ee7fb45561336286d8/packages/react/src/ReactRenderer.tsx#L183-L191) + this.editor.isInitialized = true; + return ReactNodeViewRenderer(this.options.view); }, }); diff --git a/packages/editor-ext/src/lib/excalidraw.ts b/packages/editor-ext/src/lib/excalidraw.ts index a7e3a468..28b064e4 100644 --- a/packages/editor-ext/src/lib/excalidraw.ts +++ b/packages/editor-ext/src/lib/excalidraw.ts @@ -1,5 +1,5 @@ -import { Node, mergeAttributes } from '@tiptap/core'; -import { ReactNodeViewRenderer } from '@tiptap/react'; +import { Node, mergeAttributes } from "@tiptap/core"; +import { ReactNodeViewRenderer } from "@tiptap/react"; export interface ExcalidrawOptions { HTMLAttributes: Record; @@ -14,7 +14,7 @@ export interface ExcalidrawAttributes { attachmentId?: string; } -declare module '@tiptap/core' { +declare module "@tiptap/core" { interface Commands { excalidraw: { setExcalidraw: (attributes?: ExcalidrawAttributes) => ReturnType; @@ -23,9 +23,9 @@ declare module '@tiptap/core' { } export const Excalidraw = Node.create({ - name: 'excalidraw', + name: "excalidraw", inline: false, - group: 'block', + group: "block", isolating: true, atom: true, defining: true, @@ -40,45 +40,45 @@ export const Excalidraw = Node.create({ addAttributes() { return { src: { - default: '', - parseHTML: (element) => element.getAttribute('data-src'), + default: "", + parseHTML: (element) => element.getAttribute("data-src"), renderHTML: (attributes) => ({ - 'data-src': attributes.src, + "data-src": attributes.src, }), }, title: { default: undefined, - parseHTML: (element) => element.getAttribute('data-title'), + parseHTML: (element) => element.getAttribute("data-title"), renderHTML: (attributes: ExcalidrawAttributes) => ({ - 'data-title': attributes.title, + "data-title": attributes.title, }), }, width: { - default: '100%', - parseHTML: (element) => element.getAttribute('data-width'), + default: "100%", + parseHTML: (element) => element.getAttribute("data-width"), renderHTML: (attributes: ExcalidrawAttributes) => ({ - 'data-width': attributes.width, + "data-width": attributes.width, }), }, size: { default: null, - parseHTML: (element) => element.getAttribute('data-size'), + parseHTML: (element) => element.getAttribute("data-size"), renderHTML: (attributes: ExcalidrawAttributes) => ({ - 'data-size': attributes.size, + "data-size": attributes.size, }), }, align: { - default: 'center', - parseHTML: (element) => element.getAttribute('data-align'), + default: "center", + parseHTML: (element) => element.getAttribute("data-align"), renderHTML: (attributes: ExcalidrawAttributes) => ({ - 'data-align': attributes.align, + "data-align": attributes.align, }), }, attachmentId: { default: undefined, - parseHTML: (element) => element.getAttribute('data-attachment-id'), + parseHTML: (element) => element.getAttribute("data-attachment-id"), renderHTML: (attributes: ExcalidrawAttributes) => ({ - 'data-attachment-id': attributes.attachmentId, + "data-attachment-id": attributes.attachmentId, }), }, }; @@ -94,13 +94,20 @@ export const Excalidraw = Node.create({ renderHTML({ HTMLAttributes }) { return [ - 'div', + "div", mergeAttributes( - { 'data-type': this.name }, + { "data-type": this.name }, this.options.HTMLAttributes, HTMLAttributes ), - ['img', { src: HTMLAttributes['data-src'], alt: HTMLAttributes['data-title'], width: HTMLAttributes['data-width'] }], + [ + "img", + { + src: HTMLAttributes["data-src"], + alt: HTMLAttributes["data-title"], + width: HTMLAttributes["data-width"], + }, + ], ]; }, @@ -110,7 +117,7 @@ export const Excalidraw = Node.create({ (attrs: ExcalidrawAttributes) => ({ commands }) => { return commands.insertContent({ - type: 'excalidraw', + type: "excalidraw", attrs: attrs, }); }, @@ -118,6 +125,9 @@ export const Excalidraw = Node.create({ }, addNodeView() { + // Force the react node view to render immediately using flush sync (https://github.com/ueberdosis/tiptap/blob/b4db352f839e1d82f9add6ee7fb45561336286d8/packages/react/src/ReactRenderer.tsx#L183-L191) + this.editor.isInitialized = true; + return ReactNodeViewRenderer(this.options.view); }, }); diff --git a/packages/editor-ext/src/lib/image/image.ts b/packages/editor-ext/src/lib/image/image.ts index 3f7683e4..cc8ba220 100644 --- a/packages/editor-ext/src/lib/image/image.ts +++ b/packages/editor-ext/src/lib/image/image.ts @@ -22,7 +22,7 @@ declare module "@tiptap/core" { imageBlock: { setImage: (attributes: ImageAttributes) => ReturnType; setImageAt: ( - attributes: ImageAttributes & { pos: number | Range }, + attributes: ImageAttributes & { pos: number | Range } ) => ReturnType; setImageAlign: (align: "left" | "center" | "right") => ReturnType; setImageWidth: (width: number) => ReturnType; @@ -135,6 +135,9 @@ export const TiptapImage = Image.extend({ }, addNodeView() { + // Force the react node view to render immediately using flush sync (https://github.com/ueberdosis/tiptap/blob/b4db352f839e1d82f9add6ee7fb45561336286d8/packages/react/src/ReactRenderer.tsx#L183-L191) + this.editor.isInitialized = true; + return ReactNodeViewRenderer(this.options.view); }, diff --git a/packages/editor-ext/src/lib/math/math-block.ts b/packages/editor-ext/src/lib/math/math-block.ts index a580596b..cf11e8f8 100644 --- a/packages/editor-ext/src/lib/math/math-block.ts +++ b/packages/editor-ext/src/lib/math/math-block.ts @@ -63,6 +63,9 @@ export const MathBlock = Node.create({ }, addNodeView() { + // Force the react node view to render immediately using flush sync (https://github.com/ueberdosis/tiptap/blob/b4db352f839e1d82f9add6ee7fb45561336286d8/packages/react/src/ReactRenderer.tsx#L183-L191) + this.editor.isInitialized = true; + return ReactNodeViewRenderer(this.options.view); }, diff --git a/packages/editor-ext/src/lib/math/math-inline.ts b/packages/editor-ext/src/lib/math/math-inline.ts index 39c1cd49..3de9d291 100644 --- a/packages/editor-ext/src/lib/math/math-inline.ts +++ b/packages/editor-ext/src/lib/math/math-inline.ts @@ -64,6 +64,9 @@ export const MathInline = Node.create({ }, addNodeView() { + // Force the react node view to render immediately using flush sync (https://github.com/ueberdosis/tiptap/blob/b4db352f839e1d82f9add6ee7fb45561336286d8/packages/react/src/ReactRenderer.tsx#L183-L191) + this.editor.isInitialized = true; + return ReactNodeViewRenderer(this.options.view); }, diff --git a/packages/editor-ext/src/lib/subpages/subpages.ts b/packages/editor-ext/src/lib/subpages/subpages.ts index 59eb9896..617f43ce 100644 --- a/packages/editor-ext/src/lib/subpages/subpages.ts +++ b/packages/editor-ext/src/lib/subpages/subpages.ts @@ -44,7 +44,7 @@ export const Subpages = Node.create({ mergeAttributes( { "data-type": this.name }, this.options.HTMLAttributes, - HTMLAttributes, + HTMLAttributes ), ]; }, @@ -63,6 +63,9 @@ export const Subpages = Node.create({ }, addNodeView() { + // Force the react node view to render immediately using flush sync (https://github.com/ueberdosis/tiptap/blob/b4db352f839e1d82f9add6ee7fb45561336286d8/packages/react/src/ReactRenderer.tsx#L183-L191) + this.editor.isInitialized = true; + return ReactNodeViewRenderer(this.options.view); }, }); diff --git a/packages/editor-ext/src/lib/video/video.ts b/packages/editor-ext/src/lib/video/video.ts index 6f28e7c0..40f6db32 100644 --- a/packages/editor-ext/src/lib/video/video.ts +++ b/packages/editor-ext/src/lib/video/video.ts @@ -20,7 +20,7 @@ declare module "@tiptap/core" { videoBlock: { setVideo: (attributes: VideoAttributes) => ReturnType; setVideoAt: ( - attributes: VideoAttributes & { pos: number | Range }, + attributes: VideoAttributes & { pos: number | Range } ) => ReturnType; setVideoAlign: (align: "left" | "center" | "right") => ReturnType; setVideoWidth: (width: number) => ReturnType; @@ -87,9 +87,9 @@ export const TiptapVideo = Node.create({ parseHTML() { return [ { - tag: 'video', + tag: "video", }, - ] + ]; }, renderHTML({ HTMLAttributes }) { @@ -126,6 +126,9 @@ export const TiptapVideo = Node.create({ }, addNodeView() { + // Force the react node view to render immediately using flush sync (https://github.com/ueberdosis/tiptap/blob/b4db352f839e1d82f9add6ee7fb45561336286d8/packages/react/src/ReactRenderer.tsx#L183-L191) + this.editor.isInitialized = true; + return ReactNodeViewRenderer(this.options.view); }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 800f2ec3..d08cabf7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,17 +28,17 @@ importers: specifier: ^1.7.3 version: 1.7.3 '@hocuspocus/extension-redis': - specifier: 3.4.1 - version: 3.4.1(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + specifier: 3.4.3 + version: 3.4.3(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29) '@hocuspocus/provider': - specifier: 3.4.1 - version: 3.4.1(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + specifier: 3.4.3 + version: 3.4.3(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29) '@hocuspocus/server': - specifier: 3.4.1 - version: 3.4.1(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + specifier: 3.4.3 + version: 3.4.3(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29) '@hocuspocus/transformer': - specifier: 3.4.1 - version: 3.4.1(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(y-prosemirror@1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) + specifier: 3.4.3 + version: 3.4.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29) '@joplin/turndown': specifier: ^4.0.74 version: 4.0.74 @@ -49,92 +49,86 @@ importers: specifier: 1.1.0 version: 1.1.0 '@tiptap/core': - specifier: 3.13.0 - version: 3.13.0(@tiptap/pm@3.13.0) + specifier: 3.15.3 + version: 3.15.3(@tiptap/pm@3.15.3) '@tiptap/extension-code-block': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) '@tiptap/extension-collaboration': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29) '@tiptap/extension-collaboration-caret': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29)) '@tiptap/extension-color': - specifier: 3.13.0 - version: 3.13.0(@tiptap/extension-text-style@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))) + specifier: 3.15.3 + version: 3.15.3(@tiptap/extension-text-style@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))) '@tiptap/extension-document': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) '@tiptap/extension-heading': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) '@tiptap/extension-highlight': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) '@tiptap/extension-history': - specifier: 3.13.0 - version: 3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)) + specifier: 3.15.3 + version: 3.15.3(@tiptap/extensions@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)) '@tiptap/extension-image': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) '@tiptap/extension-link': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) '@tiptap/extension-list': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) - '@tiptap/extension-list-item': - specifier: 3.13.0 - version: 3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)) - '@tiptap/extension-list-keymap': - specifier: 3.13.0 - version: 3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) '@tiptap/extension-placeholder': - specifier: 3.13.0 - version: 3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)) + specifier: 3.15.3 + version: 3.15.3(@tiptap/extensions@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)) '@tiptap/extension-subscript': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) '@tiptap/extension-superscript': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) '@tiptap/extension-table': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) '@tiptap/extension-text': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) '@tiptap/extension-text-align': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) '@tiptap/extension-text-style': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) '@tiptap/extension-typography': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) '@tiptap/extension-unique-id': - specifier: ^3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + specifier: ^3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) '@tiptap/extension-youtube': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) '@tiptap/html': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(happy-dom@20.0.10) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)(happy-dom@20.0.10) '@tiptap/pm': - specifier: 3.13.0 - version: 3.13.0 + specifier: 3.15.3 + version: 3.15.3 '@tiptap/react': - specifier: 3.13.0 - version: 3.13.0(@floating-ui/dom@1.7.3)(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 3.15.3 + version: 3.15.3(@floating-ui/dom@1.7.3)(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tiptap/starter-kit': - specifier: 3.13.0 - version: 3.13.0 + specifier: 3.15.3 + version: 3.15.3 '@tiptap/suggestion': - specifier: 3.13.0 - version: 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + specifier: 3.15.3 + version: 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) '@types/qrcode': specifier: ^1.5.5 version: 1.5.5 @@ -179,13 +173,13 @@ importers: version: 11.1.0 y-indexeddb: specifier: ^9.0.12 - version: 9.0.12(yjs@13.6.27) + version: 9.0.12(yjs@13.6.29) y-prosemirror: specifier: 1.3.7 - version: 1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + version: 1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29) yjs: - specifier: ^13.6.27 - version: 13.6.27 + specifier: ^13.6.29 + version: 13.6.29 devDependencies: '@nx/js': specifier: 20.4.5 @@ -226,6 +220,9 @@ importers: '@excalidraw/excalidraw': specifier: 0.18.0-864353b version: 0.18.0-864353b(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/dom': + specifier: ^1.7.3 + version: 1.7.3 '@mantine/core': specifier: ^8.1.3 version: 8.1.3(@mantine/hooks@8.1.3(react@18.3.1))(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -253,9 +250,6 @@ importers: '@tanstack/react-query': specifier: ^5.80.6 version: 5.80.6(react@18.3.1) - '@tiptap/extension-character-count': - specifier: ^2.10.3 - version: 2.14.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) alfaaz: specifier: ^1.1.0 version: 1.1.0 @@ -2338,15 +2332,9 @@ packages: '@fastify/static@8.2.0': resolution: {integrity: sha512-PejC/DtT7p1yo3p+W7LiUtLMsV8fEvxAK15sozHy9t8kwo5r0uLYmhV/inURmGz1SkHZFz/8CNtHLPyhKcx4SQ==} - '@floating-ui/core@1.5.3': - resolution: {integrity: sha512-O0WKDOo0yhJuugCx6trZQj5jVJ9yR0ystG2JaNAemYUWce+pmM6WUEFIibnWyEJKdrDxhm75NoSRME35FNaM/Q==} - '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} - '@floating-ui/dom@1.6.3': - resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} - '@floating-ui/dom@1.7.3': resolution: {integrity: sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==} @@ -2368,29 +2356,29 @@ packages: '@floating-ui/utils@0.2.8': resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - '@hocuspocus/common@3.4.1': - resolution: {integrity: sha512-29Dpa3nslBvM4dksIoskovYt/aecJomEeWE5Wmzr+lNFJje15P/L/47WcogguRd/IqYIu2auNTyKlouvSRrDAQ==} + '@hocuspocus/common@3.4.3': + resolution: {integrity: sha512-wnBBO9sWcVAoUPEXN1qO+zk3HaEF9VTemxB6kjuuH6e1dHnD0v12m4P4X1wiZVhmMIX/PMl/fu3MGtYWQJz8gA==} - '@hocuspocus/extension-redis@3.4.1': - resolution: {integrity: sha512-41M2tpcA5PIPXlrE8368ZQwYBBC0M0IGkDdp3yPmfQnD0idAC67biJ68E1SzgMgPPmFcQ7bPkZ4iNphaVZapQw==} + '@hocuspocus/extension-redis@3.4.3': + resolution: {integrity: sha512-r64Vpgk6tt0VZaQPEo1dQuyur2ozr243ncDcDM+4gFPuV8ZRUjL1rvaJTidb2HCcAW2zjfwshNxw4+OixeksBA==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 - '@hocuspocus/provider@3.4.1': - resolution: {integrity: sha512-lFNxXf2NsyhT8fvxX/N6caki97hbUUGOM79tAoeJty/Y6hKfQyY6ythvkeVdqk+yvx/RiVogrW4PLjazRGprGg==} + '@hocuspocus/provider@3.4.3': + resolution: {integrity: sha512-zt+UgVXGsEQrqnDZgavc2PT9yKJjmVjV+5YxvhlmFVFLVORqawT4l601aKmLPhvyK97un4ZApZ5rso8iO6crWg==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 - '@hocuspocus/server@3.4.1': - resolution: {integrity: sha512-VgHmu71CFwyCYOlkLovAqaFrUKGq+OSsIw13PaMLMUrnLT3EdMqFzfkw9b82Qbf23WoN3yvMCPklNjnjg5/Brg==} + '@hocuspocus/server@3.4.3': + resolution: {integrity: sha512-a9bqAXUMBo9YBeuzqNf9C3eVbu1RIWUrtmFMGq+ZssQr3Jugt/5PCkZskgqhJNvPkyTARHcUtN80j/SDLylZmg==} peerDependencies: y-protocols: ^1.0.6 yjs: ^13.6.8 - '@hocuspocus/transformer@3.4.1': - resolution: {integrity: sha512-dVutZ/xEUT3ddC5muI53R1sgWyyrKORCh/lvkYNCq7bQPeBMUC3o/0GxSvQ2C6mO1Ytdh0MmA5IHPeY+N7XYDw==} + '@hocuspocus/transformer@3.4.3': + resolution: {integrity: sha512-jQZiqFGCvGQJLgE0nHZ4TdpEJlI7WkM8CKA1wLcs0beVs0kNXg32lykGckjveJwwJuJ/hieMqIEqj9POxTWPEw==} peerDependencies: '@tiptap/core': ^3.0.1 '@tiptap/pm': ^3.0.1 @@ -4216,257 +4204,251 @@ packages: peerDependencies: react: ^18 || ^19 - '@tiptap/core@3.13.0': - resolution: {integrity: sha512-iUelgiTMgPVMpY5ZqASUpk8mC8HuR9FWKaDzK27w9oWip9tuB54Z8mePTxNcQaSPb6ErzEaC8x8egrRt7OsdGQ==} + '@tiptap/core@3.15.3': + resolution: {integrity: sha512-bmXydIHfm2rEtGju39FiQNfzkFx9CDvJe+xem1dgEZ2P6Dj7nQX9LnA1ZscW7TuzbBRkL5p3dwuBIi3f62A66A==} peerDependencies: - '@tiptap/pm': ^3.13.0 + '@tiptap/pm': ^3.15.3 - '@tiptap/extension-blockquote@3.13.0': - resolution: {integrity: sha512-K1z/PAIIwEmiWbzrP//4cC7iG1TZknDlF1yb42G7qkx2S2X4P0NiqX7sKOej3yqrPjKjGwPujLMSuDnCF87QkQ==} + '@tiptap/extension-blockquote@3.15.3': + resolution: {integrity: sha512-13x5UsQXtttFpoS/n1q173OeurNxppsdWgP3JfsshzyxIghhC141uL3H6SGYQLPU31AizgDs2OEzt6cSUevaZg==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-bold@3.13.0': - resolution: {integrity: sha512-VYiDN9EEwR6ShaDLclG8mphkb/wlIzqfk7hxaKboq1G+NSDj8PcaSI9hldKKtTCLeaSNu6UR5nkdu/YHdzYWTw==} + '@tiptap/extension-bold@3.15.3': + resolution: {integrity: sha512-I8JYbkkUTNUXbHd/wCse2bR0QhQtJD7+0/lgrKOmGfv5ioLxcki079Nzuqqay3PjgYoJLIJQvm3RAGxT+4X91w==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-bubble-menu@3.13.0': - resolution: {integrity: sha512-qZ3j2DBsqP9DjG2UlExQ+tHMRhAnWlCKNreKddKocb/nAFrPdBCtvkqIEu+68zPlbLD4ukpoyjUklRJg+NipFg==} + '@tiptap/extension-bubble-menu@3.15.3': + resolution: {integrity: sha512-e88DG1bTy6hKxrt7iPVQhJnH5/EOrnKpIyp09dfRDgWrrW88fE0Qjys7a/eT8W+sXyXM3z10Ye7zpERWsrLZDg==} peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 - '@tiptap/extension-bullet-list@3.13.0': - resolution: {integrity: sha512-fFQmmEUoPzRGiQJ/KKutG35ZX21GE+1UCDo8Q6PoWH7Al9lex47nvyeU1BiDYOhcTKgIaJRtEH5lInsOsRJcSA==} + '@tiptap/extension-bullet-list@3.15.3': + resolution: {integrity: sha512-MGwEkNT7ltst6XaWf0ObNgpKQ4PvuuV3igkBrdYnQS+qaAx9IF4isygVPqUc9DvjYC306jpyKsNqNrENIXcosA==} peerDependencies: - '@tiptap/extension-list': ^3.13.0 + '@tiptap/extension-list': ^3.15.3 - '@tiptap/extension-character-count@2.14.0': - resolution: {integrity: sha512-aTCobbF9yIXOntVTdjzJ4G5V0TJKeeIDW8RFMdTVr5o0R/woSZ27cXiPGdS7XxpN6gY9vlNzYe79CcNBDTzLfA==} + '@tiptap/extension-code-block@3.15.3': + resolution: {integrity: sha512-q1UB9icNfdJppTqMIUWfoRKkx5SSdWIpwZoL2NeOI5Ah3E20/dQKVttIgLhsE521chyvxCYCRaHD5tMNGKfhyw==} peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 - '@tiptap/extension-code-block@3.13.0': - resolution: {integrity: sha512-kIwfQ4iqootsWg9e74iYJK54/YMIj6ahUxEltjZRML5z/h4gTDcQt2eTpnEC8yjDjHeUVOR94zH9auCySyk9CQ==} + '@tiptap/extension-code@3.15.3': + resolution: {integrity: sha512-x6LFt3Og6MFINYpsMzrJnz7vaT9Yk1t4oXkbJsJRSavdIWBEBcoRudKZ4sSe/AnsYlRJs8FY2uR76mt9e+7xAQ==} peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-code@3.13.0': - resolution: {integrity: sha512-sF5raBni6iSVpXWvwJCAcOXw5/kZ+djDHx1YSGWhopm4+fsj0xW7GvVO+VTwiFjZGKSw+K5NeAxzcQTJZd3Vhw==} + '@tiptap/extension-collaboration-caret@3.15.3': + resolution: {integrity: sha512-kXGOL99CLFzc8IdmRpQQwyOqeCWX9Eo4ferz6hwK7YfpKWZoJi9HaiEb6z2gA8Q24ecedcIjBF1l6kLHQiQ2QQ==} peerDependencies: - '@tiptap/core': ^3.13.0 - - '@tiptap/extension-collaboration-caret@3.13.0': - resolution: {integrity: sha512-n8DEiWcVb0mTsf0kVjNx/cU00GACOVoyzu1g376W2qJTntcPPPjSYv+GWyyYHMEiH4i2GOPeuyoMShwf+SJWug==} - peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 '@tiptap/y-tiptap': ^3.0.0 - '@tiptap/extension-collaboration@3.13.0': - resolution: {integrity: sha512-Ovi1z2gLMF5XO7uiD/bRxa6tX5dgFJ2aYF5vbfLci+4UeKWIFjn9tg0H5PU2A2c+BIOzlhLWA2YpPb2ucK7sSg==} + '@tiptap/extension-collaboration@3.15.3': + resolution: {integrity: sha512-AM/UkKkxnKA+NDJ1todoQoj8dMuOI1VcuoUyLVkGn1Jx7GjOng2IMouWkH1of8+dbq9qVWzmbN4VWelsz8vuvw==} peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 '@tiptap/y-tiptap': ^3.0.0 yjs: ^13 - '@tiptap/extension-color@3.13.0': - resolution: {integrity: sha512-I+PTZ31p6GhCjUVpCh1qertTK6T07MVGuLm/LP+c14ByMoZ0L0nVgw0YbWhDqLYWbkI9davv0fuI3dQ0gKSPlA==} + '@tiptap/extension-color@3.15.3': + resolution: {integrity: sha512-GS+LEJ7YC7J6CiQ/caTDVyKg+ZlU4B5ofzAZ0iCWPahjMyUUZImzXvoRlfMumAiPG+IUW9PC2BztSGd3SCLpGA==} peerDependencies: - '@tiptap/extension-text-style': ^3.13.0 + '@tiptap/extension-text-style': ^3.15.3 - '@tiptap/extension-document@3.13.0': - resolution: {integrity: sha512-RjU7hTJwjKXIdY57o/Pc+Yr8swLkrwT7PBQ/m+LCX5oO/V2wYoWCjoBYnK5KSHrWlNy/aLzC33BvLeqZZ9nzlQ==} + '@tiptap/extension-document@3.15.3': + resolution: {integrity: sha512-AC72nI2gnogBuETCKbZekn+h6t5FGGcZG2abPGKbz/x9rwpb6qV2hcbAQ30t6M7H6cTOh2/Ut8bEV2MtMB15sw==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-dropcursor@3.13.0': - resolution: {integrity: sha512-m7GPT3c/83ni+bbU8c+3dpNa8ug+aQ4phNB1Q52VQG3oTonDJnZS7WCtn3lB/Hi1LqoqMtEHwhepU2eD+JeXqQ==} + '@tiptap/extension-dropcursor@3.15.3': + resolution: {integrity: sha512-jGI5XZpdo8GSYQFj7HY15/oEwC2m2TqZz0/Fln5qIhY32XlZhWrsMuMI6WbUJrTH16es7xO6jmRlDsc6g+vJWg==} peerDependencies: - '@tiptap/extensions': ^3.13.0 + '@tiptap/extensions': ^3.15.3 - '@tiptap/extension-floating-menu@3.13.0': - resolution: {integrity: sha512-OsezV2cMofZM4c13gvgi93IEYBUzZgnu8BXTYZQiQYekz4bX4uulBmLa1KOA9EN71FzS+SoLkXHU0YzlbLjlxA==} + '@tiptap/extension-floating-menu@3.15.3': + resolution: {integrity: sha512-+3DVBleKKffadEJEdLYxmYAJOjHjLSqtiSFUE3RABT4V2ka1ODy2NIpyKX0o1SvQ5N1jViYT9Q+yUbNa6zCcDw==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 - '@tiptap/extension-gapcursor@3.13.0': - resolution: {integrity: sha512-KVxjQKkd964nin+1IdM2Dvej/Jy4JTMcMgq5seusUhJ9T9P8F9s2D5Iefwgkps3OCzub/aF+eAsZe+1P5KSIgA==} + '@tiptap/extension-gapcursor@3.15.3': + resolution: {integrity: sha512-Kaw0sNzP0bQI/xEAMSfIpja6xhsu9WqqAK/puzOIS1RKWO47Wps/tzqdSJ9gfslPIb5uY5mKCfy8UR8Xgiia8w==} peerDependencies: - '@tiptap/extensions': ^3.13.0 + '@tiptap/extensions': ^3.15.3 - '@tiptap/extension-hard-break@3.13.0': - resolution: {integrity: sha512-nH1OBaO+/pakhu+P1jF208mPgB70IKlrR/9d46RMYoYbqJTNf4KVLx5lHAOHytIhjcNg+MjyTfJWfkK+dyCCyg==} + '@tiptap/extension-hard-break@3.15.3': + resolution: {integrity: sha512-8HjxmeRbBiXW+7JKemAJtZtHlmXQ9iji398CPQ0yYde68WbIvUhHXjmbJE5pxFvvQTJ/zJv1aISeEOZN2bKBaw==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-heading@3.13.0': - resolution: {integrity: sha512-8VKWX8waYPtUWN97J89em9fOtxNteh6pvUEd0htcOAtoxjt2uZjbW5N4lKyWhNKifZBrVhH2Cc2NUPuftCVgxw==} + '@tiptap/extension-heading@3.15.3': + resolution: {integrity: sha512-G1GG6iN1YXPS+75arDpo+bYRzhr3dNDw99c7D7na3aDawa9Qp7sZ/bVrzFUUcVEce0cD6h83yY7AooBxEc67hA==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-highlight@3.13.0': - resolution: {integrity: sha512-VlXyO8gWhWd0W5ln4Qyr/P1RoAVZkk9ge0jjNsb1bOc078wuvufQ9f6DquMxx0WpcaCXy+DBQLE0GUUqoLvjsQ==} + '@tiptap/extension-highlight@3.15.3': + resolution: {integrity: sha512-ZZyuKGW4WrMx3pBEfsHqOcqEklfiiAjVuvhji9FJcip1w0B2OnMWkgZw7rdAlsQG8pGH6NWh9Gf2DOUsjuAa6A==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-history@3.13.0': - resolution: {integrity: sha512-uLQahZh5uPv0jlmVho3xPeleaRs7WaZ9lBl03I/cI9EMho9BmF38pXYghjSXUmcsUwsGy0dZbfmE3Skn8iUwxA==} + '@tiptap/extension-history@3.15.3': + resolution: {integrity: sha512-nzayl9Iv+lkd6Om9bip8iWSAS8mr/pw2EwOlEAogBueNhVc+VoBKwq3DGnBTbqAddc4g0T7oOtHmmmovBoZduQ==} peerDependencies: - '@tiptap/extensions': ^3.13.0 + '@tiptap/extensions': ^3.15.3 - '@tiptap/extension-horizontal-rule@3.13.0': - resolution: {integrity: sha512-ZUFyORtjj22ib8ykbxRhWFQOTZjNKqOsMQjaAGof30cuD2DN5J5pMz7Haj2fFRtLpugWYH+f0Mi+WumQXC3hCw==} + '@tiptap/extension-horizontal-rule@3.15.3': + resolution: {integrity: sha512-FYkN7L6JsfwwNEntmLklCVKvgL0B0N47OXMacRk6kYKQmVQ4Nvc7q/VJLpD9sk4wh4KT1aiCBfhKEBTu5pv1fg==} peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 - '@tiptap/extension-image@3.13.0': - resolution: {integrity: sha512-223uzLUkIa1rkK7aQK3AcIXe6LbCtmnpVb7sY5OEp+LpSaSPyXwyrZ4A0EO1o98qXG68/0B2OqMntFtA9c5Fbw==} + '@tiptap/extension-image@3.15.3': + resolution: {integrity: sha512-Tjq9BHlC/0bGR9/uySA0tv6I1Ua1Q5t5P/mdbWyZi4JdUpKHRfgenzfXF5DYnklJ01QJ7uOPSp9sAGgPzBixtQ==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-italic@3.13.0': - resolution: {integrity: sha512-XbVTgmzk1kgUMTirA6AGdLTcKHUvEJoh3R4qMdPtwwygEOe7sBuvKuLtF6AwUtpnOM+Y3tfWUTNEDWv9AcEdww==} + '@tiptap/extension-italic@3.15.3': + resolution: {integrity: sha512-6XeuPjcWy7OBxpkgOV7bD6PATO5jhIxc8SEK4m8xn8nelGTBIbHGqK37evRv+QkC7E0MUryLtzwnmmiaxcKL0Q==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-link@3.13.0': - resolution: {integrity: sha512-LuFPJ5GoL12GHW4A+USsj60O90pLcwUPdvEUSWewl9USyG6gnLnY/j5ZOXPYH7LiwYW8+lhq7ABwrDF2PKyBbA==} + '@tiptap/extension-link@3.15.3': + resolution: {integrity: sha512-PdDXyBF9Wco9U1x6e+b7tKBWG+kqBDXDmaYXHkFm/gYuQCQafVJ5mdrDdKgkHDWVnJzMWZXBcZjT9r57qtlLWg==} peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 - '@tiptap/extension-list-item@3.13.0': - resolution: {integrity: sha512-63NbcS/XeQP2jcdDEnEAE3rjJICDj8y1SN1h/MsJmSt1LusnEo8WQ2ub86QELO6XnD3M04V03cY6Knf6I5mTkw==} + '@tiptap/extension-list-item@3.15.3': + resolution: {integrity: sha512-CCxL5ek1p0lO5e8aqhnPzIySldXRSigBFk2fP9OLgdl5qKFLs2MGc19jFlx5+/kjXnEsdQTFbGY1Sizzt0TVDw==} peerDependencies: - '@tiptap/extension-list': ^3.13.0 + '@tiptap/extension-list': ^3.15.3 - '@tiptap/extension-list-keymap@3.13.0': - resolution: {integrity: sha512-P+HtIa1iwosb1feFc8B/9MN5EAwzS+/dZ0UH0CTF2E4wnp5Z9OMxKl1IYjfiCwHzZrU5Let+S/maOvJR/EmV0g==} + '@tiptap/extension-list-keymap@3.15.3': + resolution: {integrity: sha512-UxqnTEEAKrL+wFQeSyC9z0mgyUUVRS2WTcVFoLZCE6/Xus9F53S4bl7VKFadjmqI4GpDk5Oe2IOUc72o129jWg==} peerDependencies: - '@tiptap/extension-list': ^3.13.0 + '@tiptap/extension-list': ^3.15.3 - '@tiptap/extension-list@3.13.0': - resolution: {integrity: sha512-MMFH0jQ4LeCPkJJFyZ77kt6eM/vcKujvTbMzW1xSHCIEA6s4lEcx9QdZMPpfmnOvTzeoVKR4nsu2t2qT9ZXzAw==} + '@tiptap/extension-list@3.15.3': + resolution: {integrity: sha512-n7y/MF9lAM5qlpuH5IR4/uq+kJPEJpe9NrEiH+NmkO/5KJ6cXzpJ6F4U17sMLf2SNCq+TWN9QK8QzoKxIn50VQ==} peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 - '@tiptap/extension-ordered-list@3.13.0': - resolution: {integrity: sha512-QuDyLzuK/3vCvx9GeKhgvHWrGECBzmJyAx6gli2HY+Iil7XicbfltV4nvhIxgxzpx3LDHLKzJN9pBi+2MzX60g==} + '@tiptap/extension-ordered-list@3.15.3': + resolution: {integrity: sha512-/8uhw528Iy0c9wF6tHCiIn0ToM0Ml6Ll2c/3iPRnKr4IjXwx2Lr994stUFihb+oqGZwV1J8CPcZJ4Ufpdqi4Dw==} peerDependencies: - '@tiptap/extension-list': ^3.13.0 + '@tiptap/extension-list': ^3.15.3 - '@tiptap/extension-paragraph@3.13.0': - resolution: {integrity: sha512-9csQde1i0yeZI5oQQ9e1GYNtGL2JcC2d8Fwtw9FsGC8yz2W0h+Fmk+3bc2kobbtO5LGqupSc1fKM8fAg5rSRDg==} + '@tiptap/extension-paragraph@3.15.3': + resolution: {integrity: sha512-lc0Qu/1AgzcEfS67NJMj5tSHHhH6NtA6uUpvppEKGsvJwgE2wKG1onE4isrVXmcGRdxSMiCtyTDemPNMu6/ozQ==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-placeholder@3.13.0': - resolution: {integrity: sha512-Au4ktRBraQktX9gjSzGWyJV6kPof7+kOhzE8ej+rOMjIrHbx3DCHy1CJWftSO9BbqIyonjsFmm4nE+vjzZ3Z5Q==} + '@tiptap/extension-placeholder@3.15.3': + resolution: {integrity: sha512-XcHHnojT186hKIoOgcPBesXk89+caNGVUdMtc171Vcr/5s0dpnr4q5LfE+YRC+S85CpCxCRRnh84Ou+XRtOqrw==} peerDependencies: - '@tiptap/extensions': ^3.13.0 + '@tiptap/extensions': ^3.15.3 - '@tiptap/extension-strike@3.13.0': - resolution: {integrity: sha512-VHhWNqTAMOfrC48m2FcPIZB0nhl6XHQviAV16SBc+EFznKNv9tQUsqQrnuQ2y6ZVfqq5UxvZ3hKF/JlN/Ff7xw==} + '@tiptap/extension-strike@3.15.3': + resolution: {integrity: sha512-Y1P3eGNY7RxQs2BcR6NfLo9VfEOplXXHAqkOM88oowWWOE7dMNeFFZM9H8HNxoQgXJ7H0aWW9B7ZTWM9hWli2Q==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-subscript@3.13.0': - resolution: {integrity: sha512-8Lq1ATTDUyolue42UbWXAotHPY4Y0r6pMTJyZ9Dqxbv5VrlBk6XeApkGwq6etBXMUsENJycLHlBk3PVqhzGrfw==} + '@tiptap/extension-subscript@3.15.3': + resolution: {integrity: sha512-XkWBgLm1dqV+fP7OrnU1rOozdMO+EFq1gkWJ2+OZo4iN+zsWXIFqlUvDsB4w761foX1jxyzyZeCX9Y16XmeB4Q==} peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 - '@tiptap/extension-superscript@3.13.0': - resolution: {integrity: sha512-ljeaxgPy85IyRCYItKtd23fKmKlHbABq/sP4QGZ5D0PRYX5jF1dt8SEVVkDaoUu7YATRVa7MKl/NzKmTuVStjQ==} + '@tiptap/extension-superscript@3.15.3': + resolution: {integrity: sha512-DAZ7ezI/Y065s3p6i9w65yb/FqUW8BuZkep+uKFUs2K0frrvmbpxREjmUyXjYRC1oB4KRGKV7wfP7F4XFE/4QQ==} peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 - '@tiptap/extension-table@3.13.0': - resolution: {integrity: sha512-LcH9KE4QBUJ6IPwt1Uo5iU7zatFjUUvXbctIu2fKQ9nqJ7nNSFxRhkNyporVFkTWYH7/rb0qMoF1VxSUGefG5w==} + '@tiptap/extension-table@3.15.3': + resolution: {integrity: sha512-dJk0u2JX1J/3x/ps641qdxQPOiie5txQhs2M1srgDeeFu//ORCePAxryJCw1bgf0TEVwFWwFTCtcOFR5SSgMZQ==} peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 - '@tiptap/extension-text-align@3.13.0': - resolution: {integrity: sha512-hebIus9tdXWb+AmhO+LTeUxZLdb0tqwdeaL/0wYxJQR5DeCTlJe6huXacMD/BkmnlEpRhxzQH0FrmXAd0d4Wgg==} + '@tiptap/extension-text-align@3.15.3': + resolution: {integrity: sha512-hkLeEKm44aqimyjv+D8JUxzDG/iNjDrSCGvGrMOPcpaKn4f8C5z1EKnEufT61RitNPBAxQMXUhmGQUNrmlICmQ==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-text-style@3.13.0': - resolution: {integrity: sha512-M7ob3pfYNYgFPihncEp33r9477hXQgC8j3iU8BsewvPlSx2bMSy5jp2XHDXyEX8dV6flr7acH4GkXXw+DHpaPA==} + '@tiptap/extension-text-style@3.15.3': + resolution: {integrity: sha512-/M7fuGRPVkeM14rQ1bNiLZUs2N+FuVhIsLEwNKKk7GaTGKHzmkC1b2COmbICivuFYf90KWzaG0R+Pm7cnW6KaA==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-text@3.13.0': - resolution: {integrity: sha512-VcZIna93rixw7hRkHGCxDbL3kvJWi80vIT25a2pXg0WP1e7Pi3nBYvZIL4SQtkbBCji9EHrbZx3p8nNPzfazYw==} + '@tiptap/extension-text@3.15.3': + resolution: {integrity: sha512-MhkBz8ZvrqOKtKNp+ZWISKkLUlTrDR7tbKZc2OnNcUTttL9dz0HwT+cg91GGz19fuo7ttDcfsPV6eVmflvGToA==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-typography@3.13.0': - resolution: {integrity: sha512-Pvxc0Mu3fIgcqOVpU5DqK55F+/ShvX020HmbsPY+Z7SED9fkan5QVn3n2nm13A2TQ+RWDlPAnHe7Gh0d/KsL5Q==} + '@tiptap/extension-typography@3.15.3': + resolution: {integrity: sha512-BIpoSEIh1rB5pJtEmDbksRhRxy3og52CvYcG9EA8807WnCvLqgXXUEAYFZ0spbHhmMD0V5EwnHJOR1hHBVF4ww==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-underline@3.13.0': - resolution: {integrity: sha512-VDQi+UYw0tFnfghpthJTFmtJ3yx90kXeDwFvhmT8G+O+si5VmP05xYDBYBmYCix5jqKigJxEASiBL0gYOgMDEg==} + '@tiptap/extension-underline@3.15.3': + resolution: {integrity: sha512-r/IwcNN0W366jGu4Y0n2MiFq9jGa4aopOwtfWO4d+J0DyeS2m7Go3+KwoUqi0wQTiVU74yfi4DF6eRsMQ9/iHQ==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extension-unique-id@3.13.0': - resolution: {integrity: sha512-2L5cH3QnEtgUHLVagLVt5SVUFSeoz5KQktGDHPfM64oO8KxM1C9USHF+fd5fGKC6kM8t1RSuBfHxA+ZOZnAzDg==} + '@tiptap/extension-unique-id@3.15.3': + resolution: {integrity: sha512-QPkYkmeymoMq87rQBY6hnc6m9z+JiD+8Z66XifP9w4WKPAF4DAMkhtrMXyR07acMSNbtdTyelbDYVM1Hb0vi7Q==} peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 - '@tiptap/extension-youtube@3.13.0': - resolution: {integrity: sha512-KG6NtdpK9VheacN4imjhDJ8G1V2tJZd/LRr+QID8dYEMQe9vKbqIXgA0kO91t+f+iH8NwgNPmi3a/BQogvoqJg==} + '@tiptap/extension-youtube@3.15.3': + resolution: {integrity: sha512-D/kohNEdXC54sGpzJyXa57uVrOvh3Clf+6OZL29fuewxCDmIrOOpeGlc96oeerGZoaIcoVst948mpgo0KwRrzA==} peerDependencies: - '@tiptap/core': ^3.13.0 + '@tiptap/core': ^3.15.3 - '@tiptap/extensions@3.13.0': - resolution: {integrity: sha512-i7O0ptSibEtTy+2PIPsNKEvhTvMaFJg1W4Oxfnbuxvaigs7cJV9Q0lwDUcc7CPsNw2T1+44wcxg431CzTvdYoA==} + '@tiptap/extensions@3.15.3': + resolution: {integrity: sha512-ycx/BgxR4rc9tf3ZyTdI98Z19yKLFfqM3UN+v42ChuIwkzyr9zyp7kG8dB9xN2lNqrD+5y/HyJobz/VJ7T90gA==} peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 - '@tiptap/html@3.13.0': - resolution: {integrity: sha512-WAwb2FiXkvnCsa7CjLSK3cOihL+M6vu3cP1D+Bfcgy0c4DP78tDRny2z6crDUj6b5CvOejyxj2iqhV48gxiDMA==} + '@tiptap/html@3.15.3': + resolution: {integrity: sha512-ftoWrgev05gDyor3YtJ5LJ0KHb/CKTR45zltGB9/cn+3IAOGuDrhmd8qO3o+E2VbsKR50yaiOCxtS36HYM9tQA==} peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 happy-dom: ^20.0.2 - '@tiptap/pm@3.13.0': - resolution: {integrity: sha512-WKR4ucALq+lwx0WJZW17CspeTpXorbIOpvKv5mulZica6QxqfMhn8n1IXCkDws/mCoLRx4Drk5d377tIjFNsvQ==} + '@tiptap/pm@3.15.3': + resolution: {integrity: sha512-Zm1BaU1TwFi3CQiisxjgnzzIus+q40bBKWLqXf6WEaus8Z6+vo1MT2pU52dBCMIRaW9XNDq3E5cmGtMc1AlveA==} - '@tiptap/react@3.13.0': - resolution: {integrity: sha512-VqpqNZ9qtPr3pWK4NsZYxXgLSEiAnzl6oS7tEGmkkvJbcGSC+F7R13Xc9twv/zT5QCLxaHdEbmxHbuAIkrMgJQ==} + '@tiptap/react@3.15.3': + resolution: {integrity: sha512-XvouB+Hrqw8yFmZLPEh+HWlMeRSjZfHSfWfWuw5d8LSwnxnPeu3Bg/rjHrRrdwb+7FumtzOnNWMorpb/PSOttQ==} peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@3.13.0': - resolution: {integrity: sha512-Ojn6sRub04CRuyQ+9wqN62JUOMv+rG1vXhc2s6DCBCpu28lkCMMW+vTe7kXJcEdbot82+5swPbERw9vohswFzg==} + '@tiptap/starter-kit@3.15.3': + resolution: {integrity: sha512-ia+eQr9Mt1ln2UO+kK4kFTJOrZK4GhvZXFjpCCYuHtco3rhr2fZAIxEEY4cl/vo5VO5WWyPqxhkFeLcoWmNjSw==} - '@tiptap/suggestion@3.13.0': - resolution: {integrity: sha512-IXNvyLITpPiuXHn/q1ntztPYJZMFjPAokKj+OQz3MFNYlzAX3I409KD/EwwCubisRIAFiNX0ZjIIXxxZ3AhFTw==} + '@tiptap/suggestion@3.15.3': + resolution: {integrity: sha512-+CbaHhPfKUe+fNpUIQaOPhh6xI+xL5jbK1zw++U+CZIRrVAAmHRhO+D0O2HdiE1RK7596y8bRqMiB2CRHF7emA==} peerDependencies: - '@tiptap/core': ^3.13.0 - '@tiptap/pm': ^3.13.0 + '@tiptap/core': ^3.15.3 + '@tiptap/pm': ^3.15.3 '@tiptap/y-tiptap@3.0.1': resolution: {integrity: sha512-F3hj5X77ckmyIywbCQpKgyX3xKra2/acJPWaV5R9wqp0cUPBmm62FYbkQ6HaqxH1VhCkUhhAZcDSQjbjj7tnWw==} @@ -7525,11 +7507,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lib0@0.2.108: - resolution: {integrity: sha512-+3eK/B0SqYoZiQu9fNk4VEc6EX8cb0Li96tPGKgugzoGj/OdRdREtuTLvUW+mtinoB2mFiJjSqOJBIaMkAGhxQ==} - engines: {node: '>=16'} - hasBin: true - lib0@0.2.114: resolution: {integrity: sha512-gcxmNFzA4hv8UYi8j43uPlQ7CGcyMJ2KQb5kZASw6SnAKAf10hK12i2fjrS3Cl/ugZa5Ui6WwIu1/6MIXiHttQ==} engines: {node: '>=16'} @@ -7972,6 +7949,7 @@ packages: next@14.2.10: resolution: {integrity: sha512-sDDExXnh33cY3RkS9JuFEKaS4HmlWmDKP1VJioucCG6z5KuA008DPsDZOzi8UfqEk3Ii+2NCQSJrfbEWtZZfww==} engines: {node: '>=18.17.0'} + deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details. hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -9969,6 +9947,7 @@ packages: whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} @@ -10189,8 +10168,8 @@ packages: resolution: {integrity: sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==} engines: {node: '>=12'} - yjs@13.6.27: - resolution: {integrity: sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==} + yjs@13.6.29: + resolution: {integrity: sha512-kHqDPdltoXH+X4w1lVmMtddE3Oeqq48nM40FD5ojTd8xYhQpzIDcfE2keMSU5bAgRPJBe225WTUdyUgj1DtbiQ==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} yn@3.1.1: @@ -12541,19 +12520,10 @@ snapshots: fastq: 1.17.1 glob: 11.0.1 - '@floating-ui/core@1.5.3': - dependencies: - '@floating-ui/utils': 0.2.8 - '@floating-ui/core@1.7.3': dependencies: '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.6.3': - dependencies: - '@floating-ui/core': 1.5.3 - '@floating-ui/utils': 0.2.8 - '@floating-ui/dom@1.7.3': dependencies: '@floating-ui/core': 1.7.3 @@ -12561,7 +12531,7 @@ snapshots: '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/dom': 1.6.3 + '@floating-ui/dom': 1.7.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -12577,57 +12547,57 @@ snapshots: '@floating-ui/utils@0.2.8': {} - '@hocuspocus/common@3.4.1': + '@hocuspocus/common@3.4.3': dependencies: lib0: 0.2.114 - '@hocuspocus/extension-redis@3.4.1(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/extension-redis@3.4.3(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29)': dependencies: - '@hocuspocus/server': 3.4.1(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@hocuspocus/server': 3.4.3(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29) '@sesamecare-oss/redlock': 1.4.0(ioredis@5.8.2) ioredis: 5.8.2 kleur: 4.1.5 lodash.debounce: 4.0.8 - y-protocols: 1.0.6(yjs@13.6.27) - yjs: 13.6.27 + y-protocols: 1.0.6(yjs@13.6.29) + yjs: 13.6.29 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@hocuspocus/provider@3.4.1(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/provider@3.4.3(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29)': dependencies: - '@hocuspocus/common': 3.4.1 + '@hocuspocus/common': 3.4.3 '@lifeomic/attempt': 3.0.3 lib0: 0.2.114 ws: 8.18.3 - y-protocols: 1.0.6(yjs@13.6.27) - yjs: 13.6.27 + y-protocols: 1.0.6(yjs@13.6.29) + yjs: 13.6.29 transitivePeerDependencies: - bufferutil - utf-8-validate - '@hocuspocus/server@3.4.1(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/server@3.4.3(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29)': dependencies: - '@hocuspocus/common': 3.4.1 + '@hocuspocus/common': 3.4.3 async-lock: 1.4.1 async-mutex: 0.5.0 kleur: 4.1.5 lib0: 0.2.114 ws: 8.18.3 - y-protocols: 1.0.6(yjs@13.6.27) - yjs: 13.6.27 + y-protocols: 1.0.6(yjs@13.6.29) + yjs: 13.6.29 transitivePeerDependencies: - bufferutil - utf-8-validate - '@hocuspocus/transformer@3.4.1(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(y-prosemirror@1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': + '@hocuspocus/transformer@3.4.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)(y-prosemirror@1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29)': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 - '@tiptap/starter-kit': 3.13.0 - y-prosemirror: 1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) - yjs: 13.6.27 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 + '@tiptap/starter-kit': 3.15.3 + y-prosemirror: 1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29) + yjs: 13.6.29 '@humanfs/core@0.19.1': {} @@ -14529,200 +14499,195 @@ snapshots: '@tanstack/query-core': 5.80.6 react: 18.3.1 - '@tiptap/core@3.13.0(@tiptap/pm@3.13.0)': + '@tiptap/core@3.15.3(@tiptap/pm@3.15.3)': dependencies: - '@tiptap/pm': 3.13.0 + '@tiptap/pm': 3.15.3 - '@tiptap/extension-blockquote@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-blockquote@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-bold@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-bold@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-bubble-menu@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)': + '@tiptap/extension-bubble-menu@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)': dependencies: '@floating-ui/dom': 1.7.3 - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 optional: true - '@tiptap/extension-bullet-list@3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))': + '@tiptap/extension-bullet-list@3.15.3(@tiptap/extension-list@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/extension-list': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + '@tiptap/extension-list': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) - '@tiptap/extension-character-count@2.14.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)': + '@tiptap/extension-code-block@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 - '@tiptap/extension-code-block@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)': + '@tiptap/extension-code@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-code@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-collaboration-caret@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 + '@tiptap/y-tiptap': 3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29) - '@tiptap/extension-collaboration-caret@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))': + '@tiptap/extension-collaboration@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29)': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 - '@tiptap/y-tiptap': 3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 + '@tiptap/y-tiptap': 3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29) + yjs: 13.6.29 - '@tiptap/extension-collaboration@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27))(yjs@13.6.27)': + '@tiptap/extension-color@3.15.3(@tiptap/extension-text-style@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 - '@tiptap/y-tiptap': 3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27) - yjs: 13.6.27 + '@tiptap/extension-text-style': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) - '@tiptap/extension-color@3.13.0(@tiptap/extension-text-style@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)))': + '@tiptap/extension-document@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/extension-text-style': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-document@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-dropcursor@3.15.3(@tiptap/extensions@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/extensions': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) - '@tiptap/extension-dropcursor@3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))': - dependencies: - '@tiptap/extensions': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) - - '@tiptap/extension-floating-menu@3.13.0(@floating-ui/dom@1.7.3)(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)': + '@tiptap/extension-floating-menu@3.15.3(@floating-ui/dom@1.7.3)(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)': dependencies: '@floating-ui/dom': 1.7.3 - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 optional: true - '@tiptap/extension-gapcursor@3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))': + '@tiptap/extension-gapcursor@3.15.3(@tiptap/extensions@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/extensions': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + '@tiptap/extensions': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) - '@tiptap/extension-hard-break@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-hard-break@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-heading@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-heading@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-highlight@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-highlight@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-history@3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))': + '@tiptap/extension-history@3.15.3(@tiptap/extensions@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/extensions': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + '@tiptap/extensions': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) - '@tiptap/extension-horizontal-rule@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)': + '@tiptap/extension-horizontal-rule@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 - '@tiptap/extension-image@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-image@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-italic@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-italic@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-link@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)': + '@tiptap/extension-link@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 linkifyjs: 4.3.2 - '@tiptap/extension-list-item@3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))': + '@tiptap/extension-list-item@3.15.3(@tiptap/extension-list@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/extension-list': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + '@tiptap/extension-list': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) - '@tiptap/extension-list-keymap@3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))': + '@tiptap/extension-list-keymap@3.15.3(@tiptap/extension-list@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/extension-list': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + '@tiptap/extension-list': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) - '@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)': + '@tiptap/extension-list@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 - '@tiptap/extension-ordered-list@3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))': + '@tiptap/extension-ordered-list@3.15.3(@tiptap/extension-list@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/extension-list': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + '@tiptap/extension-list': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) - '@tiptap/extension-paragraph@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-paragraph@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-placeholder@3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0))': + '@tiptap/extension-placeholder@3.15.3(@tiptap/extensions@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/extensions': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + '@tiptap/extensions': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) - '@tiptap/extension-strike@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-strike@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-subscript@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)': + '@tiptap/extension-subscript@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 - '@tiptap/extension-superscript@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)': + '@tiptap/extension-superscript@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 - '@tiptap/extension-table@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)': + '@tiptap/extension-table@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 - '@tiptap/extension-text-align@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-text-align@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-text-style@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-text-style@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-text@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-text@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-typography@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-typography@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-underline@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-underline@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extension-unique-id@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)': + '@tiptap/extension-unique-id@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 uuid: 10.0.0 - '@tiptap/extension-youtube@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))': + '@tiptap/extension-youtube@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) - '@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)': + '@tiptap/extensions@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 - '@tiptap/html@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(happy-dom@20.0.10)': + '@tiptap/html@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)(happy-dom@20.0.10)': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 happy-dom: 20.0.10 - '@tiptap/pm@3.13.0': + '@tiptap/pm@3.15.3': dependencies: prosemirror-changeset: 2.3.1 prosemirror-collab: 1.3.1 @@ -14743,10 +14708,10 @@ snapshots: prosemirror-transform: 1.10.4 prosemirror-view: 1.40.0 - '@tiptap/react@3.13.0(@floating-ui/dom@1.7.3)(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@tiptap/react@3.15.3(@floating-ui/dom@1.7.3)(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 '@types/react': 18.3.12 '@types/react-dom': 18.3.1 '@types/use-sync-external-store': 0.0.6 @@ -14755,51 +14720,51 @@ snapshots: react-dom: 18.3.1(react@18.3.1) use-sync-external-store: 1.6.0(react@18.3.1) optionalDependencies: - '@tiptap/extension-bubble-menu': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) - '@tiptap/extension-floating-menu': 3.13.0(@floating-ui/dom@1.7.3)(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) + '@tiptap/extension-bubble-menu': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) + '@tiptap/extension-floating-menu': 3.15.3(@floating-ui/dom@1.7.3)(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) transitivePeerDependencies: - '@floating-ui/dom' - '@tiptap/starter-kit@3.13.0': + '@tiptap/starter-kit@3.15.3': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/extension-blockquote': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) - '@tiptap/extension-bold': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) - '@tiptap/extension-bullet-list': 3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)) - '@tiptap/extension-code': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) - '@tiptap/extension-code-block': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) - '@tiptap/extension-document': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) - '@tiptap/extension-dropcursor': 3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)) - '@tiptap/extension-gapcursor': 3.13.0(@tiptap/extensions@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)) - '@tiptap/extension-hard-break': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) - '@tiptap/extension-heading': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) - '@tiptap/extension-horizontal-rule': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) - '@tiptap/extension-italic': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) - '@tiptap/extension-link': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) - '@tiptap/extension-list': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) - '@tiptap/extension-list-item': 3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)) - '@tiptap/extension-list-keymap': 3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)) - '@tiptap/extension-ordered-list': 3.13.0(@tiptap/extension-list@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)) - '@tiptap/extension-paragraph': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) - '@tiptap/extension-strike': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) - '@tiptap/extension-text': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) - '@tiptap/extension-underline': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0)) - '@tiptap/extensions': 3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/extension-blockquote': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) + '@tiptap/extension-bold': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) + '@tiptap/extension-bullet-list': 3.15.3(@tiptap/extension-list@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)) + '@tiptap/extension-code': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) + '@tiptap/extension-code-block': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) + '@tiptap/extension-document': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) + '@tiptap/extension-dropcursor': 3.15.3(@tiptap/extensions@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)) + '@tiptap/extension-gapcursor': 3.15.3(@tiptap/extensions@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)) + '@tiptap/extension-hard-break': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) + '@tiptap/extension-heading': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) + '@tiptap/extension-horizontal-rule': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) + '@tiptap/extension-italic': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) + '@tiptap/extension-link': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) + '@tiptap/extension-list': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) + '@tiptap/extension-list-item': 3.15.3(@tiptap/extension-list@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)) + '@tiptap/extension-list-keymap': 3.15.3(@tiptap/extension-list@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)) + '@tiptap/extension-ordered-list': 3.15.3(@tiptap/extension-list@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)) + '@tiptap/extension-paragraph': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) + '@tiptap/extension-strike': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) + '@tiptap/extension-text': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) + '@tiptap/extension-underline': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3)) + '@tiptap/extensions': 3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 - '@tiptap/suggestion@3.13.0(@tiptap/core@3.13.0(@tiptap/pm@3.13.0))(@tiptap/pm@3.13.0)': + '@tiptap/suggestion@3.15.3(@tiptap/core@3.15.3(@tiptap/pm@3.15.3))(@tiptap/pm@3.15.3)': dependencies: - '@tiptap/core': 3.13.0(@tiptap/pm@3.13.0) - '@tiptap/pm': 3.13.0 + '@tiptap/core': 3.15.3(@tiptap/pm@3.15.3) + '@tiptap/pm': 3.15.3 - '@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27)': + '@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29)': dependencies: lib0: 0.2.114 prosemirror-model: 1.25.1 prosemirror-state: 1.4.3 prosemirror-view: 1.40.0 - y-protocols: 1.0.6(yjs@13.6.27) - yjs: 13.6.27 + y-protocols: 1.0.6(yjs@13.6.29) + yjs: 13.6.29 '@tokenizer/inflate@0.3.1': dependencies: @@ -18574,10 +18539,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lib0@0.2.108: - dependencies: - isomorphic.js: 0.2.5 - lib0@0.2.114: dependencies: isomorphic.js: 0.2.5 @@ -21374,24 +21335,24 @@ snapshots: xtend@4.0.2: {} - y-indexeddb@9.0.12(yjs@13.6.27): + y-indexeddb@9.0.12(yjs@13.6.29): dependencies: lib0: 0.2.88 - yjs: 13.6.27 + yjs: 13.6.29 - y-prosemirror@1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.27))(yjs@13.6.27): + y-prosemirror@1.3.7(prosemirror-model@1.25.1)(prosemirror-state@1.4.3)(prosemirror-view@1.40.0)(y-protocols@1.0.6(yjs@13.6.29))(yjs@13.6.29): dependencies: lib0: 0.2.114 prosemirror-model: 1.25.1 prosemirror-state: 1.4.3 prosemirror-view: 1.40.0 - y-protocols: 1.0.6(yjs@13.6.27) - yjs: 13.6.27 + y-protocols: 1.0.6(yjs@13.6.29) + yjs: 13.6.29 - y-protocols@1.0.6(yjs@13.6.27): + y-protocols@1.0.6(yjs@13.6.29): dependencies: lib0: 0.2.114 - yjs: 13.6.27 + yjs: 13.6.29 y18n@4.0.3: {} @@ -21441,9 +21402,9 @@ snapshots: buffer-crc32: 0.2.13 pend: 1.2.0 - yjs@13.6.27: + yjs@13.6.29: dependencies: - lib0: 0.2.108 + lib0: 0.2.114 yn@3.1.1: {} From 974bcea6903435951c2b6a778e56fcd916810767 Mon Sep 17 00:00:00 2001 From: Arek Nawo Date: Fri, 9 Jan 2026 00:33:28 +0100 Subject: [PATCH 17/21] feat: Migrate tippy.js menus to Floating UI --- apps/client/package.json | 1 - .../emoji-menu/render-emoji-items.ts | 105 ++++-- .../components/mention/mention-suggestion.ts | 103 ++++-- .../components/slash-menu/render-items.ts | 83 ++++- .../components/subpages/subpages-menu.tsx | 14 +- .../components/table/table-cell-menu.tsx | 25 +- .../editor/components/table/table-menu.tsx | 69 ++-- packages/editor-ext/src/index.ts | 1 - .../tippy-bubble-menu/bubble-menu-plugin.ts | 349 ------------------ .../tippy-bubble-menu/bubble-menu-react.tsx | 72 ---- .../src/lib/tippy-bubble-menu/index.ts | 1 - pnpm-lock.yaml | 15 - 12 files changed, 250 insertions(+), 588 deletions(-) delete mode 100644 packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-plugin.ts delete mode 100644 packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-react.tsx delete mode 100644 packages/editor-ext/src/lib/tippy-bubble-menu/index.ts diff --git a/apps/client/package.json b/apps/client/package.json index 02c80183..ba98842d 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -55,7 +55,6 @@ "react-router-dom": "^7.0.1", "semver": "^7.7.2", "socket.io-client": "^4.8.1", - "tippy.js": "^6.3.7", "tiptap-extension-global-drag-handle": "^0.1.18", "zod": "^3.25.76" }, diff --git a/apps/client/src/features/editor/components/emoji-menu/render-emoji-items.ts b/apps/client/src/features/editor/components/emoji-menu/render-emoji-items.ts index 82fb24a9..0ae5e24a 100644 --- a/apps/client/src/features/editor/components/emoji-menu/render-emoji-items.ts +++ b/apps/client/src/features/editor/components/emoji-menu/render-emoji-items.ts @@ -1,16 +1,41 @@ import { ReactRenderer, useEditor } from "@tiptap/react"; import EmojiList from "./emoji-list"; -import tippy from "tippy.js"; import { init } from "emoji-mart"; +import { + autoUpdate, + computePosition, + flip, + offset, + shift, +} from "@floating-ui/dom"; const renderEmojiItems = () => { let component: ReactRenderer | null = null; - let popup: any | null = null; + let popup: HTMLDivElement | null = null; + let cleanup: (() => void) | null = null; + let getReferenceClientRect: (() => DOMRect) | null = null; + + const destroy = () => { + if (cleanup) { + cleanup(); + cleanup = null; + } + + if (popup) { + popup.remove(); + popup = null; + } + + if (component) { + component.destroy(); + component = null; + } + }; return { onBeforeStart: (props: { editor: ReturnType; - clientRect: DOMRect; + clientRect: () => DOMRect; }) => { init({ data: async () => (await import("@emoji-mart/data")).default, @@ -25,51 +50,61 @@ const renderEmojiItems = () => { return; } - // @ts-ignore - popup = tippy("body", { - getReferenceClientRect: props.clientRect, - appendTo: () => document.body, - content: component.element, - showOnCreate: true, - interactive: true, - trigger: "manual", - placement: "bottom", + getReferenceClientRect = props.clientRect; + popup = document.createElement("div"); + popup.style.zIndex = "9999"; + popup.style.position = "absolute"; + popup.style.top = "0"; + popup.style.left = "0"; + popup.appendChild(component.element); + document.body.appendChild(popup); + + const virtualElement = { + getBoundingClientRect: () => { + return getReferenceClientRect + ? getReferenceClientRect() + : new DOMRect(0, 0, 0, 0); + }, + }; + + cleanup = autoUpdate(virtualElement, popup, () => { + if (!popup) return; + + computePosition(virtualElement, popup, { + placement: "bottom-start", + middleware: [offset(10), flip(), shift()], + }).then(({ x, y }) => { + if (!popup) return; + + Object.assign(popup.style, { + transform: `translate(${x}px, ${y}px)`, + }); + }); }); }, onStart: (props: { editor: ReturnType; - clientRect: DOMRect; + clientRect: () => DOMRect; }) => { - component?.updateProps({...props, isLoading: false}); + component?.updateProps({ ...props, isLoading: false }); - if (!props.clientRect) { - return; + if (props.clientRect) { + getReferenceClientRect = props.clientRect; } - - popup && - popup[0].setProps({ - getReferenceClientRect: props.clientRect, - }); }, onUpdate: (props: { editor: ReturnType; - clientRect: DOMRect; + clientRect: () => DOMRect; }) => { component?.updateProps(props); - if (!props.clientRect) { - return; + if (props.clientRect) { + getReferenceClientRect = props.clientRect; } - - popup && - popup[0].setProps({ - getReferenceClientRect: props.clientRect, - }); }, onKeyDown: (props: { event: KeyboardEvent }) => { if (props.event.key === "Escape") { - popup?.[0].hide(); - component?.destroy() + destroy(); return true; } @@ -78,13 +113,7 @@ const renderEmojiItems = () => { return component?.ref?.onKeyDown(props); }, onExit: () => { - if (popup && !popup[0]?.state.isDestroyed) { - popup[0]?.destroy(); - } - - if (component) { - component?.destroy(); - } + destroy(); }, }; }; diff --git a/apps/client/src/features/editor/components/mention/mention-suggestion.ts b/apps/client/src/features/editor/components/mention/mention-suggestion.ts index fe2adf26..7c7408ad 100644 --- a/apps/client/src/features/editor/components/mention/mention-suggestion.ts +++ b/apps/client/src/features/editor/components/mention/mention-suggestion.ts @@ -1,5 +1,11 @@ import { ReactRenderer, useEditor } from "@tiptap/react"; -import tippy from "tippy.js"; +import { + autoUpdate, + computePosition, + flip, + offset, + shift, +} from "@floating-ui/dom"; import MentionList from "@/features/editor/components/mention/mention-list.tsx"; function getWhitespaceCount(query: string) { @@ -9,16 +15,27 @@ function getWhitespaceCount(query: string) { const mentionRenderItems = () => { let component: ReactRenderer | null = null; - let popup: any | null = null; + let activeClientRect: (() => DOMRect) | null = null; + let updatePositionCleanup: (() => void) | null = null; + + const destroy = () => { + updatePositionCleanup?.(); + updatePositionCleanup = null; + component?.destroy(); + if (component?.element?.parentNode) { + component.element.parentNode.removeChild(component.element); + } + component = null; + }; return { onStart: (props: { editor: ReturnType; - clientRect: DOMRect; + clientRect: () => DOMRect; query: string; }) => { // query must not start with a whitespace - if (props.query.charAt(0) === ' '){ + if (props.query.charAt(0) === " ") { return; } @@ -37,37 +54,63 @@ const mentionRenderItems = () => { return; } - // @ts-ignore - popup = tippy("body", { - getReferenceClientRect: props.clientRect, - appendTo: () => document.body, - content: component.element, - showOnCreate: true, - interactive: true, - trigger: "manual", - placement: "bottom-start", - }); + activeClientRect = props.clientRect; + + const { element } = component; + document.body.appendChild(element); + + updatePositionCleanup = autoUpdate( + { + getBoundingClientRect: () => + activeClientRect ? activeClientRect() : new DOMRect(), + }, + element, + () => { + if (!component?.element) return; + computePosition( + { + getBoundingClientRect: () => { + return activeClientRect ? activeClientRect() : new DOMRect(); + }, + }, + element, + { + placement: "bottom-start", + middleware: [offset(0), flip(), shift()], + } + ).then(({ x, y }) => { + Object.assign(element.style, { + left: `${x}px`, + top: `${y}px`, + position: "absolute", + zIndex: "9999", + }); + }); + } + ); }, onUpdate: (props: { editor: ReturnType; - clientRect: DOMRect; + clientRect: () => DOMRect; query: string; }) => { // query must not start with a whitespace - if (props.query.charAt(0) === ' '){ - component?.destroy(); + if (props.query.charAt(0) === " ") { + destroy(); return; } // only update component if popup is not destroyed - if (!popup?.[0].state.isDestroyed) { - component?.updateProps(props); + if (component) { + component.updateProps(props); } if (!props || !props.clientRect) { return; } + activeClientRect = props.clientRect; + const whitespaceCount = getWhitespaceCount(props.query); // destroy component if space is greater 3 without a match @@ -76,37 +119,23 @@ const mentionRenderItems = () => { //@ts-ignore props.editor.storage.mentionItems.length === 0 ) { - popup?.[0]?.destroy(); - component?.destroy(); + destroy(); return; } - - popup && - !popup?.[0].state.isDestroyed && - popup?.[0].setProps({ - getReferenceClientRect: props.clientRect, - }); }, onKeyDown: (props: { event: KeyboardEvent }) => { if (props.event.key) if ( props.event.key === "Escape" || - (props.event.key === "Enter" && !popup?.[0].state.isShown) + (props.event.key === "Enter" && !component) ) { - popup?.[0].destroy(); - component?.destroy(); + destroy(); return false; } return (component?.ref as any)?.onKeyDown(props); }, onExit: () => { - if (popup && !popup?.[0].state.isDestroyed) { - popup[0].destroy(); - } - - if (component) { - component.destroy(); - } + destroy(); }, }; }; diff --git a/apps/client/src/features/editor/components/slash-menu/render-items.ts b/apps/client/src/features/editor/components/slash-menu/render-items.ts index db6424e8..057e8214 100644 --- a/apps/client/src/features/editor/components/slash-menu/render-items.ts +++ b/apps/client/src/features/editor/components/slash-menu/render-items.ts @@ -1,10 +1,35 @@ import { ReactRenderer, useEditor } from "@tiptap/react"; import CommandList from "@/features/editor/components/slash-menu/command-list"; -import tippy from "tippy.js"; +import { + autoUpdate, + computePosition, + flip, + offset, + shift, +} from "@floating-ui/dom"; const renderItems = () => { let component: ReactRenderer | null = null; - let popup: any | null = null; + let popup: HTMLElement | null = null; + let cleanup: (() => void) | null = null; + let getReferenceClientRect: (() => DOMRect) | null = null; + + const updatePosition = () => { + if (!popup || !getReferenceClientRect) return; + + // @ts-ignore + const rect = getReferenceClientRect(); + + computePosition({ getBoundingClientRect: () => rect }, popup, { + placement: "bottom-start", + middleware: [offset(0), flip(), shift()], + }).then(({ x, y }) => { + if (popup) { + popup.style.left = `${x}px`; + popup.style.top = `${y}px`; + } + }); + }; return { onStart: (props: { @@ -21,15 +46,29 @@ const renderItems = () => { } // @ts-ignore - popup = tippy("body", { - getReferenceClientRect: props.clientRect, - appendTo: () => document.body, - content: component.element, - showOnCreate: true, - interactive: true, - trigger: "manual", - placement: "bottom-start", - }); + getReferenceClientRect = props.clientRect; + + popup = document.createElement("div"); + popup.style.zIndex = "9999"; + popup.style.position = "absolute"; + popup.style.top = "0"; + popup.style.left = "0"; + + document.body.appendChild(popup); + popup.appendChild(component.element); + + cleanup = autoUpdate( + // @ts-ignore + { + getBoundingClientRect: () => { + return getReferenceClientRect + ? getReferenceClientRect() + : new DOMRect(); + }, + }, + popup, + updatePosition + ); }, onUpdate: (props: { editor: ReturnType; @@ -41,14 +80,15 @@ const renderItems = () => { return; } - popup && - popup[0].setProps({ - getReferenceClientRect: props.clientRect, - }); + // @ts-ignore + getReferenceClientRect = props.clientRect; + updatePosition(); }, onKeyDown: (props: { event: KeyboardEvent }) => { if (props.event.key === "Escape") { - popup?.[0].hide(); + if (popup) { + popup.style.display = "none"; + } return true; } @@ -57,12 +97,19 @@ const renderItems = () => { return component?.ref?.onKeyDown(props); }, onExit: () => { - if (popup && !popup[0].state.isDestroyed) { - popup[0].destroy(); + if (cleanup) { + cleanup(); + cleanup = null; + } + + if (popup) { + popup.remove(); + popup = null; } if (component) { component.destroy(); + component = null; } }, }; diff --git a/apps/client/src/features/editor/components/subpages/subpages-menu.tsx b/apps/client/src/features/editor/components/subpages/subpages-menu.tsx index eb9bfd9d..9f0544e6 100644 --- a/apps/client/src/features/editor/components/subpages/subpages-menu.tsx +++ b/apps/client/src/features/editor/components/subpages/subpages-menu.tsx @@ -29,7 +29,7 @@ export const SubpagesMenu = React.memo( return editor.isActive("subpages"); }, - [editor], + [editor] ); const getReferenceClientRect = useCallback(() => { @@ -60,16 +60,6 @@ export const SubpagesMenu = React.memo( editor={editor} pluginKey={`subpages-menu`} updateDelay={0} - /* tippyOptions={{ - getReferenceClientRect, - offset: [0, 8], - zIndex: 99, - popperOptions: { - modifiers: [{ name: "flip", enabled: false }], - }, - plugins: [sticky], - sticky: "popper", - }}*/ shouldShow={shouldShow} > @@ -85,7 +75,7 @@ export const SubpagesMenu = React.memo( ); - }, + } ); export default SubpagesMenu; diff --git a/apps/client/src/features/editor/components/table/table-cell-menu.tsx b/apps/client/src/features/editor/components/table/table-cell-menu.tsx index 4f56c764..8af896b3 100644 --- a/apps/client/src/features/editor/components/table/table-cell-menu.tsx +++ b/apps/client/src/features/editor/components/table/table-cell-menu.tsx @@ -3,7 +3,7 @@ import { EditorMenuProps, ShouldShowProps, } from "@/features/editor/components/table/types/types.ts"; -import { isCellSelection, TiptapTippyBubbleMenu } from '@docmost/editor-ext'; +import { isCellSelection } from "@docmost/editor-ext"; import { ActionIcon, Tooltip } from "@mantine/core"; import { IconBoxMargin, @@ -15,6 +15,7 @@ import { import { useTranslation } from "react-i18next"; import { TableBackgroundColor } from "./table-background-color"; import { TableTextAlignment } from "./table-text-alignment"; +import { BubbleMenu } from "@tiptap/react/menus"; export const TableCellMenu = React.memo( ({ editor, appendTo }: EditorMenuProps): JSX.Element => { @@ -27,7 +28,7 @@ export const TableCellMenu = React.memo( return isCellSelection(state.selection); }, - [editor], + [editor] ); const mergeCells = useCallback(() => { @@ -51,16 +52,20 @@ export const TableCellMenu = React.memo( }, [editor]); return ( - { - return appendTo?.current; + appendTo={() => { + return appendTo?.current; + }} + ref={(element) => { + element.style.zIndex = "99"; + }} + options={{ + offset: { + mainAxis: 15, }, - offset: [0, 15], - zIndex: 99, }} shouldShow={shouldShow} > @@ -123,9 +128,9 @@ export const TableCellMenu = React.memo( - + ); - }, + } ); export default TableCellMenu; diff --git a/apps/client/src/features/editor/components/table/table-menu.tsx b/apps/client/src/features/editor/components/table/table-menu.tsx index 2cfe63c9..e54a06af 100644 --- a/apps/client/src/features/editor/components/table/table-menu.tsx +++ b/apps/client/src/features/editor/components/table/table-menu.tsx @@ -17,7 +17,8 @@ import { IconTableRow, IconTrashX, } from "@tabler/icons-react"; -import { isCellSelection, TiptapTippyBubbleMenu } from "@docmost/editor-ext"; +import { BubbleMenu } from "@tiptap/react/menus"; +import { isCellSelection } from "@docmost/editor-ext"; import { useTranslation } from "react-i18next"; export const TableMenu = React.memo( @@ -31,20 +32,28 @@ export const TableMenu = React.memo( return editor.isActive("table") && !isCellSelection(state.selection); }, - [editor], + [editor] ); - const getReferenceClientRect = useCallback(() => { + const getReferencedVirtualElement = useCallback(() => { const { selection } = editor.state; const predicate = (node: PMNode) => node.type.name === "table"; const parent = findParentNode(predicate)(selection); if (parent) { const dom = editor.view.nodeDOM(parent?.pos) as HTMLElement; - return dom.getBoundingClientRect(); + const rect = dom.getBoundingClientRect(); + return { + getBoundingClientRect: () => rect, + getClientRects: () => [rect], + }; } - return posToDOMRect(editor.view, selection.from, selection.to); + const rect = posToDOMRect(editor.view, selection.from, selection.to); + return { + getBoundingClientRect: () => rect, + getClientRects: () => [rect], + }; }, [editor]); const toggleHeaderColumn = useCallback(() => { @@ -84,35 +93,27 @@ export const TableMenu = React.memo( }, [editor]); return ( - { + element.style.zIndex = "99"; + }} + options={{ + placement: "top", + offset: { + mainAxis: 15, + }, + flip: { + fallbackPlacements: ["top", "bottom"], + padding: { top: 35 + 15, left: 8, right: 8, bottom: -Infinity }, + boundary: editor.options.element as HTMLElement, + }, + shift: { + padding: 8 + 15, + crossAxis: true, }, }} shouldShow={shouldShow} @@ -218,9 +219,9 @@ export const TableMenu = React.memo( - + ); - }, + } ); export default TableMenu; diff --git a/packages/editor-ext/src/index.ts b/packages/editor-ext/src/index.ts index d26592a2..3ff99083 100644 --- a/packages/editor-ext/src/index.ts +++ b/packages/editor-ext/src/index.ts @@ -23,4 +23,3 @@ export * from "./lib/subpages"; export * from "./lib/highlight"; export * from "./lib/heading/heading"; export * from "./lib/unique-id"; -export * from "./lib/tippy-bubble-menu"; diff --git a/packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-plugin.ts b/packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-plugin.ts deleted file mode 100644 index f9d6d092..00000000 --- a/packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-plugin.ts +++ /dev/null @@ -1,349 +0,0 @@ -// Source: https://github.com/ueberdosis/tiptap/blob/v2/packages/extension-bubble-menu/src/bubble-menu-plugin.ts - MIT -import { - Editor, - isNodeSelection, - isTextSelection, - posToDOMRect, -} from "@tiptap/core"; -import { EditorState, Plugin, PluginKey } from "@tiptap/pm/state"; -import { EditorView } from "@tiptap/pm/view"; -import tippy, { Instance, Props } from "tippy.js"; - -export interface BubbleMenuPluginProps { - /** - * The plugin key. - * @type {PluginKey | string} - * @default 'bubbleMenu' - */ - pluginKey: PluginKey | string; - - /** - * The editor instance. - */ - editor: Editor; - - /** - * The DOM element that contains your menu. - * @type {HTMLElement} - * @default null - */ - element: HTMLElement; - - /** - * The options for the tippy.js instance. - * @see https://atomiks.github.io/tippyjs/v6/all-props/ - */ - tippyOptions?: Partial; - - /** - * The delay in milliseconds before the menu should be updated. - * This can be useful to prevent performance issues. - * @type {number} - * @default 250 - */ - updateDelay?: number; - - /** - * A function that determines whether the menu should be shown or not. - * If this function returns `false`, the menu will be hidden, otherwise it will be shown. - */ - shouldShow?: - | ((props: { - editor: Editor; - element: HTMLElement; - view: EditorView; - state: EditorState; - oldState?: EditorState; - from: number; - to: number; - }) => boolean) - | null; -} - -export type BubbleMenuViewProps = BubbleMenuPluginProps & { - view: EditorView; -}; - -export class BubbleMenuView { - public editor: Editor; - - public element: HTMLElement; - - public view: EditorView; - - public preventHide = false; - - public tippy: Instance | undefined; - - public tippyOptions?: Partial; - - public updateDelay: number; - - private updateDebounceTimer: number | undefined; - - public shouldShow: Exclude = ({ - view, - state, - from, - to, - }) => { - const { doc, selection } = state; - const { empty } = selection; - - // Sometime check for `empty` is not enough. - // Doubleclick an empty paragraph returns a node size of 2. - // So we check also for an empty text size. - const isEmptyTextBlock = - !doc.textBetween(from, to).length && isTextSelection(state.selection); - - // When clicking on a element inside the bubble menu the editor "blur" event - // is called and the bubble menu item is focussed. In this case we should - // consider the menu as part of the editor and keep showing the menu - const isChildOfMenu = this.element.contains(document.activeElement); - - const hasEditorFocus = view.hasFocus() || isChildOfMenu; - - if ( - !hasEditorFocus || - empty || - isEmptyTextBlock || - !this.editor.isEditable - ) { - return false; - } - - return true; - }; - - constructor({ - editor, - element, - view, - tippyOptions = {}, - updateDelay = 250, - shouldShow, - }: BubbleMenuViewProps) { - this.editor = editor; - this.element = element; - this.view = view; - this.updateDelay = updateDelay; - - if (shouldShow) { - this.shouldShow = shouldShow; - } - - this.element.addEventListener("mousedown", this.mousedownHandler, { - capture: true, - }); - this.view.dom.addEventListener("dragstart", this.dragstartHandler); - this.editor.on("focus", this.focusHandler); - this.editor.on("blur", this.blurHandler); - this.tippyOptions = tippyOptions; - // Detaches menu content from its current parent - this.element.remove(); - this.element.style.visibility = "visible"; - } - - mousedownHandler = () => { - this.preventHide = true; - }; - - dragstartHandler = () => { - this.hide(); - }; - - focusHandler = () => { - // we use `setTimeout` to make sure `selection` is already updated - setTimeout(() => this.update(this.editor.view)); - }; - - blurHandler = ({ event }: { event: FocusEvent }) => { - if (this.preventHide) { - this.preventHide = false; - - return; - } - - if ( - event?.relatedTarget && - this.element.parentNode?.contains(event.relatedTarget as Node) - ) { - return; - } - - if (event?.relatedTarget === this.editor.view.dom) { - return; - } - - this.hide(); - }; - - tippyBlurHandler = (event: FocusEvent) => { - this.blurHandler({ event }); - }; - - createTooltip() { - const { element: editorElement } = this.editor.options; - //@ts-ignore - const editorIsAttached = !!editorElement.parentElement; - - this.element.tabIndex = 0; - - if (this.tippy || !editorIsAttached) { - return; - } - - //@ts-ignore - this.tippy = tippy(editorElement, { - duration: 0, - getReferenceClientRect: null, - content: this.element, - interactive: true, - trigger: "manual", - placement: "top", - hideOnClick: "toggle", - ...this.tippyOptions, - }); - - // maybe we have to hide tippy on its own blur event as well - if (this.tippy.popper.firstChild) { - (this.tippy.popper.firstChild as HTMLElement).addEventListener( - "blur", - this.tippyBlurHandler, - ); - } - } - - update(view: EditorView, oldState?: EditorState) { - const { state } = view; - const hasValidSelection = state.selection.from !== state.selection.to; - - if (this.updateDelay > 0 && hasValidSelection) { - this.handleDebouncedUpdate(view, oldState); - return; - } - - const selectionChanged = !oldState?.selection.eq(view.state.selection); - const docChanged = !oldState?.doc.eq(view.state.doc); - - this.updateHandler(view, selectionChanged, docChanged, oldState); - } - - handleDebouncedUpdate = (view: EditorView, oldState?: EditorState) => { - const selectionChanged = !oldState?.selection.eq(view.state.selection); - const docChanged = !oldState?.doc.eq(view.state.doc); - - if (!selectionChanged && !docChanged) { - return; - } - - if (this.updateDebounceTimer) { - clearTimeout(this.updateDebounceTimer); - } - - this.updateDebounceTimer = window.setTimeout(() => { - this.updateHandler(view, selectionChanged, docChanged, oldState); - }, this.updateDelay); - }; - - updateHandler = ( - view: EditorView, - selectionChanged: boolean, - docChanged: boolean, - oldState?: EditorState, - ) => { - const { state, composing } = view; - const { selection } = state; - - const isSame = !selectionChanged && !docChanged; - - if (composing || isSame) { - return; - } - - this.createTooltip(); - - // support for CellSelections - const { ranges } = selection; - const from = Math.min(...ranges.map((range) => range.$from.pos)); - const to = Math.max(...ranges.map((range) => range.$to.pos)); - - const shouldShow = this.shouldShow?.({ - editor: this.editor, - element: this.element, - view, - state, - oldState, - from, - to, - }); - - if (!shouldShow) { - this.hide(); - - return; - } - - this.tippy?.setProps({ - getReferenceClientRect: - this.tippyOptions?.getReferenceClientRect || - (() => { - if (isNodeSelection(state.selection)) { - let node = view.nodeDOM(from) as HTMLElement; - - if (node) { - const nodeViewWrapper = node.dataset.nodeViewWrapper - ? node - : node.querySelector("[data-node-view-wrapper]"); - - if (nodeViewWrapper) { - node = nodeViewWrapper.firstChild as HTMLElement; - } - - if (node) { - return node.getBoundingClientRect(); - } - } - } - - return posToDOMRect(view, from, to); - }), - }); - - this.show(); - }; - - show() { - this.tippy?.show(); - } - - hide() { - this.tippy?.hide(); - } - - destroy() { - if (this.tippy?.popper.firstChild) { - (this.tippy.popper.firstChild as HTMLElement).removeEventListener( - "blur", - this.tippyBlurHandler, - ); - } - this.tippy?.destroy(); - this.element.removeEventListener("mousedown", this.mousedownHandler, { - capture: true, - }); - this.view.dom.removeEventListener("dragstart", this.dragstartHandler); - this.editor.off("focus", this.focusHandler); - this.editor.off("blur", this.blurHandler); - } -} - -export const BubbleMenuPlugin = (options: BubbleMenuPluginProps) => { - return new Plugin({ - key: - typeof options.pluginKey === "string" - ? new PluginKey(options.pluginKey) - : options.pluginKey, - view: (view) => new BubbleMenuView({ view, ...options }), - }); -}; diff --git a/packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-react.tsx b/packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-react.tsx deleted file mode 100644 index d2f7b008..00000000 --- a/packages/editor-ext/src/lib/tippy-bubble-menu/bubble-menu-react.tsx +++ /dev/null @@ -1,72 +0,0 @@ -// Source: https://github.com/ueberdosis/tiptap/blob/v2/packages/react/src/BubbleMenu.tsx - MIT -import { BubbleMenuPlugin, BubbleMenuPluginProps } from "./bubble-menu-plugin"; -import React, { useEffect, useState } from "react"; -import { useCurrentEditor } from "@tiptap/react"; - -type Optional = Pick, K> & Omit; - -export type BubbleMenuProps = Omit< - Optional, - "element" | "editor" -> & { - editor: BubbleMenuPluginProps["editor"] | null; - className?: string; - children: React.ReactNode; - updateDelay?: number; -}; - -export const BubbleMenu = (props: BubbleMenuProps) => { - const [element, setElement] = useState(null); - const { editor: currentEditor } = useCurrentEditor(); - - useEffect(() => { - if (!element) { - return; - } - - if (props.editor?.isDestroyed || currentEditor?.isDestroyed) { - return; - } - - const { - pluginKey = "bubbleMenu", - editor, - tippyOptions = {}, - updateDelay, - shouldShow = null, - } = props; - - const menuEditor = editor || currentEditor; - - if (!menuEditor) { - console.warn( - "BubbleMenu component is not rendered inside of an editor component or does not have editor prop.", - ); - return; - } - - const plugin = BubbleMenuPlugin({ - updateDelay, - editor: menuEditor, - element, - pluginKey, - shouldShow, - tippyOptions, - }); - - menuEditor.registerPlugin(plugin); - return () => { - menuEditor.unregisterPlugin(pluginKey); - }; - }, [props.editor, currentEditor, element]); - - return ( -
- {props.children} -
- ); -}; diff --git a/packages/editor-ext/src/lib/tippy-bubble-menu/index.ts b/packages/editor-ext/src/lib/tippy-bubble-menu/index.ts deleted file mode 100644 index b385802d..00000000 --- a/packages/editor-ext/src/lib/tippy-bubble-menu/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { BubbleMenu as TiptapTippyBubbleMenu } from "./bubble-menu-react"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d08cabf7..e42353c3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -337,9 +337,6 @@ importers: socket.io-client: specifier: ^4.8.1 version: 4.8.1 - tippy.js: - specifier: ^6.3.7 - version: 6.3.7 tiptap-extension-global-drag-handle: specifier: ^0.1.18 version: 0.1.18 @@ -3350,9 +3347,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@radix-ui/primitive@1.1.1': resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} @@ -9423,9 +9417,6 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tippy.js@6.3.7: - resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} - tiptap-extension-global-drag-handle@0.1.18: resolution: {integrity: sha512-jwFuy1K8DP3a4bFy76Hpc63w1Sil0B7uZ3mvhQomVvUFCU787Lg2FowNhn7NFzeyok761qY2VG+PZ/FDthWUdg==} @@ -13620,8 +13611,6 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@popperjs/core@2.11.8': {} - '@radix-ui/primitive@1.1.1': {} '@radix-ui/react-arrow@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -20710,10 +20699,6 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - tippy.js@6.3.7: - dependencies: - '@popperjs/core': 2.11.8 - tiptap-extension-global-drag-handle@0.1.18: {} tldts-core@6.1.72: {} From f671e7a3b9209125da3bb4e0e7cfba0a8291b0b3 Mon Sep 17 00:00:00 2001 From: Arek Nawo Date: Fri, 9 Jan 2026 01:01:48 +0100 Subject: [PATCH 18/21] feat: Update collaboration connection for HocusPocus v3 --- .../src/features/editor/page-editor.tsx | 173 +++++++----------- 1 file changed, 70 insertions(+), 103 deletions(-) diff --git a/apps/client/src/features/editor/page-editor.tsx b/apps/client/src/features/editor/page-editor.tsx index 9a80f506..fbb760e6 100644 --- a/apps/client/src/features/editor/page-editor.tsx +++ b/apps/client/src/features/editor/page-editor.tsx @@ -11,8 +11,9 @@ import * as Y from "yjs"; import { HocuspocusProvider, onStatusParameters, - onAuthenticationFailedParameters, WebSocketStatus, + HocuspocusProviderWebsocket, + onSyncedParameters, } from "@hocuspocus/provider"; import { EditorContent, @@ -89,140 +90,127 @@ export default function PageEditor({ const [, setAsideState] = useAtom(asideStateAtom); const [, setActiveCommentId] = useAtom(activeCommentIdAtom); const [showCommentPopup, setShowCommentPopup] = useAtom(showCommentPopupAtom); - const ydocRef = useRef(null); - if (!ydocRef.current) { - ydocRef.current = new Y.Doc(); - } - const ydoc = ydocRef.current; const [isLocalSynced, setIsLocalSynced] = useState(false); - const [isRemoteSynced, setRemoteSynced] = useState(false); + const [isRemoteSynced, setIsRemoteSynced] = useState(false); const [yjsConnectionStatus, setYjsConnectionStatus] = useAtom( - yjsConnectionStatusAtom, + yjsConnectionStatusAtom ); const menuContainerRef = useRef(null); - const documentName = `page.${pageId}`; const { data: collabQuery, refetch: refetchCollabToken } = useCollabToken(); const { isIdle, resetIdle } = useIdle(FIVE_MINUTES, { initialState: false }); const documentState = useDocumentVisibility(); - const [isCollabReady, setIsCollabReady] = useState(false); const { pageSlug } = useParams(); const slugId = extractPageSlugId(pageSlug); const userPageEditMode = currentUser?.user?.settings?.preferences?.pageEditMode ?? PageEditMode.Edit; - const canScroll = useCallback( () => isComponentMounted.current && editorCreated.current, - [isComponentMounted, editorCreated], + [isComponentMounted, editorCreated] ); const { handleScrollTo } = useEditorScroll({ canScroll }); // Providers only created once per pageId const providersRef = useRef<{ local: IndexeddbPersistence; remote: HocuspocusProvider; + socket: HocuspocusProviderWebsocket; } | null>(null); const [providersReady, setProvidersReady] = useState(false); - const localProvider = providersRef.current?.local; - const remoteProvider = providersRef.current?.remote; - useEffect(() => { if (!providersRef.current) { + const documentName = `page.${pageId}`; + const ydoc = new Y.Doc(); const local = new IndexeddbPersistence(documentName, ydoc); - local.on("synced", () => setIsLocalSynced(true)); - const remote = new HocuspocusProvider({ - name: documentName, + const socket = new HocuspocusProviderWebsocket({ url: collaborationURL, - document: ydoc, - token: collabQuery?.token, - onAuthenticationFailed: (auth: onAuthenticationFailedParameters) => { - const payload = jwtDecode(collabQuery?.token); - const now = Date.now().valueOf() / 1000; - const isTokenExpired = now >= payload.exp; - if (isTokenExpired) { - refetchCollabToken().then((result) => { - if (result.data?.token) { - remote.configuration.websocketProvider.disconnect(); - setTimeout(() => { - remote.configuration.token = result.data.token; - remote.configuration.websocketProvider.connect(); - }, 100); - } - }); - } - }, }); - - remote.on("synced", () => setRemoteSynced(true)); - - const handleSocketStatus = (status: onStatusParameters) => { - if (status.status === "connected") { - setYjsConnectionStatus(WebSocketStatus.Connected); - } else if (status.status === "disconnected") { - setYjsConnectionStatus(WebSocketStatus.Disconnected); + const onLocalSyncedHandler = () => { + setIsLocalSynced(true); + }; + const onStatusHandler = (event: onStatusParameters) => { + setYjsConnectionStatus(event.status); + }; + const onSyncedHandler = (event: onSyncedParameters) => { + setIsRemoteSynced(event.state); + }; + const onAuthenticationFailedHandler = () => { + const payload = jwtDecode(collabQuery?.token); + const now = Date.now().valueOf() / 1000; + const isTokenExpired = now >= payload.exp; + if (isTokenExpired) { + refetchCollabToken().then((result) => { + if (result.data?.token) { + remote.disconnect(); + setTimeout(() => { + remote.configuration.token = result.data.token; + remote.connect(); + }, 100); + } + }); } }; - remote.configuration.websocketProvider.on("status", handleSocketStatus); + const remote = new HocuspocusProvider({ + websocketProvider: socket, + name: documentName, + document: ydoc, + token: collabQuery?.token, + onAuthenticationFailed: onAuthenticationFailedHandler, + onStatus: onStatusHandler, + onSynced: onSyncedHandler, + }); - providersRef.current = { local, remote }; + local.on("synced", onLocalSyncedHandler); + providersRef.current = { socket, local, remote }; setProvidersReady(true); } else { setProvidersReady(true); } // Only destroy on final unmount return () => { + providersRef.current?.socket.destroy(); providersRef.current?.remote.destroy(); providersRef.current?.local.destroy(); providersRef.current = null; }; }, [pageId]); - /* - useEffect(() => { - // Handle token updates by reconnecting with new token - if (providersRef.current?.remote && collabQuery?.token) { - const currentToken = providersRef.current.remote.configuration.token; - if (currentToken !== collabQuery.token) { - // Token has changed, need to reconnect with new token - providersRef.current.remote.disconnect(); - providersRef.current.remote.configuration.token = collabQuery.token; - providersRef.current.remote.connect(); - } - } - }, [collabQuery?.token]); - */ - // Only connect/disconnect on tab/idle, not destroy useEffect(() => { if (!providersReady || !providersRef.current) return; const remoteProvider = providersRef.current.remote; + if ( isIdle && documentState === "hidden" && - remoteProvider.configuration.websocketProvider.status === - WebSocketStatus.Connected + yjsConnectionStatus === WebSocketStatus.Connected ) { - remoteProvider.configuration.websocketProvider.disconnect(); - setIsCollabReady(false); + remoteProvider.disconnect(); return; } if ( documentState === "visible" && - remoteProvider.configuration.websocketProvider.status === - WebSocketStatus.Disconnected + yjsConnectionStatus === WebSocketStatus.Disconnected ) { resetIdle(); - remoteProvider.configuration.websocketProvider.connect(); - setTimeout(() => setIsCollabReady(true), 500); + remoteProvider.connect(); } }, [isIdle, documentState, providersReady, resetIdle]); + // Attach here, to make sure the connection gets properly established + providersRef.current?.remote.attach(); + const extensions = useMemo(() => { - if (!remoteProvider || !currentUser?.user) return mainExtensions; + if (!providersReady || !providersRef.current || !currentUser?.user) { + return mainExtensions; + } + + const remoteProvider = providersRef.current.remote; + return [ ...mainExtensions, ...collabExtensions(remoteProvider, currentUser?.user), ]; - }, [remoteProvider, currentUser?.user]); + }, [providersReady, currentUser?.user]); const editor = useEditor( { @@ -287,7 +275,7 @@ export default function PageEditor({ debouncedUpdateContent(editorJson); }, }, - [pageId, editable, remoteProvider], + [pageId, editable, extensions] ); const editorIsEditable = useEditorState({ @@ -332,7 +320,7 @@ export default function PageEditor({ return () => { document.removeEventListener( "ACTIVE_COMMENT_EVENT", - handleActiveCommentEvent, + handleActiveCommentEvent ); }; }, []); @@ -343,38 +331,17 @@ export default function PageEditor({ setAsideState({ tab: "", isAsideOpen: false }); }, [pageId]); - useEffect(() => { - if ( - remoteProvider?.configuration.websocketProvider.status === - WebSocketStatus.Connecting - ) { - const timeout = setTimeout(() => { - setYjsConnectionStatus(WebSocketStatus.Disconnected); - }, 5000); - return () => clearTimeout(timeout); - } - }, [remoteProvider?.configuration.websocketProvider.status]); - const isSynced = isLocalSynced && isRemoteSynced; useEffect(() => { - const collabReadyTimeout = setTimeout(() => { - if ( - !isCollabReady && - isSynced && - remoteProvider?.configuration.websocketProvider.status === - WebSocketStatus.Connected - ) { - setIsCollabReady(true); + const timeout = setTimeout(() => { + if (yjsConnectionStatus === WebSocketStatus.Connecting || !isSynced) { + setYjsConnectionStatus(WebSocketStatus.Disconnected); } - }, 500); - return () => clearTimeout(collabReadyTimeout); - }, [ - isRemoteSynced, - isLocalSynced, - remoteProvider?.configuration.websocketProvider.status, - ]); + }, 7500); + return () => clearTimeout(timeout); + }, [yjsConnectionStatus, isSynced]); useEffect(() => { // Only honor user default page edit mode preference and permissions if (editor) { @@ -396,13 +363,13 @@ export default function PageEditor({ useEffect(() => { if ( !hasConnectedOnceRef.current && - remoteProvider?.configuration.websocketProvider.status === - WebSocketStatus.Connected + yjsConnectionStatus === WebSocketStatus.Connected && + isSynced ) { hasConnectedOnceRef.current = true; setShowStatic(false); } - }, [remoteProvider?.configuration.websocketProvider.status]); + }, [yjsConnectionStatus, isSynced]); if (showStatic) { return ( From 55104342219d3bdf7b1a2ad23385e7c646d3ce57 Mon Sep 17 00:00:00 2001 From: Arek Nawo Date: Fri, 9 Jan 2026 12:04:45 +0100 Subject: [PATCH 19/21] fix: Connect/disconnect websocketProvider --- apps/client/src/features/editor/page-editor.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/client/src/features/editor/page-editor.tsx b/apps/client/src/features/editor/page-editor.tsx index fbb760e6..f5619c91 100644 --- a/apps/client/src/features/editor/page-editor.tsx +++ b/apps/client/src/features/editor/page-editor.tsx @@ -140,10 +140,10 @@ export default function PageEditor({ if (isTokenExpired) { refetchCollabToken().then((result) => { if (result.data?.token) { - remote.disconnect(); + socket.disconnect(); setTimeout(() => { remote.configuration.token = result.data.token; - remote.connect(); + socket.connect(); }, 100); } }); @@ -177,14 +177,14 @@ export default function PageEditor({ // Only connect/disconnect on tab/idle, not destroy useEffect(() => { if (!providersReady || !providersRef.current) return; - const remoteProvider = providersRef.current.remote; + const socket = providersRef.current.socket; if ( isIdle && documentState === "hidden" && yjsConnectionStatus === WebSocketStatus.Connected ) { - remoteProvider.disconnect(); + socket.disconnect(); return; } if ( @@ -192,7 +192,7 @@ export default function PageEditor({ yjsConnectionStatus === WebSocketStatus.Disconnected ) { resetIdle(); - remoteProvider.connect(); + socket.connect(); } }, [isIdle, documentState, providersReady, resetIdle]); From 78d363febb04cc2a3cfb28221be57138b2a912b1 Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:59:42 +0000 Subject: [PATCH 20/21] cleanup --- apps/client/src/features/editor/extensions/extensions.ts | 3 +-- package.json | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/client/src/features/editor/extensions/extensions.ts b/apps/client/src/features/editor/extensions/extensions.ts index 74549eff..cb7e1290 100644 --- a/apps/client/src/features/editor/extensions/extensions.ts +++ b/apps/client/src/features/editor/extensions/extensions.ts @@ -1,6 +1,6 @@ import { StarterKit } from "@tiptap/starter-kit"; import { TextAlign } from "@tiptap/extension-text-align"; -import { TaskList, TaskItem, ListKeymap } from "@tiptap/extension-list"; +import { TaskList, TaskItem } from "@tiptap/extension-list"; import { Placeholder, CharacterCount } from "@tiptap/extensions"; import { Superscript } from "@tiptap/extension-superscript"; import SubScript from "@tiptap/extension-subscript"; @@ -129,7 +129,6 @@ export const mainExtensions = [ }), TextAlign.configure({ types: ["heading", "paragraph"] }), TaskList, - ListKeymap, TaskItem.configure({ nested: true, }), diff --git a/package.json b/package.json index adba36ee..9875871b 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "server:dev": "nx run server:start:dev", "server:start": "nx run server:start:prod", "email:dev": "nx run server:email:dev", - "dev": "pnpm concurrently -n \"frontend,backend\" -c \"cyan,green\" \"pnpm run client:dev\" \"pnpm run server:dev\"" + "dev": "pnpm concurrently -n \"frontend,backend\" -c \"cyan,green\" \"pnpm run client:dev\" \"pnpm run server:dev\"", + "clean": "rm -rf apps/*/dist packages/*/dist" }, "dependencies": { "@braintree/sanitize-url": "^7.1.0", From 051bc80ab791e592eac52ced2b905128fc47445b Mon Sep 17 00:00:00 2001 From: Philipinho <16838612+Philipinho@users.noreply.github.com> Date: Fri, 16 Jan 2026 17:10:58 +0000 Subject: [PATCH 21/21] cleanup --- apps/client/src/features/editor/components/link/link-preview.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/client/src/features/editor/components/link/link-preview.tsx b/apps/client/src/features/editor/components/link/link-preview.tsx index 2a7b42a0..8b0de952 100644 --- a/apps/client/src/features/editor/components/link/link-preview.tsx +++ b/apps/client/src/features/editor/components/link/link-preview.tsx @@ -34,7 +34,6 @@ export const LinkPreviewPanel = ({ rel="noopener noreferrer" className={classes.link} > - ss {url}