UNPKG

tdesign-mobile-vue

Version:
598 lines (590 loc) 25.1 kB
/** * tdesign v1.9.3 * (c) 2025 TDesign Group * @license MIT */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray'); var _defineProperty = require('@babel/runtime/helpers/defineProperty'); var _slicedToArray = require('@babel/runtime/helpers/slicedToArray'); var vue = require('vue'); var popover_index = require('../popover/index.js'); var popup_index = require('../popup/index.js'); var button_index = require('../button/index.js'); var config = require('../config.js'); var hooks_useVModel = require('../hooks/useVModel.js'); var shared_dom = require('../shared/dom.js'); var _common_js_utils_setStyle = require('../_common/js/utils/setStyle.js'); var guide_props = require('./props.js'); var guide_utils_dom = require('./utils/dom.js'); var hooks_useClass = require('../hooks/useClass.js'); var configProvider_useConfig = require('../_chunks/dep-21f18d3b.js'); var isFunction = require('../_chunks/dep-88fe047a.js'); require('../popover/popover.js'); require('../popover/props.js'); require('../hooks/tnode.js'); require('../hooks/render-tnode.js'); require('../_chunks/dep-ef223206.js'); require('@babel/runtime/helpers/typeof'); require('../_chunks/dep-c3cb976c.js'); require('../_chunks/dep-2f809ed9.js'); require('../_chunks/dep-757b152c.js'); require('../_chunks/dep-5be9198d.js'); require('../_chunks/dep-a7319409.js'); require('../_chunks/dep-afa9f3f2.js'); require('../_chunks/dep-ae809b86.js'); require('../_chunks/dep-2b08c0a6.js'); require('../_chunks/dep-288156c7.js'); require('../_chunks/dep-3d4c38f1.js'); require('../_chunks/dep-6df33aaf.js'); require('../_chunks/dep-675798b4.js'); require('../_chunks/dep-ccc9ad3d.js'); require('../_chunks/dep-d950aa21.js'); require('../_chunks/dep-a697b1b9.js'); require('../_chunks/dep-4dfb9b9c.js'); require('../_chunks/dep-7c911ba3.js'); require('../_common/js/utils/general.js'); require('../shared/useClickAway/index.js'); require('@vueuse/core'); require('../shared/util.js'); require('../_chunks/dep-ff4786c0.js'); require('../_chunks/dep-b9642a56.js'); require('../_common/js/global-config/mobile/default-config.js'); require('../_common/js/global-config/mobile/locale/zh_CN.js'); require('../_chunks/dep-28b1e09d.js'); require('../_chunks/dep-57aa1aa0.js'); require('dayjs'); require('../_chunks/dep-85204fa0.js'); require('../_chunks/dep-f6b14f80.js'); require('../_chunks/dep-a8d60643.js'); require('../_chunks/dep-49f0a63e.js'); require('../_chunks/dep-c65deed7.js'); require('../_chunks/dep-94eeec5a.js'); require('../_chunks/dep-060bf1cf.js'); require('../_chunks/dep-0e05e959.js'); require('../_chunks/dep-324da301.js'); require('../_chunks/dep-da6dc2cf.js'); require('../shared/component.js'); require('../popup/popup.js'); require('tdesign-icons-vue-next'); require('../popup/props.js'); require('../overlay/index.js'); require('../overlay/overlay.js'); require('../overlay/props.js'); require('../hooks/useLockScroll.js'); require('../_util/useTouch.js'); require('../_util/getScrollParent.js'); require('../hooks/useTeleport.js'); require('../shared/render-tnode.js'); require('../button/button.js'); require('../loading/index.js'); require('../loading/loading.js'); require('../loading/icon/gradient.js'); require('../_common/js/loading/circle-adapter.js'); require('../_common/js/utils/helper.js'); require('@babel/runtime/helpers/objectWithoutProperties'); require('../_chunks/dep-6b5052db.js'); require('../_chunks/dep-f11711eb.js'); require('../loading/icon/spinner.js'); require('../loading/props.js'); require('../loading/plugin.js'); require('../button/props.js'); require('../form/hooks.js'); require('../_chunks/dep-d5bc9590.js'); require('../shared/hover.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray); var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty); var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray); 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__default["default"](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 prefix = config["default"].prefix; var _Guide = vue.defineComponent({ name: "".concat(prefix, "-guide"), components: { TPopover: popover_index.Popover, TButton: button_index.Button, TPopup: popup_index.Popup }, props: guide_props["default"], setup: function setup(props, context) { var _toRefs = vue.toRefs(props), current = _toRefs.current, modelValue = _toRefs.modelValue, finishButtonProps = _toRefs.finishButtonProps, hideCounter = _toRefs.hideCounter, hideSkip = _toRefs.hideSkip, steps = _toRefs.steps, zIndex = _toRefs.zIndex; var _useVModel = hooks_useVModel["default"](current, modelValue, props.defaultCurrent, props.onChange, "current"), _useVModel2 = _slicedToArray__default["default"](_useVModel, 2), innerCurrent = _useVModel2[0], setInnerCurrent = _useVModel2[1]; var _useConfig = configProvider_useConfig.useConfig("guide"), globalConfig = _useConfig.globalConfig; var guideClass = hooks_useClass.usePrefixClass("guide"); var LOCK_CLASS = "".concat(guideClass.value, "--lock"); var overlayLayerRef = vue.ref(); var highlightLayerRef = vue.ref(); var referenceLayerRef = vue.ref(); var currentHighlightLayerElm = vue.ref(); var popoverWrapperRef = vue.ref(); var actived = vue.ref(false); var stepsTotal = vue.computed(function () { return steps.value.length; }); var currentStepInfo = vue.computed(function () { return steps.value[innerCurrent.value]; }); var isPopover = vue.computed(function () { return getCurrentCrossProps("mode") === "popover"; }); var popoverVisible = vue.ref(false); var isPopoverCenter = vue.computed(function () { return isPopover.value && currentStepInfo.value.placement === "center"; }); var stepProps = vue.computed(function () { if (isPopover.value) { return _objectSpread({ visible: popoverVisible.value, placement: isPopoverCenter.value ? "bottom" : currentStepInfo.value.placement, theme: "light", showArrow: false }, currentStepInfo.value.popoverProps); } return { visible: popoverVisible.value, zIndex: zIndex.value, placement: "center", class: "".concat(guideClass.value, "__dialog"), overlayProps: { zIndex: zIndex.value - 1 } }; }); var currentElmIsFixed = vue.computed(function () { return guide_utils_dom.isFixed(currentHighlightLayerElm.value || document.body); }); var getCurrentCrossProps = function getCurrentCrossProps(propsName) { var _currentStepInfo$valu; return (_currentStepInfo$valu = currentStepInfo.value[propsName]) !== null && _currentStepInfo$valu !== void 0 ? _currentStepInfo$valu : props[propsName]; }; var hWithParams = function hWithParams() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { currentStepInfo: currentStepInfo.value }; var newH = function newH() { return vue.h.apply(void 0, arguments); }; return Object.assign(newH, params); }; var currentCustomHighlightContent = vue.computed(function () { var highlightContent = currentStepInfo.value.highlightContent; var node = highlightContent; if (isFunction.isFunction(highlightContent)) { node = highlightContent(hWithParams()); } else if (context.slots.highlightContent) { node = context.slots.highlightContent(hWithParams()); } else if (context.slots["highlight-content"]) { node = context.slots["highlight-content"](hWithParams()); } if (node) { if (!node.props) node.props = {}; node.props.class = node.props.class || ""; } return node; }); var showCustomHighlightContent = vue.computed(function () { return Boolean(currentCustomHighlightContent.value && isPopover.value); }); var showOverlay = vue.computed(function () { return getCurrentCrossProps("showOverlay"); }); var highlightClass = vue.computed(function () { return ["".concat(guideClass.value, "__highlight"), "".concat(guideClass.value, "__highlight--").concat(isPopover.value ? "popover" : "dialog"), "".concat(guideClass.value, "--").concat(currentElmIsFixed.value && isPopover.value ? "fixed" : "absolute")]; }); var maskClass = vue.computed(function () { return ["".concat(guideClass.value, "__highlight--").concat(showOverlay.value ? "mask" : "nomask")]; }); var wrapperClass = vue.computed(function () { return ["".concat(guideClass.value, "__wrapper"), "".concat(guideClass.value, "--").concat(currentElmIsFixed.value ? "fixed" : "absolute"), _defineProperty__default["default"]({}, "".concat(guideClass.value, "__wrapper--content"), !!currentStepInfo.value.content)]; }); var popoverClass = vue.computed(function () { return ["".concat(guideClass.value, "__reference")]; }); var contentClass = vue.computed(function () { return ["".concat(guideClass.value, "__content--").concat(isPopover.value ? "popover" : "dialog")]; }); var footerClass = vue.computed(function () { return ["".concat(guideClass.value, "__footer"), "".concat(guideClass.value, "__footer--").concat(isPopover.value ? "popover" : "dialog")]; }); var isLast = vue.computed(function () { return innerCurrent.value === stepsTotal.value - 1; }); var buttonSize = vue.computed(function () { return isPopover.value ? "extra-small" : "medium"; }); var setHighlightLayerPosition = function setHighlightLayerPosition(highlightLayer) { var isReference = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var _getRelativePosition = guide_utils_dom.getRelativePosition(currentHighlightLayerElm.value), top = _getRelativePosition.top, left = _getRelativePosition.left; var _currentHighlightLaye = currentHighlightLayerElm.value.getBoundingClientRect(), width = _currentHighlightLaye.width, height = _currentHighlightLaye.height; var highlightPadding = getCurrentCrossProps("highlightPadding"); if (isPopover.value) { width += highlightPadding * 2; height += highlightPadding * 2; top -= highlightPadding; left -= highlightPadding; } else { var _getWindowScroll = shared_dom.getWindowScroll(), scrollTop = _getWindowScroll.scrollTop, scrollLeft = _getWindowScroll.scrollLeft; top += scrollTop; left += scrollLeft; } var style = { top: "".concat(top, "px"), left: "".concat(left, "px") }; if (showCustomHighlightContent.value) { if (isReference) { var _highlightLayerRef$va = highlightLayerRef.value.getBoundingClientRect(), width2 = _highlightLayerRef$va.width, height2 = _highlightLayerRef$va.height; Object.assign(style, { width: "".concat(width2, "px"), height: "".concat(height2, "px") }); } else { Object.assign(style, { width: "auto", height: "auto" }); } } else { Object.assign(style, { width: "".concat(width, "px"), height: "".concat(height, "px") }); } _common_js_utils_setStyle["default"](highlightLayer, style); }; var setReferenceFullW = function setReferenceFullW(referenceElements) { var style = { left: 0, width: "100vw" }; referenceElements.forEach(function (elem) { return _common_js_utils_setStyle["default"](elem, style); }); }; var showPopoverGuide = function showPopoverGuide() { vue.nextTick(function () { currentHighlightLayerElm.value = guide_utils_dom.getTargetElm(currentStepInfo.value.element); if (!currentHighlightLayerElm.value) return; guide_utils_dom.scrollToParentVisibleArea(currentHighlightLayerElm.value); setHighlightLayerPosition(highlightLayerRef.value); setHighlightLayerPosition(popoverWrapperRef.value, true); setHighlightLayerPosition(referenceLayerRef.value, true); guide_utils_dom.scrollToElm(currentHighlightLayerElm.value); isPopoverCenter.value && setReferenceFullW([referenceLayerRef.value, popoverWrapperRef.value]); }); }; var showDialogGuide = function showDialogGuide() { vue.nextTick(function () { currentHighlightLayerElm.value = guide_utils_dom.getTargetElm(currentStepInfo.value.element); guide_utils_dom.scrollToParentVisibleArea(currentHighlightLayerElm.value); setHighlightLayerPosition(highlightLayerRef.value); guide_utils_dom.scrollToElm(currentHighlightLayerElm.value); }); }; var showGuide = function showGuide() { if (isPopover.value) { showPopoverGuide(); } else { showDialogGuide(); } vue.nextTick(function () { popoverVisible.value = true; }); }; var destroyGuide = function destroyGuide() { var _highlightLayerRef$va2, _overlayLayerRef$valu; (_highlightLayerRef$va2 = highlightLayerRef.value) === null || _highlightLayerRef$va2 === void 0 || _highlightLayerRef$va2.parentNode.removeChild(highlightLayerRef.value); (_overlayLayerRef$valu = overlayLayerRef.value) === null || _overlayLayerRef$valu === void 0 || _overlayLayerRef$valu.parentNode.removeChild(overlayLayerRef.value); shared_dom.removeClass(document.body, LOCK_CLASS); }; var renderButtonContent = function renderButtonContent(buttonProps, defaultContent) { var _ref2 = buttonProps || {}, content = _ref2.content; return isFunction.isFunction(content) ? content(vue.h) : content || defaultContent; }; var handleSkip = function handleSkip(e) { var _props$onSkip; var total = stepsTotal.value; actived.value = false; setInnerCurrent(-1, { e: e, total: total }); (_props$onSkip = props.onSkip) === null || _props$onSkip === void 0 || _props$onSkip.call(props, { e: e, current: innerCurrent.value, total: total }); }; var handleNext = function handleNext(e) { var _props$onNextStepClic; var total = stepsTotal.value; setInnerCurrent(innerCurrent.value + 1, { e: e, total: total }); (_props$onNextStepClic = props.onNextStepClick) === null || _props$onNextStepClic === void 0 || _props$onNextStepClic.call(props, { e: e, next: innerCurrent.value + 1, current: innerCurrent.value, total: total }); }; var handleFinish = function handleFinish(e) { var _props$onFinish; var total = stepsTotal.value; actived.value = false; setInnerCurrent(-1, { e: e, total: total }); (_props$onFinish = props.onFinish) === null || _props$onFinish === void 0 || _props$onFinish.call(props, { e: e, current: innerCurrent.value, total: total }); }; var handleBack = function handleBack(e) { var _props$onBack; var total = stepsTotal.value; setInnerCurrent(0, { e: e, total: total }); (_props$onBack = props.onBack) === null || _props$onBack === void 0 || _props$onBack.call(props, { e: e, current: innerCurrent.value, total: total }); }; var contentProps = vue.computed(function () { return { handleSkip: handleSkip, handleNext: handleNext, handleFinish: handleFinish, handleBack: handleBack, current: innerCurrent.value, total: stepsTotal.value }; }); var initGuide = function initGuide() { if (innerCurrent.value >= 0 && innerCurrent.value < steps.value.length) { if (!actived.value) { actived.value = true; shared_dom.addClass(document.body, LOCK_CLASS); } showGuide(); } }; vue.watch(innerCurrent, function (val) { if (val >= 0 && val < stepsTotal.value) { isPopover.value && (popoverVisible.value = false); initGuide(); } else { actived.value = false; destroyGuide(); } }); vue.onMounted(function () { initGuide(); }); return function () { var renderStepContent = function renderStepContent() { var _finishButtonProps$va; var renderTitleNode = function renderTitleNode() { var title = currentStepInfo.value.title; var renderTitle = null; if (isFunction.isFunction(title)) { renderTitle = title(hWithParams()); } else if (context.slots.title) { renderTitle = context.slots.title(hWithParams()); } else if (typeof title === "string") { renderTitle = title; } else if (title) { renderTitle = vue.h(title); } return renderTitle; }; var renderBodyNode = function renderBodyNode() { var body = currentStepInfo.value.body; var renderBody = null; if (isFunction.isFunction(body)) { renderBody = body(hWithParams()); } else if (context.slots.body) { renderBody = context.slots.body(hWithParams()); } else if (typeof body === "string") { renderBody = body; } else if (body) { renderBody = vue.h(body); } return renderBody; }; var renderCounterNode = function renderCounterNode() { var params = { total: stepsTotal.value, current: innerCurrent.value }; var renderCounter = null; var counter = props.counter; if (isFunction.isFunction(counter)) { renderCounter = counter(vue.h, params); } else if (context.slots.counter) { renderCounter = context.slots.counter(hWithParams(params)); } else if (counter) { renderCounter = vue.h(counter, params); } return renderCounter || " (".concat(innerCurrent.value + 1, "/").concat(stepsTotal.value, ")"); }; return vue.createVNode("div", { "class": contentClass.value }, [vue.createVNode("div", { "class": "".concat(guideClass.value, "__tooltip") }, [vue.createVNode("div", { "class": "".concat(guideClass.value, "__title") }, [renderTitleNode()]), vue.createVNode("div", { "class": "".concat(guideClass.value, "__desc") }, [renderBodyNode()])]), vue.createVNode("div", { "class": footerClass.value }, [!hideSkip.value && !isLast.value && vue.createVNode(button_index.Button, vue.mergeProps({ "key": "skip", "class": "".concat(guideClass.value, "__skip"), "theme": "light", "size": buttonSize.value, "variant": "base", "content": globalConfig.value.skip }, getCurrentCrossProps("skipButtonProps"), { "onClick": handleSkip }), null), !isLast.value && vue.createVNode(button_index.Button, vue.mergeProps({ "key": "next", "class": "".concat(guideClass.value, "__next"), "theme": "primary", "size": buttonSize.value, "variant": "base" }, getCurrentCrossProps("nextButtonProps"), { "onClick": handleNext }), { content: function content() { return vue.createVNode(vue.Fragment, null, [renderButtonContent(getCurrentCrossProps("nextButtonProps"), globalConfig.value.next), !hideCounter.value && renderCounterNode()]); } }), isLast.value && vue.createVNode(button_index.Button, vue.mergeProps({ "key": "back", "class": "".concat(guideClass.value, "__back"), "theme": "light", "size": buttonSize.value, "variant": "base", "content": globalConfig.value.back }, getCurrentCrossProps("backButtonProps"), { "onClick": handleBack }), null), isLast.value && vue.createVNode(button_index.Button, vue.mergeProps({ "key": "finish", "class": "".concat(guideClass.value, "__finish"), "theme": "primary", "size": buttonSize.value, "variant": "base" }, (_finishButtonProps$va = finishButtonProps.value) !== null && _finishButtonProps$va !== void 0 ? _finishButtonProps$va : {}, { "onClick": handleFinish }), { content: function content() { return vue.createVNode(vue.Fragment, null, [renderButtonContent(finishButtonProps.value, globalConfig.value.finish), !hideCounter.value && renderCounterNode()]); } })])]); }; var renderContentNode = function renderContentNode() { var content = currentStepInfo.value.content; var renderContent; if (isFunction.isFunction(content)) { renderContent = content(hWithParams(contentProps.value)); } else if (context.slots.content) { renderContent = context.slots.content(hWithParams(contentProps.value)); } else if (content) { renderContent = vue.h(content, contentProps.value); } return renderContent; }; var renderPopover = function renderPopover() { return vue.createVNode(popover_index.Popover, stepProps.value, { triggerElement: function triggerElement() { return isPopover.value && vue.createVNode("div", { "ref": referenceLayerRef, "class": _toConsumableArray__default["default"](popoverClass.value) }, null); }, content: function content() { return isPopover.value && renderContentNode() ? renderContentNode() : renderStepContent(); } }); }; var renderPopup = function renderPopup() { return vue.createVNode(popup_index.Popup, stepProps.value, { default: function _default() { return isPopover.value && renderContentNode() ? renderContentNode() : renderStepContent(); } }); }; var renderCurrentCustomHighlightContentNode = function renderCurrentCustomHighlightContentNode() { var highlightContent = currentStepInfo.value.highlightContent; var node = highlightContent; if (isFunction.isFunction(highlightContent)) { node = highlightContent(hWithParams()); } else if (context.slots.highlightContent) { node = context.slots.highlightContent(hWithParams()); } else if (context.slots["highlight-content"]) { node = context.slots["highlight-content"](hWithParams()); } if (node) { if (!node.props) node.props = {}; node.props.class = node.props.class || ""; } return node; }; return vue.createVNode(vue.Fragment, null, [actived.value && vue.createVNode(vue.Teleport, { "to": "body" }, { default: function _default() { return [vue.createVNode("div", { "ref": overlayLayerRef, "class": "".concat(guideClass.value, "__overlay"), "style": { zIndex: "".concat(zIndex.value - 2) } }, null), vue.createVNode("div", { "ref": highlightLayerRef, "class": [].concat(_toConsumableArray__default["default"](highlightClass.value), _toConsumableArray__default["default"](maskClass.value)), "style": { zIndex: "".concat(zIndex.value - 1) } }, [showCustomHighlightContent.value && renderCurrentCustomHighlightContentNode()]), vue.createVNode("div", { "ref": popoverWrapperRef, "class": wrapperClass.value, "style": { zIndex: zIndex.value } }, [isPopover.value ? renderPopover() : renderPopup()])]; } })]); }; } }); exports["default"] = _Guide; //# sourceMappingURL=guide.js.map