From 74ead8cd96b72e3f581179a985a1a8c86570c112 Mon Sep 17 00:00:00 2001 From: ovice Date: Thu, 15 Jan 2026 10:50:21 +0100 Subject: [PATCH 1/2] fix(link-toolbar): prevent Enter from submitting during IME composition --- .../react/src/components/LinkToolbar/EditLinkMenuItems.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/react/src/components/LinkToolbar/EditLinkMenuItems.tsx b/packages/react/src/components/LinkToolbar/EditLinkMenuItems.tsx index ad454fd556..ccca20168d 100644 --- a/packages/react/src/components/LinkToolbar/EditLinkMenuItems.tsx +++ b/packages/react/src/components/LinkToolbar/EditLinkMenuItems.tsx @@ -51,6 +51,12 @@ export const EditLinkMenuItems = ( const handleEnter = useCallback( (event: KeyboardEvent) => { + // Don't submit during IME composition (e.g., when converting to Kanji) + // The nativeEvent.isComposing check is crucial for CJK input methods + if (event.nativeEvent.isComposing) { + return; + } + if (event.key === "Enter") { event.preventDefault(); editLink(validateUrl(currentUrl), currentText, props.range.from); From 0795d1c061b8a297c1dba1fa6cf2f496b37c8ccd Mon Sep 17 00:00:00 2001 From: Matthew Lipski Date: Tue, 27 Jan 2026 02:22:12 +0100 Subject: [PATCH 2/2] Added `isComposing` check to all Enter `keydown` handlers that didn't already have it --- .../NodeSelectionKeyboard/NodeSelectionKeyboard.ts | 1 + .../src/components/FilePanel/DefaultTabs/EmbedTab.tsx | 2 +- .../DefaultButtons/FileCaptionButton.tsx | 3 ++- .../FormattingToolbar/DefaultButtons/FileRenameButton.tsx | 3 ++- .../src/components/LinkToolbar/EditLinkMenuItems.tsx | 8 +------- .../xl-ai/src/components/AIMenu/PromptSuggestionMenu.tsx | 4 ++-- 6 files changed, 9 insertions(+), 12 deletions(-) diff --git a/packages/core/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboard.ts b/packages/core/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboard.ts index da7b9b1fd0..357780f44a 100644 --- a/packages/core/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboard.ts +++ b/packages/core/src/extensions/NodeSelectionKeyboard/NodeSelectionKeyboard.ts @@ -40,6 +40,7 @@ export const NodeSelectionKeyboardExtension = createExtension( // Checks if key press is Enter if ( event.key === "Enter" && + !event.isComposing && !event.shiftKey && !event.altKey && !event.ctrlKey && diff --git a/packages/react/src/components/FilePanel/DefaultTabs/EmbedTab.tsx b/packages/react/src/components/FilePanel/DefaultTabs/EmbedTab.tsx index 3d8090bc20..fd9ab688bf 100644 --- a/packages/react/src/components/FilePanel/DefaultTabs/EmbedTab.tsx +++ b/packages/react/src/components/FilePanel/DefaultTabs/EmbedTab.tsx @@ -39,7 +39,7 @@ export const EmbedTab = < const handleURLEnter = useCallback( (event: KeyboardEvent) => { - if (event.key === "Enter") { + if (event.key === "Enter" && !event.nativeEvent.isComposing) { event.preventDefault(); editor.updateBlock(block.id, { props: { diff --git a/packages/react/src/components/FormattingToolbar/DefaultButtons/FileCaptionButton.tsx b/packages/react/src/components/FormattingToolbar/DefaultButtons/FileCaptionButton.tsx index 3898fb924b..8d1ff3d343 100644 --- a/packages/react/src/components/FormattingToolbar/DefaultButtons/FileCaptionButton.tsx +++ b/packages/react/src/components/FormattingToolbar/DefaultButtons/FileCaptionButton.tsx @@ -81,7 +81,8 @@ export const FileCaptionButton = () => { editorHasBlockWithType(editor, block.type, { caption: "string", }) && - event.key === "Enter" + event.key === "Enter" && + !event.nativeEvent.isComposing ) { event.preventDefault(); editor.updateBlock(block.id, { diff --git a/packages/react/src/components/FormattingToolbar/DefaultButtons/FileRenameButton.tsx b/packages/react/src/components/FormattingToolbar/DefaultButtons/FileRenameButton.tsx index 2cac3b69b2..863febd7d4 100644 --- a/packages/react/src/components/FormattingToolbar/DefaultButtons/FileRenameButton.tsx +++ b/packages/react/src/components/FormattingToolbar/DefaultButtons/FileRenameButton.tsx @@ -82,7 +82,8 @@ export const FileRenameButton = () => { editorHasBlockWithType(editor, block.type, { name: "string", }) && - event.key === "Enter" + event.key === "Enter" && + !event.nativeEvent.isComposing ) { event.preventDefault(); editor.updateBlock(block.id, { diff --git a/packages/react/src/components/LinkToolbar/EditLinkMenuItems.tsx b/packages/react/src/components/LinkToolbar/EditLinkMenuItems.tsx index ccca20168d..ba5ebcdf1b 100644 --- a/packages/react/src/components/LinkToolbar/EditLinkMenuItems.tsx +++ b/packages/react/src/components/LinkToolbar/EditLinkMenuItems.tsx @@ -51,13 +51,7 @@ export const EditLinkMenuItems = ( const handleEnter = useCallback( (event: KeyboardEvent) => { - // Don't submit during IME composition (e.g., when converting to Kanji) - // The nativeEvent.isComposing check is crucial for CJK input methods - if (event.nativeEvent.isComposing) { - return; - } - - if (event.key === "Enter") { + if (event.key === "Enter" && !event.nativeEvent.isComposing) { event.preventDefault(); editLink(validateUrl(currentUrl), currentText, props.range.from); props.setToolbarOpen?.(false); diff --git a/packages/xl-ai/src/components/AIMenu/PromptSuggestionMenu.tsx b/packages/xl-ai/src/components/AIMenu/PromptSuggestionMenu.tsx index 17226d4b93..cc0b7d9969 100644 --- a/packages/xl-ai/src/components/AIMenu/PromptSuggestionMenu.tsx +++ b/packages/xl-ai/src/components/AIMenu/PromptSuggestionMenu.tsx @@ -38,7 +38,7 @@ export const PromptSuggestionMenu = (props: PromptSuggestionMenuProps) => { const handleEnter = useCallback( async (event: KeyboardEvent) => { - if (event.key === "Enter") { + if (event.key === "Enter" && !event.nativeEvent.isComposing) { // console.log("ENTER", currentEditingPrompt); onManualPromptSubmit(promptTextToUse); } @@ -71,7 +71,7 @@ export const PromptSuggestionMenu = (props: PromptSuggestionMenuProps) => { const handleKeyDown = useCallback( (event: KeyboardEvent) => { // TODO: handle backspace to close - if (event.key === "Enter") { + if (event.key === "Enter" && !event.nativeEvent.isComposing) { if (items.length > 0) { handler(event); } else {