Popser

Toasts that don't make you cry.

Headless Base UI. Sonner-compatible API.
No !important hacks. No memory leaks. No existential dread.

or, if you're fancy
Unique
Anchored toastsPin to elements, clicks, or coordinates. Sonner can't. Popser can.
Headless Base UINo opinions. Your CSS wins every argument.
Sonner-compatibleSame API. Drop-in replacement. All the greatest hits.
No !importantZero specificity wars. Override anything. Like civilised people.
No memory leaksProper cleanup. Your app won't slowly eat itself alive.
AccessibleARIA live regions, F6 navigation. Not an afterthought.
E2E readydata-popser-id on every toast. Your tests won't be flaky (for once).
Zero icon depsFive inline SVGs. One CSS spinner. No library tax.

Go on, break something

Try the click-anchored one. That's the one Sonner doesn't have.

Five lines. That's it.

import { toast, Toaster } from "@vcui/popser";
import "@vcui/popser/styles";

function App() {
  return (
    <>
      <button onClick={() => toast.success("Saved!")}>
        Save
      </button>
      <Toaster />
    </>
  );
}