Input
Un 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.
pnpm dlx shadcn@latest add https://hextaui.com/r/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 @base-ui/react class-variance-authority cnCopiez et collez le code suivant dans votre projet.
components/ui/input.tsx components/ui/number-flow.tsx lib/motion.ts Mettez à jour les chemins d’import selon la configuration de votre projet.
Tailles
sm, default et lg correspondent aux hauteurs des boutons : un champ et un bouton de même taille s’alignent donc sur une ligne.
Avec une description
Pointez aria-describedby vers le texte d’aide pour que les lecteurs d’écran le lisent après le libellé.
Invalide
aria-invalid colore en rouge le bord et l’anneau de focus. Reliez le message avec aria-describedby pour qu’il soit annoncé, et pas seulement coloré.
Validation native
Les champs avec required, type="email" ou pattern ne passent au rouge qu’après qu’on y a saisi quelque chose ou tenté de soumettre, jamais au premier rendu. Une soumission qui trouve un champ invalide le fait vibrer une fois, pour que le regard se pose sur ce qu’il faut corriger. Il ne vibre jamais pendant la saisie ni la tabulation. Soumettez le formulaire vide pour le voir.
Désactivé
Un champ désactivé ne peut être ni focalisé, ni modifié, ni soumis avec le formulaire.
Lecture seule
readOnly garde la valeur focusable, sélectionnable et soumise, avec une surface atténuée pour qu’elle n’ait pas l’air modifiable. Préférez-le à disabled pour les valeurs que l’on doit pouvoir copier.
Fichier
type="file" reçoit le même cadre, avec le bouton du navigateur restylé en texte simple.
Types de champ
Mot de passe, nombre, recherche, date et heure partagent une même hauteur et un même cadre. En mode sombre, les sélecteurs et les compteurs du navigateur passent aussi en sombre.
Contrôlé
onValueChange vous donne directement la chaîne : pas de event.target.value à extraire. onChange fonctionne toujours aussi.
Avec un bouton
Côte à côte avec un écart, ou réunis en un seul contrôle dans un <ButtonGroup />, où le champ prend la largeur restante.
Grille
Les champs remplissent leur conteneur : placez-les donc dans une grille. Donnez min-w-0 aux cellules de la grille pour que de longues valeurs ne puissent pas étirer une colonne.
Contenu long
Les longues valeurs défilent dans le champ et les longs placeholders sont coupés, sans élargir la mise en page.
De droite à gauche
Le texte, le curseur et le remplissage suivent la direction. Utilisez dir="auto" sur les champs qui contiennent des valeurs de gauche à droite, comme une adresse e-mail dans un formulaire en arabe.
- Chaque champ a besoin d’un nom. Utilisez un
<label>avechtmlFor, ouaria-labellorsqu’il n’y a pas de libellé visible. Un placeholder n’est pas un libellé. - Reliez le texte d’aide et d’erreur avec
aria-describedby, et ne définissezaria-invalidque lorsqu’il y a une erreur à afficher. - Sur écran tactile, le texte fait au moins 16 px, pour qu’iOS Safari ne zoome pas sur la page lorsque le champ reçoit le focus.
- Dans un
Fieldde Base UI, le libellé, la description, l’erreur et la validité sont câblés pour vous.
Construit sur l’input de Base UI. Il accepte tous les attributs d’input natifs.
| Prop | Type | Par défaut |
|---|---|---|
sizeHauteur et remplissage, alignés sur les boutons. | "sm" | "default" | "lg" | "default" |
htmlSizeL’attribut size natif, renommé car size est la variante. | number | – |
value | string | number | string[] | – |
defaultValue | string | number | string[] | – |
onValueChangeAppelé avec la nouvelle valeur à chaque changement. | (value: string, details) => void | – |
type | string | "text" |
disabled | boolean | false |
readOnly | boolean | false |
aria-invalidAffiche le bord invalide et l’anneau de focus. | boolean | – |
className | string | (state) => string | – |
shakeVibre une fois lorsqu’une soumission de formulaire trouve ce champ invalide. Fonctionne avec la validation native, le Field de Base UI et les bibliothèques qui définissent aria-invalid. Ignoré avec la réduction des animations. | boolean | true |
render | ReactElement | (props, state) => ReactElement | <input> |
| Attribut | Description |
|---|---|
data-slot="input" | Ciblez le champ en CSS. |
data-size | La taille actuelle. |
data-shake | Présent pendant que le champ vibre après une soumission échouée. |
data-disabled | Présent lorsque le champ est désactivé. |
data-invalid | Présent lorsque le Field englobant est invalide. Stylisé comme aria-invalid. |
data-valid | Présent lorsque le Field englobant est valide. |
data-touched | Présent après que le champ a perdu le focus une fois, dans un Field. |
data-dirty | Présent une fois la valeur modifiée, dans un Field. |
data-filled | Présent lorsque le champ a une valeur, dans un Field. |
data-focused | Présent tant qu’il a le focus, dans un Field. |
Les noms de classes derrière le champ, pour styliser un autre élément à l’identique, comme un <select> ou un <textarea> natif. Appelez-le avec { size }.
Le décompte de caractères derrière <InputGroupCount /> et <FieldCounter />. Utilisez ces parties, qui lisent le champ pour vous. Ne recourez à celle-ci que lorsque vous suivez vous-même la longueur.
| Prop | Type | Par défaut |
|---|---|---|
lengthRequis. | number | – |
maxLength | number | null | – |
threshold | number | 10% of maxLength, at most 20 |
announcement | (remaining: number) => string | – |
| Attribut | Description |
|---|---|
data-slot="input-count" | Ciblez le compteur en CSS. |
data-state="near" | "limit" | Présent dans le seuil, et à la limite. |
- MotionLes courbes d’easing, les durées et la vérification de réduction des animations utilisées par chaque composant, ainsi que des hooks pour les morphs de taille et les surlignages glissants.
- Number flowDes nombres animés où seuls les chiffres modifiés tournent, avec n’importe quel format Intl et n’importe quelle locale.
- useAutosizeAgrandit un textarea selon ce que vous écrivez, entre sa hauteur minimale et maximale, en animant chaque changement sans jamais toucher au texte.
- useComposedRefConserve une ref vers votre propre élément tout en la transmettant à la ref passée par le parent.
- useInvalidShakeFait vibrer un contrôle de formulaire lorsqu’une tentative d’envoi le trouve invalide, et jamais pendant que quelqu’un tape encore.
- useMergedRefCombine un nombre quelconque de refs callback et objet en une seule, avec le nettoyage de ref de React 19 pour chacune.
Utilisé dans les blocks
Des blocks qui s’appuient sur Input.
- API keysLa page des clés d’API d’un produit d’IA, comme les consoles d’OpenAI et d’Anthropic. Créez des clés avec des permissions limitées et une expiration, voyez le secret une seule fois avec une copie qui confirme, révoquez avec annulation, renommez sur place, effectuez une rotation avec période de grâce et consultez l’utilisation par clé.
- BillingForfait et utilisation pour un produit d’IA, dans le style de Cursor, Claude et Vercel. Un compteur d’utilisation réparti par modèle qui projette la fin du cycle et prévient avant la fin des crédits, un graphique quotidien explorable, une limite de dépenses avec des alertes prévisualisables sur le compteur, des changements de forfait avec proratisation exacte, un formulaire de carte avec une vraie validation, et des factures téléchargeables en PDF.
- ModelsLa page Modèles des paramètres d’un produit d’IA. Un modèle par défaut avec son contexte, sa vitesse et son coût en un coup d’œil, un effort par défaut qui sait ce que prend en charge chaque modèle, une liste de modèles consultable groupée par fournisseur avec filtres, épingles et bascules groupées, des serveurs compatibles OpenAI avec un vrai test de connexion, et une actualisation qui indique les nouveautés.
- NotificationsLa section Notifications des paramètres d’un produit d’IA. Une grille canal par événement avec bascules par ligne, par colonne et globale, des heures calmes avec une ligne « prochain calme » en direct, un résumé par e-mail, de vrais envois de test pour le bureau, l’e-mail, le push et Slack, la gestion des permissions du navigateur et un flux de connexion à Slack. S’intègre dans n’importe quelle section Settings.