Przejdź do treści

Progress

Stabilny

Pokazuje, jak daleko zaszło zadanie — albo że trwa, gdy nie wiadomo, ile jeszcze potrwa.

Przesyłanie zasobów
x

Anatomia

Przesyłanie zasobów
x
  1. 1EtykietaMówi, co jest w toku. Nazywa też pasek dla czytników ekranu.
  2. 2TorCałe zadanie, w stonowanym odcieniu.
  3. 3WartośćProcent zapisany cyframi tabelarycznymi, dzięki czemu nie drga przy zmianie.
  4. 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.json

Uż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.

Mały
x
Domyślny
x
Duży
x

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ść.

Przygotowujemy eksport…
x

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.

Budowanie…
x

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
    x
  • hero-illustration.png2,8 MB
    x
  • product-walkthrough.mp4148 MB
    x

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.

Miejsce na dane
x
<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 loading komponentu 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?

OczekiwanieRozwiązanieDlaczego
Poniżej ~1 sekundyBrak wskaźnikaWskaźniki, które migną tylko na moment, sprawiają wrażenie wolniejszych niż ich brak.
Treść jest w drodzeSkeletonPokazuje kształt tego, co nadchodzi, więc strona nie przeskakuje.
Akcja jest w tokuSpinner lub Button loadingPotwierdza, że system przyjął polecenie.
Mierzalna praca, ponad ~1 sekundęProgressMówi, jak długo trzeba będzie czekać, aby można było zdecydować, czy zostać.

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.

Importowanie 1280 kontaktów
x
Dobrze.Etykieta mówi, co się dzieje, a wartość — jak daleko to zaszło.
x
Źle.Pasek bez etykiety zmusza do zgadywania, co się ładuje.

Dostępność

  • Renderuje role="progressbar"aria-valuemin, aria-valuemaxaria-valuenow. Stan nieokreślony pomija aria-valuenow — czytniki ekranu odczytują wtedy pasek jako zajęty.
  • ProgressLabel jest powiązany z paskiem przez aria-labelledby. Gdy nie możesz pokazać etykiety, przekaż zamiast niej aria-label do Progress — pasek postępu zawsze musi mieć nazwę.
  • aria-valuetext jest generowany ze sformatowanej wartości. Nadpisz go przez getAriaValueText za 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-motion zmiany 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ą ProgressTrackProgressIndicator. Przyjmuje wszystkie propsy Progress.Root z Base UI.

PropTypDomyślnie
valuewymagany

Bieżąca wartość. null renderuje stan nieokreślony.

number | nullBrak wartości domyślnej
min

Wartość minimalna.

number0
max

Wartość maksymalna.

number100
size

Wysokość toru: 4, 6 lub 10 px.

"sm" | "default" | "lg""default"
format

Formatuje wartość wyświetlaną przez ProgressValue i odczytywaną przez czytniki ekranu.

Intl.NumberFormatOptionsBrak wartości domyślnej
locale

Ustawienia regionalne do formatowania liczb. Domyślnie te ze środowiska użytkownika.

Intl.LocalesArgumentBrak wartości domyślnej
getAriaValueText

Zwraca zrozumiały dla człowieka opis bieżącej wartości.

(formattedValue: string, value: number | null) => stringBrak wartości domyślnej

ProgressLabel

Dostępna nazwa paska. Renderuje <span>.

PropTypDomyślnie
className

Dodatkowe klasy.

stringBrak wartości domyślnej

ProgressValue

Wyświetla sformatowaną wartość wyrównaną do prawej. Renderuje <span>.

PropTypDomyślnie
children

Własny sposób renderowania wartości, np. w jednostkach innych niż procent.

(formattedValue: string | null, value: number | null) => ReactNodeBrak wartości domyślnej

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.