@lobehub/ui 4.12.2 → 4.13.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 (171) 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/Alert/Alert.mjs +1 -1
  6. package/es/Alert/Alert.mjs.map +1 -1
  7. package/es/Avatar/AvatarGroup/index.d.mts +2 -2
  8. package/es/Burger/Burger.d.mts +2 -2
  9. package/es/CodeEditor/CodeEditor.d.mts +2 -2
  10. package/es/Collapse/Collapse.d.mts +2 -2
  11. package/es/ConfigProvider/index.d.mts +2 -2
  12. package/es/ContextMenu/ContextMenuHost.d.mts +2 -2
  13. package/es/ContextMenu/ContextMenuHost.mjs +1 -1
  14. package/es/CopyButton/CopyButton.d.mts +2 -2
  15. package/es/DatePicker/DatePicker.d.mts +2 -2
  16. package/es/DraggablePanel/DraggablePanel.mjs +1 -1
  17. package/es/DraggablePanel/components/DraggablePanelBody.d.mts +2 -2
  18. package/es/DraggablePanel/components/DraggablePanelContainer.d.mts +2 -2
  19. package/es/DraggablePanel/components/DraggablePanelFooter.d.mts +2 -2
  20. package/es/DraggablePanel/components/DraggablePanelHeader.d.mts +2 -2
  21. package/es/DraggableSideNav/DraggableSideNav.d.mts +2 -2
  22. package/es/DraggableSideNav/DraggableSideNav.mjs +1 -1
  23. package/es/Drawer/Drawer.d.mts +2 -2
  24. package/es/Dropdown/Dropdown.d.mts +2 -2
  25. package/es/DropdownMenu/DropdownMenu.d.mts +2 -2
  26. package/es/DropdownMenu/DropdownMenu.mjs +3 -3
  27. package/es/EditableText/EditableText.d.mts +2 -2
  28. package/es/EmojiPicker/EmojiPicker.d.mts +2 -2
  29. package/es/Flex/FlexBasic.d.mts +2 -2
  30. package/es/FontLoader/index.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/Header/Header.d.mts +2 -2
  37. package/es/Highlighter/Highlighter.d.mts +2 -2
  38. package/es/Highlighter/SyntaxHighlighter/index.d.mts +2 -2
  39. package/es/Hotkey/Hotkey.d.mts +2 -2
  40. package/es/HotkeyInput/HotkeyInput.d.mts +2 -2
  41. package/es/Icon/Icon.d.mts +2 -2
  42. package/es/Icon/components/IconProvider.d.mts +3 -3
  43. package/es/Image/PreviewGroup.d.mts +2 -2
  44. package/es/ImageSelect/ImageSelect.d.mts +2 -2
  45. package/es/Input/Input.d.mts +2 -2
  46. package/es/Input/InputNumber.d.mts +2 -2
  47. package/es/Layout/components/LayoutFooter.d.mts +2 -2
  48. package/es/Layout/components/LayoutHeader.d.mts +2 -2
  49. package/es/Layout/components/LayoutMain.d.mts +2 -2
  50. package/es/Layout/components/LayoutSidebar.d.mts +2 -2
  51. package/es/Layout/components/LayoutSidebarInner.d.mts +2 -2
  52. package/es/Layout/components/LayoutToc.d.mts +2 -2
  53. package/es/List/ListItem/index.d.mts +2 -2
  54. package/es/Markdown/Markdown.d.mts +2 -2
  55. package/es/Markdown/Typography.d.mts +2 -2
  56. package/es/Markdown/components/SearchResultCards/index.d.mts +2 -2
  57. package/es/MaskShadow/MaskShadow.d.mts +2 -2
  58. package/es/Menu/Menu.d.mts +2 -2
  59. package/es/Mermaid/Mermaid.d.mts +2 -2
  60. package/es/Mermaid/SyntaxMermaid/index.d.mts +2 -2
  61. package/es/Modal/Modal.d.mts +2 -2
  62. package/es/Modal/ModalProvider.d.mts +2 -2
  63. package/es/MotionProvider/index.d.mts +2 -2
  64. package/es/Popover/Popover.mjs +1 -1
  65. package/es/Popover/Popover.mjs.map +1 -1
  66. package/es/Popover/PopoverGroup.mjs +6 -2
  67. package/es/Popover/PopoverGroup.mjs.map +1 -1
  68. package/es/Popover/PopoverInGroup.mjs +1 -1
  69. package/es/Popover/PopoverPortal.mjs +1 -1
  70. package/es/Popover/PopoverPortal.mjs.map +1 -1
  71. package/es/Popover/PopoverStandalone.mjs +2 -2
  72. package/es/Popover/context.d.mts +2 -2
  73. package/es/Popover/context.mjs +3 -1
  74. package/es/Popover/context.mjs.map +1 -1
  75. package/es/Popover/type.d.mts +4 -0
  76. package/es/SearchBar/SearchBar.d.mts +2 -2
  77. package/es/Segmented/Segmented.d.mts +2 -2
  78. package/es/Select/Select.d.mts +2 -2
  79. package/es/SideNav/SideNav.d.mts +2 -2
  80. package/es/SliderWithInput/SliderWithInput.d.mts +2 -2
  81. package/es/SortableList/components/DragHandle.d.mts +2 -2
  82. package/es/SortableList/components/SortableItem.d.mts +2 -2
  83. package/es/ThemeProvider/ThemeProvider.d.mts +2 -2
  84. package/es/Toc/Toc.d.mts +2 -2
  85. package/es/Tooltip/ArrowIcon.mjs +22 -0
  86. package/es/Tooltip/ArrowIcon.mjs.map +1 -0
  87. package/es/Tooltip/Tooltip.mjs +3 -3
  88. package/es/Tooltip/Tooltip.mjs.map +1 -1
  89. package/es/Tooltip/TooltipContent.mjs +24 -0
  90. package/es/Tooltip/TooltipContent.mjs.map +1 -0
  91. package/es/Tooltip/TooltipGroup.d.mts +2 -5
  92. package/es/Tooltip/TooltipGroup.mjs +90 -178
  93. package/es/Tooltip/TooltipGroup.mjs.map +1 -1
  94. package/es/Tooltip/TooltipInGroup.mjs +54 -52
  95. package/es/Tooltip/TooltipInGroup.mjs.map +1 -1
  96. package/es/Tooltip/TooltipPortal.mjs +4 -7
  97. package/es/Tooltip/TooltipPortal.mjs.map +1 -1
  98. package/es/Tooltip/TooltipStandalone.mjs +149 -83
  99. package/es/Tooltip/TooltipStandalone.mjs.map +1 -1
  100. package/es/Tooltip/groupContext.mjs +4 -2
  101. package/es/Tooltip/groupContext.mjs.map +1 -1
  102. package/es/Tooltip/index.d.mts +1 -1
  103. package/es/Tooltip/style.mjs +203 -32
  104. package/es/Tooltip/style.mjs.map +1 -1
  105. package/es/Tooltip/type.d.mts +30 -3
  106. package/es/Tooltip/useMergedTooltipProps.mjs +17 -6
  107. package/es/Tooltip/useMergedTooltipProps.mjs.map +1 -1
  108. package/es/Video/index.d.mts +2 -2
  109. package/es/awesome/AuroraBackground/AuroraBackground.d.mts +2 -2
  110. package/es/awesome/Giscus/Giscus.d.mts +2 -2
  111. package/es/awesome/GradientButton/GradientButton.d.mts +2 -2
  112. package/es/awesome/GridBackground/GridBackground.d.mts +2 -2
  113. package/es/awesome/GridBackground/GridBackground.mjs +1 -1
  114. package/es/awesome/GridBackground/GridShowcase.d.mts +2 -2
  115. package/es/awesome/Hero/Hero.d.mts +2 -2
  116. package/es/awesome/Spline/Spine.d.mts +2 -2
  117. package/es/awesome/Spotlight/Spotlight.d.mts +2 -2
  118. package/es/awesome/SpotlightCard/SpotlightCard.d.mts +2 -2
  119. package/es/awesome/TypewriterEffect/TypewriterEffect.d.mts +2 -2
  120. package/es/brand/LobeChat/index.d.mts +2 -2
  121. package/es/brand/LobeHub/index.d.mts +2 -2
  122. package/es/brand/LogoThree/LogoSpline.d.mts +2 -2
  123. package/es/brand/LogoThree/index.d.mts +2 -2
  124. package/es/chat/BackBottom/BackBottom.d.mts +2 -2
  125. package/es/chat/BackBottom/BackBottom.mjs +1 -1
  126. package/es/chat/ChatInputArea/components/ChatInputAreaInner.d.mts +2 -2
  127. package/es/chat/ChatList/ChatList.d.mts +2 -2
  128. package/es/chat/EditableMessage/EditableMessage.d.mts +2 -2
  129. package/es/chat/EditableMessageList/EditableMessageList.d.mts +2 -2
  130. package/es/chat/MessageInput/MessageInput.d.mts +2 -2
  131. package/es/chat/MessageModal/MessageModal.d.mts +2 -2
  132. package/es/color/ColorScales/index.d.mts +2 -2
  133. package/es/color/CssVar/index.d.mts +2 -2
  134. package/es/hooks/usePortalContainer.mjs +1 -1
  135. package/es/i18n/context.d.mts +2 -2
  136. package/es/icons/lucideExtra/BotPromptIcon.d.mts +2 -2
  137. package/es/icons/lucideExtra/CreateBotIcon.d.mts +2 -2
  138. package/es/icons/lucideExtra/DiscordIcon.d.mts +3 -3
  139. package/es/icons/lucideExtra/GlobeOffIcon.d.mts +2 -2
  140. package/es/icons/lucideExtra/GroupBotIcon.d.mts +3 -3
  141. package/es/icons/lucideExtra/GroupBotSquareIcon.d.mts +2 -2
  142. package/es/icons/lucideExtra/LeftClickIcon.d.mts +2 -2
  143. package/es/icons/lucideExtra/LeftDoubleClickIcon.d.mts +3 -3
  144. package/es/icons/lucideExtra/McpIcon.d.mts +3 -3
  145. package/es/icons/lucideExtra/ProviderIcon.d.mts +3 -3
  146. package/es/icons/lucideExtra/RightClickIcon.d.mts +3 -3
  147. package/es/icons/lucideExtra/RightDoubleClickIcon.d.mts +3 -3
  148. package/es/icons/lucideExtra/ShapesUploadIcon.d.mts +3 -3
  149. package/es/icons/lucideExtra/TreeDownRightIcon.d.mts +3 -3
  150. package/es/icons/lucideExtra/TreeUpDownRightIcon.d.mts +3 -3
  151. package/es/index.mjs +1 -1
  152. package/es/mdx/Mdx/index.d.mts +2 -2
  153. package/es/mobile/ChatInputArea/ChatInputArea.mjs +1 -1
  154. package/es/mobile/ChatInputArea/components/ChatSendButton.d.mts +2 -2
  155. package/es/mobile/TabBar/TabBar.d.mts +2 -2
  156. package/es/storybook/StoryBook/index.d.mts +2 -2
  157. package/es/utils/placement.d.mts +1 -1
  158. package/package.json +1 -1
  159. package/es/Tooltip/TooltipFloating.mjs +0 -119
  160. package/es/Tooltip/TooltipFloating.mjs.map +0 -1
  161. package/es/Tooltip/groupContext.d.mts +0 -14
  162. package/es/Tooltip/useTooltipFloating.mjs +0 -55
  163. package/es/Tooltip/useTooltipFloating.mjs.map +0 -1
  164. package/es/Tooltip/useTooltipReference.mjs +0 -56
  165. package/es/Tooltip/useTooltipReference.mjs.map +0 -1
  166. package/es/Tooltip/useTooltipTrigger.mjs +0 -18
  167. package/es/Tooltip/useTooltipTrigger.mjs.map +0 -1
  168. package/es/Tooltip/utils.mjs +0 -36
  169. package/es/Tooltip/utils.mjs.map +0 -1
  170. package/es/utils/composeEventHandlers.mjs +0 -28
  171. package/es/utils/composeEventHandlers.mjs.map +0 -1
@@ -1,194 +1,106 @@
1
1
  'use client';
2
2
 
3
- import { TooltipGroupApiContext, TooltipGroupPropsContext } from "./groupContext.mjs";
4
- import TooltipFloating_default from "./TooltipFloating.mjs";
5
- import TooltipPortal_default from "./TooltipPortal.mjs";
6
- import { toFloatingUIPlacement } from "../utils/placement.mjs";
7
- import { isElementHidden, observeElementVisibility } from "./utils.mjs";
3
+ import { TooltipGroupHandleContext, TooltipGroupPropsContext } from "./groupContext.mjs";
4
+ import { placementMap } from "../utils/placement.mjs";
5
+ import { TooltipArrowIcon } from "./ArrowIcon.mjs";
6
+ import TooltipContent_default from "./TooltipContent.mjs";
7
+ import { useTooltipPortalContainer } from "./TooltipPortal.mjs";
8
+ import { styles } from "./style.mjs";
8
9
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
9
10
  import { jsx, jsxs } from "react/jsx-runtime";
10
- import { arrow, autoUpdate, flip, offset, shift, useFloating } from "@floating-ui/react";
11
+ import { cx } from "antd-style";
12
+ import { Tooltip } from "@base-ui/react/tooltip";
11
13
 
12
14
  //#region src/Tooltip/TooltipGroup.tsx
13
- const TooltipGroup = ({ children, layoutAnimation = true, ...sharedProps }) => {
14
- const arrowRef = useRef(null);
15
- const openTimerRef = useRef(null);
16
- const closeTimerRef = useRef(null);
17
- const [active, setActive] = useState(null);
18
- const [open, setOpen] = useState(false);
19
- const activeRef = useRef(null);
15
+ const TooltipGroup = ({ children, layoutAnimation = false, ...sharedProps }) => {
16
+ const handle = useMemo(() => Tooltip.createHandle(), []);
17
+ const activeItemRef = useRef(null);
18
+ const [updateKey, setUpdateKey] = useState(0);
20
19
  useEffect(() => {
21
- activeRef.current = active;
22
- }, [active]);
23
- const floatingPlacement = useMemo(() => toFloatingUIPlacement(active?.item.placement), [active?.item.placement]);
24
- const { context, floatingStyles, refs } = useFloating({
25
- middleware: useMemo(() => {
26
- const base = [
27
- offset(8),
28
- flip(),
29
- shift({ padding: 8 })
30
- ];
31
- if (active?.item.arrow) base.push(arrow({ element: arrowRef }));
32
- return base;
33
- }, [active?.item.arrow]),
34
- open,
35
- placement: floatingPlacement,
36
- whileElementsMounted: autoUpdate
37
- });
38
- useEffect(() => {
39
- if (!active?.triggerEl) return;
40
- refs.setReference(active.triggerEl);
41
- }, [active?.triggerEl, refs]);
42
- const clearTimers = useCallback(() => {
43
- if (openTimerRef.current) window.clearTimeout(openTimerRef.current);
44
- if (closeTimerRef.current) window.clearTimeout(closeTimerRef.current);
45
- openTimerRef.current = null;
46
- closeTimerRef.current = null;
20
+ setUpdateKey((prev) => prev + 1);
21
+ }, [handle]);
22
+ const handleOpenChange = useCallback((open) => {
23
+ activeItemRef.current?.onOpenChange?.(open);
47
24
  }, []);
48
- const closeImmediately = useCallback(() => {
49
- clearTimers();
50
- setOpen(false);
51
- activeRef.current?.item.onOpenChange?.(false);
52
- }, [clearTimers]);
53
- const destroyActive = useCallback(() => {
54
- clearTimers();
55
- setOpen(false);
56
- activeRef.current?.item.onOpenChange?.(false);
57
- setActive(null);
58
- }, [clearTimers]);
59
- const isActiveTrigger = useCallback((triggerEl) => {
60
- return Boolean(activeRef.current && activeRef.current.triggerEl === triggerEl);
61
- }, []);
62
- const closeFromTrigger = useCallback((triggerEl, item) => {
63
- if (!activeRef.current || activeRef.current.triggerEl !== triggerEl) return;
64
- clearTimers();
65
- const delayMs = item.closeDelay ?? (item.mouseLeaveDelay !== void 0 ? item.mouseLeaveDelay * 1e3 : 100);
66
- if (delayMs <= 0) {
67
- setOpen(false);
68
- item.onOpenChange?.(false);
69
- return;
70
- }
71
- closeTimerRef.current = window.setTimeout(() => {
72
- setOpen(false);
73
- item.onOpenChange?.(false);
74
- }, delayMs);
75
- }, [clearTimers]);
76
- const openFromTrigger = useCallback((triggerEl, item) => {
77
- if (!triggerEl) return;
78
- if (!item.title) return;
79
- if (item.disabled) return;
80
- clearTimers();
81
- if (isElementHidden(triggerEl)) {
82
- if (isActiveTrigger(triggerEl)) destroyActive();
83
- return;
84
- }
85
- setActive({
86
- item,
87
- triggerEl
88
- });
89
- const delayMs = item.openDelay ?? (item.mouseEnterDelay !== void 0 ? item.mouseEnterDelay * 1e3 : 400);
90
- if (delayMs <= 0) {
91
- if (isElementHidden(triggerEl)) {
92
- destroyActive();
93
- return;
94
- }
95
- setOpen(true);
96
- item.onOpenChange?.(true);
97
- return;
98
- }
99
- openTimerRef.current = window.setTimeout(() => {
100
- if (isElementHidden(triggerEl)) {
101
- destroyActive();
102
- return;
103
- }
104
- setOpen(true);
105
- item.onOpenChange?.(true);
106
- }, delayMs);
107
- }, [
108
- clearTimers,
109
- destroyActive,
110
- isActiveTrigger
111
- ]);
112
- const groupApi = useMemo(() => ({
113
- closeFromTrigger,
114
- closeImmediately,
115
- isActiveTrigger,
116
- openFromTrigger
117
- }), [
118
- closeFromTrigger,
119
- closeImmediately,
120
- isActiveTrigger,
121
- openFromTrigger
122
- ]);
123
- useEffect(() => {
124
- if (!open) return;
125
- const triggerEl = active?.triggerEl;
126
- if (!triggerEl) return;
127
- if (isElementHidden(triggerEl)) {
128
- destroyActive();
129
- return;
130
- }
131
- const stopVisibilityObserver = observeElementVisibility(triggerEl, (visible) => {
132
- if (!visible) destroyActive();
133
- });
134
- const root = triggerEl.getRootNode?.();
135
- const observeTarget = typeof ShadowRoot !== "undefined" && root instanceof ShadowRoot ? root : triggerEl.ownerDocument ?? document;
136
- const observer = new MutationObserver(() => {
137
- if (isElementHidden(triggerEl)) destroyActive();
138
- });
139
- observer.observe(observeTarget, {
140
- childList: true,
141
- subtree: true
142
- });
143
- return () => {
144
- observer.disconnect();
145
- stopVisibilityObserver?.();
146
- };
147
- }, [
148
- active?.triggerEl,
149
- destroyActive,
150
- open
151
- ]);
152
- useEffect(() => {
153
- return () => {
154
- clearTimers();
155
- };
156
- }, [clearTimers]);
157
- const portalRoot = active?.item.getPopupContainer && active?.triggerEl ? active.item.getPopupContainer(active.triggerEl) : void 0;
158
- const openRef = useRef(open);
159
- useEffect(() => {
160
- openRef.current = open;
161
- }, [open]);
162
- const isInitialShow = !openRef.current && open;
163
- const floatingNode = /* @__PURE__ */ jsx(TooltipFloating_default, {
164
- arrow: active?.item.arrow,
165
- arrowRef,
166
- className: active?.item.className,
167
- classNames: active?.item.classNames,
168
- context,
169
- floatingStyles,
170
- hotkey: active?.item.hotkey,
171
- hotkeyProps: active?.item.hotkeyProps,
172
- isInitialShow,
173
- layoutAnimation,
174
- open,
175
- placement: floatingPlacement,
176
- setFloating: refs.setFloating,
177
- styles: active?.item.styles,
178
- title: active?.item.title,
179
- zIndex: active?.item.zIndex
180
- });
181
- return /* @__PURE__ */ jsx(TooltipGroupApiContext.Provider, {
182
- value: groupApi,
25
+ const portalContainer = useTooltipPortalContainer();
26
+ return /* @__PURE__ */ jsx(TooltipGroupHandleContext.Provider, {
27
+ value: handle,
183
28
  children: /* @__PURE__ */ jsxs(TooltipGroupPropsContext.Provider, {
184
29
  value: sharedProps,
185
- children: [children, active?.item.title && !active.item.disabled && (active.item.portalled ?? true ? /* @__PURE__ */ jsx(TooltipPortal_default, {
186
- root: portalRoot,
187
- children: floatingNode
188
- }) : floatingNode)]
30
+ children: [children, /* @__PURE__ */ jsx(Tooltip.Root, {
31
+ handle,
32
+ onOpenChange: handleOpenChange,
33
+ children: ({ payload }) => {
34
+ const item = payload ?? null;
35
+ activeItemRef.current = item;
36
+ if (!item || item.title == null && !item.hotkey) return null;
37
+ const arrow = item.arrow ?? true;
38
+ const placement = item.placement ?? "top";
39
+ const placementConfig = placementMap[placement] ?? placementMap.top;
40
+ const baseSideOffset = arrow ? 8 : 6;
41
+ const resolvedClassNames = {
42
+ arrow: cx(styles.arrow, item.classNames?.arrow),
43
+ popup: cx(styles.popup, item.className, item.classNames?.root, item.classNames?.container),
44
+ positioner: styles.positioner,
45
+ viewport: cx(styles.viewport, item.classNames?.content)
46
+ };
47
+ const resolvedStyleProps = (() => {
48
+ if (typeof item.styles === "function") return void 0;
49
+ return item.styles;
50
+ })();
51
+ const resolvedStyles = {
52
+ arrow: resolvedStyleProps?.arrow,
53
+ popup: {
54
+ ...resolvedStyleProps?.root,
55
+ ...resolvedStyleProps?.container
56
+ },
57
+ positioner: { zIndex: item.zIndex ?? 1100 },
58
+ viewport: resolvedStyleProps?.content
59
+ };
60
+ const body = layoutAnimation ? /* @__PURE__ */ jsx(Tooltip.Viewport, {
61
+ className: resolvedClassNames.viewport,
62
+ style: resolvedStyles.viewport,
63
+ children: /* @__PURE__ */ jsx(TooltipContent_default, {
64
+ hotkey: item.hotkey,
65
+ hotkeyProps: item.hotkeyProps,
66
+ title: item.title
67
+ })
68
+ }) : /* @__PURE__ */ jsx("div", {
69
+ className: resolvedClassNames.viewport,
70
+ style: resolvedStyles.viewport,
71
+ children: /* @__PURE__ */ jsx(TooltipContent_default, {
72
+ hotkey: item.hotkey,
73
+ hotkeyProps: item.hotkeyProps,
74
+ title: item.title
75
+ })
76
+ });
77
+ const popup = /* @__PURE__ */ jsx(Tooltip.Positioner, {
78
+ align: placementConfig.align,
79
+ className: resolvedClassNames.positioner,
80
+ "data-placement": placement,
81
+ side: placementConfig.side,
82
+ sideOffset: baseSideOffset,
83
+ style: resolvedStyles.positioner,
84
+ children: /* @__PURE__ */ jsxs(Tooltip.Popup, {
85
+ className: resolvedClassNames.popup,
86
+ style: resolvedStyles.popup,
87
+ children: [arrow && /* @__PURE__ */ jsx(Tooltip.Arrow, {
88
+ className: resolvedClassNames.arrow,
89
+ style: resolvedStyles.arrow,
90
+ children: TooltipArrowIcon
91
+ }), body]
92
+ })
93
+ });
94
+ return item.portalled ?? true ? portalContainer ? /* @__PURE__ */ jsx(Tooltip.Portal, {
95
+ container: portalContainer,
96
+ children: popup
97
+ }) : null : popup;
98
+ }
99
+ }, updateKey)]
189
100
  })
190
101
  });
191
102
  };
103
+ TooltipGroup.displayName = "TooltipGroup";
192
104
  var TooltipGroup_default = TooltipGroup;
193
105
 
194
106
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"TooltipGroup.mjs","names":["TooltipGroup: FC<TooltipGroupProps>","arrowMiddleware","TooltipFloating","TooltipPortal"],"sources":["../../src/Tooltip/TooltipGroup.tsx"],"sourcesContent":["'use client';\n\nimport {\n arrow as arrowMiddleware,\n autoUpdate,\n flip,\n offset,\n shift,\n useFloating,\n} from '@floating-ui/react';\nimport { type FC, type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { toFloatingUIPlacement } from '@/utils/placement';\n\nimport TooltipFloating from './TooltipFloating';\nimport TooltipPortal from './TooltipPortal';\nimport {\n TooltipGroupApiContext,\n type TooltipGroupItem,\n TooltipGroupPropsContext,\n type TooltipGroupSharedProps,\n} from './groupContext';\nimport { isElementHidden, observeElementVisibility } from './utils';\n\ntype TooltipGroupProps = TooltipGroupSharedProps & {\n children: ReactNode;\n};\n\nconst TooltipGroup: FC<TooltipGroupProps> = ({\n children,\n layoutAnimation = true,\n ...sharedProps\n}) => {\n const arrowRef = useRef<SVGSVGElement | null>(null);\n const openTimerRef = useRef<number | null>(null);\n const closeTimerRef = useRef<number | null>(null);\n\n const [active, setActive] = useState<{\n item: TooltipGroupItem;\n triggerEl: HTMLElement;\n } | null>(null);\n const [open, setOpen] = useState(false);\n const activeRef = useRef<typeof active>(null);\n\n useEffect(() => {\n activeRef.current = active;\n }, [active]);\n\n const floatingPlacement = useMemo(\n () => toFloatingUIPlacement(active?.item.placement),\n [active?.item.placement],\n );\n\n const middleware = useMemo(() => {\n const base = [offset(8), flip(), shift({ padding: 8 })];\n if (active?.item.arrow) base.push(arrowMiddleware({ element: arrowRef }));\n return base;\n }, [active?.item.arrow]);\n\n const { context, floatingStyles, refs } = useFloating({\n middleware,\n open,\n placement: floatingPlacement,\n whileElementsMounted: autoUpdate,\n });\n\n useEffect(() => {\n if (!active?.triggerEl) return;\n refs.setReference(active.triggerEl);\n }, [active?.triggerEl, refs]);\n\n const clearTimers = useCallback(() => {\n if (openTimerRef.current) window.clearTimeout(openTimerRef.current);\n if (closeTimerRef.current) window.clearTimeout(closeTimerRef.current);\n openTimerRef.current = null;\n closeTimerRef.current = null;\n }, []);\n\n const closeImmediately = useCallback(() => {\n clearTimers();\n setOpen(false);\n activeRef.current?.item.onOpenChange?.(false);\n }, [clearTimers]);\n\n const destroyActive = useCallback(() => {\n clearTimers();\n setOpen(false);\n activeRef.current?.item.onOpenChange?.(false);\n setActive(null);\n }, [clearTimers]);\n\n const isActiveTrigger = useCallback((triggerEl: HTMLElement) => {\n return Boolean(activeRef.current && activeRef.current.triggerEl === triggerEl);\n }, []);\n\n const closeFromTrigger = useCallback(\n (triggerEl: HTMLElement, item: TooltipGroupItem) => {\n if (!activeRef.current || activeRef.current.triggerEl !== triggerEl) return;\n\n clearTimers();\n\n const delayMs =\n item.closeDelay ?? (item.mouseLeaveDelay !== undefined ? item.mouseLeaveDelay * 1000 : 100);\n if (delayMs <= 0) {\n setOpen(false);\n item.onOpenChange?.(false);\n return;\n }\n\n closeTimerRef.current = window.setTimeout(() => {\n setOpen(false);\n item.onOpenChange?.(false);\n }, delayMs);\n },\n [clearTimers],\n );\n\n const openFromTrigger = useCallback(\n (triggerEl: HTMLElement, item: TooltipGroupItem) => {\n if (!triggerEl) return;\n if (!item.title) return;\n if (item.disabled) return;\n\n clearTimers();\n\n if (isElementHidden(triggerEl)) {\n if (isActiveTrigger(triggerEl)) destroyActive();\n return;\n }\n\n setActive({ item, triggerEl });\n\n const delayMs =\n item.openDelay ?? (item.mouseEnterDelay !== undefined ? item.mouseEnterDelay * 1000 : 400);\n if (delayMs <= 0) {\n if (isElementHidden(triggerEl)) {\n destroyActive();\n return;\n }\n setOpen(true);\n item.onOpenChange?.(true);\n return;\n }\n\n openTimerRef.current = window.setTimeout(() => {\n if (isElementHidden(triggerEl)) {\n destroyActive();\n return;\n }\n setOpen(true);\n item.onOpenChange?.(true);\n }, delayMs);\n },\n [clearTimers, destroyActive, isActiveTrigger],\n );\n\n const groupApi = useMemo(\n () => ({ closeFromTrigger, closeImmediately, isActiveTrigger, openFromTrigger }),\n [closeFromTrigger, closeImmediately, isActiveTrigger, openFromTrigger],\n );\n\n useEffect(() => {\n if (!open) return;\n const triggerEl = active?.triggerEl;\n if (!triggerEl) return;\n\n if (isElementHidden(triggerEl)) {\n destroyActive();\n return;\n }\n\n const stopVisibilityObserver = observeElementVisibility(triggerEl, (visible) => {\n if (!visible) destroyActive();\n });\n\n const root = triggerEl.getRootNode?.();\n const observeTarget =\n typeof ShadowRoot !== 'undefined' && root instanceof ShadowRoot\n ? root\n : (triggerEl.ownerDocument ?? document);\n\n const observer = new MutationObserver(() => {\n if (isElementHidden(triggerEl)) destroyActive();\n });\n\n observer.observe(observeTarget, { childList: true, subtree: true });\n\n return () => {\n observer.disconnect();\n stopVisibilityObserver?.();\n };\n }, [active?.triggerEl, destroyActive, open]);\n\n useEffect(() => {\n return () => {\n clearTimers();\n };\n }, [clearTimers]);\n\n const portalRoot =\n active?.item.getPopupContainer && active?.triggerEl\n ? active.item.getPopupContainer(active.triggerEl)\n : undefined;\n\n const openRef = useRef(open);\n useEffect(() => {\n openRef.current = open;\n }, [open]);\n\n const isInitialShow = !openRef.current && open;\n\n const floatingNode = (\n <TooltipFloating\n arrow={active?.item.arrow}\n arrowRef={arrowRef}\n className={active?.item.className}\n classNames={active?.item.classNames}\n context={context}\n floatingStyles={floatingStyles}\n hotkey={active?.item.hotkey}\n hotkeyProps={active?.item.hotkeyProps}\n isInitialShow={isInitialShow}\n layoutAnimation={layoutAnimation}\n open={open}\n placement={floatingPlacement}\n setFloating={refs.setFloating}\n styles={active?.item.styles}\n title={active?.item.title}\n zIndex={active?.item.zIndex}\n />\n );\n\n return (\n <TooltipGroupApiContext.Provider value={groupApi}>\n <TooltipGroupPropsContext.Provider value={sharedProps}>\n {children}\n {active?.item.title &&\n !active.item.disabled &&\n ((active.item.portalled ?? true) ? (\n <TooltipPortal root={portalRoot}>{floatingNode}</TooltipPortal>\n ) : (\n floatingNode\n ))}\n </TooltipGroupPropsContext.Provider>\n </TooltipGroupApiContext.Provider>\n );\n};\n\nexport default TooltipGroup;\n"],"mappings":"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"}
1
+ {"version":3,"file":"TooltipGroup.mjs","names":["TooltipGroup: FC<TooltipGroupProps>","BaseTooltip","TooltipContent"],"sources":["../../src/Tooltip/TooltipGroup.tsx"],"sourcesContent":["'use client';\n\nimport { Tooltip as BaseTooltip } from '@base-ui/react/tooltip';\nimport { cx } from 'antd-style';\nimport { type FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { placementMap } from '@/utils/placement';\n\nimport { TooltipArrowIcon } from './ArrowIcon';\nimport TooltipContent from './TooltipContent';\nimport { useTooltipPortalContainer } from './TooltipPortal';\nimport {\n TooltipGroupHandleContext,\n type TooltipGroupItem,\n TooltipGroupPropsContext,\n} from './groupContext';\nimport { styles } from './style';\nimport type { TooltipGroupProps } from './type';\n\nconst TooltipGroup: FC<TooltipGroupProps> = ({\n children,\n layoutAnimation = false,\n ...sharedProps\n}) => {\n const handle = useMemo(() => BaseTooltip.createHandle<TooltipGroupItem>(), []);\n const activeItemRef = useRef<TooltipGroupItem | null>(null);\n\n const [updateKey, setUpdateKey] = useState(0);\n useEffect(() => {\n setUpdateKey((prev) => prev + 1);\n }, [handle]);\n\n const handleOpenChange = useCallback((open: boolean) => {\n activeItemRef.current?.onOpenChange?.(open);\n }, []);\n\n const portalContainer = useTooltipPortalContainer();\n\n return (\n <TooltipGroupHandleContext.Provider value={handle}>\n <TooltipGroupPropsContext.Provider value={sharedProps}>\n {children}\n <BaseTooltip.Root handle={handle} key={updateKey} onOpenChange={handleOpenChange}>\n {({ payload }) => {\n const item = (payload as TooltipGroupItem | null) ?? null;\n activeItemRef.current = item;\n\n // eslint-disable-next-line eqeqeq\n if (!item || (item.title == null && !item.hotkey)) return null;\n\n const arrow = item.arrow ?? true;\n const placement = item.placement ?? 'top';\n const placementConfig = placementMap[placement] ?? placementMap.top;\n const baseSideOffset = arrow ? 8 : 6;\n\n const resolvedClassNames = {\n arrow: cx(styles.arrow, item.classNames?.arrow),\n popup: cx(\n styles.popup,\n item.className,\n item.classNames?.root,\n item.classNames?.container,\n ),\n positioner: styles.positioner,\n viewport: cx(styles.viewport, item.classNames?.content),\n };\n\n const resolvedStyleProps = (() => {\n if (typeof item.styles === 'function') return undefined;\n return item.styles;\n })();\n\n const resolvedStyles = {\n arrow: resolvedStyleProps?.arrow,\n popup: {\n ...resolvedStyleProps?.root,\n ...resolvedStyleProps?.container,\n },\n positioner: {\n zIndex: item.zIndex ?? 1100,\n },\n viewport: resolvedStyleProps?.content,\n };\n\n const body = layoutAnimation ? (\n <BaseTooltip.Viewport\n className={resolvedClassNames.viewport}\n style={resolvedStyles.viewport}\n >\n <TooltipContent\n hotkey={item.hotkey}\n hotkeyProps={item.hotkeyProps}\n title={item.title}\n />\n </BaseTooltip.Viewport>\n ) : (\n <div className={resolvedClassNames.viewport} style={resolvedStyles.viewport}>\n <TooltipContent\n hotkey={item.hotkey}\n hotkeyProps={item.hotkeyProps}\n title={item.title}\n />\n </div>\n );\n\n const popup = (\n <BaseTooltip.Positioner\n align={placementConfig.align}\n className={resolvedClassNames.positioner}\n data-placement={placement}\n side={placementConfig.side}\n sideOffset={baseSideOffset}\n style={resolvedStyles.positioner}\n >\n <BaseTooltip.Popup\n className={resolvedClassNames.popup}\n style={resolvedStyles.popup}\n >\n {arrow && (\n <BaseTooltip.Arrow\n className={resolvedClassNames.arrow}\n style={resolvedStyles.arrow}\n >\n {TooltipArrowIcon}\n </BaseTooltip.Arrow>\n )}\n {body}\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n );\n\n const portalled = item.portalled ?? true;\n\n return portalled ? (\n portalContainer ? (\n <BaseTooltip.Portal container={portalContainer}>{popup}</BaseTooltip.Portal>\n ) : null\n ) : (\n popup\n );\n }}\n </BaseTooltip.Root>\n </TooltipGroupPropsContext.Provider>\n </TooltipGroupHandleContext.Provider>\n );\n};\n\nTooltipGroup.displayName = 'TooltipGroup';\n\nexport default TooltipGroup;\n"],"mappings":";;;;;;;;;;;;;;AAmBA,MAAMA,gBAAuC,EAC3C,UACA,kBAAkB,OAClB,GAAG,kBACC;CACJ,MAAM,SAAS,cAAcC,QAAY,cAAgC,EAAE,EAAE,CAAC;CAC9E,MAAM,gBAAgB,OAAgC,KAAK;CAE3D,MAAM,CAAC,WAAW,gBAAgB,SAAS,EAAE;AAC7C,iBAAgB;AACd,gBAAc,SAAS,OAAO,EAAE;IAC/B,CAAC,OAAO,CAAC;CAEZ,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;IAAwB,cAAc;eAC5D,EAAE,cAAc;KAChB,MAAM,OAAQ,WAAuC;AACrD,mBAAc,UAAU;AAGxB,SAAI,CAAC,QAAS,KAAK,SAAS,QAAQ,CAAC,KAAK,OAAS,QAAO;KAE1D,MAAM,QAAQ,KAAK,SAAS;KAC5B,MAAM,YAAY,KAAK,aAAa;KACpC,MAAM,kBAAkB,aAAa,cAAc,aAAa;KAChE,MAAM,iBAAiB,QAAQ,IAAI;KAEnC,MAAM,qBAAqB;MACzB,OAAO,GAAG,OAAO,OAAO,KAAK,YAAY,MAAM;MAC/C,OAAO,GACL,OAAO,OACP,KAAK,WACL,KAAK,YAAY,MACjB,KAAK,YAAY,UAClB;MACD,YAAY,OAAO;MACnB,UAAU,GAAG,OAAO,UAAU,KAAK,YAAY,QAAQ;MACxD;KAED,MAAM,4BAA4B;AAChC,UAAI,OAAO,KAAK,WAAW,WAAY,QAAO;AAC9C,aAAO,KAAK;SACV;KAEJ,MAAM,iBAAiB;MACrB,OAAO,oBAAoB;MAC3B,OAAO;OACL,GAAG,oBAAoB;OACvB,GAAG,oBAAoB;OACxB;MACD,YAAY,EACV,QAAQ,KAAK,UAAU,MACxB;MACD,UAAU,oBAAoB;MAC/B;KAED,MAAM,OAAO,kBACX,oBAACA,QAAY;MACX,WAAW,mBAAmB;MAC9B,OAAO,eAAe;gBAEtB,oBAACC;OACC,QAAQ,KAAK;OACb,aAAa,KAAK;OAClB,OAAO,KAAK;QACZ;OACmB,GAEvB,oBAAC;MAAI,WAAW,mBAAmB;MAAU,OAAO,eAAe;gBACjE,oBAACA;OACC,QAAQ,KAAK;OACb,aAAa,KAAK;OAClB,OAAO,KAAK;QACZ;OACE;KAGR,MAAM,QACJ,oBAACD,QAAY;MACX,OAAO,gBAAgB;MACvB,WAAW,mBAAmB;MAC9B,kBAAgB;MAChB,MAAM,gBAAgB;MACtB,YAAY;MACZ,OAAO,eAAe;gBAEtB,qBAACA,QAAY;OACX,WAAW,mBAAmB;OAC9B,OAAO,eAAe;kBAErB,SACC,oBAACA,QAAY;QACX,WAAW,mBAAmB;QAC9B,OAAO,eAAe;kBAErB;SACiB,EAErB;QACiB;OACG;AAK3B,YAFkB,KAAK,aAAa,OAGlC,kBACE,oBAACA,QAAY;MAAO,WAAW;gBAAkB;OAA2B,GAC1E,OAEJ;;MAhGiC,UAmGpB;IACe;GACD;;AAIzC,aAAa,cAAc;AAE3B,2BAAe"}
@@ -1,62 +1,64 @@
1
1
  'use client';
2
2
 
3
- import { composeEventHandlers } from "../utils/composeEventHandlers.mjs";
4
- import { TooltipGroupApiContext } from "./groupContext.mjs";
3
+ import { useNativeButton } from "../hooks/useNativeButton.mjs";
4
+ import { TooltipGroupHandleContext } from "./groupContext.mjs";
5
5
  import { useMergedTooltipProps } from "./useMergedTooltipProps.mjs";
6
- import { useTooltipTrigger } from "./useTooltipTrigger.mjs";
7
- import { cloneElement, isValidElement, useContext, useEffect, useMemo, useRef } from "react";
6
+ import { cloneElement, isValidElement, useContext, useMemo } from "react";
7
+ import { jsx } from "react/jsx-runtime";
8
+ import { mergeProps } from "@base-ui/react/merge-props";
9
+ import { Tooltip } from "@base-ui/react/tooltip";
8
10
  import { mergeRefs } from "react-merge-refs";
9
11
 
10
12
  //#region src/Tooltip/TooltipInGroup.tsx
11
- const TooltipInGroup = ({ ref, children, ...props }) => {
12
- const group = useContext(TooltipGroupApiContext);
13
- const triggerElRef = useRef(null);
13
+ const DEFAULT_OPEN_DELAY = 400;
14
+ const DEFAULT_CLOSE_DELAY = 100;
15
+ const TooltipInGroup = ({ children, ref: refProp, ...props }) => {
16
+ const group = useContext(TooltipGroupHandleContext);
14
17
  const item = useMergedTooltipProps(props);
15
- const trigger = useTooltipTrigger(children);
16
- const referenceNode = useMemo(() => {
17
- if (!isValidElement(trigger)) return trigger;
18
- const originalRef = trigger.ref;
19
- const triggerProps = trigger.props || {};
20
- const setTriggerEl = (node) => {
21
- triggerElRef.current = node instanceof HTMLElement ? node : null;
22
- };
23
- return cloneElement(trigger, {
24
- ...triggerProps,
25
- onBlur: composeEventHandlers(triggerProps.onBlur, (e) => {
26
- group?.closeFromTrigger(e.currentTarget, item);
27
- }),
28
- onFocus: composeEventHandlers(triggerProps.onFocus, (e) => {
29
- group?.openFromTrigger(e.currentTarget, item);
30
- }),
31
- onKeyDown: composeEventHandlers(triggerProps.onKeyDown, (e) => {
32
- if (e?.key === "Escape") group?.closeImmediately();
33
- }),
34
- onPointerEnter: composeEventHandlers(triggerProps.onPointerEnter, (e) => {
35
- group?.openFromTrigger(e.currentTarget, item);
36
- }),
37
- onPointerLeave: composeEventHandlers(triggerProps.onPointerLeave, (e) => {
38
- group?.closeFromTrigger(e.currentTarget, item);
39
- }),
40
- ref: mergeRefs([
41
- originalRef,
42
- setTriggerEl,
43
- ref
44
- ])
45
- });
46
- }, [
47
- group,
48
- item,
49
- ref,
50
- trigger
51
- ]);
52
- useEffect(() => {
53
- return () => {
54
- if (!group) return;
55
- const el = triggerElRef.current;
56
- if (el && group.isActiveTrigger(el)) group.closeImmediately();
57
- };
58
- }, [group]);
59
- return referenceNode;
18
+ const resolvedOpenDelay = useMemo(() => {
19
+ if (item.openDelay !== void 0) return item.openDelay;
20
+ if (item.mouseEnterDelay !== void 0) return item.mouseEnterDelay * 1e3;
21
+ return DEFAULT_OPEN_DELAY;
22
+ }, [item.mouseEnterDelay, item.openDelay]);
23
+ const resolvedCloseDelay = useMemo(() => {
24
+ if (item.closeDelay !== void 0) return item.closeDelay;
25
+ if (item.mouseLeaveDelay !== void 0) return item.mouseLeaveDelay * 1e3;
26
+ return DEFAULT_CLOSE_DELAY;
27
+ }, [item.closeDelay, item.mouseLeaveDelay]);
28
+ const disabled = Boolean(item.disabled);
29
+ const { isNativeButtonTriggerElement } = useNativeButton({ children });
30
+ if (item.title == null && !item.hotkey) return children;
31
+ const triggerProps = {
32
+ closeDelay: resolvedCloseDelay,
33
+ delay: resolvedOpenDelay,
34
+ disabled,
35
+ payload: item
36
+ };
37
+ if (isValidElement(children)) return /* @__PURE__ */ jsx(Tooltip.Trigger, {
38
+ handle: group ?? void 0,
39
+ ...triggerProps,
40
+ render: (renderProps) => {
41
+ const resolvedProps = (() => {
42
+ if (isNativeButtonTriggerElement) return renderProps;
43
+ const { type, ref: triggerRef, ...restProps } = renderProps;
44
+ return restProps;
45
+ })();
46
+ return cloneElement(children, {
47
+ ...mergeProps(children.props, resolvedProps),
48
+ ref: mergeRefs([
49
+ children.ref,
50
+ renderProps.ref,
51
+ refProp
52
+ ])
53
+ });
54
+ }
55
+ });
56
+ return /* @__PURE__ */ jsx(Tooltip.Trigger, {
57
+ handle: group ?? void 0,
58
+ ...triggerProps,
59
+ ref: refProp,
60
+ children
61
+ });
60
62
  };
61
63
  TooltipInGroup.displayName = "TooltipInGroup";
62
64
 
@@ -1 +1 @@
1
- {"version":3,"file":"TooltipInGroup.mjs","names":["TooltipInGroup: FC<TooltipProps>","triggerProps: any"],"sources":["../../src/Tooltip/TooltipInGroup.tsx"],"sourcesContent":["'use client';\n\nimport {\n type FC,\n type ReactNode,\n cloneElement,\n isValidElement,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\nimport { mergeRefs } from 'react-merge-refs';\n\nimport { composeEventHandlers } from '@/utils/composeEventHandlers';\n\nimport { TooltipGroupApiContext } from './groupContext';\nimport type { TooltipProps } from './type';\nimport { useMergedTooltipProps } from './useMergedTooltipProps';\nimport { useTooltipTrigger } from './useTooltipTrigger';\n\nexport const TooltipInGroup: FC<TooltipProps> = ({ ref, children, ...props }) => {\n const group = useContext(TooltipGroupApiContext);\n const triggerElRef = useRef<HTMLElement | null>(null);\n const item = useMergedTooltipProps(props);\n const trigger = useTooltipTrigger(children);\n\n const referenceNode = useMemo(() => {\n if (!isValidElement(trigger)) return trigger;\n\n const originalRef = (trigger as any).ref;\n const triggerProps: any = trigger.props || {};\n\n const setTriggerEl = (node: any) => {\n triggerElRef.current = node instanceof HTMLElement ? node : null;\n };\n\n return cloneElement(trigger as any, {\n ...triggerProps,\n onBlur: composeEventHandlers(triggerProps.onBlur, (e: any) => {\n group?.closeFromTrigger(e.currentTarget as HTMLElement, item);\n }),\n onFocus: composeEventHandlers(triggerProps.onFocus, (e: any) => {\n group?.openFromTrigger(e.currentTarget as HTMLElement, item);\n }),\n onKeyDown: composeEventHandlers(triggerProps.onKeyDown, (e: any) => {\n if (e?.key === 'Escape') group?.closeImmediately();\n }),\n onPointerEnter: composeEventHandlers(triggerProps.onPointerEnter, (e: any) => {\n group?.openFromTrigger(e.currentTarget as HTMLElement, item);\n }),\n onPointerLeave: composeEventHandlers(triggerProps.onPointerLeave, (e: any) => {\n group?.closeFromTrigger(e.currentTarget as HTMLElement, item);\n }),\n ref: mergeRefs([originalRef, setTriggerEl, ref]),\n });\n }, [group, item, ref, trigger]);\n\n // Close when the trigger is swapped out or disconnected.\n useEffect(() => {\n return () => {\n if (!group) return;\n const el = triggerElRef.current;\n if (el && group.isActiveTrigger(el)) group.closeImmediately();\n };\n }, [group]);\n\n return referenceNode as ReactNode;\n};\n\nTooltipInGroup.displayName = 'TooltipInGroup';\n"],"mappings":";;;;;;;;;;AAqBA,MAAaA,kBAAoC,EAAE,KAAK,UAAU,GAAG,YAAY;CAC/E,MAAM,QAAQ,WAAW,uBAAuB;CAChD,MAAM,eAAe,OAA2B,KAAK;CACrD,MAAM,OAAO,sBAAsB,MAAM;CACzC,MAAM,UAAU,kBAAkB,SAAS;CAE3C,MAAM,gBAAgB,cAAc;AAClC,MAAI,CAAC,eAAe,QAAQ,CAAE,QAAO;EAErC,MAAM,cAAe,QAAgB;EACrC,MAAMC,eAAoB,QAAQ,SAAS,EAAE;EAE7C,MAAM,gBAAgB,SAAc;AAClC,gBAAa,UAAU,gBAAgB,cAAc,OAAO;;AAG9D,SAAO,aAAa,SAAgB;GAClC,GAAG;GACH,QAAQ,qBAAqB,aAAa,SAAS,MAAW;AAC5D,WAAO,iBAAiB,EAAE,eAA8B,KAAK;KAC7D;GACF,SAAS,qBAAqB,aAAa,UAAU,MAAW;AAC9D,WAAO,gBAAgB,EAAE,eAA8B,KAAK;KAC5D;GACF,WAAW,qBAAqB,aAAa,YAAY,MAAW;AAClE,QAAI,GAAG,QAAQ,SAAU,QAAO,kBAAkB;KAClD;GACF,gBAAgB,qBAAqB,aAAa,iBAAiB,MAAW;AAC5E,WAAO,gBAAgB,EAAE,eAA8B,KAAK;KAC5D;GACF,gBAAgB,qBAAqB,aAAa,iBAAiB,MAAW;AAC5E,WAAO,iBAAiB,EAAE,eAA8B,KAAK;KAC7D;GACF,KAAK,UAAU;IAAC;IAAa;IAAc;IAAI,CAAC;GACjD,CAAC;IACD;EAAC;EAAO;EAAM;EAAK;EAAQ,CAAC;AAG/B,iBAAgB;AACd,eAAa;AACX,OAAI,CAAC,MAAO;GACZ,MAAM,KAAK,aAAa;AACxB,OAAI,MAAM,MAAM,gBAAgB,GAAG,CAAE,OAAM,kBAAkB;;IAE9D,CAAC,MAAM,CAAC;AAEX,QAAO;;AAGT,eAAe,cAAc"}
1
+ {"version":3,"file":"TooltipInGroup.mjs","names":["TooltipInGroup: FC<TooltipProps>","BaseTooltip"],"sources":["../../src/Tooltip/TooltipInGroup.tsx"],"sourcesContent":["'use client';\n\nimport { mergeProps } from '@base-ui/react/merge-props';\nimport { Tooltip as BaseTooltip } from '@base-ui/react/tooltip';\nimport { type FC, cloneElement, isValidElement, useContext, useMemo } from 'react';\nimport { mergeRefs } from 'react-merge-refs';\n\nimport { useNativeButton } from '@/hooks/useNativeButton';\n\nimport { TooltipGroupHandleContext } from './groupContext';\nimport type { TooltipProps } from './type';\nimport { useMergedTooltipProps } from './useMergedTooltipProps';\n\nconst DEFAULT_OPEN_DELAY = 400;\nconst DEFAULT_CLOSE_DELAY = 100;\n\nexport const TooltipInGroup: FC<TooltipProps> = ({ children, ref: refProp, ...props }) => {\n const group = useContext(TooltipGroupHandleContext);\n const item = useMergedTooltipProps(props);\n\n const resolvedOpenDelay = useMemo(() => {\n if (item.openDelay !== undefined) return item.openDelay;\n if (item.mouseEnterDelay !== undefined) return item.mouseEnterDelay * 1000;\n return DEFAULT_OPEN_DELAY;\n }, [item.mouseEnterDelay, item.openDelay]);\n\n const resolvedCloseDelay = useMemo(() => {\n if (item.closeDelay !== undefined) return item.closeDelay;\n if (item.mouseLeaveDelay !== undefined) return item.mouseLeaveDelay * 1000;\n return DEFAULT_CLOSE_DELAY;\n }, [item.closeDelay, item.mouseLeaveDelay]);\n\n const disabled = Boolean(item.disabled);\n\n const { isNativeButtonTriggerElement } = useNativeButton({\n children,\n });\n\n // Don't render trigger behavior if no content\n // eslint-disable-next-line eqeqeq\n if (item.title == null && !item.hotkey) {\n return children as any;\n }\n\n const triggerProps = {\n closeDelay: resolvedCloseDelay,\n delay: resolvedOpenDelay,\n disabled,\n payload: item,\n };\n\n if (isValidElement(children)) {\n return (\n <BaseTooltip.Trigger\n handle={group ?? undefined}\n {...triggerProps}\n render={(renderProps) => {\n // Base UI's trigger props include `type=\"button\"` by default.\n // If we render into a non-<button> element, that prop is invalid and can warn.\n const resolvedProps = (() => {\n if (isNativeButtonTriggerElement) return renderProps as any;\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 return restProps;\n })();\n\n const mergedProps = mergeProps((children as any).props, resolvedProps);\n return cloneElement(children as any, {\n ...mergedProps,\n ref: mergeRefs([(children as any).ref, (renderProps as any).ref, refProp]),\n });\n }}\n />\n );\n }\n\n return (\n <BaseTooltip.Trigger handle={group ?? undefined} {...triggerProps} ref={refProp}>\n {children}\n </BaseTooltip.Trigger>\n );\n};\n\nTooltipInGroup.displayName = 'TooltipInGroup';\n"],"mappings":";;;;;;;;;;;;AAaA,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;AAE5B,MAAaA,kBAAoC,EAAE,UAAU,KAAK,SAAS,GAAG,YAAY;CACxF,MAAM,QAAQ,WAAW,0BAA0B;CACnD,MAAM,OAAO,sBAAsB,MAAM;CAEzC,MAAM,oBAAoB,cAAc;AACtC,MAAI,KAAK,cAAc,OAAW,QAAO,KAAK;AAC9C,MAAI,KAAK,oBAAoB,OAAW,QAAO,KAAK,kBAAkB;AACtE,SAAO;IACN,CAAC,KAAK,iBAAiB,KAAK,UAAU,CAAC;CAE1C,MAAM,qBAAqB,cAAc;AACvC,MAAI,KAAK,eAAe,OAAW,QAAO,KAAK;AAC/C,MAAI,KAAK,oBAAoB,OAAW,QAAO,KAAK,kBAAkB;AACtE,SAAO;IACN,CAAC,KAAK,YAAY,KAAK,gBAAgB,CAAC;CAE3C,MAAM,WAAW,QAAQ,KAAK,SAAS;CAEvC,MAAM,EAAE,iCAAiC,gBAAgB,EACvD,UACD,CAAC;AAIF,KAAI,KAAK,SAAS,QAAQ,CAAC,KAAK,OAC9B,QAAO;CAGT,MAAM,eAAe;EACnB,YAAY;EACZ,OAAO;EACP;EACA,SAAS;EACV;AAED,KAAI,eAAe,SAAS,CAC1B,QACE,oBAACC,QAAY;EACX,QAAQ,SAAS;EACjB,GAAI;EACJ,SAAS,gBAAgB;GAGvB,MAAM,uBAAuB;AAC3B,QAAI,6BAA8B,QAAO;IAEzC,MAAM,EAAE,MAAM,KAAK,YAAY,GAAG,cAAc;AAChD,WAAO;OACL;AAGJ,UAAO,aAAa,UAAiB;IACnC,GAFkB,WAAY,SAAiB,OAAO,cAAc;IAGpE,KAAK,UAAU;KAAE,SAAiB;KAAM,YAAoB;KAAK;KAAQ,CAAC;IAC3E,CAAC;;GAEJ;AAIN,QACE,oBAACA,QAAY;EAAQ,QAAQ,SAAS;EAAW,GAAI;EAAc,KAAK;EACrE;GACmB;;AAI1B,eAAe,cAAc"}
@@ -2,7 +2,6 @@
2
2
 
3
3
  import { LOBE_THEME_APP_ID } from "../ThemeProvider/constants.mjs";
4
4
  import { useEffect, useState } from "react";
5
- import { createPortal } from "react-dom";
6
5
 
7
6
  //#region src/Tooltip/TooltipPortal.tsx
8
7
  const PORTAL_ATTR = "data-lobe-ui-tooltip-portal";
@@ -31,18 +30,16 @@ const resolveRoot = (root) => {
31
30
  if (root) return root;
32
31
  return document.body;
33
32
  };
34
- const TooltipPortal = ({ children, root }) => {
33
+ const useTooltipPortalContainer = (root) => {
35
34
  const [container, setContainer] = useState(null);
36
35
  useEffect(() => {
37
36
  const resolved = resolveRoot(root);
38
37
  if (!resolved) return;
39
38
  setContainer(getOrCreateContainer(resolved));
40
- }, [root]);
41
- if (!container) return null;
42
- return createPortal(children, container);
39
+ }, [root, container?.isConnected]);
40
+ return container;
43
41
  };
44
- var TooltipPortal_default = TooltipPortal;
45
42
 
46
43
  //#endregion
47
- export { TooltipPortal_default as default };
44
+ export { useTooltipPortalContainer };
48
45
  //# sourceMappingURL=TooltipPortal.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TooltipPortal.mjs","names":[],"sources":["../../src/Tooltip/TooltipPortal.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { LOBE_THEME_APP_ID } from '@/ThemeProvider';\n\ntype TooltipPortalProps = {\n children: ReactNode;\n root?: HTMLElement | ShadowRoot | null;\n};\n\nconst PORTAL_ATTR = 'data-lobe-ui-tooltip-portal';\nconst TOOLTIP_CONTAINER_ATTR = 'data-lobe-ui-tooltip-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 // try ThemeProvider's App root\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 const themeApp = document.querySelector<HTMLElement>(`#${LOBE_THEME_APP_ID}`);\n if (themeApp) return themeApp;\n const tooltipContainer = document.querySelector<HTMLElement>(\n `[${TOOLTIP_CONTAINER_ATTR}=\"true\"]`,\n );\n if (tooltipContainer) return tooltipContainer;\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\nconst TooltipPortal = ({ children, root }: TooltipPortalProps) => {\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 if (!container) return null;\n return createPortal(children, container);\n};\n\nexport default TooltipPortal;\n"],"mappings":";;;;;;;AAaA,MAAM,cAAc;AACpB,MAAM,yBAAyB;AAG/B,MAAM,+BAAe,IAAI,SAA8B;AAEvD,MAAM,wBAAwB,SAAgD;CAE5E,MAAM,sBAAsB;AAC1B,MAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,MAAI,OAAO,eAAe,eAAe,gBAAgB,WAAY,QAAO;AAG5E,MAAI,EADW,SAAS,SAAS,MACpB,QAAO;EACpB,MAAM,WAAW,SAAS,cAA2B,IAAI,oBAAoB;AAC7E,MAAI,SAAU,QAAO;EACrB,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,MAAM,iBAAiB,EAAE,UAAU,WAA+B;CAChE,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,KAAI,CAAC,UAAW,QAAO;AACvB,QAAO,aAAa,UAAU,UAAU;;AAG1C,4BAAe"}
1
+ {"version":3,"file":"TooltipPortal.mjs","names":[],"sources":["../../src/Tooltip/TooltipPortal.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-tooltip-portal';\nexport const TOOLTIP_CONTAINER_ATTR = 'data-lobe-ui-tooltip-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 tooltipContainer = document.querySelector<HTMLElement>(\n `[${TOOLTIP_CONTAINER_ATTR}=\"true\"]`,\n );\n if (tooltipContainer) return tooltipContainer;\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 useTooltipPortalContainer = (\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, container?.isConnected]);\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,MAAM,WAAW,YAAY,CAAC;AAElC,QAAO"}