Select
Wähle eine oder mehrere Optionen aus einer Liste, die beim aktuellen Wert öffnet, mit Typeahead, Gruppen und Formularunterstützung.
pnpm dlx shadcn@latest add https://hextaui.com/r/select.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 @tabler/icons-react class-variance-authority cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/select.tsx lib/motion.ts Passe die Importpfade an dein Projekt-Setup an.
Die Liste öffnet sich direkt über dem Trigger, mit der aktuellen Option über dem Wert ausgerichtet, sodass dein Auge nie den Platz verliert. Übergib items, damit SelectValue Labels statt Rohwerten zeigt. Für lange Listen, die durchsucht werden müssen, nutze Combobox.
Größen
size an SelectTrigger entspricht den Höhen von Input und Button.
Gruppen und lange Listen
Gruppiere Optionen mit SelectGroup und SelectLabel. Lange Listen passen auf den Bildschirm und zeigen Scrollpfeile, die beim Hovern scrollen.
Mit Icons
Setze Icons in Items und übergib SelectValue eine Funktion, um dasselbe Icon im Trigger zu zeigen.
Mehrfach
Mit multiple bleibt die Liste beim Wählen offen, und der Wert kann lange Auswahlen zusammenfassen.
In einem Formular
In Field erhält der Trigger sein Label, seine Beschreibung und Pflichtvalidierung.
Deaktiviert und ungültig
Deaktiviere das ganze Select oder einzelne Optionen und markiere es mit aria-invalid als ungültig.
Unter dem Trigger
alignItemWithTrigger={false} öffnet die Liste wie ein Menü unter dem Trigger. Touch-Eingabe tut das automatisch.
Rechts nach links
Trigger, Liste und Häkchen folgen der Leserichtung.
| Taste | Aktion |
|---|---|
| SpaceEnter↓↑ | Öffnet die Liste vom Trigger aus. |
| ↓↑ | Wechselt zwischen Optionen. |
| HomeEnd | Springt zur ersten oder letzten Option. |
| A–Z | Springt zur nächsten Option, die mit dem getippten Text beginnt. |
| EnterSpace | Wählt die hervorgehobene Option. |
| Esc | Schließt die Liste und gibt den Fokus an den Trigger zurück. |
- Beschrifte den Trigger mit
FieldLabeloderaria-label. - Bei Touch öffnet sich die Liste unter dem Trigger statt darüber, damit dein Finger nicht auf einer Option landet.
| Prop | Typ | Standard |
|---|---|---|
value | Value | Value[] | null | – |
defaultValue | Value | Value[] | null | – |
onValueChange | (value, details) => void | – |
itemsLässt SelectValue Labels anzeigen. | Record<string, ReactNode> | { value, label }[] | – |
multiple | boolean | false |
name | string | – |
required | boolean | false |
disabled | boolean | false |
readOnly | boolean | false |
open | boolean | – |
onOpenChange | (open, details) => void | – |
| Prop | Typ | Standard |
|---|---|---|
size | "sm" | "default" | "lg" | "default" |
render | ReactElement | (props, state) => ReactElement | <button> |
| Attribut | Beschreibung |
|---|---|
data-slot="select-trigger" | Der Trigger, mit data-size. |
data-popup-open | Vorhanden, solange die Liste offen ist. |
data-placeholder | Vorhanden, solange nichts gewählt ist. |
| Prop | Typ | Standard |
|---|---|---|
placeholder | ReactNode | – |
childrenFormatiere den angezeigten Wert. | ReactNode | (value) => ReactNode | – |
| Prop | Typ | Standard |
|---|---|---|
alignItemWithTriggerÖffnet sich über dem Trigger, mit der aktuellen Option darauf ausgerichtet. | boolean | true |
sideWenn nicht am Trigger ausgerichtet. | "top" | "bottom" | … | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 6 |
| Attribut | Beschreibung |
|---|---|
data-slot="select-content" | Das Popup. |
data-side="none" | Vorhanden, solange sie über dem Trigger ausgerichtet ist. |
| Prop | Typ | Standard |
|---|---|---|
value | Value | – |
disabled | boolean | false |
labelText für Typeahead. | string | – |
| Attribut | Beschreibung |
|---|---|
data-selected | Die gewählte Option. |
data-highlighted | Die fokussierte Option. |
data-disabled | Die Option ist deaktiviert. |
- CalendarEin Datumsraster für Einzel-, Bereichs- und Mehrfachauswahl, mit gleitenden Monaten, Bereichsvorschau und Tagen in Touch-Größe.
- CheckboxEine Checkbox, deren Häkchen sich einzeichnet, mit unbestimmten übergeordneten Elementen, Gruppen und Labels, die ihren Hover teilen.
- ComboboxEin filterbares Select mit Chips, Gruppen und asynchronen Ergebnissen, in einem Popup, das sich beim Tippen anpasst.
- Date pickerEin Button, der einen Kalender in einem Popover öffnet, auf Smartphones als Bottom Sheet, für einzelne Daten und Zeiträume.
- FieldLabels, Beschreibungen und Fehler, mit ihrem Steuerelement verbunden, mit Validierungszuständen und Layouts für Formulare.
- InputEin 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.
In Blocks verwendet
Blocks, die auf Select 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.
- 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.