liquiddesign

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

Jedna warstwa fixed z aria-live, poza layoutem treści
<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>
Toast sprząta po sobie sam
function show(content: string) {
  const id = nextId();
  setToasts((state) => [...state, { id, content }]);
  setTimeout(() => {
    setToasts((state) => state.filter((toast) => toast.id !== id));
  }, 3200);
}