TextEditor

書式ツールを並べた入力エリアです。

書式ツールを下に置き、送る操作を並べる
書式ツールを絞る
Composerの入力エリアに入れる
お知らせ
狭い場所:ツールバーは折り返す
使えない時・右から左に読む場合

使いどころ

  • 返信・日記・コメントなど、太字や箇条書きの付いた文の入力エリアを置く時に使います。
  • 書式の要らない本文は Textarea、本文と添付・送信ボタンをまとめた入力エリアは Composer を使います。Composer の editor にこのコンポーネントを入れることもできます。

使い方

id と label を渡します。書式ツール(太字・斜体・取り消し線・リンク・見出し・引用・コード・箇条書き・番号付きの箇条書き・ファイルを添える・元に戻す・やり直す)を並べ、その下に入力エリアを置きます。全体は複数行の入力欄(Textarea)と同じ1pxの灰色(#c1c1c1)の枠と角丸5pxで囲み、影は付けません。フォーカスがある間は青い縁と淡い青の輪で示します。入力エリアの文字は続けて読む文章の大きさ(14px)です。ツールバーはBasecamp 2の本文の上の書式ツールと同じく、面も罫線も持たずに入力エリアと同じ白の上に置き、左端を本文の書き始めにそろえます。書式ツールは控えめな Button と同じ平らな白・1pxの灰色の枠・下の1pxの影を持つボタンを、隙間なくつなげて間を1本の線にした一組です。tools で並べるツールを選び、"|" で区切りを入れます。区切りの前後は別の一組になり、8pxの間隔で分けます。

placement="bottom" にするとツールバーを入力エリアの下に置きます。actions に渡した送信・下書きの保存などの操作は、ツールバーの末尾に置きます。

このコンポーネントは見た目とツールバーだけを持ち、特定のエディターに依存しません。書式を付ける動きは利用側のエディターに任せます。editor に任意のリッチテキストのエディターが描く入力エリア(contenteditable の要素)を渡し、ツールのボタンの data-text-editor-tool(bold・italic・link・bullets など)を読んでエディターの操作を呼びます。現在適用中の書式のツールに data-active="true" を付けると、選んだ状態の共通の見た目(淡い青の縦の塗りに紺の縁と紺の文字)で示します。

editor を渡さなければ textarea を置きます。name・placeholder・value・disabled などの残りの属性は textarea に付き、class は外側の要素に付きます。textarea のままの時も、ツールを動かすのは利用側です(書式の記号を差し込むなど)。ツールを使わない時は tools={[]} にします。ツールも actions も無い時は、ツールバーを描きません。disabled はツールも押せなくし、入力エリアの面と枠はそのままにして文字だけを灰色にします。

ツールバーは ToolbarController を toolbar として登録して使います。書式を付ける動きのcontrollerは持ちません。送信する値は textarea の本文か、editor の側で用意した値です。JavaScriptが無い時は textarea に書いた文を送ります。

キーボード

TextEditorのキーボード操作
キー動作
Tabツールバーへは一か所だけで入ります。
←・→前後のツールへ移ります。端では反対の端へ回ります。右から左に読む時は逆です。
Home・End最初・最後の使えるツールへ移ります。
Enter・Spaceフォーカスのあるツールを押します。

アクセシビリティ

  • ツールバーは role="toolbar" で、「labelの書式」を名前にし、aria-controls で id の入力エリアを指します。editor を渡す時は、入力エリアの要素に同じ id と、aria-label などの名前を付けます。
  • ツールのボタンは名前を持ち、ホバーすると同じ名前を表示します。
  • ツールバーは一つのTab停止点で、Tabで入ると前にいたツール(初めは先頭の使えるツール)に止まり、矢印キーでツールの間を移ります。actions の操作はツールとは別のTab停止点です。
  • ツールはJavaScriptで動くものなので、controllerが付くまでは全てのツールを tabindex="-1" にして、Tabで止めません。

API

TextEditor

返信や日記、コメントに使う、書式ツールを並べた入力エリア。見た目とツールバーだけを持ち、特定のエディターには依存しない。書式を付ける動きは利用側のエディターに任せ、ツールのボタンのdata-text-editor-tool("bold"など)を読んでエディターの操作を呼び、今の書式のツールには data-active="true"を付ける。textareaのままの時も、ツールを動かすのは利用側(記号を差し込むなど)。ツールを使わない時はtoolsを空にする。ツールも操作も無い時は、ツールバーを描かない。ツールバーはToolbarControllerで一つのTab停止点にし、矢印キーでツールの間を移る。ツールはJavaScriptで動くものなので、controllerが付くまではTabで止めない。

TextEditorのprops
名前型既定値説明
id必須string入力エリアのID。textareaに付け、ツールバーのaria-controlsが指す。 editorを渡す時は、その入力エリアの要素に同じIDを付ける。
label必須string入力エリアの読み上げ名。ツールバーの名前(「〜の書式」)にも使う。editorを渡した時は入力エリアに付かない。
toolsreadonly (TextEditorTool | "|")[][ "bold", "italic", "strike", "link", "|", "heading", "quote", "code", "bullets", "numbers", "|", "attach", "|", "undo", "redo", ]ツールバーに並べるツール。"|"で区切りを入れる。
placement"top" | "bottom""top"ツールを入力エリアの上(コメントなど、既定)と下(返信・日記など)のどちらに置くか。
editorChild入力エリアの代わりに置くエディター(リッチテキストエディターが描くcontenteditableの要素)。渡さなければtextareaを置く。ツールバーのidは${id}-toolbar。エディターとのつなぎ方は、下のTextEditorの説明を参照。
actionsChildツールバーの末尾に置く操作(送信・下書きの保存など)。

ほかに、<textarea>へ標準のHTML属性を渡せます。

登録するcontroller:toolbar(ToolbarController)

読み込むCSS:layers.css、reset.css、tokens.css、base.css、layout.css、components/button.css、components/icon.css、components/text-editor.css

TextEditorTool

値:| "bold" | "italic" | "strike" | "link" | "heading" | "quote" | "code" | "bullets" | "numbers" | "attach" | "undo" | "redo"

コード

HTML
Hono JSX