Vercel の UI SDK 0.1.0-beta.2 上に構築。API は変わる可能性があります。
Segmented control
Vercel の UI SDK で作るセグメントコントロール。スライドするインジケーター、3 つのサイズ、アイコンだけの項目、全幅、縦並び、ラジオグループのキー操作を備えます。
- フォームのコンポーネント
- 2 個のパーツ
- 10 個の例
@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-segmented-control.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @ui-sdk/react@0.1.0-beta.2 @ui-sdk/core@0.1.0-beta.2 cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/ui-sdk-segmented-control.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
UI SDK は ui-sdk というカスケードレイヤーに少しだけ独自の CSS を追加します。自分のクラスが優先されるよう、グローバルスタイルシートの先頭、Tailwind の import より上でこのレイヤーを宣言してください。
セグメントコントロールは、いくつかの表示や設定を切り替えます。値が 1 つでタブ停止も 1 つのラジオグループとして動き、選択中の項目の後ろにあるインジケーターが次の選択へスライドします。aria-label か aria-labelledby で名前を付けてください。UI SDK は 0.1.0-beta.2 でこれを実験的としています。
インジケーターはコントロールが自分で描くので、項目を追加するだけです。
アイコンだけの項目は正方形になります。aria-label で名前を付けてください。
value を渡し、onValueChange で更新します。createSegmentedControlController() のコントローラーを使えば、どこからでも項目を選択できます。
各項目は隠れたネイティブのラジオを持つので、name で選択中の値を送信し、required で選択を待ち、リセットで既定値に戻ります。
読み取り専用のコントロールは値を保ったまま送信されます。矢印キーは何も選択せずにフォーカスだけを動かします。
項目は右から並び、インジケーターもそれに従います。
| キー | アクション |
|---|---|
| Tab | コントロールに入り、選択中の項目か最初の有効な項目に移動します。 |
| ←→↑↓ | 前後の項目に移動して選択し、無効な項目は飛ばします。loop が false でなければ端で一周します。 |
| Space | フォーカス中の項目を選択します。 |
| Enter | フォームを送信します。 |
コントロールはラジオグループで各項目はラジオなので、スクリーンリーダーは選択とその位置を読み上げます。インジケーターは装飾で、スクリーンリーダーは読み飛ばします。
インジケーターはページが操作できるようになってからスライドするので、読み込み時にアニメーションせず、動きを減らす設定ではスライドしません。強制カラーでは選択中の項目に見える枠線が残ります。
各パーツは同名の UI SDK パーツをラップし、render やパーツの状態を受け取る関数にもできる className を含むすべての props を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
value | T | null | – |
defaultValue | T | null | – |
onValueChange | (value: T | null, details) => void | – |
size | "sm" | "default" | "lg" | "default" |
orientation | "horizontal" | "vertical" | "horizontal" |
loop | boolean | true |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllercreateSegmentedControlController() で作ります。 | SegmentedControlController | – |
render | ReactElement | (props, state) => ReactElement | – |
| 属性 | 説明 |
|---|---|
data-slot="segmented-control" | CSS でセグメントコントロールを指定するためのものです。 |
data-size | サイズ:sm、default、lg。 |
data-orientation | horizontal または vertical。 |
data-disabled | 無効のときに存在します。 |
data-readonly | 読み取り専用のときに付与されます。 |
data-required | 必須のときに付与されます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
value | string | – |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | – |
| 属性 | 説明 |
|---|---|
data-slot="segmented-control-item" | CSS で項目を指定するためのものです。 |
data-checked | 選択中の項目に付きます。 |
data-unchecked | 他の項目に付与されます。 |
data-icon-only | 項目がアイコンだけのときに付きます。 |
data-disabled | 無効のときに存在します。 |
- Calendar単一、範囲、複数選択に対応する日付グリッドです。月のスライド、範囲のプレビュー、タッチしやすいサイズの日付セルを備えています。
- Checkboxチェックが描かれるように表示されるチェックボックスです。中間状態の親、グループ、ホバーを共有するラベルに対応します。
- Comboboxチップ、グループ、非同期の結果に対応した、絞り込み可能なセレクトです。入力に合わせてポップアップのサイズが変わります。
- Date picker押すとポップオーバーでカレンダーを開くボタンです。スマートフォンではボトムシートになり、単一の日付も範囲も選べます。
- Fieldコントロールに紐付いたラベル、説明、エラーです。バリデーション状態とフォーム向けのレイアウトを備えています。
- Input3つのサイズ、無効状態と読み取り専用状態、ネイティブのバリデーションスタイル、スマートフォンでズームされない16pxのタッチ用フォントを備えたテキスト入力です。