Popover
<sf-popover> открывает небольшую поверхность рядом с кнопкой: фильтр,
настройки поля, список того, что можно добавить. Компонент держит состояние
открытия, закрывает поверхность по Escape и нажатию снаружи и возвращает
фокус на кнопку. Для меню действий над объектом берите
Context Menu, для выбора
значения в форме — Dropdown,
для задачи, которая требует внимания целиком, —
модальное окно.
Пример
Подготовить договор с поставщиком — открыта
Согласовать макет главной страницы — в работе
Перенести архив заказов — в работе
Обновить прайс-лист — закрыта
Применение
Кнопка и поверхность
Внутрь <sf-popover> ставят два элемента: кнопку со slot="trigger" и
поверхность со slot="content". Компонент не переносит их: оба остаются там,
где написаны, поэтому их может рисовать любой шаблон. Нажатие в любом месте
кнопки открывает и закрывает поверхность, нажатия внутри поверхности
принадлежат её содержимому.
Поверхность получает фон, радиус, тень и собственную прокрутку, когда содержимое выше доступного места. Отступы внутри задаёт содержимое.
Положение и ширина
placement задаёт, от какого края кнопки открывается поверхность:
bottom-end (по умолчанию), bottom-start, top-start, top-end,
inline-start или inline-end. Логические значения отражаются при письме
справа налево. Без width поверхность берёт ширину самой длинной строки;
задайте width, например width="20rem", если в поверхности список
строк разной длины.
Поверхность стоит в потоке рядом с кнопкой и не выносится в верхний слой
страницы. Предок с overflow: hidden обрежет её, поэтому оставляйте под
кнопкой место или открывайте поверхность в другую сторону.
Открытие и закрытие
Атрибут open показывает поверхность и отражает её состояние: его можно
читать и ставить. show(), close() и toggle(force) делают то же из кода
и возвращают новое состояние. При открытии отправляется событие
sf-popover-open, при закрытии — sf-popover-close; в обоих
event.detail.open содержит новое состояние.
По умолчанию поверхность закрывается по Escape и по нажатию за её
пределами. dismissible="false" отключает оба способа — тогда страница
закрывает поверхность сама, вызывая close(), например после шага мастера.
const popover = document.querySelector('sf-popover');
popover.addEventListener('sf-popover-open', () => {
popover.querySelector('[slot="content"] input')?.focus();
});
popover.addEventListener('sf-popover-close', () => {
applyFilter();
});
Доступность
- Поверхности нужно доступное имя:
labelна<sf-popover>передаётся ей какaria-label. Роль поверхности задаётsurface-role:dialog(по умолчанию),menu,listboxилиgroup. Атрибутroleна самом<sf-popover>компонент переносит на поверхность и предупреждает в консоли. - Кнопке нужно доступное имя.
aria-expandedиaria-haspopupкомпонент ставит ей сам по состоянию и роли поверхности. - При открытии фокус остаётся на кнопке. Если пользователь работает в поверхности с клавиатуры, переведите фокус на её первое поле. После закрытия фокус возвращается на кнопку.
Escapeзакрывает поверхность. Еслиdismissible="false", в поверхности должна быть своя кнопка закрытия.
Справочник API
Раздел собран из манифеста компонента выпуска ui-106d5901f8c3 и обновляется вместе с выпуском. Чтобы исправить описание, исправьте манифест.
Каждому атрибуту соответствует свойство элемента с тем же именем в camelCase: search-placeholder — searchPlaceholder. Свойство атрибута template называется templateName.
| Тег | <sf-popover> |
| Назначение | Поверхность, привязанная к элементу управления, который передаёт потребитель, со своим состоянием открытия, закрытием и возвратом фокуса. |
| Контракт | smart.popover, версия 1.0.0 |
| Поставка | выпуск Framework ui-106d5901f8c3 |
| Жизненный цикл | экспериментальный: API может меняться между выпусками |
| Готовность | описан: манифест и сценарий есть, продуктовой приёмки нет |
| Заготовка до прихода кода | нет: атрибут data-sf-skeleton не пишется; своего скелетона при загрузке данных нет (Заготовка до прихода кода) |
Атрибуты
template—string, по умолчаниюdefault. Имя варианта шаблона.open—boolean, по умолчаниюfalse. Показана ли поверхность. Отражается в атрибуте, поэтому потребитель может читать и задавать его.placement—string, по умолчаниюbottom-end, значения:bottom-start,bottom-end,top-start,top-end,inline-start,inline-end. От какого угла триггера отображается поверхность.label—string, по умолчанию пусто. Доступное имя поверхности. Поверхность с ролью, но без имени объявляется как безымянная.width—string, по умолчанию пусто. Собственная ширина. Без неё поверхность принимает ширину самой длинной строки, и список имён получается широким и неровным.dismissible—boolean, по умолчаниюtrue. Esc и нажатие снаружи закрывают её. Потребитель, который сам обрабатывает эти действия, отключает это и вызывает close(), когда решит.surface-role—string, по умолчаниюdialog, значения:dialog,menu,listbox,group. Чем поверхность является для читателя: dialog, menu, listbox или group. Задаётся на sf-popover; поверхность получает role, а триггер — aria-haspopup.
Прежние имена:
| Имя | Прежнее имя | Состояние | Убирается после |
|---|---|---|---|
surface-role |
role |
работает, отмечается в SF.deprecations |
2026-12-01 |
Методы
toggle(force?: boolean)— возвращаетboolean. Открыть или закрыть; логическое значение задаёт одно из состояний принудительно.show()— возвращаетboolean. Открыть.close()— возвращаетboolean. Закрыть.returnFocus()— возвращаетnull. Вернуть фокус на триггер.
События
Все события приходят на сам элемент и всплывают. Общие события базового элемента перечислены в главе Жизненный цикл → Этапы.
sf-popover-open—detail:{ component: object, tagName: string, template: string, open: boolean }. Поверхность открылась.sf-popover-close—detail:{ component: object, tagName: string, template: string, open: boolean }. Поверхность закрылась.
Минимальная разметка
<sf-popover label="Settings"><button slot="trigger" type="button">Settings</button><div slot="content">…</div></sf-popover>
Источник
simai/ui@106d5901f8c3b4f23131ce0e7ede5dbd8abfe4f4:distr/smart/popoversimai/ui@106d5901f8c3b4f23131ce0e7ede5dbd8abfe4f4:distr/rule/rule.json#name=cl-popover
См. также
- Context Menu — меню действий над объектом.
- Drawer — боковая панель рабочего места.