Przejdź do treści

Dostępność

prfct jest projektowany pod WCAG 2.2 AA od podstaw — w palecie, prymitywach i ustawieniach domyślnych — a automatyczne testy sprawdzają to na każdej stronie.

Dostępność w prfct to nie lista kontrolna odhaczana na końcu. Jest wbudowana w warstwy, na których opiera się cała reszta: paletę, której kontrast wyliczany jest matematycznie, prymitywy Base UI implementujące wzorce WAI-ARIA i domyślne ustawienia komponentów, dzięki którym dostępny wybór jest zarazem najprostszy.

Co dostajesz w standardzie

ObszarJak prfct to rozwiązuje
KontrastStopnie tekstu są wyliczane tak, by miały kontrast ≥ 4,5:1 na swoich powierzchniach; krawędzie kontrolek mają co najmniej 3:1 (WCAG 1.4.11). Zobacz Kolor.
KlawiaturaKażdy interaktywny komponent da się obsłużyć klawiaturą — z wędrującym fokusem (roving focus), przechodzeniem do elementów przez wpisywanie (typeahead) i Esc tam, gdzie przewiduje to wzorzec ARIA.
FokusWidoczny wskaźnik fokusu o grubości 2 px, rysowany przez outline, dzięki czemu przetrwa tryb wymuszonych kolorów. Jego kolor jest wyliczany tak, by miał kontrast co najmniej 3:1 na każdej powierzchni, dla dowolnego koloru marki: zobacz Motywy.
SemantykaBase UI renderuje natywne elementy oraz poprawne role, stany i relacje (aria-expanded, aria-controls, aria-describedby…).
NakładkiOkna dialogowe zatrzymują fokus w sobie i po zamknięciu oddają go wyzwalaczowi, ukrywają resztę strony przed technologiami wspomagającymi, a nazwę dostępną biorą z DialogTitle.
Rozmiar celuButton, Input, Select i Toggle mają w każdym rozmiarze co najmniej 28 px wysokości; niższy jest tylko wariant przycisku link, który stoi w tekście. Pola wyboru, przyciski radiowe, przełączniki i uchwyty suwaków są mniejsze i niewidocznie powiększają swój obszar kliknięcia do 24 × 24 px lub więcej (WCAG 2.2, 2.5.8).
Ruchprefers-reduced-motion skraca wszystkie przejścia do zera; nic nie zależy od animacji.
Preferencje kontrastuprefers-contrast: more wzmacnia obramowania i tekst drugorzędny.
Wymuszone koloryW trybie wysokiego kontrastu systemu Windows paleta systemowa zastępuje motyw i usuwa wypełnienia oraz cienie. Strukturę niosą obramowania i kontury, pływające powierzchnie dostają krawędź, a stany: wciśnięty, bieżący, podświetlony i wybrany przyjmują systemowe kolory zaznaczenia.
Powiększenie i rozmiar tekstuRozmiary tekstu są podane w rem, więc podążają za rozmiarem czcionki w przeglądarce. Układ dopasowuje się bez przewijania w poziomie aż do szerokości 320 px, czyli powiększenia 400% w oknie 1280 px (WCAG 1.4.10).
JęzykInter obejmuje zakres Latin Extended-A, więc polski, czeski, turecki i inne języki wyświetlają się właściwymi glifami, a nie zastępczymi.

Fokus

Naciskaj Tab aby przechodzić między kontrolkami poniżej.

import { Button } from "@/components/ui/button"
import { Checkbox } from "@/components/ui/checkbox"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { Switch } from "@/components/ui/switch"

export default function FocusRing() {
  return (
    <div className="flex w-full max-w-sm flex-col gap-4">
      <p className="text-sm text-muted-foreground">
        Naciskaj{" "}
        <kbd className="rounded border bg-surface px-1 font-mono text-xs">
          Tab
        </kbd>{" "}
        aby przechodzić między kontrolkami poniżej.
      </p>
      <Input placeholder="Pola tekstowe mają poświatę" aria-label="Przykładowe pole" />
      <div className="flex items-center gap-2.5">
        <Checkbox id="focus-demo-check" />
        <Label htmlFor="focus-demo-check">Pozostałe kontrolki mają pierścień</Label>
      </div>
      <div className="flex items-center gap-2.5">
        <Switch id="focus-demo-switch" />
        <Label htmlFor="focus-demo-switch">Odsunięty od krawędzi</Label>
      </div>
      <div className="flex gap-2">
        <Button variant="outline">Anuluj</Button>
        <Button>Dalej</Button>
      </div>
    </div>
  )
}

prfct używa dwóch stylów fokusu:

  • Przyciski i kontrolki wyboru — pola wyboru, przełączniki, zakładki — pokazują pierścień o grubości 2 px, odsunięty o 2 px od krawędzi.
  • Pola tekstowe pokazują obramowanie w kolorze marki i poświatę o szerokości 3 px, bo pierścień wokół pola z obramowaniem wyglądałby jak drugie obramowanie.

Oba style opierają się na :focus-visible: kontrolki pokazują pierścień tylko wtedy, gdy fokus przychodzi z klawiatury, więc osoby korzystające z myszy nie widzą pierścieni po kliknięciu. Pola tekstowe pokazują poświatę zawsze, gdy mają fokus — niezależnie od tego, skąd przyszedł — bo to w nich trafia wpisywany tekst i powinny to sygnalizować.

Po twojej stronie

Komponenty nie wiedzą wszystkiego o twojej treści. To należy do ciebie:

  • Opisz wszystko etykietami. Każde pole potrzebuje widocznej etykiety <Label> lub FieldLabel; przyciski z samą ikoną — aria-label.
  • Pisz teksty, które mają sens. Etykiety linków i przycisków muszą być zrozumiałe bez kontekstu: Pobierz fakturę, a nie Kliknij tutaj.
  • Opisuj błędy słowami. Łącz aria-invalid z FieldError, który mówi, co poszło nie tak i jak to naprawić.
  • Zachowaj hierarchię nagłówków. Jeden h1 na stronę i żadnych pominiętych poziomów.
  • Zapewnij obrazom tekst alternatywny. Obrazy niosące treść potrzebują alt; dekoracyjne — alt="".
  • Nie polegaj na samym kolorze. Status potrzebuje też ikony lub tekstu.
  • Informuj o wynikach asynchronicznych. Wyniki, które pojawiają się bez zmiany strony, przekazuj przez powiadomienie albo region na żywo.

Testowanie

Testuj swój produkt tak, jak testowana jest strona prfct:

  1. Testy automatyczne — skanuj każdą stronę narzędziem axe-core w obu trybach. Zestaw testów prfct robi to dla każdej strony tej witryny, w trybie jasnym i ciemnym (pnpm test:a11y), a najbardziej interaktywne strony przechodzi klawiszem Tab, sprawdzając, czy każdy element, na który trafia fokus, pokazuje jego wskaźnik.
  2. Klawiatura — przejdź każdą ścieżkę wyłącznie z klawiatury: kolejność fokusu, widoczny fokus, brak pułapek klawiaturowych, Esc zamyka nakładki.
  3. Czytniki ekranu — sprawdź kluczowe ścieżki w VoiceOver (macOS, iOS) oraz w NVDA lub JAWS (Windows).
  4. Powiększenie i preferencje — powiększenie 200% i 400%, ograniczony ruch, zwiększony kontrast i wymuszone kolory.
Narzędzia automatyczne wyłapują tylko część problemów
axe i Lighthouse to punkt wyjścia, a nie meta. Brakujące etykiety i niski kontrast łatwo wykryć; mylącej kolejności fokusu, niejasnych komunikatów o błędach i nieogłaszanych aktualizacji — już nie. Zawsze testuj z klawiaturą i czytnikiem ekranu.