From 1ce5e56c15c1ff85b0de3c8e845f56d3b99941e2 Mon Sep 17 00:00:00 2001 From: "emdash-autofix[bot]" Date: Sun, 25 Oct 2026 17:09:15 +0000 Subject: [PATCH 1/5] fix(editor): test and support Tiptap 3.32 Pin the editor catalog to Tiptap 3.32.0, retain lowlight 3.20.0, satisfy the y-tiptap peer, and consolidate ProseMirror. Restore responsive table rendering and fix newer-Tiptap floating toolbar DOM/event compatibility in admin and core. Update highlighting, selection, link, table and keyboard regression coverage. Verified root build, workspace typecheck, zero-diagnostic quick lint, format, frozen install, the full serial admin editor suite and core component/conversion tests. Added changeset and before/after Chromium screenshots; independent follow-up review cleared all findings. EmDash-Bot-Case: 1198246700-issue-6025800409 EmDash-Bot-Candidate: cand-1-122fcc0877 --- .changeset/tall-hats-tease.md | 10 + .../src/components/PortableTextEditor.tsx | 15 +- .../src/components/editor/TableExtensions.ts | 4 + .../CodeBlockNode.highlighting.test.tsx | 94 ++ .../admin/tests/editor/CodeBlockNode.test.ts | 55 +- .../admin/tests/editor/bubble-menu.test.tsx | 10 +- .../admin/tests/editor/image-toolbar.test.tsx | 8 +- .../admin/tests/editor/table-resize.test.tsx | 23 +- packages/admin/tests/editor/toolbar.test.tsx | 25 +- .../src/components/inline-bubble-menu.tsx | 4 +- .../core/src/components/inline-editor-ui.tsx | 14 +- packages/core/src/components/inline-image.tsx | 4 +- .../inline-portable-text-menus.test.ts | 11 + pnpm-lock.yaml | 1048 ++++++++--------- pnpm-workspace.yaml | 56 +- 15 files changed, 670 insertions(+), 711 deletions(-) create mode 100644 .changeset/tall-hats-tease.md create mode 100644 packages/admin/tests/editor/CodeBlockNode.highlighting.test.tsx diff --git a/.changeset/tall-hats-tease.md b/.changeset/tall-hats-tease.md new file mode 100644 index 0000000000..f8911ee995 --- /dev/null +++ b/.changeset/tall-hats-tease.md @@ -0,0 +1,10 @@ +--- +"@emdash-cms/admin": patch +"emdash": patch +--- + +Fixes responsive table widths in the admin editor and floating toolbar keyboard controls in both the admin and inline editors with Tiptap 3.32.0. + +Pins the editor's Tiptap dependencies to exactly 3.32.0 so installations use the version covered by the editor tests. Code-block highlighting keeps its existing lowlight extension version. Sites or plugins that share Tiptap dependencies with EmDash should align them to 3.32.0 to avoid installing multiple copies. + +Links applied at an empty caret now end when you type a space, following Tiptap's updated behavior. Text typed after that space is not part of the link. diff --git a/packages/admin/src/components/PortableTextEditor.tsx b/packages/admin/src/components/PortableTextEditor.tsx index fa271d5de9..6e91aff5a2 100644 --- a/packages/admin/src/components/PortableTextEditor.tsx +++ b/packages/admin/src/components/PortableTextEditor.tsx @@ -4806,7 +4806,7 @@ const FORMATTING_MARKS = [ ] as const; function playBubbleEntrance(element: HTMLElement | null) { - const surface = element?.firstElementChild; + const surface = element; if (!(surface instanceof HTMLElement) || typeof surface.animate !== "function") return; const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; surface.animate( @@ -4929,9 +4929,8 @@ function EditorBubbleMenu({ }) => { elements.floating.style.maxWidth = `${Math.max(0, availableWidth)}px`; // The surface scrolls itself, so no wrapper clips its rounded ring. - const surface = elements.floating.firstElementChild; + const surface = elements.floating; if (surface instanceof HTMLElement) { - surface.style.maxWidth = "100%"; surface.style.overflowX = "auto"; } }, @@ -5504,7 +5503,7 @@ function ImageBubbleMenu({ // A quick fade and scale in, played when the toolbar appears or moves to another image. const playEntrance = React.useCallback(() => { const menu = menuRef.current; - const toolbar = menu?.firstElementChild; + const toolbar = menu; if (!menu?.isConnected || menu.hidden || !(toolbar instanceof HTMLElement)) return; const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; for (const animation of toolbar.getAnimations()) animation.cancel(); @@ -5720,15 +5719,15 @@ function ImageBubbleMenu({ }} // Capture, so an open hint can't stop Escape before the toolbar sees it. onKeyDownCapture={(event) => { - if (event.key !== "Escape" || event.nativeEvent.isComposing) return; + if (event.nativeEvent.key !== "Escape" || event.nativeEvent.isComposing) return; event.stopPropagation(); returnToEditor(); }} onKeyDown={(event) => { if (event.nativeEvent.isComposing) return; if ( - event.key === "Tab" && - event.shiftKey && + event.nativeEvent.key === "Tab" && + event.nativeEvent.shiftKey && event.target === menuRef.current?.querySelector("button, input") ) { event.preventDefault(); @@ -6624,7 +6623,7 @@ function moveToolbarFocus(event: React.KeyboardEvent, vertical: boo const forward = getComputedStyle(toolbar).direction === "rtl" ? -1 : 1; let nextIndex: number; - switch (event.key) { + switch (event.nativeEvent.key) { case "ArrowRight": nextIndex = currentIndex + forward; break; diff --git a/packages/admin/src/components/editor/TableExtensions.ts b/packages/admin/src/components/editor/TableExtensions.ts index c4c7cdd2f6..58d302146f 100644 --- a/packages/admin/src/components/editor/TableExtensions.ts +++ b/packages/admin/src/components/editor/TableExtensions.ts @@ -239,6 +239,10 @@ function handleRtlTableKey(view: EditorView, event: KeyboardEvent): boolean { } export const EmDashTable = Table.extend({ + addNodeView() { + // The resize plugin owns the responsive table view, including in read-only editors. + return null; + }, addProseMirrorPlugins() { return [ new Plugin({ diff --git a/packages/admin/tests/editor/CodeBlockNode.highlighting.test.tsx b/packages/admin/tests/editor/CodeBlockNode.highlighting.test.tsx new file mode 100644 index 0000000000..98ea420280 --- /dev/null +++ b/packages/admin/tests/editor/CodeBlockNode.highlighting.test.tsx @@ -0,0 +1,94 @@ +import type { Editor } from "@tiptap/core"; +import { EditorContent, useEditor } from "@tiptap/react"; +import StarterKit from "@tiptap/starter-kit"; +import { useEffect } from "react"; +import { describe, expect, it, vi } from "vitest"; + +import { CodeBlockExtension } from "../../src/components/editor/CodeBlockNode"; +import { render } from "../utils/render.js"; + +import "../../src/styles.css"; + +function CodeEditor({ + language, + code, + onEditor, +}: { + language: string | null | undefined; + code: string; + onEditor?: (editor: Editor) => void; +}) { + const editor = useEditor({ + extensions: [StarterKit.configure({ codeBlock: false }), CodeBlockExtension], + content: { + type: "doc", + content: [ + { type: "codeBlock", attrs: { language }, content: [{ type: "text", text: code }] }, + ], + }, + immediatelyRender: true, + }); + + useEffect(() => { + if (editor) onEditor?.(editor); + }, [editor, onEditor]); + return ; +} + +describe("CodeBlockExtension highlighting", () => { + it.each([ + ["javascript", 'const greeting = "hello";'], + ["dockerfile", "FROM node:22"], + ])("renders syntax tokens for %s", async (language, code) => { + let editor: Editor | undefined; + const screen = await render( + (editor = instance)} />, + ); + + await vi.waitFor(() => { + expect(screen.container.querySelector("code")?.textContent).toBe(code); + expect(screen.container.querySelectorAll('span[class*="hljs-"]').length).toBeGreaterThan(0); + }); + + expect(JSON.stringify(editor!.getJSON())).not.toContain("hljs-"); + }); + + it.each(["plaintext", "astro", "zig", "custom-language", null, undefined])( + "leaves %s code unhighlighted", + async (language) => { + const screen = await render( + , + ); + + await vi.waitFor(() => { + expect(screen.container.querySelector("code")?.textContent).toBe( + 'const greeting = "hello";', + ); + }); + expect(screen.container.querySelectorAll('span[class*="hljs-"]')).toHaveLength(0); + }, + ); + + it("updates decorations when the selected language changes", async () => { + let editor: Editor | undefined; + const screen = await render( + (editor = instance)} + />, + ); + const editorElement = screen.container.querySelector(".ProseMirror")!; + + await vi.waitFor(() => { + expect(editorElement.querySelectorAll('span[class*="hljs-"]').length).toBeGreaterThan(0); + }); + + editor!.commands.setNodeSelection(0); + editor!.commands.updateAttributes("codeBlock", { language: "astro" }); + await vi.waitFor(() => { + expect(editorElement.querySelectorAll('span[class*="hljs-"]')).toHaveLength(0); + }); + expect(editor!.getJSON().content?.[0]?.content?.[0]?.text).toBe('const greeting = "hello";'); + }); +}); diff --git a/packages/admin/tests/editor/CodeBlockNode.test.ts b/packages/admin/tests/editor/CodeBlockNode.test.ts index bab5e75bbf..9daa713f25 100644 --- a/packages/admin/tests/editor/CodeBlockNode.test.ts +++ b/packages/admin/tests/editor/CodeBlockNode.test.ts @@ -13,7 +13,7 @@ import { Editor, type Content } from "@tiptap/core"; import { closeHistory } from "@tiptap/pm/history"; import StarterKit from "@tiptap/starter-kit"; -import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { CodeBlockExtension } from "../../src/components/editor/CodeBlockNode"; @@ -203,57 +203,4 @@ describe("CodeBlockExtension", () => { expect(editor.state.selection.toJSON()).toEqual({ type: "all" }); } }); - - it.each([ - ["javascript", 'const greeting = "hello";'], - ["dockerfile", "FROM node:22"], - ])("renders syntax tokens for %s", async (language, code) => { - editor.commands.insertContent({ - type: "codeBlock", - attrs: { language }, - content: [{ type: "text", text: code }], - }); - - await vi.waitFor(() => { - expect(element.querySelectorAll('span[class*="hljs-"]').length).toBeGreaterThan(0); - }); - - expect(JSON.stringify(editor.getJSON())).not.toContain("hljs-"); - }); - - it.each(["plaintext", "astro", "zig", "custom-language", null, undefined])( - "leaves %s code unhighlighted", - async (language) => { - editor.commands.insertContent({ - type: "codeBlock", - attrs: { language }, - content: [{ type: "text", text: 'const greeting = "hello";' }], - }); - - await vi.waitFor(() => { - expect(element.querySelectorAll('span[class*="hljs-"]')).toHaveLength(0); - }); - }, - ); - - it("updates decorations when the selected language changes", async () => { - editor.commands.insertContent({ - type: "codeBlock", - attrs: { language: "javascript" }, - content: [{ type: "text", text: 'const greeting = "hello";' }], - }); - - await vi.waitFor(() => { - expect(element.querySelectorAll('span[class*="hljs-"]').length).toBeGreaterThan(0); - }); - - editor.commands.setNodeSelection(0); - editor.commands.updateAttributes("codeBlock", { language: "astro" }); - - await vi.waitFor(() => { - expect(element.querySelectorAll('span[class*="hljs-"]')).toHaveLength(0); - }); - const node = editor.getJSON().content?.find((item) => item.type === "codeBlock"); - expect(node?.content?.[0]?.text).toBe('const greeting = "hello";'); - }); }); diff --git a/packages/admin/tests/editor/bubble-menu.test.tsx b/packages/admin/tests/editor/bubble-menu.test.tsx index 5f706fd1a2..edfd7d9ce6 100644 --- a/packages/admin/tests/editor/bubble-menu.test.tsx +++ b/packages/admin/tests/editor/bubble-menu.test.tsx @@ -279,12 +279,6 @@ function hasNonZeroRadius(element: HTMLElement): boolean { return declaredValues.some((value) => value > 0); } -function expectRoundedFloatingWrapper(menu: HTMLElement) { - const wrapper = findScrollableAncestor(menu); - expect(wrapper).toBeTruthy(); - expect(hasNonZeroRadius(wrapper!)).toBe(true); -} - /** Get a bubble menu button by aria-label */ function getBubbleButton(menu: HTMLElement, label: string): HTMLButtonElement | null { return menu.querySelector(`[aria-label="${label}"]`); @@ -638,7 +632,9 @@ describe("Bubble Menu", () => { expect(menuRect.top).toBeGreaterThanOrEqual( formattingToolbar!.getBoundingClientRect().bottom, ); - expectRoundedFloatingWrapper(tableToolbar); + expect(getComputedStyle(tableToolbar).overflowX).toBe("auto"); + expect(hasNonZeroRadius(tableToolbar)).toBe(true); + expect(findScrollableAncestor(tableToolbar)).toBeNull(); }); }); diff --git a/packages/admin/tests/editor/image-toolbar.test.tsx b/packages/admin/tests/editor/image-toolbar.test.tsx index e5f33e1221..7193548336 100644 --- a/packages/admin/tests/editor/image-toolbar.test.tsx +++ b/packages/admin/tests/editor/image-toolbar.test.tsx @@ -397,7 +397,11 @@ describe("Image toolbar", () => { const { editor, img, getPanel } = await setup({ extraImage: true }); editor.commands.selectAll(); await vi.waitFor(() => - expect(document.querySelectorAll(".ProseMirror .ProseMirror-selectednode")).toHaveLength(2), + expect( + [...document.querySelectorAll(".ProseMirror img")].filter((image) => + image.closest(".emdash-block-selected"), + ), + ).toHaveLength(2), ); const toolbar = await selectImage(img); @@ -466,7 +470,7 @@ describe("Image toolbar", () => { expect(box.right).toBeLessThanOrEqual(window.innerWidth); } const top = (label: string) => button(toolbar, label).getBoundingClientRect().top; - expect(top("Right")).toBe(top("Replace")); + await vi.waitFor(() => expect(top("Right")).toBe(top("Replace"))); expect(top("Add link")).toBeGreaterThan(top("Replace")); } finally { await page.viewport(1280, 800); diff --git a/packages/admin/tests/editor/table-resize.test.tsx b/packages/admin/tests/editor/table-resize.test.tsx index 426eb79856..e05f0df6f5 100644 --- a/packages/admin/tests/editor/table-resize.test.tsx +++ b/packages/admin/tests/editor/table-resize.test.tsx @@ -186,16 +186,19 @@ afterEach(() => { }); describe("direction-aware table resizing", () => { - it("renders a fluid table with a numeric preferred minimum width", () => { - const { host } = createEditor("ltr"); - const table = host.querySelector("table"); - - expect(table).toBeTruthy(); - expect(table?.style.width).toBe("100%"); - expect(table?.style.minWidth).toBe("288px"); - expect(host.querySelector(".tableWrapper")).toBeTruthy(); - expect(ResponsiveTableView).toBeTypeOf("function"); - }); + it.each([true, false])( + "renders a fluid table with a numeric preferred minimum width (editable: %s)", + (editable) => { + const { host } = createEditor("ltr", { editable }); + const table = host.querySelector("table"); + + expect(table).toBeTruthy(); + expect(table?.style.width).toBe("100%"); + expect(table?.style.minWidth).toBe("288px"); + expect(host.querySelector(".tableWrapper")).toBeTruthy(); + expect(ResponsiveTableView).toBeTypeOf("function"); + }, + ); it("enforces the visual minimum for valid sub-minimum stored widths", () => { const { editor, host } = createEditor("ltr", { content: tableContent(Array(10).fill(1)) }); diff --git a/packages/admin/tests/editor/toolbar.test.tsx b/packages/admin/tests/editor/toolbar.test.tsx index 9b457d1782..e19e60a443 100644 --- a/packages/admin/tests/editor/toolbar.test.tsx +++ b/packages/admin/tests/editor/toolbar.test.tsx @@ -405,7 +405,7 @@ describe("Toolbar Presence and Structure", () => { it("exposes the permanent Table control and keeps other extended actions in the block menu", async () => { const { screen } = await renderEditor(); const toolbar = screen.getByRole("toolbar", { name: "Text formatting" }).element(); - await expect.element(screen.getByRole("button", { name: "Add link" })).toBeVisible(); + await expect.element(getToolbarButton(screen, "Add link")).toBeVisible(); await expect.element(screen.getByRole("button", { name: "Insert image" })).toBeVisible(); await expect.element(screen.getByRole("button", { name: "Insert HTML" })).toBeVisible(); const table = screen.getByRole("button", { name: "Table" }); @@ -706,7 +706,7 @@ describe("Toolbar Presence and Structure", () => { it("renders the link editor outside the horizontally scrolling toolbar", async () => { const { screen } = await renderEditor(); const toolbar = screen.getByRole("toolbar", { name: "Text formatting" }).element(); - screen.getByRole("button", { name: "Add link" }).element().click(); + getToolbarButton(screen, "Add link").element().click(); await vi.waitFor(() => { const input = document.querySelector( @@ -1833,7 +1833,7 @@ describe("Link Insertion", () => { const { screen } = await renderEditor(); await focusAndSelectAll(screen); - const linkBtn = screen.getByRole("button", { name: "Add link" }); + const linkBtn = getToolbarButton(screen, "Add link"); linkBtn.element().click(); await vi.waitFor(() => { @@ -1846,7 +1846,7 @@ describe("Link Insertion", () => { const { screen } = await renderEditor(); await focusAndSelectAll(screen); - screen.getByRole("button", { name: "Add link" }).element().click(); + getToolbarButton(screen, "Add link").element().click(); await vi.waitFor(() => { expect(screen.getByRole("button", { name: "Cancel" })).toBeTruthy(); @@ -1858,7 +1858,7 @@ describe("Link Insertion", () => { const { screen } = await renderEditor(); await focusAndSelectAll(screen); - screen.getByRole("button", { name: "Add link" }).element().click(); + getToolbarButton(screen, "Add link").element().click(); await vi.waitFor(() => { expect(document.querySelector('input[aria-label="Search or type a URL"]')).toBeTruthy(); @@ -1886,7 +1886,7 @@ describe("Link Insertion", () => { }); }); - it("applies a link to text typed after an empty caret", async () => { + it("exits the link when a space is typed after linked text", async () => { const { screen, editor } = await renderEditor(); editor .chain() @@ -1894,7 +1894,7 @@ describe("Link Insertion", () => { .setTextSelection(editor.state.doc.content.size - 1) .run(); - screen.getByRole("button", { name: "Add link" }).element().click(); + getToolbarButton(screen, "Add link").element().click(); await vi.waitFor(() => { expect(document.querySelector('input[aria-label="Search or type a URL"]')).toBeTruthy(); }); @@ -1915,7 +1915,8 @@ describe("Link Insertion", () => { await vi.waitFor(() => { const link = screen.container.querySelector("a"); expect(link?.getAttribute("href")).toBe("https://example.com"); - expect(link?.textContent).toBe("linked text"); + expect(link?.textContent).toBe("linked"); + expect(link?.nextSibling?.textContent).toBe(" text"); }); }); @@ -1923,7 +1924,7 @@ describe("Link Insertion", () => { const { screen } = await renderEditor(); await focusAndSelectAll(screen); - screen.getByRole("button", { name: "Add link" }).element().click(); + getToolbarButton(screen, "Add link").element().click(); await typeLink("example.com/docs"); screen.getByRole("button", { name: "Apply" }).element().click(); @@ -1937,7 +1938,7 @@ describe("Link Insertion", () => { const { screen } = await renderEditor(); await focusAndSelectAll(screen); - screen.getByRole("button", { name: "Add link" }).element().click(); + getToolbarButton(screen, "Add link").element().click(); await typeLink("javascript:alert(1)"); screen.getByRole("button", { name: "Apply" }).element().click(); @@ -1969,7 +1970,7 @@ describe("Link Insertion", () => { const { screen } = await renderEditor(); await focusAndSelectAll(screen); - screen.getByRole("button", { name: "Add link" }).element().click(); + getToolbarButton(screen, "Add link").element().click(); await vi.waitFor(() => { expect(document.querySelector('input[aria-label="Search or type a URL"]')).toBeTruthy(); @@ -1998,7 +1999,7 @@ describe("Link Insertion", () => { const modUp = navigator.platform.includes("Mac") ? "{/Meta}" : "{/Control}"; await userEvent.keyboard(`${mod}{a}${modUp}`); - screen.getByRole("button", { name: "Edit link" }).element().click(); + getToolbarButton(screen, "Edit link").element().click(); await vi.waitFor(() => { expect(screen.getByRole("button", { name: "Remove" })).toBeTruthy(); diff --git a/packages/core/src/components/inline-bubble-menu.tsx b/packages/core/src/components/inline-bubble-menu.tsx index 477d807181..5f3b6e4127 100644 --- a/packages/core/src/components/inline-bubble-menu.tsx +++ b/packages/core/src/components/inline-bubble-menu.tsx @@ -283,7 +283,7 @@ function LinkToolbar({ scrollTarget, onShow: () => { setShown(true); - playToolbarEntrance(menuRef.current?.firstElementChild); + playToolbarEntrance(menuRef.current); }, onHide: () => setShown(false), }), @@ -501,7 +501,7 @@ export function InlineBubbleMenu({ }, scrollTarget: scrollTarget ?? undefined, onShow: () => { - const surface = menuRef.current?.firstElementChild; + const surface = menuRef.current; setShown(true); playToolbarEntrance(surface); // Edit link opens the field while this toolbar is still hidden, too early to focus it. diff --git a/packages/core/src/components/inline-editor-ui.tsx b/packages/core/src/components/inline-editor-ui.tsx index d72e62d6d1..8fc8e6db54 100644 --- a/packages/core/src/components/inline-editor-ui.tsx +++ b/packages/core/src/components/inline-editor-ui.tsx @@ -580,20 +580,22 @@ function focusAfterEditor(editor: Editor): boolean { * right-to-left text; Home and End go to the first and last. */ export function handleToolbarKeyDown(event: React.KeyboardEvent, editor: Editor) { - if (event.nativeEvent.isComposing || event.defaultPrevented) return; + if (event.nativeEvent.isComposing || event.nativeEvent.defaultPrevented) return; const toolbar = event.currentTarget; const controls = [...toolbar.querySelectorAll(TOOLBAR_CONTROL_SELECTOR)]; const backToEditor = - event.key === "Escape" || - (event.key === "Tab" && event.shiftKey && document.activeElement === controls[0]); + event.nativeEvent.key === "Escape" || + (event.nativeEvent.key === "Tab" && + event.nativeEvent.shiftKey && + document.activeElement === controls[0]); if (backToEditor) { event.preventDefault(); if (!editor.isDestroyed) editor.view.focus(); return; } if ( - event.key === "Tab" && - !event.shiftKey && + event.nativeEvent.key === "Tab" && + !event.nativeEvent.shiftKey && document.activeElement === controls.at(-1) && focusAfterEditor(editor) ) { @@ -607,7 +609,7 @@ export function handleToolbarKeyDown(event: React.KeyboardEvent, ed if (currentIndex === -1) return; const forward = getComputedStyle(toolbar).direction === "rtl" ? -1 : 1; let nextIndex: number; - switch (event.key) { + switch (event.nativeEvent.key) { case "ArrowRight": nextIndex = currentIndex + forward; break; diff --git a/packages/core/src/components/inline-image.tsx b/packages/core/src/components/inline-image.tsx index 180092f1c1..1ac713dd74 100644 --- a/packages/core/src/components/inline-image.tsx +++ b/packages/core/src/components/inline-image.tsx @@ -449,7 +449,7 @@ export function InlineImageToolbar({ onShow: () => { setShown(true); if (performance.now() - hiddenAtRef.current > RESHOW_WITHOUT_ENTRANCE_MS) { - playToolbarEntrance(menuRef.current?.firstElementChild); + playToolbarEntrance(menuRef.current); } }, onHide: () => { @@ -540,7 +540,7 @@ export function InlineImageToolbar({ const onKeyDown = (event: React.KeyboardEvent) => { // Shift+Tab from the first control goes back to the caption, which Tab came from. - if (event.key === "Tab" && event.shiftKey && image.position !== null) { + if (event.nativeEvent.key === "Tab" && event.nativeEvent.shiftKey && image.position !== null) { const caption = captionField(editor, image.position); const first = event.currentTarget.querySelector(TOOLBAR_CONTROL_SELECTOR); if (caption && document.activeElement === first) { diff --git a/packages/core/tests/unit/components/inline-portable-text-menus.test.ts b/packages/core/tests/unit/components/inline-portable-text-menus.test.ts index 85e2bfa2b3..c878712c8b 100644 --- a/packages/core/tests/unit/components/inline-portable-text-menus.test.ts +++ b/packages/core/tests/unit/components/inline-portable-text-menus.test.ts @@ -226,6 +226,17 @@ describe("inline Portable Text editor toolbars and slash menu", () => { expect(document.activeElement).toBe(nextOnPage); }); + it("returns focus from the selection toolbar with Escape", async () => { + const editable = await mount([block("a", "Some text to format.")]); + const toolbar = await selectAndShowToolbar(editable, 1, 5); + const bold = toolbar.querySelector('[aria-label="Bold"]')!; + + await act(async () => bold.focus()); + expect(document.activeElement).toBe(bold); + await act(async () => press(bold, "Escape")); + expect(document.activeElement).toBe(editable); + }); + it("hides the toolbar once focus leaves the editor after a toolbar button", async () => { const editable = await mount([block("a", "Some text to format.")]); const toolbar = await selectAndShowToolbar(editable, 1, 5); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8a66e1780e..cd460bf430 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -160,92 +160,92 @@ catalogs: specifier: 1.163.2 version: 1.163.2 '@tiptap/core': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-character-count': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-code': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-code-block': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-code-block-lowlight': specifier: 3.20.0 version: 3.20.0 '@tiptap/extension-collaboration': - specifier: ^3.20.0 - version: 3.27.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-drag-handle': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-drag-handle-react': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-dropcursor': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-focus': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-image': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-link': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-list': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-node-range': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-placeholder': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-subscript': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-superscript': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-table': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-table-cell': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-table-header': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-table-row': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-text-align': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-typography': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/extension-underline': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/pm': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/react': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/starter-kit': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/suggestion': - specifier: ^3.20.0 - version: 3.20.0 + specifier: 3.32.0 + version: 3.32.0 '@tiptap/y-tiptap': - specifier: ^3.0.5 - version: 3.0.5 + specifier: ^3.0.7 + version: 3.0.10 '@types/node': specifier: 24.10.13 version: 24.10.13 @@ -1550,85 +1550,85 @@ importers: version: 1.163.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tiptap/core': specifier: 'catalog:' - version: 3.20.0(@tiptap/pm@3.20.0) + version: 3.32.0(@tiptap/pm@3.32.0) '@tiptap/extension-character-count': specifier: 'catalog:' - version: 3.20.0(@tiptap/extensions@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) '@tiptap/extension-code': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) '@tiptap/extension-code-block': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) '@tiptap/extension-code-block-lowlight': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/extension-code-block@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(highlight.js@11.11.2)(lowlight@3.3.0) + version: 3.20.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-code-block@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(highlight.js@11.11.2)(lowlight@3.3.0) '@tiptap/extension-collaboration': specifier: 'catalog:' - version: 3.27.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29) '@tiptap/extension-drag-handle': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/extension-collaboration@3.27.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29))(@tiptap/extension-node-range@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29)) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-collaboration@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29))(@tiptap/extension-node-range@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29)) '@tiptap/extension-drag-handle-react': specifier: 'catalog:' - version: 3.20.0(@tiptap/extension-drag-handle@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/extension-collaboration@3.27.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29))(@tiptap/extension-node-range@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29)))(@tiptap/pm@3.20.0)(@tiptap/react@3.20.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 3.32.0(@tiptap/extension-drag-handle@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-collaboration@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29))(@tiptap/extension-node-range@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29)))(@tiptap/pm@3.32.0)(@tiptap/react@3.32.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tiptap/extension-dropcursor': specifier: 'catalog:' - version: 3.20.0(@tiptap/extensions@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) '@tiptap/extension-focus': specifier: 'catalog:' - version: 3.20.0(@tiptap/extensions@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) '@tiptap/extension-link': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) '@tiptap/extension-list': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) '@tiptap/extension-node-range': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) '@tiptap/extension-placeholder': specifier: 'catalog:' - version: 3.20.0(@tiptap/extensions@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) '@tiptap/extension-subscript': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) '@tiptap/extension-superscript': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) '@tiptap/extension-table': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) '@tiptap/extension-table-cell': specifier: 'catalog:' - version: 3.20.0(@tiptap/extension-table@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/extension-table@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) '@tiptap/extension-table-header': specifier: 'catalog:' - version: 3.20.0(@tiptap/extension-table@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/extension-table@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) '@tiptap/extension-table-row': specifier: 'catalog:' - version: 3.20.0(@tiptap/extension-table@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/extension-table@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) '@tiptap/extension-text-align': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) '@tiptap/extension-typography': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) '@tiptap/extension-underline': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) '@tiptap/pm': specifier: 'catalog:' - version: 3.20.0 + version: 3.32.0 '@tiptap/react': specifier: 'catalog:' - version: 3.20.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 3.32.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tiptap/starter-kit': specifier: 'catalog:' - version: 3.20.0 + version: 3.32.0 '@tiptap/y-tiptap': specifier: 'catalog:' - version: 3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29) + version: 3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -1704,7 +1704,7 @@ importers: version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tiptap/suggestion': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + version: 3.32.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) '@types/react': specifier: 'catalog:' version: 19.2.14 @@ -2128,58 +2128,58 @@ importers: version: 5.0.1 '@tiptap/core': specifier: 'catalog:' - version: 3.20.0(@tiptap/pm@3.20.0) + version: 3.32.0(@tiptap/pm@3.32.0) '@tiptap/extension-code': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) '@tiptap/extension-code-block': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) '@tiptap/extension-code-block-lowlight': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/extension-code-block@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(highlight.js@11.11.2)(lowlight@3.3.0) + version: 3.20.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-code-block@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(highlight.js@11.11.2)(lowlight@3.3.0) '@tiptap/extension-focus': specifier: 'catalog:' - version: 3.20.0(@tiptap/extensions@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) '@tiptap/extension-image': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) '@tiptap/extension-link': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) '@tiptap/extension-list': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) '@tiptap/extension-placeholder': specifier: 'catalog:' - version: 3.20.0(@tiptap/extensions@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) '@tiptap/extension-subscript': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) '@tiptap/extension-superscript': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) '@tiptap/extension-text-align': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) '@tiptap/extension-typography': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) '@tiptap/extension-underline': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) + version: 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) '@tiptap/pm': specifier: 'catalog:' - version: 3.20.0 + version: 3.32.0 '@tiptap/react': specifier: 'catalog:' - version: 3.20.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 3.32.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tiptap/starter-kit': specifier: 'catalog:' - version: 3.20.0 + version: 3.32.0 '@tiptap/suggestion': specifier: 'catalog:' - version: 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + version: 3.32.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) '@unpic/placeholder': specifier: ^0.1.2 version: 0.1.2 @@ -4451,6 +4451,7 @@ packages: '@cloudflare/shell@0.4.0': resolution: {integrity: sha512-C4Ey9PyQEPHXJvU+V72JuxFLziRAj7c+oVDgj0aDMRTf+B6icnSCDPuiTA6vKjPp60LxkFbRQq7pMTy3v+TlPQ==} + deprecated: 'Deprecated: use @cloudflare/computer. Migration guide: https://github.com/cloudflare/agents/blob/main/docs/shell/migrating-to-computer.md' '@cloudflare/unenv-preset@2.15.0': resolution: {integrity: sha512-EGYmJaGZKWl+X8tXxcnx4v2bOZSjQeNI5dWFeXivgX9+YCT69AkzHHwlNbVpqtEUTbew8eQurpyOpeN8fg00nw==} @@ -6974,9 +6975,6 @@ packages: '@quansync/fs@1.0.0': resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} - '@remirror/core-constants@3.0.0': - resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} - '@rolldown/binding-android-arm-eabi@1.2.11': resolution: {integrity: sha512-A5kXfGKvKWWZE0TtPrfsvT+q4Y5d1QG8gGUzpYjGydM+fARM9MuX90PrXYXe0XbsDVgyxxNzHo6giCj90bsFNw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -8111,36 +8109,37 @@ packages: '@types/react-dom': optional: true - '@tiptap/core@3.20.0': - resolution: {integrity: sha512-aC9aROgia/SpJqhsXFiX9TsligL8d+oeoI8W3u00WI45s0VfsqjgeKQLDLF7Tu7hC+7F02teC84SAHuup003VQ==} + '@tiptap/core@3.32.0': + resolution: {integrity: sha512-Ghh2h02GKSqzytQGcLV4espYOG4EHxjj0MsrUB2Vnr47xmlZYRf6r7k2J09H+JpBdaGrWwrTkyBEi5i3c3yy2Q==} peerDependencies: - '@tiptap/pm': ^3.20.0 + '@tiptap/pm': 3.32.0 - '@tiptap/extension-blockquote@3.20.0': - resolution: {integrity: sha512-LQzn6aGtL4WXz2+rYshl/7/VnP2qJTpD7fWL96GXAzhqviPEY1bJES7poqJb3MU/gzl8VJUVzVzU1VoVfUKlbA==} + '@tiptap/extension-blockquote@3.32.0': + resolution: {integrity: sha512-wmuthEdlYVArNoUbqFPH35giutBABFu7fqEB0lTD1k0UXJUs4dFvcbRyGWWgnHFZgP3TT4u8e+xiayYw0eQ0NQ==} peerDependencies: - '@tiptap/core': ^3.20.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 - '@tiptap/extension-bold@3.20.0': - resolution: {integrity: sha512-sQklEWiyf58yDjiHtm5vmkVjfIc/cBuSusmCsQ0q9vGYnEF1iOHKhGpvnCeEXNeqF3fiJQRlquzt/6ymle3Iwg==} + '@tiptap/extension-bold@3.32.0': + resolution: {integrity: sha512-SQYewnYDoIBN+8oH53IDcD8p+Pz+Jnyq3hrxjy/FAo5ctc+96d3ZLdqc9gzLVSqFFo/SUINv2FVGoq9PvU7yqw==} peerDependencies: - '@tiptap/core': ^3.20.0 + '@tiptap/core': 3.32.0 - '@tiptap/extension-bubble-menu@3.20.0': - resolution: {integrity: sha512-MDosUfs8Tj+nwg8RC+wTMWGkLJORXmbR6YZgbiX4hrc7G90Gopdd6kj6ht5/T8t7dLLaX7N0+DEHdUEPGED7dw==} + '@tiptap/extension-bubble-menu@3.32.0': + resolution: {integrity: sha512-X3ll8i9Z8QNvt7+tcqlwopJG+68ugO13Av0Ox4Ico+jXcTnFdDuKQJBSI9sLuMR5vTQOeTHhKYXhjF88aahMSA==} peerDependencies: - '@tiptap/core': ^3.20.0 - '@tiptap/pm': ^3.20.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 - '@tiptap/extension-bullet-list@3.20.0': - resolution: {integrity: sha512-OcKMeopBbqWzhSi6o8nNz0aayogg1sfOAhto3NxJu3Ya32dwBFqmHXSYM6uW4jOphNvVPyjiq9aNRh3qTdd1dw==} + '@tiptap/extension-bullet-list@3.32.0': + resolution: {integrity: sha512-Y5P/l06pVCUG46vXpBl3z0fW2b6JpSMX4Cvr+5sfQh8zB3TxwSiLQaaPwI3R5MFD1KfRk3AjiPRieEyXdWcNHw==} peerDependencies: - '@tiptap/extension-list': ^3.20.0 + '@tiptap/extension-list': 3.32.0 - '@tiptap/extension-character-count@3.20.0': - resolution: {integrity: sha512-WxE0HgntJfkpaCy7u7ANL7jwqygSIu1wc7eKL78sp1jr0QeyQYj5Addq7h//fpr7OI9+V8v55tM2+qd8RiI77Q==} + '@tiptap/extension-character-count@3.32.0': + resolution: {integrity: sha512-/O2tdGr7MPDIWIWzPzmaqPwSrnrW17/K1tFZVL+LbvVs1ur+QTCKcJgvQls6OpKDqL3tDmlZbI8bUCvBhB2/7Q==} peerDependencies: - '@tiptap/extensions': ^3.20.0 + '@tiptap/extensions': 3.32.0 '@tiptap/extension-code-block-lowlight@3.20.0': resolution: {integrity: sha512-9lN9rn07lOWkLnByT5C1axtq56MHpOI7MpLaCmX3p+x1bDl6Uvixm6AoBdTLfZUmUYeEFBsf7t5cR+QepMbkiA==} @@ -8151,228 +8150,228 @@ packages: highlight.js: ^11 lowlight: ^2 || ^3 - '@tiptap/extension-code-block@3.20.0': - resolution: {integrity: sha512-lBbmNek14aCjrHcBcq3PRqWfNLvC6bcRa2Osc6e/LtmXlcpype4f6n+Yx+WZ+f2uUh0UmDRCz7BEyUETEsDmlQ==} + '@tiptap/extension-code-block@3.32.0': + resolution: {integrity: sha512-9NZW/yXP9j9XKr+hRS5m58xiyZI+tQo1PJ7eLHXjGNFWaF601NG/h6741mbKh5uCY51XsbyqG+7que+RavngPA==} peerDependencies: - '@tiptap/core': ^3.20.0 - '@tiptap/pm': ^3.20.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 - '@tiptap/extension-code@3.20.0': - resolution: {integrity: sha512-TYDWFeSQ9umiyrqsT6VecbuhL8XIHkUhO+gEk0sVvH67ZLwjFDhAIIgWIr1/dbIGPcvMZM19E7xUUhAdIaXaOQ==} + '@tiptap/extension-code@3.32.0': + resolution: {integrity: sha512-I+aEVl0dTmkfnU6HzBGEefb9U7ja2MkucwBBwrmoMwU+uIKpC4xw8NcHC9X6sjAcom3Pxs2HX+8WEo4Vp13R/Q==} peerDependencies: - '@tiptap/core': ^3.20.0 + '@tiptap/core': 3.32.0 - '@tiptap/extension-collaboration@3.27.0': - resolution: {integrity: sha512-IzLOp6mUL0UBMYO37g2cWtx277nz9cdEUJOSH9KzG8MsftnL5teGnVIcqaLoXu+t11yY0kXlqL9rO8S3qPRMNA==} + '@tiptap/extension-collaboration@3.32.0': + resolution: {integrity: sha512-db7VPDksD13zsYVi/Hao2Je5ZMwGRuXxVBDFv182Kr06aixxAWjBJ5JvYf6AgcrDKFx/dPPpDjctKQjJPtw6VA==} peerDependencies: - '@tiptap/core': 3.27.0 - '@tiptap/pm': 3.27.0 - '@tiptap/y-tiptap': ^3.0.5 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 + '@tiptap/y-tiptap': ^3.0.7 yjs: ^13 - '@tiptap/extension-document@3.20.0': - resolution: {integrity: sha512-oJfLIG3vAtZo/wg29WiBcyWt22KUgddpP8wqtCE+kY5Dw8znLR9ehNmVWlSWJA5OJUMO0ntAHx4bBT+I2MBd5w==} + '@tiptap/extension-document@3.32.0': + resolution: {integrity: sha512-GugeKE6AnZDluRXJUNBuX43TPcaJxy5wck6vT2J4a0/EnKStJ43suSZZf1IPfb1ij9EL9bYvAwg9DOcrvdEzTQ==} peerDependencies: - '@tiptap/core': ^3.20.0 + '@tiptap/core': 3.32.0 - '@tiptap/extension-drag-handle-react@3.20.0': - resolution: {integrity: sha512-f/rW/S6UiO8RCKgjioUh6zYdNmrSLzOBlKAt87HBN+TYBD54ZIaYTJYFjdPhonTpOgRTlcuUGGFBN+WCsE1+Bw==} + '@tiptap/extension-drag-handle-react@3.32.0': + resolution: {integrity: sha512-NP4IVWZbhiE8Yoa9cQ9y8Jk93RMuCAFH3MMgJywdqmakVYr1ZAYZluUfsZ1whSCWTcjdZLoJILTLgSwaV6O8kg==} peerDependencies: - '@tiptap/extension-drag-handle': ^3.20.0 - '@tiptap/pm': ^3.20.0 - '@tiptap/react': ^3.20.0 + '@tiptap/extension-drag-handle': 3.32.0 + '@tiptap/pm': 3.32.0 + '@tiptap/react': 3.32.0 react: ^16.8 || ^17 || ^18 || ^19 react-dom: ^16.8 || ^17 || ^18 || ^19 - '@tiptap/extension-drag-handle@3.20.0': - resolution: {integrity: sha512-CzLRyxZe5QddQey0RUWJUvICyhuRnU/jvzMIYlFvMxM7W97sZ2ggk0cRThlRt2pRUoSr8mmmUnobiorpISmksA==} + '@tiptap/extension-drag-handle@3.32.0': + resolution: {integrity: sha512-yV6rTZlkS6Fjd6gXzd3zXxMvq82Nu7+DqdmyRtuaSKiRepvJPZvLijfS5ZgN6cjj75mrWCM+cgRODYVCDh11mA==} peerDependencies: - '@tiptap/core': ^3.20.0 - '@tiptap/extension-collaboration': ^3.20.0 - '@tiptap/extension-node-range': ^3.20.0 - '@tiptap/pm': ^3.20.0 - '@tiptap/y-tiptap': ^3.0.2 + '@tiptap/core': 3.32.0 + '@tiptap/extension-collaboration': 3.32.0 + '@tiptap/extension-node-range': 3.32.0 + '@tiptap/pm': 3.32.0 + '@tiptap/y-tiptap': ^3.0.7 - '@tiptap/extension-dropcursor@3.20.0': - resolution: {integrity: sha512-d+cxplRlktVgZPwatnc34IArlppM0IFKS1J5wLk+ba1jidizsbMVh45tP/BTK2flhyfRqcNoB5R0TArhUpbkNQ==} + '@tiptap/extension-dropcursor@3.32.0': + resolution: {integrity: sha512-t4Ug8hFLt30dwwYvrh63BVUt6N1Yg5PVI3tMllhCmN3Q68oD47v4MB/i5nGfzIsQqMyXUOetwHJWcZ4MoLTx4Q==} peerDependencies: - '@tiptap/extensions': ^3.20.0 + '@tiptap/extensions': 3.32.0 - '@tiptap/extension-floating-menu@3.20.0': - resolution: {integrity: sha512-rYs4Bv5pVjqZ/2vvR6oe7ammZapkAwN51As/WDbemvYDjfOGRqK58qGauUjYZiDzPOEIzI2mxGwsZ4eJhPW4Ig==} + '@tiptap/extension-floating-menu@3.32.0': + resolution: {integrity: sha512-AzKCWceL+4Q1pTc8Whw1kPqN/aYGPQ70/jXPsblWl501t/pXi6Kz0Pi/NggKkuu73VGjykh68YYf/dcOJ/mPZQ==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': ^3.20.0 - '@tiptap/pm': ^3.20.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 - '@tiptap/extension-focus@3.20.0': - resolution: {integrity: sha512-grdNME0fRLsVrG6+CoTJgTWH6jJkpxuP3x92DY4wSvKi1XtCy5WaqIu4k7NLfucb/CDuFpQd6/vH+p2gwfmkJA==} + '@tiptap/extension-focus@3.32.0': + resolution: {integrity: sha512-cNYdk3cCiUHZwrsYk7i8o9spuyUIyETDXMvAjUeUi8gv3dASqyYwCfLmIY1WEwuJq4CEXH1nwRRz/rejE5NfZA==} peerDependencies: - '@tiptap/extensions': ^3.20.0 + '@tiptap/extensions': 3.32.0 - '@tiptap/extension-gapcursor@3.20.0': - resolution: {integrity: sha512-P/LasfvG9/qFq43ZAlNbAnPnXC+/RJf49buTrhtFvI9Zg0+Lbpjx1oh6oMHB19T88Y28KtrckfFZ8aTSUWDq6w==} + '@tiptap/extension-gapcursor@3.32.0': + resolution: {integrity: sha512-HUpKKWJLtthnpQY5LIjHlJJOmh562RusmOMIe/4iP/H7y+WUR9ZFiZjEs1NBkRjig9fwj8F3BfsrVPYBnM4nLA==} peerDependencies: - '@tiptap/extensions': ^3.20.0 + '@tiptap/extensions': 3.32.0 - '@tiptap/extension-hard-break@3.20.0': - resolution: {integrity: sha512-rqvhMOw4f+XQmEthncbvDjgLH6fz8L9splnKZC7OeS0eX8b0qd7+xI1u5kyxF3KA2Z0BnigES++jjWuecqV6mA==} + '@tiptap/extension-hard-break@3.32.0': + resolution: {integrity: sha512-IKUYvK+bO2hGrDWhhTVg0CSh9C2belWg9GyLzvpyd3SZyQ9EgdccLfoytNjOBKbAE/TQ4Oo3kSP+XF6RsUIKPA==} peerDependencies: - '@tiptap/core': ^3.20.0 + '@tiptap/core': 3.32.0 - '@tiptap/extension-heading@3.20.0': - resolution: {integrity: sha512-JgJhurnCe3eN6a0lEsNQM/46R1bcwzwWWZEFDSb1P9dR8+t1/5v7cMZWsSInpD7R4/74iJn0+M5hcXLwCmBmYA==} + '@tiptap/extension-heading@3.32.0': + resolution: {integrity: sha512-XRiZxZuhfjvbgwCvoBHj04gOsPANEXxxRwrFCQVuFi5yeTHYIzMEioc81j6iAH9pV7aQeJCwLxuh6VHNz3dXEQ==} peerDependencies: - '@tiptap/core': ^3.20.0 + '@tiptap/core': 3.32.0 - '@tiptap/extension-horizontal-rule@3.20.0': - resolution: {integrity: sha512-6uvcutFMv+9wPZgptDkbRDjAm3YVxlibmkhWD5GuaWwS9L/yUtobpI3GycujRSUZ8D3q6Q9J7LqpmQtQRTalWA==} + '@tiptap/extension-horizontal-rule@3.32.0': + resolution: {integrity: sha512-Iry7ynsG4xgcxnH1cm+uXJnEtUzoop4sGA10NUN9I+08TOjhj/GrDiRKMQHKAiVI/R7t2MVav1MJlxFf2FdzGw==} peerDependencies: - '@tiptap/core': ^3.20.0 - '@tiptap/pm': ^3.20.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 - '@tiptap/extension-image@3.20.0': - resolution: {integrity: sha512-0t7HYncV0kYEQS79NFczxdlZoZ8zu8X4VavDqt+mbSAUKRq3gCvgtZ5Zyd778sNmtmbz3arxkEYMIVou2swD0g==} + '@tiptap/extension-image@3.32.0': + resolution: {integrity: sha512-nv/YlOMwFUp2ItffQbHb14yAJjrn9sdxKl0WK5rH8PPiNoXVkvasieoBLNTHan9gjhrSp7LjVG2ZsMoSe/I7gg==} peerDependencies: - '@tiptap/core': ^3.20.0 + '@tiptap/core': 3.32.0 - '@tiptap/extension-italic@3.20.0': - resolution: {integrity: sha512-/DhnKQF8yN8RxtuL8abZ28wd5281EaGoE2Oha35zXSOF1vNYnbyt8Ymkv/7u1BcWEWTvRPgaju0YCGXisPRLYw==} + '@tiptap/extension-italic@3.32.0': + resolution: {integrity: sha512-KB/i1xoHilbBGcQ+UotDWhi60KpdCde3RzRIpl2na0Yol4z4Fe2IRWg8ljIrlsssDRwel/fsHJbG7a13EP8oKA==} peerDependencies: - '@tiptap/core': ^3.20.0 + '@tiptap/core': 3.32.0 - '@tiptap/extension-link@3.20.0': - resolution: {integrity: sha512-qI/5A+R0ZWBxo/8HxSn1uOyr7odr3xHBZ/gzOR1GUJaZqjlJxkWFX0RtXMbLKEGEvT25o345cF7b0wFznEh8qA==} + '@tiptap/extension-link@3.32.0': + resolution: {integrity: sha512-DRdQSgWPSEjrDg5EDBB5yxRygHtUVLhceVGzAsTz8RziiFyvcwAvzBHCO9hd9jutjCXQ2DLIuZB8P+aHhFWnpg==} peerDependencies: - '@tiptap/core': ^3.20.0 - '@tiptap/pm': ^3.20.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 - '@tiptap/extension-list-item@3.20.0': - resolution: {integrity: sha512-qEtjaaGPuqaFB4VpLrGDoIe9RHnckxPfu6d3rc22ap6TAHCDyRv05CEyJogqccnFceG/v5WN4znUBER8RWnWHA==} + '@tiptap/extension-list-item@3.32.0': + resolution: {integrity: sha512-FdJTCAeALixzyyGSSEmroXmkIEclbo/4t2Pl03aRERqpPOSPJcC3evDtIhLazTuP6v+FjCmJ+pXNql6ov7qitA==} peerDependencies: - '@tiptap/extension-list': ^3.20.0 + '@tiptap/extension-list': 3.32.0 - '@tiptap/extension-list-keymap@3.20.0': - resolution: {integrity: sha512-Z4GvKy04Ms4cLFN+CY6wXswd36xYsT2p/YL0V89LYFMZTerOeTjFYlndzn6svqL8NV1PRT5Diw4WTTxJSmcJPA==} + '@tiptap/extension-list-keymap@3.32.0': + resolution: {integrity: sha512-vXFre18Dk2m5N/gjo408C02GSrolZ8ZIf0wz6/U8lNC4FcYOISgZFj3BND6uabVntGh2GCSPrVFuNpVPhFnn/A==} peerDependencies: - '@tiptap/extension-list': ^3.20.0 + '@tiptap/extension-list': 3.32.0 - '@tiptap/extension-list@3.20.0': - resolution: {integrity: sha512-+V0/gsVWAv+7vcY0MAe6D52LYTIicMSHw00wz3ISZgprSb2yQhJ4+4gurOnUrQ4Du3AnRQvxPROaofwxIQ66WQ==} + '@tiptap/extension-list@3.32.0': + resolution: {integrity: sha512-QdzS5nFz9agAQhBgIuQluobWib39W2cMKx1XB6tYSue7bHMJdgPFP0EnGfFajaeVX42CG6RXtQWrNfyQGKhBvg==} peerDependencies: - '@tiptap/core': ^3.20.0 - '@tiptap/pm': ^3.20.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 - '@tiptap/extension-node-range@3.20.0': - resolution: {integrity: sha512-XeKKTV88VuJ4Mh0Rxvc/PPzG76cb44sE+rB4u0J/ms63R/WFTm6yJQlCgUVGnGeHleSlrWuZY8gGSuoljmQzqg==} + '@tiptap/extension-node-range@3.32.0': + resolution: {integrity: sha512-Btwa7aciucAJkOoX8Fig3g6p7zdbg6PPtplRW/idVcWdYqKgEQgTyMV1M91GN6yksxt6bU2YBmC4FgEqTMyGuw==} peerDependencies: - '@tiptap/core': ^3.20.0 - '@tiptap/pm': ^3.20.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 - '@tiptap/extension-ordered-list@3.20.0': - resolution: {integrity: sha512-jVKnJvrizLk7etwBMfyoj6H2GE4M+PD4k7Bwp6Bh1ohBWtfIA1TlngdS842Mx5i1VB2e3UWIwr8ZH46gl6cwMA==} + '@tiptap/extension-ordered-list@3.32.0': + resolution: {integrity: sha512-htZ5hoMLBkGiDP6M5mGemjOoaBmkrj911wiGoTmMMKzO7qJq9QxUBkLY7ILPaKlUWL8U3ccLdDV2TB/nysp4Jg==} peerDependencies: - '@tiptap/extension-list': ^3.20.0 + '@tiptap/extension-list': 3.32.0 - '@tiptap/extension-paragraph@3.20.0': - resolution: {integrity: sha512-mM99zK4+RnEXIMCv6akfNATAs0Iija6FgyFA9J9NZ6N4o8y9QiNLLa6HjLpAC+W+VoCgQIekyoF/Q9ftxmAYDQ==} + '@tiptap/extension-paragraph@3.32.0': + resolution: {integrity: sha512-afKLMc7fWMkkar9H5FilizStSbhFzUoCzdwwdZf6DDsn3LUt8tJlFHACK78cAyx/TzMJBo0N8/8T1u9bL+N67Q==} peerDependencies: - '@tiptap/core': ^3.20.0 + '@tiptap/core': 3.32.0 - '@tiptap/extension-placeholder@3.20.0': - resolution: {integrity: sha512-ZhYD3L5m16ydSe2z8vqz+RdtAG/iOQaFHHedFct70tKRoLqi2ajF5kgpemu8DwpaRTcyiCN4G99J/+MqehKNjQ==} + '@tiptap/extension-placeholder@3.32.0': + resolution: {integrity: sha512-TSjyQmVFq56gfURPotxbMsXU3seNTy9VzMACdb6b0bQ66yGWBcjBfWmhpiSRVLdBjQrRvl1+jQbWx0YPSCSpsw==} peerDependencies: - '@tiptap/extensions': ^3.20.0 + '@tiptap/extensions': 3.32.0 - '@tiptap/extension-strike@3.20.0': - resolution: {integrity: sha512-0vcTZRRAiDfon3VM1mHBr9EFmTkkUXMhm0Xtdtn0bGe+sIqufyi+hUYTEw93EQOD9XNsPkrud6jzQNYpX2H3AQ==} + '@tiptap/extension-strike@3.32.0': + resolution: {integrity: sha512-J9Vw6wmh/wV6SxSsN9RhurvAGcXSY5J3p4EQrROD5PARBl0VOnDFi7/UVoz1RkSdqOKPgAiqDZpaLRgtdBO9Rg==} peerDependencies: - '@tiptap/core': ^3.20.0 + '@tiptap/core': 3.32.0 - '@tiptap/extension-subscript@3.20.0': - resolution: {integrity: sha512-EX3GPey4Gp9W04zM2MsP5OfMnwGtQTh1Q0ZokJAdENHpyXbche9WjK31FTzwEmTSqlU5stSsH5KwhSYlDwm5rA==} + '@tiptap/extension-subscript@3.32.0': + resolution: {integrity: sha512-f1NeIyTB3AkQTyC9xM8QVFDPsGekwJqHhcMfd5TW/sDv6BV39yT2zAjRjEICAEx298cJt8AnNflxvFs5A3mTfQ==} peerDependencies: - '@tiptap/core': ^3.20.0 - '@tiptap/pm': ^3.20.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 - '@tiptap/extension-superscript@3.20.0': - resolution: {integrity: sha512-NNFv58LM/7JMu4aq9Apq8yuaB8MDL5dvVZ7R6qMuQNZDVGAGgoiBqtglA1RXldNl/9IFcVg67rT8oF86qykYKA==} + '@tiptap/extension-superscript@3.32.0': + resolution: {integrity: sha512-4Xv6yTVEnn9rPa6eZ18q4wqw/pGTkw3aNI5aaCrder8XH5uuO5HfL42CPhRKWWFaer/WPwEL1lkUlskgbx+lLg==} peerDependencies: - '@tiptap/core': ^3.20.0 - '@tiptap/pm': ^3.20.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 - '@tiptap/extension-table-cell@3.20.0': - resolution: {integrity: sha512-9Dg4zda3UWwtpBwSG7b9BeQy5oT27a/yEIBeARuxe19bloMLZgqpPRtnSrOK0OAITtVnjA+NZdKPcVLRMS2E8A==} + '@tiptap/extension-table-cell@3.32.0': + resolution: {integrity: sha512-gJ2Jf19tu6teiXrI+2kJXJr3fZ9DQCpThxgmPoVT9FV4O+R+cuR98D+R5fxNoQ22lD3/tZO8lBV5m/Bm67aLJQ==} peerDependencies: - '@tiptap/extension-table': ^3.20.0 + '@tiptap/extension-table': 3.32.0 - '@tiptap/extension-table-header@3.20.0': - resolution: {integrity: sha512-2tVHHlihpeHO/gh2uU46gAX3NTGdKR+yDmfLlO2l0QAvx2TXNfNzX2pOM4MmyostW5Ko9TCWV4x0D9h3IQDhPw==} + '@tiptap/extension-table-header@3.32.0': + resolution: {integrity: sha512-UNJG3lK3g534Dhwxzu2UOXSfyY/EFFR1zaSkDGTAEWPsfEbV2fr+8VhTZZCBgUR7brU7PxIpgZlJ7oqoxjo4jA==} peerDependencies: - '@tiptap/extension-table': ^3.20.0 + '@tiptap/extension-table': 3.32.0 - '@tiptap/extension-table-row@3.20.0': - resolution: {integrity: sha512-clkfQahkYW/U48QBh1rPZv3AWWSC9AqGKp2DLTH/SGIorM/NwI0jpPtBETMlvowyQu0ivlH9B896smEph+Do2A==} + '@tiptap/extension-table-row@3.32.0': + resolution: {integrity: sha512-s4qwMZOZoCmsXbqY+BGvOI/q7jzukum4smlIO83rqHJTsZyG2UarZF0oWRuCtjR5DoBZLBD3SVW0rUtKDtbIjA==} peerDependencies: - '@tiptap/extension-table': ^3.20.0 + '@tiptap/extension-table': 3.32.0 - '@tiptap/extension-table@3.20.0': - resolution: {integrity: sha512-vaaMtQ2KnSSr8WVwgWf7NYNzPwrHx/6T0ekA5CxV8qNUEpXIaLXa5+tE7tJHWEdNR2KY3gUJ46D3lfOkxyFrBQ==} + '@tiptap/extension-table@3.32.0': + resolution: {integrity: sha512-uOqCzWzxXvMccapZo+1CDxp3JGegxqNl11Lj8XiiWLxwmg81B/bKwMJW7+YlIdffgGNYJETk5YwL8T0IVBD2QQ==} peerDependencies: - '@tiptap/core': ^3.20.0 - '@tiptap/pm': ^3.20.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 - '@tiptap/extension-text-align@3.20.0': - resolution: {integrity: sha512-4s0r+bovtH6yeGDUD+Ui8j5WOV5koB5P6AuzOMqoLwaFGRSkKf64ly6DXjjmjIgnYCLZN/XO6llaQKVVdvad2g==} + '@tiptap/extension-text-align@3.32.0': + resolution: {integrity: sha512-DdV/V86ds9VtQ1MkbovgI28xwSvOW03I8SexsaKljGqSN/HovBXEjlefSnbK4tlWmQLJPH9eNsxRcpHJMftYCA==} peerDependencies: - '@tiptap/core': ^3.20.0 + '@tiptap/core': 3.32.0 - '@tiptap/extension-text@3.20.0': - resolution: {integrity: sha512-tf8bE8tSaOEWabCzPm71xwiUhyMFKqY9jkP5af3Kr1/F45jzZFIQAYZooHI/+zCHRrgJ99MQHKHe1ZNvODrKHQ==} + '@tiptap/extension-text@3.32.0': + resolution: {integrity: sha512-sF0jIK67IHdZMnzv2mz5vPTyK7R0ui6/YZgFg+/bLnFCNmweVAoYcHZLlC7ISRnwu0mqJr+epNtzJepY1ZDCjg==} peerDependencies: - '@tiptap/core': ^3.20.0 + '@tiptap/core': 3.32.0 - '@tiptap/extension-typography@3.20.0': - resolution: {integrity: sha512-XpstIJ/hCK6+N87DdzjaYie1iH1gunbDK0UCsqsLemd8rMR/WAlF04M/yeJ6F2QtNzNh83bkoTxyNAHLDdUm2A==} + '@tiptap/extension-typography@3.32.0': + resolution: {integrity: sha512-Qad+yXoZuYpfOg3A/1GHwwp1lq4q6+9VhHOG/ESuccRLibUdrorZ4Xi16yddCCZtS8GO+0ABJw5y7Uko5nYagQ==} peerDependencies: - '@tiptap/core': ^3.20.0 + '@tiptap/core': 3.32.0 - '@tiptap/extension-underline@3.20.0': - resolution: {integrity: sha512-LzNXuy2jwR/y+ymoUqC72TiGzbOCjioIjsDu0MNYpHuHqTWPK5aV9Mh0nbZcYFy/7fPlV1q0W139EbJeYBZEAQ==} + '@tiptap/extension-underline@3.32.0': + resolution: {integrity: sha512-rMLdd4vg6sed/JnaXnaupLbCtYiWikTnQ8qir9ItKOXwf1Ui9P1Y4G0bYU4+gcnMsFzaSGtrOhMqG4/c66AogQ==} peerDependencies: - '@tiptap/core': ^3.20.0 + '@tiptap/core': 3.32.0 - '@tiptap/extensions@3.20.0': - resolution: {integrity: sha512-HIsXX942w3nbxEQBlMAAR/aa6qiMBEP7CsSMxaxmTIVAmW35p6yUASw6GdV1u0o3lCZjXq2OSRMTskzIqi5uLg==} + '@tiptap/extensions@3.32.0': + resolution: {integrity: sha512-qO+ndNvlOjzU2MWCtQHoRg1tIortCXLvqPjDx58F1pUYFNCOVZegXi+jqLGDODUA31er+TVz66umzRbbN1bO1Q==} peerDependencies: - '@tiptap/core': ^3.20.0 - '@tiptap/pm': ^3.20.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 - '@tiptap/pm@3.20.0': - resolution: {integrity: sha512-jn+2KnQZn+b+VXr8EFOJKsnjVNaA4diAEr6FOazupMt8W8ro1hfpYtZ25JL87Kao/WbMze55sd8M8BDXLUKu1A==} + '@tiptap/pm@3.32.0': + resolution: {integrity: sha512-H9eN+xHFboJybE7KPGVsu24S8aBlCIgYz38vCHRSnNv17nwmqm06owq/IQ5scza0n3Y7IfUfpgPOtm9SgeHmNQ==} - '@tiptap/react@3.20.0': - resolution: {integrity: sha512-jFLNzkmn18zqefJwPje0PPd9VhZ7Oy28YHiSvSc7YpBnQIbuN/HIxZ2lrOsKyEHta0WjRZjfU5X1pGxlbcGwOA==} + '@tiptap/react@3.32.0': + resolution: {integrity: sha512-+iS9RKj6Ve8SXqJ49xptDiifF7PQXmUOh4cjMu+BCXXqKphQkiUccvbWYAeOJCTceM01wWgFhrpfy8qG+CHJYw==} peerDependencies: - '@tiptap/core': ^3.20.0 - '@tiptap/pm': ^3.20.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 '@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.20.0': - resolution: {integrity: sha512-W4+1re35pDNY/7rpXVg+OKo/Fa4Gfrn08Bq3E3fzlJw6gjE3tYU8dY9x9vC2rK9pd9NOp7Af11qCFDaWpohXkw==} + '@tiptap/starter-kit@3.32.0': + resolution: {integrity: sha512-aPYxaevci4PgMrTLsg+baiqI7M1ICd4V9H+zTTdrqs8OUZIbAvj/pNDuHU8uWZyKMu3Dh72t2D6ZdqRu/6aSWw==} - '@tiptap/suggestion@3.20.0': - resolution: {integrity: sha512-OA9Fe+1Q/Ex0ivTcpRcVFiLnNsVdIBmiEoctt/gu4H2ayCYmZ906veioXNdc1m/3MtVVUIuEnvwwsrOZXlfDEw==} + '@tiptap/suggestion@3.32.0': + resolution: {integrity: sha512-5PbouU06zaZ7n4uyYzeNN/jBFVmGsHZ6c56MvN7M33echERAhu1L1X71Up0U6GK/pJfyugX7WbluBehJDPQeSQ==} peerDependencies: - '@tiptap/core': ^3.20.0 - '@tiptap/pm': ^3.20.0 + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': 3.32.0 + '@tiptap/pm': 3.32.0 - '@tiptap/y-tiptap@3.0.5': - resolution: {integrity: sha512-WoK5z3jMW+9nzumcWAxEDRCSC7yQmdq4NN0157MaxQBl9dGWwjxJx3+11mb+WAqR37oDeAMKMmSNy+/hm2XGlA==} - engines: {node: '>=16.0.0', npm: '>=8.0.0'} + '@tiptap/y-tiptap@3.0.10': + resolution: {integrity: sha512-vJtwYVoBBk+e8KyUVoH9WSsfUfKTXf1Uh+tk2UNTlD8wim9j7XVTuc7sakWUYuznB7DkXThT9w5uQTGH2SN0Kg==} peerDependencies: prosemirror-model: ^1.7.1 prosemirror-state: ^1.2.3 @@ -8447,18 +8446,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/linkify-it@5.0.0': - resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - - '@types/markdown-it@14.1.2': - resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/mdurl@2.0.0': - resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -10306,6 +10296,7 @@ packages: lib0@0.2.117: resolution: {integrity: sha512-DeXj9X5xDCjgKLU/7RR+/HQEVzuuEUiwldwOGsHK/sfAfELGWEyTcf0x+uOvCvK3O2zPmZePXWL85vtia6GyZw==} engines: {node: '>=16'} + hasBin: true libsql@0.3.19: resolution: {integrity: sha512-Aj5cQ5uk/6fHdmeW0TiXK42FqUlwx7ytmMLPSaUQPin5HKKKuUPD62MAbN4OEweGBBI7q1BekoEN4gPUEL6MZA==} @@ -10463,11 +10454,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - - linkifyjs@4.3.2: - resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} + linkifyjs@4.4.0: + resolution: {integrity: sha512-InTexvtbai+2c+dEVGcc6O6P2DMVIiwD9a/i4zFroazOIYLOS6FSVmAJ7kFeumnCMx6/gQqNAkbUvgMubV4+MA==} lite-youtube-embed@0.3.4: resolution: {integrity: sha512-aXgxpwK7AIW58GEbRzA8EYaY4LWvF3FKak6B9OtSJmuNyLhX2ouD4cMTxz/yR5HFInhknaYd2jLWOTRTvT8oAw==} @@ -10508,9 +10496,6 @@ packages: magicast@0.5.2: resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} - markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} - marked-terminal@7.1.0: resolution: {integrity: sha512-+pvwa14KZL74MVXjYdPR3nSInhGhNvPce/3mqLVZT2oUvt654sL1XImFuLZ1pkA866IYZ3ikDTOFUIC7XzpZZg==} engines: {node: '>=16.0.0'} @@ -10553,9 +10538,6 @@ packages: mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -11290,23 +11272,20 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - prosemirror-changeset@2.3.1: - resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==} + prosemirror-changeset@2.4.4: + resolution: {integrity: sha512-Gyuz9jYdrAeA9I7AholyOes9KUmv/lEwsC5O9s5xF5VB3EgTPsXMGUxz4+H1B+wKVPdZbvRcg1Cp3x8qX+8ofA==} - prosemirror-collab@1.3.1: - resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + prosemirror-commands@1.7.2: + resolution: {integrity: sha512-q6Q6szxqdu9Xd6EcdKsqXghu5nQdZTpB4Q9yd04WRc7/jt763e/rT60Owh0L1GYY+T46o5rD+9lEN36dZS43tw==} - prosemirror-commands@1.7.1: - resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} + prosemirror-dropcursor@1.8.4: + resolution: {integrity: sha512-VmKxhcA6a+h5oPSYmfF1ZNeQqPbyYaIxqZsKqeYCyTlPtrjUgNaHL3P8vVaO19oqAV0zuaM/axkowZHrB1P3Tg==} - prosemirror-dropcursor@1.8.2: - resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} + prosemirror-gapcursor@1.4.1: + resolution: {integrity: sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==} - prosemirror-gapcursor@1.4.0: - resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==} - - prosemirror-history@1.5.0: - resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} + prosemirror-history@1.5.1: + resolution: {integrity: sha512-onlwnqKvgtFg6srZOmDOAhlAy1FIHQpOExORybX0S+DvJepE5tPALrB9iGet/2sqqqrelSnB10OoiOJqAvu2DA==} prosemirror-inputrules@1.5.1: resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} @@ -11314,17 +11293,8 @@ packages: prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - prosemirror-markdown@1.13.2: - resolution: {integrity: sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==} - - prosemirror-menu@1.2.5: - resolution: {integrity: sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==} - - prosemirror-model@1.25.4: - resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} - - prosemirror-schema-basic@1.2.4: - resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} + prosemirror-model@1.25.12: + resolution: {integrity: sha512-Ue2gTmXMa7EhpLNhC7J+h4+ykD8ha12K6rrZFFKKJHBForfIStw5gJ6Zrf1mqqAa9NmpmEB4wp9bKmA4eUVjWg==} prosemirror-schema-list@1.5.1: resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} @@ -11335,21 +11305,11 @@ packages: prosemirror-tables@1.8.5: resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==} - prosemirror-trailing-node@3.0.0: - resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} - peerDependencies: - prosemirror-model: ^1.22.1 - prosemirror-state: ^1.4.2 - prosemirror-view: ^1.33.8 - - prosemirror-transform@1.10.5: - resolution: {integrity: sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==} + prosemirror-transform@1.12.4: + resolution: {integrity: sha512-2/WuPum3pn+O/Vi2vzpi8210ICUe2kIPXdLYjQ09Pv5DtT5bcKWMJhAKPBwvpPjpp5iOYUVwVEr0gOM1BY1Mgw==} - prosemirror-transform@1.12.0: - resolution: {integrity: sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==} - - prosemirror-view@1.41.5: - resolution: {integrity: sha512-UDQbIPnDrjE8tqUBbPmCOZgtd75htE6W3r0JCmY9bL6W1iemDM37MZEKC49d+tdQ0v/CKx4gjxLoLsfkD2NiZA==} + prosemirror-view@1.42.8: + resolution: {integrity: sha512-ftDZjCs9AjAekXmCfJRn2U3IdlRCl0Yc4tZT1/jJWCsz4DiSifEBXtWmpJpw/4f1Rg328uAUQ+u2lCJ0+AVZkw==} protobufjs@7.6.1: resolution: {integrity: sha512-4K0myLaWL5EteuSAro91EGFgcfVgxb64Jx+7oDAY6GOkXD4M69yuSEljNcInGVCA5sOPxmZ/EqDLj2x0Q0+Ygg==} @@ -11371,10 +11331,6 @@ packages: pump@3.0.3: resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -12092,9 +12048,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.6.3: resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} @@ -16760,8 +16713,6 @@ snapshots: dependencies: quansync: 1.0.0 - '@remirror/core-constants@3.0.0': {} - '@rolldown/binding-android-arm-eabi@1.2.11': optional: true @@ -17791,231 +17742,227 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@tiptap/core@3.20.0(@tiptap/pm@3.20.0)': + '@tiptap/core@3.32.0(@tiptap/pm@3.32.0)': dependencies: - '@tiptap/pm': 3.20.0 + '@tiptap/pm': 3.32.0 - '@tiptap/extension-blockquote@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))': + '@tiptap/extension-blockquote@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 - '@tiptap/extension-bold@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))': + '@tiptap/extension-bold@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) - '@tiptap/extension-bubble-menu@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)': + '@tiptap/extension-bubble-menu@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': dependencies: '@floating-ui/dom': 1.7.6 - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 optional: true - '@tiptap/extension-bullet-list@3.20.0(@tiptap/extension-list@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))': + '@tiptap/extension-bullet-list@3.32.0(@tiptap/extension-list@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/extension-list': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + '@tiptap/extension-list': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) - '@tiptap/extension-character-count@3.20.0(@tiptap/extensions@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))': + '@tiptap/extension-character-count@3.32.0(@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/extensions': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + '@tiptap/extensions': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) - '@tiptap/extension-code-block-lowlight@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/extension-code-block@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(highlight.js@11.11.2)(lowlight@3.3.0)': + '@tiptap/extension-code-block-lowlight@3.20.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-code-block@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(highlight.js@11.11.2)(lowlight@3.3.0)': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/extension-code-block': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/extension-code-block': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 highlight.js: 11.11.2 lowlight: 3.3.0 - '@tiptap/extension-code-block@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)': + '@tiptap/extension-code-block@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 - '@tiptap/extension-code@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))': + '@tiptap/extension-code@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) - '@tiptap/extension-collaboration@3.27.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29)': + '@tiptap/extension-collaboration@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29)': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 - '@tiptap/y-tiptap': 3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + '@tiptap/y-tiptap': 3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29) yjs: 13.6.29 - '@tiptap/extension-document@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))': + '@tiptap/extension-document@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) - '@tiptap/extension-drag-handle-react@3.20.0(@tiptap/extension-drag-handle@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/extension-collaboration@3.27.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29))(@tiptap/extension-node-range@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29)))(@tiptap/pm@3.20.0)(@tiptap/react@3.20.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tiptap/extension-drag-handle-react@3.32.0(@tiptap/extension-drag-handle@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-collaboration@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29))(@tiptap/extension-node-range@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29)))(@tiptap/pm@3.32.0)(@tiptap/react@3.32.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@tiptap/extension-drag-handle': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/extension-collaboration@3.27.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29))(@tiptap/extension-node-range@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29)) - '@tiptap/pm': 3.20.0 - '@tiptap/react': 3.20.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tiptap/extension-drag-handle': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-collaboration@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29))(@tiptap/extension-node-range@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29)) + '@tiptap/pm': 3.32.0 + '@tiptap/react': 3.32.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@tiptap/extension-drag-handle@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/extension-collaboration@3.27.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29))(@tiptap/extension-node-range@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))': + '@tiptap/extension-drag-handle@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/extension-collaboration@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29))(@tiptap/extension-node-range@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))': dependencies: '@floating-ui/dom': 1.7.6 - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/extension-collaboration': 3.27.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29) - '@tiptap/extension-node-range': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 - '@tiptap/y-tiptap': 3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/extension-collaboration': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29))(yjs@13.6.29) + '@tiptap/extension-node-range': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + '@tiptap/y-tiptap': 3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29) - '@tiptap/extension-dropcursor@3.20.0(@tiptap/extensions@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))': + '@tiptap/extension-dropcursor@3.32.0(@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/extensions': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + '@tiptap/extensions': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) - '@tiptap/extension-floating-menu@3.20.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)': + '@tiptap/extension-floating-menu@3.32.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': dependencies: '@floating-ui/dom': 1.7.6 - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 optional: true - '@tiptap/extension-focus@3.20.0(@tiptap/extensions@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))': + '@tiptap/extension-focus@3.32.0(@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/extensions': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + '@tiptap/extensions': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) - '@tiptap/extension-gapcursor@3.20.0(@tiptap/extensions@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))': + '@tiptap/extension-gapcursor@3.32.0(@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/extensions': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + '@tiptap/extensions': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) - '@tiptap/extension-hard-break@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))': + '@tiptap/extension-hard-break@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) - '@tiptap/extension-heading@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))': + '@tiptap/extension-heading@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) - '@tiptap/extension-horizontal-rule@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)': + '@tiptap/extension-horizontal-rule@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 - '@tiptap/extension-image@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))': + '@tiptap/extension-image@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) - '@tiptap/extension-italic@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))': + '@tiptap/extension-italic@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) - '@tiptap/extension-link@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)': + '@tiptap/extension-link@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 - linkifyjs: 4.3.2 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + linkifyjs: 4.4.0 - '@tiptap/extension-list-item@3.20.0(@tiptap/extension-list@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))': + '@tiptap/extension-list-item@3.32.0(@tiptap/extension-list@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/extension-list': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + '@tiptap/extension-list': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) - '@tiptap/extension-list-keymap@3.20.0(@tiptap/extension-list@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))': + '@tiptap/extension-list-keymap@3.32.0(@tiptap/extension-list@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/extension-list': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + '@tiptap/extension-list': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) - '@tiptap/extension-list@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)': + '@tiptap/extension-list@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 - '@tiptap/extension-node-range@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)': + '@tiptap/extension-node-range@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 - '@tiptap/extension-ordered-list@3.20.0(@tiptap/extension-list@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))': + '@tiptap/extension-ordered-list@3.32.0(@tiptap/extension-list@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/extension-list': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + '@tiptap/extension-list': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) - '@tiptap/extension-paragraph@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))': + '@tiptap/extension-paragraph@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) - '@tiptap/extension-placeholder@3.20.0(@tiptap/extensions@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))': + '@tiptap/extension-placeholder@3.32.0(@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/extensions': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + '@tiptap/extensions': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) - '@tiptap/extension-strike@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))': + '@tiptap/extension-strike@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) - '@tiptap/extension-subscript@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)': + '@tiptap/extension-subscript@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 - '@tiptap/extension-superscript@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)': + '@tiptap/extension-superscript@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 - '@tiptap/extension-table-cell@3.20.0(@tiptap/extension-table@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))': + '@tiptap/extension-table-cell@3.32.0(@tiptap/extension-table@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/extension-table': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + '@tiptap/extension-table': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) - '@tiptap/extension-table-header@3.20.0(@tiptap/extension-table@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))': + '@tiptap/extension-table-header@3.32.0(@tiptap/extension-table@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/extension-table': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + '@tiptap/extension-table': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) - '@tiptap/extension-table-row@3.20.0(@tiptap/extension-table@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0))': + '@tiptap/extension-table-row@3.32.0(@tiptap/extension-table@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/extension-table': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + '@tiptap/extension-table': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) - '@tiptap/extension-table@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)': + '@tiptap/extension-table@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 - '@tiptap/extension-text-align@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))': + '@tiptap/extension-text-align@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) - '@tiptap/extension-text@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))': + '@tiptap/extension-text@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) - '@tiptap/extension-typography@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))': + '@tiptap/extension-typography@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) - '@tiptap/extension-underline@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))': + '@tiptap/extension-underline@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) - '@tiptap/extensions@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)': + '@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 - '@tiptap/pm@3.20.0': + '@tiptap/pm@3.32.0': dependencies: - prosemirror-changeset: 2.3.1 - prosemirror-collab: 1.3.1 - prosemirror-commands: 1.7.1 - prosemirror-dropcursor: 1.8.2 - prosemirror-gapcursor: 1.4.0 - prosemirror-history: 1.5.0 + prosemirror-changeset: 2.4.4 + prosemirror-commands: 1.7.2 + prosemirror-dropcursor: 1.8.4 + prosemirror-gapcursor: 1.4.1 + prosemirror-history: 1.5.1 prosemirror-inputrules: 1.5.1 prosemirror-keymap: 1.2.3 - prosemirror-markdown: 1.13.2 - prosemirror-menu: 1.2.5 - prosemirror-model: 1.25.4 - prosemirror-schema-basic: 1.2.4 + prosemirror-model: 1.25.12 prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.4 prosemirror-tables: 1.8.5 - prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5) - prosemirror-transform: 1.10.5 - prosemirror-view: 1.41.5 + prosemirror-transform: 1.12.4 + prosemirror-view: 1.42.8 - '@tiptap/react@3.20.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@tiptap/react@3.32.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) '@types/use-sync-external-store': 0.0.6 @@ -18024,49 +17971,51 @@ snapshots: react-dom: 19.2.4(react@19.2.4) use-sync-external-store: 1.6.0(react@19.2.4) optionalDependencies: - '@tiptap/extension-bubble-menu': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) - '@tiptap/extension-floating-menu': 3.20.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) + '@tiptap/extension-bubble-menu': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-floating-menu': 3.32.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) transitivePeerDependencies: - '@floating-ui/dom' - '@tiptap/starter-kit@3.20.0': - dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/extension-blockquote': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) - '@tiptap/extension-bold': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) - '@tiptap/extension-bullet-list': 3.20.0(@tiptap/extension-list@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) - '@tiptap/extension-code': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) - '@tiptap/extension-code-block': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) - '@tiptap/extension-document': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) - '@tiptap/extension-dropcursor': 3.20.0(@tiptap/extensions@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) - '@tiptap/extension-gapcursor': 3.20.0(@tiptap/extensions@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) - '@tiptap/extension-hard-break': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) - '@tiptap/extension-heading': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) - '@tiptap/extension-horizontal-rule': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) - '@tiptap/extension-italic': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) - '@tiptap/extension-link': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) - '@tiptap/extension-list': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) - '@tiptap/extension-list-item': 3.20.0(@tiptap/extension-list@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) - '@tiptap/extension-list-keymap': 3.20.0(@tiptap/extension-list@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) - '@tiptap/extension-ordered-list': 3.20.0(@tiptap/extension-list@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)) - '@tiptap/extension-paragraph': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) - '@tiptap/extension-strike': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) - '@tiptap/extension-text': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) - '@tiptap/extension-underline': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0)) - '@tiptap/extensions': 3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 - - '@tiptap/suggestion@3.20.0(@tiptap/core@3.20.0(@tiptap/pm@3.20.0))(@tiptap/pm@3.20.0)': - dependencies: - '@tiptap/core': 3.20.0(@tiptap/pm@3.20.0) - '@tiptap/pm': 3.20.0 - - '@tiptap/y-tiptap@3.0.5(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29)': + '@tiptap/starter-kit@3.32.0': + dependencies: + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/extension-blockquote': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-bold': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-bullet-list': 3.32.0(@tiptap/extension-list@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) + '@tiptap/extension-code': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-code-block': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-document': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-dropcursor': 3.32.0(@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) + '@tiptap/extension-gapcursor': 3.32.0(@tiptap/extensions@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) + '@tiptap/extension-hard-break': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-heading': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-horizontal-rule': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-italic': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-link': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-list': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/extension-list-item': 3.32.0(@tiptap/extension-list@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) + '@tiptap/extension-list-keymap': 3.32.0(@tiptap/extension-list@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) + '@tiptap/extension-ordered-list': 3.32.0(@tiptap/extension-list@3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)) + '@tiptap/extension-paragraph': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-strike': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-text': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extension-underline': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0)) + '@tiptap/extensions': 3.32.0(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + + '@tiptap/suggestion@3.32.0(@floating-ui/dom@1.7.6)(@tiptap/core@3.32.0(@tiptap/pm@3.32.0))(@tiptap/pm@3.32.0)': + dependencies: + '@floating-ui/dom': 1.7.6 + '@tiptap/core': 3.32.0(@tiptap/pm@3.32.0) + '@tiptap/pm': 3.32.0 + + '@tiptap/y-tiptap@3.0.10(prosemirror-model@1.25.12)(prosemirror-state@1.4.4)(prosemirror-view@1.42.8)(y-protocols@1.0.7(yjs@13.6.29))(yjs@13.6.29)': dependencies: lib0: 0.2.117 - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-view: 1.41.5 + prosemirror-transform: 1.12.4 + prosemirror-view: 1.42.8 y-protocols: 1.0.7(yjs@13.6.29) yjs: 13.6.29 @@ -18151,19 +18100,10 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/linkify-it@5.0.0': {} - - '@types/markdown-it@14.1.2': - dependencies: - '@types/linkify-it': 5.0.0 - '@types/mdurl': 2.0.0 - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 - '@types/mdurl@2.0.0': {} - '@types/ms@2.1.0': {} '@types/nlcst@2.0.3': @@ -20709,11 +20649,7 @@ snapshots: lines-and-columns@1.2.4: {} - linkify-it@5.0.0: - dependencies: - uc.micro: 2.1.0 - - linkifyjs@4.3.2: {} + linkifyjs@4.4.0: {} lite-youtube-embed@0.3.4: {} @@ -20756,15 +20692,6 @@ snapshots: '@babel/types': 7.29.8 source-map-js: 1.2.1 - markdown-it@14.1.0: - dependencies: - argparse: 2.0.1 - entities: 4.5.0 - linkify-it: 5.0.0 - mdurl: 2.0.0 - punycode.js: 2.3.1 - uc.micro: 2.1.0 - marked-terminal@7.1.0(marked@9.1.6): dependencies: ansi-escapes: 7.0.0 @@ -20849,8 +20776,6 @@ snapshots: mdn-data@2.12.2: {} - mdurl@2.0.0: {} - media-typer@1.1.0: {} merge-descriptors@2.0.0: {} @@ -21698,112 +21623,79 @@ snapshots: property-information@7.1.0: {} - prosemirror-changeset@2.3.1: + prosemirror-changeset@2.4.4: dependencies: - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.12.4 - prosemirror-collab@1.3.1: + prosemirror-commands@1.7.2: dependencies: + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 + prosemirror-transform: 1.12.4 - prosemirror-commands@1.7.1: + prosemirror-dropcursor@1.8.4: dependencies: - prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.12.4 + prosemirror-view: 1.42.8 - prosemirror-dropcursor@1.8.2: - dependencies: - prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 - prosemirror-view: 1.41.5 - - prosemirror-gapcursor@1.4.0: + prosemirror-gapcursor@1.4.1: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-view: 1.41.5 + prosemirror-view: 1.42.8 - prosemirror-history@1.5.0: + prosemirror-history@1.5.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 - prosemirror-view: 1.41.5 + prosemirror-transform: 1.12.4 + prosemirror-view: 1.42.8 rope-sequence: 1.3.4 prosemirror-inputrules@1.5.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.12.4 prosemirror-keymap@1.2.3: dependencies: prosemirror-state: 1.4.4 w3c-keyname: 2.2.8 - prosemirror-markdown@1.13.2: - dependencies: - '@types/markdown-it': 14.1.2 - markdown-it: 14.1.0 - prosemirror-model: 1.25.4 - - prosemirror-menu@1.2.5: - dependencies: - crelt: 1.0.6 - prosemirror-commands: 1.7.1 - prosemirror-history: 1.5.0 - prosemirror-state: 1.4.4 - - prosemirror-model@1.25.4: + prosemirror-model@1.25.12: dependencies: orderedmap: 2.1.1 - prosemirror-schema-basic@1.2.4: - dependencies: - prosemirror-model: 1.25.4 - prosemirror-schema-list@1.5.1: dependencies: - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.12.4 prosemirror-state@1.4.4: dependencies: - prosemirror-model: 1.25.4 - prosemirror-transform: 1.12.0 - prosemirror-view: 1.41.5 + prosemirror-model: 1.25.12 + prosemirror-transform: 1.12.4 + prosemirror-view: 1.42.8 prosemirror-tables@1.8.5: dependencies: prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 - prosemirror-view: 1.41.5 + prosemirror-transform: 1.12.4 + prosemirror-view: 1.42.8 - prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.5): + prosemirror-transform@1.12.4: dependencies: - '@remirror/core-constants': 3.0.0 - escape-string-regexp: 4.0.0 - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-view: 1.41.5 - - prosemirror-transform@1.10.5: - dependencies: - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.12 - prosemirror-transform@1.12.0: + prosemirror-view@1.42.8: dependencies: - prosemirror-model: 1.25.4 - - prosemirror-view@1.41.5: - dependencies: - prosemirror-model: 1.25.4 + prosemirror-model: 1.25.12 prosemirror-state: 1.4.4 - prosemirror-transform: 1.12.0 + prosemirror-transform: 1.12.4 protobufjs@7.6.1: dependencies: @@ -21842,8 +21734,6 @@ snapshots: once: 1.4.0 optional: true - punycode.js@2.3.1: {} - punycode@2.3.1: {} qs@6.15.0: @@ -22778,8 +22668,6 @@ snapshots: typescript@6.0.3: {} - uc.micro@2.1.0: {} - ufo@1.6.3: {} uint8array-extras@1.5.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1169de4722..f071975dfc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -127,35 +127,35 @@ catalog: "@phosphor-icons/react": ^2.1.10 "@tanstack/react-query": 5.90.21 "@tanstack/react-router": 1.163.2 - "@tiptap/core": ^3.20.0 - "@tiptap/extension-character-count": ^3.20.0 - "@tiptap/extension-code": ^3.20.0 - "@tiptap/extension-code-block": ^3.20.0 + "@tiptap/core": 3.32.0 + "@tiptap/extension-character-count": 3.32.0 + "@tiptap/extension-code": 3.32.0 + "@tiptap/extension-code-block": 3.32.0 "@tiptap/extension-code-block-lowlight": 3.20.0 - "@tiptap/extension-collaboration": ^3.20.0 - "@tiptap/extension-drag-handle": ^3.20.0 - "@tiptap/extension-drag-handle-react": ^3.20.0 - "@tiptap/extension-dropcursor": ^3.20.0 - "@tiptap/extension-focus": ^3.20.0 - "@tiptap/extension-image": ^3.20.0 - "@tiptap/extension-link": ^3.20.0 - "@tiptap/extension-list": ^3.20.0 - "@tiptap/extension-node-range": ^3.20.0 - "@tiptap/extension-placeholder": ^3.20.0 - "@tiptap/extension-subscript": ^3.20.0 - "@tiptap/extension-superscript": ^3.20.0 - "@tiptap/extension-table": ^3.20.0 - "@tiptap/extension-table-cell": ^3.20.0 - "@tiptap/extension-table-header": ^3.20.0 - "@tiptap/extension-table-row": ^3.20.0 - "@tiptap/extension-text-align": ^3.20.0 - "@tiptap/extension-typography": ^3.20.0 - "@tiptap/extension-underline": ^3.20.0 - "@tiptap/pm": ^3.20.0 - "@tiptap/react": ^3.20.0 - "@tiptap/starter-kit": ^3.20.0 - "@tiptap/suggestion": ^3.20.0 - "@tiptap/y-tiptap": ^3.0.5 + "@tiptap/extension-collaboration": 3.32.0 + "@tiptap/extension-drag-handle": 3.32.0 + "@tiptap/extension-drag-handle-react": 3.32.0 + "@tiptap/extension-dropcursor": 3.32.0 + "@tiptap/extension-focus": 3.32.0 + "@tiptap/extension-image": 3.32.0 + "@tiptap/extension-link": 3.32.0 + "@tiptap/extension-list": 3.32.0 + "@tiptap/extension-node-range": 3.32.0 + "@tiptap/extension-placeholder": 3.32.0 + "@tiptap/extension-subscript": 3.32.0 + "@tiptap/extension-superscript": 3.32.0 + "@tiptap/extension-table": 3.32.0 + "@tiptap/extension-table-cell": 3.32.0 + "@tiptap/extension-table-header": 3.32.0 + "@tiptap/extension-table-row": 3.32.0 + "@tiptap/extension-text-align": 3.32.0 + "@tiptap/extension-typography": 3.32.0 + "@tiptap/extension-underline": 3.32.0 + "@tiptap/pm": 3.32.0 + "@tiptap/react": 3.32.0 + "@tiptap/starter-kit": 3.32.0 + "@tiptap/suggestion": 3.32.0 + "@tiptap/y-tiptap": ^3.0.7 "@types/node": 24.10.13 "@types/react": 19.2.14 "@types/react-dom": 19.2.3 From 8da5483af3e97c912b4f3d3baf94bc0399493959 Mon Sep 17 00:00:00 2001 From: "emdash-autofix[bot]" Date: Sun, 25 Oct 2026 17:25:59 +0000 Subject: [PATCH 2/5] fix(editor): test and support Tiptap 3.32 Address review by anchoring remounted inline menus to the actual toolbar and finishing its entrance before positioning. Added Chromium regression coverage that fails before the fix and passes after, retaining existing entrance geometry coverage. Documented multi-word link authoring, corrected the ESM import, simplified floating-surface aliases, and explained native keyboard-event property access. Verified root/docs builds, workspace typecheck, zero-diagnostic quick lint, formatting, 88 focused admin tests, eight core menu tests and two Playwright geometry tests. Added before/after screenshots and replied to all review threads; independent review found no significant issues. EmDash-Bot-Case: 1198246700-issue-6025800409 EmDash-Bot-Candidate: cand-2-7a8f737a3c --- .../docs/guides/working-with-content.mdx | 4 +++ e2e/tests/visual-editing.spec.ts | 29 +++++++++++++++++++ .../src/components/PortableTextEditor.tsx | 16 ++++------ .../CodeBlockNode.highlighting.test.tsx | 2 +- .../core/src/components/inline-editor-ui.tsx | 10 +++++-- 5 files changed, 47 insertions(+), 14 deletions(-) diff --git a/docs/src/content/docs/guides/working-with-content.mdx b/docs/src/content/docs/guides/working-with-content.mdx index 6d880e83e4..23f556f2e5 100644 --- a/docs/src/content/docs/guides/working-with-content.mdx +++ b/docs/src/content/docs/guides/working-with-content.mdx @@ -61,6 +61,10 @@ Use the toolbar to format the selected text. To insert a block, select the add-b a paragraph or type `/` and search for a block by name. Image and gallery blocks open the same media picker used by image fields. +To create a link with a multi-word label, type the label first, select the whole label, then choose +**Add link** in the toolbar and enter the destination. If you add a link at an empty caret and then +type its label, the link ends at the first space you type. Text after that space is not linked. + You can also drag image and video files into the editor or paste a copied image or screenshot. Each file uploads to the Media Library and appears between the surrounding blocks when the upload finishes. If an upload fails, the reason appears where the file would have gone. diff --git a/e2e/tests/visual-editing.spec.ts b/e2e/tests/visual-editing.spec.ts index c00b95472b..574fcda3c3 100644 --- a/e2e/tests/visual-editing.spec.ts +++ b/e2e/tests/visual-editing.spec.ts @@ -396,6 +396,35 @@ test.describe("Inline Editor", () => { expect(Math.abs(more.x + more.width - (bar.x + bar.width))).toBeLessThan(1); }); + test("anchors remounted formatting menus to the toolbar after closing the link field", async ({ + page, + }) => { + await stubSaves(page); + await gotoWithRetry(page, POST_WITH_IMAGE_PATH); + await expect(page.locator(".emdash-inline-editor")).toBeVisible({ timeout: 15000 }); + await placeSelection(page, "firstWord"); + const toolbar = page.getByRole("toolbar", { name: "Format selection" }); + await expect(toolbar).toBeVisible(); + await animationsFinished(toolbar); + await toolbar.getByRole("button", { name: "Add link" }).click(); + await toolbar.getByRole("textbox", { name: "Link URL" }).press("Escape"); + + for (const label of ["Turn into", "More formatting"]) { + await toolbar.getByRole("button", { name: label }).click(); + const menu = page.getByRole("menu"); + await expect(menu).toBeVisible(); + await animationsFinished(menu); + const bar = (await toolbar.boundingBox())!; + const box = (await menu.boundingBox())!; + const edgeDelta = + label === "Turn into" ? box.x - bar.x : box.x + box.width - bar.x - bar.width; + expect(Math.abs(edgeDelta)).toBeLessThan(1); + expect(Math.abs(box.y - (bar.y + bar.height + 4))).toBeLessThan(1); + await page.keyboard.press("Escape"); + await expect(menu).toBeHidden(); + } + }); + test("lines the toolbars up with the selection's right edge on a right-to-left page", async ({ page, }) => { diff --git a/packages/admin/src/components/PortableTextEditor.tsx b/packages/admin/src/components/PortableTextEditor.tsx index 6e91aff5a2..e2aba3db6e 100644 --- a/packages/admin/src/components/PortableTextEditor.tsx +++ b/packages/admin/src/components/PortableTextEditor.tsx @@ -4805,9 +4805,8 @@ const FORMATTING_MARKS = [ "superscript", ] as const; -function playBubbleEntrance(element: HTMLElement | null) { - const surface = element; - if (!(surface instanceof HTMLElement) || typeof surface.animate !== "function") return; +function playBubbleEntrance(surface: HTMLElement | null) { + if (!surface || typeof surface.animate !== "function") return; const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; surface.animate( reduceMotion @@ -4929,10 +4928,7 @@ function EditorBubbleMenu({ }) => { elements.floating.style.maxWidth = `${Math.max(0, availableWidth)}px`; // The surface scrolls itself, so no wrapper clips its rounded ring. - const surface = elements.floating; - if (surface instanceof HTMLElement) { - surface.style.overflowX = "auto"; - } + elements.floating.style.overflowX = "auto"; }, }), onShow: () => { @@ -5502,9 +5498,8 @@ function ImageBubbleMenu({ }, [editor]); // A quick fade and scale in, played when the toolbar appears or moves to another image. const playEntrance = React.useCallback(() => { - const menu = menuRef.current; - const toolbar = menu; - if (!menu?.isConnected || menu.hidden || !(toolbar instanceof HTMLElement)) return; + const toolbar = menuRef.current; + if (!toolbar?.isConnected || toolbar.hidden) return; const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; for (const animation of toolbar.getAnimations()) animation.cancel(); toolbar.animate( @@ -6611,6 +6606,7 @@ function EditorToolbar({ * the toolbar keep them. */ function moveToolbarFocus(event: React.KeyboardEvent, vertical: boolean) { + // BubbleMenu wraps native events without forwarding their keyboard property getters. if (event.nativeEvent.isComposing) return; const toolbar = event.currentTarget; const items = [ diff --git a/packages/admin/tests/editor/CodeBlockNode.highlighting.test.tsx b/packages/admin/tests/editor/CodeBlockNode.highlighting.test.tsx index 98ea420280..2fc6d2b044 100644 --- a/packages/admin/tests/editor/CodeBlockNode.highlighting.test.tsx +++ b/packages/admin/tests/editor/CodeBlockNode.highlighting.test.tsx @@ -4,7 +4,7 @@ import StarterKit from "@tiptap/starter-kit"; import { useEffect } from "react"; import { describe, expect, it, vi } from "vitest"; -import { CodeBlockExtension } from "../../src/components/editor/CodeBlockNode"; +import { CodeBlockExtension } from "../../src/components/editor/CodeBlockNode.js"; import { render } from "../utils/render.js"; import "../../src/styles.css"; diff --git a/packages/core/src/components/inline-editor-ui.tsx b/packages/core/src/components/inline-editor-ui.tsx index 8fc8e6db54..f5d7212485 100644 --- a/packages/core/src/components/inline-editor-ui.tsx +++ b/packages/core/src/components/inline-editor-ui.tsx @@ -390,9 +390,12 @@ export function ToolbarMenu({ whileElementsMounted: autoUpdate, }); React.useLayoutEffect(() => { - // The element TipTap positions, around the toolbar, which plays its entrance as a transform. - const toolbar = triggerRef.current?.closest('[role="toolbar"]')?.parentElement; + const toolbar = triggerRef.current?.closest('[role="toolbar"]'); if (!toolbar) return; + // An open menu needs a stable anchor, not the toolbar's entrance transform. + if (open) { + for (const animation of toolbar.getAnimations?.() ?? []) animation.finish(); + } let rect = new DOMRect(); refs.setPositionReference({ contextElement: toolbar, @@ -402,7 +405,7 @@ export function ToolbarMenu({ return rect; }, }); - }, [refs]); + }, [open, refs]); useRepositionOnOpen(open, update); const triggerRefs = useMergeRefs([refs.setReference, triggerRef]); const { isMounted, status } = useTransitionStatus(context, { @@ -580,6 +583,7 @@ function focusAfterEditor(editor: Editor): boolean { * right-to-left text; Home and End go to the first and last. */ export function handleToolbarKeyDown(event: React.KeyboardEvent, editor: Editor) { + // BubbleMenu wraps native events without forwarding their keyboard property getters. if (event.nativeEvent.isComposing || event.nativeEvent.defaultPrevented) return; const toolbar = event.currentTarget; const controls = [...toolbar.querySelectorAll(TOOLBAR_CONTROL_SELECTOR)]; From f5a0b04614b476405f38efa1f33942ccae07c7af Mon Sep 17 00:00:00 2001 From: "emdash-autofix[bot]" Date: Sun, 25 Oct 2026 17:59:58 +0000 Subject: [PATCH 3/5] fix(editor): test and support Tiptap 3.32 Fix the deterministic Table E2E accessibility failure introduced by Tiptap 3.32's textbox role: name the editable elements in admin and inline editors, forward admin field labels, and supply a localized admin fallback. Add admin accessible-name regressions and an inline browser assertion; update the changeset. Verified root build, workspace typecheck, quick lint, format, 129 admin component tests, all Chromium Table E2E tests (11 passed, one skipped), and final-source admin naming/inline browser checks. Firefox's CI console warning passed on retry and remains classified as flaky; its browser executable is unavailable locally. Independent follow-up review cleared the changes. EmDash-Bot-Case: 1198246700-issue-6025800409 EmDash-Bot-Candidate: cand-3-06923df5cd --- .changeset/tall-hats-tease.md | 2 +- e2e/tests/visual-editing.spec.ts | 4 ++++ .../src/components/PortableTextEditor.tsx | 5 ++++- .../tests/editor/PortableTextEditor.test.tsx | 19 +++++++++++++++++++ .../components/InlinePortableTextEditor.tsx | 1 + 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/.changeset/tall-hats-tease.md b/.changeset/tall-hats-tease.md index f8911ee995..d6cebebc4a 100644 --- a/.changeset/tall-hats-tease.md +++ b/.changeset/tall-hats-tease.md @@ -3,7 +3,7 @@ "emdash": patch --- -Fixes responsive table widths in the admin editor and floating toolbar keyboard controls in both the admin and inline editors with Tiptap 3.32.0. +Fixes responsive table widths in the admin editor and floating toolbar keyboard controls in both the admin and inline editors with Tiptap 3.32.0. Gives both editors' textboxes accessible names for screen readers. Pins the editor's Tiptap dependencies to exactly 3.32.0 so installations use the version covered by the editor tests. Code-block highlighting keeps its existing lowlight extension version. Sites or plugins that share Tiptap dependencies with EmDash should align them to 3.32.0 to avoid installing multiple copies. diff --git a/e2e/tests/visual-editing.spec.ts b/e2e/tests/visual-editing.spec.ts index 574fcda3c3..d86755493a 100644 --- a/e2e/tests/visual-editing.spec.ts +++ b/e2e/tests/visual-editing.spec.ts @@ -301,6 +301,10 @@ test.describe("Inline Editor", () => { const editor = page.locator(".emdash-inline-editor"); await expect(editor).toBeVisible({ timeout: 15000 }); + await expect( + page.getByRole("textbox", { name: "Rich text editor", exact: true }), + ).toBeEditable(); + // The island failed to hydrate with zero height when highlight.js/lib/core // was served raw as CommonJS, so also assert some static content rendered // inside the editor rather than disappearing. diff --git a/packages/admin/src/components/PortableTextEditor.tsx b/packages/admin/src/components/PortableTextEditor.tsx index e2aba3db6e..aaac7e79d5 100644 --- a/packages/admin/src/components/PortableTextEditor.tsx +++ b/packages/admin/src/components/PortableTextEditor.tsx @@ -3977,6 +3977,7 @@ export function PortableTextEditor({ // Stable editorProps reference — a new object every render would cause // compareOptions to call setOptions → updateState → plugin teardown → // Suggestion onExit → setSlashMenuState → re-render → infinite loop. + const editorLabel = t`Rich text editor`; const editorProps = React.useMemo( () => ({ // Typing or moving the caret under the document's sticky toolbar, or the fade under @@ -3984,13 +3985,15 @@ export function PortableTextEditor({ scrollThreshold: isDocument ? { top: 96, right: 0, bottom: 0, left: 0 } : 0, scrollMargin: isDocument ? { top: 96, right: 5, bottom: 5, left: 5 } : 5, attributes: { + "aria-label": editorLabel, + ...(ariaLabelledby ? { "aria-labelledby": ariaLabelledby } : {}), class: isDocument ? "emdash-document flow-root min-h-32 pb-2 focus:outline-none" : "prose prose-sm sm:prose-base dark:prose-invert flow-root w-full max-w-[calc(75ch+8rem)] mx-auto focus:outline-none min-h-[200px] p-4 ps-14 pe-14 sm:ps-16 sm:pe-16", dir: "auto", }, }), - [isDocument], + [ariaLabelledby, editorLabel, isDocument], ); const editor = useEditor({ diff --git a/packages/admin/tests/editor/PortableTextEditor.test.tsx b/packages/admin/tests/editor/PortableTextEditor.test.tsx index f1a77e8131..1b949fc2e0 100644 --- a/packages/admin/tests/editor/PortableTextEditor.test.tsx +++ b/packages/admin/tests/editor/PortableTextEditor.test.tsx @@ -1521,6 +1521,25 @@ describe("Portable Text ↔ ProseMirror conversion", () => { // ============================================================================= describe("Editor component behaviour", () => { + it("names the editable textbox when no field label is supplied", async () => { + const screen = await render(); + const textbox = screen.getByRole("textbox", { name: "Rich text editor", exact: true }); + await expect.element(textbox).toBeVisible(); + expect(textbox.element().isContentEditable).toBe(true); + }); + + it("names the editable textbox from its field label", async () => { + const screen = await render( + <> + Article body + + , + ); + const textbox = screen.getByRole("textbox", { name: "Article body", exact: true }); + await expect.element(textbox).toBeVisible(); + expect(textbox.element().isContentEditable).toBe(true); + }); + it("shows placeholder text in empty editor", async () => { await render(); const pm = await waitForEditor(); diff --git a/packages/core/src/components/InlinePortableTextEditor.tsx b/packages/core/src/components/InlinePortableTextEditor.tsx index 03b9f0dc65..d494f06b28 100644 --- a/packages/core/src/components/InlinePortableTextEditor.tsx +++ b/packages/core/src/components/InlinePortableTextEditor.tsx @@ -1273,6 +1273,7 @@ export function InlinePortableTextEditor({ immediatelyRender: false, editorProps: { attributes: { + "aria-label": "Rich text editor", class: "prose prose-sm sm:prose-base dark:prose-invert max-w-none emdash-inline-editor", dir: "auto", }, From b61976d374e8fcb8d4e898b037017b63b56e6bc2 Mon Sep 17 00:00:00 2001 From: "emdash-autofix[bot]" Date: Sun, 25 Oct 2026 18:04:12 +0000 Subject: [PATCH 4/5] fix(editor): test and support Tiptap 3.32 Address the final review nit by moving the editorProps comment below the editorLabel declaration, directly beside the memo it describes. This is comment placement only; executable code and behavior are unchanged. Ran pnpm format and git diff --check. Independent review skipped for this trivial comment-only relocation. EmDash-Bot-Case: 1198246700-issue-6025800409 EmDash-Bot-Candidate: cand-4-bd109fedb5 --- packages/admin/src/components/PortableTextEditor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/admin/src/components/PortableTextEditor.tsx b/packages/admin/src/components/PortableTextEditor.tsx index aaac7e79d5..947f1bff14 100644 --- a/packages/admin/src/components/PortableTextEditor.tsx +++ b/packages/admin/src/components/PortableTextEditor.tsx @@ -3974,10 +3974,10 @@ export function PortableTextEditor({ [], // Created once — all mutable state accessed via refs ); + const editorLabel = t`Rich text editor`; // Stable editorProps reference — a new object every render would cause // compareOptions to call setOptions → updateState → plugin teardown → // Suggestion onExit → setSlashMenuState → re-render → infinite loop. - const editorLabel = t`Rich text editor`; const editorProps = React.useMemo( () => ({ // Typing or moving the caret under the document's sticky toolbar, or the fade under From 3304ab96e8af5b355f4f8ce3199442644542ca1c Mon Sep 17 00:00:00 2001 From: "emdash-autofix[bot]" Date: Tue, 27 Oct 2026 18:36:48 +0000 Subject: [PATCH 5/5] fix(editor): test and support Tiptap 3.32 Address the maintainer's remaining wording requests only: describe the current scoped diff without obsolete toolbar claims or screenshots, add the visual-editor space-at-end-of-existing-link behavior to the changeset, and clarify that setSelectedTextLink links newly typed text only up to its first space. Implementation, tests, and the authoring-guide paragraph are unchanged. Ran pnpm format and git diff --check; independent review found no significant issues. The preceding implementation head c6d7985 passed required CI. EmDash-Bot-Case: 1198246700-issue-6025800409 EmDash-Bot-Candidate: cand-6-129d976203 --- .changeset/tall-hats-tease.md | 2 +- packages/admin/src/components/PortableTextEditor.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.changeset/tall-hats-tease.md b/.changeset/tall-hats-tease.md index a28b942a7f..6bd907505c 100644 --- a/.changeset/tall-hats-tease.md +++ b/.changeset/tall-hats-tease.md @@ -7,4 +7,4 @@ Fixes responsive table widths in the admin editor with Tiptap 3.32.0. Gives both Pins the editor's Tiptap dependencies to exactly 3.32.0 so installations use the version covered by the editor tests. Code-block highlighting keeps its existing lowlight extension version. Sites or plugins that share Tiptap dependencies with EmDash should align them to 3.32.0 to avoid installing multiple copies. -Links applied at an empty caret now end when you type a space, following Tiptap's updated behavior. Text typed after that space is not part of the link. +Links applied at an empty caret now end when you type a space, following Tiptap's updated behavior. In the visual editor, typing a space at the end of an existing link also ends the link. Text typed after that space is not part of the link. diff --git a/packages/admin/src/components/PortableTextEditor.tsx b/packages/admin/src/components/PortableTextEditor.tsx index 017f783556..e90c9f7912 100644 --- a/packages/admin/src/components/PortableTextEditor.tsx +++ b/packages/admin/src/components/PortableTextEditor.tsx @@ -468,8 +468,8 @@ function linkAtCaret(state: EditorState): ProseMirrorMark | undefined { /** * Links the selected text, or the whole link around the caret, to `value`. - * At a caret outside a link, the text typed next gets the link. Returns - * `false`, changing nothing, for a URL the editor won't link. + * At a caret outside a link, the text typed next gets the link up to the first + * space. Returns `false`, changing nothing, for a URL the editor won't link. */ function setSelectedTextLink(editor: Editor, value: string): boolean { const href = normalizeLinkHref(value);