---
title: Editor API
description: API reference for the Editor API.
---
The Editor API provides a set of helper functions for querying and manipulating the editor state.
## Common Options
### `At`
A location reference in the editor. Can be either a Location or a Node.
```ts
type At = TLocation | TNode
```
When a Node is passed, its path will be found using [`editor.api.findPath()`](/docs/api/slate/editor-api#findpath). This allows you to reference a location by either:
- A [Location](/docs/api/slate/location) ([Path](/docs/api/slate/path), [Point](/docs/api/slate/point), or [Range](/docs/api/slate/range))
- A [Node](/docs/api/slate/node)
Example:
```ts
// Using a location
editor.api.nodes({ at: [0, 0] }) // Path location
editor.api.nodes({ at: { path: [0], offset: 0 } }) // Point location
editor.api.nodes({ at: { anchor: point1, focus: point2 } }) // Range location
// Using a node reference
const node = editor.children[0]
editor.api.nodes({ at: node }) // Will find node's path internally
```
### Match
A predicate for matching nodes. The predicate can be either:
- A function that takes a `node` and its `path` and returns a `boolean`
- An object where each key-value pair must match the node's properties
- Values can be single values or arrays of values to match against
Example:
```ts
// Function predicate
editor.api.nodes({
match: (node) => node.type === 'p'
})
// Object predicate
editor.api.nodes({
match: { type: 'p' }
})
// Object predicate with multiple possible values
editor.api.nodes({
match: { type: ['p', 'h1'] }
})
```
### `QueryMode`
Mode for querying nodes in a hierarchy.
<API name="QueryMode">
<APIOptions type="QueryMode">
<APIItem name="mode" type="'all' | 'highest' | 'lowest'" optional>
- `'all'` (default): Return all matching nodes
- `'highest'`: In a hierarchy of nodes, only return the highest-level matching nodes
- `'lowest'`: In a hierarchy of nodes, only return the lowest-level matching nodes
Example:
```ts
// Given this structure:
// - blockquote (matches)
// - paragraph (matches)
// - text
// mode: 'all' returns both blockquote and paragraph
editor.api.nodes({ match: { type: ['blockquote', 'paragraph'] }, mode: 'all' })
// mode: 'highest' returns only blockquote
editor.api.nodes({ match: { type: ['blockquote', 'paragraph'] }, mode: 'highest' })
// mode: 'lowest' returns only paragraph
editor.api.nodes({ match: { type: ['blockquote', 'paragraph'] }, mode: 'lowest' })
```
</APIItem>
</APIOptions>
</API>
### `QueryOptions`
Common options for querying nodes in the editor.
<API name="QueryOptions">
<APIOptions type="QueryOptions<V>">
<APIItem name="at" type="At" optional>
Where to start querying from. Defaults to current editor selection.
</APIItem>
<APIItem name="block" type="boolean" optional>
Match block nodes. When true, only matches block elements.
</APIItem>
<APIItem name="empty" type="boolean" optional>
Match empty/non-empty nodes.
- When true, matches only empty nodes
- When false, matches only non-empty nodes
</APIItem>
<APIItem name="id" type="boolean | string" optional>
Match the node by id.
- When true, matches all nodes with an id
- When string, matches nodes with that specific id
</APIItem>
<APIItem name="match" type="Predicate<NodeIn<V>>" optional>
Custom function or object to match nodes.
- Function: `(node, path) => boolean`
- Object: Key-value pairs that should match the node
</APIItem>
<APIItem name="text" type="boolean" optional>
Match text nodes. When true, matches only text nodes.
</APIItem>
</APIOptions>
</API>
## `editor.api`
### `above`
Get the matching ancestor above a location in the document.
<API name="above">
<APIOptions type="EditorAboveOptions<V>">
<APIItem name="...options" type="QueryOptions<V>" optional>
Common query options.
</APIItem>
<APIItem name="mode" type="QueryMode" optional>
Query mode options.
</APIItem>
<APIItem name="voids" type="boolean" optional>
Whether to include void nodes in the search.
</APIItem>
</APIOptions>
<APIReturns type="NodeEntry<N> | undefined">
A tuple containing the matching ancestor node and its path, or `undefined` if no match is found.
</APIReturns>
</API>
### `block`
Get the block at a location or find the first block that matches options.
Blocks are typically top-level nodes, so this is a common way to retrieve the ancestor block.
```ts
editor.api.block() // Get block above selection
editor.api.block({ above: true }) // Get block above selection
editor.api.block({ at: [0, 0] }) // Get block at [0, 0]
editor.api.block({ at: [0, 0], above: true }) // Get block at [0]
editor.api.block({ highest: true }) // Get highest block at selection
```
<API name="block">
<APIOptions type="EditorBlockOptions<V>">
<APIItem name="...options" type="QueryOptions<V>" optional>
Common query options for matching blocks.
</APIItem>
<APIItem name="at" type="At | Span" optional>
The location to query at. Defaults to current selection.
</APIItem>
<APIItem name="ignoreNonSelectable" type="boolean" optional>
Whether to ignore non-selectable nodes during traversal.
</APIItem>
<APIItem name="reverse" type="boolean" optional>
Whether to traverse in reverse order.
</APIItem>
<APIItem name="universal" type="boolean" optional>
Whether to ensure the operation works universally across all nodes.
</APIItem>
<APIItem name="above" type="boolean" optional>
If true, get the block above the location. Ignored if `at` is not a block path.
</APIItem>
<APIItem name="highest" type="boolean" optional>
If true, get the highest block at the location (root-level block).
</APIItem>
<APIItem name="mode" type="QueryMode" optional>
Query mode for matching blocks.
</APIItem>
<APIItem name="voids" type="boolean" optional>
Whether to include void nodes in the search.
</APIItem>
</APIOptions>
<APIReturns type="NodeEntry<N> | undefined">
The matching block node entry or `undefined` if no match is found.
</APIReturns>
</API>
### `blocks`
Returns all matching blocks.
<API name="blocks">
<APIOptions type="EditorNodesOptions<V>">
<APIItem name="...options" type="QueryOptions<V>" optional>
Common query options for matching blocks.
</APIItem>
<APIItem name="at" type="At | Span" optional>
The location to query at. Defaults to current selection.
</APIItem>
<APIItem name="ignoreNonSelectable" type="boolean" optional>
Whether to ignore non-selectable nodes during traversal.
</APIItem>
<APIItem name="reverse" type="boolean" optional>
Whether to traverse in reverse order.
</APIItem>
<APIItem name="universal" type="boolean" optional>
Whether to ensure the operation works universally across all nodes.
</APIItem>
<APIItem name="mode" type="QueryMode" optional>
Query mode for matching blocks.
</APIItem>
<APIItem name="voids" type="boolean" optional>
Whether to include void nodes in the search.
</APIItem>
</APIOptions>
<APIReturns type="NodeEntry<ElementIn<V>>[]">
An array of matching block node entries.
</APIReturns>
</API>
### `edgeBlocks`
Returns the edge blocks above a location (default: selection).
Useful for retrieving the start and end block of a range.
<API name="edgeBlocks">
<APIOptions type="EditorNodesOptions<V>">
<APIItem name="...options" type="QueryOptions<V>" optional>
Common query options for matching blocks.
</APIItem>
<APIItem name="at" type="At | Span" optional>
The location to get edge blocks from. Defaults to current selection.
</APIItem>
<APIItem name="ignoreNonSelectable" type="boolean" optional>
Whether to ignore non-selectable nodes during traversal.
</APIItem>
<APIItem name="reverse" type="boolean" optional>
Whether to traverse in reverse order.
</APIItem>
<APIItem name="universal" type="boolean" optional>
Whether to ensure the operation works universally across all nodes.
</APIItem>
<APIItem name="mode" type="QueryMode" optional>
Query mode for matching blocks.
</APIItem>
<APIItem name="voids" type="boolean" optional>
Whether to include void nodes in the search.
</APIItem>
</APIOptions>
<APIReturns type="[NodeEntry<N1>, NodeEntry<N2>] | null">
A tuple of `[startBlock, endBlock]` above the location, or `null` if not found.
</APIReturns>
</API>
### `first`
Get the first node at a location.
<API name="first">
<APIParameters>
<APIItem name="at" type="At">
The location to get the first node from.
</APIItem>
</APIParameters>
<APIReturns type="NodeEntry<DescendantIn<V>> | undefined">
A tuple containing the first node and its path, or undefined if not found.
</APIReturns>
</API>
### `fragment`
Get the fragment at a location or selection.
<API name="fragment">
<APIParameters>
<APIItem name="at" type="At | null" optional>
The location to extract the fragment from. Defaults to current selection.
</APIItem>
<APIItem name="options" type="EditorFragmentOptions" optional>
Options for extracting and processing the fragment.
</APIItem>
</APIParameters>
<APIReturns type="ElementOrTextIn<V>[] | undefined">
The fragment at the location.
</APIReturns>
</API>
### `getFragment`
Returns the fragment at the current selection. Used when cutting or copying, as an example, to get the fragment at the current selection.
<API name="getFragment">
<APIParameters>
<APIItem name="at" type="At" optional>
The location to get the fragment from. Defaults to current selection.
</APIItem>
</APIParameters>
<APIReturns type="ElementOrTextIn<V>[]">
The fragment at the current selection.
</APIReturns>
</API>
### `hasBlocks`
Check if a node has block children.
<API name="hasBlocks">
<APIParameters>
<APIItem name="element" type="ElementIn<V>">
The element to check.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the element has block children, false otherwise.
</APIReturns>
</API>
### `hasInlines`
Check if a node has inline and text children.
<API name="hasInlines">
<APIParameters>
<APIItem name="element" type="ElementIn<V>">
The element to check.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the element has inline and text children, false otherwise.
</APIReturns>
</API>
### `hasMark`
Check if mark is active at selection.
<API name="hasMark">
<APIParameters>
<APIItem name="key" type="keyof MarksIn<V>">
The mark key to check.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the mark is active at the current selection, false otherwise.
</APIReturns>
</API>
### `hasPath`
Check if a path exists in the editor.
<API name="hasPath">
<APIParameters>
<APIItem name="path" type="Path">
The path to check.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the path exists, false otherwise.
</APIReturns>
</API>
### `hasTexts`
Check if a node has text children.
<API name="hasTexts">
<APIParameters>
<APIItem name="element" type="ElementIn<V>">
The element to check.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the element has text children, false otherwise.
</APIReturns>
</API>
### `isAt`
Check if a location (point/range) is at a specific position.
```ts
// For ranges:
editor.api.isAt({ text: true }) // Check if range is in a single text node
editor.api.isAt({ block: true }) // Check if range is in a single block
editor.api.isAt({ blocks: true }) // Check if range is across multiple blocks
editor.api.isAt({ start: true }) // Check if range starts at block start
editor.api.isAt({ end: true }) // Check if range ends at block end
// For points:
editor.api.isAt({ word: true }) // Check relative to word boundaries
editor.api.isAt({ start: true }) // Check if at start
editor.api.isAt({ end: true }) // Check if at end
```
<API name="isAt">
<APIOptions type="object">
<APIItem name="at" type="At" optional>
The location to check. Defaults to current selection.
</APIItem>
<APIItem name="text" type="boolean" optional>
Check if range is in a single text node.
</APIItem>
<APIItem name="block" type="boolean" optional>
Check if range is in a single block.
</APIItem>
<APIItem name="blocks" type="boolean" optional>
Check if range is across multiple blocks.
</APIItem>
<APIItem name="start" type="boolean" optional>
Check if at start position.
</APIItem>
<APIItem name="end" type="boolean" optional>
Check if at end position.
</APIItem>
<APIItem name="word" type="boolean" optional>
Check relative to word boundaries.
</APIItem>
</APIOptions>
<APIReturns type="boolean">
True if the location matches all specified position criteria, false otherwise.
</APIReturns>
</API>
### `isCollapsed`
Check if the selection is collapsed (start and end points are the same).
<API name="isCollapsed">
<APIReturns type="boolean">
True if the selection is collapsed, false otherwise.
</APIReturns>
</API>
### `isEdge`
Check if a point is an edge of a location.
<API name="isEdge">
<APIParameters>
<APIItem name="point" type="Point">
The point to check.
</APIItem>
<APIItem name="at" type="At" optional>
The location to check against. Defaults to current selection.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the point is an edge of the location, false otherwise.
</APIReturns>
</API>
### `isEditorEnd`
Check if selection is at editor end.
<API name="isEditorEnd">
<APIReturns type="boolean">
True if the selection is at the editor end, false otherwise.
</APIReturns>
</API>
### `isEmpty`
Check if an element is empty, accounting for void nodes.
```ts
editor.api.isEmpty() // Check if editor is empty
editor.api.isEmpty(at) // Check if nodes at location are empty
editor.api.isEmpty(at, { after: true }) // Check if text after location is empty
editor.api.isEmpty(at, { block: true }) // Check if block above location is empty
```
<API name="isEmpty">
<APIParameters>
<APIItem name="at" type="At | null" optional>
The location to check for emptiness. Defaults to current selection.
</APIItem>
<APIItem name="options" type="EditorEmptyOptions" optional>
Options for determining emptiness.
</APIItem>
</APIParameters>
<APIOptions type="EditorEmptyOptions">
<APIItem name="...options" type="QueryOptions<V>" optional />
<APIItem name="after" type="boolean" optional>
Check if text after selection is empty.
</APIItem>
<APIItem name="block" type="boolean" optional>
Check if the block above location is empty.
</APIItem>
</APIOptions>
<APIReturns type="boolean" />
</API>
### `isEnd`
Check if a point is the end point of a location.
<API name="isEnd">
<APIParameters>
<APIItem name="point" type="Point">
The point to check.
</APIItem>
<APIItem name="at" type="At" optional>
The location to check against. Defaults to current selection.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the point is the end point of the location, false otherwise.
</APIReturns>
</API>
### `isExpanded`
Check if the selection is expanded (start and end points are different).
<API name="isExpanded">
<APIReturns type="boolean">
True if the selection is expanded, false otherwise.
</APIReturns>
</API>
### `isNormalizing`
Check if the editor is currently normalizing after each operation.
<API name="isNormalizing">
<APIReturns type="boolean">
True if the editor is currently normalizing, false otherwise.
</APIReturns>
</API>
### `isStart`
Check if a point is the start point of a location.
<API name="isStart">
<APIParameters>
<APIItem name="point" type="Point">
The point to check.
</APIItem>
<APIItem name="at" type="At" optional>
The location to check against. Defaults to current selection.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the point is the start point of the location, false otherwise.
</APIReturns>
</API>
### `isSelected`
Check if a path is selected by the current selection.
<API name="isSelected">
<APIParameters>
<APIItem name="target" type="Path | TRange">
The path or range to check.
</APIItem>
<APIItem name="options" type="EditorIsSelectedOptions" optional>
Options for checking selection.
</APIItem>
</APIParameters>
<APIOptions type="EditorIsSelectedOptions">
<APIItem name="contains" type="boolean" optional>
Check if selection contains the entire path range.
</APIItem>
</APIOptions>
<APIReturns type="boolean">
True if the path is selected, false otherwise.
</APIReturns>
</API>
### `leaf`
Get the leaf text node at a location.
<API name="leaf">
<APIParameters>
<APIItem name="at" type="At">
The location to get the leaf from.
</APIItem>
<APIItem name="options" type="EditorLeafOptions" optional>
Options for getting the leaf.
</APIItem>
</APIParameters>
<APIOptions type="EditorLeafOptions">
<APIItem name="depth" type="number" optional>
The depth to traverse to find the leaf.
</APIItem>
<APIItem name="edge" type="LeafEdge" optional>
Which edge of the location to get the leaf from (`'start' | 'end'`).
</APIItem>
</APIOptions>
<APIReturns type="NodeEntry<TextIn<V>> | undefined">
A tuple containing the leaf text node and its path, or undefined if not found.
</APIReturns>
</API>
### `levels`
Iterate through all levels at a location. This includes all ancestors up to the root editor node.
<API name="levels">
<APIOptions type="EditorLevelsOptions<V>">
<APIItem name="...options" type="QueryOptions<V>" optional>
Common query options for matching levels.
</APIItem>
<APIItem name="reverse" type="boolean" optional>
Whether to traverse in reverse order (bottom-up vs. top-down).
</APIItem>
<APIItem name="voids" type="boolean" optional>
Whether to include void nodes in the traversal.
</APIItem>
</APIOptions>
<APIReturns type="Generator<NodeEntry<NodeIn<V>>, void, undefined>">
A generator that yields tuples of [node, path] for each ancestor level.
</APIReturns>
</API>
### `last`
Get the last node at a location.
<API name="last">
<APIParameters>
<APIItem name="at" type="At">
The location to get the last node from.
</APIItem>
<APIItem name="options" type="EditorLastOptions" optional>
Options for getting the last node.
</APIItem>
</APIParameters>
<APIOptions type="EditorLastOptions">
<APIItem name="level" type="number" optional>
Get last node at this level (0-based).
</APIItem>
</APIOptions>
<APIReturns type="NodeEntry<DescendantIn<V>> | undefined">
A tuple containing the last node and its path, or undefined if not found.
</APIReturns>
</API>
### `mark`
Returns the selection mark value by key.
<API name="mark">
<APIParameters>
<APIItem name="key" type="keyof MarksIn<V>">
The mark key.
</APIItem>
</APIParameters>
<APIReturns type="MarksIn<V>[K] | null | undefined">
The mark value if it exists, null if not set, or undefined if multiple different values exist.
</APIReturns>
</API>
### `marks`
Get the marks that would be added to text at the current selection.
<API name="marks">
<APIReturns type="MarksIn<V> | null">
The marks at the current selection, or null if there are no marks.
</APIReturns>
</API>
### `next`
Get the matching node in the branch of the document after a location.
<API name="next">
<APIOptions type="EditorNextOptions<V>">
<APIItem name="...options" type="QueryOptions<V>" optional>
Common query options for matching nodes.
</APIItem>
<APIItem name="at" type="At | Span" optional>
The location to start searching from. Defaults to current selection.
</APIItem>
<APIItem name="mode" type="QueryMode" optional>
Query mode for matching nodes.
</APIItem>
<APIItem name="voids" type="boolean" optional>
Whether to include void nodes in the search.
</APIItem>
<APIItem name="from" type="'after' | 'child'" optional>
- `'after'`: Start from point after current location
- `'child'`: Start from the first child of current path
</APIItem>
</APIOptions>
<APIReturns type="NodeEntry<DescendantIn<V>> | undefined">
A tuple containing the next matching node and its path, or undefined if not found.
</APIReturns>
</API>
### `node`
Get the node at a location or find the first node that matches options.
<API name="node">
<APIParameters>
<APIItem name="at" type="At" optional>
The location to get a node from.
</APIItem>
<APIItem name="nodeOptions" type="EditorNodeOptions" optional>
Options for getting a node.
</APIItem>
</APIParameters>
<APIOptions type="EditorNodeOptions">
<APIItem name="depth" type="number" optional>
The depth to traverse to find the node.
</APIItem>
<APIItem name="edge" type="'start' | 'end'" optional>
Which edge of the location to get the node from.
</APIItem>
</APIOptions>
<APIReturns type="NodeEntry<NodeIn<V>> | undefined">
A tuple containing the matching node and its path, or undefined if not found.
</APIReturns>
</API>
### `nodes`
Iterate through all nodes in the editor that match the given options.
<API name="nodes">
<APIOptions type="EditorNodesOptions<V>">
<APIItem name="...options" type="QueryOptions<V>" optional>
Common query options for matching nodes.
</APIItem>
<APIItem name="at" type="At | Span" optional>
Where to start iterating. Defaults to editor selection.
</APIItem>
<APIItem name="ignoreNonSelectable" type="boolean" optional>
Whether to ignore non-selectable nodes during traversal.
</APIItem>
<APIItem name="reverse" type="boolean" optional>
Whether to traverse in reverse order.
</APIItem>
<APIItem name="universal" type="boolean" optional>
Whether to ensure the operation works universally across all nodes.
</APIItem>
<APIItem name="mode" type="QueryMode" optional>
- `'all'`: Return all matching nodes
- `'highest'`: Return highest-level matching nodes
- `'lowest'`: Return lowest-level matching nodes
</APIItem>
<APIItem name="voids" type="boolean" optional>
Whether to include void nodes in the search.
</APIItem>
</APIOptions>
<APIReturns type="Generator<NodeEntry<DescendantIn<V>>, void, undefined>">
A generator that yields tuples of [node, path] for each matching node.
</APIReturns>
</API>
### `parent`
Get the parent node of a location.
<API name="parent">
<APIParameters>
<APIItem name="at" type="At" optional>
The location to get the parent from.
</APIItem>
<APIItem name="options" type="EditorParentOptions" optional>
Options for getting the parent node.
</APIItem>
</APIParameters>
<APIOptions type="EditorParentOptions">
<APIItem name="depth" type="number" optional>
Number of levels to traverse up to find the parent.
</APIItem>
<APIItem name="edge" type="'start' | 'end'" optional>
Which edge of the location to get the parent from.
</APIItem>
</APIOptions>
<APIReturns type="NodeEntry<AncestorIn<V>> | undefined">
A tuple containing the parent node and its path, or undefined if not found.
</APIReturns>
</API>
### `previous`
Get the matching node in the branch of the document before a location.
<API name="previous">
<APIOptions type="EditorPreviousOptions<V>">
<APIItem name="...options" type="QueryOptions<V>" optional>
Common query options for matching nodes.
</APIItem>
<APIItem name="at" type="At | Span" optional>
The location to start searching from. Defaults to current selection.
</APIItem>
<APIItem name="mode" type="QueryMode" optional>
Query mode for matching nodes.
</APIItem>
<APIItem name="voids" type="boolean" optional>
Whether to include void nodes in the search.
</APIItem>
<APIItem name="sibling" type="boolean" optional>
Whether to get the previous sibling node instead of any previous node.
</APIItem>
<APIItem name="from" type="'before' | 'parent'" optional>
- `'before'`: Start from point before current location
- `'parent'`: Start from parent of current location
</APIItem>
</APIOptions>
<APIReturns type="NodeEntry<DescendantIn<V>> | undefined">
A tuple containing the previous matching node and its path, or undefined if not found.
</APIReturns>
</API>
### `prop`
Get a property value from a list of nodes. Returns `undefined` if the property value is not consistent across all nodes.
<API name="prop">
<APIOptions type="EditorPropOptions<V>">
<APIItem name="nodes" type="TElement[]">
The list of nodes to get the property value from.
</APIItem>
<APIItem name="key" type="string" optional>
The property key to get from the nodes.
</APIItem>
<APIItem name="defaultValue" type="string" optional>
Default value to return if property is not found.
</APIItem>
<APIItem name="getProp" type="(node: DescendantIn<V>) => any" optional>
Custom function to extract property value from a node.
</APIItem>
<APIItem name="mode" type="'all' | 'block' | 'text'" optional>
- `'all'`: Get property from all nodes
- `'block'`: Get property from the first block node
- `'text'`: Get property from the first text node
</APIItem>
</APIOptions>
<APIReturns type="string | undefined">
The consistent property value across all nodes, or `undefined` if values differ.
</APIReturns>
</API>
### `string`
Get the text string content of a location.
<API name="string">
<APIParameters>
<APIItem name="at" type="At" optional>
The location to get text content from. Defaults to current selection.
</APIItem>
<APIItem name="options" type="EditorStringOptions" optional>
Options for getting text content.
</APIItem>
</APIParameters>
<APIOptions type="EditorStringOptions">
<APIItem name="voids" type="boolean" optional>
Whether to include text content from void nodes.
</APIItem>
</APIOptions>
<APIReturns type="string">
The text content at the specified location.
</APIReturns>
</API>
### `void`
Match a void node in the current branch of the editor.
<API name="void">
<APIOptions type="EditorVoidOptions">
<APIItem name="at" type="At" optional>
The location to search from. Defaults to current selection.
</APIItem>
<APIItem name="mode" type="QueryMode" optional>
Query mode for matching nodes.
</APIItem>
<APIItem name="voids" type="boolean" optional>
Whether to include void nodes in the search.
</APIItem>
</APIOptions>
<APIReturns type="NodeEntry<ElementIn<V>> | undefined">
A tuple containing the void node and its path, or undefined if not found.
</APIReturns>
</API>
## Location
### `findPath`
Find the path of a Plate node in the editor.
<API name="findPath">
<APIParameters>
<APIItem name="node" type="TNode">
The node to find the path for in the editor tree.
</APIItem>
<APIItem name="options" type="EditorFindPathOptions" optional>
Options for finding the node's path.
</APIItem>
</APIParameters>
<APIOptions type="EditorFindPathOptions">
<APIItem name="...options" type="QueryOptions<Value>" optional>
Common query options for finding nodes.
</APIItem>
<APIItem name="ignoreNonSelectable" type="boolean" optional>
Whether to ignore non-selectable nodes during traversal.
</APIItem>
<APIItem name="reverse" type="boolean" optional>
Whether to traverse in reverse order.
</APIItem>
<APIItem name="universal" type="boolean" optional>
Whether to ensure the operation works universally across all nodes.
</APIItem>
<APIItem name="mode" type="QueryMode" optional>
Query mode for finding nodes.
</APIItem>
<APIItem name="voids" type="boolean" optional>
Whether to include void nodes in the search.
</APIItem>
</APIOptions>
<APIReturns type="Path | undefined">
The path of the node if found, undefined otherwise.
</APIReturns>
</API>
### `path`
Get the path of a location.
<API name="path">
<APIParameters>
<APIItem name="at" type="At" optional>
The location to get the path from. Defaults to current selection.
</APIItem>
</APIParameters>
<APIReturns type="Path">
The path of the location.
</APIReturns>
</API>
### `point`
Get the `start` or `end` (default is `start`) point of a location.
<API name="point">
<APIParameters>
<APIItem name="at" type="At" optional>
The location to get the point from. Defaults to current selection.
</APIItem>
<APIItem name="options" type="EditorPointOptions" optional>
Options for getting the point.
</APIItem>
</APIParameters>
<APIOptions type="EditorPointOptions">
<APIItem name="edge" type="'start' | 'end'" optional>
Which edge of the location to get the point from.
</APIItem>
</APIOptions>
<APIReturns type="Point">
The point at the specified location and edge.
</APIReturns>
</API>
### `positions`
Iterate through all possible point positions in the document.
<API name="positions">
<APIOptions type="EditorPositionsOptions">
<APIItem name="at" type="At" optional>
Where to start iterating. Defaults to editor selection.
</APIItem>
<APIItem name="unit" type="TextUnitAdjustment" optional>
- `'offset'`: Moves to the next offset Point
- `'character'`: Moves to the next character
- `'word'`: Moves to the position after the next word
- `'line'` | 'block': Moves between block boundaries
</APIItem>
<APIItem name="reverse" type="boolean" optional>
When true returns positions in reverse order.
</APIItem>
<APIItem name="voids" type="boolean" optional>
Whether to include positions inside void nodes.
</APIItem>
<APIItem name="ignoreNonSelectable" type="boolean" optional>
Whether to skip positions in non-selectable nodes.
</APIItem>
</APIOptions>
<APIReturns type="Generator<Point, void, undefined>">
A generator that yields each valid point position in the document.
</APIReturns>
</API>
### `nodesRange`
Returns the range spanning the given node entries.
<API name="nodesRange">
<APIParameters>
<APIItem name="nodes" type="NodeEntry[]">
The node entries to get the range for.
</APIItem>
</APIParameters>
<APIReturns type="TRange | undefined">
The range spanning the nodes, or undefined if no valid range can be created.
</APIReturns>
</API>
### `range`
Create a range between two locations.
<API name="range">
<APIOptions type="EditorRangeOptions">
<APIItem name="at" type="At" optional>
The location to create the range at. Defaults to current selection.
</APIItem>
<APIItem name="focus" type="Point" optional>
The focus (end) point of the range.
</APIItem>
<APIItem name="anchor" type="Point" optional>
The anchor (start) point of the range.
</APIItem>
</APIOptions>
<APIReturns type="TRange">
A new range between the specified points.
</APIReturns>
</API>
### `start`
Get the start point of a location.
<API name="start">
<APIParameters>
<APIItem name="at" type="At" optional>
The location to get the start point from.
</APIItem>
<APIItem name="options" type="EditorStartOptions" optional>
Options for getting the start point.
</APIItem>
</APIParameters>
<APIOptions type="EditorStartOptions">
<APIItem name="next" type="boolean" optional>
Get the start point of the next node instead of the current one.
</APIItem>
</APIOptions>
<APIReturns type="Point">
The start point of the location.
</APIReturns>
</API>
### `unhangRange`
Convert a range into a non-hanging one.
A "hanging" range is one created by the browser's "triple-click" selection behavior. When triple-clicking a block, the browser selects from the start of that block to the start of the _next_ block. The range thus "hangs over" into the next block. If `unhangRange` is given such a range, it moves the end backwards until it's in a non-empty text node that precedes the hanging block.
Note that `unhangRange` is designed for the specific purpose of fixing triple-clicked blocks, and therefore currently has a number of caveats:
- It does not modify the start of the range; only the end. For example, it does not "unhang" a selection that starts at the end of a previous block.
- It only does anything if the start block is fully selected. For example, it does not handle ranges created by double-clicking the end of a paragraph (which browsers treat by selecting from the end of that paragraph to the start of the next).
<API name="unhangRange">
<APIParameters>
<APIItem name="range" type="TRange">
The range to unhang.
</APIItem>
<APIItem name="options" type="EditorUnhangRangeOptions" optional>
Options for un-hanging the range.
</APIItem>
</APIParameters>
<APIOptions type="EditorUnhangRangeOptions">
<APIItem name="voids" type="boolean" optional>
Allow placing the end of the selection in a void node.
</APIItem>
</APIOptions>
<APIReturns type="TRange">
A new range with the end point moved backwards if it was hanging.
</APIReturns>
</API>
## Element
### `elementReadOnly`
Check if an element is read-only.
<API name="elementReadOnly">
<APIParameters>
<APIItem name="element" type="ElementIn<V>">
The element to check for read-only status.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the element is read-only, false otherwise.
</APIReturns>
</API>
### `isBlock`
Check if a value is a block `Element` object.
<API name="isBlock">
<APIParameters>
<APIItem name="value" type="any">
The value to check.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the value is a block element, false otherwise.
</APIReturns>
</API>
### `isInline`
Check if a value is an inline `Element` object.
<API name="isInline">
<APIParameters>
<APIItem name="element" type="DescendantIn<V>">
The element to check.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the element is inline, false otherwise.
</APIReturns>
</API>
### `isSelectable`
Check if a value is a selectable `Element` object.
<API name="isSelectable">
<APIParameters>
<APIItem name="element" type="ElementIn<V>">
The element to check.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the element is selectable, false otherwise.
</APIReturns>
</API>
### `isVoid`
Check if an element is void.
<API name="isVoid">
<APIParameters>
<APIItem name="element" type="ElementIn<V>">
The element to check for void status.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the element is void, false otherwise.
</APIReturns>
</API>
### `markableVoid`
Check if an element is a markable void element.
<API name="markableVoid">
<APIParameters>
<APIItem name="element" type="ElementIn<V>">
The element to check for markable void status.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the element is a markable void element, false otherwise.
</APIReturns>
</API>
## Ref
### `pathRef`
Create a mutable ref for a `Path`.
<API name="pathRef">
<APIParameters>
<APIItem name="path" type="Path">
The path to reference.
</APIItem>
<APIItem name="options" type="EditorPathRefOptions" optional>
Options for the path reference.
</APIItem>
</APIParameters>
<APIOptions type="EditorPathRefOptions">
<APIItem name="affinity" type="TextDirection | null" optional>
The direction to resolve the ref when ambiguous:
- `'forward'`: Resolve to the next valid position
- `'backward'`: Resolve to the previous valid position
- `null`: Do not resolve to any position
</APIItem>
</APIOptions>
<APIReturns type="PathRef">
A mutable reference that updates its path as operations are applied to the editor.
</APIReturns>
</API>
### `pathRefs`
Get the set of currently tracked path refs of the editor.
<API name="pathRefs">
<APIReturns type="Set<PathRef>">
The set of tracked path refs.
</APIReturns>
</API>
### `pointRef`
Create a mutable ref for a `Point`.
<API name="pointRef">
<APIParameters>
<APIItem name="point" type="Point">
The point to reference.
</APIItem>
<APIItem name="options" type="EditorPointRefOptions" optional>
Options for the point reference.
</APIItem>
</APIParameters>
<APIOptions type="EditorPointRefOptions">
<APIItem name="affinity" type="TextDirection | null" optional>
The direction to resolve the ref when ambiguous:
- `'forward'`: Resolve to the next valid position
- `'backward'`: Resolve to the previous valid position
- `null`: Do not resolve to any position
</APIItem>
</APIOptions>
<APIReturns type="PointRef">
A mutable reference that updates its point as operations are applied to the editor.
</APIReturns>
</API>
### `pointRefs`
Get the set of currently tracked point refs of the editor.
<API name="pointRefs">
<APIReturns type="Set<PointRef>">
The set of tracked point refs.
</APIReturns>
</API>
### `rangeRef`
Create a mutable ref for a `Range`.
<API name="rangeRef">
<APIParameters>
<APIItem name="range" type="TRange">
The range to reference.
</APIItem>
<APIItem name="options" type="EditorRangeRefOptions" optional>
Options for the range reference.
</APIItem>
</APIParameters>
<APIOptions type="EditorRangeRefOptions">
<APIItem name="affinity" type="RangeDirection | null" optional>
The direction to resolve the ref when ambiguous:
- `'forward'`: Resolve both points forward
- `'backward'`: Resolve both points backward
- `'outward'`: Resolve start backward and end forward
- `'inward'`: Resolve start forward and end backward
- `null`: Do not resolve to any position
</APIItem>
</APIOptions>
<APIReturns type="RangeRef">
A mutable reference that updates its range as operations are applied to the editor.
</APIReturns>
</API>
### `rangeRefs`
Get the set of currently tracked range refs of the editor.
<API name="rangeRefs">
<APIReturns type="Set<RangeRef>">
The set of tracked range refs.
</APIReturns>
</API>
## DOM
### `findDocumentOrShadowRoot`
Find the document or shadow root from the editor.
<API name="findDocumentOrShadowRoot">
<APIReturns type="Document | ShadowRoot">
The document or shadow root containing the editor.
</APIReturns>
</API>
### `findEventRange`
Get the target range from a DOM event.
<API name="findEventRange">
<APIParameters>
<APIItem name="event" type="Event">
The DOM event to get the range from.
</APIItem>
</APIParameters>
<APIReturns type="TRange | null">
The range at the event target, or null if no valid range found.
</APIReturns>
</API>
### `findKey`
Find a key for a Plate node. Returns an instance of `Key` which looks like `{ id: string }`.
<API name="findKey">
<APIParameters>
<APIItem name="node" type="TNode">
The node to find the key for.
</APIItem>
</APIParameters>
<APIReturns type="Key">
The key associated with the node.
</APIReturns>
</API>
### `getWindow`
Get the window object from the editor.
<API name="getWindow">
<APIReturns type="Window">
The window object associated with the editor.
</APIReturns>
</API>
### `hasDOMNode`
Check if a DOM node is within the editor.
<API name="hasDOMNode">
<APIParameters>
<APIItem name="target" type="Node">
The DOM node to check.
</APIItem>
<APIItem name="options" type="object" optional>
Options for checking the DOM node.
</APIItem>
</APIParameters>
<APIOptions type="object">
<APIItem name="editable" type="boolean" optional>
Whether to check if the node is in an editable element.
</APIItem>
</APIOptions>
<APIReturns type="boolean">
True if the DOM node is within the editor, false otherwise.
</APIReturns>
</API>
### `hasEditableTarget`
Check if a DOM target is editable.
<API name="hasEditableTarget">
<APIParameters>
<APIItem name="target" type="EventTarget | null">
The DOM target to check.
</APIItem>
</APIParameters>
<APIReturns type="target is Node">
True if the target is editable, false otherwise.
</APIReturns>
</API>
### `hasRange`
Check if the editor has a range.
<API name="hasRange">
<APIParameters>
<APIItem name="range" type="TRange">
The range to check.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the editor has the specified range, false otherwise.
</APIReturns>
</API>
### `hasSelectableTarget`
Check if a DOM target is selectable.
<API name="hasSelectableTarget">
<APIParameters>
<APIItem name="target" type="EventTarget | null">
The DOM target to check.
</APIItem>
</APIParameters>
<APIReturns type="target is Node">
True if the target is selectable, false otherwise.
</APIReturns>
</API>
### `hasTarget`
Check if a DOM target exists.
<API name="hasTarget">
<APIParameters>
<APIItem name="target" type="EventTarget | null">
The DOM target to check.
</APIItem>
</APIParameters>
<APIReturns type="target is Node">
True if the target exists, false otherwise.
</APIReturns>
</API>
### `isComposing`
Check if the user is currently composing inside the editor.
<API name="isComposing">
<APIReturns type="boolean">
True if the user is currently composing text, false otherwise.
</APIReturns>
</API>
### `isFocused`
Check if the editor is focused.
<API name="isFocused">
<APIReturns type="boolean">
True if the editor has focus, false otherwise.
</APIReturns>
</API>
### `isReadOnly`
Check if the editor is in read-only mode.
<API name="isReadOnly">
<APIReturns type="boolean">
True if the editor is read-only, false otherwise.
</APIReturns>
</API>
### `toDOMNode`
Find the native DOM element from a Plate node.
<API name="toDOMNode">
<APIOptions type="TNode">
<APIItem name="node" type="TNode">
The Plate node to convert to a DOM element.
</APIItem>
</APIOptions>
<APIReturns type="HTMLElement">
The corresponding DOM element for the Plate node.
</APIReturns>
</API>
### `toDOMPoint`
Find a native DOM selection point from a Plate point.
<API name="toDOMPoint">
<APIOptions type="Point">
<APIItem name="point" type="Point">
The Plate point to convert to a DOM point.
</APIItem>
</APIOptions>
<APIReturns type="DOMPoint">
A tuple of [node, offset] representing the DOM point.
</APIReturns>
</API>
### `toDOMRange`
Find a native DOM range from a Plate range.
<API name="toDOMRange">
<APIOptions type="TRange">
<APIItem name="range" type="TRange">
The Plate range to convert to a DOM range.
</APIItem>
</APIOptions>
<APIReturns type="DOMRange">
The corresponding DOM range for the Plate range.
</APIReturns>
</API>
### `toSlateNode`
Find a Plate node from a native DOM element.
<API name="toSlateNode">
<APIOptions type="DOMNode">
<APIItem name="domNode" type="DOMNode">
The DOM node to convert to a Plate node.
</APIItem>
</APIOptions>
<APIReturns type="TNode | undefined">
The corresponding Plate node if found, undefined otherwise.
</APIReturns>
</API>
### `toSlatePoint`
Find a Plate point from a DOM selection point.
<API name="toSlatePoint">
<APIOptions type="DOMPoint">
<APIItem name="domPoint" type="DOMPoint">
The DOM point to convert to a Plate point.
</APIItem>
</APIOptions>
<APIReturns type="Point | undefined">
The corresponding Plate point if found, undefined otherwise.
</APIReturns>
</API>
### `toSlateRange`
Find a Plate range from a DOM range.
<API name="toSlateRange">
<APIOptions type="DOMRange">
<APIItem name="domRange" type="DOMRange">
The DOM range to convert to a Plate range.
</APIItem>
</APIOptions>
<APIReturns type="TRange | undefined">
The corresponding Plate range if found, undefined otherwise.
</APIReturns>
</API>
## Callback
### `onChange`
Called when there is a change in the editor.
<API name="onChange">
<APIOptions type="object">
<APIItem name="operation" type="Operation" optional>
The operation that triggered the change.
</APIItem>
</APIOptions>
</API>
## Core
### `getDirtyPaths`
Get the paths that need to be normalized after an operation.
<API name="getDirtyPaths">
<APIParameters>
<APIItem name="operation" type="Operation<N extends DescendantIn<V>>">
The operation that triggered normalization.
</APIItem>
</APIParameters>
<APIReturns type="Path[]">
An array of paths that need to be normalized after the operation.
</APIReturns>
</API>
### `shouldNormalizeNode`
Override this method to prevent normalizing a specific node. Defaults to returning `true`.
<API name="shouldNormalizeNode">
<APIParameters>
<APIItem name="entry" type="NodeEntry">
The node entry (node and path) to check.
</APIItem>
</APIParameters>
<APIReturns type="boolean">
True if the node should be normalized, false otherwise.
</APIReturns>
</API>
### `setNormalizing`
Manually control the editor's normalizing state.
<API name="setNormalizing">
<APIOptions type="boolean">
<APIItem name="isNormalizing" type="boolean">
Whether the editor should normalize after each operation.
</APIItem>
</APIOptions>
</API>
### `shouldNormalize`
Controls whether the editor should normalize after an operation. Override this method to prevent normalizing in certain situations.
<API name="shouldNormalize">
<APIOptions type="object">
<APIItem name="dirtyPaths" type="Path[]">
The paths that need to be normalized.
</APIItem>
<APIItem name="initialDirtyPathsLength" type="number">
The initial number of dirty paths before normalization started.
</APIItem>
<APIItem name="iteration" type="number">
The current normalization iteration count.
</APIItem>
<APIItem name="operation" type="Operation" optional>
The operation that triggered the normalization.
</APIItem>
</APIOptions>
<APIReturns type="boolean">
True if the editor should normalize, false otherwise.
</APIReturns>
</API>
## History
### `isMerging`
Get the merge flag's current value.
<API name="isMerging">
<APIReturns type="boolean">
True if the editor is currently merging operations, false otherwise.
</APIReturns>
</API>
### `isSaving`
Get the saving flag's current value.
<API name="isSaving">
<APIReturns type="boolean">
True if the editor is currently saving, false otherwise.
</APIReturns>
</API>
### `isSplittingOnce`
Get the splitting flag's current value.
<API name="isSplittingOnce">
<APIReturns type="boolean">
True if the editor is currently performing a single split operation, false otherwise.
</APIReturns>
</API>
## Utils
### `create.block`
Default block factory for creating new block elements.
<API name="create.block">
<APIParameters>
<APIItem name="node" type="Partial<TElement>" optional>
Partial element properties to merge into the new block.
</APIItem>
<APIItem name="path" type="Path" optional>
Path for the new block.
</APIItem>
</APIParameters>
<APIReturns type="TElement">
A new block element.
</APIReturns>
</API>
### `create.value`
Default value factory for creating new editor values.
<API name="create.value">
<APIReturns type="Value">
A new editor value.
</APIReturns>
</API>
npx shadcn@latest add @plate/api-slate-editor-api-docsUsage varies by registry entry. Refer to the registry docs or source files below for details.