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

Line Height

PreviousNext

Set block line height.

Line Height DemoLine Height Toolbar Button

LineHeightPlugin stores line height on blocks with a lineHeight property. Setting the default value removes the property, so saved values only carry overrides.

Loading…
FontText Align

On This Page

FeaturesKit usageAdd the kitAdd the toolbar controlManual usageInstall packageAdd the pluginSet line heightOwnershipBehaviorHTMLAPI ReferenceOptions
Build your editor
Production-ready AI template and reusable components.
Get all-access

Features

  • Block-level lineHeight storage.
  • HTML line-height style deserialization.
  • Default-value cleanup.
  • Configurable target block types.
  • Bound editor.update.lineHeight.set method.
  • Registry dropdown toolbar driven by valid node values.
Report an issue

Kit usage

Add the kit

Use LineHeightKit for live and static Plate UI setups. The server-safe kit targets paragraphs and all heading levels, with valid values 1, 1.2, 1.5, 2, and 3.

import { BaseLineHeightPlugin, PLUGINS } from 'platejs';
 
export const LineHeightKit = [
  BaseLineHeightPlugin.configure({
    inject: {
      nodeProps: {
        defaultNodeValue: 1.5,
        validNodeValues: [1, 1.2, 1.5, 2, 3],
      },
    },
    targetPlugins: [PLUGINS.heading, PLUGINS.paragraph],
  }),
] as const;
import { BaseLineHeightPlugin, PLUGINS } from 'platejs';
 
export const LineHeightKit = [
  BaseLineHeightPlugin.configure({
    inject: {
      nodeProps: {
        defaultNodeValue: 1.5,
        validNodeValues: [1, 1.2, 1.5, 2, 3],
      },
    },
    targetPlugins: [PLUGINS.heading, PLUGINS.paragraph],
  }),
] as const;
import { createEditor } from "platejs/react";
 
import { LineHeightKit } from "@/components/editor/line-height";
 
export const editor = createEditor({
  plugins: [...LineHeightKit],
});
import { createEditor } from "platejs/react";
 
import { LineHeightKit } from "@/components/editor/line-height";
 
export const editor = createEditor({

Add the toolbar control

Install LineHeightToolbarButton separately when the editor needs a line-height control.

pnpm dlx shadcn@latest add @plate/line-height-toolbar-button
pnpm dlx shadcn@latest add @plate/line-height-toolbar-button

The dropdown reads defaultNodeValue and validNodeValues from the plugin inject props.

import { LineHeightToolbarButton } from "@/components/editor/line-height-toolbar-button";
 
export function LineHeightControls() {
  return <LineHeightToolbarButton />;
}
import { LineHeightToolbarButton } from "@/components/editor/line-height-toolbar-button";
 
export function LineHeightControls() {
  return <LineHeightToolbarButton />;
}

Manual usage

Install package

pnpm add platejs @tanstack/react-virtual
pnpm add platejs @tanstack/react-virtual

Add the plugin

Configure target block types and the values your UI should expose.

import { BaseLineHeightPlugin, PLUGINS } from "platejs";
import { createEditor } from "platejs/react";
 
export const editor = createEditor({
  plugins: [
    BaseLineHeightPlugin.configure({
      targetPlugins: [
        PLUGINS.heading,
        PLUGINS.paragraph,
      ],
      inject: {
        nodeProps: {
          defaultNodeValue: 1.5,
          validNodeValues: [1, 1.2, 1.5, 2, 3],
        },
      },
    }),
  ],
});

Set line height

Use the bound update method.

editor.update.lineHeight.set(2);
editor.update.lineHeight.set(1.5, { at: [] });
editor.update.lineHeight.set(2);
editor.update.lineHeight.set(1.5, { at: [] });

Ownership

SurfaceOwnerWhat It Does
BaseLineHeightPluginplatejsHeadless plugin that stores lineHeight, injects block props, and parses HTML line-height styles.
LineHeightPluginplatejs/reactReact wrapper around BaseLineHeightPlugin.
editor.update.lineHeight.setplatejsBound update method exposed by the plugin.
LineHeightKitRegistry kitServer-safe setup shared by live and static editors.
LineHeightToolbarButtonRegistry UIDropdown that writes values through lineHeight.set.

The package owns line-height storage and parsing. The registry owns the dropdown UI and allowed value list.

Behavior

BehaviorSource
Plugin namePLUGINS.lineHeight
Stored propertylineHeight
Default target plugins[BaseParagraphPlugin]
Registry target plugins[PLUGINS.heading, PLUGINS.paragraph]
Default node value1.5
Registry valid values[1, 1.2, 1.5, 2, 3]
HTML parserReads element.style.lineHeight.
Setting a custom valueSets { lineHeight: value } on matching blocks.
Setting the default valueUnsets lineHeight on matching blocks.
Non-target blocksAre ignored by lineHeight.set.

HTML

targetPlugins is the schema placement truth. The plugin derives its render and HTML-parser injection targets from the same list. When pasted HTML contains an inline line-height style on a target block, Plate stores the value on that block.

<p style="line-height: 2">Readable spacing</p>
<p style="line-height: 2">Readable spacing</p>

API Reference

APIPackageUse
LineHeightPluginplatejs/reactReact line-height plugin.
BaseLineHeightPluginplatejsHeadless line-height plugin.
editor.update.lineHeight.set(value, options?)platejsSets or clears line height on matching blocks.
tx.lineHeight.set(value, options?)platejsTransaction form for a larger atomic update.

Options

OptionSurfaceUse
targetPluginsBaseLineHeightPluginElement plugin descriptors or dynamic names whose nodes can keep lineHeight; injection is derived from this list.
inject.nodeProps.defaultNodeValueBaseLineHeightPluginValue that clears the stored property when selected.
inject.nodeProps.validNodeValuesRegistry toolbarDropdown values used by LineHeightToolbarButton.
optionseditor.update.lineHeight.setPlate node update options for the target range and matcher.
plugins: [...LineHeightKit],
});
import { BaseLineHeightPlugin, PLUGINS } from "platejs";
import { createEditor } from "platejs/react";
 
export const editor = createEditor({
  plugins: [
    BaseLineHeightPlugin.configure({
      targetPlugins: [
        PLUGINS.heading,
        PLUGINS.paragraph,
      ],
      inject: {
        nodeProps: {
          defaultNodeValue: 1.5,
          validNodeValues: [1, 1.2, 1.5, 2, 3],
        },
      },
    }),
  ],
});