SCALE — Build Lab
UI部品 · REACT COMPONENT

リッチテキストエディタ(Tiptap)

CATEGORYUI部品 TYPEReact Component EFFORT120〜300分 DIFFICULTY
PRIMARY CODE
tsx
'use client';
import { useEditor, EditorContent } from '@tiptap/react';
import StarterKit from '@tiptap/starter-kit';

export function RichEditor({ value, onChange }: { value: string; onChange: (html: string) => void }) {
  const editor = useEditor({
    extensions: [StarterKit],
    content: value,
    onUpdate: ({ editor }) => onChange(editor.getHTML()),
  });

  return (
    <div>
      <button onClick={() => editor?.chain().focus().toggleBold().run()}>B</button>
      <button onClick={() => editor?.chain().focus().toggleItalic().run()}>I</button>
      <button onClick={() => editor?.chain().focus().toggleBulletList().run()}>•</button>
      <EditorContent editor={editor} />
    </div>
  );
}
DEPENDENCIES
@tiptap/react@tiptap/starter-kit
前提条件
Tailwind CSS v4TypeScript 5
USE CASES
  • 任意のダッシュボードに組み込み

リッチテキストエディタ(Tiptap)

:LiTarget: 用途

Notion風リッチテキストエディタ。見出し・リスト・リンク・画像対応。

:LiSparkle: 特徴

  • Markdown互換
  • 画像貼付け
  • スラッシュコマンド
  • コラボレーション対応

:LiCode: コード(コピペ用)

'use client';
import { useEditor, EditorContent } from '@tiptap/react';
import StarterKit from '@tiptap/starter-kit';

export function RichEditor({ value, onChange }: { value: string; onChange: (html: string) => void }) {
  const editor = useEditor({
    extensions: [StarterKit],
    content: value,
    onUpdate: ({ editor }) => onChange(editor.getHTML()),
  });

  return (
    <div>
      <button onClick={() => editor?.chain().focus().toggleBold().run()}>B</button>
      <button onClick={() => editor?.chain().focus().toggleItalic().run()}>I</button>
      <button onClick={() => editor?.chain().focus().toggleBulletList().run()}>•</button>
      <EditorContent editor={editor} />
    </div>
  );
}

:LiHandPointer: 使い方

対象プロジェクトに該当ファイルをコピーして、props を流し込むだけ。

:LiAlertCircle: 注意事項

  • 依存パッケージを忘れず追加