Wzorzec 01
Cztery stany widoku
Widok projektowany tylko dla szczęśliwej ścieżki rozpada się przy pierwszym pustym wyniku albo błędzie sieci. W liquid design wszystkie cztery stany powstają razem, mieszkają w kontenerze o wspólnych wymiarach i wymieniają się bez śladu w otaczającym layoucie.
List projektów w czterech stanach
Przełączaj stany i obserwuj krawędź panelu. Container trzyma wymiary, więc reszta strony nawet nie wie, że coś się zmieniło.
Atlas Rebranding
Postęp: 68%
W toku
Sklep Novak Studio
Postęp: 91%
Review
Panel Heliotrop
Postęp: 100%
Gotowe
Reguły
- Kontener widoku ma stałą minimalną wysokość, wspólną dla wszystkich stanów.
- Stan pusty mówi, co zrobić dalej, i prowadzi do konkretnej akcji, zamiast zostawiać białą plamę.
- Stan błędu zawiera przycisk ponowienia w tym samym miejscu, w którym stała treść.
- Przełączenie stanu nigdy nie zmienia pozycji elementów poza kontenerem.
Wzorzec w kodzie
type ViewState<T> =
| { stan: "loading" }
| { stan: "content"; data: T }
| { stan: "empty" }
| { stan: "error"; message: string };
function ProjectList({ view }: { view: ViewState<Projekt[]> }) {
return (
<div className="grid min-h-64 grid-rows-1">
{view.state === "loading" && <ListSkeleton />}
{view.state === "content" && <List projects={view.data} />}
{view.state === "empty" && <EmptyState />}
{view.state === "error" && <ErrorState komunikat={view.message} />}
</div>
);
}function EmptyState() {
return (
<div className="flex flex-col items-center justify-center gap-3">
<p className="font-semibold">Nie masz jeszcze projektów</p>
<p className="text-sm">Załóż pierwszy albo poproś o zaproszenie.</p>
<Button variant="secondary">Nowy projekt</Button>
</div>
);
}Prompt dla Claude
Wklej do Claude Code w swoim projekcie. Prompt niesie komplet reguł tej lekcji i ogólne zasady Liquid Design, więc implementacja trafia w metodologię bez tłumaczenia jej od zera.
Zaimplementuj w moim projekcie wzorzec „Cztery stany widoku" z metodologii Liquid Design. Każdy widok danych ma cztery stany: ładowanie, treść, pustkę i błąd. Wszystkie dzielą jeden layout. Wymagania: - Kontener widoku ma stałą minimalną wysokość, wspólną dla wszystkich stanów. - Stan pusty mówi, co zrobić dalej, i prowadzi do konkretnej akcji, zamiast zostawiać białą plamę. - Stan błędu zawiera przycisk ponowienia w tym samym miejscu, w którym stała treść. - Przełączenie stanu nigdy nie zmienia pozycji elementów poza kontenerem. Ogólne reguły Liquid Design, których implementacja nie może złamać: - HTML jest semantyczny: button, a, nav, form, label, dialog, details, ul, dl i nagłówki h1-h6 zamiast div z onClick i ARIA dopisywanym ręcznie. div i span służą wyłącznie do layoutu, nigdy do interakcji ani struktury treści. - Layout jest umową: treść, która dociera później, ma miejsce zarezerwowane od pierwszego renderu. Nic nie skacze. - Stany ładowania, pustki, błędu i treści dzielą jeden layout. - Typografia pochodzi z nazwanej, płynnej skali opartej o clamp(), nie z gołych rozmiarów. - Animacje dotyczą wyłącznie transform i opacity, a prefers-reduced-motion redukuje je do natychmiastowej zmiany stanu. - Breakpoint jest ostatecznością: najpierw container queries i repeat(auto-fit, minmax(...)). Sposób pracy – zanim napiszesz pierwszą linię kodu: - Sprawdź w plikach projektu, jak stylowane są komponenty (Tailwind, CSS Modules, vanilla-extract, styled-components, Sass, czysty CSS...) i pisz wyłącznie w tej konwencji. Niczego nie zakładaj z góry i nie dodawaj nowych zależności. - Wymagania powyżej opisują właściwości CSS i atrybuty HTML, nie klasy narzędziowe. Przełóż je na system stylowania zastany w projekcie. - Sprawdź framework komponentów, wersję i konwencje nazewnictwa, zamiast zakładać konkretny stack. - Używaj istniejących tokenów projektu (kolory, typografia, odstępy). Jeśli czegoś brakuje, zaproponuj minimalne uzupełnienie w duchu istniejącego kodu, nie osobny system. - Nie używaj klas, tokenów ani API, których nie znalazłeś w tym projekcie. Pełny opis z żywym demo i kodem: https://liquid-design.website/wzorce/stany-danych