Wzorzec 21
Przejście zamiast teleportacji
Po filtrowaniu listy użytkownik traci z oczu kartę, na którą patrzył, bo wszystko zmienia miejsce w jednej klatce. document.startViewTransition robi zrzut starego stanu, wprowadza nowy i animuje różnicę, a view-transition-name mówi przeglądarce, które elementy są tym samym bytem.
Filtruj i tasuj, nie gubiąc kart z oczu
Każda karta ma view-transition-name, więc przy zmianie kolejności płynie na nowe miejsce, zamiast teleportować się w jednej klatce. Filtrowanie wygasza znikające karty i wprowadza wracające.
Atlas
Branding
Heliotrop
Aplikacja
Novak
E-commerce
Wrzos
Branding
Akademia
Aplikacja
Magazyn
E-commerce
Siatka rezerwuje wysokość pełnego zestawu, więc filtrowanie nie rusza treści pod demo. Bez wsparcia przeglądarki i przy reduced motion ta sama funkcja aktualizuje stan natychmiast.
Reguły
- Zmianę stanu opakowuje document.startViewTransition, reszta kodu zostaje bez zmian.
- Każdy przenoszony element ma unikalny view-transition-name, więc płynie, zamiast znikać i wracać.
- Wzorzec dotyczy elementów współdzielonych w jednym widoku, nie przejścia między całymi stronami.
- Brak wsparcia degraduje do natychmiastowej zmiany: ta sama funkcja aktualizuje stan z przejściem i bez.
- prefers-reduced-motion pomija przejście i wprowadza nowy stan od razu.
Wzorzec w kodzie
function withTransition(update: () => void) {
const reducedMotion = matchMedia(
"(prefers-reduced-motion: reduce)",
).matches;
if (!document.startViewTransition || reducedMotion) {
update();
return;
}
document.startViewTransition(() => {
flushSync(update);
});
}<div style={{ viewTransitionName: `karta-${project.id}` }}>
{project.name}
</div>Ten wzorzec dotyczy elementów, które użytkownik śledzi wzrokiem w jednym widoku: karta przy filtrze, miniatura przy zmianie układu. Nie animujesz całego UI, tylko to, co ma się mapować między stanami.
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 „Przejście zamiast teleportacji" z metodologii Liquid Design. View Transitions API animuje przejście między dwoma stanami DOM: karty płyną na nowe miejsca, zamiast teleportować się przy każdym sortowaniu. Wymagania: - Zmianę stanu opakowuje document.startViewTransition, reszta kodu zostaje bez zmian. - Każdy przenoszony element ma unikalny view-transition-name, więc płynie, zamiast znikać i wracać. - Wzorzec dotyczy elementów współdzielonych w jednym widoku, nie przejścia między całymi stronami. - Brak wsparcia degraduje do natychmiastowej zmiany: ta sama funkcja aktualizuje stan z przejściem i bez. - prefers-reduced-motion pomija przejście i wprowadza nowy stan od razu. 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/przejscia-widokow