rich-editor component
Drop-in semantic component. See examples, sizes, variants, and source.
WYSIWYG editor built from a rich-editor wrapper containing a
toolbar of toolbar-btn /
toolbar-select controls and a contenteditable
editor-content region. Pick a feature density with
minimal, standard, or
full; pick a presentation with
dark-theme, inline, or
compact. Toolbar wiring and command execution are handled by
rich-editor.js.
Rich Editor System
Minimal Editor
This is a minimal rich text editor with basic formatting tools.
<div class="rich-editor minimal">
<div class="toolbar">
<div class="toolbar-group">
<button class="toolbar-btn" data-command="bold" title="Bold (Ctrl+B)">
<i class="icon bold w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="italic" title="Italic (Ctrl+I)">
<i class="icon italic w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="underline" title="Underline (Ctrl+U)">
<i class="icon underline w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="insertUnorderedList" title="Bullet List">
<i class="icon list w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="insertOrderedList" title="Numbered List">
<i class="icon list-ordered w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="undo" title="Undo (Ctrl+Z)">
<i class="icon undo-2 w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="redo" title="Redo (Ctrl+Y)">
<i class="icon redo-2 w-4 h-4"></i>
</button>
</div>
</div>
<div class="editor-content" contenteditable="true" placeholder="Start typing...">
<p>This is a minimal rich text editor with basic formatting tools.</p>
</div>
</div>
Standard Editor
Welcome to the Rich Text Editor
This is a standard rich text editor with comprehensive formatting tools including:
- Text formatting (bold, italic, underline, strikethrough)
- Paragraph alignment options
- Lists and indentation
- Links and images
<div class="rich-editor standard">
<div class="toolbar">
<div class="toolbar-group">
<select class="toolbar-select" data-command="formatBlock">
<option value="p">Paragraph</option>
<option value="h1">Heading 1</option>
<option value="h2">Heading 2</option>
<option value="h3">Heading 3</option>
<option value="h4">Heading 4</option>
<option value="h5">Heading 5</option>
<option value="h6">Heading 6</option>
</select>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="bold" title="Bold">
<i class="icon bold w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="italic" title="Italic">
<i class="icon italic w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="underline" title="Underline">
<i class="icon underline w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="strikethrough" title="Strikethrough">
<i class="icon strikethrough w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="justifyLeft" title="Align Left">
<i class="icon align-left w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="justifyCenter" title="Align Center">
<i class="icon align-center w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="justifyRight" title="Align Right">
<i class="icon align-right w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="justifyFull" title="Justify">
<i class="icon align-justify w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="insertUnorderedList" title="Bullet List">
<i class="icon list w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="insertOrderedList" title="Numbered List">
<i class="icon list-ordered w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="outdent" title="Outdent">
<i class="icon indent-decrease w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="indent" title="Indent">
<i class="icon indent-increase w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="createLink" title="Insert Link">
<i class="icon link w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="insertImage" title="Insert Image">
<i class="icon image w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="removeFormat" title="Clear Formatting">
<i class="icon eraser w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="undo" title="Undo">
<i class="icon undo-2 w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="redo" title="Redo">
<i class="icon redo-2 w-4 h-4"></i>
</button>
</div>
</div>
<div class="editor-content" contenteditable="true" placeholder="Start typing...">
<h2>Welcome to the Rich Text Editor</h2>
<p>This is a standard rich text editor with comprehensive formatting tools including:</p>
<ul>
<li>Text formatting (bold, italic, underline, strikethrough)</li>
<li>Paragraph alignment options</li>
<li>Lists and indentation</li>
<li>Links and images</li>
</ul>
</div>
</div>
Full Featured Editor
Full Editor
Full-Featured Rich Text Editor
This is a comprehensive rich text editor with all formatting tools including:
- Text formatting: Bold, italic, underline, strikethrough, subscript, superscript
- Colors: Text color and highlight color
- Paragraph: Headings, alignment, lists, indentation
- Media: Links, images, tables
- Advanced: Source view, fullscreen mode
The full editor provides maximum flexibility for content creation.
<div class="rich-editor full">
<div class="toolbar toolbar-multi-row">
<div class="toolbar-row">
<div class="toolbar-group">
<select class="toolbar-select" data-command="formatBlock">
<option value="p">Paragraph</option>
<option value="h1">Heading 1</option>
<option value="h2">Heading 2</option>
<option value="h3">Heading 3</option>
<option value="h4">Heading 4</option>
<option value="h5">Heading 5</option>
<option value="h6">Heading 6</option>
<option value="pre">Preformatted</option>
</select>
<select class="toolbar-select" data-command="fontSize">
<option value="1">Tiny</option>
<option value="2">Small</option>
<option value="3" selected>Normal</option>
<option value="4">Large</option>
<option value="5">Huge</option>
</select>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="bold" title="Bold">
<i class="icon bold w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="italic" title="Italic">
<i class="icon italic w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="underline" title="Underline">
<i class="icon underline w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="strikethrough" title="Strikethrough">
<i class="icon strikethrough w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="subscript" title="Subscript">
<span class="footnote">X<sub>2</sub></span>
</button>
<button class="toolbar-btn" data-command="superscript" title="Superscript">
<span class="footnote">X<sup>2</sup></span>
</button>
</div>
<div class="toolbar-group">
<div class="toolbar-color-picker">
<button class="toolbar-btn" data-command="foreColor" title="Text Color">
<i class="icon type w-4 h-4"></i>
<input type="color" class="color-input" data-command="foreColor" />
</button>
</div>
<div class="toolbar-color-picker">
<button class="toolbar-btn" data-command="hiliteColor" title="Highlight Color">
<i class="icon highlighter w-4 h-4"></i>
<input type="color" class="color-input" data-command="hiliteColor" value="#ffff00" />
</button>
</div>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="removeFormat" title="Clear Formatting">
<i class="icon eraser w-4 h-4"></i>
</button>
</div>
</div>
<div class="toolbar-row">
<div class="toolbar-group">
<button class="toolbar-btn" data-command="justifyLeft" title="Align Left">
<i class="icon align-left w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="justifyCenter" title="Align Center">
<i class="icon align-center w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="justifyRight" title="Align Right">
<i class="icon align-right w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="justifyFull" title="Justify">
<i class="icon align-justify w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="insertUnorderedList" title="Bullet List">
<i class="icon list w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="insertOrderedList" title="Numbered List">
<i class="icon list-ordered w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="outdent" title="Outdent">
<i class="icon indent-decrease w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="indent" title="Indent">
<i class="icon indent-increase w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button
class="toolbar-btn"
data-command="formatBlock"
data-value="blockquote"
title="Blockquote"
>
<i class="icon quote w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="insertHorizontalRule" title="Horizontal Rule">
<i class="icon minus w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="createLink" title="Insert Link">
<i class="icon link w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="unlink" title="Remove Link">
<i class="icon link-2-off w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="insertImage" title="Insert Image">
<i class="icon image w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="insertTable" title="Insert Table">
<i class="icon table w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="undo" title="Undo">
<i class="icon undo-2 w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="redo" title="Redo">
<i class="icon redo-2 w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="viewSource" title="View Source">
<i class="icon code w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="fullscreen" title="Fullscreen">
<i class="icon maximize-2 w-4 h-4"></i>
</button>
</div>
</div>
</div>
<div class="editor-content" contenteditable="true" placeholder="Start typing...">
<h1>Full-Featured Rich Text Editor</h1>
<p>This is a comprehensive rich text editor with all formatting tools including:</p>
<ul>
<li>
<strong>Text formatting:</strong> Bold, italic, underline, strikethrough, subscript,
superscript
</li>
<li><strong>Colors:</strong> Text color and highlight color</li>
<li><strong>Paragraph:</strong> Headings, alignment, lists, indentation</li>
<li><strong>Media:</strong> Links, images, tables</li>
<li><strong>Advanced:</strong> Source view, fullscreen mode</li>
</ul>
<blockquote>
<p>The full editor provides maximum flexibility for content creation.</p>
</blockquote>
</div>
<div class="editor-footer">
<div class="word-count">Words: <span id="word-count">0</span></div>
<div class="char-count">Characters: <span id="char-count">0</span></div>
</div>
</div>
Editor Themes
Dark Theme Editor
This editor features a dark theme with a focused set of tools for distraction-free writing.
<div class="rich-editor dark-theme">
<div class="toolbar">
<div class="toolbar-group">
<button class="toolbar-btn" data-command="bold" title="Bold">
<i class="icon bold w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="italic" title="Italic">
<i class="icon italic w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="underline" title="Underline">
<i class="icon underline w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="code" title="Code">
<i class="icon code w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="insertUnorderedList" title="Bullet List">
<i class="icon list w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="insertOrderedList" title="Numbered List">
<i class="icon list-ordered w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="formatBlock" data-value="blockquote" title="Quote">
<i class="icon quote w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button class="toolbar-btn" data-command="createLink" title="Link">
<i class="icon link w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="insertImage" title="Image">
<i class="icon image w-4 h-4"></i>
</button>
</div>
</div>
<div class="editor-content" contenteditable="true" placeholder="Start typing...">
<p>
This editor features a dark theme with a focused set of tools for distraction-free writing.
</p>
</div>
</div>
Inline Editor
Click on the text below to edit it inline:
This is an inline editor. Click anywhere in this text to start editing. The toolbar will appear when you select text.
<p class="text-gray-600 mb-3">Click on the text below to edit it inline:</p>
<div class="rich-editor inline">
<div class="editor-content" contenteditable="true" data-placeholder="Click here to edit...">
<p>
This is an inline editor. Click anywhere in this text to start editing. The toolbar will
appear when you select text.
</p>
</div>
<div class="toolbar floating-toolbar hidden">
<div class="toolbar-group">
<button class="toolbar-btn" data-command="bold" title="Bold">
<i class="icon bold w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="italic" title="Italic">
<i class="icon italic w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="underline" title="Underline">
<i class="icon underline w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="createLink" title="Link">
<i class="icon link w-4 h-4"></i>
</button>
</div>
</div>
</div>
Editor with Custom Actions
Custom Action Buttons
This editor demonstrates custom toolbar styling and action buttons.
<div class="rich-editor standard">
<div class="toolbar">
<div class="toolbar-group">
<button class="toolbar-btn primary" data-command="bold" title="Bold">
<i class="icon bold w-4 h-4"></i>
</button>
<button class="toolbar-btn positive" data-command="italic" title="Italic">
<i class="icon italic w-4 h-4"></i>
</button>
<button class="toolbar-btn warning" data-command="underline" title="Underline">
<i class="icon underline w-4 h-4"></i>
</button>
</div>
<div class="toolbar-group">
<button class="button xs">
<i class="icon save w-3 h-3"></i>
Save
</button>
<button class="button xs outline">
<i class="icon eye w-3 h-3"></i>
Preview
</button>
<button class="button xs ghost negative">
<i class="icon trash-2 w-3 h-3"></i>
Clear
</button>
</div>
</div>
<div class="editor-content" contenteditable="true" placeholder="Start typing...">
<p>This editor demonstrates custom toolbar styling and action buttons.</p>
</div>
</div>
Compact Editor
Compact editor for limited space.
<div class="rich-editor minimal compact">
<div class="toolbar">
<div class="toolbar-group">
<button class="toolbar-btn" data-command="bold" title="Bold">
<i class="icon bold w-3 h-3"></i>
</button>
<button class="toolbar-btn" data-command="italic" title="Italic">
<i class="icon italic w-3 h-3"></i>
</button>
<button class="toolbar-btn" data-command="link" title="Link">
<i class="icon link w-3 h-3"></i>
</button>
<button class="toolbar-btn" data-command="list" title="List">
<i class="icon list w-3 h-3"></i>
</button>
</div>
</div>
<div
class="editor-content"
contenteditable="true"
placeholder="Start typing..."
style="min-height: 80px"
>
<p>Compact editor for limited space.</p>
</div>
</div>
Usage Examples
Basic Implementation
<div class="rich-editor minimal">
<div class="toolbar">
<div class="toolbar-group">
<button class="toolbar-btn" data-command="bold">
<i class="icon bold w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="italic">
<i class="icon italic w-4 h-4"></i>
</button>
</div>
</div>
<div class="editor-content" contenteditable="true">
Your content here...
</div>
</div>
<pre
class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto"
><code><div class="rich-editor minimal">
<div class="toolbar">
<div class="toolbar-group">
<button class="toolbar-btn" data-command="bold">
<i class="icon bold w-4 h-4"></i>
</button>
<button class="toolbar-btn" data-command="italic">
<i class="icon italic w-4 h-4"></i>
</button>
</div>
</div>
<div class="editor-content" contenteditable="true">
Your content here...
</div>
</div></code></pre>
JavaScript Initialization
// Initialize all rich editors on page
document.addEventListener('DOMContentLoaded', function() {
RichEditor.init();
});
// Initialize specific editor
const editor = document.querySelector('.rich-editor');
RichEditor.initEditor(editor);
// Custom command execution
document.execCommand('bold', false, null);
document.execCommand('createLink', false, 'https://example.com');
<pre
class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto"
><code>// Initialize all rich editors on page
document.addEventListener('DOMContentLoaded', function() {
RichEditor.init();
});
// Initialize specific editor
const editor = document.querySelector('.rich-editor');
RichEditor.initEditor(editor);
// Custom command execution
document.execCommand('bold', false, null);
document.execCommand('createLink', false, 'https://example.com');</code></pre>
Class API Reference
| Type |
Class / Attribute |
Usage |
Notes |
| Base |
rich-editor |
Outer container with border, toolbar, and content slots |
Always required |
toolbar |
Top control strip with formatting buttons |
Hosts .toolbar-group children |
toolbar-group |
Cluster of related controls separated by a divider |
Inside .toolbar |
editor-content |
Contenteditable region; inherits typography |
Set contenteditable="true" + a placeholder |
editor-footer |
Optional bottom strip — word/char counts, status |
Sibling of .editor-content |
| Variants |
minimal |
Bare-bones editor; white toolbar background |
Modifier on rich-editor |
standard |
Subtle shadow + grey toolbar |
Modifier on rich-editor |
full |
Stronger shadow; ideal for multi-row toolbars |
Modifier on rich-editor |
| Themes / Layout |
dark-theme |
Dark background and toolbar |
Modifier on rich-editor |
inline |
Borderless; toolbar floats on selection |
Pair with .floating-toolbar |
fullscreen |
Lock to viewport for distraction-free editing |
Toggled by JS |
source-view |
Render the contenteditable as raw source |
Toggled by JS |
| Toolbar Items |
toolbar-btn |
Square 28px control inside the toolbar |
Pair with data-command |
toolbar-btn.active |
Marks the current command (e.g. bold on) |
Toggled by JS |
toolbar-select |
Native <select> styled to match toolbar |
Pair with data-command |
toolbar-color-picker |
Wraps a button + hidden color-input |
Inside .toolbar-group |
toolbar-multi-row |
Stacks toolbar rows vertically |
Modifier on toolbar |
toolbar-row |
Single horizontal row inside a multi-row toolbar |
Inside .toolbar.toolbar-multi-row |
| State / Float |
floating-toolbar |
Absolute, centered toolbar for inline editing |
Pair with hidden until selection |
focused |
Purple ring around the editor |
Toggled by JS on focus |
data-command / data-value |
Identify which execCommand to run |
On toolbar-btn / toolbar-select |