Single Block provides two input constraints: one root block with soft breaks, or one line with no breaks. Both plugins disable TrailingBlockPlugin while enabled and collapse extra root blocks during normalization.
Features
SingleBlockPluginkeeps one root block and converts Enter to a soft break.SingleLinePluginkeeps one root block and removes all line break characters.- Root normalization merges extra blocks into the first block.
- Both plugins disable
TrailingBlockPlugin. - Demo toggle for switching between single-block and single-line behavior.
Fast Path
Use SingleBlockPlugin when the field may contain line breaks.
import { SingleBlockPlugin } from 'platejs';
import { createPlateEditor } from 'platejs/react';
export const editor = createPlateEditor({
plugins: [SingleBlockPlugin],
});import { SingleBlockPlugin } from 'platejs';
import { createPlateEditor } from 'platejs/react';
export const editor = createPlateEditor({
plugins: [SingleBlockPlugin],
});Use SingleLinePlugin when the field must be plain one-line text.
import { SingleLinePlugin } from 'platejs';
import { createPlateEditor } from 'platejs/react';
export const editor = createPlateEditor({
plugins: [SingleLinePlugin],
});import { SingleLinePlugin } from 'platejs';
import { createPlateEditor } from 'platejs/react';
export const editor = createPlateEditor({
plugins: [SingleLinePlugin],
});Ownership
| Layer | Owner | What It Does |
|---|---|---|
SingleBlockPlugin | platejs / @platejs/utils | Keeps one root block and preserves line breaks as text. |
SingleLinePlugin | platejs / @platejs/utils | Keeps one root block and strips line break characters. |
TrailingBlockPlugin | @platejs/utils | Disabled by both plugins through override.enabled. |
single-block-demo | Registry example | Lets users toggle between single-block and single-line mode. |
These plugins are editor constraints, not schema validation. They rewrite editor content during normalization.
Behavior
| Plugin | Enter | Soft Break | Extra Root Blocks | Existing Text Breaks |
|---|---|---|---|---|
SingleBlockPlugin | Calls editor.tf.insertSoftBreak(). | Preserved as \n. | Merged into the first block with \n separators. | Preserved. |
SingleLinePlugin | No-op. | No-op. | Merged 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.
Normalization
Both plugins override normalizeNode.
| Case | Result |
|---|---|
| Root has one block | Leaves the value alone. |
Root has multiple blocks with SingleBlockPlugin | Inserts \n at the start of each next block, then merges it into the first block. |
Root has multiple blocks with SingleLinePlugin | Merges each next block into the first block without a separator. |
Text node contains line separators with SingleLinePlugin | Replaces the text with the filtered one-line string. |
The merge happens inside editor.tf.withoutNormalizing, so the root collapse finishes as one normalization pass.
Demo Toggle
The registry example switches plugins from a checkbox.
import { SingleBlockPlugin, SingleLinePlugin } from 'platejs';
const plugins = [
isSingleBlock ? SingleBlockPlugin : SingleLinePlugin,
];import { SingleBlockPlugin, SingleLinePlugin } from 'platejs';
const plugins = [
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
| API | Package | Use |
|---|---|---|
SingleBlockPlugin | platejs / @platejs/utils | One root block with soft breaks preserved. |
SingleLinePlugin | platejs / @platejs/utils | One root block with all line breaks removed. |
KEYS.singleBlock | platejs / @platejs/utils | Plugin key for SingleBlockPlugin. |
KEYS.singleLine | platejs / @platejs/utils | Plugin key for SingleLinePlugin. |
override.enabled.trailingBlock | Plugin override | Set to false by both plugins. |