Blog

Optimistic UI w React: interfejs, który świadomie kłamie

Przycisk „Polub” reaguje natychmiast, serce się wypełnia, licznik rośnie – zanim serwer w ogóle odpowiedział. To nie iluzja szybkości z artykułu o mikrointerakcjach, to coś dalej idącego: interfejs pokazuje stan, który jeszcze nie istnieje, i zakłada, że zaraz zaistnieje. Sprawdzam, jak zbudować to bezpiecznie – z realnym wycofaniem się z kłamstwa, gdy założenie się nie sprawdzi, i dlaczego ręczny setState plus catch to gorsza wersja tego, co daje useOptimistic.

CSS @layer: jak cascade layers kończą wojnę o specyficzność

Klasa narzędziowa .mt-4 przegrywa z regułą .card .card__header .card__title, mimo że logicznie powinna wygrać, bo dodano ją później. To nie przypadek – to specyficzność robiąca dokładnie to, do czego została zaprojektowana. @layer wprowadza całkiem nową oś rozstrzygania konfliktów, która działa przed specyficznością, nie razem z nią – i ma jedną pułapkę tak nieintuicyjną, że łamie ją nawet część dokumentacji w sieci.

Server Actions w Next.js: formularz, który działa, zanim JavaScript się załaduje

„use server” wygląda jak składniowy cukier na fetch do API route – i właśnie dlatego większość wdrożeń traktuje go jak zwykłe wywołanie funkcji. To błąd o konkretnych konsekwencjach: każda funkcja oznaczona „use server” staje się publicznym punktem końcowym w sieci, a formularz zbudowany na tym mechanizmie działa nawet zanim JavaScript zdąży się załadować. Sprawdzam, co faktycznie dzieje się pod tą dyrektywą, i gdzie leżą pułapki, których nie widać w dokumentacji na pierwszy rzut oka.

CSS :has() — rodzic, który wie, co się dzieje w środku

Pole formularza ma się podświetlić na czerwono, gdy input w środku jest niepoprawny. Prosta rzecz – tylko że CSS przez 25 lat nie potrafił zapytać elementu o to, co się dzieje w jego wnętrzu, a jedynie na odwrót. Sprawdzam, jak :has() odwraca ten kierunek, czym różni się od zwykłych kombinatorów i gdzie ta nowa moc realnie kosztuje wydajność.

Container Queries: komponent, który zna swój kontener, nie viewport

Ta sama karta produktu wygląda świetnie w gridzie i łamie się w wąskim sidebarze – mimo starannie dobranych media query. Problem nie leży w Twoim kodzie, tylko w pytaniu, jakie zadaje media query: o szerokość ekranu, nie o miejsce, jakie komponent faktycznie dostał. Sprawdzam, jak container queries przenoszą to pytanie tam, gdzie powinno paść od początku, i co naprawdę dzieje się pod spodem, gdy element staje się „kontenerem zapytania”.