npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

toasterhea

v2.0.2

Published

Promise-driven toast poppin' library.

Downloads

733

Readme

toasterhea 🍞

Promises with UI.

About

toasterhea lets you render React components as toast-like UI elements that behave like Promises.

This makes it easy to implement async flows such as modals, confirmation dialogs, or multi-step wizards — all using your own components and styling.


Why

React doesn’t have a built-in way to tie UI directly to promise resolution. If you want something like:

const confirmed = await confirmDialog('Are you sure?')

...you’re left building your own state machine. toasterhea handles that for you, using components as promise interfaces.


Installation

npm install toasterhea

Note: react and eventemitter3 are required peer dependencies.


Example

import { toaster } from 'toasterhea'

const Foo = toaster()

// Step 1: Create a component that accepts resolve/reject
function Confirm({ resolve }: { resolve: (value: boolean) => void }) {
    return (
        <div className="toast">
            <p>Are you sure?</p>
            <button onClick={() => resolve(true)}>Yes</button>
            <button onClick={() => resolve(false)}>Cancel</button>
        </div>
    )
}

// Step 2: Wrap it with create
const confirm = Foo.create(Confirm).pop

// Step 3: Use it like a promise. Anywhere!
const result = await confirm()

Rendering

Render the toast container in your app:

function App() {
    return (
        <>
            <Foo.Container />
        </>
    )
}

The container supports inline rendering:

<Foo.Container inline />

Toast Component Requirements

Your toastable component must:

  • Be a function component
  • Accept resolve(value?) and/or reject(reason?) props
  • Call one of them to settle

Additional props can be passed through .pop(props).

function ExampleToast({
    resolve,
    reject,
    name,
}: {
    resolve: (result: string) => void
    reject: () => void
    name: string
}) {
    /* ... */
}

API

toaster()

Creates a new toaster instance.

const t = toaster()

Returns:

  • Container: React component to render active toasts
  • create(component): wraps a component into { pop, discard }
  • hasActive(component?): check if any toast is active
  • on(), off(): subscribe to update events

.create(component)

Wraps a component and returns { pop, discard }:

  • pop(props?): shows the component and returns a promise
  • discard(): programmatically cancel the toast

The props passed to pop() will be merged with { resolve, reject }.


useDisposeEffect

Allows components to delay disposal for animation or async work:

useDisposeEffect((finish) => {
    animateOut().then(finish)
})

Must call finish() when done.


ToastCancelled

An error class representing user cancellation. Useful for flow control.

import { isCancelledByHost } from 'toasterhea'

try {
    await toast.pop()
} catch (e) {
    if (isCancelledByHost(e)) {
        // user cancelled
    }
}

Wizard Pattern Example

Chain multiple steps:

const confirmName = Foo.create(NameStep)
const confirmAvatar = Foo.create(AvatarStep)

try {
    const name = await confirmName.pop()
    const avatar = await confirmAvatar.pop()
    // done
} catch (e) {
    if (isCancelledByHost(e)) {
        // user bailed
    }
}

License

MIT. Use responsibly. Don’t forget to resolve your promises.