UNPKG

tdesign-react

Version:
469 lines (461 loc) 22.8 kB
/** * 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