tdesign-react
Version:
TDesign Component for React
469 lines (461 loc) • 22.8 kB
JavaScript
/**
* tdesign v1.16.2
* (c) 2025 tdesign
* @license MIT
*/
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var defineProperty = require('../_chunks/dep-0fe55884.js');
var slicedToArray = require('../_chunks/dep-5cb0d66d.js');
var React = require('react');
var classNames = require('classnames');
var ReactDOM = require('react-dom');
var setStyle = require('../_chunks/dep-1ff6cacd.js');
var button_index = require('../button/index.js');
var hooks_useConfig = require('../hooks/useConfig.js');
var popup_index = require('../popup/index.js');
var _util_style = require('../_chunks/dep-e0735b5f.js');
var guide_utils_getScrollParent = require('./utils/getScrollParent.js');
var guide_utils_getRelativePosition = require('./utils/getRelativePosition.js');
var guide_utils_getTargetElm = require('./utils/getTargetElm.js');
var guide_utils_scrollToElm = require('./utils/scrollToElm.js');
var hooks_useControlled = require('../hooks/useControlled.js');
var guide_defaultProps = require('./defaultProps.js');
var hooks_useDefaultProps = require('../hooks/useDefaultProps.js');
var hooks_useLayoutEffect = require('../hooks/useLayoutEffect.js');
var _util_scroll = require('../_util/scroll.js');
var hooks_useEventCallback = require('../hooks/useEventCallback.js');
var debounce = require('../_chunks/dep-de1ebf3f.js');
var isFunction = require('../_chunks/dep-967e785f.js');
require('../_chunks/dep-b325182b.js');
require('../_chunks/dep-737b8bd8.js');
require('../button/Button.js');
require('../_chunks/dep-40583e7c.js');
require('../hooks/useDomRefCallback.js');
require('../hooks/useRipple.js');
require('../hooks/useAnimation.js');
require('../config-provider/ConfigContext.js');
require('../_chunks/dep-17dea53e.js');
require('../_chunks/dep-a0cbf081.js');
require('dayjs');
require('../_chunks/dep-481a1ecc.js');
require('../_chunks/dep-474eb386.js');
require('../_chunks/dep-3b256bc0.js');
require('../_chunks/dep-4ce0670e.js');
require('../_chunks/dep-3448f35f.js');
require('../_chunks/dep-b6a3ada9.js');
require('../_chunks/dep-735cd5b9.js');
require('../_chunks/dep-bdafd287.js');
require('../_chunks/dep-4d300b8f.js');
require('../_chunks/dep-3332ad6f.js');
require('../_chunks/dep-98783318.js');
require('../_chunks/dep-5c8525ea.js');
require('../_chunks/dep-fc884a8e.js');
require('../_chunks/dep-008b21d4.js');
require('../_chunks/dep-9193eded.js');
require('../_chunks/dep-afe817f9.js');
require('../_chunks/dep-0b70c7ec.js');
require('../_chunks/dep-a1e3e59b.js');
require('../_chunks/dep-24ab8f68.js');
require('../_chunks/dep-753b7d52.js');
require('../loading/index.js');
require('../loading/Loading.js');
require('../common/Portal.js');
require('../loading/defaultProps.js');
require('../loading/gradient.js');
require('../_chunks/dep-779273e7.js');
require('../_chunks/dep-a7fe58de.js');
require('../_chunks/dep-bb3e9667.js');
require('../_chunks/dep-b304bc94.js');
require('../loading/plugin.js');
require('../_util/react-render.js');
require('../_chunks/dep-e88f025c.js');
require('../common/PluginContainer.js');
require('../config-provider/ConfigProvider.js');
require('../_chunks/dep-542bd26e.js');
require('../_chunks/dep-c89d3d1e.js');
require('../_chunks/dep-e018b522.js');
require('../_chunks/dep-7f4d0687.js');
require('../_chunks/dep-b23d5e45.js');
require('../button/defaultProps.js');
require('../_util/parseTNode.js');
require('../_chunks/dep-05f87b98.js');
require('../popup/Popup.js');
require('react-transition-group');
require('../hooks/useAttach.js');
require('../hooks/useMutationObserver.js');
require('../hooks/useLatest.js');
require('../_chunks/dep-1b7ce2a3.js');
require('../_chunks/dep-625279d1.js');
require('../_chunks/dep-4f4b2eb1.js');
require('../hooks/usePopper.js');
require('react-fast-compare');
require('@popperjs/core');
require('../hooks/useWindowSize.js');
require('../popup/defaultProps.js');
require('../popup/hooks/useTrigger.js');
require('../_util/listener.js');
require('../_util/ref.js');
require('react-is');
require('../_util/isFragment.js');
require('../popup/utils/transition.js');
require('../_util/noop.js');
require('../_chunks/dep-908ffaed.js');
require('../_chunks/dep-a76ede3e.js');
require('../_chunks/dep-2ad01263.js');
require('../_chunks/dep-7659797a.js');
require('../_chunks/dep-eb2203ae.js');
require('../_chunks/dep-ff8b8704.js');
require('../popup/PopupPlugin.js');
require('raf');
require('../_util/easing.js');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
var classNames__default = /*#__PURE__*/_interopDefaultLegacy(classNames);
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._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 Guide = function Guide(originalProps) {
var props = hooks_useDefaultProps["default"](originalProps, guide_defaultProps.guideDefaultProps);
var counter = props.counter,
hideCounter = props.hideCounter,
hidePrev = props.hidePrev,
hideSkip = props.hideSkip,
steps = props.steps,
zIndex = props.zIndex;
var _useConfig = hooks_useConfig["default"](),
classPrefix = _useConfig.classPrefix,
guideGlobalConfig = _useConfig.guide;
var prefixCls = "".concat(classPrefix, "-guide");
var lockCls = "".concat(prefixCls, "--lock");
var _useControlled = hooks_useControlled["default"](props, "current", props.onChange),
_useControlled2 = slicedToArray._slicedToArray(_useControlled, 2),
innerCurrent = _useControlled2[0],
setInnerCurrent = _useControlled2[1];
var overlayLayerRef = React.useRef(null);
var highlightLayerRef = React.useRef(null);
var referenceLayerRef = React.useRef(null);
var currentHighlightLayerElm = React.useRef(null);
var dialogWrapperRef = React.useRef(null);
var dialogTooltipRef = React.useRef(null);
var _useState = React.useState(false),
_useState2 = slicedToArray._slicedToArray(_useState, 2),
active = _useState2[0],
setActive = _useState2[1];
var stepsTotal = steps.length;
var currentStepInfo = React.useMemo(function () {
return steps[innerCurrent];
}, [steps, innerCurrent]);
var getCurrentCrossProps = function getCurrentCrossProps(propsName) {
var _currentStepInfo$prop;
return (_currentStepInfo$prop = currentStepInfo === null || currentStepInfo === void 0 ? void 0 : currentStepInfo[propsName]) !== null && _currentStepInfo$prop !== void 0 ? _currentStepInfo$prop : props[propsName];
};
var isPopup = getCurrentCrossProps("mode") === "popup";
var setHighlightLayerPosition = function setHighlightLayerPosition(highlightLayer) {
if (!highlightLayer) return;
var _getRelativePosition = guide_utils_getRelativePosition["default"](currentHighlightLayerElm.current),
top = _getRelativePosition.top,
left = _getRelativePosition.left;
var _currentHighlightLaye = currentHighlightLayerElm.current.getBoundingClientRect(),
width = _currentHighlightLaye.width,
height = _currentHighlightLaye.height;
var highlightPadding = getCurrentCrossProps("highlightPadding");
if (isPopup) {
width += highlightPadding * 2;
height += highlightPadding * 2;
top -= highlightPadding;
left -= highlightPadding;
} else {
var _getWindowScroll = _util_scroll.getWindowScroll(),
scrollTop = _getWindowScroll.scrollTop,
scrollLeft = _getWindowScroll.scrollLeft;
top += scrollTop;
left += scrollLeft;
}
setStyle.setStyle(highlightLayer, {
width: "".concat(width, "px"),
height: "".concat(height, "px"),
top: "".concat(top, "px"),
left: "".concat(left, "px")
});
};
var showPopupGuide = function showPopupGuide() {
currentHighlightLayerElm.current = guide_utils_getTargetElm["default"](currentStepInfo.element);
setTimeout(function () {
guide_utils_getScrollParent.scrollToParentVisibleArea(currentHighlightLayerElm.current);
setHighlightLayerPosition(highlightLayerRef.current);
setHighlightLayerPosition(referenceLayerRef.current);
guide_utils_scrollToElm["default"](currentHighlightLayerElm.current);
});
};
var destroyTooltipElm = function destroyTooltipElm() {
var _referenceLayerRef$cu;
(_referenceLayerRef$cu = referenceLayerRef.current) === null || _referenceLayerRef$cu === void 0 || _referenceLayerRef$cu.parentNode.removeChild(referenceLayerRef.current);
};
var showDialogGuide = function showDialogGuide() {
setTimeout(function () {
currentHighlightLayerElm.current = dialogTooltipRef.current;
guide_utils_getScrollParent.scrollToParentVisibleArea(currentHighlightLayerElm.current);
setHighlightLayerPosition(highlightLayerRef.current);
guide_utils_scrollToElm["default"](currentHighlightLayerElm.current);
});
};
var destroyDialogTooltipElm = function destroyDialogTooltipElm() {
var _dialogTooltipRef$cur, _dialogWrapperRef$cur;
(_dialogTooltipRef$cur = dialogTooltipRef.current) === null || _dialogTooltipRef$cur === void 0 || _dialogTooltipRef$cur.parentNode.removeChild(dialogTooltipRef.current);
(_dialogWrapperRef$cur = dialogWrapperRef.current) === null || _dialogWrapperRef$cur === void 0 || _dialogWrapperRef$cur.parentNode.removeChild(dialogWrapperRef.current);
};
var showGuide = hooks_useEventCallback["default"](function () {
if (isPopup) {
destroyDialogTooltipElm();
showPopupGuide();
} else {
destroyTooltipElm();
showDialogGuide();
}
});
var showGuideDebounce = React.useMemo(function () {
return debounce.debounce(showGuide, 250);
}, [showGuide]);
var destroyGuide = function destroyGuide() {
var _highlightLayerRef$cu, _overlayLayerRef$curr;
destroyTooltipElm();
destroyDialogTooltipElm();
(_highlightLayerRef$cu = highlightLayerRef.current) === null || _highlightLayerRef$cu === void 0 || _highlightLayerRef$cu.parentNode.removeChild(highlightLayerRef.current);
(_overlayLayerRef$curr = overlayLayerRef.current) === null || _overlayLayerRef$curr === void 0 || _overlayLayerRef$curr.parentNode.removeChild(overlayLayerRef.current);
_util_style.removeClass(document.body, lockCls);
};
var handleSkip = function handleSkip(e) {
var _props$onSkip;
var total = stepsTotal;
setActive(false);
setInnerCurrent(-1, {
e: e,
total: total
});
(_props$onSkip = props.onSkip) === null || _props$onSkip === void 0 || _props$onSkip.call(props, {
e: e,
current: innerCurrent,
total: total
});
};
var handlePrev = function handlePrev(e) {
var _props$onPrevStepClic;
var total = stepsTotal;
setInnerCurrent(innerCurrent - 1, {
e: e,
total: total
});
(_props$onPrevStepClic = props.onPrevStepClick) === null || _props$onPrevStepClic === void 0 || _props$onPrevStepClic.call(props, {
e: e,
prev: innerCurrent - 1,
current: innerCurrent,
total: total
});
};
var handleNext = function handleNext(e) {
var _props$onNextStepClic;
var total = stepsTotal;
setInnerCurrent(innerCurrent + 1, {
e: e,
total: total
});
(_props$onNextStepClic = props.onNextStepClick) === null || _props$onNextStepClic === void 0 || _props$onNextStepClic.call(props, {
e: e,
next: innerCurrent + 1,
current: innerCurrent,
total: total
});
};
var handleFinish = function handleFinish(e) {
var _props$onFinish;
var total = stepsTotal;
setActive(false);
setInnerCurrent(-1, {
e: e,
total: total
});
(_props$onFinish = props.onFinish) === null || _props$onFinish === void 0 || _props$onFinish.call(props, {
e: e,
current: innerCurrent,
total: total
});
};
var initGuide = function initGuide() {
if (innerCurrent >= 0 && innerCurrent < steps.length) {
if (!active) {
setActive(true);
_util_style.addClass(document.body, lockCls);
}
showGuide();
}
};
hooks_useLayoutEffect["default"](function () {
if (innerCurrent >= 0 && innerCurrent < steps.length) {
initGuide();
} else {
setActive(false);
destroyGuide();
}
}, [innerCurrent]);
hooks_useLayoutEffect["default"](function () {
initGuide();
}, []);
React.useEffect(function () {
window.addEventListener("resize", showGuideDebounce);
return function () {
window.removeEventListener("resize", showGuideDebounce);
destroyGuide();
};
}, []);
if (!_util_style.canUseDocument) {
return null;
}
var currentElmIsFixed = _util_style.isFixed(currentHighlightLayerElm.current || document.body);
var renderOverlayLayer = function renderOverlayLayer() {
return /*#__PURE__*/ReactDOM.createPortal(/* @__PURE__ */React__default["default"].createElement("div", {
ref: overlayLayerRef,
className: "".concat(prefixCls, "__overlay"),
style: {
zIndex: zIndex - 2
}
}), document.body);
};
var renderHighlightLayer = function renderHighlightLayer() {
var style = {
zIndex: zIndex - 1
};
var highlightClass = ["".concat(prefixCls, "__highlight"), "".concat(prefixCls, "__highlight--").concat(isPopup ? "popup" : "dialog"), "".concat(prefixCls, "--").concat(currentElmIsFixed && isPopup ? "fixed" : "absolute")];
var showOverlay = getCurrentCrossProps("showOverlay");
var maskClass = ["".concat(prefixCls, "__highlight--").concat(showOverlay ? "mask" : "nomask")];
var highlightContent = currentStepInfo.highlightContent;
var showHighlightContent = highlightContent && isPopup;
return /*#__PURE__*/ReactDOM.createPortal(/* @__PURE__ */React__default["default"].createElement("div", {
ref: highlightLayerRef,
className: classNames__default["default"](highlightClass.concat(showHighlightContent ? highlightClass : maskClass)),
style: style
}, showHighlightContent && /*#__PURE__*/React__default["default"].cloneElement(highlightContent, {
className: classNames__default["default"](highlightClass.concat(maskClass, highlightContent.props.className)),
style: _objectSpread(_objectSpread({}, style), highlightContent.props.style)
})), document.body);
};
var renderCounter = function renderCounter() {
var popupSlotCounter = isFunction.isFunction(counter) ? counter({
total: stepsTotal,
current: innerCurrent
}) : counter;
var popupDefaultCounter = /* @__PURE__ */React__default["default"].createElement("div", {
className: "".concat(prefixCls, "__counter")
}, popupSlotCounter || /* @__PURE__ */React__default["default"].createElement(React__default["default"].Fragment, null, innerCurrent + 1, "/", stepsTotal));
return /* @__PURE__ */React__default["default"].createElement(React__default["default"].Fragment, null, !hideCounter && popupDefaultCounter);
};
var renderAction = function renderAction(mode) {
var _getCurrentCrossProps, _getCurrentCrossProps2, _getCurrentCrossProps3, _props$finishButtonPr;
var isLast = innerCurrent === stepsTotal - 1;
var isFirst = innerCurrent === 0;
var buttonSize = mode === "popup" ? "small" : "medium";
return /* @__PURE__ */React__default["default"].createElement("div", {
className: "".concat(prefixCls, "__action")
}, !hideSkip && !isLast && /* @__PURE__ */React__default["default"].createElement(button_index.Button, _objectSpread({
className: "".concat(prefixCls, "__skip"),
theme: "default",
size: buttonSize,
variant: "base",
onClick: handleSkip
}, (_getCurrentCrossProps = getCurrentCrossProps("skipButtonProps")) !== null && _getCurrentCrossProps !== void 0 ? _getCurrentCrossProps : guideGlobalConfig.skipButtonProps)), !hidePrev && !isFirst && /* @__PURE__ */React__default["default"].createElement(button_index.Button, _objectSpread({
className: "".concat(prefixCls, "__prev"),
theme: "primary",
size: buttonSize,
variant: "base",
onClick: handlePrev
}, (_getCurrentCrossProps2 = getCurrentCrossProps("prevButtonProps")) !== null && _getCurrentCrossProps2 !== void 0 ? _getCurrentCrossProps2 : guideGlobalConfig.prevButtonProps)), !isLast && /* @__PURE__ */React__default["default"].createElement(button_index.Button, _objectSpread({
className: "".concat(prefixCls, "__next"),
theme: "primary",
size: buttonSize,
variant: "base",
onClick: handleNext
}, (_getCurrentCrossProps3 = getCurrentCrossProps("nextButtonProps")) !== null && _getCurrentCrossProps3 !== void 0 ? _getCurrentCrossProps3 : guideGlobalConfig.nextButtonProps)), isLast && /* @__PURE__ */React__default["default"].createElement(button_index.Button, _objectSpread({
className: "".concat(prefixCls, "__finish"),
theme: "primary",
size: buttonSize,
variant: "base",
onClick: handleFinish
}, (_props$finishButtonPr = props.finishButtonProps) !== null && _props$finishButtonPr !== void 0 ? _props$finishButtonPr : guideGlobalConfig.finishButtonProps)));
};
var renderTooltipBody = function renderTooltipBody() {
var title = /* @__PURE__ */React__default["default"].createElement("div", {
className: "".concat(prefixCls, "__title")
}, currentStepInfo.title);
var descBody = currentStepInfo.body;
var desc = /* @__PURE__ */React__default["default"].createElement("div", {
className: "".concat(prefixCls, "__desc")
}, descBody);
return /* @__PURE__ */React__default["default"].createElement(React__default["default"].Fragment, null, title, desc);
};
var renderPopupContent = function renderPopupContent() {
var footerClasses = ["".concat(prefixCls, "__footer"), "".concat(prefixCls, "__footer--popup")];
var action = /* @__PURE__ */React__default["default"].createElement("div", {
className: classNames__default["default"](footerClasses)
}, renderCounter(), renderAction("popup"));
return /* @__PURE__ */React__default["default"].createElement("div", {
className: "".concat(prefixCls, "__tooltip")
}, renderTooltipBody(), action);
};
var renderPopupGuide = function renderPopupGuide() {
var _currentStepInfo$chil, _currentStepInfo$popu, _currentStepInfo$popu2;
var content = (_currentStepInfo$chil = currentStepInfo.children) !== null && _currentStepInfo$chil !== void 0 ? _currentStepInfo$chil : currentStepInfo.content;
var renderBody;
if (/*#__PURE__*/React__default["default"].isValidElement(content)) {
var contentProps = {
handlePrev: handlePrev,
handleNext: handleNext,
handleSkip: handleSkip,
handleFinish: handleFinish,
current: innerCurrent,
total: stepsTotal
};
renderBody = isFunction.isFunction(content) ? content(contentProps) : /*#__PURE__*/React__default["default"].cloneElement(content, contentProps);
} else {
renderBody = renderPopupContent();
}
var classes = ["".concat(prefixCls, "__reference"), "".concat(prefixCls, "--").concat(currentElmIsFixed ? "fixed" : "absolute")];
var innerClassName = [defineProperty._defineProperty({}, "".concat(prefixCls, "__popup--content"), !!content)];
return /*#__PURE__*/ReactDOM.createPortal(/* @__PURE__ */React__default["default"].createElement(popup_index.Popup, _objectSpread(_objectSpread({
visible: true,
content: renderBody,
showArrow: !content,
zIndex: zIndex,
placement: currentStepInfo.placement
}, currentStepInfo.popupProps), {}, {
overlayClassName: ["".concat(prefixCls, "__popup"), currentStepInfo.stepOverlayClass, (_currentStepInfo$popu = currentStepInfo.popupProps) === null || _currentStepInfo$popu === void 0 ? void 0 : _currentStepInfo$popu.overlayClassName],
overlayInnerClassName: innerClassName.concat((_currentStepInfo$popu2 = currentStepInfo.popupProps) === null || _currentStepInfo$popu2 === void 0 ? void 0 : _currentStepInfo$popu2.overlayInnerClassName)
}), /* @__PURE__ */React__default["default"].createElement("div", {
ref: referenceLayerRef,
className: classNames__default["default"](classes)
})), document.body);
};
var renderDialogGuide = function renderDialogGuide() {
var style = {
zIndex: zIndex
};
var wrapperClasses = ["".concat(prefixCls, "__wrapper"), defineProperty._defineProperty({}, "".concat(prefixCls, "__wrapper--center"), currentStepInfo.placement === "center")];
var dialogClasses = ["".concat(prefixCls, "__reference"), "".concat(prefixCls, "--absolute"), "".concat(prefixCls, "__dialog"), defineProperty._defineProperty(defineProperty._defineProperty({}, "".concat(prefixCls, "__dialog--nomask"), !getCurrentCrossProps("showOverlay")), currentStepInfo.stepOverlayClass, !!currentStepInfo.stepOverlayClass)];
var footerClasses = ["".concat(prefixCls, "__footer"), "".concat(prefixCls, "__footer--popup")];
return /* @__PURE__ */React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/ReactDOM.createPortal(/* @__PURE__ */React__default["default"].createElement("div", {
ref: dialogWrapperRef,
className: classNames__default["default"](wrapperClasses),
style: style
}, /* @__PURE__ */React__default["default"].createElement("div", {
ref: dialogTooltipRef,
className: classNames__default["default"](dialogClasses)
}, renderTooltipBody(), /* @__PURE__ */React__default["default"].createElement("div", {
className: classNames__default["default"](footerClasses)
}, renderCounter(), renderAction("dialog")))), document.body));
};
var renderGuide = function renderGuide() {
return /* @__PURE__ */React__default["default"].createElement(React__default["default"].Fragment, null, renderOverlayLayer(), renderHighlightLayer(), isPopup ? renderPopupGuide() : renderDialogGuide());
};
return /* @__PURE__ */React__default["default"].createElement(React__default["default"].Fragment, null, innerCurrent > -1 && active && renderGuide());
};
Guide.displayName = "Guide";
exports["default"] = Guide;
//# sourceMappingURL=Guide.js.map