Всплывающее сообщение коротко сообщает результат действия поверх интерфейса
и не блокирует дальнейшую работу. Для постоянного текста внутри страницы
берите уведомление, для подтверждения с
обязательным выбором — модальное окно.
Минимальную разметку показывает пример выше. Части вложены так:
sf-toast → иконка sf-icon и sf-toast-container → sf-toast-wrap →
sf-toast-text и sf-toast-supporting-text; кнопки действий — в
sf-toast-bottom после sf-toast-wrap, кнопка закрытия — последним потомком
блока.
На блоке sf-toast — один класс статуса.
sf-toast-text — заголовок сообщения, sf-toast-supporting-text —
пояснение. Обязателен только заголовок.
Иконка необязательна; она декоративна и берёт цвет статуса.
Компонент отвечает за одно сообщение. Положение на экране, порядок и число
одновременно видимых сообщений задаёт контейнер приложения.
Варианты
Статус
Статус задаёт цвет заливки, границы, текста и иконки: sf-toast--neutral,
sf-toast--info, sf-toast--success, sf-toast--warning,
sf-toast--error — общий словарь статусов Framework. Выбирайте статус по
смыслу сообщения, а не по желаемому цвету. Классы sf-toast--default и
sf-toast--primary — другие имена neutral и info.
Без атрибута data-duration сообщение остаётся, пока его не закроют.
data-duration задаёт время в миллисекундах, после которого сообщение
закрывается само; отсчёт останавливается, пока указатель или фокус внутри
сообщения. Сообщение с действием и сообщение об ошибке оставляйте
постоянными: их легко не успеть прочитать.
Сообщению, которое появляется динамически, задайте role="status" для
обычного результата и role="alert" для срочной ошибки. Сообщению, которое
есть на странице с первой загрузки, живая роль не нужна.
Смысл передаёт текст; цвет и иконка его только поддерживают.
Кнопке закрытия нужно доступное имя: aria-label="Закрыть сообщение".
Не кладите во временное сообщение обязательный шаг или сведения, без которых
нельзя продолжить.
Если при закрытии фокус был внутри сообщения, приложение переносит его на
следующий осмысленный элемент: компонент удаляет блок вместе с фокусом.
JavaScript
Скрипт компонента находит блоки .sf-toast при загрузке страницы и в
добавленной позже разметке и обрабатывает нажатия внутри них:
Атрибут на кнопке
Что происходит
data-action="значение"
на блоке возникает событие sf-toast-action; сообщение остаётся
data-close
на блоке возникает событие sf-toast-close, затем блок удаляется
Оба события всплывают. sf-toast-action несёт в detail поля action
(значение атрибута), toast и trigger; sf-toast-close — toast и
trigger (при закрытии по времени trigger равен null). Недоступная кнопка
(disabled или aria-disabled="true") событий не вызывает. На время
удаления блок получает класс closing и плавно гаснет; при системной
настройке уменьшения движения блок удаляется сразу. data-toast-action и
data-toast-close — другие имена тех же атрибутов. Само действие выполняет
приложение.
Параметры: status, icon (имя значка), title, supportingText,
actionText и action (кнопка действия и её значение), closable (по
умолчанию true), closeLabel, duration, role (status или alert).
status принимает общие значения статуса: neutral, info, success,
warning и error; прежние default и primary означают neutral и
info, а неизвестное значение собирает нейтральное сообщение. Компонент также регистрирует класс Toast с
теми же параметрами: SF.Loader.ready('Toast', callback) передаёт его после
события sf-loader-init.
Уведомления страницы: SF.notify
Сообщение, которое должно появиться и исчезнуть, поднимают через
SF.notify, а не ставят блок рядом с компонентом. У страницы одна область
уведомлений, и все сообщения попадают в неё.
constdemo= document.querySelector('[data-notify-demo]');
constlog= demo.querySelector('[data-notify-log]');
constmessages= {
success: {status: 'success', title: 'Изменения сохранены', key: 'demo:saved'},
error: {status: 'error', title: 'Оплата не прошла', text: 'Проверьте данные карты.', action: {label: 'Повторить', onSelect: () => {}}},
};
// Every message is announced on the document before it shows: a notification// centre would record it here.
document.addEventListener('sf-notification', (event) => {
log.textContent =`Записано: ${event.detail.title} (${event.detail.status}). В истории: ${SF.notifications.history().length+1}.`;
});
demo.addEventListener('click', (event) => {
constbutton= event.target.closest('[data-notify]');
if (button) SF.notify(messages[button.dataset.notify]);
});
Параметры SF.notify
JavaScript
consthandle=SF.notify({
status: 'success', // neutral, info, success, warning, error
title: 'Пополнение выполнено',
text: 'Средства поступят в течение минуты.',
action: {label: 'Открыть', onSelect: (record) => {}},
duration: 5000, // 0 — до закрытия; без параметра — по статусу
source: 'billing', // кто поднял сообщение
key: 'topup:42', // сообщения с одним ключом считаются одним
});
handle.close();
Область стоит у края окна в верхнем слое страницы, по умолчанию внизу в
конце строки. Она лежит и выше открытого модального окна, поэтому ошибку
можно показать, не закрывая окно. SF.notifications.configure({placement: 'top-end', max: 4})
переносит её к другому углу (top-start, top-end, bottom-start,
bottom-end) и задаёт, сколько сообщений видно сразу.
Сообщения встают стопкой с промежутком. Одновременно видно четыре,
остальные ждут очереди. Повторное сообщение с тем же ключом (или тем же
статусом, заголовком и текстом) не добавляется, а увеличивает счётчик ×2.
Без duration сообщение живёт пять секунд, предупреждение — восемь,
ошибка — десять. Таймер останавливается, пока на сообщении указатель или
фокус.
Ошибка объявляется сразу (role="alert"), остальные статусы — вежливо
(role="status").
Перед показом каждое сообщение объявляется на документе событием
sf-notification с detail: id, status, title, text, source,
time. Центр уведомлений записывает его там; отмена события
(preventDefault()) сохраняет запись, но не показывает сообщение.
SF.notifications.history() возвращает последние пятьдесят записей
страницы.
Компонент сообщений загружается при первом вызове SF.notify.
Классы и переменные собраны из CSS выпуска и обновляются вместе с ним.
Переменные
Настройка
Эти переменные — поверхность настройки компонента. Их имена стабильны: переименовать или убрать такую переменную можно только через журнал изменений, с предупреждением, как атрибут. Framework их не задаёт, поэтому значение можно поставить на сам компонент (.sf-toast) или на любого предка. Переменные действуют на спокойный вид; наведение, фокус, нажатие, недоступность и ошибка рисуются поверх, поэтому состояния остаются видны.
Переменная
Что задаёт
По умолчанию
--sf-toast-background-color
Подложка поверх приподнятой поверхности уведомления. Её задаёт класс статуса (sf-toast--neutral, sf-toast--info и другие); без статуса подложки нет, и переменная не действует.
var(--sf-surface-container); зависит от статуса
--sf-toast-color
Цвет заголовка и поясняющего текста.
var(--sf-on-surface); зависит от статуса
--sf-toast-border-color
Цвет рамки.
var(--sf-outline-variant)
--sf-toast-border-width
Ширина рамки со всех сторон.
var(--sf-px)
--sf-toast-radius
Скругление углов.
var(--sf-radius--surface)
--sf-toast-padding-inline
Отступ до и после содержимого по строчной оси.
var(--sf-space-1)
--sf-toast-padding-block
Отступ над и под содержимым.
var(--sf-space-1)
--sf-toast-gap
Промежуток между значком, текстом и кнопкой закрытия.
var(--sf-space-1/2)
CSS
.sf-toast {
--sf-toast-radius: 0;
}
Устройство
Остальные переменные — внутренняя проводка компонента: модификаторы задают им значения, а части их читают. Их имена и устройство могут меняться в любом выпуске, поэтому проект их не задаёт. Значение по умолчанию — из базового правила блока (.sf-toast); переменную без него задают только модификаторы.
Переменная
По умолчанию
Задаёт
--sf-toast--background-color
не задана; задают модификаторы, например .sf-toast--neutral: var(--sf-toast-background-color, var(--sf-surface-container))
background-image
--sf-toast--content-color
не задана; задают модификаторы, например .sf-toast--neutral: var(--sf-toast-color, var(--sf-on-surface))
color
--sf-toast-bottom--background-color
не задана; задают модификаторы, например .sf-toast .sf-toast-bottom: transparent
background-color
--sf-toast-container--background-color
не задана; задают модификаторы, например .sf-toast .sf-toast-container: transparent
background-color
--sf-toast-container--gap
не задана; задают модификаторы, например .sf-toast .sf-toast-container: var(--sf-space-1/2)
gap
--sf-toast-supporting-text--color
не задана; задают модификаторы, например .sf-toast.sf-toast--neutral .sf-toast-supporting-text: var(--sf-toast-color, var(--sf-on-surface))
color
--sf-toast-supporting-text--font-family
не задана; задают модификаторы, например .sf-toast .sf-toast-supporting-text: var(--sf-text--family)
font-family
--sf-toast-supporting-text--font-size
не задана; задают модификаторы, например .sf-toast .sf-toast-supporting-text: var(--sf-text-size-1)
font-size
--sf-toast-supporting-text--font-weight
не задана; задают модификаторы, например .sf-toast .sf-toast-supporting-text: var(--sf-font-weight-regular)
font-weight
--sf-toast-supporting-text--line-height
не задана; задают модификаторы, например .sf-toast .sf-toast-supporting-text: var(--sf-text-height-1)
line-height
--sf-toast-text--color
не задана; задают модификаторы, например .sf-toast.sf-toast--neutral .sf-toast-text: var(--sf-toast-color, var(--sf-on-surface))
color
--sf-toast-text--font-family
не задана; задают модификаторы, например .sf-toast .sf-toast-text: var(--sf-text--family)
font-family
--sf-toast-text--font-size
не задана; задают модификаторы, например .sf-toast .sf-toast-text: var(--sf-text-size-1)
font-size
--sf-toast-text--font-weight
не задана; задают модификаторы, например .sf-toast .sf-toast-text: var(--sf-font-weight-medium)
font-weight
--sf-toast-text--line-height
не задана; задают модификаторы, например .sf-toast .sf-toast-text: var(--sf-text-height-1)
line-height
--sf-toast-wrap--background-color
не задана; задают модификаторы, например .sf-toast .sf-toast-wrap: transparent
background-color
--sf-toast-wrap--gap
не задана; задают модификаторы, например .sf-toast .sf-toast-wrap: var(--sf-space-1/4)