Field

ラベル・入力欄・補足・エラーを関連付けます。

一覧に表示します。

名前を入力してください。

入力・選択のほかの状態

説明を入力してください。

表示状態を選んでください。

文字数の上限を超えています。

1〜100部。PageUp・PageDownで10部ずつ変更できます。

2026年の日付を選べます。

9:00〜18:00、30分単位です。

値を変更すると、確定した値をここに表示します。

入力欄か右の矢印を押すと候補が開きます。候補を押して選べます。

チェックの状態
複数選択・全選択
項目がない設定

選択肢はありません。

重複した候補の整理
連絡方法
変更できない連絡方法
利用場所

使いどころ

  • ラベルの付いた一つの入力を置く時は、入力を Field で包みます。ラベル・補足・エラーの位置と読み上げの関連付けを Field が持ちます。
  • 一行の文字は Input、改行を含む長い文は Textarea、上限のある文は CountedTextarea、パスワードは PasswordField を使います。
  • 決まった少数の選択肢から一つを選ぶ時は、全て見せてよければ Choice の type="radio"、場所を取りたくなければ Select を使います。
  • 選択肢が多く探して選ぶ時は Picker、自由入力に候補を添える時は Suggestion を使います。打った文字で絞り込まず、候補の一覧を開いて選ぶだけでよい時は Combobox を使います。
  • 一つのオン・オフは Choice(同意などの確認)か Switch(設定のオン・オフ)、複数を選ぶ時は CheckboxGroup を使います。全て選択が要らない短いグループは Choice を fieldset.rx-choice-group に並べます。
  • 数は NumberField、日付は DateField、時刻は TimeField を使います。単位や接頭辞を添える時は InputGroup、カレンダーから日付や期間を選ぶ時は DatePicker、開始と終了の日時は DateTimeRange を使います。
  • 連続する数値をおおよそで決める時は Range、3〜8個の決まった値から選ぶ時は Dial を使います。

使い方

Field の children は関数です。受け取った属性(id・aria-describedby・aria-invalid・data-invalid)を入力の要素へ展開します。PasswordField・CountedTextarea・Combobox・NumberField・DateField・TimeField へ展開すると、中の入力に付きます。id は画面内で一意にします。

ラベルは12pxの太字で入力の上に置きます。help は入力の下の灰色の小さな補足(11px)、error は直す所を書くエラー文です。error を渡すと入力の枠を赤にし、欄のすぐ下にアイコンと赤い12pxの文でエラーを出して、aria-invalid を付けます。現在値を補足へ置かず、入力の値として見せます。status はラベルの行の終わりに保存の状態などを並べます。

Input・Textarea・Select は標準の要素に rx-input を付けたもので、属性をそのまま渡します。一行の Input は白い面に1px #dedede の枠、角丸2px、内側の影なしで、高さ24px・12pxの黒い文字です(data-size="large" は14pxの文字で高さ32px)。Textarea は1px #c1c1c1 の枠と角丸5pxで、本文と同じ13pxの文字です。一つを選ぶ Select は、手本のMacのポップアップボタンを測って描いた、白から薄い灰色へ中ほどで段の付く縦の塗りと1pxの灰色の枠(角丸4px)、末尾の上下の矢印の高さ22pxの欄です。フォーカスすると枠を青にし、外側に淡い青の輪を広げます。readonly は面を淡い灰色にして値を読めるままにし、disabled は形と面をそのままにして文字だけを灰色にします。Choice は label で包んだチェックボックスかラジオボタンで、どちらも手本のMacの標準の部品を測って描いた14pxの大きさで置きます(灰色の枠と縦の塗り。選ぶと淡い青の塗りに紺の縁と紺の印)。kind="option" は説明を伴う選択肢を1px #ececec の枠で囲んだ白い面(角丸3px)に載せ、ホバーすると枠を濃くし、選ぶと枠を紺、面を淡い青(#ddeefe)にします。Choice のグループは fieldset.rx-choice-group の div.list に並べ、legend で名前を付けます。

PasswordField は右端の灰色の目のアイコン(ホバーすると淡い青の面に青緑)で、入力を伏せ字と文字の表示で切り替えます。フォームを送信した時とリセットした時は伏せ字に戻します。PasswordFieldController を password-field として登録します。

CountedTextarea は入力の下の末尾側に、灰色の小さな文字で「12 / 40 文字」の形の文字数を出します。文字数はcontrollerが接続してから出します。limit を超えても入力は止めず、overflowMessage を出して入力を無効な状態にし、フォームの送信を止めます。数えるのはUTF-16の単位の長さです。CharacterCountController を character-count として登録します。

Combobox は自由に入力できる欄に、候補の一覧を添えます。欄か右の矢印を押すと一覧が開き、候補を選ぶと値が欄に入って一覧を閉じます。一覧は白いパネル(1px #bbb の枠、角丸5px、外への柔らかい影)で、ホバーした候補とキーボードで移った候補を角の無い淡い青(#ddeefe)に黒い文字にし、選んだ候補は太字にします。打った文字では絞り込みません。readonly・disabled の間は一覧を開きません。ComboboxController を combobox として登録します。候補を選ぶと combobox:change を出し、欄でも打って変えた時と同じく標準の input・change を発火します。開閉の矢印と role="combobox" はcontrollerが接続してから付けます。

CheckboxGroup は先頭に全て選択のチェックボックスを置き、全て選ぶとオン、一部だけの時は中間の状態にします。全て選択は disabled の選択肢を切り替えません。選んだ値は name で一つずつ送信し、全て選択のチェックボックスは送信しません。value が空白だけの選択肢と、重なった値の二つ目以降は出しません。CheckboxGroupController を checkbox-group として登録します。

NumberField・DateField・TimeField は標準の number・date・time の入力で、min・max・step をそのまま使います。値が min・max と等しいとルートの data-state を min・max にし、それ以外は between にします。NumberField は PageUp・PageDown で pageStep 倍のstepだけ動かします。この変更も、矢印キーや打って変えた時と同じく標準の input・change を発火し、number-field:change を出します。それぞれ NumberFieldController を number-field、DateFieldController を date-field、TimeFieldController を time-field として登録します。

入力のCSSは components/field.css にあります。Field の外で入力だけを使う場合も読み込みます。

controllerを登録しない時、またはJavaScriptが無い時は、標準の入力として動きます。PasswordField は切り替えのボタンを出さず、CountedTextarea は文字数を出さず上限でも送信を止めません。Combobox は開閉の矢印の無い一行の入力、CheckboxGroup の全て選択は押しても他を切り替えません。入力の検証は送信先でも行います。

キーボード

Fieldのキーボード操作
キー動作
Space(Choice・CheckboxGroup)標準の操作でオン・オフを切り替えます。ラジオボタンのグループは矢印キーで選び直します。
Enter / Space(PasswordField の切り替えの操作)伏せ字と文字の表示を切り替えます。
↓ / ↑(Combobox)一覧を開き、次・前の候補へ移ります。
Home / End(Combobox の一覧が開いている時)最初・最後の候補へ移ります。
Enter(Combobox の一覧が開いている時)移った候補を選びます。
Escape(Combobox の一覧が開いている時)一覧を閉じます。
PageUp / PageDown(NumberField)pageStep 倍のstepだけ増減します。min・max を超えません。
↑ / ↓(NumberField・DateField・TimeField)標準の操作で値を増減します。

アクセシビリティ

  • ラベルは for で入力と結び、help・error・describedBy のidを aria-describedby に並べます。error がある時は aria-invalid="true" を付けます。
  • エラーは色だけでなく、アイコンと文で示します。何をどう直すかを文で書きます。
  • PasswordField の切り替えの操作は aria-controls で入力を指し、状態に合わせて showLabel・hideLabel を読み上げ名にします。マウスで切り替えた後は入力へフォーカスと選択範囲を戻します。
  • CountedTextarea は文字数を入力の説明として関連付け、超えた時はエラー文も関連付けます。
  • Combobox の欄はcontrollerが接続すると role="combobox" になり、aria-expanded と aria-activedescendant で開閉と移った候補を伝えます。JavaScriptが無い時は標準の一行の入力として読み上げます。toggleLabel・listLabel には何の候補かを含めます。
  • CheckboxGroup は fieldset と legend でグループの名前を伝えます。一部だけ選んだ時の全て選択は中間の状態として読み上げます。

イベント

Fieldが発火するイベント
イベント内容
password-field:beforetoggle表示を切り替える前に出します。取り消せます。detailは visible(切り替え後に見せるか)・previousVisible・reason(pointer か keyboard)です。
password-field:toggle表示を切り替えた後に出します。detailは password-field:beforetoggle と同じです。
combobox:beforechangeCombobox で候補を選ぶ前に出します。取り消せます。detailは value・previousValue・reason です。
combobox:changeCombobox で候補を選んだ後に出します。detailは combobox:beforechange と同じです。
combobox:open / combobox:closeCombobox の一覧をキーボードで開いた・閉じた時に出します。detailは reason(keyboard)です。
checkbox-group:beforechangeCheckboxGroup の選択を変える前に出します。取り消せます。detailは selected(変えた後の値)・previousSelected・reason です。
checkbox-group:changeCheckboxGroup の選択を変えた後に出します。detailは checkbox-group:beforechange と同じです。
number-field:beforechange操作で値が変わり確定する前に出します。取り消すと値を戻します。detailは value(数)・previousValue・reason です。
number-field:change値の変更が確定した後に出します。detailは number-field:beforechange と同じです。
date-field:beforechange / date-field:changeDateField の値の変更の確定前・後に出します。beforechangeは取り消すと値を戻します。detailは value(YYYY-MM-DD)・previousValue・reason です。
time-field:beforechange / time-field:changeTimeField の値の変更の確定前・後に出します。beforechangeは取り消すと値を戻します。detailは value・previousValue・reason です。

API

Field

ラベル・入力・補足・エラーを並べ、読み上げの関連付けを作る。入力そのものはchildrenで描画する。

Fieldのprops
名前型既定値説明
id必須string入力のid。ラベルのforと補足・エラーのidの元になる。画面内で一意にする。
label必須string入力の上に出すラベル。読み上げの名前になる。
helpstring入力の下に出す灰色の小さな補足。入力の説明として読み上げる。現在値は置かない。
errorstring直す所を書くエラー文。渡すと入力をaria-invalidにし、説明として読み上げる。
describedBystring補足・エラーより前に説明として関連付ける、ほかの要素のid。
statusChildラベルの行の末尾に並べる状態(保存の状態やBadgeなど)。
children必須(attributes: ControlAttributes) => Child入力を描画する関数。受け取った属性(ControlAttributes)を入力の要素へ展開する。

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

ControlAttributes

Fieldが入力へ渡す属性。入力の要素へそのまま展開する。

ControlAttributes
名前型既定値説明
id必須stringFieldのid。ラベルのforが指す。
aria-describedbystringdescribedBy・補足・エラーのidを空白で並べたもの。どれも無ければ付かない。
aria-invalid"true"errorがある時だけ"true"。
data-invalid"true"errorがある時だけ"true"。赤い枠線の表示に使う。

Input

一行の入力。標準のinputの属性をそのまま渡す。

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

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

Textarea

複数行の入力。標準のtextareaの属性をそのまま渡し、初期値はchildrenに書く。

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

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

Select

決まった選択肢から選ぶ入力。標準のselectの属性とoptionをそのまま渡す。

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

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

Choice

チェックボックスかラジオボタンと、その名前。残りの属性はinputへ渡す。

Choiceのprops
名前型既定値説明
typeHTMLInputTypeAttribute"checkbox"checkboxは個別のオン・オフ、radioは同じnameの中から一つを選ぶ。
label必須string選択肢の名前。マークの横に出し、labelで包んで押せる範囲にする。
descriptionChild名前の下に添える灰色の小さな説明。渡すと名前を太字にする。
kind"plain" | "option""plain"plainはマークと名前だけ、optionは説明を伴う選択肢を枠で囲んだ白い面に載せ、選ぶと淡い青緑の面と青緑の枠にする。

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

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

PasswordField

表示と非表示を切り替えられるパスワードの入力。残りの属性はinputへ渡す。

PasswordFieldのprops
名前型既定値説明
id必須string入力のid。表示を切り替える操作のaria-controlsが指す。
showLabelstring"パスワードを表示"隠している間の切り替え操作の読み上げ名。
hideLabelstring"パスワードを隠す"見せている間の切り替え操作の読み上げ名。

ほかのpropsはInputへそのまま渡します。

登録するcontroller:password-field(PasswordFieldController)

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

CountedTextarea

文字数と上限を添えた複数行の入力。残りの属性はtextareaへ渡す。

CountedTextareaのprops
名前型既定値説明
id必須string入力のid。文字数(<id>-count)と超過のエラー(<id>-over-error)のidの元になる。
limit必須number文字数の上限。超えても入力は止めず、エラーを出して送信を止める。maxlengthを渡すとそちらを上限にする。
unitstring"文字"「12 / 40」の後に添える単位。
overflowMessagestring"文字数の上限を超えています。"上限を超えた時に出すエラー文。送信を止める時の検証メッセージにも使う。

ほかのpropsはTextareaへそのまま渡します。

登録するcontroller:character-count(CharacterCountController)

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

Combobox

自由に入力でき、候補の一覧からも選べる一行の入力。残りの属性はinputへ渡す。 role="combobox"と開閉の矢印はcontrollerが接続してから付けて出す。

Comboboxのprops
名前型既定値説明
id必須string入力のid。候補の一覧(<id>-options)と各候補のidの元になる。
options必須readonly ComboboxOption[]一覧に出す候補。入力した文字では絞り込まない。
toggleLabelstring"候補を開閉"一覧を開閉する矢印ボタンの読み上げ名。何の候補かを含める。
listLabelstring"候補"候補の一覧の読み上げ名。

ほかのpropsはInputへそのまま渡します。

登録するcontroller:combobox(ComboboxController)

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

ComboboxOption

ComboboxOption
名前型既定値説明
value必須string選んだ時に入力欄へ入る値。候補の中で一意にする。
label必須string候補の一覧に出す文言。
disabledboolean一覧に出すが選べなくする。

CheckboxGroup

複数を選べるチェックボックスのグループと、全て選択のチェックボックス。

CheckboxGroupのprops
名前型既定値説明
name必須string各選択肢のname。選んだ値を同じnameで一つずつ送信する。
legend必須stringまとまりの名前。fieldsetのlegendになる。
options必須readonly CheckboxGroupOption[]選択肢。一つも無い時は「選択肢はありません。」と出し、全て選択も出さない。
selectedreadonly string[][]最初に選んでおく値。
allLabelstring"すべて選択"先頭に置く全て選択の名前。このチェックボックスは送信しない。

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

登録するcontroller:checkbox-group(CheckboxGroupController)

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

CheckboxGroupOption

CheckboxGroupOption
名前型既定値説明
value必須string送信する値。空白だけの値と、重なった値の二つ目以降は出さない。
label必須string選択肢の名前。
descriptionstring名前の下に添える灰色の小さな説明。
disabledboolean使えなくする。全て選択でも切り替えない。

NumberField

数の入力。min・max・stepは標準のまま使い、PageUp・PageDownで大きく動かせる。

NumberFieldのprops
名前型既定値説明
pageStepnumber10PageUp・PageDownで動かすstepの数。正の整数にする(stepが1なら10ずつ動く)。

ほかのpropsはInputへそのまま渡します。

登録するcontroller:number-field(NumberFieldController)

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

DateField

日付の入力。標準のdate入力で、値はYYYY-MM-DD。変更を取り消せるイベントを追加する。

登録するcontroller:date-field(DateFieldController)

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

TimeField

時刻の入力。標準のtime入力で、値はHH:MM(stepによっては秒も)。変更を取り消せるイベントを追加する。

登録するcontroller:time-field(TimeFieldController)

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

コード

HTML
Hono JSX