Projekt

Toast Notification Library

Et lille GPL-3-bibliotek du kan lægge ved siden af enhver HTML-side: ét script, ét stylesheet og ét kald til showToast(options). Det løser de kedelige ting - stabler, hjørner, auto-luk, valgfri fremdrift - og holder frameworks ude af historien, så demos, interne værktøjer og ældre sider kan dele samme adfærd.

← Tilbage til projekter Kontakt om front-end Live demo Kilde på GitHub

Hvad det er

Biblioteket er en ToastManager-klasse plus tynde globale funktioner: showToast, dismissToast, clearAllToasts og genveje som showToast.success(text, options). README bevidst uden npm - du linker toast.css og toast.js, og så kører det. Det matcher den live demo på statisk hosting.

Hver notifikation er et div.toast-item med indhold: en .toast-content-blok (ikon-span + tekstafsnit), en valgfri ×-lukknap og en valgfri .toast-timer-bjælke når duration er over nul og showTimerBar er true. Beholdere oprettes pr. hjørne (eller midten): .toast-container.top-right m.fl. monteres på document.body første gang den position bruges.

Der findes seks forudindstillinger - success, error, warning, info, reminder og custom - hver med gradient og emoji-ikon i typeConfig. Du kan tilsidesætte udseende pr. toast med customStyles (inline styles + valgfri ekstra klasse) eller ved at redigere toast.css for hele sitet.

  • Nul nye runtime-afhængigheder ud over browserens DOM-APIer.
  • Escape rydder alt; luk-knap kalder dismiss med stopPropagation så den ikke trigger “klik for link”.
  • Højst fem toasts pr. position; den ældste fjernes før der kommer en ny.
  • duration: 0 lader toasten stå til manuel luk (respekterer stadig close).
  • role="alert", aria-live="polite" og tabindex="0" for hjælpeteknologi.

Sådan kalder du API'et

show fletter dit objekt med defaults: type info, position top-right, duration 3000 ms, close true, stopOnFocus true, newWindow true, showTimerBar true og et tomt customStyles-objekt. Det eneste krav er text; uden den logger biblioteket en fejl og returnerer null.

destination gør hele toasten klikbar: et klik åbner window.open med noopener/noreferrer når newWindow er true, ellers sættes window.location.href. Ikoner kommer fra customStyles.icon hvis sat, ellers fra typeConfig for typen, med en taleboble-fallback.

showToast({
  text: "Saved successfully",
  type: "success",
  position: "bottom-right",
  duration: 4000,
  close: true,
  stopOnFocus: true,
  showTimerBar: true,
  destination: "https://example.com/log",
  newWindow: false,
  customStyles: {
    borderRadius: "10px",
    customClass: "site-toast"
  }
});

// Shorthand helpers mirror the same options object
showToast.error("Network failed", { duration: 0, close: true });

Convenience-metoder er sukker: de spreader options og sætter type. Timer-logikken binder timeout i startTimer sammen med CSS-bredde-transition på .toast-timer, så bjælken krymper lineært over remainingTime; pauseTimer rydder timeout, fryser bredde, og resumeTimer genstarter både animation og timeout med den resterende tid.

Sådan er koden bygget

Ved konstruktion initialiserer ToastManager to Maps: toasts (numerisk id → { element, config, timer, … }) og containers (positionsnøgle → DOM-knode). init indsætter et link til toast.css hvis #toast-styles mangler, og lytter på keydown på document, så Escape kalder clearAll.

createToastElement bygger træet, sætter pause ved hover/fokus når stopOnFocus er true og duration er positiv, og monterer timerbjælken når den er ønsket. getContainer opretter lazy absolutely positioned flex-stakke med klassen toast-container og positionsnavnet. enforceMaxToasts fjerner den tidligste .toast-item i den stak før maxToasts overskrides.

// Merged config + lifecycle (conceptual excerpt)
const config = { ...this.defaults, ...options };
this.enforceMaxToasts(config.position);
const container = this.getContainer(config.position);
const toastElement = this.createToastElement(toastId, config);
container.appendChild(toastElement);
requestAnimationFrame(() => this.animateIn(toastElement, config.position));
if (config.duration > 0) this.startTimer(toastId);

// Published on window after load
const toastManager = new ToastManager();
window.showToast = (options) => toastManager.show(options);

Animationer er klasse-drevet: toast-enter / toast-enter-active (og from-left / from-center hvor det passer) styrer indgang; toast-exit / toast-exit-active plus retning to-* styrer 300 ms ud før knuden fjernes. applyCustomStyles mapper kendte nøgler fra customStyles til inline styles og kan tilføje customClass.

  • dismiss rydder timeouts, afspiller animateOut, fjerner knuden og sletter tomme beholdere fra containers-mappet.
  • Tastaturfokus inde i toasten deltager i pause/genoptag sammen med musehover.
  • Timerens indre gradient er et separat lag for en diskret highlight over den krympende bjælke.

CSS og temaer

toast.css ejer layout, stacking, z-index og de transition-forudsætninger som JS skifter. Fordi typer udtrykkes som klasser på .toast-item (fx .toast-item.success), kan du omfarve presets uden at ændre JavaScript - sørg for samme specificitet som stylesheetet.

Til kampagner: brug customStyles til engangsændringer og globale overrides til design tokens (afstand, skygge, typografi). Hold positionsklasser synkron med showToast-strengene: top-left, top-right, bottom-left, bottom-right, center.

/* Stronger success colour sitewide */
.toast-item.success {
  background: linear-gradient(135deg, #059669, #047857);
}

/* Clickable toasts: pointer cursor comes from .clickable */
.toast-item.clickable {
  cursor: pointer;
}

/* Pause state during hover/focus (class added in JS) */
.toast-timer.paused {
  transition: none !important;
}

Prøv det og brug det

Den interaktive demo tester positioner, lange varigheder, stress-test og custom styling på én side - brug den som regressions-tjek når du forker eller ændrer styling.

Kilde og licens ligger på GitHub under GPL-3.0. Til produktion kan du overveje at fjerne omfattende console.log-kald, hvis din fork stadig har debug i createToastElement/startTimer.