Construit sur l’UI SDK 0.1.0-beta.2 de Vercel. Son API peut changer.
Date input
Un champ de date sur l’UI SDK de Vercel saisi partie par partie dans l’ordre de la langue, avec heure en option, minimum et maximum, jours indisponibles et une valeur ISO.
- Composants de formulaire
- 3 parties
- 10 exemples
@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-date-input.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.2 @ui-sdk/core@0.1.0-beta.2 cnCopiez et collez le code suivant dans votre projet.
components/ui/ui-sdk-date-input.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.
Utilisez un champ de date pour les dates connues par cœur, comme un anniversaire. La valeur est une date ISO comme "2026-11-02", et reste null tant que chaque partie n’est pas remplie. Chaque partie se remplit à la saisie puis passe à la suite, le jour reste dans son mois, et une date entière peut être collée dans n’importe quelle partie. Pour choisir dans un calendrier, utilisez le Date Picker.
Le champ est un groupe : nommez-le avec aria-labelledby ou aria-label. Un clic n’importe où dans le cadre cible la partie la plus proche.
DateInput affiche ses parties tout seul. Ajoutez DateInputSegments vous-même pour placer une icône ou un autre contenu à côté.
granularity réglé sur "hour", "minute" ou "second" ajoute l’heure, et la valeur devient une date et heure locales comme "2026-11-02T14:30".
Une date avant min ou après max marque le champ comme invalide, et son formulaire ne s’envoie pas.
unavailable accepte des dates ISO, des plages { from, to }, des jours de la semaine ou une fonction, et une date concernée est invalide.
locale fixe l’ordre et les séparateurs. Les chiffres vont toujours de 0 à 9 et le calendrier est toujours grégorien, donc la valeur désigne la même date partout.
Un champ caché envoie la date ISO sous name, ici à côté d’un Time Input. required bloque une date vide ou à moitié saisie, et la réinitialisation rétablit la valeur par défaut.
createDateInputController() définit, vide ou cible le champ depuis n’importe où. Ciblez une partie par son unité, comme "year".
Un champ désactivé est ignoré par le focus et n’est pas envoyé.
Un champ en lecture seule prend le focus et est envoyé, mais les touches et la saisie ne le modifient pas.
Les parties gardent l’ordre de la langue, et les flèches les suivent à l’écran.
| Touche | Action |
|---|---|
| 0–9 | Remplit la partie, puis passe à la suivante. |
| /. | Passe à la partie suivante. |
| ↑↓ | Modifie la partie d’une unité, en boucle. Une partie vide part d’aujourd’hui. |
| PageUpPageDown | Modifie par grands pas : une année de 5, un mois de 3, un jour de 7. |
| HomeEnd | Va à la première ou à la dernière valeur de la partie. |
| ←→ | Passe à la partie précédente ou suivante. |
| Backspace | Efface le dernier chiffre, puis vide la partie, puis revient en arrière. |
| Enter | Envoie le formulaire avec la saisie. |
La racine est un groupe. Chaque partie est un spinbutton nommé par son unité, comme « month », avec sa valeur et sa plage, et une partie vide se lit « Empty ». Le texte entre les parties est masqué aux lecteurs d’écran.
Les parties sont de vrais champs, donc les téléphones affichent un pavé numérique et la saisie fonctionne avant le script de la page. Elles passent à 16px sur écran tactile pour éviter le zoom, et la partie ciblée est surlignée au lieu d’afficher un curseur.
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 son état.
| Prop | Type | Par défaut |
|---|---|---|
value | string | null | – |
defaultValue | string | null | – |
onValueChangeS’exécute quand chaque partie est remplie, et avec null quand l’une est vidée. | (value: string | null, details) => void | – |
granularity | "day" | "hour" | "minute" | "second" | "day" |
hourCyclePar défaut, l’horloge de la langue. | 12 | 24 | – |
min | string | – |
max | string | – |
unavailableDates ISO, plages { from, to }, { weekday } ou une fonction. | DateMatchers | – |
localePar défaut, la langue de la page. | string | – |
invalid | boolean | false |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllerIssu de createDateInputController(). | DateInputController | – |
childrenPar défaut, DateInputSegments. | ReactNode | (state) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Description |
|---|---|
data-slot="date-input" | Pour cibler le champ de date en CSS. |
data-invalid | Présent quand la date est hors de min et max, indisponible, ou quand invalid est défini. |
data-empty | Présent tant que toutes les parties sont vides. |
data-disabled | Présent lorsque l’élément est désactivé. |
data-readonly | Présent en lecture seule. |
data-required | Présent lorsqu’elle est requise. |
Affiche un DateInputSegment pour chaque partie, dans l’ordre de la langue, avec le texte entre elles.
| Prop | Type | Par défaut |
|---|---|---|
segmentL’un des segments de l’état de la racine. | DateInputSegmentData | – |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Description |
|---|---|
data-slot="date-input-segment" | Pour cibler une partie en CSS. |
data-type | year, month, day, hour, minute, second, dayPeriod, ou literal pour le texte entre les parties. |
data-empty | Présent tant que la partie est vide. |
- 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.
- InputUn champ de saisie texte en trois tailles, avec états invalide et lecture seule, style de validation natif et police tactile de 16px pour que les téléphones ne zooment jamais.