Wzorzec 06
Powiadomienia w swojej warstwie
Komunikat o zapisie nie może rozpychać strony ani zasłaniać akcji, którą użytkownik właśnie wykonuje. Warstwa powiadomień jest pozycjonowana nad treścią, składa toasty w stos i ogłasza je czytnikom ekranu przez aria-live, a każdy toast sprząta po sobie sam.
Warstwa powiadomień nad treścią
Klikaj Zapisz wiele razy. Toasty składają się w stos w rogu warstwy i znikają same, a treść pod nimi nawet nie wie, że istnieją.
Ten tekst reprezentuje treść aplikacji. Gdyby powiadomienia uczestniczyły w layoucie, każdy zapis spychałby go w dół.
Warstwa toastów jest pozycjonowana nad treścią, więc komunikaty przychodzą i odchodzą bez śladu w geometrii strony.
Reguły
- Warstwa toastów jest jedna, pozycjonowana nad treścią i istnieje od startu aplikacji.
- Toast nigdy nie przesuwa treści, bo nie uczestniczy w jej layoucie.
- Kontener ma aria-live polite, więc czytniki ekranu ogłaszają komunikaty bez przerywania pracy.
- Toast znika sam po kilku sekundach, ale zawsze daje się zamknąć ręcznie.
Wzorzec w kodzie
<div
aria-live="polite"
className="pointer-events-none fixed inset-x-4 bottom-4 z-50 flex flex-col items-end gap-2"
>
{toasts.map((toast) => (
<Toast key={toast.id} {...toast} className="pointer-events-auto" />
))}
</div>function show(content: string) {
const id = nextId();
setToasts((state) => [...state, { id, content }]);
setTimeout(() => {
setToasts((state) => state.filter((toast) => toast.id !== id));
}, 3200);
}