@lobehub/ui 3.0.0 → 3.1.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/AccordionItem.js +1 -7
- package/es/ActionIcon/type.d.ts +1 -1
- package/es/Alert/Alert.js +10 -11
- package/es/Alert/style.js +1 -1
- package/es/Avatar/type.d.ts +1 -1
- package/es/Image/components/usePreview.js +26 -20
- package/es/Image/components/usePreviewGroup.js +13 -7
- package/es/Image/type.d.ts +2 -2
- package/es/Mermaid/SyntaxMermaid/index.js +1 -8
- package/es/Tabs/Tabs.js +12 -6
- package/es/Toc/TocMobile.js +1 -1
- package/es/Tooltip/Tooltip.d.ts +2 -2
- package/es/Tooltip/Tooltip.js +240 -33
- package/es/Tooltip/TooltipFloating.d.ts +30 -0
- package/es/Tooltip/TooltipFloating.js +135 -0
- package/es/Tooltip/TooltipGroup.d.ts +6 -0
- package/es/Tooltip/TooltipGroup.js +159 -0
- package/es/Tooltip/TooltipPortal.d.ts +7 -0
- package/es/Tooltip/TooltipPortal.js +46 -0
- package/es/Tooltip/antdPlacementToFloating.d.ts +9 -0
- package/es/Tooltip/antdPlacementToFloating.js +51 -0
- package/es/Tooltip/groupContext.d.ts +10 -0
- package/es/Tooltip/groupContext.js +2 -0
- package/es/Tooltip/index.d.ts +1 -0
- package/es/Tooltip/index.js +2 -1
- package/es/Tooltip/style.d.ts +2 -0
- package/es/Tooltip/style.js +5 -4
- package/es/Tooltip/type.d.ts +93 -5
- package/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/es/mdx/Mdx/index.js +1 -1
- package/es/motion/LazyMotion.d.ts +15 -0
- package/es/motion/LazyMotion.js +26 -0
- package/es/motion/index.d.ts +3 -0
- package/es/motion/index.js +3 -0
- package/es/motion/loadFeatures.d.ts +9 -0
- package/es/motion/loadFeatures.js +10 -0
- package/es/utils/composeEventHandlers.d.ts +19 -0
- package/es/utils/composeEventHandlers.js +26 -0
- package/package.json +1 -1
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { FloatingContext, Placement } from '@floating-ui/react';
|
|
2
|
+
import type { CSSProperties, ReactNode, RefObject } from 'react';
|
|
3
|
+
import type { TooltipProps } from './type';
|
|
4
|
+
type TooltipFloatingProps = {
|
|
5
|
+
arrow?: boolean;
|
|
6
|
+
arrowRef?: RefObject<SVGSVGElement | null>;
|
|
7
|
+
className?: TooltipProps['className'];
|
|
8
|
+
classNames?: TooltipProps['classNames'];
|
|
9
|
+
context?: FloatingContext;
|
|
10
|
+
floatingProps?: Record<string, any>;
|
|
11
|
+
floatingStyles: CSSProperties;
|
|
12
|
+
hotkey?: TooltipProps['hotkey'];
|
|
13
|
+
hotkeyProps?: TooltipProps['hotkeyProps'];
|
|
14
|
+
/**
|
|
15
|
+
* Enable Framer Motion layout/position tweening when provided.
|
|
16
|
+
* Useful for TooltipGroup where the floating position changes frequently.
|
|
17
|
+
*/
|
|
18
|
+
layoutId?: string;
|
|
19
|
+
open: boolean;
|
|
20
|
+
placement?: Placement;
|
|
21
|
+
setFloating: (node: HTMLElement | null) => void;
|
|
22
|
+
styles?: TooltipProps['styles'];
|
|
23
|
+
title?: ReactNode;
|
|
24
|
+
zIndex?: TooltipProps['zIndex'];
|
|
25
|
+
};
|
|
26
|
+
declare const TooltipFloating: {
|
|
27
|
+
({ open, title, placement, floatingStyles, setFloating, floatingProps, arrow, arrowRef, context, hotkey, hotkeyProps, layoutId, className, classNames, styles: styleProps, zIndex, }: TooltipFloatingProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
displayName: string;
|
|
29
|
+
};
|
|
30
|
+
export default TooltipFloating;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
4
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
5
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
6
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
7
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
8
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
9
|
+
import { FloatingArrow } from '@floating-ui/react';
|
|
10
|
+
import { useMemo } from 'react';
|
|
11
|
+
import { Flexbox } from 'react-layout-kit';
|
|
12
|
+
import Hotkey from "../Hotkey";
|
|
13
|
+
import { AnimatePresence, LazyMotion, m } from "../motion";
|
|
14
|
+
import { useStyles } from "./style";
|
|
15
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
16
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
17
|
+
var TooltipFloating = function TooltipFloating(_ref) {
|
|
18
|
+
var open = _ref.open,
|
|
19
|
+
title = _ref.title,
|
|
20
|
+
placement = _ref.placement,
|
|
21
|
+
floatingStyles = _ref.floatingStyles,
|
|
22
|
+
setFloating = _ref.setFloating,
|
|
23
|
+
floatingProps = _ref.floatingProps,
|
|
24
|
+
arrow = _ref.arrow,
|
|
25
|
+
arrowRef = _ref.arrowRef,
|
|
26
|
+
context = _ref.context,
|
|
27
|
+
hotkey = _ref.hotkey,
|
|
28
|
+
hotkeyProps = _ref.hotkeyProps,
|
|
29
|
+
layoutId = _ref.layoutId,
|
|
30
|
+
className = _ref.className,
|
|
31
|
+
classNames = _ref.classNames,
|
|
32
|
+
styleProps = _ref.styles,
|
|
33
|
+
zIndex = _ref.zIndex;
|
|
34
|
+
var _useStyles = useStyles(),
|
|
35
|
+
styles = _useStyles.styles,
|
|
36
|
+
cx = _useStyles.cx;
|
|
37
|
+
var transformOrigin = useMemo(function () {
|
|
38
|
+
var basePlacement = String(placement || 'top').split('-')[0];
|
|
39
|
+
switch (basePlacement) {
|
|
40
|
+
case 'top':
|
|
41
|
+
{
|
|
42
|
+
return 'bottom center';
|
|
43
|
+
}
|
|
44
|
+
case 'bottom':
|
|
45
|
+
{
|
|
46
|
+
return 'top center';
|
|
47
|
+
}
|
|
48
|
+
case 'left':
|
|
49
|
+
{
|
|
50
|
+
return 'center right';
|
|
51
|
+
}
|
|
52
|
+
case 'right':
|
|
53
|
+
{
|
|
54
|
+
return 'center left';
|
|
55
|
+
}
|
|
56
|
+
default:
|
|
57
|
+
{
|
|
58
|
+
return 'center';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}, [placement]);
|
|
62
|
+
return /*#__PURE__*/_jsx(LazyMotion, {
|
|
63
|
+
children: /*#__PURE__*/_jsx(AnimatePresence, {
|
|
64
|
+
children: open && title && /*#__PURE__*/_jsx(m.div, _objectSpread(_objectSpread({
|
|
65
|
+
animate: {
|
|
66
|
+
opacity: 1
|
|
67
|
+
},
|
|
68
|
+
className: cx(styles.tooltip, classNames === null || classNames === void 0 ? void 0 : classNames.container, classNames === null || classNames === void 0 ? void 0 : classNames.root, className),
|
|
69
|
+
exit: {
|
|
70
|
+
opacity: 0
|
|
71
|
+
},
|
|
72
|
+
initial: {
|
|
73
|
+
opacity: 0
|
|
74
|
+
},
|
|
75
|
+
ref: setFloating,
|
|
76
|
+
role: "tooltip",
|
|
77
|
+
style: styleProps !== null && styleProps !== void 0 && styleProps.root ? _objectSpread(_objectSpread(_objectSpread({}, floatingStyles), {}, {
|
|
78
|
+
zIndex: zIndex
|
|
79
|
+
}, styleProps.container), styleProps.root) : _objectSpread(_objectSpread({}, floatingStyles), {}, {
|
|
80
|
+
zIndex: zIndex
|
|
81
|
+
}, styleProps === null || styleProps === void 0 ? void 0 : styleProps.container),
|
|
82
|
+
transition: {
|
|
83
|
+
duration: 0.12,
|
|
84
|
+
ease: [0.4, 0, 0.2, 1]
|
|
85
|
+
}
|
|
86
|
+
}, floatingProps), {}, {
|
|
87
|
+
children: /*#__PURE__*/_jsxs(m.div, {
|
|
88
|
+
animate: {
|
|
89
|
+
scale: 1
|
|
90
|
+
},
|
|
91
|
+
exit: {
|
|
92
|
+
scale: 0.98
|
|
93
|
+
},
|
|
94
|
+
initial: {
|
|
95
|
+
scale: 0.96
|
|
96
|
+
},
|
|
97
|
+
layout: layoutId ? 'position' : undefined,
|
|
98
|
+
layoutId: layoutId,
|
|
99
|
+
style: {
|
|
100
|
+
transformOrigin: transformOrigin
|
|
101
|
+
},
|
|
102
|
+
transition: {
|
|
103
|
+
duration: 0.12,
|
|
104
|
+
ease: [0.4, 0, 0.2, 1]
|
|
105
|
+
},
|
|
106
|
+
children: [/*#__PURE__*/_jsx("div", {
|
|
107
|
+
className: cx(styles.content, classNames === null || classNames === void 0 ? void 0 : classNames.content),
|
|
108
|
+
style: styleProps === null || styleProps === void 0 ? void 0 : styleProps.content,
|
|
109
|
+
children: hotkey ? /*#__PURE__*/_jsxs(Flexbox, {
|
|
110
|
+
align: 'center',
|
|
111
|
+
gap: 8,
|
|
112
|
+
horizontal: true,
|
|
113
|
+
justify: 'space-between',
|
|
114
|
+
children: [/*#__PURE__*/_jsx("span", {
|
|
115
|
+
children: title
|
|
116
|
+
}), /*#__PURE__*/_jsx(Hotkey, _objectSpread({
|
|
117
|
+
inverseTheme: true,
|
|
118
|
+
keys: hotkey
|
|
119
|
+
}, hotkeyProps))]
|
|
120
|
+
}) : title
|
|
121
|
+
}), arrow && context && /*#__PURE__*/_jsx(FloatingArrow, {
|
|
122
|
+
className: cx(styles.arrow, classNames === null || classNames === void 0 ? void 0 : classNames.arrow),
|
|
123
|
+
context: context,
|
|
124
|
+
height: 6,
|
|
125
|
+
ref: arrowRef,
|
|
126
|
+
style: styleProps === null || styleProps === void 0 ? void 0 : styleProps.arrow,
|
|
127
|
+
width: 12
|
|
128
|
+
})]
|
|
129
|
+
})
|
|
130
|
+
}), "tooltip")
|
|
131
|
+
})
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
TooltipFloating.displayName = 'TooltipFloating';
|
|
135
|
+
export default TooltipFloating;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
4
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
5
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
6
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
7
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
8
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
9
|
+
import { arrow as arrowMiddleware, autoUpdate, flip, offset, shift, useFloating } from '@floating-ui/react';
|
|
10
|
+
import { memo, useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';
|
|
11
|
+
import { antdPlacementToFloating } from "./antdPlacementToFloating";
|
|
12
|
+
import TooltipFloating from "./TooltipFloating";
|
|
13
|
+
import TooltipPortal from "./TooltipPortal";
|
|
14
|
+
import { TooltipGroupContext } from "./groupContext";
|
|
15
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
16
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
17
|
+
var TooltipGroup = /*#__PURE__*/memo(function (_ref) {
|
|
18
|
+
var _active$item$portalle;
|
|
19
|
+
var children = _ref.children;
|
|
20
|
+
var arrowRef = useRef(null);
|
|
21
|
+
var openTimerRef = useRef(null);
|
|
22
|
+
var closeTimerRef = useRef(null);
|
|
23
|
+
var internalGroupId = useId();
|
|
24
|
+
var motionLayoutId = useMemo(function () {
|
|
25
|
+
return "lobe-ui-tooltip-group:".concat(internalGroupId);
|
|
26
|
+
}, [internalGroupId]);
|
|
27
|
+
var _useState = useState(null),
|
|
28
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
29
|
+
active = _useState2[0],
|
|
30
|
+
setActive = _useState2[1];
|
|
31
|
+
var _useState3 = useState(false),
|
|
32
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
33
|
+
open = _useState4[0],
|
|
34
|
+
setOpen = _useState4[1];
|
|
35
|
+
var activeRef = useRef(null);
|
|
36
|
+
useEffect(function () {
|
|
37
|
+
activeRef.current = active;
|
|
38
|
+
}, [active]);
|
|
39
|
+
var floatingPlacement = useMemo(function () {
|
|
40
|
+
return antdPlacementToFloating(active === null || active === void 0 ? void 0 : active.item.placement);
|
|
41
|
+
}, [active === null || active === void 0 ? void 0 : active.item.placement]);
|
|
42
|
+
var middleware = useMemo(function () {
|
|
43
|
+
var base = [offset(8), flip(), shift({
|
|
44
|
+
padding: 8
|
|
45
|
+
})];
|
|
46
|
+
if (active !== null && active !== void 0 && active.item.arrow) base.push(arrowMiddleware({
|
|
47
|
+
element: arrowRef
|
|
48
|
+
}));
|
|
49
|
+
return base;
|
|
50
|
+
}, [active === null || active === void 0 ? void 0 : active.item.arrow]);
|
|
51
|
+
var _useFloating = useFloating({
|
|
52
|
+
middleware: middleware,
|
|
53
|
+
open: open,
|
|
54
|
+
placement: floatingPlacement,
|
|
55
|
+
whileElementsMounted: autoUpdate
|
|
56
|
+
}),
|
|
57
|
+
context = _useFloating.context,
|
|
58
|
+
floatingStyles = _useFloating.floatingStyles,
|
|
59
|
+
refs = _useFloating.refs;
|
|
60
|
+
useEffect(function () {
|
|
61
|
+
if (!(active !== null && active !== void 0 && active.triggerEl)) return;
|
|
62
|
+
refs.setReference(active.triggerEl);
|
|
63
|
+
}, [active === null || active === void 0 ? void 0 : active.triggerEl, refs]);
|
|
64
|
+
var clearTimers = useCallback(function () {
|
|
65
|
+
if (openTimerRef.current) window.clearTimeout(openTimerRef.current);
|
|
66
|
+
if (closeTimerRef.current) window.clearTimeout(closeTimerRef.current);
|
|
67
|
+
openTimerRef.current = null;
|
|
68
|
+
closeTimerRef.current = null;
|
|
69
|
+
}, []);
|
|
70
|
+
var closeImmediately = useCallback(function () {
|
|
71
|
+
var _activeRef$current, _activeRef$current$it, _activeRef$current$it2;
|
|
72
|
+
clearTimers();
|
|
73
|
+
setOpen(false);
|
|
74
|
+
(_activeRef$current = activeRef.current) === null || _activeRef$current === void 0 || (_activeRef$current$it = (_activeRef$current$it2 = _activeRef$current.item).onOpenChange) === null || _activeRef$current$it === void 0 || _activeRef$current$it.call(_activeRef$current$it2, false);
|
|
75
|
+
}, [clearTimers]);
|
|
76
|
+
var isActiveTrigger = useCallback(function (triggerEl) {
|
|
77
|
+
return Boolean(activeRef.current && activeRef.current.triggerEl === triggerEl);
|
|
78
|
+
}, []);
|
|
79
|
+
var closeFromTrigger = useCallback(function (triggerEl, item) {
|
|
80
|
+
var _item$closeDelay, _item$mouseLeaveDelay;
|
|
81
|
+
if (!activeRef.current || activeRef.current.triggerEl !== triggerEl) return;
|
|
82
|
+
clearTimers();
|
|
83
|
+
var delayMs = (_item$closeDelay = item.closeDelay) !== null && _item$closeDelay !== void 0 ? _item$closeDelay : ((_item$mouseLeaveDelay = item.mouseLeaveDelay) !== null && _item$mouseLeaveDelay !== void 0 ? _item$mouseLeaveDelay : 0) * 1000;
|
|
84
|
+
if (delayMs <= 0) {
|
|
85
|
+
var _item$onOpenChange;
|
|
86
|
+
setOpen(false);
|
|
87
|
+
(_item$onOpenChange = item.onOpenChange) === null || _item$onOpenChange === void 0 || _item$onOpenChange.call(item, false);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
closeTimerRef.current = window.setTimeout(function () {
|
|
91
|
+
var _item$onOpenChange2;
|
|
92
|
+
setOpen(false);
|
|
93
|
+
(_item$onOpenChange2 = item.onOpenChange) === null || _item$onOpenChange2 === void 0 || _item$onOpenChange2.call(item, false);
|
|
94
|
+
}, delayMs);
|
|
95
|
+
}, [clearTimers]);
|
|
96
|
+
var openFromTrigger = useCallback(function (triggerEl, item) {
|
|
97
|
+
var _item$openDelay, _item$mouseEnterDelay;
|
|
98
|
+
if (!triggerEl) return;
|
|
99
|
+
if (!item.title) return;
|
|
100
|
+
if (item.disabled) return;
|
|
101
|
+
clearTimers();
|
|
102
|
+
setActive({
|
|
103
|
+
item: item,
|
|
104
|
+
triggerEl: triggerEl
|
|
105
|
+
});
|
|
106
|
+
var delayMs = (_item$openDelay = item.openDelay) !== null && _item$openDelay !== void 0 ? _item$openDelay : ((_item$mouseEnterDelay = item.mouseEnterDelay) !== null && _item$mouseEnterDelay !== void 0 ? _item$mouseEnterDelay : 0) * 1000;
|
|
107
|
+
if (delayMs <= 0) {
|
|
108
|
+
var _item$onOpenChange3;
|
|
109
|
+
setOpen(true);
|
|
110
|
+
(_item$onOpenChange3 = item.onOpenChange) === null || _item$onOpenChange3 === void 0 || _item$onOpenChange3.call(item, true);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
openTimerRef.current = window.setTimeout(function () {
|
|
114
|
+
var _item$onOpenChange4;
|
|
115
|
+
setOpen(true);
|
|
116
|
+
(_item$onOpenChange4 = item.onOpenChange) === null || _item$onOpenChange4 === void 0 || _item$onOpenChange4.call(item, true);
|
|
117
|
+
}, delayMs);
|
|
118
|
+
}, [clearTimers]);
|
|
119
|
+
var api = useMemo(function () {
|
|
120
|
+
return {
|
|
121
|
+
closeFromTrigger: closeFromTrigger,
|
|
122
|
+
closeImmediately: closeImmediately,
|
|
123
|
+
isActiveTrigger: isActiveTrigger,
|
|
124
|
+
openFromTrigger: openFromTrigger
|
|
125
|
+
};
|
|
126
|
+
}, [closeFromTrigger, closeImmediately, isActiveTrigger, openFromTrigger]);
|
|
127
|
+
useEffect(function () {
|
|
128
|
+
return function () {
|
|
129
|
+
clearTimers();
|
|
130
|
+
};
|
|
131
|
+
}, [clearTimers]);
|
|
132
|
+
var portalRoot = active !== null && active !== void 0 && active.item.getPopupContainer && active !== null && active !== void 0 && active.triggerEl ? active.item.getPopupContainer(active.triggerEl) : undefined;
|
|
133
|
+
var floatingNode = /*#__PURE__*/_jsx(TooltipFloating, {
|
|
134
|
+
arrow: active === null || active === void 0 ? void 0 : active.item.arrow,
|
|
135
|
+
arrowRef: arrowRef,
|
|
136
|
+
className: active === null || active === void 0 ? void 0 : active.item.className,
|
|
137
|
+
classNames: active === null || active === void 0 ? void 0 : active.item.classNames,
|
|
138
|
+
context: context,
|
|
139
|
+
floatingStyles: floatingStyles,
|
|
140
|
+
hotkey: active === null || active === void 0 ? void 0 : active.item.hotkey,
|
|
141
|
+
hotkeyProps: active === null || active === void 0 ? void 0 : active.item.hotkeyProps,
|
|
142
|
+
layoutId: motionLayoutId,
|
|
143
|
+
open: open,
|
|
144
|
+
placement: floatingPlacement,
|
|
145
|
+
setFloating: refs.setFloating,
|
|
146
|
+
styles: active === null || active === void 0 ? void 0 : active.item.styles,
|
|
147
|
+
title: active === null || active === void 0 ? void 0 : active.item.title,
|
|
148
|
+
zIndex: active === null || active === void 0 ? void 0 : active.item.zIndex
|
|
149
|
+
});
|
|
150
|
+
return /*#__PURE__*/_jsxs(TooltipGroupContext.Provider, {
|
|
151
|
+
value: api,
|
|
152
|
+
children: [children, (active === null || active === void 0 ? void 0 : active.item.title) && !active.item.disabled && (((_active$item$portalle = active.item.portalled) !== null && _active$item$portalle !== void 0 ? _active$item$portalle : true) ? /*#__PURE__*/_jsx(TooltipPortal, {
|
|
153
|
+
root: portalRoot,
|
|
154
|
+
children: floatingNode
|
|
155
|
+
}) : floatingNode)]
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
TooltipGroup.displayName = 'TooltipGroup';
|
|
159
|
+
export default TooltipGroup;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
type TooltipPortalProps = {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
root?: HTMLElement | ShadowRoot | null;
|
|
5
|
+
};
|
|
6
|
+
declare const TooltipPortal: ({ children, root }: TooltipPortalProps) => import("react").ReactPortal | null;
|
|
7
|
+
export default TooltipPortal;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
4
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
5
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
6
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
7
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
8
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
9
|
+
import { useState } from 'react';
|
|
10
|
+
import { createPortal } from 'react-dom';
|
|
11
|
+
var PORTAL_ATTR = 'data-lobe-ui-tooltip-portal';
|
|
12
|
+
|
|
13
|
+
// Reuse one portal container per root (document.body by default).
|
|
14
|
+
var containerMap = new WeakMap();
|
|
15
|
+
var getOrCreateContainer = function getOrCreateContainer(root) {
|
|
16
|
+
var cached = containerMap.get(root);
|
|
17
|
+
if (cached && cached.isConnected) return cached;
|
|
18
|
+
var el = document.createElement('div');
|
|
19
|
+
el.setAttribute(PORTAL_ATTR, 'true');
|
|
20
|
+
root.append(el);
|
|
21
|
+
containerMap.set(root, el);
|
|
22
|
+
return el;
|
|
23
|
+
};
|
|
24
|
+
var resolveRoot = function resolveRoot(root) {
|
|
25
|
+
if (root) return root;
|
|
26
|
+
if (typeof document === 'undefined') return null;
|
|
27
|
+
return document.body;
|
|
28
|
+
};
|
|
29
|
+
var TooltipPortal = function TooltipPortal(_ref) {
|
|
30
|
+
var children = _ref.children,
|
|
31
|
+
root = _ref.root;
|
|
32
|
+
var _useState = useState(function () {
|
|
33
|
+
var resolved = resolveRoot(root);
|
|
34
|
+
if (!resolved) return null;
|
|
35
|
+
return getOrCreateContainer(resolved);
|
|
36
|
+
}),
|
|
37
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
38
|
+
container = _useState2[0],
|
|
39
|
+
setContainer = _useState2[1];
|
|
40
|
+
if (!container && typeof document !== 'undefined') {
|
|
41
|
+
setContainer(getOrCreateContainer(document.body));
|
|
42
|
+
}
|
|
43
|
+
if (!container) return null;
|
|
44
|
+
return /*#__PURE__*/createPortal(children, container);
|
|
45
|
+
};
|
|
46
|
+
export default TooltipPortal;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Placement } from '@floating-ui/react';
|
|
2
|
+
/**
|
|
3
|
+
* Convert Ant Design legacy placements to Floating UI placements.
|
|
4
|
+
*
|
|
5
|
+
* Notes:
|
|
6
|
+
* - Floating UI placements like `top-start` are passed through.
|
|
7
|
+
* - Ant Design legacy placements like `topLeft` are mapped to Floating UI.
|
|
8
|
+
*/
|
|
9
|
+
export declare const antdPlacementToFloating: (placement?: Placement | 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight' | 'leftTop' | 'leftBottom' | 'rightTop' | 'rightBottom' | 'top' | 'bottom' | 'left' | 'right') => Placement;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert Ant Design legacy placements to Floating UI placements.
|
|
3
|
+
*
|
|
4
|
+
* Notes:
|
|
5
|
+
* - Floating UI placements like `top-start` are passed through.
|
|
6
|
+
* - Ant Design legacy placements like `topLeft` are mapped to Floating UI.
|
|
7
|
+
*/
|
|
8
|
+
export var antdPlacementToFloating = function antdPlacementToFloating(placement) {
|
|
9
|
+
if (!placement) return 'top';
|
|
10
|
+
|
|
11
|
+
// Floating UI placements are already compatible.
|
|
12
|
+
if (typeof placement === 'string' && placement.includes('-')) return placement;
|
|
13
|
+
switch (placement) {
|
|
14
|
+
case 'topLeft':
|
|
15
|
+
{
|
|
16
|
+
return 'top-start';
|
|
17
|
+
}
|
|
18
|
+
case 'topRight':
|
|
19
|
+
{
|
|
20
|
+
return 'top-end';
|
|
21
|
+
}
|
|
22
|
+
case 'bottomLeft':
|
|
23
|
+
{
|
|
24
|
+
return 'bottom-start';
|
|
25
|
+
}
|
|
26
|
+
case 'bottomRight':
|
|
27
|
+
{
|
|
28
|
+
return 'bottom-end';
|
|
29
|
+
}
|
|
30
|
+
case 'leftTop':
|
|
31
|
+
{
|
|
32
|
+
return 'left-start';
|
|
33
|
+
}
|
|
34
|
+
case 'leftBottom':
|
|
35
|
+
{
|
|
36
|
+
return 'left-end';
|
|
37
|
+
}
|
|
38
|
+
case 'rightTop':
|
|
39
|
+
{
|
|
40
|
+
return 'right-start';
|
|
41
|
+
}
|
|
42
|
+
case 'rightBottom':
|
|
43
|
+
{
|
|
44
|
+
return 'right-end';
|
|
45
|
+
}
|
|
46
|
+
default:
|
|
47
|
+
{
|
|
48
|
+
return placement;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { TooltipProps } from './type';
|
|
3
|
+
export type TooltipGroupItem = Omit<TooltipProps, 'children' | 'open' | 'defaultOpen'>;
|
|
4
|
+
export type TooltipGroupApi = {
|
|
5
|
+
closeFromTrigger: (triggerEl: HTMLElement, item: TooltipGroupItem) => void;
|
|
6
|
+
closeImmediately: () => void;
|
|
7
|
+
isActiveTrigger: (triggerEl: HTMLElement) => boolean;
|
|
8
|
+
openFromTrigger: (triggerEl: HTMLElement, item: TooltipGroupItem) => void;
|
|
9
|
+
};
|
|
10
|
+
export declare const TooltipGroupContext: import("react").Context<TooltipGroupApi | null>;
|
package/es/Tooltip/index.d.ts
CHANGED
package/es/Tooltip/index.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export { default } from "./Tooltip";
|
|
1
|
+
export { default } from "./Tooltip";
|
|
2
|
+
export { default as TooltipGroup } from "./TooltipGroup";
|
package/es/Tooltip/style.d.ts
CHANGED
package/es/Tooltip/style.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
var _templateObject;
|
|
1
|
+
var _templateObject, _templateObject2, _templateObject3;
|
|
2
2
|
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
3
3
|
import { createStyles } from 'antd-style';
|
|
4
4
|
export var useStyles = createStyles(function (_ref) {
|
|
5
5
|
var css = _ref.css,
|
|
6
|
-
token = _ref.token
|
|
7
|
-
prefixCls = _ref.prefixCls;
|
|
6
|
+
token = _ref.token;
|
|
8
7
|
return {
|
|
9
|
-
|
|
8
|
+
arrow: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n fill: ", ";\n "])), token.colorText),
|
|
9
|
+
content: css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n\n min-height: unset;\n padding: 8px;\n border-radius: ", "px;\n\n color: ", ";\n word-break: normal;\n\n background-color: ", ";\n "])), token.borderRadiusSM, token.colorBgLayout, token.colorText),
|
|
10
|
+
tooltip: css(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n pointer-events: none;\n\n /* Keep the class name for backwards compatibility and user overrides */\n position: relative;\n z-index: 114514;\n filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 12%));\n "])))
|
|
10
11
|
};
|
|
11
12
|
});
|
package/es/Tooltip/type.d.ts
CHANGED
|
@@ -1,10 +1,98 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import type { ReactNode, Ref } from 'react';
|
|
1
|
+
import type { Placement } from '@floating-ui/react';
|
|
2
|
+
import type { CSSProperties, ReactElement, ReactNode, Ref } from 'react';
|
|
4
3
|
import type { HotkeyProps } from "../Hotkey";
|
|
5
|
-
export type
|
|
4
|
+
export type TooltipPlacement = Placement | 'topLeft' | 'top' | 'topRight' | 'leftTop' | 'left' | 'leftBottom' | 'rightTop' | 'right' | 'rightBottom' | 'bottomLeft' | 'bottom' | 'bottomRight';
|
|
5
|
+
export type TooltipProps = {
|
|
6
|
+
/**
|
|
7
|
+
* Whether the tooltip has an arrow pointer.
|
|
8
|
+
*/
|
|
9
|
+
arrow?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Trigger element. Prefer a single React element.
|
|
12
|
+
*/
|
|
13
|
+
children: ReactElement | ReactNode;
|
|
14
|
+
/**
|
|
15
|
+
* Custom className for the tooltip floating root.
|
|
16
|
+
*/
|
|
17
|
+
className?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Compatible with Ant Design `classNames` shape (subset).
|
|
20
|
+
*/
|
|
21
|
+
classNames?: {
|
|
22
|
+
arrow?: string;
|
|
23
|
+
container?: string;
|
|
24
|
+
content?: string;
|
|
25
|
+
root?: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Delay (in milliseconds) before closing the tooltip.
|
|
29
|
+
* Takes precedence over `mouseLeaveDelay`.
|
|
30
|
+
*/
|
|
31
|
+
closeDelay?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Uncontrolled initial open state.
|
|
34
|
+
*/
|
|
35
|
+
defaultOpen?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Disable tooltip behavior.
|
|
38
|
+
*/
|
|
39
|
+
disabled?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* An Ant Design compatible escape hatch for portal container.
|
|
42
|
+
*/
|
|
43
|
+
getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;
|
|
6
44
|
hotkey?: string;
|
|
7
45
|
hotkeyProps?: Omit<HotkeyProps, 'keys'>;
|
|
8
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Delay (in seconds) before showing the tooltip on hover.
|
|
48
|
+
* Kept compatible with Ant Design `Tooltip`.
|
|
49
|
+
*/
|
|
50
|
+
mouseEnterDelay?: number;
|
|
51
|
+
/**
|
|
52
|
+
* Delay (in seconds) before hiding the tooltip on hover out.
|
|
53
|
+
* Kept compatible with Ant Design `Tooltip`.
|
|
54
|
+
*/
|
|
55
|
+
mouseLeaveDelay?: number;
|
|
56
|
+
/**
|
|
57
|
+
* Callback when open state changes.
|
|
58
|
+
*/
|
|
59
|
+
onOpenChange?: (open: boolean) => void;
|
|
60
|
+
/**
|
|
61
|
+
* Controlled open state.
|
|
62
|
+
*/
|
|
63
|
+
open?: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Delay (in milliseconds) before opening the tooltip.
|
|
66
|
+
* Takes precedence over `mouseEnterDelay`.
|
|
67
|
+
*/
|
|
68
|
+
openDelay?: number;
|
|
69
|
+
/**
|
|
70
|
+
* Tooltip placement. Supports Floating UI placements and Ant Design legacy placements.
|
|
71
|
+
*/
|
|
72
|
+
placement?: TooltipPlacement;
|
|
73
|
+
/**
|
|
74
|
+
* Render tooltip in a portal attached to body.
|
|
75
|
+
*/
|
|
76
|
+
portalled?: boolean;
|
|
77
|
+
ref?: Ref<HTMLElement>;
|
|
78
|
+
/**
|
|
79
|
+
* Compatible with Ant Design `styles` shape (subset).
|
|
80
|
+
*/
|
|
81
|
+
styles?: {
|
|
82
|
+
arrow?: CSSProperties;
|
|
83
|
+
/**
|
|
84
|
+
* Backwards-compatible alias for the floating root style.
|
|
85
|
+
*/
|
|
86
|
+
container?: CSSProperties;
|
|
87
|
+
content?: CSSProperties;
|
|
88
|
+
root?: CSSProperties;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Tooltip content.
|
|
92
|
+
*/
|
|
9
93
|
title: ReactNode;
|
|
94
|
+
/**
|
|
95
|
+
* z-index for tooltip floating root.
|
|
96
|
+
*/
|
|
97
|
+
zIndex?: number;
|
|
10
98
|
};
|
package/es/index.d.ts
CHANGED
|
@@ -72,7 +72,7 @@ export { default as Text, type TextProps } from './Text';
|
|
|
72
72
|
export { Meta, type MetaProps, default as ThemeProvider, type ThemeProviderProps, } from './ThemeProvider';
|
|
73
73
|
export { default as ThemeSwitch, type ThemeSwitchProps } from './ThemeSwitch';
|
|
74
74
|
export { default as Toc, type TocProps } from './Toc';
|
|
75
|
-
export { default as Tooltip, type TooltipProps } from './Tooltip';
|
|
75
|
+
export { default as Tooltip, TooltipGroup, type TooltipProps } from './Tooltip';
|
|
76
76
|
export type * from './types';
|
|
77
77
|
export { copyToClipboard } from './utils/copyToClipboard';
|
|
78
78
|
export { type CDN, genCdnUrl } from './utils/genCdnUrl';
|
package/es/index.js
CHANGED
|
@@ -72,7 +72,7 @@ export { default as Text } from "./Text";
|
|
|
72
72
|
export { Meta, default as ThemeProvider } from "./ThemeProvider";
|
|
73
73
|
export { default as ThemeSwitch } from "./ThemeSwitch";
|
|
74
74
|
export { default as Toc } from "./Toc";
|
|
75
|
-
export { default as Tooltip } from "./Tooltip";
|
|
75
|
+
export { default as Tooltip, TooltipGroup } from "./Tooltip";
|
|
76
76
|
export { copyToClipboard } from "./utils/copyToClipboard";
|
|
77
77
|
export { genCdnUrl } from "./utils/genCdnUrl";
|
|
78
78
|
export { default as Video } from "./Video";
|
package/es/mdx/Mdx/index.js
CHANGED
|
@@ -136,10 +136,10 @@ var Mdx = /*#__PURE__*/memo(function (_ref) {
|
|
|
136
136
|
return function () {
|
|
137
137
|
return /*#__PURE__*/_jsx(Alert, {
|
|
138
138
|
description: String(_context.t0 === null || _context.t0 === void 0 ? void 0 : _context.t0.message),
|
|
139
|
-
message: 'Error compiling MDX',
|
|
140
139
|
style: {
|
|
141
140
|
width: '100%'
|
|
142
141
|
},
|
|
142
|
+
title: 'Error compiling MDX',
|
|
143
143
|
type: "error"
|
|
144
144
|
});
|
|
145
145
|
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { LazyMotion as MotionLazyMotion } from 'motion/react';
|
|
2
|
+
import type { ComponentProps } from 'react';
|
|
3
|
+
type MotionLazyMotionProps = ComponentProps<typeof MotionLazyMotion>;
|
|
4
|
+
export type LobeLazyMotionProps = Omit<MotionLazyMotionProps, 'features'> & {
|
|
5
|
+
/**
|
|
6
|
+
* Optional override for Motion features.
|
|
7
|
+
* Defaults to the shared lazy-loaded `loadFeatures`.
|
|
8
|
+
*/
|
|
9
|
+
features?: MotionLazyMotionProps['features'];
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* A project-wide `LazyMotion` wrapper that provides a shared default `features` loader.
|
|
13
|
+
*/
|
|
14
|
+
export declare const LazyMotion: import("react").NamedExoticComponent<LobeLazyMotionProps>;
|
|
15
|
+
export {};
|