Vercel の UI SDK 0.1.0-beta.1 上に構築。API は変わる可能性があります。
Date picker
Vercel の UI SDK 上の日付ピッカー。自分の言語で日付を入力するか選べて、範囲、プリセット、ISO 値に対応します。
- フォームのコンポーネント
- 18 個のパーツ
- 9 個の例
@tabler/icons-react@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-date-picker.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 cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/ui-sdk-date-picker.tsx components/ui/button.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
UI SDK は ui-sdk というカスケードレイヤーに少しだけ独自の CSS を追加します。自分のクラスが優先されるよう、グローバルスタイルシートの先頭、Tailwind の import より上でこのレイヤーを宣言してください。
値は 2026-11-20 のような時刻もタイムゾーンもない ISO 日付文字列なので、日付ライブラリは不要です。11/20/2026 や 20.11.2026 のように各自の並びで入力でき、Enter を押すか入力欄を離れると日付が整形されます。子要素のない DatePickerContent はスタイル付きのカレンダーを表示します。
mode="range" では end を付けた 2 つ目の入力欄を追加します。カレンダーは 1 つ目の日付の後も開いたままで、2 つ目で閉じます。months={2} は 2 か月を横に並べ、小さな画面では縦に重ねます。
DatePickerPreset は自分の value を選んでポップアップを閉じます。その値が選択されている間は押された状態で表示されます。
min、max、unavailable は入力と選択の両方に適用されます。この例では週末と 2 つの祝日を選べず、入力するとエラーになります。
locale は入力形式、ヒント、カレンダーの名前を決めます。指定しないとページの lang を読みます。ボタンの名前は英語なので、翻訳するには aria-label を渡します。
name を付けると日付は ISO 文字列として送信されます。required は空の送信を止め、日付でない文字も送信を止めます。リセットすると defaultValue に戻ります。
createDatePickerController() のコントローラーで、どこからでも日付を設定したりカレンダーを開いたりでき、onValueChange が変更を毎回知らせます。カレンダーがコントローラーの選んだ月へ移れるよう、ここでは value を指定しません。
disabled は入力も開くことも止めます。readOnly はカレンダーを開いて見られますが、何も変更できません。
dir=rtl 内でアラビア語ロケールを使うと、入力欄、矢印、カレンダーがすべて右から並びます。
| キー | アクション |
|---|---|
| Enter | 入力欄では入力した日付を読み取り、日付の上ではその日を選びます。 |
| ←→↑↓ | 日ごとに移動し、上下では 1 週間ずつ移動します。 |
| Page UpPage Down | 1 か月前後に移動します。 |
| HomeEnd | 週の最初または最後に移動します。 |
| Esc | 未完成の範囲を取り消し、なければカレンダーを閉じます。 |
カレンダーは日のグリッドを持つダイアログとして開き、各日は「Friday, November 20, 2026」のように省略せずに読み上げられます。ヒントが入力欄を説明するので、スクリーンリーダーで入力形式が聞こえます。日付でない文字は aria-invalid を設定して以前の値を保ち、選べない日もフォーカスできるのでキーボード利用者にも読み上げられます。
トリガー、ポップアップ、矢印の名前は英語です。翻訳するにはそれぞれに aria-label を渡します。iOS が拡大しないよう、タッチ画面では入力欄に 16px のフォントを使い、ポップアップはモーションが許可されているときだけ拡大して表示されます。
各パーツは同名の UI SDK パーツをラップし、render や、パーツの状態を受け取る関数にもできる className を含むすべての props を受け付けます。DatePickerControl、DatePickerSeparator、DatePickerCalendar は HextaUI のレイアウト用パーツです。
| プロパティ | 型 | デフォルト |
|---|---|---|
mode | "single" | "range" | "single" |
value | string | [string, string] | null | – |
defaultValue | string | [string, string] | null | – |
onValueChange | (value, details) => void | – |
min | string | – |
max | string | – |
unavailableISO 日付、{ from, to }、{ weekday }、{ before }、{ after }、または関数。 | DateMatchers | – |
months | number | 1 |
pageBy | "month" | "page" | "month" |
locale | string | – |
weekStartsOn | number | – |
minDays | number | – |
maxDays | number | – |
closeOnSelect | boolean | true |
disabled | boolean | false |
readOnly | boolean | false |
name | string | – |
startName | string | – |
endName | string | – |
required | boolean | false |
open | boolean | – |
onOpenChange | (open, details) => void | – |
controllercreateDatePickerController() で作成します。 | DatePickerController | – |
| 属性 | 説明 |
|---|---|
data-slot="date-picker" | CSS で日付ピッカーを対象にします。 |
data-open | 開いている間存在します。 |
data-invalid | 入力欄に日付ではない文字があるあいだ付きます。 |
data-disabled | 無効のときに存在します。 |
data-readonly | 読み取り専用のときに付与されます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
end範囲の終わりにします。 | boolean | false |
| プロパティ | 型 | デフォルト |
|---|---|---|
children既定はカレンダーアイコンです。 | ReactNode | – |
aria-label | string | "Choose date" |
| プロパティ | 型 | デフォルト |
|---|---|---|
children既定は Clear という名前の X アイコンです。消すものがない間は隠れます。 | ReactNode | – |
| プロパティ | 型 | デフォルト |
|---|---|---|
children既定は DatePickerCalendar です。 | ReactNode | – |
align | Align | "start" |
sideOffset | number | 6 |
collisionPadding | number | 8 |
| 属性 | 説明 |
|---|---|
data-slot="date-picker-content" | CSS でポップアップを指定するときに使います。 |
--cell-size | 各日のサイズ。タッチ画面では大きくなります。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
months横に並べて表示するグリッドの数。 | number | 1 |
| プロパティ | 型 | デフォルト |
|---|---|---|
value | string | [string, string] | – |
render | ReactElement | (props, state) => ReactElement | – |
| 属性 | 説明 |
|---|---|
data-slot="calendar-day" | CSS で日を対象にします。 |
data-today | 今日の日付に付きます。 |
data-range-start | 範囲の始まりに付きます。 |
data-range-end | 範囲の終わりに付きます。 |
data-unavailable | 選べない日に付きます。 |
data-outside | 前月または翌月の日に付きます。 |
- Buttonすべてのバリアントとサイズのボタンです。読み込み、成功、エラーのフローを内蔵し、高速なリクエストではスピナーを省略します。
- Calendar単一、範囲、複数選択に対応する日付グリッドです。月のスライド、範囲のプレビュー、タッチしやすいサイズの日付セルを備えています。
- Checkboxチェックが描かれるように表示されるチェックボックスです。中間状態の親、グループ、ホバーを共有するラベルに対応します。
- Comboboxチップ、グループ、非同期の結果に対応した、絞り込み可能なセレクトです。入力に合わせてポップアップのサイズが変わります。
- Date picker押すとポップオーバーでカレンダーを開くボタンです。スマートフォンではボトムシートになり、単一の日付も範囲も選べます。
- Fieldコントロールに紐付いたラベル、説明、エラーです。バリデーション状態とフォーム向けのレイアウトを備えています。