@lobehub/ui 3.0.0 → 3.1.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.
@@ -6,22 +6,17 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
6
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
7
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
8
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 { LazyMotion, m } from 'motion/react';
10
9
  import { memo, useCallback, useMemo } from 'react';
11
10
  import { Flexbox } from 'react-layout-kit';
12
11
  import Block from "../Block";
13
12
  import Text from "../Text";
13
+ import { LazyMotion, m } from "../motion";
14
14
  import ArrowIcon from "./ArrowIcon";
15
15
  import { useAccordionContext } from "./context";
16
16
  import { useStyles } from "./style";
17
17
  import { jsx as _jsx } from "react/jsx-runtime";
18
18
  import { jsxs as _jsxs } from "react/jsx-runtime";
19
19
  import { Fragment as _Fragment } from "react/jsx-runtime";
20
- var loadFeatures = function loadFeatures() {
21
- return import('motion/react').then(function (res) {
22
- return res.domAnimation;
23
- });
24
- };
25
20
  var AccordionItem = /*#__PURE__*/memo(function (_ref) {
26
21
  var _ref2, _ref3;
27
22
  var itemKey = _ref.itemKey,
@@ -163,7 +158,6 @@ var AccordionItem = /*#__PURE__*/memo(function (_ref) {
163
158
  });
164
159
  }
165
160
  return /*#__PURE__*/_jsx(LazyMotion, {
166
- features: loadFeatures,
167
161
  children: /*#__PURE__*/_jsx(m.div, _objectSpread(_objectSpread({}, motionProps), {}, {
168
162
  style: {
169
163
  overflow: 'hidden'
@@ -19,7 +19,7 @@ export interface ActionIconProps extends Partial<LucideIconProps>, Omit<CenterPr
19
19
  size?: ActionIconSize;
20
20
  spin?: boolean;
21
21
  title?: TooltipProps['title'];
22
- tooltipProps?: Omit<TooltipProps, 'title'>;
22
+ tooltipProps?: Omit<TooltipProps, 'children' | 'title'>;
23
23
  variant?: 'borderless' | 'filled' | 'outlined';
24
24
  }
25
25
  export {};
@@ -16,7 +16,7 @@ export interface AvatarProps extends AntAvatarProps {
16
16
  size?: number;
17
17
  sliceText?: boolean;
18
18
  title?: string;
19
- tooltipProps?: Omit<TooltipProps, 'title'>;
19
+ tooltipProps?: Omit<TooltipProps, 'children' | 'title'>;
20
20
  unoptimized?: boolean;
21
21
  variant?: 'borderless' | 'filled' | 'outlined';
22
22
  }
@@ -1,4 +1,4 @@
1
- /// <reference types="react" />
1
+ import { type FC } from 'react';
2
2
  import type { TooltipProps } from './type';
3
- declare const Tooltip: import("react").NamedExoticComponent<TooltipProps>;
3
+ export declare const Tooltip: FC<TooltipProps>;
4
4
  export default Tooltip;
@@ -1,22 +1,29 @@
1
1
  'use client';
2
2
 
3
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
- var _excluded = ["ref", "hotkey", "className", "arrow", "title", "hotkeyProps"];
4
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
5
+ 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."); }
6
+ 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); }
7
+ 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; }
8
+ 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; } }
9
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
5
10
  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; }
6
11
  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; }
7
12
  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; }
8
13
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
9
14
  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); }
10
- function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
11
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
12
- import { Tooltip as AntdTooltip } from 'antd';
13
- import { memo } from 'react';
14
- import { Flexbox } from 'react-layout-kit';
15
- import Hotkey from "../Hotkey";
16
- import { useStyles } from "./style";
15
+ import { arrow as arrowMiddleware, autoUpdate, flip, offset, shift, useDismiss, useFloating, useFocus, useHover, useInteractions, useRole } from '@floating-ui/react';
16
+ import { cloneElement, isValidElement, useContext, useEffect, useMemo, useRef, useState } from 'react';
17
+ import { mergeRefs } from 'react-merge-refs';
18
+ import { antdPlacementToFloating } from "./antdPlacementToFloating";
19
+ import { composeEventHandlers } from "../utils/composeEventHandlers";
20
+ import TooltipFloating from "./TooltipFloating";
21
+ import TooltipPortal from "./TooltipPortal";
22
+ import { TooltipGroupContext } from "./groupContext";
17
23
  import { jsx as _jsx } from "react/jsx-runtime";
24
+ import { Fragment as _Fragment } from "react/jsx-runtime";
18
25
  import { jsxs as _jsxs } from "react/jsx-runtime";
19
- var Tooltip = /*#__PURE__*/memo(function (_ref) {
26
+ var TooltipInGroup = function TooltipInGroup(_ref) {
20
27
  var ref = _ref.ref,
21
28
  hotkey = _ref.hotkey,
22
29
  className = _ref.className,
@@ -24,29 +31,229 @@ var Tooltip = /*#__PURE__*/memo(function (_ref) {
24
31
  arrow = _ref$arrow === void 0 ? false : _ref$arrow,
25
32
  title = _ref.title,
26
33
  hotkeyProps = _ref.hotkeyProps,
27
- rest = _objectWithoutProperties(_ref, _excluded);
28
- var _useStyles = useStyles(),
29
- styles = _useStyles.styles,
30
- cx = _useStyles.cx;
31
- return /*#__PURE__*/_jsx(AntdTooltip, _objectSpread({
34
+ children = _ref.children,
35
+ _ref$placement = _ref.placement,
36
+ placement = _ref$placement === void 0 ? 'top' : _ref$placement,
37
+ openDelay = _ref.openDelay,
38
+ closeDelay = _ref.closeDelay,
39
+ _ref$mouseEnterDelay = _ref.mouseEnterDelay,
40
+ mouseEnterDelay = _ref$mouseEnterDelay === void 0 ? 0 : _ref$mouseEnterDelay,
41
+ _ref$mouseLeaveDelay = _ref.mouseLeaveDelay,
42
+ mouseLeaveDelay = _ref$mouseLeaveDelay === void 0 ? 0 : _ref$mouseLeaveDelay,
43
+ onOpenChange = _ref.onOpenChange,
44
+ disabled = _ref.disabled,
45
+ classNames = _ref.classNames,
46
+ styleProps = _ref.styles,
47
+ zIndex = _ref.zIndex,
48
+ _ref$portalled = _ref.portalled,
49
+ portalled = _ref$portalled === void 0 ? true : _ref$portalled,
50
+ getPopupContainer = _ref.getPopupContainer;
51
+ var group = useContext(TooltipGroupContext);
52
+ var triggerElRef = useRef(null);
53
+ var item = useMemo(function () {
54
+ return {
55
+ arrow: arrow,
56
+ className: className,
57
+ classNames: classNames,
58
+ closeDelay: closeDelay,
59
+ disabled: disabled,
60
+ getPopupContainer: getPopupContainer,
61
+ hotkey: hotkey,
62
+ hotkeyProps: hotkeyProps,
63
+ mouseEnterDelay: mouseEnterDelay,
64
+ mouseLeaveDelay: mouseLeaveDelay,
65
+ onOpenChange: onOpenChange,
66
+ openDelay: openDelay,
67
+ placement: placement,
68
+ portalled: portalled,
69
+ styles: styleProps,
70
+ title: title,
71
+ zIndex: zIndex
72
+ };
73
+ }, [arrow, className, classNames, closeDelay, disabled, getPopupContainer, hotkey, hotkeyProps, mouseEnterDelay, mouseLeaveDelay, onOpenChange, openDelay, placement, portalled, styleProps, title, zIndex]);
74
+ var trigger = useMemo(function () {
75
+ var _children$props;
76
+ if (! /*#__PURE__*/isValidElement(children)) return /*#__PURE__*/_jsx("span", {
77
+ children: children
78
+ });
79
+ var needsWrapper = typeof children.type === 'string' && Boolean((_children$props = children.props) === null || _children$props === void 0 ? void 0 : _children$props.disabled);
80
+ if (needsWrapper) return /*#__PURE__*/_jsx("span", {
81
+ style: {
82
+ display: 'inline-flex'
83
+ },
84
+ children: children
85
+ });
86
+ return children;
87
+ }, [children]);
88
+ var referenceNode = useMemo(function () {
89
+ if (! /*#__PURE__*/isValidElement(trigger)) return trigger;
90
+ var originalRef = trigger.ref;
91
+ var triggerProps = trigger.props || {};
92
+ var setTriggerEl = function setTriggerEl(node) {
93
+ triggerElRef.current = node instanceof HTMLElement ? node : null;
94
+ };
95
+ return /*#__PURE__*/cloneElement(trigger, _objectSpread(_objectSpread({}, triggerProps), {}, {
96
+ onBlur: composeEventHandlers(triggerProps.onBlur, function (e) {
97
+ group === null || group === void 0 || group.closeFromTrigger(e.currentTarget, item);
98
+ }),
99
+ onFocus: composeEventHandlers(triggerProps.onFocus, function (e) {
100
+ group === null || group === void 0 || group.openFromTrigger(e.currentTarget, item);
101
+ }),
102
+ onKeyDown: composeEventHandlers(triggerProps.onKeyDown, function (e) {
103
+ if ((e === null || e === void 0 ? void 0 : e.key) === 'Escape') group === null || group === void 0 || group.closeImmediately();
104
+ }),
105
+ onPointerEnter: composeEventHandlers(triggerProps.onPointerEnter, function (e) {
106
+ group === null || group === void 0 || group.openFromTrigger(e.currentTarget, item);
107
+ }),
108
+ onPointerLeave: composeEventHandlers(triggerProps.onPointerLeave, function (e) {
109
+ group === null || group === void 0 || group.closeFromTrigger(e.currentTarget, item);
110
+ }),
111
+ ref: mergeRefs([originalRef, setTriggerEl, ref])
112
+ }));
113
+ }, [group, item, ref, trigger]);
114
+ useEffect(function () {
115
+ return function () {
116
+ if (!group) return;
117
+ var el = triggerElRef.current;
118
+ if (el && group.isActiveTrigger(el)) group.closeImmediately();
119
+ };
120
+ }, [group]);
121
+ return referenceNode;
122
+ };
123
+ TooltipInGroup.displayName = 'TooltipInGroup';
124
+ var TooltipStandalone = function TooltipStandalone(_ref2) {
125
+ var ref = _ref2.ref,
126
+ hotkey = _ref2.hotkey,
127
+ className = _ref2.className,
128
+ _ref2$arrow = _ref2.arrow,
129
+ arrow = _ref2$arrow === void 0 ? false : _ref2$arrow,
130
+ title = _ref2.title,
131
+ hotkeyProps = _ref2.hotkeyProps,
132
+ children = _ref2.children,
133
+ _ref2$placement = _ref2.placement,
134
+ placement = _ref2$placement === void 0 ? 'top' : _ref2$placement,
135
+ openDelay = _ref2.openDelay,
136
+ closeDelay = _ref2.closeDelay,
137
+ _ref2$mouseEnterDelay = _ref2.mouseEnterDelay,
138
+ mouseEnterDelay = _ref2$mouseEnterDelay === void 0 ? 0 : _ref2$mouseEnterDelay,
139
+ _ref2$mouseLeaveDelay = _ref2.mouseLeaveDelay,
140
+ mouseLeaveDelay = _ref2$mouseLeaveDelay === void 0 ? 0 : _ref2$mouseLeaveDelay,
141
+ open = _ref2.open,
142
+ defaultOpen = _ref2.defaultOpen,
143
+ onOpenChange = _ref2.onOpenChange,
144
+ disabled = _ref2.disabled,
145
+ classNames = _ref2.classNames,
146
+ styleProps = _ref2.styles,
147
+ zIndex = _ref2.zIndex,
148
+ _ref2$portalled = _ref2.portalled,
149
+ portalled = _ref2$portalled === void 0 ? true : _ref2$portalled,
150
+ getPopupContainer = _ref2.getPopupContainer;
151
+ var arrowRef = useRef(null);
152
+ var _useState = useState(Boolean(defaultOpen)),
153
+ _useState2 = _slicedToArray(_useState, 2),
154
+ uncontrolledOpen = _useState2[0],
155
+ setUncontrolledOpen = _useState2[1];
156
+ var mergedOpen = open !== null && open !== void 0 ? open : uncontrolledOpen;
157
+ var setOpen = function setOpen(next) {
158
+ if (open === undefined) setUncontrolledOpen(next);
159
+ onOpenChange === null || onOpenChange === void 0 || onOpenChange(next);
160
+ };
161
+ var floatingPlacement = useMemo(function () {
162
+ return antdPlacementToFloating(placement);
163
+ }, [placement]);
164
+ var middleware = useMemo(function () {
165
+ var base = [offset(8), flip(), shift({
166
+ padding: 8
167
+ })];
168
+ if (arrow) base.push(arrowMiddleware({
169
+ element: arrowRef
170
+ }));
171
+ return base;
172
+ }, [arrow]);
173
+ var _useFloating = useFloating({
174
+ middleware: middleware,
175
+ onOpenChange: setOpen,
176
+ open: disabled ? false : mergedOpen,
177
+ placement: floatingPlacement,
178
+ whileElementsMounted: autoUpdate
179
+ }),
180
+ context = _useFloating.context,
181
+ floatingStyles = _useFloating.floatingStyles,
182
+ refs = _useFloating.refs;
183
+ var resolvedDelay = useMemo(function () {
184
+ return {
185
+ close: closeDelay !== null && closeDelay !== void 0 ? closeDelay : mouseLeaveDelay * 1000,
186
+ open: openDelay !== null && openDelay !== void 0 ? openDelay : mouseEnterDelay * 1000
187
+ };
188
+ }, [closeDelay, mouseEnterDelay, mouseLeaveDelay, openDelay]);
189
+ var hover = useHover(context, {
190
+ delay: resolvedDelay,
191
+ enabled: !disabled,
192
+ move: false
193
+ });
194
+ var focus = useFocus(context, {
195
+ enabled: !disabled
196
+ });
197
+ var dismiss = useDismiss(context, {
198
+ enabled: !disabled
199
+ });
200
+ var role = useRole(context, {
201
+ role: 'tooltip'
202
+ });
203
+ var _useInteractions = useInteractions([hover, focus, dismiss, role]),
204
+ getFloatingProps = _useInteractions.getFloatingProps,
205
+ getReferenceProps = _useInteractions.getReferenceProps;
206
+ var trigger = useMemo(function () {
207
+ var _children$props2;
208
+ if (! /*#__PURE__*/isValidElement(children)) return /*#__PURE__*/_jsx("span", {
209
+ children: children
210
+ });
211
+ var needsWrapper = typeof children.type === 'string' && Boolean((_children$props2 = children.props) === null || _children$props2 === void 0 ? void 0 : _children$props2.disabled);
212
+ if (needsWrapper) return /*#__PURE__*/_jsx("span", {
213
+ style: {
214
+ display: 'inline-flex'
215
+ },
216
+ children: children
217
+ });
218
+ return children;
219
+ }, [children]);
220
+ var referenceNode = useMemo(function () {
221
+ if (! /*#__PURE__*/isValidElement(trigger)) return trigger;
222
+ var originalRef = trigger.ref;
223
+ return /*#__PURE__*/cloneElement(trigger, getReferenceProps(_objectSpread(_objectSpread({}, trigger.props), {}, {
224
+ ref: mergeRefs([originalRef, refs.setReference, ref])
225
+ })));
226
+ }, [getReferenceProps, ref, refs.setReference, trigger]);
227
+ var portalRoot = getPopupContainer && refs.reference.current ? getPopupContainer(refs.reference.current) : undefined;
228
+ var floatingNode = /*#__PURE__*/_jsx(TooltipFloating, {
32
229
  arrow: arrow,
33
- classNames: {
34
- root: cx(styles.tooltip, className)
35
- },
36
- ref: ref,
37
- title: hotkey ? /*#__PURE__*/_jsxs(Flexbox, {
38
- align: 'center',
39
- gap: 8,
40
- horizontal: true,
41
- justify: 'space-between',
42
- children: [/*#__PURE__*/_jsx("span", {
43
- children: title
44
- }), /*#__PURE__*/_jsx(Hotkey, _objectSpread({
45
- inverseTheme: true,
46
- keys: hotkey
47
- }, hotkeyProps))]
48
- }) : title
49
- }, rest));
50
- });
51
- Tooltip.displayName = 'Tooltip';
230
+ arrowRef: arrowRef,
231
+ className: className,
232
+ classNames: classNames,
233
+ context: context,
234
+ floatingProps: getFloatingProps(),
235
+ floatingStyles: floatingStyles,
236
+ hotkey: hotkey,
237
+ hotkeyProps: hotkeyProps,
238
+ open: mergedOpen,
239
+ placement: floatingPlacement,
240
+ setFloating: refs.setFloating,
241
+ styles: styleProps,
242
+ title: title,
243
+ zIndex: zIndex
244
+ });
245
+ return /*#__PURE__*/_jsxs(_Fragment, {
246
+ children: [referenceNode, !disabled && title && (portalled ? /*#__PURE__*/_jsx(TooltipPortal, {
247
+ root: portalRoot,
248
+ children: floatingNode
249
+ }) : floatingNode)]
250
+ });
251
+ };
252
+ export var Tooltip = function Tooltip(props) {
253
+ var group = useContext(TooltipGroupContext);
254
+
255
+ // Group mode is intentionally hover/focus driven; keep standalone behavior for controlled cases.
256
+ var canUseGroup = Boolean(group) && props.open === undefined && props.defaultOpen === undefined;
257
+ return canUseGroup ? /*#__PURE__*/_jsx(TooltipInGroup, _objectSpread({}, props)) : /*#__PURE__*/_jsx(TooltipStandalone, _objectSpread({}, props));
258
+ };
52
259
  export default Tooltip;
@@ -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,6 @@
1
+ import { type ReactNode } from 'react';
2
+ type TooltipGroupProps = {
3
+ children: ReactNode;
4
+ };
5
+ declare const TooltipGroup: import("react").NamedExoticComponent<TooltipGroupProps>;
6
+ export default TooltipGroup;
@@ -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>;
@@ -0,0 +1,2 @@
1
+ import { createContext } from 'react';
2
+ export var TooltipGroupContext = /*#__PURE__*/createContext(null);
@@ -1,2 +1,3 @@
1
1
  export { default } from './Tooltip';
2
+ export { default as TooltipGroup } from './TooltipGroup';
2
3
  export type * from './type';
@@ -1 +1,2 @@
1
- export { default } from "./Tooltip";
1
+ export { default } from "./Tooltip";
2
+ export { default as TooltipGroup } from "./TooltipGroup";
@@ -1,3 +1,5 @@
1
1
  export declare const useStyles: (props?: unknown) => import("antd-style").ReturnStyles<{
2
+ arrow: import("antd-style").SerializedStyles;
3
+ content: import("antd-style").SerializedStyles;
2
4
  tooltip: import("antd-style").SerializedStyles;
3
5
  }>;
@@ -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
- tooltip: css(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n .", "-tooltip-inner {\n display: flex;\n align-items: center;\n justify-content: center;\n\n min-height: unset;\n padding-block: 4px;\n padding-inline: 8px;\n\n color: ", ";\n word-break: normal;\n\n background-color: ", ";\n border-radius: ", "px;\n }\n\n .", "-tooltip-arrow {\n &::before,\n &::after {\n background: ", ";\n }\n }\n "])), prefixCls, token.colorBgLayout, token.colorText, token.borderRadiusSM, prefixCls, token.colorText)
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
  });
@@ -1,10 +1,98 @@
1
- import type { TooltipProps as AntdTooltipProps } from 'antd';
2
- import type { TooltipRef } from 'antd/lib/tooltip';
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 TooltipProps = Omit<AntdTooltipProps, 'title'> & {
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
- ref?: Ref<TooltipRef>;
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";
@@ -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 {};
@@ -0,0 +1,26 @@
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
+ var _excluded = ["features"];
5
+ 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; }
6
+ 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; }
7
+ 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; }
8
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
9
+ 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); }
10
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
11
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
12
+ import { LazyMotion as MotionLazyMotion } from 'motion/react';
13
+ import { memo } from 'react';
14
+ import { loadFeatures } from "./loadFeatures";
15
+ import { jsx as _jsx } from "react/jsx-runtime";
16
+ /**
17
+ * A project-wide `LazyMotion` wrapper that provides a shared default `features` loader.
18
+ */
19
+ export var LazyMotion = /*#__PURE__*/memo(function (_ref) {
20
+ var features = _ref.features,
21
+ props = _objectWithoutProperties(_ref, _excluded);
22
+ return /*#__PURE__*/_jsx(MotionLazyMotion, _objectSpread({
23
+ features: features !== null && features !== void 0 ? features : loadFeatures
24
+ }, props));
25
+ });
26
+ LazyMotion.displayName = 'LazyMotion';
@@ -0,0 +1,3 @@
1
+ export { LazyMotion, type LobeLazyMotionProps } from './LazyMotion';
2
+ export { loadFeatures } from './loadFeatures';
3
+ export { AnimatePresence, m } from 'motion/react';
@@ -0,0 +1,3 @@
1
+ export { LazyMotion } from "./LazyMotion";
2
+ export { loadFeatures } from "./loadFeatures";
3
+ export { AnimatePresence, m } from 'motion/react';
@@ -0,0 +1,9 @@
1
+ import { LazyMotion as MotionLazyMotion } from 'motion/react';
2
+ import type { ComponentProps } from 'react';
3
+ /**
4
+ * Shared lazy-loaded Motion features bundle.
5
+ * Using a dynamic import keeps the initial bundle lighter and avoids repeating this logic across components.
6
+ */
7
+ type MotionLazyMotionProps = ComponentProps<typeof MotionLazyMotion>;
8
+ export declare const loadFeatures: MotionLazyMotionProps['features'];
9
+ export {};
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Shared lazy-loaded Motion features bundle.
3
+ * Using a dynamic import keeps the initial bundle lighter and avoids repeating this logic across components.
4
+ */
5
+
6
+ export var loadFeatures = function loadFeatures() {
7
+ return import('motion/react').then(function (res) {
8
+ return res.domAnimation;
9
+ });
10
+ };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Composes two event handlers together, calling the external handler first,
3
+ * then the internal handler if the event hasn't been prevented.
4
+ *
5
+ * @template E - The event type
6
+ * @param theirHandler - The external event handler (may be undefined)
7
+ * @param ourHandler - The internal event handler
8
+ * @returns A composed event handler that calls both handlers in sequence
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * <button
13
+ * onClick={composeEventHandlers(externalOnClick, (e) => {
14
+ * // Internal handler logic
15
+ * })}
16
+ * />
17
+ * ```
18
+ */
19
+ export declare const composeEventHandlers: <E>(theirHandler: ((event: E) => void) | undefined, ourHandler: (event: E) => void) => (event: E) => void;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Composes two event handlers together, calling the external handler first,
3
+ * then the internal handler if the event hasn't been prevented.
4
+ *
5
+ * @template E - The event type
6
+ * @param theirHandler - The external event handler (may be undefined)
7
+ * @param ourHandler - The internal event handler
8
+ * @returns A composed event handler that calls both handlers in sequence
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * <button
13
+ * onClick={composeEventHandlers(externalOnClick, (e) => {
14
+ * // Internal handler logic
15
+ * })}
16
+ * />
17
+ * ```
18
+ */
19
+ export var composeEventHandlers = function composeEventHandlers(theirHandler, ourHandler) {
20
+ return function (event) {
21
+ theirHandler === null || theirHandler === void 0 || theirHandler(event);
22
+ // @ts-ignore - compatible with React SyntheticEvent shape
23
+ if (event !== null && event !== void 0 && event.defaultPrevented) return;
24
+ ourHandler(event);
25
+ };
26
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/ui",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "Lobe UI is an open-source UI component library for building AIGC web apps",
5
5
  "keywords": [
6
6
  "lobehub",