Unique identifier for the editor.
Initial editor without withPlate.
An array of editor plugins.
Synchronous initial document, persisted { document, schema } envelope,
or primary-root array. Use the callback when decoding needs the compiled
editor model. Load remote data before constructing the editor.
Select the editor after initialization.
falsetrue | 'end': Select the end of the editorfalse: Do not select anything'start': Select the start of the editorMaximum character count for user-facing text, fragment, and node insertions.
Application-owned target-version migration chain. Plate runs every required step before plugin document preparation and schema fitting.
Configuration for the built-in navigation feedback plugin.
Initial selection for the editor.
Application schema policy and optional named lineage. Omit root for the
standard paragraph root. A migration plan requires an exact id and
version match.
When true, it normalizes the initialValue passed to the editor.
falseAPI methods for the editor.
Decoration function for the editor.
Lifecycle and DOM events. Child names are prefixless, such as commit,
nodeChange, keyDown, and paste.
Injection configuration for the editor.
Additional options for the editor.
Override configuration for the editor.
Editor read-only initial state. For dynamic value, use
Plate.readOnly prop.
Render functions for the editor.
Keyboard shortcuts for the editor.
Transform functions for the editor.
Hook to use with the editor.
For more details on editor configuration, refer to the Editor Configuration guide.
Defines application-owned schema policy. Its optional fields are:
root: primary-root SchemaContent with an explicit positive integer
min. Descriptor sources must match the installed plugin family. The first
source in schema.content.elements is the default.overrides: final application overrides for installed element schemas and
existing property targets.properties: application-owned schema properties.id and version: a paired persisted lineage. Supply both or neither.Omitting root preserves Plate's standard minimum-one paragraph grammar. Root
grammar participates in the compiled fingerprint and generated value contract.
Defines one target-version migration chain for a named application schema. Each numeric key is the schema version produced by that step.
import { defineDocumentMigrations } from 'platejs/migrations';
import { fingerprint as v1Fingerprint } from './migrations/v2-add-section/from';
import { fingerprint as v2Fingerprint } from './migrations/v3-add-caption/from';
const migrations = defineDocumentMigrations(EditorSchema, {
sourceFingerprints: {
1: v1Fingerprint,
2: v2Fingerprint,
},
steps: {
2: migrateDocumentV2,
3: migrateDocumentV3,
},
unversioned: 1,
});import { defineDocumentMigrations } from 'platejs/migrations';
import { fingerprint as v1Fingerprint } from './migrations/v2-add-section/from';
import { fingerprint as v2Fingerprint } from './migrations/v3-add-caption/from';
const migrations = defineDocumentMigrations(EditorSchema, {
sourceFingerprints: {
1: v1Fingerprint,
2: v2Fingerprint,
},
steps: {
2: migrateDocumentV2,
3: migrateDocumentV3,
},
unversioned: 1,
});sourceFingerprints binds every supported historical envelope version to its
generated schema fingerprint. unversioned assigns an explicit source version
to raw documents without a persisted schema identity. Plate rejects missing
intermediate steps and historical identity drift.
Runs the required migration steps for one complete document without publishing
it to the editor. Runtime editor loads and plate migrate run use this runner.
import { migrateDocument } from 'platejs/migrations';
const result = migrateDocument(persisted, {
editor,
migrations: EditorMigrations,
});import { migrateDocument } from 'platejs/migrations';
const result = migrateDocument(persisted, {
editor,
migrations: EditorMigrations,
});The result contains document, mapped selection, source, target, and the
ascending applied version list. The runner rejects a different schema
lineage, a future source, or fingerprint drift.
Creates a React Plate plugin from one inferred definition.
Extends a BasePlugin to create a React PlatePlugin.
Creates a memoized Plate editor for React components.
Get an installed plugin's flat consumer portal.
Get the active Plate editor without re-rendering. The hook throws when no matching editor is active.
Use useActiveEditor({ id? }) when no active editor is a valid UI state. It
returns the same editor value as useEditor(), or null while the controller
has no matching active editor.
Subscribe to a specific property of the editor.
Get the Plate editor reference with re-rendering.
Get the editor's composing state.
Get the editor's readOnly state.
Get the editor's isMounted state.
Get the editor's selection. Memoized so it does not re-render if the range is the same.
Get the version of the editor value. That version is incremented on each editor change.
Get the version of the editor selection. That version is incremented on each selection change (the range being different).
Returns a prop value derived from the current selection fragment.
The key of the property to extract from each node.
The default value to return if no valid prop is found.
Custom function to extract the prop value from a node.
Determines how to traverse the fragment:
'all': Check both block and text nodes
'block': Only check block nodes
'text': Only check text nodes
Default: 'block'
Get the live path of the closest element and throw when the matching provider is absent. Pass a plugin descriptor to select an owning element provider.
Use useOptionalPath(Plugin) when the provider is intentionally optional. It
returns null instead of manufacturing a path for an arbitrary node object.
Subscribe to a plugin state field, named selector, or selector callback inside
<Plate>.
Pass the plugin descriptor itself—not a { name } object. The descriptor carries
the state fields, selector arguments, and return types, so no generic arguments
are needed.
const value = usePluginStore(plugin, "value");
const doubleValue = usePluginStore(plugin, "doubleValue", 2);
const state = usePluginStore(plugin, (state) => state);
const pair = usePluginStore(
plugin,
(state) => [state.value, state.label] as const,
{ equalityFn: shallow }
);const value = usePluginStore(plugin, "value");
const doubleValue = usePluginStore(plugin, "doubleValue", 2);
const state = usePluginStore(plugin, (state) => state);
const pair = usePluginStore(
plugin,
(state) => [state.value, state.label] as const,
{ equalityFn: shallow }
);Explicit-editor variant of usePluginStore.
const value = useEditorPluginStore(editor, plugin, "value");
const doubleValue = useEditorPluginStore(editor, plugin, "doubleValue", 2);
const state = useEditorPluginStore(editor, plugin, (state) => state);const value = useEditorPluginStore(editor, plugin, "value");
const doubleValue = useEditorPluginStore(editor, plugin, "doubleValue", 2);
const state = useEditorPluginStore(editor, plugin, (state) => state);Get the current element and throw when the matching provider is absent. Pass a
plugin descriptor for configured schema inference. Call it without a descriptor
only when deliberately working with the erased Element shape.
import { BlockquotePlugin } from "@platejs/basic-nodes/react";
import { useElement } from "platejs/react";
const quote = useElement(BlockquotePlugin);
const generic = useElement();import { BlockquotePlugin } from "@platejs/basic-nodes/react";
import { useElement } from "platejs/react";
const quote = useElement(BlockquotePlugin);
const generic = useElement();Use useOptionalElement(Plugin) when a specific provider is optional, or call
useOptionalElement() for the erased nearest provider. It returns null
instead of a placeholder element.
Provides debugging capabilities with configurable log levels and error handling.
See Debugging for more details.
Adds persisted string IDs to every block and inline element. It is opt-in and never assigns IDs to text nodes.
import { ElementIdPlugin, schema, target } from 'platejs';
import { createPlateEditor } from 'platejs/react';
const editor = createPlateEditor({
plugins: [ElementIdPlugin],
});
const elementId = editor.plugin(ElementIdPlugin);
const key = editor.key(element);
const id = elementId.read.id(key);
const entry = id ? elementId.read.entry(id) : undefined;import { ElementIdPlugin, schema, target } from 'platejs';
import { createPlateEditor } from 'platejs/react';
const editor = createPlateEditor({
plugins: [ElementIdPlugin],
});
const elementId = editor.plugin(ElementIdPlugin);
const key = editor.key(element);
const id = elementId.read.id(key);
const entry = id ? elementId.read.entry(id) : undefined;Configure initialState.generateId to replace the default full-length
nanoid() generator. Use migrateElementIds(value, options) for stored input
that lacks IDs, contains legacy numeric IDs, or needs a legacy property
canonicalized through sourceKey.
The application schema can narrow the plugin-owned id target. Document
preparation generates and retains IDs only for elements that match the compiled
target.
const editor = createPlateEditor({
plugins: [ElementIdPlugin],
schema: {
overrides: [
schema.override(ElementIdPlugin, {
properties: { id: { target: target.group('block') } },
}),
],
},
});const editor = createPlateEditor({
plugins: [ElementIdPlugin],
schema: {
overrides: [
schema.override(ElementIdPlugin, {
properties: { id: { target: target.group('block') } },
}),
],
},
});Extend Plate editor behavior on top of Plite.
ElementStatePlugin exposes
editor.plugin(ElementStatePlugin).api.isEmpty(element). It checks the
element's own props, not its text content. By default, only type and compiled
element properties declared with role: "metadata" are ignored; any other prop
means the element carries state. ElementIdPlugin declares its persisted ID
property as metadata.
const elementState = editor.plugin(ElementStatePlugin);
elementState.api.isEmpty({
children: [{ text: "" }],
type: "paragraph",
}); // true
elementState.api.isEmpty({
children: [{ text: "" }],
listType: "bulleted",
type: "paragraph",
}); // false
const CustomMetadataPlugin = defineBasePlugin("customMetadata", {
schema: {
properties: {
customId: schema.elementProperty(property.string(), {
role: "metadata",
target: target.group("block"),
}),
},
},
});const elementState = editor.plugin(ElementStatePlugin);
elementState.api.isEmpty({
children: [{ text: "" }],
type: "paragraph",
}); // true
elementState.api.isEmpty({
children: [{ text: "" }],
listType: "bulleted",
type: "paragraph",
}); // false
const CustomMetadataPlugin = defineBasePlugin("customMetadata", {
schema: {
properties: {
customId: schema.elementProperty(property.string(), {
role: "metadata",
target: target.
Exposes DOM helpers for Plate and composes with Plite React on editable surfaces.
Enables undo and redo functionality for the editor.
Manages inline and void elements in the editor.
Enables HTML serialization and deserialization.
Provides paragraph formatting functionality.
Manages editor events such as focus and blur.
Generic component for rendering an element.
The CSS class to apply to the component.
The editor instance. Also available using the strict useEditor hook.
The element node. Also available using useElement hook.
The path of the element in the editor tree. Also available using usePath
hook.
Attributes of the element to be spread on the top-level element.
Necessary for rendering the node children.
The component type to render as. - Default: 'div'
Generic component for rendering a leaf.
Generic component for rendering text.