PopoverPrivate

@cloud-ru/ds-popover-private — внутренний строительный блок: бесстилевая обёртка над @floating-ui/react с поддержкой placement, offset, авто-flip, стрелки и нескольких триггеров (click, hover, focus, controlled open). Поверх него собраны публичные @cloud-ru/ds-tooltip, @cloud-ru/ds-popover, @cloud-ru/ds-dropdown. В продуктовом коде используйте их.

Когда использовать

  • Реализация нового публичного компонента, которому нужно всплывающее окно (например, контекстное меню новой формы).
  • Очень специфический сценарий, который не покрыт Tooltip/Popover/Dropdown.

В обычной разработке — берите публичный компонент.

Установка

pnpm add @cloud-ru/ds-popover-private
import { PopoverPrivate, Arrow } from '@cloud-ru/ds-popover-private'

Props

PopoverPrivate

Types

PropsPopoverPrivateProps
PropTypeDefaultRequiredDescription
arrowContainerClassNamestring—noCSS-класс контейнера стрелки поповера
arrowElementClassNamestring—noCSS-класс стрелки поповера
childrenReactNode | ChildrenFunction—noТриггер поповера (подробнее читайте ниже)
classNamestring—no
closeOnEscapeKeybooleantruenoЗакрывать ли по нажатию на кнопку `Esc`
closeOnPopstateboolean—noЗакрывать ли поповер при переходе по истории браузера
containerRefObject<HTMLElement | null>—noКонтейнер портала (ref). Переопределяет `PortalContext` для этого инстанса — по аналогии с `container` у Modal/Drawer. По умолчанию берётся из `PortalContextProvider`.
data-test-idstring—no
disableSpanWrapperboolean—noОтключает для `isValidElement` внешнюю обертку триггера <br/> Пригодится для элементов с `position: absolute` <br/> Работает для триггеров, которые умеют отдать свою DOM-ноду: нативные элементы, `forwardRef`-компоненты и компоненты, помеченные `withInnerRefSupport` из `@cloud-ru/ds-utils`. Остальные всё равно получают `<span>` — без ноды поповеру не от чего считать позицию; в dev-режиме об этом печатается предупреждение.
escapeKeyBubblesbooleanfalsenoПропускать ли `Esc` дальше после закрытия поповера. Без этого открытый поповер гасит всплытие `Esc`, и внешний поповер (например, дроплист, чей триггер несёт тултип) не закроется.
fallbackPlacementsPlacement[]—noЦепочка расположений которая будет применяться к поповеру от первого к последнему если при текущем он не влезает.
hasArrowboolean—noПараметр наличия стрелки у поповера. В размеры стрелки встроен отступ. Дополнительный отступ может быть задан параметром `offset`. У элемента стрелки нет цвета, необходимо задавать его через параметр `arrowClassName`.
heightStrategy"auto" | "eq" | "lte"autonoСтратегия управления высотой контейнера поповера <br/> - `auto` - соответствует высоте контента, <br/> - `lte` - Less Than or Equal, равен высоте таргета или меньше ее, если контент в поповере меньше, <br/> - `eq` - Equal, строго равен высоте таргета.
hoverDelayClosenumber—noЗадержка закрытия по ховеру
hoverDelayOpennumber—noЗадержка открытия по ховеру
offsetnumber0noОтступ поповера от его триггер-элемента (в пикселях).
onOpenChange((isOpen: boolean) => void)—noКолбек отображения компонента. Срабатывает при изменении состояния open.
openboolean—noУправляет состоянием показан/не показан.
outsideClickboolean | OutsideClickHandler—noЗакрывать ли при клике вне поповера
placement"bottom" | "bottom-end" | "bottom-start" | "left" | "left-end" | "left-start" | "right" | "right-end" | "right-start" | "top" | "top-end" | "top-start"topyesПоложение поповера относительно своего триггера (children).
popoverContentReactNode | ReactNode[]—yesКонтент поповера
stopPropagationStopPropagationHandlers{ onClick: true, onMouseDown: true, onMouseUp: true, onTouchStart: true, onTouchEnd: true, onTouchMove: true }noГасить всплытие pointer/touch-событий с floating-контейнера (`stopPropagation`). По умолчанию все хендлеры включены. Для drag&drop внутри поповера отключите `onMouseUp` / `onTouchEnd`, чтобы они дошли до `document`.
trigger"click" | "clickAndFocusVisible" | "focus" | "focusVisible" | "hover" | "hoverAndFocus" | "hoverAndFocusVisible"—yesУсловие отображения поповера: <br/> - `click` - открывать по клику <br/> - `hover` - открывать по ховеру <br/> - `focusVisible` - открывать по focus-visible <br/> - `focus` - открывать по фокусу <br/> - `hoverAndFocusVisible` - открывать по ховеру и focus-visible <br/> - `hoverAndFocus` - открывать по ховеру и фокусу <br/> - `clickAndFocusVisible` - открывать по клику и focus-visible
triggerClassNamestring—noCSS-класс триггера
triggerClickByKeysbooleantruenoВызывается ли попоповер по нажатию клавиш Enter/Space (при trigger = `click`)
triggerRefForwardedRef<HTMLElement | ReferenceType | null>—noRef ссылка на триггер
widthStrategy"auto" | "eq" | "gte"autonoСтратегия управления шириной контейнера поповера <br/> - `auto` - соответствует ширине контента, <br/> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br/> - `eq` - Equal, строго равен ширине таргета.

Unions

Types

PopoverPrivateProps

Unions

Arrow

Types

PropsArrowProps
PropTypeDefaultRequiredDescription
arrowContainerClassNamestring—no
arrowElementClassNamestring—no
arrowRefRefObject<HTMLDivElement | null>—yes
placement"bottom" | "bottom-end" | "bottom-start" | "left" | "left-end" | "left-start" | "right" | "right-end" | "right-start" | "top" | "top-end" | "top-start"—yes
xnumber—no
ynumber—no

Смотри также