@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.
- package/es/Accordion/Accordion.d.mts +2 -2
- package/es/Accordion/AccordionItem.d.mts +2 -2
- package/es/ActionIcon/ActionIcon.d.mts +2 -2
- package/es/Alert/Alert.d.mts +2 -2
- package/es/Alert/Alert.mjs +1 -1
- package/es/Alert/Alert.mjs.map +1 -1
- package/es/Avatar/AvatarGroup/index.d.mts +2 -2
- package/es/Burger/Burger.d.mts +2 -2
- package/es/CodeEditor/CodeEditor.d.mts +2 -2
- package/es/Collapse/Collapse.d.mts +2 -2
- package/es/ConfigProvider/index.d.mts +2 -2
- package/es/ContextMenu/ContextMenuHost.d.mts +2 -2
- package/es/ContextMenu/ContextMenuHost.mjs +1 -1
- package/es/CopyButton/CopyButton.d.mts +2 -2
- package/es/DatePicker/DatePicker.d.mts +2 -2
- package/es/DraggablePanel/DraggablePanel.mjs +1 -1
- package/es/DraggablePanel/components/DraggablePanelBody.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelContainer.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelFooter.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelHeader.d.mts +2 -2
- package/es/DraggableSideNav/DraggableSideNav.d.mts +2 -2
- package/es/DraggableSideNav/DraggableSideNav.mjs +1 -1
- package/es/Drawer/Drawer.d.mts +2 -2
- package/es/Dropdown/Dropdown.d.mts +2 -2
- package/es/DropdownMenu/DropdownMenu.d.mts +2 -2
- package/es/DropdownMenu/DropdownMenu.mjs +3 -3
- package/es/EditableText/EditableText.d.mts +2 -2
- package/es/EmojiPicker/EmojiPicker.d.mts +2 -2
- package/es/Flex/FlexBasic.d.mts +2 -2
- package/es/FontLoader/index.d.mts +2 -2
- package/es/Footer/Footer.d.mts +2 -2
- package/es/Form/components/FormGroup.d.mts +2 -2
- package/es/Form/components/FormItem.d.mts +2 -2
- package/es/Form/components/FormSubmitFooter.d.mts +2 -2
- package/es/FormModal/FormModal.d.mts +2 -2
- package/es/Header/Header.d.mts +2 -2
- package/es/Highlighter/Highlighter.d.mts +2 -2
- package/es/Highlighter/SyntaxHighlighter/index.d.mts +2 -2
- package/es/Hotkey/Hotkey.d.mts +2 -2
- package/es/HotkeyInput/HotkeyInput.d.mts +2 -2
- package/es/Icon/Icon.d.mts +2 -2
- package/es/Icon/components/IconProvider.d.mts +3 -3
- package/es/Image/PreviewGroup.d.mts +2 -2
- package/es/ImageSelect/ImageSelect.d.mts +2 -2
- package/es/Input/Input.d.mts +2 -2
- package/es/Input/InputNumber.d.mts +2 -2
- package/es/Layout/components/LayoutFooter.d.mts +2 -2
- package/es/Layout/components/LayoutHeader.d.mts +2 -2
- package/es/Layout/components/LayoutMain.d.mts +2 -2
- package/es/Layout/components/LayoutSidebar.d.mts +2 -2
- package/es/Layout/components/LayoutSidebarInner.d.mts +2 -2
- package/es/Layout/components/LayoutToc.d.mts +2 -2
- package/es/List/ListItem/index.d.mts +2 -2
- package/es/Markdown/Markdown.d.mts +2 -2
- package/es/Markdown/Typography.d.mts +2 -2
- package/es/Markdown/components/SearchResultCards/index.d.mts +2 -2
- package/es/MaskShadow/MaskShadow.d.mts +2 -2
- package/es/Menu/Menu.d.mts +2 -2
- package/es/Mermaid/Mermaid.d.mts +2 -2
- package/es/Mermaid/SyntaxMermaid/index.d.mts +2 -2
- package/es/Modal/Modal.d.mts +2 -2
- package/es/Modal/ModalProvider.d.mts +2 -2
- package/es/MotionProvider/index.d.mts +2 -2
- package/es/Popover/Popover.mjs +1 -1
- package/es/Popover/Popover.mjs.map +1 -1
- package/es/Popover/PopoverGroup.mjs +6 -2
- package/es/Popover/PopoverGroup.mjs.map +1 -1
- package/es/Popover/PopoverInGroup.mjs +1 -1
- package/es/Popover/PopoverPortal.mjs +1 -1
- package/es/Popover/PopoverPortal.mjs.map +1 -1
- package/es/Popover/PopoverStandalone.mjs +2 -2
- package/es/Popover/context.d.mts +2 -2
- package/es/Popover/context.mjs +3 -1
- package/es/Popover/context.mjs.map +1 -1
- package/es/Popover/type.d.mts +4 -0
- package/es/SearchBar/SearchBar.d.mts +2 -2
- package/es/Segmented/Segmented.d.mts +2 -2
- package/es/Select/Select.d.mts +2 -2
- package/es/SideNav/SideNav.d.mts +2 -2
- package/es/SliderWithInput/SliderWithInput.d.mts +2 -2
- package/es/SortableList/components/DragHandle.d.mts +2 -2
- package/es/SortableList/components/SortableItem.d.mts +2 -2
- package/es/ThemeProvider/ThemeProvider.d.mts +2 -2
- package/es/Toc/Toc.d.mts +2 -2
- package/es/Tooltip/ArrowIcon.mjs +22 -0
- package/es/Tooltip/ArrowIcon.mjs.map +1 -0
- package/es/Tooltip/Tooltip.mjs +3 -3
- package/es/Tooltip/Tooltip.mjs.map +1 -1
- package/es/Tooltip/TooltipContent.mjs +24 -0
- package/es/Tooltip/TooltipContent.mjs.map +1 -0
- package/es/Tooltip/TooltipGroup.d.mts +2 -5
- package/es/Tooltip/TooltipGroup.mjs +90 -178
- package/es/Tooltip/TooltipGroup.mjs.map +1 -1
- package/es/Tooltip/TooltipInGroup.mjs +54 -52
- package/es/Tooltip/TooltipInGroup.mjs.map +1 -1
- package/es/Tooltip/TooltipPortal.mjs +4 -7
- package/es/Tooltip/TooltipPortal.mjs.map +1 -1
- package/es/Tooltip/TooltipStandalone.mjs +149 -83
- package/es/Tooltip/TooltipStandalone.mjs.map +1 -1
- package/es/Tooltip/groupContext.mjs +4 -2
- package/es/Tooltip/groupContext.mjs.map +1 -1
- package/es/Tooltip/index.d.mts +1 -1
- package/es/Tooltip/style.mjs +203 -32
- package/es/Tooltip/style.mjs.map +1 -1
- package/es/Tooltip/type.d.mts +30 -3
- package/es/Tooltip/useMergedTooltipProps.mjs +17 -6
- package/es/Tooltip/useMergedTooltipProps.mjs.map +1 -1
- package/es/Video/index.d.mts +2 -2
- package/es/awesome/AuroraBackground/AuroraBackground.d.mts +2 -2
- package/es/awesome/Giscus/Giscus.d.mts +2 -2
- package/es/awesome/GradientButton/GradientButton.d.mts +2 -2
- package/es/awesome/GridBackground/GridBackground.d.mts +2 -2
- package/es/awesome/GridBackground/GridBackground.mjs +1 -1
- package/es/awesome/GridBackground/GridShowcase.d.mts +2 -2
- package/es/awesome/Hero/Hero.d.mts +2 -2
- package/es/awesome/Spline/Spine.d.mts +2 -2
- package/es/awesome/Spotlight/Spotlight.d.mts +2 -2
- package/es/awesome/SpotlightCard/SpotlightCard.d.mts +2 -2
- package/es/awesome/TypewriterEffect/TypewriterEffect.d.mts +2 -2
- package/es/brand/LobeChat/index.d.mts +2 -2
- package/es/brand/LobeHub/index.d.mts +2 -2
- package/es/brand/LogoThree/LogoSpline.d.mts +2 -2
- package/es/brand/LogoThree/index.d.mts +2 -2
- package/es/chat/BackBottom/BackBottom.d.mts +2 -2
- package/es/chat/BackBottom/BackBottom.mjs +1 -1
- package/es/chat/ChatInputArea/components/ChatInputAreaInner.d.mts +2 -2
- package/es/chat/ChatList/ChatList.d.mts +2 -2
- package/es/chat/EditableMessage/EditableMessage.d.mts +2 -2
- package/es/chat/EditableMessageList/EditableMessageList.d.mts +2 -2
- package/es/chat/MessageInput/MessageInput.d.mts +2 -2
- package/es/chat/MessageModal/MessageModal.d.mts +2 -2
- package/es/color/ColorScales/index.d.mts +2 -2
- package/es/color/CssVar/index.d.mts +2 -2
- package/es/hooks/usePortalContainer.mjs +1 -1
- package/es/i18n/context.d.mts +2 -2
- package/es/icons/lucideExtra/BotPromptIcon.d.mts +2 -2
- package/es/icons/lucideExtra/CreateBotIcon.d.mts +2 -2
- package/es/icons/lucideExtra/DiscordIcon.d.mts +3 -3
- package/es/icons/lucideExtra/GlobeOffIcon.d.mts +2 -2
- package/es/icons/lucideExtra/GroupBotIcon.d.mts +3 -3
- package/es/icons/lucideExtra/GroupBotSquareIcon.d.mts +2 -2
- package/es/icons/lucideExtra/LeftClickIcon.d.mts +2 -2
- package/es/icons/lucideExtra/LeftDoubleClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/McpIcon.d.mts +3 -3
- package/es/icons/lucideExtra/ProviderIcon.d.mts +3 -3
- package/es/icons/lucideExtra/RightClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/RightDoubleClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/ShapesUploadIcon.d.mts +3 -3
- package/es/icons/lucideExtra/TreeDownRightIcon.d.mts +3 -3
- package/es/icons/lucideExtra/TreeUpDownRightIcon.d.mts +3 -3
- package/es/index.mjs +1 -1
- package/es/mdx/Mdx/index.d.mts +2 -2
- package/es/mobile/ChatInputArea/ChatInputArea.mjs +1 -1
- package/es/mobile/ChatInputArea/components/ChatSendButton.d.mts +2 -2
- package/es/mobile/TabBar/TabBar.d.mts +2 -2
- package/es/storybook/StoryBook/index.d.mts +2 -2
- package/es/utils/placement.d.mts +1 -1
- package/package.json +1 -1
- package/es/Tooltip/TooltipFloating.mjs +0 -119
- package/es/Tooltip/TooltipFloating.mjs.map +0 -1
- package/es/Tooltip/groupContext.d.mts +0 -14
- package/es/Tooltip/useTooltipFloating.mjs +0 -55
- package/es/Tooltip/useTooltipFloating.mjs.map +0 -1
- package/es/Tooltip/useTooltipReference.mjs +0 -56
- package/es/Tooltip/useTooltipReference.mjs.map +0 -1
- package/es/Tooltip/useTooltipTrigger.mjs +0 -18
- package/es/Tooltip/useTooltipTrigger.mjs.map +0 -1
- package/es/Tooltip/utils.mjs +0 -36
- package/es/Tooltip/utils.mjs.map +0 -1
- package/es/utils/composeEventHandlers.mjs +0 -28
- package/es/utils/composeEventHandlers.mjs.map +0 -1
|
@@ -1,194 +1,106 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
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 {
|
|
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 =
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
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
|
-
|
|
22
|
-
}, [
|
|
23
|
-
const
|
|
24
|
-
|
|
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
|
|
49
|
-
|
|
50
|
-
|
|
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,
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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 {
|
|
4
|
-
import {
|
|
3
|
+
import { useNativeButton } from "../hooks/useNativeButton.mjs";
|
|
4
|
+
import { TooltipGroupHandleContext } from "./groupContext.mjs";
|
|
5
5
|
import { useMergedTooltipProps } from "./useMergedTooltipProps.mjs";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
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
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
16
|
-
|
|
17
|
-
if (
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
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>","
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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"}
|