@lobehub/ui 4.12.1 → 4.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/Accordion/Accordion.d.mts +2 -2
- package/es/Accordion/AccordionItem.d.mts +2 -2
- package/es/ActionIcon/ActionIcon.d.mts +2 -2
- package/es/Alert/Alert.d.mts +2 -2
- package/es/AutoComplete/Select.d.mts +2 -2
- package/es/Avatar/AvatarGroup/index.d.mts +2 -2
- package/es/Burger/Burger.d.mts +2 -2
- package/es/CodeEditor/CodeEditor.d.mts +2 -2
- package/es/Collapse/Collapse.d.mts +2 -2
- package/es/ConfigProvider/index.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/GuideCard/GuideCard.d.mts +2 -2
- package/es/Header/Header.d.mts +2 -2
- package/es/Highlighter/Highlighter.d.mts +2 -2
- package/es/Highlighter/SyntaxHighlighter/index.d.mts +2 -2
- package/es/Hotkey/Hotkey.d.mts +2 -2
- package/es/HotkeyInput/HotkeyInput.d.mts +2 -2
- package/es/Icon/Icon.d.mts +2 -2
- package/es/Icon/components/IconProvider.d.mts +3 -3
- package/es/Image/PreviewGroup.d.mts +2 -2
- package/es/ImageSelect/ImageSelect.d.mts +2 -2
- package/es/Input/Input.d.mts +2 -2
- package/es/Input/InputNumber.d.mts +2 -2
- package/es/Input/InputOPT.d.mts +2 -2
- package/es/Input/InputPassword.d.mts +2 -2
- package/es/Input/TextArea.d.mts +2 -2
- package/es/Layout/components/LayoutFooter.d.mts +2 -2
- package/es/Layout/components/LayoutHeader.d.mts +2 -2
- package/es/Layout/components/LayoutMain.d.mts +2 -2
- package/es/Layout/components/LayoutSidebar.d.mts +2 -2
- package/es/Layout/components/LayoutSidebarInner.d.mts +2 -2
- package/es/Layout/components/LayoutToc.d.mts +2 -2
- package/es/List/ListItem/index.d.mts +2 -2
- package/es/Markdown/Markdown.d.mts +2 -2
- package/es/Markdown/Typography.d.mts +2 -2
- package/es/Markdown/components/CodeBlock.mjs +1 -1
- package/es/Markdown/components/CodeBlock.mjs.map +1 -1
- 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/BottomGradientButton/BottomGradientButton.d.mts +2 -2
- package/es/awesome/Features/Features.d.mts +2 -2
- package/es/awesome/Giscus/Giscus.d.mts +2 -2
- package/es/awesome/GradientButton/GradientButton.d.mts +2 -2
- package/es/awesome/GridBackground/GridBackground.d.mts +2 -2
- package/es/awesome/GridBackground/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.mjs +1 -1
- package/es/chat/ChatInputArea/components/ChatInputAreaInner.d.mts +2 -2
- package/es/chat/ChatItem/ChatItem.d.mts +2 -2
- package/es/chat/ChatList/ChatList.d.mts +2 -2
- package/es/chat/EditableMessage/EditableMessage.d.mts +2 -2
- package/es/chat/EditableMessageList/EditableMessageList.d.mts +2 -2
- package/es/chat/MessageInput/MessageInput.d.mts +2 -2
- package/es/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/GroupBotSquareIcon.d.mts +3 -3
- package/es/icons/lucideExtra/LeftClickIcon.d.mts +3 -3
- 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/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/mdx/mdxComponents/CodeBlock.mjs +3 -2
- package/es/mdx/mdxComponents/CodeBlock.mjs.map +1 -1
- package/es/mobile/ChatHeader/ChatHeaderTitle.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
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import Hotkey_default from "../Hotkey/Hotkey.mjs";
|
|
4
|
+
import { memo, useMemo } from "react";
|
|
5
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
|
|
7
|
+
//#region src/Tooltip/TooltipContent.tsx
|
|
8
|
+
const TooltipContent = memo(({ title, hotkey, hotkeyProps }) => {
|
|
9
|
+
const resolvedHotkeyProps = useMemo(() => ({
|
|
10
|
+
compact: true,
|
|
11
|
+
inverseTheme: true,
|
|
12
|
+
...hotkeyProps
|
|
13
|
+
}), [hotkeyProps]);
|
|
14
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [title, hotkey ? /* @__PURE__ */ jsx(Hotkey_default, {
|
|
15
|
+
keys: hotkey,
|
|
16
|
+
...resolvedHotkeyProps
|
|
17
|
+
}) : null] });
|
|
18
|
+
});
|
|
19
|
+
TooltipContent.displayName = "TooltipContent";
|
|
20
|
+
var TooltipContent_default = TooltipContent;
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
export { TooltipContent_default as default };
|
|
24
|
+
//# sourceMappingURL=TooltipContent.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TooltipContent.mjs","names":["Hotkey"],"sources":["../../src/Tooltip/TooltipContent.tsx"],"sourcesContent":["'use client';\n\nimport { type ReactNode, memo, useMemo } from 'react';\n\nimport Hotkey, { type HotkeyProps } from '@/Hotkey';\n\ntype TooltipContentProps = {\n hotkey?: string;\n hotkeyProps?: Omit<HotkeyProps, 'keys'>;\n title: ReactNode;\n};\n\nconst TooltipContent = memo<TooltipContentProps>(({ title, hotkey, hotkeyProps }) => {\n const resolvedHotkeyProps = useMemo(\n () => ({\n compact: true,\n inverseTheme: true,\n ...hotkeyProps,\n }),\n [hotkeyProps],\n );\n\n return (\n <>\n {title}\n {hotkey ? <Hotkey keys={hotkey} {...resolvedHotkeyProps} /> : null}\n </>\n );\n});\n\nTooltipContent.displayName = 'TooltipContent';\n\nexport default TooltipContent;\n"],"mappings":";;;;;;;AAYA,MAAM,iBAAiB,MAA2B,EAAE,OAAO,QAAQ,kBAAkB;CACnF,MAAM,sBAAsB,eACnB;EACL,SAAS;EACT,cAAc;EACd,GAAG;EACJ,GACD,CAAC,YAAY,CACd;AAED,QACE,8CACG,OACA,SAAS,oBAACA;EAAO,MAAM;EAAQ,GAAI;GAAuB,GAAG,QAC7D;EAEL;AAEF,eAAe,cAAc;AAE7B,6BAAe"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { FC
|
|
1
|
+
import { TooltipGroupProps } from "./type.mjs";
|
|
2
|
+
import { FC } from "react";
|
|
3
3
|
|
|
4
4
|
//#region src/Tooltip/TooltipGroup.d.ts
|
|
5
|
-
type TooltipGroupProps = TooltipGroupSharedProps & {
|
|
6
|
-
children: ReactNode;
|
|
7
|
-
};
|
|
8
5
|
declare const TooltipGroup: FC<TooltipGroupProps>;
|
|
9
6
|
//#endregion
|
|
10
7
|
export { TooltipGroup };
|
|
@@ -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":";;;;;;;;;;;;AA4BA,MAAMA,gBAAuC,EAC3C,UACA,kBAAkB,MAClB,GAAG,kBACC;CACJ,MAAM,WAAW,OAA6B,KAAK;CACnD,MAAM,eAAe,OAAsB,KAAK;CAChD,MAAM,gBAAgB,OAAsB,KAAK;CAEjD,MAAM,CAAC,QAAQ,aAAa,SAGlB,KAAK;CACf,MAAM,CAAC,MAAM,WAAW,SAAS,MAAM;CACvC,MAAM,YAAY,OAAsB,KAAK;AAE7C,iBAAgB;AACd,YAAU,UAAU;IACnB,CAAC,OAAO,CAAC;CAEZ,MAAM,oBAAoB,cAClB,sBAAsB,QAAQ,KAAK,UAAU,EACnD,CAAC,QAAQ,KAAK,UAAU,CACzB;CAQD,MAAM,EAAE,SAAS,gBAAgB,SAAS,YAAY;EACpD,YAPiB,cAAc;GAC/B,MAAM,OAAO;IAAC,OAAO,EAAE;IAAE,MAAM;IAAE,MAAM,EAAE,SAAS,GAAG,CAAC;IAAC;AACvD,OAAI,QAAQ,KAAK,MAAO,MAAK,KAAKC,MAAgB,EAAE,SAAS,UAAU,CAAC,CAAC;AACzE,UAAO;KACN,CAAC,QAAQ,KAAK,MAAM,CAAC;EAItB;EACA,WAAW;EACX,sBAAsB;EACvB,CAAC;AAEF,iBAAgB;AACd,MAAI,CAAC,QAAQ,UAAW;AACxB,OAAK,aAAa,OAAO,UAAU;IAClC,CAAC,QAAQ,WAAW,KAAK,CAAC;CAE7B,MAAM,cAAc,kBAAkB;AACpC,MAAI,aAAa,QAAS,QAAO,aAAa,aAAa,QAAQ;AACnE,MAAI,cAAc,QAAS,QAAO,aAAa,cAAc,QAAQ;AACrE,eAAa,UAAU;AACvB,gBAAc,UAAU;IACvB,EAAE,CAAC;CAEN,MAAM,mBAAmB,kBAAkB;AACzC,eAAa;AACb,UAAQ,MAAM;AACd,YAAU,SAAS,KAAK,eAAe,MAAM;IAC5C,CAAC,YAAY,CAAC;CAEjB,MAAM,gBAAgB,kBAAkB;AACtC,eAAa;AACb,UAAQ,MAAM;AACd,YAAU,SAAS,KAAK,eAAe,MAAM;AAC7C,YAAU,KAAK;IACd,CAAC,YAAY,CAAC;CAEjB,MAAM,kBAAkB,aAAa,cAA2B;AAC9D,SAAO,QAAQ,UAAU,WAAW,UAAU,QAAQ,cAAc,UAAU;IAC7E,EAAE,CAAC;CAEN,MAAM,mBAAmB,aACtB,WAAwB,SAA2B;AAClD,MAAI,CAAC,UAAU,WAAW,UAAU,QAAQ,cAAc,UAAW;AAErE,eAAa;EAEb,MAAM,UACJ,KAAK,eAAe,KAAK,oBAAoB,SAAY,KAAK,kBAAkB,MAAO;AACzF,MAAI,WAAW,GAAG;AAChB,WAAQ,MAAM;AACd,QAAK,eAAe,MAAM;AAC1B;;AAGF,gBAAc,UAAU,OAAO,iBAAiB;AAC9C,WAAQ,MAAM;AACd,QAAK,eAAe,MAAM;KACzB,QAAQ;IAEb,CAAC,YAAY,CACd;CAED,MAAM,kBAAkB,aACrB,WAAwB,SAA2B;AAClD,MAAI,CAAC,UAAW;AAChB,MAAI,CAAC,KAAK,MAAO;AACjB,MAAI,KAAK,SAAU;AAEnB,eAAa;AAEb,MAAI,gBAAgB,UAAU,EAAE;AAC9B,OAAI,gBAAgB,UAAU,CAAE,gBAAe;AAC/C;;AAGF,YAAU;GAAE;GAAM;GAAW,CAAC;EAE9B,MAAM,UACJ,KAAK,cAAc,KAAK,oBAAoB,SAAY,KAAK,kBAAkB,MAAO;AACxF,MAAI,WAAW,GAAG;AAChB,OAAI,gBAAgB,UAAU,EAAE;AAC9B,mBAAe;AACf;;AAEF,WAAQ,KAAK;AACb,QAAK,eAAe,KAAK;AACzB;;AAGF,eAAa,UAAU,OAAO,iBAAiB;AAC7C,OAAI,gBAAgB,UAAU,EAAE;AAC9B,mBAAe;AACf;;AAEF,WAAQ,KAAK;AACb,QAAK,eAAe,KAAK;KACxB,QAAQ;IAEb;EAAC;EAAa;EAAe;EAAgB,CAC9C;CAED,MAAM,WAAW,eACR;EAAE;EAAkB;EAAkB;EAAiB;EAAiB,GAC/E;EAAC;EAAkB;EAAkB;EAAiB;EAAgB,CACvE;AAED,iBAAgB;AACd,MAAI,CAAC,KAAM;EACX,MAAM,YAAY,QAAQ;AAC1B,MAAI,CAAC,UAAW;AAEhB,MAAI,gBAAgB,UAAU,EAAE;AAC9B,kBAAe;AACf;;EAGF,MAAM,yBAAyB,yBAAyB,YAAY,YAAY;AAC9E,OAAI,CAAC,QAAS,gBAAe;IAC7B;EAEF,MAAM,OAAO,UAAU,eAAe;EACtC,MAAM,gBACJ,OAAO,eAAe,eAAe,gBAAgB,aACjD,OACC,UAAU,iBAAiB;EAElC,MAAM,WAAW,IAAI,uBAAuB;AAC1C,OAAI,gBAAgB,UAAU,CAAE,gBAAe;IAC/C;AAEF,WAAS,QAAQ,eAAe;GAAE,WAAW;GAAM,SAAS;GAAM,CAAC;AAEnE,eAAa;AACX,YAAS,YAAY;AACrB,6BAA0B;;IAE3B;EAAC,QAAQ;EAAW;EAAe;EAAK,CAAC;AAE5C,iBAAgB;AACd,eAAa;AACX,gBAAa;;IAEd,CAAC,YAAY,CAAC;CAEjB,MAAM,aACJ,QAAQ,KAAK,qBAAqB,QAAQ,YACtC,OAAO,KAAK,kBAAkB,OAAO,UAAU,GAC/C;CAEN,MAAM,UAAU,OAAO,KAAK;AAC5B,iBAAgB;AACd,UAAQ,UAAU;IACjB,CAAC,KAAK,CAAC;CAEV,MAAM,gBAAgB,CAAC,QAAQ,WAAW;CAE1C,MAAM,eACJ,oBAACC;EACC,OAAO,QAAQ,KAAK;EACV;EACV,WAAW,QAAQ,KAAK;EACxB,YAAY,QAAQ,KAAK;EAChB;EACO;EAChB,QAAQ,QAAQ,KAAK;EACrB,aAAa,QAAQ,KAAK;EACX;EACE;EACX;EACN,WAAW;EACX,aAAa,KAAK;EAClB,QAAQ,QAAQ,KAAK;EACrB,OAAO,QAAQ,KAAK;EACpB,QAAQ,QAAQ,KAAK;GACrB;AAGJ,QACE,oBAAC,uBAAuB;EAAS,OAAO;YACtC,qBAAC,yBAAyB;GAAS,OAAO;cACvC,UACA,QAAQ,KAAK,SACZ,CAAC,OAAO,KAAK,aACX,OAAO,KAAK,aAAa,OACzB,oBAACC;IAAc,MAAM;cAAa;KAA6B,GAE/D;IAE8B;GACJ;;AAItC,2BAAe"}
|
|
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"}
|