Composer

本文・添付・送信の操作を、一つの入力エリアにまとめます。

宛先美森 美咲下書きを保存しました

書式の操作と下書きの保存
リッチテキストエディター(ProseMirror・Tiptapの構造)
議事録エディターが送信用の値を持ちます

9月の打ち合わせで決まったこと

  • カテゴリは5つにまとめる
  • 公開は9月30日

次回は10月7日の14時からです。

何も書いていないエディター
メモ
送信中
送信できなかったとき

送信できませんでした。内容を確認して、もう一度送信してください。

狭い場所:操作が折り返す
宛先海外拠点の予約窓口チーム(review-abcdefghijklmnopqrstuvwxyz)下書きを保存しました
右から左へ書く言語
تم حفظ المسودة

使いどころ

  • メッセージ・コメント・返信のように、本文を書いて送る入力エリアを置く時に使います。
  • 書式ツールを並べる時は、TextEditor を editor に入れます。本文の欄を他の項目と並べて入力する通常のフォームでは、Field と Textarea を使います。

使い方

id・label・name・submitLabel を渡します。全体は標準の form で、action・method などの属性はそのまま form に付きます。題名の行に label を置き、その下に本文の欄、下の行に actions と送信ボタンを並べます。Composer 自体は面も影も持たず、本文の欄だけが複数行の入力欄と同じ枠(白い面に1px #c1c1c1、角丸5px、内側の影なし)と、フォーカスした時の青い縁と淡い青の輪を持ちます。

to に宛先(人やチャンネル)、status に下書きの保存などの状態を渡すと、題名の行に並べます。label は本文と同じ大きさ(13px)の太字、宛先は11pxの灰色の文字、状態は末尾側に11pxの茶色の文字で出します。attachments には FileInput や選んだファイルの一覧を渡し、本文の下に置きます。

本文の欄は続けて読む文章の大きさ(14px)で、上下10px・左右14pxの余白を取り、プレースホルダーは灰色(#999)です。最小の高さは3行分で、field-sizing に対応するブラウザでは入力した分だけ伸びます(20行まで)。対応しないブラウザでは rows の行数の高さになります。

busy は送信ボタンを「送信中…」にして押せなくし、二重の送信を防ぎます。error は本文の欄の下に出して欄に関連付けます。送信・下書きの保存・送信後に busy や error を切り替えることは利用側で行います。

editor にリッチテキストの編集コンポーネント(ProseMirror・Tiptapなど)や contenteditable の要素を渡すと、本文の欄と差し替えます。中の入力エリアがどの深さにあっても、本文と同じ文字と行の高さを適用し、囲みに本文の欄と同じ枠とフォーカスの輪を付け(TextEditor を入れた時は TextEditor の枠だけにし)、段落や箇条書きの間を一定の間隔にそろえます。空の contenteditable には data-placeholder の文を薄く出します。この時 name・value・placeholder・rows・required は使わず、送信する値の受け渡しは編集コンポーネントの側で行います。error は本文の欄と同じく編集コンポーネントの下に出し、囲みの枠を赤にします。

controllerは持ちません。JavaScriptが無い時も、標準のフォームとして本文と添付を送信できます。

アクセシビリティ

  • 本文の欄は label を名前にします。editor を渡した時は、label を名前にしたまとまり(role="group")で編集コンポーネントを包みます。入力エリアそのものの名前(aria-label など)は編集コンポーネントの側で付けます。
  • busy の間は form と送信ボタンに aria-busy を付けます。
  • error を渡すと、本文の欄に aria-invalid を付け、誤りの文を aria-describedby に加えます。
  • editor を渡した時は、誤りの文(IDは <id>-body-error)を編集コンポーネントを包むまとまりの aria-describedby にします。入力エリアそのものには、編集コンポーネントの側で aria-invalid="true" と、このIDを指す aria-describedby を付けます。

API

Composer

本文と添付、送信操作の配置。送信先と保存処理は利用側が指定する。

Composerのprops
名前型既定値説明
id必須stringformのID。本文の欄のIDの接頭辞にも使う。
label必須string本文の欄の名前。題名の行の先頭に出す。
name必須string本文を送るフィールドの名前。editorを渡した時は使わない。
valuestring本文の初期値。editorを渡した時は使わない。
placeholderstring本文の欄のプレースホルダー。editorを渡した時は使わない。
rowsnumber4本文の欄の行数。field-sizingに対応しないブラウザでの高さになる。対応するブラウザでは3行分の高さから書いた分だけ伸び(20行まで)、この値は使わない。
requiredboolean本文が空の時に送信を止める。editorを渡した時は使わない。
submitLabel必須string送信ボタンの文言(「送信する」「投稿する」など)。
busybooleanfalse送信中にする。送信ボタンを「送信中…」にして押せなくし、formにaria-busyを付ける。
errorstring本文の欄の下に出すエラー文。本文の欄をaria-invalidにする。 editorを渡した時もエディターの下に出し、<id>-body-errorのIDでエディターを包む要素の説明にする。入力エリアそのもののaria-invalidとaria-describedbyはエディターの側で付ける。
attachmentsChild本文の下に置く添付(FileInputや選んだファイルの一覧など)。
actionsChild下の行の先頭側に並べる操作(添付・書式・下書きの保存など)。送信ボタンは末尾側に置く。
toChild見出しで、名前の隣へ置く宛先(人やチャンネル)。
statusChild見出しの右端に置く状態(下書きの保存など)。
editorChild本文の欄の代わりに置くエディター(リッチテキストエディターやcontenteditableなど)。渡すと本文の文字と入力エリア全体のフォーカスリングはこのエディターに適用し、送信する値の受け渡しもエディターの側で行う。

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

読み込むCSS:layers.css、reset.css、tokens.css、base.css、layout.css、components/button.css、components/field.css、components/icon.css、components/composer.css

コード

HTML
Hono JSX