A powerful and extensible rich text editor built on Meta's Lexical framework, providing a modern editing experience with React integration.
npm install @lobehub/editor

A modern, extensible rich text editor built on Meta's Lexical framework with dual-architecture design, featuring both a powerful kernel and React integration. Optimized for AI applications and chat interfaces.
[![][npm-release-shield]][npm-release-link]
[![][github-releasedate-shield]][github-releasedate-link]
[![][github-action-test-shield]][github-action-test-link]
[![][github-action-release-shield]][github-action-release-link]
[![][github-contributors-shield]][github-contributors-link]
[![][github-forks-shield]][github-forks-link]
[![][github-stars-shield]][github-stars-link]
[![][github-issues-shield]][github-issues-link]
[![][github-license-shield]][github-license-link]
Changelog ยท [Report Bug][github-issues-link] ยท [Request Feature][github-issues-link]

Table of contents
#### TOC
- โจ Features
- ๐ฆ Installation
- ๐ Quick Start
- Basic Editor
- Advanced Usage with Plugins
- Chat Input Component
- Editor Kernel API
- ๐ Available Plugins
- Core Plugins
- Content Plugins
- Plugin Architecture
- Plugin Features
- ๐ API Reference
- Editor Kernel
- Plugin System
- ๐ ๏ธ Development
- Setup
- Available Scripts
- Debug Environment Variables
- Project Architecture
- ๐ค Contributing
- ๐ Links
- More Products
- Design Resources
- Development Resources
####
- ๐ฏ Dual Architecture - Both kernel-based API and React components for maximum flexibility
- โ๏ธ React-First - Built for React 19+ with modern hooks and patterns
- ๐ Rich Plugin Ecosystem - 10+ built-in plugins for comprehensive content editing
- ๐ฌ Chat Interface Ready - Pre-built chat input components with mention support
- โจ๏ธ Slash Commands - Intuitive / and @ triggered menus for quick content insertion
- ๐ Multiple Export Formats - JSON, Markdown, and plain text export capabilities
- ๐จ Customizable UI - Antd-styled components with flexible theming
- ๐ File & Media Support - Native support for images, files, tables, and more
- ๐ฏ TypeScript Native - Built with TypeScript for excellent developer experience
- ๐ฑ Modern Build System - Optimized with Vite, Dumi docs, and comprehensive testing
To install @lobehub/editor, run the following command:
[![][bun-shield]][bun-link]
``bash`
$ bun add @lobehub/editor
`bash`
$ pnpm add @lobehub/editor
\[!\[][back-to-top\]](#readme-top)
The simplest way to get started with a fully-featured editor:
`tsx
import {
INSERT_HEADING_COMMAND,
ReactCodeblockPlugin,
ReactImagePlugin,
ReactLinkPlugin,
ReactListPlugin,
} from '@lobehub/editor';
import { Editor, useEditor } from '@lobehub/editor/react';
export default function MyEditor() {
const editor = useEditor();
return (
editor={editor}
plugins={[ReactListPlugin, ReactLinkPlugin, ReactImagePlugin, ReactCodeblockPlugin]}
slashOption={{
items: [
{
key: 'h1',
label: 'Heading 1',
onSelect: (editor) => {
editor.dispatchCommand(INSERT_HEADING_COMMAND, { tag: 'h1' });
},
},
// More slash commands...
],
}}
onChange={(editor) => {
// Handle content changes
const markdown = editor.getDocument('markdown');
const json = editor.getDocument('json');
}}
/>
);
}
`
Add more functionality with built-in plugins:
`tsx
import {
INSERT_FILE_COMMAND,
INSERT_MENTION_COMMAND,
INSERT_TABLE_COMMAND,
ReactFilePlugin,
ReactHRPlugin,
ReactTablePlugin,
} from '@lobehub/editor';
import { Editor, useEditor } from '@lobehub/editor/react';
export default function AdvancedEditor() {
const editor = useEditor();
return (
plugins={[
ReactTablePlugin,
ReactHRPlugin,
Editor.withProps(ReactFilePlugin, {
handleUpload: async (file) => {
// Handle file upload
return { url: await uploadFile(file) };
},
}),
]}
mentionOption={{
items: async (search) => [
{
key: 'user1',
label: 'John Doe',
onSelect: (editor) => {
editor.dispatchCommand(INSERT_MENTION_COMMAND, {
label: 'John Doe',
extra: { userId: 1 },
});
},
},
],
}}
/>
);
}
`
Pre-built component optimized for chat interfaces:
`tsx
import { ChatInput } from '@lobehub/editor/react';
export default function ChatApp() {
return (
onSend={(content) => {
// Handle message send
console.log('Message:', content);
}}
enabledFeatures={['mention', 'upload', 'codeblock']}
/>
);
}
`
For advanced use cases, access the underlying kernel directly:
`typescript
import { IEditor, createEditor } from '@lobehub/editor';
// Create editor instance
const editor: IEditor = createEditor();
// Register plugins
editor.registerPlugin(SomePlugin, { config: 'value' });
// Interact with content
editor.setDocument('text', 'Hello world');
const content = editor.getDocument('json');
// Listen to events
editor.on('content-changed', (newContent) => {
console.log('Content updated:', newContent);
});
// Execute commands
editor.dispatchCommand(INSERT_HEADING_COMMAND, { tag: 'h2' });
`
\[!\[][back-to-top\]](#readme-top)
| Plugin | Description | Features |
| ------------------ | ----------------------------- | --------------------------------------------------------------- |
| CommonPlugin | Foundation editor components | ReactEditor, ReactEditorContent, ReactPlainText, base utilities |
| MarkdownPlugin | Markdown processing engine | Shortcuts, transformers, serialization, custom writers |
| UploadPlugin | File upload management system | Priority handlers, drag-drop, multi-source uploads |
| Plugin | Description | Features |
| ------------------------ | ------------------------- | --------------------------------------------------------------- |
| ReactSlashPlugin | Slash command menu system | / and @ triggered menus, customizable items, async search |@username
| ReactMentionPlugin | User mention support | mentions, custom markdown output, async user search |
| ReactImagePlugin | Image handling | Upload, display, drag & drop, captions, resizing |
| ReactCodeblockPlugin | Code syntax highlighting | Shiki-powered, 100+ languages, custom themes, color schemes |
| ReactListPlugin | List management | Ordered/unordered lists, nested lists, keyboard shortcuts |
| ReactLinkPlugin | Link management | Auto-detection, validation, previews, custom styling |
| ReactTablePlugin | Table support | Insert tables, edit cells, add/remove rows/columns, i18n |
| ReactHRPlugin | Horizontal rules | Divider insertion, custom styling, markdown shortcuts |
| ReactFilePlugin | File attachments | File upload, status tracking, validation, drag-drop |
All plugins follow a dual-architecture design:
#### ๐ง Kernel Layer (Framework-agnostic)
- Plugin Interface: Standardized plugin system with lifecycle management
- Service Container: Centralized service registration and dependency injection
- Command System: Event-driven command pattern for editor operations
- Node System: Custom node types with serialization and transformation
- Data Sources: Content management and format conversion (JSON, Markdown, Text)
#### โ๏ธ React Layer (React-specific)
- React Components: High-level components for easy integration
- Hook Integration: Custom hooks for editor state and functionality
- Event Handling: React-friendly event system and callbacks
- UI Components: Pre-built UI elements with theming support
- โ
Fully configurable with TypeScript-typed options
- โ
Composable - use any combination together
- โ
Extensible - create custom plugins using the same API
- โ
Event-driven - react to user interactions and content changes
- โ
Service-oriented - modular architecture with dependency injection
- โ
Internationalization - Built-in i18n support where applicable
- โ
Markdown integration - Shortcuts, import/export, custom transformers
- โ
Theme system - Customizable styling and appearance
- โ
Command pattern - Programmatic control and automation
#### Utility Hooks
`tsx
// Get editor instance
const editor = useEditor();
// Helper for plugin configuration
const PluginWithConfig = Editor.withProps(ReactFilePlugin, {
handleUpload: async (file) => ({ url: 'uploaded-url' }),
});
`
#### createEditor(): IEditor
Create a new editor kernel instance:
`typescript`
const editor = createEditor();
#### IEditor Interface
Core editor methods:
`typescript
interface IEditor {
// Content management
setDocument(type: string, content: any): void;
getDocument(type: string): any;
// Plugin system
registerPlugin
registerPlugins(plugins: Plugin[]): IEditor;
// Commands
dispatchCommand
// Events
on
off
// Lifecycle
focus(): void;
blur(): void;
destroy(): void;
// Access
getLexicalEditor(): LexicalEditor | null;
getRootElement(): HTMLElement | null;
requireService
}
`
#### Creating Custom Plugins
`typescript
import { IEditorKernel, IEditorPlugin } from '@lobehub/editor';
class MyCustomPlugin implements IEditorPlugin {
constructor(private config: MyPluginConfig) {}
initialize(kernel: IEditorKernel) {
// Register nodes, commands, transforms, etc.
kernel.registerNode(MyCustomNode);
kernel.registerCommand(MY_COMMAND, this.handleCommand);
}
destroy() {
// Cleanup
}
}
`
#### Available Commands
Common commands you can dispatch:
`typescript
// Content insertion
INSERT_HEADING_COMMAND; // { tag: 'h1' | 'h2' | 'h3' }
INSERT_LINK_COMMAND; // { url: string, text?: string }
INSERT_IMAGE_COMMAND; // { src: string, alt?: string }
INSERT_TABLE_COMMAND; // { rows: number, columns: number }
INSERT_MENTION_COMMAND; // { label: string, extra?: any }
INSERT_FILE_COMMAND; // { file: File }
INSERT_HORIZONTAL_RULE_COMMAND;
// Text formatting
FORMAT_TEXT_COMMAND; // { format: 'bold' | 'italic' | 'underline' }
CLEAR_FORMAT_COMMAND;
`
\[!\[][back-to-top\]](#readme-top)
You can use Github Codespaces for online development:
[![][github-codespace-shield]][github-codespace-link]
Or clone it for local development:
[![][bun-shield]][bun-link]
`bash`
$ git clone https://github.com/lobehub/lobe-editor.git
$ cd lobe-editor
$ pnpm install
$ pnpm run dev
This will start the Dumi documentation server with live playground at http://localhost:8000.
| Script | Description |
| -------------------- | --------------------------------------------- |
| pnpm dev | Start Dumi development server with playground |pnpm build
| | Build library and generate type definitions |pnpm test
| | Run tests with Vitest |pnpm test:coverage
| | Run tests with coverage report |pnpm lint
| | Lint and fix code with ESLint |pnpm type-check
| | Type check with TypeScript |pnpm ci
| | Run all CI checks (lint, type-check, test) |pnpm docs:build
| | Build documentation for production |pnpm release
| | Publish new version with semantic-release |
LobeHub Editor includes comprehensive debug logging that can be controlled via environment variables:
#### Basic Debug Configuration
`bashEnable all LobeHub Editor debug output
DEBUG=lobe-editor:*
#### Available Debug Categories
| Category | Description | Example |
| ------------------ | ------------------------- | ------------------------------------ |
|
kernel | Core editor functionality | DEBUG=lobe-editor:kernel |
| plugin: | All plugins | DEBUG=lobe-editor:plugin: |
| plugin:slash | Slash commands | DEBUG=lobe-editor:plugin:slash |
| plugin:mention | Mention system | DEBUG=lobe-editor:plugin:mention |
| plugin:image | Image handling | DEBUG=lobe-editor:plugin:image |
| plugin:file | File operations | DEBUG=lobe-editor:plugin:file |
| service: | All services | DEBUG=lobe-editor:service: |
| service:upload | Upload service | DEBUG=lobe-editor:service:upload |
| service:markdown | Markdown processing | DEBUG=lobe-editor:service:markdown |#### Debug Levels
| Level | Browser Display | Usage | Environment Variable |
| ------- | --------------------- | ------------------- | --------------------------- |
|
debug | Console.log (gray) | Detailed tracing | DEBUG=lobe-editor:*:debug |
| info | Console.log (blue) | General information | DEBUG=lobe-editor:*:info |
| warn | Console.warn (yellow) | Warnings | DEBUG=lobe-editor:*:warn |
| error | Console.error (red) | Errors | DEBUG=lobe-editor:*:error |#### Development Usage
`bash
Full debug during development
DEBUG=lobe-editor:*Only critical logs
DEBUG=lobe-editor::error,lobe-editor::warn
Plugin debugging
DEBUG=lobe-editor:plugin:*
Service debugging
DEBUG=lobe-editor:service:*
`$3
`
lobe-editor/
โโโ src/
โ โโโ editor-kernel/ # ๐ง Core editor logic
โ โ โโโ kernel.ts # Main editor class with plugin system
โ โ โโโ data-source.ts # Content management (JSON/Markdown/Text)
โ โ โโโ service.ts # Service container and dependency injection
โ โ โโโ plugin/ # Plugin base classes and interfaces
โ โ โโโ react/ # React integration layer
โ โ โโโ types.ts # TypeScript interfaces
โ โ
โ โโโ plugins/ # ๐ Feature plugins
โ โ โโโ common/ # ๐๏ธ Foundation components
โ โ โ โโโ plugin/ # Base editor plugin
โ โ โ โโโ react/ # ReactEditor, ReactEditorContent, ReactPlainText
โ โ โ โโโ data-source/ # Content data sources
โ โ โ โโโ utils/ # Common utilities
โ โ โ
โ โ โโโ markdown/ # ๐ Markdown processing engine
โ โ โ โโโ plugin/ # Markdown transformation plugin
โ โ โ โโโ service/ # Markdown shortcut service
โ โ โ โโโ data-source/ # Markdown serialization
โ โ โ โโโ utils/ # Transformer utilities
โ โ โ
โ โ โโโ upload/ # ๐ค Upload management system
โ โ โ โโโ plugin/ # Upload handling plugin
โ โ โ โโโ service/ # Upload service with priority system
โ โ โ โโโ utils/ # Upload utilities
โ โ โ
โ โ โโโ slash/ # โก Slash commands (/, @)
โ โ โ โโโ plugin/ # Slash detection plugin
โ โ โ โโโ react/ # ReactSlashPlugin, ReactSlashOption
โ โ โ โโโ service/ # Slash service with fuzzy search
โ โ โ โโโ utils/ # Search and trigger utilities
โ โ โ
โ โ โโโ mention/ # ๐ค @mention system
โ โ โ โโโ plugin/ # Mention plugin with decorators
โ โ โ โโโ react/ # ReactMentionPlugin
โ โ โ โโโ command/ # INSERT_MENTION_COMMAND
โ โ โ โโโ node/ # MentionNode with serialization
โ โ โ
โ โ โโโ codeblock/ # ๐จ Syntax highlighting
โ โ โ โโโ plugin/ # Codeblock plugin with Shiki
โ โ โ โโโ react/ # ReactCodeblockPlugin
โ โ โ โโโ command/ # Language and color commands
โ โ โ โโโ utils/ # Language detection
โ โ โ
โ โ โโโ image/ # ๐ผ๏ธ Image upload & display
โ โ โ โโโ plugin/ # Image plugin with captions
โ โ โ โโโ react/ # ReactImagePlugin
โ โ โ โโโ command/ # INSERT_IMAGE_COMMAND
โ โ โ โโโ node/ # BaseImageNode, ImageNode
โ โ โ
โ โ โโโ table/ # ๐ Table support
โ โ โ โโโ plugin/ # Table plugin with i18n
โ โ โ โโโ react/ # ReactTablePlugin
โ โ โ โโโ command/ # Table manipulation commands
โ โ โ โโโ node/ # Enhanced TableNode
โ โ โ โโโ utils/ # Table operations
โ โ โ
โ โ โโโ file/ # ๐ File attachments
โ โ โ โโโ plugin/ # File plugin with status tracking
โ โ โ โโโ react/ # ReactFilePlugin
โ โ โ โโโ command/ # INSERT_FILE_COMMAND
โ โ โ โโโ node/ # FileNode with metadata
โ โ โ โโโ utils/ # File operations
โ โ โ
โ โ โโโ link/ # ๐ Link management
โ โ โ โโโ plugin/ # Link plugin with validation
โ โ โ โโโ react/ # ReactLinkPlugin
โ โ โ โโโ command/ # Link commands
โ โ โ โโโ utils/ # URL validation and detection
โ โ โ
โ โ โโโ list/ # ๐ Lists (ordered/unordered)
โ โ โ โโโ plugin/ # List plugin with nesting
โ โ โ โโโ react/ # ReactListPlugin
โ โ โ โโโ command/ # List manipulation commands
โ โ โ โโโ utils/ # List operations
โ โ โ
โ โ โโโ hr/ # โ Horizontal rules
โ โ โโโ plugin/ # HR plugin with styling
โ โ โโโ react/ # ReactHRPlugin
โ โ โโโ command/ # HR insertion commands
โ โ โโโ node/ # HorizontalRuleNode
โ โ
โ โโโ react/ # โ๏ธ High-level React components
โ โ โโโ Editor/ # Main Editor component with plugins
โ โ โโโ ChatInput/ # Chat interface component
โ โ โโโ ChatInputActions/ # Chat action buttons
โ โ โโโ ChatInputActionBar/ # Action bar layout
โ โ โโโ SendButton/ # Send button with states
โ โ โโโ CodeLanguageSelect/ # Code language selector
โ โ
โ โโโ index.ts # Public API exports
โ
โโโ docs/ # ๐ Documentation source
โโโ tests/ # ๐งช Test files
โโโ vitest.config.ts # Test configuration
โโโ .dumi/ # Dumi doc build cache
`The architecture follows a dual-layer design:
1. Kernel Layer (
editor-kernel/) - Framework-agnostic core with plugin system
2. React Layer (react/ + plugins/*/react/) - React-specific implementationsEach plugin follows a consistent structure:
-
plugin/ - Core plugin logic and node definitions
- react/ - React components and hooks (if applicable)
- command/ - Editor commands and handlers
- service/ - Services and business logic
- node/ - Custom Lexical nodes
- utils/` - Utility functions and helpersThis allows for maximum flexibility - you can use just the kernel for custom integrations, or the React components for rapid development.
[![][back-to-top]](#readme-top)
Contributions of all types are more than welcome, if you are interested in contributing code, feel free to check out our GitHub [Issues][github-issues-link] to get stuck in to show us what you're made of.
[![][pr-welcome-shield]][pr-welcome-link]
[![][github-contrib-shield]][github-contrib-link]
[![][back-to-top]](#readme-top)
- ๐คฏ Lobe Chat - An open-source, extensible (Function Calling), high-performance chatbot framework. It supports one-click free deployment of your private ChatGPT/LLM web application.
- ๐
ฐ๏ธ Lobe Theme - The modern theme for stable diffusion webui, exquisite interface design, highly customizable UI, and efficiency boosting features.
- ๐งธ Lobe Vidol - Experience the magic of virtual idol creation with Lobe Vidol, enjoy the elegance of our Exquisite UI Design, dance along using MMD Dance Support, and engage in Smooth Conversations.
- ๐ญ Lobe UI - An open-source UI component library for building AIGC web apps.
- ๐ฅจ Lobe Icons - Popular AI / LLM Model Brand SVG Logo and Icon Collection.
- ๐ Lobe Charts - React modern charts components built on recharts
- ๐ค Lobe TTS - A high-quality & reliable TTS/STT library for Server and Browser
- ๐ Lobe i18n - Automation ai tool for the i18n (internationalization) translation process.
[![][back-to-top]](#readme-top)
---
#### ๐ License
Copyright ยฉ 2025 [LobeHub][profile-link].
This project is MIT licensed.
[back-to-top]: https://img.shields.io/badge/-BACK_TO_TOP-black?style=flat-square
[bun-link]: https://bun.sh
[bun-shield]: https://img.shields.io/badge/-speedup%20with%20bun-black?logo=bun&style=for-the-badge
[github-action-release-link]: https://github.com/lobehub/lobe-editor/actions/workflows/release.yml
[github-action-release-shield]: https://img.shields.io/github/actions/workflow/status/lobehub/lobe-editor/release.yml?label=release&labelColor=black&logo=githubactions&logoColor=white&style=flat-square
[github-action-test-link]: https://github.com/lobehub/lobe-editor/actions/workflows/test.yml
[github-action-test-shield]: https://img.shields.io/github/actions/workflow/status/lobehub/lobe-editor/test.yml?label=test&labelColor=black&logo=githubactions&logoColor=white&style=flat-square
[github-codespace-link]: https://codespaces.new/lobehub/lobe-editor
[github-codespace-shield]: https://github.com/codespaces/badge.svg
[github-contrib-link]: https://github.com/lobehub/lobe-editor/graphs/contributors
[github-contrib-shield]: https://contrib.rocks/image?repo=lobehub%2Flobe-editor
[github-contributors-link]: https://github.com/lobehub/lobe-editor/graphs/contributors
[github-contributors-shield]: https://img.shields.io/github/contributors/lobehub/lobe-editor?color=c4f042&labelColor=black&style=flat-square
[github-forks-link]: https://github.com/lobehub/lobe-editor/network/members
[github-forks-shield]: https://img.shields.io/github/forks/lobehub/lobe-editor?color=8ae8ff&labelColor=black&style=flat-square
[github-issues-link]: https://github.com/lobehub/lobe-editor/issues
[github-issues-shield]: https://img.shields.io/github/issues/lobehub/lobe-editor?color=ff80eb&labelColor=black&style=flat-square
[github-license-link]: https://github.com/lobehub/lobe-editor/blob/master/LICENSE
[github-license-shield]: https://img.shields.io/github/license/lobehub/lobe-editor?color=white&labelColor=black&style=flat-square
[github-releasedate-link]: https://github.com/lobehub/lobe-editor/releases
[github-releasedate-shield]: https://img.shields.io/github/release-date/lobehub/lobe-editor?labelColor=black&style=flat-square
[github-stars-link]: https://github.com/lobehub/lobe-editor/network/stargazers
[github-stars-shield]: https://img.shields.io/github/stars/lobehub/lobe-editor?color=ffcb47&labelColor=black&style=flat-square
[npm-release-link]: https://www.npmjs.com/package/@lobehub/editor
[npm-release-shield]: https://img.shields.io/npm/v/@lobehub/editor?color=369eff&labelColor=black&logo=npm&logoColor=white&style=flat-square
[pr-welcome-link]: https://github.com/lobehub/lobe-editor/pulls
[pr-welcome-shield]: https://img.shields.io/badge/%F0%9F%A4%AF%20PR%20WELCOME-%E2%86%92-ffcb47?labelColor=black&style=for-the-badge
[profile-link]: https://github.com/lobehub