content/docs/(plugins)/(functionality)/(utils)/single-block.mdx
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.
SingleBlockPlugin keeps one root block and converts Enter to a soft break.SingleLinePlugin keeps one root block and removes all line break characters.TrailingBlockPlugin.Use SingleBlockPlugin when the field may contain line breaks.
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],
});
| 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.
| 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.
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.
The registry example switches plugins from a checkbox.
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 | 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. |