Quick start
Add the image extension withuseEditorImage, register imageSlashCommand,
and render BubbleMenu.ImageDefault for inline editing.
uploadImage receives a File and must resolve with { url }. The returned
URL is written to the image node once the promise resolves.
One-line setup
EmailEditor wraps the same extension behind a single prop — use this when
you don’t need direct access to the extension or slash command list.
Combining with the text bubble menu
When pairingBubbleMenu.ImageDefault with the default BubbleMenu, pass
hideWhenActiveNodes={['image']} so the text menu steps aside when an image
is focused.
Upload triggers
Once the extension is registered, three input paths upload automatically:- Paste — paste an image from the clipboard
- Drop — drag an image file onto the editor
- Slash command — type
/and pick Image (fromimageSlashCommand)
uploadImage
runs, and the node swaps to the resolved URL on success.
Error handling
IfuploadImage throws, the plugin removes the temporary node for you and
logs the failure via console.error. Handle the error inside your own
function when you need custom UI or telemetry:
Inserting programmatically
The extension adds two commands to the editor:uploadImage() opens a file picker and runs the upload flow. setImage()
inserts a node directly — useful when you already have a URL.
Available setImage attributes: src, alt, width, height, alignment
('left' | 'center' | 'right'), and href (wraps the image in a link on
export).
Examples
See image upload in action with a runnable example:Image Upload
Paste, drop, and slash-command image upload with a stubbed uploader.