Implementing the Syncfusion Vue Rich Text Editor
The Syncfusion Vue Rich Text Editor (ejs-richtexteditor) is a single, unified editor component that supports two primary modes:
- HTML mode (default) — WYSIWYG editor that returns valid HTML markup
- Markdown mode — plain-text editing with Markdown syntax, rendered via a third-party library like
marked
Both modes share the same Vue component and @syncfusion/ej2-vue-richtexteditor package. The editorMode prop and the injected service module (HtmlEditor vs MarkdownEditor) are what differentiate them.
When to Use This Skill
- User wants to add a rich text / WYSIWYG editor to a Vue app
- User wants a Markdown editor with preview support
- User needs to customize the toolbar (types, items, sticky, floating)
- User wants to insert images, audio, video, tables, or links
- User needs paste-from-Word cleanup, inline editing, or IFrame mode
- User wants to integrate AI Assistant, slash menu, emoji picker, or @mentions
- User needs form validation, read-only mode, or XHTML validation
- User needs to get/set editor value or work with events and selection API
Mode Selection Guide
| Goal |
Mode |
Inject |
| WYSIWYG HTML output |
editorMode="HTML" (default) |
HtmlEditor |
Markdown text with #, **bold** syntax |
editorMode="Markdown" |
MarkdownEditor |
| IFrame-isolated editing |
HTML mode + IFrame config |
HtmlEditor, HtmlEditor render mode |
| Live markdown preview split-pane |
Markdown mode + marked library |
MarkdownEditor |
Documentation and Navigation Guide
Getting Started
📄 Read: references/getting-started.md
- Package installation (
@syncfusion/ej2-vue-richtexteditor)
- CSS imports and theme setup
- Module injection reference table (all available services)
- Minimal HTML editor setup (Composition API + Options API)
- Minimal Markdown editor setup
- Running the application
Editor Modes (HTML vs Markdown)
📄 Read: references/editor-modes.md
- HTML mode — default WYSIWYG, returns HTML markup
- Markdown mode —
editorMode="Markdown", returns Markdown text
- Supported Markdown tags and selection formatting
- Converting Markdown to HTML with
marked library
- Live markdown preview implementation
- Side-by-side split-pane preview with Splitter component
Toolbar Configuration
📄 Read: references/toolbar-configuration.md
- Toolbar types: Expand, MultiRow, Scrollable, Popup
- Sticky/floating toolbar (
enableFloating, floatingToolbarOffset)
- Toolbar position (top/bottom) and
toolbarSettings
- Enabling/disabling toolbar items programmatically
- Custom toolbar button templates
Toolbar Tools Reference
📄 Read: references/toolbar-tools.md
- All built-in toolbar items by category (text formatting, font, alignment, lists, links, images, tables, undo/redo, misc)
- Markdown-specific toolbar items
- Removing or reordering built-in tools
toolbarSettings.items array configuration
Quick Toolbars
📄 Read: references/quick-toolbars.md
- Context-aware toolbars for images, links, tables, audio, video
- Customizing
quickToolbarSettings per element type
- Default quick toolbar items and overrides
- Enabling/disabling quick toolbars
Inserting Images
📄 Read: references/insert-images.md
- Image insertion via toolbar (URL and file upload)
- Server-side upload with
insertImageSettings
- Drag-and-drop image support
- Image resize, alignment, caption, alt text
- Renaming images on server, checking image size limits
Image module injection
Inserting Media (Audio & Video)
📄 Read: references/insert-media.md
- Audio insertion with
Audio module
- Video insertion with
Video module
- File browser integration
- Media quick toolbar options
Inserting Tables
📄 Read: references/insert-table.md
- Table insertion in HTML mode and Markdown mode
- Default table structure (2×2 with header row)
- Table quick toolbar (rows, columns, merge, properties)
- Table
Table module injection
Editor Value & Content
📄 Read: references/editor-value.md
- Setting initial value via
:value prop
- Getting editor value via
getValue() method
- Two-way binding with
v-model
- Placeholder text (
placeholder prop)
- Character count and
maxLength
change, input, blur events
execCommand API for programmatic formatting
- Selection API and cursor positioning
Smart Editing Features
📄 Read: references/smart-editing.md
- Slash menu (
/ command palette) with slashMenuSettings
- Emoji picker toolbar integration
- Mention support (
@mention) with MentionModule
- Mail merge fields
Paste Cleanup
📄 Read: references/paste-cleanup.md
- Pasting content from Word/browser with formatting control
pasteCleanupSettings: prompt, plainText, keepFormat
- Stripping denied tags/attributes (
deniedTags, deniedAttrs)
PasteCleanup module injection
- Clipboard event handling
Editor Types (Inline, IFrame, Resizable)
📄 Read: references/editor-types.md
- Inline editing mode (content-editable in-place editing)
- IFrame mode (style isolation from page)
- Resizable editor (
enableResize, resize handles)
- When to choose each render type
AI Assistant
📄 Read: references/ai-assistant.md
AIAssistantService provider injection
AICommands and AIQuery toolbar items
- AI pop-up with predefined prompt dropdown
- Customizing AI assistant behavior and properties
Validation & Security
📄 Read: references/validation-security.md
- Form integration and submit-on-form
- XHTML validation mode
- Read-only mode (
readonly prop)
- Max length validation
- Spell and grammar check integration
Accessibility & Globalization
📄 Read: references/accessibility-globalization.md
- WCAG 2.2 and Section 508 compliance
- Keyboard navigation and shortcuts
- RTL (right-to-left) support
- Globalization and locale configuration
- Custom keyboard shortcut overrides
API Reference - Events
📄 Read: references/vue-events.md
- Lifecycle events (created, destroyed)
- Editor action events (actionBegin, actionComplete, toolbarClick)
- Content change events (change, selectionChanged, focus, blur)
- Dialog events (beforeDialogOpen, dialogOpen, dialogClose)
- File upload events (image, audio, video uploads)
- Toolbar and popup events
- AI Assistant events
- Advanced events (paste, resize, export, import)
API Reference - Methods
📄 Read: references/vue-methods.md
- Content access methods (getHtml, getText, getXhtml, getContent, getCharCount)
- Selection and range methods (getSelection, getRange, selectAll, selectRange)
- Command execution (executeCommand with all available commands)
- Toolbar management (enable, disable, remove toolbar items)
- Dialog methods (showDialog, closeDialog)
- Focus and state methods (focusIn, focusOut, refreshUI, destroy)
- AI Assistant methods (show/hide popup, execute prompt, manage history)
- Utility methods (sanitizeHtml, print, fullscreen, source code, emoji picker)
API Reference - Properties (Core)
📄 Read: references/properties-core.md
- Core configuration (value, valueTemplate, placeholder, enabled, readonly, cssClass, htmlAttributes)
- Dimensions and layout (width, height, enableResize)
- Editor modes and behavior (editorMode, enterKey, shiftEnterKey, enableTabKey, enableAutoUrl, enableMarkdownAutoFormat)
- Toolbar configuration (toolbarSettings with enable, enableFloating, position, type, items, itemConfigs)
- Toolbar customization (floatingToolbarOffset, showTooltip)
- Quick toolbar settings (for images, links, tables, audio, video with actionOnScroll, enableAppendToBody)
- Font and text formatting (fontFamily, fontSize, fontColor, backgroundColor, format, lineHeight, formatPainterSettings)
- List formatting (bulletFormatList, numberFormatList)
- Media insertion settings (insertImageSettings, insertAudioSettings, insertVideoSettings, fileManagerSettings)
- Table settings (tableSettings with width, resize, styles)
- Paste and clipboard (pasteCleanupSettings with prompt, keepFormat, deniedAttrs/Tags, allowedStyleProps; enableClipboardCleanup)
API Reference - Properties (Advanced)
📄 Read: references/properties-advanced.md
- AI Assistant settings (aiAssistantSettings with commands, prompts, suggestions, popup dimensions, toolbar settings, bannerTemplate)
- Advanced features (slashMenuSettings, emojiPickerSettings, codeBlockSettings, formatter, keyConfig for custom shortcuts)
- Validation and limits (maxLength, showCharCount, enableHtmlSanitizer, enableHtmlEncode, enableXhtml)
- Localization and accessibility (locale with L10n translations, enableRtl for right-to-left languages)
- IFrame mode (iframeSettings with enable, attributes, resources, metaTags, sandbox)
- Inline mode (inlineMode with enable, onSelection for toolbar display)
- Import and export (importWord, exportWord with serviceUrl/fileName/stylesheet, exportPdf with serviceUrl/fileName/stylesheet)
- Persistence and auto-save (enablePersistence with localStorage, autoSaveOnIdle, saveInterval in milliseconds)
- Undo/redo (undoRedoSteps for history limit, undoRedoTimer for debounce delay)
Quick Start
npm install @syncfusion/ej2-vue-richtexteditor
npm install @syncfusion/ej2-tailwind3-theme
HTML Editor (Composition API)
<template>
<ejs-richtexteditor :value="value" :toolbarSettings="toolbarSettings" />
</template>
<script setup>
import { provide } from 'vue';
import {
RichTextEditorComponent as EjsRichtexteditor,
Toolbar, Link, Image, HtmlEditor, QuickToolbar
} from '@syncfusion/ej2-vue-richtexteditor';
const value = '<p>Start editing here...</p>';
const toolbarSettings = {
items: ['Bold', 'Italic', 'Underline', '|', 'Formats', 'Alignments',
'OrderedList', 'UnorderedList', '|', 'CreateLink', 'Image', '|', 'Undo', 'Redo']
};
provide('richtexteditor', [Toolbar, Link, Image, HtmlEditor, QuickToolbar]);
</script>
<style>
@import '../node_modules/@syncfusion/ej2-tailwind3-theme/styles/rich-text-editor/index.css';
</style>
Markdown Editor (Composition API)
<template>
<ejs-richtexteditor
editorMode="Markdown"
:value="value"
:toolbarSettings="toolbarSettings"
/>
</template>
<script setup>
import { provide } from 'vue';
import {
RichTextEditorComponent as EjsRichtexteditor,
Toolbar, Link, Image, MarkdownEditor
} from '@syncfusion/ej2-vue-richtexteditor';
const value = '**Hello** from Markdown editor!';
const toolbarSettings = {
items: ['Bold', 'Italic', 'StrikeThrough', '|',
'Formats', 'OrderedList', 'UnorderedList', '|',
'CreateLink', 'Image', '|', 'Undo', 'Redo']
};
provide('richtexteditor', [Toolbar, Link, Image, MarkdownEditor]);
</script>
Key Module Injection Reference
| Feature |
Module to Inject |
| HTML editing (default) |
HtmlEditor |
| Markdown editing |
MarkdownEditor |
| Toolbar |
Toolbar |
| Hyperlinks |
Link |
| Images |
Image |
| Audio |
Audio |
| Video |
Video |
| Tables |
Table |
| Quick toolbars |
QuickToolbar |
| Paste cleanup |
PasteCleanup |
| Slash menu |
SlashMenu |
| AI Assistant |
AIAssistantService |
| Character count |
Count |
Always inject modules in provide('richtexteditor', [...modules]).
Common Patterns
Controlled value with v-model
<ejs-richtexteditor v-model:value="content" />
Getting value programmatically
<ejs-richtexteditor ref="rteRef" />
<!-- In script: -->
const html = rteRef.value.ej2Instances.getHTML();
const text = rteRef.value.ej2Instances.getText();
Markdown editor + live HTML preview
Use editorMode="Markdown" with a change event handler that passes the content through marked.parse() into a preview <div>. See references/editor-modes.md for the full split-pane implementation.
Decide: HTML mode or Markdown mode?
- Need formatted output to store as HTML → use HTML mode
- Need lightweight text with syntax users can read/edit as plain text → use Markdown mode
- Need rich media (images, video, audio, tables with formatting) → use HTML mode
- Need developer-friendly source that renders in GitHub/Notion → use Markdown mode
1---2name: syncfusion-vue-rich-text-editor3description: Implements the Syncfusion Vue Rich Text Editor (ejs-richtexteditor) supporting both HTML (WYSIWYG) and Markdown editing modes via the editorMode API from @syncfusion/ej2-vue-richtexteditor. Use this skill for toolbar customization, image upload, paste cleanup, inline editing, AI assistant integration, slash menu, emoji picker, and mention support in Vue applications.4---56# Implementing the Syncfusion Vue Rich Text Editor78The Syncfusion Vue Rich Text Editor (`ejs-richtexteditor`) is a single, unified editor component that supports two primary modes:9- **HTML mode** (default) — WYSIWYG editor that returns valid HTML markup10- **Markdown mode** — plain-text editing with Markdown syntax, rendered via a third-party library like `marked`1112Both modes share the same Vue component and `@syncfusion/ej2-vue-richtexteditor` package. The `editorMode` prop and the injected service module (`HtmlEditor` vs `MarkdownEditor`) are what differentiate them.1314## When to Use This Skill1516- User wants to add a **rich text / WYSIWYG editor** to a Vue app17- User wants a **Markdown editor** with preview support18- User needs to **customize the toolbar** (types, items, sticky, floating)19- User wants to **insert images, audio, video, tables, or links**20- User needs **paste-from-Word cleanup**, inline editing, or IFrame mode21- User wants to integrate **AI Assistant**, slash menu, emoji picker, or @mentions22- User needs **form validation**, read-only mode, or XHTML validation23- User needs to **get/set editor value** or work with events and selection API2425## Mode Selection Guide2627| Goal | Mode | Inject |28|------|------|--------|29| WYSIWYG HTML output | `editorMode="HTML"` (default) | `HtmlEditor` |30| Markdown text with `#`, `**bold**` syntax | `editorMode="Markdown"` | `MarkdownEditor` |31| IFrame-isolated editing | HTML mode + IFrame config | `HtmlEditor`, `HtmlEditor` render mode |32| Live markdown preview split-pane | Markdown mode + `marked` library | `MarkdownEditor` |3334## Documentation and Navigation Guide3536### Getting Started37📄 **Read:** [references/getting-started.md](references/getting-started.md)38- Package installation (`@syncfusion/ej2-vue-richtexteditor`)39- CSS imports and theme setup40- Module injection reference table (all available services)41- Minimal HTML editor setup (Composition API + Options API)42- Minimal Markdown editor setup43- Running the application4445### Editor Modes (HTML vs Markdown)46📄 **Read:** [references/editor-modes.md](references/editor-modes.md)47- HTML mode — default WYSIWYG, returns HTML markup48- Markdown mode — `editorMode="Markdown"`, returns Markdown text49- Supported Markdown tags and selection formatting50- Converting Markdown to HTML with `marked` library51- Live markdown preview implementation52- Side-by-side split-pane preview with Splitter component5354### Toolbar Configuration55📄 **Read:** [references/toolbar-configuration.md](references/toolbar-configuration.md)56- Toolbar types: Expand, MultiRow, Scrollable, Popup57- Sticky/floating toolbar (`enableFloating`, `floatingToolbarOffset`)58- Toolbar position (top/bottom) and `toolbarSettings`59- Enabling/disabling toolbar items programmatically60- Custom toolbar button templates6162### Toolbar Tools Reference63📄 **Read:** [references/toolbar-tools.md](references/toolbar-tools.md)64- All built-in toolbar items by category (text formatting, font, alignment, lists, links, images, tables, undo/redo, misc)65- Markdown-specific toolbar items66- Removing or reordering built-in tools67- `toolbarSettings.items` array configuration6869### Quick Toolbars70📄 **Read:** [references/quick-toolbars.md](references/quick-toolbars.md)71- Context-aware toolbars for images, links, tables, audio, video72- Customizing `quickToolbarSettings` per element type73- Default quick toolbar items and overrides74- Enabling/disabling quick toolbars7576### Inserting Images77📄 **Read:** [references/insert-images.md](references/insert-images.md)78- Image insertion via toolbar (URL and file upload)79- Server-side upload with `insertImageSettings`80- Drag-and-drop image support81- Image resize, alignment, caption, alt text82- Renaming images on server, checking image size limits83- `Image` module injection8485### Inserting Media (Audio & Video)86📄 **Read:** [references/insert-media.md](references/insert-media.md)87- Audio insertion with `Audio` module88- Video insertion with `Video` module89- File browser integration90- Media quick toolbar options9192### Inserting Tables93📄 **Read:** [references/insert-table.md](references/insert-table.md)94- Table insertion in HTML mode and Markdown mode95- Default table structure (2×2 with header row)96- Table quick toolbar (rows, columns, merge, properties)97- Table `Table` module injection9899### Editor Value & Content100📄 **Read:** [references/editor-value.md](references/editor-value.md)101- Setting initial value via `:value` prop102- Getting editor value via `getValue()` method103- Two-way binding with `v-model`104- Placeholder text (`placeholder` prop)105- Character count and `maxLength`106- `change`, `input`, `blur` events107- `execCommand` API for programmatic formatting108- Selection API and cursor positioning109110### Smart Editing Features111📄 **Read:** [references/smart-editing.md](references/smart-editing.md)112- Slash menu (`/` command palette) with `slashMenuSettings`113- Emoji picker toolbar integration114- Mention support (`@mention`) with `MentionModule`115- Mail merge fields116117### Paste Cleanup118📄 **Read:** [references/paste-cleanup.md](references/paste-cleanup.md)119- Pasting content from Word/browser with formatting control120- `pasteCleanupSettings`: prompt, plainText, keepFormat121- Stripping denied tags/attributes (`deniedTags`, `deniedAttrs`)122- `PasteCleanup` module injection123- Clipboard event handling124125### Editor Types (Inline, IFrame, Resizable)126📄 **Read:** [references/editor-types.md](references/editor-types.md)127- Inline editing mode (content-editable in-place editing)128- IFrame mode (style isolation from page)129- Resizable editor (`enableResize`, resize handles)130- When to choose each render type131132### AI Assistant133📄 **Read:** [references/ai-assistant.md](references/ai-assistant.md)134- `AIAssistantService` provider injection135- `AICommands` and `AIQuery` toolbar items136- AI pop-up with predefined prompt dropdown137- Customizing AI assistant behavior and properties138139### Validation & Security140📄 **Read:** [references/validation-security.md](references/validation-security.md)141- Form integration and submit-on-form142- XHTML validation mode143- Read-only mode (`readonly` prop)144- Max length validation145- Spell and grammar check integration146147### Accessibility & Globalization148📄 **Read:** [references/accessibility-globalization.md](references/accessibility-globalization.md)149- WCAG 2.2 and Section 508 compliance150- Keyboard navigation and shortcuts151- RTL (right-to-left) support152- Globalization and locale configuration153- Custom keyboard shortcut overrides154155### API Reference - Events156📄 **Read:** [references/vue-events.md](references/events.md)157- Lifecycle events (created, destroyed)158- Editor action events (actionBegin, actionComplete, toolbarClick)159- Content change events (change, selectionChanged, focus, blur)160- Dialog events (beforeDialogOpen, dialogOpen, dialogClose)161- File upload events (image, audio, video uploads)162- Toolbar and popup events163- AI Assistant events164- Advanced events (paste, resize, export, import)165166### API Reference - Methods167📄 **Read:** [references/vue-methods.md](references/methods.md)168- Content access methods (getHtml, getText, getXhtml, getContent, getCharCount)169- Selection and range methods (getSelection, getRange, selectAll, selectRange)170- Command execution (executeCommand with all available commands)171- Toolbar management (enable, disable, remove toolbar items)172- Dialog methods (showDialog, closeDialog)173- Focus and state methods (focusIn, focusOut, refreshUI, destroy)174- AI Assistant methods (show/hide popup, execute prompt, manage history)175- Utility methods (sanitizeHtml, print, fullscreen, source code, emoji picker)176177### API Reference - Properties (Core)178📄 **Read:** [references/properties-core.md](references/properties-core.md)179- Core configuration (value, valueTemplate, placeholder, enabled, readonly, cssClass, htmlAttributes)180- Dimensions and layout (width, height, enableResize)181- Editor modes and behavior (editorMode, enterKey, shiftEnterKey, enableTabKey, enableAutoUrl, enableMarkdownAutoFormat)182- Toolbar configuration (toolbarSettings with enable, enableFloating, position, type, items, itemConfigs)183- Toolbar customization (floatingToolbarOffset, showTooltip)184- Quick toolbar settings (for images, links, tables, audio, video with actionOnScroll, enableAppendToBody)185- Font and text formatting (fontFamily, fontSize, fontColor, backgroundColor, format, lineHeight, formatPainterSettings)186- List formatting (bulletFormatList, numberFormatList)187- Media insertion settings (insertImageSettings, insertAudioSettings, insertVideoSettings, fileManagerSettings)188- Table settings (tableSettings with width, resize, styles)189- Paste and clipboard (pasteCleanupSettings with prompt, keepFormat, deniedAttrs/Tags, allowedStyleProps; enableClipboardCleanup)190191### API Reference - Properties (Advanced)192📄 **Read:** [references/properties-advanced.md](references/properties-advanced.md)193- AI Assistant settings (aiAssistantSettings with commands, prompts, suggestions, popup dimensions, toolbar settings, bannerTemplate)194- Advanced features (slashMenuSettings, emojiPickerSettings, codeBlockSettings, formatter, keyConfig for custom shortcuts)195- Validation and limits (maxLength, showCharCount, enableHtmlSanitizer, enableHtmlEncode, enableXhtml)196- Localization and accessibility (locale with L10n translations, enableRtl for right-to-left languages)197- IFrame mode (iframeSettings with enable, attributes, resources, metaTags, sandbox)198- Inline mode (inlineMode with enable, onSelection for toolbar display)199- Import and export (importWord, exportWord with serviceUrl/fileName/stylesheet, exportPdf with serviceUrl/fileName/stylesheet)200- Persistence and auto-save (enablePersistence with localStorage, autoSaveOnIdle, saveInterval in milliseconds)201- Undo/redo (undoRedoSteps for history limit, undoRedoTimer for debounce delay)202203## Quick Start204205```bash206npm install @syncfusion/ej2-vue-richtexteditor207```208209```bash210npm install @syncfusion/ej2-tailwind3-theme211```212213### HTML Editor (Composition API)214215```vue216<template>217 <ejs-richtexteditor :value="value" :toolbarSettings="toolbarSettings" />218</template>219220<script setup>221import { provide } from 'vue';222import {223 RichTextEditorComponent as EjsRichtexteditor,224 Toolbar, Link, Image, HtmlEditor, QuickToolbar225} from '@syncfusion/ej2-vue-richtexteditor';226227const value = '<p>Start editing here...</p>';228const toolbarSettings = {229 items: ['Bold', 'Italic', 'Underline', '|', 'Formats', 'Alignments',230 'OrderedList', 'UnorderedList', '|', 'CreateLink', 'Image', '|', 'Undo', 'Redo']231};232provide('richtexteditor', [Toolbar, Link, Image, HtmlEditor, QuickToolbar]);233</script>234235<style>236@import '../node_modules/@syncfusion/ej2-tailwind3-theme/styles/rich-text-editor/index.css';237</style>238```239240### Markdown Editor (Composition API)241242```vue243<template>244 <ejs-richtexteditor245 editorMode="Markdown"246 :value="value"247 :toolbarSettings="toolbarSettings"248 />249</template>250251<script setup>252import { provide } from 'vue';253import {254 RichTextEditorComponent as EjsRichtexteditor,255 Toolbar, Link, Image, MarkdownEditor256} from '@syncfusion/ej2-vue-richtexteditor';257258const value = '**Hello** from Markdown editor!';259const toolbarSettings = {260 items: ['Bold', 'Italic', 'StrikeThrough', '|',261 'Formats', 'OrderedList', 'UnorderedList', '|',262 'CreateLink', 'Image', '|', 'Undo', 'Redo']263};264provide('richtexteditor', [Toolbar, Link, Image, MarkdownEditor]);265</script>266```267268## Key Module Injection Reference269270| Feature | Module to Inject |271|---------|-----------------|272| HTML editing (default) | `HtmlEditor` |273| Markdown editing | `MarkdownEditor` |274| Toolbar | `Toolbar` |275| Hyperlinks | `Link` |276| Images | `Image` |277| Audio | `Audio` |278| Video | `Video` |279| Tables | `Table` |280| Quick toolbars | `QuickToolbar` |281| Paste cleanup | `PasteCleanup` |282| Slash menu | `SlashMenu` |283| AI Assistant | `AIAssistantService` |284| Character count | `Count` |285286Always inject modules in `provide('richtexteditor', [...modules])`.287288## Common Patterns289290### Controlled value with v-model291```vue292<ejs-richtexteditor v-model:value="content" />293```294295### Getting value programmatically296```vue297<ejs-richtexteditor ref="rteRef" />298<!-- In script: -->299const html = rteRef.value.ej2Instances.getHTML();300const text = rteRef.value.ej2Instances.getText();301```302303### Markdown editor + live HTML preview304Use `editorMode="Markdown"` with a `change` event handler that passes the content through `marked.parse()` into a preview `<div>`. See `references/editor-modes.md` for the full split-pane implementation.305306### Decide: HTML mode or Markdown mode?307- Need **formatted output to store as HTML** → use HTML mode308- Need **lightweight text with syntax** users can read/edit as plain text → use Markdown mode309- Need **rich media** (images, video, audio, tables with formatting) → use HTML mode310- Need **developer-friendly source** that renders in GitHub/Notion → use Markdown mode