Podgląd design systemu
Biblioteka komponentów
Inputy
Pola formularza (shadcn + radix)
Podstawowe kontrolki formularza z `@/components/ui` — budulec formularzy przed warstwą RHF.
Komponenty formularza z błędami
Warstwa salonowa: pola z jednym źródłem błędów (`errors` / `setFieldErrors`). Przycisk „Symuluj błąd” ustawia komunikaty we wszystkich polach — jak po nieudanym zapisie z API.
SearchInput
Pole wyszukiwania z ikoną, czyszczeniem (`X`) i wariantami wysokości `variant`.
variant="sm"
variant="md"
variant="lg"
variant="xl"
ImageUpload
Upload obrazu: layout `inline` (domyślny) vs `panel` + `aspectRatio` dla większego podglądu.
layout inline (domyślny)
layout panel
Toggle i ToggleGroup
Przełączniki stanu (np. formatowanie tekstu) i grupy wzajemnie wykluczające się opcje.
InputOTP
Pola na kod numeryczny (2FA, weryfikacja SMS).
Komunikaty i treść
Badge — warianty i wygląd
Statusy i etykiety. `variant` steruje kolorem; `appearance` dodatkowo modyfikuje styl (np. `ghost`, `light`).
`variant` (appearance domyślne)
`appearance="light"`
`appearance="outline"`
`appearance="ghost"`
`size`
ColorPicker
Wybór koloru (kwadrat podglądu + paleta w `Popover`). Ten sam wzorzec co przy kategoriach w salonie.
Aktualna wartość: #6366f1
Card
Kontener treści z nagłówkiem, treścią i stopką. Wariant `variant="accent"` dla delikatnego tła.
Tytuł karty
Treść karty. Może zawierać dowolne komponenty.
Karta accent
Wariant z tłem muted.
Alert
Komunikaty inline: informacja, sukces, ostrzeżenie, błąd — przez `variant` i `appearance`.
Skeleton
Placeholdery layoutu podczas ładowania danych.
Separator
Linia pozioma lub pionowa oddzielająca sekcje treści.
Tekst nad separatorem
Tekst pod separatorem
Code i Kbd
Fragmenty kodu inline i skróty klawiszowe w tekście.
Użyj npm install aby zainstalować zależności. Skrót zapisu: Ctrl + S.
defaultdestructiveoutlinesmlgCarousel
Poziomy slider kart — galerie, onboarding.
Modale i panele
Dialog
Modal na desktopie — treść w `DialogBody`, akcje w `DialogFooter`.
Sheet
Panel wysuwany z boku — filtry, szczegóły, nawigacja pomocnicza.
Popover
Pływający panel zakotwiczony przy wyzwalaczu — kalendarze, krótkie formularze, podpowiedzi.
Tabs
Przełączanie widoków bez zmiany URL — zakładki z treścią per `value`.
Treść pierwszej zakładki.
Tooltip
Krótka podpowiedź po najechaniu lub fokusu klawiaturą.
Accordion
Wiele rozwijanych sekcji z nagłówkami — FAQ, filtry zaawansowane.
AlertDialog
Modal blokujący — potwierdzenie destrukcyjnych akcji (np. usunięcie).
Collapsible
Jedna zwijana sekcja bez wielozakładkowej semantyki accordionu.
Drawer
Panel od dołu ekranu — naturalny wzorzec na mobile.
ModalOrDrawer
Ta sama treść: na szerokim ekranie `Dialog`, na wąskim `Drawer` — jeden kod dla obu.
FullScreenShell.Tabbed
Pełnoekranowy flow z bocznym menu zakładek, osobną treścią i stopką per tab, lazy loading (`loadData`, `loadBehavior`). Wielozakładowe formularze: `useFullScreenShellTabRhfFieldErrors` zwraca `tabRhfErrorById` (błędy RHF pogrupowane po `tabId`); w `FullScreenShellTabDefinition.badge` umieść `FullScreenShellTabErrorBadge` z czytelnym `label` (dla SR). Po błędzie z API: `applyApiFormErrors` zwraca `appliedFieldPaths` — użyj `getFirstFullScreenTabIdForRhfFieldPaths` wraz z mapą pól→zakładka i `activeTabId` + `onActiveTabChange` na `Tabbed`, by przejść do pierwszej pasującej zakładki. Patrz: modale dodawania / edycji klienta.
FullScreenShellTabErrorBadge — kropka w nawigacji bocznej; atrybut label trafia w title i aria-label.
useFullScreenShellTabRhfFieldErrors — grupuje błędy RHF per tabId (zob. pierwsza zakładka demo gdy poniżej ustawisz błąd).
Po błędzie z errors w API: applyApiFormErrors zwraca appliedFieldPaths; do przełączenia zakładki użyj getFirstFullScreenTabIdForRhfFieldPaths wraz z activeTabId / onActiveTabChange.
HoverCard
Karta podglądu po najechaniu — @wzmianki, mini-profile.
Daty i zakresy
Calendar (react-day-picker)
Pojedyncza data lub zakres — tryb `single` w demo, locale `pl`.
| pon | wto | śro | czw | pią | sob | nie |
|---|---|---|---|---|---|---|
MonthPicker, YearPicker, widoki dual
Wybór miesiąca/roku i warianty „dwa zakresy” obok siebie z jednym paskiem nawigacji — jak w raportach okresowych.
MonthPicker
{ year: 2026, month: 3 } (np. kwiecień = 3)
YearPicker
value = 2026
DualMonthPickerView
Lewy rok Y i prawy Y+1; strzałki przesuwają oba o jeden rok. Osobne wartości „od” / „do”.
from { year: 2026, month: 0 } · to { year: 2026, month: 3 }
DualYearPickerView
Dwa bloki po 12 lat; strzałki przesuwają oba o 12 lat (jak przewijanie pary miesięcy).
fromYear=2026 · toYear=2028
DateRangePeriodDropdown
Filtr okresu: presety + niestandardowy zakres. Parametry `granularity`, `customRangeLayout` (`popover-split` vs `stacked`) — wszystkie kombinacje obok siebie.
granularity="day"
Presety: tydzień / miesiąc / rok. Niestandardowy: kalendarz zakresu (2 miesiące). Lewa kolumna: panel obok listy; prawa: niestandardowy pod przyciskiem.
Domyślnie: popover-split
customRangeLayout="stacked"
dateFrom=2026-04-01 · dateTo=2026-04-30
granularity="month"
Jak lista płac: bez tygodni. W wąskim kontenerze (np. sheet) panel i tak nie przekroczy szerokości rodzica — maks. 488px jak w split.
Domyślnie: popover-split
customRangeLayout="stacked"
dateFrom=2026-04-01 · dateTo=2026-04-30
granularity="year"
Tylko bieżący / poprzedni rok. Niestandardowy: rok od / rok do (stacked obsługuje ten sam widok co month/day).
Domyślnie: popover-split
customRangeLayout="stacked"
dateFrom=2026-01-01 · dateTo=2026-12-31
Listy i nawigacja
Table
Semantyczna tabela HTML ze stylami — listy encji, podsumowania.
| Imię | Status | Wartość |
|---|---|---|
| Anna Kowalska | Aktywna | 120 zł |
| Jan Nowak | Oczekuje | 80 zł |
Avatar
Zdjęcie profilowe lub inicjały — `AvatarFallback` gdy brak obrazu.
ScrollArea
Przewijany obszar ze spójnym paskiem przewijania (radix ScrollArea).
Command
Lista z wyszukiwaniem — command palette w `Popover` lub modalu.
Pagination
Nawigacja stron list — z przyciskami `Button` jako linki/strony.
Stepper
Kroki procesu wieloetapowego (kreator, checkout).
Układ i media
Progress i Slider
Pasek postępu i suwak wartości — feedback ładowania i ustawień.
AspectRatio
Utrzymanie proporcji kontenera (np. 16:9 dla obrazów i video).
ResizablePanelGroup
Dzielenie layoutu na panele z uchwytem zmiany szerokości/wysokości.
Powiadomienia
Toast (sonner)
Powiadomienia globalne: sukces, błąd, akcja „Cofnij”.