Plate
PlateEditorsTemplates
GitHub16kGitHub
DiscordDiscord
  • Plate
  • Editor API
  • Editor Transforms
  • Node
  • Element
  • Text
  • Path
  • Point
  • Range
  • Location
  • Anchor
  • Selection
  • Document Change
  • DOM API
  • React Hooks
  • Plate Core
    • Plate Components
    • Plate Editor
    • Plate Plugin
    • Editor Context
    • Plate Controller
  • Plate Utils
  • Resizable

Anchor API

PreviousNext

Root-aware live paths, points, and ranges mapped by canonical document changes.

An anchor keeps a path, point, or range mapped through canonical DocumentChange values. Choose its API by lifetime: editor.anchor is persistent, while tx.anchor is limited to one transaction callback.

Persistent anchors

editor.anchor(value, options) => Anchor








LocationDocument Change

On This Page

Persistent anchorseditor.anchor(value, options) => Anchoranchor.resolve(view?: Editor): TValue | nullTransaction anchorstx.anchor(value, options) => EditorTransactionAnchor
Build your editor
Production-ready AI template and reusable components.
Get all-access
const
selection
=
editor.read.
selection
();
if (!selection) return;
const target = editor.anchor(selection, {
association: "inward",
deletion: "drop",
});
const selection = editor.read.selection();
 
if (!selection) return;
 
const target = editor.anchor(selection, {
  association: "inward",
  deletion: "drop",
});

deletion is required:

  • "drop" resolves to null when the target is deleted. Undo does not resurrect the dropped value.
  • "nearest" resolves to the nearest valid location. Saved undo and redo restore the exact value recorded on each side of the history batch.

Paths and points accept "backward" or "forward" association. Ranges also accept "inward" and "outward". Pass root for a rootless value that belongs to a named document root.

Persistent anchors remain active across commits and history actions until release() is called.

anchor.resolve(view?: Editor): TValue | null

Omit view to resolve in the view that captured the anchor. Pass another view of the same editor model and document root to read its current projection. A foreign model or different root throws. One retained target can resolve to different locations, or be unavailable, across projected views; resolving it does not create another anchor or change either view's projection.

const current = target.resolve();
const inOtherView = target.resolve(otherView);
const finalValue = target.release();
const current = target.resolve();
const inOtherView = target.resolve(otherView);
const finalValue = target.release();

Here, otherView is another view of the same model and root. resolve reads the mapped value without ending tracking. An anchor captured in an aborted transaction is unavailable. A released anchor returns null in every view.

release() returns the current value in the capture view and permanently detaches the shared target. Releasing an anchor does not merely detach one projected view. Both methods return null for a dropped target or after release.

Use persistent anchors for application-owned runtime state such as local annotations. Release them when their owner is removed.

Transaction anchors

tx.anchor(value, options) => EditorTransactionAnchor

Transaction anchors track a location only while the update or detached transaction builder is active.

editor.update((tx) => {
  const target = tx.anchor(range, {
    association: "inward",
    deletion: "nearest",
  });
 
  tx.text.delete({ at: range });
 
  const mapped = target.resolve();
 
  if (mapped) tx.selection.set(mapped);
});
editor.update((tx) => {
  const target = tx.anchor(range, {
    association: "inward",
    deletion: "nearest",
  });
 
  tx.text.delete({ at: range });
 
  const mapped = target.resolve();
 
  if (mapped) tx.selection.set(mapped);
});

EditorTransactionAnchor exposes only resolve(). The transaction releases its backing anchor automatically. Calling resolve() after the callback ends throws because the transaction is no longer active.

Anchors are runtime values. Persist the resolved path, point, or range only when the application owns a durable serialization policy.