Skip to content

Toast Component

The Toast component designed with Vue 3 and Tailwind CSS. possibility to add an Icon, show a Closing button, define a Time-out, change the Position and define a Type.

Installation

To use the Toast component you need to install the @headlessui/vue package.

bash
yarn add @robuust-digital/vue-components @headlessui/vue

Import the component from the toast package

js
import { Toast } from '@robuust-digital/vue-components/toast';

Import CSS

css
@import "@robuust-digital/vue-components/toast/css";

Basic Usage

Import and use Toast in your Vue components:

vue
<template>
  <Toast
    title="Toast title goes here"
    :show="toastOpen"
    @toast:close="toastOpen = false;"
  >
    <p>Toast content goes here</p>
  </Toast>
</template>

<script setup>
import { ref } from 'vue';
import { Toast } from '@robuust-digital/vue-components/toast';

const toastOpen = ref(false);
</script>

Props

PropTypeDefaultDescription
showBooleanfalseShow or hide the toast.
asString'div'Element type to render.
titleString''Title displayed in the toast.
iconObject, FunctionnullSpecifies an icon to display before the title. @heroicons/vue can be used, or you can import your own .svg files.
timeoutNumber, Boolean5000Specify the time in ms after when the toast should be closed. Use false to keep the toast showed until closed with the close button.
positionStringbottomChange this to top to display de toast on top of the page.
typeStringinfoSets the toast's type variant. Accepts predefined values (info, warning, danger, success).
show-closeBooleanfalseChange to true to show a closing button which can close the toast.

Events

EventArgumentsDescription
toast:close-Emitted when toast close is requested

Slots

Below is example to edit the content slot of Toast:

Toast with a content slot

vue
<template>
  <Toast title="There were 2 errors with your submission">
    <ul>
      <li>Your password must be at least 8 characters</li>
      <li>Your password must include at least one pro wrestling finishing move</li>
    </ul>
  </Toast>
</template>

Examples

Basic Toast with a icon and a custom timeout

vue
<template>
  <ButtonBase label="Show Toast" @click="toast2Open = true" />

  <Toast
    title="Order completed"
    :show="toast2Open"
    :icon="CheckCircleIcon"
    :timeout="10000"
    @toast:close="toast2Open = false;"
  />
</template>

Succes Toast without timeout and with a closing button

vue
<template>
  <ButtonBase label="Show Toast" @click="toast3Open = true" />

  <Toast
    title="Order completed"
    :show="toast3Open"
    :timeout="false"
    type="success"
    :show-close="true"
    @toast:close="toast3Open = false;"
  />
</template>

Danger Toast on top of the page

vue
<template>
  <ButtonBase label="Show Toast" @click="toast4Open = true" />

  <Toast
    title="There were errors with your submission"
    :show="toast4Open"
    type="danger"
    position="top"
    @toast:close="toast4Open = false;"
  />
</template>

CSS Customization ⚡️

To customize the toast styles global

css
:root {
  /* Available variables */
  --rvc-toast-border-radius: var(--rvc-base-border-radius);
  --rvc-toast-transition-duration: var(--rvc-base-transition-duration);
  --rvc-toast-transition-timing-function: var(--rvc-base-transition-timing-function);
  --rvc-toast-border-width: var(--rvc-base-border-width);
  --rvc-toast-padding-x: calc(var(--spacing) * 6);
  --rvc-toast-padding-y: calc(var(--spacing) * 6);
  --rvc-toast-width: calc(var(--spacing) * 160);
  --rvc-toast-max-width: calc(100vw - (var(--spacing) * 12));
  --rvc-toast-font-size: var(--text-base);
  --rvc-toast-gap: calc(var(--spacing) * 1.5);
  --rvc-toast-anchor-decoration: underline;
  --rvc-toast-icon-size: calc(var(--spacing) * 6);
  --rvc-toast-title-font-weight: var(--font-weight-medium);
  --rvc-toast-transition-property: colors;
  --rvc-toast-offset: calc(var(--spacing) * 6);

  /* Default (Info) variant */
  --rvc-toast-bg-color: var(--color-blue-50);
  --rvc-toast-border-color: var(--color-blue-200);
  --rvc-toast-color: var(--color-blue-700);
  --rvc-toast-icon-color: var(--color-blue-500);
  --rvc-toast-title-color: var(--color-blue-800);
  --rvc-toast-close-bg-color: var(--color-blue-200);
  --rvc-toast-close-bg-color-hover: var(--color-blue-300);
  --rvc-toast-anchor-color-hover: var(--color-blue-600);

  /* Warning variant */
  --rvc-toast-bg-color-warning: var(--color-yellow-50);
  --rvc-toast-border-color-warning: var(--color-yellow-200);
  --rvc-toast-color-warning: var(--color-yellow-700);
  --rvc-toast-icon-color-warning: var(--color-yellow-500);
  --rvc-toast-title-color-warning: var(--color-yellow-800);
  --rvc-toast-close-bg-color-warning: var(--color-yellow-200);
  --rvc-toast-close-bg-color-warning-hover: var(--color-yellow-300);
  --rvc-toast-anchor-color-warning-hover: var(--color-yellow-600);

  /* Success variant */
  --rvc-toast-bg-color-success: var(--color-green-50);
  --rvc-toast-border-color-success: var(--color-green-200);
  --rvc-toast-color-success: var(--color-green-700);
  --rvc-toast-icon-color-success: var(--color-green-500);
  --rvc-toast-title-color-success: var(--color-green-800);
  --rvc-toast-close-bg-color-success: var(--color-green-200);
  --rvc-toast-close-bg-color-success-hover: var(--color-green-300);
  --rvc-toast-anchor-color-success-hover: var(--color-green-600);

  /* Danger variant */
  --rvc-toast-bg-color-danger: var(--color-red-50);
  --rvc-toast-border-color-danger: var(--color-red-200);
  --rvc-toast-color-danger: var(--color-red-700);
  --rvc-toast-icon-color-danger: var(--color-red-500);
  --rvc-toast-title-color-danger: var(--color-red-800);
  --rvc-toast-close-bg-color-danger: var(--color-red-200);
  --rvc-toast-close-bg-color-danger-hover: var(--color-red-300);
  --rvc-toast-anchor-color-danger-hover: var(--color-red-600);
}