Plate
PlateEditorsTemplates
GitHub16kGitHub
DiscordDiscord
    • Stream
    • Copilot
  • Comments
  • Discussion
  • Suggestions
    • Basic Blocks
      • Blockquote
      • Heading
      • Horizontal Rule
    • Callout
    • Code Block
    • Column
    • Date
    • Equation
    • Link
    • Media
    • MentionElement
    • Table
    • Table of Contents
    • Footnote
    • Details
  • Marks
    • Bold
    • Italic
    • Underline
    • Code
    • Highlight
    • Keyboard Input
    • Strikethrough
    • Subscript
    • Superscript
      • Font
      • Line Height
      • Text Align
    • Indent
    • List
      • Exit Break
      • Single Block
      • Trailing Block
    • Autoformat
    • Block Menu
    • Block Placeholder
    • Combobox
      • Emoji
      • MentionElement
      • Slash Command
    • Drag & Drop
    • Navigation Feedback
    • Tabbable
    • Toolbar
    • Yjs
    • Multi SelectEditor
    • CSV
    • DOCX
    • HTML
    • Markdown

Single Block

PreviousNext

Restrict an editor to one root block or one line of text.

DemoTrailing Block

Single Block provides two input constraints: one root block with soft breaks, or one line with no breaks. Each constraint is an independent plugin.

Loading…
Exit BreakTrailing Block

On This Page

FeaturesUsageCompose with a broad editor kitOwnershipBehaviorCorrectionsDemo toggleAPI Reference
Build your editor
Production-ready AI template and reusable components.
Get all-access

Features

  • SingleBlockPlugin keeps one root block and converts Enter to a soft break.
  • SingleLinePlugin keeps one root block and removes all line break characters.
  • Root correction joins representable rich content without flattening marks or inline voids.
  • Block content that cannot fit inside the first block is rejected before publication.
  • Demo toggle for switching between single-block and single-line behavior.
Report an issue

Usage

Use SingleBlockPlugin when the field may contain line breaks.

import { SingleBlockPlugin } from "platejs";
import { createEditor } from "platejs/react";
 
export const editor = createEditor({
  plugins: [SingleBlockPlugin],
});
import { SingleBlockPlugin } from "platejs";
import { createEditor } from "platejs/react";
 
export const editor = createEditor({
  plugins: [SingleBlockPlugin],
});

Use SingleLinePlugin when the field must contain one line. Marks and inline elements remain part of that line.

import { SingleLinePlugin } from "platejs";
import { createEditor } from "platejs/react";
 
export const editor = createEditor({
  plugins: [SingleLinePlugin],
});
import { SingleLinePlugin } from "platejs";
import { createEditor } from "platejs/react";
 
export const editor = createEditor({
  plugins: [SingleLinePlugin],
});

Compose with a broad editor kit

SingleBlockPlugin weakly disables an installed TrailingBlockPlugin, so the package remains correct even when it cannot control the consumer's broad kit:

import { SingleBlockPlugin } from "platejs";
import { createEditor } from "platejs/react";
 
import { plugins as editorPlugins } from "@/components/editor/editor";
 
export const editor = createEditor({
  plugins: [...editorPlugins, SingleBlockPlugin],
});
import { SingleBlockPlugin } from "platejs";
import { createEditor } from "platejs/react";
 
import { plugins as editorPlugins } from "@/components/editor/editor";
 
export const editor = createEditor({
  plugins: [...editorPlugins, SingleBlockPlugin],
});

Use SingleLinePlugin in the same shape for a one-line field.

The weak peer applies only when Trailing Block is installed. It never installs the target, and a missing target is a no-op. Required dependencies still reject disablement.

Ownership

LayerOwnerWhat It Does
SingleBlockPluginplatejsKeeps one root block and preserves line breaks as text.
SingleLinePluginplatejsKeeps one root block and strips line break characters.
TrailingBlockPluginplatejsProvides trailing-block normalization when enabled.
single-block-demoRegistry exampleOwns the broad composition and mode toggle.

These plugins are editor constraints, not schema validation. Their Plate corrections rewrite invalid root content before publication.

Behavior

PluginEnterSoft BreakExtra Root BlocksExisting Text Breaks
SingleBlockPluginCalls tx.break.insertSoft().Preserved as \n.Joined into the first block with \n separators.Preserved.
SingleLinePluginNo-op.No-op.Joined into the first block with no separator.Removes \r, \n, \r\n, \u2028, and \u2029.

Use single-block mode for descriptions, comments, or titles that may wrap across lines. Use single-line mode for labels, slugs, short titles, and command inputs.

Corrections

Both behavior plugins register Plate corrections.

CaseResult
Root has one blockLeaves the value alone.
Root has multiple compatible blocks with SingleBlockPluginJoins each next block into the first block with a \n separator.
Root has multiple compatible blocks with SingleLinePluginJoins each next block into the first block without a separator.
Marks or inline voids occur in a joined blockPreserves the complete inline nodes.
A later root contains nested block content or is a block voidRejects the correction instead of deleting or stringifying the content.
Text node contains line separators with SingleLinePluginReplaces that complete text node with the filtered text and its existing marks.

Each correction runs in the active Plate transaction, so the root collapse publishes as one update.

Single-content plugins accept rich inline content, but they do not flatten arbitrary block structure. Validate or transform block containers before placing them in a single-block field.

Demo toggle

The registry example switches plugins from a checkbox.

import {
  SingleBlockPlugin,
  SingleLinePlugin,
} from "platejs";
 
const plugins = [
  ...editorPlugins,
  isSingleBlock ? SingleBlockPlugin : SingleLinePlugin,
];
import {
  SingleBlockPlugin,
  SingleLinePlugin,
} from "platejs";
 
const plugins = [
  ...editorPlugins,
  isSingleBlock ? SingleBlockPlugin : SingleLinePlugin,
];

Single Block Mode keeps pasted lines as \n. Turning it off switches to single-line mode and removes line breaks.

API Reference

APIPackageUse
SingleBlockPluginplatejsOne root block with soft breaks preserved.
SingleLinePluginplatejsOne root block with all line breaks removed.
PLUGINS.singleBlockplatejsPlugin name for SingleBlockPlugin.
PLUGINS.singleLineplatejsPlugin name for SingleLinePlugin.
override[PLUGINS.trailingBlock]platejsPackage-owned weak peer that disables Trailing Block only when installed.