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.
(value: string) => string | null
Custom URL validator. Return the valid URL string or
null.() => void
Emitted when the bubble menu is hidden.
(href: string) => void
Emitted after a link is applied.
() => void
Emitted after a link is removed.
BubbleMenu.ButtonDefault
Button link editing menu that appears when clicking a button.LinkDefault (except exclude-items).
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.
(value: string) => string | null
Custom URL validator. Return the valid URL string or
null.() => void
Emitted when the bubble menu is hidden.
(href: string) => void
Emitted after a link is applied to the image.
() => void
Emitted after a link is removed from the image.
Combining menus
A typical email editor uses multiple bubble menus together. Usehide-when-active-nodes and hide-when-active-marks
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
Emitted 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:my-link-menu.vue
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:
custom-toolbar-item.vue
The context’s fields are reactive getters: read them from the context, as in
menu.isEditing,
instead of destructuring them, to keep them up to date.