Progress
StabilnyPokazuje, jak daleko zaszło zadanie — albo że trwa, gdy nie wiadomo, ile jeszcze potrwa.
Anatomia
- 1EtykietaMówi, co jest w toku. Nazywa też pasek dla czytników ekranu.
- 2TorCałe zadanie, w stonowanym odcieniu.
- 3WartośćProcent zapisany cyframi tabelarycznymi, dzięki czemu nie drga przy zmianie.
- 4WskaźnikUkończona część. Animuje przejścia między wartościami, a gdy wartość jest nieznana, przesuwa się wzdłuż toru.
Instalacja
$ pnpm dlx shadcn@latest add https://www.prfct.dev/r/progress.jsonUżycie
import { Progress, ProgressLabel, ProgressValue } from "@/components/ui/progress"<Progress value={64}>
<ProgressLabel>Uploading assets</ProgressLabel>
<ProgressValue />
</Progress>Progress sam renderuje tor i wskaźnik. Elementy potomne — zwykle etykieta i wartość — trafiają do wiersza nad paskiem.
Przykłady
Rozmiary
sm (4 px) mieści się w listach i komórkach tabel, default (6 px) pasuje do większości formularzy i kart, a lg (10 px) jest przeznaczony dla paska postępu, który jest głównym elementem widoku.
Stan nieokreślony
Przekaż value={null}, gdy wiesz, że praca trwa, ale nie wiesz, ile jej zostało. Fragment paska przesuwa się wzdłuż toru, dopóki nie przełączysz go na określoną wartość.
Aktualizacje na żywo
Wskaźnik animuje przejścia między wartościami z czasem trwania slow i krzywą standard, więc częste aktualizacje wyglądają jak płynny ruch, a nie skoki.
Przesyłanie plików
W listach użyj rozmiaru sm, a etykietą niech będzie nazwa pliku. Gdy pozycja się zakończy, zastąp wartość potwierdzeniem, aby ukończone wiersze przestały przyciągać wzrok.
- brand-guidelines.pdfGotowe4,2 MB
- hero-illustration.png2,8 MB
- product-walkthrough.mp4148 MB
Własna wartość
ProgressValue przyjmuje funkcję renderującą dla jednostek innych niż procent. Gdy zmieniasz widoczny format, przekaż technologiom wspomagającym te same słowa przez getAriaValueText.
<Progress
value={7.2}
max={10}
getAriaValueText={() => "7.2 of 10 gigabytes used"}
>
<ProgressLabel>Storage</ProgressLabel>
<ProgressValue>{() => "7.2 GB of 10 GB"}</ProgressValue>
</Progress>Wytyczne
Kiedy używać
- Do zadań, które trwają dłużej niż około sekundy i raportują mierzalny postęp: przesyłania, eksportu, importu, budowania.
- Do wielkości mierzonych względem limitu — miejsca na dane, licencji, przydziałów — gdy pasek jest wskaźnikiem poziomu, a nie zegarem.
Kiedy nie używać
- Do krótkich lub niemierzalnych oczekiwań wewnątrz kontrolki — użyj Spinner albo stanu
loadingkomponentu Button. - Do treści, która wciąż się ładuje — użyj Skeleton, który zapowiada układ.
- Do kroków w procesie. Pasek postępu mierzy wykonaną pracę, a nie nawigację.
Skeleton, Spinner czy Progress?
Bądź uczciwy
Nigdy nie pozwól, by określony pasek utknął na 99% albo się cofnął. Jeśli nie potrafisz wiarygodnie oszacować postępu, użyj stanu nieokreślonego i opisz w etykiecie, co się dzieje.
Dostępność
- Renderuje
role="progressbar"zaria-valuemin,aria-valuemaxiaria-valuenow. Stan nieokreślony pomijaaria-valuenow— czytniki ekranu odczytują wtedy pasek jako zajęty. ProgressLabeljest powiązany z paskiem przezaria-labelledby. Gdy nie możesz pokazać etykiety, przekaż zamiast niejaria-labeldoProgress— pasek postępu zawsze musi mieć nazwę.aria-valuetextjest generowany ze sformatowanej wartości. Nadpisz go przezgetAriaValueTextza każdym razem, gdy widoczna wartość nie jest procentem.- Paski postępu nie są regionami na żywo (live regions): czytniki ekranu odczytują wartość, gdy użytkownik do niej przejdzie, a nie przy każdej zmianie. Kamienie milowe — Przesyłanie zakończone — ogłaszaj przez Toast lub komunikat z
role="status". - Przy
prefers-reduced-motionzmiany wartości i przesuwanie się paska w stanie nieokreślonym nie są animowane.
Dokumentacja API
Progress
Komponent główny. Renderuje <div> z twoimi elementami potomnymi, po których następują ProgressTrack i ProgressIndicator. Przyjmuje wszystkie propsy Progress.Root z Base UI.
ProgressLabel
Dostępna nazwa paska. Renderuje <span>.
ProgressValue
Wyświetla sformatowaną wartość wyrównaną do prawej. Renderuje <span>.
ProgressTrack i ProgressIndicator
Progress renderuje je automatycznie. Są eksportowane na potrzeby własnych kompozycji — na przykład segmentowego miernika, który renderuje kilka wskaźników.