import { CommentsExtension } from "@blocknote/core/comments"; import { FilePanelExtension, FormattingToolbarExtension, LinkToolbarExtension, SideMenuExtension, SuggestionMenu, TableHandlesExtension, } from "@blocknote/core/extensions"; import { lazy, Suspense } from "react"; import { FilePanelController } from "../components/FilePanel/FilePanelController.js"; import { FormattingToolbarController } from "../components/FormattingToolbar/FormattingToolbarController.js"; import { LinkToolbarController } from "../components/LinkToolbar/LinkToolbarController.js"; import { SideMenuController } from "../components/SideMenu/SideMenuController.js"; import { GridSuggestionMenuController } from "../components/SuggestionMenu/GridSuggestionMenu/GridSuggestionMenuController.js"; import { SuggestionMenuController } from "../components/SuggestionMenu/SuggestionMenuController.js"; import { TableHandlesController } from "../components/TableHandles/TableHandlesController.js"; import { useBlockNoteEditor } from "../hooks/useBlockNoteEditor.js"; // Lazily load the comments components to avoid pulling in the comments extensions into the main bundle const FloatingComposerController = lazy( () => import("../components/Comments/FloatingComposerController.js"), ); const FloatingThreadController = lazy( () => import("../components/Comments/FloatingThreadController.js"), ); export type BlockNoteDefaultUIProps = { /** * Whether the formatting toolbar should be enabled. * @see {@link https://blocknotejs.org/docs/react/components/formatting-toolbar} */ formattingToolbar?: boolean; /** * Whether the link toolbar should be enabled. * @see {@link https://blocknotejs.org/docs/react/components/link-toolbar} */ linkToolbar?: boolean; /** * Whether the slash menu should be enabled. * @see {@link https://blocknotejs.org/docs/react/components/suggestion-menus#slash-menu} */ slashMenu?: boolean; /** * Whether the block side menu should be enabled. * @see {@link https://blocknotejs.org/docs/react/components/side-menu} */ sideMenu?: boolean; /** * Whether the file panel should be enabled. * @see {@link https://blocknotejs.org/docs/react/components/file-panel} */ filePanel?: boolean; /** * Whether the table handles should be enabled. * @see {@link https://blocknotejs.org/docs/react/components/table-handles} */ tableHandles?: boolean; /** * Whether the emoji picker should be enabled. * @see {@link https://blocknotejs.org/docs/advanced/grid-suggestion-menus#emoji-picker} */ emojiPicker?: boolean; /** * Whether the default comments UI feature should be enabled. * @see {@link https://blocknotejs.org/docs/react/components/comments} */ comments?: boolean; }; export function BlockNoteDefaultUI(props: BlockNoteDefaultUIProps) { const editor = useBlockNoteEditor(); if (!editor) { throw new Error( "BlockNoteDefaultUI must be used within a BlockNoteContext.Provider", ); } return ( <> {editor.getExtension(FormattingToolbarExtension) && props.formattingToolbar !== false && } {editor.getExtension(LinkToolbarExtension) && props.linkToolbar !== false && } {editor.getExtension(SuggestionMenu) && props.slashMenu !== false && ( !state.selection.$from.parent.type.isInGroup("tableContent") } /> )} {editor.getExtension(SuggestionMenu) && props.emojiPicker !== false && ( )} {editor.getExtension(SideMenuExtension) && props.sideMenu !== false && ( )} {editor.getExtension(FilePanelExtension) && props.filePanel !== false && ( )} {editor.getExtension(TableHandlesExtension) && props.tableHandles !== false && } {editor.getExtension(CommentsExtension) && props.comments !== false && ( )} ); }