Уведомление
Уведомление (toast) — короткое сообщение, которое подтверждает действие, всплывает внизу экрана и исчезает само.
<tk-button onclick="document.querySelector('tk-toaster').toast('Changes saved')">Save changes</tk-button>
<tk-toaster></tk-toaster>Анатомия
| Часть | Что это |
|---|---|
tk-toaster |
область, которую вы добавляете один раз; она ставит уведомления на место, ведёт очередь и объявляет их |
tk-toast |
плашка, которую область создаёт для каждого сообщения |
| сообщение | одна короткая строка текста |
| действие | одна кнопка, по желанию, например «Отменить» |
| кнопка закрытия | ✕, только с dismissible |
Вид один: тёмная плашка в светлой теме и светлая в тёмной. Тонов и иконок нет.
Показать уведомление
Добавьте на страницу один пустой tk-toaster и вызывайте у него toast().
<tk-toaster></tk-toaster>
<tk-button onclick="document.querySelector('tk-toaster').toast('Changes saved')">Save changes</tk-button>- Поставьте область в разметку страницы, пустой, до первого уведомления. Скринридеры объявляют только ту live-область, которая уже была, поэтому не создавайте её в момент, когда она понадобилась.
- Одна область на страницу.
Действия
const toaster = document.querySelector('tk-toaster');
toaster.toast('Conversation archived', {
action: {
label: 'Undo',
handler: () => restoreConversation(),
altText: 'Undo: press {hotkey} then Enter',
},
});- Не больше одного действия, и только как ярлык. То же самое пользователь должен суметь сделать где-то ещё на странице. Если действие — единственный путь, берите диалог.
- С действием обязателен
altText. Скринридер прочитает его после сообщения, поэтому скажите, как добраться до действия.{hotkey}заменяется на горячую клавишу области, по умолчанию F8. dismissible: trueдобавляет ✕. Большинству уведомлений он не нужен: они уходят сами.
Поведение
| Уведомление | Показывается |
|---|---|
| без действия | 5 секунд |
| с действием | не меньше 10 секунд |
- Наведение, фокус и переход в другое окно ставят таймер на паузу. Потом он идёт дальше с оставшимся временем.
- Для длинного сообщения задайте
duration. Закладывайте около 5 секунд плюс 1 секунду на каждые 120 слов. - За раз показывается одно уведомление, в порядке поступления. То же сообщение дважды подряд перезапускает текущее, а не встаёт в очередь копией.
- В очереди ждут до 3 уведомлений (
max-queue). Сверх этого самое старое ожидающее отбрасывается. toast()возвращает хэндл.handle.dismiss()убирает уведомление раньше времени; вызывать его безопасно всегда.
Перед тем как уведомление уйдёт, tk-toaster запускает отменяемое событие tk-dismiss.
preventDefault() оставляет его на экране, например пока не закончится отмена действия.
toaster.addEventListener('tk-dismiss', (event) => {
if (event.detail.reason === 'action' && undoInProgress) event.preventDefault();
});Расположение
Уведомление всплывает внизу по центру, поверх диалогов, в 16px от нижнего края. Если внизу
есть панель навигации, увеличьте --tk-toaster-offset, чтобы уведомление её не
закрывало. Пустая область не мешает кликам по странице.
Когда использовать
- Уведомление — чтобы подтвердить то, что только что произошло: «Изменения сохранены», «Ссылка скопирована», «Сообщение отправлено».
- Никогда не используйте его для ошибок и срочного. Исчезающее сообщение легко
пропустить. Для этого есть
Section message ,Banner илиDialog . - Для сообщения обо всём приложении, например о плановых работах, есть
Banner . - Если пользователь должен что-то сделать, прежде чем продолжить, нужен
Dialog . - Показывайте уведомления редко. Если сообщение обязательно нужно увидеть, уведомление для него не подходит.
Текст
- Скажите, что произошло, в прошедшем времени: «Изменения сохранены», «Ссылка скопирована».
- Одна короткая строка. Без ошибок и срочных формулировок.
- Действие — один глагол: «Отменить», «Открыть».
Подробнее в
Можно / нельзя
| ✅ Можно | ❌ Нельзя |
|---|---|
Одна пустая tk-toaster в разметке страницы |
Создавать область при первом уведомлении |
| Подтвердить завершённое действие одной строкой | Ошибка или предупреждение в уведомлении |
«Отменить» как ярлык, с altText |
Уведомление как единственный способ что-то сделать |
--tk-toaster-offset выше нижней панели |
Уведомление поверх навигации |
Более долгий duration для длинного сообщения |
5 секунд для текста, который читать дольше |
Связанные
Section message : сообщение, которое остаётся в содержимом страницы.Banner : сообщение обо всём приложении.Dialog : сообщение, которое блокирует работу до действия.
API
Атрибуты tk-toaster
| Атрибут | Тип | По умолчанию | Что делает |
|---|---|---|---|
label |
string | "Notifications" |
имя области; к нему добавляется горячая клавиша |
hotkey |
string | "F8" |
клавиша, которая переводит фокус в уведомление |
max-queue |
number | 3 |
сколько уведомлений может ждать |
Свойство только для чтения pending считает ожидающие уведомления.
toast(message, options)
| Опция | Тип | По умолчанию | Что делает |
|---|---|---|---|
duration |
number (мс) | 5000, с действием 10000 |
сколько показывается; с действием не меньше 10000 |
action |
{ label, handler, altText } |
нет | одно действие; altText обязателен |
dismissible |
boolean | false |
показывает ✕ |
Возвращает хэндл с dismiss().
События
| Событие | Что означает |
|---|---|
tk-dismiss |
уведомление сейчас уйдёт; detail.reason — timeout, dismiss или action. Отменяемое: preventDefault() оставляет его (а при timeout запускает таймер заново) |
CSS
Задавайте их на tk-toaster или любом предке.
--tk-toaster-offset: отступ от нижнего края, по умолчаниюspace-16.--tk-toast-max-width: наибольшая ширина плашки, по умолчанию320px.--tk-toast-enter-distance: на сколько плашка въезжает; по умолчанию0, просто проявление.
Токены
| Часть | Токен |
|---|---|
| плашка | surface/inverse, shadow-2, radius-16 |
| сообщение | text/inverse, Body Medium |
| действие | text/inverse, Label Large |
| ✕ | icon/inverse |
| рамка, только в контрастной теме | border/default |
| рамка фокуса | border/inverse |
| слой | z-toast |
Доступность
Встроено:
- Скрытая область
role="status"вежливо объявляет каждое уведомление и никогда не перебивает. - Область уведомлений — именованная область, к которой можно перейти скринридером, а горячая клавиша (F8) переводит фокус в текущее уведомление. Esc там его закрывает, и фокус возвращается туда, где был.
- Само уведомление фокус не забирает.
- Пауза при наведении и фокусе даёт время прочитать и нажать.
- Текст на плашке 12.26:1, ✕ не ниже 3:1, во всех темах.
- При сокращённой анимации уведомление появляется и уходит без движения.
На вашей стороне:
- Добавьте область один раз, пустой, в разметку страницы.
- Дайте каждому действию
altText, и пусть действие остаётся ярлыком. - Никогда не показывайте в уведомлении ошибки и срочное.
- Держите уведомление над нижней навигацией с помощью
--tk-toaster-offset.
Ограничения
- До действия в уведомлении трудно добраться с клавиатуры и скринридером, пока оно не
ушло. Горячая клавиша, пауза и
altTextпомогают, но полностью WCAG не выполняют. Действие никогда не должно быть единственным способом что-то сделать. - ✕ всегда называется «Dismiss». В
toast()нет опции, чтобы это изменить.