@cloud-ru/ds-popover-private

中文文档
1.1.4发布于 2026/11/11Apache-2.0TypeScriptESM + CJS近 30 天下载 2万

Низкоуровневый popover на @floating-ui — позиционирование, стрелка, триггеры. Используется как фундамент для Tooltip, Popover, Dropdown.

原始使用文档
文档目录6 节
  1. Когда использовать
  2. Установка
  3. Props
  4. PopoverPrivate
  5. Arrow
  6. Смотри также

PopoverPrivate

@cloud-ru/ds-popover-private — Низкоуровневый popover на @floating-ui — позиционирование, стрелка, триггеры. Используется как фундамент для Tooltip, Popover, Dropdown.

@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

PopoverPrivateProps

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

  • OutsideClickHandler = (event: MouseEvent) => boolean

  • Placement = "bottom" | "bottom-end" | "bottom-start" | "left" | "left-end" | "left-start" | "right" | "right-end" | "right-start" | "top" | "top-end" | "top-start"

  • PopoverHeightStrategy = "auto" | "eq" | "lte"

  • PopoverWidthStrategy = "auto" | "eq" | "gte"

StopPropagationHandlers

PropTypeDefaultDescription
onClickboolean | undefined—
onMouseDownboolean | undefined—
onMouseUpboolean | undefined—
onTouchEndboolean | undefined—
onTouchMoveboolean | undefined—
onTouchStartboolean | undefined—
  • Trigger = "click" | "clickAndFocusVisible" | "focus" | "focusVisible" | "hover" | "hoverAndFocus" | "hoverAndFocusVisible"

Arrow

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

Смотри также

  • Tooltip, Popover, Dropdown — публичные потребители.

版本与发布记录

@cloud-ru/ds-popover-private 共发布 30 个版本,首次发布于 2026/08/18;过去 12 个月发布了 30 个版本。

版本发布日期距今
1.1.4latest2026/11/11今天
1.1.4-preview-e8fe6b56.0preview2026/11/11今天
1.1.4-preview-c0e895ed.02026/11/11今天
1.1.4-preview-90b10112.02026/11/11今天
1.1.4-preview-fd7dd437.02026/11/101 天前
1.1.4-preview-9a75a2a9.02026/11/101 天前

关于 @cloud-ru/ds-popover-private 的常见问题

@cloud-ru/ds-popover-private 是什么?

Низкоуровневый popover на @floating-ui — позиционирование, стрелка, триггеры. Используется как фундамент для Tooltip, Popover, Dropdown.

如何安装 @cloud-ru/ds-popover-private?

在项目目录运行 npm install @cloud-ru/ds-popover-private,或使用 pnpm add / yarn add / bun add。

@cloud-ru/ds-popover-private 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@cloud-ru/ds-popover-private 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@cloud-ru/ds-popover-private 可以商用吗?

@cloud-ru/ds-popover-private 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@cloud-ru/ds-popover-private 的下载量有多少?

根据 npm 官方下载统计,@cloud-ru/ds-popover-private 在 2026/10/10 – 2026/11/08 这 30 天内被下载 20,207 次,日均约 674 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@cloud-ru/ds-popover-private 还在维护吗?

最新版本 1.1.4 发布于 2026/11/11(今天);至今共发布 30 个版本,其中过去 12 个月发布了 30 个;首次发布于 2026/08/18。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。