@cloud-ru/ds-alert

中文文档
1.2.5发布于 2026/11/11Apache-2.0TypeScriptESM + CJS近 30 天下载 3017

Семантическое уведомление — компонент Alert для inline-нотификаций в контенте и AlertTop для системных баннеров по верхней кромке.

原始使用文档
文档目录13 节
  1. Установка
  2. Alert
  3. Когда использовать
  4. Анатомия
  5. Примеры использования
  6. Props
  7. Адаптивность
  8. AlertTop
  9. Когда использовать
  10. Анатомия
  11. Примеры использования
  12. Props
  13. Адаптивность

Alert

@cloud-ru/ds-alert — Семантическое уведомление — компонент Alert для inline-нотификаций в контенте и AlertTop для системных баннеров по верхней кромке.

Пакет @cloud-ru/ds-alert предоставляет два варианта уведомлений:

  • Alert — inline-алерт внутри страницы: в форме, в карточке, в списке. Поддерживает actions, close-кнопку и режим сворачивания.
  • AlertTop — системный баннер, который крепится к верхней кромке страницы. Всегда на сплошной цветной подложке.

Установка

pnpm add @cloud-ru/ds-alert
import { Alert, AlertTop } from '@cloud-ru/ds-alert'

Alert

Inline-уведомление внутри контента — шесть appearance, два размера, режим сворачивания, горизонтальное и вертикальное выравнивание, опциональные actions и close.

Inline-уведомление, которое живёт в контенте — в форме, в карточке, в списке. Шесть appearance задают семантику, две оси (size, align) — форму, а пропсы actions, onClose, collapsible — поведение.

Когда использовать

  • Для подтверждения результата действия (success / error).
  • Для предупреждения перед необратимой операцией (warning).
  • Для информационного контекста внутри формы (info).

Когда не нужен: для коротких эфемерных сообщений («Скопировано», «Сохранено») используйте toast — Alert остаётся видимым, пока его не закрыть.

Анатомия

Appearance

Семантическая роль сообщения: neutral/primary — нейтральная/информативная подача, info — информ-акцент, success — успешное завершение, warning — предупреждение о потенциальной проблеме, error — ошибка или блокирующее состояние.

Align

Выравнивание заголовка и контента: horizontal — заголовок и текст в одну строку, vertical — заголовок над текстом (для длинного контента и экшенов).

Size

Компактность inline-алерта: s — для плотных поверхностей и табличных строк, m — дефолт.

Примеры использования

1. Информационный алерт

import { Alert } from '@cloud-ru/ds-alert';

export function Info() {
  return (
    <Alert appearance='info' title='Настройки сохранены' content='Изменения применены ко всем активным проектам.' />
  );
}

2. Ошибка с close-кнопкой

import { Alert } from '@cloud-ru/ds-alert';

export function Error() {
  return (
    <Alert
      appearance='error'
      title='Не удалось сохранить'
      content='Проверьте подключение к сети и повторите попытку.'
      onClose={() => undefined}
    />
  );
}

3. Алерт с действиями

import { Alert } from '@cloud-ru/ds-alert';

export function WithActions() {
  return (
    <Alert
      appearance='warning'
      title='Требуется подтверждение'
      content='Операция необратима. Продолжить?'
      actions={{
        primary: { label: 'Продолжить', onClick: () => undefined },
        secondary: { label: 'Отмена', onClick: () => undefined },
      }}
    />
  );
}

4. Сворачиваемый алерт

import { Alert } from '@cloud-ru/ds-alert';

export function Collapsible() {
  return (
    <Alert
      appearance='info'
      collapsible
      title='Совет по настройке'
      content='Полное описание того, как правильно настроить функцию. Текст длинный и сворачивается до раскрытия.'
    />
  );
}

Props

AlertProps

PropTypeDefaultDescription
actionsAlertButtonProps—Кнопки в футере
align"horizontal" | "vertical"verticalВыравнивание контента
appearance"error" | "info" | "neutral" | "primary" | "success" | "warning"—Внешний вид
classNamestring—CSS-класс
collapsibleboolean—Режим сворачивания: длинный текст, ссылка и кнопки скрыты до раскрытия (inline; как MobileAlertTop).
При true не используйте TruncateString на том же узле, что и измерение — см. документацию.
contentReactNode—Описание
data-test-idstring—
iconboolean—Отображать иконку
layoutPresetsAlertLayoutDefaults | LayoutPresets—Override mobile-дефолтов адаптива для этого инстанса (deep-merge поверх ALERT_LAYOUT_PRESETS).
Escape-hatch: обычно не нужен — DS-пресет применяется автоматически по AdaptiveProvider.
onClose(() => void)—Колбек закрытия
outlineboolean—Внешний бордер
size"m" | "s"—Размер
titlestring—Заголовок
truncate{ title?: number; }title: 1Максимальное кол-во строк (только при collapsible={false}).

AlertButtonProps

PropTypeDefaultDescription
asT | undefined—Элемент или компонент для рендера: 'button' | 'a' | ComponentType (например Link из react-router-dom)
classNamestring | undefined—Дополнительный класс
disabledboolean | undefined—Отключена
iconstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined—Иконка
iconPosition"after" | "before"—Позиция иконки относительно текста
innerRefPolymorphicRef—Ref на реальный DOM-элемент/инстанс, который рендерится через as.
Используем явный проп, чтобы не зависеть от forwardRef и не тащить type-assertions на экспорт.
invertFocusOutlineColorboolean | undefined—Инвертировать цвет фокусного контура
labelstring | undefined—Текст кнопки
loadingboolean | undefined—Состояние загрузки
size"m" | "s"—Размер
variant"onAccent" | "onColor"—Вариант оформления

AlertLayoutDefaults

PropTypeDefaultDescription
truncate{ title?: number; } | undefined—Максимальное кол-во строк (только при collapsible={false}).
  • Align = "horizontal" | "vertical"

  • Appearance = "error" | "info" | "neutral" | "primary" | "success" | "warning"

  • ButtonSize = "m" | "s"

  • ButtonVariant = "onAccent" | "onColor"

  • IconPosition = "after" | "before"

  • PolymorphicRef = ComponentPropsWithRef<T>["ref"]

  • Size = "m" | "s"

Адаптивность

Alert — адаптивный компонент класса preset-defaults: DOM один, по раскладке меняются только дефолты пропсов. Раскладку компонент читает из контекста @cloud-ru/ds-adaptive — отдельного пропа layoutType нет.

Desktop-first. Верстайте под desktop и поставьте один <AdaptiveProvider> в корне приложения — mobile-дефолты применяются автоматически. Override нужен только как escape-hatch.

На mobile заголовок усекается до двух строк вместо одной — на узких экранах это сохраняет читаемость без обрезки полезного текста.

Пропdesktopmobile
truncate.title12

Источник mobile-дефолтов — экспортируемая константа ALERT_LAYOUT_PRESETS.

Как переопределить

Desktop-first: перенос пропа из desktop-макета не ломает mobile. Приоритет (от высшего к низшему): layoutPresets[layout] (инстанс) → DS-пресет ALERT_LAYOUT_PRESETS → явный проп (= desktop-значение) → базовый дефолт.

import { Alert } from '@cloud-ru/ds-alert'

// 1. Явный проп — задаёт DESKTOP-значение; mobile остаётся 2 строки (mobile не ломается)
<Alert truncate={{ title: 3 }} title='…' content='…' />

// 2. layoutPresets.mobile — единственный способ изменить mobile (явно)
<Alert layoutPresets={{ mobile: { truncate: { title: 3 } } }} title='…' content='…' />

// 2b. layoutPresets.desktop — изменить только desktop, mobile-адаптив сохранён
<Alert layoutPresets={{ desktop: { truncate: { title: 3 } } }} title='…' content='…' />

DS-пресет (ALERT_LAYOUT_PRESETS) — точка форка mobile-дефолтов на уровне всей дизайн-системы.

Как форсировать раскладку

Раскладка переключается только контекстом, не пропом:

import { AdaptiveProvider, withLayoutType } from '@cloud-ru/ds-adaptive'
import { Alert } from '@cloud-ru/ds-alert'

// поддерево — вложенный провайдер
<AdaptiveProvider layoutType='mobile'>
  <Alert title='…' content='…' />
</AdaptiveProvider>

// компонент/секция — HOC (module-scope, не в рендере)
const MobileAlert = withLayoutType(Alert, 'mobile')

Подробнее о модели раскладки — в @cloud-ru/ds-adaptive.

Mobile — усечение заголовка

Раскладка форсирована в mobile: на узком экране длинный заголовок усекается в две строки вместо одной.

import { AdaptiveProvider, LAYOUT_TYPE } from '@cloud-ru/ds-adaptive';
import { Alert } from '@cloud-ru/ds-alert';

const LONG_TITLE = 'Плановые технические работы в дата-центре: часть сервисов будет недоступна с 02:00 до 04:00 МСК';

export function AdaptiveTruncate() {
  return (
    <AdaptiveProvider layoutType={LAYOUT_TYPE.Mobile}>
      <div style={{ maxWidth: 360 }}>
        <Alert appearance='info' title={LONG_TITLE} content='На узком экране заголовок усекается в две строки.' />
      </div>
    </AdaptiveProvider>
  );
}

Playground ниже показывает только переключение раскладки — сам текст короткий и не переносится ни на одной раскладке (кириллица в URL-args Storybook не резолвится, см. пример выше для наглядного усечения).

AlertTop

Системный баннер по верхней кромке приложения — всегда на сплошной цветной подложке, используется для глобальных уведомлений.

Глобальный баннер, который крепится к верхней кромке приложения. В отличие от Alert, всегда рендерится на сплошной цветной подложке (определяется appearance) и не поддерживает outline — визуально это «полоса сообщения», а не карточка.

Когда использовать

  • Для плановых технических работ и maintenance-окон.
  • Для глобальных ограничений (например, «В вашем регионе временно недоступны платежи»).
  • Для системных анонсов, которые касаются всех пользователей приложения.

Когда не нужен: для сообщений, которые касаются конкретной страницы или формы — используйте Alert.

Анатомия

Appearance

Семантическая роль топ-баннера: neutral/primary — нейтрально-информативная подача, info — информ-акцент, success — успех (редко в топ-баннере), warning — предупреждение (maintenance), error — критическое ограничение/инцидент.

Align

Выравнивание заголовка и описания: horizontal — в одну строку (короткий анонс), vertical — заголовок над текстом (длинное описание + действие).

Size

Плотность баннера: s — компактный, m — дефолт.

Примеры использования

Системное уведомление

import { AlertTop } from '@cloud-ru/ds-alert';

export function SystemNotice() {
  return (
    <AlertTop
      appearance='info'
      title='Плановые работы'
      content='Сегодня с 22:00 до 23:00 возможны кратковременные перебои.'
    />
  );
}

Props

AlertTopProps

PropTypeDefaultDescription
actionsAlertButtonProps—Кнопки в футере
align"horizontal" | "vertical"verticalВыравнивание контента
appearance"error" | "info" | "neutral" | "primary" | "success" | "warning"—Внешний вид
classNamestring—CSS-класс
collapsibleboolean—Режим сворачивания: длинный текст, ссылка и кнопки скрыты до раскрытия (inline; как MobileAlertTop).
При true не используйте TruncateString на том же узле, что и измерение — см. документацию.
contentReactNode—Описание
data-test-idstring—
iconboolean—Отображать иконку
layoutPresetsAlertTopLayoutDefaults | LayoutPresets—Override mobile-дефолтов адаптива для этого инстанса (deep-merge поверх ALERT_TOP_LAYOUT_PRESETS).
Escape-hatch: обычно не нужен — DS-пресет применяется автоматически по AdaptiveProvider.
onClose(() => void)—Колбек закрытия
size"m" | "s"—Размер
titlestring—Заголовок
truncate{ title?: number; }title: 1Максимальное кол-во строк (только при collapsible={false}).

AlertButtonProps

PropTypeDefaultDescription
asT | undefined—Элемент или компонент для рендера: 'button' | 'a' | ComponentType (например Link из react-router-dom)
classNamestring | undefined—Дополнительный класс
disabledboolean | undefined—Отключена
iconstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined—Иконка
iconPosition"after" | "before"—Позиция иконки относительно текста
innerRefPolymorphicRef—Ref на реальный DOM-элемент/инстанс, который рендерится через as.
Используем явный проп, чтобы не зависеть от forwardRef и не тащить type-assertions на экспорт.
invertFocusOutlineColorboolean | undefined—Инвертировать цвет фокусного контура
labelstring | undefined—Текст кнопки
loadingboolean | undefined—Состояние загрузки
size"m" | "s"—Размер
variant"onAccent" | "onColor"—Вариант оформления

AlertTopLayoutDefaults

PropTypeDefaultDescription
collapsibleboolean | undefined—Режим сворачивания: длинный текст, ссылка и кнопки скрыты до раскрытия (inline; как MobileAlertTop).
При true не используйте TruncateString на том же узле, что и измерение — см. документацию.
  • Align = "horizontal" | "vertical"

  • Appearance = "error" | "info" | "neutral" | "primary" | "success" | "warning"

  • ButtonSize = "m" | "s"

  • ButtonVariant = "onAccent" | "onColor"

  • IconPosition = "after" | "before"

  • PolymorphicRef = ComponentPropsWithRef<T>["ref"]

  • Size = "m" | "s"

Адаптивность

AlertTop — адаптивный компонент класса preset-defaults: DOM один, по раскладке меняются только дефолты пропсов. Раскладку компонент читает из контекста @cloud-ru/ds-adaptive — отдельного пропа layoutType нет.

Desktop-first. Верстайте под desktop и поставьте один <AdaptiveProvider> в корне приложения — mobile-дефолты применяются автоматически. Override нужен только как escape-hatch.

На mobile баннер становится раскрываемым (collapsible): длинный текст и действия скрыты до клика по баннеру, на месте close-кнопки появляется шеврон раскрытия. На desktop баннер плоский.

Пропdesktopmobile
collapsiblefalsetrue

Источник mobile-дефолтов — экспортируемая константа ALERT_TOP_LAYOUT_PRESETS.

Как переопределить

Desktop-first: перенос пропа из desktop-макета не ломает mobile. Приоритет (от высшего к низшему): layoutPresets[layout] (инстанс) → DS-пресет ALERT_TOP_LAYOUT_PRESETS → явный проп (= desktop-значение) → базовый дефолт.

import { AlertTop } from '@cloud-ru/ds-alert'

// 1. Явный проп — задаёт DESKTOP-значение; mobile остаётся collapsible (mobile не ломается)
<AlertTop collapsible={false} title='…' content='…' />

// 2. layoutPresets.mobile — единственный способ изменить mobile (явно)
<AlertTop layoutPresets={{ mobile: { collapsible: false } }} title='…' content='…' />

// 2b. layoutPresets.desktop — изменить только desktop, mobile-адаптив сохранён
<AlertTop layoutPresets={{ desktop: { collapsible: true } }} title='…' content='…' />

DS-пресет (ALERT_TOP_LAYOUT_PRESETS) — точка форка mobile-дефолтов на уровне всей дизайн-системы.

Как форсировать раскладку

Раскладка переключается только контекстом, не пропом:

import { AdaptiveProvider, withLayoutType } from '@cloud-ru/ds-adaptive'
import { AlertTop } from '@cloud-ru/ds-alert'

// поддерево — вложенный провайдер
<AdaptiveProvider layoutType='mobile'>
  <AlertTop title='…' content='…' />
</AdaptiveProvider>

// компонент/секция — HOC (module-scope, не в рендере)
const MobileAlertTop = withLayoutType(AlertTop, 'mobile')

Подробнее о модели раскладки — в @cloud-ru/ds-adaptive.

版本与发布记录

@cloud-ru/ds-alert 共发布 80 个版本,首次发布于 2026/08/18;过去 12 个月发布了 80 个版本。

版本发布日期距今
1.2.5latest2026/11/11今天
1.2.5-preview-e8fe6b56.0preview2026/11/11今天
1.2.5-preview-c0e895ed.02026/11/11今天
1.2.5-preview-90b10112.02026/11/11今天
1.2.5-preview-fd7dd437.02026/11/101 天前
1.2.5-preview-9a75a2a9.02026/11/101 天前

关于 @cloud-ru/ds-alert 的常见问题

@cloud-ru/ds-alert 是什么?

Семантическое уведомление — компонент Alert для inline-нотификаций в контенте и AlertTop для системных баннеров по верхней кромке.

如何安装 @cloud-ru/ds-alert?

在项目目录运行 npm install @cloud-ru/ds-alert,或使用 pnpm add / yarn add / bun add。

@cloud-ru/ds-alert 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@cloud-ru/ds-alert 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@cloud-ru/ds-alert 可以商用吗?

@cloud-ru/ds-alert 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@cloud-ru/ds-alert 的下载量有多少?

根据 npm 官方下载统计,@cloud-ru/ds-alert 在 2026/10/10 – 2026/11/08 这 30 天内被下载 3,017 次,日均约 101 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@cloud-ru/ds-alert 还在维护吗?

最新版本 1.2.5 发布于 2026/11/11(今天);至今共发布 80 个版本,其中过去 12 个月发布了 80 个;首次发布于 2026/08/18。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。