From aab6e5487eb0d5df47dc275a416a2dabe0ea1764 Mon Sep 17 00:00:00 2001 From: Matthew Lipski Date: Tue, 31 Mar 2026 15:21:55 +0200 Subject: [PATCH 1/2] Disabled default UI when no components context is found --- packages/react/src/editor/BlockNoteView.tsx | 53 ++++++++++++--------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/packages/react/src/editor/BlockNoteView.tsx b/packages/react/src/editor/BlockNoteView.tsx index dd5fe957fb..52c2deef9f 100644 --- a/packages/react/src/editor/BlockNoteView.tsx +++ b/packages/react/src/editor/BlockNoteView.tsx @@ -31,6 +31,7 @@ import { BlockNoteViewContext, useBlockNoteViewContext, } from "./BlockNoteViewContext.js"; +import { useComponentsContext } from "./ComponentsContext.js"; import { Portals, getContentComponent } from "./EditorContent.js"; import { ElementRenderer } from "./ElementRenderer.js"; @@ -138,6 +139,33 @@ function BlockNoteViewComponent< const editorColorScheme = theme || (defaultColorScheme === "dark" ? "dark" : "light"); + // Disable default UI components if no components context is found. + const componentsContext = useComponentsContext(); + const defaultUIProps: BlockNoteDefaultUIProps = useMemo( + () => ({ + formattingToolbar: + formattingToolbar ?? (componentsContext ? undefined : false), + linkToolbar: linkToolbar ?? (componentsContext ? undefined : false), + sideMenu: sideMenu ?? (componentsContext ? undefined : false), + slashMenu: slashMenu ?? (componentsContext ? undefined : false), + filePanel: filePanel ?? (componentsContext ? undefined : false), + tableHandles: tableHandles ?? (componentsContext ? undefined : false), + emojiPicker: emojiPicker ?? (componentsContext ? undefined : false), + comments: comments ?? (componentsContext ? undefined : false), + }), + [ + comments, + componentsContext, + emojiPicker, + filePanel, + formattingToolbar, + linkToolbar, + sideMenu, + slashMenu, + tableHandles, + ], + ); + useEditorChange(onChange || emptyFn, editor); useEditorSelectionChange(onSelectionChange || emptyFn, editor); @@ -180,30 +208,9 @@ function BlockNoteViewComponent< contentEditableProps, editable, }, - defaultUIProps: { - formattingToolbar, - linkToolbar, - slashMenu, - emojiPicker, - sideMenu, - filePanel, - tableHandles, - comments, - }, + defaultUIProps, }; - }, [ - autoFocus, - contentEditableProps, - editable, - formattingToolbar, - linkToolbar, - slashMenu, - emojiPicker, - sideMenu, - filePanel, - tableHandles, - comments, - ]); + }, [autoFocus, contentEditableProps, editable, defaultUIProps]); return ( From 93865e5943b1d0d15ada4e85ea1a905c9bf3d2e6 Mon Sep 17 00:00:00 2001 From: Nick the Sick Date: Mon, 13 Apr 2026 13:35:12 +0200 Subject: [PATCH 2/2] fix: prevent explicit true prop from enabling UI without componentsContext The previous nullish-coalescing logic allowed an explicit `true` prop to bypass the componentsContext check. Now componentsContext is checked first so UI controllers are always disabled when no components context exists. Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/react/src/editor/BlockNoteView.tsx | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/react/src/editor/BlockNoteView.tsx b/packages/react/src/editor/BlockNoteView.tsx index 52c2deef9f..a4679af611 100644 --- a/packages/react/src/editor/BlockNoteView.tsx +++ b/packages/react/src/editor/BlockNoteView.tsx @@ -143,15 +143,14 @@ function BlockNoteViewComponent< const componentsContext = useComponentsContext(); const defaultUIProps: BlockNoteDefaultUIProps = useMemo( () => ({ - formattingToolbar: - formattingToolbar ?? (componentsContext ? undefined : false), - linkToolbar: linkToolbar ?? (componentsContext ? undefined : false), - sideMenu: sideMenu ?? (componentsContext ? undefined : false), - slashMenu: slashMenu ?? (componentsContext ? undefined : false), - filePanel: filePanel ?? (componentsContext ? undefined : false), - tableHandles: tableHandles ?? (componentsContext ? undefined : false), - emojiPicker: emojiPicker ?? (componentsContext ? undefined : false), - comments: comments ?? (componentsContext ? undefined : false), + formattingToolbar: componentsContext ? formattingToolbar : false, + linkToolbar: componentsContext ? linkToolbar : false, + sideMenu: componentsContext ? sideMenu : false, + slashMenu: componentsContext ? slashMenu : false, + filePanel: componentsContext ? filePanel : false, + tableHandles: componentsContext ? tableHandles : false, + emojiPicker: componentsContext ? emojiPicker : false, + comments: componentsContext ? comments : false, }), [ comments,