@lobehub/ui 4.9.3 → 4.10.1
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/Accordion/Accordion.d.mts +2 -2
- package/es/Accordion/AccordionItem.d.mts +2 -2
- package/es/ActionIcon/ActionIcon.d.mts +2 -2
- package/es/Alert/Alert.d.mts +2 -2
- package/es/AutoComplete/Select.d.mts +2 -2
- package/es/Avatar/AvatarGroup/index.d.mts +2 -2
- package/es/Burger/Burger.d.mts +2 -2
- package/es/CodeEditor/CodeEditor.d.mts +2 -2
- package/es/Collapse/Collapse.d.mts +2 -2
- package/es/ContextMenu/ContextMenuHost.d.mts +2 -2
- package/es/CopyButton/CopyButton.d.mts +2 -2
- package/es/DatePicker/DatePicker.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelBody.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelContainer.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelFooter.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelHeader.d.mts +2 -2
- package/es/DraggablePanel/style.mjs +1 -1
- package/es/DraggablePanel/style.mjs.map +1 -1
- package/es/DraggableSideNav/DraggableSideNav.d.mts +2 -2
- package/es/Drawer/Drawer.d.mts +2 -2
- package/es/Dropdown/Dropdown.d.mts +9 -2
- package/es/Dropdown/Dropdown.mjs +6 -0
- package/es/Dropdown/Dropdown.mjs.map +1 -1
- package/es/DropdownMenu/DropdownMenu.d.mts +2 -2
- package/es/DropdownMenu/DropdownMenu.mjs +20 -36
- package/es/DropdownMenu/DropdownMenu.mjs.map +1 -1
- package/es/DropdownMenu/type.d.mts +2 -1
- package/es/EditableText/EditableText.d.mts +2 -2
- package/es/EmojiPicker/EmojiPicker.d.mts +2 -2
- package/es/Flex/FlexBasic.d.mts +2 -2
- package/es/Footer/Footer.d.mts +2 -2
- package/es/Form/components/FormGroup.d.mts +2 -2
- package/es/Form/components/FormItem.d.mts +2 -2
- package/es/Form/components/FormSubmitFooter.d.mts +2 -2
- package/es/FormModal/FormModal.d.mts +2 -2
- package/es/GuideCard/GuideCard.d.mts +2 -2
- package/es/Header/Header.d.mts +2 -2
- package/es/Highlighter/Highlighter.d.mts +2 -2
- package/es/Highlighter/SyntaxHighlighter/index.d.mts +2 -2
- package/es/Hotkey/Hotkey.d.mts +2 -2
- package/es/HotkeyInput/HotkeyInput.d.mts +2 -2
- package/es/Icon/Icon.d.mts +2 -2
- package/es/Icon/components/IconProvider.d.mts +3 -3
- package/es/Image/PreviewGroup.d.mts +2 -2
- package/es/ImageSelect/ImageSelect.d.mts +2 -2
- package/es/Input/Input.d.mts +2 -2
- package/es/Input/InputNumber.d.mts +2 -2
- package/es/Input/InputOPT.d.mts +2 -2
- package/es/Input/InputPassword.d.mts +2 -2
- package/es/Input/TextArea.d.mts +2 -2
- package/es/Layout/components/LayoutFooter.d.mts +2 -2
- package/es/Layout/components/LayoutHeader.d.mts +2 -2
- package/es/Layout/components/LayoutMain.d.mts +2 -2
- package/es/Layout/components/LayoutSidebar.d.mts +2 -2
- package/es/Layout/components/LayoutSidebarInner.d.mts +2 -2
- package/es/Layout/components/LayoutToc.d.mts +2 -2
- package/es/List/ListItem/index.d.mts +2 -2
- package/es/Markdown/Markdown.d.mts +2 -2
- package/es/Markdown/Typography.d.mts +2 -2
- package/es/MaskShadow/MaskShadow.d.mts +2 -2
- package/es/Menu/Menu.d.mts +2 -2
- package/es/Menu/sharedStyle.mjs +56 -10
- package/es/Menu/sharedStyle.mjs.map +1 -1
- package/es/Mermaid/Mermaid.d.mts +2 -2
- package/es/Mermaid/SyntaxMermaid/index.d.mts +2 -2
- package/es/Modal/Modal.d.mts +2 -2
- package/es/Modal/ModalProvider.d.mts +2 -2
- package/es/Popover/ArrowIcon.mjs +22 -0
- package/es/Popover/ArrowIcon.mjs.map +1 -0
- package/es/Popover/Popover.d.mts +9 -0
- package/es/Popover/Popover.mjs +20 -0
- package/es/Popover/Popover.mjs.map +1 -0
- package/es/Popover/PopoverGroup.d.mts +11 -0
- package/es/Popover/PopoverGroup.mjs +96 -0
- package/es/Popover/PopoverGroup.mjs.map +1 -0
- package/es/Popover/PopoverInGroup.mjs +60 -0
- package/es/Popover/PopoverInGroup.mjs.map +1 -0
- package/es/Popover/PopoverPortal.mjs +45 -0
- package/es/Popover/PopoverPortal.mjs.map +1 -0
- package/es/Popover/PopoverStandalone.mjs +172 -0
- package/es/Popover/PopoverStandalone.mjs.map +1 -0
- package/es/Popover/groupContext.d.mts +14 -0
- package/es/Popover/groupContext.mjs +11 -0
- package/es/Popover/groupContext.mjs.map +1 -0
- package/es/Popover/index.d.mts +5 -0
- package/es/Popover/index.d.ts +1 -0
- package/es/Popover/index.js +1 -0
- package/es/Popover/index.mjs +5 -0
- package/es/Popover/parseTrigger.d.mts +14 -0
- package/es/Popover/parseTrigger.mjs +18 -0
- package/es/Popover/parseTrigger.mjs.map +1 -0
- package/es/Popover/style.mjs +218 -0
- package/es/Popover/style.mjs.map +1 -0
- package/es/Popover/type.d.mts +113 -0
- package/es/Popover/useMergedPopoverProps.mjs +88 -0
- package/es/Popover/useMergedPopoverProps.mjs.map +1 -0
- package/es/SearchBar/SearchBar.d.mts +2 -2
- package/es/Segmented/Segmented.d.mts +2 -2
- package/es/Select/Select.d.mts +2 -2
- package/es/SideNav/SideNav.d.mts +2 -2
- package/es/SliderWithInput/SliderWithInput.d.mts +2 -2
- package/es/SortableList/components/DragHandle.d.mts +2 -2
- package/es/SortableList/components/SortableItem.d.mts +2 -2
- package/es/ThemeProvider/ThemeProvider.d.mts +2 -2
- package/es/Toc/Toc.d.mts +2 -2
- package/es/Tooltip/TooltipGroup.mjs +2 -2
- package/es/Tooltip/TooltipGroup.mjs.map +1 -1
- package/es/Tooltip/type.d.mts +2 -2
- package/es/Tooltip/useTooltipFloating.mjs +2 -2
- package/es/Tooltip/useTooltipFloating.mjs.map +1 -1
- package/es/awesome/AuroraBackground/AuroraBackground.d.mts +2 -2
- package/es/awesome/BottomGradientButton/BottomGradientButton.d.mts +2 -2
- package/es/awesome/Features/Features.d.mts +2 -2
- package/es/awesome/Giscus/Giscus.d.mts +2 -2
- package/es/awesome/GradientButton/GradientButton.d.mts +2 -2
- package/es/awesome/GridBackground/GridBackground.d.mts +2 -2
- package/es/awesome/GridBackground/GridShowcase.d.mts +2 -2
- package/es/awesome/Hero/Hero.d.mts +2 -2
- package/es/awesome/Spline/Spine.d.mts +2 -2
- package/es/awesome/Spotlight/Spotlight.d.mts +2 -2
- package/es/awesome/SpotlightCard/SpotlightCard.d.mts +2 -2
- package/es/awesome/TypewriterEffect/TypewriterEffect.d.mts +2 -2
- package/es/brand/LobeChat/index.d.mts +2 -2
- package/es/brand/LobeHub/index.d.mts +2 -2
- package/es/brand/LogoThree/LogoSpline.d.mts +2 -2
- package/es/brand/LogoThree/index.d.mts +2 -2
- package/es/chat/BackBottom/BackBottom.d.mts +2 -2
- package/es/chat/ChatInputArea/components/ChatInputAreaInner.d.mts +2 -2
- package/es/chat/ChatItem/ChatItem.d.mts +2 -2
- package/es/chat/ChatList/ChatList.d.mts +2 -2
- package/es/chat/EditableMessage/EditableMessage.d.mts +2 -2
- package/es/chat/EditableMessageList/EditableMessageList.d.mts +2 -2
- package/es/chat/MessageInput/MessageInput.d.mts +2 -2
- package/es/chat/MessageModal/MessageModal.d.mts +2 -2
- package/es/color/ColorScales/index.d.mts +2 -2
- package/es/color/CssVar/index.d.mts +2 -2
- package/es/i18n/context.d.mts +2 -2
- package/es/icons/lucideExtra/BotPromptIcon.d.mts +2 -2
- package/es/icons/lucideExtra/CreateBotIcon.d.mts +2 -2
- package/es/icons/lucideExtra/DiscordIcon.d.mts +2 -2
- package/es/icons/lucideExtra/GlobeOffIcon.d.mts +2 -2
- package/es/icons/lucideExtra/GroupBotIcon.d.mts +2 -2
- package/es/icons/lucideExtra/GroupBotSquareIcon.d.mts +2 -2
- package/es/icons/lucideExtra/LeftClickIcon.d.mts +2 -2
- package/es/icons/lucideExtra/LeftDoubleClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/McpIcon.d.mts +3 -3
- package/es/icons/lucideExtra/ProviderIcon.d.mts +3 -3
- package/es/icons/lucideExtra/RightClickIcon.d.mts +2 -2
- package/es/icons/lucideExtra/RightDoubleClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/ShapesUploadIcon.d.mts +3 -3
- package/es/icons/lucideExtra/TreeDownRightIcon.d.mts +3 -3
- package/es/icons/lucideExtra/TreeUpDownRightIcon.d.mts +3 -3
- package/es/index.d.mts +6 -1
- package/es/index.mjs +4 -1
- package/es/mdx/Mdx/index.d.mts +2 -2
- package/es/mobile/ChatHeader/ChatHeaderTitle.d.mts +2 -2
- package/es/mobile/ChatInputArea/components/ChatSendButton.d.mts +2 -2
- package/es/mobile/TabBar/TabBar.d.mts +2 -2
- package/es/storybook/StoryBook/index.d.mts +2 -2
- package/es/utils/placement.d.mts +31 -0
- package/es/utils/placement.mjs +100 -0
- package/es/utils/placement.mjs.map +1 -0
- package/package.json +1 -1
- package/es/Tooltip/antdPlacementToFloating.mjs +0 -27
- package/es/Tooltip/antdPlacementToFloating.mjs.map +0 -1
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { placementMap } from "../utils/placement.mjs";
|
|
4
|
+
import { PopoverGroupHandleContext, PopoverGroupPropsContext } from "./groupContext.mjs";
|
|
5
|
+
import { parseTrigger } from "./parseTrigger.mjs";
|
|
6
|
+
import { PopoverArrowIcon } from "./ArrowIcon.mjs";
|
|
7
|
+
import { usePopoverPortalContainer } from "./PopoverPortal.mjs";
|
|
8
|
+
import { styles } from "./style.mjs";
|
|
9
|
+
import { useCallback, useMemo, useRef } from "react";
|
|
10
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
import { cx } from "antd-style";
|
|
12
|
+
import { Popover } from "@base-ui/react/popover";
|
|
13
|
+
|
|
14
|
+
//#region src/Popover/PopoverGroup.tsx
|
|
15
|
+
const PopoverGroup = ({ children, contentLayoutAnimation = true, ...sharedProps }) => {
|
|
16
|
+
const handle = useMemo(() => Popover.createHandle(), []);
|
|
17
|
+
const activeItemRef = useRef(null);
|
|
18
|
+
const handleOpenChange = useCallback((open) => {
|
|
19
|
+
activeItemRef.current?.onOpenChange?.(open);
|
|
20
|
+
}, []);
|
|
21
|
+
const portalContainer = usePopoverPortalContainer();
|
|
22
|
+
return /* @__PURE__ */ jsx(PopoverGroupHandleContext.Provider, {
|
|
23
|
+
value: handle,
|
|
24
|
+
children: /* @__PURE__ */ jsxs(PopoverGroupPropsContext.Provider, {
|
|
25
|
+
value: sharedProps,
|
|
26
|
+
children: [children, /* @__PURE__ */ jsx(Popover.Root, {
|
|
27
|
+
handle,
|
|
28
|
+
onOpenChange: handleOpenChange,
|
|
29
|
+
children: ({ payload }) => {
|
|
30
|
+
const item = payload ?? null;
|
|
31
|
+
activeItemRef.current = item;
|
|
32
|
+
if (!item?.content) return null;
|
|
33
|
+
const arrow = item.inset ? false : item.arrow ?? true;
|
|
34
|
+
const placement = item.placement ?? "top";
|
|
35
|
+
const { openOnHover } = parseTrigger(item.trigger ?? "hover");
|
|
36
|
+
const placementConfig = placementMap[placement] ?? placementMap.top;
|
|
37
|
+
const baseSideOffset = arrow ? 10 : 6;
|
|
38
|
+
const resolvedSideOffset = item.inset ? ({ side, positioner }) => {
|
|
39
|
+
if (side === "left" || side === "right" || side === "inline-start" || side === "inline-end") return -positioner.width;
|
|
40
|
+
return -positioner.height;
|
|
41
|
+
} : baseSideOffset;
|
|
42
|
+
const resolvedClassNames = {
|
|
43
|
+
arrow: cx(styles.arrow, item.classNames?.arrow),
|
|
44
|
+
popup: cx(styles.popup, item.className),
|
|
45
|
+
positioner: cx(styles.positioner, item.classNames?.root),
|
|
46
|
+
viewport: cx(styles.viewport, item.classNames?.content)
|
|
47
|
+
};
|
|
48
|
+
const resolvedStyles = {
|
|
49
|
+
arrow: item.styles?.arrow,
|
|
50
|
+
positioner: {
|
|
51
|
+
...item.styles?.root,
|
|
52
|
+
zIndex: item.zIndex ?? 1100
|
|
53
|
+
},
|
|
54
|
+
viewport: item.styles?.content
|
|
55
|
+
};
|
|
56
|
+
const popup = /* @__PURE__ */ jsx(Popover.Positioner, {
|
|
57
|
+
align: placementConfig.align,
|
|
58
|
+
className: resolvedClassNames.positioner,
|
|
59
|
+
"data-hover-trigger": openOnHover || void 0,
|
|
60
|
+
"data-placement": placement,
|
|
61
|
+
side: placementConfig.side,
|
|
62
|
+
sideOffset: resolvedSideOffset,
|
|
63
|
+
style: resolvedStyles.positioner,
|
|
64
|
+
children: /* @__PURE__ */ jsxs(Popover.Popup, {
|
|
65
|
+
className: resolvedClassNames.popup,
|
|
66
|
+
children: [arrow && /* @__PURE__ */ jsx(Popover.Arrow, {
|
|
67
|
+
className: resolvedClassNames.arrow,
|
|
68
|
+
style: resolvedStyles.arrow,
|
|
69
|
+
children: PopoverArrowIcon
|
|
70
|
+
}), contentLayoutAnimation ? /* @__PURE__ */ jsx(Popover.Viewport, {
|
|
71
|
+
className: resolvedClassNames.viewport,
|
|
72
|
+
style: resolvedStyles.viewport,
|
|
73
|
+
children: item.content
|
|
74
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
75
|
+
className: resolvedClassNames.viewport,
|
|
76
|
+
style: resolvedStyles.viewport,
|
|
77
|
+
children: item.content
|
|
78
|
+
})]
|
|
79
|
+
})
|
|
80
|
+
});
|
|
81
|
+
const resolvedPortalContainer = portalContainer;
|
|
82
|
+
return item.portalled ?? true ? resolvedPortalContainer ? /* @__PURE__ */ jsx(Popover.Portal, {
|
|
83
|
+
container: resolvedPortalContainer,
|
|
84
|
+
children: popup
|
|
85
|
+
}) : null : popup;
|
|
86
|
+
}
|
|
87
|
+
})]
|
|
88
|
+
})
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
PopoverGroup.displayName = "PopoverGroup";
|
|
92
|
+
var PopoverGroup_default = PopoverGroup;
|
|
93
|
+
|
|
94
|
+
//#endregion
|
|
95
|
+
export { PopoverGroup_default as default };
|
|
96
|
+
//# sourceMappingURL=PopoverGroup.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopoverGroup.mjs","names":["PopoverGroup: FC<PopoverGroupProps>","BasePopover"],"sources":["../../src/Popover/PopoverGroup.tsx"],"sourcesContent":["'use client';\n\nimport { Popover as BasePopover } from '@base-ui/react/popover';\nimport type { Side } from '@base-ui/react/utils/useAnchorPositioning';\nimport { cx } from 'antd-style';\nimport { type FC, type ReactNode, useCallback, useMemo, useRef } from 'react';\n\nimport { placementMap } from '@/utils/placement';\n\nimport { PopoverArrowIcon } from './ArrowIcon';\nimport { usePopoverPortalContainer } from './PopoverPortal';\nimport {\n PopoverGroupHandleContext,\n type PopoverGroupItem,\n PopoverGroupPropsContext,\n type PopoverGroupSharedProps,\n} from './groupContext';\nimport { parseTrigger } from './parseTrigger';\nimport { styles } from './style';\n\ntype PopoverGroupProps = PopoverGroupSharedProps & {\n children: ReactNode;\n};\n\nconst PopoverGroup: FC<PopoverGroupProps> = ({\n children,\n contentLayoutAnimation = true,\n ...sharedProps\n}) => {\n const handle = useMemo(() => BasePopover.createHandle<PopoverGroupItem>(), []);\n const activeItemRef = useRef<PopoverGroupItem | null>(null);\n\n const handleOpenChange = useCallback((open: boolean) => {\n activeItemRef.current?.onOpenChange?.(open);\n }, []);\n\n const portalContainer = usePopoverPortalContainer();\n\n return (\n <PopoverGroupHandleContext.Provider value={handle}>\n <PopoverGroupPropsContext.Provider value={sharedProps}>\n {children}\n <BasePopover.Root handle={handle} 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.inset ? false : (item.arrow ?? true);\n const placement = item.placement ?? 'top';\n const { openOnHover } = parseTrigger(item.trigger ?? 'hover');\n\n const placementConfig = placementMap[placement] ?? placementMap.top;\n const baseSideOffset = arrow ? 10 : 6;\n const resolvedSideOffset = item.inset\n ? ({\n side,\n positioner,\n }: {\n positioner: { height: number; width: number };\n side: Side;\n }) => {\n if (\n side === 'left' ||\n side === 'right' ||\n side === 'inline-start' ||\n side === 'inline-end'\n ) {\n return -positioner.width;\n }\n return -positioner.height;\n }\n : baseSideOffset;\n\n const resolvedClassNames = {\n arrow: cx(styles.arrow, item.classNames?.arrow),\n popup: cx(styles.popup, item.className),\n positioner: cx(styles.positioner, item.classNames?.root),\n viewport: cx(styles.viewport, item.classNames?.content),\n };\n\n const resolvedStyles = {\n arrow: item.styles?.arrow,\n positioner: {\n ...item.styles?.root,\n zIndex: item.zIndex ?? 1100,\n },\n viewport: item.styles?.content,\n };\n\n const popup = (\n <BasePopover.Positioner\n align={placementConfig.align}\n className={resolvedClassNames.positioner}\n data-hover-trigger={openOnHover || undefined}\n data-placement={placement}\n side={placementConfig.side}\n sideOffset={resolvedSideOffset}\n style={resolvedStyles.positioner}\n >\n <BasePopover.Popup className={resolvedClassNames.popup}>\n {arrow && (\n <BasePopover.Arrow\n className={resolvedClassNames.arrow}\n style={resolvedStyles.arrow}\n >\n {PopoverArrowIcon}\n </BasePopover.Arrow>\n )}\n {contentLayoutAnimation ? (\n <BasePopover.Viewport\n className={resolvedClassNames.viewport}\n style={resolvedStyles.viewport}\n >\n {item.content}\n </BasePopover.Viewport>\n ) : (\n <div className={resolvedClassNames.viewport} style={resolvedStyles.viewport}>\n {item.content}\n </div>\n )}\n </BasePopover.Popup>\n </BasePopover.Positioner>\n );\n\n const resolvedPortalContainer = portalContainer;\n const portalled = item.portalled ?? true;\n\n return portalled ? (\n resolvedPortalContainer ? (\n <BasePopover.Portal container={resolvedPortalContainer}>{popup}</BasePopover.Portal>\n ) : null\n ) : (\n popup\n );\n }}\n </BasePopover.Root>\n </PopoverGroupPropsContext.Provider>\n </PopoverGroupHandleContext.Provider>\n );\n};\n\nPopoverGroup.displayName = 'PopoverGroup';\n\nexport default PopoverGroup;\n"],"mappings":";;;;;;;;;;;;;;AAwBA,MAAMA,gBAAuC,EAC3C,UACA,yBAAyB,MACzB,GAAG,kBACC;CACJ,MAAM,SAAS,cAAcC,QAAY,cAAgC,EAAE,EAAE,CAAC;CAC9E,MAAM,gBAAgB,OAAgC,KAAK;CAE3D,MAAM,mBAAmB,aAAa,SAAkB;AACtD,gBAAc,SAAS,eAAe,KAAK;IAC1C,EAAE,CAAC;CAEN,MAAM,kBAAkB,2BAA2B;AAEnD,QACE,oBAAC,0BAA0B;EAAS,OAAO;YACzC,qBAAC,yBAAyB;GAAS,OAAO;cACvC,UACD,oBAACA,QAAY;IAAa;IAAQ,cAAc;eAC5C,EAAE,cAAc;KAChB,MAAM,OAAQ,WAAuC;AACrD,mBAAc,UAAU;AAExB,SAAI,CAAC,MAAM,QAAS,QAAO;KAE3B,MAAM,QAAQ,KAAK,QAAQ,QAAS,KAAK,SAAS;KAClD,MAAM,YAAY,KAAK,aAAa;KACpC,MAAM,EAAE,gBAAgB,aAAa,KAAK,WAAW,QAAQ;KAE7D,MAAM,kBAAkB,aAAa,cAAc,aAAa;KAChE,MAAM,iBAAiB,QAAQ,KAAK;KACpC,MAAM,qBAAqB,KAAK,SAC3B,EACC,MACA,iBAII;AACJ,UACE,SAAS,UACT,SAAS,WACT,SAAS,kBACT,SAAS,aAET,QAAO,CAAC,WAAW;AAErB,aAAO,CAAC,WAAW;SAErB;KAEJ,MAAM,qBAAqB;MACzB,OAAO,GAAG,OAAO,OAAO,KAAK,YAAY,MAAM;MAC/C,OAAO,GAAG,OAAO,OAAO,KAAK,UAAU;MACvC,YAAY,GAAG,OAAO,YAAY,KAAK,YAAY,KAAK;MACxD,UAAU,GAAG,OAAO,UAAU,KAAK,YAAY,QAAQ;MACxD;KAED,MAAM,iBAAiB;MACrB,OAAO,KAAK,QAAQ;MACpB,YAAY;OACV,GAAG,KAAK,QAAQ;OAChB,QAAQ,KAAK,UAAU;OACxB;MACD,UAAU,KAAK,QAAQ;MACxB;KAED,MAAM,QACJ,oBAACA,QAAY;MACX,OAAO,gBAAgB;MACvB,WAAW,mBAAmB;MAC9B,sBAAoB,eAAe;MACnC,kBAAgB;MAChB,MAAM,gBAAgB;MACtB,YAAY;MACZ,OAAO,eAAe;gBAEtB,qBAACA,QAAY;OAAM,WAAW,mBAAmB;kBAC9C,SACC,oBAACA,QAAY;QACX,WAAW,mBAAmB;QAC9B,OAAO,eAAe;kBAErB;SACiB,EAErB,yBACC,oBAACA,QAAY;QACX,WAAW,mBAAmB;QAC9B,OAAO,eAAe;kBAErB,KAAK;SACe,GAEvB,oBAAC;QAAI,WAAW,mBAAmB;QAAU,OAAO,eAAe;kBAChE,KAAK;SACF;QAEU;OACG;KAG3B,MAAM,0BAA0B;AAGhC,YAFkB,KAAK,aAAa,OAGlC,0BACE,oBAACA,QAAY;MAAO,WAAW;gBAA0B;OAA2B,GAClF,OAEJ;;KAGa;IACe;GACD;;AAIzC,aAAa,cAAc;AAE3B,2BAAe"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { PopoverGroupHandleContext } from "./groupContext.mjs";
|
|
4
|
+
import { parseTrigger } from "./parseTrigger.mjs";
|
|
5
|
+
import { useMergedPopoverProps } from "./useMergedPopoverProps.mjs";
|
|
6
|
+
import { cloneElement, isValidElement, useContext, useMemo } from "react";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
import { cx } from "antd-style";
|
|
9
|
+
import { mergeRefs } from "react-merge-refs";
|
|
10
|
+
import { mergeProps } from "@base-ui/react/merge-props";
|
|
11
|
+
import { Popover } from "@base-ui/react/popover";
|
|
12
|
+
|
|
13
|
+
//#region src/Popover/PopoverInGroup.tsx
|
|
14
|
+
const PopoverInGroup = ({ children, ref: refProp, ...props }) => {
|
|
15
|
+
const group = useContext(PopoverGroupHandleContext);
|
|
16
|
+
const item = useMergedPopoverProps(props);
|
|
17
|
+
const { openOnHover } = useMemo(() => parseTrigger(item.trigger ?? "hover"), [item.trigger]);
|
|
18
|
+
const resolvedOpenDelay = item.openDelay ?? (item.mouseEnterDelay ?? .1) * 1e3;
|
|
19
|
+
const resolvedCloseDelay = item.closeDelay ?? (item.mouseLeaveDelay ?? .1) * 1e3;
|
|
20
|
+
const disabled = Boolean(item.disabled);
|
|
21
|
+
if (!item.content) return children;
|
|
22
|
+
const triggerProps = {
|
|
23
|
+
closeDelay: resolvedCloseDelay,
|
|
24
|
+
delay: resolvedOpenDelay,
|
|
25
|
+
disabled,
|
|
26
|
+
openOnHover: openOnHover && !disabled,
|
|
27
|
+
payload: item
|
|
28
|
+
};
|
|
29
|
+
const triggerClassName = item.classNames?.trigger;
|
|
30
|
+
if (isValidElement(children)) return /* @__PURE__ */ jsx(Popover.Trigger, {
|
|
31
|
+
handle: group ?? void 0,
|
|
32
|
+
...triggerProps,
|
|
33
|
+
render: (renderProps) => {
|
|
34
|
+
const { type, ref: triggerRef, ...restProps } = renderProps;
|
|
35
|
+
const resolvedProps = typeof children.type === "string" && children.type === "button" ? renderProps : restProps;
|
|
36
|
+
const mergedProps = mergeProps(children.props, resolvedProps);
|
|
37
|
+
return cloneElement(children, {
|
|
38
|
+
...mergedProps,
|
|
39
|
+
className: cx(mergedProps.className, triggerClassName),
|
|
40
|
+
ref: mergeRefs([
|
|
41
|
+
children.ref,
|
|
42
|
+
triggerRef,
|
|
43
|
+
refProp
|
|
44
|
+
])
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
return /* @__PURE__ */ jsx(Popover.Trigger, {
|
|
49
|
+
handle: group ?? void 0,
|
|
50
|
+
...triggerProps,
|
|
51
|
+
className: triggerClassName,
|
|
52
|
+
ref: refProp,
|
|
53
|
+
children
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
PopoverInGroup.displayName = "PopoverInGroup";
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
export { PopoverInGroup };
|
|
60
|
+
//# sourceMappingURL=PopoverInGroup.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopoverInGroup.mjs","names":["PopoverInGroup: FC<PopoverProps>","BasePopover"],"sources":["../../src/Popover/PopoverInGroup.tsx"],"sourcesContent":["'use client';\n\nimport { mergeProps } from '@base-ui/react/merge-props';\nimport { Popover as BasePopover } from '@base-ui/react/popover';\nimport { cx } from 'antd-style';\nimport { type FC, cloneElement, isValidElement, useContext, useMemo } from 'react';\nimport { mergeRefs } from 'react-merge-refs';\n\nimport { PopoverGroupHandleContext } from './groupContext';\nimport { parseTrigger } from './parseTrigger';\nimport type { PopoverProps } from './type';\nimport { useMergedPopoverProps } from './useMergedPopoverProps';\n\nexport const PopoverInGroup: FC<PopoverProps> = ({ children, ref: refProp, ...props }) => {\n const group = useContext(PopoverGroupHandleContext);\n const item = useMergedPopoverProps(props);\n\n const { openOnHover } = useMemo(() => parseTrigger(item.trigger ?? 'hover'), [item.trigger]);\n\n const resolvedOpenDelay = item.openDelay ?? (item.mouseEnterDelay ?? 0.1) * 1000;\n const resolvedCloseDelay = item.closeDelay ?? (item.mouseLeaveDelay ?? 0.1) * 1000;\n const disabled = Boolean(item.disabled);\n\n // Don't render trigger behavior if no content\n if (!item.content) {\n return children as any;\n }\n\n const triggerProps = {\n closeDelay: resolvedCloseDelay,\n delay: resolvedOpenDelay,\n disabled,\n openOnHover: openOnHover && !disabled,\n payload: item,\n };\n\n const triggerClassName = item.classNames?.trigger;\n\n if (isValidElement(children)) {\n return (\n <BasePopover.Trigger\n handle={group ?? undefined}\n {...triggerProps}\n render={(renderProps) => {\n // Remove type=\"button\" for non-button elements\n // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars\n const { type, ref: triggerRef, ...restProps } = renderProps as any;\n const resolvedProps =\n typeof (children as any).type === 'string' && (children as any).type === 'button'\n ? renderProps\n : restProps;\n const mergedProps = mergeProps((children as any).props, resolvedProps);\n return cloneElement(children as any, {\n ...mergedProps,\n className: cx(mergedProps.className, triggerClassName),\n ref: mergeRefs([(children as any).ref, triggerRef, refProp]),\n });\n }}\n />\n );\n }\n\n return (\n <BasePopover.Trigger\n handle={group ?? undefined}\n {...triggerProps}\n className={triggerClassName}\n ref={refProp}\n >\n {children}\n </BasePopover.Trigger>\n );\n};\n\nPopoverInGroup.displayName = 'PopoverInGroup';\n"],"mappings":";;;;;;;;;;;;;AAaA,MAAaA,kBAAoC,EAAE,UAAU,KAAK,SAAS,GAAG,YAAY;CACxF,MAAM,QAAQ,WAAW,0BAA0B;CACnD,MAAM,OAAO,sBAAsB,MAAM;CAEzC,MAAM,EAAE,gBAAgB,cAAc,aAAa,KAAK,WAAW,QAAQ,EAAE,CAAC,KAAK,QAAQ,CAAC;CAE5F,MAAM,oBAAoB,KAAK,cAAc,KAAK,mBAAmB,MAAO;CAC5E,MAAM,qBAAqB,KAAK,eAAe,KAAK,mBAAmB,MAAO;CAC9E,MAAM,WAAW,QAAQ,KAAK,SAAS;AAGvC,KAAI,CAAC,KAAK,QACR,QAAO;CAGT,MAAM,eAAe;EACnB,YAAY;EACZ,OAAO;EACP;EACA,aAAa,eAAe,CAAC;EAC7B,SAAS;EACV;CAED,MAAM,mBAAmB,KAAK,YAAY;AAE1C,KAAI,eAAe,SAAS,CAC1B,QACE,oBAACC,QAAY;EACX,QAAQ,SAAS;EACjB,GAAI;EACJ,SAAS,gBAAgB;GAGvB,MAAM,EAAE,MAAM,KAAK,YAAY,GAAG,cAAc;GAChD,MAAM,gBACJ,OAAQ,SAAiB,SAAS,YAAa,SAAiB,SAAS,WACrE,cACA;GACN,MAAM,cAAc,WAAY,SAAiB,OAAO,cAAc;AACtE,UAAO,aAAa,UAAiB;IACnC,GAAG;IACH,WAAW,GAAG,YAAY,WAAW,iBAAiB;IACtD,KAAK,UAAU;KAAE,SAAiB;KAAK;KAAY;KAAQ,CAAC;IAC7D,CAAC;;GAEJ;AAIN,QACE,oBAACA,QAAY;EACX,QAAQ,SAAS;EACjB,GAAI;EACJ,WAAW;EACX,KAAK;EAEJ;GACmB;;AAI1B,eAAe,cAAc"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { LOBE_THEME_APP_ID } from "../ThemeProvider/constants.mjs";
|
|
4
|
+
import { useEffect, useState } from "react";
|
|
5
|
+
|
|
6
|
+
//#region src/Popover/PopoverPortal.tsx
|
|
7
|
+
const PORTAL_ATTR = "data-lobe-ui-popover-portal";
|
|
8
|
+
const POPOVER_CONTAINER_ATTR = "data-lobe-ui-popover-container";
|
|
9
|
+
const containerMap = /* @__PURE__ */ new WeakMap();
|
|
10
|
+
const getOrCreateContainer = (root) => {
|
|
11
|
+
const resolvedRoot = (() => {
|
|
12
|
+
if (typeof document === "undefined") return root;
|
|
13
|
+
if (typeof ShadowRoot !== "undefined" && root instanceof ShadowRoot) return root;
|
|
14
|
+
if (!(root === document.body)) return root;
|
|
15
|
+
const themeApp = document.querySelector(`#${LOBE_THEME_APP_ID}`);
|
|
16
|
+
if (themeApp) return themeApp;
|
|
17
|
+
const popoverContainer = document.querySelector(`[${POPOVER_CONTAINER_ATTR}="true"]`);
|
|
18
|
+
if (popoverContainer) return popoverContainer;
|
|
19
|
+
return root;
|
|
20
|
+
})();
|
|
21
|
+
const cached = containerMap.get(resolvedRoot);
|
|
22
|
+
if (cached && cached.isConnected) return cached;
|
|
23
|
+
const el = document.createElement("div");
|
|
24
|
+
el.setAttribute(PORTAL_ATTR, "true");
|
|
25
|
+
resolvedRoot.append(el);
|
|
26
|
+
containerMap.set(resolvedRoot, el);
|
|
27
|
+
return el;
|
|
28
|
+
};
|
|
29
|
+
const resolveRoot = (root) => {
|
|
30
|
+
if (root) return root;
|
|
31
|
+
return document.body;
|
|
32
|
+
};
|
|
33
|
+
const usePopoverPortalContainer = (root) => {
|
|
34
|
+
const [container, setContainer] = useState(null);
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
const resolved = resolveRoot(root);
|
|
37
|
+
if (!resolved) return;
|
|
38
|
+
setContainer(getOrCreateContainer(resolved));
|
|
39
|
+
}, [root]);
|
|
40
|
+
return container;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
//#endregion
|
|
44
|
+
export { usePopoverPortalContainer };
|
|
45
|
+
//# sourceMappingURL=PopoverPortal.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopoverPortal.mjs","names":[],"sources":["../../src/Popover/PopoverPortal.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\n\nimport { LOBE_THEME_APP_ID } from '@/ThemeProvider';\n\nconst PORTAL_ATTR = 'data-lobe-ui-popover-portal';\nexport const POPOVER_CONTAINER_ATTR = 'data-lobe-ui-popover-container';\n\n// Reuse one portal container per root (document.body by default).\nconst containerMap = new WeakMap<object, HTMLElement>();\n\nconst getOrCreateContainer = (root: HTMLElement | ShadowRoot): HTMLElement => {\n const resolvedRoot = (() => {\n if (typeof document === 'undefined') return root;\n if (typeof ShadowRoot !== 'undefined' && root instanceof ShadowRoot) return root;\n\n const isBody = root === document.body;\n if (!isBody) return root;\n\n const themeApp = document.querySelector<HTMLElement>(`#${LOBE_THEME_APP_ID}`);\n if (themeApp) return themeApp;\n\n const popoverContainer = document.querySelector<HTMLElement>(\n `[${POPOVER_CONTAINER_ATTR}=\"true\"]`,\n );\n if (popoverContainer) return popoverContainer;\n\n return root;\n })();\n\n const cached = containerMap.get(resolvedRoot);\n if (cached && cached.isConnected) return cached;\n\n const el = document.createElement('div');\n el.setAttribute(PORTAL_ATTR, 'true');\n resolvedRoot.append(el);\n containerMap.set(resolvedRoot, el);\n return el;\n};\n\nconst resolveRoot = (root?: HTMLElement | ShadowRoot | null): HTMLElement | ShadowRoot | null => {\n if (root) return root;\n return document.body;\n};\n\nexport const usePopoverPortalContainer = (\n root?: HTMLElement | ShadowRoot | null,\n): HTMLElement | null => {\n const [container, setContainer] = useState<HTMLElement | null>(null);\n\n // Never mutate DOM / create portal container during render.\n // Create it after mount to avoid SSR/hydration side effects.\n useEffect(() => {\n const resolved = resolveRoot(root);\n if (!resolved) return;\n setContainer(getOrCreateContainer(resolved));\n }, [root]);\n\n return container;\n};\n"],"mappings":";;;;;;AAMA,MAAM,cAAc;AACpB,MAAa,yBAAyB;AAGtC,MAAM,+BAAe,IAAI,SAA8B;AAEvD,MAAM,wBAAwB,SAAgD;CAC5E,MAAM,sBAAsB;AAC1B,MAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,MAAI,OAAO,eAAe,eAAe,gBAAgB,WAAY,QAAO;AAG5E,MAAI,EADW,SAAS,SAAS,MACpB,QAAO;EAEpB,MAAM,WAAW,SAAS,cAA2B,IAAI,oBAAoB;AAC7E,MAAI,SAAU,QAAO;EAErB,MAAM,mBAAmB,SAAS,cAChC,IAAI,uBAAuB,UAC5B;AACD,MAAI,iBAAkB,QAAO;AAE7B,SAAO;KACL;CAEJ,MAAM,SAAS,aAAa,IAAI,aAAa;AAC7C,KAAI,UAAU,OAAO,YAAa,QAAO;CAEzC,MAAM,KAAK,SAAS,cAAc,MAAM;AACxC,IAAG,aAAa,aAAa,OAAO;AACpC,cAAa,OAAO,GAAG;AACvB,cAAa,IAAI,cAAc,GAAG;AAClC,QAAO;;AAGT,MAAM,eAAe,SAA4E;AAC/F,KAAI,KAAM,QAAO;AACjB,QAAO,SAAS;;AAGlB,MAAa,6BACX,SACuB;CACvB,MAAM,CAAC,WAAW,gBAAgB,SAA6B,KAAK;AAIpE,iBAAgB;EACd,MAAM,WAAW,YAAY,KAAK;AAClC,MAAI,CAAC,SAAU;AACf,eAAa,qBAAqB,SAAS,CAAC;IAC3C,CAAC,KAAK,CAAC;AAEV,QAAO"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { placementMap } from "../utils/placement.mjs";
|
|
4
|
+
import { useIsClient } from "../hooks/useIsClient.mjs";
|
|
5
|
+
import { parseTrigger } from "./parseTrigger.mjs";
|
|
6
|
+
import { PopoverArrowIcon } from "./ArrowIcon.mjs";
|
|
7
|
+
import { usePopoverPortalContainer } from "./PopoverPortal.mjs";
|
|
8
|
+
import { styles } from "./style.mjs";
|
|
9
|
+
import { cloneElement, isValidElement, memo, useCallback, useEffect, useMemo, useState } from "react";
|
|
10
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
import { cx } from "antd-style";
|
|
12
|
+
import { mergeRefs } from "react-merge-refs";
|
|
13
|
+
import { mergeProps } from "@base-ui/react/merge-props";
|
|
14
|
+
import { Popover } from "@base-ui/react/popover";
|
|
15
|
+
|
|
16
|
+
//#region src/Popover/PopoverStandalone.tsx
|
|
17
|
+
/**
|
|
18
|
+
* Popover component - displays floating content relative to a trigger element
|
|
19
|
+
* Compatible with Ant Design Popover API
|
|
20
|
+
*/
|
|
21
|
+
const PopoverStandalone = memo(({ children, content, arrow: originArrow = true, inset = false, trigger = "hover", placement = "top", styles: styleProps, classNames, className, open, onOpenChange, defaultOpen = false, mouseEnterDelay = .1, mouseLeaveDelay = .1, openDelay, closeDelay, portalled = true, getPopupContainer, disabled = false, zIndex, ref: refProp }) => {
|
|
22
|
+
const arrow = inset ? false : originArrow;
|
|
23
|
+
const isClient = useIsClient();
|
|
24
|
+
const popoverHandle = useMemo(() => Popover.createHandle(), []);
|
|
25
|
+
const [uncontrolledOpen, setUncontrolledOpen] = useState(Boolean(defaultOpen));
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
if (open === void 0) return;
|
|
28
|
+
setUncontrolledOpen(open);
|
|
29
|
+
}, [open]);
|
|
30
|
+
const resolvedOpen = disabled ? false : open ?? uncontrolledOpen;
|
|
31
|
+
const handleOpenChange = useCallback((nextOpen) => {
|
|
32
|
+
if (disabled && nextOpen) return;
|
|
33
|
+
onOpenChange?.(nextOpen);
|
|
34
|
+
if (open === void 0) setUncontrolledOpen(nextOpen);
|
|
35
|
+
}, [
|
|
36
|
+
onOpenChange,
|
|
37
|
+
open,
|
|
38
|
+
disabled
|
|
39
|
+
]);
|
|
40
|
+
const { openOnHover } = useMemo(() => parseTrigger(trigger), [trigger]);
|
|
41
|
+
const resolvedOpenDelay = openDelay ?? mouseEnterDelay * 1e3;
|
|
42
|
+
const resolvedCloseDelay = closeDelay ?? mouseLeaveDelay * 1e3;
|
|
43
|
+
const placementConfig = placementMap[placement] ?? placementMap.top;
|
|
44
|
+
const baseSideOffset = arrow ? 10 : 6;
|
|
45
|
+
const resolvedSideOffset = useMemo(() => {
|
|
46
|
+
if (!inset) return baseSideOffset;
|
|
47
|
+
return ({ side, positioner }) => {
|
|
48
|
+
if (side === "left" || side === "right" || side === "inline-start" || side === "inline-end") return -positioner.width;
|
|
49
|
+
return -positioner.height;
|
|
50
|
+
};
|
|
51
|
+
}, [baseSideOffset, inset]);
|
|
52
|
+
const portalContainer = usePopoverPortalContainer();
|
|
53
|
+
const resolvedClassNames = useMemo(() => ({
|
|
54
|
+
arrow: cx(styles.arrow, classNames?.arrow),
|
|
55
|
+
popup: cx(styles.popup, className),
|
|
56
|
+
positioner: cx(styles.positioner, classNames?.root),
|
|
57
|
+
trigger: classNames?.trigger,
|
|
58
|
+
viewport: cx(styles.viewport, classNames?.content)
|
|
59
|
+
}), [
|
|
60
|
+
className,
|
|
61
|
+
classNames?.arrow,
|
|
62
|
+
classNames?.content,
|
|
63
|
+
classNames?.root,
|
|
64
|
+
classNames?.trigger
|
|
65
|
+
]);
|
|
66
|
+
const triggerElement = useMemo(() => {
|
|
67
|
+
const triggerProps = {
|
|
68
|
+
closeDelay: resolvedCloseDelay,
|
|
69
|
+
delay: resolvedOpenDelay,
|
|
70
|
+
disabled,
|
|
71
|
+
openOnHover: openOnHover && !disabled
|
|
72
|
+
};
|
|
73
|
+
if (isValidElement(children)) return /* @__PURE__ */ jsx(Popover.Trigger, {
|
|
74
|
+
handle: popoverHandle,
|
|
75
|
+
...triggerProps,
|
|
76
|
+
render: (props) => {
|
|
77
|
+
const { type, ref: triggerRef, ...restProps } = props;
|
|
78
|
+
const resolvedProps = typeof children.type === "string" && children.type === "button" ? props : restProps;
|
|
79
|
+
const mergedProps = mergeProps(children.props, resolvedProps);
|
|
80
|
+
return cloneElement(children, {
|
|
81
|
+
...mergedProps,
|
|
82
|
+
className: cx(mergedProps.className, resolvedClassNames.trigger),
|
|
83
|
+
ref: mergeRefs([
|
|
84
|
+
children.ref,
|
|
85
|
+
triggerRef,
|
|
86
|
+
refProp
|
|
87
|
+
])
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
return /* @__PURE__ */ jsx(Popover.Trigger, {
|
|
92
|
+
handle: popoverHandle,
|
|
93
|
+
...triggerProps,
|
|
94
|
+
className: resolvedClassNames.trigger,
|
|
95
|
+
ref: refProp,
|
|
96
|
+
children
|
|
97
|
+
});
|
|
98
|
+
}, [
|
|
99
|
+
children,
|
|
100
|
+
disabled,
|
|
101
|
+
openOnHover,
|
|
102
|
+
popoverHandle,
|
|
103
|
+
refProp,
|
|
104
|
+
resolvedClassNames.trigger,
|
|
105
|
+
resolvedOpenDelay,
|
|
106
|
+
resolvedCloseDelay
|
|
107
|
+
]);
|
|
108
|
+
const customContainer = useMemo(() => {
|
|
109
|
+
if (!getPopupContainer || !isClient) return void 0;
|
|
110
|
+
}, [getPopupContainer, isClient]);
|
|
111
|
+
const resolvedStyles = useMemo(() => ({
|
|
112
|
+
arrow: styleProps?.arrow,
|
|
113
|
+
positioner: {
|
|
114
|
+
...styleProps?.root,
|
|
115
|
+
zIndex: zIndex ?? 1100
|
|
116
|
+
},
|
|
117
|
+
viewport: styleProps?.content
|
|
118
|
+
}), [
|
|
119
|
+
styleProps?.arrow,
|
|
120
|
+
styleProps?.content,
|
|
121
|
+
styleProps?.root,
|
|
122
|
+
zIndex
|
|
123
|
+
]);
|
|
124
|
+
const popup = useMemo(() => /* @__PURE__ */ jsx(Popover.Positioner, {
|
|
125
|
+
align: placementConfig.align,
|
|
126
|
+
className: resolvedClassNames.positioner,
|
|
127
|
+
"data-hover-trigger": openOnHover || void 0,
|
|
128
|
+
"data-placement": placement,
|
|
129
|
+
side: placementConfig.side,
|
|
130
|
+
sideOffset: resolvedSideOffset,
|
|
131
|
+
style: resolvedStyles.positioner,
|
|
132
|
+
children: /* @__PURE__ */ jsxs(Popover.Popup, {
|
|
133
|
+
className: resolvedClassNames.popup,
|
|
134
|
+
children: [arrow && /* @__PURE__ */ jsx(Popover.Arrow, {
|
|
135
|
+
className: resolvedClassNames.arrow,
|
|
136
|
+
style: resolvedStyles.arrow,
|
|
137
|
+
children: PopoverArrowIcon
|
|
138
|
+
}), /* @__PURE__ */ jsx(Popover.Viewport, {
|
|
139
|
+
className: resolvedClassNames.viewport,
|
|
140
|
+
style: resolvedStyles.viewport,
|
|
141
|
+
children: content
|
|
142
|
+
})]
|
|
143
|
+
})
|
|
144
|
+
}), [
|
|
145
|
+
arrow,
|
|
146
|
+
content,
|
|
147
|
+
openOnHover,
|
|
148
|
+
placement,
|
|
149
|
+
placementConfig.align,
|
|
150
|
+
placementConfig.side,
|
|
151
|
+
resolvedClassNames,
|
|
152
|
+
resolvedSideOffset,
|
|
153
|
+
resolvedStyles
|
|
154
|
+
]);
|
|
155
|
+
if (!content) return children;
|
|
156
|
+
const resolvedPortalContainer = customContainer ?? portalContainer;
|
|
157
|
+
return /* @__PURE__ */ jsxs(Popover.Root, {
|
|
158
|
+
defaultOpen,
|
|
159
|
+
handle: popoverHandle,
|
|
160
|
+
onOpenChange: handleOpenChange,
|
|
161
|
+
open: resolvedOpen,
|
|
162
|
+
children: [triggerElement, portalled ? resolvedPortalContainer ? /* @__PURE__ */ jsx(Popover.Portal, {
|
|
163
|
+
container: resolvedPortalContainer,
|
|
164
|
+
children: popup
|
|
165
|
+
}) : null : popup]
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
PopoverStandalone.displayName = "PopoverStandalone";
|
|
169
|
+
|
|
170
|
+
//#endregion
|
|
171
|
+
export { PopoverStandalone };
|
|
172
|
+
//# sourceMappingURL=PopoverStandalone.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PopoverStandalone.mjs","names":["BasePopover"],"sources":["../../src/Popover/PopoverStandalone.tsx"],"sourcesContent":["'use client';\n\nimport { mergeProps } from '@base-ui/react/merge-props';\nimport { Popover as BasePopover } from '@base-ui/react/popover';\nimport type { Side } from '@base-ui/react/utils/useAnchorPositioning';\nimport { cx } from 'antd-style';\nimport {\n cloneElement,\n isValidElement,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { mergeRefs } from 'react-merge-refs';\n\nimport { useIsClient } from '@/hooks/useIsClient';\nimport { placementMap } from '@/utils/placement';\n\nimport { PopoverArrowIcon } from './ArrowIcon';\nimport { usePopoverPortalContainer } from './PopoverPortal';\nimport { parseTrigger } from './parseTrigger';\nimport { styles } from './style';\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: originArrow = true,\n inset = 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 portalled = true,\n getPopupContainer,\n disabled = false,\n zIndex,\n ref: refProp,\n }) => {\n const arrow = inset ? false : originArrow;\n const isClient = useIsClient();\n const popoverHandle = useMemo(() => BasePopover.createHandle(), []);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(Boolean(defaultOpen));\n\n // Sync controlled state\n useEffect(() => {\n if (open === undefined) return;\n setUncontrolledOpen(open);\n }, [open]);\n\n const mergedOpen = open ?? uncontrolledOpen;\n const resolvedOpen = disabled ? false : mergedOpen;\n\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n // Don't open if disabled\n if (disabled && nextOpen) return;\n\n onOpenChange?.(nextOpen);\n if (open === undefined) {\n setUncontrolledOpen(nextOpen);\n }\n },\n [onOpenChange, open, disabled],\n );\n\n // Parse trigger mode\n const { openOnHover } = useMemo(() => parseTrigger(trigger), [trigger]);\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 baseSideOffset = arrow ? 10 : 6;\n const resolvedSideOffset = useMemo(() => {\n if (!inset) return baseSideOffset;\n return ({\n side,\n positioner,\n }: {\n positioner: { height: number; width: number };\n side: Side;\n }) => {\n if (\n side === 'left' ||\n side === 'right' ||\n side === 'inline-start' ||\n side === 'inline-end'\n ) {\n return -positioner.width;\n }\n return -positioner.height;\n };\n }, [baseSideOffset, inset]);\n\n // Determine portal container\n const portalContainer = usePopoverPortalContainer();\n\n const resolvedClassNames = useMemo(\n () => ({\n arrow: cx(styles.arrow, classNames?.arrow),\n popup: cx(styles.popup, className),\n positioner: cx(styles.positioner, classNames?.root),\n trigger: classNames?.trigger,\n viewport: cx(styles.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 triggerProps = {\n closeDelay: resolvedCloseDelay,\n delay: resolvedOpenDelay,\n disabled,\n openOnHover: openOnHover && !disabled,\n };\n\n if (isValidElement(children)) {\n return (\n <BasePopover.Trigger\n handle={popoverHandle}\n {...triggerProps}\n render={(props) => {\n // Remove type=\"button\" for non-button elements\n // eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars\n const { type, ref: triggerRef, ...restProps } = props as any;\n const resolvedProps =\n typeof (children as any).type === 'string' && (children as any).type === 'button'\n ? props\n : restProps;\n const mergedProps = mergeProps((children as any).props, resolvedProps);\n return cloneElement(children as any, {\n ...mergedProps,\n className: cx(mergedProps.className, resolvedClassNames.trigger),\n ref: mergeRefs([(children as any).ref, triggerRef, refProp]),\n });\n }}\n />\n );\n }\n return (\n <BasePopover.Trigger\n handle={popoverHandle}\n {...triggerProps}\n className={resolvedClassNames.trigger}\n ref={refProp}\n >\n {children}\n </BasePopover.Trigger>\n );\n }, [\n children,\n disabled,\n openOnHover,\n popoverHandle,\n refProp,\n resolvedClassNames.trigger,\n resolvedOpenDelay,\n resolvedCloseDelay,\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: zIndex ?? 1100,\n },\n viewport: styleProps?.content,\n }),\n [styleProps?.arrow, styleProps?.content, styleProps?.root, zIndex],\n );\n\n const popup = useMemo(\n () => (\n <BasePopover.Positioner\n align={placementConfig.align}\n className={resolvedClassNames.positioner}\n data-hover-trigger={openOnHover || undefined}\n data-placement={placement}\n side={placementConfig.side}\n sideOffset={resolvedSideOffset}\n style={resolvedStyles.positioner}\n >\n <BasePopover.Popup className={resolvedClassNames.popup}>\n {arrow && (\n <BasePopover.Arrow className={resolvedClassNames.arrow} style={resolvedStyles.arrow}>\n {PopoverArrowIcon}\n </BasePopover.Arrow>\n )}\n <BasePopover.Viewport\n className={resolvedClassNames.viewport}\n style={resolvedStyles.viewport}\n >\n {content}\n </BasePopover.Viewport>\n </BasePopover.Popup>\n </BasePopover.Positioner>\n ),\n [\n arrow,\n content,\n openOnHover,\n placement,\n placementConfig.align,\n placementConfig.side,\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 <BasePopover.Root\n defaultOpen={defaultOpen}\n handle={popoverHandle}\n onOpenChange={handleOpenChange}\n open={resolvedOpen}\n >\n {triggerElement}\n {portalled ? (\n resolvedPortalContainer ? (\n <BasePopover.Portal container={resolvedPortalContainer}>{popup}</BasePopover.Portal>\n ) : null\n ) : (\n popup\n )}\n </BasePopover.Root>\n );\n },\n);\n\nPopoverStandalone.displayName = 'PopoverStandalone';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PopoverProps } from "./type.mjs";
|
|
2
|
+
import "react";
|
|
3
|
+
|
|
4
|
+
//#region src/Popover/groupContext.d.ts
|
|
5
|
+
type PopoverGroupSharedProps = Omit<PopoverProps, 'children' | 'content' | 'defaultOpen' | 'open' | 'ref'> & {
|
|
6
|
+
/**
|
|
7
|
+
* @description Whether to enable content layout animation when switching triggers
|
|
8
|
+
* @default true
|
|
9
|
+
*/
|
|
10
|
+
contentLayoutAnimation?: boolean;
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { PopoverGroupSharedProps };
|
|
14
|
+
//# sourceMappingURL=groupContext.d.mts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { createContext } from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/Popover/groupContext.ts
|
|
6
|
+
const PopoverGroupHandleContext = createContext(null);
|
|
7
|
+
const PopoverGroupPropsContext = createContext(null);
|
|
8
|
+
|
|
9
|
+
//#endregion
|
|
10
|
+
export { PopoverGroupHandleContext, PopoverGroupPropsContext };
|
|
11
|
+
//# sourceMappingURL=groupContext.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groupContext.mjs","names":[],"sources":["../../src/Popover/groupContext.ts"],"sourcesContent":["'use client';\n\nimport type { PopoverHandle } from '@base-ui/react/popover/store/PopoverHandle';\nimport { createContext } from 'react';\n\nimport type { PopoverProps } from './type';\n\nexport type PopoverGroupItem = Omit<PopoverProps, 'children' | 'open' | 'defaultOpen' | 'ref'>;\n\nexport type PopoverGroupSharedProps = Omit<\n PopoverProps,\n 'children' | 'content' | 'defaultOpen' | 'open' | 'ref'\n> & {\n /**\n * @description Whether to enable content layout animation when switching triggers\n * @default true\n */\n contentLayoutAnimation?: boolean;\n};\n\nexport const PopoverGroupHandleContext = createContext<PopoverHandle<PopoverGroupItem> | null>(\n null,\n);\nexport const PopoverGroupPropsContext = createContext<PopoverGroupSharedProps | null>(null);\n"],"mappings":";;;;;AAoBA,MAAa,4BAA4B,cACvC,KACD;AACD,MAAa,2BAA2B,cAA8C,KAAK"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { PopoverPlacement, PopoverProps, PopoverTrigger } from "./type.mjs";
|
|
2
|
+
import { parseTrigger } from "./parseTrigger.mjs";
|
|
3
|
+
import { Popover } from "./Popover.mjs";
|
|
4
|
+
import { PopoverGroup } from "./PopoverGroup.mjs";
|
|
5
|
+
export { PopoverGroup, type PopoverPlacement, type PopoverProps, type PopoverTrigger, Popover as default, parseTrigger };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './index.d.mts';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './index.mjs';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PopoverTrigger } from "./type.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/Popover/parseTrigger.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Parses trigger prop to determine hover and click behavior
|
|
7
|
+
*/
|
|
8
|
+
declare function parseTrigger(trigger: PopoverTrigger): {
|
|
9
|
+
openOnClick: boolean;
|
|
10
|
+
openOnHover: boolean;
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { parseTrigger };
|
|
14
|
+
//# sourceMappingURL=parseTrigger.d.mts.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
//#region src/Popover/parseTrigger.ts
|
|
4
|
+
/**
|
|
5
|
+
* Parses trigger prop to determine hover and click behavior
|
|
6
|
+
*/
|
|
7
|
+
function parseTrigger(trigger) {
|
|
8
|
+
const triggers = Array.isArray(trigger) ? trigger : [trigger];
|
|
9
|
+
const normalizedTriggers = new Set(triggers.flatMap((item) => item === "both" ? ["hover", "click"] : [item]));
|
|
10
|
+
return {
|
|
11
|
+
openOnClick: normalizedTriggers.has("click"),
|
|
12
|
+
openOnHover: normalizedTriggers.has("hover")
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
export { parseTrigger };
|
|
18
|
+
//# sourceMappingURL=parseTrigger.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseTrigger.mjs","names":[],"sources":["../../src/Popover/parseTrigger.ts"],"sourcesContent":["'use client';\n\nimport type { PopoverTrigger } from './type';\n\n/**\n * Parses trigger prop to determine hover and click behavior\n */\nexport function parseTrigger(trigger: PopoverTrigger): {\n openOnClick: boolean;\n openOnHover: boolean;\n} {\n const triggers = Array.isArray(trigger) ? trigger : [trigger];\n const normalizedTriggers = new Set(\n triggers.flatMap((item) => (item === 'both' ? ['hover', 'click'] : [item])),\n );\n return {\n openOnClick: normalizedTriggers.has('click'),\n openOnHover: normalizedTriggers.has('hover'),\n };\n}\n"],"mappings":";;;;;;AAOA,SAAgB,aAAa,SAG3B;CACA,MAAM,WAAW,MAAM,QAAQ,QAAQ,GAAG,UAAU,CAAC,QAAQ;CAC7D,MAAM,qBAAqB,IAAI,IAC7B,SAAS,SAAS,SAAU,SAAS,SAAS,CAAC,SAAS,QAAQ,GAAG,CAAC,KAAK,CAAE,CAC5E;AACD,QAAO;EACL,aAAa,mBAAmB,IAAI,QAAQ;EAC5C,aAAa,mBAAmB,IAAI,QAAQ;EAC7C"}
|