Skip to content

RichTextEditor

A theme-aware WYSIWYG editor built on Tiptap for rich text editing with customizable toolbar.

This component requires @tiptap packages and @aster-ui/icons as peer dependencies:

Terminal window
npm install @aster-ui/icons @tiptap/react @tiptap/starter-kit @tiptap/extension-link @tiptap/extension-placeholder @tiptap/extension-underline
import { RichTextEditor } from 'asterui/editor'

Basic Editor

Simple rich text editor with default toolbar.

import { RichTextEditor } from 'asterui/editor'

function App() {
  return (
      <RichTextEditor placeholder="Start writing..." />
    )
}

export default App

Controlled Editor

Editor with controlled value showing HTML output.

import { RichTextEditor } from 'asterui/editor'
import { useState } from 'react'

function App() {
  const [content, setContent] = useState('<p>Edit this text...</p>')
  
  return (
      <Space direction="vertical" size="md" block>
        <RichTextEditor value={content} onChange={setContent} />
        <Card size="sm" className="bg-base-200">
          <p className="text-sm font-medium mb-2">HTML Output:</p>
          <code className="text-xs break-all">{content}</code>
        </Card>
      </Space>
    )
}

export default App

Minimal Toolbar

Editor with only basic formatting options.

import { RichTextEditor } from 'asterui/editor'

function App() {
  return (
      <RichTextEditor
        placeholder="Simple formatting only..."
        toolbar={['bold', 'italic', 'underline', '|', 'link']}
      />
    )
}

export default App

Full Toolbar

Editor with all available toolbar options.

import { RichTextEditor } from 'asterui/editor'

function App() {
  return (
      <RichTextEditor
        placeholder="All formatting options..."
        toolbar={[
          'bold',
          'italic',
          'underline',
          'strikethrough',
          '|',
          'heading1',
          'heading2',
          'heading3',
          '|',
          'bulletList',
          'orderedList',
          'blockquote',
          '|',
          'code',
          'codeBlock',
          'horizontalRule',
          '|',
          'link',
          '|',
          'undo',
          'redo',
        ]}
      />
    )
}

export default App

No Toolbar

Distraction-free writing without toolbar.

import { RichTextEditor } from 'asterui/editor'

function App() {
  return (
      <RichTextEditor
        hideToolbar
        placeholder="Write without distractions..."
        minHeight={150}
      />
    )
}

export default App

Sizes

Different text size variants.

import { RichTextEditor } from 'asterui/editor'

function App() {
  return (
      <Space direction="vertical" size="md" block>
        <div>
          <p className="text-sm mb-1">Small</p>
          <RichTextEditor
            size="sm"
            placeholder="Small editor..."
            toolbar={['bold', 'italic', 'link']}
            minHeight={100}
          />
        </div>
        <div>
          <p className="text-sm mb-1">Medium (default)</p>
          <RichTextEditor
            size="md"
            placeholder="Medium editor..."
            toolbar={['bold', 'italic', 'link']}
            minHeight={100}
          />
        </div>
        <div>
          <p className="text-sm mb-1">Large</p>
          <RichTextEditor
            size="lg"
            placeholder="Large editor..."
            toolbar={['bold', 'italic', 'link']}
            minHeight={100}
          />
        </div>
      </Space>
    )
}

export default App

Max Height with Scrolling

Editor with fixed max height that scrolls.

import { RichTextEditor } from 'asterui/editor'

function App() {
  return (
      <RichTextEditor
        placeholder="This editor scrolls when content exceeds max height..."
        minHeight={100}
        maxHeight={200}
        value="<p>Try adding more content to see the scrolling behavior.</p><p>Keep typing...</p><p>More text here...</p><p>And more...</p><p>Even more content...</p><p>The editor will scroll!</p>"
      />
    )
}

export default App

Read-Only Mode

Display formatted content without editing.

import { RichTextEditor } from 'asterui/editor'

function App() {
  return (
      <RichTextEditor
        readOnly
        hideToolbar
        value="<h2>Read-Only Content</h2><p>This content <strong>cannot be edited</strong>. It's useful for displaying formatted content without allowing modifications.</p><ul><li>Item one</li><li>Item two</li><li>Item three</li></ul>"
      />
    )
}

export default App

Borderless

Editor without border, useful inside cards.

import { RichTextEditor } from 'asterui/editor'

function App() {
  return (
      <Card>
        <RichTextEditor
          bordered={false}
          placeholder="Borderless editor inside a card..."
          minHeight={150}
        />
      </Card>
    )
}

export default App

Editor Instance Access

Access the Tiptap editor instance for advanced features.

import { RichTextEditor } from 'asterui/editor'
import { useState } from 'react'

function App() {
  const [wordCount, setWordCount] = useState(0)
  
  return (
      <Space direction="vertical" size="sm" block>
        <RichTextEditor
          placeholder="Start typing to see word count..."
          onEditorReady={(editor) => {
            editor.on('update', () => {
              const text = editor.getText()
              const words = text.trim().split(/\s+/).filter(Boolean).length
              setWordCount(words)
            })
          }}
        />
        <p className="text-sm text-base-content/60">Word count: {wordCount}</p>
      </Space>
    )
}

export default App
PropertyDescriptionTypeDefault
valueHTML content (controlled)string''
onChangeCallback when content changes(html: string) => void-
placeholderPlaceholder textstring'Start typing...'
toolbarToolbar items to displayToolbarItem[][default set]
hideToolbarHide the toolbarbooleanfalse
readOnlyMake editor read-onlybooleanfalse
autoFocusAuto focus on mountbooleanfalse
minHeightMinimum height of editorstring | number200
maxHeightMaximum height (enables scrolling)string | number-
sizeText size variant'sm' | 'md' | 'lg''md'
borderedShow border around editorbooleantrue
onEditorReadyCallback with Tiptap editor instance(editor: Editor) => void-
PropertyDescription
boldBold text
italicItalic text
underlineUnderlined text
strikethroughStrikethrough text
codeInline code
heading1Heading level 1
heading2Heading level 2
heading3Heading level 3
bulletListUnordered list
orderedListOrdered list
blockquoteBlockquote
codeBlockCode block
horizontalRuleHorizontal line
linkInsert/edit link
undoUndo last change
redoRedo last change
|Toolbar divider