Date picker
押すとポップオーバーでカレンダーを開くボタンです。スマートフォンではボトムシートになり、単一の日付も範囲も選べます。
pnpm dlx shadcn@latest add https://hextaui.com/r/date-picker.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cn react-day-picker次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/date-picker.tsx components/ui/calendar.tsx components/ui/popover.tsx components/ui/sheet.tsx components/ui/button.tsx lib/motion.ts インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
640px より狭い画面では、カレンダーはポップオーバーではなくボトムシートで開くため、日付はタップしやすい大きさに保たれます。
制御
value と onValueChange を渡します。クリアされた値は null です。カレンダーは常に選択された日付の月で開き、日付を選ぶと閉じてフォーカスがボタンに戻ります。
範囲
<DateRangePicker /> は、大きな画面では 2 か月分を表示します。最初のクリックは、すでに範囲が設定されていても常に新しい範囲を開始し、2 回目のクリックは、どちらの順序でも範囲を確定してピッカーを閉じます。
無効な日
calendarProps.disabled に、react-day-picker の任意のマッチャーを渡します。この例では、未来の平日だけを選べます。
月と年のドロップダウン
誕生日のように遠い日付には、startMonth と endMonth を指定した captionLayout: "dropdown" を設定します。トリガーには、その id を指す <label /> でラベルを付けます。
フォーム内
name を指定すると、単一の日付は 2026-10-14、範囲は 2026-10-20/2026-10-24 の形式で送信されます。空のピッカーは空文字列を送信します。
無効
無効なトリガーでも、値を表示できます。
狭いコンテナ
トリガーがコンテナを超えて広がることはありません。長いラベルは折り返されず、省略されます。
シートの中
ピッカーはシートの上に重なり、Escape はピッカーだけを閉じます。
右から左
トリガーのラベル用に locale を、カレンダー用に calendarProps で dir: "rtl" を持つ react-day-picker のロケールを渡します。矢印キーは方向に従います。
| キー | アクション |
|---|---|
| EnterSpace | トリガーでは、ピッカーを開き、選択された日または今日にフォーカスします。日付では、その日を選択します。 |
| ←→ | 前日または翌日に移動します。 |
| ↑↓ | 前週または翌週の同じ曜日に移動します。 |
| Page UpPage Down | 前月または翌月に移動します。 |
| ShiftPage Up | 前年に移動します。Shift Page Down で翌年に移動します。 |
| HomeEnd | 週の最初または最後に移動します。 |
| Esc | ピッカーを閉じ、フォーカスをトリガーに戻します。 |
- ポップオーバーには
titleでラベルが付き、ボトムシートではそれが見出しとして表示されます。placeholderとあわせて翻訳してください。 - トリガー自体には、表示されるラベルがありません。
<label />と組み合わせるか、aria-labelを渡してください。 - 無効な日はキーボードではスキップされ、利用不可として通知されます。
どちらのピッカーも以下の props を共有し、ポップオーバーまたはボトムシート内の <Calendar /> を開く <Button /> のトリガーをレンダリングします。
| プロパティ | 型 | デフォルト |
|---|---|---|
value | Date | null | – |
defaultValue | Date | null | null |
onValueChange | (value: Date | null) => void | – |
placeholder | string | "Pick a date" |
titleポップオーバーのアクセシブルな名前、およびシートの見出し。 | string | "Select a date" |
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean) => void | – |
localeトリガーのラベルを Intl.DateTimeFormat で整形します。カレンダーも翻訳するには、calendarProps に react-day-picker のロケールを渡します。 | string | "en-US" |
clearable値が設定されると、カレンダーの下に Clear ボタンを追加します。 | boolean | false |
clearLabel | string | "Clear" |
name非表示の input をレンダリングし、値をフォームと一緒に送信します。 | string | – |
calendarPropsmode、selected、onSelect、required、numberOfMonths、autoFocus を除き、カレンダーに渡されます。無効な日、captionLayout、startMonth、endMonth、locale、dir に使います。 | CalendarProps | – |
variantトリガーは Button で、その他の props も受け付けます。 | Button variant | "outline" |
disabled | boolean | false |
classNameデフォルトで w-60 のトリガーに適用されます。 | string | – |
| プロパティ | 型 | デフォルト |
|---|---|---|
value | { from: Date; to?: Date } | null | – |
defaultValue | { from: Date; to?: Date } | null | null |
onValueChange2 日目が選ばれたときに呼ばれます。 | (value: DateRange | null) => void | – |
placeholder | string | "Pick a date range" |
title | string | "Select dates" |
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean) => void | – |
localeトリガーのラベルを Intl.DateTimeFormat で整形します。カレンダーも翻訳するには、calendarProps に react-day-picker のロケールを渡します。 | string | "en-US" |
clearable値が設定されると、カレンダーの下に Clear ボタンを追加します。 | boolean | false |
clearLabel | string | "Clear" |
name非表示の input をレンダリングし、値をフォームと一緒に送信します。 | string | – |
calendarPropsmode、selected、onSelect、required、numberOfMonths、autoFocus を除き、カレンダーに渡されます。無効な日、captionLayout、startMonth、endMonth、locale、dir に使います。 | CalendarProps | – |
variantトリガーは Button で、その他の props も受け付けます。 | Button variant | "outline" |
disabled | boolean | false |
classNameデフォルトで w-60 のトリガーに適用されます。 | string | – |
| 属性 | 説明 |
|---|---|
data-slot="date-picker-trigger" | トリガーボタン。 |
data-empty | 値がない間、トリガーに付与されます。プレースホルダーを控えめな色のテキストで表示します。 |
data-popup-open | ピッカーが開いている間、トリガーに付与されます。 |
data-slot="date-picker-content" | カレンダーをポップオーバーまたはシートで包みます。 |
data-slot="date-picker-clear" | Clear ボタン。 |
- Buttonすべてのバリアントとサイズのボタンです。読み込み、成功、エラーのフローを内蔵し、高速なリクエストではスピナーを省略します。
- Calendar単一、範囲、複数選択に対応する日付グリッドです。月のスライド、範囲のプレビュー、タッチしやすいサイズの日付セルを備えています。
- Popoverトリガーにアンカーされたフローティングパネル。コンテンツに合わせてなめらかにサイズが変わり、トリガーの方向に従います。
- Sheet任意の端からスライドインするパネルです。スワイプで閉じる操作、スクロールロック、重なる入れ子に対応します。
- Checkboxチェックが描かれるように表示されるチェックボックスです。中間状態の親、グループ、ホバーを共有するラベルに対応します。
- Comboboxチップ、グループ、非同期の結果に対応した、絞り込み可能なセレクトです。入力に合わせてポップアップのサイズが変わります。
使用しているブロック
Date picker の上に構築されるブロック。