UIXHERO

Editor Patterns(エディターパターン)

テキスト・コード・リッチコンテンツを編集するためのUIパターン。ツールバー・コマンドパレット・スラッシュコマンド・マークダウン入力・コードエディター・インラインフォーマットの設計を解説する。

2026年3月3日
更新: 2026年9月3日
25
by Dengen Yosho(DGYS)

テキスト・コード・リッチコンテンツを編集するためのパターン。ツールバー・スラッシュコマンド・コマンドパレット・インラインツールチップ・Markdownショートカット・コードブロックを組み合わせた複合UIで、Notion・Confluence・Linear・VS Code・Zennなど幅広いプロダクトで使われる。プレーンテキストから本格的なWYSIWYGリッチエディターまで、複雑さの幅が非常に大きいパターン。

この記事を読むと、ツールバー vs スラッシュコマンドの使い分け・インライン選択ツールチップ・コードブロックのシンタックスハイライト・エディタートップレベルのキーボードショートカット・Markdownの自動変換・フォーカスモードの設計が自分でできるようになります。


1. UI例(Preview / Live)


2. 定義(Definition)

テキストコンテンツを作成・編集するためのUIパターン群。入力手段の複雑さによって3段階に分類される:

レベル説明
プレーンテキスト<textarea> のみコメント欄・短い入力
Markdownエディター記法で装飾、プレビュー可Zenn・GitHub Issues
WYSIWYGエディター見たまま編集(ツールバー付き)Notion・Word Online

3. 使い分け(When to use / When NOT to use)

3.1 When to use

  • 長文コンテンツの作成:ブログ記事・ドキュメント・仕様書
  • コラボレーション文書:Confluenceページ・Google Docsのような共同編集
  • コード入力が必要な場面:技術ドキュメント・READMEの編集
  • ノートアプリ・ナレッジベース:Notion・Obsidianのようなパーソナルドキュメント

3.2 When NOT to use

  • 短い入力(1〜2行)<input type="text"> または <textarea rows="2"> で十分
  • 定型フォーム:フォームフィールドで構造化できるデータ(名前・住所など)

4. 設計判断の核(Decision Principles)

Editor Patternsの核は「複数の入力手段の並存」——ツールバー(マウス派)・Markdownショートカット(キーボード派)・スラッシュコマンド(Notion派)の3つを同時に提供することで、ユーザーのスキルレベルや好みに合わせた入力体験を実現する。1つの手段しか提供しないと、その手段に慣れていないユーザーを排除してしまう。

判断の優先順位:① 複数入力手段の提供 → ② フォーカスモード(ステータスバー・ショートカットヒント)→ ③ 自動保存の状態表示 → ④ キーボードショートカット

  • ツールバーはアイコン + title 属性でホバー時にラベルを表示する:アイコンだけでは機能が分からないことが多い(特に見慣れないユーザー)。title 属性または Tooltip で「太字 (Cmd+B)」のようにショートカット込みで表示することで、使いながら覚えてもらえる
  • / コマンド(スラッシュコマンド)は行頭の / 入力で起動するコマンドパレット:Notion・Linearで普及したパターン。/ + キーワードで見出し・リスト・コードブロックなどのブロックタイプを挿入できる。キーボード派のパワーユーザーに特に好まれる
  • 自動保存の状態を常にステータスバーに表示する:「保存中…」「✓ 保存済み」「⚠ 保存に失敗しました(再試行)」の3状態をエディター下部のステータスバーに表示する。ユーザーが保存ボタンを押す必要なく、常に保存状態が分かる
  • Tabキーのデフォルト動作を変更したらスクリーンリーダーユーザーに通知する:コードエディターでTabキーをインデントに使う場合、Tabで次のフォーカス可能要素に移動できなくなる。Escape キーを押すとTabがデフォルト動作(フォーカス移動)に戻る旨を案内する

5. 状態設計(States)

状態エディターステータスバー
フォーカスなし通常表示ショートカットヒント
フォーカス中フォーカスリング「編集中」表示
入力中(未保存)「未保存」または「保存中…」
自動保存完了「✓ 保存済み」
保存失敗「⚠ 保存に失敗しました(再試行)」
文字制限超過入力制限 or 赤ボーダー文字数カウンター(赤)

6. バリエーション設計(Variants)

バリアント特徴使用例
Markdownエディターテキスト記法・プレビュー分割Zenn・GitHub・Qiita
WYSIWYGエディターツールバー・見たまま編集Notion・Confluence
コードエディターシンタックスハイライト・言語選択VS Code・CodePen
インラインエディタークリックでその場編集Notion の各ブロック
ミニマルエディターツールバーなし・フォーカスモード執筆アプリ・日記

7. パターン集(Good / Bad / How to fix)

7.0 よく崩れる設計パターン(3つ)

  • ツールバーのアイコンに title がなく機能が分からない:「B」「I」ボタンが何の操作をするか分からず、マウスを合わせても説明が出ない
  • 自動保存の状態が分からない:ユーザーが「保存されたか?」と不安になり、意図的に保存操作を繰り返す
  • Tabキーがインデントになりキーボードでフォーカスが抜けられない:テキストエリアでTabを押すとインデントが入り、エディターから外にTabで移動できなくなる

7.1 Bad(典型3つ)

  • ツールバーボタンに aria-labeltitle もなく、アイコンの意味がアクセシビリティ的に無名
  • コンテンツの変更を localStorage に保存しているが、「保存済み」インジケーターがなく保存されているか分からない
  • onKeyDown で全Tabをインデントに横取りし、スクリーンリーダーユーザーがエディターから出られなくなる

7.2 Good(対になる3つ)

  • 各ツールバーボタンに aria-label="太字 (Cmd+B)"title="太字 (Cmd+B)" を設定する
  • useEffect で内容が変わるたびに debounce 付きの保存処理を走らせ、ステータスバーに「保存中…」→「✓ 保存済み」を表示する
  • Escape キーでTabの動作をデフォルト(フォーカス移動)に戻し、「Tab = インデント / Escape で離脱」をUI上にヒント表示する

7.3 How to fix(手順)

  1. 全ツールバーボタンに aria-label + title(ショートカット込み)を追加する
  2. useDebouncedCallback で自動保存を実装し、ステータスバーに保存状態を表示する
  3. Tabキーの動作を切り替え可能にし、Escape での離脱案内をツールチップやステータスバーで示す
  4. 分割プレビューモードの追加で、MarkdownとHTMLの両方を確認できるようにする

8. ルール(Must / Better)

Must(守らないと壊れる)

Better(品質が跳ねる)


9. アクセシビリティ要件(必須)

Screen Reader / Keyboard

<!-- ツールバー -->
<div role="toolbar" aria-label="テキスト書式設定">
  <button aria-label="太字 (Cmd+B)" aria-pressed="false">B</button>
  <button aria-label="イタリック (Cmd+I)" aria-pressed="false">I</button>
  <button aria-label="見出し1">H1</button>
</div>

<!-- エディター本体 -->
<textarea
  aria-label="記事の本文"
  aria-describedby="editor-hint"
/>
<p id="editor-hint">
  Tab でインデント。Escape を押すとタブキーでフォーカスを移動できます。
</p>

<!-- ステータスバー -->
<div role="status" aria-live="polite">
  ✓ 保存済み
</div>

10. 実装メモ(Implementation Notes)

  • リッチテキストエディターのライブラリ選定
    • Tiptap(ProseMirsor ベース):拡張性が高くコラボレーション機能(Yjs)も対応。Notion風のエディターを作るなら第一候補
    • Slate.js:完全カスタマイズ可能だが低レベルAPIのため設計コストが高い
    • Quill:シンプルなWYSIWYGが必要な場合に適した老舗ライブラリ
    • CodeMirror 6 / Monaco Editor:コードエディターに特化
  • 自動保存の実装useDebouncedCallback(saveContent, 1000) で入力後1秒の無操作で自動保存。beforeunload イベントで未保存のまま閉じるのを防ぐ警告を出す
  • スラッシュコマンドの実装onInput で現在行が / で始まるか検出し、/ 以降のテキストでコマンドリストをフィルタリングするポップオーバーを表示する。Tiptap では @tiptap/suggestion 拡張として実装できる
  • コラボレーション(共同編集):Tiptap + Yjs + y-websocket で複数ユーザーのリアルタイム共同編集(CRDT)を実装できる。各ユーザーのカーソル位置も共有可能

11. 関連リンク


12. まとめ

Editor Patternsの設計で最重要なのは「複数の入力手段の並存」と「自動保存状態の常時表示」です。ツールバー・Markdownショートカット・スラッシュコマンドの3つを同時に提供することで、マウス派・キーボード派・パワーユーザーのすべてをカバーできます。Tabキーをインデントに使う場合のアクセシビリティ対策(Escape による離脱手段の案内)は特に見落としやすいポイントです。プロダクションレベルの実装では Tiptap を起点にすることを強く推奨します。

更新のお知らせ

サイトに載せていない実例や、新しい記事のお知らせはこちらで出しています。

読んだ内容を、自分の画面に当てるとき

UIXHEROは、記事を書くほかに、画面の検品・判定、デザインシステムの構築、実装と改善の伴走を受けています。何を頼めばいいか決まっていない段階の相談も、同じ窓口で受けます。

UIXHEROに頼めることを見る

※ 記事の内容についての質問や、書いてほしいテーマの要望も同じ窓口で受けています

記事をシェア

メールでお知らせを受け取る

最終更新: 2026年9月3日

この記事を書いた人

Dengen Yosho(DGYS)

Dengen Yosho(DGYS)

UI/UXデザイナー兼デザインエンジニア デザイン歴25年以上 情報設計〜UIデザイン〜React/TypeScriptによる実装までを一気通貫で担当 大手企業のDXプロジェクトや決済アプリ領域で、デザインリードとして改善と構築を経験 現在はフリーランスとして、プロダクトのUI/UX改善とデザインシステム構築を支援 長年の実務の中で感じてきたのは、 「良いUI」はセンスではなく、再現可能な判断の積み重ねであるということ UIXHEROは、 心理学や行動科学の知見を、現場で使える設計言語に翻訳するための場所 関心領域は「ユーザーの行動が変わるUI」 人の認知・注意・意思決定の構造を理解し、 “なぜそのUIが機能するのか”を言語化することを目指している

あわせて読みたい

この記事に関連する記事をご紹介します

Bar Chart(棒グラフ)

カテゴリごとの量を棒の長さで比べるチャート。ゼロ基線の扱い、並び順、縦横の選び方、しきい値の見せ方という設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
18

Donut Chart(ドーナツチャート)

中央をくり抜いた円で構成比を示すチャート。中央に置く値の選び方、円グラフとの使い分け、リングの太さ、凡例の作りという設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
17

Gauge Chart(ゲージチャート)

1つの値を範囲の中に置いて示す半円のチャート。範囲の両端に意味があるかという条件、しきい値の帯の設計、色だけで良否を伝えない書き方という設計判断とアクセシビリティ要件を解説する。

2026年8月27日
16

もっと深く知りたいですか?

ここに掲載されていないトピックについても、リクエストがあれば解説記事を追加します。 わかりにくい点や、具体的な事例について知りたいことがあれば教えてください。

リクエストを送る