# @cloud-ru/ds-toaster > Система всплывающих уведомлений с тремя типами контента и императивным API. Docs: /snack-v2/components/toaster/ ## Установка ```sh pnpm add @cloud-ru/ds-toaster ``` ## Когда использовать - **SystemEvent** — результаты асинхронных операций, системные события, критические ошибки с action-кнопками. - **UserAction** — короткий ack на локальное действие («скопировано», «сохранено», «удалено»), опционально с link-отменой. - **Upload** — длительная загрузка файлов с прогрессом и контролем pause/resume/cancel. Когда тосты **не** нужны: - Блокирующее подтверждение действия — используй Modal/Dialog. - Постоянная информация в интерфейсе — используй Alert / InfoBlock. - Inline-валидация формы — используй встроенный error-state поля. ## API ### LoadingStatus | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `actions` | `UploadActions` | — | no | | | `status` | `error \| errorUploaded \| loading \| pause \| uploaded` | — | yes | | ### Timer | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `className` | `string` | — | no | | | `duration` | `number` | `AUTO_CLOSE_TIME[TOASTER_TYPE.UserAction] as number` | no | Длительность таймера в мс. По умолчанию — `AUTO_CLOSE_TIME[UserAction]`. Используется только как fallback для standalone-рендера (без `ToasterContainer`) и для вычисления отображаемой цифры — `scaleX` индикатора берётся из реального состояния auto-close таймера менеджера. | ### ToastButton | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `as` | `ElementType` | — | no | Элемент или компонент для рендера: 'button' \| 'a' \| любой компонент (Link и т.п.) | | `children` | `ReactNode` | — | no | Иконка для `composition='iconOnly'`. | | `className` | `string` | — | no | Доп. класс на корень. | | `composition` | `iconOnly \| labelOnly` | — | yes | `labelOnly` — текстовая кнопка с padding; `iconOnly` — квадратная под SVG-иконку. | | `critical` | `boolean` | — | no | Критический вариант (красная палитра, для errorCritical / Cancel-сценариев). | | `data-test-id` | `string` | — | no | | | `innerRef` | `any` | — | no | Ref на DOM/instance, рендерящийся через `as`. | | `label` | `string` | — | no | Текст для `composition='labelOnly'`. | ### ToastButtonAction | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `as` | `ElementType` | — | no | | | `className` | `string` | — | no | | | `data-test-id` | `string` | `toast-system-event__button-action` | no | | | `label` | `string` | — | yes | | | `onClick` | `((e: MouseEvent) => void)` | — | no | | ### ToasterContainer | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `autoClose` | `number \| false` | — | no | Дефолтное время автозакрытия (мс) для всех тостов этого контейнера. Используется, если в `toastOptions.autoClose` явно не передано значение. Передать `false` — автозакрытие отключено по умолчанию. Если проп не задан — берётся `AUTO_CLOSE_TIME[type]`. | | `containerId` | `string` | — | no | Идентификатор контейнера — ключ маршрутизации тостов. Вызов `toaster..open({ containerId })` находит контейнер по этому id и рендерит тост в нём. Если не задан — используется дефолт `toaster-container__` (см. `TOASTER_CONTAINER_PREFIX`), общий для всех контейнеров одного `type`. Задавай явный id, когда на странице несколько контейнеров одного типа и нужно адресовать конкретный. | | `data-test-id` | `string` | — | no | Override `data-test-id` корня контейнера. Если не задан — используется `TEST_IDS.toasterContainer`. Имеет смысл, если на странице несколько контейнеров одного типа и e2e-тестам нужно адресовать конкретный. | | `displayCloseAllButton` | `boolean` | — | no | | | `draggable` | `boolean` | — | no | | | `draggableDirection` | `x \| y` | — | no | | | `limit` | `number` | — | no | Максимум одновременно видимых тостов в контейнере. По умолчанию — из TOASTER_CONTAINER_DEFAULTS[type]. | | `position` | `bottom-center \| bottom-left \| bottom-right \| top-center \| top-left \| top-right` | — | no | | | `stacked` | `boolean` | — | no | | | `type` | `system-event \| upload \| user-action` | — | yes | | | `width` | `auto \| full` | — | no | | #### Related types - `DraggableDirection` = `x | y` - `SystemEventPosition` = `bottom-center | bottom-left | bottom-right | top-center | top-left | top-right` - `ToasterWidth` = `auto | full` ### ToastSlot | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `containerId` | `string` | — | yes | | | `draggable` | `boolean` | — | yes | | | `draggableDirection` | `x \| y` | — | yes | | | `isFront` | `boolean` | — | yes | | | `stackIndex` | `number` | — | yes | | | `toast` | `ManagedToast` | — | yes | | ### ToastSystemEvent | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `action` | `ToastButtonActionProps[]` | — | no | Кнопки в footer'е | | `appearance` | `error \| errorCritical \| neutral \| success \| warning` | `neutral` | no | Цветовая схема | | `autoClose` | `number \| false` | `undefined (резолвится в `AUTO_CLOSE_TIME[TOASTER_TYPE.SystemEvent]` = 5000)` | no | Время автозакрытия в мс. Три состояния различимы намеренно: - `undefined` — потребитель не указал значение, toaster-система подставит дефолт `AUTO_CLOSE_TIME[TOASTER_TYPE.SystemEvent]` (5000 мс) при рендере; именно этот случай позволяет ProgressBar анимироваться синхронно с auto-dismiss таймером менеджера. - `number` — явное значение от потребителя, используется как есть. - `false` — автозакрытие выключено, ProgressBar в этом режиме не рендерится. | | `className` | `string` | — | no | Доп. класс корневого элемента | | `closable` | `boolean` | `true` | no | Возможность закрыть тост | | `closeToast` | `(() => void)` | — | no | | | `data-test-id` | `string` | — | no | | | `description` | `string` | — | no | Описание под заголовком | | `link` | `ToastSystemEventLink` | — | no | Slot для ссылки | | `onCloseClick` | `((e: MouseEvent, close?: (() => void)) => void)` | — | no | Кастомный обработчик клика по кнопке закрытия | | `progressBar` | `boolean` | `true` | no | Показывать ли ProgressBar внизу | | `title` | `string` | — | yes | Заголовок тоста | | `toastProps` | `{ autoClose?: number \| false; }` | — | no | | #### Related types - `ToastButtonActionProps` (interface) - `ToastSystemEventAppearance` = `error | errorCritical | neutral | success | warning` - `ToastSystemEventLink` (interface) ### ToastSystemEventCloseAll _Нет публичных пропсов._ ### ToastSystemEventProgress | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `appearance` | `error \| errorCritical \| neutral \| success \| warning` | — | yes | Цветовая схема — берётся из appearance тоста. | | `durationMs` | `number` | — | no | Зарезервирован. Раньше задавал `animation-duration` CSS-кейфрейма; сейчас scaleX полоски считается из реального состояния авто-close таймера через `useToastProgress`, и этот параметр в рантайме не используется. Оставлен в API на случай standalone-рендера карточки вне `ToasterContainer` — там контекста менеджера нет, и полоска зафиксируется на `scaleX(1)`. | | `value` | `number` | — | no | Статическое значение 0..1 для визуальных матриц. Когда задано — рендер без подписки на менеджер, бар замораживается на этом scaleX. | ### ToastUpload | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `className` | `string` | — | no | CSS-класс контейнера | | `closable` | `boolean` | `true` | no | Показывать кнопку закрытия тостера. По умолчанию `true`. | | `closeToast` | `(() => void)` | — | no | | | `collapsed` | `boolean` | — | no | Тостер свернут/развернут | | `data-test-id` | `string` | — | no | | | `description` | `string` | — | yes | Описание статуса загрузки | | `files` | `UploadItem[]` | — | yes | Загружаемые элементы | | `generalActions` | `Omit` | — | no | Экшены для управления общей загрузкой | | `onCancelAll` | `((e: MouseEvent) => void)` | — | no | Колбэк кнопки отмены всей загрузки. Кнопка рендерится только при наличии колбэка; подпись — из `@cloud-ru/ds-locale` (`ToastUpload.cancelAll`). | | `onCloseClick` | `((e: MouseEvent, close?: (() => void)) => void)` | — | no | Закрыть тостер | | `onCollapsed` | `((collapsed: boolean) => void)` | — | no | Развернуть/свернуть тостер | | `progress` | `{ current: number; total: number; }` | — | yes | Общий прогресс загрузки | | `status` | `error \| errorUploaded \| loading \| pause \| uploaded` | — | yes | Общий статус загрузки | | `title` | `string` | — | no | Заголовок тостера | | `toastProps` | `{ autoClose?: number \| false; }` | — | no | | #### Related types - `ToastUploadItemLink` (interface) - `ToastUploadItemStatus` = `error | loading | pause | uploaded` - `ToastUploadStateSubscription` (alias) - `ToastUploadStatus` = `error | errorUploaded | loading | pause | uploaded` - `UploadActions` (interface) - `UploadItem` (interface) ### ToastUploadFileLine | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `item` | `UploadItem` | — | yes | | #### Related types - `ToastUploadItemLink` (interface) - `ToastUploadItemStatus` = `error | loading | pause | uploaded` - `ToastUploadStateSubscription` (alias) - `UploadActions` (interface) - `UploadItem` (interface) ### ToastUploadProgress | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `appearance` | `green \| neutral \| red` | — | yes | Цветовая схема. | | `children` | `string \| number \| boolean \| ReactElement> \| Iterable \| ReactPortal \| null \| undefined` | — | no | | | `progress` | `number` | — | yes | Процент заполнения 0..100. | #### Related types - `ToastUploadProgressAppearance` = `green | neutral | red` ### ToastUploadTitleLine | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `closable` | `boolean` | — | yes | | | `description` | `string` | — | yes | | | `generalActions` | `Omit` | — | no | | | `isCollapsed` | `boolean` | — | yes | | | `onCancelAll` | `((e: MouseEvent) => void)` | — | no | | | `onCloseClick` | `(e: MouseEvent) => void` | — | yes | | | `onCollapseClick` | `(e: MouseEvent) => void` | — | yes | | | `progress` | `{ current: number; total: number; }` | — | yes | | | `status` | `error \| errorUploaded \| loading \| pause \| uploaded` | — | yes | | | `title` | `string` | — | yes | | ### ToastUserAction | Prop | Type | Default | Required | Description | |------|------|---------|----------|-------------| | `action` | `ToastUserActionAction<"button"> \| ToastUserActionAction<"a">` | — | no | Slot для action-кнопки (по умолчанию `