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 🙏

© 2024 – Pkg Stats / Ryan Hefner

vanilla-js-toast

v1.5.0

Published

A simple vanilla JS toast notification library

Downloads

397

Readme

Vanilla JS Toast Library

A simple vanilla JS toast notification library.

Installation

Install the library using npm:

npm install vanilla-js-toast

Usage

Importing the Library

To use the Toast class and styles, import them as follows:

import { Toast } from 'vanilla-js-toast'
import 'vanilla-js-toast/styles'

Creating a Toast Instance

Create an instance of the Toast class with optional configuration:

const toast = new Toast({
  position: 'br', // bottom-right
  maxWidthPx: 400,
  defaultIconSizePx: 18, // for toasts that have an icon (success, error, warning, info)
  richColors: true,
  preventClosingOnHover: true,
  durationMs: 5000,
  showCloseButton: true,
  closeButtonPosition: 'tr' // top-right
})

Or you could simply create an instance of the Toast class with default configuration options:

const toast = new Toast()

Showing Toasts

You can show different types of toasts calling a method from the Toast instance with the name of the type you want to show, following this syntax:

toast.$toastType($content, $options)
  • where $toastType can be one of the following: default, success, error, warning, info, or loading.
  • where $content is a string with the message you want to show
  • where $options is an object with the following properties:
    • title (default <empty string>): string
    • durationMs (default 5000): number
    • showCloseButton (default false): boolean
    • closeButtonPosition (default 'tr'): 'tl' | 'tr'

The properties: durationMs, showCloseButton, and closeButtonPosition can also be specified when creating an instance of the Toast class, that way if you want to change one of this properties default value for all toasts you can simply set it when creating the instance instead of specifying it every time you call a method to show a toast.

Also if you want to change one of this properties for all toasts but you want only one of them to have a different value, you could always specify it when calling the toast instance method, since this options have a higher priority than the ones set when creating the Toast instance.

For example, if you create this instance:

const toast = new Toast({
  durationMs: 10 * 1000,
  showCloseButton: true,
  closeButtonPosition: 'tr'
})

All toasts by default will now show for 10 seconds, and have a close button at the top right corner; but if you want to change this on one of your toasts you could always do it like so:

toast.success('success toast with different options than the Toast instance', {
  durationMs: 3 * 1000,
  showCloseButton: false
})

Check out an example calling each of the available methods from the toast instance for each of the available $toastType values:

Default Toast

With default option values:

toast.default('This is a default toast')

With custom option values:

toast.default('This is a default toast', {
  title: 'Default toast title',
  durationMs: 10 * 1000,
  showCloseButton: true
})

Success Toast

With default option values:

toast.success('This is a success toast')

With custom option values:

toast.success('This is a success toast', {
  durationMs: 4 * 1000,
  showCloseButton: true,
  closeButtonPosition: 'tl'
})

Error Toast

With default option values:

toast.error('This is an error toast')

With custom option values:

toast.error('This is an error toast', {
  title: 'Error toast title'
})

Warning Toast

With default option values:

toast.warning('This is a warning toast')

With custom option values:

toast.warning('This is a warning toast', {
  showCloseButton: true
})

Info Toast

With default option values:

toast.info('This is an info toast')

With custom option values:

toast.info('This is an info toast', {
  durationMs: 15 * 1000
})

Loading Toast

With default option values:

toast.loading('This is a loading toast')

With custom option values:

toast.loading('This is a loading toast', {
  durationMs: 15 * 1000
})

Removing a Toast

You can force a toast to be removed from the UI calling the remove method from the toast instance with the toastId:

const toastId = toast.success('This toast will be removed soon')
toast.remove(toastId)

Note: all methods shown before (default, success, error, warning, info) return the toastId which can be used to remove the toast later by calling the toast.remove method

Using Promises with Toasts

You can show toasts based on the state of a promise:

toast
  .promise(
    fetch('https://api.weather.gov/'),
    {
      loading: {
        content: 'Loading weather data',
        title: 'Loading' // <- optional property
      },
      success: {
        content: 'Weather data loaded',
        title: 'Success' // <- optional property
      },
      error: {
        content: 'Error loading weather data',
        title: 'Error' // <- optional property
      }
    },
    {
      durationWhenDoneMs: 7000, // <- optional property (default = 5000)
      showCloseButtonWhenDone: true, // <- optional property (default = false)
      closeButtonPositionWhenDone: 'tr'
    }
  )
  .then((res) => {
    console.log(res)
  })
  .catch((err) => {
    console.error(err)
  })

Keep in mind that setting different values for the durationMs, showCloseButton, and closeButtonPosition when creating an instance of the Toast class, will change the default values of the durationWhenDoneMs, showCloseButtonWhenDone, closeButtonPositionWhenDone optional properties respectively.

Configuration Options

Toast Class Constructor Options

  • position (default: 'br'): Position of the toasts container. Possible values: 'tl', 'tr', 'bl', 'br', 'tc', 'bc'.
  • maxWidthPx (default: 400): Maximum width of the toasts container in pixels.
  • defaultIconSizePx (default: 18): Default size of the icons in pixels.
  • richColors (default: true): Whether to use rich colors for different toast types.
  • preventClosingOnHover (default: true): Whether to prevent the toast from closing when hovered.
  • durationMs (default: 5000): Duration in milliseconds before the toast disappears.
  • showCloseButton (default: false): Whether to show a close button on the toasts.
  • closeButtonPosition (default: 'tr'): Position of the close button. Possible values: 'tr' (top-right), 'tl' (top-left).

Toast Options

  • title (optional): Title of the toast.
  • showCloseButton (optional): Whether to show a close button on the toast.
  • closeButtonPosition (optional): Position of the close button. Possible values: 'tr', 'tl'.
  • durationMs (default: 5000): Duration in milliseconds before the toast disappears. Use Infinity to keep the toast visible indefinitely (you need to make sure to remove the toast using the remove method if you set Infinity as the duration).

Methods

  • Shows a default toast:

default(content: string, options?: ToastOptionsType)

  • Shows a success toast:

success(content: string, options?: ToastOptionsType)

  • Shows an error toast:

error(content: string, options?: ToastOptionsType)

  • Shows a warning toast:

warning(content: string, options?: ToastOptionsType)

  • Shows an info toast:

info(content: string, options?: ToastOptionsType)

  • Shows a loading toast:

loading(content: string, options?: ToastOptionsType)

  • Removes a toast by its ID:

remove(toastId: string)

  • Shows toasts based on the state of a promise:
promise(
  promise: Promise<any>,
  toasts: {
    loading: { content: string; title?: string },
    success: { content: string; title?: string },
    error: { content: string; title?: string }
  },
  options?: {
    durationWhenDoneMs?: number
    showCloseButtonWhenDone?: boolean
    closeButtonPositionWhenDone?: ToastCloseButtonPositionsType
  }
)

Using the Library with a CDN

For those who want to use the library without a bundler, you can import the JS and CSS files using a CDN.

JS and CSS CDN Links

Use the following links to include the library in your project:

  • JS: https://cdn.jsdelivr.net/gh/jorgeabrahan/vanilla-js-toast@main/dist/index.esm.js
  • CSS: https://cdn.jsdelivr.net/gh/jorgeabrahan/vanilla-js-toast@main/dist/toast.css

Example Usage with CDN

Include the following in your HTML file:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vanilla JS Toast Example</title>
    <!-- Import the CSS file from the CDN -->
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/gh/jorgeabrahan/vanilla-js-toast@main/dist/toast.css"
    />
  </head>
  <body>
    <script
      src="https://cdn.jsdelivr.net/gh/jorgeabrahan/vanilla-js-toast@main/dist/index.esm.js"
      type="module"
    ></script>
    <script type="module">
      import { Toast } from 'https://cdn.jsdelivr.net/gh/jorgeabrahan/vanilla-js-toast@main/dist/index.esm.js'

      const toast = new Toast({
        position: 'br',
        maxWidthPx: 400,
        defaultIconSizePx: 18,
        richColors: true,
        showCloseButton: false,
        preventClosingOnHover: true,
        closeButtonPosition: 'tr'
      })

      toast.success('This is a success toast message')
    </script>
  </body>
</html>

Replacing Toasts

The vanilla-js-toast library allows you to replace the content of an existing toast by using the replaceToastId option. This is useful when you want to update the message or type of a toast without creating a new one.

Example Usage

Here is an example of how to use the replaceToastId option to replace a toast:

const btnFetchData = document.getElementById('btnFetchData')
btnFetchData.addEventListener('click', () => {
  // Show a loading toast
  const toastId = toast.loading('Removing element', {
    durationMs: Infinity
  })

  // Simulate a server request
  simulateFetchDataFromServer().then((res) => {
    if (!res.ok) {
      // Replace the loading toast with a warning toast if the request fails
      toast.warning('The element could not be removed', {
        replaceToastId: toastId
      })
      return
    }

    // Replace the loading toast with an action toast if the request succeeds
    toast.action('The element was removed', {
      label: 'Undo',
      onClick: () => {
        console.log('Undo clicked')
      }
    }, {
      replaceToastId: toastId,
      showCloseButton: true
    })
  }).catch(() => {
    // Replace the loading toast with an error toast if there is an error
    toast.error('Error removing element', {
      replaceToastId: toastId
    })
  })
})

In this example:

  • A loading toast is shown when the button is clicked.
  • If the simulated server request fails, the loading toast is replaced with a warning toast.
  • If the request succeeds, the loading toast is replaced with an action toast that includes an “Undo” button.
  • If there is an error during the request, the loading toast is replaced with an error toast.

By using the replaceToastId option, you can ensure that only one toast is displayed at a time, and you can update its content based on the result of asynchronous operations.

Important Notes

1- Indefinite Duration: The loading toast is shown with durationMs set to Infinity to keep it visible indefinitely, as the time required to resolve the promise is unknown.

2- Timeout Management: Setting durationMs to Infinity does not mean the toast will never be hidden. When the loading toast is replaced by another toast, the original timeout is cleared, and a new timeout is created with the durationMs of the replacement toast. For example, if the loading toast had a durationMs of 5 seconds and was replaced by the toast.action toast at the 4th second, the toast would not disappear at the 5th second. Instead, the previous timer is cleared, and a new timer is set with the durationMs of the toast.action toast.