Progress
Ein Balken oder Ring, der zeigt, wie weit eine Aufgabe fortgeschritten ist, sanft zwischen Aktualisierungen wechselt und gleitet, solange die Gesamtmenge unbekannt ist.
pnpm dlx shadcn@latest add https://hextaui.com/r/progress.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/progress.tsx Passe die Importpfade an dein Projekt-Setup an.
<Progress /> zeichnet seine eigene Spur und seinen Indikator nach seinen Kindern, sodass ein Label und ein Wert in einer Zeile über der Leiste stehen. Jedes Update lässt die Füllung von der aktuellen Stelle auslaufen, sodass schnelle Updates als eine fließende Bewegung statt als Stufen wirken.
Größen
xs, sm, default und lg ändern die Dicke der Leiste. xs ist die feine Linie, die Attachment an seinem unteren Rand zeichnet.
Status
variant färbt nur die Füllung oder den Ring, sodass Spur, Label und Wert neutral bleiben.
Unbestimmt
Übergib value={null}, solange die Gesamtmenge unbekannt ist. Ein Segment gleitet über die Spur, und sobald eine Zahl eintrifft, wächst die Füllung von Anfang an.
Kreis
<ProgressCircle /> zeichnet denselben Wert als Ring, oben beginnend. Kinder sitzen in der Mitte, was zu <ProgressValue /> bei lg und xl passt.
Unbestimmter Kreis
Ein Bogen dreht sich um den Ring, bis ein Wert eintrifft.
Eigener Bereich und Format
Setze min und max für einen beliebigen Bereich, format für die Zahl und ein Funktions-Child an <ProgressValue /> für den Text. Gib Screenreadern mit getAriaValueText dieselben Worte.
Animierter Wert
Rendere <NumberFlow /> in <ProgressValue />, damit sich nur die Ziffern drehen, die sich ändern, im Takt mit der Füllung.
Lange Labels
Lange Namen brechen in eigene Zeilen um, und der Wert bleibt am Ende. Ringe funktionieren als kompakter Status neben jeder Zeile.
Ohne sichtbares Label
Benenne die Leiste mit aria-label, wenn der Kontext schon sagt, was lädt.
Rechts nach links
Füllung und unbestimmtes Gleiten starten von rechts. Übergib locale, um den Wert in den Ziffern des Lesers zu formatieren.
- Das Root ist eine
progressbarmitaria-valuenow,aria-valuemin,aria-valuemaxund einem formatiertenaria-valuetext. Im unbestimmten Zustand hat sie keinen aktuellen Wert. <ProgressLabel />benennt die Leiste. Ohne eines übergibaria-label.<ProgressValue />ist für Screenreader ausgeblendet, da die Progressbar den Wert bereits ansagt.- Bei reduzierter Bewegung springt die Füllung auf jeden neuen Wert, und die unbestimmte Leiste und der Ring pulsieren an Ort und Stelle, statt sich zu bewegen.
- Werte werden in
en-USformatiert, sofern du keinlocaleübergibst, damit Server und Browser denselben Text rendern.
Gebaut auf dem Base UI Progress. Jeder Teil akzeptiert die Props des Primitivs, das er umschließt.
| Prop | Typ | Standard |
|---|---|---|
valuenull macht die Leiste unbestimmt. | number | null | – |
min | number | 0 |
max | number | 100 |
size | "xs" | "sm" | "default" | "lg" | "default" |
variant | "default" | "success" | "warning" | "destructive" | "default" |
formatFormatiert den Wert. Ohne das erscheint der Wert als Prozentzahl. | Intl.NumberFormatOptions | – |
locale | Intl.LocalesArgument | "en-US" |
getAriaValueText | (formattedValue: string, value: number | null) => string | – |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="progress" | Das Root. |
data-size | Die Größe: xs, sm, default oder lg. |
data-variant | Die Status-Variante. |
data-progressing | Vorhanden, solange der Wert unter max liegt. |
data-complete | Vorhanden, wenn der Wert max erreicht. |
data-indeterminate | Vorhanden, wenn der Wert null oder keine endliche Zahl ist. |
Benennt die Progressbar. Rendert ein <span> und nimmt dieselben State-Attribute wie das Root.
| Prop | Typ | Standard |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <span> |
| Attribut | Beschreibung |
|---|---|
data-slot="progress-label" | Das Label. |
| Prop | Typ | Standard |
|---|---|---|
childrenEigener Text. Ohne ihn erscheint der formatierte Wert, bei unbestimmtem Zustand nichts. | (formattedValue: string | null, value: number | null) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | <span> |
| Attribut | Beschreibung |
|---|---|
data-slot="progress-value" | Der Wert. |
Wird von <Progress /> gerendert und über dessen size dimensioniert. Für eigene Kompositionen exportiert.
| Attribut | Beschreibung |
|---|---|
data-slot="progress-track" | Die Spur. |
--progress-dir | 1 oder -1 in rechts-nach-links, sodass das unbestimmte Gleiten der Leserichtung folgt. |
Die Füllung. Ihre Breite wird inline aus dem Wert gesetzt und läuft zwischen Updates sanft aus.
| Attribut | Beschreibung |
|---|---|
data-slot="progress-indicator" | Die Füllung. |
| Prop | Typ | Standard |
|---|---|---|
valuenull dreht einen Bogen. | number | null | – |
min | number | 0 |
max | number | 100 |
size | "sm" | "default" | "lg" | "xl" | "default" |
variant | "default" | "success" | "warning" | "destructive" | "default" |
locale | Intl.LocalesArgument | "en-US" |
childrenWird in der Mitte des Rings angezeigt. | ReactNode | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="progress-circle" | Das Root. |
data-size | Die Größe: sm, default, lg oder xl. |
data-variant | Die Status-Variante. |
data-progressing | Vorhanden, solange der Wert unter max liegt. |
data-complete | Vorhanden, wenn der Wert max erreicht. |
data-indeterminate | Vorhanden, wenn der Wert null oder keine endliche Zahl ist. |
--progress-circle-size | Breite und Höhe des Rings. |
--progress-stroke | Die Strichstärke des Rings. |
- AlertInline-Meldungen für Status und Feedback, mit neutraler Fläche, farbigem Icon und einem Schließen, das sanft zusammenklappt.
- EmptyEin Platzhalter für Ansichten, in denen es noch nichts zu zeigen gibt, mit Icon, Nachricht und der nächsten Aktion.
- SkeletonPlatzhalter, die 150 ms warten, bevor sie erscheinen, exakt die Größe des umschlossenen Inhalts annehmen und ihn einblenden, ohne etwas zu verschieben.
- 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.
- ToastKurze Nachrichten, die sich sauber stapeln, bei Hover aufklappen, weggewischt werden können und einen Ladezustand an Ort und Stelle in Erfolg oder Fehler verwandeln.
- AttachmentDatei- und Bildkarten für Uploads, mit Fortschritt, Zuständen, Aktionen, einem Trigger über die ganze Karte und Namen, die ihre Dateiendung behalten.