ESC

Type to search the knowledge base.

SnippetJavaScript

Toast

Lightweight toast/notification queue with auto-dismiss and aria-live.

Explanation

Toasts should use an aria-live region so screen readers announce them. Queue multiple messages; allow manual dismiss.

javascript
export function createToaster(host, { duration = 4000 } = {}) {
  host.setAttribute('aria-live', 'polite');
  host.setAttribute('aria-relevant', 'additions');

  function show(message, { variant = 'info' } = {}) {
    const el = document.createElement('div');
    el.className = `toast toast--${variant}`;
    el.setAttribute('role', 'status');
    el.textContent = message;

    const close = document.createElement('button');
    close.type = 'button';
    close.setAttribute('aria-label', 'Dismiss');
    close.textContent = '×';
    close.addEventListener('click', () => el.remove());
    el.append(close);
    host.append(el);

    const t = setTimeout(() => el.remove(), duration);
    el.addEventListener('mouseenter', () => clearTimeout(t), { once: true });
    return el;
  }

  return { show };
}

Usage example

javascript
const toaster = createToaster(document.getElementById('toasts'));
toaster.show('Saved', { variant: 'success' });
toaster.show('Something failed', { variant: 'error', duration: 6000 });

Related

← All snippets