tdesign-mobile-vue
Version:
tdesign-mobile-vue
339 lines (331 loc) • 15.2 kB
JavaScript
/**
* tdesign v1.9.3
* (c) 2025 TDesign Group
* @license MIT
*/
;
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