@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.
Files changed (165) hide show
  1. package/es/Accordion/Accordion.d.mts +2 -2
  2. package/es/Accordion/AccordionItem.d.mts +2 -2
  3. package/es/ActionIcon/ActionIcon.d.mts +2 -2
  4. package/es/Alert/Alert.d.mts +2 -2
  5. package/es/AutoComplete/Select.d.mts +2 -2
  6. package/es/Avatar/AvatarGroup/index.d.mts +2 -2
  7. package/es/Burger/Burger.d.mts +2 -2
  8. package/es/CodeEditor/CodeEditor.d.mts +2 -2
  9. package/es/Collapse/Collapse.d.mts +2 -2
  10. package/es/ContextMenu/ContextMenuHost.d.mts +2 -2
  11. package/es/CopyButton/CopyButton.d.mts +2 -2
  12. package/es/DatePicker/DatePicker.d.mts +2 -2
  13. package/es/DraggablePanel/components/DraggablePanelBody.d.mts +2 -2
  14. package/es/DraggablePanel/components/DraggablePanelContainer.d.mts +2 -2
  15. package/es/DraggablePanel/components/DraggablePanelFooter.d.mts +2 -2
  16. package/es/DraggablePanel/components/DraggablePanelHeader.d.mts +2 -2
  17. package/es/DraggablePanel/style.mjs +1 -1
  18. package/es/DraggablePanel/style.mjs.map +1 -1
  19. package/es/DraggableSideNav/DraggableSideNav.d.mts +2 -2
  20. package/es/Drawer/Drawer.d.mts +2 -2
  21. package/es/Dropdown/Dropdown.d.mts +9 -2
  22. package/es/Dropdown/Dropdown.mjs +6 -0
  23. package/es/Dropdown/Dropdown.mjs.map +1 -1
  24. package/es/DropdownMenu/DropdownMenu.d.mts +2 -2
  25. package/es/DropdownMenu/DropdownMenu.mjs +20 -36
  26. package/es/DropdownMenu/DropdownMenu.mjs.map +1 -1
  27. package/es/DropdownMenu/type.d.mts +2 -1
  28. package/es/EditableText/EditableText.d.mts +2 -2
  29. package/es/EmojiPicker/EmojiPicker.d.mts +2 -2
  30. package/es/Flex/FlexBasic.d.mts +2 -2
  31. package/es/Footer/Footer.d.mts +2 -2
  32. package/es/Form/components/FormGroup.d.mts +2 -2
  33. package/es/Form/components/FormItem.d.mts +2 -2
  34. package/es/Form/components/FormSubmitFooter.d.mts +2 -2
  35. package/es/FormModal/FormModal.d.mts +2 -2
  36. package/es/GuideCard/GuideCard.d.mts +2 -2
  37. package/es/Header/Header.d.mts +2 -2
  38. package/es/Highlighter/Highlighter.d.mts +2 -2
  39. package/es/Highlighter/SyntaxHighlighter/index.d.mts +2 -2
  40. package/es/Hotkey/Hotkey.d.mts +2 -2
  41. package/es/HotkeyInput/HotkeyInput.d.mts +2 -2
  42. package/es/Icon/Icon.d.mts +2 -2
  43. package/es/Icon/components/IconProvider.d.mts +3 -3
  44. package/es/Image/PreviewGroup.d.mts +2 -2
  45. package/es/ImageSelect/ImageSelect.d.mts +2 -2
  46. package/es/Input/Input.d.mts +2 -2
  47. package/es/Input/InputNumber.d.mts +2 -2
  48. package/es/Input/InputOPT.d.mts +2 -2
  49. package/es/Input/InputPassword.d.mts +2 -2
  50. package/es/Input/TextArea.d.mts +2 -2
  51. package/es/Layout/components/LayoutFooter.d.mts +2 -2
  52. package/es/Layout/components/LayoutHeader.d.mts +2 -2
  53. package/es/Layout/components/LayoutMain.d.mts +2 -2
  54. package/es/Layout/components/LayoutSidebar.d.mts +2 -2
  55. package/es/Layout/components/LayoutSidebarInner.d.mts +2 -2
  56. package/es/Layout/components/LayoutToc.d.mts +2 -2
  57. package/es/List/ListItem/index.d.mts +2 -2
  58. package/es/Markdown/Markdown.d.mts +2 -2
  59. package/es/Markdown/Typography.d.mts +2 -2
  60. package/es/MaskShadow/MaskShadow.d.mts +2 -2
  61. package/es/Menu/Menu.d.mts +2 -2
  62. package/es/Menu/sharedStyle.mjs +56 -10
  63. package/es/Menu/sharedStyle.mjs.map +1 -1
  64. package/es/Mermaid/Mermaid.d.mts +2 -2
  65. package/es/Mermaid/SyntaxMermaid/index.d.mts +2 -2
  66. package/es/Modal/Modal.d.mts +2 -2
  67. package/es/Modal/ModalProvider.d.mts +2 -2
  68. package/es/Popover/ArrowIcon.mjs +22 -0
  69. package/es/Popover/ArrowIcon.mjs.map +1 -0
  70. package/es/Popover/Popover.d.mts +9 -0
  71. package/es/Popover/Popover.mjs +20 -0
  72. package/es/Popover/Popover.mjs.map +1 -0
  73. package/es/Popover/PopoverGroup.d.mts +11 -0
  74. package/es/Popover/PopoverGroup.mjs +96 -0
  75. package/es/Popover/PopoverGroup.mjs.map +1 -0
  76. package/es/Popover/PopoverInGroup.mjs +60 -0
  77. package/es/Popover/PopoverInGroup.mjs.map +1 -0
  78. package/es/Popover/PopoverPortal.mjs +45 -0
  79. package/es/Popover/PopoverPortal.mjs.map +1 -0
  80. package/es/Popover/PopoverStandalone.mjs +172 -0
  81. package/es/Popover/PopoverStandalone.mjs.map +1 -0
  82. package/es/Popover/groupContext.d.mts +14 -0
  83. package/es/Popover/groupContext.mjs +11 -0
  84. package/es/Popover/groupContext.mjs.map +1 -0
  85. package/es/Popover/index.d.mts +5 -0
  86. package/es/Popover/index.d.ts +1 -0
  87. package/es/Popover/index.js +1 -0
  88. package/es/Popover/index.mjs +5 -0
  89. package/es/Popover/parseTrigger.d.mts +14 -0
  90. package/es/Popover/parseTrigger.mjs +18 -0
  91. package/es/Popover/parseTrigger.mjs.map +1 -0
  92. package/es/Popover/style.mjs +218 -0
  93. package/es/Popover/style.mjs.map +1 -0
  94. package/es/Popover/type.d.mts +113 -0
  95. package/es/Popover/useMergedPopoverProps.mjs +88 -0
  96. package/es/Popover/useMergedPopoverProps.mjs.map +1 -0
  97. package/es/SearchBar/SearchBar.d.mts +2 -2
  98. package/es/Segmented/Segmented.d.mts +2 -2
  99. package/es/Select/Select.d.mts +2 -2
  100. package/es/SideNav/SideNav.d.mts +2 -2
  101. package/es/SliderWithInput/SliderWithInput.d.mts +2 -2
  102. package/es/SortableList/components/DragHandle.d.mts +2 -2
  103. package/es/SortableList/components/SortableItem.d.mts +2 -2
  104. package/es/ThemeProvider/ThemeProvider.d.mts +2 -2
  105. package/es/Toc/Toc.d.mts +2 -2
  106. package/es/Tooltip/TooltipGroup.mjs +2 -2
  107. package/es/Tooltip/TooltipGroup.mjs.map +1 -1
  108. package/es/Tooltip/type.d.mts +2 -2
  109. package/es/Tooltip/useTooltipFloating.mjs +2 -2
  110. package/es/Tooltip/useTooltipFloating.mjs.map +1 -1
  111. package/es/awesome/AuroraBackground/AuroraBackground.d.mts +2 -2
  112. package/es/awesome/BottomGradientButton/BottomGradientButton.d.mts +2 -2
  113. package/es/awesome/Features/Features.d.mts +2 -2
  114. package/es/awesome/Giscus/Giscus.d.mts +2 -2
  115. package/es/awesome/GradientButton/GradientButton.d.mts +2 -2
  116. package/es/awesome/GridBackground/GridBackground.d.mts +2 -2
  117. package/es/awesome/GridBackground/GridShowcase.d.mts +2 -2
  118. package/es/awesome/Hero/Hero.d.mts +2 -2
  119. package/es/awesome/Spline/Spine.d.mts +2 -2
  120. package/es/awesome/Spotlight/Spotlight.d.mts +2 -2
  121. package/es/awesome/SpotlightCard/SpotlightCard.d.mts +2 -2
  122. package/es/awesome/TypewriterEffect/TypewriterEffect.d.mts +2 -2
  123. package/es/brand/LobeChat/index.d.mts +2 -2
  124. package/es/brand/LobeHub/index.d.mts +2 -2
  125. package/es/brand/LogoThree/LogoSpline.d.mts +2 -2
  126. package/es/brand/LogoThree/index.d.mts +2 -2
  127. package/es/chat/BackBottom/BackBottom.d.mts +2 -2
  128. package/es/chat/ChatInputArea/components/ChatInputAreaInner.d.mts +2 -2
  129. package/es/chat/ChatItem/ChatItem.d.mts +2 -2
  130. package/es/chat/ChatList/ChatList.d.mts +2 -2
  131. package/es/chat/EditableMessage/EditableMessage.d.mts +2 -2
  132. package/es/chat/EditableMessageList/EditableMessageList.d.mts +2 -2
  133. package/es/chat/MessageInput/MessageInput.d.mts +2 -2
  134. package/es/chat/MessageModal/MessageModal.d.mts +2 -2
  135. package/es/color/ColorScales/index.d.mts +2 -2
  136. package/es/color/CssVar/index.d.mts +2 -2
  137. package/es/i18n/context.d.mts +2 -2
  138. package/es/icons/lucideExtra/BotPromptIcon.d.mts +2 -2
  139. package/es/icons/lucideExtra/CreateBotIcon.d.mts +2 -2
  140. package/es/icons/lucideExtra/DiscordIcon.d.mts +2 -2
  141. package/es/icons/lucideExtra/GlobeOffIcon.d.mts +2 -2
  142. package/es/icons/lucideExtra/GroupBotIcon.d.mts +2 -2
  143. package/es/icons/lucideExtra/GroupBotSquareIcon.d.mts +2 -2
  144. package/es/icons/lucideExtra/LeftClickIcon.d.mts +2 -2
  145. package/es/icons/lucideExtra/LeftDoubleClickIcon.d.mts +3 -3
  146. package/es/icons/lucideExtra/McpIcon.d.mts +3 -3
  147. package/es/icons/lucideExtra/ProviderIcon.d.mts +3 -3
  148. package/es/icons/lucideExtra/RightClickIcon.d.mts +2 -2
  149. package/es/icons/lucideExtra/RightDoubleClickIcon.d.mts +3 -3
  150. package/es/icons/lucideExtra/ShapesUploadIcon.d.mts +3 -3
  151. package/es/icons/lucideExtra/TreeDownRightIcon.d.mts +3 -3
  152. package/es/icons/lucideExtra/TreeUpDownRightIcon.d.mts +3 -3
  153. package/es/index.d.mts +6 -1
  154. package/es/index.mjs +4 -1
  155. package/es/mdx/Mdx/index.d.mts +2 -2
  156. package/es/mobile/ChatHeader/ChatHeaderTitle.d.mts +2 -2
  157. package/es/mobile/ChatInputArea/components/ChatSendButton.d.mts +2 -2
  158. package/es/mobile/TabBar/TabBar.d.mts +2 -2
  159. package/es/storybook/StoryBook/index.d.mts +2 -2
  160. package/es/utils/placement.d.mts +31 -0
  161. package/es/utils/placement.mjs +100 -0
  162. package/es/utils/placement.mjs.map +1 -0
  163. package/package.json +1 -1
  164. package/es/Tooltip/antdPlacementToFloating.mjs +0 -27
  165. 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,5 @@
1
+ import { parseTrigger } from "./parseTrigger.mjs";
2
+ import Popover_default from "./Popover.mjs";
3
+ import PopoverGroup_default from "./PopoverGroup.mjs";
4
+
5
+ export { PopoverGroup_default as PopoverGroup, Popover_default as default, parseTrigger };
@@ -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"}