Construit sur l’UI SDK 0.1.0-beta.1 de Vercel. Son API peut changer.
Date picker
Un sélecteur de date sur l’UI SDK de Vercel où l’on tape une date dans sa langue ou la choisit, avec plages, préréglages et valeurs ISO.
- Composants de formulaire
- 18 parties
- 9 exemples
@tabler/icons-react@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-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 @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react cnCopiez et collez le code suivant dans votre projet.
components/ui/ui-sdk-date-picker.tsx components/ui/button.tsx Mettez à jour les chemins d’import selon la configuration de votre projet.
UI SDK ajoute un peu de CSS dans une couche de cascade nommée ui-sdk. Déclarez cette couche en haut de votre feuille de style globale, au-dessus de l’import Tailwind, pour que vos classes l’emportent.
Les valeurs sont des chaînes de date ISO comme 2026-11-20, sans heure ni fuseau horaire, donc pas besoin de bibliothèque de dates. Chacun tape dans son propre ordre, comme 11/20/2026 ou 20.11.2026, et le champ formate la date à l’appui sur Entrée ou en le quittant. DatePickerContent sans enfants affiche un calendrier stylé.
Avec mode="range", ajoutez un second input avec end. Le calendrier reste ouvert après la première date et se ferme après la seconde. months={2} affiche deux mois côte à côte, empilés sur petit écran.
Un DatePickerPreset choisit sa value et ferme le popup. Il s’affiche enfoncé tant que sa valeur est sélectionnée.
min, max et unavailable s’appliquent à la saisie et au choix. Ici, les week-ends et deux jours fériés ne peuvent pas être choisis, et un jour tapé est marqué invalide.
locale définit le format de saisie, l’indice et les noms du calendrier. Sans lui, le sélecteur lit le lang de la page. Les boutons ont des noms anglais, donc passez aria-label pour les traduire.
Avec un name, la date est envoyée en chaîne ISO. required bloque un envoi vide, un texte qui n’est pas une date aussi, et reset revient à defaultValue.
Un contrôleur issu de createDatePickerController() définit la date ou ouvre le calendrier depuis n’importe où, et onValueChange signale chaque changement. Laissez value non défini ici pour que le calendrier puisse aller au mois choisi par le contrôleur.
disabled empêche la saisie et l’ouverture. readOnly ouvre toujours le calendrier pour regarder, mais rien ne peut changer.
Avec une locale arabe dans dir=rtl, le champ, les flèches et le calendrier partent tous de la droite.
| Touche | Action |
|---|---|
| Enter | Dans l’input, lit la date tapée. Sur un jour, le choisit. |
| ←→↑↓ | Passe d’un jour à l’autre, ou d’une semaine vers le haut et le bas. |
| Page UpPage Down | Recule ou avance d’un mois. |
| HomeEnd | Passe au début ou à la fin de la semaine. |
| Esc | Annule une plage inachevée, sinon ferme le calendrier. |
Le calendrier s’ouvre comme une boîte de dialogue avec une grille de jours, chacun nommé en entier, comme « Friday, November 20, 2026 ». L’indice décrit l’input, donc les lecteurs d’écran entendent le format à taper. Un texte qui n’est pas une date active aria-invalid et garde l’ancienne valeur, et les jours indisponibles restent focalisables pour que les personnes au clavier les entendent quand même.
Le déclencheur, le popup et les flèches ont des noms anglais. Passez aria-label à chacun pour les traduire. Les inputs utilisent une police de 16px sur écran tactile pour qu’iOS ne zoome pas, et le popup n’apparaît en zoom que si le mouvement est autorisé.
Chaque partie enveloppe la partie UI SDK du même nom et accepte toutes ses props, y compris render et un className qui peut être une fonction de l’état de la partie. DatePickerControl, DatePickerSeparator et DatePickerCalendar sont des parties de mise en page HextaUI.
| Prop | Type | Par défaut |
|---|---|---|
mode | "single" | "range" | "single" |
value | string | [string, string] | null | – |
defaultValue | string | [string, string] | null | – |
onValueChange | (value, details) => void | – |
min | string | – |
max | string | – |
unavailableDates ISO, { from, to }, { weekday }, { before }, { after } ou une fonction. | 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 | – |
controllerIssu de createDatePickerController(). | DatePickerController | – |
| Attribut | Description |
|---|---|
data-slot="date-picker" | Cible le sélecteur de date en CSS. |
data-open | Présent tant que l’élément est ouvert. |
data-invalid | Présent tant qu’un input contient un texte qui n’est pas une date. |
data-disabled | Présent lorsque l’élément est désactivé. |
data-readonly | Présent en lecture seule. |
| Prop | Type | Par défaut |
|---|---|---|
endEn fait la fin d’une plage. | boolean | false |
| Prop | Type | Par défaut |
|---|---|---|
childrenPar défaut, une icône de calendrier. | ReactNode | – |
aria-label | string | "Choose date" |
| Prop | Type | Par défaut |
|---|---|---|
childrenPar défaut, une icône X nommée Clear. Elle se masque tant qu’il n’y a rien à effacer. | ReactNode | – |
| Prop | Type | Par défaut |
|---|---|---|
childrenPar défaut, un DatePickerCalendar. | ReactNode | – |
align | Align | "start" |
sideOffset | number | 6 |
collisionPadding | number | 8 |
| Attribut | Description |
|---|---|
data-slot="date-picker-content" | Pour cibler le popup en CSS. |
--cell-size | La taille de chaque jour, plus grande sur écran tactile. |
| Prop | Type | Par défaut |
|---|---|---|
monthsCombien de grilles afficher côte à côte. | number | 1 |
| Prop | Type | Par défaut |
|---|---|---|
value | string | [string, string] | – |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Description |
|---|---|
data-slot="calendar-day" | Cible un jour en CSS. |
data-today | Présent sur aujourd’hui. |
data-range-start | Présent là où une plage commence. |
data-range-end | Présent là où une plage se termine. |
data-unavailable | Présent sur un jour qu’on ne peut pas choisir. |
data-outside | Présent sur un jour du mois suivant ou précédent. |
- 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.
- 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.
- Date pickerUn bouton qui ouvre un calendrier dans un popover, ou une bottom sheet sur mobile, pour des dates simples et des plages.
- FieldDes libellés, descriptions et erreurs reliés à leur contrôle, avec états de validation et mises en page pour les formulaires.