From 91f5cd4d70fc47438f1af4d03d60e26d5469594b Mon Sep 17 00:00:00 2001 From: Dima Shugaev Date: Tue, 7 Apr 2026 19:25:26 +0300 Subject: [PATCH] feat(beta): extended portal prop in Popover, Tooltip --- .../src/components/_beta/Popover/Popover.tsx | 4 ++-- .../components/_beta/Popover/Popover.types.ts | 8 ++++++-- .../Popover/utils/getFloatingPortalProps.ts | 20 +++++++++++++++++++ .../components/_beta/Popover/utils/index.ts | 1 + .../src/components/_beta/Tooltip/Tooltip.tsx | 3 ++- .../components/_beta/Tooltip/Tooltip.types.ts | 8 ++++++-- 6 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 packages/plasma-new-hope/src/components/_beta/Popover/utils/getFloatingPortalProps.ts diff --git a/packages/plasma-new-hope/src/components/_beta/Popover/Popover.tsx b/packages/plasma-new-hope/src/components/_beta/Popover/Popover.tsx index 1b8a0dee29f..95c9a6b653c 100644 --- a/packages/plasma-new-hope/src/components/_beta/Popover/Popover.tsx +++ b/packages/plasma-new-hope/src/components/_beta/Popover/Popover.tsx @@ -26,7 +26,7 @@ import { IconClose } from '../../_Icon'; import { Resizable } from '../../_Resizable'; import { Slot } from '../../_Slot/Slot'; -import { sizeToIconSize, matchPlacements } from './utils'; +import { sizeToIconSize, matchPlacements, getFloatingPortalProps } from './utils'; import { tokens, classes } from './Popover.tokens'; import { base, CloseButton, Wrapper } from './Popover.styles'; import type { PopoverProps } from './Popover.types'; @@ -132,7 +132,7 @@ export const popoverRoot = (Root: RootProps {opened && ( - + . + * @default Без использования portal всплывающее окно рендерится перед . */ - portal?: React.RefObject; + portal?: string | React.RefObject; /** * Вид компонента. diff --git a/packages/plasma-new-hope/src/components/_beta/Popover/utils/getFloatingPortalProps.ts b/packages/plasma-new-hope/src/components/_beta/Popover/utils/getFloatingPortalProps.ts new file mode 100644 index 00000000000..77c8fb2e9d6 --- /dev/null +++ b/packages/plasma-new-hope/src/components/_beta/Popover/utils/getFloatingPortalProps.ts @@ -0,0 +1,20 @@ +import { RefObject } from 'react'; + +type FloatingPortalReturnedProps = { + root?: RefObject; + id?: string; +}; + +export const getFloatingPortalProps = ( + portal?: string | RefObject, +): FloatingPortalReturnedProps => { + if (!portal) { + return {}; + } + + if (typeof portal === 'string') { + return { id: portal }; + } + + return { root: portal }; +}; diff --git a/packages/plasma-new-hope/src/components/_beta/Popover/utils/index.ts b/packages/plasma-new-hope/src/components/_beta/Popover/utils/index.ts index 7e152b490fb..e96c691c1d4 100644 --- a/packages/plasma-new-hope/src/components/_beta/Popover/utils/index.ts +++ b/packages/plasma-new-hope/src/components/_beta/Popover/utils/index.ts @@ -1,2 +1,3 @@ export * from './sizeToIconSize'; export * from './matchPlacements'; +export * from './getFloatingPortalProps'; diff --git a/packages/plasma-new-hope/src/components/_beta/Tooltip/Tooltip.tsx b/packages/plasma-new-hope/src/components/_beta/Tooltip/Tooltip.tsx index e11451fc22b..9c3616b192f 100644 --- a/packages/plasma-new-hope/src/components/_beta/Tooltip/Tooltip.tsx +++ b/packages/plasma-new-hope/src/components/_beta/Tooltip/Tooltip.tsx @@ -20,6 +20,7 @@ import { css } from '@linaria/core'; import { Slot } from '../../_Slot/Slot'; import { ARROW_HEIGHT, ARROW_PADDING, ARROW_POLYGON, ARROW_WIDTH } from '../Popover/Popover'; +import { getFloatingPortalProps } from '../Popover/utils'; import { tokens, classes } from './Tooltip.tokens'; import { base, Wrapper, IconWrapper } from './Tooltip.styles'; @@ -97,7 +98,7 @@ export const tooltipRoot = (Root: RootProps {opened && ( - + . + * @default Без использования portal всплывающее окно рендерится перед . */ - portal?: React.RefObject; + portal?: string | React.RefObject; /** * Вид компонента.