UNPKG

tdesign-mobile-vue

Version:
258 lines (250 loc) 11.9 kB
/** * tdesign v1.10.0 * (c) 2025 TDesign Group * @license MIT */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _defineProperty = require('@babel/runtime/helpers/defineProperty'); var Vue = require('vue'); var tdesignIconsVueNext = require('tdesign-icons-vue-next'); var badge_index = require('../badge/index.js'); var config = require('../config.js'); var tabBar_useTabBar = require('./useTabBar.js'); var tabBar_tabBarItemProps = require('./tab-bar-item-props.js'); var hooks_tnode = require('../hooks/tnode.js'); var hooks_useClass = require('../hooks/useClass.js'); var configProvider_useConfig = require('../_chunks/dep-8faf539a.js'); require('../badge/badge.js'); require('@babel/runtime/helpers/slicedToArray'); require('../badge/props.js'); require('../_chunks/dep-93492f08.js'); require('../_chunks/dep-afbc7386.js'); require('@babel/runtime/helpers/typeof'); require('../_chunks/dep-77928cee.js'); require('../_chunks/dep-37157f59.js'); require('../_chunks/dep-7185f130.js'); require('../shared/component.js'); require('../_chunks/dep-89a5c268.js'); require('../_common/js/global-config/mobile/default-config.js'); require('../_common/js/global-config/mobile/locale/zh_CN.js'); require('../_chunks/dep-f1b022d4.js'); require('../_chunks/dep-cf7b394b.js'); require('dayjs'); require('../_chunks/dep-820109e5.js'); require('../_chunks/dep-e7b24284.js'); require('../_chunks/dep-5c74143d.js'); require('../_chunks/dep-d9829397.js'); require('../_chunks/dep-e7a19ef8.js'); require('../_chunks/dep-86a65b5b.js'); require('../_chunks/dep-f1b8f994.js'); require('../_chunks/dep-ea958be9.js'); require('../_chunks/dep-ca892ae6.js'); require('../_chunks/dep-3beabe42.js'); require('../_chunks/dep-4010f39f.js'); require('../_chunks/dep-ca176637.js'); require('../_chunks/dep-7cea0cb6.js'); require('../_chunks/dep-260a218a.js'); require('../_chunks/dep-bfb01be8.js'); require('../_chunks/dep-2ef39d0b.js'); require('../_chunks/dep-ece32dab.js'); require('../_chunks/dep-2920a2ac.js'); require('../_chunks/dep-3911e21a.js'); require('../hooks/render-tnode.js'); require('../_chunks/dep-4ac62806.js'); require('../_chunks/dep-4c545d76.js'); require('../_chunks/dep-2c2d52bc.js'); require('../_chunks/dep-916464c0.js'); require('../_chunks/dep-e2ced27d.js'); require('../_chunks/dep-6e037233.js'); require('../_chunks/dep-1d4bd4d5.js'); require('../_chunks/dep-3faf272b.js'); require('../_common/js/utils/general.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty); function _isSlot(s) { return typeof s === 'function' || Object.prototype.toString.call(s) === '[object Object]' && !Vue.isVNode(s); } var prefix = config["default"].prefix; var _TabBarItem = Vue.defineComponent({ name: "".concat(prefix, "-tab-bar-item"), components: { TBadge: badge_index.Badge, TViewListIcon: tdesignIconsVueNext.ViewListIcon }, props: tabBar_tabBarItemProps["default"], setup: function setup(props, context) { var renderTNodeJSX = hooks_tnode.useTNodeJSX(); var renderContent = hooks_tnode.useContent(); var tabBarItemClass = hooks_useClass.usePrefixClass("tab-bar-item"); var _useConfig = configProvider_useConfig.useConfig("tabBar"), t = _useConfig.t, globalConfig = _useConfig.globalConfig; var _inject = Vue.inject("tab-bar"), split = _inject.split, shape = _inject.shape, theme = _inject.theme, defaultIndex = _inject.defaultIndex, activeValue = _inject.activeValue, itemCount = _inject.itemCount, updateChild = _inject.updateChild; var currentName = tabBar_useTabBar.initName(defaultIndex); var textNode = Vue.ref(); var badgeProps = Vue.computed(function () { return props.badgeProps; }); var getBadgeAriaLabel = function getBadgeAriaLabel() { var options = badgeProps.value; if (options !== null && options !== void 0 && options.dot || options !== null && options !== void 0 && options.count) { var maxCount = options.maxCount || 99; if (options.dot) { return globalConfig.value.newsAriaLabel; } if (options.count === "...") { return globalConfig.value.moreNewsAriaLabel; } var count = Number(options.count); if (isNaN(count)) { return "".concat(options.count); } var str1 = t(globalConfig.value.haveMoreNewsAriaLabel, { value: maxCount }); var str2 = t(globalConfig.value.haveNewsAriaLabel, { value: options.count }); return "".concat(Number(options.count) > maxCount ? str1 : str2); } return "TabBar"; }; Vue.ref(getBadgeAriaLabel()); var iconOnly = Vue.ref(false); Vue.watch(textNode, function () { var _textNode$value; var height = (_textNode$value = textNode.value) === null || _textNode$value === void 0 ? void 0 : _textNode$value.clientHeight; iconOnly.value = Number(height) === 0; }); var hasSubTabBar = Vue.computed(function () { return Array.isArray(props.subTabBar) && props.subTabBar.length > 0; }); var isChecked = Vue.computed(function () { if (hasSubTabBar.value && Array.isArray(activeValue.value)) { return activeValue.value.includes(currentName); } return currentName === activeValue.value; }); var isSpread = Vue.ref(false); Vue.watch(isChecked, function (newValue) { if (!newValue) { isSpread.value = false; } }); var crowded = Vue.ref(false); Vue.watch(itemCount, function () { crowded.value = itemCount.value > 3; if (isChecked.value) { isSpread.value = true; } }); var isToggleCurrent = Vue.computed(function () { return Array.isArray(activeValue.value) && activeValue.value[0] === currentName; }); var toggle = function toggle() { if (hasSubTabBar.value) { isSpread.value = !isSpread.value; if (!isToggleCurrent.value) { updateChild([currentName]); return; } } updateChild(currentName); }; var hasChildren = Vue.computed(function () { var _props$subTabBar; return Number((_props$subTabBar = props.subTabBar) === null || _props$subTabBar === void 0 ? void 0 : _props$subTabBar.length) > 0; }); var selectChild = function selectChild(childName) { if (!(Array.isArray(activeValue.value) && activeValue.value[1] === childName)) { updateChild([currentName, childName]); } isSpread.value = false; }; return function () { var iconContent = function iconContent() { var iconSlot = renderTNodeJSX("icon"); if (!iconSlot) { return null; } iconSlot === null || iconSlot === void 0 || iconSlot.forEach(function (item) { var _item$type; if (((_item$type = item.type) === null || _item$type === void 0 ? void 0 : _item$type.name) === "Icon") { item.props.size = iconOnly.value ? "24px" : "20px"; } }); return iconSlot; }; var badge = function badge() { var _slot; var _badgeProps$value, _badgeProps$value2, _badgeProps$value3, _badgeProps$value4, _badgeProps$value5, _badgeProps$value6, _badgeProps$value7, _badgeProps$value8; return iconContent() && Vue.createVNode("div", { "class": "".concat(tabBarItemClass.value, "__icon"), "style": { height: "".concat(iconOnly.value ? 24 : 20, "px") } }, [(_badgeProps$value = badgeProps.value) !== null && _badgeProps$value !== void 0 && _badgeProps$value.dot || (_badgeProps$value2 = badgeProps.value) !== null && _badgeProps$value2 !== void 0 && _badgeProps$value2.count ? Vue.createVNode(Vue.resolveComponent("t-badge"), { "count": ((_badgeProps$value3 = badgeProps.value) === null || _badgeProps$value3 === void 0 ? void 0 : _badgeProps$value3.count) || 0, "max-count": ((_badgeProps$value4 = badgeProps.value) === null || _badgeProps$value4 === void 0 ? void 0 : _badgeProps$value4.maxCount) || 99, "dot": ((_badgeProps$value5 = badgeProps.value) === null || _badgeProps$value5 === void 0 ? void 0 : _badgeProps$value5.dot) || false, "content": ((_badgeProps$value6 = badgeProps.value) === null || _badgeProps$value6 === void 0 ? void 0 : _badgeProps$value6.content) || "", "size": ((_badgeProps$value7 = badgeProps.value) === null || _badgeProps$value7 === void 0 ? void 0 : _badgeProps$value7.size) || "medium", "offset": ((_badgeProps$value8 = badgeProps.value) === null || _badgeProps$value8 === void 0 ? void 0 : _badgeProps$value8.offset) || [0, 0] }, _isSlot(_slot = iconContent()) ? _slot : { default: function _default() { return [_slot]; } }) : iconContent()]); }; var textNodeContent = function textNodeContent() { return Vue.createVNode("div", { "ref": textNode, "class": _defineProperty__default["default"](_defineProperty__default["default"]({}, "".concat(tabBarItemClass.value, "__text"), true), "".concat(tabBarItemClass.value, "__text--small"), !!iconContent()) }, [hasChildren.value && Vue.createVNode(Vue.resolveComponent("t-view-list-icon"), { "size": "16", "class": "".concat(tabBarItemClass.value, "__icon-menu") }, null), renderContent("default", "content")]); }; var menu = function menu() { if (hasChildren.value && isSpread.value) { return Vue.createVNode("div", { "role": "menu", "class": "".concat(tabBarItemClass.value, "__spread") }, [props.subTabBar.map(function (child, index) { return Vue.createVNode("div", { "key": index, "role": "tab", "class": "".concat(tabBarItemClass.value, "__spread-item"), "onClick": function onClick() { return selectChild(child.value || index); } }, [index !== 0 && Vue.createVNode("div", { "class": "".concat(tabBarItemClass.value, "__spread-item-split") }, null), Vue.createVNode("div", { "class": "".concat(tabBarItemClass.value, "__spread-item-text") }, [child.label])]); })]); } }; return Vue.createVNode("div", { "class": _defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"]({}, "".concat(tabBarItemClass.value), true), "".concat(tabBarItemClass.value, "--split"), split.value), "".concat(tabBarItemClass.value, "--text-only"), !iconContent()), "".concat(tabBarItemClass.value, "--crowded"), crowded.value), "".concat(tabBarItemClass.value, "--").concat(shape.value), true), "".concat(context.attrs.class || ""), true) }, [Vue.createVNode("div", { "class": _defineProperty__default["default"](_defineProperty__default["default"](_defineProperty__default["default"]({}, "".concat(tabBarItemClass.value, "__content"), true), "".concat(tabBarItemClass.value, "__content--checked"), isChecked.value), "".concat(tabBarItemClass.value, "__content--").concat(theme.value), true), "aria-selected": (!hasChildren.value || !isSpread.value) && isChecked.value, "aria-expanded": hasChildren.value && isSpread.value, "role": hasChildren.value ? "button" : "tab", "onClick": toggle }, [badge(), textNodeContent()]), menu()]); }; } }); exports["default"] = _TabBarItem; //# sourceMappingURL=tab-bar-item.js.map