UNPKG

tdesign-mobile-vue

Version:
339 lines (331 loc) 15.2 kB
/** * tdesign v1.9.3 * (c) 2025 TDesign Group * @license MIT */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _slicedToArray = require('@babel/runtime/helpers/slicedToArray'); var _defineProperty = require('@babel/runtime/helpers/defineProperty'); var vue = require('vue'); var config = require('../config.js'); var tabs_props = require('./props.js'); var tabs_tabNavItem = require('./tab-nav-item.js'); var hooks_useVModel = require('../hooks/useVModel.js'); var shared_dom = require('../shared/dom.js'); var sticky_index = require('../sticky/index.js'); var badge_index = require('../badge/index.js'); var hooks_tnode = require('../hooks/tnode.js'); var hooks_useClass = require('../hooks/useClass.js'); var hooks_useCommonClassName = require('../hooks/useCommonClassName.js'); var isFunction = require('../_chunks/dep-88fe047a.js'); require('./tab-panel-props.js'); require('../_chunks/dep-6df33aaf.js'); require('../_chunks/dep-3d4c38f1.js'); require('../_chunks/dep-afa9f3f2.js'); require('../_chunks/dep-2f809ed9.js'); require('@babel/runtime/helpers/typeof'); require('../_chunks/dep-ae809b86.js'); require('../_chunks/dep-757b152c.js'); require('../_chunks/dep-2b08c0a6.js'); require('../_chunks/dep-5be9198d.js'); require('../_chunks/dep-c3cb976c.js'); require('../sticky/sticky.js'); require('@vueuse/core'); require('../sticky/props.js'); require('../shared/component.js'); require('../_chunks/dep-21f18d3b.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-7c911ba3.js'); require('../_chunks/dep-ef223206.js'); require('../_chunks/dep-49f0a63e.js'); require('../_chunks/dep-d950aa21.js'); require('../_chunks/dep-a697b1b9.js'); require('../_chunks/dep-4dfb9b9c.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('../_chunks/dep-ccc9ad3d.js'); require('../hooks/render-tnode.js'); require('../_chunks/dep-a7319409.js'); require('../_chunks/dep-288156c7.js'); require('../_chunks/dep-675798b4.js'); require('../_common/js/utils/general.js'); require('../badge/badge.js'); require('../badge/props.js'); require('../_chunks/dep-ff4786c0.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray); var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty); 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 _Tabs = vue.defineComponent({ name: "".concat(prefix, "-tabs"), props: tabs_props["default"], setup: function setup(props2) { var renderTNodeJSX = hooks_tnode.useTNodeJSX(); var tabsClass = hooks_useClass.usePrefixClass("tabs"); var _useCommonClassName = hooks_useCommonClassName.useCommonClassName(), SIZE = _useCommonClassName.SIZE; var stickyProps = vue.computed(function () { return _objectSpread(_objectSpread({}, props2.stickyProps), {}, { disabled: !props2.sticky }); }); var activeClass = "".concat(tabsClass.value, "__item--active"); var disabledClass = "".concat(tabsClass.value, "__item--disabled"); var tabsClasses = vue.computed(function () { return ["".concat(tabsClass.value), props2.size && SIZE.value[props2.size]]; }); var navClasses = vue.ref(["".concat(tabsClass.value, "__nav")]); var startX = vue.ref(0); var startY = vue.ref(0); var endX = vue.ref(0); var endY = vue.ref(0); var canMove = vue.ref(true); var tabIndex = vue.computed(function () { var index = 0; for (var i = 0; i < itemProps.value.length; i++) { if (itemProps.value[i].value === currentValue.value) { index = i; break; } } return index; }); var _toRefs = vue.toRefs(props2), value = _toRefs.value, modelValue = _toRefs.modelValue; var _useVModel = hooks_useVModel["default"](value, modelValue, props2.defaultValue, props2.onChange), _useVModel2 = _slicedToArray__default["default"](_useVModel, 2), currentValue = _useVModel2[0], setCurrentValue = _useVModel2[1]; var itemProps = vue.computed(function () { if (props2.list) { return props2.list; } var children = renderTNodeJSX("default"); var res = []; var _label = {}; var _handler = function handler(children2) { children2 === null || children2 === void 0 || children2.forEach(function (child, index) { var _child$children; if (child.type === vue.Fragment) { _handler(child.children); } else { res.push(child); } if ((_child$children = child.children) !== null && _child$children !== void 0 && _child$children.label) { _label[index] = child.children.label()[0] || null; } }); }; _handler(children); children = res.filter(function (child) { return child.type.name === "".concat(prefix, "-tab-panel"); }); return children.map(function (item, index) { return _objectSpread(_objectSpread({}, item.props), {}, { label: function label() { return _label[index] || item.props.label; } }); }); }); var valueList = vue.computed(function () { return itemProps.value.map(function (v) { return v.value; }); }); var currentIndex = vue.computed(function () { return valueList.value.indexOf(currentValue.value); }); var navScroll = vue.ref(); var navWrap = vue.ref(); var navLine = vue.ref(); var lineStyle = vue.ref(); var moveToActiveTab = function moveToActiveTab() { if (navWrap.value && navLine.value && props2.showBottomLine) { var tab = navWrap.value.querySelector(".".concat(activeClass)); if (!tab) return; var line = navLine.value; var tabInner = tab.querySelector(".".concat(prefix, "-badge")); var style = {}; if (props2.bottomLineMode === "auto") { style.width = "".concat(Number(tabInner === null || tabInner === void 0 ? void 0 : tabInner.offsetWidth), "px"); style.transform = "translateX(".concat(Number(tab === null || tab === void 0 ? void 0 : tab.offsetLeft) + Number(tabInner === null || tabInner === void 0 ? void 0 : tabInner.offsetLeft), "px)"); } else if (props2.bottomLineMode === "full") { style.width = "".concat(Number(tab === null || tab === void 0 ? void 0 : tab.offsetWidth), "px"); style.transform = "translateX(".concat(Number(tab === null || tab === void 0 ? void 0 : tab.offsetLeft), "px)"); } else { style.transform = "translateX(".concat(Number(tab === null || tab === void 0 ? void 0 : tab.offsetLeft) + (Number(tab === null || tab === void 0 ? void 0 : tab.offsetWidth) - Number(line === null || line === void 0 ? void 0 : line.offsetWidth)) / 2, "px)"); } if (props2.animation) { style.transitionDuration = "".concat(props2.animation.duration, "ms"); } lineStyle.value = style; } if (navScroll.value) { var _tab = navScroll.value.querySelector(".".concat(activeClass)); if (!_tab) return; var tabLeft = _tab === null || _tab === void 0 ? void 0 : _tab.offsetLeft; var tabWidth = _tab === null || _tab === void 0 ? void 0 : _tab.offsetWidth; var navScrollWidth = navScroll.value.offsetWidth; var scrollDistance = tabLeft - navScrollWidth / 2 + tabWidth / 2; navScroll.value.scrollTo({ left: scrollDistance, behavior: "smooth" }); } }; vue.onMounted(function () { window.addEventListener("resize", moveToActiveTab, false); setTimeout(function () { moveToActiveTab(); }, 300); }); vue.onBeforeUnmount(function () { window.removeEventListener("resize", moveToActiveTab); }); vue.onActivated(function () { moveToActiveTab(); }); vue.watch(currentValue, function () { vue.nextTick(function () { moveToActiveTab(); }); }); vue.watch(itemProps, function () { vue.nextTick(function () { moveToActiveTab(); }); }, { deep: true }); var handleTabClick = function handleTabClick(event, item) { var _props2$onClick; var value2 = item.value, disabled = item.disabled; if (disabled || currentValue.value === value2) { return false; } var label = isFunction.isFunction(item.label) ? item.label(vue.h).toString() : item.label; setCurrentValue(value2, label); (_props2$onClick = props2.onClick) === null || _props2$onClick === void 0 || _props2$onClick.call(props2, value2, label); vue.nextTick(function () { moveToActiveTab(); }); }; var handlerScroll = function handlerScroll(context) { var scrollTop = context.scrollTop, isFixed = context.isFixed; if (props2.stickyProps) { var _props2$onScroll; (_props2$onScroll = props2.onScroll) === null || _props2$onScroll === void 0 || _props2$onScroll.call(props2, scrollTop, isFixed); } }; var handleTouchstart = function handleTouchstart(e) { if (!props2.swipeable) return; startX.value = e.targetTouches[0].clientX; startY.value = e.targetTouches[0].clientY; }; var handleTouchmove = function handleTouchmove(e) { if (!props2.swipeable) return; if (!canMove.value) return; endX.value = e.targetTouches[0].clientX; endY.value = e.targetTouches[0].clientY; var dValueX = Math.abs(startX.value - endX.value); var dValueY = Math.abs(startY.value - endY.value); if (tabIndex.value >= 0 && tabIndex.value < itemProps.value.length) { if (dValueX > dValueY) { shared_dom.preventDefault(e, false); if (dValueX <= 40) return; if (startX.value > endX.value) { if (tabIndex.value >= itemProps.value.length - 1) return; canMove.value = false; handleTabClick(e, itemProps.value[tabIndex.value + 1]); } else if (startX.value < endX.value) { if (tabIndex.value <= 0) return; canMove.value = false; handleTabClick(e, itemProps.value[tabIndex.value - 1]); } } } }; var handleTouchend = function handleTouchend() { if (!props2.swipeable) return; canMove.value = true; startX.value = 0; endX.value = 0; startY.value = 0; endY.value = 0; }; vue.provide("currentValue", vue.readonly(currentValue)); var readerNav = function readerNav() { return itemProps.value.map(function (item, index) { var badgeProps = item["badge-props"] || item.badgeProps; return vue.createVNode("div", { "class": _defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"]({}, "".concat(tabsClass.value, "__item ").concat(tabsClass.value, "__item--top"), true), "".concat(tabsClass.value, "__item--evenly"), props2.spaceEvenly), activeClass, item.value === currentValue.value), disabledClass, item.disabled), "".concat(tabsClass.value, "__item--").concat(props2.theme), true), "onClick": function onClick(e) { return handleTabClick(e, item); } }, [vue.createVNode(badge_index.Badge, badgeProps, { default: function _default() { return [vue.createVNode("div", { "class": _defineProperty__default["default"](_defineProperty__default["default"]({}, "".concat(tabsClass.value, "__item-inner ").concat(tabsClass.value, "__item-inner--").concat(props2.theme), true), "".concat(tabsClass.value, "__item-inner--active"), props2.theme === "tag" && item.value === currentValue.value) }, [vue.createVNode(tabs_tabNavItem["default"], { "label": item.label, "icon": item.icon }, null)])]; } }), props2.theme === "card" && index === currentIndex.value - 1 && vue.createVNode("div", { "class": "".concat(tabsClass.value, "__item-prefix") }, null), props2.theme === "card" && index === currentIndex.value + 1 && vue.createVNode("div", { "class": "".concat(tabsClass.value, "__item-suffix") }, null)]); }); }; return function () { return vue.createVNode("div", { "class": tabsClasses.value }, [vue.createVNode(sticky_index.Sticky, vue.mergeProps(stickyProps.value, { "onScroll": handlerScroll }), { default: function _default() { return [vue.createVNode("div", { "class": navClasses.value }, [vue.createVNode("div", { "ref": navScroll, "class": ["".concat(tabsClass.value, "__scroll"), "".concat(tabsClass.value, "__scroll--").concat(props2.theme), _defineProperty__default["default"]({}, "".concat(tabsClass.value, "__scroll--split"), props2.split)] }, [vue.createVNode("div", { "ref": navWrap, "class": "".concat(tabsClass.value, "__wrapper ").concat(tabsClass.value, "__wrapper--").concat(props2.theme) }, [readerNav(), props2.theme === "line" && props2.showBottomLine && vue.createVNode("div", { "ref": navLine, "class": "".concat(tabsClass.value, "__track ").concat(tabsClass.value, "__track--top"), "style": lineStyle.value }, null)])])])]; } }), renderTNodeJSX("middle"), vue.createVNode("div", { "class": "".concat(tabsClass.value, "__content"), "onTouchstart": handleTouchstart, "onTouchmove": handleTouchmove, "onTouchend": handleTouchend }, [renderTNodeJSX("default")])]); }; } }); exports["default"] = _Tabs; //# sourceMappingURL=tabs.js.map