Button
Buttons in allen Varianten und Größen, mit eingebautem Lade-, Erfolgs- und Fehlerablauf, der den Spinner bei schnellen Anfragen überspringt.
pnpm dlx shadcn@latest add https://hextaui.com/r/button.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/button.tsx Passe die Importpfade an dein Projekt-Setup an.
Mit feedback gibst du aus onClick ein Promise zurück, und der Button zeigt Laden, dann Erfolg oder Fehler und setzt sich anschließend selbst zurück.
Varianten
Sieben Varianten. destructive ist ein sanfter Farbton, sodass eine gefährliche Aktion klar lesbar ist, ohne zu schreien, und ghost-destructive ist die ruhige Version für wiederkehrende Zeilenaktionen wie Abmelden oder Entfernen.
Größen
Textgrößen von xs bis lg und quadratische icon-*-Größen. Kleine Icon-Buttons erhalten auf Touchscreens eine größere unsichtbare Berührungsfläche.
Pill
shape="pill" rundet die Enden vollständig ab, und Icon-Größen werden zu Kreisen. Das passt zu Buttons in abgerundeten Flächen, etwa einem Chat-Composer.
Mit Icon
Markiere ein Icon mit data-icon="inline-start" oder "inline-end", und das Padding auf dieser Seite wird zum Ausgleich enger.
Deaktiviert
focusableWhenDisabled hält einen deaktivierten Button in der Tab-Reihenfolge, sodass ein Tooltip oder eine Erklärung weiterhin per Tastatur erreichbar ist.
Eigene Labels
loadingLabel, successLabel und errorLabel ersetzen den Text für den jeweiligen Zustand. Jedes Label kippt herein, während das alte hinauskippt.
Sanfte Breite
Der Button gleitet auf die Breite des jeweiligen Labels, statt Platz für das längste zu reservieren, sodass sich nichts um ihn herum verschiebt.
Fehlerdetails
Übergib errorLabel eine Funktion, um den Ablehnungsgrund anzuzeigen. Solange der Zeiger oder der Tastaturfokus auf dem Button bleibt, bleibt der Fehler sichtbar.
Formulare
Rufe bei Submit-Buttons track() aus useButtonFeedback in onSubmit auf und spreade buttonProps auf den Button. Entferne das @, um den Fehler zu sehen.
Icon-Buttons
Icon-Größen tauschen für jeden Zustand nur das Icon aus und behalten ihre quadratische Form. Das aria-label bleibt der zugängliche Name.
Feedback für jede Variante
Gefüllte Varianten werden bei Abschluss grün oder rot. ghost und link ändern nur ihre Textfarbe.
Gesteuertes Laden
Setze loading selbst, wenn die Arbeit anderswo nachverfolgt wird. Der Button bleibt fokussierbar und kündigt an, dass er beschäftigt ist.
Gesteuerter Status
Steuere status direkt, zum Beispiel aus dem Submit-Zustand einer Formularbibliothek.
Als Link
Übergib einen Anker an render und setze nativeButton={false}, damit der Button die Link-Semantik behält.
Rechts nach links
Icons und Zustandslabels folgen der Leserichtung.
| Taste | Aktion |
|---|---|
| EnterSpace | Aktiviert den Button. Wird ignoriert, solange eine Feedback-Anfrage läuft. |
| Tab | Verschiebt den Fokus. Ein ladender Button bleibt fokussierbar, und ein fokussierter Fehler bleibt auf dem Bildschirm, bis du weitergehst. |
- Jede Zustandsänderung wird über eine Live-Region mit polite-Priorität angesagt: erst Laden, dann das Erfolgs- oder Fehlerlabel.
- Beim Laden setzt der Button
aria-busyund bleibt fokussierbar, sodass der Fokus mitten in einer Anfrage nie verloren geht. - Der Spinner erscheint erst nach 150 ms und bleibt dann mindestens 400 ms, sodass schnelle Anfragen nie aufblitzen und langsame nie flackern.
- Bei reduzierter Bewegung blenden Zustandslabels über, statt zu kippen, und das Wackeln beim Fehler entfällt.
Basiert auf dem Base UI Button. Er rendert ein <button> und akzeptiert alle seine Attribute.
| Prop | Typ | Standard |
|---|---|---|
variant | "default" | "outline" | "secondary" | "ghost" | "ghost-destructive" | "destructive" | "link" | "default" |
size | "xs" | "sm" | "default" | "lg" | "icon-xs" | "icon-sm" | "icon" | "icon-lg" | "icon-xl" | "default" |
shape | "default" | "pill" | "default" |
feedbackDas von onClick zurückgegebene Promise verfolgen und seinen Status anzeigen. | boolean | false |
onClickGib ein Promise zurück, um das Feedback zu steuern. | (event) => unknown | – |
loadingGesteuerter Ladezustand. | boolean | – |
statusGesteuerter Status. Hat Vorrang vor loading. | "idle" | "loading" | "success" | "error" | – |
onStatusChange | (status: ButtonStatus) => void | – |
onErrorWird mit dem Ablehnungsgrund aufgerufen. | (error: unknown) => void | – |
resetAfterMillisekunden, bevor in den Ruhezustand zurückgekehrt wird. | number | { success?: number; error?: number } | { success: 2000, error: 4000 } |
loadingLabelWird neben dem Spinner angezeigt. Bei Icon-Größen ausgeblendet. | ReactNode | – |
successLabel | ReactNode | "Done" |
errorLabel | ReactNode | (error: unknown) => ReactNode | "Failed" |
disabled | boolean | false |
focusableWhenDisabledBeim Laden immer true. | boolean | false |
nativeButtonAuf false setzen, wenn render kein <button> ist. | boolean | true |
render | ReactElement | (props, state) => ReactElement | <button> |
| Attribut | Beschreibung |
|---|---|
data-slot="button" | Buttons in CSS ansprechen. |
data-status | idle, loading, success oder error. Vorhanden, sobald feedback, loading oder status verwendet wird. |
data-disabled | Vorhanden, wenn der Button deaktiviert ist. |
aria-busy | Vorhanden, solange geladen wird. |
Führt den gleichen Feedback-Ablauf von überall aus, etwa im onSubmit eines Formulars. Akzeptiert resetAfter, onStatusChange und onError. Die vollständigen Zeitabläufe findest du in der useButtonFeedback-Anleitung.
| Rückgabe | Beschreibung |
|---|---|
track(action) | Übergib ein Promise oder eine Funktion, die eines zurückgibt. Aufrufe, während eine Anfrage läuft, werden ignoriert. |
buttonProps | Auf <Button> spreaden, um den Status anzuzeigen und das Zurücksetzen bei Hover und Fokus zu pausieren. |
status | Der aktuelle ButtonStatus. |
error | Der letzte Ablehnungsgrund. |
reset() | Bricht die Anfrage ab und kehrt in den Ruhezustand zurück. |
isPending() | Ob eine Anfrage läuft. |
- SpinnerEin Ladeindikator mit Ticks im Apple-Stil oder einem atmenden Ring, der vor dem Anzeigen warten und lange genug sichtbar bleiben kann, um nicht zu flackern.
- useButtonFeedbackFührt eine asynchrone Aktion durch Laden, Erfolg und Fehler, überspringt den Spinner bei schnellen Anfragen und hält einen Fehler, während du ihn liest.
- Button groupButtons, zu einem Element verbunden, mit gemeinsamen Nähten, Trennern, Text-Addons, Verschachtelung und vertikalen Stapeln.
- ToggleEin Button, der an oder aus bleibt, mit einer Füllung, die sich beim Drücken setzt, einem klaren Übergang beim Hover zu „an“ und Icons, die sich mit dem Zustand füllen können.
- Toggle groupEine Reihe von Toggles für eine oder mehrere Auswahlen, mit einer Füllung, die zum gewählten Element gleitet, verbundenen oder abgesetzten Elementen und Pfeiltasten-Fokus.
- AlertInline-Meldungen für Status und Feedback, mit neutraler Fläche, farbigem Icon und einem Schließen, das sanft zusammenklappt.
In Blocks verwendet
Blocks, die auf Button aufbauen.
- Prompt InputEin Chat-Composer, der als ruhige einzelne Zeile beginnt, beim Schreiben zu einer Karte wächst und nach unten wandert, sobald die Unterhaltung beginnt. Enter sendet, sicher bei japanischer und chinesischer Eingabe. Dateien per Einfügen, Ablegen oder Auswählen hinzufügen, mit Vorschau, Fortschritt und Wiederholen. @ fügt Dateien hinzu und / führt Befehle aus einem Menü an der Einfügemarke aus. Ein Modellwähler mit Zifferntasten, ein Effort-Slider, der bei Max lebendig wird, ein Kontextring, Diktat mit Live-Wellenform, Tool-Chips, eine Warteschlange für Nachrichten, die während einer streamenden Antwort getippt werden, und Entwürfe, die einen Reload überstehen.
- Agent TodosZeige den Plan eines Agenten, während er arbeitet. Jeder Schritt wandert von Backlog über To do und In Arbeit zu Erledigt, mit Live-Zeiten, Fehlern und den dahinterliegenden Tool-Aufrufen. Eine Status-Pille für über dem Composer, sichtbare Planänderungen und ein Review-Schritt, um den Plan vor der Ausführung zu bearbeiten.
- 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.
- AppearanceDer Bereich „Erscheinungsbild“ in den Einstellungen eines KI-Produkts: Theme, Akzent, Hintergrundtönung, Dichte, Chat-Schrift, Textgrößen und Barrierefreiheitsoptionen, alles als Entwurf gehalten, bis gespeichert wird.