Pre-built menus
Drop-in menus for common use cases. Each one handles its own trigger logic and plugin key.BubbleMenu.LinkDefault
Link editing menu that appears when clicking a link.('edit-link' | 'open-link' | 'unlink')[]
default:"[]"
Actions to hide from the toolbar.
'top' | 'bottom'
default:"'top'"
Position relative to the link.
number
Distance from the link in pixels.
() => void
Called when the bubble menu is hidden.
(value: string) => string | null
Custom URL validator. Return the valid URL string or
null.(href: string) => void
Called after a link is applied.
() => void
Called after a link is removed.
BubbleMenu.ButtonDefault
Button link editing menu that appears when clicking a button.LinkDefault (except excludeItems).
BubbleMenu.ImageDefault
Image editing menu that appears when clicking an image.('edit-link' | 'unlink')[]
default:"[]"
Actions to hide from the toolbar.
'top' | 'bottom'
default:"'top'"
Position relative to the image.
number
Distance from the image in pixels.
() => void
Called when the bubble menu is hidden.
(value: string) => string | null
Custom URL validator. Return the valid URL string or
null.(href: string) => void
Called after a link is applied to the image.
() => void
Called after a link is removed from the image.
Combining menus
A typical email editor uses multiple bubble menus together. UsehideWhenActiveNodes and hideWhenActiveMarks
to prevent overlapping menus:
Compound components
Build fully custom menus using the compound API.BubbleMenu
Base container for all custom bubble menus. Provides editor context to children. When rendered without children, it automatically renders the default text formatting toolbar.TriggerFn
Controls when the menu is visible. Defaults to showing on text selection.
Use
bubbleMenuTriggers for common patterns.PluginKey
Unique key for the ProseMirror plugin backing this menu. Required when
rendering multiple
BubbleMenu instances to avoid collisions.
Import PluginKey from @tiptap/pm/state.string[]
default:"[]"
Node types that prevent the menu from showing.
string[]
default:"[]"
Mark types that prevent the menu from showing.
'top' | 'bottom'
default:"'bottom'"
Position relative to the selection.
number
default:"8"
Distance from the selection in pixels.
() => void
Called when the bubble menu is hidden.
bubbleMenuTriggers
Factory for commontrigger functions:
Text formatting items
Link components
Button components
Image components
Custom menu example
Here’s a complete custom link bubble menu built from compound components:LinkToolbar automatically hides when LinkEditLink is clicked, and LinkForm
appears in its place. When the user submits or cancels, the toolbar reappears.
Context
UseuseBubbleMenuContext() inside any child of BubbleMenu to access the editor and editing state: