Select
現在の値の位置で開くリストから、1つ以上の option を選びます。先頭文字検索、グループ、フォームに対応しています。
pnpm dlx shadcn@latest add https://hextaui.com/r/select.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/select.tsx lib/motion.ts インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
リストはトリガーの真上に開き、現在の option が値の上に重なるので、視線が位置を見失いません。SelectValue が生の値ではなくラベルを表示するよう、items を渡します。検索が必要な長いリストには Combobox を使います。
サイズ
SelectTrigger の size は、Input と Button の高さに合います。
グループと長いリスト
SelectGroup と SelectLabel で option をグループ化します。長いリストは画面に収まり、ホバーするとスクロールする矢印が表示されます。
アイコンつき
項目にアイコンを入れ、SelectValue に関数を渡すと、トリガーにも同じアイコンを表示できます。
複数
multiple では、選択中もリストが開いたままで、値は長い選択内容を要約できます。
フォーム内
Field の内側では、トリガーにラベル、説明、必須バリデーションが付きます。
無効と不正
select 全体または個別の option を無効にし、aria-invalid で無効(invalid)な状態にします。
トリガーの下
alignItemWithTrigger={false} は、メニューのようにトリガーの下にリストを開きます。タッチ入力では自動的にこの動作になります。
右から左
トリガー、リスト、チェックは文字の読み方向に従います。
| キー | アクション |
|---|---|
| SpaceEnter↓↑ | トリガーからリストを開きます。 |
| ↓↑ | option 間を移動します。 |
| HomeEnd | 最初または最後の option に移動します。 |
| A–Z | 入力したテキストで始まる次の option にジャンプします。 |
| EnterSpace | ハイライトされている option を選びます。 |
| Esc | リストを閉じ、トリガーにフォーカスを戻します。 |
FieldLabelまたはaria-labelでトリガーにラベルを付けます。- タッチ操作では、指が option に触れないよう、リストはトリガーに重ならず下に開きます。
| プロパティ | 型 | デフォルト |
|---|---|---|
value | Value | Value[] | null | – |
defaultValue | Value | Value[] | null | – |
onValueChange | (value, details) => void | – |
itemsSelectValue がラベルを表示できるようにします。 | Record<string, ReactNode> | { value, label }[] | – |
multiple | boolean | false |
name | string | – |
required | boolean | false |
disabled | boolean | false |
readOnly | boolean | false |
open | boolean | – |
onOpenChange | (open, details) => void | – |
| プロパティ | 型 | デフォルト |
|---|---|---|
size | "sm" | "default" | "lg" | "default" |
render | ReactElement | (props, state) => ReactElement | <button> |
| 属性 | 説明 |
|---|---|
data-slot="select-trigger" | トリガー。data-size を持ちます。 |
data-popup-open | リストが開いている間付きます。 |
data-placeholder | 何も選ばれていない間付きます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
placeholder | ReactNode | – |
children表示される値をフォーマットします。 | ReactNode | (value) => ReactNode | – |
| プロパティ | 型 | デフォルト |
|---|---|---|
alignItemWithTrigger現在の option を揃えて、トリガーの上に重ねて開きます。 | boolean | true |
sideトリガーに揃えていないとき。 | "top" | "bottom" | … | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 6 |
| 属性 | 説明 |
|---|---|
data-slot="select-content" | ポップアップ。 |
data-side="none" | トリガーの上に揃えている間付きます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
value | Value | – |
disabled | boolean | false |
label先頭文字検索用のテキスト。 | string | – |
| 属性 | 説明 |
|---|---|
data-selected | 選択されている option。 |
data-highlighted | フォーカスされている option。 |
data-disabled | その option は無効です。 |
- Calendar単一、範囲、複数選択に対応する日付グリッドです。月のスライド、範囲のプレビュー、タッチしやすいサイズの日付セルを備えています。
- Checkboxチェックが描かれるように表示されるチェックボックスです。中間状態の親、グループ、ホバーを共有するラベルに対応します。
- Comboboxチップ、グループ、非同期の結果に対応した、絞り込み可能なセレクトです。入力に合わせてポップアップのサイズが変わります。
- Date picker押すとポップオーバーでカレンダーを開くボタンです。スマートフォンではボトムシートになり、単一の日付も範囲も選べます。
- Fieldコントロールに紐付いたラベル、説明、エラーです。バリデーション状態とフォーム向けのレイアウトを備えています。
- Input3つのサイズ、無効状態と読み取り専用状態、ネイティブのバリデーションスタイル、スマートフォンでズームされない16pxのタッチ用フォントを備えたテキスト入力です。
使用しているブロック
Select の上に構築されるブロック。
- API keysOpenAIやAnthropicのコンソールのような、AIプロダクトのAPIキーのページです。スコープ付きの権限と有効期限を持つキーを作成し、シークレットは一度だけ表示され、コピーで確認でき、取り消しは元に戻せ、その場で名前を変更でき、猶予期間つきでローテーションでき、キーごとの使用量を確認できます。
- NotificationsAIプロダクトの設定にある通知セクションです。行、列、すべてを切り替えられるチャンネルとイベントのグリッド、次の静音時間をリアルタイムで示す静音時間、メールダイジェスト、デスクトップ、メール、プッシュ、Slackの実際のテスト送信、ブラウザー権限の処理、Slackの接続フローを備えています。どの設定セクションにも組み込めます。