Skip to content
API 风格:

Уведомление ​

Карточка уведомления в верхнем правом углу (доступны все четыре угла), для обратной связи, требующей задержки внимания: заголовок / основной текст / семантическая иконка / возможность закрытия / автоматическое исчезновение / стопка. Императивный сервисный API (LhNotification.success(...)).

Базовое использование ​

Базовое использование
vue
<script setup lang="ts">
import { LhNotification } from '@lh-ui/vue3'

const showBasic = () => {
  LhNotification.info({ title: 'Синхронизация завершена', content: '3 изменения синхронизированы с облаком' })
}
</script>

<template>
  <LhButton @click="showBasic">Открыть уведомление</LhButton>
</template>
vue
<script>
import { LhNotification } from '@lh-ui/vue3'

export default {
  methods: {
    showBasic() {
      LhNotification.info({ title: 'Синхронизация завершена', content: '3 изменения синхронизированы с облаком' })
    },
  },
}
</script>

<template>
  <LhButton @click="showBasic">Открыть уведомление</LhButton>
</template>

Семантические типы ​

Четыре семантических типа
vue
<script setup lang="ts">
import { LhNotification } from '@lh-ui/vue3'

const showInfo = () => LhNotification.info({ title: 'Подсказка', content: 'Содержимое' })
const showSuccess = () => LhNotification.success({ title: 'Успех', content: 'Резервное копирование завершено' })
const showWarning = () => LhNotification.warning({ title: 'Предупреждение', content: 'Недостаточно места для хранения' })
const showDanger = () => LhNotification.danger({ title: 'Ошибка', content: 'Сетевое соединение прервано' })
</script>

<template>
  <div class="demo-notification-row">
    <LhButton @click="showInfo">Информация</LhButton>
    <LhButton @click="showSuccess">Успех</LhButton>
    <LhButton @click="showWarning">Предупреждение</LhButton>
    <LhButton @click="showDanger">Опасность</LhButton>
  </div>
</template>
vue
<script>
import { LhNotification } from '@lh-ui/vue3'

export default {
  methods: {
    showInfo() {
      LhNotification.info({ title: 'Подсказка', content: 'Содержимое' })
    },
    showSuccess() {
      LhNotification.success({ title: 'Успех', content: 'Резервное копирование завершено' })
    },
    showWarning() {
      LhNotification.warning({ title: 'Предупреждение', content: 'Недостаточно места для хранения' })
    },
    showDanger() {
      LhNotification.danger({ title: 'Ошибка', content: 'Сетевое соединение прервано' })
    },
  },
}
</script>

<template>
  <div class="demo-notification-row">
    <LhButton @click="showInfo">Информация</LhButton>
    <LhButton @click="showSuccess">Успех</LhButton>
    <LhButton @click="showWarning">Предупреждение</LhButton>
    <LhButton @click="showDanger">Опасность</LhButton>
  </div>
</template>

Позиция появления ​

position поддерживает все четыре угла.

Позиция
vue
<script setup lang="ts">
import { LhNotification } from '@lh-ui/vue3'

const showAt = (position) => {
  LhNotification.info({ title: 'Пример позиции', content: position, duration: 3000, position })
}
</script>

<template>
  <div class="demo-notification-row">
    <LhButton @click="showAt('top-right')">Верхний правый</LhButton>
    <LhButton @click="showAt('top-left')">Верхний левый</LhButton>
    <LhButton @click="showAt('bottom-right')">Нижний правый</LhButton>
    <LhButton @click="showAt('bottom-left')">Нижний левый</LhButton>
  </div>
</template>
vue
<script>
import { LhNotification } from '@lh-ui/vue3'

export default {
  methods: {
    showAt(position) {
      LhNotification.info({ title: 'Пример позиции', content: position, duration: 3000, position })
    },
  },
}
</script>

<template>
  <div class="demo-notification-row">
    <LhButton @click="showAt('top-right')">Верхний правый</LhButton>
    <LhButton @click="showAt('top-left')">Верхний левый</LhButton>
    <LhButton @click="showAt('bottom-right')">Нижний правый</LhButton>
    <LhButton @click="showAt('bottom-left')">Нижний левый</LhButton>
  </div>
</template>

Кликабельное уведомление ​

После передачи onClick карточка приобретает семантику кнопки: фокусируется через Tab, срабатывает по Enter / Space.

Кликабельность
vue
<script setup lang="ts">
import { LhNotification } from '@lh-ui/vue3'

const showClickable = () => {
  LhNotification.info({
    title: 'Доступна новая версия',
    content: 'Нажмите, чтобы посмотреть журнал изменений',
    duration: 0,
    onClick: () => window.open('#', '_blank'),
  })
}
</script>

<template>
  <LhButton @click="showClickable">Уведомление с действием</LhButton>
</template>
vue
<script>
import { LhNotification } from '@lh-ui/vue3'

export default {
  methods: {
    showClickable() {
      LhNotification.info({
        title: 'Доступна новая версия',
        content: 'Нажмите, чтобы посмотреть журнал изменений',
        duration: 0,
        onClick: () => window.open('#', '_blank'),
      })
    },
  },
}
</script>

<template>
  <LhButton @click="showClickable">Уведомление с действием</LhButton>
</template>

Кнопка закрытия ​

show-close управляет видимостью кнопки закрытия (по умолчанию отображается), close-label задаёт её доступное имя.

Кнопка закрытия
vue
<script setup lang="ts">
import { LhNotification } from '@lh-ui/vue3'

const notifyClosable = () => LhNotification.info({ title: 'Подсказка', content: 'Можно закрыть вручную', showClose: true, closeLabel: 'Понятно, закрыть' })
const notifyNoClose = () => LhNotification.info({ title: 'Подсказка', content: 'Только автоматическое закрытие', showClose: false })
</script>

<template>
  <LhButton @click="notifyClosable">Показать кнопку закрытия</LhButton>
  <LhButton @click="notifyNoClose">Без кнопки закрытия</LhButton>
</template>
vue
<script>
import { LhNotification } from '@lh-ui/vue3'

export default {
  methods: {
    notifyClosable() {
      LhNotification.info({ title: 'Подсказка', content: 'Можно закрыть вручную', showClose: true, closeLabel: 'Понятно, закрыть' })
    },
    notifyNoClose() {
      LhNotification.info({ title: 'Подсказка', content: 'Только автоматическое закрытие', showClose: false })
    },
  },
}
</script>

<template>
  <LhButton @click="notifyClosable">Показать кнопку закрытия</LhButton>
  <LhButton @click="notifyNoClose">Без кнопки закрытия</LhButton>
</template>

API ​

LhNotification Props ​

СвойствоОписаниеТипПо умолчанию
typeСемантический тип"success" | "warning" | "error" | "info" | "danger"'info'
titleЗаголовокstring—
contentОсновной текстstring—
showCloseПоказывать ли кнопку закрытияbooleantrue
closeLabelДоступное имя кнопки закрытия (если не передано, берётся из языкового пакета notification.close)string—
onClickКоллбэк нажатия на карточку (после передачи карточка представляется с семантикой button)() => void—
sxСвойства быстрой разметки sxLhSxProps—

Сервисные методы: LhNotification(options) / LhNotification.success/info/warning/danger(options), возвращают дескриптор { close }; также есть LhNotification.close(id), LhNotification.closeAll() и LhNotification.config({ duration, offset, appendTo }).

Events ​

СобытиеОписаниеПараметры обратного вызова
closeСрабатывает при нажатии на кнопку закрытия в карточке—

В императивном варианте закрытие (как автоматическое, так и ручное) отслеживается через коллбэк onClose в Options.

Options ​

СвойствоОписаниеТипПо умолчанию
titleЗаголовокstring—
contentОсновной текстstring—
typeСемантический тип'success' | 'warning' | 'error' | 'info' | 'danger''info'
durationМс до автоматического закрытия, 0 — не закрыватьnumber4500
positionПозиция появления'top-right' | 'top-left' | 'bottom-right' | 'bottom-left''top-right'
showCloseПоказывать ли кнопку закрытияbooleantrue
sxСвойства быстрой разметки sxLhSxProps—
onClickКоллбэк нажатия на карточку() => void—
onCloseКоллбэк после закрытия() => void—

Доступность ​

  • Контейнер каждой позиции имеет role="region" + aria-live="polite": новые уведомления объявляются мягко и не перехватывают фокус
  • Карточки с переданным onClick получают role="button", фокусируются через Tab, срабатывают по Enter / Space
  • Кнопка закрытия содержит aria-label (языковой пакет notification.close, можно переопределить через closeLabel)
  • Смещение в стопке реализовано CSS-переходом; анимация уважает prefers-reduced-motion

Определения типов ​

Структуры TypeScript, экспортируемые этим компонентом (автоматически извлечены из packages/components/notification/src/types.ts и исходников @lh-ui/share/core/*; нажмите на каждый пункт, чтобы развернуть полное определение; описания свойств см. в таблице Props выше):

LhNotificationOptions
ts
/** Параметры сервиса */
export interface LhNotificationOptions {
  /** Заголовок */
  title: string
  /** Основной текст */
  content?: string
  /** Семантический тип, по умолчанию info */
  type?: LhNotificationType
  /** Мс до автоматического закрытия, 0 — не закрывать (по умолчанию 4500) */
  duration?: number
  /** Позиция появления (по умолчанию top-right) */
  position?: LhNotificationPosition
  /** Показывать ли кнопку закрытия (по умолчанию true) */
  showClose?: boolean
  /** Свойства быстрой разметки sx */
  sx?: LhSxProps
  /** Коллбэк нажатия на карточку (после передачи карточка фокусируется и представляется с семантикой button) */
  onClick?: () => void
  /** Коллбэк после закрытия (как автоматического, так и ручного) */
  onClose?: () => void
}
LhNotificationHandle
ts
/** Дескриптор сервиса */
export interface LhNotificationHandle {
  close: () => void
}
LhNotificationConfig
ts
/** Параметры глобальных значений по умолчанию (LhNotification.config) */
export interface LhNotificationConfig {
  duration?: number
  offset?: number
  /** Контейнер монтирования (по умолчанию body) */
  appendTo?: string | HTMLElement
}
LhNotificationProps
ts
/** Props компонента карточки (рендерится внутри сервиса; можно использовать и декларативно) */
export interface LhNotificationProps {
  type?: LhNotificationType
  title: string
  content?: string
  showClose?: boolean
  /** Доступное имя кнопки закрытия (если не передано, берётся из языкового пакета notification.close) */
  closeLabel?: string
  /** После передачи карточка становится кликабельной */
  onClick?: () => void
  sx?: LhSxProps
}
LhNotificationType (из @lh-ui/share/core/notification)
ts
/** Семантический тип уведомления (четыре семантики, без loading) */
export type LhNotificationType =
  (typeof LH_TYPES_CONST)[keyof typeof LH_TYPES_CONST]
LhNotificationRecord (из @lh-ui/share/core/notification)
ts
/** Форма записи отдельного уведомления в очереди сервиса */
export interface LhNotificationRecord {
  id: number
  type: LhNotificationType
  title: string
  content: string
  /** Мс до автоматического закрытия, 0 — не закрывать */
  duration: number
  position: LhNotificationPosition
  showClose: boolean
  sx?: LhSxProps
  onClick?: () => void
  onClose?: () => void
}
LhNotificationPosition (из @lh-ui/share/core/notification)
ts
/** Позиция появления уведомления (четыре угла) */
export type LhNotificationPosition =
  | 'top-right'
  | 'top-left'
  | 'bottom-right'
  | 'bottom-left'

Константы ​

Публичные константы, используемые этим компонентом (в столбцах «Тип / По умолчанию» таблицы Props можно перейти к одноимённой записи):

LH_NOTIFICATION_POSITION_CONST (из @lh-ui/share/core/notification)
ts
/** Константа позиций */
export const LH_NOTIFICATION_POSITION_CONST = {
  'top-right': 'top-right',
  'top-left': 'top-left',
  'bottom-right': 'bottom-right',
  'bottom-left': 'bottom-left',
} as const
LH_NOTIFICATION_DURATION_DEFAULT (из @lh-ui/share/core/notification)
ts
/** Длительность автоматического закрытия по умолчанию (уведомления показываются дольше, чем сообщения) */
export const LH_NOTIFICATION_DURATION_DEFAULT = 4500
LH_NOTIFICATION_GAP_DEFAULT (из @lh-ui/share/core/notification)
ts
/** Интервал между карточками в стопке, px */
export const LH_NOTIFICATION_GAP_DEFAULT = 16

Красота традиций — основа кода