コンポーネント一覧
ComboBox
選択肢が 20 件を超えるならこちら。値が決まっていて自由入力を許したくないなら Select、一覧に無い値も受けるなら allowsCustomValue。
デモ
使い分け
こうする
- 選択肢が 20 を超えるときに使う。文字で絞れる
- 一覧に無い値を受けるかどうかを先に決める(allowsCustomValue)
こうしない
- 選択肢が 5 つしかない欄に使わない。Select の方が全部見える
- 一覧に無い値を黙って捨てない。受けないなら errorMessage で伝える
Props
| 名前 | 型 | 説明 |
|---|---|---|
| variant | 'solid' | 'outline' | 'soft' | 'ghost' | 'plain' | |
| size | 'sm' | 'md' | 'lg' | |
| radius | 'none' | 'sm' | 'md' | 'lg' | 'full' | |
| label | ReactNode | |
| placeholder | string | |
| description | ReactNode | |
| errorMessage | ReactNode | `isInvalid` のときに表示する。色だけに頼らずテキストを必ず伴う(WCAG 1.4.1) |
| name | string | |
| selectedKey | string | null | |
| defaultSelectedKey | string | |
| onSelectionChange | (key: string | null) => void | |
| inputValue | string | 入力欄の文字列。制御したい場合に使う |
| defaultInputValue | string | |
| onInputChange | (value: string) => void | |
| allowsCustomValue | boolean | 一覧に無い文字列をそのまま値として残す。既定は選択肢に戻す |
| menuTrigger | 'focus' | 'input' | 'manual' | 一覧を開くきっかけ。既定は `input`(文字を打つと開く) |
| onOpenChange | (isOpen: boolean) => void | 開閉の通知。開閉そのものは制御できない(React Aria の ComboBox は入力とキー操作から 開閉を導くため)。開きたいときは `menuTrigger="focus"` を使う |
| onKeyDown | KeyboardEventHandler<HTMLInputElement> | 入力欄のキー操作。**IME 変換中のキーはここに届かない**(テーマが core の `useImeSafeKeys` を通す)。 |
| isDisabled | boolean | |
| isReadOnly | boolean | |
| isRequired | boolean | |
| isInvalid | boolean | |
| children | ReactNode | |
| classNames | ClassNames<typeof comboBoxSlots> |
Slot
構成部位に data-slot が出力されます。 CSS の上書きやテストはこれを狙ってください。
- root必須
- label
- inputWrapper必須
- input必須
- trigger
- icon
- popover必須
- listbox必須
- option必須
- description
- errorMessage
アクセシビリティ
| キー | 動作 |
|---|---|
| 文字を打つ | 絞り込んで開く |
| ↓ ↑ | 開いて項目を移動 |
| Enter | 決定 |
| Escape | 閉じる |
- 入力欄は `role="combobox"`、一覧は `role="listbox"`。ArrowDown で開いて項目を移動、 Enter で決定、Escape で閉じる。IME 変換中の Enter と矢印キーは抑制される。 `description` と `errorMessage` は `aria-describedby` で関連付く
- キーボードだけで操作できます。フォーカスリングはコントラスト比 3:1 以上です。
- 本文のコントラスト比は light / dark とも 4.5:1 以上を検査で保証しています。
prefers-reduced-motionが有効なときはアニメーションを行いません。