bx

Sonner

An opinionated toast component for PRISM.

tsx
<Toaster richColors />

<Button onClick={() => window.dispatchEvent(new CustomEvent("bext-toast",
  { detail: { title: "Saved!", variant: "success" } }))}>Save</Button>

Sonner — système de toast opinionné (stacking, swipe-to-dismiss, promise/loading states). Composant unique Toaster à monter une seule fois dans le layout ; les toasts sont ensuite déclenchés depuis un island via window.dispatchEvent(new CustomEvent("bext-toast", {...})).

Alternative "batteries incluses" au primitif Toast de shadcn (nous n'exposons pas encore ce dernier — utiliser Sonner par défaut).

Installation

Terminal
$ bext ui add sonner

Usage

tsx
import { Toaster } from "@bext-stack/ui/primitives"

// Dans _layout.tsx (une fois) :
<Toaster richColors />

// Puis n'importe où dans un island :
window.dispatchEvent(new CustomEvent("bext-toast", {
  detail: { title: "Saved!", variant: "success" }
}))

Anatomy

<Toaster position="bottom-right" richColors? />

API Reference

Toaster

Prop Type Default Description
position "top-left" | "top-center" | "top-right" | "bottom-left" | "bottom-center" | "bottom-right" "bottom-right" undefined
richColors boolean success/error/warning tinted au lieu de neutre.
closeButton boolean Bouton × sur chaque toast.
duration number 4000 Ms avant auto-dismiss.

Data Attributes

Attributs qu'on peut cibler en CSS custom pour override le style par état.

Attribute On Values Description
data-ui="sonner" Toaster root undefined undefined
data-position container "bottom-right" | ... undefined

Keyboard

Key Action
Escape Ferme le toast focus.

Accessibility

Chaque toast porte role="status" pour un update passif, ou role="alert" pour une erreur importante. Le container est un <section aria-label="Notifications">.

Try it live
Open in play

Edit this component live in the bext playground. The PRISM + signals version is the bext-native idiom — fine-grained reactivity, no virtual DOM.

src/app/page.tsx 2 files · signals · runs in your browser
Pure PRISM + real bext signals — fine-grained, no re-render.