tdesign-react
Version:
TDesign Component for React
191 lines (186 loc) • 8.03 kB
JavaScript
/**
* tdesign v1.15.1
* (c) 2025 tdesign
* @license MIT
*/
import { _ as _defineProperty } from '../_chunks/dep-cb0a3966.js';
import { _ as _slicedToArray } from '../_chunks/dep-48805ab8.js';
import classNames from 'classnames';
import { throttle } from 'lodash-es';
import React, { useRef, useState, useEffect, useCallback } from 'react';
import { CSSTransition } from 'react-transition-group';
import Portal from '../common/Portal.js';
import useAnimation from '../hooks/useAnimation.js';
import useConfig from '../hooks/useConfig.js';
import useDefaultProps from '../hooks/useDefaultProps.js';
import useSwitch from '../hooks/useSwitch.js';
import { getTransitionParams } from '../popup/utils/transition.js';
import { tooltipLiteDefaultProps } from './defaultProps.js';
import '../_chunks/dep-eca3a3de.js';
import '../_chunks/dep-026a4c6b.js';
import 'react-dom';
import '../_chunks/dep-3a09424a.js';
import '../hooks/useLayoutEffect.js';
import '../config-provider/ConfigContext.js';
import '../_chunks/dep-f97636ce.js';
import '../_chunks/dep-9dbbf468.js';
import 'dayjs';
import '../hooks/usePersistFn.js';
var getPosition = function getPosition(targetEle, contentEle, placement, clientX, clientY) {
var targetRect = targetEle.getBoundingClientRect();
var contentRect = contentEle.getBoundingClientRect();
var position = {
top: document.documentElement.scrollTop,
left: document.documentElement.scrollLeft
};
if (targetRect && contentRect) {
var dWidth = targetRect.width - contentRect.width;
switch (placement) {
case "top":
position.left += targetRect.left + dWidth / 2;
position.top += targetRect.top - contentRect.height - 16;
break;
case "bottom":
position.left += targetRect.left + dWidth / 2;
position.top += targetRect.top + targetRect.height;
break;
case "mouse":
position.left += Number(clientX);
position.top += typeof clientY !== "undefined" ? Number(clientY) + 16 : targetRect.top + targetRect.height + 8;
break;
}
if (placement === "mouse") {
var edges = {
top: document.documentElement.scrollTop,
left: document.documentElement.scrollLeft,
right: document.documentElement.scrollLeft + document.documentElement.clientWidth,
bottom: document.documentElement.scrollTop + document.documentElement.clientHeight
};
if (position.top > edges.bottom - contentRect.height) {
position.top = document.documentElement.scrollTop + targetRect.top - contentRect.height - 8;
}
if (position.left > edges.right - contentRect.width) {
position.left = edges.right - contentRect.width;
}
}
}
return position;
};
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; }
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; }
var DEFAULT_TRANSITION_TIMEOUT = 180;
var TooltipLite = function TooltipLite(originalProps) {
var props = useDefaultProps(originalProps, tooltipLiteDefaultProps);
var style = props.style,
className = props.className,
placement = props.placement,
showArrow = props.showArrow,
theme = props.theme,
children = props.children,
triggerElement = props.triggerElement,
content = props.content,
showShadow = props.showShadow;
var triggerRef = useRef(null);
var contentRef = useRef(null);
var popupRef = useRef(null);
var _useConfig = useConfig(),
classPrefix = _useConfig.classPrefix;
var _useSwitch = useSwitch(),
_useSwitch2 = _slicedToArray(_useSwitch, 2),
hover = _useSwitch2[0],
hoverAction = _useSwitch2[1];
var _useState = useState(0),
_useState2 = _slicedToArray(_useState, 2),
clientX = _useState2[0],
setHoverClientX = _useState2[1];
var _useState3 = useState(0),
_useState4 = _slicedToArray(_useState3, 2),
clientY = _useState4[0],
setHoverClientY = _useState4[1];
var _useState5 = useState(null),
_useState6 = _slicedToArray(_useState5, 2),
position = _useState6[0],
setPosition = _useState6[1];
var _useAnimation = useAnimation(),
keepFade = _useAnimation.keepFade;
useEffect(function () {
if (triggerRef.current && contentRef.current) {
setPosition(getPosition(triggerRef.current, contentRef.current, placement, clientX, clientY));
}
}, [triggerRef.current, contentRef.current, placement, hover, clientX, clientY]);
var updatePosition = function updatePosition(position2) {
var clientX2 = position2.clientX,
clientY2 = position2.clientY;
setHoverClientX(clientX2);
setHoverClientY(clientY2);
};
var onSwitchHover = function onSwitchHover(action, e) {
var clientX2 = e.clientX,
clientY2 = e.clientY;
updatePosition({
clientX: clientX2,
clientY: clientY2
});
hoverAction.set(action === "on");
};
var showTipArrow = showArrow && placement !== "mouse";
var onSwitchMove = useCallback(throttle(function (e) {
return updatePosition(e);
}, 16.7, {
trailing: true
}), []);
var getTriggerChildren = function getTriggerChildren(children2) {
var appendProps = {
ref: triggerRef,
onMouseMove: function onMouseMove(e) {
var clientX2 = e.clientX,
clientY2 = e.clientY;
return onSwitchMove({
clientX: clientX2,
clientY: clientY2
});
},
onMouseEnter: function onMouseEnter(e) {
return onSwitchHover("on", e);
},
onMouseLeave: function onMouseLeave(e) {
return onSwitchHover("off", e);
}
};
if (! /*#__PURE__*/React.isValidElement(children2)) {
return /*#__PURE__*/React.cloneElement(/* @__PURE__ */React.createElement("div", null, children2), _objectSpread({}, appendProps));
}
return /*#__PURE__*/React.cloneElement(children2, _objectSpread({}, appendProps));
};
return /* @__PURE__ */React.createElement("div", null, getTriggerChildren(children || triggerElement), hover && /* @__PURE__ */React.createElement(Portal, null, /* @__PURE__ */React.createElement(CSSTransition, _objectSpread({
appear: true,
timeout: {
appear: DEFAULT_TRANSITION_TIMEOUT
},
"in": hover,
nodeRef: popupRef
}, getTransitionParams({
classPrefix: classPrefix,
fadeAnimation: keepFade
})), /* @__PURE__ */React.createElement("div", {
className: classNames("".concat(classPrefix, "-popup"), "".concat(classPrefix, "-tooltip"), _defineProperty(_defineProperty({}, "".concat(classPrefix, "-tooltip--").concat(theme), theme), "".concat(classPrefix, "-tooltip--noshadow"), !showShadow), className),
style: {
position: "absolute",
left: position === null || position === void 0 ? void 0 : position.left,
top: position === null || position === void 0 ? void 0 : position.top,
zIndex: props.zIndex
},
"data-popper-placement": placement,
ref: popupRef
}, /* @__PURE__ */React.createElement("div", {
className: classNames("".concat(classPrefix, "-popup__content"), _defineProperty({}, "".concat(classPrefix, "-popup__content--arrow"), showTipArrow)),
ref: contentRef,
style: style
}, content, showTipArrow && /* @__PURE__ */React.createElement("div", {
className: "".concat(classPrefix, "-popup__arrow")
}))))));
};
TooltipLite.displayName = "Tooltiplite";
var _TooltipLite = /*#__PURE__*/React.memo(TooltipLite);
export { _TooltipLite as default };
//# sourceMappingURL=TooltipLite.js.map