Vercel の UI SDK 0.1.0-beta.1 上に構築。API は変わる可能性があります。
Rating
Vercel の UI SDK 上の星評価。全星・半星、ホバー時のプレビュー、読み取り専用の平均値、フォーム対応を備えます。
- フォームのコンポーネント
- 2 個のパーツ
- 10 個の例
@tabler/icons-react@ui-sdk/core@ui-sdk/reactclass-variance-authority
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-rating.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/ui-sdk-rating.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
UI SDK は ui-sdk というカスケードレイヤーに少しだけ独自の CSS を追加します。自分のクラスが優先されるよう、グローバルスタイルシートの先頭、Tailwind の import より上でこのレイヤーを宣言してください。
Rating は子を星ごとに 1 回描画するので、中に RatingItem を 1 つ置きます。各星は空の星に --rating-fill で切り抜いた塗りの星を重ねるため、半星や 4.3 のような平均も正確に表示されます。
読み取り専用の評価は getValueLabel で名前が付く 1 枚の画像で、平均値のような任意のスコアを表示します。
deselectable を指定すると、選択中の星をもう一度押してスコアを消せます。
value と onValueChange を渡します。null はまだスコアがないことを表します。createRatingController() のコントローラーでどこからでもスコアを設定できます。
name を付けるとスコアがフォームと一緒に送信されます。required はスコアが入るまで、ブラウザー標準のメッセージで送信を止めます。
独自のアイコンを RatingItem の子として渡し、data-filled で切り替えます。tone で色を設定します。
星は右から並び、半星は右端から塗られます。
| キー | アクション |
|---|---|
| Tab | 評価に移動し、選択中の星か最初の星にフォーカスします。 |
| ←→↑↓ | 次または前のスコアに移動して選択します。loop を指定しない限り端で止まります。 |
| Space | フォーカス中の星を選択します。選択済みで解除可能な評価の場合は解除します。 |
| Enter | フォームを送信します。 |
評価はタブ移動先が 1 つのラジオグループです。各星は選べるスコアごとにラジオを持ち、getValueLabel で名前が付くので、「最高、5 点中 5 点」のように普段の言葉で名付けます。星のアイコンはスクリーンリーダーから隠されます。読み取り専用の評価は 1 枚の画像になります。
モーションが許可されている場合のみ、星はホバーで大きくなり、押すと縮みます。タッチ画面では各星に余白が追加され、強制カラーモードでは塗られた星が文字色、空の星がシステムのグレーになります。
各パーツは同名の UI SDK パーツをラップし、render やパーツの状態を受け取る関数にもできる className を含むすべての props を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
value | number | null | – |
defaultValue | number | null | – |
onValueChange | (value: number | null, details) => void | – |
max | number | 5 |
step | number | 1 |
size | "sm" | "default" | "lg" | "default" |
tone | "default" | "neutral" | "destructive" | "default" |
deselectable | boolean | false |
readOnly | boolean | false |
disabled | boolean | false |
required | boolean | false |
name | string | – |
loop | boolean | false |
getValueLabel各スコアのラジオと、読み取り専用の評価に名前を付けます。 | (value: number, max: number) => string | – |
controllercreateRatingController() から作成します。 | RatingController | – |
| 属性 | 説明 |
|---|---|
data-slot="rating" | CSS で評価を指定します。 |
data-size | サイズ:sm、default、lg。 |
data-tone | トーン:default、neutral、destructive。 |
data-readonly | 読み取り専用のときに付与されます。 |
data-disabled | 無効のときに存在します。 |
--rating-color | 塗られた星の色。tone で設定します。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
children星のアイコン。既定では --rating-fill に応じて塗られる Tabler の星です。 | ReactNode | – |
render | ReactElement | (props, state) => ReactElement | – |
| 属性 | 説明 |
|---|---|
data-slot="rating-item" | CSS で星を指定します。 |
data-filled | 表示中のスコアが完全に覆う星に付きます。 |
data-partial | 表示中のスコアが一部を覆う星に付きます。 |
data-checked | スコアが終わる星に付きます。 |
data-highlighted | ポインターがプレビューしているスコアまでの星に付きます。 |
--rating-fill | 表示中のスコアが星をどれだけ覆うか(0〜1)。 |
- Calendar単一、範囲、複数選択に対応する日付グリッドです。月のスライド、範囲のプレビュー、タッチしやすいサイズの日付セルを備えています。
- Checkboxチェックが描かれるように表示されるチェックボックスです。中間状態の親、グループ、ホバーを共有するラベルに対応します。
- Comboboxチップ、グループ、非同期の結果に対応した、絞り込み可能なセレクトです。入力に合わせてポップアップのサイズが変わります。
- Date picker押すとポップオーバーでカレンダーを開くボタンです。スマートフォンではボトムシートになり、単一の日付も範囲も選べます。
- Fieldコントロールに紐付いたラベル、説明、エラーです。バリデーション状態とフォーム向けのレイアウトを備えています。
- Input3つのサイズ、無効状態と読み取り専用状態、ネイティブのバリデーションスタイル、スマートフォンでズームされない16pxのタッチ用フォントを備えたテキスト入力です。