OptionalFields

必要な時だけ追加する入力欄と、追加できる項目のチップです。

縦に並べる(検索の条件)
値が入っている項目は最初から出す
右から左に読む場合

使いどころ

  • 予定のリンク・場所・招待・メモ・繰り返しのように、多くの場合は空のままの欄を隠し、必要な時だけ追加してフォームを短く見せる時に使います。
  • 検索の条件を一つずつ追加する列は、layout="stack" でチップを縦に並べます。
  • いつも入力する欄は隠さず Field で並べます。見出しの下の詳しい内容をまとめて開閉する時は Disclosure を使います。

使い方

items の一件ごとに、押すと現れる欄(field)とチップを作ります。追加した欄は上に積み、チップは下に並べます。チップは控えめな Button(平らな白、1px #cccccc の枠、角丸5px、高さ22px、黒い文字)です。stack ではHighriseの人の編集の「Add another」と同じく、チップの枠・面・影と左右の余白を外した灰色の文字にし、文字の頭を欄の名前にそろえます。ホバーすると黒い文字にします。チップを押すとその欄が現れ、チップは消えて、欄の最初の入力へフォーカスが移ります。追加した欄の末尾の「(label)を削除」を押すと、欄を隠してチップへ戻し、チップへフォーカスを移します。削除した欄の入力の値は、もう一度追加すると残っています。

値が入っている項目は open で最初から欄を出し、チップを出しません。保存した値から open を決めるのは利用側です。

欄はそれぞれ fieldset で包み、隠れている間は disabled にします。隠れた欄の入力は送信せず、required でも送信を止めません。送信先は、届かなかった名前を「追加していない項目」として扱います。

OptionalFieldsController を optional-fields として登録します。欄を追加すると optional-fields:add、削除すると optional-fields:remove を出します。

JavaScriptが無い時は、全ての欄を最初から出し、チップと削除の操作は出しません。全ての欄の入力を送信します。controllerが接続すると、open でない欄をチップへ畳みます。

アクセシビリティ

  • チップの並びは role="group" で、label を読み上げ名にします。
  • チップは aria-controls で現れる欄を指し、aria-expanded で欄を出したかを伝えます。押した後はチップが消えるので、欄の最初の入力へフォーカスを移します。
  • 削除の操作はアイコンだけのボタンで、「(label)を削除」を読み上げ名とツールチップにします。押した後は操作が消えるので、戻ったチップへフォーカスを移します。

イベント

OptionalFieldsが発火するイベント
イベント内容
optional-fields:addチップを押して欄を出した後に出します。detailは id(追加した項目の id)です。取り消せません。
optional-fields:remove削除の操作で欄を隠した後に出します。detailは id(削除した項目の id)です。取り消せません。

API

OptionalFields

予定のリンク・場所・招待・メモ・繰り返しや検索の条件のように、必要な時だけ追加する欄。追加できる項目をチップで並べ、押すとその欄が現れてチップは消える。欄の削除操作で元のチップへ戻す。長いフォームを短く見せる。JavaScriptが無い時は全ての欄を出し、チップと削除操作は出さない。

OptionalFieldsのprops
名前型既定値説明
label必須stringチップの並びの読み上げ名(「予定に追加する項目」など)。
items必須readonly OptionalField[]追加できる項目。並べた順にチップと欄を置く。
layout"inline" | "stack""inline"inlineは予定の入力のようにチップを横に並べ(既定)、stackは検索の条件のように縦に並べる。

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

登録するcontroller:optional-fields(OptionalFieldsController)

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

OptionalField

OptionalField
名前型既定値説明
id必須string項目のid。欄の置き場は<id>-slotになり、optional-fields:addのdetail.idで返る。画面内で一意にする。
label必須stringチップに出す項目名。
iconIconNameチップの名前の前に置くアイコン。省略するとplus。
field必須Child押した時に現れる欄。隠れている間は中の入力を使えなくし、送信しない。
openboolean最初から出しておく(値が入っている時など)。

IconName

値:Iconの見本

コード

HTML
Hono JSX