Construit sur l’UI SDK 0.1.0-beta.2 de Vercel. Son API peut changer.
Number input
Un champ numérique sur l’UI SDK de Vercel avec des boutons qui se répètent au maintien, des formats monétaires, de pourcentage et d’unité dans toute langue, et une poignée à faire glisser.
- Composants de formulaire
- 8 parties
- 13 exemples
@tabler/icons-react@ui-sdk/core@ui-sdk/reactclass-variance-authority
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-number-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 @tabler/icons-react class-variance-authority cnCopiez et collez le code suivant dans votre projet.
components/ui/ui-sdk-number-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 un nombre, ou null quand le champ est vide, et le champ l’affiche formatée. La saisie met à jour la valeur dès que le texte est un nombre valide. Entrée ou la sortie du champ la valide : le texte est lu, maintenu entre min et max, aligné sur le pas et reformaté.
Un bouton se désactive à sa limite. Une valeur saisie hors limites est ramenée dedans à la validation.
step est l’incrément habituel. Maj, Page préc. et Page suiv. modifient de largeStep, et Alt ou Option avec une flèche de smallStep. Maintenez un bouton pour répéter.
format accepte les options de Intl.NumberFormat. On peut saisir dans le même format, et un pourcentage est une fraction, donc 15 % vaut 0.15. Le groupe variant="stacked" place de petits chevrons à la fin.
locale choisit les séparateurs, symboles et groupements de chiffres, pour l’affichage comme pour la saisie. Sans elle, le champ suit la langue de la page une fois interactif, et le serveur rend l’anglais.
Faites glisser un NumberInputScrubArea latéralement pour changer la valeur, comme dans un outil de design. Là où le navigateur autorise le verrouillage du pointeur, le glissement peut dépasser le bord de l’écran, et NumberInputScrubAreaCursor dessine le curseur.
Avec wheel, faire défiler au-dessus du champ ciblé modifie la valeur. C’est désactivé par défaut, donc une page qui défile par-dessus ne le change jamais.
onValueChange s’exécute à chaque changement valide, et onValueCommit à la fin d’une interaction, c’est lui qui sert à enregistrer. Un contrôleur modifie ou fixe la valeur depuis n’importe quel bouton.
Avec un name, le nombre est envoyé tel quel, comme 1250, jamais formaté. required bloque un champ vide, et la réinitialisation du formulaire revient à la valeur par défaut.
invalid marque le champ et pose aria-invalid sur l’entrée, pour vos propres vérifications comme le stock.
Un champ désactivé ne peut être ni ciblé ni modifié, et n’est pas envoyé.
Un champ en lecture seule peut être ciblé et est envoyé, mais les boutons, le glissement et la saisie ne le modifient pas.
Les boutons changent de côté, et la langue fixe les chiffres et la devise.
| Touche | Action |
|---|---|
| ↑↓ | Modifie la valeur de step. |
| ShiftPageUpPageDown | Modifie de largeStep, dix pas par défaut. Maj fonctionne avec les flèches, les boutons, la molette et le glissement. |
| Alt | Avec une flèche, modifie de smallStep, un dixième de pas par défaut. |
| HomeEnd | Va au minimum ou au maximum, s’ils sont définis. |
| Enter | Valide et formate la saisie. |
Le champ suit le clavier du motif spinbutton de WAI-ARIA sur un champ texte natif, donc l’édition de texte habituelle fonctionne toujours. Nommez le champ avec un libellé ou aria-label. Les boutons s’appellent « Increase » et « Decrease » par défaut, pointent vers le champ et restent hors de l’ordre de tabulation, car les flèches font la même chose.
Un champ avec décimales demande un pavé décimal sur mobile, et les boutons grandissent sur écran tactile. Ils ne rétrécissent à l’appui que si les animations sont autorisées.
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 | number | null | – |
defaultValue | number | null | – |
onValueChange | (value: number | null, details) => void | – |
onValueCommitS’exécute à la fin d’une interaction. Pour enregistrer. | (value: number | null, details) => void | – |
min | number | – |
max | number | – |
step | number | 1 |
largeStep | number | step × 10 |
smallStep | number | step ÷ 10 |
format | Intl.NumberFormatOptions | – |
localePar défaut, la langue de la page. | string | – |
wheel | boolean | false |
invalid | boolean | false |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllerIssu de createNumberInputController(). | NumberInputController | – |
| Attribut | Description |
|---|---|
data-slot="number-input" | Pour cibler le champ numérique en CSS. |
data-scrubbing | Présent pendant qu’un glissement modifie la valeur. |
data-invalid | Présent quand il est invalide. |
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. |
| Prop | Type | Par défaut |
|---|---|---|
variantDes boutons des deux côtés, des chevrons empilés à la fin, ou aucun bouton, pour une poignée de glissement. | "split" | "stacked" | "plain" | "split" |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Description |
|---|---|
data-slot="number-input-group" | Pour cibler le cadre du champ en CSS. |
data-variant | La variante : split, stacked ou plain. |
| Prop | Type | Par défaut |
|---|---|---|
id | string | – |
placeholder | string | – |
render | ReactElement | (props, state) => ReactElement | – |
| Prop | Type | Par défaut |
|---|---|---|
aria-label | string | "Increase" |
disabledDésactive ce bouton seul. | boolean | – |
childrenPar défaut un plus, ou un chevron dans la variante stacked. | ReactNode | (state) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Description |
|---|---|
data-slot="number-input-increment" | Cible le bouton en CSS. |
data-at-bound | Présent quand la valeur est à max. |
data-disabled | Présent quand le bouton ne peut pas modifier la valeur. |
| Prop | Type | Par défaut |
|---|---|---|
aria-label | string | "Decrease" |
disabledDésactive ce bouton seul. | boolean | – |
render | ReactElement | (props, state) => ReactElement | – |
| Attribut | Description |
|---|---|
data-slot="number-input-decrement" | Cible le bouton en CSS. |
data-at-bound | Présent quand la valeur est à min. |
Empile le bouton d’augmentation au-dessus de celui de diminution à la fin d’un groupe stacked.
| Prop | Type | Par défaut |
|---|---|---|
orientationLa droite et le haut augmentent la valeur. | "horizontal" | "vertical" | "horizontal" |
pixelsPerStepLa distance parcourue par le pointeur pour un pas. | number | – |
controllerRelie une zone de glissement placée hors du champ numérique, comme une icône dans une barre d’outils. | NumberInputController | – |
| Attribut | Description |
|---|---|
data-slot="number-input-scrub-area" | Pour cibler la zone de glissement en CSS. |
data-orientation | horizontal ou vertical. |
data-scrubbing | Présent pendant qu’un glissement modifie la valeur. |
| Prop | Type | Par défaut |
|---|---|---|
childrenPar défaut, une flèche horizontale centrée sur le pointeur. | ReactNode | – |
- 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.