'use client';
import * as React from 'react';
import { Plate, usePlateEditor } from 'platejs/react';
import { EditorKit } from '@/components/editor/editor-kit';
import { Editor, EditorContainer } from '@/components/ui/editor';
import { DEMO_VALUES } from './values/demo-values';
export default function Demo({ id }: { id: string }) {
  const editor = usePlateEditor({
    plugins: EditorKit,
    value: DEMO_VALUES[id],
  });
  return (
    <Plate editor={editor}>
      <EditorContainer variant="demo">
        <Editor />
      </EditorContainer>
    </Plate>
  );
}
Kit Usage
Installation
The fastest way to add the block menu is with the BlockMenuKit, which includes the pre-configured BlockMenuPlugin along with BlockSelectionPlugin and their Plate UI components.
'use client';
 
import { BlockMenuPlugin } from '@platejs/selection/react';
 
import { BlockContextMenu } from '@/components/ui/block-context-menu';
 
import { BlockSelectionKit } from './block-selection-kit';
 
export const BlockMenuKit = [
  ...BlockSelectionKit,
  BlockMenuPlugin.configure({
    render: { aboveEditable: BlockContextMenu },
  }),
];- BlockContextMenu: Renders the context menu interface.
Add Kit
import { createPlateEditor } from 'platejs/react';
import { BlockMenuKit } from '@/components/editor/plugins/block-menu-kit';
 
const editor = createPlateEditor({
  plugins: [
    // ...otherPlugins,
    ...BlockMenuKit,
  ],
});Manual Usage
Installation
pnpm add @platejs/selection
Add Plugins
The block menu requires both BlockSelectionPlugin and BlockMenuPlugin to function properly.
import { BlockSelectionPlugin, BlockMenuPlugin } from '@platejs/selection/react';
import { createPlateEditor } from 'platejs/react';
 
const editor = createPlateEditor({
  plugins: [
    // ...otherPlugins,
    BlockSelectionPlugin.configure({
      options: {
        enableContextMenu: true,
      },
    }),
    BlockMenuPlugin,
  ],
});Configure Plugins
Configure the block menu with a context menu component:
import { BlockSelectionPlugin, BlockMenuPlugin } from '@platejs/selection/react';
import { createPlateEditor } from 'platejs/react';
import { BlockContextMenu } from '@/components/ui/block-context-menu';
 
const editor = createPlateEditor({
  plugins: [
    // ...otherPlugins,
    BlockSelectionPlugin.configure({
      options: {
        enableContextMenu: true,
      },
    }),
    BlockMenuPlugin.configure({
      render: { aboveEditable: BlockContextMenu },
    }),
  ],
});- BlockSelectionPlugin.options.enableContextMenu: Enables the context menu functionality.
- BlockMenuPlugin.render.aboveEditable: Assigns- BlockContextMenuto render the context menu.
Controlling Context Menu Behavior
To control the opening of the context menu for specific elements, use the data-plate-open-context-menu attribute:
<PlateElement data-plate-open-context-menu={false} {...props}>
  {children}
</PlateElement>This is commonly used to prevent right-clicking on the padding of the <Editor /> component from opening the menu.
Plate Plus
- Open the menu via the drag button or the three-dot menu on specific blocks (e.g. images)
- Includes a combobox that filters options as you type
- Supports nested menu options
- Advanced actions such as "Ask AI", colors, and commenting
- Beautifully crafted UI
Plugins
BlockMenuPlugin
Plugin for block menu state management and context menu functionality.
API
api.blockMenu.hide
Hides the block menu.
api.blockMenu.show
Shows the block menu for a specific block.
api.blockMenu.showContextMenu
Shows the context menu for a specific block and automatically selects that block.