Native select
ブラウザー標準のselectを、Inputに合わせてスタイルしたものです。控えめなプレースホルダー、Fieldのサポート、あらゆるデバイスでのOSピッカーを備えています。
pnpm dlx shadcn@latest add https://hextaui.com/r/native-select.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/native-select.tsx components/ui/input.tsx components/ui/number-flow.tsx lib/motion.ts インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
空の value を持つ option はプレースホルダーとして働き、何かが選ばれるまで淡い色のテキストで表示されます。ラッパーのサイズを決めるには select に className を指定します(例: w-full)。
グループ
<NativeSelectOptGroup /> は、OS のピッカー内で選択肢を見出しの下にまとめます。
サイズ
サイズ、境界線、フォーカスリング、無効時のスタイルは Input と完全に一致するため、並べたときに揃います。
Field
<Field /> の中では、ラベルと説明が自動で結び付けられ、値の変化に応じてエラーが表示されます。プランを選ばずに送信すると、select が赤くなって一度揺れ、ブラウザーがそこを示します。
無効な値
aria-invalid を設定し、aria-describedby でメッセージを関連付けます。
無効
select 全体、または利用できない個別の option を無効にします。
制御
通常の select と同様に value と onChange を渡します。
長いコンテンツ
選択されたラベルが長い場合は、シェブロンの下に潜り込まず、末尾が省略記号になります。
右から左
シェブロンとパディングが反対側に移ります。
- 単純なリストには Native select を使います。特にスマートフォンでは、OS のピッカーが最も速く、慣れた選択方法です。
- ユーザーが検索する必要がある場合や、選択肢にアイコン、説明、カスタムレイアウトが必要な場合は Combobox を使います。
| キー | アクション |
|---|---|
| Tab | select にフォーカスします。 |
| SpaceEnter | OS のピッカーを開きます。 |
| ↑↓ | 選択を変更するか、開いたピッカー内を移動します。 |
| A–Z | 入力したテキストで始まる option にジャンプします。 |
<NativeSelect /> はすべての select 属性を受け付けます。option のパーツは、それぞれの要素の属性を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
size | "sm" | "default" | "lg" | "default" |
htmlSizeネイティブの size 属性。size は variant に使われているため、名前を変えています。 | number | – |
shakeフォーム送信で無効と判定されたときに一度揺れます。 | boolean | true |
classNameラッパーに適用されるため、コントロール全体のサイズを決めます。 | string | – |
value | string | – |
defaultValue | string | – |
disabled | boolean | false |
required | boolean | false |
| 属性 | 説明 |
|---|---|
data-slot="native-select-wrapper" | ラッパー。data-size を持ちます。 |
data-slot="native-select" | select 要素。 |
data-slot="native-select-icon" | シェブロン。ホバーとフォーカスで濃くなります。 |
data-invalid | 周囲の Field が無効(invalid)なときに付きます。 |
| 属性 | 説明 |
|---|---|
data-slot="native-select-option" | 選択肢。 |
data-slot="native-select-optgroup" | ラベル付きの選択肢グループ。 |
- Input3つのサイズ、無効状態と読み取り専用状態、ネイティブのバリデーションスタイル、スマートフォンでズームされない16pxのタッチ用フォントを備えたテキスト入力です。
- useComposedRef自分の要素へのrefを保持しつつ、親から渡されたrefにもそのまま転送します。
- useInvalidShake送信を試みて無効だったとき、フォームコントロールを揺らします。入力中は揺らしません。
- Calendar単一、範囲、複数選択に対応する日付グリッドです。月のスライド、範囲のプレビュー、タッチしやすいサイズの日付セルを備えています。
- Checkboxチェックが描かれるように表示されるチェックボックスです。中間状態の親、グループ、ホバーを共有するラベルに対応します。
- Comboboxチップ、グループ、非同期の結果に対応した、絞り込み可能なセレクトです。入力に合わせてポップアップのサイズが変わります。
使用しているブロック
Native select の上に構築されるブロック。