Skip to content

ToastContainer

Компонент Vue, рендерящий тосты. Разместите его один раз в App.vue (или в layout Nuxt). Внутри использует <Teleport to="body">.

vue
<ToastContainer
  position="bottom-right"
  :max-visible="5"
  :gap="8"
  :offset-x="16"
  :offset-y="16"
  :z-index="9999"
  theme="system"
/>

Пропы

ПропТипПо умолчаниюОписание
positionToastPosition'bottom-right'Позиция контейнера по умолчанию (проп position конкретного тоста её переопределяет)
maxVisiblenumber5Максимум одновременно показанных тостов; лишние ждут в очереди
gapnumber8Вертикальный зазор между тостами в пикселях
offsetXnumber16Горизонтальное расстояние от края экрана в пикселях
offsetYnumber16Вертикальное расстояние от края экрана в пикселях
zIndexnumber9999CSS z-index контейнера
expandbooleanfalseНемедленно развернуть все группы (пропустить свёрнутое состояние)
teleportTostring'body'CSS-селектор, передаваемый в <Teleport>
contextToastContextглобальныйПередать изолированный контекст из createToastContext()
theme'light' | 'dark' | 'system' | ToastDesignTokensНазвание темы или инлайн-переопределение токенов
stackModebooleanfalseСтек в стиле Sonner: неактивные тосты сворачиваются позади переднего; hover разворачивает

Несколько контейнеров

Один <ToastContainer> автоматически обрабатывает все позиции — каждый тост рендерится в своей позиции из опции position, с fallback на проп position контейнера:

ts
toast.success('Saved', { position: 'top-right' })
toast.error('Failed', { position: 'bottom-center' })
// Оба появятся в своих углах из одного <ToastContainer>

Для полностью изолированных очередей (отдельные зоны уведомлений) используйте createToastContext() с выделенным контейнером:

vue
<template>
  <!-- Глобальная очередь по умолчанию — снизу справа -->
  <ToastContainer position="bottom-right" />

  <!-- Критические оповещения — сверху по центру, отдельная очередь -->
  <ToastContainer position="top-center" :context="alertCtx" :z-index="10000" />
</template>

<script setup lang="ts">
import { createToastContext, useToast } from 'vue-toast-kit'
const alertCtx = createToastContext()
const alertToast = useToast(alertCtx)
</script>

Слоты

Переопределите любую часть тоста, не теряя логику очереди:

vue
<ToastContainer>
  <!-- Заменить весь тост -->
  <template #toast="{ toast, dismiss }">
    <MyCustomToast :data="toast" @close="dismiss(toast.id)" />
  </template>
</ToastContainer>
СлотПропыОписание
#toast{ toast, dismiss }Полная замена одного тоста (пропускает все под-слоты)
#toast-icon{ toast }Заменить только иконку; по умолчанию ToastIcon
#toast-content{ toast }Заменить всю область сообщения + действий
#toast-action{ toast }Заменить кнопки действия / отмены; по умолчанию ToastActions
#toast-close{ toast, dismiss }Заменить кнопку закрытия
#toast-undo{ toast, remaining }Заменить прогресс-бар внизу тоста

Группировка

Тосты с одинаковым groupKey сворачиваются в один тост со счётчиком +N. Клик по счётчику переключает развёрнутое состояние.

ts
// Все три вызова создают один видимый тост с "+2"
toast.info('New message from Alice', { groupKey: 'messages' })
toast.info('New message from Bob', { groupKey: 'messages' })
toast.info('New message from Carol', { groupKey: 'messages' })

Ведущий тост (первый в группе) остаётся видимым; последующие скрыты, но отслеживаются. Когда ведущий закрывается, следующий тост автоматически становится ведущим.

Опции группировки

ОпцияПоведение
groupKey: 'my-key'Включить группировку для этого тоста
Без groupKeyТост всегда показывается отдельно

Режим стека (в стиле Sonner)

Включите stackMode на <ToastContainer>, чтобы свернуть несколько тостов в визуальный стек. Передний тост полностью виден; позади него видны до 2 карточек-«призраков», слегка уменьшенных и смещённых. Наведение на контейнер разворачивает их обратно в обычный стековый список.

vue
<ToastContainer :stack-mode="true" position="bottom-right" />

Наведите, чтобы развернуть, уведите курсор, чтобы свернуть обратно.