From zbeyens. The source code is available on GitHub.

Plate
PlatePliteEditorsTemplates
GitHub16kGitHub
DiscordDiscord
  • Plate
  • Plitev42
    • Editor API
    • Editor Transforms
    • Node
    • Element
    • Text
    • Path
    • Point
    • Range
    • Location
    • Location Ref
    • Document Change
  • Plate Core
    • Plate Components
    • Plate Editor
    • Plate Plugin
    • Plate Store
    • Plate Controller
  • Plate Utils
  • React Utils
  • cn
  • Floating
  • Resizable

Plate Utils

PreviousNext

API reference for @platejs/utils.

@platejs/utils contains Plate's first-party plugin identity catalog and small utility plugins. @platejs/utils/react adds the selection-fragment property hook and block placeholder plugin used by registry UI.

Installation

pnpm add @platejs/utils
pnpm add @platejs/utils

Application code usually imports this surface from platejs and platejs/react. Direct package imports are useful inside packages that should not depend on the umbrella platejs package.

Import Paths

Plate ControllerReact Utils

On This Page

InstallationImport PathsPlugin IdentitiesSchema-Derived TypesUtility Plugins And KitsReact HooksReact PluginsRelated APIs
Build your editor
Production-ready AI template and reusable components.
Get all-access
ImportRe-exportsUse
@platejs/utilsPLUGINS, utility pluginsFirst-party names and headless utility behavior.
@platejs/utils/reactuseSelectionFragmentProp, BlockPlaceholderPluginRegistry controls and React-only utility behavior.
platejs@platejs/utilsApp-level imports for identities and utility plugins.
platejs/react@platejs/utils/reactApp-level imports for React hooks and BlockPlaceholderPlugin.

Plugin Identities

PLUGINS is the first-party capability-name catalog used by copied registry code. An element plugin separately exposes its persisted type; a property plugin exposes its persisted key. Both default to the plugin name, but a plugin author can declare a different value at creation.

ExportContainsUse
PLUGINSFirst-party capability names such as paragraph, codeBlock, bold, and fixedToolbarPlugin lookup, dependencies, targets, and copied registry plugin references. Persisted identities come from editor.plugin(Plugin).schema.type, editor.plugin(Plugin).schema.key, generated schema handles, or explicit document literals.
PluginNameUnion of all values in PLUGINSAPIs that accept any first-party plugin identity.
Use one identity
const value = [
  {
    type: 'paragraph',
    children: [{ bold: true, text: 'Hello' }],
  },
];
Use one identity
const value = [
  {
    type: 'paragraph',
    children: [{ bold: true, text: 'Hello' }],
  },
];

Behavior-only plugins such as PLUGINS.fixedToolbar still have a name but do not create a document node or property.

Configure a target identity
import { PLUGINS, TrailingBlockPlugin } from 'platejs';
 
export const trailingBlock = TrailingBlockPlugin.configure({
  initialState: {
    type: 'paragraph',
  },
});
Configure a target identity
import { PLUGINS, TrailingBlockPlugin } from 'platejs';
 
export const trailingBlock = TrailingBlockPlugin.configure({
  initialState: {
    type: 'paragraph',
  },
});

Schema-Derived Types

Feature packages own their persisted types. Their readable aliases are derived from the same plugin schema used at runtime, so @platejs/utils does not carry a central AST map.

Use an owner-derived element type
import type { ImageElement } from '@platejs/media';
 
export function getImageUrl(element: ImageElement) {
  return element.url;
}
Use an owner-derived element type
import type { ImageElement } from '@platejs/media';
 
export function getImageUrl(element: ImageElement) {
  return element.url;
}

Use ElementOf<typeof Plugin> for one descriptor-owned element shape and ValueOf<Editor> for the complete installed document vocabulary.

The Editor below is generated from the app's authored plugin module; it is not installed by @plate/editor-plugins. Follow Exact Generated Editor Types and enforce plate generate --check <entry> in CI.

Derive an editor value
import type { ValueOf } from 'platejs';
import type { Editor } from '@/components/editor/plugins.generated';
 
type MyValue = ValueOf<Editor>;
Derive an editor value
import type { ValueOf } from 'platejs';
import type { Editor } from '@/components/editor/plugins.generated';
 
type MyValue = ValueOf<Editor>;

Utility Plugins And Kits

ExportNameBehavior
ExitBreakPluginPLUGINS.exitBreakAdds transaction commands around insertExitBreak.
NormalizeTypesPluginPLUGINS.normalizeTypesNormalizes configured root paths to a required type or strictType.
SingleBlockPluginPLUGINS.singleBlockForces the editor value into one block and turns hard breaks into soft breaks.
SingleLinePluginPLUGINS.singleLineForces one block and strips line-break characters from text nodes.
TrailingBlockPluginPLUGINS.trailingBlockEnsures a trailing block exists at the configured level and type.
withTrailingBlockOverride editor helperImplements the trailing block normalization logic used by TrailingBlockPlugin.

Use the plugin guide pages for options and examples: Exit Break, Forced Layout, Single Block, and Trailing Block.

React Hooks

HookReturnsUse
useSelectionFragmentProp(options?)unknownReads a property from the selected fragment.

React Plugins

PluginNameBehavior
BlockPlaceholderPluginPLUGINS.blockPlaceholderTracks the current empty block and injects placeholder and optional className props into matching block components.

BlockPlaceholderPlugin defaults to paragraph placeholders and only targets a focused, editable, collapsed selection. Configure placeholders by plugin name and query by node/path.

components/editor/block-placeholder.tsx
import { PLUGINS } from "platejs";
import { BlockPlaceholderPlugin } from "platejs/react";
 
export const blockPlaceholderPlugin = BlockPlaceholderPlugin.configure({
  initialState: {
    placeholders: {
      [PLUGINS.paragraph]: "Type something...",
    },
    query: ({ path }) => path.length === 1,
  },
});
components/editor/block-placeholder.tsx
import { PLUGINS } from "platejs";
import { BlockPlaceholderPlugin } from "platejs/react";
 
export const blockPlaceholderPlugin = BlockPlaceholderPlugin.configure({
  initialState: {
    placeholders: {
      [PLUGINS.paragraph]: "Type something...",
    },
    query: ({ path }) => path.length === 1,
  },
});

Related APIs

  • Plate covers the umbrella package that re-exports these APIs.
  • Plate Core covers editor creation, plugin contracts, and stores.
  • React Utils covers @udecode/react-utils, which is re-exported through platejs/react.
  • Toolbar covers registry controls that use the React hook helpers.