@lobehub/ui 5.19.2 → 5.19.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/base-ui/Popover/PopoverGroup.mjs +9 -2
- package/es/base-ui/Popover/PopoverGroup.mjs.map +1 -1
- package/es/base-ui/Popover/PopoverStandalone.mjs +9 -3
- package/es/base-ui/Popover/PopoverStandalone.mjs.map +1 -1
- package/es/base-ui/Popover/hoverOnlyPress.mjs +14 -0
- package/es/base-ui/Popover/hoverOnlyPress.mjs.map +1 -0
- package/package.json +1 -1
|
@@ -7,6 +7,7 @@ import { usePopoverPortalContainer } from "./PopoverPortal.mjs";
|
|
|
7
7
|
import { PopoverArrow, PopoverPopup, PopoverPortal, PopoverPositioner, PopoverViewport } from "./atoms.mjs";
|
|
8
8
|
import { PopoverProvider } from "./context.mjs";
|
|
9
9
|
import { PopoverGroupHandleContext, PopoverGroupPropsContext } from "./groupContext.mjs";
|
|
10
|
+
import { shouldCancelHoverOnlyPressOpen } from "./hoverOnlyPress.mjs";
|
|
10
11
|
import { useCallback, useMemo, useRef, useState } from "react";
|
|
11
12
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
13
|
import { Popover } from "@base-ui/react/popover";
|
|
@@ -28,8 +29,14 @@ const PopoverGroup = ({ children, contentLayoutAnimation = false, disableDestroy
|
|
|
28
29
|
handle.close();
|
|
29
30
|
}, [handle]);
|
|
30
31
|
const contextValue = useMemo(() => ({ close }), [close]);
|
|
31
|
-
const handleOpenChange = useCallback((
|
|
32
|
-
activeItemRef.current
|
|
32
|
+
const handleOpenChange = useCallback((nextOpen, eventDetails) => {
|
|
33
|
+
const item = activeItemRef.current;
|
|
34
|
+
const { openOnClick } = parseTrigger(item?.trigger ?? "hover");
|
|
35
|
+
if (shouldCancelHoverOnlyPressOpen(openOnClick, nextOpen, eventDetails?.reason)) {
|
|
36
|
+
eventDetails?.cancel?.();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
item?.onOpenChange?.(nextOpen);
|
|
33
40
|
}, []);
|
|
34
41
|
useDestroyOnInvalidActiveTriggerElement(handle.store, destroy, { enabled: !disableDestroyOnInvalidTrigger });
|
|
35
42
|
useHidePopupWhenPositionerAtOrigin(handle.store, { enabled: !disableZeroOriginGuard });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PopoverGroup.mjs","names":["BasePopover"],"sources":["../../../src/base-ui/Popover/PopoverGroup.tsx"],"sourcesContent":["'use client';\n\nimport { Popover as BasePopover } from '@base-ui/react/popover';\nimport { type FC, type ReactNode, useCallback, useMemo, useRef, useState } from 'react';\n\nimport {\n useDestroyOnInvalidActiveTriggerElement,\n useHidePopupWhenPositionerAtOrigin,\n} from '@/utils/destroyOnInvalidActiveTriggerElement';\nimport { parseTrigger } from '@/utils/parseTrigger';\nimport { placementMap } from '@/utils/placement';\n\nimport { PopoverArrowIcon } from './ArrowIcon';\nimport {\n PopoverArrow,\n PopoverPopup,\n PopoverPortal,\n PopoverPositioner,\n PopoverViewport,\n} from './atoms';\nimport { PopoverProvider } from './context';\nimport {\n PopoverGroupHandleContext,\n type PopoverGroupItem,\n PopoverGroupPropsContext,\n type PopoverGroupSharedProps,\n} from './groupContext';\nimport { usePopoverPortalContainer } from './PopoverPortal';\n\ntype PopoverGroupProps = PopoverGroupSharedProps & {\n children: ReactNode;\n};\n\nconst PopoverGroup: FC<PopoverGroupProps> = ({\n children,\n contentLayoutAnimation = false,\n disableDestroyOnInvalidTrigger = false,\n disableZeroOriginGuard = false,\n ...sharedProps\n}) => {\n const [{ handle, key }, setHandleState] = useState(() => ({\n handle: BasePopover.createHandle<PopoverGroupItem>(),\n key: 0,\n }));\n const activeItemRef = useRef<PopoverGroupItem | null>(null);\n const destroy = useCallback(() => {\n activeItemRef.current = null;\n setHandleState(({ key }) => ({\n handle: BasePopover.createHandle<PopoverGroupItem>(),\n key: key + 1,\n }));\n }, []);\n const close = useCallback(() => {\n handle.close();\n }, [handle]);\n const contextValue = useMemo(() => ({ close }), [close]);\n\n const handleOpenChange = useCallback((
|
|
1
|
+
{"version":3,"file":"PopoverGroup.mjs","names":["BasePopover"],"sources":["../../../src/base-ui/Popover/PopoverGroup.tsx"],"sourcesContent":["'use client';\n\nimport { Popover as BasePopover } from '@base-ui/react/popover';\nimport { type FC, type ReactNode, useCallback, useMemo, useRef, useState } from 'react';\n\nimport {\n useDestroyOnInvalidActiveTriggerElement,\n useHidePopupWhenPositionerAtOrigin,\n} from '@/utils/destroyOnInvalidActiveTriggerElement';\nimport { parseTrigger } from '@/utils/parseTrigger';\nimport { placementMap } from '@/utils/placement';\n\nimport { PopoverArrowIcon } from './ArrowIcon';\nimport {\n PopoverArrow,\n PopoverPopup,\n PopoverPortal,\n PopoverPositioner,\n PopoverViewport,\n} from './atoms';\nimport { PopoverProvider } from './context';\nimport {\n PopoverGroupHandleContext,\n type PopoverGroupItem,\n PopoverGroupPropsContext,\n type PopoverGroupSharedProps,\n} from './groupContext';\nimport { shouldCancelHoverOnlyPressOpen } from './hoverOnlyPress';\nimport { usePopoverPortalContainer } from './PopoverPortal';\n\ntype PopoverGroupProps = PopoverGroupSharedProps & {\n children: ReactNode;\n};\n\nconst PopoverGroup: FC<PopoverGroupProps> = ({\n children,\n contentLayoutAnimation = false,\n disableDestroyOnInvalidTrigger = false,\n disableZeroOriginGuard = false,\n ...sharedProps\n}) => {\n const [{ handle, key }, setHandleState] = useState(() => ({\n handle: BasePopover.createHandle<PopoverGroupItem>(),\n key: 0,\n }));\n const activeItemRef = useRef<PopoverGroupItem | null>(null);\n const destroy = useCallback(() => {\n activeItemRef.current = null;\n setHandleState(({ key }) => ({\n handle: BasePopover.createHandle<PopoverGroupItem>(),\n key: key + 1,\n }));\n }, []);\n const close = useCallback(() => {\n handle.close();\n }, [handle]);\n const contextValue = useMemo(() => ({ close }), [close]);\n\n const handleOpenChange = useCallback(\n (nextOpen: boolean, eventDetails?: { cancel?: () => void; reason?: string }) => {\n const item = activeItemRef.current;\n const { openOnClick } = parseTrigger(item?.trigger ?? 'hover');\n\n if (shouldCancelHoverOnlyPressOpen(openOnClick, nextOpen, eventDetails?.reason)) {\n eventDetails?.cancel?.();\n return;\n }\n\n item?.onOpenChange?.(nextOpen);\n },\n [],\n );\n\n useDestroyOnInvalidActiveTriggerElement(handle.store, destroy, {\n enabled: !disableDestroyOnInvalidTrigger,\n });\n useHidePopupWhenPositionerAtOrigin(handle.store, { enabled: !disableZeroOriginGuard });\n\n const portalContainer = usePopoverPortalContainer();\n\n return (\n <PopoverGroupHandleContext value={handle}>\n <PopoverGroupPropsContext value={sharedProps}>\n {children}\n <BasePopover.Root handle={handle} key={key} onOpenChange={handleOpenChange}>\n {({ payload }) => {\n const item = (payload as PopoverGroupItem | null) ?? null;\n activeItemRef.current = item;\n\n if (!item?.content) return null;\n\n const arrow = item.arrow ?? false;\n const placement = item.placement ?? 'top';\n const { openOnHover } = parseTrigger(item.trigger ?? 'hover');\n\n const placementConfig = placementMap[placement] ?? placementMap.top;\n const resolvedSideOffset = arrow ? 10 : 6;\n\n const resolvedClassNames = {\n arrow: item.classNames?.arrow,\n popup: item.className,\n positioner: item.classNames?.root,\n viewport: item.classNames?.content,\n };\n\n const resolvedStyles = {\n arrow: item.styles?.arrow,\n positioner: {\n ...item.styles?.root,\n ...(item.zIndex !== undefined ? { zIndex: item.zIndex } : {}),\n },\n viewport: item.styles?.content,\n };\n\n const contentNode = (\n <PopoverProvider value={contextValue}>{item.content}</PopoverProvider>\n );\n\n const popup = (\n <PopoverPositioner\n align={placementConfig.align}\n className={resolvedClassNames.positioner}\n data-layout-animation={contentLayoutAnimation || undefined}\n hoverTrigger={openOnHover}\n placement={placement}\n side={placementConfig.side}\n sideOffset={resolvedSideOffset}\n style={resolvedStyles.positioner}\n {...item.positionerProps}\n >\n <PopoverPopup\n className={resolvedClassNames.popup}\n data-layout-animation={contentLayoutAnimation || undefined}\n {...item.popupProps}\n >\n {arrow && (\n <PopoverArrow className={resolvedClassNames.arrow} style={resolvedStyles.arrow}>\n {PopoverArrowIcon}\n </PopoverArrow>\n )}\n <PopoverViewport\n className={resolvedClassNames.viewport}\n style={resolvedStyles.viewport}\n >\n {contentNode}\n </PopoverViewport>\n </PopoverPopup>\n </PopoverPositioner>\n );\n\n return portalContainer ? (\n <PopoverPortal container={portalContainer}>{popup}</PopoverPortal>\n ) : null;\n }}\n </BasePopover.Root>\n </PopoverGroupPropsContext>\n </PopoverGroupHandleContext>\n );\n};\n\nPopoverGroup.displayName = 'PopoverGroup';\n\nexport default PopoverGroup;\n"],"mappings":";;;;;;;;;;;;;;AAkCA,MAAM,gBAAuC,EAC3C,UACA,yBAAyB,OACzB,iCAAiC,OACjC,yBAAyB,OACzB,GAAG,kBACC;CACJ,MAAM,CAAC,EAAE,QAAQ,OAAO,kBAAkB,gBAAgB;EACxD,QAAQA,QAAY,cAAgC;EACpD,KAAK;EACN,EAAE;CACH,MAAM,gBAAgB,OAAgC,KAAK;CAC3D,MAAM,UAAU,kBAAkB;AAChC,gBAAc,UAAU;AACxB,kBAAgB,EAAE,WAAW;GAC3B,QAAQA,QAAY,cAAgC;GACpD,KAAK,MAAM;GACZ,EAAE;IACF,EAAE,CAAC;CACN,MAAM,QAAQ,kBAAkB;AAC9B,SAAO,OAAO;IACb,CAAC,OAAO,CAAC;CACZ,MAAM,eAAe,eAAe,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC;CAExD,MAAM,mBAAmB,aACtB,UAAmB,iBAA4D;EAC9E,MAAM,OAAO,cAAc;EAC3B,MAAM,EAAE,gBAAgB,aAAa,MAAM,WAAW,QAAQ;AAE9D,MAAI,+BAA+B,aAAa,UAAU,cAAc,OAAO,EAAE;AAC/E,iBAAc,UAAU;AACxB;;AAGF,QAAM,eAAe,SAAS;IAEhC,EAAE,CACH;AAED,yCAAwC,OAAO,OAAO,SAAS,EAC7D,SAAS,CAAC,gCACX,CAAC;AACF,oCAAmC,OAAO,OAAO,EAAE,SAAS,CAAC,wBAAwB,CAAC;CAEtF,MAAM,kBAAkB,2BAA2B;AAEnD,QACE,oBAAC,2BAAD;EAA2B,OAAO;YAChC,qBAAC,0BAAD;GAA0B,OAAO;aAAjC,CACG,UACD,oBAACA,QAAY,MAAb;IAA0B;IAAkB,cAAc;eACtD,EAAE,cAAc;KAChB,MAAM,OAAQ,WAAuC;AACrD,mBAAc,UAAU;AAExB,SAAI,CAAC,MAAM,QAAS,QAAO;KAE3B,MAAM,QAAQ,KAAK,SAAS;KAC5B,MAAM,YAAY,KAAK,aAAa;KACpC,MAAM,EAAE,gBAAgB,aAAa,KAAK,WAAW,QAAQ;KAE7D,MAAM,kBAAkB,aAAa,cAAc,aAAa;KAChE,MAAM,qBAAqB,QAAQ,KAAK;KAExC,MAAM,qBAAqB;MACzB,OAAO,KAAK,YAAY;MACxB,OAAO,KAAK;MACZ,YAAY,KAAK,YAAY;MAC7B,UAAU,KAAK,YAAY;MAC5B;KAED,MAAM,iBAAiB;MACrB,OAAO,KAAK,QAAQ;MACpB,YAAY;OACV,GAAG,KAAK,QAAQ;OAChB,GAAI,KAAK,WAAW,KAAA,IAAY,EAAE,QAAQ,KAAK,QAAQ,GAAG,EAAE;OAC7D;MACD,UAAU,KAAK,QAAQ;MACxB;KAED,MAAM,cACJ,oBAAC,iBAAD;MAAiB,OAAO;gBAAe,KAAK;MAA0B,CAAA;KAGxE,MAAM,QACJ,oBAAC,mBAAD;MACE,OAAO,gBAAgB;MACvB,WAAW,mBAAmB;MAC9B,yBAAuB,0BAA0B,KAAA;MACjD,cAAc;MACH;MACX,MAAM,gBAAgB;MACtB,YAAY;MACZ,OAAO,eAAe;MACtB,GAAI,KAAK;gBAET,qBAAC,cAAD;OACE,WAAW,mBAAmB;OAC9B,yBAAuB,0BAA0B,KAAA;OACjD,GAAI,KAAK;iBAHX,CAKG,SACC,oBAAC,cAAD;QAAc,WAAW,mBAAmB;QAAO,OAAO,eAAe;kBACtE;QACY,CAAA,EAEjB,oBAAC,iBAAD;QACE,WAAW,mBAAmB;QAC9B,OAAO,eAAe;kBAErB;QACe,CAAA,CACL;;MACG,CAAA;AAGtB,YAAO,kBACL,oBAAC,eAAD;MAAe,WAAW;gBAAkB;MAAsB,CAAA,GAChE;;IAEW,EAtEoB,IAsEpB,CACM;;EACD,CAAA;;AAIhC,aAAa,cAAc"}
|
|
@@ -7,6 +7,7 @@ import { PopoverArrowIcon } from "./ArrowIcon.mjs";
|
|
|
7
7
|
import { usePopoverPortalContainer } from "./PopoverPortal.mjs";
|
|
8
8
|
import { PopoverArrow, PopoverPopup, PopoverPortal, PopoverPositioner, PopoverRoot, PopoverTriggerElement, PopoverViewport } from "./atoms.mjs";
|
|
9
9
|
import { PopoverProvider } from "./context.mjs";
|
|
10
|
+
import { shouldCancelHoverOnlyPressOpen } from "./hoverOnlyPress.mjs";
|
|
10
11
|
import { memo, useCallback, useMemo, useState } from "react";
|
|
11
12
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
12
13
|
import { Popover } from "@base-ui/react/popover";
|
|
@@ -24,16 +25,21 @@ const PopoverStandalone = memo(({ children, content, arrow = false, trigger = "h
|
|
|
24
25
|
}, [popoverHandle]);
|
|
25
26
|
const contextValue = useMemo(() => ({ close }), [close]);
|
|
26
27
|
const resolvedOpen = disabled ? false : open ?? uncontrolledOpen;
|
|
27
|
-
const
|
|
28
|
+
const { openOnClick, openOnHover } = useMemo(() => parseTrigger(trigger), [trigger]);
|
|
29
|
+
const handleOpenChange = useCallback((nextOpen, eventDetails) => {
|
|
28
30
|
if (disabled && nextOpen) return;
|
|
31
|
+
if (shouldCancelHoverOnlyPressOpen(openOnClick, nextOpen, eventDetails?.reason)) {
|
|
32
|
+
eventDetails?.cancel?.();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
29
35
|
onOpenChange?.(nextOpen);
|
|
30
36
|
if (open === void 0) setUncontrolledOpen(nextOpen);
|
|
31
37
|
}, [
|
|
32
38
|
onOpenChange,
|
|
33
39
|
open,
|
|
34
|
-
disabled
|
|
40
|
+
disabled,
|
|
41
|
+
openOnClick
|
|
35
42
|
]);
|
|
36
|
-
const { openOnHover } = useMemo(() => parseTrigger(trigger), [trigger]);
|
|
37
43
|
const resolvedOpenDelay = openDelay ?? mouseEnterDelay * 1e3;
|
|
38
44
|
const resolvedCloseDelay = closeDelay ?? mouseLeaveDelay * 1e3;
|
|
39
45
|
const placementConfig = placementMap[placement] ?? placementMap.top;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PopoverStandalone.mjs","names":["BasePopover"],"sources":["../../../src/base-ui/Popover/PopoverStandalone.tsx"],"sourcesContent":["'use client';\n\nimport { Popover as BasePopover } from '@base-ui/react/popover';\nimport { memo, useCallback, useMemo, useState } from 'react';\n\nimport { useIsClient } from '@/hooks/useIsClient';\nimport { useNativeButton } from '@/hooks/useNativeButton';\nimport { parseTrigger } from '@/utils/parseTrigger';\nimport { placementMap } from '@/utils/placement';\n\nimport { PopoverArrowIcon } from './ArrowIcon';\nimport {\n PopoverArrow,\n PopoverPopup,\n PopoverPortal,\n PopoverPositioner,\n PopoverRoot,\n PopoverTriggerElement,\n PopoverViewport,\n} from './atoms';\nimport { PopoverProvider } from './context';\nimport { usePopoverPortalContainer } from './PopoverPortal';\nimport { type PopoverProps } from './type';\n\n/**\n * Popover component - displays floating content relative to a trigger element\n * Compatible with Ant Design Popover API\n */\nexport const PopoverStandalone = memo<PopoverProps>(\n ({\n children,\n content,\n arrow = false,\n trigger = 'hover',\n placement = 'top',\n styles: styleProps,\n classNames,\n className,\n open,\n onOpenChange,\n defaultOpen = false,\n mouseEnterDelay = 0.1,\n mouseLeaveDelay = 0.1,\n openDelay,\n closeDelay,\n getPopupContainer,\n disabled = false,\n zIndex,\n nativeButton,\n ref: refProp,\n positionerProps,\n triggerProps,\n popupProps,\n backdropProps,\n portalProps,\n }) => {\n const isClient = useIsClient();\n const popoverHandle = useMemo(() => BasePopover.createHandle(), []);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(Boolean(defaultOpen));\n const close = useCallback(() => {\n popoverHandle.close();\n }, [popoverHandle]);\n const contextValue = useMemo(() => ({ close }), [close]);\n\n const mergedOpen = open ?? uncontrolledOpen;\n const resolvedOpen = disabled ? false : mergedOpen;\n\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n
|
|
1
|
+
{"version":3,"file":"PopoverStandalone.mjs","names":["BasePopover"],"sources":["../../../src/base-ui/Popover/PopoverStandalone.tsx"],"sourcesContent":["'use client';\n\nimport { Popover as BasePopover } from '@base-ui/react/popover';\nimport { memo, useCallback, useMemo, useState } from 'react';\n\nimport { useIsClient } from '@/hooks/useIsClient';\nimport { useNativeButton } from '@/hooks/useNativeButton';\nimport { parseTrigger } from '@/utils/parseTrigger';\nimport { placementMap } from '@/utils/placement';\n\nimport { PopoverArrowIcon } from './ArrowIcon';\nimport {\n PopoverArrow,\n PopoverPopup,\n PopoverPortal,\n PopoverPositioner,\n PopoverRoot,\n PopoverTriggerElement,\n PopoverViewport,\n} from './atoms';\nimport { PopoverProvider } from './context';\nimport { shouldCancelHoverOnlyPressOpen } from './hoverOnlyPress';\nimport { usePopoverPortalContainer } from './PopoverPortal';\nimport { type PopoverProps } from './type';\n\n/**\n * Popover component - displays floating content relative to a trigger element\n * Compatible with Ant Design Popover API\n */\nexport const PopoverStandalone = memo<PopoverProps>(\n ({\n children,\n content,\n arrow = false,\n trigger = 'hover',\n placement = 'top',\n styles: styleProps,\n classNames,\n className,\n open,\n onOpenChange,\n defaultOpen = false,\n mouseEnterDelay = 0.1,\n mouseLeaveDelay = 0.1,\n openDelay,\n closeDelay,\n getPopupContainer,\n disabled = false,\n zIndex,\n nativeButton,\n ref: refProp,\n positionerProps,\n triggerProps,\n popupProps,\n backdropProps,\n portalProps,\n }) => {\n const isClient = useIsClient();\n const popoverHandle = useMemo(() => BasePopover.createHandle(), []);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(Boolean(defaultOpen));\n const close = useCallback(() => {\n popoverHandle.close();\n }, [popoverHandle]);\n const contextValue = useMemo(() => ({ close }), [close]);\n\n const mergedOpen = open ?? uncontrolledOpen;\n const resolvedOpen = disabled ? false : mergedOpen;\n\n // Parse trigger mode\n const { openOnClick, openOnHover } = useMemo(() => parseTrigger(trigger), [trigger]);\n\n const handleOpenChange = useCallback(\n (nextOpen: boolean, eventDetails?: { cancel?: () => void; reason?: string }) => {\n if (disabled && nextOpen) return;\n\n if (shouldCancelHoverOnlyPressOpen(openOnClick, nextOpen, eventDetails?.reason)) {\n eventDetails?.cancel?.();\n return;\n }\n\n onOpenChange?.(nextOpen);\n if (open === undefined) {\n setUncontrolledOpen(nextOpen);\n }\n },\n [onOpenChange, open, disabled, openOnClick],\n );\n\n // Calculate delays (milliseconds take precedence over seconds)\n const resolvedOpenDelay = openDelay ?? mouseEnterDelay * 1000;\n const resolvedCloseDelay = closeDelay ?? mouseLeaveDelay * 1000;\n\n // Get placement configuration\n const placementConfig = placementMap[placement] ?? placementMap.top;\n const resolvedSideOffset = arrow ? 10 : 6;\n\n // Determine portal container\n const portalContainer = usePopoverPortalContainer();\n\n const { resolvedNativeButton } = useNativeButton({\n children,\n nativeButton,\n });\n\n const resolvedClassNames = useMemo(\n () => ({\n arrow: classNames?.arrow,\n popup: className,\n positioner: classNames?.root,\n trigger: classNames?.trigger,\n viewport: classNames?.content,\n }),\n [className, classNames?.arrow, classNames?.content, classNames?.root, classNames?.trigger],\n );\n\n // Render trigger element\n const triggerElement = useMemo(() => {\n const baseTriggerProps = {\n closeDelay: resolvedCloseDelay,\n delay: resolvedOpenDelay,\n disabled,\n openOnHover: openOnHover && !disabled,\n ...triggerProps,\n };\n\n return (\n <PopoverTriggerElement\n handle={popoverHandle}\n {...baseTriggerProps}\n className={resolvedClassNames.trigger}\n nativeButton={resolvedNativeButton}\n ref={refProp as any}\n >\n {children}\n </PopoverTriggerElement>\n );\n }, [\n children,\n disabled,\n openOnHover,\n popoverHandle,\n refProp,\n resolvedClassNames.trigger,\n resolvedNativeButton,\n resolvedOpenDelay,\n resolvedCloseDelay,\n triggerProps,\n ]);\n\n // Custom container from getPopupContainer\n const customContainer = useMemo(() => {\n if (!getPopupContainer || !isClient) return undefined;\n // We need a reference element, but we don't have it until render\n // This will be handled by the portal container logic\n return undefined;\n }, [getPopupContainer, isClient]);\n\n const resolvedStyles = useMemo(\n () => ({\n arrow: styleProps?.arrow,\n positioner: {\n ...styleProps?.root,\n ...(zIndex !== undefined ? { zIndex } : {}),\n },\n viewport: styleProps?.content,\n }),\n [styleProps?.arrow, styleProps?.content, styleProps?.root, zIndex],\n );\n\n const popup = useMemo(\n () => (\n <PopoverPositioner\n align={placementConfig.align}\n className={resolvedClassNames.positioner}\n hoverTrigger={openOnHover}\n placement={placement}\n side={placementConfig.side}\n sideOffset={resolvedSideOffset}\n style={resolvedStyles.positioner}\n {...positionerProps}\n >\n <PopoverPopup className={resolvedClassNames.popup} {...popupProps}>\n {arrow && (\n <PopoverArrow className={resolvedClassNames.arrow} style={resolvedStyles.arrow}>\n {PopoverArrowIcon}\n </PopoverArrow>\n )}\n <PopoverViewport\n className={resolvedClassNames.viewport}\n style={resolvedStyles.viewport}\n >\n <PopoverProvider value={contextValue}>{content}</PopoverProvider>\n </PopoverViewport>\n </PopoverPopup>\n </PopoverPositioner>\n ),\n [\n arrow,\n content,\n contextValue,\n openOnHover,\n placement,\n placementConfig.align,\n placementConfig.side,\n popupProps,\n positionerProps,\n resolvedClassNames,\n resolvedSideOffset,\n resolvedStyles,\n ],\n );\n\n // Don't render popup if no content\n if (!content) {\n return children;\n }\n\n const resolvedPortalContainer = customContainer ?? portalContainer;\n\n return (\n <PopoverRoot\n defaultOpen={defaultOpen}\n handle={popoverHandle}\n open={resolvedOpen}\n onOpenChange={handleOpenChange}\n >\n {triggerElement}\n {backdropProps && <BasePopover.Backdrop {...backdropProps} />}\n {resolvedPortalContainer ? (\n <PopoverPortal container={resolvedPortalContainer} {...portalProps}>\n {popup}\n </PopoverPortal>\n ) : null}\n </PopoverRoot>\n );\n },\n);\n\nPopoverStandalone.displayName = 'PopoverStandalone';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/base-ui/Popover/hoverOnlyPress.ts
|
|
2
|
+
/**
|
|
3
|
+
* Base UI Popover.Trigger always wires useClick. With openOnHover, a press while
|
|
4
|
+
* the popup is hover-open can re-open with reason `trigger-press` (stickIfOpen),
|
|
5
|
+
* which disables mouseleave dismiss. Hover-only triggers must cancel press-driven
|
|
6
|
+
* opens so antd-compatible `trigger="hover"` keeps hover close semantics.
|
|
7
|
+
*/
|
|
8
|
+
function shouldCancelHoverOnlyPressOpen(openOnClick, nextOpen, reason) {
|
|
9
|
+
return !openOnClick && nextOpen && reason === "trigger-press";
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
export { shouldCancelHoverOnlyPressOpen };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=hoverOnlyPress.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hoverOnlyPress.mjs","names":[],"sources":["../../../src/base-ui/Popover/hoverOnlyPress.ts"],"sourcesContent":["/**\n * Base UI Popover.Trigger always wires useClick. With openOnHover, a press while\n * the popup is hover-open can re-open with reason `trigger-press` (stickIfOpen),\n * which disables mouseleave dismiss. Hover-only triggers must cancel press-driven\n * opens so antd-compatible `trigger=\"hover\"` keeps hover close semantics.\n */\nexport function shouldCancelHoverOnlyPressOpen(\n openOnClick: boolean,\n nextOpen: boolean,\n reason: string | undefined,\n): boolean {\n return !openOnClick && nextOpen && reason === 'trigger-press';\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,+BACd,aACA,UACA,QACS;AACT,QAAO,CAAC,eAAe,YAAY,WAAW"}
|