Перейти до вмісту
tatetUI

Popover

SSR-безпечна немодальна панель біля trigger з фліпом, focus return і outside click.

Приклад

API

Props

НазваТипТиповоОпис
placementbottom-startbottombottom-endtop-starttoptop-endleftright"bottom-start"Бажана позиція панелі. Якщо не вміщається — перевертається на протилежний бік і притискається до краю вікна.
panelRoledialoggroupnone"dialog"Роль панелі. `dialog` — коли всередині є керування; `group` — для згрупованого вмісту без власної семантики вікна.
initialFocusstring—Селектор елемента, який отримує фокус після відкриття.
ariaLabelstring—Доступна назва панелі. Потрібна, коли всередині немає власного заголовка.
widthstring—Ширина панелі, будь-яка CSS-величина. Без неї — за вмістом.
modelValuebooleanfalseВідкрито. Використовуйте через `v-model`.
closeOnOutsidebooleantrueКлік поза панеллю закриває її.
closeOnEscapebooleantrueEscape закриває панель. Escape отримує лише ВЕРХНІЙ шар: відкритий селект чи підказка всередині панелі закриваються першими.
disabledboolean——

Події

НазваPayloadОпис
update:modelValue[value: boolean]Панель відкрито або закрито.
close[]Панель закрилася.
open[]Панель відкрилася.

Слоти

НазваОпис
triggerТригер. `triggerAttrs` — на реальну кнопку через `v-bind`: у них ARIA, клік і клавіші (ArrowDown і Tab ведуть у відкриту панель).
defaultВміст панелі. `close` закриває її й повертає фокус на тригер.

Доступно через ref

НазваТипОпис
open(focusInside?: boolean) => void—
close(restoreFocus?: boolean) => void—
toggle(event?: Event) => void—

Коли використовувати

Для компактних фільтрів, налаштувань і довільних немодальних контролів біля кнопки. Слот trigger отримує triggerAttrs — передайте їх реальному фокусованому елементу.

Коли НЕ використовувати

Не використовуйте для критичного підтвердження або довгої форми — беріть UiModal чи UiDrawer. Для набору команд із menu-семантикою є UiMenu.

Доступність

Відкриття з клавіатури (Enter, Space чи ArrowDown на тригері) переносить фокус у панель — на перший контроль або, якщо їх немає, на саму панель. Мишею фокус лишається на тригері, але Tab із нього все одно веде в панель. Панель телепортована в кінець body, тож без цього Tab перестрибував би відкритий вміст.

Tab з останнього контролу закриває панель і веде до елемента, що йде за тригером на сторінці; Shift+Tab із першого повертає на тригер.

Escape закриває панель і повертає фокус, якщо він був у ній чи на тригері. panelRole дозволяє обрати dialog, group або прибрати роль, а ariaLabel дає стабільну доступну назву.

Вкладені шари

Поповер зареєстрований у спільному стеку оверлеїв (useFloatingLayer), тож Escape отримує лише верхній шар: відкритий UiSelect чи підказка всередині панелі закриваються першими, а сам поповер — наступним натиском.

Клік «повз» не рахує нічого, що з'явилося після відкриття поповера: випадайку селекта всередині, вкладене меню, діалог поверх. Раніше вибір пункту в селекті всередині поповера закривав поповер ще до того, як значення встигало змінитися.

Teleport вимкнений на сервері й під час першого client render, тому гідратація має однакове дерево; перенесення в body відбувається після mount.