Back to Plate

Underline

content/docs/(plugins)/(marks)/underline.mdx

53.0.83.5 KB
Original Source

Underline applies the underline leaf mark to selected text. UnderlinePlugin owns the mark key, shortcut, HTML parsing, render tag, and toggle transform.

<ComponentPreview name="basic-marks-demo" /> <PackageInfo>

Features

  • KEYS.underline leaf mark.
  • Default ⌘U / Ctrl+U shortcut.
  • HTML deserialization from u and underline text decoration.
  • <u> rendering by default.
  • Optional Markdown-style input rule through UnderlineRules.
  • Toolbar support through MarkToolbarButton.
</PackageInfo>

Kit Usage

<Steps>

Add Basic Marks

BasicMarksKit includes UnderlinePlugin, the underscore input rule, and the standard toolbar buttons that use KEYS.underline.

<ComponentSource name="basic-marks-kit" />
tsx
import { createPlateEditor } from 'platejs/react';

import { BasicMarksKit } from '@/components/editor/plugins/basic-marks-kit';

export const editor = createPlateEditor({
  plugins: [...BasicMarksKit],
});

Add A Toolbar Button

Use MarkToolbarButton with KEYS.underline.

tsx
import { UnderlineIcon } from 'lucide-react';
import { KEYS } from 'platejs';

import { MarkToolbarButton } from '@/components/ui/mark-toolbar-button';

export function UnderlineToolbarButton() {
  return (
    <MarkToolbarButton nodeType={KEYS.underline} tooltip="Underline (⌘+U)">
      <UnderlineIcon />
    </MarkToolbarButton>
  );
}
</Steps>

Manual Usage

Install the mark package.

bash
npm install @platejs/basic-nodes

Add UnderlinePlugin directly when you do not want the whole kit.

tsx
import { UnderlinePlugin } from '@platejs/basic-nodes/react';
import { createPlateEditor } from 'platejs/react';

export const editor = createPlateEditor({
  plugins: [UnderlinePlugin],
});

Register the Markdown-style input rule when users should type underline delimiters.

tsx
import { UnderlineRules } from '@platejs/basic-nodes';
import { UnderlinePlugin } from '@platejs/basic-nodes/react';

export const underlinePlugin = UnderlinePlugin.configure({
  inputRules: [UnderlineRules.markdown()],
});

Ownership

SurfaceOwnerWhat It Does
BaseUnderlinePlugin@platejs/basic-nodesHeadless underline mark, HTML parser, render tag, and toggle transform.
UnderlinePlugin@platejs/basic-nodes/reactReact wrapper with default mod+u shortcut.
UnderlineRules.markdown@platejs/basic-nodesOptional mark input rule factory.
BasicMarksKitRegistryAdds UnderlinePlugin with the underscore input rule.
MarkToolbarButtonRegistry UIReads active mark state and calls the mark toggle hook.

The package owns the mark. The registry owns toolbar placement and icon choice.

Behavior

BehaviorSource
Mark keyKEYS.underline
Leaf behaviornode.isLeaf: true
Toggle transformeditor.tf.underline.toggle() calls editor.tf.toggleMark(type).
ShortcutUnderlinePlugin registers mod+u.
HTML tagsu
HTML stylestext-decoration: underline
HTML guardIgnores descendants where textDecoration is none.
Render outputu

API Reference

APIPackageUse
BaseUnderlinePlugin@platejs/basic-nodesHeadless underline plugin.
UnderlinePlugin@platejs/basic-nodes/reactReact underline plugin with shortcut defaults.
UnderlineRules.markdown()@platejs/basic-nodesCreates the underline mark input rule.
tf.underline.toggle()@platejs/basic-nodesToggles the underline mark at the selection.