content/docs/examples/editable-voids.mdx
This example renders form controls and a nested Plate editor inside a void
element. It is app-local demo code built with createPlatePlugin, not a packaged
feature plugin.
The demo registers an editable-void element plugin and renders custom React UI
for that node.
The initial value contains a normal paragraph, one editable-void element, and
an empty paragraph after it.
| Piece | Owner | Notes |
|---|---|---|
EditableVoidPlugin | Registry example | Uses createPlatePlugin with node.isElement: true and node.isVoid: true. |
EditableVoidElement | Registry example | Renders inputs, radio controls, and a nested <Plate> instance. |
| Outer editor | Registry example | Loads EditorKit plus EditableVoidPlugin and the editableVoidsValue. |
| Inner editor | Registry example | Creates a separate usePlateEditor({ plugins: EditorKit }) inside the void element. |
| Value shape | Slate | Keeps an empty text child inside the void node so Slate can select it. |
Set contentEditable={false} on the custom void wrapper. Without it, browser
editing behavior can leak into the nested controls; the demo notes Firefox input
issues specifically.
Render {children} after the non-editable UI. Slate still needs the hidden void
child mounted even when your visible element is fully custom React.
The nested editor is a separate Plate editor. It does not share the outer editor's value, selection, plugins, or undo history.
node.isVoid, node.component, and plugin rendering.<Plate>, editor providers, and node primitives.