Toast

Push notifications to your visitors with BToast and BToastOrchestrator. These are components that are easily customizable for generating alert messages

Toasts are lightweight notifications designed to mimic the push notifications that have been popularized by mobile and desktop operating systems. Toasts are intended to be small interruptions to your visitors or users and therefore should contain minimal, to-the-point, non-interactive content. Please refer to the Accessibility Tips section below for important usage information

Overview

This section only refers to using the raw component variation. Often times, Toasts are generated in a global context programatically, like showing a success message after saving a form. That functionality is covered under the composable docs here

The component variation is shown by using the v-model like so

HTML
vue
<template>
  <BToast v-model="active" variant="info">
    <template #title> Title </template>
    Body
  </BToast>
</template>

<script setup lang="ts">
const isActive = ref(false)
</script>

By default Toasts are rendered in place. You can use Vue's Teleport to change the location, commonly to body

Positioning

In combination with Teleport, you can render Toasts above the page, and in specific locations. You will need to create a wrapper component around said Toast to declare its location

HTML
vue
<template>
  <template v-for="(pos, index) in values" :key="index">
    <BButton @click="values[index] = !values[index]">
      {{ locations[index] }}
    </BButton>
    <Teleport to="body">
      <div :class="locations[index]" class="toast-container position-fixed p-3">
        <BToast v-model="values[index]">
          <template #title> Title </template>
          {{ locations[index] }}
        </BToast>
      </div>
    </Teleport>
  </template>
</template>

<script setup lang="ts">
const locations = [
  'top-0 start-0',
  'top-0 start-50 translate-middle-x',
  'top-0 end-0',
  'top-50 start-0 translate-middle-y',
  'top-50 start-50 translate-middle',
  'top-50 end-0 translate-middle-y',
  'bottom-0 start-0',
  'bottom-0 start-50 translate-middle-x',
  'bottom-0 end-0',
]

const values = ref(Array.from({length: locations.length}, () => false))
</script>

Static placement

You can place toasts in static placements, and with more control by using them directly. Although, it is more uncommon

HTML
template
<BToast v-model="active" variant="info">
  <template #title>
    Title
  </template>
    Body
</BToast>
<BButton @click="active = !active">Toggle</BButton>

Auto-dismissing Toasts

To create a BToast that dismisses automatically after a specified duration, set the value prop to the number of milliseconds you want the BToast to remain visible. By default, the timer updates using requestAnimationFrame, which triggers an update approximately every second. Timed Toasts automatically pause when hovered over with a mouse, but you can disable this behavior using the noHoverPause prop. Ensure that the value is an integer representing milliseconds. Any change to the value will reset the timer.

The interval prop determines how frequently the timer updates. While the default is requestAnimationFrame, you can set a custom interval. Negative values for either value or interval will stop the timer. If the value does not divide evenly by the interval, the timer will continue to the nearest interval. For example, a value of 5400 ms with an interval of 1000 ms will run for 6000 ms. To avoid this, choose an interval that divides evenly into the value, such as 540 ms or 1080 ms.

HTML
vue
<template>
  <BButton
    @click="
      show?.({
        props: {
          title: 'Counting down!',
          variant: 'info',
          pos: 'middle-center',
          value: 10000,
          progressProps: {
            variant: 'danger',
          },
          body: 'Watch me!',
        },
      })
    "
  >
    Show
  </BButton>
</template>

ProgressBar Integration

As you may have noticed in that example, there was a built-in progress bar. This is triggered when using a value that is a number and when progressProps is not undefined. This was implemented because it can be difficult to modify the behavior of BToast when using a pure method, and the appearance of a ticking down progress bar is a "nice to have". Although it is not out of the box behavior by Bootstrap, its behavior is opt-in. This functions similarly to examples in BAlert

Toast can accept BLink props which will modify its behavior

HTML
vue
<template>
  <BButton
    @click="
      show?.({props: {href: 'https://getbootstrap.com/', target: '_blank', body: 'I am a BLink'}})
    "
  >
    Show
  </BButton>
</template>

<script setup lang="ts">
const {show} = useToastController()
</script>

Programmatically Control

To programmatically control your modals with global state, refer to our documentation at useToastController

Accessibility

Toasts are intended to be small interruptions to your visitors or users, so to help those with screen readers and similar assistive technologies, toasts are wrapped in an aria-live region. Changes to live regions (such as injecting/updating a toast component) are automatically announced by screen readers without needing to move the user's focus or otherwise interrupt the user. Additionally, aria-atomic="true" is automatically set to ensure that the entire toast is always announced as a single (atomic) unit, rather than announcing what was changed (which could lead to problems if you only update part of the toast's content, or if displaying the same toast content at a later point in time).

If you just need a single simple message to appear along the bottom or top of the user's window, use a fixed position BAlert instead.

Component Reference

PropTypeDefaultDescription
activebooleanundefined
active-classstringundefined
bg-variantColorVariant | nullnull
bodystringundefined The text content of the body
body-classClassValueundefined CSS class (or classes) to add to the toast body element
disabledbooleanundefined
exact-active-classstringundefined
header-classClassValueundefined CSS class (or classes) to add to the toast header element
header-tagstring'div' Specify the HTML tag to render instead of the default tag for the footer
hrefstringundefined
iconbooleanundefined
idstringundefined Used to set the `id` attribute on the rendered content, and used as the base to generate any additional element IDs as needed
initial-animationbooleanfalse When set, enables the initial animation on mount
intervalnumber | requestAnimationFrame'requestAnimationFrame' The interval of which the countdown timer will refresh itself
is-statusbooleanfalse When set to 'true', makes the toast have attributes aria-live=polite and role=status. When 'false' aria-live will be 'assertive' and role will be 'alert'
lazybooleanfalse When set, the content will not be mounted until opened
model-valueboolean | numberfalse Sets if the toast is visible or the number of milliseconds that the toast will be dismissed
no-animationbooleanfalse When set, disables the animation
no-close-buttonbooleanfalse When set, hides the close button in the toast header
no-fadebooleanfalse Alias for `noAnimation`
no-hover-pausebooleanfalse When set to true, disables pausing the timer on hover behavior
no-relundefined
no-resume-on-hover-leavebooleanfalse When set to true, the timer will not resume when the mouse leaves the element. It will need to be manually resumed
opacity10 | 25 | 50 | 75 | 100 | '10' | '25' | '50' | '75' | '100'undefined
opacity-hover10 | 25 | 50 | 75 | 100 | '10' | '25' | '50' | '75' | '100'undefined
progress-propsOmit<BProgressBarProps, 'label' | 'max' | 'value'>undefined The properties to define the progress bar in the toast. No progress will be shown if left undefined
relstringundefined
replacebooleanundefined
router-component-namestringundefined
showbooleanfalse When set, and prop 'visible' is false on mount, will animate from closed to open on initial mount. Mainly to help with template show. Use model-value for reactive show/hide
show-on-pausebooleantrue When set, keeps the toast visible when it's paused
solidbooleanfalse When set, renders the toast with a solid background rather than translucent
stretchedbooleanfalse
targetLinkTargetundefined
text-variantTextColorVariant | nullnull
titlestringundefined The toast's title text
toRouteLocationRawundefined
toast-classClassValueundefined CSS class (or classes) to add to the toast wrapper element
trans-propsTransitionPropsundefined Transition properties
underline-offset1 | 2 | 3 | '1' | '2' | '3'undefined
underline-offset-hover1 | 2 | 3 | '1' | '2' | '3'undefined
underline-opacity0 | 10 | 25 | 50 | 75 | 100 | '0' | '10' | '25' | '50' | '75' | '100'undefined
underline-opacity-hover0 | 10 | 25 | 50 | 75 | 100 | '0' | '10' | '25' | '50' | '75' | '100'undefined
underline-variantColorVariant | nullundefined
unmount-lazybooleanfalse When set and `lazy` is true, the content will be unmounted when closed
variantColorVariant | nullundefined
visiblebooleanfalse When 'true', open without animation
EventArgsDescription
close
value: BvTriggerableEvent
close-countdown
value: number
destroyed
destroyed: string
hidden
value: BvTriggerableEvent
hide
value: BvTriggerableEvent
hide-prevented
show
value: BvTriggerableEvent
show-prevented
shown
value: BvTriggerableEvent
update:model-value
value: Boolean - The resulting value that was changed
Emitted when toast visibility changes
<BToastOrchestrator>
PropTypeDefaultDescription
append-toastundefined
teleport-disabledbooleanfalse Renders the Toaster in the exact place it was defined
teleport-tostring | RendererElement | null | undefined'body' Overrides the default teleport location