Button
StabilnyWywołuje akcję. Najważniejszy element interaktywny każdego interfejsu — i ten, którego najłatwiej nadużyć.
Anatomia
- 1KontenerMa wypełnienie, obramowanie i pierścień fokusu zależne od wariantu. Jego wysokości pokrywają się z wysokościami pól tekstowych.
- 2Ikona na początkuOpcjonalna. Rozmiar i odstęp nadaje jej przycisk; po tej stronie padding się zmniejsza.
- 3EtykietaCzasownik, który nazywa efekt; wielka litera tylko na początku.
- 4Ikona na końcuOpcjonalna. Sygnalizuje kierunek albo menu.
Instalacja
$ pnpm dlx shadcn@latest add https://www.prfct.dev/r/button.jsonUżycie
import { Button } from "@/components/ui/button"<Button variant="outline">Cancel</Button>
<Button>Save changes</Button>Przykłady
Warianty
Siedem wariantów wyraża hierarchię, nie dekorację. Główny przycisk prfct jest celowo monochromatyczny: kolor zarezerwowano dla znaczenia — zaznaczenia, fokusu, statusu — więc jedyna kolorowa akcja na powierzchni zawsze jest tą najważniejszą.
Rozmiary
Przyciski mają te same wysokości co pola tekstowe i listy wyboru — xs 28, sm 32, default 36, lg 40, xl 48 — więc kontrolki w jednym rzędzie zawsze są wyrównane. Przyciski z samą ikoną są kwadratowe w każdym rozmiarze.
Z ikonami
Oznacz ikony atrybutem data-icon="inline-start" lub data-icon="inline-end". Przycisk zmniejszy padding po tej stronie, żeby zachować równowagę optyczną, i sam dobierze rozmiar ikony — nigdy nie dodawaj klas rozmiaru do ikon wewnątrz przycisku.
<Button>
<SendIcon data-icon="inline-start" />
Send invite
</Button>Sama ikona
Przycisk z samą ikoną nie ma widocznego tekstu, więc musi mieć aria-label. Dodaj do niego podpowiedź, która powtarza etykietę — z myślą o widzących użytkownikach myszy.
Ładowanie
loading zastępuje etykietę wskaźnikiem ładowania bez zmiany szerokości przycisku, ustawia aria-busy i blokuje kliknięcia — ale zostawia fokus klawiatury na przycisku, więc użytkownicy czytników ekranu i klawiatury nie tracą orientacji.
loading zachowuje jedno i drugie. Jeśli potrzebujesz innego układu, nadal możesz samodzielnie użyć komponentu Spinner.Jako link
Akcja, która przenosi w inne miejsce, jest linkiem, nawet jeśli wygląda jak przycisk: czytniki ekranu odczytują ją jako link, a użytkownicy mogą otworzyć ją w nowej karcie. Nadaj linkowi wygląd przycisku za pomocą buttonVariants, zamiast renderować Button jako link — Base UI nadałby mu role="button".
import Link from "next/link"
import { buttonVariants } from "@/components/ui/button"
<Link href="/docs/installation" className={buttonVariants()}>
Get started
</Link>Wytyczne
Kiedy używać
- Do wywołania akcji na bieżącej stronie: wysłania formularza, otwarcia okna dialogowego, zapisu, usunięcia.
- Do rozpoczęcia procesu: Utwórz projekt, Zaproś członka zespołu.
Kiedy nie używać
- Do nawigacji. Użyj linku — ostylowanego za pomocą
buttonVariants, jeśli ma wyglądać jak przycisk. - Do włączania i wyłączania ustawienia — użyj komponentu Switch.
- Do wyboru jednej opcji z niewielkiego zestawu — użyj komponentu Toggle Group.
Hierarchia
Daj każdemu widokowi jedną akcję główną. Wszystkie pozostałe schodzą niżej — do outline, secondary lub ghost. Akcję główną umieść na końcu rzędu (w stopkach — wyrównaną do prawej), a akcje rezygnacji, takie jak Anuluj, na przeciwległym końcu.
Etykiety
Zacznij od czasownika i nazwij efekt: Zapisz zmiany, Usuń projekt, Wyślij 3 zaproszenia. Wielką literą pisz tylko pierwsze słowo, zmieść się w jednym–trzech słowach i nigdy nie kończ etykiety znakiem interpunkcyjnym. Etykieta musi mieć sens także wtedy, gdy czytnik ekranu odczyta ją bez kontekstu.
Dostępność
Przycisk prfct renderuje przez Base UI natywny <button>, więc bez dodatkowej pracy przyjmuje fokus, przekazuje czytnikom ekranu swoją rolę i aktywuje się klawiszami Enter i Spacja.
| Klawisz | Działanie |
|---|---|
Tab | Przenosi fokus na przycisk. Pierścień fokusu to obrys o grubości 2 px, odsunięty od krawędzi, widoczny w każdym motywie i w trybie wymuszonych kolorów. |
EnterSpacja | Aktywuje przycisk. |
- Rozmiar celu. Każdy rozmiar od
smwzwyż spełnia minimum 24 × 24 px z WCAG 2.2 (2.5.8). Rozmiarówxsiicon-xsużywaj tylko w gęstych interfejsach obsługiwanych głównie kursorem. - Kontrast. Tekst etykiety na każdym wypełnionym wariancie osiąga 4,5:1 w obu trybach; zobacz Kolor.
- Stan wyłączony. Wyłączone przyciski wypadają z kolejności tabulacji. Jeśli użytkownik ma się dowiedzieć, dlaczego akcja jest niedostępna, zostaw przycisk włączony i wyjaśnij to po kliknięciu albo użyj
focusableWhenDisabledz podpowiedzią. - Ładowanie.
loadingustawiaaria-busy="true"i zachowuje fokus; połącz go z regionem na żywo w trybie polite albo z powiadomieniem, które przekaże wynik.
Dokumentacja API
Button
Renderuje element <button>. Przyjmuje wszystkie propsy komponentu Button z Base UI.
buttonVariants
Generator klas jest eksportowany, żeby inne elementy — przede wszystkim linki — mogły wyglądać jak przyciski, nie będąc nimi. Ikony oznaczone data-icon mają rozmiar i odstępy dokładnie takie jak w Button.
import { buttonVariants } from "@/components/ui/button"
<Link href="/pricing" className={buttonVariants({ variant: "outline", size: "sm" })}>
Pricing
</Link>