Input
Ein Texteingabefeld mit drei Größen, ungültigen und schreibgeschützten Zuständen, nativem Validierungsstyling und einer 16-px-Schrift für Touch, damit Smartphones nie hineinzoomen.
pnpm dlx shadcn@latest add https://hextaui.com/r/input.jsonFügt die Komponente, die HextaUI-Theme-Tokens und alle HextaUI-Komponenten hinzu, von denen sie abhängt.
Füge die Theme-Tokens zu deinem globalen CSS hinzu, falls du das noch nicht getan hast.
Installiere die Abhängigkeiten.
pnpm add @base-ui/react class-variance-authority cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/input.tsx components/ui/number-flow.tsx lib/motion.ts Passe die Importpfade an dein Projekt-Setup an.
Größen
sm, default und lg entsprechen den Button-Höhen, sodass ein Input und ein Button gleicher Größe in einer Reihe fluchten.
Mit einer Beschreibung
Verweise mit aria-describedby auf den Hilfetext, damit Screenreader ihn nach dem Label vorlesen.
Ungültig
aria-invalid färbt den Rand und den Fokusring rot. Verknüpfe die Meldung mit aria-describedby, damit sie angesagt und nicht nur eingefärbt wird.
Native Validierung
Felder mit required, type="email" oder pattern werden erst rot, nachdem jemand hineingetippt oder abzusenden versucht hat, nie beim ersten Rendern. Ein Absenden, das ein Feld als ungültig vorfindet, lässt es einmal wackeln, damit der Blick auf das fällt, was korrigiert werden muss. Es wackelt nie, während du tippst oder durch die Felder tabst. Sende das leere Formular ab, um es zu sehen.
Deaktiviert
Ein deaktiviertes Input lässt sich weder fokussieren noch bearbeiten noch mit dem Formular absenden.
Schreibgeschützt
readOnly hält den Wert fokussierbar, auswählbar und sendbar, mit einer gedämpften Fläche, damit er nicht bearbeitbar aussieht. Bevorzuge es gegenüber disabled bei Werten, die Nutzer kopieren müssen.
Datei
type="file" erhält denselben Rahmen, wobei der Button des Browsers als einfacher Text gestylt wird.
Input-Typen
Passwort, Zahl, Suche, Datum und Zeit teilen sich eine Höhe und einen Rahmen. Im Dark Mode wechseln auch die Picker und Spinner des Browsers auf dunkel.
Kontrolliert
onValueChange liefert dir den String direkt, sodass kein event.target.value ausgepackt werden muss. onChange funktioniert ebenfalls weiterhin.
Mit einem Button
Nebeneinander mit Abstand oder zu einem Steuerelement in einem <ButtonGroup /> verbunden, wo das Input die verbleibende Breite einnimmt.
Grid
Inputs füllen ihren Container, setze sie daher in ein Grid. Gib Grid-Zellen min-w-0, damit lange Werte keine Spalte dehnen können.
Langer Inhalt
Lange Werte scrollen im Feld, und lange Platzhalter werden abgeschnitten, ohne das Layout zu verbreitern.
Rechts nach links
Text, Cursor und Padding folgen der Richtung. Verwende dir="auto" bei Feldern mit Links-nach-rechts-Werten, etwa einer E-Mail-Adresse in einem arabischen Formular.
- Jedes Input braucht einen Namen. Verwende ein
<label>mithtmlForoderaria-label, wenn es kein sichtbares Label gibt. Ein Platzhalter ist kein Label. - Verknüpfe Hilfs- und Fehlertext mit
aria-describedbyund setzearia-invaliderst, wenn es einen Fehler anzuzeigen gibt. - Auf Touchscreens ist der Text mindestens 16 px groß, damit iOS Safari die Seite nicht zoomt, wenn das Input fokussiert wird.
- In einem Base UI
Fieldsind Label, Beschreibung, Fehler und Validität automatisch verdrahtet.
Basiert auf dem Base UI Input. Es akzeptiert jedes native Input-Attribut.
| Prop | Typ | Standard |
|---|---|---|
sizeHöhe und Padding, passend zu den Buttons. | "sm" | "default" | "lg" | "default" |
htmlSizeDas native size-Attribut, umbenannt, weil size die Variante ist. | number | – |
value | string | number | string[] | – |
defaultValue | string | number | string[] | – |
onValueChangeWird bei jeder Änderung mit dem neuen Wert aufgerufen. | (value: string, details) => void | – |
type | string | "text" |
disabled | boolean | false |
readOnly | boolean | false |
aria-invalidZeigt den Rand für ungültig und den Fokusring. | boolean | – |
className | string | (state) => string | – |
shakeWackelt einmal, wenn ein Formular-Submit dieses Input als ungültig vorfindet. Funktioniert mit nativer Validierung, Base UI Field und Bibliotheken, die aria-invalid setzen. Bei reduzierter Bewegung übersprungen. | boolean | true |
render | ReactElement | (props, state) => ReactElement | <input> |
| Attribut | Beschreibung |
|---|---|
data-slot="input" | Das Input in CSS ansprechen. |
data-size | Die aktuelle Größe. |
data-shake | Vorhanden, während das Input nach einem fehlgeschlagenen Absenden wackelt. |
data-disabled | Vorhanden, wenn das Input deaktiviert ist. |
data-invalid | Vorhanden, wenn das umgebende Field ungültig ist. Gestylt wie aria-invalid. |
data-valid | Vorhanden, wenn das umgebende Field gültig ist. |
data-touched | Vorhanden, nachdem das Input einmal den Fokus verloren hat, innerhalb eines Field. |
data-dirty | Vorhanden, sobald sich der Wert geändert hat, innerhalb eines Field. |
data-filled | Vorhanden, wenn das Input einen Wert hat, innerhalb eines Field. |
data-focused | Vorhanden, solange fokussiert, innerhalb eines Field. |
Die Klassennamen hinter dem Input, um ein anderes Element passend zu stylen, etwa ein natives <select> oder <textarea>. Rufe sie mit { size } auf.
Die Zeichenzahl hinter <InputGroupCount /> und <FieldCounter />. Verwende diese Teile, die das Feld für dich lesen. Greife nur dann darauf zurück, wenn du die Länge selbst verfolgst.
| Prop | Typ | Standard |
|---|---|---|
lengthErforderlich. | number | – |
maxLength | number | null | – |
threshold | number | 10% of maxLength, at most 20 |
announcement | (remaining: number) => string | – |
| Attribut | Beschreibung |
|---|---|
data-slot="input-count" | Den Zähler in CSS ansprechen. |
data-state="near" | "limit" | Vorhanden innerhalb des Schwellenwerts und am Limit. |
- MotionDie Easing-Kurven, Dauern und der Reduced-Motion-Check, mit denen jede Komponente animiert, plus Hooks für Größen-Morphs und gleitende Hervorhebungen.
- Number flowAnimierte Zahlen, bei denen sich nur die geänderten Ziffern drehen, mit beliebigem Intl-Format und Locale.
- useAutosizeLässt eine Textarea mit dem Geschriebenen zwischen minimaler und maximaler Höhe wachsen und animiert jede Änderung, ohne je den Text anzufassen.
- useComposedRefBehält eine Ref auf dein eigenes Element und leitet sie trotzdem an die Ref weiter, die der Parent übergeben hat.
- useInvalidShakeLässt ein Formularelement wackeln, wenn ein Absendeversuch es als ungültig findet, und nie, während noch getippt wird.
- useMergedRefKombiniert beliebig viele Callback- und Objekt-Refs zu einem, mit React-19-Ref-Cleanup für jeden von ihnen.
In Blocks verwendet
Blocks, die auf Input aufbauen.
- API keysDie API-Schlüssel-Seite eines KI-Produkts, wie in den Konsolen von OpenAI und Anthropic. Schlüssel mit eingeschränkten Berechtigungen und Ablaufdatum erstellen, das Secret einmal sehen mit einem Kopieren, das sich bestätigt, mit Rückgängig widerrufen, direkt umbenennen, mit Übergangsfrist rotieren und die Nutzung pro Schlüssel sehen.
- BillingPlan & Nutzung für ein KI-Produkt, im Stil von Cursor, Claude und Vercel. Eine nach Modell aufgeteilte Nutzungsanzeige, die das Ende des Zyklus hochrechnet und warnt, bevor die Credits ausgehen, ein tägliches Diagramm zum Scrubben, ein Ausgabenlimit mit Warnungen, die du auf der Anzeige in der Vorschau siehst, Planwechsel mit exakter Anteilsberechnung, ein Kartenformular mit echter Validierung und Rechnungen als PDF-Download.
- ModelsDie Modelle-Seite in den Einstellungen eines KI-Produkts. Ein Standardmodell mit Kontext, Geschwindigkeit und Kosten auf einen Blick, ein Standard-Effort, der weiß, was jedes Modell unterstützt, eine durchsuchbare Modellliste nach Anbieter gruppiert mit Filtern, Pins und Sammelschaltern, OpenAI-kompatible Server mit echtem Verbindungstest und ein Refresh, der dir sagt, was neu ist.
- NotificationsDer Bereich „Benachrichtigungen“ in den Einstellungen eines KI-Produkts. Ein Raster aus Kanal und Ereignis mit Toggles für Zeile, Spalte und alle, Ruhezeiten mit einer Live-Zeile zur nächsten Ruhephase, ein E-Mail-Digest, echte Testsendungen für Desktop, E-Mail, Push und Slack, Umgang mit Browser-Berechtigungen und ein Slack-Verbindungsablauf. Passt in jeden Settings-Bereich.