Date picker
Un bouton qui ouvre un calendrier dans un popover, ou une bottom sheet sur mobile, pour des dates simples et des plages.
pnpm dlx shadcn@latest add https://hextaui.com/r/date-picker.jsonAjoute le composant, les tokens de thème HextaUI et les composants HextaUI dont il dépend.
Ajoutez les tokens de thème à votre CSS global, si ce n’est pas déjà fait.
Installez les dépendances.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cn react-day-pickerCopiez et collez le code suivant dans votre projet.
components/ui/date-picker.tsx components/ui/calendar.tsx components/ui/popover.tsx components/ui/sheet.tsx components/ui/button.tsx lib/motion.ts Mettez à jour les chemins d’import selon la configuration de votre projet.
Sur les écrans de moins de 640 px, le calendrier s’ouvre dans une bottom sheet au lieu d’un popover, pour que les jours restent assez grands pour être touchés.
Contrôlé
Passez value et onValueChange. Les valeurs effacées sont null. Le calendrier s’ouvre toujours sur le mois de la date sélectionnée, et choisir un jour le ferme et rend le focus au bouton.
Plage
<DateRangePicker /> affiche deux mois sur les grands écrans. Le premier clic démarre toujours une nouvelle plage, même si une plage est définie, et le second la termine dans n’importe quel ordre et ferme le sélecteur.
Jours désactivés
Passez n’importe quel matcher react-day-picker comme calendarProps.disabled. Ici, seuls les jours de semaine à venir peuvent être choisis.
Listes déroulantes du mois et de l’année
Pour les dates éloignées comme une date de naissance, définissez captionLayout: "dropdown" avec un startMonth et un endMonth. Étiquetez le déclencheur avec un <label /> pointant vers son id.
Dans un formulaire
Avec name, une date unique est soumise sous la forme 2026-10-14 et une plage sous la forme 2026-10-20/2026-10-24. Les sélecteurs vides soumettent une chaîne vide.
Désactivé
Un déclencheur désactivé peut quand même afficher une valeur.
Conteneur étroit
Le déclencheur ne dépasse jamais son conteneur. Les libellés longs sont tronqués au lieu de passer à la ligne.
Dans une sheet
Le sélecteur se superpose à la sheet, et Escape ne ferme que le sélecteur.
De droite à gauche
Passez locale pour le libellé du déclencheur et une locale react-day-picker avec dir: "rtl" dans calendarProps pour le calendrier. Les flèches suivent la direction.
| Touche | Action |
|---|---|
| EnterSpace | Sur le déclencheur, ouvre le sélecteur et donne le focus au jour sélectionné, ou à aujourd’hui. Sur un jour, le sélectionne. |
| ←→ | Passe au jour précédent ou suivant. |
| ↑↓ | Passe au même jour de la semaine précédente ou suivante. |
| Page UpPage Down | Passe au mois précédent ou suivant. |
| ShiftPage Up | Passe à l’année précédente. Shift Page Down passe à la suivante. |
| HomeEnd | Passe au début ou à la fin de la semaine. |
| Esc | Ferme le sélecteur et rend le focus au déclencheur. |
- Le popover est étiqueté avec
title, et la bottom sheet l’affiche comme titre. Traduisez-le avecplaceholder. - Le déclencheur n’a pas de libellé visible propre. Associez-le à un
<label />ou passezaria-label. - Les jours désactivés sont ignorés par le clavier et annoncés comme indisponibles.
Les deux sélecteurs partagent les props ci-dessous et rendent un déclencheur <Button /> avec un <Calendar /> dans un popover ou une bottom sheet.
| Prop | Type | Par défaut |
|---|---|---|
value | Date | null | – |
defaultValue | Date | null | null |
onValueChange | (value: Date | null) => void | – |
placeholder | string | "Pick a date" |
titleNom accessible du popover, titre de la sheet. | string | "Select a date" |
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean) => void | – |
localeFormate le libellé du déclencheur avec Intl.DateTimeFormat. Passez une locale react-day-picker dans calendarProps pour traduire aussi le calendrier. | string | "en-US" |
clearableAjoute un bouton Clear sous le calendrier dès qu’il y a une valeur. | boolean | false |
clearLabel | string | "Clear" |
nameRend un champ masqué pour que la valeur soit soumise avec son formulaire. | string | – |
calendarPropsTransmis au calendrier, sauf mode, selected, onSelect, required, numberOfMonths et autoFocus. Utilisez-le pour les jours désactivés, captionLayout, startMonth, endMonth, locale et dir. | CalendarProps | – |
variantLe déclencheur est un Button et accepte aussi ses autres props. | Button variant | "outline" |
disabled | boolean | false |
classNameAppliqué au déclencheur, qui est w-60 par défaut. | string | – |
| Prop | Type | Par défaut |
|---|---|---|
value | { from: Date; to?: Date } | null | – |
defaultValue | { from: Date; to?: Date } | null | null |
onValueChangeAppelé une fois le second jour choisi. | (value: DateRange | null) => void | – |
placeholder | string | "Pick a date range" |
title | string | "Select dates" |
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean) => void | – |
localeFormate le libellé du déclencheur avec Intl.DateTimeFormat. Passez une locale react-day-picker dans calendarProps pour traduire aussi le calendrier. | string | "en-US" |
clearableAjoute un bouton Clear sous le calendrier dès qu’il y a une valeur. | boolean | false |
clearLabel | string | "Clear" |
nameRend un champ masqué pour que la valeur soit soumise avec son formulaire. | string | – |
calendarPropsTransmis au calendrier, sauf mode, selected, onSelect, required, numberOfMonths et autoFocus. Utilisez-le pour les jours désactivés, captionLayout, startMonth, endMonth, locale et dir. | CalendarProps | – |
variantLe déclencheur est un Button et accepte aussi ses autres props. | Button variant | "outline" |
disabled | boolean | false |
classNameAppliqué au déclencheur, qui est w-60 par défaut. | string | – |
| Attribut | Description |
|---|---|
data-slot="date-picker-trigger" | Le bouton déclencheur. |
data-empty | Présent sur le déclencheur tant qu’il n’y a pas de valeur. Affiche le placeholder en texte atténué. |
data-popup-open | Présent sur le déclencheur tant que le sélecteur est ouvert. |
data-slot="date-picker-content" | Enveloppe le calendrier dans le popover ou la sheet. |
data-slot="date-picker-clear" | Le bouton Clear. |
- ButtonDes boutons dans toutes les variantes et tailles, avec un flux de chargement, de succès et d’erreur intégré qui évite le spinner pour les requêtes rapides.
- CalendarUne grille de dates pour la sélection simple, de plage et multiple, avec des mois qui défilent, des aperçus de plage et des jours à taille tactile.
- PopoverUn panneau flottant ancré à un déclencheur, qui se redimensionne en douceur avec son contenu et suit la direction du déclencheur.
- SheetUn panneau qui glisse depuis n’importe quel bord, avec fermeture par balayage, verrouillage du défilement et imbrication empilée.
- CheckboxUne case à cocher dont la coche se dessine, avec des parents indéterminés, des groupes et des libellés qui partagent son survol.
- ComboboxUn select filtrable avec chips, groupes et résultats asynchrones, dans un popup qui se redimensionne pendant la saisie.
Utilisé dans les blocks
Des blocks qui s’appuient sur Date picker.