Single Block provides two input constraints: one root block with soft breaks, or one line with no breaks. Each constraint is an independent plugin.
SingleBlockPlugin keeps one root block and converts Enter to a soft break.SingleLinePlugin keeps one root block and removes all line break characters.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],
});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.
| Layer | Owner | What It Does |
|---|---|---|
SingleBlockPlugin | platejs | Keeps one root block and preserves line breaks as text. |
SingleLinePlugin | platejs | Keeps one root block and strips line break characters. |
TrailingBlockPlugin | platejs | Provides trailing-block normalization when enabled. |
single-block-demo | Registry example | Owns the broad composition and mode toggle. |
These plugins are editor constraints, not schema validation. Their Plate corrections rewrite invalid root content before publication.
| Plugin | Enter | Soft Break | Extra Root Blocks | Existing Text Breaks |
|---|---|---|---|---|
SingleBlockPlugin | Calls tx.break.insertSoft(). | Preserved as \n. | Joined into the first block with \n separators. | Preserved. |
SingleLinePlugin | No-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.
Both behavior plugins register Plate corrections.
| Case | Result |
|---|---|
| Root has one block | Leaves the value alone. |
Root has multiple compatible blocks with SingleBlockPlugin | Joins each next block into the first block with a \n separator. |
Root has multiple compatible blocks with SingleLinePlugin | Joins each next block into the first block without a separator. |
| Marks or inline voids occur in a joined block | Preserves the complete inline nodes. |
| A later root contains nested block content or is a block void | Rejects the correction instead of deleting or stringifying the content. |
Text node contains line separators with SingleLinePlugin | Replaces 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.
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 | Package | Use |
|---|---|---|
SingleBlockPlugin | platejs | One root block with soft breaks preserved. |
SingleLinePlugin | platejs | One root block with all line breaks removed. |
PLUGINS.singleBlock | platejs | Plugin name for SingleBlockPlugin. |
PLUGINS.singleLine | platejs | Plugin name for SingleLinePlugin. |
override[PLUGINS.trailingBlock] | platejs | Package-owned weak peer that disables Trailing Block only when installed. |