Construit sur l’UI SDK 0.1.0-beta.2 de Vercel. Son API peut changer.
Time input
Un champ d’heure sur l’UI SDK de Vercel saisi partie par partie, sur une horloge de 12 ou 24 heures avec secondes en option, minimum et maximum, et une valeur sur 24 heures pour les formulaires.
- Composants de formulaire
- 3 parties
- 10 exemples
@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-time-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-time-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.
La valeur est une heure sur 24 heures comme "14:30", comme celle d’un champ d’heure natif, quelle que soit l’horloge affichée. Elle reste null tant que chaque partie n’est pas remplie. Chaque partie est un petit champ : tapez des chiffres et il passe à la suite, ou appuyez sur A ou P pour la moitié de la journée.
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.
TimeInput affiche ses parties tout seul. Ajoutez TimeInputSegments vous-même pour placer une icône ou un autre contenu à côté.
Le champ affiche l’horloge de la langue. hourCycle choisit 12 ou 24 heures, et granularity ajoute les secondes ou n’affiche que l’heure. Tous envoient des valeurs sur 24 heures.
Une heure avant min ou après max marque le champ comme invalide, et son formulaire ne s’envoie pas.
invalid marque le champ pour vos propres vérifications, comme une heure de fin avant le début.
locale fixe l’ordre, les séparateurs et les noms des moitiés de journée. Sans elle, le champ suit la langue de la page une fois interactif.
Un champ caché envoie l’heure sous name. required bloque une heure vide ou à moitié saisie, et la réinitialisation rétablit la valeur par défaut.
createTimeInputController() définit, vide ou cible le champ depuis n’importe où. Ciblez une partie par son unité, comme "minute".
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. |
| ↑↓ | Modifie la partie d’une unité, en boucle. Une partie vide part de l’heure actuelle. |
| PageUpPageDown | Modifie par grands pas, comme 15 minutes. |
| 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. |
| AP | Choisit AM ou PM sur une horloge de 12 heures. |
| Enter | Envoie le formulaire avec la saisie. |
La racine est un groupe. Chaque partie est un spinbutton nommé par son unité, comme « hour », 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 | – |
hourCyclePar défaut, l’horloge de la langue. | 12 | 24 | – |
granularity | "hour" | "minute" | "second" | "minute" |
min | string | – |
max | string | – |
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 createTimeInputController(). | TimeInputController | – |
childrenPar défaut, TimeInputSegments. | ReactNode | (state) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Description |
|---|---|
data-slot="time-input" | Pour cibler le champ d’heure en CSS. |
data-invalid | Présent quand l’heure est hors de min et max, 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 TimeInputSegment 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. | TimeInputSegmentData | – |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Description |
|---|---|
data-slot="time-input-segment" | Pour cibler une partie en CSS. |
data-type | 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.