The fastest way to add indent functionality is with the IndentKit, which includes a pre-configured IndentPlugin for text, Details, media and other common blocks. Tables are not among them, because a table keeps its own left margin.
'use client';
import { PLUGINS } from 'platejs';
import { IndentPlugin } from 'platejs/react';
export const IndentKit = [
IndentPlugin.configure({
initialState: {
offset: 24,
},
targetPlugins: [
PLUGINS.heading,
PLUGINS.paragraph,
PLUGINS.blockquote,
PLUGINS.codeBlock,
PLUGINS.details,
PLUGINS.image,
PLUGINS.audio,
PLUGINS.callout,
PLUGINS.columnGroup,
PLUGINS.equation,
PLUGINS.excalidraw,
PLUGINS.file,
PLUGINS.horizontalRule,
PLUGINS.mediaEmbed,
PLUGINS.toc,
PLUGINS.upload,
PLUGINS.video,
],
}),
];'use client';
import { PLUGINS } from 'platejs';
import { IndentPlugin } from 'platejs/react';
export const IndentKit = [
IndentPlugin.configure({
initialState: {
offset: 24,
},
targetPlugins: [
PLUGINS.heading,
PLUGINS.paragraph,
PLUGINS.blockquote,
PLUGINS.codeBlock,
PLUGINS.details,
PLUGINS.image,
PLUGINS.audio,
PLUGINS.callout,
PLUGINS.columnGroup,
PLUGINS.equation,
indent property, so a Details body that holds them can become a list.24px for indentation spacing.Add the kit to your plugins:
import { createEditor } from "platejs/react";
import { IndentKit } from "@/components/editor/indent";
const editor = createEditor({
plugins: [
// ...otherPlugins,
...IndentKit,
],
});import { createEditor } from "platejs/react";
import { IndentKit } from "@/components/editor/indent";
const editor = createEditor
Include IndentPlugin in your Plate plugins array when creating the editor.
import { IndentPlugin } from "platejs/react";
import { createEditor } from "platejs/react";
const editor = createEditor({
plugins: [
// ...otherPlugins,
IndentPlugin,
],
});import { IndentPlugin } from "platejs/react";
import { createEditor } from "platejs/react";
const editor = createEditor({
plugins: [
// ...otherPlugins,
IndentPlugin,
],
});You can configure the IndentPlugin to target specific elements and customize indentation behavior.
import { IndentPlugin } from "platejs/react";
import { PLUGINS } from "platejs";
import { createEditor } from "platejs/react";
const editor = createEditor({
plugins: [
// ...otherPlugins,
IndentPlugin.configure({
targetPlugins: [
PLUGINS.heading, PLUGINS.heading, PLUGINS.heading, PLUGINS.heading, PLUGINS.heading, PLUGINS.heading,
PLUGINS.paragraph,
PLUGINS.blockquote,
],
inject: {
nodeProps: {
styleKey: "marginLeft",
inject.nodeProps.styleKey: Maps the injected prop to the CSS marginLeft property.targetPlugins: Element plugin descriptors or dynamic names whose nodes can store indentation.initialState.offset: Indentation offset in pixels (default: 24).initialState.unit: Unit for indentation values (default: 'px').initialState.indentMax: Maximum number of indentations allowed.You can add IndentToolbarButton to your Toolbar to control indentation.
Plugin for indenting block elements. It injects an indent prop into the elements specified by targetPlugins and applies marginLeft styling.
CSS property name for styling. - Default: 'marginLeft'
Element plugin descriptors or dynamic names targeted for indent storage and injection. -
Default: [BaseParagraphPlugin]
Indentation offset used in (offset * element.indent) + unit. -
Default: 24
Indentation unit used in (offset * element.indent) + unit. -
Default: 'px'
Maximum number of indentations allowed.
Indents the selected block(s) in the editor.
Decreases the indentation of the selected blocks.
Used to provide options for setting the indentation of a block of text.
Toolbar components call the descriptor-scoped updates directly:
import { IndentPlugin, useEditor } from 'platejs/react';
const editor = useEditor();
const { update } = editor.plugin(IndentPlugin);
<>
<ToolbarButton onClick={() => update.increase()}>Indent</ToolbarButton>
<ToolbarButton onClick={() => update.decrease()}>Outdent</ToolbarButton>
</>import { IndentPlugin, useEditor } from 'platejs/react';
const editor = useEditor();
const { update } = editor.plugin(IndentPlugin);
<>
<ToolbarButton onClick={() => update.increase()}>Indent</ToolbarButton>
<ToolbarButton onClick={() => update.decrease()}>Outdent</ToolbarButton>
</>TextIndentPlugin indents only a block's first line. It stores a step count in textIndent and draws CSS text-indent as offset * textIndent + unit, so a negative count is a hanging indent. No kit installs it, so add it yourself:
import { TextIndentPlugin } from "platejs/react";
import { createEditor } from "platejs/react";
const editor = createEditor({
plugins: [
// ...otherPlugins,
TextIndentPlugin,
],
});
editor.update.textIndent.set(1);
editor.update.textIndent.clear({ at: [] });import { TextIndentPlugin } from "platejs/react";
import { createEditor } from "platejs/react";
const editor = createEditor({
plugins: [
// ...otherPlugins,
TextIndentPlugin,
],
});
editor.update.textIndent.set(1);
editor.update.textIndent.clear({ at: [] });set(value, options?) saves the count on matching target blocks, and clear(options?) removes it. Both take Plate node update options for the target range and matcher. The plugin targets paragraphs unless you pass targetPlugins. initialState.offset and initialState.unit set the step size, 24 and 'px' by default. Word export writes the count as a first-line indent, or a hanging indent when negative, and skips it on list paragraphs.
import { IndentPlugin } from "platejs/react";
import { PLUGINS } from "platejs";
import { createEditor } from "platejs/react";
const editor = createEditor({
plugins: [
// ...otherPlugins,
IndentPlugin.configure({
targetPlugins: [
PLUGINS.heading, PLUGINS.heading, PLUGINS.heading, PLUGINS.heading, PLUGINS.heading, PLUGINS.heading,
PLUGINS.paragraph,
PLUGINS.blockquote,
],
inject: {
nodeProps: {
styleKey: "marginLeft",
},
},
initialState: {
offset: 24,
unit: "px",
indentMax: 10,
},
}),
],
});