@mc-markets/ui 1.1.51 → 1.1.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../packages/components/Icon/Icon.vue","../packages/hooks/useExposeRef.js","../packages/components/Button/Button.vue","../packages/components/Input/Input.vue","../packages/components/Form/Form.vue","../packages/components/FormItem/FormItem.vue","../packages/utils/classNames.js","../packages/hooks/useClassName.js","../packages/components/Tooltip/Tooltip.vue","../packages/components/Select/Select.vue","../packages/components/Option/Option.vue","../packages/components/OptionGroup/OptionGroup.vue","../packages/components/Pagination/Pagination.vue","../packages/components/Radio/Radio.vue","../packages/components/RadioGroup/RadioGroup.vue","../packages/components/RadioButton/RadioButton.vue","../packages/components/Switch/Switch.vue","../packages/components/Tag/Tag.vue","../packages/components/Alert/Alert.vue","../packages/components/Dialog/Dialog.vue","../packages/components/Notification/Notification.vue","../packages/components/Message/Message.vue","../packages/components/NotifiMessage/NotifiMessage.vue","../packages/components/DatePicker/DatePicker.vue","../packages/components/Empty/Empty.vue","../packages/components/Table/Table.vue","../packages/components/Table/TableColumn.vue","../packages/components/Banner/Banner.vue","../packages/utils/styleUtils.js","../packages/components/Tabs/Tabs.vue","../packages/components/Tabs/TabPane.vue","../packages/components/TabCard/TabCardItem.vue","../packages/components/TabCard/TabCard.vue","../packages/components/Breadcrumb/BreadcrumbSeparator.vue","../packages/components/Breadcrumb/Breadcrumb.vue","../node_modules/vant/es/utils/basic.mjs","../node_modules/vant/es/utils/props.mjs","../node_modules/@vant/use/dist/index.esm.mjs","../node_modules/vant/es/utils/dom.mjs","../node_modules/vant/es/utils/format.mjs","../node_modules/vant/es/utils/deep-assign.mjs","../node_modules/vant/es/locale/lang/zh-CN.mjs","../node_modules/vant/es/locale/index.mjs","../node_modules/vant/es/utils/create.mjs","../node_modules/vant/es/utils/constant.mjs","../node_modules/vant/es/utils/interceptor.mjs","../node_modules/vant/es/utils/with-install.mjs","../node_modules/vant/es/composables/on-popup-reopen.mjs","../node_modules/vant/es/composables/use-expose.mjs","../node_modules/vant/es/badge/Badge.mjs","../node_modules/vant/es/badge/index.mjs","../node_modules/vant/es/composables/use-global-z-index.mjs","../node_modules/vant/es/config-provider/ConfigProvider.mjs","../node_modules/vant/es/icon/Icon.mjs","../node_modules/vant/es/icon/index.mjs","../node_modules/vant/es/popup/shared.mjs","../node_modules/vant/es/composables/use-touch.mjs","../node_modules/vant/es/composables/use-lock-scroll.mjs","../node_modules/vant/es/composables/use-lazy-render.mjs","../node_modules/vant/es/composables/use-scope-id.mjs","../node_modules/vant/es/overlay/Overlay.mjs","../node_modules/vant/es/overlay/index.mjs","../node_modules/vant/es/popup/Popup.mjs","../node_modules/vant/es/popup/index.mjs","../packages/components/Picker/Picker.vue","../packages/index.js"],"sourcesContent":["<template>\r\n <i \r\n :class=\"iconClass\" \r\n :style=\"iconStyle\"\r\n v-bind=\"$attrs\"\r\n @click=\"handleClick\"\r\n >\r\n <slot></slot>\r\n </i>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\n\r\n// 定义组件名\r\ndefineOptions({\r\n name: 'MIcon'\r\n})\r\n\r\nconst props = defineProps({\r\n name: {\r\n type: String,\r\n required: true\r\n },\r\n size: {\r\n type: [String, Number],\r\n default: '16px'\r\n },\r\n color: {\r\n type: String,\r\n default: 'inherit'\r\n },\r\n spin: {\r\n type: Boolean,\r\n default: false\r\n },\r\n pulse: {\r\n type: Boolean,\r\n default: false\r\n },\r\n rotate: {\r\n type: Number,\r\n default: 0\r\n },\r\n flip: {\r\n type: String,\r\n default: undefined\r\n },\r\n prefix: {\r\n type: String,\r\n default: 'icon'\r\n }\r\n})\r\n\r\nconst emit = defineEmits(['click'])\r\n\r\n// 计算图标类名\r\nconst iconClass = computed(() => {\r\n const classes = ['iconfont']\r\n \r\n // 添加图标名称类\r\n if (props.name) {\r\n classes.push(`${props.prefix}-${props.name}`)\r\n }\r\n \r\n // 添加动画类\r\n if (props.spin) {\r\n classes.push('icon-spin')\r\n }\r\n if (props.pulse) {\r\n classes.push('icon-pulse')\r\n }\r\n \r\n // 添加翻转类\r\n if (props.flip) {\r\n classes.push(`icon-flip-${props.flip}`)\r\n }\r\n \r\n return classes\r\n})\r\n\r\n// 计算图标样式\r\nconst iconStyle = computed(() => {\r\n const style = {}\r\n \r\n // 设置大小\r\n if (props.size) {\r\n if (typeof props.size === 'number') {\r\n style.fontSize = `${props.size}px`\r\n } else {\r\n style.fontSize = props.size\r\n }\r\n }\r\n \r\n // 设置颜色\r\n if (props.color) {\r\n style.color = props.color\r\n }\r\n \r\n // 设置旋转\r\n if (props.rotate !== 0) {\r\n style.transform = `rotate(${props.rotate}deg)`\r\n }\r\n \r\n return style\r\n})\r\n\r\n// 点击事件处理\r\nconst handleClick = (event) => {\r\n emit('click', event)\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\r\n/* 旋转动画 */\r\n.icon-spin {\r\n animation: icon-spin 1s linear infinite;\r\n}\r\n\r\n@keyframes icon-spin {\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n/* 脉冲动画 */\r\n.icon-pulse {\r\n animation: icon-pulse 1s ease-in-out infinite;\r\n}\r\n\r\n@keyframes icon-pulse {\r\n 0% {\r\n transform: scale(1);\r\n }\r\n 50% {\r\n transform: scale(1.1);\r\n }\r\n 100% {\r\n transform: scale(1);\r\n }\r\n}\r\n\r\n/* 翻转效果 */\r\n.icon-flip-horizontal {\r\n transform: scaleX(-1);\r\n}\r\n\r\n.icon-flip-vertical {\r\n transform: scaleY(-1);\r\n}\r\n\r\n.icon-flip-both {\r\n transform: scale(-1);\r\n}\r\n\r\n/* 当有旋转时,需要与翻转效果结合 */\r\n.icon-spin.icon-flip-horizontal {\r\n animation: icon-spin-flip-horizontal 1s linear infinite;\r\n}\r\n\r\n.icon-spin.icon-flip-vertical {\r\n animation: icon-spin-flip-vertical 1s linear infinite;\r\n}\r\n\r\n.icon-spin.icon-flip-both {\r\n animation: icon-spin-flip-both 1s linear infinite;\r\n}\r\n\r\n@keyframes icon-spin-flip-horizontal {\r\n from {\r\n transform: rotate(0deg) scaleX(-1);\r\n }\r\n to {\r\n transform: rotate(360deg) scaleX(-1);\r\n }\r\n}\r\n\r\n@keyframes icon-spin-flip-vertical {\r\n from {\r\n transform: rotate(0deg) scaleY(-1);\r\n }\r\n to {\r\n transform: rotate(360deg) scaleY(-1);\r\n }\r\n}\r\n\r\n@keyframes icon-spin-flip-both {\r\n from {\r\n transform: rotate(0deg) scale(-1);\r\n }\r\n to {\r\n transform: rotate(360deg) scale(-1);\r\n }\r\n}\r\n</style>\r\n","import { ref } from 'vue'\r\n\r\n/**\r\n * 无感透传 ref 的 Hook\r\n * 通过 Proxy 将外部 ref 访问转发给内部 Element Plus 组件实例\r\n * \r\n * @param {string} refName - 内部 ref 的名称,默认为 'innerRef'\r\n * @param {Object} options - 配置选项\r\n * @param {Object} options.compatibilityKeys - 兼容性字段映射 { key: value }\r\n * @returns {Object} 包含 innerRef 和 exposedProxy 的对象\r\n * \r\n * @example\r\n * // 在组件中使用\r\n * const { innerRef, exposedProxy } = useExposeRef('innerTableRef')\r\n * defineExpose(exposedProxy)\r\n * \r\n * // 在模板中使用\r\n * <el-table v-bind=\"$attrs\" ref=\"innerTableRef\">\r\n */\r\nexport function useExposeRef(refName = 'innerRef', options = {}) {\r\n const { compatibilityKeys = {} } = options\r\n \r\n // 创建内部 ref\r\n const innerRef = ref()\r\n \r\n // 创建 Proxy 代理对象\r\n const exposedProxy = new Proxy({}, {\r\n get(_target, key) {\r\n // 返回兼容性字段\r\n if (key in compatibilityKeys) {\r\n const value = compatibilityKeys[key]\r\n return typeof value === 'function' ? value() : value\r\n }\r\n \r\n // 保留默认兼容字段\r\n if (key === 'elRef' || key === refName) {\r\n return innerRef\r\n }\r\n // 动态生成 getter 方法:getElRef, getInnerRef, getInnerTableRef 等\r\n // 将 refName 转换为驼峰命名,如 innerTableRef -> InnerTableRef\r\n const getterMethodName = 'get' + refName.charAt(0).toUpperCase() + refName.slice(1)\r\n if (key === 'getElRef' || key === getterMethodName) {\r\n return () => innerRef.value\r\n }\r\n if (key === 'call') {\r\n return (method, ...args) => innerRef.value?.[method]?.(...args)\r\n }\r\n \r\n // 访问内部实例的属性或方法\r\n const target = innerRef.value\r\n if (!target) return undefined\r\n \r\n // 使用 Reflect.get 支持 Symbol 类型的 key\r\n const value = Reflect.get(target, key, target)\r\n // 如果是函数,绑定 this 指向原实例\r\n return typeof value === 'function' ? value.bind(target) : value\r\n },\r\n set(_target, key, val) {\r\n const target = innerRef.value\r\n if (target) {\r\n target[key] = val\r\n }\r\n return true\r\n },\r\n has(_target, key) {\r\n // 检查兼容字段\r\n const getterMethodName = `get${refName.charAt(0).toUpperCase() + refName.slice(1)}`\r\n if (key in compatibilityKeys || key === 'elRef' || key === refName || key === 'getElRef' || key === getterMethodName || key === 'call') {\r\n return true\r\n }\r\n // 检查内部实例\r\n const target = innerRef.value\r\n // 使用 Reflect.has 支持 Symbol 类型的 key\r\n return target ? Reflect.has(target, key) : false\r\n },\r\n ownKeys(_target) {\r\n const target = innerRef.value\r\n if (target) {\r\n return Reflect.ownKeys(target)\r\n }\r\n return []\r\n },\r\n getOwnPropertyDescriptor(_target, key) {\r\n // 检查兼容字段\r\n const getterMethodName = `get${refName.charAt(0).toUpperCase() + refName.slice(1)}`\r\n if (key in compatibilityKeys || key === 'elRef' || key === refName || key === 'getElRef' || key === getterMethodName || key === 'call') {\r\n return {\r\n enumerable: true,\r\n configurable: true\r\n }\r\n }\r\n \r\n // 检查内部实例\r\n const target = innerRef.value\r\n if (target && key in target) {\r\n return Reflect.getOwnPropertyDescriptor(target, key)\r\n }\r\n \r\n // 如果都不存在,返回 undefined(符合 Proxy 规范)\r\n return undefined\r\n }\r\n })\r\n \r\n return {\r\n innerRef,\r\n exposedProxy\r\n }\r\n}\r\n","<template>\r\n <el-button ref=\"buttonRef\" v-bind=\"$attrs\" class=\"m-button\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-button>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MButton'\r\n})\r\n\r\nconst { innerRef: buttonRef, exposedProxy } = useExposeRef('buttonRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n// Button 组件样式 - 使用高优先级选择器确保不被全局样式覆盖\r\n\r\n</style>","<template>\r\n <el-input ref=\"inputRef\" v-bind=\"$attrs\" class=\"m-input\" :class=\"{ solid: $attrs.styleType === 'solid' }\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-input>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MInput'\r\n})\r\n\r\nconst { innerRef: inputRef, exposedProxy } = useExposeRef('inputRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n<style lang=\"scss\">\r\n\r\n</style>","<template>\r\n <el-form ref=\"formRef\" v-bind=\"$attrs\" class=\"m-form\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-form>\r\n</template>\r\n\r\n<script setup>\r\nimport { ElForm } from 'element-plus'\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MForm'\r\n})\r\n\r\nconst { innerRef: formRef, exposedProxy } = useExposeRef('formRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n\r\n</style>","<template>\r\n <el-form-item v-bind=\"$attrs\" class=\"m-form-item\" ref=\"formItemRef\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-form-item>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n name: 'MFormItem'\r\n})\r\n\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\nconst { innerRef: formItemRef, exposedProxy } = useExposeRef('formItemRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n</style>","/**\r\n * 类名装饰器方法\r\n * @param {...(string|boolean|undefined|null)} classes - 类名参数\r\n * @returns {string} 合并后的类名字符串\r\n */\r\nexport const classNames = (...classes) => {\r\n return classes.filter(Boolean).join(' ')\r\n}\r\n\r\n/**\r\n * 排除指定属性\r\n * @param {Object} attrs - 原始属性对象\r\n * @param {...string} excludeKeys - 要排除的属性名\r\n * @returns {Object} 排除指定属性后的新对象\r\n */\r\nexport const excludeAttrs = (attrs, ...excludeKeys) => {\r\n const result = { ...attrs }\r\n excludeKeys.forEach(key => {\r\n delete result[key]\r\n })\r\n return result\r\n}\r\n\r\n","import { computed, useAttrs } from 'vue'\r\nimport { classNames, excludeAttrs } from '@packages/utils/classNames.js'\r\n\r\n/**\r\n * 类名 Hook\r\n * @param {string} defaultClass - 默认的类名\r\n * @param {string} excludeKey - 要排除的属性名,默认为 'popperClass'\r\n * @returns {Object} 包含 mergedAttrs 和 className 的对象\r\n */\r\nexport function useClassName(defaultClass, excludeKey = 'popperClass') {\r\n const attrs = useAttrs()\r\n \r\n // 排除指定属性\r\n const mergedAttrs = computed(() => excludeAttrs(attrs, excludeKey))\r\n \r\n // 计算类名\r\n const className = computed(() => classNames(defaultClass, attrs[excludeKey]))\r\n \r\n return {\r\n mergedAttrs,\r\n className\r\n }\r\n}\r\n","<template>\r\n <el-tooltip ref=\"tooltipRef\" v-bind=\"mergedAttrs\" :popper-class=\"popperClass\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-tooltip>\r\n</template>\r\n\r\n<script setup>\r\nimport { useClassName } from \"@packages/hooks/useClassName.js\"\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MTooltip'\r\n})\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n popperClass: {\r\n type: String,\r\n default: ''\r\n }\r\n})\r\n\r\n// 使用类名 Hook\r\nconst { mergedAttrs, className: popperClass } = useClassName('mc-tooltip-popper')\r\n\r\nconst { innerRef: tooltipRef, exposedProxy } = useExposeRef('tooltipRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.mc-tooltip-popper {\r\n &.is-dark {\r\n color: #fff !important;\r\n background-color: var(--all-gray-6) !important;\r\n border-color: var(--all-gray-6) !important;\r\n .el-popper__arrow::before{\r\n background-color: var(--all-gray-6) !important;\r\n border-color: var(--all-gray-6) !important;\r\n }\r\n }\r\n \r\n &.is-light {\r\n color: #606266 !important;\r\n background-color: #fff !important;\r\n border: 1px solid #e4e7ed !important;\r\n \r\n .el-popper__arrow::before {\r\n background-color: #fff !important;\r\n border-color: #fff !important;\r\n }\r\n }\r\n}\r\n\r\n:deep(.el-popper) {\r\n &.is-light {\r\n background: var(--bg-tertiary-hover);\r\n border-color: var(--border-primary);\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-select\r\n ref=\"selectRef\"\r\n class=\"m-select\"\r\n :class=\"{ solid: $attrs.styleType === 'solid' }\"\r\n :show-arrow=\"false\"\r\n v-bind=\"$attrs\"\r\n >\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-select>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: \"MSelect\",\r\n});\r\n\r\nconst { innerRef: selectRef, exposedProxy } = useExposeRef('selectRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\r\n</style>\r\n","<template>\r\n <el-option ref=\"optionRef\" v-bind=\"$attrs\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-option>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MOption'\r\n})\r\n\r\nconst { innerRef: optionRef, exposedProxy } = useExposeRef('optionRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n","<template>\r\n <el-option-group ref=\"optionGroupRef\" v-bind=\"$attrs\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-option-group>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MOptionGroup'\r\n})\r\n\r\nconst { innerRef: optionGroupRef, exposedProxy } = useExposeRef('optionGroupRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n","<template>\r\n <el-pagination ref=\"paginationRef\" v-bind=\"$attrs\" class=\"m-pagination\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-pagination>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: \"MPagination\",\r\n});\r\n\r\nconst { innerRef: paginationRef, exposedProxy } = useExposeRef('paginationRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.m-pagination {\r\n --el-border-color-hover: var(--border-tertiary) !important;\r\n --el-pagination-button-bg-color: var(--bg-tertiary-hover) !important;\r\n &.is-background .el-pager li.is-active {\r\n color: var(--text-quaternary) !important;\r\n }\r\n .el-pager li{\r\n border-radius: var(--xs);\r\n border: 1px solid transparent;\r\n &:hover {\r\n border: 1px solid var(--border-tertiary);\r\n color: var(--text-primary);\r\n }\r\n }\r\n .el-select .el-select__wrapper {\r\n width: 112px;\r\n min-height: 32px;\r\n padding: 5px 8px;\r\n border-radius: var(--xs);\r\n background-color: var(--bg-tertiary-hover);\r\n }\r\n .el-input .el-input__wrapper {\r\n height: 30px;\r\n border-radius: var(--xs);\r\n background-color: var(--bg-tertiary-hover);\r\n }\r\n .el-pagination.is-background {\r\n background-color: var(--bg-tertiary-hover);\r\n }\r\n .el-pager .number {\r\n font-size: var(--font-size-text-sm);\r\n font-weight: 500;\r\n }\r\n .btn-prev,\r\n .btn-next {\r\n &:disabled {\r\n background-color: transparent !important;\r\n }\r\n &:hover:not(:disabled) {\r\n border: 1px solid var(--border-tertiary);\r\n color: var(--text-primary);\r\n }\r\n background-color: transparent !important;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-radio ref=\"radioRef\" v-bind=\"mergedAttrs\" class=\"m-radio\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-radio>\r\n</template>\r\n\r\n<script setup>\r\nimport { useClassName } from \"@packages/hooks/useClassName.js\"\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MRadio'\r\n})\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n popperClass: {\r\n type: String,\r\n default: ''\r\n }\r\n})\r\n\r\n// 使用类名 Hook\r\nconst { mergedAttrs, className: popperClass } = useClassName('mc-radio-popper')\r\n\r\nconst { innerRef: radioRef, exposedProxy } = useExposeRef('radioRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n// Radio popper-class 样式\r\n// .mc-radio-popper {\r\n// 自定义单选框样式可以在这里添加\r\n// }\r\n.m-radio{\r\n &.el-radio{\r\n --el-radio-input-height: 16px;\r\n --el-radio-input-width: 16px;\r\n --el-radio-input-border: 2px solid var(--icon-tertiary);\r\n &.el-radio--large{\r\n --el-radio-input-height: 20px;\r\n --el-radio-input-width: 20px;\r\n .el-radio__inner{\r\n height: var(--el-radio-input-height);\r\n width: var(--el-radio-input-width);\r\n }\r\n }\r\n\r\n .el-radio__input {\r\n &.is-checked .el-radio__inner::after {\r\n height: 6px;\r\n width: 6px;\r\n background-color: var(--bg-primary);\r\n }\r\n \r\n &.is-disabled {\r\n .el-radio__inner {\r\n background-color: var(--all-alphe-white-20);\r\n border-color: var(--icon-tertiary);\r\n }\r\n \r\n &.is-checked .el-radio__inner::after {\r\n background-color: var(--all-alphe-white-20);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-radio-group ref=\"radioGroupRef\" v-bind=\"mergedAttrs\" :popper-class=\"computedPopperClass\" class=\"m-radio-group\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-radio-group>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed, useAttrs } from 'vue'\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MRadioGroup'\r\n})\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n popperClass: {\r\n type: String,\r\n default: ''\r\n }\r\n})\r\n\r\n// 获取attrs\r\nconst attrs = useAttrs()\r\n\r\n// 计算popper-class,合并默认类名和外部传入的类名\r\nconst computedPopperClass = computed(() => {\r\n const defaultPopperClass = 'mc-radio-group-popper'\r\n \r\n if (attrs.popperClass) {\r\n return `${defaultPopperClass} ${attrs.popperClass}`.trim()\r\n }\r\n \r\n return defaultPopperClass\r\n})\r\n\r\n// 合并其他属性(排除popperClass)\r\nconst mergedAttrs = computed(() => {\r\n const { popperClass, ...otherAttrs } = attrs\r\n return otherAttrs\r\n})\r\n\r\nconst { innerRef: radioGroupRef, exposedProxy } = useExposeRef('radioGroupRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n// RadioGroup popper-class 样式\r\n.mc-radio-group-popper {\r\n // 自定义单选框组样式可以在这里添加\r\n}\r\n\r\n// 自定义主题示例\r\n.mc-radio-group-custom {\r\n .el-radio {\r\n .el-radio__input {\r\n .el-radio__inner {\r\n background: linear-gradient(45deg, #667eea, #764ba2);\r\n border-color: #667eea;\r\n \r\n &:hover {\r\n background: linear-gradient(45deg, #5a6fd8, #6a4190);\r\n border-color: #5a6fd8;\r\n }\r\n }\r\n \r\n &.is-checked .el-radio__inner {\r\n background: linear-gradient(45deg, #4c63d2, #5d3a7e);\r\n border-color: #4c63d2;\r\n }\r\n }\r\n \r\n .el-radio__label {\r\n color: #667eea;\r\n font-weight: 500;\r\n }\r\n }\r\n}\r\n\r\n.mc-radio-group-success {\r\n .el-radio {\r\n .el-radio__input {\r\n .el-radio__inner {\r\n background-color: #67c23a;\r\n border-color: #67c23a;\r\n \r\n &:hover {\r\n background-color: #5daf34;\r\n border-color: #5daf34;\r\n }\r\n }\r\n \r\n &.is-checked .el-radio__inner {\r\n background-color: #529b2e;\r\n border-color: #529b2e;\r\n }\r\n }\r\n \r\n .el-radio__label {\r\n color: #67c23a;\r\n font-weight: 500;\r\n }\r\n }\r\n}\r\n\r\n.mc-radio-group-warning {\r\n .el-radio {\r\n .el-radio__input {\r\n .el-radio__inner {\r\n background-color: #e6a23c;\r\n border-color: #e6a23c;\r\n \r\n &:hover {\r\n background-color: #d4922b;\r\n border-color: #d4922b;\r\n }\r\n }\r\n \r\n &.is-checked .el-radio__inner {\r\n background-color: #c8951f;\r\n border-color: #c8951f;\r\n }\r\n }\r\n \r\n .el-radio__label {\r\n color: #e6a23c;\r\n font-weight: 500;\r\n }\r\n }\r\n}\r\n\r\n.mc-radio-group-danger {\r\n .el-radio {\r\n .el-radio__input {\r\n .el-radio__inner {\r\n background-color: #f56c6c;\r\n border-color: #f56c6c;\r\n \r\n &:hover {\r\n background-color: #f45454;\r\n border-color: #f45454;\r\n }\r\n }\r\n \r\n &.is-checked .el-radio__inner {\r\n background-color: #f24545;\r\n border-color: #f24545;\r\n }\r\n }\r\n \r\n .el-radio__label {\r\n color: #f56c6c;\r\n font-weight: 500;\r\n }\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-radio-button ref=\"radioButtonRef\" v-bind=\"mergedAttrs\" class=\"m-radio-button\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-radio-button>\r\n</template>\r\n\r\n<script setup>\r\nimport { useClassName } from \"@packages/hooks/useClassName.js\"\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MRadioButton'\r\n})\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n popperClass: {\r\n type: String,\r\n default: ''\r\n }\r\n})\r\n\r\n// 使用类名 Hook\r\nconst { mergedAttrs, className: popperClass } = useClassName('mc-radio-button-popper')\r\n\r\nconst { innerRef: radioButtonRef, exposedProxy } = useExposeRef('radioButtonRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n// RadioButton popper-class 样式\r\n// .mc-radio-button-popper {\r\n// 自定义单选框按钮样式可以在这里添加\r\n// }\r\n\r\n// 自定义主题示例\r\n.mc-radio-button-custom {\r\n .el-radio-button__inner {\r\n background: linear-gradient(45deg, #667eea, #764ba2);\r\n border-color: #667eea;\r\n color: white;\r\n \r\n &:hover {\r\n background: linear-gradient(45deg, #5a6fd8, #6a4190);\r\n border-color: #5a6fd8;\r\n }\r\n }\r\n \r\n .el-radio-button__original-radio:checked + .el-radio-button__inner {\r\n background: linear-gradient(45deg, #4c63d2, #5d3a7e);\r\n border-color: #4c63d2;\r\n box-shadow: -1px 0 0 0 #4c63d2;\r\n }\r\n}\r\n\r\n.mc-radio-button-success {\r\n .el-radio-button__inner {\r\n background-color: #67c23a;\r\n border-color: #67c23a;\r\n color: white;\r\n \r\n &:hover {\r\n background-color: #5daf34;\r\n border-color: #5daf34;\r\n }\r\n }\r\n \r\n .el-radio-button__original-radio:checked + .el-radio-button__inner {\r\n background-color: #529b2e;\r\n border-color: #529b2e;\r\n box-shadow: -1px 0 0 0 #529b2e;\r\n }\r\n}\r\n\r\n.mc-radio-button-warning {\r\n .el-radio-button__inner {\r\n background-color: #e6a23c;\r\n border-color: #e6a23c;\r\n color: white;\r\n \r\n &:hover {\r\n background-color: #d4922b;\r\n border-color: #d4922b;\r\n }\r\n }\r\n \r\n .el-radio-button__original-radio:checked + .el-radio-button__inner {\r\n background-color: #c8951f;\r\n border-color: #c8951f;\r\n box-shadow: -1px 0 0 0 #c8951f;\r\n }\r\n}\r\n\r\n.mc-radio-button-danger {\r\n .el-radio-button__inner {\r\n background-color: #f56c6c;\r\n border-color: #f56c6c;\r\n color: white;\r\n \r\n &:hover {\r\n background-color: #f45454;\r\n border-color: #f45454;\r\n }\r\n }\r\n \r\n .el-radio-button__original-radio:checked + .el-radio-button__inner {\r\n background-color: #f24545;\r\n border-color: #f24545;\r\n box-shadow: -1px 0 0 0 #f24545;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-switch ref=\"switchRef\" v-bind=\"mergedAttrs\" :popper-class=\"popperClass\" class=\"m-switch\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-switch>\r\n</template>\r\n\r\n<script setup>\r\nimport { useClassName } from \"@packages/hooks/useClassName.js\";\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: \"MSwitch\",\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n popperClass: {\r\n type: String,\r\n default: \"\",\r\n },\r\n});\r\n\r\n// 使用类名 Hook\r\nconst { mergedAttrs, className: popperClass } =\r\n useClassName(\"mc-switch-popper\");\r\n\r\nconst { innerRef: switchRef, exposedProxy } = useExposeRef('switchRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.m-switch {\r\n &.is-checked {\r\n .el-switch__action {\r\n background-color: var(--all-gray-10);\r\n }\r\n }\r\n \r\n &:not(.is-checked) {\r\n .el-switch__core {\r\n background-color: var(--all-gray-5);\r\n border-color: var(--all-gray-5);\r\n .el-switch__action {\r\n background-color: var(--all-gray-1);\r\n }\r\n }\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-tag ref=\"tagRef\" v-bind=\"$attrs\" :type=\"computedType\" class=\"m-tag\" :class=\"{ 'is-loading': computedLoading }\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <!-- 自定义spinner loading效果 -->\r\n <div v-if=\"computedLoading && !computedPrefixIcon\" class=\"custom-spinner\">\r\n <div class=\"ldio-spinner\">\r\n <div v-for=\"i in 8\" :key=\"i\"></div>\r\n </div>\r\n </div>\r\n <!-- 原有的prefixIcon -->\r\n <i \r\n class=\"prefixIcon\" \r\n :class=\"['iconfont', computedPrefixIcon]\" \r\n v-else-if=\"computedPrefixIcon\"\r\n ></i>\r\n <div>\r\n <slot :name=\"name\" />\r\n </div>\r\n <i \r\n class=\"suffixIcon\" \r\n :class=\"['iconfont', computedSuffixIcon]\" \r\n v-if=\"computedSuffixIcon\"\r\n ></i>\r\n </template>\r\n </el-tag>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MTag'\r\n})\r\n\r\nconst props = defineProps({\r\n prefixIcon: {\r\n type: String,\r\n default: ''\r\n },\r\n suffixIcon: {\r\n type: String,\r\n default: ''\r\n },\r\n loading: {\r\n type: Boolean,\r\n default: false\r\n },\r\n status: {\r\n type: String,\r\n default: ''\r\n }\r\n})\r\n\r\n// 根据status自动设置type颜色\r\nconst computedType = computed(() => {\r\n if (props.status) {\r\n // 如果设置了status,自动映射到对应的type\r\n return props.status\r\n }\r\n // 否则使用v-bind传入的type(通过$attrs)\r\n return undefined\r\n})\r\n\r\n// 根据status自动设置图标和loading状态\r\nconst computedLoading = computed(() => {\r\n if (props.status === 'warning') {\r\n return true\r\n }\r\n return props.loading\r\n})\r\n\r\nconst computedPrefixIcon = computed(() => {\r\n // 如果有显式的prefixIcon,优先使用\r\n if (props.prefixIcon) {\r\n return props.prefixIcon\r\n }\r\n \r\n // 根据status自动设置prefixIcon\r\n if (props.status === 'success') {\r\n return 'icon-circle-check-filled'\r\n }\r\n \r\n if (props.status === 'danger') {\r\n return 'icon-lucide_circle-x-filled'\r\n }\r\n \r\n return ''\r\n})\r\n\r\nconst computedSuffixIcon = computed(() => {\r\n // 如果有显式的suffixIcon,优先使用\r\n if (props.suffixIcon) {\r\n return props.suffixIcon\r\n }\r\n \r\n return ''\r\n})\r\n\r\nconst { innerRef: tagRef, exposedProxy } = useExposeRef('tagRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.m-tag {\r\n .prefixIcon,\r\n .suffixIcon {\r\n font-size: 16px;\r\n display: inline-block;\r\n line-height: 1;\r\n \r\n &.iconfont {\r\n font-family: \"iconfont\" !important;\r\n }\r\n \r\n &.colorfont {\r\n font-family: \"colorfont\" !important;\r\n }\r\n }\r\n .el-tag__content{\r\n display: flex;\r\n align-items: center;\r\n }\r\n \r\n .prefixIcon {\r\n margin-right: 4px;\r\n }\r\n \r\n .suffixIcon {\r\n margin-left: 4px;\r\n }\r\n \r\n // 自定义spinner样式\r\n .custom-spinner {\r\n display: inline-block;\r\n margin-right: 4px;\r\n width: 16px;\r\n height: 16px;\r\n overflow: hidden;\r\n \r\n .ldio-spinner {\r\n width: 100%;\r\n height: 100%;\r\n position: relative;\r\n transform: translateZ(0) scale(0.16);\r\n backface-visibility: hidden;\r\n transform-origin: 0 0;\r\n \r\n div {\r\n left: 46px;\r\n top: 7.5px;\r\n position: absolute;\r\n animation: ldio-spinner-fade linear 1s infinite;\r\n background: currentColor;\r\n width: 8px;\r\n height: 21px;\r\n border-radius: 3.15px / 3.15px;\r\n transform-origin: 4px 42.5px;\r\n box-sizing: content-box;\r\n }\r\n \r\n div:nth-child(1) {\r\n transform: rotate(0deg);\r\n animation-delay: -0.875s;\r\n }\r\n \r\n div:nth-child(2) {\r\n transform: rotate(45deg);\r\n animation-delay: -0.75s;\r\n }\r\n \r\n div:nth-child(3) {\r\n transform: rotate(90deg);\r\n animation-delay: -0.625s;\r\n }\r\n \r\n div:nth-child(4) {\r\n transform: rotate(135deg);\r\n animation-delay: -0.5s;\r\n }\r\n \r\n div:nth-child(5) {\r\n transform: rotate(180deg);\r\n animation-delay: -0.375s;\r\n }\r\n \r\n div:nth-child(6) {\r\n transform: rotate(225deg);\r\n animation-delay: -0.25s;\r\n }\r\n \r\n div:nth-child(7) {\r\n transform: rotate(270deg);\r\n animation-delay: -0.125s;\r\n }\r\n \r\n div:nth-child(8) {\r\n transform: rotate(315deg);\r\n animation-delay: 0s;\r\n }\r\n }\r\n }\r\n}\r\n\r\n@keyframes ldio-spinner-fade {\r\n 0% { \r\n opacity: 1; \r\n }\r\n 100% { \r\n opacity: 0; \r\n }\r\n}\r\n</style>","<template>\r\n <el-alert v-bind=\"mergedAttrs\" class=\"mc-alert\">\r\n <!-- 自定义图标插槽 -->\r\n <template v-if=\"iconUrl\" #icon>\r\n <img :src=\"iconUrl\" :alt=\"`${type} icon`\" class=\"mc-alert-icon\" />\r\n </template>\r\n \r\n <!-- 其他插槽 -->\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-alert>\r\n</template>\r\n\r\n<script>\r\n// 定义可选的Alert类型\r\nconst availableTypes = ['success', 'warning', 'error']\r\n\r\nexport default {\r\n name: 'MAlert'\r\n}\r\n</script>\r\n\r\n<script setup>\r\nimport { computed, useAttrs } from 'vue'\r\n\r\nconst props = defineProps({\r\n type: {\r\n type: String,\r\n default: 'success',\r\n validator: (value) => availableTypes.includes(value)\r\n },\r\n useCustomIcon: {\r\n type: Boolean,\r\n default: true\r\n }\r\n})\r\n\r\nconst attrs = useAttrs()\r\n\r\n// 排除已处理的属性,确保 type 属性正确传递\r\nconst mergedAttrs = computed(() => {\r\n const { useCustomIcon, ...rest } = attrs\r\n return {\r\n ...rest,\r\n type: props.type // 确保 type 属性正确传递给 el-alert\r\n }\r\n})\r\n\r\n// 计算图标URL\r\nconst iconUrl = computed(() => {\r\n if (!props.useCustomIcon) {\r\n return null\r\n }\r\n \r\n return `https://cfdsaas-pre.oss-cn-hongkong.aliyuncs.com/mc-assets/mc-ui/alert/alert-${props.type}.png`\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.mc-alert.el-alert {\r\n --el-alert-padding: 14px 16px;\r\n .mc-alert-icon {\r\n width: 16px;\r\n height: 16px;\r\n object-fit: contain;\r\n }\r\n .el-alert__close-btn{\r\n top: 50%;\r\n transform: translateY(-50%);\r\n opacity: 0.6;\r\n transition: opacity 0.2s ease;\r\n border-radius: 50%;\r\n width: 20px;\r\n height: 20px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n \r\n &:hover {\r\n opacity: 1;\r\n background: rgba(0, 0, 0, 0.1);\r\n }\r\n }\r\n // Error 类型样式\r\n &.el-alert--error.is-light {\r\n background-color: var(--all-red-10);\r\n color: var(--text-error-primary);\r\n border-color: var(--all-red-10);\r\n \r\n .el-alert__title,\r\n .el-alert__description,\r\n .el-alert__close-btn {\r\n color: var(--text-error-primary);\r\n }\r\n \r\n .el-alert__icon {\r\n display: flex;\r\n align-items: center;\r\n }\r\n }\r\n \r\n // Warning 类型样式\r\n &.el-alert--warning.is-light {\r\n background-color: var(--all-orange-10);\r\n color: var(--text-warning-primary);\r\n border-color: var(--all-orange-10);\r\n \r\n .el-alert__title,\r\n .el-alert__description,\r\n .el-alert__close-btn {\r\n color: var(--text-warning-primary);\r\n }\r\n \r\n .el-alert__icon {\r\n display: flex;\r\n align-items: center;\r\n }\r\n }\r\n \r\n // Success 类型样式\r\n &.el-alert--success.is-light {\r\n background-color: var(--all-green-10);\r\n color: var(--all-green-4);\r\n border-color: var(--all-green-10);\r\n \r\n .el-alert__title,\r\n .el-alert__description,\r\n .el-alert__close-btn {\r\n color: var(--all-green-4);\r\n }\r\n \r\n .el-alert__icon {\r\n display: flex;\r\n align-items: center;\r\n }\r\n }\r\n}\r\n\r\n</style>","<template>\r\n <div>\r\n <el-dialog\r\n ref=\"dialogRef\"\r\n v-model=\"dialogVisible\"\r\n :width=\"width\"\r\n :title=\"title\"\r\n :draggable=\"draggable\"\r\n :close-on-click-modal=\"closeOnClickModal\"\r\n :center=\"center\"\r\n align-center\r\n v-bind=\"$attrs\"\r\n class=\"m-dialog\"\r\n header-class=\"m-header\"\r\n >\r\n <template v-if=\"$slots.header\" #header=\"{ close, titleId, titleClass }\">\r\n <slot name=\"header\" v-bind=\"{ close, titleId, titleClass }\"></slot>\r\n </template>\r\n <slot name=\"default\"></slot>\r\n <template v-if=\"$slots.footer\" #footer class=\"m-footer\">\r\n <slot name=\"footer\"></slot>\r\n </template>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MDialog'\r\n})\r\nconst props = defineProps({\r\n width: {\r\n type: String,\r\n default: '440px'\r\n },\r\n center: {\r\n type: Boolean,\r\n default: true\r\n },\r\n draggable: {\r\n type: Boolean,\r\n default: true\r\n },\r\n closeOnClickModal: {\r\n type: Boolean,\r\n default: false\r\n },\r\n title: {\r\n type: String,\r\n default: ''\r\n }\r\n})\r\nconst emit = defineEmits(['close'])\r\nconst dialogVisible = defineModel('modelValue', {\r\n type: Boolean,\r\n default: false\r\n})\r\n\r\nconst { innerRef: dialogRef, exposedProxy } = useExposeRef('dialogRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\r\n</style>\r\n","<template>\r\n <el-notification v-bind=\"$attrs\" class=\"mc-notification\">\r\n <!-- 其他插槽 -->\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-notification>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n name: \"MNotification\",\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n// Notification 基础样式\r\n// 如需自定义样式,可以在这里添加\r\n</style>\r\n","<template>\r\n <teleport to=\"body\">\r\n <transition-group name=\"message\" tag=\"div\" class=\"message-container\">\r\n <div\r\n v-for=\"message in messages\"\r\n :key=\"message.id\"\r\n :class=\"[\r\n 'custom-message',\r\n `message-${message.type}`,\r\n `message-${message.placement}`,\r\n { 'message-plain': message.plain },\r\n ]\"\r\n >\r\n <!-- 图标 -->\r\n <div v-if=\"message.showIcon\" class=\"message-icon\">\r\n <img\r\n v-if=\"message.customIcon\"\r\n :src=\"message.customIcon\"\r\n alt=\"custom icon\"\r\n class=\"message-icon-img\"\r\n />\r\n <img\r\n v-else-if=\"message.type === 'success'\"\r\n src=\"https://cfdsaas-pre.oss-cn-hongkong.aliyuncs.com/mc-assets/mc-ui/alert/alert-success.png\"\r\n alt=\"success icon\"\r\n class=\"message-icon-img\"\r\n />\r\n <img\r\n v-else-if=\"message.type === 'warning'\"\r\n src=\"https://cfdsaas-pre.oss-cn-hongkong.aliyuncs.com/mc-assets/mc-ui/alert/alert-warning.png\"\r\n alt=\"warning icon\"\r\n class=\"message-icon-img\"\r\n />\r\n <img\r\n v-else-if=\"message.type === 'error'\"\r\n src=\"https://cfdsaas-pre.oss-cn-hongkong.aliyuncs.com/mc-assets/mc-ui/alert/alert-error.png\"\r\n alt=\"error icon\"\r\n class=\"message-icon-img\"\r\n />\r\n </div>\r\n\r\n <!-- 消息内容 -->\r\n <div class=\"message-content\">\r\n <component\r\n v-if=\"typeof message.message === 'function'\"\r\n :is=\"message.message\"\r\n />\r\n <div\r\n v-else-if=\"message.dangerouslyUseHTMLString\"\r\n v-html=\"message.message\"\r\n />\r\n <span v-else>{{ message.message }}</span>\r\n\r\n <!-- 重复数量 -->\r\n <span v-if=\"message.repeatNum > 1\" class=\"message-repeat\">\r\n {{ message.repeatNum }}\r\n </span>\r\n </div>\r\n\r\n <!-- 关闭按钮 -->\r\n <button\r\n v-if=\"message.showClose\"\r\n class=\"message-close\"\r\n @click=\"closeMessage(message.id)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n </transition-group>\r\n </teleport>\r\n</template>\r\n\r\n<script>\r\nimport { ref } from \"vue\";\r\n\r\n// 全局消息列表\r\nconst messages = ref([]);\r\nlet messageId = 0;\r\n\r\n// 创建 Message 静态方法对象\r\nconst Message = {\r\n // 默认配置\r\n defaultOptions: {\r\n message: \"\",\r\n type: \"success\",\r\n plain: false,\r\n customIcon: \"\",\r\n dangerouslyUseHTMLString: false,\r\n customClass: \"\",\r\n duration: 3000,\r\n showClose: false,\r\n showIcon: true,\r\n onClose: null,\r\n offset: 16,\r\n placement: \"top\",\r\n appendTo: \"body\",\r\n grouping: false,\r\n repeatNum: 1,\r\n },\r\n\r\n // 显示消息\r\n show(options = {}) {\r\n // 如果是字符串,转换为配置对象\r\n if (typeof options === \"string\") {\r\n options = { message: options };\r\n }\r\n\r\n const config = {\r\n ...this.defaultOptions,\r\n ...options,\r\n id: ++messageId,\r\n };\r\n\r\n // 分组处理\r\n if (config.grouping) {\r\n const existingIndex = messages.value.findIndex(\r\n (m) =>\r\n m.message === config.message && m.type === config.type && m.grouping\r\n );\r\n\r\n if (existingIndex > -1) {\r\n messages.value[existingIndex].repeatNum++;\r\n return { close: () => this.close(messages.value[existingIndex].id) };\r\n }\r\n }\r\n\r\n // 添加到消息列表\r\n messages.value.push(config);\r\n\r\n // 如果设置了自动关闭时间,则自动关闭\r\n if (config.duration > 0) {\r\n setTimeout(() => {\r\n this.close(config.id);\r\n }, config.duration);\r\n }\r\n\r\n return {\r\n close: () => this.close(config.id),\r\n };\r\n },\r\n\r\n // 关闭指定消息\r\n close(id) {\r\n const index = messages.value.findIndex((m) => m.id === id);\r\n if (index > -1) {\r\n const message = messages.value[index];\r\n if (message.onClose) {\r\n message.onClose(message);\r\n }\r\n messages.value.splice(index, 1);\r\n }\r\n },\r\n\r\n // 关闭所有消息\r\n closeAll() {\r\n messages.value = [];\r\n },\r\n\r\n // 便捷方法\r\n success(options = {}) {\r\n if (typeof options === \"string\") {\r\n options = { message: options };\r\n }\r\n return this.show({ ...options, type: \"success\" });\r\n },\r\n\r\n warning(options = {}) {\r\n if (typeof options === \"string\") {\r\n options = { message: options };\r\n }\r\n return this.show({ ...options, type: \"warning\" });\r\n },\r\n\r\n error(options = {}) {\r\n if (typeof options === \"string\") {\r\n options = { message: options };\r\n }\r\n return this.show({ ...options, type: \"error\" });\r\n },\r\n};\r\n\r\n// 关闭消息的方法\r\nconst closeMessage = (id) => {\r\n Message.close(id);\r\n};\r\n\r\n// Vue 组件定义\r\nexport default {\r\n name: \"MMessage\",\r\n setup() {\r\n return {\r\n messages,\r\n closeMessage,\r\n };\r\n },\r\n};\r\n\r\n// 导出类供直接使用\r\nexport { Message };\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.message-container {\r\n position: fixed;\r\n z-index: 9999;\r\n pointer-events: none;\r\n}\r\n\r\n.custom-message {\r\n position: fixed;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n min-width: 200px;\r\n max-width: 320px;\r\n padding: 12px 16px;\r\n border-radius: 8px;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\r\n pointer-events: auto;\r\n z-index: 9999;\r\n font-size: 14px;\r\n\r\n // 位置控制\r\n &.message-top {\r\n top: 20px;\r\n\r\n &:nth-child(2) {\r\n top: 70px;\r\n }\r\n &:nth-child(3) {\r\n top: 120px;\r\n }\r\n &:nth-child(4) {\r\n top: 170px;\r\n }\r\n &:nth-child(5) {\r\n top: 220px;\r\n }\r\n }\r\n\r\n &.message-top-left {\r\n top: 20px;\r\n left: 20px;\r\n transform: none;\r\n\r\n &:nth-child(2) {\r\n top: 70px;\r\n }\r\n &:nth-child(3) {\r\n top: 120px;\r\n }\r\n &:nth-child(4) {\r\n top: 170px;\r\n }\r\n &:nth-child(5) {\r\n top: 220px;\r\n }\r\n }\r\n\r\n &.message-top-right {\r\n top: 20px;\r\n right: 20px;\r\n left: auto;\r\n transform: none;\r\n\r\n &:nth-child(2) {\r\n top: 70px;\r\n }\r\n &:nth-child(3) {\r\n top: 120px;\r\n }\r\n &:nth-child(4) {\r\n top: 170px;\r\n }\r\n &:nth-child(5) {\r\n top: 220px;\r\n }\r\n }\r\n\r\n &.message-bottom {\r\n bottom: 20px;\r\n top: auto;\r\n\r\n &:nth-child(2) {\r\n bottom: 70px;\r\n }\r\n &:nth-child(3) {\r\n bottom: 120px;\r\n }\r\n &:nth-child(4) {\r\n bottom: 170px;\r\n }\r\n &:nth-child(5) {\r\n bottom: 220px;\r\n }\r\n }\r\n\r\n &.message-bottom-left {\r\n bottom: 20px;\r\n left: 20px;\r\n top: auto;\r\n transform: none;\r\n\r\n &:nth-child(2) {\r\n bottom: 70px;\r\n }\r\n &:nth-child(3) {\r\n bottom: 120px;\r\n }\r\n &:nth-child(4) {\r\n bottom: 170px;\r\n }\r\n &:nth-child(5) {\r\n bottom: 220px;\r\n }\r\n }\r\n\r\n &.message-bottom-right {\r\n bottom: 20px;\r\n right: 20px;\r\n left: auto;\r\n top: auto;\r\n transform: none;\r\n\r\n &:nth-child(2) {\r\n bottom: 70px;\r\n }\r\n &:nth-child(3) {\r\n bottom: 120px;\r\n }\r\n &:nth-child(4) {\r\n bottom: 170px;\r\n }\r\n &:nth-child(5) {\r\n bottom: 220px;\r\n }\r\n }\r\n\r\n .message-icon {\r\n flex-shrink: 0;\r\n display: flex;\r\n align-items: center;\r\n\r\n .message-icon-img {\r\n width: 16px;\r\n height: 16px;\r\n object-fit: contain;\r\n }\r\n }\r\n\r\n .message-content {\r\n flex: 1;\r\n line-height: 1.4;\r\n position: relative;\r\n\r\n .message-repeat {\r\n position: absolute;\r\n top: -8px;\r\n right: -8px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: #666;\r\n color: white;\r\n font-size: 10px;\r\n font-weight: bold;\r\n min-width: 16px;\r\n height: 16px;\r\n padding: 0 4px;\r\n border-radius: 8px;\r\n border: 2px solid white;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n }\r\n }\r\n\r\n .message-close {\r\n flex-shrink: 0;\r\n border: none;\r\n background: transparent;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 4px;\r\n margin-left: 8px;\r\n opacity: 0.6;\r\n transition: opacity 0.2s ease;\r\n font-size: 24px;\r\n width: 20px;\r\n height: 20px;\r\n border-radius: 50%;\r\n color: var(--icon-tertiary, #999);\r\n\r\n &:hover {\r\n opacity: 1;\r\n background: rgba(0, 0, 0, 0.1);\r\n }\r\n }\r\n\r\n // 不同类型的样式 - 统一使用 bg-tertiary-hover 背景\r\n &.message-success {\r\n background-color: var(--bg-tertiary-hover, #f5f5f5);\r\n color: var(--all-green-4, #67c23a);\r\n border: 1px solid var(--bg-tertiary-hover, #f5f5f5);\r\n\r\n .message-icon {\r\n color: var(--all-green-4, #67c23a);\r\n }\r\n\r\n .message-repeat {\r\n background: var(--all-green-4, #67c23a);\r\n border-color: var(--all-green-4, #67c23a);\r\n }\r\n\r\n &.message-plain {\r\n background: var(--all-green-4, #67c23a);\r\n border: 1px solid var(--all-green-4, #67c23a);\r\n color: #fff;\r\n\r\n .message-icon {\r\n color: #fff;\r\n }\r\n }\r\n }\r\n\r\n &.message-warning {\r\n background-color: var(--bg-tertiary-hover, #f5f5f5);\r\n color: var(--text-warning-primary, #e6a23c);\r\n border: 1px solid var(--bg-tertiary-hover, #f5f5f5);\r\n\r\n .message-icon {\r\n color: var(--text-warning-primary, #e6a23c);\r\n }\r\n\r\n .message-repeat {\r\n background: var(--text-warning-primary, #e6a23c);\r\n border-color: var(--text-warning-primary, #e6a23c);\r\n }\r\n\r\n &.message-plain {\r\n background: var(--text-warning-primary, #e6a23c);\r\n border: 1px solid var(--text-warning-primary, #e6a23c);\r\n color: #fff;\r\n\r\n .message-icon {\r\n color: #fff;\r\n }\r\n }\r\n }\r\n\r\n &.message-error {\r\n background-color: var(--bg-tertiary-hover, #f5f5f5);\r\n color: var(--text-error-primary, #f56c6c);\r\n border: 1px solid var(--bg-tertiary-hover, #f5f5f5);\r\n\r\n .message-icon {\r\n color: var(--text-error-primary, #f56c6c);\r\n }\r\n\r\n .message-repeat {\r\n background: var(--text-error-primary, #f56c6c);\r\n border-color: var(--text-error-primary, #f56c6c);\r\n }\r\n\r\n &.message-plain {\r\n background: var(--text-error-primary, #f56c6c);\r\n border: 1px solid var(--text-error-primary, #f56c6c);\r\n color: #fff;\r\n\r\n .message-icon {\r\n color: #fff;\r\n }\r\n }\r\n }\r\n}\r\n\r\n// 动画效果\r\n.message-enter-active {\r\n transition: all 0.3s ease;\r\n}\r\n\r\n.message-leave-active {\r\n transition: all 0.3s ease;\r\n}\r\n\r\n.message-enter-from {\r\n opacity: 0;\r\n transform: translateX(-50%) translateY(-20px);\r\n}\r\n\r\n.message-leave-to {\r\n opacity: 0;\r\n transform: translateX(-50%) translateY(-20px);\r\n}\r\n\r\n.message-move {\r\n transition: transform 0.3s ease;\r\n}\r\n\r\n// 不同位置的动画\r\n.message-top-left {\r\n &.message-enter-from,\r\n &.message-leave-to {\r\n transform: translateX(-20px);\r\n }\r\n}\r\n\r\n.message-top-right {\r\n &.message-enter-from,\r\n &.message-leave-to {\r\n transform: translateX(20px);\r\n }\r\n}\r\n\r\n.message-bottom {\r\n &.message-enter-from,\r\n &.message-leave-to {\r\n transform: translateX(-50%) translateY(20px);\r\n }\r\n}\r\n\r\n.message-bottom-left {\r\n &.message-enter-from,\r\n &.message-leave-to {\r\n transform: translateX(-20px);\r\n }\r\n}\r\n\r\n.message-bottom-right {\r\n &.message-enter-from,\r\n &.message-leave-to {\r\n transform: translateX(20px);\r\n }\r\n}\r\n\r\n.mc-h5 {\r\n .custom-message {\r\n width: 304px;\r\n\r\n .message-icon {\r\n .message-icon-img {\r\n width: 20px;\r\n height: 20px;\r\n }\r\n }\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <teleport to=\"body\">\r\n <transition-group name=\"notification\" tag=\"div\" class=\"notification-container\">\r\n <div\r\n v-for=\"notification in notifications\"\r\n :key=\"notification.id\"\r\n :class=\"[\r\n 'custom-notification',\r\n `notification-${notification.position}`\r\n ]\"\r\n >\r\n <!-- 图标 -->\r\n <div class=\"notification-icon\">\r\n <img \r\n src=\"https://cfdsaas-pre.oss-cn-hongkong.aliyuncs.com/mc-assets/MCImages/userCenter/icon-quota-tip.png\" \r\n alt=\"notification icon\"\r\n />\r\n </div>\r\n\r\n <!-- 内容区域 -->\r\n <div class=\"notification-content\">\r\n <!-- 标题 -->\r\n <div class=\"notification-title\">{{ notification.title }}</div>\r\n \r\n <!-- 消息内容 -->\r\n <div class=\"notification-message\">{{ notification.message }}</div>\r\n \r\n <!-- 自定义插槽内容 -->\r\n <div v-if=\"notification.slotContent\" class=\"notification-action\">\r\n <component :is=\"notification.slotContent\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 关闭按钮 -->\r\n <button \r\n v-if=\"notification.showClose\"\r\n class=\"notification-close\"\r\n @click=\"closeNotification(notification.id)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n </transition-group>\r\n </teleport>\r\n</template>\r\n\r\n<script>\r\nimport { ref } from 'vue'\r\n\r\n// 全局通知列表\r\nconst notifications = ref([])\r\nlet notificationId = 0\r\n\r\n// 创建 NotifiMessage 静态方法对象\r\nconst NotifiMessage = {\r\n // 默认配置\r\n defaultOptions: {\r\n title: '',\r\n message: '',\r\n duration: 4500,\r\n position: 'top-right',\r\n showClose: true,\r\n offset: 20\r\n },\r\n\r\n // 显示通知\r\n show(options = {}) {\r\n const config = {\r\n ...this.defaultOptions,\r\n ...options,\r\n id: ++notificationId\r\n }\r\n\r\n // 添加到通知列表\r\n notifications.value.push(config)\r\n\r\n // 如果设置了自动关闭时间,则自动关闭\r\n if (config.duration > 0) {\r\n setTimeout(() => {\r\n this.close(config.id)\r\n }, config.duration)\r\n }\r\n\r\n return {\r\n close: () => this.close(config.id)\r\n }\r\n },\r\n\r\n // 关闭指定通知\r\n close(id) {\r\n const index = notifications.value.findIndex(n => n.id === id)\r\n if (index > -1) {\r\n notifications.value.splice(index, 1)\r\n }\r\n },\r\n\r\n // 关闭所有通知\r\n closeAll() {\r\n notifications.value = []\r\n },\r\n\r\n // 便捷方法\r\n success(options = {}) {\r\n return this.show(options)\r\n },\r\n\r\n warning(options = {}) {\r\n return this.show(options)\r\n },\r\n\r\n error(options = {}) {\r\n return this.show(options)\r\n }\r\n}\r\n\r\n// 关闭通知的方法\r\nconst closeNotification = (id) => {\r\n const index = notifications.value.findIndex(n => n.id === id)\r\n if (index > -1) {\r\n notifications.value.splice(index, 1)\r\n }\r\n}\r\n\r\n\r\n// Vue 组件定义\r\nexport default {\r\n name: 'MNotifiMessage',\r\n setup() {\r\n return {\r\n notifications,\r\n closeNotification\r\n }\r\n }\r\n}\r\n\r\n// 导出类供直接使用\r\nexport { NotifiMessage }\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.notification-container {\r\n position: fixed;\r\n z-index: 9999;\r\n pointer-events: none;\r\n}\r\n\r\n.custom-notification {\r\n position: fixed;\r\n top: 20px;\r\n right: 20px;\r\n width: 400px;\r\n background: #201F24;\r\n border-radius: 12px;\r\n padding: 16px;\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 4px;\r\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);\r\n pointer-events: auto;\r\n z-index: 9999;\r\n \r\n // 多个通知的堆叠效果\r\n &:nth-child(2) { top: 100px; }\r\n &:nth-child(3) { top: 180px; }\r\n &:nth-child(4) { top: 260px; }\r\n &:nth-child(5) { top: 340px; }\r\n \r\n .notification-icon {\r\n flex-shrink: 0;\r\n width: 40px;\r\n height: 40px;\r\n border-radius: 50%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n position: relative;\r\n transform: translate(-9px, -8px);\r\n \r\n img {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: contain;\r\n }\r\n }\r\n \r\n .notification-content {\r\n flex: 1;\r\n \r\n .notification-title {\r\n color: #FFFFFF;\r\n font-size: 16px;\r\n font-weight: 600;\r\n margin-bottom: 8px;\r\n }\r\n \r\n .notification-message {\r\n color: rgba(255, 255, 255, 0.8);\r\n font-size: 14px;\r\n line-height: 1.5;\r\n margin-bottom: 16px;\r\n }\r\n \r\n .notification-action {\r\n .custom-action-link {\r\n color: #FFD905;\r\n font-size: 14px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n transition: all 0.2s ease;\r\n \r\n &:hover {\r\n color: #FFF;\r\n }\r\n \r\n span {\r\n line-height: 1;\r\n }\r\n \r\n .arrow {\r\n transition: transform 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n line-height: 1;\r\n }\r\n \r\n &:hover .arrow {\r\n transform: translateX(2px);\r\n }\r\n }\r\n }\r\n }\r\n \r\n .notification-close {\r\n position: absolute;\r\n top: 12px;\r\n right: 12px;\r\n width: 20px;\r\n height: 20px;\r\n border: none;\r\n background: transparent;\r\n color: var(--icon-tertiary, #999);\r\n border-radius: 50%;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 24px;\r\n line-height: 1;\r\n opacity: 0.6;\r\n transition: opacity 0.2s ease;\r\n \r\n &:hover {\r\n opacity: 1;\r\n background: rgba(0, 0, 0, 0.1);\r\n }\r\n }\r\n}\r\n\r\n// 动画效果\r\n.notification-enter-active {\r\n transition: all 0.3s ease;\r\n}\r\n\r\n.notification-leave-active {\r\n transition: all 0.3s ease;\r\n}\r\n\r\n.notification-enter-from {\r\n opacity: 0;\r\n transform: translateX(100%);\r\n}\r\n\r\n.notification-leave-to {\r\n opacity: 0;\r\n transform: translateX(100%);\r\n}\r\n\r\n.notification-move {\r\n transition: transform 0.3s ease;\r\n}\r\n\r\n// 响应式设计\r\n@media (max-width: 480px) {\r\n .custom-notification {\r\n width: calc(100vw - 40px);\r\n left: 20px !important;\r\n right: 20px !important;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-date-picker ref=\"datePickerRef\" v-bind=\"mergedAttrs\" class=\"m-datepicker\" :popper-class=\"popperClass\" :class=\"{ 'style-type-solid': styleType === 'solid' }\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-date-picker>\r\n</template>\r\n\r\n<script setup>\r\nimport { useClassName } from \"@packages/hooks/useClassName.js\";\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: \"MDatePicker\",\r\n});\r\n\r\n// 定义 props,提供默认的 type 值\r\nconst props = defineProps({\r\n popperClass: {\r\n type: String,\r\n default: \"\",\r\n },\r\n styleType: {\r\n type: String,\r\n },\r\n});\r\n\r\n// 使用类名 Hook,排除 type 和 popperClass 属性\r\nconst { mergedAttrs, className: popperClass } = useClassName(\r\n \"mc-datepicker-popper\",\r\n \"popperClass\"\r\n);\r\n\r\nconst { innerRef: datePickerRef, exposedProxy } = useExposeRef('datePickerRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n<style lang=\"scss\">\r\n.m-datepicker{\r\n &.style-type-solid{\r\n --el-input-border-color: var(--bg-tertiary-hover);\r\n &.el-date-editor.el-input__wrapper, .el-input__wrapper{\r\n // box-shadow: none ;\r\n background-color: var(--bg-tertiary-hover);\r\n }\r\n }\r\n &.el-input--small{\r\n --el-input-height: 40px;\r\n }\r\n}\r\n.mc-datepicker-popper {\r\n .el-picker-panel {\r\n border: 1px solid var(--border-primary);\r\n border-radius: 6px;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\r\n .current,\r\n // .today:not(.in-range),\r\n .start-date,\r\n .end-date {\r\n .el-date-table-cell {\r\n .el-date-table-cell__text {\r\n color: var(--text-quaternary);\r\n border-radius: 3px;\r\n }\r\n }\r\n }\r\n\r\n .start-date {\r\n .el-date-table-cell {\r\n border-top-left-radius: 3px;\r\n border-bottom-left-radius: 3px;\r\n }\r\n }\r\n\r\n .end-date {\r\n .el-date-table-cell {\r\n border-top-right-radius: 3px;\r\n border-bottom-right-radius: 3px;\r\n }\r\n }\r\n\r\n .el-button.is-text {\r\n color: var(--text-brand);\r\n }\r\n .el-button.is-plain {\r\n background: var(--bg-brand);\r\n color: var(--text-quaternary);\r\n }\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-empty ref=\"emptyRef\" v-bind=\"mergedAttrs\" :image=\"imageUrl\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-empty>\r\n</template>\r\n\r\n<script>\r\n// 定义可选的图片文件名(在模块作用域中)\r\nconst availableImages = [\r\n '404',\r\n 'billing', \r\n 'cart',\r\n 'comments',\r\n 'dashboard',\r\n 'files',\r\n 'inbox',\r\n 'location',\r\n 'network',\r\n 'notifications',\r\n 'orders',\r\n 'records',\r\n 'session',\r\n 'subscription',\r\n 'todo',\r\n 'wishlist'\r\n]\r\n\r\nexport default {\r\n name: 'MEmpty'\r\n}\r\n</script>\r\n\r\n<script setup>\r\nimport { computed, useAttrs } from 'vue'\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\nconst props = defineProps({\r\n image: {\r\n type: String,\r\n default: 'orders',\r\n validator: (value) => {\r\n // 如果是完整的URL或路径,直接通过验证\r\n if (value.includes('/') || value.includes('http')) {\r\n return true\r\n }\r\n // 否则检查是否在可选列表中\r\n return availableImages.includes(value)\r\n }\r\n }\r\n})\r\n\r\nconst attrs = useAttrs()\r\n\r\n// 排除 image 属性,避免重复绑定\r\nconst mergedAttrs = computed(() => {\r\n const { image, ...rest } = attrs\r\n return rest\r\n})\r\n\r\n// 计算图片URL\r\nconst imageUrl = computed(() => {\r\n const { image } = props\r\n \r\n // 如果是完整的URL或路径,直接返回\r\n if (image.includes('/') || image.includes('http')) {\r\n return image\r\n }\r\n \r\n // 使用 public 目录中的图片\r\n // Vite 会自动处理 public 目录中的静态资源\r\n return `https://cfdsaas-pre.oss-cn-hongkong.aliyuncs.com/mc-assets/mc-ui/empty/${image}.png`\r\n})\r\n\r\nconst { innerRef: emptyRef, exposedProxy } = useExposeRef('emptyRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>","<template>\r\n <el-table v-bind=\"$attrs\" ref=\"innerTableRef\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-table>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: \"MTable\",\r\n});\r\n\r\nconst { innerRef: innerTableRef, exposedProxy } = useExposeRef('innerTableRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n<style lang=\"scss\">\r\n// Table 组件样式 - 无边框设计\r\n\r\n</style>\r\n","<template>\r\n <el-table-column v-bind=\"$attrs\" class=\"m-table-column\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]=\"slotProps\">\r\n <slot :name=\"name\" v-bind=\"slotProps || {}\" />\r\n </template>\r\n </el-table-column>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n name: \"MTableColumn\",\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n// TableColumn 组件样式\r\n.m-table-column.el-table-column {\r\n // 继承父级 Table 组件的样式\r\n}\r\n</style>\r\n","<template>\r\n <div \r\n v-if=\"visible\" \r\n class=\"m-banner\"\r\n :class=\"[\r\n `m-banner--${type}`,\r\n {\r\n 'm-banner--closable': closable,\r\n 'm-banner--with-icon': icon || slots.icon\r\n }\r\n ]\"\r\n :style=\"bannerStyle\"\r\n >\r\n <div class=\"m-banner__content\">\r\n <!-- 图标插槽 -->\r\n <div v-if=\"icon || slots.icon\" class=\"m-banner__icon\">\r\n <slot name=\"icon\">\r\n <m-icon :name=\"icon\" :size=\"iconSize\" />\r\n </slot>\r\n </div>\r\n \r\n <!-- 主要内容 -->\r\n <div class=\"m-banner__text\">\r\n <slot>{{ content }}</slot>\r\n </div>\r\n \r\n <!-- 关闭按钮 -->\r\n <div v-if=\"closable\" class=\"m-banner__close\" @click=\"handleClose\">\r\n <m-icon name=\"lucide-x\" :size=\"closeIconSize\" />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, watch, useSlots } from 'vue'\r\nimport MIcon from '../Icon/Icon.vue'\r\n\r\n// 获取插槽\r\nconst slots = useSlots()\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 横幅内容\r\n content: {\r\n type: String,\r\n default: ''\r\n },\r\n // 横幅类型\r\n type: {\r\n type: String,\r\n default: 'info',\r\n validator: (value) => ['info', 'success', 'warning', 'error'].includes(value)\r\n },\r\n // 是否可关闭\r\n closable: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 是否显示\r\n visible: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 图标名称\r\n icon: {\r\n type: String,\r\n default: ''\r\n },\r\n // 图标大小\r\n iconSize: {\r\n type: [String, Number],\r\n default: '16px'\r\n },\r\n // 关闭图标大小\r\n closeIconSize: {\r\n type: [String, Number],\r\n default: '16px'\r\n },\r\n // 自定义背景色\r\n backgroundColor: {\r\n type: String,\r\n default: ''\r\n },\r\n // 自定义文字颜色\r\n textColor: {\r\n type: String,\r\n default: ''\r\n },\r\n // 自定义边框颜色\r\n borderColor: {\r\n type: String,\r\n default: ''\r\n },\r\n // 持续时间(毫秒),0 表示不自动关闭\r\n duration: {\r\n type: Number,\r\n default: 0\r\n }\r\n})\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['close', 'update:visible'])\r\n\r\n// 响应式数据\r\nconst internalVisible = ref(props.visible)\r\n\r\n// 监听 visible prop 变化\r\nwatch(() => props.visible, (newVal) => {\r\n internalVisible.value = newVal\r\n})\r\n\r\n// 计算样式\r\nconst bannerStyle = computed(() => {\r\n const style = {}\r\n \r\n if (props.backgroundColor) {\r\n style.backgroundColor = props.backgroundColor\r\n }\r\n if (props.textColor) {\r\n style.color = props.textColor\r\n }\r\n if (props.borderColor) {\r\n style.borderColor = props.borderColor\r\n }\r\n \r\n return style\r\n})\r\n\r\n// 默认图标映射\r\nconst defaultIcons = {\r\n info: 'info',\r\n success: 'check-circle',\r\n warning: 'warning',\r\n error: 'close-circle'\r\n}\r\n\r\n// 计算实际使用的图标\r\nconst actualIcon = computed(() => {\r\n return props.icon || defaultIcons[props.type]\r\n})\r\n\r\n// 处理关闭\r\nconst handleClose = () => {\r\n internalVisible.value = false\r\n emit('update:visible', false)\r\n emit('close')\r\n}\r\n\r\n// 自动关闭逻辑\r\nwatch(internalVisible, (newVal) => {\r\n if (newVal && props.duration > 0) {\r\n setTimeout(() => {\r\n handleClose()\r\n }, props.duration)\r\n }\r\n})\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: 'MBanner'\r\n})\r\n\r\n// 暴露方法给父组件\r\ndefineExpose({\r\n close: handleClose\r\n})\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.m-banner {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n min-height: 40px;\r\n border-radius: 4px;\r\n border: 1px solid;\r\n font-size: 14px;\r\n line-height: 1.5;\r\n padding: 10px;\r\n transition: all 0.3s ease;\r\n\r\n &__content {\r\n display: flex;\r\n align-items: center;\r\n width: 100%;\r\n flex: 1;\r\n }\r\n\r\n &__icon {\r\n display: flex;\r\n align-items: center;\r\n margin-right: 8px;\r\n flex-shrink: 0;\r\n }\r\n\r\n &__text {\r\n flex: 1;\r\n word-break: break-word;\r\n }\r\n\r\n &__close {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin-left: 8px;\r\n cursor: pointer;\r\n padding: 4px;\r\n border-radius: 3px;\r\n transition: background-color 0.2s ease;\r\n flex-shrink: 0;\r\n min-width: 20px;\r\n min-height: 20px;\r\n opacity: 0.7;\r\n\r\n &:hover {\r\n background-color: rgba(0, 0, 0, 0.1);\r\n opacity: 1;\r\n }\r\n }\r\n\r\n // 类型样式\r\n &--info {\r\n background-color: #e1f3ff;\r\n border-color: #b3d8ff;\r\n color: #0066cc;\r\n\r\n .m-banner__close:hover {\r\n background-color: rgba(0, 102, 204, 0.1);\r\n }\r\n }\r\n\r\n &--success {\r\n background-color: #f0f9ff;\r\n border-color: #b3e5b3;\r\n color: #00a854;\r\n\r\n .m-banner__close:hover {\r\n background-color: rgba(0, 168, 84, 0.1);\r\n }\r\n }\r\n\r\n &--warning {\r\n background-color: #fff7e6;\r\n border-color: #ffd591;\r\n color: #fa8c16;\r\n\r\n .m-banner__close:hover {\r\n background-color: rgba(250, 140, 22, 0.1);\r\n }\r\n }\r\n\r\n &--error {\r\n background-color: #fff2f0;\r\n border-color: #ffccc7;\r\n color: #ff4d4f;\r\n\r\n .m-banner__close:hover {\r\n background-color: rgba(255, 77, 79, 0.1);\r\n }\r\n }\r\n\r\n // 带动画的关闭\r\n &.m-banner-leave-active {\r\n opacity: 0;\r\n transform: translateY(-10px);\r\n transition: opacity 0.3s ease, transform 0.3s ease;\r\n }\r\n}\r\n\r\n// 深色主题适配\r\n@media (prefers-color-scheme: dark) {\r\n .m-banner {\r\n &--info {\r\n background-color: rgba(24, 144, 255, 0.1);\r\n border-color: rgba(24, 144, 255, 0.3);\r\n color: #69c0ff;\r\n }\r\n\r\n &--success {\r\n background-color: rgba(82, 196, 26, 0.1);\r\n border-color: rgba(82, 196, 26, 0.3);\r\n color: #95de64;\r\n }\r\n\r\n &--warning {\r\n background-color: rgba(250, 173, 20, 0.1);\r\n border-color: rgba(250, 173, 20, 0.3);\r\n color: #ffd666;\r\n }\r\n\r\n &--error {\r\n background-color: rgba(255, 77, 79, 0.1);\r\n border-color: rgba(255, 77, 79, 0.3);\r\n color: #ff7875;\r\n }\r\n }\r\n}\r\n</style>\r\n","/**\r\n * 样式工具函数\r\n * 用于确保组件样式完全覆盖 Element Plus\r\n */\r\n\r\n/**\r\n * 为元素添加高优先级样式类\r\n * @param {HTMLElement} element - 目标元素\r\n */\r\nexport function addOverrideClass(element) {\r\n if (element && element.classList) {\r\n element.classList.add('mc-ui-override');\r\n }\r\n}\r\n\r\n/**\r\n * 为 Vue 组件实例添加覆盖样式\r\n * @param {Object} componentInstance - Vue 组件实例\r\n */\r\nexport function addComponentOverride(componentInstance) {\r\n if (componentInstance && componentInstance.$el) {\r\n addOverrideClass(componentInstance.$el);\r\n }\r\n}\r\n\r\n/**\r\n * 全局应用样式覆盖\r\n * 在应用启动时调用,确保所有 Element Plus 组件都被覆盖\r\n */\r\nexport function applyGlobalOverride() {\r\n // 为 body 添加覆盖类\r\n if (typeof document !== 'undefined') {\r\n document.body.classList.add('mc-ui-override');\r\n \r\n // 监听动态添加的 Element Plus 组件\r\n const observer = new MutationObserver((mutations) => {\r\n mutations.forEach((mutation) => {\r\n mutation.addedNodes.forEach((node) => {\r\n if (node.nodeType === 1 && node.classList) {\r\n // 为新添加的 Element Plus 组件添加覆盖类\r\n if (node.className && typeof node.className === 'string' && node.className.includes('el-')) {\r\n const parent = node.closest('.mc-ui-override') || node.parentElement;\r\n if (parent && !parent.classList.contains('mc-ui-override')) {\r\n parent.classList.add('mc-ui-override');\r\n }\r\n }\r\n \r\n // 检查子元素\r\n const elComponents = node.querySelectorAll('[class*=\"el-\"]');\r\n elComponents.forEach(el => {\r\n const parent = el.closest('.mc-ui-override') || el.parentElement;\r\n if (parent && !parent.classList.contains('mc-ui-override')) {\r\n parent.classList.add('mc-ui-override');\r\n }\r\n });\r\n }\r\n });\r\n });\r\n });\r\n \r\n observer.observe(document.body, {\r\n childList: true,\r\n subtree: true\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * 启用或自动切换 H5 适配(为 html 添加 mc-h5 类)\r\n * @param {Object} options\r\n * @param {'auto'|'on'|'off'} [options.mode='auto'] - 自动/强开/关闭\r\n * @param {number} [options.breakpoint=768] - 视口断点(px)\r\n * @returns {() => void} 调用以移除监听并清理状态\r\n */\r\nexport function enableH5Override(options = {}) {\r\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {};\r\n\r\n const {\r\n mode = 'auto',\r\n breakpoint = 768,\r\n } = options;\r\n\r\n const root = document.documentElement;\r\n\r\n const isMobileUA = () => /Mobi|Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\r\n const isNarrow = () => window.innerWidth <= breakpoint;\r\n\r\n const apply = (enable) => {\r\n if (enable) {\r\n root.classList.add('mc-h5');\r\n } else {\r\n root.classList.remove('mc-h5');\r\n }\r\n };\r\n\r\n if (mode === 'on') {\r\n apply(true);\r\n return () => { root.classList.remove('mc-h5'); };\r\n }\r\n\r\n if (mode === 'off') {\r\n apply(false);\r\n return () => {};\r\n }\r\n\r\n // auto 模式:依据 UA 或断点\r\n const compute = () => apply(isMobileUA() || isNarrow());\r\n compute();\r\n\r\n const onResize = () => compute();\r\n window.addEventListener('resize', onResize, { passive: true });\r\n\r\n return () => {\r\n window.removeEventListener('resize', onResize);\r\n };\r\n}\r\n\r\n/**\r\n * 强制刷新组件样式\r\n * @param {string} selector - CSS 选择器\r\n */\r\nexport function forceRefreshStyles(selector = '[class*=\"el-\"]') {\r\n if (typeof document !== 'undefined') {\r\n const elements = document.querySelectorAll(selector);\r\n elements.forEach(el => {\r\n const parent = el.closest('.mc-ui-override') || el.parentElement;\r\n if (parent && !parent.classList.contains('mc-ui-override')) {\r\n parent.classList.add('mc-ui-override');\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * 检测当前是否为 H5 环境\r\n * 优先检查 mc-h5 类(由 enableH5Override 管理),如果不存在则回退到 UA 和窗口宽度检测\r\n * @param {number} [breakpoint=768] - 视口断点(px),仅在回退检测时使用\r\n * @returns {boolean} 是否为 H5 环境\r\n */\r\nexport function isH5(breakpoint = 768) {\r\n if (typeof window === 'undefined' || typeof document === 'undefined') {\r\n return false;\r\n }\r\n\r\n // 优先检查 mc-h5 类(最可靠,由 enableH5Override 自动管理)\r\n const root = document.documentElement;\r\n if (root.classList.contains('mc-h5')) {\r\n return true;\r\n }\r\n\r\n // 回退检测:UA 或窗口宽度(兼容未调用 enableH5Override 的情况)\r\n const isMobileUA = /Mobi|Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\r\n const isNarrow = window.innerWidth <= breakpoint;\r\n return isMobileUA || isNarrow;\r\n}\r\n\r\n/**\r\n * 创建带有样式覆盖的 Element Plus 组件配置\r\n * @param {Object} componentConfig - 组件配置\r\n * @returns {Object} 增强后的组件配置\r\n */\r\nexport function createOverrideComponent(componentConfig) {\r\n return {\r\n ...componentConfig,\r\n mounted() {\r\n addOverrideClass(this.$el);\r\n if (componentConfig.mounted) {\r\n componentConfig.mounted.call(this);\r\n }\r\n },\r\n updated() {\r\n addOverrideClass(this.$el);\r\n if (componentConfig.updated) {\r\n componentConfig.updated.call(this);\r\n }\r\n }\r\n };\r\n}\r\n","<template>\r\n <div class=\"m-tabs\" :class=\"{ 'style-solid': styleType === 'solid' }\">\r\n <div class=\"m-tabs__header-wrapper\">\r\n\r\n <i\r\n v-if=\"showLeftArrow\"\r\n class=\"m-tabs__arrow m-tabs__arrow--left iconfont icon-chevron-left\"\r\n @click=\"handleScrollLeft\"\r\n />\r\n <div class=\"m-tabs__header\" ref=\"headerRef\" @scroll=\"handleScroll\">\r\n <div class=\"m-tabs__nav\" ref=\"navRef\">\r\n <div\r\n v-for=\"(tab, index) in tabs\"\r\n :key=\"tab.name\"\r\n :class=\"[\r\n 'm-tabs__item',\r\n { 'is-active': activeTab === tab.name }\r\n ]\"\r\n @click=\"handleTabClick(tab.name)\"\r\n >\r\n {{ tab.label }}\r\n </div>\r\n <div\r\n v-if=\"styleType !== 'solid'\"\r\n class=\"m-tabs__active-bar\"\r\n :style=\"activeBarStyle\"\r\n ></div>\r\n </div>\r\n </div>\r\n <i\r\n v-if=\"showRightArrow\"\r\n class=\"m-tabs__arrow m-tabs__arrow--right iconfont icon-chevron-right\"\r\n @click=\"handleScrollRight\"\r\n />\r\n </div>\r\n <div class=\"m-tabs__content\" ref=\"contentRef\" :key=\"internalKey\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { ref, reactive, computed, onMounted, onUnmounted, nextTick, provide, watch } from 'vue'\r\nimport { isH5 } from '../../utils/styleUtils.js'\r\n\r\n// 常量定义\r\nconst CONSTANTS = {\r\n // 滚动相关\r\n SCROLL_RATIO: 0.8, // 滚动比例\r\n SCROLL_MARGIN: 20, // 滚动边距\r\n EDGE_THRESHOLD_RATIO: 0.3, // 边缘阈值比例\r\n SCROLL_MIN_DIFF: 10, // 最小滚动差值(避免抖动)\r\n SCROLL_PRECISION: 0.5, // 滚动精度阈值\r\n \r\n // 定时器延迟\r\n SORT_DELAY: 10, // 排序延迟\r\n RESET_DELAY: 100, // 重置延迟\r\n SCROLL_DEBOUNCE: 150, // 滚动防抖时间\r\n SCROLL_ANIMATION: 400, // 滚动动画时间\r\n INIT_DELAY: 50, // 初始化延迟\r\n \r\n // ActiveBar 相关\r\n ACTIVE_BAR_WIDTH: 16, // 活动条宽度\r\n ACTIVE_BAR_OFFSET: 8, // 活动条偏移量\r\n H5_POSITION_TOLERANCE: 1 // H5 位置容差\r\n}\r\n\r\nexport default {\r\n name: 'MTabs',\r\n props: {\r\n modelValue: {\r\n type: [String, Number],\r\n default: ''\r\n },\r\n closable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n styleType: {\r\n type: String,\r\n default: 'default',\r\n validator: (value) => ['default', 'solid'].includes(value)\r\n }\r\n },\r\n emits: ['update:modelValue', 'tab-click', 'tab-remove', 'tab-change', 'tab-add', 'edit'],\r\n setup(props, { emit, slots }) {\r\n const navRef = ref(null)\r\n const headerRef = ref(null)\r\n const contentRef = ref(null)\r\n const tabs = ref([])\r\n const activeTab = ref(props.modelValue)\r\n const internalKey = ref(0) // 内部key,用于强制重新渲染slot内容\r\n const previousTabsCount = ref(0) // 上一次tabs的数量\r\n const previousTabsNames = ref([]) // 上一次tabs的name列表\r\n \r\n // 箭头显示控制\r\n const showLeftArrow = ref(false)\r\n const showRightArrow = ref(false)\r\n\r\n // 活动条样式\r\n const activeBarStyle = ref({ width: '0px', left: '0px' })\r\n \r\n // 定时器和状态管理\r\n let sortTimer = null\r\n let rafId = null\r\n let scrollTimeout = null\r\n let isManualScroll = false\r\n let isResetting = false\r\n let resizeObserver = null\r\n\r\n // 重置活动条样式\r\n const resetActiveBarStyle = () => {\r\n activeBarStyle.value = { width: '0px', left: '0px' }\r\n }\r\n\r\n // 获取活动项的精确位置\r\n const getActiveItemPosition = (activeItem) => {\r\n let itemLeft = activeItem.offsetLeft\r\n \r\n // 在 H5 环境下,使用更精确的位置计算\r\n if (isH5()) {\r\n const navStyle = window.getComputedStyle(navRef.value)\r\n const actualNavPaddingLeft = parseFloat(navStyle.paddingLeft) || 0\r\n \r\n // 如果位置差异超过容差,使用 getBoundingClientRect 重新计算\r\n if (Math.abs(itemLeft - actualNavPaddingLeft) > CONSTANTS.H5_POSITION_TOLERANCE) {\r\n const navRect = navRef.value.getBoundingClientRect()\r\n const itemRect = activeItem.getBoundingClientRect()\r\n itemLeft = itemRect.left - navRect.left\r\n }\r\n }\r\n \r\n return itemLeft\r\n }\r\n\r\n // 更新活动条位置\r\n const updateActiveBarPosition = (shouldScroll = true) => {\r\n nextTick(() => {\r\n // 提前退出条件检查\r\n if (!navRef.value || tabs.value.length === 0 || !activeTab.value) {\r\n resetActiveBarStyle()\r\n return\r\n }\r\n\r\n const activeIndex = tabs.value.findIndex(tab => tab.name === activeTab.value)\r\n if (activeIndex === -1) {\r\n resetActiveBarStyle()\r\n return\r\n }\r\n\r\n const navItems = navRef.value.querySelectorAll('.m-tabs__item')\r\n const activeItem = navItems[activeIndex]\r\n \r\n if (!activeItem) {\r\n resetActiveBarStyle()\r\n return\r\n }\r\n\r\n // 计算活动条位置\r\n const itemLeft = getActiveItemPosition(activeItem)\r\n const centerLeft = itemLeft + (activeItem.offsetWidth / 2) - CONSTANTS.ACTIVE_BAR_OFFSET\r\n\r\n activeBarStyle.value = {\r\n width: `${CONSTANTS.ACTIVE_BAR_WIDTH}px`,\r\n left: `${centerLeft}px`\r\n }\r\n\r\n // 滚动到活动tab可见区域(只在应该滚动时执行)\r\n if (shouldScroll) {\r\n scrollToActiveTab(activeItem)\r\n }\r\n })\r\n }\r\n\r\n // 滚动到活动tab\r\n const scrollToActiveTab = (activeItem) => {\r\n if (!headerRef.value || !activeItem) return\r\n\r\n const header = headerRef.value\r\n const headerWidth = header.clientWidth\r\n const headerScrollLeft = header.scrollLeft\r\n \r\n const itemLeft = activeItem.offsetLeft\r\n const itemWidth = activeItem.offsetWidth\r\n const itemRight = itemLeft + itemWidth\r\n\r\n if (isH5()) {\r\n // H5 环境:让标签中心对齐到可视区域中心\r\n const itemCenter = itemLeft + itemWidth / 2\r\n const navWidth = navRef.value.scrollWidth\r\n const maxScrollLeft = Math.max(0, navWidth - headerWidth)\r\n \r\n let targetScrollLeft = itemCenter - headerWidth / 2\r\n targetScrollLeft = Math.max(0, Math.min(targetScrollLeft, maxScrollLeft))\r\n \r\n // 检查是否需要滚动\r\n const itemVisibleLeft = itemLeft - headerScrollLeft\r\n const itemVisibleRight = itemRight - headerScrollLeft\r\n const isItemInView = itemVisibleLeft >= 0 && itemVisibleRight <= headerWidth\r\n \r\n const edgeThreshold = headerWidth * CONSTANTS.EDGE_THRESHOLD_RATIO\r\n const isInLeftEdge = itemVisibleLeft >= 0 && itemVisibleLeft < edgeThreshold\r\n const isInRightEdge = itemVisibleRight > headerWidth - edgeThreshold && itemVisibleRight <= headerWidth\r\n \r\n const shouldScroll = !isItemInView || isInLeftEdge || isInRightEdge\r\n const scrollDiff = Math.abs(headerScrollLeft - targetScrollLeft)\r\n \r\n if (shouldScroll && scrollDiff > CONSTANTS.SCROLL_MIN_DIFF) {\r\n header.scrollTo({ left: targetScrollLeft, behavior: 'smooth' })\r\n }\r\n } else {\r\n // 非H5环境:保持原有逻辑\r\n if (itemLeft < headerScrollLeft) {\r\n header.scrollTo({\r\n left: itemLeft - CONSTANTS.SCROLL_MARGIN,\r\n behavior: 'smooth'\r\n })\r\n } else if (itemRight > headerScrollLeft + headerWidth) {\r\n header.scrollTo({\r\n left: itemRight - headerWidth + CONSTANTS.SCROLL_MARGIN,\r\n behavior: 'smooth'\r\n })\r\n }\r\n }\r\n }\r\n\r\n // 处理tab点击\r\n const handleTabClick = (tabName) => {\r\n if (tabName === activeTab.value) return\r\n \r\n const oldValue = activeTab.value\r\n activeTab.value = tabName\r\n emit('update:modelValue', tabName)\r\n emit('tab-click', tabName)\r\n emit('tab-change', tabName, oldValue)\r\n updateActiveBarPosition()\r\n }\r\n\r\n // 处理tab关闭\r\n const handleTabRemove = (tabName) => {\r\n emit('tab-remove', tabName)\r\n emit('edit', tabName, 'remove')\r\n }\r\n\r\n // 处理tab添加\r\n const handleTabAdd = () => {\r\n emit('tab-add')\r\n emit('edit', null, 'add')\r\n }\r\n\r\n // 更新UI状态\r\n const updateUIState = () => {\r\n if (tabs.value.length > 0) {\r\n if (activeTab.value) {\r\n updateActiveBarPosition()\r\n }\r\n updateArrowVisibility()\r\n }\r\n }\r\n\r\n // 注册tab\r\n const registerTab = (tab) => {\r\n const index = tabs.value.findIndex(t => t.name === tab.name)\r\n \r\n if (index === -1) {\r\n tabs.value.push(tab)\r\n } else {\r\n tabs.value[index] = tab\r\n }\r\n \r\n // 延迟排序,等待DOM更新完成\r\n if (sortTimer) {\r\n clearTimeout(sortTimer)\r\n }\r\n \r\n sortTimer = setTimeout(() => {\r\n nextTick(() => {\r\n sortTabsByDOMOrder()\r\n updateUIState()\r\n })\r\n }, CONSTANTS.SORT_DELAY)\r\n }\r\n \r\n // 按照DOM顺序排序tabs\r\n const sortTabsByDOMOrder = () => {\r\n if (!contentRef.value || tabs.value.length === 0) return\r\n \r\n const paneElements = contentRef.value.querySelectorAll('.m-tab-pane')\r\n if (paneElements.length === 0 || paneElements.length !== tabs.value.length) return\r\n \r\n // 从DOM元素中读取data-name属性,获取DOM中的顺序\r\n const domOrder = []\r\n paneElements.forEach((el) => {\r\n const name = el.getAttribute('data-tab-name')\r\n if (name) {\r\n domOrder.push(name)\r\n }\r\n })\r\n \r\n if (domOrder.length === 0 || domOrder.length !== tabs.value.length) return\r\n \r\n // 检查当前顺序是否与DOM顺序一致\r\n const currentOrder = tabs.value.map(t => String(t.name))\r\n const isOrderSame = currentOrder.length === domOrder.length && \r\n currentOrder.every((name, index) => name === String(domOrder[index]))\r\n \r\n if (!isOrderSame) {\r\n // DOM顺序与tabs顺序不一致,按照DOM顺序重新排序\r\n const tabMap = new Map(tabs.value.map(t => [String(t.name), t]))\r\n const sortedTabs = []\r\n \r\n domOrder.forEach(name => {\r\n const tab = tabMap.get(String(name))\r\n if (tab) {\r\n sortedTabs.push(tab)\r\n }\r\n })\r\n \r\n // 确保所有tabs都被包含(处理新增的情况)\r\n tabs.value.forEach(tab => {\r\n if (!sortedTabs.find(t => t.name === tab.name)) {\r\n sortedTabs.push(tab)\r\n }\r\n })\r\n \r\n // 只有当数量一致时才更新\r\n if (sortedTabs.length === tabs.value.length) {\r\n tabs.value.splice(0, tabs.value.length, ...sortedTabs)\r\n updateActiveBarPosition()\r\n }\r\n }\r\n }\r\n \r\n \r\n\r\n // 注销tab\r\n const unregisterTab = (tabName) => {\r\n const index = tabs.value.findIndex(t => t.name === tabName)\r\n if (index > -1) {\r\n tabs.value.splice(index, 1)\r\n }\r\n }\r\n\r\n // 提供给子组件的方法\r\n provide('tabsContext', {\r\n activeTab,\r\n registerTab,\r\n unregisterTab,\r\n handleTabRemove,\r\n handleTabAdd\r\n })\r\n\r\n // 监听modelValue变化\r\n watch(() => props.modelValue, (newValue, oldValue) => {\r\n if (newValue !== activeTab.value) {\r\n activeTab.value = newValue\r\n emit('tab-change', newValue, oldValue)\r\n updateActiveBarPosition()\r\n }\r\n })\r\n\r\n // 检测tabs列表是否发生变化\r\n const detectTabsChange = (newTabs) => {\r\n if (previousTabsCount.value === 0) return false\r\n \r\n const newCount = newTabs.length\r\n const newNames = newTabs.map(t => String(t.name))\r\n \r\n const isCountChanged = newCount !== previousTabsCount.value\r\n const isOrderChanged = newCount === previousTabsCount.value && \r\n newNames.some((name, index) => \r\n index >= previousTabsNames.value.length || name !== previousTabsNames.value[index])\r\n \r\n return isCountChanged || isOrderChanged\r\n }\r\n\r\n // 处理tabs列表切换\r\n const handleTabsListChange = () => {\r\n internalKey.value++\r\n isResetting = true\r\n \r\n nextTick(() => {\r\n setTimeout(() => {\r\n sortTabsByDOMOrder()\r\n \r\n if (tabs.value.length > 0) {\r\n previousTabsCount.value = tabs.value.length\r\n previousTabsNames.value = tabs.value.map(t => String(t.name))\r\n updateUIState()\r\n }\r\n \r\n isResetting = false\r\n }, CONSTANTS.RESET_DELAY)\r\n })\r\n }\r\n\r\n // 监听tabs变化(用于更新UI和检测列表切换)\r\n watch(tabs, (newTabs) => {\r\n if (isResetting || newTabs.length === 0) return\r\n \r\n // 检测到列表切换时,强制重新渲染\r\n if (detectTabsChange(newTabs)) {\r\n handleTabsListChange()\r\n return\r\n }\r\n \r\n // 更新记录和UI\r\n previousTabsCount.value = newTabs.length\r\n previousTabsNames.value = newTabs.map(t => String(t.name))\r\n updateUIState()\r\n }, { deep: true })\r\n\r\n // 更新箭头可见性\r\n const updateArrowVisibility = () => {\r\n if (!headerRef.value || !navRef.value) return\r\n \r\n const header = headerRef.value\r\n const nav = navRef.value\r\n const currentScrollLeft = header.scrollLeft\r\n const scrollWidth = nav.scrollWidth\r\n const clientWidth = header.clientWidth\r\n \r\n // 检查是否需要显示箭头(内容宽度大于容器宽度)\r\n const needsScroll = scrollWidth > clientWidth\r\n \r\n if (!needsScroll) {\r\n showLeftArrow.value = false\r\n showRightArrow.value = false\r\n return\r\n }\r\n \r\n // 计算最大滚动距离和箭头可见性\r\n const maxScrollLeft = Math.max(0, scrollWidth - clientWidth)\r\n \r\n // 使用精度阈值处理浮点数精度问题\r\n showLeftArrow.value = currentScrollLeft > CONSTANTS.SCROLL_PRECISION\r\n showRightArrow.value = currentScrollLeft < maxScrollLeft - CONSTANTS.SCROLL_PRECISION\r\n }\r\n\r\n // 清理滚动相关的定时器\r\n const clearScrollTimers = () => {\r\n if (rafId) {\r\n cancelAnimationFrame(rafId)\r\n rafId = null\r\n }\r\n if (scrollTimeout) {\r\n clearTimeout(scrollTimeout)\r\n scrollTimeout = null\r\n }\r\n }\r\n\r\n // 滚动事件处理(防抖优化)\r\n const handleScroll = () => {\r\n updateArrowVisibility()\r\n \r\n // 非手动滚动时更新 activeBar 位置(但不自动滚动)\r\n if (!isManualScroll) {\r\n updateActiveBarPosition(false)\r\n }\r\n \r\n // 使用 requestAnimationFrame 优化更新\r\n clearScrollTimers()\r\n \r\n rafId = requestAnimationFrame(() => {\r\n updateArrowVisibility()\r\n rafId = null\r\n })\r\n \r\n // 滚动停止后再次检查\r\n scrollTimeout = setTimeout(() => {\r\n updateArrowVisibility()\r\n if (isManualScroll) {\r\n isManualScroll = false\r\n }\r\n scrollTimeout = null\r\n }, CONSTANTS.SCROLL_DEBOUNCE)\r\n }\r\n\r\n // 执行滚动动画\r\n const performScroll = (direction) => {\r\n if (!headerRef.value) return\r\n \r\n isManualScroll = true\r\n const scrollAmount = headerRef.value.clientWidth * CONSTANTS.SCROLL_RATIO\r\n headerRef.value.scrollBy({\r\n left: direction === 'left' ? -scrollAmount : scrollAmount,\r\n behavior: 'smooth'\r\n })\r\n \r\n // 滚动完成后更新状态\r\n setTimeout(() => {\r\n updateArrowVisibility()\r\n isManualScroll = false\r\n }, CONSTANTS.SCROLL_ANIMATION)\r\n }\r\n\r\n // 向左滚动\r\n const handleScrollLeft = () => {\r\n performScroll('left')\r\n }\r\n\r\n // 向右滚动\r\n const handleScrollRight = () => {\r\n performScroll('right')\r\n }\r\n\r\n // 初始化默认active tab\r\n const initDefaultActiveTab = () => {\r\n if (!activeTab.value && tabs.value.length > 0) {\r\n const firstTab = tabs.value[0]\r\n activeTab.value = firstTab.name\r\n emit('update:modelValue', activeTab.value)\r\n }\r\n }\r\n\r\n // 初始化时设置默认active tab\r\n onMounted(() => {\r\n // 初始化记录\r\n previousTabsCount.value = tabs.value.length\r\n previousTabsNames.value = tabs.value.map(t => String(t.name))\r\n \r\n initDefaultActiveTab()\r\n updateActiveBarPosition()\r\n \r\n // 延迟更新,确保样式完全应用(特别是 H5 样式)\r\n setTimeout(() => {\r\n updateActiveBarPosition()\r\n }, CONSTANTS.INIT_DELAY)\r\n \r\n // 使用 requestAnimationFrame 确保在样式渲染后更新\r\n requestAnimationFrame(() => {\r\n setTimeout(() => {\r\n updateActiveBarPosition()\r\n }, CONSTANTS.INIT_DELAY)\r\n })\r\n \r\n // 初始化箭头可见性\r\n nextTick(() => {\r\n updateArrowVisibility()\r\n })\r\n \r\n // 监听窗口大小变化和tabs变化\r\n if (headerRef.value && navRef.value) {\r\n resizeObserver = new ResizeObserver(() => {\r\n updateArrowVisibility()\r\n updateActiveBarPosition(false)\r\n })\r\n resizeObserver.observe(headerRef.value)\r\n resizeObserver.observe(navRef.value)\r\n }\r\n })\r\n\r\n // 清理所有定时器和观察器\r\n onUnmounted(() => {\r\n if (sortTimer) {\r\n clearTimeout(sortTimer)\r\n sortTimer = null\r\n }\r\n \r\n clearScrollTimers()\r\n \r\n if (resizeObserver) {\r\n resizeObserver.disconnect()\r\n resizeObserver = null\r\n }\r\n })\r\n\r\n return {\r\n navRef,\r\n headerRef,\r\n contentRef,\r\n tabs,\r\n activeTab,\r\n activeBarStyle,\r\n showLeftArrow,\r\n showRightArrow,\r\n internalKey,\r\n handleTabClick,\r\n handleTabRemove,\r\n handleTabAdd,\r\n registerTab,\r\n unregisterTab,\r\n updateActiveBarPosition,\r\n updateArrowVisibility,\r\n handleScroll,\r\n handleScrollLeft,\r\n handleScrollRight\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.m-tabs {\r\n &__header-wrapper {\r\n position: relative;\r\n display: flex;\r\n align-items: stretch;\r\n border-bottom: 1px solid var(--border-primary);\r\n }\r\n\r\n &__header {\r\n flex: 1;\r\n position: relative;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n \r\n // 完全隐藏滚动条(但保持滚动功能)\r\n scrollbar-width: none; // Firefox\r\n -ms-overflow-style: none; // IE 和 Edge\r\n \r\n &::-webkit-scrollbar {\r\n display: none; // Chrome, Safari, Opera\r\n }\r\n\r\n // 使用 CSS transition 实现平滑滚动\r\n scroll-behavior: smooth;\r\n }\r\n\r\n &__nav {\r\n position: relative;\r\n display: inline-flex;\r\n white-space: nowrap;\r\n padding: 0 16px;\r\n }\r\n\r\n &__item {\r\n position: relative;\r\n height: 24px;\r\n margin-right: 20px;\r\n margin-bottom: 6px;\r\n cursor: pointer;\r\n color: var(--text-tertiary);\r\n font-size: var(--font-size-text-base);\r\n transition: color 0.3s;\r\n user-select: none;\r\n font-weight: 600;\r\n\r\n &:hover {\r\n color: var(--text-brand);\r\n }\r\n\r\n &.is-active {\r\n color: var(--text-brand);\r\n }\r\n\r\n &:last-child {\r\n margin-right: 0;\r\n }\r\n }\r\n\r\n &__active-bar {\r\n position: absolute;\r\n bottom: 0;\r\n height: 3px;\r\n background-color: var(--text-brand);\r\n transition: all 0.3s;\r\n z-index: 1;\r\n }\r\n\r\n &__arrow {\r\n flex-shrink: 0;\r\n width: 32px;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: none;\r\n cursor: pointer;\r\n color: var(--text-primary);\r\n font-size: 24px;\r\n transition: opacity 0.3s, background-color 0.3s;\r\n user-select: none;\r\n z-index: 1;\r\n\r\n &:hover {\r\n opacity: 0.8;\r\n background-color: var(--bg-secondary);\r\n }\r\n\r\n &:active {\r\n opacity: 0.6;\r\n }\r\n }\r\n\r\n // solid 样式\r\n &.style-solid {\r\n .m-tabs__nav {\r\n border-bottom: none;\r\n background-color: var(--bg-tertiary-hover);\r\n border-radius: 8px;\r\n padding: 4px;\r\n }\r\n\r\n .m-tabs__item {\r\n height: 32px;\r\n margin-right: 0;\r\n margin-bottom: 0;\r\n padding: 0 16px;\r\n border-radius: 6px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: transparent;\r\n transition: all 0.3s;\r\n\r\n &:hover {\r\n background-color: rgba(0, 0, 0, 0.05);\r\n }\r\n\r\n &.is-active {\r\n background-color: var(--bg-primary);\r\n color: var(--text-primary);\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n }\r\n }\r\n }\r\n}\r\n\r\n.mc-h5{\r\n .m-tabs{\r\n .m-tabs__item {\r\n font-size: var(--font-size-text-sm);\r\n margin-right: 16px;\r\n \r\n // 移动端禁用 hover 效果\r\n &:hover {\r\n color: var(--text-tertiary);\r\n }\r\n \r\n &.is-active:hover {\r\n color: var(--text-brand);\r\n }\r\n }\r\n .m-tabs__nav {\r\n padding:0 10px;\r\n }\r\n // 移动端隐藏箭头按钮\r\n .m-tabs__arrow {\r\n display: none;\r\n }\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <div\r\n v-show=\"isActive\"\r\n class=\"m-tab-pane\"\r\n :class=\"{ 'is-active': isActive }\"\r\n :data-tab-name=\"tabName\"\r\n >\r\n <slot></slot>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { inject, computed, onMounted, onUnmounted, watch, nextTick } from 'vue'\r\n\r\nexport default {\r\n name: 'MTabPane',\r\n props: {\r\n label: {\r\n type: String,\r\n required: true\r\n },\r\n name: {\r\n type: [String, Number],\r\n default: ''\r\n },\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n closable: {\r\n type: Boolean,\r\n default: false\r\n }\r\n },\r\n setup(props) {\r\n const tabsContext = inject('tabsContext')\r\n \r\n // 计算tab名称,如果没有提供name则使用label\r\n const tabName = computed(() => {\r\n return props.name || props.label\r\n })\r\n\r\n // 计算是否激活\r\n const isActive = computed(() => {\r\n return tabsContext.activeTab.value === tabName.value\r\n })\r\n\r\n // 注册tab的函数\r\n const doRegisterTab = () => {\r\n const tabInfo = {\r\n label: props.label,\r\n name: tabName.value,\r\n disabled: props.disabled,\r\n closable: props.closable\r\n }\r\n tabsContext.registerTab(tabInfo)\r\n }\r\n \r\n // 组件挂载时注册tab\r\n onMounted(() => {\r\n doRegisterTab()\r\n })\r\n\r\n // 监听props变化,立即更新tab信息并重新排序(不使用防抖,确保立即响应)\r\n watch(() => [props.label, props.name, props.disabled, props.closable], (newVal, oldVal) => {\r\n // 只在首次渲染后或值真正改变时触发\r\n if (!oldVal || newVal[0] !== oldVal[0] || newVal[1] !== oldVal[1] || \r\n newVal[2] !== oldVal[2] || newVal[3] !== oldVal[3]) {\r\n // 立即注册,不使用防抖,确保顺序正确\r\n doRegisterTab()\r\n }\r\n }, { immediate: false })\r\n\r\n // 组件卸载时注销tab\r\n onUnmounted(() => {\r\n tabsContext.unregisterTab(tabName.value)\r\n })\r\n\r\n return {\r\n isActive,\r\n tabName\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.m-tab-pane {\r\n display: none;\r\n\r\n &.is-active {\r\n display: block;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <div\r\n :class=\"[\r\n 'm-tab-card-item',\r\n { \r\n 'is-active': isActive,\r\n 'is-disabled': disabled\r\n }\r\n ]\"\r\n @click=\"handleClick\"\r\n >\r\n <span class=\"m-tab-card-item__text\">\r\n <slot>{{ label }}</slot>\r\n </span>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { inject, computed } from 'vue'\r\n\r\ndefineOptions({\r\n name: \"MTabCardItem\",\r\n})\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n label: {\r\n type: String,\r\n default: ''\r\n },\r\n name: {\r\n type: [String, Number],\r\n required: true\r\n },\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n }\r\n})\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['click'])\r\n\r\n// 注入父组件上下文\r\nconst tabCardContext = inject('tabCardContext')\r\n\r\n// 计算是否激活\r\nconst isActive = computed(() => {\r\n return tabCardContext.activeTab.value === props.name\r\n})\r\n\r\n// 处理点击\r\nconst handleClick = () => {\r\n if (props.disabled) {\r\n return\r\n }\r\n \r\n tabCardContext.handleTabClick(props.name, props.disabled)\r\n emit('click', props.name)\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.m-tab-card-item {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 32px;\r\n border-radius: var(--md);\r\n cursor: pointer;\r\n // transition: all 0.3s ease;\r\n user-select: none;\r\n background-color: transparent;\r\n padding: 0 36px;\r\n text-align: center;\r\n z-index: 1;\r\n\r\n // &:hover:not(.is-disabled):not(.is-active) {\r\n // background-color: rgba(255, 255, 255, 0.05);\r\n // }\r\n\r\n &.is-active {\r\n background-color: var(--bg-brand, #ffd700);\r\n color: var(--text-quaternary);\r\n font-weight: 600;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n }\r\n\r\n &.is-disabled {\r\n cursor: not-allowed;\r\n opacity: 0.5;\r\n }\r\n\r\n &:not(.is-active) {\r\n color: var(--text-secondary, #ffffff);\r\n }\r\n\r\n &__text {\r\n font-size: 14px;\r\n line-height: 1.4;\r\n white-space: nowrap;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"m-tab-card\" :class=\"{ 'is-disabled': disabled }\">\r\n <div class=\"m-tab-card__container\">\r\n <m-tab-card-item\r\n v-for=\"(tab, index) in tabs\"\r\n :key=\"tab.name\"\r\n :name=\"tab.name\"\r\n :label=\"tab.label\"\r\n :disabled=\"tab.disabled\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, watch, provide } from 'vue'\r\nimport { useClassName } from \"@packages/hooks/useClassName.js\"\r\nimport MTabCardItem from './TabCardItem.vue'\r\n\r\ndefineOptions({\r\n name: \"MTabCard\",\r\n})\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n modelValue: {\r\n type: [String, Number],\r\n default: ''\r\n },\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n options: {\r\n type: Array,\r\n default: () => []\r\n }\r\n})\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['update:modelValue', 'change', 'tab-click'])\r\n\r\n// 使用类名 Hook\r\nconst { mergedAttrs } = useClassName()\r\n\r\n// 内部状态\r\nconst activeTab = ref(props.modelValue)\r\n\r\n// 计算 tabs 数据\r\nconst tabs = computed(() => {\r\n return props.options.map(option => {\r\n if (typeof option === 'string') {\r\n return { label: option, name: option, disabled: false }\r\n }\r\n return {\r\n label: option.label || option.name || '',\r\n name: option.name || option.label || '',\r\n disabled: option.disabled || false\r\n }\r\n })\r\n})\r\n\r\n// 处理 tab 点击\r\nconst handleTabClick = (tabName, isDisabled) => {\r\n if (isDisabled || props.disabled || tabName === activeTab.value) {\r\n return\r\n }\r\n \r\n const oldValue = activeTab.value\r\n activeTab.value = tabName\r\n emit('update:modelValue', tabName)\r\n emit('change', tabName, oldValue)\r\n emit('tab-click', tabName)\r\n}\r\n\r\n// 监听 modelValue 变化\r\nwatch(() => props.modelValue, (newValue) => {\r\n if (newValue !== activeTab.value) {\r\n activeTab.value = newValue\r\n }\r\n})\r\n\r\n// 提供给子组件的方法\r\nprovide('tabCardContext', {\r\n activeTab,\r\n handleTabClick\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.m-tab-card {\r\n display: inline-block;\r\n \r\n &.is-disabled {\r\n pointer-events: none;\r\n opacity: 0.6;\r\n }\r\n\r\n &__container {\r\n display: flex;\r\n background-color: var(--bg-tertiary-hover, #2a2a2a);\r\n border-radius: var(--md);\r\n padding: 4px;\r\n gap: 0;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <svg \r\n class=\"breadcrumb-separator-icon\"\r\n width=\"6\" \r\n height=\"10\" \r\n viewBox=\"0 0 6 10\" \r\n fill=\"none\" \r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path \r\n fill-rule=\"evenodd\" \r\n clip-rule=\"evenodd\" \r\n d=\"M0.52827 0.529247C0.788619 0.268897 1.21073 0.268897 1.47108 0.529247L5.47108 4.52925C5.73143 4.7896 5.73143 5.21171 5.47108 5.47206L1.47108 9.47206C1.21073 9.73241 0.788619 9.73241 0.52827 9.47206C0.26792 9.21171 0.26792 8.7896 0.52827 8.52925L4.05687 5.00065L0.52827 1.47206C0.26792 1.21171 0.26792 0.789596 0.52827 0.529247Z\" \r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n name: \"BreadcrumbSeparator\",\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.breadcrumb-separator-icon {\r\n display: inline-block;\r\n vertical-align: middle;\r\n}\r\n</style>\r\n\r\n","<template>\r\n <nav class=\"m-breadcrumb\" aria-label=\"Breadcrumb\">\r\n <template v-for=\"(item, index) in items\" :key=\"index\">\r\n <span\r\n :class=\"['m-breadcrumb__item', { 'is-link': item.to }]\"\r\n @click=\"handleItemClick(item)\"\r\n >\r\n {{ item.label }}\r\n </span>\r\n <BreadcrumbSeparator \r\n v-if=\"index < items.length - 1\"\r\n class=\"m-breadcrumb__separator\"\r\n />\r\n </template>\r\n </nav>\r\n</template>\r\n\r\n<script setup>\r\nimport BreadcrumbSeparator from './BreadcrumbSeparator.vue'\r\n\r\ndefineOptions({\r\n name: \"MBreadcrumb\",\r\n})\r\n\r\nconst props = defineProps({\r\n items: {\r\n type: Array,\r\n default: () => [],\r\n validator: (items) => {\r\n return items.every(item => \r\n typeof item === 'object' && \r\n item.label !== undefined\r\n )\r\n }\r\n }\r\n})\r\n\r\nconst emit = defineEmits(['click'])\r\n\r\nconst handleItemClick = (item) => {\r\n if (!item.to) return\r\n \r\n emit('click', item)\r\n \r\n // 处理路由跳转\r\n if (typeof item.to === 'string') {\r\n if (item.to.startsWith('http://') || item.to.startsWith('https://')) {\r\n window.location.href = item.to\r\n } else {\r\n if (item.replace) {\r\n window.history.replaceState({}, '', item.to)\r\n } else {\r\n window.history.pushState({}, '', item.to)\r\n }\r\n window.dispatchEvent(new PopStateEvent('popstate'))\r\n }\r\n } else if (typeof item.to === 'object' && item.to.path) {\r\n const path = item.to.path\r\n if (item.replace) {\r\n window.history.replaceState({}, '', path)\r\n } else {\r\n window.history.pushState({}, '', path)\r\n }\r\n window.dispatchEvent(new PopStateEvent('popstate'))\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.m-breadcrumb {\r\n display: inline-flex;\r\n align-items: center;\r\n font-size: 14px;\r\n line-height: 20px;\r\n height: 20px;\r\n \r\n &__item {\r\n color: var(--text-secondary, #909399);\r\n transition: color 0.2s;\r\n white-space: nowrap;\r\n line-height: 20px;\r\n height: 20px;\r\n display: inline-flex;\r\n align-items: center;\r\n \r\n &.is-link {\r\n color: var(--text-tertiary);\r\n cursor: pointer;\r\n font-weight: 500;\r\n \r\n &:hover {\r\n color: var(--text-primary, #ffd700);\r\n }\r\n }\r\n \r\n &:last-child {\r\n color: var(--text-primary, #c0c4cc);\r\n cursor: default;\r\n font-weight: normal;\r\n }\r\n }\r\n \r\n &__separator {\r\n margin: 0 8px;\r\n color: var(--text-tertiary, #c0c4cc);\r\n flex-shrink: 0;\r\n display: inline-flex;\r\n align-items: center;\r\n height: 20px;\r\n }\r\n}\r\n</style>\r\n\r\n","function noop() {\n}\nconst extend = Object.assign;\nconst inBrowser = typeof window !== \"undefined\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isDef = (val) => val !== void 0 && val !== null;\nconst isFunction = (val) => typeof val === \"function\";\nconst isPromise = (val) => isObject(val) && isFunction(val.then) && isFunction(val.catch);\nconst isDate = (val) => Object.prototype.toString.call(val) === \"[object Date]\" && !Number.isNaN(val.getTime());\nfunction isMobile(value) {\n value = value.replace(/[^-|\\d]/g, \"\");\n return /^((\\+86)|(86))?(1)\\d{10}$/.test(value) || /^0[0-9-]{10,13}$/.test(value);\n}\nconst isNumeric = (val) => typeof val === \"number\" || /^\\d+(\\.\\d+)?$/.test(val);\nconst isIOS = () => inBrowser ? /ios|iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase()) : false;\nfunction get(object, path) {\n const keys = path.split(\".\");\n let result = object;\n keys.forEach((key) => {\n var _a;\n result = isObject(result) ? (_a = result[key]) != null ? _a : \"\" : \"\";\n });\n return result;\n}\nfunction pick(obj, keys, ignoreUndefined) {\n return keys.reduce(\n (ret, key) => {\n if (!ignoreUndefined || obj[key] !== void 0) {\n ret[key] = obj[key];\n }\n return ret;\n },\n {}\n );\n}\nconst isSameValue = (newValue, oldValue) => JSON.stringify(newValue) === JSON.stringify(oldValue);\nconst toArray = (item) => Array.isArray(item) ? item : [item];\nconst flat = (arr) => arr.reduce((acc, val) => acc.concat(val), []);\nexport {\n extend,\n flat,\n get,\n inBrowser,\n isDate,\n isDef,\n isFunction,\n isIOS,\n isMobile,\n isNumeric,\n isObject,\n isPromise,\n isSameValue,\n noop,\n pick,\n toArray\n};\n","const unknownProp = null;\nconst numericProp = [Number, String];\nconst truthProp = {\n type: Boolean,\n default: true\n};\nconst makeRequiredProp = (type) => ({\n type,\n required: true\n});\nconst makeArrayProp = () => ({\n type: Array,\n default: () => []\n});\nconst makeNumberProp = (defaultVal) => ({\n type: Number,\n default: defaultVal\n});\nconst makeNumericProp = (defaultVal) => ({\n type: numericProp,\n default: defaultVal\n});\nconst makeStringProp = (defaultVal) => ({\n type: String,\n default: defaultVal\n});\nexport {\n makeArrayProp,\n makeNumberProp,\n makeNumericProp,\n makeRequiredProp,\n makeStringProp,\n numericProp,\n truthProp,\n unknownProp\n};\n","// src/utils.ts\nvar inBrowser = typeof window !== \"undefined\";\nvar supportsPassive = true;\nfunction raf(fn) {\n return inBrowser ? requestAnimationFrame(fn) : -1;\n}\nfunction cancelRaf(id) {\n if (inBrowser) {\n cancelAnimationFrame(id);\n }\n}\nfunction doubleRaf(fn) {\n raf(() => raf(fn));\n}\n\n// src/useRect/index.ts\nimport { unref } from \"vue\";\nvar isWindow = (val) => val === window;\nvar makeDOMRect = (width2, height2) => ({\n top: 0,\n left: 0,\n right: width2,\n bottom: height2,\n width: width2,\n height: height2\n});\nvar useRect = (elementOrRef) => {\n const element = unref(elementOrRef);\n if (isWindow(element)) {\n const width2 = element.innerWidth;\n const height2 = element.innerHeight;\n return makeDOMRect(width2, height2);\n }\n if (element == null ? void 0 : element.getBoundingClientRect) {\n return element.getBoundingClientRect();\n }\n return makeDOMRect(0, 0);\n};\n\n// src/useToggle/index.ts\nimport { ref } from \"vue\";\nfunction useToggle(defaultValue = false) {\n const state = ref(defaultValue);\n const toggle = (value = !state.value) => {\n state.value = value;\n };\n return [state, toggle];\n}\n\n// src/useRelation/useParent.ts\nimport {\n ref as ref2,\n inject,\n computed,\n onUnmounted,\n getCurrentInstance\n} from \"vue\";\nfunction useParent(key) {\n const parent = inject(key, null);\n if (parent) {\n const instance = getCurrentInstance();\n const { link, unlink, internalChildren } = parent;\n link(instance);\n onUnmounted(() => unlink(instance));\n const index = computed(() => internalChildren.indexOf(instance));\n return {\n parent,\n index\n };\n }\n return {\n parent: null,\n index: ref2(-1)\n };\n}\n\n// src/useRelation/useChildren.ts\nimport {\n isVNode,\n provide,\n reactive,\n getCurrentInstance as getCurrentInstance2\n} from \"vue\";\nfunction flattenVNodes(children) {\n const result = [];\n const traverse = (children2) => {\n if (Array.isArray(children2)) {\n children2.forEach((child) => {\n var _a;\n if (isVNode(child)) {\n result.push(child);\n if ((_a = child.component) == null ? void 0 : _a.subTree) {\n result.push(child.component.subTree);\n traverse(child.component.subTree.children);\n }\n if (child.children) {\n traverse(child.children);\n }\n }\n });\n }\n };\n traverse(children);\n return result;\n}\nvar findVNodeIndex = (vnodes, vnode) => {\n const index = vnodes.indexOf(vnode);\n if (index === -1) {\n return vnodes.findIndex(\n (item) => vnode.key !== void 0 && vnode.key !== null && item.type === vnode.type && item.key === vnode.key\n );\n }\n return index;\n};\nfunction sortChildren(parent, publicChildren, internalChildren) {\n const vnodes = flattenVNodes(parent.subTree.children);\n internalChildren.sort(\n (a, b) => findVNodeIndex(vnodes, a.vnode) - findVNodeIndex(vnodes, b.vnode)\n );\n const orderedPublicChildren = internalChildren.map((item) => item.proxy);\n publicChildren.sort((a, b) => {\n const indexA = orderedPublicChildren.indexOf(a);\n const indexB = orderedPublicChildren.indexOf(b);\n return indexA - indexB;\n });\n}\nfunction useChildren(key) {\n const publicChildren = reactive([]);\n const internalChildren = reactive([]);\n const parent = getCurrentInstance2();\n const linkChildren = (value) => {\n const link = (child) => {\n if (child.proxy) {\n internalChildren.push(child);\n publicChildren.push(child.proxy);\n sortChildren(parent, publicChildren, internalChildren);\n }\n };\n const unlink = (child) => {\n const index = internalChildren.indexOf(child);\n publicChildren.splice(index, 1);\n internalChildren.splice(index, 1);\n };\n provide(\n key,\n Object.assign(\n {\n link,\n unlink,\n children: publicChildren,\n internalChildren\n },\n value\n )\n );\n };\n return {\n children: publicChildren,\n linkChildren\n };\n}\n\n// src/useCountDown/index.ts\nimport {\n ref as ref3,\n computed as computed2,\n onActivated,\n onDeactivated,\n onBeforeUnmount\n} from \"vue\";\nvar SECOND = 1e3;\nvar MINUTE = 60 * SECOND;\nvar HOUR = 60 * MINUTE;\nvar DAY = 24 * HOUR;\nfunction parseTime(time) {\n const days = Math.floor(time / DAY);\n const hours = Math.floor(time % DAY / HOUR);\n const minutes = Math.floor(time % HOUR / MINUTE);\n const seconds = Math.floor(time % MINUTE / SECOND);\n const milliseconds = Math.floor(time % SECOND);\n return {\n total: time,\n days,\n hours,\n minutes,\n seconds,\n milliseconds\n };\n}\nfunction isSameSecond(time1, time2) {\n return Math.floor(time1 / 1e3) === Math.floor(time2 / 1e3);\n}\nfunction useCountDown(options) {\n let rafId;\n let endTime;\n let counting;\n let deactivated;\n const remain = ref3(options.time);\n const current = computed2(() => parseTime(remain.value));\n const pause = () => {\n counting = false;\n cancelRaf(rafId);\n };\n const getCurrentRemain = () => Math.max(endTime - Date.now(), 0);\n const setRemain = (value) => {\n var _a, _b;\n remain.value = value;\n (_a = options.onChange) == null ? void 0 : _a.call(options, current.value);\n if (value === 0) {\n pause();\n (_b = options.onFinish) == null ? void 0 : _b.call(options);\n }\n };\n const microTick = () => {\n rafId = raf(() => {\n if (counting) {\n setRemain(getCurrentRemain());\n if (remain.value > 0) {\n microTick();\n }\n }\n });\n };\n const macroTick = () => {\n rafId = raf(() => {\n if (counting) {\n const remainRemain = getCurrentRemain();\n if (!isSameSecond(remainRemain, remain.value) || remainRemain === 0) {\n setRemain(remainRemain);\n }\n if (remain.value > 0) {\n macroTick();\n }\n }\n });\n };\n const tick = () => {\n if (!inBrowser) {\n return;\n }\n if (options.millisecond) {\n microTick();\n } else {\n macroTick();\n }\n };\n const start = () => {\n if (!counting) {\n endTime = Date.now() + remain.value;\n counting = true;\n tick();\n }\n };\n const reset = (totalTime = options.time) => {\n pause();\n remain.value = totalTime;\n };\n onBeforeUnmount(pause);\n onActivated(() => {\n if (deactivated) {\n counting = true;\n deactivated = false;\n tick();\n }\n });\n onDeactivated(() => {\n if (counting) {\n pause();\n deactivated = true;\n }\n });\n return {\n start,\n pause,\n reset,\n current\n };\n}\n\n// src/useClickAway/index.ts\nimport { unref as unref3 } from \"vue\";\n\n// src/useEventListener/index.ts\nimport {\n watch,\n isRef,\n unref as unref2,\n onUnmounted as onUnmounted2,\n onDeactivated as onDeactivated2\n} from \"vue\";\n\n// src/onMountedOrActivated/index.ts\nimport { nextTick, onMounted, onActivated as onActivated2 } from \"vue\";\nfunction onMountedOrActivated(hook) {\n let mounted;\n onMounted(() => {\n hook();\n nextTick(() => {\n mounted = true;\n });\n });\n onActivated2(() => {\n if (mounted) {\n hook();\n }\n });\n}\n\n// src/useEventListener/index.ts\nfunction useEventListener(type, listener, options = {}) {\n if (!inBrowser) {\n return;\n }\n const { target = window, passive = false, capture = false } = options;\n let cleaned = false;\n let attached;\n const add = (target2) => {\n if (cleaned) {\n return;\n }\n const element = unref2(target2);\n if (element && !attached) {\n element.addEventListener(type, listener, {\n capture,\n passive\n });\n attached = true;\n }\n };\n const remove = (target2) => {\n if (cleaned) {\n return;\n }\n const element = unref2(target2);\n if (element && attached) {\n element.removeEventListener(type, listener, capture);\n attached = false;\n }\n };\n onUnmounted2(() => remove(target));\n onDeactivated2(() => remove(target));\n onMountedOrActivated(() => add(target));\n let stopWatch;\n if (isRef(target)) {\n stopWatch = watch(target, (val, oldVal) => {\n remove(oldVal);\n add(val);\n });\n }\n return () => {\n stopWatch == null ? void 0 : stopWatch();\n remove(target);\n cleaned = true;\n };\n}\n\n// src/useClickAway/index.ts\nfunction useClickAway(target, listener, options = {}) {\n if (!inBrowser) {\n return;\n }\n const { eventName = \"click\" } = options;\n const onClick = (event) => {\n const targets = Array.isArray(target) ? target : [target];\n const isClickAway = targets.every((item) => {\n const element = unref3(item);\n return element && !element.contains(event.target);\n });\n if (isClickAway) {\n listener(event);\n }\n };\n useEventListener(eventName, onClick, { target: document });\n}\n\n// src/useWindowSize/index.ts\nimport { ref as ref4 } from \"vue\";\nvar width;\nvar height;\nfunction useWindowSize() {\n if (!width) {\n width = ref4(0);\n height = ref4(0);\n if (inBrowser) {\n const update = () => {\n width.value = window.innerWidth;\n height.value = window.innerHeight;\n };\n update();\n window.addEventListener(\"resize\", update, { passive: true });\n window.addEventListener(\"orientationchange\", update, { passive: true });\n }\n }\n return { width, height };\n}\n\n// src/useScrollParent/index.ts\nimport { ref as ref5, onMounted as onMounted2 } from \"vue\";\nvar overflowScrollReg = /scroll|auto|overlay/i;\nvar defaultRoot = inBrowser ? window : void 0;\nfunction isElement(node) {\n const ELEMENT_NODE_TYPE = 1;\n return node.tagName !== \"HTML\" && node.tagName !== \"BODY\" && node.nodeType === ELEMENT_NODE_TYPE;\n}\nfunction getScrollParent(el, root = defaultRoot) {\n let node = el;\n while (node && node !== root && isElement(node)) {\n const { overflowY } = window.getComputedStyle(node);\n if (overflowScrollReg.test(overflowY)) {\n return node;\n }\n node = node.parentNode;\n }\n return root;\n}\nfunction useScrollParent(el, root = defaultRoot) {\n const scrollParent = ref5();\n onMounted2(() => {\n if (el.value) {\n scrollParent.value = getScrollParent(el.value, root);\n }\n });\n return scrollParent;\n}\n\n// src/usePageVisibility/index.ts\nimport { ref as ref6 } from \"vue\";\nvar visibility;\nfunction usePageVisibility() {\n if (!visibility) {\n visibility = ref6(\"visible\");\n if (inBrowser) {\n const update = () => {\n visibility.value = document.hidden ? \"hidden\" : \"visible\";\n };\n update();\n window.addEventListener(\"visibilitychange\", update);\n }\n }\n return visibility;\n}\n\n// src/useCustomFieldValue/index.ts\nimport { watch as watch2, inject as inject2 } from \"vue\";\nvar CUSTOM_FIELD_INJECTION_KEY = Symbol(\"van-field\");\nfunction useCustomFieldValue(customValue) {\n const field = inject2(CUSTOM_FIELD_INJECTION_KEY, null);\n if (field && !field.customValue.value) {\n field.customValue.value = customValue;\n watch2(customValue, () => {\n field.resetValidation();\n field.validateWithTrigger(\"onChange\");\n });\n }\n}\n\n// src/useRaf/index.ts\nfunction useRaf(fn, options) {\n if (inBrowser) {\n const { interval = 0, isLoop = false } = options || {};\n let start;\n let isStopped = false;\n let rafId;\n const stop = () => {\n isStopped = true;\n cancelAnimationFrame(rafId);\n };\n const frameWrapper = (timestamp) => {\n if (isStopped)\n return;\n if (start === void 0) {\n start = timestamp;\n } else if (timestamp - start > interval) {\n fn(timestamp);\n start = timestamp;\n if (!isLoop) {\n stop();\n return;\n }\n }\n rafId = requestAnimationFrame(frameWrapper);\n };\n rafId = requestAnimationFrame(frameWrapper);\n return stop;\n }\n return () => {\n };\n}\nexport {\n CUSTOM_FIELD_INJECTION_KEY,\n cancelRaf,\n doubleRaf,\n flattenVNodes,\n getScrollParent,\n inBrowser,\n onMountedOrActivated,\n raf,\n sortChildren,\n supportsPassive,\n useChildren,\n useClickAway,\n useCountDown,\n useCustomFieldValue,\n useEventListener,\n usePageVisibility,\n useParent,\n useRaf,\n useRect,\n useScrollParent,\n useToggle,\n useWindowSize\n};\n","import { useRect, useWindowSize } from \"@vant/use\";\nimport { unref } from \"vue\";\nimport { isIOS as checkIsIOS } from \"./basic.mjs\";\nfunction getScrollTop(el) {\n const top = \"scrollTop\" in el ? el.scrollTop : el.pageYOffset;\n return Math.max(top, 0);\n}\nfunction setScrollTop(el, value) {\n if (\"scrollTop\" in el) {\n el.scrollTop = value;\n } else {\n el.scrollTo(el.scrollX, value);\n }\n}\nfunction getRootScrollTop() {\n return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n}\nfunction setRootScrollTop(value) {\n setScrollTop(window, value);\n setScrollTop(document.body, value);\n}\nfunction getElementTop(el, scroller) {\n if (el === window) {\n return 0;\n }\n const scrollTop = scroller ? getScrollTop(scroller) : getRootScrollTop();\n return useRect(el).top + scrollTop;\n}\nconst isIOS = checkIsIOS();\nfunction resetScroll() {\n if (isIOS) {\n setRootScrollTop(getRootScrollTop());\n }\n}\nconst stopPropagation = (event) => event.stopPropagation();\nfunction preventDefault(event, isStopPropagation) {\n if (typeof event.cancelable !== \"boolean\" || event.cancelable) {\n event.preventDefault();\n }\n if (isStopPropagation) {\n stopPropagation(event);\n }\n}\nfunction isHidden(elementRef) {\n const el = unref(elementRef);\n if (!el) {\n return false;\n }\n const style = window.getComputedStyle(el);\n const hidden = style.display === \"none\";\n const parentHidden = el.offsetParent === null && style.position !== \"fixed\";\n return hidden || parentHidden;\n}\nconst { width: windowWidth, height: windowHeight } = useWindowSize();\nfunction isContainingBlock(el) {\n const css = window.getComputedStyle(el);\n return css.transform !== \"none\" || css.perspective !== \"none\" || [\"transform\", \"perspective\", \"filter\"].some(\n (value) => (css.willChange || \"\").includes(value)\n );\n}\nfunction getContainingBlock(el) {\n let node = el.parentElement;\n while (node) {\n if (node && node.tagName !== \"HTML\" && node.tagName !== \"BODY\" && isContainingBlock(node)) {\n return node;\n }\n node = node.parentElement;\n }\n return null;\n}\nexport {\n getContainingBlock,\n getElementTop,\n getRootScrollTop,\n getScrollTop,\n isHidden,\n preventDefault,\n resetScroll,\n setRootScrollTop,\n setScrollTop,\n stopPropagation,\n windowHeight,\n windowWidth\n};\n","import { inBrowser } from \"./basic.mjs\";\nimport { windowWidth, windowHeight } from \"./dom.mjs\";\nimport { isDef, isNumeric } from \"./basic.mjs\";\nfunction addUnit(value) {\n if (isDef(value)) {\n return isNumeric(value) ? `${value}px` : String(value);\n }\n return void 0;\n}\nfunction getSizeStyle(originSize) {\n if (isDef(originSize)) {\n if (Array.isArray(originSize)) {\n return {\n width: addUnit(originSize[0]),\n height: addUnit(originSize[1])\n };\n }\n const size = addUnit(originSize);\n return {\n width: size,\n height: size\n };\n }\n}\nfunction getZIndexStyle(zIndex) {\n const style = {};\n if (zIndex !== void 0) {\n style.zIndex = +zIndex;\n }\n return style;\n}\nlet rootFontSize;\nfunction getRootFontSize() {\n if (!rootFontSize) {\n const doc = document.documentElement;\n const fontSize = doc.style.fontSize || window.getComputedStyle(doc).fontSize;\n rootFontSize = parseFloat(fontSize);\n }\n return rootFontSize;\n}\nfunction convertRem(value) {\n value = value.replace(/rem/g, \"\");\n return +value * getRootFontSize();\n}\nfunction convertVw(value) {\n value = value.replace(/vw/g, \"\");\n return +value * windowWidth.value / 100;\n}\nfunction convertVh(value) {\n value = value.replace(/vh/g, \"\");\n return +value * windowHeight.value / 100;\n}\nfunction unitToPx(value) {\n if (typeof value === \"number\") {\n return value;\n }\n if (inBrowser) {\n if (value.includes(\"rem\")) {\n return convertRem(value);\n }\n if (value.includes(\"vw\")) {\n return convertVw(value);\n }\n if (value.includes(\"vh\")) {\n return convertVh(value);\n }\n }\n return parseFloat(value);\n}\nconst camelizeRE = /-(\\w)/g;\nconst camelize = (str) => str.replace(camelizeRE, (_, c) => c.toUpperCase());\nconst kebabCase = (str) => str.replace(/([A-Z])/g, \"-$1\").toLowerCase().replace(/^-/, \"\");\nfunction padZero(num, targetLength = 2) {\n let str = num + \"\";\n while (str.length < targetLength) {\n str = \"0\" + str;\n }\n return str;\n}\nconst clamp = (num, min, max) => Math.min(Math.max(num, min), max);\nfunction trimExtraChar(value, char, regExp) {\n const index = value.indexOf(char);\n if (index === -1) {\n return value;\n }\n if (char === \"-\" && index !== 0) {\n return value.slice(0, index);\n }\n return value.slice(0, index + 1) + value.slice(index).replace(regExp, \"\");\n}\nfunction formatNumber(value, allowDot = true, allowMinus = true) {\n if (allowDot) {\n value = trimExtraChar(value, \".\", /\\./g);\n } else {\n value = value.split(\".\")[0];\n }\n if (allowMinus) {\n value = trimExtraChar(value, \"-\", /-/g);\n } else {\n value = value.replace(/-/, \"\");\n }\n const regExp = allowDot ? /[^-0-9.]/g : /[^-0-9]/g;\n return value.replace(regExp, \"\");\n}\nfunction addNumber(num1, num2) {\n const cardinal = 10 ** 10;\n return Math.round((num1 + num2) * cardinal) / cardinal;\n}\nexport {\n addNumber,\n addUnit,\n camelize,\n clamp,\n formatNumber,\n getSizeStyle,\n getZIndexStyle,\n kebabCase,\n padZero,\n unitToPx\n};\n","import { isDef, isObject } from \"./basic.mjs\";\nconst { hasOwnProperty } = Object.prototype;\nfunction assignKey(to, from, key) {\n const val = from[key];\n if (!isDef(val)) {\n return;\n }\n if (!hasOwnProperty.call(to, key) || !isObject(val)) {\n to[key] = val;\n } else {\n to[key] = deepAssign(Object(to[key]), val);\n }\n}\nfunction deepAssign(to, from) {\n Object.keys(from).forEach((key) => {\n assignKey(to, from, key);\n });\n return to;\n}\nexport {\n deepAssign\n};\n","var stdin_default = {\n name: \"\\u59D3\\u540D\",\n tel: \"\\u7535\\u8BDD\",\n save: \"\\u4FDD\\u5B58\",\n clear: \"\\u6E05\\u7A7A\",\n cancel: \"\\u53D6\\u6D88\",\n confirm: \"\\u786E\\u8BA4\",\n delete: \"\\u5220\\u9664\",\n loading: \"\\u52A0\\u8F7D\\u4E2D...\",\n noCoupon: \"\\u6682\\u65E0\\u4F18\\u60E0\\u5238\",\n nameEmpty: \"\\u8BF7\\u586B\\u5199\\u59D3\\u540D\",\n addContact: \"\\u6DFB\\u52A0\\u8054\\u7CFB\\u4EBA\",\n telInvalid: \"\\u8BF7\\u586B\\u5199\\u6B63\\u786E\\u7684\\u7535\\u8BDD\",\n vanCalendar: {\n end: \"\\u7ED3\\u675F\",\n start: \"\\u5F00\\u59CB\",\n title: \"\\u65E5\\u671F\\u9009\\u62E9\",\n weekdays: [\"\\u65E5\", \"\\u4E00\", \"\\u4E8C\", \"\\u4E09\", \"\\u56DB\", \"\\u4E94\", \"\\u516D\"],\n monthTitle: (year, month) => `${year}\\u5E74${month}\\u6708`,\n rangePrompt: (maxRange) => `\\u6700\\u591A\\u9009\\u62E9 ${maxRange} \\u5929`\n },\n vanCascader: {\n select: \"\\u8BF7\\u9009\\u62E9\"\n },\n vanPagination: {\n prev: \"\\u4E0A\\u4E00\\u9875\",\n next: \"\\u4E0B\\u4E00\\u9875\"\n },\n vanPullRefresh: {\n pulling: \"\\u4E0B\\u62C9\\u5373\\u53EF\\u5237\\u65B0...\",\n loosing: \"\\u91CA\\u653E\\u5373\\u53EF\\u5237\\u65B0...\"\n },\n vanSubmitBar: {\n label: \"\\u5408\\u8BA1:\"\n },\n vanCoupon: {\n unlimited: \"\\u65E0\\u95E8\\u69DB\",\n discount: (discount) => `${discount}\\u6298`,\n condition: (condition) => `\\u6EE1${condition}\\u5143\\u53EF\\u7528`\n },\n vanCouponCell: {\n title: \"\\u4F18\\u60E0\\u5238\",\n count: (count) => `${count}\\u5F20\\u53EF\\u7528`\n },\n vanCouponList: {\n exchange: \"\\u5151\\u6362\",\n close: \"\\u4E0D\\u4F7F\\u7528\",\n enable: \"\\u53EF\\u7528\",\n disabled: \"\\u4E0D\\u53EF\\u7528\",\n placeholder: \"\\u8F93\\u5165\\u4F18\\u60E0\\u7801\"\n },\n vanAddressEdit: {\n area: \"\\u5730\\u533A\",\n areaEmpty: \"\\u8BF7\\u9009\\u62E9\\u5730\\u533A\",\n addressEmpty: \"\\u8BF7\\u586B\\u5199\\u8BE6\\u7EC6\\u5730\\u5740\",\n addressDetail: \"\\u8BE6\\u7EC6\\u5730\\u5740\",\n defaultAddress: \"\\u8BBE\\u4E3A\\u9ED8\\u8BA4\\u6536\\u8D27\\u5730\\u5740\"\n },\n vanAddressList: {\n add: \"\\u65B0\\u589E\\u5730\\u5740\"\n }\n};\nexport {\n stdin_default as default\n};\n","import { ref, reactive } from \"vue\";\nimport { deepAssign } from \"../utils/deep-assign.mjs\";\nimport defaultMessages from \"./lang/zh-CN.mjs\";\nconst lang = ref(\"zh-CN\");\nconst messages = reactive({\n \"zh-CN\": defaultMessages\n});\nconst Locale = {\n messages() {\n return messages[lang.value];\n },\n use(newLang, newMessages) {\n lang.value = newLang;\n this.add({ [newLang]: newMessages });\n },\n add(newMessages = {}) {\n deepAssign(messages, newMessages);\n }\n};\nconst useCurrentLang = () => lang;\nvar stdin_default = Locale;\nexport {\n Locale,\n stdin_default as default,\n useCurrentLang\n};\n","import { get, isFunction } from \"./basic.mjs\";\nimport { camelize } from \"./format.mjs\";\nimport locale from \"../locale/index.mjs\";\nfunction createTranslate(name) {\n const prefix = camelize(name) + \".\";\n return (path, ...args) => {\n const messages = locale.messages();\n const message = get(messages, prefix + path) || get(messages, path);\n return isFunction(message) ? message(...args) : message;\n };\n}\nfunction genBem(name, mods) {\n if (!mods) {\n return \"\";\n }\n if (typeof mods === \"string\") {\n return ` ${name}--${mods}`;\n }\n if (Array.isArray(mods)) {\n return mods.reduce(\n (ret, item) => ret + genBem(name, item),\n \"\"\n );\n }\n return Object.keys(mods).reduce(\n (ret, key) => ret + (mods[key] ? genBem(name, key) : \"\"),\n \"\"\n );\n}\nfunction createBEM(name) {\n return (el, mods) => {\n if (el && typeof el !== \"string\") {\n mods = el;\n el = \"\";\n }\n el = el ? `${name}__${el}` : name;\n return `${el}${genBem(el, mods)}`;\n };\n}\nfunction createNamespace(name) {\n const prefixedName = `van-${name}`;\n return [\n prefixedName,\n createBEM(prefixedName),\n createTranslate(prefixedName)\n ];\n}\nexport {\n createBEM,\n createNamespace,\n createTranslate\n};\n","const BORDER = \"van-hairline\";\nconst BORDER_TOP = `${BORDER}--top`;\nconst BORDER_LEFT = `${BORDER}--left`;\nconst BORDER_RIGHT = `${BORDER}--right`;\nconst BORDER_BOTTOM = `${BORDER}--bottom`;\nconst BORDER_SURROUND = `${BORDER}--surround`;\nconst BORDER_TOP_BOTTOM = `${BORDER}--top-bottom`;\nconst BORDER_UNSET_TOP_BOTTOM = `${BORDER}-unset--top-bottom`;\nconst HAPTICS_FEEDBACK = \"van-haptics-feedback\";\nconst FORM_KEY = Symbol(\"van-form\");\nconst LONG_PRESS_START_TIME = 500;\nconst TAP_OFFSET = 5;\nexport {\n BORDER,\n BORDER_BOTTOM,\n BORDER_LEFT,\n BORDER_RIGHT,\n BORDER_SURROUND,\n BORDER_TOP,\n BORDER_TOP_BOTTOM,\n BORDER_UNSET_TOP_BOTTOM,\n FORM_KEY,\n HAPTICS_FEEDBACK,\n LONG_PRESS_START_TIME,\n TAP_OFFSET\n};\n","import { noop, isPromise } from \"./basic.mjs\";\nfunction callInterceptor(interceptor, {\n args = [],\n done,\n canceled,\n error\n}) {\n if (interceptor) {\n const returnVal = interceptor.apply(null, args);\n if (isPromise(returnVal)) {\n returnVal.then((value) => {\n if (value) {\n done();\n } else if (canceled) {\n canceled();\n }\n }).catch(error || noop);\n } else if (returnVal) {\n done();\n } else if (canceled) {\n canceled();\n }\n } else {\n done();\n }\n}\nexport {\n callInterceptor\n};\n","import { camelize } from \"./format.mjs\";\nfunction withInstall(options) {\n options.install = (app) => {\n const { name } = options;\n if (name) {\n app.component(name, options);\n app.component(camelize(`-${name}`), options);\n }\n };\n return options;\n}\nexport {\n withInstall\n};\n","import { inject, watch } from \"vue\";\nconst POPUP_TOGGLE_KEY = Symbol();\nfunction onPopupReopen(callback) {\n const popupToggleStatus = inject(POPUP_TOGGLE_KEY, null);\n if (popupToggleStatus) {\n watch(popupToggleStatus, (show) => {\n if (show) {\n callback();\n }\n });\n }\n}\nexport {\n POPUP_TOGGLE_KEY,\n onPopupReopen\n};\n","import { getCurrentInstance } from \"vue\";\nimport { extend } from \"../utils/index.mjs\";\nfunction useExpose(apis) {\n const instance = getCurrentInstance();\n if (instance) {\n extend(instance.proxy, apis);\n }\n}\nexport {\n useExpose\n};\n","import { computed, defineComponent, createVNode as _createVNode } from \"vue\";\nimport { isDef, addUnit, isNumeric, truthProp, numericProp, makeStringProp, createNamespace } from \"../utils/index.mjs\";\nconst [name, bem] = createNamespace(\"badge\");\nconst badgeProps = {\n dot: Boolean,\n max: numericProp,\n tag: makeStringProp(\"div\"),\n color: String,\n offset: Array,\n content: numericProp,\n showZero: truthProp,\n position: makeStringProp(\"top-right\")\n};\nvar stdin_default = defineComponent({\n name,\n props: badgeProps,\n setup(props, {\n slots\n }) {\n const hasContent = () => {\n if (slots.content) {\n return true;\n }\n const {\n content,\n showZero\n } = props;\n return isDef(content) && content !== \"\" && (showZero || content !== 0 && content !== \"0\");\n };\n const renderContent = () => {\n const {\n dot,\n max,\n content\n } = props;\n if (!dot && hasContent()) {\n if (slots.content) {\n return slots.content();\n }\n if (isDef(max) && isNumeric(content) && +content > +max) {\n return `${max}+`;\n }\n return content;\n }\n };\n const getOffsetWithMinusString = (val) => val.startsWith(\"-\") ? val.replace(\"-\", \"\") : `-${val}`;\n const style = computed(() => {\n const style2 = {\n background: props.color\n };\n if (props.offset) {\n const [x, y] = props.offset;\n const {\n position\n } = props;\n const [offsetY, offsetX] = position.split(\"-\");\n if (slots.default) {\n if (typeof y === \"number\") {\n style2[offsetY] = addUnit(offsetY === \"top\" ? y : -y);\n } else {\n style2[offsetY] = offsetY === \"top\" ? addUnit(y) : getOffsetWithMinusString(y);\n }\n if (typeof x === \"number\") {\n style2[offsetX] = addUnit(offsetX === \"left\" ? x : -x);\n } else {\n style2[offsetX] = offsetX === \"left\" ? addUnit(x) : getOffsetWithMinusString(x);\n }\n } else {\n style2.marginTop = addUnit(y);\n style2.marginLeft = addUnit(x);\n }\n }\n return style2;\n });\n const renderBadge = () => {\n if (hasContent() || props.dot) {\n return _createVNode(\"div\", {\n \"class\": bem([props.position, {\n dot: props.dot,\n fixed: !!slots.default\n }]),\n \"style\": style.value\n }, [renderContent()]);\n }\n };\n return () => {\n if (slots.default) {\n const {\n tag\n } = props;\n return _createVNode(tag, {\n \"class\": bem(\"wrapper\")\n }, {\n default: () => [slots.default(), renderBadge()]\n });\n }\n return renderBadge();\n };\n }\n});\nexport {\n badgeProps,\n stdin_default as default\n};\n","import { withInstall } from \"../utils/index.mjs\";\nimport _Badge from \"./Badge.mjs\";\nconst Badge = withInstall(_Badge);\nvar stdin_default = Badge;\nimport { badgeProps } from \"./Badge.mjs\";\nexport {\n Badge,\n badgeProps,\n stdin_default as default\n};\n","let globalZIndex = 2e3;\nconst useGlobalZIndex = () => ++globalZIndex;\nconst setGlobalZIndex = (val) => {\n globalZIndex = val;\n};\nexport {\n setGlobalZIndex,\n useGlobalZIndex\n};\n","import { watch, provide, computed, watchEffect, onActivated, onDeactivated, onBeforeUnmount, defineComponent, createVNode as _createVNode } from \"vue\";\nimport { extend, inBrowser, kebabCase, makeStringProp, createNamespace } from \"../utils/index.mjs\";\nimport { setGlobalZIndex } from \"../composables/use-global-z-index.mjs\";\nconst [name, bem] = createNamespace(\"config-provider\");\nconst CONFIG_PROVIDER_KEY = Symbol(name);\nconst configProviderProps = {\n tag: makeStringProp(\"div\"),\n theme: makeStringProp(\"light\"),\n zIndex: Number,\n themeVars: Object,\n themeVarsDark: Object,\n themeVarsLight: Object,\n themeVarsScope: makeStringProp(\"local\"),\n iconPrefix: String\n};\nfunction insertDash(str) {\n return str.replace(/([a-zA-Z])(\\d)/g, \"$1-$2\");\n}\nfunction mapThemeVarsToCSSVars(themeVars) {\n const cssVars = {};\n Object.keys(themeVars).forEach((key) => {\n const formattedKey = insertDash(kebabCase(key));\n cssVars[`--van-${formattedKey}`] = themeVars[key];\n });\n return cssVars;\n}\nfunction syncThemeVarsOnRoot(newStyle = {}, oldStyle = {}) {\n Object.keys(newStyle).forEach((key) => {\n if (newStyle[key] !== oldStyle[key]) {\n document.documentElement.style.setProperty(key, newStyle[key]);\n }\n });\n Object.keys(oldStyle).forEach((key) => {\n if (!newStyle[key]) {\n document.documentElement.style.removeProperty(key);\n }\n });\n}\nvar stdin_default = defineComponent({\n name,\n props: configProviderProps,\n setup(props, {\n slots\n }) {\n const style = computed(() => mapThemeVarsToCSSVars(extend({}, props.themeVars, props.theme === \"dark\" ? props.themeVarsDark : props.themeVarsLight)));\n if (inBrowser) {\n const addTheme = () => {\n document.documentElement.classList.add(`van-theme-${props.theme}`);\n };\n const removeTheme = (theme = props.theme) => {\n document.documentElement.classList.remove(`van-theme-${theme}`);\n };\n watch(() => props.theme, (newVal, oldVal) => {\n if (oldVal) {\n removeTheme(oldVal);\n }\n addTheme();\n }, {\n immediate: true\n });\n onActivated(addTheme);\n onDeactivated(removeTheme);\n onBeforeUnmount(removeTheme);\n watch(style, (newStyle, oldStyle) => {\n if (props.themeVarsScope === \"global\") {\n syncThemeVarsOnRoot(newStyle, oldStyle);\n }\n });\n watch(() => props.themeVarsScope, (newScope, oldScope) => {\n if (oldScope === \"global\") {\n syncThemeVarsOnRoot({}, style.value);\n }\n if (newScope === \"global\") {\n syncThemeVarsOnRoot(style.value, {});\n }\n });\n if (props.themeVarsScope === \"global\") {\n syncThemeVarsOnRoot(style.value, {});\n }\n }\n provide(CONFIG_PROVIDER_KEY, props);\n watchEffect(() => {\n if (props.zIndex !== void 0) {\n setGlobalZIndex(props.zIndex);\n }\n });\n return () => _createVNode(props.tag, {\n \"class\": bem(),\n \"style\": props.themeVarsScope === \"local\" ? style.value : void 0\n }, {\n default: () => {\n var _a;\n return [(_a = slots.default) == null ? void 0 : _a.call(slots)];\n }\n });\n }\n});\nexport {\n CONFIG_PROVIDER_KEY,\n configProviderProps,\n stdin_default as default\n};\n","import { inject, computed, defineComponent, createVNode as _createVNode, mergeProps as _mergeProps } from \"vue\";\nimport { addUnit, numericProp, makeStringProp, createNamespace } from \"../utils/index.mjs\";\nimport { Badge } from \"../badge/index.mjs\";\nimport { CONFIG_PROVIDER_KEY } from \"../config-provider/ConfigProvider.mjs\";\nconst [name, bem] = createNamespace(\"icon\");\nconst isImage = (name2) => name2 == null ? void 0 : name2.includes(\"/\");\nconst iconProps = {\n dot: Boolean,\n tag: makeStringProp(\"i\"),\n name: String,\n size: numericProp,\n badge: numericProp,\n color: String,\n badgeProps: Object,\n classPrefix: String\n};\nvar stdin_default = defineComponent({\n name,\n props: iconProps,\n setup(props, {\n slots\n }) {\n const config = inject(CONFIG_PROVIDER_KEY, null);\n const classPrefix = computed(() => props.classPrefix || (config == null ? void 0 : config.iconPrefix) || bem());\n return () => {\n const {\n tag,\n dot,\n name: name2,\n size,\n badge,\n color\n } = props;\n const isImageIcon = isImage(name2);\n return _createVNode(Badge, _mergeProps({\n \"dot\": dot,\n \"tag\": tag,\n \"class\": [classPrefix.value, isImageIcon ? \"\" : `${classPrefix.value}-${name2}`],\n \"style\": {\n color,\n fontSize: addUnit(size)\n },\n \"content\": badge\n }, props.badgeProps), {\n default: () => {\n var _a;\n return [(_a = slots.default) == null ? void 0 : _a.call(slots), isImageIcon && _createVNode(\"img\", {\n \"class\": bem(\"image\"),\n \"src\": name2\n }, null)];\n }\n });\n };\n }\n});\nexport {\n stdin_default as default,\n iconProps\n};\n","import { withInstall } from \"../utils/index.mjs\";\nimport _Icon from \"./Icon.mjs\";\nconst Icon = withInstall(_Icon);\nvar stdin_default = Icon;\nimport { iconProps } from \"./Icon.mjs\";\nexport {\n Icon,\n stdin_default as default,\n iconProps\n};\n","import { truthProp, unknownProp, numericProp } from \"../utils/index.mjs\";\nconst popupSharedProps = {\n // whether to show popup\n show: Boolean,\n // z-index\n zIndex: numericProp,\n // whether to show overlay\n overlay: truthProp,\n // transition duration\n duration: numericProp,\n // teleport\n teleport: [String, Object],\n // prevent body scroll\n lockScroll: truthProp,\n // whether to lazy render\n lazyRender: truthProp,\n // callback function before close\n beforeClose: Function,\n // overlay props\n overlayProps: Object,\n // overlay custom style\n overlayStyle: Object,\n // overlay custom class name\n overlayClass: unknownProp,\n // Initial rendering animation\n transitionAppear: Boolean,\n // whether to close popup when overlay is clicked\n closeOnClickOverlay: truthProp\n};\nconst popupSharedPropKeys = Object.keys(\n popupSharedProps\n);\nexport {\n popupSharedPropKeys,\n popupSharedProps\n};\n","import { ref } from \"vue\";\nimport { TAP_OFFSET } from \"../utils/index.mjs\";\nfunction getDirection(x, y) {\n if (x > y) {\n return \"horizontal\";\n }\n if (y > x) {\n return \"vertical\";\n }\n return \"\";\n}\nfunction useTouch() {\n const startX = ref(0);\n const startY = ref(0);\n const deltaX = ref(0);\n const deltaY = ref(0);\n const offsetX = ref(0);\n const offsetY = ref(0);\n const direction = ref(\"\");\n const isTap = ref(true);\n const isVertical = () => direction.value === \"vertical\";\n const isHorizontal = () => direction.value === \"horizontal\";\n const reset = () => {\n deltaX.value = 0;\n deltaY.value = 0;\n offsetX.value = 0;\n offsetY.value = 0;\n direction.value = \"\";\n isTap.value = true;\n };\n const start = (event) => {\n reset();\n startX.value = event.touches[0].clientX;\n startY.value = event.touches[0].clientY;\n };\n const move = (event) => {\n const touch = event.touches[0];\n deltaX.value = (touch.clientX < 0 ? 0 : touch.clientX) - startX.value;\n deltaY.value = touch.clientY - startY.value;\n offsetX.value = Math.abs(deltaX.value);\n offsetY.value = Math.abs(deltaY.value);\n const LOCK_DIRECTION_DISTANCE = 10;\n if (!direction.value || offsetX.value < LOCK_DIRECTION_DISTANCE && offsetY.value < LOCK_DIRECTION_DISTANCE) {\n direction.value = getDirection(offsetX.value, offsetY.value);\n }\n if (isTap.value && (offsetX.value > TAP_OFFSET || offsetY.value > TAP_OFFSET)) {\n isTap.value = false;\n }\n };\n return {\n move,\n start,\n reset,\n startX,\n startY,\n deltaX,\n deltaY,\n offsetX,\n offsetY,\n direction,\n isVertical,\n isHorizontal,\n isTap\n };\n}\nexport {\n useTouch\n};\n","import { watch, onBeforeUnmount, onDeactivated } from \"vue\";\nimport { getScrollParent, onMountedOrActivated } from \"@vant/use\";\nimport { useTouch } from \"./use-touch.mjs\";\nimport { preventDefault } from \"../utils/index.mjs\";\nlet totalLockCount = 0;\nconst BODY_LOCK_CLASS = \"van-overflow-hidden\";\nfunction useLockScroll(rootRef, shouldLock) {\n const touch = useTouch();\n const DIRECTION_UP = \"01\";\n const DIRECTION_DOWN = \"10\";\n const onTouchMove = (event) => {\n touch.move(event);\n const direction = touch.deltaY.value > 0 ? DIRECTION_DOWN : DIRECTION_UP;\n const el = getScrollParent(\n event.target,\n rootRef.value\n );\n const { scrollHeight, offsetHeight, scrollTop } = el;\n let status = \"11\";\n if (scrollTop === 0) {\n status = offsetHeight >= scrollHeight ? \"00\" : \"01\";\n } else if (scrollTop + offsetHeight >= scrollHeight) {\n status = \"10\";\n }\n if (status !== \"11\" && touch.isVertical() && !(parseInt(status, 2) & parseInt(direction, 2))) {\n preventDefault(event, true);\n }\n };\n const lock = () => {\n document.addEventListener(\"touchstart\", touch.start);\n document.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n if (!totalLockCount) {\n document.body.classList.add(BODY_LOCK_CLASS);\n }\n totalLockCount++;\n };\n const unlock = () => {\n if (totalLockCount) {\n document.removeEventListener(\"touchstart\", touch.start);\n document.removeEventListener(\"touchmove\", onTouchMove);\n totalLockCount--;\n if (!totalLockCount) {\n document.body.classList.remove(BODY_LOCK_CLASS);\n }\n }\n };\n const init = () => shouldLock() && lock();\n const destroy = () => shouldLock() && unlock();\n onMountedOrActivated(init);\n onDeactivated(destroy);\n onBeforeUnmount(destroy);\n watch(shouldLock, (value) => {\n value ? lock() : unlock();\n });\n}\nexport {\n useLockScroll\n};\n","import { ref, watch } from \"vue\";\nfunction useLazyRender(show) {\n const inited = ref(false);\n watch(\n show,\n (value) => {\n if (value) {\n inited.value = value;\n }\n },\n { immediate: true }\n );\n return (render) => () => inited.value ? render() : null;\n}\nexport {\n useLazyRender\n};\n","import { getCurrentInstance } from \"vue\";\nconst useScopeId = () => {\n var _a;\n const { scopeId } = ((_a = getCurrentInstance()) == null ? void 0 : _a.vnode) || {};\n return scopeId ? { [scopeId]: \"\" } : null;\n};\nexport {\n useScopeId\n};\n","import { ref, defineComponent, Teleport, Transition, vShow as _vShow, mergeProps as _mergeProps, createVNode as _createVNode, withDirectives as _withDirectives } from \"vue\";\nimport { isDef, extend, truthProp, numericProp, unknownProp, preventDefault, createNamespace, getZIndexStyle } from \"../utils/index.mjs\";\nimport { useEventListener } from \"@vant/use\";\nimport { useLazyRender } from \"../composables/use-lazy-render.mjs\";\nconst [name, bem] = createNamespace(\"overlay\");\nconst overlayProps = {\n show: Boolean,\n zIndex: numericProp,\n duration: numericProp,\n className: unknownProp,\n lockScroll: truthProp,\n lazyRender: truthProp,\n customStyle: Object,\n teleport: [String, Object]\n};\nvar stdin_default = defineComponent({\n name,\n inheritAttrs: false,\n props: overlayProps,\n setup(props, {\n attrs,\n slots\n }) {\n const root = ref();\n const lazyRender = useLazyRender(() => props.show || !props.lazyRender);\n const onTouchMove = (event) => {\n if (props.lockScroll) {\n preventDefault(event, true);\n }\n };\n const renderOverlay = lazyRender(() => {\n var _a;\n const style = extend(getZIndexStyle(props.zIndex), props.customStyle);\n if (isDef(props.duration)) {\n style.animationDuration = `${props.duration}s`;\n }\n return _withDirectives(_createVNode(\"div\", _mergeProps({\n \"ref\": root,\n \"style\": style,\n \"class\": [bem(), props.className]\n }, attrs), [(_a = slots.default) == null ? void 0 : _a.call(slots)]), [[_vShow, props.show]]);\n });\n useEventListener(\"touchmove\", onTouchMove, {\n target: root\n });\n return () => {\n const Content = _createVNode(Transition, {\n \"name\": \"van-fade\",\n \"appear\": true\n }, {\n default: renderOverlay\n });\n if (props.teleport) {\n return _createVNode(Teleport, {\n \"to\": props.teleport\n }, {\n default: () => [Content]\n });\n }\n return Content;\n };\n }\n});\nexport {\n stdin_default as default,\n overlayProps\n};\n","import { withInstall } from \"../utils/index.mjs\";\nimport _Overlay from \"./Overlay.mjs\";\nconst Overlay = withInstall(_Overlay);\nvar stdin_default = Overlay;\nimport { overlayProps } from \"./Overlay.mjs\";\nexport {\n Overlay,\n stdin_default as default,\n overlayProps\n};\n","import { ref, watch, provide, Teleport, nextTick, computed, onMounted, Transition, onActivated, onDeactivated, defineComponent, mergeProps as _mergeProps, createVNode as _createVNode, vShow as _vShow, withDirectives as _withDirectives, Fragment as _Fragment } from \"vue\";\nimport { popupSharedProps } from \"./shared.mjs\";\nimport { isDef, extend, makeStringProp, callInterceptor, createNamespace, HAPTICS_FEEDBACK } from \"../utils/index.mjs\";\nimport { useEventListener } from \"@vant/use\";\nimport { useExpose } from \"../composables/use-expose.mjs\";\nimport { useLockScroll } from \"../composables/use-lock-scroll.mjs\";\nimport { useLazyRender } from \"../composables/use-lazy-render.mjs\";\nimport { POPUP_TOGGLE_KEY } from \"../composables/on-popup-reopen.mjs\";\nimport { useGlobalZIndex } from \"../composables/use-global-z-index.mjs\";\nimport { useScopeId } from \"../composables/use-scope-id.mjs\";\nimport { Icon } from \"../icon/index.mjs\";\nimport { Overlay } from \"../overlay/index.mjs\";\nconst popupProps = extend({}, popupSharedProps, {\n round: Boolean,\n position: makeStringProp(\"center\"),\n closeIcon: makeStringProp(\"cross\"),\n closeable: Boolean,\n transition: String,\n iconPrefix: String,\n closeOnPopstate: Boolean,\n closeIconPosition: makeStringProp(\"top-right\"),\n destroyOnClose: Boolean,\n safeAreaInsetTop: Boolean,\n safeAreaInsetBottom: Boolean\n});\nconst [name, bem] = createNamespace(\"popup\");\nvar stdin_default = defineComponent({\n name,\n inheritAttrs: false,\n props: popupProps,\n emits: [\"open\", \"close\", \"opened\", \"closed\", \"keydown\", \"update:show\", \"clickOverlay\", \"clickCloseIcon\"],\n setup(props, {\n emit,\n attrs,\n slots\n }) {\n let opened;\n let shouldReopen;\n const zIndex = ref();\n const popupRef = ref();\n const lazyRender = useLazyRender(() => props.show || !props.lazyRender);\n const style = computed(() => {\n const style2 = {\n zIndex: zIndex.value\n };\n if (isDef(props.duration)) {\n const key = props.position === \"center\" ? \"animationDuration\" : \"transitionDuration\";\n style2[key] = `${props.duration}s`;\n }\n return style2;\n });\n const open = () => {\n if (!opened) {\n opened = true;\n zIndex.value = props.zIndex !== void 0 ? +props.zIndex : useGlobalZIndex();\n emit(\"open\");\n }\n };\n const close = () => {\n if (opened) {\n callInterceptor(props.beforeClose, {\n done() {\n opened = false;\n emit(\"close\");\n emit(\"update:show\", false);\n }\n });\n }\n };\n const onClickOverlay = (event) => {\n emit(\"clickOverlay\", event);\n if (props.closeOnClickOverlay) {\n close();\n }\n };\n const renderOverlay = () => {\n if (props.overlay) {\n const overlayProps = extend({\n show: props.show,\n class: props.overlayClass,\n zIndex: zIndex.value,\n duration: props.duration,\n customStyle: props.overlayStyle,\n role: props.closeOnClickOverlay ? \"button\" : void 0,\n tabindex: props.closeOnClickOverlay ? 0 : void 0\n }, props.overlayProps);\n return _createVNode(Overlay, _mergeProps(overlayProps, useScopeId(), {\n \"onClick\": onClickOverlay\n }), {\n default: slots[\"overlay-content\"]\n });\n }\n };\n const onClickCloseIcon = (event) => {\n emit(\"clickCloseIcon\", event);\n close();\n };\n const renderCloseIcon = () => {\n if (props.closeable) {\n return _createVNode(Icon, {\n \"role\": \"button\",\n \"tabindex\": 0,\n \"name\": props.closeIcon,\n \"class\": [bem(\"close-icon\", props.closeIconPosition), HAPTICS_FEEDBACK],\n \"classPrefix\": props.iconPrefix,\n \"onClick\": onClickCloseIcon\n }, null);\n }\n };\n let timer;\n const onOpened = () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n emit(\"opened\");\n });\n };\n const onClosed = () => emit(\"closed\");\n const onKeydown = (event) => emit(\"keydown\", event);\n const renderPopup = lazyRender(() => {\n var _a;\n const {\n destroyOnClose,\n round,\n position,\n safeAreaInsetTop,\n safeAreaInsetBottom,\n show\n } = props;\n if (!show && destroyOnClose) {\n return;\n }\n return _withDirectives(_createVNode(\"div\", _mergeProps({\n \"ref\": popupRef,\n \"style\": style.value,\n \"role\": \"dialog\",\n \"tabindex\": 0,\n \"class\": [bem({\n round,\n [position]: position\n }), {\n \"van-safe-area-top\": safeAreaInsetTop,\n \"van-safe-area-bottom\": safeAreaInsetBottom\n }],\n \"onKeydown\": onKeydown\n }, attrs, useScopeId()), [(_a = slots.default) == null ? void 0 : _a.call(slots), renderCloseIcon()]), [[_vShow, show]]);\n });\n const renderTransition = () => {\n const {\n position,\n transition,\n transitionAppear\n } = props;\n const name2 = position === \"center\" ? \"van-fade\" : `van-popup-slide-${position}`;\n return _createVNode(Transition, {\n \"name\": transition || name2,\n \"appear\": transitionAppear,\n \"onAfterEnter\": onOpened,\n \"onAfterLeave\": onClosed\n }, {\n default: renderPopup\n });\n };\n watch(() => props.show, (show) => {\n if (show && !opened) {\n open();\n if (attrs.tabindex === 0) {\n nextTick(() => {\n var _a;\n (_a = popupRef.value) == null ? void 0 : _a.focus();\n });\n }\n }\n if (!show && opened) {\n opened = false;\n emit(\"close\");\n }\n });\n useExpose({\n popupRef\n });\n useLockScroll(popupRef, () => props.show && props.lockScroll);\n useEventListener(\"popstate\", () => {\n if (props.closeOnPopstate) {\n close();\n shouldReopen = false;\n }\n });\n onMounted(() => {\n if (props.show) {\n open();\n }\n });\n onActivated(() => {\n if (shouldReopen) {\n emit(\"update:show\", true);\n shouldReopen = false;\n }\n });\n onDeactivated(() => {\n if (props.show && props.teleport) {\n close();\n shouldReopen = true;\n }\n });\n provide(POPUP_TOGGLE_KEY, () => props.show);\n return () => {\n if (props.teleport) {\n return _createVNode(Teleport, {\n \"to\": props.teleport\n }, {\n default: () => [renderOverlay(), renderTransition()]\n });\n }\n return _createVNode(_Fragment, null, [renderOverlay(), renderTransition()]);\n };\n }\n});\nexport {\n stdin_default as default,\n popupProps\n};\n","import { withInstall } from \"../utils/index.mjs\";\nimport _Popup from \"./Popup.mjs\";\nconst Popup = withInstall(_Popup);\nvar stdin_default = Popup;\nimport { popupProps } from \"./Popup.mjs\";\nexport {\n Popup,\n stdin_default as default,\n popupProps\n};\n","<template>\r\n <popup v-model:show=\"show\" round position=\"bottom\" v-bind=\"$attrs\">\r\n <div class=\"header\">\r\n <div class=\"title\">\r\n {{ title }}\r\n </div>\r\n <div class=\"close\" @click=\"bindClosePopup\">\r\n <i class=\"iconfont icon-lucide-x\"></i>\r\n </div>\r\n </div>\r\n <div class=\"list-container\">\r\n <div\r\n class=\"list-item\"\r\n :class=\"{ active: model === item[columnsFieldNames.value] }\"\r\n v-for=\"item in columns\"\r\n :key=\"item[columnsFieldNames.value]\"\r\n @click=\"pickerConfirm(item)\"\r\n >\r\n <div class=\"label\">\r\n <template v-if=\"$slots.label\">\r\n <slot name=\"label\" :item=\"item\"></slot>\r\n </template>\r\n <template v-else>\r\n {{ item[columnsFieldNames.label] }}\r\n </template>\r\n </div>\r\n <div class=\"active-icon\">\r\n <i\r\n v-show=\"model === item[columnsFieldNames.value]\"\r\n class=\"iconfont icon-check\"\r\n ></i>\r\n </div>\r\n </div>\r\n <slot />\r\n </div>\r\n </popup>\r\n</template>\r\n<script setup>\r\nimport { Popup, Picker } from \"vant\";\r\ndefineOptions({\r\n name: \"MPicker\",\r\n});\r\nconst emit = defineEmits([\"confirm\"]);\r\nconst props = defineProps({\r\n title: {\r\n type: String,\r\n default: \"\",\r\n },\r\n columns: {\r\n type: Array,\r\n default: [],\r\n },\r\n columnsFieldNames: {\r\n type: Object,\r\n default: () => {\r\n return { label: \"label\", value: \"value\" };\r\n },\r\n },\r\n});\r\nconst model = defineModel();\r\nconst show = defineModel(\"show\", {\r\n type: Boolean,\r\n default: false,\r\n});\r\n\r\nconst pickerConfirm = (item) => {\r\n model.value = item[props.columnsFieldNames.value];\r\n emit(\"confirm\", item);\r\n bindClosePopup();\r\n};\r\n\r\nconst bindClosePopup = () => {\r\n show.value = false;\r\n};\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n min-height: 60px;\r\n .title {\r\n font-size: var(--font-size-text-lg);\r\n font-weight: 600;\r\n text-align: center;\r\n width: 100%;\r\n color: var(--text-primary);\r\n }\r\n .close {\r\n cursor: pointer;\r\n position: absolute;\r\n right: 0;\r\n top: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 52px;\r\n height: 52px;\r\n .iconfont {\r\n font-size: 20px;\r\n font-weight: normal;\r\n color: var(--icon-tertiary);\r\n }\r\n }\r\n}\r\n\r\n.list-container {\r\n display: flex;\r\n flex-direction: column;\r\n max-height: 558px;\r\n padding: 0 16px 24px;\r\n overflow-y: auto;\r\n .list-item {\r\n padding:16px 12px;\r\n border-radius: var(--md);\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n min-height: 52px;\r\n &.active {\r\n background: var(--bg-tertiary-hover);\r\n }\r\n .label {\r\n font-size: var(--font-size-text-base);\r\n color: var(--text-primary);\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n flex: 1;\r\n }\r\n .active-icon {\r\n font-size: 20px;\r\n width: 20px;\r\n color: var(--text-primary);\r\n }\r\n }\r\n}\r\n</style>\r\n","/**\r\n * @mc-markets/ui - 自定义组件库\r\n * \r\n * 提供自定义组件和工具函数\r\n * 支持 Element Plus 组件回退机制\r\n * 将 Element Plus 组件前缀从 el- 转换为 m- 并导出\r\n * 导出 Element Plus 事件相关功能(Message、MessageBox、Notification、Loading 等)\r\n * \r\n * @version 1.1.51\n */\r\n\r\nimport * as ElementPlusComponents from 'element-plus'\r\n// 导入样式文件\r\nimport MIcon from './components/Icon/Icon.vue'\r\nimport MButton from './components/Button/Button.vue'\r\nimport MInput from './components/Input/Input.vue'\r\nimport MForm from './components/Form/Form.vue'\r\nimport MFormItem from './components/FormItem/FormItem.vue'\r\nimport MTooltip from './components/Tooltip/Tooltip.vue'\r\nimport MSelect from './components/Select/Select.vue'\r\nimport MOption from './components/Option/Option.vue'\r\nimport MOptionGroup from './components/OptionGroup/OptionGroup.vue'\r\nimport MPagination from './components/Pagination/Pagination.vue'\r\nimport MRadio from './components/Radio/Radio.vue'\r\nimport MRadioGroup from './components/RadioGroup/RadioGroup.vue'\r\nimport MRadioButton from './components/RadioButton/RadioButton.vue'\r\nimport MSwitch from './components/Switch/Switch.vue'\r\nimport MTag from './components/Tag/Tag.vue'\r\nimport MAlert from './components/Alert/Alert.vue'\r\nimport MDialog from './components/Dialog/Dialog.vue'\r\nimport MNotification from './components/Notification/Notification.vue'\r\nimport MMessage, { Message } from './components/Message/Message.vue'\r\nimport MNotifiMessage, { NotifiMessage } from './components/NotifiMessage/NotifiMessage.vue'\r\nimport MDatePicker from './components/DatePicker/DatePicker.vue'\r\nimport MEmpty from './components/Empty/Empty.vue'\r\nimport MTable from './components/Table/Table.vue'\r\nimport MTableColumn from './components/Table/TableColumn.vue'\r\nimport MBanner from './components/Banner/Banner.vue'\r\nimport MTabs from './components/Tabs/Tabs.vue'\r\nimport MTabPane from './components/Tabs/TabPane.vue'\r\nimport MTabCard from './components/TabCard/TabCard.vue'\r\nimport MTabCardItem from './components/TabCard/TabCardItem.vue'\r\nimport MBreadcrumb from './components/Breadcrumb/Breadcrumb.vue'\r\nimport MPicker from './components/Picker/Picker.vue'\r\nconst components = [MIcon, MButton, MInput, MForm, MFormItem, MTooltip, MSelect, MOption, MOptionGroup, MPagination, MRadio, MRadioGroup, MRadioButton, MSwitch, MTag, MAlert, MDialog, MNotification, MMessage, MNotifiMessage, MDatePicker, MEmpty, MTable, MTableColumn, MBanner, MTabs, MTabPane, MTabCard, MTabCardItem, MBreadcrumb, MPicker]\r\n\r\n// 统一的组件名称转换函数\r\n// 将 MDatePicker -> m-date-picker,与 Element Plus 转换逻辑保持一致\r\nfunction convertComponentName(componentName) {\r\n if (!componentName || typeof componentName !== 'string') {\r\n return null\r\n }\r\n \r\n // 如果不是 M 开头,返回 null\r\n if (!componentName.startsWith('M')) {\r\n return null\r\n }\r\n \r\n // 移除 M 前缀,然后转换驼峰为 kebab-case\r\n // MDatePicker -> DatePicker -> -Date-Picker -> -date-picker -> date-picker -> m-date-picker\r\n const nameWithoutPrefix = componentName.slice(1)\r\n const kebabCase = nameWithoutPrefix\r\n .replace(/([A-Z])/g, '-$1')\r\n .toLowerCase()\r\n .replace(/^-/, '')\r\n \r\n return 'm-' + kebabCase\r\n}\r\n\r\n// 全局组件配置 - 需要自动创建实例的组件\r\nconst globalInstanceComponents = [\r\n { id: 'global-message-container', component: MMessage },\r\n { id: 'global-notification-container', component: MNotifiMessage }\r\n]\r\n\r\n// 创建单个全局组件实例\r\nasync function createGlobalComponent({ id, component }) {\r\n try {\r\n // 检查是否已存在,避免重复创建\r\n if (document.getElementById(id)) return\r\n \r\n const { createApp, h } = await import('vue')\r\n \r\n // 创建容器\r\n const container = document.createElement('div')\r\n container.id = id\r\n document.body.appendChild(container)\r\n \r\n // 创建并挂载 Vue 应用\r\n const app = createApp({\r\n render: () => h(component)\r\n })\r\n \r\n app.mount(`#${id}`)\r\n } catch (error) {\r\n console.warn(`Failed to create global component ${id}:`, error)\r\n }\r\n}\r\n\r\n// 创建所有全局组件实例\r\nasync function createGlobalComponents() {\r\n const promises = globalInstanceComponents.map(createGlobalComponent)\r\n await Promise.all(promises)\r\n}\r\n\r\n// 存储转换后的 Element Plus 组件\r\nconst convertedComponents = {}\r\n\r\nfunction registerElementPlus(app) {\r\n // 获取已注册的自定义组件名称\r\n const customComponentNames = components\r\n .map(comp => convertComponentName(comp?.name))\r\n .filter(Boolean)\r\n\r\n \r\n Object.entries(ElementPlusComponents).forEach(([key, comp]) => {\r\n if (comp && comp.name && typeof comp.name === 'string' && comp.name.startsWith('El')) {\r\n // 将 ElOptionGroup 转换为 m-option-group\r\n const mName = 'm-' + comp.name.slice(2).replace(/([A-Z])/g, '-$1').toLowerCase().replace(/^-/, '')\r\n \r\n // 只注册没有被自定义组件覆盖的Element Plus组件\r\n if (!customComponentNames.includes(mName)) {\r\n // 检查组件是否已经注册,避免重复注册警告\r\n if (!app._context.components[mName]) {\r\n app.component(mName, comp)\r\n } else {\r\n }\r\n } else {\r\n }\r\n \r\n // 存储转换后的组件用于导出\r\n const exportName = 'M' + comp.name.slice(2) // ElButton -> MButton\r\n convertedComponents[exportName] = comp\r\n }\r\n })\r\n}\r\n\r\nconst install = (app) => {\r\n // 应用全局样式覆盖\r\n if (typeof window !== 'undefined') {\r\n import('./utils/styleUtils.js').then(({ applyGlobalOverride, enableH5Override }) => {\r\n applyGlobalOverride();\r\n // 自动启用 H5 适配(UA 或断点)\r\n enableH5Override({ mode: 'auto', breakpoint: 768 });\r\n });\r\n }\r\n \r\n console.log('🚀 开始安装 @mc-markets/ui 组件库...')\r\n \r\n // 先注册自定义组件 - 确保优先级\r\n components.forEach(component => {\r\n const convertName = convertComponentName(component?.name)\r\n const originalName = component?.name\r\n if (convertName) {\r\n // 强制注册自定义组件,确保覆盖任何已存在的组件 (kebab-case)\r\n app.component(convertName, component)\r\n }\r\n if (originalName) {\r\n // 同时注册 PascalCase,兼容直接使用 <MPicker /> 等写法\r\n app.component(originalName, component)\r\n }\r\n })\r\n \r\n // 然后注册转换后的 Element Plus 组件(只注册没有自定义组件覆盖的)\r\n registerElementPlus(app)\r\n \r\n // 自动创建全局组件实例\r\n if (typeof window !== 'undefined') {\r\n createGlobalComponents()\r\n }\r\n}\r\n\r\nexport default { install }\r\nexport { MIcon, MButton, MInput, MForm, MFormItem, MTooltip, MSelect, MOption, MOptionGroup, MPagination, MRadio, MRadioGroup, MRadioButton, MSwitch, MTag, MAlert, MDialog, MNotification, MMessage, MNotifiMessage, MDatePicker, MEmpty, MTable, MTableColumn, MBanner, MTabs, MTabPane, MTabCard, MTabCardItem, MBreadcrumb, MPicker }\r\n\r\n// 导出样式工具函数\r\nexport { \r\n addOverrideClass, \r\n addComponentOverride, \r\n applyGlobalOverride, \r\n forceRefreshStyles,\r\n enableH5Override,\r\n isH5,\r\n createOverrideComponent \r\n} from './utils/styleUtils.js'\r\n\r\n// 手动导出常用的 Element Plus 函数(只导出函数,不导出组件)\r\nexport const MMessageBox = ElementPlusComponents.ElMessageBox\r\n\r\n// 导出自定义组件的静态方法\r\nexport { Message, NotifiMessage }\r\n\r\n// 导出转换后的 Element Plus 组件\r\nexport const mComponents = { ...convertedComponents }\r\n\r\n// 导出常用的 Element Plus 组件\r\nexport const MButtonGroup = convertedComponents.MButtonGroup\r\nexport const MCarousel = convertedComponents.MCarousel\r\nexport const MCarouselItem = convertedComponents.MCarouselItem\r\nexport const MCascader = convertedComponents.MCascader\r\nexport const MCascaderPanel = convertedComponents.MCascaderPanel\r\nexport const MCheckTag = convertedComponents.MCheckTag\r\nexport const MCalendar = convertedComponents.MCalendar\r\nexport const MTimePicker = convertedComponents.MTimePicker\r\nexport const MDateTimePicker = convertedComponents.MDateTimePicker\r\nexport const MColorPicker = convertedComponents.MColorPicker\r\nexport const MTransfer = convertedComponents.MTransfer\r\nexport const MTree = convertedComponents.MTree\r\nexport const MTreeSelect = convertedComponents.MTreeSelect\r\nexport const MUpload = convertedComponents.MUpload\r\nexport const MImage = convertedComponents.MImage\r\nexport const MImageViewer = convertedComponents.MImageViewer\r\nexport const MBacktop = convertedComponents.MBacktop\r\nexport const MInfiniteScroll = convertedComponents.MInfiniteScroll\r\nexport const MAffix = convertedComponents.MAffix\r\nexport const MScrollbar = convertedComponents.MScrollbar\r\nexport const MResult = convertedComponents.MResult\r\nexport const MSkeleton = convertedComponents.MSkeleton\r\nexport const MLoading = convertedComponents.MLoading\r\nexport const MSpinner = convertedComponents.MSpinner\r\nexport const MProgress = convertedComponents.MProgress\r\nexport const MBadge = convertedComponents.MBadge\r\nexport const MAvatar = convertedComponents.MAvatar\r\nexport const MImagePreview = convertedComponents.MImagePreview\r\nexport const MTeleport = convertedComponents.MTeleport\r\nexport const MConfigProvider = convertedComponents.MConfigProvider\r\n"],"names":["props","__props","emit","__emit","iconClass","computed","classes","iconStyle","style","handleClick","event","_openBlock","_createElementBlock","_mergeProps","useExposeRef","refName","options","compatibilityKeys","innerRef","ref","exposedProxy","_target","key","value","getterMethodName","method","args","_b","_a","target","val","buttonRef","__expose","_createBlock","_component_el_button","_renderSlot","_ctx","name","inputRef","_component_el_input","formRef","_unref","ElForm","formItemRef","classNames","excludeAttrs","attrs","excludeKeys","result","__spreadValues","useClassName","defaultClass","excludeKey","useAttrs","mergedAttrs","className","popperClass","tooltipRef","_component_el_tooltip","selectRef","_component_el_select","optionRef","_component_el_option","optionGroupRef","_component_el_option_group","paginationRef","_component_el_pagination","radioRef","_component_el_radio","computedPopperClass","defaultPopperClass","__objRest","radioGroupRef","_component_el_radio_group","radioButtonRef","_component_el_radio_button","switchRef","_component_el_switch","computedType","computedLoading","computedPrefixIcon","computedSuffixIcon","tagRef","_component_el_tag","_hoisted_1","_createElementVNode","_hoisted_2","availableTypes","__default__","useCustomIcon","rest","__spreadProps","iconUrl","_component_el_alert","_createSlots","dialogVisible","_useModel","dialogRef","_createVNode","_component_el_dialog","$slots","_withCtx","close","titleId","titleClass","_normalizeProps","_guardReactiveProps","_sfc_main","_component_el_notification","messages","messageId","Message","config","existingIndex","id","message","index","closeMessage","_hoisted_6","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_9","_toDisplayString","$event","$setup","notifications","notificationId","NotifiMessage","closeNotification","notification","datePickerRef","_component_el_date_picker","availableImages","image","imageUrl","emptyRef","_component_el_empty","innerTableRef","_component_el_table_column","slotProps","slots","useSlots","internalVisible","watch","newVal","bannerStyle","defaultIcons","handleClose","_normalizeClass","_normalizeStyle","addOverrideClass","element","addComponentOverride","componentInstance","applyGlobalOverride","mutations","mutation","node","parent","el","enableH5Override","mode","breakpoint","root","isMobileUA","isNarrow","apply","enable","compute","onResize","forceRefreshStyles","selector","isH5","createOverrideComponent","componentConfig","CONSTANTS","navRef","tabs","activeTab","internalKey","previousTabsCount","previousTabsNames","sortTimer","scrollTimeout","isResetting","resizeObserver","activeBarStyle","getActiveItemPosition","activeItem","itemLeft","actualNavPaddingLeft","navRect","resetActiveBarStyle","activeIndex","tab","centerLeft","shouldScroll","scrollToActiveTab","headerRef","headerWidth","header","headerScrollLeft","itemWidth","itemRight","itemCenter","navWidth","targetScrollLeft","maxScrollLeft","itemVisibleLeft","isItemInView","itemVisibleRight","isInLeftEdge","edgeThreshold","isInRightEdge","handleTabClick","tabName","oldValue","handleTabRemove","sortTabsByDOMOrder","updateUIState","paneElements","contentRef","domOrder","currentOrder","sortedTabs","tabMap","t","unregisterTab","newValue","detectTabsChange","newTabs","newNames","isCountChanged","isOrderChanged","handleTabsListChange","updateArrowVisibility","nav","currentScrollLeft","scrollWidth","clientWidth","showLeftArrow","showRightArrow","rafId","isManualScroll","clearScrollTimers","performScroll","direction","scrollAmount","initDefaultActiveTab","onMounted","onUnmounted","handleScrollLeft","handleScrollRight","_cache","_Fragment","_renderList","tabsContext","inject","tabInfo","doRegisterTab","oldVal","isActive","tabCardContext","option","isDisabled","provide","handleItemClick","item","path","noop","extend","inBrowser","isObject","isDef","isFunction","isPromise","isNumeric","isIOS","get","object","keys","unknownProp","numericProp","truthProp","makeStringProp","defaultVal","onMountedOrActivated","hook","mounted","nextTick","onActivated2","useEventListener","type","listener","passive","capture","cleaned","attached","add","target2","unref2","remove","onUnmounted2","onDeactivated2","stopWatch","isRef","width","height","useWindowSize","ref4","update","overflowScrollReg","defaultRoot","isElement","getScrollParent","overflowY","checkIsIOS","stopPropagation","preventDefault","isStopPropagation","addUnit","getZIndexStyle","zIndex","camelizeRE","camelize","str","_","c","kebabCase","hasOwnProperty","assignKey","to","from","deepAssign","stdin_default","year","month","maxRange","discount","condition","count","lang","reactive","defaultMessages","Locale","newLang","newMessages","createTranslate","prefix","locale","genBem","mods","ret","createBEM","createNamespace","prefixedName","HAPTICS_FEEDBACK","TAP_OFFSET","callInterceptor","interceptor","done","canceled","error","returnVal","withInstall","app","POPUP_TOGGLE_KEY","useExpose","apis","instance","getCurrentInstance","bem","badgeProps","defineComponent","hasContent","content","showZero","renderContent","dot","max","getOffsetWithMinusString","style2","x","y","position","offsetY","offsetX","renderBadge","tag","Badge","_Badge","globalZIndex","useGlobalZIndex","setGlobalZIndex","CONFIG_PROVIDER_KEY","configProviderProps","insertDash","mapThemeVarsToCSSVars","themeVars","cssVars","formattedKey","syncThemeVarsOnRoot","newStyle","oldStyle","addTheme","removeTheme","theme","onActivated","onDeactivated","onBeforeUnmount","newScope","oldScope","watchEffect","isImage","name2","iconProps","classPrefix","size","badge","color","isImageIcon","Icon","_Icon","popupSharedProps","getDirection","useTouch","startX","startY","deltaX","deltaY","isTap","isVertical","isHorizontal","reset","touch","LOCK_DIRECTION_DISTANCE","totalLockCount","BODY_LOCK_CLASS","useLockScroll","rootRef","shouldLock","DIRECTION_UP","DIRECTION_DOWN","onTouchMove","scrollHeight","offsetHeight","scrollTop","status","lock","unlock","init","destroy","useLazyRender","show","inited","render","useScopeId","scopeId","overlayProps","lazyRender","renderOverlay","_withDirectives","_vShow","Content","Transition","Teleport","Overlay","_Overlay","popupProps","opened","shouldReopen","popupRef","open","onClickOverlay","onClickCloseIcon","renderCloseIcon","timer","onOpened","onClosed","onKeydown","renderPopup","destroyOnClose","round","safeAreaInsetTop","safeAreaInsetBottom","renderTransition","transition","transitionAppear","Popup","_Popup","model","pickerConfirm","bindClosePopup","_hoisted_7","components","MIcon","MButton","MInput","MForm","MFormItem","MTooltip","MSelect","MOption","MOptionGroup","MPagination","MRadio","MRadioGroup","MRadioButton","MSwitch","MTag","MAlert","MDialog","MNotification","MMessage","MNotifiMessage","MDatePicker","MEmpty","MTable","MTableColumn","MBanner","MTabs","MTabPane","MTabCard","MTabCardItem","MBreadcrumb","MPicker","convertComponentName","componentName","globalInstanceComponents","createGlobalComponent","_0","__async","component","createApp","h","container","createGlobalComponents","promises","convertedComponents","registerElementPlus","customComponentNames","comp","ElementPlusComponents","mName","exportName","install","styleUtils","convertName","originalName","MMessageBox","mComponents","MButtonGroup","MCarousel","MCarouselItem","MCascader","MCascaderPanel","MCheckTag","MCalendar","MTimePicker","MDateTimePicker","MColorPicker","MTransfer","MTree","MTreeSelect","MUpload","MImage","MImageViewer","MBacktop","MInfiniteScroll","MAffix","MScrollbar","MResult","MSkeleton","MLoading","MSpinner","MProgress","MBadge","MAvatar","MImagePreview","MTeleport","MConfigProvider"],"mappings":"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","x_google_ignoreList":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}
1
+ {"version":3,"file":"index.cjs","sources":["../packages/components/Icon/Icon.vue","../packages/hooks/useExposeRef.js","../packages/components/Button/Button.vue","../packages/components/Input/Input.vue","../packages/components/Form/Form.vue","../packages/components/FormItem/FormItem.vue","../packages/utils/classNames.js","../packages/hooks/useClassName.js","../packages/components/Tooltip/Tooltip.vue","../packages/components/Select/Select.vue","../packages/components/Option/Option.vue","../packages/components/OptionGroup/OptionGroup.vue","../packages/components/Pagination/Pagination.vue","../packages/components/Radio/Radio.vue","../packages/components/RadioGroup/RadioGroup.vue","../packages/components/RadioButton/RadioButton.vue","../packages/components/Switch/Switch.vue","../packages/components/Tag/Tag.vue","../packages/components/Alert/Alert.vue","../packages/components/Dialog/Dialog.vue","../packages/components/Notification/Notification.vue","../packages/components/Message/Message.vue","../packages/components/NotifiMessage/NotifiMessage.vue","../packages/components/DatePicker/DatePicker.vue","../packages/components/Empty/Empty.vue","../packages/components/Table/Table.vue","../packages/components/Table/TableColumn.vue","../packages/components/Banner/Banner.vue","../packages/utils/styleUtils.js","../packages/components/Tabs/Tabs.vue","../packages/components/Tabs/TabPane.vue","../packages/components/TabCard/TabCardItem.vue","../packages/components/TabCard/TabCard.vue","../packages/components/Breadcrumb/BreadcrumbSeparator.vue","../packages/components/Breadcrumb/Breadcrumb.vue","../node_modules/vant/es/utils/basic.mjs","../node_modules/vant/es/utils/props.mjs","../node_modules/@vant/use/dist/index.esm.mjs","../node_modules/vant/es/utils/dom.mjs","../node_modules/vant/es/utils/format.mjs","../node_modules/vant/es/utils/deep-assign.mjs","../node_modules/vant/es/locale/lang/zh-CN.mjs","../node_modules/vant/es/locale/index.mjs","../node_modules/vant/es/utils/create.mjs","../node_modules/vant/es/utils/constant.mjs","../node_modules/vant/es/utils/interceptor.mjs","../node_modules/vant/es/utils/with-install.mjs","../node_modules/vant/es/composables/on-popup-reopen.mjs","../node_modules/vant/es/composables/use-expose.mjs","../node_modules/vant/es/badge/Badge.mjs","../node_modules/vant/es/badge/index.mjs","../node_modules/vant/es/composables/use-global-z-index.mjs","../node_modules/vant/es/config-provider/ConfigProvider.mjs","../node_modules/vant/es/icon/Icon.mjs","../node_modules/vant/es/icon/index.mjs","../node_modules/vant/es/popup/shared.mjs","../node_modules/vant/es/composables/use-touch.mjs","../node_modules/vant/es/composables/use-lock-scroll.mjs","../node_modules/vant/es/composables/use-lazy-render.mjs","../node_modules/vant/es/composables/use-scope-id.mjs","../node_modules/vant/es/overlay/Overlay.mjs","../node_modules/vant/es/overlay/index.mjs","../node_modules/vant/es/popup/Popup.mjs","../node_modules/vant/es/popup/index.mjs","../packages/components/Picker/Picker.vue","../packages/index.js"],"sourcesContent":["<template>\r\n <i \r\n :class=\"iconClass\" \r\n :style=\"iconStyle\"\r\n v-bind=\"$attrs\"\r\n @click=\"handleClick\"\r\n >\r\n <slot></slot>\r\n </i>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\n\r\n// 定义组件名\r\ndefineOptions({\r\n name: 'MIcon'\r\n})\r\n\r\nconst props = defineProps({\r\n name: {\r\n type: String,\r\n required: true\r\n },\r\n size: {\r\n type: [String, Number],\r\n default: '16px'\r\n },\r\n color: {\r\n type: String,\r\n default: 'inherit'\r\n },\r\n spin: {\r\n type: Boolean,\r\n default: false\r\n },\r\n pulse: {\r\n type: Boolean,\r\n default: false\r\n },\r\n rotate: {\r\n type: Number,\r\n default: 0\r\n },\r\n flip: {\r\n type: String,\r\n default: undefined\r\n },\r\n prefix: {\r\n type: String,\r\n default: 'icon'\r\n }\r\n})\r\n\r\nconst emit = defineEmits(['click'])\r\n\r\n// 计算图标类名\r\nconst iconClass = computed(() => {\r\n const classes = ['iconfont']\r\n \r\n // 添加图标名称类\r\n if (props.name) {\r\n classes.push(`${props.prefix}-${props.name}`)\r\n }\r\n \r\n // 添加动画类\r\n if (props.spin) {\r\n classes.push('icon-spin')\r\n }\r\n if (props.pulse) {\r\n classes.push('icon-pulse')\r\n }\r\n \r\n // 添加翻转类\r\n if (props.flip) {\r\n classes.push(`icon-flip-${props.flip}`)\r\n }\r\n \r\n return classes\r\n})\r\n\r\n// 计算图标样式\r\nconst iconStyle = computed(() => {\r\n const style = {}\r\n \r\n // 设置大小\r\n if (props.size) {\r\n if (typeof props.size === 'number') {\r\n style.fontSize = `${props.size}px`\r\n } else {\r\n style.fontSize = props.size\r\n }\r\n }\r\n \r\n // 设置颜色\r\n if (props.color) {\r\n style.color = props.color\r\n }\r\n \r\n // 设置旋转\r\n if (props.rotate !== 0) {\r\n style.transform = `rotate(${props.rotate}deg)`\r\n }\r\n \r\n return style\r\n})\r\n\r\n// 点击事件处理\r\nconst handleClick = (event) => {\r\n emit('click', event)\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\r\n/* 旋转动画 */\r\n.icon-spin {\r\n animation: icon-spin 1s linear infinite;\r\n}\r\n\r\n@keyframes icon-spin {\r\n from {\r\n transform: rotate(0deg);\r\n }\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n/* 脉冲动画 */\r\n.icon-pulse {\r\n animation: icon-pulse 1s ease-in-out infinite;\r\n}\r\n\r\n@keyframes icon-pulse {\r\n 0% {\r\n transform: scale(1);\r\n }\r\n 50% {\r\n transform: scale(1.1);\r\n }\r\n 100% {\r\n transform: scale(1);\r\n }\r\n}\r\n\r\n/* 翻转效果 */\r\n.icon-flip-horizontal {\r\n transform: scaleX(-1);\r\n}\r\n\r\n.icon-flip-vertical {\r\n transform: scaleY(-1);\r\n}\r\n\r\n.icon-flip-both {\r\n transform: scale(-1);\r\n}\r\n\r\n/* 当有旋转时,需要与翻转效果结合 */\r\n.icon-spin.icon-flip-horizontal {\r\n animation: icon-spin-flip-horizontal 1s linear infinite;\r\n}\r\n\r\n.icon-spin.icon-flip-vertical {\r\n animation: icon-spin-flip-vertical 1s linear infinite;\r\n}\r\n\r\n.icon-spin.icon-flip-both {\r\n animation: icon-spin-flip-both 1s linear infinite;\r\n}\r\n\r\n@keyframes icon-spin-flip-horizontal {\r\n from {\r\n transform: rotate(0deg) scaleX(-1);\r\n }\r\n to {\r\n transform: rotate(360deg) scaleX(-1);\r\n }\r\n}\r\n\r\n@keyframes icon-spin-flip-vertical {\r\n from {\r\n transform: rotate(0deg) scaleY(-1);\r\n }\r\n to {\r\n transform: rotate(360deg) scaleY(-1);\r\n }\r\n}\r\n\r\n@keyframes icon-spin-flip-both {\r\n from {\r\n transform: rotate(0deg) scale(-1);\r\n }\r\n to {\r\n transform: rotate(360deg) scale(-1);\r\n }\r\n}\r\n</style>\r\n","import { ref } from 'vue'\r\n\r\n/**\r\n * 无感透传 ref 的 Hook\r\n * 通过 Proxy 将外部 ref 访问转发给内部 Element Plus 组件实例\r\n * \r\n * @param {string} refName - 内部 ref 的名称,默认为 'innerRef'\r\n * @param {Object} options - 配置选项\r\n * @param {Object} options.compatibilityKeys - 兼容性字段映射 { key: value }\r\n * @returns {Object} 包含 innerRef 和 exposedProxy 的对象\r\n * \r\n * @example\r\n * // 在组件中使用\r\n * const { innerRef, exposedProxy } = useExposeRef('innerTableRef')\r\n * defineExpose(exposedProxy)\r\n * \r\n * // 在模板中使用\r\n * <el-table v-bind=\"$attrs\" ref=\"innerTableRef\">\r\n */\r\nexport function useExposeRef(refName = 'innerRef', options = {}) {\r\n const { compatibilityKeys = {} } = options\r\n \r\n // 创建内部 ref\r\n const innerRef = ref()\r\n \r\n // 创建 Proxy 代理对象\r\n const exposedProxy = new Proxy({}, {\r\n get(_target, key) {\r\n // 返回兼容性字段\r\n if (key in compatibilityKeys) {\r\n const value = compatibilityKeys[key]\r\n return typeof value === 'function' ? value() : value\r\n }\r\n \r\n // 保留默认兼容字段\r\n if (key === 'elRef' || key === refName) {\r\n return innerRef\r\n }\r\n // 动态生成 getter 方法:getElRef, getInnerRef, getInnerTableRef 等\r\n // 将 refName 转换为驼峰命名,如 innerTableRef -> InnerTableRef\r\n const getterMethodName = 'get' + refName.charAt(0).toUpperCase() + refName.slice(1)\r\n if (key === 'getElRef' || key === getterMethodName) {\r\n return () => innerRef.value\r\n }\r\n if (key === 'call') {\r\n return (method, ...args) => innerRef.value?.[method]?.(...args)\r\n }\r\n \r\n // 访问内部实例的属性或方法\r\n const target = innerRef.value\r\n if (!target) return undefined\r\n \r\n // 使用 Reflect.get 支持 Symbol 类型的 key\r\n const value = Reflect.get(target, key, target)\r\n // 如果是函数,绑定 this 指向原实例\r\n return typeof value === 'function' ? value.bind(target) : value\r\n },\r\n set(_target, key, val) {\r\n const target = innerRef.value\r\n if (target) {\r\n target[key] = val\r\n }\r\n return true\r\n },\r\n has(_target, key) {\r\n // 检查兼容字段\r\n const getterMethodName = `get${refName.charAt(0).toUpperCase() + refName.slice(1)}`\r\n if (key in compatibilityKeys || key === 'elRef' || key === refName || key === 'getElRef' || key === getterMethodName || key === 'call') {\r\n return true\r\n }\r\n // 检查内部实例\r\n const target = innerRef.value\r\n // 使用 Reflect.has 支持 Symbol 类型的 key\r\n return target ? Reflect.has(target, key) : false\r\n },\r\n ownKeys(_target) {\r\n const target = innerRef.value\r\n if (target) {\r\n return Reflect.ownKeys(target)\r\n }\r\n return []\r\n },\r\n getOwnPropertyDescriptor(_target, key) {\r\n // 检查兼容字段\r\n const getterMethodName = `get${refName.charAt(0).toUpperCase() + refName.slice(1)}`\r\n if (key in compatibilityKeys || key === 'elRef' || key === refName || key === 'getElRef' || key === getterMethodName || key === 'call') {\r\n return {\r\n enumerable: true,\r\n configurable: true\r\n }\r\n }\r\n \r\n // 检查内部实例\r\n const target = innerRef.value\r\n if (target && key in target) {\r\n return Reflect.getOwnPropertyDescriptor(target, key)\r\n }\r\n \r\n // 如果都不存在,返回 undefined(符合 Proxy 规范)\r\n return undefined\r\n }\r\n })\r\n \r\n return {\r\n innerRef,\r\n exposedProxy\r\n }\r\n}\r\n","<template>\r\n <el-button ref=\"buttonRef\" v-bind=\"$attrs\" class=\"m-button\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-button>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MButton'\r\n})\r\n\r\nconst { innerRef: buttonRef, exposedProxy } = useExposeRef('buttonRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n// Button 组件样式 - 使用高优先级选择器确保不被全局样式覆盖\r\n\r\n</style>","<template>\r\n <el-input ref=\"inputRef\" v-bind=\"$attrs\" class=\"m-input\" :class=\"{ solid: $attrs.styleType === 'solid' }\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-input>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MInput'\r\n})\r\n\r\nconst { innerRef: inputRef, exposedProxy } = useExposeRef('inputRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n<style lang=\"scss\">\r\n\r\n</style>","<template>\r\n <el-form ref=\"formRef\" v-bind=\"$attrs\" class=\"m-form\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-form>\r\n</template>\r\n\r\n<script setup>\r\nimport { ElForm } from 'element-plus'\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MForm'\r\n})\r\n\r\nconst { innerRef: formRef, exposedProxy } = useExposeRef('formRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n\r\n</style>","<template>\r\n <el-form-item v-bind=\"$attrs\" class=\"m-form-item\" ref=\"formItemRef\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-form-item>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n name: 'MFormItem'\r\n})\r\n\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\nconst { innerRef: formItemRef, exposedProxy } = useExposeRef('formItemRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n</style>","/**\r\n * 类名装饰器方法\r\n * @param {...(string|boolean|undefined|null)} classes - 类名参数\r\n * @returns {string} 合并后的类名字符串\r\n */\r\nexport const classNames = (...classes) => {\r\n return classes.filter(Boolean).join(' ')\r\n}\r\n\r\n/**\r\n * 排除指定属性\r\n * @param {Object} attrs - 原始属性对象\r\n * @param {...string} excludeKeys - 要排除的属性名\r\n * @returns {Object} 排除指定属性后的新对象\r\n */\r\nexport const excludeAttrs = (attrs, ...excludeKeys) => {\r\n const result = { ...attrs }\r\n excludeKeys.forEach(key => {\r\n delete result[key]\r\n })\r\n return result\r\n}\r\n\r\n","import { computed, useAttrs } from 'vue'\r\nimport { classNames, excludeAttrs } from '@packages/utils/classNames.js'\r\n\r\n/**\r\n * 类名 Hook\r\n * @param {string} defaultClass - 默认的类名\r\n * @param {string} excludeKey - 要排除的属性名,默认为 'popperClass'\r\n * @returns {Object} 包含 mergedAttrs 和 className 的对象\r\n */\r\nexport function useClassName(defaultClass, excludeKey = 'popperClass') {\r\n const attrs = useAttrs()\r\n \r\n // 排除指定属性\r\n const mergedAttrs = computed(() => excludeAttrs(attrs, excludeKey))\r\n \r\n // 计算类名\r\n const className = computed(() => classNames(defaultClass, attrs[excludeKey]))\r\n \r\n return {\r\n mergedAttrs,\r\n className\r\n }\r\n}\r\n","<template>\r\n <el-tooltip ref=\"tooltipRef\" v-bind=\"mergedAttrs\" :popper-class=\"popperClass\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-tooltip>\r\n</template>\r\n\r\n<script setup>\r\nimport { useClassName } from \"@packages/hooks/useClassName.js\"\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MTooltip'\r\n})\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n popperClass: {\r\n type: String,\r\n default: ''\r\n }\r\n})\r\n\r\n// 使用类名 Hook\r\nconst { mergedAttrs, className: popperClass } = useClassName('mc-tooltip-popper')\r\n\r\nconst { innerRef: tooltipRef, exposedProxy } = useExposeRef('tooltipRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.mc-tooltip-popper {\r\n &.is-dark {\r\n color: #fff !important;\r\n background-color: var(--all-gray-6) !important;\r\n border-color: var(--all-gray-6) !important;\r\n .el-popper__arrow::before{\r\n background-color: var(--all-gray-6) !important;\r\n border-color: var(--all-gray-6) !important;\r\n }\r\n }\r\n \r\n &.is-light {\r\n color: #606266 !important;\r\n background-color: #fff !important;\r\n border: 1px solid #e4e7ed !important;\r\n \r\n .el-popper__arrow::before {\r\n background-color: #fff !important;\r\n border-color: #fff !important;\r\n }\r\n }\r\n}\r\n\r\n:deep(.el-popper) {\r\n &.is-light {\r\n background: var(--bg-tertiary-hover);\r\n border-color: var(--border-primary);\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-select\r\n ref=\"selectRef\"\r\n class=\"m-select\"\r\n :class=\"{ solid: $attrs.styleType === 'solid' }\"\r\n :show-arrow=\"false\"\r\n v-bind=\"$attrs\"\r\n >\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-select>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: \"MSelect\",\r\n});\r\n\r\nconst { innerRef: selectRef, exposedProxy } = useExposeRef('selectRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\r\n</style>\r\n","<template>\r\n <el-option ref=\"optionRef\" v-bind=\"$attrs\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-option>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MOption'\r\n})\r\n\r\nconst { innerRef: optionRef, exposedProxy } = useExposeRef('optionRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n","<template>\r\n <el-option-group ref=\"optionGroupRef\" v-bind=\"$attrs\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-option-group>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MOptionGroup'\r\n})\r\n\r\nconst { innerRef: optionGroupRef, exposedProxy } = useExposeRef('optionGroupRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n","<template>\r\n <el-pagination ref=\"paginationRef\" v-bind=\"$attrs\" class=\"m-pagination\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-pagination>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: \"MPagination\",\r\n});\r\n\r\nconst { innerRef: paginationRef, exposedProxy } = useExposeRef('paginationRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.m-pagination {\r\n --el-border-color-hover: var(--border-tertiary) !important;\r\n --el-pagination-button-bg-color: var(--bg-tertiary-hover) !important;\r\n &.is-background .el-pager li.is-active {\r\n color: var(--text-quaternary) !important;\r\n }\r\n .el-pager li{\r\n border-radius: var(--xs);\r\n border: 1px solid transparent;\r\n &:hover {\r\n border: 1px solid var(--border-tertiary);\r\n color: var(--text-primary);\r\n }\r\n }\r\n .el-select .el-select__wrapper {\r\n width: 112px;\r\n min-height: 32px;\r\n padding: 5px 8px;\r\n border-radius: var(--xs);\r\n background-color: var(--bg-tertiary-hover);\r\n }\r\n .el-input .el-input__wrapper {\r\n height: 30px;\r\n border-radius: var(--xs);\r\n background-color: var(--bg-tertiary-hover);\r\n }\r\n .el-pagination.is-background {\r\n background-color: var(--bg-tertiary-hover);\r\n }\r\n .el-pager .number {\r\n font-size: var(--font-size-text-sm);\r\n font-weight: 500;\r\n }\r\n .btn-prev,\r\n .btn-next {\r\n &:disabled {\r\n background-color: transparent !important;\r\n }\r\n &:hover:not(:disabled) {\r\n border: 1px solid var(--border-tertiary);\r\n color: var(--text-primary);\r\n }\r\n background-color: transparent !important;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-radio ref=\"radioRef\" v-bind=\"mergedAttrs\" class=\"m-radio\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-radio>\r\n</template>\r\n\r\n<script setup>\r\nimport { useClassName } from \"@packages/hooks/useClassName.js\"\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MRadio'\r\n})\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n popperClass: {\r\n type: String,\r\n default: ''\r\n }\r\n})\r\n\r\n// 使用类名 Hook\r\nconst { mergedAttrs, className: popperClass } = useClassName('mc-radio-popper')\r\n\r\nconst { innerRef: radioRef, exposedProxy } = useExposeRef('radioRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n// Radio popper-class 样式\r\n// .mc-radio-popper {\r\n// 自定义单选框样式可以在这里添加\r\n// }\r\n.m-radio{\r\n &.el-radio{\r\n --el-radio-input-height: 16px;\r\n --el-radio-input-width: 16px;\r\n --el-radio-input-border: 2px solid var(--icon-tertiary);\r\n &.el-radio--large{\r\n --el-radio-input-height: 20px;\r\n --el-radio-input-width: 20px;\r\n .el-radio__inner{\r\n height: var(--el-radio-input-height);\r\n width: var(--el-radio-input-width);\r\n }\r\n }\r\n\r\n .el-radio__input {\r\n &.is-checked .el-radio__inner::after {\r\n height: 6px;\r\n width: 6px;\r\n background-color: var(--bg-primary);\r\n }\r\n \r\n &.is-disabled {\r\n .el-radio__inner {\r\n background-color: var(--all-alphe-white-20);\r\n border-color: var(--icon-tertiary);\r\n }\r\n \r\n &.is-checked .el-radio__inner::after {\r\n background-color: var(--all-alphe-white-20);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-radio-group ref=\"radioGroupRef\" v-bind=\"mergedAttrs\" :popper-class=\"computedPopperClass\" class=\"m-radio-group\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-radio-group>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed, useAttrs } from 'vue'\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MRadioGroup'\r\n})\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n popperClass: {\r\n type: String,\r\n default: ''\r\n }\r\n})\r\n\r\n// 获取attrs\r\nconst attrs = useAttrs()\r\n\r\n// 计算popper-class,合并默认类名和外部传入的类名\r\nconst computedPopperClass = computed(() => {\r\n const defaultPopperClass = 'mc-radio-group-popper'\r\n \r\n if (attrs.popperClass) {\r\n return `${defaultPopperClass} ${attrs.popperClass}`.trim()\r\n }\r\n \r\n return defaultPopperClass\r\n})\r\n\r\n// 合并其他属性(排除popperClass)\r\nconst mergedAttrs = computed(() => {\r\n const { popperClass, ...otherAttrs } = attrs\r\n return otherAttrs\r\n})\r\n\r\nconst { innerRef: radioGroupRef, exposedProxy } = useExposeRef('radioGroupRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n// RadioGroup popper-class 样式\r\n.mc-radio-group-popper {\r\n // 自定义单选框组样式可以在这里添加\r\n}\r\n\r\n// 自定义主题示例\r\n.mc-radio-group-custom {\r\n .el-radio {\r\n .el-radio__input {\r\n .el-radio__inner {\r\n background: linear-gradient(45deg, #667eea, #764ba2);\r\n border-color: #667eea;\r\n \r\n &:hover {\r\n background: linear-gradient(45deg, #5a6fd8, #6a4190);\r\n border-color: #5a6fd8;\r\n }\r\n }\r\n \r\n &.is-checked .el-radio__inner {\r\n background: linear-gradient(45deg, #4c63d2, #5d3a7e);\r\n border-color: #4c63d2;\r\n }\r\n }\r\n \r\n .el-radio__label {\r\n color: #667eea;\r\n font-weight: 500;\r\n }\r\n }\r\n}\r\n\r\n.mc-radio-group-success {\r\n .el-radio {\r\n .el-radio__input {\r\n .el-radio__inner {\r\n background-color: #67c23a;\r\n border-color: #67c23a;\r\n \r\n &:hover {\r\n background-color: #5daf34;\r\n border-color: #5daf34;\r\n }\r\n }\r\n \r\n &.is-checked .el-radio__inner {\r\n background-color: #529b2e;\r\n border-color: #529b2e;\r\n }\r\n }\r\n \r\n .el-radio__label {\r\n color: #67c23a;\r\n font-weight: 500;\r\n }\r\n }\r\n}\r\n\r\n.mc-radio-group-warning {\r\n .el-radio {\r\n .el-radio__input {\r\n .el-radio__inner {\r\n background-color: #e6a23c;\r\n border-color: #e6a23c;\r\n \r\n &:hover {\r\n background-color: #d4922b;\r\n border-color: #d4922b;\r\n }\r\n }\r\n \r\n &.is-checked .el-radio__inner {\r\n background-color: #c8951f;\r\n border-color: #c8951f;\r\n }\r\n }\r\n \r\n .el-radio__label {\r\n color: #e6a23c;\r\n font-weight: 500;\r\n }\r\n }\r\n}\r\n\r\n.mc-radio-group-danger {\r\n .el-radio {\r\n .el-radio__input {\r\n .el-radio__inner {\r\n background-color: #f56c6c;\r\n border-color: #f56c6c;\r\n \r\n &:hover {\r\n background-color: #f45454;\r\n border-color: #f45454;\r\n }\r\n }\r\n \r\n &.is-checked .el-radio__inner {\r\n background-color: #f24545;\r\n border-color: #f24545;\r\n }\r\n }\r\n \r\n .el-radio__label {\r\n color: #f56c6c;\r\n font-weight: 500;\r\n }\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-radio-button ref=\"radioButtonRef\" v-bind=\"mergedAttrs\" class=\"m-radio-button\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-radio-button>\r\n</template>\r\n\r\n<script setup>\r\nimport { useClassName } from \"@packages/hooks/useClassName.js\"\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MRadioButton'\r\n})\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n popperClass: {\r\n type: String,\r\n default: ''\r\n }\r\n})\r\n\r\n// 使用类名 Hook\r\nconst { mergedAttrs, className: popperClass } = useClassName('mc-radio-button-popper')\r\n\r\nconst { innerRef: radioButtonRef, exposedProxy } = useExposeRef('radioButtonRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n// RadioButton popper-class 样式\r\n// .mc-radio-button-popper {\r\n// 自定义单选框按钮样式可以在这里添加\r\n// }\r\n\r\n// 自定义主题示例\r\n.mc-radio-button-custom {\r\n .el-radio-button__inner {\r\n background: linear-gradient(45deg, #667eea, #764ba2);\r\n border-color: #667eea;\r\n color: white;\r\n \r\n &:hover {\r\n background: linear-gradient(45deg, #5a6fd8, #6a4190);\r\n border-color: #5a6fd8;\r\n }\r\n }\r\n \r\n .el-radio-button__original-radio:checked + .el-radio-button__inner {\r\n background: linear-gradient(45deg, #4c63d2, #5d3a7e);\r\n border-color: #4c63d2;\r\n box-shadow: -1px 0 0 0 #4c63d2;\r\n }\r\n}\r\n\r\n.mc-radio-button-success {\r\n .el-radio-button__inner {\r\n background-color: #67c23a;\r\n border-color: #67c23a;\r\n color: white;\r\n \r\n &:hover {\r\n background-color: #5daf34;\r\n border-color: #5daf34;\r\n }\r\n }\r\n \r\n .el-radio-button__original-radio:checked + .el-radio-button__inner {\r\n background-color: #529b2e;\r\n border-color: #529b2e;\r\n box-shadow: -1px 0 0 0 #529b2e;\r\n }\r\n}\r\n\r\n.mc-radio-button-warning {\r\n .el-radio-button__inner {\r\n background-color: #e6a23c;\r\n border-color: #e6a23c;\r\n color: white;\r\n \r\n &:hover {\r\n background-color: #d4922b;\r\n border-color: #d4922b;\r\n }\r\n }\r\n \r\n .el-radio-button__original-radio:checked + .el-radio-button__inner {\r\n background-color: #c8951f;\r\n border-color: #c8951f;\r\n box-shadow: -1px 0 0 0 #c8951f;\r\n }\r\n}\r\n\r\n.mc-radio-button-danger {\r\n .el-radio-button__inner {\r\n background-color: #f56c6c;\r\n border-color: #f56c6c;\r\n color: white;\r\n \r\n &:hover {\r\n background-color: #f45454;\r\n border-color: #f45454;\r\n }\r\n }\r\n \r\n .el-radio-button__original-radio:checked + .el-radio-button__inner {\r\n background-color: #f24545;\r\n border-color: #f24545;\r\n box-shadow: -1px 0 0 0 #f24545;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-switch ref=\"switchRef\" v-bind=\"mergedAttrs\" :popper-class=\"popperClass\" class=\"m-switch\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-switch>\r\n</template>\r\n\r\n<script setup>\r\nimport { useClassName } from \"@packages/hooks/useClassName.js\";\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: \"MSwitch\",\r\n});\r\n\r\n// 定义props\r\nconst props = defineProps({\r\n popperClass: {\r\n type: String,\r\n default: \"\",\r\n },\r\n});\r\n\r\n// 使用类名 Hook\r\nconst { mergedAttrs, className: popperClass } =\r\n useClassName(\"mc-switch-popper\");\r\n\r\nconst { innerRef: switchRef, exposedProxy } = useExposeRef('switchRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.m-switch {\r\n &.is-checked {\r\n .el-switch__action {\r\n background-color: var(--all-gray-10);\r\n }\r\n }\r\n \r\n &:not(.is-checked) {\r\n .el-switch__core {\r\n background-color: var(--all-gray-5);\r\n border-color: var(--all-gray-5);\r\n .el-switch__action {\r\n background-color: var(--all-gray-1);\r\n }\r\n }\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-tag ref=\"tagRef\" v-bind=\"$attrs\" :type=\"computedType\" class=\"m-tag\" :class=\"{ 'is-loading': computedLoading }\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <!-- 自定义spinner loading效果 -->\r\n <div v-if=\"computedLoading && !computedPrefixIcon\" class=\"custom-spinner\">\r\n <div class=\"ldio-spinner\">\r\n <div v-for=\"i in 8\" :key=\"i\"></div>\r\n </div>\r\n </div>\r\n <!-- 原有的prefixIcon -->\r\n <i \r\n class=\"prefixIcon\" \r\n :class=\"['iconfont', computedPrefixIcon]\" \r\n v-else-if=\"computedPrefixIcon\"\r\n ></i>\r\n <div>\r\n <slot :name=\"name\" />\r\n </div>\r\n <i \r\n class=\"suffixIcon\" \r\n :class=\"['iconfont', computedSuffixIcon]\" \r\n v-if=\"computedSuffixIcon\"\r\n ></i>\r\n </template>\r\n </el-tag>\r\n</template>\r\n\r\n<script setup>\r\nimport { computed } from 'vue'\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MTag'\r\n})\r\n\r\nconst props = defineProps({\r\n prefixIcon: {\r\n type: String,\r\n default: ''\r\n },\r\n suffixIcon: {\r\n type: String,\r\n default: ''\r\n },\r\n loading: {\r\n type: Boolean,\r\n default: false\r\n },\r\n status: {\r\n type: String,\r\n default: ''\r\n }\r\n})\r\n\r\n// 根据status自动设置type颜色\r\nconst computedType = computed(() => {\r\n if (props.status) {\r\n // 如果设置了status,自动映射到对应的type\r\n return props.status\r\n }\r\n // 否则使用v-bind传入的type(通过$attrs)\r\n return undefined\r\n})\r\n\r\n// 根据status自动设置图标和loading状态\r\nconst computedLoading = computed(() => {\r\n if (props.status === 'warning') {\r\n return true\r\n }\r\n return props.loading\r\n})\r\n\r\nconst computedPrefixIcon = computed(() => {\r\n // 如果有显式的prefixIcon,优先使用\r\n if (props.prefixIcon) {\r\n return props.prefixIcon\r\n }\r\n \r\n // 根据status自动设置prefixIcon\r\n if (props.status === 'success') {\r\n return 'icon-circle-check-filled'\r\n }\r\n \r\n if (props.status === 'danger') {\r\n return 'icon-lucide_circle-x-filled'\r\n }\r\n \r\n return ''\r\n})\r\n\r\nconst computedSuffixIcon = computed(() => {\r\n // 如果有显式的suffixIcon,优先使用\r\n if (props.suffixIcon) {\r\n return props.suffixIcon\r\n }\r\n \r\n return ''\r\n})\r\n\r\nconst { innerRef: tagRef, exposedProxy } = useExposeRef('tagRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.m-tag {\r\n .prefixIcon,\r\n .suffixIcon {\r\n font-size: 16px;\r\n display: inline-block;\r\n line-height: 1;\r\n \r\n &.iconfont {\r\n font-family: \"iconfont\" !important;\r\n }\r\n \r\n &.colorfont {\r\n font-family: \"colorfont\" !important;\r\n }\r\n }\r\n .el-tag__content{\r\n display: flex;\r\n align-items: center;\r\n }\r\n \r\n .prefixIcon {\r\n margin-right: 4px;\r\n }\r\n \r\n .suffixIcon {\r\n margin-left: 4px;\r\n }\r\n \r\n // 自定义spinner样式\r\n .custom-spinner {\r\n display: inline-block;\r\n margin-right: 4px;\r\n width: 16px;\r\n height: 16px;\r\n overflow: hidden;\r\n \r\n .ldio-spinner {\r\n width: 100%;\r\n height: 100%;\r\n position: relative;\r\n transform: translateZ(0) scale(0.16);\r\n backface-visibility: hidden;\r\n transform-origin: 0 0;\r\n \r\n div {\r\n left: 46px;\r\n top: 7.5px;\r\n position: absolute;\r\n animation: ldio-spinner-fade linear 1s infinite;\r\n background: currentColor;\r\n width: 8px;\r\n height: 21px;\r\n border-radius: 3.15px / 3.15px;\r\n transform-origin: 4px 42.5px;\r\n box-sizing: content-box;\r\n }\r\n \r\n div:nth-child(1) {\r\n transform: rotate(0deg);\r\n animation-delay: -0.875s;\r\n }\r\n \r\n div:nth-child(2) {\r\n transform: rotate(45deg);\r\n animation-delay: -0.75s;\r\n }\r\n \r\n div:nth-child(3) {\r\n transform: rotate(90deg);\r\n animation-delay: -0.625s;\r\n }\r\n \r\n div:nth-child(4) {\r\n transform: rotate(135deg);\r\n animation-delay: -0.5s;\r\n }\r\n \r\n div:nth-child(5) {\r\n transform: rotate(180deg);\r\n animation-delay: -0.375s;\r\n }\r\n \r\n div:nth-child(6) {\r\n transform: rotate(225deg);\r\n animation-delay: -0.25s;\r\n }\r\n \r\n div:nth-child(7) {\r\n transform: rotate(270deg);\r\n animation-delay: -0.125s;\r\n }\r\n \r\n div:nth-child(8) {\r\n transform: rotate(315deg);\r\n animation-delay: 0s;\r\n }\r\n }\r\n }\r\n}\r\n\r\n@keyframes ldio-spinner-fade {\r\n 0% { \r\n opacity: 1; \r\n }\r\n 100% { \r\n opacity: 0; \r\n }\r\n}\r\n</style>","<template>\r\n <el-alert v-bind=\"mergedAttrs\" class=\"mc-alert\">\r\n <!-- 自定义图标插槽 -->\r\n <template v-if=\"iconUrl\" #icon>\r\n <img :src=\"iconUrl\" :alt=\"`${type} icon`\" class=\"mc-alert-icon\" />\r\n </template>\r\n \r\n <!-- 其他插槽 -->\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-alert>\r\n</template>\r\n\r\n<script>\r\n// 定义可选的Alert类型\r\nconst availableTypes = ['success', 'warning', 'error']\r\n\r\nexport default {\r\n name: 'MAlert'\r\n}\r\n</script>\r\n\r\n<script setup>\r\nimport { computed, useAttrs } from 'vue'\r\n\r\nconst props = defineProps({\r\n type: {\r\n type: String,\r\n default: 'success',\r\n validator: (value) => availableTypes.includes(value)\r\n },\r\n useCustomIcon: {\r\n type: Boolean,\r\n default: true\r\n }\r\n})\r\n\r\nconst attrs = useAttrs()\r\n\r\n// 排除已处理的属性,确保 type 属性正确传递\r\nconst mergedAttrs = computed(() => {\r\n const { useCustomIcon, ...rest } = attrs\r\n return {\r\n ...rest,\r\n type: props.type // 确保 type 属性正确传递给 el-alert\r\n }\r\n})\r\n\r\n// 计算图标URL\r\nconst iconUrl = computed(() => {\r\n if (!props.useCustomIcon) {\r\n return null\r\n }\r\n \r\n return `https://cfdsaas-pre.oss-cn-hongkong.aliyuncs.com/mc-assets/mc-ui/alert/alert-${props.type}.png`\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.mc-alert.el-alert {\r\n --el-alert-padding: 14px 16px;\r\n .mc-alert-icon {\r\n width: 16px;\r\n height: 16px;\r\n object-fit: contain;\r\n }\r\n .el-alert__close-btn{\r\n top: 50%;\r\n transform: translateY(-50%);\r\n opacity: 0.6;\r\n transition: opacity 0.2s ease;\r\n border-radius: 50%;\r\n width: 20px;\r\n height: 20px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n \r\n &:hover {\r\n opacity: 1;\r\n background: rgba(0, 0, 0, 0.1);\r\n }\r\n }\r\n // Error 类型样式\r\n &.el-alert--error.is-light {\r\n background-color: var(--all-red-10);\r\n color: var(--text-error-primary);\r\n border-color: var(--all-red-10);\r\n \r\n .el-alert__title,\r\n .el-alert__description,\r\n .el-alert__close-btn {\r\n color: var(--text-error-primary);\r\n }\r\n \r\n .el-alert__icon {\r\n display: flex;\r\n align-items: center;\r\n }\r\n }\r\n \r\n // Warning 类型样式\r\n &.el-alert--warning.is-light {\r\n background-color: var(--all-orange-10);\r\n color: var(--text-warning-primary);\r\n border-color: var(--all-orange-10);\r\n \r\n .el-alert__title,\r\n .el-alert__description,\r\n .el-alert__close-btn {\r\n color: var(--text-warning-primary);\r\n }\r\n \r\n .el-alert__icon {\r\n display: flex;\r\n align-items: center;\r\n }\r\n }\r\n \r\n // Success 类型样式\r\n &.el-alert--success.is-light {\r\n background-color: var(--all-green-10);\r\n color: var(--all-green-4);\r\n border-color: var(--all-green-10);\r\n \r\n .el-alert__title,\r\n .el-alert__description,\r\n .el-alert__close-btn {\r\n color: var(--all-green-4);\r\n }\r\n \r\n .el-alert__icon {\r\n display: flex;\r\n align-items: center;\r\n }\r\n }\r\n}\r\n\r\n</style>","<template>\r\n <div>\r\n <el-dialog\r\n ref=\"dialogRef\"\r\n v-model=\"dialogVisible\"\r\n :width=\"width\"\r\n :title=\"title\"\r\n :draggable=\"draggable\"\r\n :close-on-click-modal=\"closeOnClickModal\"\r\n :center=\"center\"\r\n align-center\r\n v-bind=\"$attrs\"\r\n class=\"m-dialog\"\r\n header-class=\"m-header\"\r\n >\r\n <template v-if=\"$slots.header\" #header=\"{ close, titleId, titleClass }\">\r\n <slot name=\"header\" v-bind=\"{ close, titleId, titleClass }\"></slot>\r\n </template>\r\n <slot name=\"default\"></slot>\r\n <template v-if=\"$slots.footer\" #footer class=\"m-footer\">\r\n <slot name=\"footer\"></slot>\r\n </template>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: 'MDialog'\r\n})\r\nconst props = defineProps({\r\n width: {\r\n type: String,\r\n default: '440px'\r\n },\r\n center: {\r\n type: Boolean,\r\n default: true\r\n },\r\n draggable: {\r\n type: Boolean,\r\n default: true\r\n },\r\n closeOnClickModal: {\r\n type: Boolean,\r\n default: false\r\n },\r\n title: {\r\n type: String,\r\n default: ''\r\n }\r\n})\r\nconst emit = defineEmits(['close'])\r\nconst dialogVisible = defineModel('modelValue', {\r\n type: Boolean,\r\n default: false\r\n})\r\n\r\nconst { innerRef: dialogRef, exposedProxy } = useExposeRef('dialogRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n\r\n</style>\r\n","<template>\r\n <el-notification v-bind=\"$attrs\" class=\"mc-notification\">\r\n <!-- 其他插槽 -->\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-notification>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n name: \"MNotification\",\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n// Notification 基础样式\r\n// 如需自定义样式,可以在这里添加\r\n</style>\r\n","<template>\r\n <teleport to=\"body\">\r\n <transition-group name=\"message\" tag=\"div\" class=\"message-container\">\r\n <div\r\n v-for=\"message in messages\"\r\n :key=\"message.id\"\r\n :class=\"[\r\n 'custom-message',\r\n `message-${message.type}`,\r\n `message-${message.placement}`,\r\n { 'message-plain': message.plain },\r\n ]\"\r\n >\r\n <!-- 图标 -->\r\n <div v-if=\"message.showIcon\" class=\"message-icon\">\r\n <img\r\n v-if=\"message.customIcon\"\r\n :src=\"message.customIcon\"\r\n alt=\"custom icon\"\r\n class=\"message-icon-img\"\r\n />\r\n <img\r\n v-else-if=\"message.type === 'success'\"\r\n src=\"https://cfdsaas-pre.oss-cn-hongkong.aliyuncs.com/mc-assets/mc-ui/alert/alert-success.png\"\r\n alt=\"success icon\"\r\n class=\"message-icon-img\"\r\n />\r\n <img\r\n v-else-if=\"message.type === 'warning'\"\r\n src=\"https://cfdsaas-pre.oss-cn-hongkong.aliyuncs.com/mc-assets/mc-ui/alert/alert-warning.png\"\r\n alt=\"warning icon\"\r\n class=\"message-icon-img\"\r\n />\r\n <img\r\n v-else-if=\"message.type === 'error'\"\r\n src=\"https://cfdsaas-pre.oss-cn-hongkong.aliyuncs.com/mc-assets/mc-ui/alert/alert-error.png\"\r\n alt=\"error icon\"\r\n class=\"message-icon-img\"\r\n />\r\n </div>\r\n\r\n <!-- 消息内容 -->\r\n <div class=\"message-content\">\r\n <component\r\n v-if=\"typeof message.message === 'function'\"\r\n :is=\"message.message\"\r\n />\r\n <div\r\n v-else-if=\"message.dangerouslyUseHTMLString\"\r\n v-html=\"message.message\"\r\n />\r\n <span v-else>{{ message.message }}</span>\r\n\r\n <!-- 重复数量 -->\r\n <span v-if=\"message.repeatNum > 1\" class=\"message-repeat\">\r\n {{ message.repeatNum }}\r\n </span>\r\n </div>\r\n\r\n <!-- 关闭按钮 -->\r\n <button\r\n v-if=\"message.showClose\"\r\n class=\"message-close\"\r\n @click=\"closeMessage(message.id)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n </transition-group>\r\n </teleport>\r\n</template>\r\n\r\n<script>\r\nimport { ref } from \"vue\";\r\n\r\n// 全局消息列表\r\nconst messages = ref([]);\r\nlet messageId = 0;\r\n\r\n// 创建 Message 静态方法对象\r\nconst Message = {\r\n // 默认配置\r\n defaultOptions: {\r\n message: \"\",\r\n type: \"success\",\r\n plain: false,\r\n customIcon: \"\",\r\n dangerouslyUseHTMLString: false,\r\n customClass: \"\",\r\n duration: 3000,\r\n showClose: false,\r\n showIcon: true,\r\n onClose: null,\r\n offset: 16,\r\n placement: \"top\",\r\n appendTo: \"body\",\r\n grouping: false,\r\n repeatNum: 1,\r\n },\r\n\r\n // 显示消息\r\n show(options = {}) {\r\n // 如果是字符串,转换为配置对象\r\n if (typeof options === \"string\") {\r\n options = { message: options };\r\n }\r\n\r\n const config = {\r\n ...this.defaultOptions,\r\n ...options,\r\n id: ++messageId,\r\n };\r\n\r\n // 分组处理\r\n if (config.grouping) {\r\n const existingIndex = messages.value.findIndex(\r\n (m) =>\r\n m.message === config.message && m.type === config.type && m.grouping\r\n );\r\n\r\n if (existingIndex > -1) {\r\n messages.value[existingIndex].repeatNum++;\r\n return { close: () => this.close(messages.value[existingIndex].id) };\r\n }\r\n }\r\n\r\n // 添加到消息列表\r\n messages.value.push(config);\r\n\r\n // 如果设置了自动关闭时间,则自动关闭\r\n if (config.duration > 0) {\r\n setTimeout(() => {\r\n this.close(config.id);\r\n }, config.duration);\r\n }\r\n\r\n return {\r\n close: () => this.close(config.id),\r\n };\r\n },\r\n\r\n // 关闭指定消息\r\n close(id) {\r\n const index = messages.value.findIndex((m) => m.id === id);\r\n if (index > -1) {\r\n const message = messages.value[index];\r\n if (message.onClose) {\r\n message.onClose(message);\r\n }\r\n messages.value.splice(index, 1);\r\n }\r\n },\r\n\r\n // 关闭所有消息\r\n closeAll() {\r\n messages.value = [];\r\n },\r\n\r\n // 便捷方法\r\n success(options = {}) {\r\n if (typeof options === \"string\") {\r\n options = { message: options };\r\n }\r\n return this.show({ ...options, type: \"success\" });\r\n },\r\n\r\n warning(options = {}) {\r\n if (typeof options === \"string\") {\r\n options = { message: options };\r\n }\r\n return this.show({ ...options, type: \"warning\" });\r\n },\r\n\r\n error(options = {}) {\r\n if (typeof options === \"string\") {\r\n options = { message: options };\r\n }\r\n return this.show({ ...options, type: \"error\" });\r\n },\r\n};\r\n\r\n// 关闭消息的方法\r\nconst closeMessage = (id) => {\r\n Message.close(id);\r\n};\r\n\r\n// Vue 组件定义\r\nexport default {\r\n name: \"MMessage\",\r\n setup() {\r\n return {\r\n messages,\r\n closeMessage,\r\n };\r\n },\r\n};\r\n\r\n// 导出类供直接使用\r\nexport { Message };\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.message-container {\r\n position: fixed;\r\n z-index: 9999;\r\n pointer-events: none;\r\n}\r\n\r\n.custom-message {\r\n position: fixed;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n min-width: 200px;\r\n max-width: 320px;\r\n padding: 12px 16px;\r\n border-radius: 8px;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\r\n pointer-events: auto;\r\n z-index: 9999;\r\n font-size: 14px;\r\n\r\n // 位置控制\r\n &.message-top {\r\n top: 20px;\r\n\r\n &:nth-child(2) {\r\n top: 70px;\r\n }\r\n &:nth-child(3) {\r\n top: 120px;\r\n }\r\n &:nth-child(4) {\r\n top: 170px;\r\n }\r\n &:nth-child(5) {\r\n top: 220px;\r\n }\r\n }\r\n\r\n &.message-top-left {\r\n top: 20px;\r\n left: 20px;\r\n transform: none;\r\n\r\n &:nth-child(2) {\r\n top: 70px;\r\n }\r\n &:nth-child(3) {\r\n top: 120px;\r\n }\r\n &:nth-child(4) {\r\n top: 170px;\r\n }\r\n &:nth-child(5) {\r\n top: 220px;\r\n }\r\n }\r\n\r\n &.message-top-right {\r\n top: 20px;\r\n right: 20px;\r\n left: auto;\r\n transform: none;\r\n\r\n &:nth-child(2) {\r\n top: 70px;\r\n }\r\n &:nth-child(3) {\r\n top: 120px;\r\n }\r\n &:nth-child(4) {\r\n top: 170px;\r\n }\r\n &:nth-child(5) {\r\n top: 220px;\r\n }\r\n }\r\n\r\n &.message-bottom {\r\n bottom: 20px;\r\n top: auto;\r\n\r\n &:nth-child(2) {\r\n bottom: 70px;\r\n }\r\n &:nth-child(3) {\r\n bottom: 120px;\r\n }\r\n &:nth-child(4) {\r\n bottom: 170px;\r\n }\r\n &:nth-child(5) {\r\n bottom: 220px;\r\n }\r\n }\r\n\r\n &.message-bottom-left {\r\n bottom: 20px;\r\n left: 20px;\r\n top: auto;\r\n transform: none;\r\n\r\n &:nth-child(2) {\r\n bottom: 70px;\r\n }\r\n &:nth-child(3) {\r\n bottom: 120px;\r\n }\r\n &:nth-child(4) {\r\n bottom: 170px;\r\n }\r\n &:nth-child(5) {\r\n bottom: 220px;\r\n }\r\n }\r\n\r\n &.message-bottom-right {\r\n bottom: 20px;\r\n right: 20px;\r\n left: auto;\r\n top: auto;\r\n transform: none;\r\n\r\n &:nth-child(2) {\r\n bottom: 70px;\r\n }\r\n &:nth-child(3) {\r\n bottom: 120px;\r\n }\r\n &:nth-child(4) {\r\n bottom: 170px;\r\n }\r\n &:nth-child(5) {\r\n bottom: 220px;\r\n }\r\n }\r\n\r\n .message-icon {\r\n flex-shrink: 0;\r\n display: flex;\r\n align-items: center;\r\n\r\n .message-icon-img {\r\n width: 16px;\r\n height: 16px;\r\n object-fit: contain;\r\n }\r\n }\r\n\r\n .message-content {\r\n flex: 1;\r\n line-height: 1.4;\r\n position: relative;\r\n\r\n .message-repeat {\r\n position: absolute;\r\n top: -8px;\r\n right: -8px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: #666;\r\n color: white;\r\n font-size: 10px;\r\n font-weight: bold;\r\n min-width: 16px;\r\n height: 16px;\r\n padding: 0 4px;\r\n border-radius: 8px;\r\n border: 2px solid white;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n }\r\n }\r\n\r\n .message-close {\r\n flex-shrink: 0;\r\n border: none;\r\n background: transparent;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 4px;\r\n margin-left: 8px;\r\n opacity: 0.6;\r\n transition: opacity 0.2s ease;\r\n font-size: 24px;\r\n width: 20px;\r\n height: 20px;\r\n border-radius: 50%;\r\n color: var(--icon-tertiary, #999);\r\n\r\n &:hover {\r\n opacity: 1;\r\n background: rgba(0, 0, 0, 0.1);\r\n }\r\n }\r\n\r\n // 不同类型的样式 - 统一使用 bg-tertiary-hover 背景\r\n &.message-success {\r\n background-color: var(--bg-tertiary-hover, #f5f5f5);\r\n color: var(--all-green-4, #67c23a);\r\n border: 1px solid var(--bg-tertiary-hover, #f5f5f5);\r\n\r\n .message-icon {\r\n color: var(--all-green-4, #67c23a);\r\n }\r\n\r\n .message-repeat {\r\n background: var(--all-green-4, #67c23a);\r\n border-color: var(--all-green-4, #67c23a);\r\n }\r\n\r\n &.message-plain {\r\n background: var(--all-green-4, #67c23a);\r\n border: 1px solid var(--all-green-4, #67c23a);\r\n color: #fff;\r\n\r\n .message-icon {\r\n color: #fff;\r\n }\r\n }\r\n }\r\n\r\n &.message-warning {\r\n background-color: var(--bg-tertiary-hover, #f5f5f5);\r\n color: var(--text-warning-primary, #e6a23c);\r\n border: 1px solid var(--bg-tertiary-hover, #f5f5f5);\r\n\r\n .message-icon {\r\n color: var(--text-warning-primary, #e6a23c);\r\n }\r\n\r\n .message-repeat {\r\n background: var(--text-warning-primary, #e6a23c);\r\n border-color: var(--text-warning-primary, #e6a23c);\r\n }\r\n\r\n &.message-plain {\r\n background: var(--text-warning-primary, #e6a23c);\r\n border: 1px solid var(--text-warning-primary, #e6a23c);\r\n color: #fff;\r\n\r\n .message-icon {\r\n color: #fff;\r\n }\r\n }\r\n }\r\n\r\n &.message-error {\r\n background-color: var(--bg-tertiary-hover, #f5f5f5);\r\n color: var(--text-error-primary, #f56c6c);\r\n border: 1px solid var(--bg-tertiary-hover, #f5f5f5);\r\n\r\n .message-icon {\r\n color: var(--text-error-primary, #f56c6c);\r\n }\r\n\r\n .message-repeat {\r\n background: var(--text-error-primary, #f56c6c);\r\n border-color: var(--text-error-primary, #f56c6c);\r\n }\r\n\r\n &.message-plain {\r\n background: var(--text-error-primary, #f56c6c);\r\n border: 1px solid var(--text-error-primary, #f56c6c);\r\n color: #fff;\r\n\r\n .message-icon {\r\n color: #fff;\r\n }\r\n }\r\n }\r\n}\r\n\r\n// 动画效果\r\n.message-enter-active {\r\n transition: all 0.3s ease;\r\n}\r\n\r\n.message-leave-active {\r\n transition: all 0.3s ease;\r\n}\r\n\r\n.message-enter-from {\r\n opacity: 0;\r\n transform: translateX(-50%) translateY(-20px);\r\n}\r\n\r\n.message-leave-to {\r\n opacity: 0;\r\n transform: translateX(-50%) translateY(-20px);\r\n}\r\n\r\n.message-move {\r\n transition: transform 0.3s ease;\r\n}\r\n\r\n// 不同位置的动画\r\n.message-top-left {\r\n &.message-enter-from,\r\n &.message-leave-to {\r\n transform: translateX(-20px);\r\n }\r\n}\r\n\r\n.message-top-right {\r\n &.message-enter-from,\r\n &.message-leave-to {\r\n transform: translateX(20px);\r\n }\r\n}\r\n\r\n.message-bottom {\r\n &.message-enter-from,\r\n &.message-leave-to {\r\n transform: translateX(-50%) translateY(20px);\r\n }\r\n}\r\n\r\n.message-bottom-left {\r\n &.message-enter-from,\r\n &.message-leave-to {\r\n transform: translateX(-20px);\r\n }\r\n}\r\n\r\n.message-bottom-right {\r\n &.message-enter-from,\r\n &.message-leave-to {\r\n transform: translateX(20px);\r\n }\r\n}\r\n\r\n.mc-h5 {\r\n .custom-message {\r\n width: 304px;\r\n\r\n .message-icon {\r\n .message-icon-img {\r\n width: 20px;\r\n height: 20px;\r\n }\r\n }\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <teleport to=\"body\">\r\n <transition-group name=\"notification\" tag=\"div\" class=\"notification-container\">\r\n <div\r\n v-for=\"notification in notifications\"\r\n :key=\"notification.id\"\r\n :class=\"[\r\n 'custom-notification',\r\n `notification-${notification.position}`\r\n ]\"\r\n >\r\n <!-- 图标 -->\r\n <div class=\"notification-icon\">\r\n <img \r\n src=\"https://cfdsaas-pre.oss-cn-hongkong.aliyuncs.com/mc-assets/MCImages/userCenter/icon-quota-tip.png\" \r\n alt=\"notification icon\"\r\n />\r\n </div>\r\n\r\n <!-- 内容区域 -->\r\n <div class=\"notification-content\">\r\n <!-- 标题 -->\r\n <div class=\"notification-title\">{{ notification.title }}</div>\r\n \r\n <!-- 消息内容 -->\r\n <div class=\"notification-message\">{{ notification.message }}</div>\r\n \r\n <!-- 自定义插槽内容 -->\r\n <div v-if=\"notification.slotContent\" class=\"notification-action\">\r\n <component :is=\"notification.slotContent\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 关闭按钮 -->\r\n <button \r\n v-if=\"notification.showClose\"\r\n class=\"notification-close\"\r\n @click=\"closeNotification(notification.id)\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n </transition-group>\r\n </teleport>\r\n</template>\r\n\r\n<script>\r\nimport { ref } from 'vue'\r\n\r\n// 全局通知列表\r\nconst notifications = ref([])\r\nlet notificationId = 0\r\n\r\n// 创建 NotifiMessage 静态方法对象\r\nconst NotifiMessage = {\r\n // 默认配置\r\n defaultOptions: {\r\n title: '',\r\n message: '',\r\n duration: 4500,\r\n position: 'top-right',\r\n showClose: true,\r\n offset: 20\r\n },\r\n\r\n // 显示通知\r\n show(options = {}) {\r\n const config = {\r\n ...this.defaultOptions,\r\n ...options,\r\n id: ++notificationId\r\n }\r\n\r\n // 添加到通知列表\r\n notifications.value.push(config)\r\n\r\n // 如果设置了自动关闭时间,则自动关闭\r\n if (config.duration > 0) {\r\n setTimeout(() => {\r\n this.close(config.id)\r\n }, config.duration)\r\n }\r\n\r\n return {\r\n close: () => this.close(config.id)\r\n }\r\n },\r\n\r\n // 关闭指定通知\r\n close(id) {\r\n const index = notifications.value.findIndex(n => n.id === id)\r\n if (index > -1) {\r\n notifications.value.splice(index, 1)\r\n }\r\n },\r\n\r\n // 关闭所有通知\r\n closeAll() {\r\n notifications.value = []\r\n },\r\n\r\n // 便捷方法\r\n success(options = {}) {\r\n return this.show(options)\r\n },\r\n\r\n warning(options = {}) {\r\n return this.show(options)\r\n },\r\n\r\n error(options = {}) {\r\n return this.show(options)\r\n }\r\n}\r\n\r\n// 关闭通知的方法\r\nconst closeNotification = (id) => {\r\n const index = notifications.value.findIndex(n => n.id === id)\r\n if (index > -1) {\r\n notifications.value.splice(index, 1)\r\n }\r\n}\r\n\r\n\r\n// Vue 组件定义\r\nexport default {\r\n name: 'MNotifiMessage',\r\n setup() {\r\n return {\r\n notifications,\r\n closeNotification\r\n }\r\n }\r\n}\r\n\r\n// 导出类供直接使用\r\nexport { NotifiMessage }\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.notification-container {\r\n position: fixed;\r\n z-index: 9999;\r\n pointer-events: none;\r\n}\r\n\r\n.custom-notification {\r\n position: fixed;\r\n top: 20px;\r\n right: 20px;\r\n width: 400px;\r\n background: #201F24;\r\n border-radius: 12px;\r\n padding: 16px;\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 4px;\r\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);\r\n pointer-events: auto;\r\n z-index: 9999;\r\n \r\n // 多个通知的堆叠效果\r\n &:nth-child(2) { top: 100px; }\r\n &:nth-child(3) { top: 180px; }\r\n &:nth-child(4) { top: 260px; }\r\n &:nth-child(5) { top: 340px; }\r\n \r\n .notification-icon {\r\n flex-shrink: 0;\r\n width: 40px;\r\n height: 40px;\r\n border-radius: 50%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n position: relative;\r\n transform: translate(-9px, -8px);\r\n \r\n img {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: contain;\r\n }\r\n }\r\n \r\n .notification-content {\r\n flex: 1;\r\n \r\n .notification-title {\r\n color: #FFFFFF;\r\n font-size: 16px;\r\n font-weight: 600;\r\n margin-bottom: 8px;\r\n }\r\n \r\n .notification-message {\r\n color: rgba(255, 255, 255, 0.8);\r\n font-size: 14px;\r\n line-height: 1.5;\r\n margin-bottom: 16px;\r\n }\r\n \r\n .notification-action {\r\n .custom-action-link {\r\n color: #FFD905;\r\n font-size: 14px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n transition: all 0.2s ease;\r\n \r\n &:hover {\r\n color: #FFF;\r\n }\r\n \r\n span {\r\n line-height: 1;\r\n }\r\n \r\n .arrow {\r\n transition: transform 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n line-height: 1;\r\n }\r\n \r\n &:hover .arrow {\r\n transform: translateX(2px);\r\n }\r\n }\r\n }\r\n }\r\n \r\n .notification-close {\r\n position: absolute;\r\n top: 12px;\r\n right: 12px;\r\n width: 20px;\r\n height: 20px;\r\n border: none;\r\n background: transparent;\r\n color: var(--icon-tertiary, #999);\r\n border-radius: 50%;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 24px;\r\n line-height: 1;\r\n opacity: 0.6;\r\n transition: opacity 0.2s ease;\r\n \r\n &:hover {\r\n opacity: 1;\r\n background: rgba(0, 0, 0, 0.1);\r\n }\r\n }\r\n}\r\n\r\n// 动画效果\r\n.notification-enter-active {\r\n transition: all 0.3s ease;\r\n}\r\n\r\n.notification-leave-active {\r\n transition: all 0.3s ease;\r\n}\r\n\r\n.notification-enter-from {\r\n opacity: 0;\r\n transform: translateX(100%);\r\n}\r\n\r\n.notification-leave-to {\r\n opacity: 0;\r\n transform: translateX(100%);\r\n}\r\n\r\n.notification-move {\r\n transition: transform 0.3s ease;\r\n}\r\n\r\n// 响应式设计\r\n@media (max-width: 480px) {\r\n .custom-notification {\r\n width: calc(100vw - 40px);\r\n left: 20px !important;\r\n right: 20px !important;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-date-picker ref=\"datePickerRef\" v-bind=\"mergedAttrs\" class=\"m-datepicker\" :popper-class=\"popperClass\" :class=\"{ 'style-type-solid': styleType === 'solid' }\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-date-picker>\r\n</template>\r\n\r\n<script setup>\r\nimport { useClassName } from \"@packages/hooks/useClassName.js\";\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: \"MDatePicker\",\r\n});\r\n\r\n// 定义 props,提供默认的 type 值\r\nconst props = defineProps({\r\n popperClass: {\r\n type: String,\r\n default: \"\",\r\n },\r\n styleType: {\r\n type: String,\r\n },\r\n});\r\n\r\n// 使用类名 Hook,排除 type 和 popperClass 属性\r\nconst { mergedAttrs, className: popperClass } = useClassName(\r\n \"mc-datepicker-popper\",\r\n \"popperClass\"\r\n);\r\n\r\nconst { innerRef: datePickerRef, exposedProxy } = useExposeRef('datePickerRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n<style lang=\"scss\">\r\n.m-datepicker{\r\n &.style-type-solid{\r\n --el-input-border-color: var(--bg-tertiary-hover);\r\n &.el-date-editor.el-input__wrapper, .el-input__wrapper{\r\n // box-shadow: none ;\r\n background-color: var(--bg-tertiary-hover);\r\n }\r\n }\r\n &.el-input--small{\r\n --el-input-height: 40px;\r\n }\r\n}\r\n.mc-datepicker-popper {\r\n .el-picker-panel {\r\n border: 1px solid var(--border-primary);\r\n border-radius: 6px;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\r\n .current,\r\n // .today:not(.in-range),\r\n .start-date,\r\n .end-date {\r\n .el-date-table-cell {\r\n .el-date-table-cell__text {\r\n color: var(--text-quaternary);\r\n border-radius: 3px;\r\n }\r\n }\r\n }\r\n\r\n .start-date {\r\n .el-date-table-cell {\r\n border-top-left-radius: 3px;\r\n border-bottom-left-radius: 3px;\r\n }\r\n }\r\n\r\n .end-date {\r\n .el-date-table-cell {\r\n border-top-right-radius: 3px;\r\n border-bottom-right-radius: 3px;\r\n }\r\n }\r\n\r\n .el-button.is-text {\r\n color: var(--text-brand);\r\n }\r\n .el-button.is-plain {\r\n background: var(--bg-brand);\r\n color: var(--text-quaternary);\r\n }\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-empty ref=\"emptyRef\" v-bind=\"mergedAttrs\" :image=\"imageUrl\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-empty>\r\n</template>\r\n\r\n<script>\r\n// 定义可选的图片文件名(在模块作用域中)\r\nconst availableImages = [\r\n '404',\r\n 'billing', \r\n 'cart',\r\n 'comments',\r\n 'dashboard',\r\n 'files',\r\n 'inbox',\r\n 'location',\r\n 'network',\r\n 'notifications',\r\n 'orders',\r\n 'records',\r\n 'session',\r\n 'subscription',\r\n 'todo',\r\n 'wishlist'\r\n]\r\n\r\nexport default {\r\n name: 'MEmpty'\r\n}\r\n</script>\r\n\r\n<script setup>\r\nimport { computed, useAttrs } from 'vue'\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\nconst props = defineProps({\r\n image: {\r\n type: String,\r\n default: 'orders',\r\n validator: (value) => {\r\n // 如果是完整的URL或路径,直接通过验证\r\n if (value.includes('/') || value.includes('http')) {\r\n return true\r\n }\r\n // 否则检查是否在可选列表中\r\n return availableImages.includes(value)\r\n }\r\n }\r\n})\r\n\r\nconst attrs = useAttrs()\r\n\r\n// 排除 image 属性,避免重复绑定\r\nconst mergedAttrs = computed(() => {\r\n const { image, ...rest } = attrs\r\n return rest\r\n})\r\n\r\n// 计算图片URL\r\nconst imageUrl = computed(() => {\r\n const { image } = props\r\n \r\n // 如果是完整的URL或路径,直接返回\r\n if (image.includes('/') || image.includes('http')) {\r\n return image\r\n }\r\n \r\n // 使用 public 目录中的图片\r\n // Vite 会自动处理 public 目录中的静态资源\r\n return `https://cfdsaas-pre.oss-cn-hongkong.aliyuncs.com/mc-assets/mc-ui/empty/${image}.png`\r\n})\r\n\r\nconst { innerRef: emptyRef, exposedProxy } = useExposeRef('emptyRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>","<template>\r\n <el-table v-bind=\"$attrs\" ref=\"innerTableRef\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-table>\r\n</template>\r\n\r\n<script setup>\r\nimport { useExposeRef } from '@packages/hooks/useExposeRef.js'\r\n\r\ndefineOptions({\r\n name: \"MTable\",\r\n});\r\n\r\nconst { innerRef: innerTableRef, exposedProxy } = useExposeRef('innerTableRef')\r\n\r\ndefineExpose(exposedProxy)\r\n</script>\r\n<style lang=\"scss\">\r\n// Table 组件样式 - 无边框设计\r\n\r\n</style>\r\n","<template>\r\n <el-table-column v-bind=\"$attrs\" class=\"m-table-column\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]=\"slotProps\">\r\n <slot :name=\"name\" v-bind=\"slotProps || {}\" />\r\n </template>\r\n </el-table-column>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n name: \"MTableColumn\",\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n// TableColumn 组件样式\r\n.m-table-column.el-table-column {\r\n // 继承父级 Table 组件的样式\r\n}\r\n</style>\r\n","<template>\r\n <div \r\n v-if=\"visible\" \r\n class=\"m-banner\"\r\n :class=\"[\r\n `m-banner--${type}`,\r\n {\r\n 'm-banner--closable': closable,\r\n 'm-banner--with-icon': icon || slots.icon\r\n }\r\n ]\"\r\n :style=\"bannerStyle\"\r\n >\r\n <div class=\"m-banner__content\">\r\n <!-- 图标插槽 -->\r\n <div v-if=\"icon || slots.icon\" class=\"m-banner__icon\">\r\n <slot name=\"icon\">\r\n <m-icon :name=\"icon\" :size=\"iconSize\" />\r\n </slot>\r\n </div>\r\n \r\n <!-- 主要内容 -->\r\n <div class=\"m-banner__text\">\r\n <slot>{{ content }}</slot>\r\n </div>\r\n \r\n <!-- 关闭按钮 -->\r\n <div v-if=\"closable\" class=\"m-banner__close\" @click=\"handleClose\">\r\n <m-icon name=\"lucide-x\" :size=\"closeIconSize\" />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, watch, useSlots } from 'vue'\r\nimport MIcon from '../Icon/Icon.vue'\r\n\r\n// 获取插槽\r\nconst slots = useSlots()\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 横幅内容\r\n content: {\r\n type: String,\r\n default: ''\r\n },\r\n // 横幅类型\r\n type: {\r\n type: String,\r\n default: 'info',\r\n validator: (value) => ['info', 'success', 'warning', 'error'].includes(value)\r\n },\r\n // 是否可关闭\r\n closable: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 是否显示\r\n visible: {\r\n type: Boolean,\r\n default: true\r\n },\r\n // 图标名称\r\n icon: {\r\n type: String,\r\n default: ''\r\n },\r\n // 图标大小\r\n iconSize: {\r\n type: [String, Number],\r\n default: '16px'\r\n },\r\n // 关闭图标大小\r\n closeIconSize: {\r\n type: [String, Number],\r\n default: '16px'\r\n },\r\n // 自定义背景色\r\n backgroundColor: {\r\n type: String,\r\n default: ''\r\n },\r\n // 自定义文字颜色\r\n textColor: {\r\n type: String,\r\n default: ''\r\n },\r\n // 自定义边框颜色\r\n borderColor: {\r\n type: String,\r\n default: ''\r\n },\r\n // 持续时间(毫秒),0 表示不自动关闭\r\n duration: {\r\n type: Number,\r\n default: 0\r\n }\r\n})\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['close', 'update:visible'])\r\n\r\n// 响应式数据\r\nconst internalVisible = ref(props.visible)\r\n\r\n// 监听 visible prop 变化\r\nwatch(() => props.visible, (newVal) => {\r\n internalVisible.value = newVal\r\n})\r\n\r\n// 计算样式\r\nconst bannerStyle = computed(() => {\r\n const style = {}\r\n \r\n if (props.backgroundColor) {\r\n style.backgroundColor = props.backgroundColor\r\n }\r\n if (props.textColor) {\r\n style.color = props.textColor\r\n }\r\n if (props.borderColor) {\r\n style.borderColor = props.borderColor\r\n }\r\n \r\n return style\r\n})\r\n\r\n// 默认图标映射\r\nconst defaultIcons = {\r\n info: 'info',\r\n success: 'check-circle',\r\n warning: 'warning',\r\n error: 'close-circle'\r\n}\r\n\r\n// 计算实际使用的图标\r\nconst actualIcon = computed(() => {\r\n return props.icon || defaultIcons[props.type]\r\n})\r\n\r\n// 处理关闭\r\nconst handleClose = () => {\r\n internalVisible.value = false\r\n emit('update:visible', false)\r\n emit('close')\r\n}\r\n\r\n// 自动关闭逻辑\r\nwatch(internalVisible, (newVal) => {\r\n if (newVal && props.duration > 0) {\r\n setTimeout(() => {\r\n handleClose()\r\n }, props.duration)\r\n }\r\n})\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: 'MBanner'\r\n})\r\n\r\n// 暴露方法给父组件\r\ndefineExpose({\r\n close: handleClose\r\n})\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.m-banner {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n min-height: 40px;\r\n border-radius: 4px;\r\n border: 1px solid;\r\n font-size: 14px;\r\n line-height: 1.5;\r\n padding: 10px;\r\n transition: all 0.3s ease;\r\n\r\n &__content {\r\n display: flex;\r\n align-items: center;\r\n width: 100%;\r\n flex: 1;\r\n }\r\n\r\n &__icon {\r\n display: flex;\r\n align-items: center;\r\n margin-right: 8px;\r\n flex-shrink: 0;\r\n }\r\n\r\n &__text {\r\n flex: 1;\r\n word-break: break-word;\r\n }\r\n\r\n &__close {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n margin-left: 8px;\r\n cursor: pointer;\r\n padding: 4px;\r\n border-radius: 3px;\r\n transition: background-color 0.2s ease;\r\n flex-shrink: 0;\r\n min-width: 20px;\r\n min-height: 20px;\r\n opacity: 0.7;\r\n\r\n &:hover {\r\n background-color: rgba(0, 0, 0, 0.1);\r\n opacity: 1;\r\n }\r\n }\r\n\r\n // 类型样式\r\n &--info {\r\n background-color: #e1f3ff;\r\n border-color: #b3d8ff;\r\n color: #0066cc;\r\n\r\n .m-banner__close:hover {\r\n background-color: rgba(0, 102, 204, 0.1);\r\n }\r\n }\r\n\r\n &--success {\r\n background-color: #f0f9ff;\r\n border-color: #b3e5b3;\r\n color: #00a854;\r\n\r\n .m-banner__close:hover {\r\n background-color: rgba(0, 168, 84, 0.1);\r\n }\r\n }\r\n\r\n &--warning {\r\n background-color: #fff7e6;\r\n border-color: #ffd591;\r\n color: #fa8c16;\r\n\r\n .m-banner__close:hover {\r\n background-color: rgba(250, 140, 22, 0.1);\r\n }\r\n }\r\n\r\n &--error {\r\n background-color: #fff2f0;\r\n border-color: #ffccc7;\r\n color: #ff4d4f;\r\n\r\n .m-banner__close:hover {\r\n background-color: rgba(255, 77, 79, 0.1);\r\n }\r\n }\r\n\r\n // 带动画的关闭\r\n &.m-banner-leave-active {\r\n opacity: 0;\r\n transform: translateY(-10px);\r\n transition: opacity 0.3s ease, transform 0.3s ease;\r\n }\r\n}\r\n\r\n// 深色主题适配\r\n@media (prefers-color-scheme: dark) {\r\n .m-banner {\r\n &--info {\r\n background-color: rgba(24, 144, 255, 0.1);\r\n border-color: rgba(24, 144, 255, 0.3);\r\n color: #69c0ff;\r\n }\r\n\r\n &--success {\r\n background-color: rgba(82, 196, 26, 0.1);\r\n border-color: rgba(82, 196, 26, 0.3);\r\n color: #95de64;\r\n }\r\n\r\n &--warning {\r\n background-color: rgba(250, 173, 20, 0.1);\r\n border-color: rgba(250, 173, 20, 0.3);\r\n color: #ffd666;\r\n }\r\n\r\n &--error {\r\n background-color: rgba(255, 77, 79, 0.1);\r\n border-color: rgba(255, 77, 79, 0.3);\r\n color: #ff7875;\r\n }\r\n }\r\n}\r\n</style>\r\n","/**\r\n * 样式工具函数\r\n * 用于确保组件样式完全覆盖 Element Plus\r\n */\r\n\r\n/**\r\n * 为元素添加高优先级样式类\r\n * @param {HTMLElement} element - 目标元素\r\n */\r\nexport function addOverrideClass(element) {\r\n if (element && element.classList) {\r\n element.classList.add('mc-ui-override');\r\n }\r\n}\r\n\r\n/**\r\n * 为 Vue 组件实例添加覆盖样式\r\n * @param {Object} componentInstance - Vue 组件实例\r\n */\r\nexport function addComponentOverride(componentInstance) {\r\n if (componentInstance && componentInstance.$el) {\r\n addOverrideClass(componentInstance.$el);\r\n }\r\n}\r\n\r\n/**\r\n * 全局应用样式覆盖\r\n * 在应用启动时调用,确保所有 Element Plus 组件都被覆盖\r\n */\r\nexport function applyGlobalOverride() {\r\n // 为 body 添加覆盖类\r\n if (typeof document !== 'undefined') {\r\n document.body.classList.add('mc-ui-override');\r\n \r\n // 监听动态添加的 Element Plus 组件\r\n const observer = new MutationObserver((mutations) => {\r\n mutations.forEach((mutation) => {\r\n mutation.addedNodes.forEach((node) => {\r\n if (node.nodeType === 1 && node.classList) {\r\n // 为新添加的 Element Plus 组件添加覆盖类\r\n if (node.className && typeof node.className === 'string' && node.className.includes('el-')) {\r\n const parent = node.closest('.mc-ui-override') || node.parentElement;\r\n if (parent && !parent.classList.contains('mc-ui-override')) {\r\n parent.classList.add('mc-ui-override');\r\n }\r\n }\r\n \r\n // 检查子元素\r\n const elComponents = node.querySelectorAll('[class*=\"el-\"]');\r\n elComponents.forEach(el => {\r\n const parent = el.closest('.mc-ui-override') || el.parentElement;\r\n if (parent && !parent.classList.contains('mc-ui-override')) {\r\n parent.classList.add('mc-ui-override');\r\n }\r\n });\r\n }\r\n });\r\n });\r\n });\r\n \r\n observer.observe(document.body, {\r\n childList: true,\r\n subtree: true\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * 启用或自动切换 H5 适配(为 html 添加 mc-h5 类)\r\n * @param {Object} options\r\n * @param {'auto'|'on'|'off'} [options.mode='auto'] - 自动/强开/关闭\r\n * @param {number} [options.breakpoint=768] - 视口断点(px)\r\n * @returns {() => void} 调用以移除监听并清理状态\r\n */\r\nexport function enableH5Override(options = {}) {\r\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {};\r\n\r\n const {\r\n mode = 'auto',\r\n breakpoint = 768,\r\n } = options;\r\n\r\n const root = document.documentElement;\r\n\r\n const isMobileUA = () => /Mobi|Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\r\n const isNarrow = () => window.innerWidth <= breakpoint;\r\n\r\n const apply = (enable) => {\r\n if (enable) {\r\n root.classList.add('mc-h5');\r\n } else {\r\n root.classList.remove('mc-h5');\r\n }\r\n };\r\n\r\n if (mode === 'on') {\r\n apply(true);\r\n return () => { root.classList.remove('mc-h5'); };\r\n }\r\n\r\n if (mode === 'off') {\r\n apply(false);\r\n return () => {};\r\n }\r\n\r\n // auto 模式:依据 UA 或断点\r\n const compute = () => apply(isMobileUA() || isNarrow());\r\n compute();\r\n\r\n const onResize = () => compute();\r\n window.addEventListener('resize', onResize, { passive: true });\r\n\r\n return () => {\r\n window.removeEventListener('resize', onResize);\r\n };\r\n}\r\n\r\n/**\r\n * 强制刷新组件样式\r\n * @param {string} selector - CSS 选择器\r\n */\r\nexport function forceRefreshStyles(selector = '[class*=\"el-\"]') {\r\n if (typeof document !== 'undefined') {\r\n const elements = document.querySelectorAll(selector);\r\n elements.forEach(el => {\r\n const parent = el.closest('.mc-ui-override') || el.parentElement;\r\n if (parent && !parent.classList.contains('mc-ui-override')) {\r\n parent.classList.add('mc-ui-override');\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * 检测当前是否为 H5 环境\r\n * 优先检查 mc-h5 类(由 enableH5Override 管理),如果不存在则回退到 UA 和窗口宽度检测\r\n * @param {number} [breakpoint=768] - 视口断点(px),仅在回退检测时使用\r\n * @returns {boolean} 是否为 H5 环境\r\n */\r\nexport function isH5(breakpoint = 768) {\r\n if (typeof window === 'undefined' || typeof document === 'undefined') {\r\n return false;\r\n }\r\n\r\n // 优先检查 mc-h5 类(最可靠,由 enableH5Override 自动管理)\r\n const root = document.documentElement;\r\n if (root.classList.contains('mc-h5')) {\r\n return true;\r\n }\r\n\r\n // 回退检测:UA 或窗口宽度(兼容未调用 enableH5Override 的情况)\r\n const isMobileUA = /Mobi|Android|iPhone|iPad|iPod|Mobile/i.test(navigator.userAgent);\r\n const isNarrow = window.innerWidth <= breakpoint;\r\n return isMobileUA || isNarrow;\r\n}\r\n\r\n/**\r\n * 创建带有样式覆盖的 Element Plus 组件配置\r\n * @param {Object} componentConfig - 组件配置\r\n * @returns {Object} 增强后的组件配置\r\n */\r\nexport function createOverrideComponent(componentConfig) {\r\n return {\r\n ...componentConfig,\r\n mounted() {\r\n addOverrideClass(this.$el);\r\n if (componentConfig.mounted) {\r\n componentConfig.mounted.call(this);\r\n }\r\n },\r\n updated() {\r\n addOverrideClass(this.$el);\r\n if (componentConfig.updated) {\r\n componentConfig.updated.call(this);\r\n }\r\n }\r\n };\r\n}\r\n","<template>\r\n <div class=\"m-tabs\" :class=\"{ 'style-solid': styleType === 'solid' }\">\r\n <div class=\"m-tabs__header-wrapper\">\r\n\r\n <i\r\n v-if=\"showLeftArrow\"\r\n class=\"m-tabs__arrow m-tabs__arrow--left iconfont icon-chevron-left\"\r\n @click=\"handleScrollLeft\"\r\n />\r\n <div class=\"m-tabs__header\" ref=\"headerRef\" @scroll=\"handleScroll\">\r\n <div class=\"m-tabs__nav\" ref=\"navRef\">\r\n <div\r\n v-for=\"(tab, index) in tabs\"\r\n :key=\"tab.name\"\r\n :class=\"[\r\n 'm-tabs__item',\r\n { 'is-active': activeTab === tab.name }\r\n ]\"\r\n @click=\"handleTabClick(tab.name)\"\r\n >\r\n {{ tab.label }}\r\n </div>\r\n <div\r\n v-if=\"styleType !== 'solid'\"\r\n class=\"m-tabs__active-bar\"\r\n :style=\"activeBarStyle\"\r\n ></div>\r\n </div>\r\n </div>\r\n <i\r\n v-if=\"showRightArrow\"\r\n class=\"m-tabs__arrow m-tabs__arrow--right iconfont icon-chevron-right\"\r\n @click=\"handleScrollRight\"\r\n />\r\n </div>\r\n <div class=\"m-tabs__content\" ref=\"contentRef\" :key=\"internalKey\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { ref, reactive, computed, onMounted, onUnmounted, nextTick, provide, watch } from 'vue'\r\nimport { isH5 } from '../../utils/styleUtils.js'\r\n\r\n// 常量定义\r\nconst CONSTANTS = {\r\n // 滚动相关\r\n SCROLL_RATIO: 0.8, // 滚动比例\r\n SCROLL_MARGIN: 20, // 滚动边距\r\n EDGE_THRESHOLD_RATIO: 0.3, // 边缘阈值比例\r\n SCROLL_MIN_DIFF: 10, // 最小滚动差值(避免抖动)\r\n SCROLL_PRECISION: 0.5, // 滚动精度阈值\r\n \r\n // 定时器延迟\r\n SORT_DELAY: 10, // 排序延迟\r\n RESET_DELAY: 100, // 重置延迟\r\n SCROLL_DEBOUNCE: 150, // 滚动防抖时间\r\n SCROLL_ANIMATION: 400, // 滚动动画时间\r\n INIT_DELAY: 50, // 初始化延迟\r\n \r\n // ActiveBar 相关\r\n ACTIVE_BAR_WIDTH: 16, // 活动条宽度\r\n ACTIVE_BAR_OFFSET: 8, // 活动条偏移量\r\n H5_POSITION_TOLERANCE: 1 // H5 位置容差\r\n}\r\n\r\nexport default {\r\n name: 'MTabs',\r\n props: {\r\n modelValue: {\r\n type: [String, Number],\r\n default: ''\r\n },\r\n closable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n styleType: {\r\n type: String,\r\n default: 'default',\r\n validator: (value) => ['default', 'solid'].includes(value)\r\n }\r\n },\r\n emits: ['update:modelValue', 'tab-click', 'tab-remove', 'tab-change', 'tab-add', 'edit'],\r\n setup(props, { emit, slots }) {\r\n const navRef = ref(null)\r\n const headerRef = ref(null)\r\n const contentRef = ref(null)\r\n const tabs = ref([])\r\n const activeTab = ref(props.modelValue)\r\n const internalKey = ref(0) // 内部key,用于强制重新渲染slot内容\r\n const previousTabsCount = ref(0) // 上一次tabs的数量\r\n const previousTabsNames = ref([]) // 上一次tabs的name列表\r\n \r\n // 箭头显示控制\r\n const showLeftArrow = ref(false)\r\n const showRightArrow = ref(false)\r\n\r\n // 活动条样式\r\n const activeBarStyle = ref({ width: '0px', left: '0px' })\r\n \r\n // 定时器和状态管理\r\n let sortTimer = null\r\n let rafId = null\r\n let scrollTimeout = null\r\n let isManualScroll = false\r\n let isResetting = false\r\n let resizeObserver = null\r\n\r\n // 重置活动条样式\r\n const resetActiveBarStyle = () => {\r\n activeBarStyle.value = { width: '0px', left: '0px' }\r\n }\r\n\r\n // 获取活动项的精确位置\r\n const getActiveItemPosition = (activeItem) => {\r\n let itemLeft = activeItem.offsetLeft\r\n \r\n // 在 H5 环境下,使用更精确的位置计算\r\n if (isH5()) {\r\n const navStyle = window.getComputedStyle(navRef.value)\r\n const actualNavPaddingLeft = parseFloat(navStyle.paddingLeft) || 0\r\n \r\n // 如果位置差异超过容差,使用 getBoundingClientRect 重新计算\r\n if (Math.abs(itemLeft - actualNavPaddingLeft) > CONSTANTS.H5_POSITION_TOLERANCE) {\r\n const navRect = navRef.value.getBoundingClientRect()\r\n const itemRect = activeItem.getBoundingClientRect()\r\n itemLeft = itemRect.left - navRect.left\r\n }\r\n }\r\n \r\n return itemLeft\r\n }\r\n\r\n // 更新活动条位置\r\n const updateActiveBarPosition = (shouldScroll = true) => {\r\n nextTick(() => {\r\n // 提前退出条件检查\r\n if (!navRef.value || tabs.value.length === 0 || !activeTab.value) {\r\n resetActiveBarStyle()\r\n return\r\n }\r\n\r\n const activeIndex = tabs.value.findIndex(tab => tab.name === activeTab.value)\r\n if (activeIndex === -1) {\r\n resetActiveBarStyle()\r\n return\r\n }\r\n\r\n const navItems = navRef.value.querySelectorAll('.m-tabs__item')\r\n const activeItem = navItems[activeIndex]\r\n \r\n if (!activeItem) {\r\n resetActiveBarStyle()\r\n return\r\n }\r\n\r\n // 计算活动条位置\r\n const itemLeft = getActiveItemPosition(activeItem)\r\n const centerLeft = itemLeft + (activeItem.offsetWidth / 2) - CONSTANTS.ACTIVE_BAR_OFFSET\r\n\r\n activeBarStyle.value = {\r\n width: `${CONSTANTS.ACTIVE_BAR_WIDTH}px`,\r\n left: `${centerLeft}px`\r\n }\r\n\r\n // 滚动到活动tab可见区域(只在应该滚动时执行)\r\n if (shouldScroll) {\r\n scrollToActiveTab(activeItem)\r\n }\r\n })\r\n }\r\n\r\n // 滚动到活动tab\r\n const scrollToActiveTab = (activeItem) => {\r\n if (!headerRef.value || !activeItem) return\r\n\r\n const header = headerRef.value\r\n const headerWidth = header.clientWidth\r\n const headerScrollLeft = header.scrollLeft\r\n \r\n const itemLeft = activeItem.offsetLeft\r\n const itemWidth = activeItem.offsetWidth\r\n const itemRight = itemLeft + itemWidth\r\n\r\n if (isH5()) {\r\n // H5 环境:让标签中心对齐到可视区域中心\r\n const itemCenter = itemLeft + itemWidth / 2\r\n const navWidth = navRef.value.scrollWidth\r\n const maxScrollLeft = Math.max(0, navWidth - headerWidth)\r\n \r\n let targetScrollLeft = itemCenter - headerWidth / 2\r\n targetScrollLeft = Math.max(0, Math.min(targetScrollLeft, maxScrollLeft))\r\n \r\n // 检查是否需要滚动\r\n const itemVisibleLeft = itemLeft - headerScrollLeft\r\n const itemVisibleRight = itemRight - headerScrollLeft\r\n const isItemInView = itemVisibleLeft >= 0 && itemVisibleRight <= headerWidth\r\n \r\n const edgeThreshold = headerWidth * CONSTANTS.EDGE_THRESHOLD_RATIO\r\n const isInLeftEdge = itemVisibleLeft >= 0 && itemVisibleLeft < edgeThreshold\r\n const isInRightEdge = itemVisibleRight > headerWidth - edgeThreshold && itemVisibleRight <= headerWidth\r\n \r\n const shouldScroll = !isItemInView || isInLeftEdge || isInRightEdge\r\n const scrollDiff = Math.abs(headerScrollLeft - targetScrollLeft)\r\n \r\n if (shouldScroll && scrollDiff > CONSTANTS.SCROLL_MIN_DIFF) {\r\n header.scrollTo({ left: targetScrollLeft, behavior: 'smooth' })\r\n }\r\n } else {\r\n // 非H5环境:保持原有逻辑\r\n if (itemLeft < headerScrollLeft) {\r\n header.scrollTo({\r\n left: itemLeft - CONSTANTS.SCROLL_MARGIN,\r\n behavior: 'smooth'\r\n })\r\n } else if (itemRight > headerScrollLeft + headerWidth) {\r\n header.scrollTo({\r\n left: itemRight - headerWidth + CONSTANTS.SCROLL_MARGIN,\r\n behavior: 'smooth'\r\n })\r\n }\r\n }\r\n }\r\n\r\n // 处理tab点击\r\n const handleTabClick = (tabName) => {\r\n if (tabName === activeTab.value) return\r\n \r\n const oldValue = activeTab.value\r\n activeTab.value = tabName\r\n emit('update:modelValue', tabName)\r\n emit('tab-click', tabName)\r\n emit('tab-change', tabName, oldValue)\r\n updateActiveBarPosition()\r\n }\r\n\r\n // 处理tab关闭\r\n const handleTabRemove = (tabName) => {\r\n emit('tab-remove', tabName)\r\n emit('edit', tabName, 'remove')\r\n }\r\n\r\n // 处理tab添加\r\n const handleTabAdd = () => {\r\n emit('tab-add')\r\n emit('edit', null, 'add')\r\n }\r\n\r\n // 更新UI状态\r\n const updateUIState = () => {\r\n if (tabs.value.length > 0) {\r\n if (activeTab.value) {\r\n updateActiveBarPosition()\r\n }\r\n updateArrowVisibility()\r\n }\r\n }\r\n\r\n // 注册tab\r\n const registerTab = (tab) => {\r\n const index = tabs.value.findIndex(t => t.name === tab.name)\r\n \r\n if (index === -1) {\r\n tabs.value.push(tab)\r\n } else {\r\n tabs.value[index] = tab\r\n }\r\n \r\n // 延迟排序,等待DOM更新完成\r\n if (sortTimer) {\r\n clearTimeout(sortTimer)\r\n }\r\n \r\n sortTimer = setTimeout(() => {\r\n nextTick(() => {\r\n sortTabsByDOMOrder()\r\n updateUIState()\r\n })\r\n }, CONSTANTS.SORT_DELAY)\r\n }\r\n \r\n // 按照DOM顺序排序tabs\r\n const sortTabsByDOMOrder = () => {\r\n if (!contentRef.value || tabs.value.length === 0) return\r\n \r\n const paneElements = contentRef.value.querySelectorAll('.m-tab-pane')\r\n if (paneElements.length === 0 || paneElements.length !== tabs.value.length) return\r\n \r\n // 从DOM元素中读取data-name属性,获取DOM中的顺序\r\n const domOrder = []\r\n paneElements.forEach((el) => {\r\n const name = el.getAttribute('data-tab-name')\r\n if (name) {\r\n domOrder.push(name)\r\n }\r\n })\r\n \r\n if (domOrder.length === 0 || domOrder.length !== tabs.value.length) return\r\n \r\n // 检查当前顺序是否与DOM顺序一致\r\n const currentOrder = tabs.value.map(t => String(t.name))\r\n const isOrderSame = currentOrder.length === domOrder.length && \r\n currentOrder.every((name, index) => name === String(domOrder[index]))\r\n \r\n if (!isOrderSame) {\r\n // DOM顺序与tabs顺序不一致,按照DOM顺序重新排序\r\n const tabMap = new Map(tabs.value.map(t => [String(t.name), t]))\r\n const sortedTabs = []\r\n \r\n domOrder.forEach(name => {\r\n const tab = tabMap.get(String(name))\r\n if (tab) {\r\n sortedTabs.push(tab)\r\n }\r\n })\r\n \r\n // 确保所有tabs都被包含(处理新增的情况)\r\n tabs.value.forEach(tab => {\r\n if (!sortedTabs.find(t => t.name === tab.name)) {\r\n sortedTabs.push(tab)\r\n }\r\n })\r\n \r\n // 只有当数量一致时才更新\r\n if (sortedTabs.length === tabs.value.length) {\r\n tabs.value.splice(0, tabs.value.length, ...sortedTabs)\r\n updateActiveBarPosition()\r\n }\r\n }\r\n }\r\n \r\n \r\n\r\n // 注销tab\r\n const unregisterTab = (tabName) => {\r\n const index = tabs.value.findIndex(t => t.name === tabName)\r\n if (index > -1) {\r\n tabs.value.splice(index, 1)\r\n }\r\n }\r\n\r\n // 提供给子组件的方法\r\n provide('tabsContext', {\r\n activeTab,\r\n registerTab,\r\n unregisterTab,\r\n handleTabRemove,\r\n handleTabAdd\r\n })\r\n\r\n // 监听modelValue变化\r\n watch(() => props.modelValue, (newValue, oldValue) => {\r\n if (newValue !== activeTab.value) {\r\n activeTab.value = newValue\r\n emit('tab-change', newValue, oldValue)\r\n updateActiveBarPosition()\r\n }\r\n })\r\n\r\n // 检测tabs列表是否发生变化\r\n const detectTabsChange = (newTabs) => {\r\n if (previousTabsCount.value === 0) return false\r\n \r\n const newCount = newTabs.length\r\n const newNames = newTabs.map(t => String(t.name))\r\n \r\n const isCountChanged = newCount !== previousTabsCount.value\r\n const isOrderChanged = newCount === previousTabsCount.value && \r\n newNames.some((name, index) => \r\n index >= previousTabsNames.value.length || name !== previousTabsNames.value[index])\r\n \r\n return isCountChanged || isOrderChanged\r\n }\r\n\r\n // 处理tabs列表切换\r\n const handleTabsListChange = () => {\r\n internalKey.value++\r\n isResetting = true\r\n \r\n nextTick(() => {\r\n setTimeout(() => {\r\n sortTabsByDOMOrder()\r\n \r\n if (tabs.value.length > 0) {\r\n previousTabsCount.value = tabs.value.length\r\n previousTabsNames.value = tabs.value.map(t => String(t.name))\r\n updateUIState()\r\n }\r\n \r\n isResetting = false\r\n }, CONSTANTS.RESET_DELAY)\r\n })\r\n }\r\n\r\n // 监听tabs变化(用于更新UI和检测列表切换)\r\n watch(tabs, (newTabs) => {\r\n if (isResetting || newTabs.length === 0) return\r\n \r\n // 检测到列表切换时,强制重新渲染\r\n if (detectTabsChange(newTabs)) {\r\n handleTabsListChange()\r\n return\r\n }\r\n \r\n // 更新记录和UI\r\n previousTabsCount.value = newTabs.length\r\n previousTabsNames.value = newTabs.map(t => String(t.name))\r\n updateUIState()\r\n }, { deep: true })\r\n\r\n // 更新箭头可见性\r\n const updateArrowVisibility = () => {\r\n if (!headerRef.value || !navRef.value) return\r\n \r\n const header = headerRef.value\r\n const nav = navRef.value\r\n const currentScrollLeft = header.scrollLeft\r\n const scrollWidth = nav.scrollWidth\r\n const clientWidth = header.clientWidth\r\n \r\n // 检查是否需要显示箭头(内容宽度大于容器宽度)\r\n const needsScroll = scrollWidth > clientWidth\r\n \r\n if (!needsScroll) {\r\n showLeftArrow.value = false\r\n showRightArrow.value = false\r\n return\r\n }\r\n \r\n // 计算最大滚动距离和箭头可见性\r\n const maxScrollLeft = Math.max(0, scrollWidth - clientWidth)\r\n \r\n // 使用精度阈值处理浮点数精度问题\r\n showLeftArrow.value = currentScrollLeft > CONSTANTS.SCROLL_PRECISION\r\n showRightArrow.value = currentScrollLeft < maxScrollLeft - CONSTANTS.SCROLL_PRECISION\r\n }\r\n\r\n // 清理滚动相关的定时器\r\n const clearScrollTimers = () => {\r\n if (rafId) {\r\n cancelAnimationFrame(rafId)\r\n rafId = null\r\n }\r\n if (scrollTimeout) {\r\n clearTimeout(scrollTimeout)\r\n scrollTimeout = null\r\n }\r\n }\r\n\r\n // 滚动事件处理(防抖优化)\r\n const handleScroll = () => {\r\n updateArrowVisibility()\r\n \r\n // 非手动滚动时更新 activeBar 位置(但不自动滚动)\r\n if (!isManualScroll) {\r\n updateActiveBarPosition(false)\r\n }\r\n \r\n // 使用 requestAnimationFrame 优化更新\r\n clearScrollTimers()\r\n \r\n rafId = requestAnimationFrame(() => {\r\n updateArrowVisibility()\r\n rafId = null\r\n })\r\n \r\n // 滚动停止后再次检查\r\n scrollTimeout = setTimeout(() => {\r\n updateArrowVisibility()\r\n if (isManualScroll) {\r\n isManualScroll = false\r\n }\r\n scrollTimeout = null\r\n }, CONSTANTS.SCROLL_DEBOUNCE)\r\n }\r\n\r\n // 执行滚动动画\r\n const performScroll = (direction) => {\r\n if (!headerRef.value) return\r\n \r\n isManualScroll = true\r\n const scrollAmount = headerRef.value.clientWidth * CONSTANTS.SCROLL_RATIO\r\n headerRef.value.scrollBy({\r\n left: direction === 'left' ? -scrollAmount : scrollAmount,\r\n behavior: 'smooth'\r\n })\r\n \r\n // 滚动完成后更新状态\r\n setTimeout(() => {\r\n updateArrowVisibility()\r\n isManualScroll = false\r\n }, CONSTANTS.SCROLL_ANIMATION)\r\n }\r\n\r\n // 向左滚动\r\n const handleScrollLeft = () => {\r\n performScroll('left')\r\n }\r\n\r\n // 向右滚动\r\n const handleScrollRight = () => {\r\n performScroll('right')\r\n }\r\n\r\n // 初始化默认active tab\r\n const initDefaultActiveTab = () => {\r\n if (!activeTab.value && tabs.value.length > 0) {\r\n const firstTab = tabs.value[0]\r\n activeTab.value = firstTab.name\r\n emit('update:modelValue', activeTab.value)\r\n }\r\n }\r\n\r\n // 初始化时设置默认active tab\r\n onMounted(() => {\r\n // 初始化记录\r\n previousTabsCount.value = tabs.value.length\r\n previousTabsNames.value = tabs.value.map(t => String(t.name))\r\n \r\n initDefaultActiveTab()\r\n updateActiveBarPosition()\r\n \r\n // 延迟更新,确保样式完全应用(特别是 H5 样式)\r\n setTimeout(() => {\r\n updateActiveBarPosition()\r\n }, CONSTANTS.INIT_DELAY)\r\n \r\n // 使用 requestAnimationFrame 确保在样式渲染后更新\r\n requestAnimationFrame(() => {\r\n setTimeout(() => {\r\n updateActiveBarPosition()\r\n }, CONSTANTS.INIT_DELAY)\r\n })\r\n \r\n // 初始化箭头可见性\r\n nextTick(() => {\r\n updateArrowVisibility()\r\n })\r\n \r\n // 监听窗口大小变化和tabs变化\r\n if (headerRef.value && navRef.value) {\r\n resizeObserver = new ResizeObserver(() => {\r\n updateArrowVisibility()\r\n updateActiveBarPosition(false)\r\n })\r\n resizeObserver.observe(headerRef.value)\r\n resizeObserver.observe(navRef.value)\r\n }\r\n })\r\n\r\n // 清理所有定时器和观察器\r\n onUnmounted(() => {\r\n if (sortTimer) {\r\n clearTimeout(sortTimer)\r\n sortTimer = null\r\n }\r\n \r\n clearScrollTimers()\r\n \r\n if (resizeObserver) {\r\n resizeObserver.disconnect()\r\n resizeObserver = null\r\n }\r\n })\r\n\r\n return {\r\n navRef,\r\n headerRef,\r\n contentRef,\r\n tabs,\r\n activeTab,\r\n activeBarStyle,\r\n showLeftArrow,\r\n showRightArrow,\r\n internalKey,\r\n handleTabClick,\r\n handleTabRemove,\r\n handleTabAdd,\r\n registerTab,\r\n unregisterTab,\r\n updateActiveBarPosition,\r\n updateArrowVisibility,\r\n handleScroll,\r\n handleScrollLeft,\r\n handleScrollRight\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.m-tabs {\r\n &__header-wrapper {\r\n position: relative;\r\n display: flex;\r\n align-items: stretch;\r\n border-bottom: 1px solid var(--border-primary);\r\n }\r\n\r\n &__header {\r\n flex: 1;\r\n position: relative;\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n \r\n // 完全隐藏滚动条(但保持滚动功能)\r\n scrollbar-width: none; // Firefox\r\n -ms-overflow-style: none; // IE 和 Edge\r\n \r\n &::-webkit-scrollbar {\r\n display: none; // Chrome, Safari, Opera\r\n }\r\n\r\n // 使用 CSS transition 实现平滑滚动\r\n scroll-behavior: smooth;\r\n }\r\n\r\n &__nav {\r\n position: relative;\r\n display: inline-flex;\r\n white-space: nowrap;\r\n padding: 0 16px;\r\n }\r\n\r\n &__item {\r\n position: relative;\r\n height: 24px;\r\n margin-right: 20px;\r\n margin-bottom: 6px;\r\n cursor: pointer;\r\n color: var(--text-tertiary);\r\n font-size: var(--font-size-text-base);\r\n transition: color 0.3s;\r\n user-select: none;\r\n font-weight: 600;\r\n\r\n &:hover {\r\n color: var(--text-brand);\r\n }\r\n\r\n &.is-active {\r\n color: var(--text-brand);\r\n }\r\n\r\n &:last-child {\r\n margin-right: 0;\r\n }\r\n }\r\n\r\n &__active-bar {\r\n position: absolute;\r\n bottom: 0;\r\n height: 3px;\r\n background-color: var(--text-brand);\r\n transition: all 0.3s;\r\n z-index: 1;\r\n }\r\n\r\n &__arrow {\r\n flex-shrink: 0;\r\n width: 32px;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: none;\r\n cursor: pointer;\r\n color: var(--text-primary);\r\n font-size: 24px;\r\n transition: opacity 0.3s, background-color 0.3s;\r\n user-select: none;\r\n z-index: 1;\r\n\r\n &:hover {\r\n opacity: 0.8;\r\n background-color: var(--bg-secondary);\r\n }\r\n\r\n &:active {\r\n opacity: 0.6;\r\n }\r\n }\r\n\r\n // solid 样式\r\n &.style-solid {\r\n .m-tabs__nav {\r\n border-bottom: none;\r\n background-color: var(--bg-tertiary-hover);\r\n border-radius: 8px;\r\n padding: 4px;\r\n }\r\n\r\n .m-tabs__item {\r\n height: 32px;\r\n margin-right: 0;\r\n margin-bottom: 0;\r\n padding: 0 16px;\r\n border-radius: 6px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: transparent;\r\n transition: all 0.3s;\r\n\r\n &:hover {\r\n background-color: rgba(0, 0, 0, 0.05);\r\n }\r\n\r\n &.is-active {\r\n background-color: var(--bg-primary);\r\n color: var(--text-primary);\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n }\r\n }\r\n }\r\n}\r\n\r\n.mc-h5{\r\n .m-tabs{\r\n .m-tabs__item {\r\n font-size: var(--font-size-text-sm);\r\n margin-right: 16px;\r\n \r\n // 移动端禁用 hover 效果\r\n &:hover {\r\n color: var(--text-tertiary);\r\n }\r\n \r\n &.is-active:hover {\r\n color: var(--text-brand);\r\n }\r\n }\r\n .m-tabs__nav {\r\n padding:0 10px;\r\n }\r\n // 移动端隐藏箭头按钮\r\n .m-tabs__arrow {\r\n display: none;\r\n }\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <div\r\n v-show=\"isActive\"\r\n class=\"m-tab-pane\"\r\n :class=\"{ 'is-active': isActive }\"\r\n :data-tab-name=\"tabName\"\r\n >\r\n <slot></slot>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { inject, computed, onMounted, onUnmounted, watch, nextTick } from 'vue'\r\n\r\nexport default {\r\n name: 'MTabPane',\r\n props: {\r\n label: {\r\n type: String,\r\n required: true\r\n },\r\n name: {\r\n type: [String, Number],\r\n default: ''\r\n },\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n closable: {\r\n type: Boolean,\r\n default: false\r\n }\r\n },\r\n setup(props) {\r\n const tabsContext = inject('tabsContext')\r\n \r\n // 计算tab名称,如果没有提供name则使用label\r\n const tabName = computed(() => {\r\n return props.name || props.label\r\n })\r\n\r\n // 计算是否激活\r\n const isActive = computed(() => {\r\n return tabsContext.activeTab.value === tabName.value\r\n })\r\n\r\n // 注册tab的函数\r\n const doRegisterTab = () => {\r\n const tabInfo = {\r\n label: props.label,\r\n name: tabName.value,\r\n disabled: props.disabled,\r\n closable: props.closable\r\n }\r\n tabsContext.registerTab(tabInfo)\r\n }\r\n \r\n // 组件挂载时注册tab\r\n onMounted(() => {\r\n doRegisterTab()\r\n })\r\n\r\n // 监听props变化,立即更新tab信息并重新排序(不使用防抖,确保立即响应)\r\n watch(() => [props.label, props.name, props.disabled, props.closable], (newVal, oldVal) => {\r\n // 只在首次渲染后或值真正改变时触发\r\n if (!oldVal || newVal[0] !== oldVal[0] || newVal[1] !== oldVal[1] || \r\n newVal[2] !== oldVal[2] || newVal[3] !== oldVal[3]) {\r\n // 立即注册,不使用防抖,确保顺序正确\r\n doRegisterTab()\r\n }\r\n }, { immediate: false })\r\n\r\n // 组件卸载时注销tab\r\n onUnmounted(() => {\r\n tabsContext.unregisterTab(tabName.value)\r\n })\r\n\r\n return {\r\n isActive,\r\n tabName\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.m-tab-pane {\r\n display: none;\r\n\r\n &.is-active {\r\n display: block;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <div\r\n :class=\"[\r\n 'm-tab-card-item',\r\n { \r\n 'is-active': isActive,\r\n 'is-disabled': disabled\r\n }\r\n ]\"\r\n @click=\"handleClick\"\r\n >\r\n <span class=\"m-tab-card-item__text\">\r\n <slot>{{ label }}</slot>\r\n </span>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { inject, computed } from 'vue'\r\n\r\ndefineOptions({\r\n name: \"MTabCardItem\",\r\n})\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n label: {\r\n type: String,\r\n default: ''\r\n },\r\n name: {\r\n type: [String, Number],\r\n required: true\r\n },\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n }\r\n})\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['click'])\r\n\r\n// 注入父组件上下文\r\nconst tabCardContext = inject('tabCardContext')\r\n\r\n// 计算是否激活\r\nconst isActive = computed(() => {\r\n return tabCardContext.activeTab.value === props.name\r\n})\r\n\r\n// 处理点击\r\nconst handleClick = () => {\r\n if (props.disabled) {\r\n return\r\n }\r\n \r\n tabCardContext.handleTabClick(props.name, props.disabled)\r\n emit('click', props.name)\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.m-tab-card-item {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 32px;\r\n border-radius: var(--md);\r\n cursor: pointer;\r\n // transition: all 0.3s ease;\r\n user-select: none;\r\n background-color: transparent;\r\n padding: 0 36px;\r\n text-align: center;\r\n z-index: 1;\r\n\r\n // &:hover:not(.is-disabled):not(.is-active) {\r\n // background-color: rgba(255, 255, 255, 0.05);\r\n // }\r\n\r\n &.is-active {\r\n background-color: var(--bg-brand, #ffd700);\r\n color: var(--text-quaternary);\r\n font-weight: 600;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n }\r\n\r\n &.is-disabled {\r\n cursor: not-allowed;\r\n opacity: 0.5;\r\n }\r\n\r\n &:not(.is-active) {\r\n color: var(--text-secondary, #ffffff);\r\n }\r\n\r\n &__text {\r\n font-size: 14px;\r\n line-height: 1.4;\r\n white-space: nowrap;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <div class=\"m-tab-card\" :class=\"{ 'is-disabled': disabled }\">\r\n <div class=\"m-tab-card__container\">\r\n <m-tab-card-item\r\n v-for=\"(tab, index) in tabs\"\r\n :key=\"tab.name\"\r\n :name=\"tab.name\"\r\n :label=\"tab.label\"\r\n :disabled=\"tab.disabled\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, computed, watch, provide } from 'vue'\r\nimport { useClassName } from \"@packages/hooks/useClassName.js\"\r\nimport MTabCardItem from './TabCardItem.vue'\r\n\r\ndefineOptions({\r\n name: \"MTabCard\",\r\n})\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n modelValue: {\r\n type: [String, Number],\r\n default: ''\r\n },\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n options: {\r\n type: Array,\r\n default: () => []\r\n }\r\n})\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['update:modelValue', 'change', 'tab-click'])\r\n\r\n// 使用类名 Hook\r\nconst { mergedAttrs } = useClassName()\r\n\r\n// 内部状态\r\nconst activeTab = ref(props.modelValue)\r\n\r\n// 计算 tabs 数据\r\nconst tabs = computed(() => {\r\n return props.options.map(option => {\r\n if (typeof option === 'string') {\r\n return { label: option, name: option, disabled: false }\r\n }\r\n return {\r\n label: option.label || option.name || '',\r\n name: option.name || option.label || '',\r\n disabled: option.disabled || false\r\n }\r\n })\r\n})\r\n\r\n// 处理 tab 点击\r\nconst handleTabClick = (tabName, isDisabled) => {\r\n if (isDisabled || props.disabled || tabName === activeTab.value) {\r\n return\r\n }\r\n \r\n const oldValue = activeTab.value\r\n activeTab.value = tabName\r\n emit('update:modelValue', tabName)\r\n emit('change', tabName, oldValue)\r\n emit('tab-click', tabName)\r\n}\r\n\r\n// 监听 modelValue 变化\r\nwatch(() => props.modelValue, (newValue) => {\r\n if (newValue !== activeTab.value) {\r\n activeTab.value = newValue\r\n }\r\n})\r\n\r\n// 提供给子组件的方法\r\nprovide('tabCardContext', {\r\n activeTab,\r\n handleTabClick\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.m-tab-card {\r\n display: inline-block;\r\n \r\n &.is-disabled {\r\n pointer-events: none;\r\n opacity: 0.6;\r\n }\r\n\r\n &__container {\r\n display: flex;\r\n background-color: var(--bg-tertiary-hover, #2a2a2a);\r\n border-radius: var(--md);\r\n padding: 4px;\r\n gap: 0;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <svg \r\n class=\"breadcrumb-separator-icon\"\r\n width=\"6\" \r\n height=\"10\" \r\n viewBox=\"0 0 6 10\" \r\n fill=\"none\" \r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path \r\n fill-rule=\"evenodd\" \r\n clip-rule=\"evenodd\" \r\n d=\"M0.52827 0.529247C0.788619 0.268897 1.21073 0.268897 1.47108 0.529247L5.47108 4.52925C5.73143 4.7896 5.73143 5.21171 5.47108 5.47206L1.47108 9.47206C1.21073 9.73241 0.788619 9.73241 0.52827 9.47206C0.26792 9.21171 0.26792 8.7896 0.52827 8.52925L4.05687 5.00065L0.52827 1.47206C0.26792 1.21171 0.26792 0.789596 0.52827 0.529247Z\" \r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n name: \"BreadcrumbSeparator\",\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.breadcrumb-separator-icon {\r\n display: inline-block;\r\n vertical-align: middle;\r\n}\r\n</style>\r\n\r\n","<template>\r\n <nav class=\"m-breadcrumb\" aria-label=\"Breadcrumb\">\r\n <template v-for=\"(item, index) in items\" :key=\"index\">\r\n <span\r\n :class=\"['m-breadcrumb__item', { 'is-link': item.to }]\"\r\n @click=\"handleItemClick(item)\"\r\n >\r\n {{ item.label }}\r\n </span>\r\n <BreadcrumbSeparator \r\n v-if=\"index < items.length - 1\"\r\n class=\"m-breadcrumb__separator\"\r\n />\r\n </template>\r\n </nav>\r\n</template>\r\n\r\n<script setup>\r\nimport BreadcrumbSeparator from './BreadcrumbSeparator.vue'\r\n\r\ndefineOptions({\r\n name: \"MBreadcrumb\",\r\n})\r\n\r\nconst props = defineProps({\r\n items: {\r\n type: Array,\r\n default: () => [],\r\n validator: (items) => {\r\n return items.every(item => \r\n typeof item === 'object' && \r\n item.label !== undefined\r\n )\r\n }\r\n }\r\n})\r\n\r\nconst emit = defineEmits(['click'])\r\n\r\nconst handleItemClick = (item) => {\r\n if (!item.to) return\r\n \r\n emit('click', item)\r\n \r\n // 处理路由跳转\r\n if (typeof item.to === 'string') {\r\n if (item.to.startsWith('http://') || item.to.startsWith('https://')) {\r\n window.location.href = item.to\r\n } else {\r\n if (item.replace) {\r\n window.history.replaceState({}, '', item.to)\r\n } else {\r\n window.history.pushState({}, '', item.to)\r\n }\r\n window.dispatchEvent(new PopStateEvent('popstate'))\r\n }\r\n } else if (typeof item.to === 'object' && item.to.path) {\r\n const path = item.to.path\r\n if (item.replace) {\r\n window.history.replaceState({}, '', path)\r\n } else {\r\n window.history.pushState({}, '', path)\r\n }\r\n window.dispatchEvent(new PopStateEvent('popstate'))\r\n }\r\n}\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.m-breadcrumb {\r\n display: inline-flex;\r\n align-items: center;\r\n font-size: 14px;\r\n line-height: 20px;\r\n height: 20px;\r\n \r\n &__item {\r\n color: var(--text-secondary, #909399);\r\n transition: color 0.2s;\r\n white-space: nowrap;\r\n line-height: 20px;\r\n height: 20px;\r\n display: inline-flex;\r\n align-items: center;\r\n \r\n &.is-link {\r\n color: var(--text-tertiary);\r\n cursor: pointer;\r\n font-weight: 500;\r\n \r\n &:hover {\r\n color: var(--text-primary, #ffd700);\r\n }\r\n }\r\n \r\n &:last-child {\r\n color: var(--text-primary, #c0c4cc);\r\n cursor: default;\r\n font-weight: normal;\r\n }\r\n }\r\n \r\n &__separator {\r\n margin: 0 8px;\r\n color: var(--text-tertiary, #c0c4cc);\r\n flex-shrink: 0;\r\n display: inline-flex;\r\n align-items: center;\r\n height: 20px;\r\n }\r\n}\r\n</style>\r\n\r\n","function noop() {\n}\nconst extend = Object.assign;\nconst inBrowser = typeof window !== \"undefined\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isDef = (val) => val !== void 0 && val !== null;\nconst isFunction = (val) => typeof val === \"function\";\nconst isPromise = (val) => isObject(val) && isFunction(val.then) && isFunction(val.catch);\nconst isDate = (val) => Object.prototype.toString.call(val) === \"[object Date]\" && !Number.isNaN(val.getTime());\nfunction isMobile(value) {\n value = value.replace(/[^-|\\d]/g, \"\");\n return /^((\\+86)|(86))?(1)\\d{10}$/.test(value) || /^0[0-9-]{10,13}$/.test(value);\n}\nconst isNumeric = (val) => typeof val === \"number\" || /^\\d+(\\.\\d+)?$/.test(val);\nconst isIOS = () => inBrowser ? /ios|iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase()) : false;\nfunction get(object, path) {\n const keys = path.split(\".\");\n let result = object;\n keys.forEach((key) => {\n var _a;\n result = isObject(result) ? (_a = result[key]) != null ? _a : \"\" : \"\";\n });\n return result;\n}\nfunction pick(obj, keys, ignoreUndefined) {\n return keys.reduce(\n (ret, key) => {\n if (!ignoreUndefined || obj[key] !== void 0) {\n ret[key] = obj[key];\n }\n return ret;\n },\n {}\n );\n}\nconst isSameValue = (newValue, oldValue) => JSON.stringify(newValue) === JSON.stringify(oldValue);\nconst toArray = (item) => Array.isArray(item) ? item : [item];\nconst flat = (arr) => arr.reduce((acc, val) => acc.concat(val), []);\nexport {\n extend,\n flat,\n get,\n inBrowser,\n isDate,\n isDef,\n isFunction,\n isIOS,\n isMobile,\n isNumeric,\n isObject,\n isPromise,\n isSameValue,\n noop,\n pick,\n toArray\n};\n","const unknownProp = null;\nconst numericProp = [Number, String];\nconst truthProp = {\n type: Boolean,\n default: true\n};\nconst makeRequiredProp = (type) => ({\n type,\n required: true\n});\nconst makeArrayProp = () => ({\n type: Array,\n default: () => []\n});\nconst makeNumberProp = (defaultVal) => ({\n type: Number,\n default: defaultVal\n});\nconst makeNumericProp = (defaultVal) => ({\n type: numericProp,\n default: defaultVal\n});\nconst makeStringProp = (defaultVal) => ({\n type: String,\n default: defaultVal\n});\nexport {\n makeArrayProp,\n makeNumberProp,\n makeNumericProp,\n makeRequiredProp,\n makeStringProp,\n numericProp,\n truthProp,\n unknownProp\n};\n","// src/utils.ts\nvar inBrowser = typeof window !== \"undefined\";\nvar supportsPassive = true;\nfunction raf(fn) {\n return inBrowser ? requestAnimationFrame(fn) : -1;\n}\nfunction cancelRaf(id) {\n if (inBrowser) {\n cancelAnimationFrame(id);\n }\n}\nfunction doubleRaf(fn) {\n raf(() => raf(fn));\n}\n\n// src/useRect/index.ts\nimport { unref } from \"vue\";\nvar isWindow = (val) => val === window;\nvar makeDOMRect = (width2, height2) => ({\n top: 0,\n left: 0,\n right: width2,\n bottom: height2,\n width: width2,\n height: height2\n});\nvar useRect = (elementOrRef) => {\n const element = unref(elementOrRef);\n if (isWindow(element)) {\n const width2 = element.innerWidth;\n const height2 = element.innerHeight;\n return makeDOMRect(width2, height2);\n }\n if (element == null ? void 0 : element.getBoundingClientRect) {\n return element.getBoundingClientRect();\n }\n return makeDOMRect(0, 0);\n};\n\n// src/useToggle/index.ts\nimport { ref } from \"vue\";\nfunction useToggle(defaultValue = false) {\n const state = ref(defaultValue);\n const toggle = (value = !state.value) => {\n state.value = value;\n };\n return [state, toggle];\n}\n\n// src/useRelation/useParent.ts\nimport {\n ref as ref2,\n inject,\n computed,\n onUnmounted,\n getCurrentInstance\n} from \"vue\";\nfunction useParent(key) {\n const parent = inject(key, null);\n if (parent) {\n const instance = getCurrentInstance();\n const { link, unlink, internalChildren } = parent;\n link(instance);\n onUnmounted(() => unlink(instance));\n const index = computed(() => internalChildren.indexOf(instance));\n return {\n parent,\n index\n };\n }\n return {\n parent: null,\n index: ref2(-1)\n };\n}\n\n// src/useRelation/useChildren.ts\nimport {\n isVNode,\n provide,\n reactive,\n getCurrentInstance as getCurrentInstance2\n} from \"vue\";\nfunction flattenVNodes(children) {\n const result = [];\n const traverse = (children2) => {\n if (Array.isArray(children2)) {\n children2.forEach((child) => {\n var _a;\n if (isVNode(child)) {\n result.push(child);\n if ((_a = child.component) == null ? void 0 : _a.subTree) {\n result.push(child.component.subTree);\n traverse(child.component.subTree.children);\n }\n if (child.children) {\n traverse(child.children);\n }\n }\n });\n }\n };\n traverse(children);\n return result;\n}\nvar findVNodeIndex = (vnodes, vnode) => {\n const index = vnodes.indexOf(vnode);\n if (index === -1) {\n return vnodes.findIndex(\n (item) => vnode.key !== void 0 && vnode.key !== null && item.type === vnode.type && item.key === vnode.key\n );\n }\n return index;\n};\nfunction sortChildren(parent, publicChildren, internalChildren) {\n const vnodes = flattenVNodes(parent.subTree.children);\n internalChildren.sort(\n (a, b) => findVNodeIndex(vnodes, a.vnode) - findVNodeIndex(vnodes, b.vnode)\n );\n const orderedPublicChildren = internalChildren.map((item) => item.proxy);\n publicChildren.sort((a, b) => {\n const indexA = orderedPublicChildren.indexOf(a);\n const indexB = orderedPublicChildren.indexOf(b);\n return indexA - indexB;\n });\n}\nfunction useChildren(key) {\n const publicChildren = reactive([]);\n const internalChildren = reactive([]);\n const parent = getCurrentInstance2();\n const linkChildren = (value) => {\n const link = (child) => {\n if (child.proxy) {\n internalChildren.push(child);\n publicChildren.push(child.proxy);\n sortChildren(parent, publicChildren, internalChildren);\n }\n };\n const unlink = (child) => {\n const index = internalChildren.indexOf(child);\n publicChildren.splice(index, 1);\n internalChildren.splice(index, 1);\n };\n provide(\n key,\n Object.assign(\n {\n link,\n unlink,\n children: publicChildren,\n internalChildren\n },\n value\n )\n );\n };\n return {\n children: publicChildren,\n linkChildren\n };\n}\n\n// src/useCountDown/index.ts\nimport {\n ref as ref3,\n computed as computed2,\n onActivated,\n onDeactivated,\n onBeforeUnmount\n} from \"vue\";\nvar SECOND = 1e3;\nvar MINUTE = 60 * SECOND;\nvar HOUR = 60 * MINUTE;\nvar DAY = 24 * HOUR;\nfunction parseTime(time) {\n const days = Math.floor(time / DAY);\n const hours = Math.floor(time % DAY / HOUR);\n const minutes = Math.floor(time % HOUR / MINUTE);\n const seconds = Math.floor(time % MINUTE / SECOND);\n const milliseconds = Math.floor(time % SECOND);\n return {\n total: time,\n days,\n hours,\n minutes,\n seconds,\n milliseconds\n };\n}\nfunction isSameSecond(time1, time2) {\n return Math.floor(time1 / 1e3) === Math.floor(time2 / 1e3);\n}\nfunction useCountDown(options) {\n let rafId;\n let endTime;\n let counting;\n let deactivated;\n const remain = ref3(options.time);\n const current = computed2(() => parseTime(remain.value));\n const pause = () => {\n counting = false;\n cancelRaf(rafId);\n };\n const getCurrentRemain = () => Math.max(endTime - Date.now(), 0);\n const setRemain = (value) => {\n var _a, _b;\n remain.value = value;\n (_a = options.onChange) == null ? void 0 : _a.call(options, current.value);\n if (value === 0) {\n pause();\n (_b = options.onFinish) == null ? void 0 : _b.call(options);\n }\n };\n const microTick = () => {\n rafId = raf(() => {\n if (counting) {\n setRemain(getCurrentRemain());\n if (remain.value > 0) {\n microTick();\n }\n }\n });\n };\n const macroTick = () => {\n rafId = raf(() => {\n if (counting) {\n const remainRemain = getCurrentRemain();\n if (!isSameSecond(remainRemain, remain.value) || remainRemain === 0) {\n setRemain(remainRemain);\n }\n if (remain.value > 0) {\n macroTick();\n }\n }\n });\n };\n const tick = () => {\n if (!inBrowser) {\n return;\n }\n if (options.millisecond) {\n microTick();\n } else {\n macroTick();\n }\n };\n const start = () => {\n if (!counting) {\n endTime = Date.now() + remain.value;\n counting = true;\n tick();\n }\n };\n const reset = (totalTime = options.time) => {\n pause();\n remain.value = totalTime;\n };\n onBeforeUnmount(pause);\n onActivated(() => {\n if (deactivated) {\n counting = true;\n deactivated = false;\n tick();\n }\n });\n onDeactivated(() => {\n if (counting) {\n pause();\n deactivated = true;\n }\n });\n return {\n start,\n pause,\n reset,\n current\n };\n}\n\n// src/useClickAway/index.ts\nimport { unref as unref3 } from \"vue\";\n\n// src/useEventListener/index.ts\nimport {\n watch,\n isRef,\n unref as unref2,\n onUnmounted as onUnmounted2,\n onDeactivated as onDeactivated2\n} from \"vue\";\n\n// src/onMountedOrActivated/index.ts\nimport { nextTick, onMounted, onActivated as onActivated2 } from \"vue\";\nfunction onMountedOrActivated(hook) {\n let mounted;\n onMounted(() => {\n hook();\n nextTick(() => {\n mounted = true;\n });\n });\n onActivated2(() => {\n if (mounted) {\n hook();\n }\n });\n}\n\n// src/useEventListener/index.ts\nfunction useEventListener(type, listener, options = {}) {\n if (!inBrowser) {\n return;\n }\n const { target = window, passive = false, capture = false } = options;\n let cleaned = false;\n let attached;\n const add = (target2) => {\n if (cleaned) {\n return;\n }\n const element = unref2(target2);\n if (element && !attached) {\n element.addEventListener(type, listener, {\n capture,\n passive\n });\n attached = true;\n }\n };\n const remove = (target2) => {\n if (cleaned) {\n return;\n }\n const element = unref2(target2);\n if (element && attached) {\n element.removeEventListener(type, listener, capture);\n attached = false;\n }\n };\n onUnmounted2(() => remove(target));\n onDeactivated2(() => remove(target));\n onMountedOrActivated(() => add(target));\n let stopWatch;\n if (isRef(target)) {\n stopWatch = watch(target, (val, oldVal) => {\n remove(oldVal);\n add(val);\n });\n }\n return () => {\n stopWatch == null ? void 0 : stopWatch();\n remove(target);\n cleaned = true;\n };\n}\n\n// src/useClickAway/index.ts\nfunction useClickAway(target, listener, options = {}) {\n if (!inBrowser) {\n return;\n }\n const { eventName = \"click\" } = options;\n const onClick = (event) => {\n const targets = Array.isArray(target) ? target : [target];\n const isClickAway = targets.every((item) => {\n const element = unref3(item);\n return element && !element.contains(event.target);\n });\n if (isClickAway) {\n listener(event);\n }\n };\n useEventListener(eventName, onClick, { target: document });\n}\n\n// src/useWindowSize/index.ts\nimport { ref as ref4 } from \"vue\";\nvar width;\nvar height;\nfunction useWindowSize() {\n if (!width) {\n width = ref4(0);\n height = ref4(0);\n if (inBrowser) {\n const update = () => {\n width.value = window.innerWidth;\n height.value = window.innerHeight;\n };\n update();\n window.addEventListener(\"resize\", update, { passive: true });\n window.addEventListener(\"orientationchange\", update, { passive: true });\n }\n }\n return { width, height };\n}\n\n// src/useScrollParent/index.ts\nimport { ref as ref5, onMounted as onMounted2 } from \"vue\";\nvar overflowScrollReg = /scroll|auto|overlay/i;\nvar defaultRoot = inBrowser ? window : void 0;\nfunction isElement(node) {\n const ELEMENT_NODE_TYPE = 1;\n return node.tagName !== \"HTML\" && node.tagName !== \"BODY\" && node.nodeType === ELEMENT_NODE_TYPE;\n}\nfunction getScrollParent(el, root = defaultRoot) {\n let node = el;\n while (node && node !== root && isElement(node)) {\n const { overflowY } = window.getComputedStyle(node);\n if (overflowScrollReg.test(overflowY)) {\n return node;\n }\n node = node.parentNode;\n }\n return root;\n}\nfunction useScrollParent(el, root = defaultRoot) {\n const scrollParent = ref5();\n onMounted2(() => {\n if (el.value) {\n scrollParent.value = getScrollParent(el.value, root);\n }\n });\n return scrollParent;\n}\n\n// src/usePageVisibility/index.ts\nimport { ref as ref6 } from \"vue\";\nvar visibility;\nfunction usePageVisibility() {\n if (!visibility) {\n visibility = ref6(\"visible\");\n if (inBrowser) {\n const update = () => {\n visibility.value = document.hidden ? \"hidden\" : \"visible\";\n };\n update();\n window.addEventListener(\"visibilitychange\", update);\n }\n }\n return visibility;\n}\n\n// src/useCustomFieldValue/index.ts\nimport { watch as watch2, inject as inject2 } from \"vue\";\nvar CUSTOM_FIELD_INJECTION_KEY = Symbol(\"van-field\");\nfunction useCustomFieldValue(customValue) {\n const field = inject2(CUSTOM_FIELD_INJECTION_KEY, null);\n if (field && !field.customValue.value) {\n field.customValue.value = customValue;\n watch2(customValue, () => {\n field.resetValidation();\n field.validateWithTrigger(\"onChange\");\n });\n }\n}\n\n// src/useRaf/index.ts\nfunction useRaf(fn, options) {\n if (inBrowser) {\n const { interval = 0, isLoop = false } = options || {};\n let start;\n let isStopped = false;\n let rafId;\n const stop = () => {\n isStopped = true;\n cancelAnimationFrame(rafId);\n };\n const frameWrapper = (timestamp) => {\n if (isStopped)\n return;\n if (start === void 0) {\n start = timestamp;\n } else if (timestamp - start > interval) {\n fn(timestamp);\n start = timestamp;\n if (!isLoop) {\n stop();\n return;\n }\n }\n rafId = requestAnimationFrame(frameWrapper);\n };\n rafId = requestAnimationFrame(frameWrapper);\n return stop;\n }\n return () => {\n };\n}\nexport {\n CUSTOM_FIELD_INJECTION_KEY,\n cancelRaf,\n doubleRaf,\n flattenVNodes,\n getScrollParent,\n inBrowser,\n onMountedOrActivated,\n raf,\n sortChildren,\n supportsPassive,\n useChildren,\n useClickAway,\n useCountDown,\n useCustomFieldValue,\n useEventListener,\n usePageVisibility,\n useParent,\n useRaf,\n useRect,\n useScrollParent,\n useToggle,\n useWindowSize\n};\n","import { useRect, useWindowSize } from \"@vant/use\";\nimport { unref } from \"vue\";\nimport { isIOS as checkIsIOS } from \"./basic.mjs\";\nfunction getScrollTop(el) {\n const top = \"scrollTop\" in el ? el.scrollTop : el.pageYOffset;\n return Math.max(top, 0);\n}\nfunction setScrollTop(el, value) {\n if (\"scrollTop\" in el) {\n el.scrollTop = value;\n } else {\n el.scrollTo(el.scrollX, value);\n }\n}\nfunction getRootScrollTop() {\n return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n}\nfunction setRootScrollTop(value) {\n setScrollTop(window, value);\n setScrollTop(document.body, value);\n}\nfunction getElementTop(el, scroller) {\n if (el === window) {\n return 0;\n }\n const scrollTop = scroller ? getScrollTop(scroller) : getRootScrollTop();\n return useRect(el).top + scrollTop;\n}\nconst isIOS = checkIsIOS();\nfunction resetScroll() {\n if (isIOS) {\n setRootScrollTop(getRootScrollTop());\n }\n}\nconst stopPropagation = (event) => event.stopPropagation();\nfunction preventDefault(event, isStopPropagation) {\n if (typeof event.cancelable !== \"boolean\" || event.cancelable) {\n event.preventDefault();\n }\n if (isStopPropagation) {\n stopPropagation(event);\n }\n}\nfunction isHidden(elementRef) {\n const el = unref(elementRef);\n if (!el) {\n return false;\n }\n const style = window.getComputedStyle(el);\n const hidden = style.display === \"none\";\n const parentHidden = el.offsetParent === null && style.position !== \"fixed\";\n return hidden || parentHidden;\n}\nconst { width: windowWidth, height: windowHeight } = useWindowSize();\nfunction isContainingBlock(el) {\n const css = window.getComputedStyle(el);\n return css.transform !== \"none\" || css.perspective !== \"none\" || [\"transform\", \"perspective\", \"filter\"].some(\n (value) => (css.willChange || \"\").includes(value)\n );\n}\nfunction getContainingBlock(el) {\n let node = el.parentElement;\n while (node) {\n if (node && node.tagName !== \"HTML\" && node.tagName !== \"BODY\" && isContainingBlock(node)) {\n return node;\n }\n node = node.parentElement;\n }\n return null;\n}\nexport {\n getContainingBlock,\n getElementTop,\n getRootScrollTop,\n getScrollTop,\n isHidden,\n preventDefault,\n resetScroll,\n setRootScrollTop,\n setScrollTop,\n stopPropagation,\n windowHeight,\n windowWidth\n};\n","import { inBrowser } from \"./basic.mjs\";\nimport { windowWidth, windowHeight } from \"./dom.mjs\";\nimport { isDef, isNumeric } from \"./basic.mjs\";\nfunction addUnit(value) {\n if (isDef(value)) {\n return isNumeric(value) ? `${value}px` : String(value);\n }\n return void 0;\n}\nfunction getSizeStyle(originSize) {\n if (isDef(originSize)) {\n if (Array.isArray(originSize)) {\n return {\n width: addUnit(originSize[0]),\n height: addUnit(originSize[1])\n };\n }\n const size = addUnit(originSize);\n return {\n width: size,\n height: size\n };\n }\n}\nfunction getZIndexStyle(zIndex) {\n const style = {};\n if (zIndex !== void 0) {\n style.zIndex = +zIndex;\n }\n return style;\n}\nlet rootFontSize;\nfunction getRootFontSize() {\n if (!rootFontSize) {\n const doc = document.documentElement;\n const fontSize = doc.style.fontSize || window.getComputedStyle(doc).fontSize;\n rootFontSize = parseFloat(fontSize);\n }\n return rootFontSize;\n}\nfunction convertRem(value) {\n value = value.replace(/rem/g, \"\");\n return +value * getRootFontSize();\n}\nfunction convertVw(value) {\n value = value.replace(/vw/g, \"\");\n return +value * windowWidth.value / 100;\n}\nfunction convertVh(value) {\n value = value.replace(/vh/g, \"\");\n return +value * windowHeight.value / 100;\n}\nfunction unitToPx(value) {\n if (typeof value === \"number\") {\n return value;\n }\n if (inBrowser) {\n if (value.includes(\"rem\")) {\n return convertRem(value);\n }\n if (value.includes(\"vw\")) {\n return convertVw(value);\n }\n if (value.includes(\"vh\")) {\n return convertVh(value);\n }\n }\n return parseFloat(value);\n}\nconst camelizeRE = /-(\\w)/g;\nconst camelize = (str) => str.replace(camelizeRE, (_, c) => c.toUpperCase());\nconst kebabCase = (str) => str.replace(/([A-Z])/g, \"-$1\").toLowerCase().replace(/^-/, \"\");\nfunction padZero(num, targetLength = 2) {\n let str = num + \"\";\n while (str.length < targetLength) {\n str = \"0\" + str;\n }\n return str;\n}\nconst clamp = (num, min, max) => Math.min(Math.max(num, min), max);\nfunction trimExtraChar(value, char, regExp) {\n const index = value.indexOf(char);\n if (index === -1) {\n return value;\n }\n if (char === \"-\" && index !== 0) {\n return value.slice(0, index);\n }\n return value.slice(0, index + 1) + value.slice(index).replace(regExp, \"\");\n}\nfunction formatNumber(value, allowDot = true, allowMinus = true) {\n if (allowDot) {\n value = trimExtraChar(value, \".\", /\\./g);\n } else {\n value = value.split(\".\")[0];\n }\n if (allowMinus) {\n value = trimExtraChar(value, \"-\", /-/g);\n } else {\n value = value.replace(/-/, \"\");\n }\n const regExp = allowDot ? /[^-0-9.]/g : /[^-0-9]/g;\n return value.replace(regExp, \"\");\n}\nfunction addNumber(num1, num2) {\n const cardinal = 10 ** 10;\n return Math.round((num1 + num2) * cardinal) / cardinal;\n}\nexport {\n addNumber,\n addUnit,\n camelize,\n clamp,\n formatNumber,\n getSizeStyle,\n getZIndexStyle,\n kebabCase,\n padZero,\n unitToPx\n};\n","import { isDef, isObject } from \"./basic.mjs\";\nconst { hasOwnProperty } = Object.prototype;\nfunction assignKey(to, from, key) {\n const val = from[key];\n if (!isDef(val)) {\n return;\n }\n if (!hasOwnProperty.call(to, key) || !isObject(val)) {\n to[key] = val;\n } else {\n to[key] = deepAssign(Object(to[key]), val);\n }\n}\nfunction deepAssign(to, from) {\n Object.keys(from).forEach((key) => {\n assignKey(to, from, key);\n });\n return to;\n}\nexport {\n deepAssign\n};\n","var stdin_default = {\n name: \"\\u59D3\\u540D\",\n tel: \"\\u7535\\u8BDD\",\n save: \"\\u4FDD\\u5B58\",\n clear: \"\\u6E05\\u7A7A\",\n cancel: \"\\u53D6\\u6D88\",\n confirm: \"\\u786E\\u8BA4\",\n delete: \"\\u5220\\u9664\",\n loading: \"\\u52A0\\u8F7D\\u4E2D...\",\n noCoupon: \"\\u6682\\u65E0\\u4F18\\u60E0\\u5238\",\n nameEmpty: \"\\u8BF7\\u586B\\u5199\\u59D3\\u540D\",\n addContact: \"\\u6DFB\\u52A0\\u8054\\u7CFB\\u4EBA\",\n telInvalid: \"\\u8BF7\\u586B\\u5199\\u6B63\\u786E\\u7684\\u7535\\u8BDD\",\n vanCalendar: {\n end: \"\\u7ED3\\u675F\",\n start: \"\\u5F00\\u59CB\",\n title: \"\\u65E5\\u671F\\u9009\\u62E9\",\n weekdays: [\"\\u65E5\", \"\\u4E00\", \"\\u4E8C\", \"\\u4E09\", \"\\u56DB\", \"\\u4E94\", \"\\u516D\"],\n monthTitle: (year, month) => `${year}\\u5E74${month}\\u6708`,\n rangePrompt: (maxRange) => `\\u6700\\u591A\\u9009\\u62E9 ${maxRange} \\u5929`\n },\n vanCascader: {\n select: \"\\u8BF7\\u9009\\u62E9\"\n },\n vanPagination: {\n prev: \"\\u4E0A\\u4E00\\u9875\",\n next: \"\\u4E0B\\u4E00\\u9875\"\n },\n vanPullRefresh: {\n pulling: \"\\u4E0B\\u62C9\\u5373\\u53EF\\u5237\\u65B0...\",\n loosing: \"\\u91CA\\u653E\\u5373\\u53EF\\u5237\\u65B0...\"\n },\n vanSubmitBar: {\n label: \"\\u5408\\u8BA1:\"\n },\n vanCoupon: {\n unlimited: \"\\u65E0\\u95E8\\u69DB\",\n discount: (discount) => `${discount}\\u6298`,\n condition: (condition) => `\\u6EE1${condition}\\u5143\\u53EF\\u7528`\n },\n vanCouponCell: {\n title: \"\\u4F18\\u60E0\\u5238\",\n count: (count) => `${count}\\u5F20\\u53EF\\u7528`\n },\n vanCouponList: {\n exchange: \"\\u5151\\u6362\",\n close: \"\\u4E0D\\u4F7F\\u7528\",\n enable: \"\\u53EF\\u7528\",\n disabled: \"\\u4E0D\\u53EF\\u7528\",\n placeholder: \"\\u8F93\\u5165\\u4F18\\u60E0\\u7801\"\n },\n vanAddressEdit: {\n area: \"\\u5730\\u533A\",\n areaEmpty: \"\\u8BF7\\u9009\\u62E9\\u5730\\u533A\",\n addressEmpty: \"\\u8BF7\\u586B\\u5199\\u8BE6\\u7EC6\\u5730\\u5740\",\n addressDetail: \"\\u8BE6\\u7EC6\\u5730\\u5740\",\n defaultAddress: \"\\u8BBE\\u4E3A\\u9ED8\\u8BA4\\u6536\\u8D27\\u5730\\u5740\"\n },\n vanAddressList: {\n add: \"\\u65B0\\u589E\\u5730\\u5740\"\n }\n};\nexport {\n stdin_default as default\n};\n","import { ref, reactive } from \"vue\";\nimport { deepAssign } from \"../utils/deep-assign.mjs\";\nimport defaultMessages from \"./lang/zh-CN.mjs\";\nconst lang = ref(\"zh-CN\");\nconst messages = reactive({\n \"zh-CN\": defaultMessages\n});\nconst Locale = {\n messages() {\n return messages[lang.value];\n },\n use(newLang, newMessages) {\n lang.value = newLang;\n this.add({ [newLang]: newMessages });\n },\n add(newMessages = {}) {\n deepAssign(messages, newMessages);\n }\n};\nconst useCurrentLang = () => lang;\nvar stdin_default = Locale;\nexport {\n Locale,\n stdin_default as default,\n useCurrentLang\n};\n","import { get, isFunction } from \"./basic.mjs\";\nimport { camelize } from \"./format.mjs\";\nimport locale from \"../locale/index.mjs\";\nfunction createTranslate(name) {\n const prefix = camelize(name) + \".\";\n return (path, ...args) => {\n const messages = locale.messages();\n const message = get(messages, prefix + path) || get(messages, path);\n return isFunction(message) ? message(...args) : message;\n };\n}\nfunction genBem(name, mods) {\n if (!mods) {\n return \"\";\n }\n if (typeof mods === \"string\") {\n return ` ${name}--${mods}`;\n }\n if (Array.isArray(mods)) {\n return mods.reduce(\n (ret, item) => ret + genBem(name, item),\n \"\"\n );\n }\n return Object.keys(mods).reduce(\n (ret, key) => ret + (mods[key] ? genBem(name, key) : \"\"),\n \"\"\n );\n}\nfunction createBEM(name) {\n return (el, mods) => {\n if (el && typeof el !== \"string\") {\n mods = el;\n el = \"\";\n }\n el = el ? `${name}__${el}` : name;\n return `${el}${genBem(el, mods)}`;\n };\n}\nfunction createNamespace(name) {\n const prefixedName = `van-${name}`;\n return [\n prefixedName,\n createBEM(prefixedName),\n createTranslate(prefixedName)\n ];\n}\nexport {\n createBEM,\n createNamespace,\n createTranslate\n};\n","const BORDER = \"van-hairline\";\nconst BORDER_TOP = `${BORDER}--top`;\nconst BORDER_LEFT = `${BORDER}--left`;\nconst BORDER_RIGHT = `${BORDER}--right`;\nconst BORDER_BOTTOM = `${BORDER}--bottom`;\nconst BORDER_SURROUND = `${BORDER}--surround`;\nconst BORDER_TOP_BOTTOM = `${BORDER}--top-bottom`;\nconst BORDER_UNSET_TOP_BOTTOM = `${BORDER}-unset--top-bottom`;\nconst HAPTICS_FEEDBACK = \"van-haptics-feedback\";\nconst FORM_KEY = Symbol(\"van-form\");\nconst LONG_PRESS_START_TIME = 500;\nconst TAP_OFFSET = 5;\nexport {\n BORDER,\n BORDER_BOTTOM,\n BORDER_LEFT,\n BORDER_RIGHT,\n BORDER_SURROUND,\n BORDER_TOP,\n BORDER_TOP_BOTTOM,\n BORDER_UNSET_TOP_BOTTOM,\n FORM_KEY,\n HAPTICS_FEEDBACK,\n LONG_PRESS_START_TIME,\n TAP_OFFSET\n};\n","import { noop, isPromise } from \"./basic.mjs\";\nfunction callInterceptor(interceptor, {\n args = [],\n done,\n canceled,\n error\n}) {\n if (interceptor) {\n const returnVal = interceptor.apply(null, args);\n if (isPromise(returnVal)) {\n returnVal.then((value) => {\n if (value) {\n done();\n } else if (canceled) {\n canceled();\n }\n }).catch(error || noop);\n } else if (returnVal) {\n done();\n } else if (canceled) {\n canceled();\n }\n } else {\n done();\n }\n}\nexport {\n callInterceptor\n};\n","import { camelize } from \"./format.mjs\";\nfunction withInstall(options) {\n options.install = (app) => {\n const { name } = options;\n if (name) {\n app.component(name, options);\n app.component(camelize(`-${name}`), options);\n }\n };\n return options;\n}\nexport {\n withInstall\n};\n","import { inject, watch } from \"vue\";\nconst POPUP_TOGGLE_KEY = Symbol();\nfunction onPopupReopen(callback) {\n const popupToggleStatus = inject(POPUP_TOGGLE_KEY, null);\n if (popupToggleStatus) {\n watch(popupToggleStatus, (show) => {\n if (show) {\n callback();\n }\n });\n }\n}\nexport {\n POPUP_TOGGLE_KEY,\n onPopupReopen\n};\n","import { getCurrentInstance } from \"vue\";\nimport { extend } from \"../utils/index.mjs\";\nfunction useExpose(apis) {\n const instance = getCurrentInstance();\n if (instance) {\n extend(instance.proxy, apis);\n }\n}\nexport {\n useExpose\n};\n","import { computed, defineComponent, createVNode as _createVNode } from \"vue\";\nimport { isDef, addUnit, isNumeric, truthProp, numericProp, makeStringProp, createNamespace } from \"../utils/index.mjs\";\nconst [name, bem] = createNamespace(\"badge\");\nconst badgeProps = {\n dot: Boolean,\n max: numericProp,\n tag: makeStringProp(\"div\"),\n color: String,\n offset: Array,\n content: numericProp,\n showZero: truthProp,\n position: makeStringProp(\"top-right\")\n};\nvar stdin_default = defineComponent({\n name,\n props: badgeProps,\n setup(props, {\n slots\n }) {\n const hasContent = () => {\n if (slots.content) {\n return true;\n }\n const {\n content,\n showZero\n } = props;\n return isDef(content) && content !== \"\" && (showZero || content !== 0 && content !== \"0\");\n };\n const renderContent = () => {\n const {\n dot,\n max,\n content\n } = props;\n if (!dot && hasContent()) {\n if (slots.content) {\n return slots.content();\n }\n if (isDef(max) && isNumeric(content) && +content > +max) {\n return `${max}+`;\n }\n return content;\n }\n };\n const getOffsetWithMinusString = (val) => val.startsWith(\"-\") ? val.replace(\"-\", \"\") : `-${val}`;\n const style = computed(() => {\n const style2 = {\n background: props.color\n };\n if (props.offset) {\n const [x, y] = props.offset;\n const {\n position\n } = props;\n const [offsetY, offsetX] = position.split(\"-\");\n if (slots.default) {\n if (typeof y === \"number\") {\n style2[offsetY] = addUnit(offsetY === \"top\" ? y : -y);\n } else {\n style2[offsetY] = offsetY === \"top\" ? addUnit(y) : getOffsetWithMinusString(y);\n }\n if (typeof x === \"number\") {\n style2[offsetX] = addUnit(offsetX === \"left\" ? x : -x);\n } else {\n style2[offsetX] = offsetX === \"left\" ? addUnit(x) : getOffsetWithMinusString(x);\n }\n } else {\n style2.marginTop = addUnit(y);\n style2.marginLeft = addUnit(x);\n }\n }\n return style2;\n });\n const renderBadge = () => {\n if (hasContent() || props.dot) {\n return _createVNode(\"div\", {\n \"class\": bem([props.position, {\n dot: props.dot,\n fixed: !!slots.default\n }]),\n \"style\": style.value\n }, [renderContent()]);\n }\n };\n return () => {\n if (slots.default) {\n const {\n tag\n } = props;\n return _createVNode(tag, {\n \"class\": bem(\"wrapper\")\n }, {\n default: () => [slots.default(), renderBadge()]\n });\n }\n return renderBadge();\n };\n }\n});\nexport {\n badgeProps,\n stdin_default as default\n};\n","import { withInstall } from \"../utils/index.mjs\";\nimport _Badge from \"./Badge.mjs\";\nconst Badge = withInstall(_Badge);\nvar stdin_default = Badge;\nimport { badgeProps } from \"./Badge.mjs\";\nexport {\n Badge,\n badgeProps,\n stdin_default as default\n};\n","let globalZIndex = 2e3;\nconst useGlobalZIndex = () => ++globalZIndex;\nconst setGlobalZIndex = (val) => {\n globalZIndex = val;\n};\nexport {\n setGlobalZIndex,\n useGlobalZIndex\n};\n","import { watch, provide, computed, watchEffect, onActivated, onDeactivated, onBeforeUnmount, defineComponent, createVNode as _createVNode } from \"vue\";\nimport { extend, inBrowser, kebabCase, makeStringProp, createNamespace } from \"../utils/index.mjs\";\nimport { setGlobalZIndex } from \"../composables/use-global-z-index.mjs\";\nconst [name, bem] = createNamespace(\"config-provider\");\nconst CONFIG_PROVIDER_KEY = Symbol(name);\nconst configProviderProps = {\n tag: makeStringProp(\"div\"),\n theme: makeStringProp(\"light\"),\n zIndex: Number,\n themeVars: Object,\n themeVarsDark: Object,\n themeVarsLight: Object,\n themeVarsScope: makeStringProp(\"local\"),\n iconPrefix: String\n};\nfunction insertDash(str) {\n return str.replace(/([a-zA-Z])(\\d)/g, \"$1-$2\");\n}\nfunction mapThemeVarsToCSSVars(themeVars) {\n const cssVars = {};\n Object.keys(themeVars).forEach((key) => {\n const formattedKey = insertDash(kebabCase(key));\n cssVars[`--van-${formattedKey}`] = themeVars[key];\n });\n return cssVars;\n}\nfunction syncThemeVarsOnRoot(newStyle = {}, oldStyle = {}) {\n Object.keys(newStyle).forEach((key) => {\n if (newStyle[key] !== oldStyle[key]) {\n document.documentElement.style.setProperty(key, newStyle[key]);\n }\n });\n Object.keys(oldStyle).forEach((key) => {\n if (!newStyle[key]) {\n document.documentElement.style.removeProperty(key);\n }\n });\n}\nvar stdin_default = defineComponent({\n name,\n props: configProviderProps,\n setup(props, {\n slots\n }) {\n const style = computed(() => mapThemeVarsToCSSVars(extend({}, props.themeVars, props.theme === \"dark\" ? props.themeVarsDark : props.themeVarsLight)));\n if (inBrowser) {\n const addTheme = () => {\n document.documentElement.classList.add(`van-theme-${props.theme}`);\n };\n const removeTheme = (theme = props.theme) => {\n document.documentElement.classList.remove(`van-theme-${theme}`);\n };\n watch(() => props.theme, (newVal, oldVal) => {\n if (oldVal) {\n removeTheme(oldVal);\n }\n addTheme();\n }, {\n immediate: true\n });\n onActivated(addTheme);\n onDeactivated(removeTheme);\n onBeforeUnmount(removeTheme);\n watch(style, (newStyle, oldStyle) => {\n if (props.themeVarsScope === \"global\") {\n syncThemeVarsOnRoot(newStyle, oldStyle);\n }\n });\n watch(() => props.themeVarsScope, (newScope, oldScope) => {\n if (oldScope === \"global\") {\n syncThemeVarsOnRoot({}, style.value);\n }\n if (newScope === \"global\") {\n syncThemeVarsOnRoot(style.value, {});\n }\n });\n if (props.themeVarsScope === \"global\") {\n syncThemeVarsOnRoot(style.value, {});\n }\n }\n provide(CONFIG_PROVIDER_KEY, props);\n watchEffect(() => {\n if (props.zIndex !== void 0) {\n setGlobalZIndex(props.zIndex);\n }\n });\n return () => _createVNode(props.tag, {\n \"class\": bem(),\n \"style\": props.themeVarsScope === \"local\" ? style.value : void 0\n }, {\n default: () => {\n var _a;\n return [(_a = slots.default) == null ? void 0 : _a.call(slots)];\n }\n });\n }\n});\nexport {\n CONFIG_PROVIDER_KEY,\n configProviderProps,\n stdin_default as default\n};\n","import { inject, computed, defineComponent, createVNode as _createVNode, mergeProps as _mergeProps } from \"vue\";\nimport { addUnit, numericProp, makeStringProp, createNamespace } from \"../utils/index.mjs\";\nimport { Badge } from \"../badge/index.mjs\";\nimport { CONFIG_PROVIDER_KEY } from \"../config-provider/ConfigProvider.mjs\";\nconst [name, bem] = createNamespace(\"icon\");\nconst isImage = (name2) => name2 == null ? void 0 : name2.includes(\"/\");\nconst iconProps = {\n dot: Boolean,\n tag: makeStringProp(\"i\"),\n name: String,\n size: numericProp,\n badge: numericProp,\n color: String,\n badgeProps: Object,\n classPrefix: String\n};\nvar stdin_default = defineComponent({\n name,\n props: iconProps,\n setup(props, {\n slots\n }) {\n const config = inject(CONFIG_PROVIDER_KEY, null);\n const classPrefix = computed(() => props.classPrefix || (config == null ? void 0 : config.iconPrefix) || bem());\n return () => {\n const {\n tag,\n dot,\n name: name2,\n size,\n badge,\n color\n } = props;\n const isImageIcon = isImage(name2);\n return _createVNode(Badge, _mergeProps({\n \"dot\": dot,\n \"tag\": tag,\n \"class\": [classPrefix.value, isImageIcon ? \"\" : `${classPrefix.value}-${name2}`],\n \"style\": {\n color,\n fontSize: addUnit(size)\n },\n \"content\": badge\n }, props.badgeProps), {\n default: () => {\n var _a;\n return [(_a = slots.default) == null ? void 0 : _a.call(slots), isImageIcon && _createVNode(\"img\", {\n \"class\": bem(\"image\"),\n \"src\": name2\n }, null)];\n }\n });\n };\n }\n});\nexport {\n stdin_default as default,\n iconProps\n};\n","import { withInstall } from \"../utils/index.mjs\";\nimport _Icon from \"./Icon.mjs\";\nconst Icon = withInstall(_Icon);\nvar stdin_default = Icon;\nimport { iconProps } from \"./Icon.mjs\";\nexport {\n Icon,\n stdin_default as default,\n iconProps\n};\n","import { truthProp, unknownProp, numericProp } from \"../utils/index.mjs\";\nconst popupSharedProps = {\n // whether to show popup\n show: Boolean,\n // z-index\n zIndex: numericProp,\n // whether to show overlay\n overlay: truthProp,\n // transition duration\n duration: numericProp,\n // teleport\n teleport: [String, Object],\n // prevent body scroll\n lockScroll: truthProp,\n // whether to lazy render\n lazyRender: truthProp,\n // callback function before close\n beforeClose: Function,\n // overlay props\n overlayProps: Object,\n // overlay custom style\n overlayStyle: Object,\n // overlay custom class name\n overlayClass: unknownProp,\n // Initial rendering animation\n transitionAppear: Boolean,\n // whether to close popup when overlay is clicked\n closeOnClickOverlay: truthProp\n};\nconst popupSharedPropKeys = Object.keys(\n popupSharedProps\n);\nexport {\n popupSharedPropKeys,\n popupSharedProps\n};\n","import { ref } from \"vue\";\nimport { TAP_OFFSET } from \"../utils/index.mjs\";\nfunction getDirection(x, y) {\n if (x > y) {\n return \"horizontal\";\n }\n if (y > x) {\n return \"vertical\";\n }\n return \"\";\n}\nfunction useTouch() {\n const startX = ref(0);\n const startY = ref(0);\n const deltaX = ref(0);\n const deltaY = ref(0);\n const offsetX = ref(0);\n const offsetY = ref(0);\n const direction = ref(\"\");\n const isTap = ref(true);\n const isVertical = () => direction.value === \"vertical\";\n const isHorizontal = () => direction.value === \"horizontal\";\n const reset = () => {\n deltaX.value = 0;\n deltaY.value = 0;\n offsetX.value = 0;\n offsetY.value = 0;\n direction.value = \"\";\n isTap.value = true;\n };\n const start = (event) => {\n reset();\n startX.value = event.touches[0].clientX;\n startY.value = event.touches[0].clientY;\n };\n const move = (event) => {\n const touch = event.touches[0];\n deltaX.value = (touch.clientX < 0 ? 0 : touch.clientX) - startX.value;\n deltaY.value = touch.clientY - startY.value;\n offsetX.value = Math.abs(deltaX.value);\n offsetY.value = Math.abs(deltaY.value);\n const LOCK_DIRECTION_DISTANCE = 10;\n if (!direction.value || offsetX.value < LOCK_DIRECTION_DISTANCE && offsetY.value < LOCK_DIRECTION_DISTANCE) {\n direction.value = getDirection(offsetX.value, offsetY.value);\n }\n if (isTap.value && (offsetX.value > TAP_OFFSET || offsetY.value > TAP_OFFSET)) {\n isTap.value = false;\n }\n };\n return {\n move,\n start,\n reset,\n startX,\n startY,\n deltaX,\n deltaY,\n offsetX,\n offsetY,\n direction,\n isVertical,\n isHorizontal,\n isTap\n };\n}\nexport {\n useTouch\n};\n","import { watch, onBeforeUnmount, onDeactivated } from \"vue\";\nimport { getScrollParent, onMountedOrActivated } from \"@vant/use\";\nimport { useTouch } from \"./use-touch.mjs\";\nimport { preventDefault } from \"../utils/index.mjs\";\nlet totalLockCount = 0;\nconst BODY_LOCK_CLASS = \"van-overflow-hidden\";\nfunction useLockScroll(rootRef, shouldLock) {\n const touch = useTouch();\n const DIRECTION_UP = \"01\";\n const DIRECTION_DOWN = \"10\";\n const onTouchMove = (event) => {\n touch.move(event);\n const direction = touch.deltaY.value > 0 ? DIRECTION_DOWN : DIRECTION_UP;\n const el = getScrollParent(\n event.target,\n rootRef.value\n );\n const { scrollHeight, offsetHeight, scrollTop } = el;\n let status = \"11\";\n if (scrollTop === 0) {\n status = offsetHeight >= scrollHeight ? \"00\" : \"01\";\n } else if (scrollTop + offsetHeight >= scrollHeight) {\n status = \"10\";\n }\n if (status !== \"11\" && touch.isVertical() && !(parseInt(status, 2) & parseInt(direction, 2))) {\n preventDefault(event, true);\n }\n };\n const lock = () => {\n document.addEventListener(\"touchstart\", touch.start);\n document.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n if (!totalLockCount) {\n document.body.classList.add(BODY_LOCK_CLASS);\n }\n totalLockCount++;\n };\n const unlock = () => {\n if (totalLockCount) {\n document.removeEventListener(\"touchstart\", touch.start);\n document.removeEventListener(\"touchmove\", onTouchMove);\n totalLockCount--;\n if (!totalLockCount) {\n document.body.classList.remove(BODY_LOCK_CLASS);\n }\n }\n };\n const init = () => shouldLock() && lock();\n const destroy = () => shouldLock() && unlock();\n onMountedOrActivated(init);\n onDeactivated(destroy);\n onBeforeUnmount(destroy);\n watch(shouldLock, (value) => {\n value ? lock() : unlock();\n });\n}\nexport {\n useLockScroll\n};\n","import { ref, watch } from \"vue\";\nfunction useLazyRender(show) {\n const inited = ref(false);\n watch(\n show,\n (value) => {\n if (value) {\n inited.value = value;\n }\n },\n { immediate: true }\n );\n return (render) => () => inited.value ? render() : null;\n}\nexport {\n useLazyRender\n};\n","import { getCurrentInstance } from \"vue\";\nconst useScopeId = () => {\n var _a;\n const { scopeId } = ((_a = getCurrentInstance()) == null ? void 0 : _a.vnode) || {};\n return scopeId ? { [scopeId]: \"\" } : null;\n};\nexport {\n useScopeId\n};\n","import { ref, defineComponent, Teleport, Transition, vShow as _vShow, mergeProps as _mergeProps, createVNode as _createVNode, withDirectives as _withDirectives } from \"vue\";\nimport { isDef, extend, truthProp, numericProp, unknownProp, preventDefault, createNamespace, getZIndexStyle } from \"../utils/index.mjs\";\nimport { useEventListener } from \"@vant/use\";\nimport { useLazyRender } from \"../composables/use-lazy-render.mjs\";\nconst [name, bem] = createNamespace(\"overlay\");\nconst overlayProps = {\n show: Boolean,\n zIndex: numericProp,\n duration: numericProp,\n className: unknownProp,\n lockScroll: truthProp,\n lazyRender: truthProp,\n customStyle: Object,\n teleport: [String, Object]\n};\nvar stdin_default = defineComponent({\n name,\n inheritAttrs: false,\n props: overlayProps,\n setup(props, {\n attrs,\n slots\n }) {\n const root = ref();\n const lazyRender = useLazyRender(() => props.show || !props.lazyRender);\n const onTouchMove = (event) => {\n if (props.lockScroll) {\n preventDefault(event, true);\n }\n };\n const renderOverlay = lazyRender(() => {\n var _a;\n const style = extend(getZIndexStyle(props.zIndex), props.customStyle);\n if (isDef(props.duration)) {\n style.animationDuration = `${props.duration}s`;\n }\n return _withDirectives(_createVNode(\"div\", _mergeProps({\n \"ref\": root,\n \"style\": style,\n \"class\": [bem(), props.className]\n }, attrs), [(_a = slots.default) == null ? void 0 : _a.call(slots)]), [[_vShow, props.show]]);\n });\n useEventListener(\"touchmove\", onTouchMove, {\n target: root\n });\n return () => {\n const Content = _createVNode(Transition, {\n \"name\": \"van-fade\",\n \"appear\": true\n }, {\n default: renderOverlay\n });\n if (props.teleport) {\n return _createVNode(Teleport, {\n \"to\": props.teleport\n }, {\n default: () => [Content]\n });\n }\n return Content;\n };\n }\n});\nexport {\n stdin_default as default,\n overlayProps\n};\n","import { withInstall } from \"../utils/index.mjs\";\nimport _Overlay from \"./Overlay.mjs\";\nconst Overlay = withInstall(_Overlay);\nvar stdin_default = Overlay;\nimport { overlayProps } from \"./Overlay.mjs\";\nexport {\n Overlay,\n stdin_default as default,\n overlayProps\n};\n","import { ref, watch, provide, Teleport, nextTick, computed, onMounted, Transition, onActivated, onDeactivated, defineComponent, mergeProps as _mergeProps, createVNode as _createVNode, vShow as _vShow, withDirectives as _withDirectives, Fragment as _Fragment } from \"vue\";\nimport { popupSharedProps } from \"./shared.mjs\";\nimport { isDef, extend, makeStringProp, callInterceptor, createNamespace, HAPTICS_FEEDBACK } from \"../utils/index.mjs\";\nimport { useEventListener } from \"@vant/use\";\nimport { useExpose } from \"../composables/use-expose.mjs\";\nimport { useLockScroll } from \"../composables/use-lock-scroll.mjs\";\nimport { useLazyRender } from \"../composables/use-lazy-render.mjs\";\nimport { POPUP_TOGGLE_KEY } from \"../composables/on-popup-reopen.mjs\";\nimport { useGlobalZIndex } from \"../composables/use-global-z-index.mjs\";\nimport { useScopeId } from \"../composables/use-scope-id.mjs\";\nimport { Icon } from \"../icon/index.mjs\";\nimport { Overlay } from \"../overlay/index.mjs\";\nconst popupProps = extend({}, popupSharedProps, {\n round: Boolean,\n position: makeStringProp(\"center\"),\n closeIcon: makeStringProp(\"cross\"),\n closeable: Boolean,\n transition: String,\n iconPrefix: String,\n closeOnPopstate: Boolean,\n closeIconPosition: makeStringProp(\"top-right\"),\n destroyOnClose: Boolean,\n safeAreaInsetTop: Boolean,\n safeAreaInsetBottom: Boolean\n});\nconst [name, bem] = createNamespace(\"popup\");\nvar stdin_default = defineComponent({\n name,\n inheritAttrs: false,\n props: popupProps,\n emits: [\"open\", \"close\", \"opened\", \"closed\", \"keydown\", \"update:show\", \"clickOverlay\", \"clickCloseIcon\"],\n setup(props, {\n emit,\n attrs,\n slots\n }) {\n let opened;\n let shouldReopen;\n const zIndex = ref();\n const popupRef = ref();\n const lazyRender = useLazyRender(() => props.show || !props.lazyRender);\n const style = computed(() => {\n const style2 = {\n zIndex: zIndex.value\n };\n if (isDef(props.duration)) {\n const key = props.position === \"center\" ? \"animationDuration\" : \"transitionDuration\";\n style2[key] = `${props.duration}s`;\n }\n return style2;\n });\n const open = () => {\n if (!opened) {\n opened = true;\n zIndex.value = props.zIndex !== void 0 ? +props.zIndex : useGlobalZIndex();\n emit(\"open\");\n }\n };\n const close = () => {\n if (opened) {\n callInterceptor(props.beforeClose, {\n done() {\n opened = false;\n emit(\"close\");\n emit(\"update:show\", false);\n }\n });\n }\n };\n const onClickOverlay = (event) => {\n emit(\"clickOverlay\", event);\n if (props.closeOnClickOverlay) {\n close();\n }\n };\n const renderOverlay = () => {\n if (props.overlay) {\n const overlayProps = extend({\n show: props.show,\n class: props.overlayClass,\n zIndex: zIndex.value,\n duration: props.duration,\n customStyle: props.overlayStyle,\n role: props.closeOnClickOverlay ? \"button\" : void 0,\n tabindex: props.closeOnClickOverlay ? 0 : void 0\n }, props.overlayProps);\n return _createVNode(Overlay, _mergeProps(overlayProps, useScopeId(), {\n \"onClick\": onClickOverlay\n }), {\n default: slots[\"overlay-content\"]\n });\n }\n };\n const onClickCloseIcon = (event) => {\n emit(\"clickCloseIcon\", event);\n close();\n };\n const renderCloseIcon = () => {\n if (props.closeable) {\n return _createVNode(Icon, {\n \"role\": \"button\",\n \"tabindex\": 0,\n \"name\": props.closeIcon,\n \"class\": [bem(\"close-icon\", props.closeIconPosition), HAPTICS_FEEDBACK],\n \"classPrefix\": props.iconPrefix,\n \"onClick\": onClickCloseIcon\n }, null);\n }\n };\n let timer;\n const onOpened = () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n emit(\"opened\");\n });\n };\n const onClosed = () => emit(\"closed\");\n const onKeydown = (event) => emit(\"keydown\", event);\n const renderPopup = lazyRender(() => {\n var _a;\n const {\n destroyOnClose,\n round,\n position,\n safeAreaInsetTop,\n safeAreaInsetBottom,\n show\n } = props;\n if (!show && destroyOnClose) {\n return;\n }\n return _withDirectives(_createVNode(\"div\", _mergeProps({\n \"ref\": popupRef,\n \"style\": style.value,\n \"role\": \"dialog\",\n \"tabindex\": 0,\n \"class\": [bem({\n round,\n [position]: position\n }), {\n \"van-safe-area-top\": safeAreaInsetTop,\n \"van-safe-area-bottom\": safeAreaInsetBottom\n }],\n \"onKeydown\": onKeydown\n }, attrs, useScopeId()), [(_a = slots.default) == null ? void 0 : _a.call(slots), renderCloseIcon()]), [[_vShow, show]]);\n });\n const renderTransition = () => {\n const {\n position,\n transition,\n transitionAppear\n } = props;\n const name2 = position === \"center\" ? \"van-fade\" : `van-popup-slide-${position}`;\n return _createVNode(Transition, {\n \"name\": transition || name2,\n \"appear\": transitionAppear,\n \"onAfterEnter\": onOpened,\n \"onAfterLeave\": onClosed\n }, {\n default: renderPopup\n });\n };\n watch(() => props.show, (show) => {\n if (show && !opened) {\n open();\n if (attrs.tabindex === 0) {\n nextTick(() => {\n var _a;\n (_a = popupRef.value) == null ? void 0 : _a.focus();\n });\n }\n }\n if (!show && opened) {\n opened = false;\n emit(\"close\");\n }\n });\n useExpose({\n popupRef\n });\n useLockScroll(popupRef, () => props.show && props.lockScroll);\n useEventListener(\"popstate\", () => {\n if (props.closeOnPopstate) {\n close();\n shouldReopen = false;\n }\n });\n onMounted(() => {\n if (props.show) {\n open();\n }\n });\n onActivated(() => {\n if (shouldReopen) {\n emit(\"update:show\", true);\n shouldReopen = false;\n }\n });\n onDeactivated(() => {\n if (props.show && props.teleport) {\n close();\n shouldReopen = true;\n }\n });\n provide(POPUP_TOGGLE_KEY, () => props.show);\n return () => {\n if (props.teleport) {\n return _createVNode(Teleport, {\n \"to\": props.teleport\n }, {\n default: () => [renderOverlay(), renderTransition()]\n });\n }\n return _createVNode(_Fragment, null, [renderOverlay(), renderTransition()]);\n };\n }\n});\nexport {\n stdin_default as default,\n popupProps\n};\n","import { withInstall } from \"../utils/index.mjs\";\nimport _Popup from \"./Popup.mjs\";\nconst Popup = withInstall(_Popup);\nvar stdin_default = Popup;\nimport { popupProps } from \"./Popup.mjs\";\nexport {\n Popup,\n stdin_default as default,\n popupProps\n};\n","<template>\r\n <popup v-model:show=\"show\" round position=\"bottom\" v-bind=\"$attrs\">\r\n <div class=\"header\">\r\n <div class=\"title\">\r\n {{ title }}\r\n </div>\r\n <div class=\"close\" @click=\"bindClosePopup\">\r\n <i class=\"iconfont icon-lucide-x\"></i>\r\n </div>\r\n </div>\r\n <div class=\"list-container\">\r\n <div\r\n class=\"list-item\"\r\n :class=\"{ active: model === item[columnsFieldNames.value] }\"\r\n v-for=\"item in columns\"\r\n :key=\"item[columnsFieldNames.value]\"\r\n @click=\"pickerConfirm(item)\"\r\n >\r\n <div class=\"label\">\r\n <template v-if=\"$slots.label\">\r\n <slot name=\"label\" :item=\"item\"></slot>\r\n </template>\r\n <template v-else>\r\n {{ item[columnsFieldNames.label] }}\r\n </template>\r\n </div>\r\n <div class=\"active-icon\">\r\n <i\r\n v-show=\"model === item[columnsFieldNames.value]\"\r\n class=\"iconfont icon-check\"\r\n ></i>\r\n </div>\r\n </div>\r\n <slot />\r\n </div>\r\n </popup>\r\n</template>\r\n<script setup>\r\nimport { Popup, Picker } from \"vant\";\r\ndefineOptions({\r\n name: \"MPicker\",\r\n});\r\nconst emit = defineEmits([\"confirm\"]);\r\nconst props = defineProps({\r\n title: {\r\n type: String,\r\n default: \"\",\r\n },\r\n columns: {\r\n type: Array,\r\n default: [],\r\n },\r\n columnsFieldNames: {\r\n type: Object,\r\n default: () => {\r\n return { label: \"label\", value: \"value\" };\r\n },\r\n },\r\n});\r\nconst model = defineModel();\r\nconst show = defineModel(\"show\", {\r\n type: Boolean,\r\n default: false,\r\n});\r\n\r\nconst pickerConfirm = (item) => {\r\n model.value = item[props.columnsFieldNames.value];\r\n emit(\"confirm\", item);\r\n bindClosePopup();\r\n};\r\n\r\nconst bindClosePopup = () => {\r\n show.value = false;\r\n};\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n min-height: 60px;\r\n .title {\r\n font-size: var(--font-size-text-lg);\r\n font-weight: 600;\r\n text-align: center;\r\n width: 100%;\r\n color: var(--text-primary);\r\n }\r\n .close {\r\n cursor: pointer;\r\n position: absolute;\r\n right: 0;\r\n top: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 52px;\r\n height: 52px;\r\n .iconfont {\r\n font-size: 20px;\r\n font-weight: normal;\r\n color: var(--icon-tertiary);\r\n }\r\n }\r\n}\r\n\r\n.list-container {\r\n display: flex;\r\n flex-direction: column;\r\n max-height: 558px;\r\n padding: 0 16px 24px;\r\n overflow-y: auto;\r\n .list-item {\r\n padding:16px 12px;\r\n border-radius: var(--md);\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n min-height: 52px;\r\n &.active {\r\n background: var(--bg-tertiary-hover);\r\n }\r\n .label {\r\n font-size: var(--font-size-text-base);\r\n color: var(--text-primary);\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n flex: 1;\r\n }\r\n .active-icon {\r\n font-size: 20px;\r\n width: 20px;\r\n color: var(--text-primary);\r\n }\r\n }\r\n}\r\n</style>\r\n","/**\r\n * @mc-markets/ui - 自定义组件库\r\n * \r\n * 提供自定义组件和工具函数\r\n * 支持 Element Plus 组件回退机制\r\n * 将 Element Plus 组件前缀从 el- 转换为 m- 并导出\r\n * 导出 Element Plus 事件相关功能(Message、MessageBox、Notification、Loading 等)\r\n * \r\n * @version 1.1.52\n */\r\n\r\nimport * as ElementPlusComponents from 'element-plus'\r\n// 导入样式文件\r\nimport MIcon from './components/Icon/Icon.vue'\r\nimport MButton from './components/Button/Button.vue'\r\nimport MInput from './components/Input/Input.vue'\r\nimport MForm from './components/Form/Form.vue'\r\nimport MFormItem from './components/FormItem/FormItem.vue'\r\nimport MTooltip from './components/Tooltip/Tooltip.vue'\r\nimport MSelect from './components/Select/Select.vue'\r\nimport MOption from './components/Option/Option.vue'\r\nimport MOptionGroup from './components/OptionGroup/OptionGroup.vue'\r\nimport MPagination from './components/Pagination/Pagination.vue'\r\nimport MRadio from './components/Radio/Radio.vue'\r\nimport MRadioGroup from './components/RadioGroup/RadioGroup.vue'\r\nimport MRadioButton from './components/RadioButton/RadioButton.vue'\r\nimport MSwitch from './components/Switch/Switch.vue'\r\nimport MTag from './components/Tag/Tag.vue'\r\nimport MAlert from './components/Alert/Alert.vue'\r\nimport MDialog from './components/Dialog/Dialog.vue'\r\nimport MNotification from './components/Notification/Notification.vue'\r\nimport MMessage, { Message } from './components/Message/Message.vue'\r\nimport MNotifiMessage, { NotifiMessage } from './components/NotifiMessage/NotifiMessage.vue'\r\nimport MDatePicker from './components/DatePicker/DatePicker.vue'\r\nimport MEmpty from './components/Empty/Empty.vue'\r\nimport MTable from './components/Table/Table.vue'\r\nimport MTableColumn from './components/Table/TableColumn.vue'\r\nimport MBanner from './components/Banner/Banner.vue'\r\nimport MTabs from './components/Tabs/Tabs.vue'\r\nimport MTabPane from './components/Tabs/TabPane.vue'\r\nimport MTabCard from './components/TabCard/TabCard.vue'\r\nimport MTabCardItem from './components/TabCard/TabCardItem.vue'\r\nimport MBreadcrumb from './components/Breadcrumb/Breadcrumb.vue'\r\nimport MPicker from './components/Picker/Picker.vue'\r\nconst components = [MIcon, MButton, MInput, MForm, MFormItem, MTooltip, MSelect, MOption, MOptionGroup, MPagination, MRadio, MRadioGroup, MRadioButton, MSwitch, MTag, MAlert, MDialog, MNotification, MMessage, MNotifiMessage, MDatePicker, MEmpty, MTable, MTableColumn, MBanner, MTabs, MTabPane, MTabCard, MTabCardItem, MBreadcrumb, MPicker]\r\n\r\n// 统一的组件名称转换函数\r\n// 将 MDatePicker -> m-date-picker,与 Element Plus 转换逻辑保持一致\r\nfunction convertComponentName(componentName) {\r\n if (!componentName || typeof componentName !== 'string') {\r\n return null\r\n }\r\n \r\n // 如果不是 M 开头,返回 null\r\n if (!componentName.startsWith('M')) {\r\n return null\r\n }\r\n \r\n // 移除 M 前缀,然后转换驼峰为 kebab-case\r\n // MDatePicker -> DatePicker -> -Date-Picker -> -date-picker -> date-picker -> m-date-picker\r\n const nameWithoutPrefix = componentName.slice(1)\r\n const kebabCase = nameWithoutPrefix\r\n .replace(/([A-Z])/g, '-$1')\r\n .toLowerCase()\r\n .replace(/^-/, '')\r\n \r\n return 'm-' + kebabCase\r\n}\r\n\r\n// 全局组件配置 - 需要自动创建实例的组件\r\nconst globalInstanceComponents = [\r\n { id: 'global-message-container', component: MMessage },\r\n { id: 'global-notification-container', component: MNotifiMessage }\r\n]\r\n\r\n// 创建单个全局组件实例\r\nasync function createGlobalComponent({ id, component }) {\r\n try {\r\n // 检查是否已存在,避免重复创建\r\n if (document.getElementById(id)) return\r\n \r\n const { createApp, h } = await import('vue')\r\n \r\n // 创建容器\r\n const container = document.createElement('div')\r\n container.id = id\r\n document.body.appendChild(container)\r\n \r\n // 创建并挂载 Vue 应用\r\n const app = createApp({\r\n render: () => h(component)\r\n })\r\n \r\n app.mount(`#${id}`)\r\n } catch (error) {\r\n console.warn(`Failed to create global component ${id}:`, error)\r\n }\r\n}\r\n\r\n// 创建所有全局组件实例\r\nasync function createGlobalComponents() {\r\n const promises = globalInstanceComponents.map(createGlobalComponent)\r\n await Promise.all(promises)\r\n}\r\n\r\n// 存储转换后的 Element Plus 组件\r\nconst convertedComponents = {}\r\n\r\nfunction registerElementPlus(app) {\r\n // 获取已注册的自定义组件名称\r\n const customComponentNames = components\r\n .map(comp => convertComponentName(comp?.name))\r\n .filter(Boolean)\r\n\r\n \r\n Object.entries(ElementPlusComponents).forEach(([key, comp]) => {\r\n if (comp && comp.name && typeof comp.name === 'string' && comp.name.startsWith('El')) {\r\n // 将 ElOptionGroup 转换为 m-option-group\r\n const mName = 'm-' + comp.name.slice(2).replace(/([A-Z])/g, '-$1').toLowerCase().replace(/^-/, '')\r\n \r\n // 只注册没有被自定义组件覆盖的Element Plus组件\r\n if (!customComponentNames.includes(mName)) {\r\n // 检查组件是否已经注册,避免重复注册警告\r\n if (!app._context.components[mName]) {\r\n app.component(mName, comp)\r\n } else {\r\n }\r\n } else {\r\n }\r\n \r\n // 存储转换后的组件用于导出\r\n const exportName = 'M' + comp.name.slice(2) // ElButton -> MButton\r\n convertedComponents[exportName] = comp\r\n }\r\n })\r\n}\r\n\r\nconst install = (app) => {\r\n // 应用全局样式覆盖\r\n if (typeof window !== 'undefined') {\r\n import('./utils/styleUtils.js').then(({ applyGlobalOverride, enableH5Override }) => {\r\n applyGlobalOverride();\r\n // 自动启用 H5 适配(UA 或断点)\r\n enableH5Override({ mode: 'auto', breakpoint: 768 });\r\n });\r\n }\r\n \r\n console.log('🚀 开始安装 @mc-markets/ui 组件库...')\r\n \r\n // 先注册自定义组件 - 确保优先级\r\n components.forEach(component => {\r\n const convertName = convertComponentName(component?.name)\r\n const originalName = component?.name\r\n if (convertName) {\r\n // 强制注册自定义组件,确保覆盖任何已存在的组件 (kebab-case)\r\n app.component(convertName, component)\r\n }\r\n if (originalName) {\r\n // 同时注册 PascalCase,兼容直接使用 <MPicker /> 等写法\r\n app.component(originalName, component)\r\n }\r\n })\r\n \r\n // 然后注册转换后的 Element Plus 组件(只注册没有自定义组件覆盖的)\r\n registerElementPlus(app)\r\n \r\n // 自动创建全局组件实例\r\n if (typeof window !== 'undefined') {\r\n createGlobalComponents()\r\n }\r\n}\r\n\r\nexport default { install }\r\nexport { MIcon, MButton, MInput, MForm, MFormItem, MTooltip, MSelect, MOption, MOptionGroup, MPagination, MRadio, MRadioGroup, MRadioButton, MSwitch, MTag, MAlert, MDialog, MNotification, MMessage, MNotifiMessage, MDatePicker, MEmpty, MTable, MTableColumn, MBanner, MTabs, MTabPane, MTabCard, MTabCardItem, MBreadcrumb, MPicker }\r\n\r\n// 导出样式工具函数\r\nexport { \r\n addOverrideClass, \r\n addComponentOverride, \r\n applyGlobalOverride, \r\n forceRefreshStyles,\r\n enableH5Override,\r\n isH5,\r\n createOverrideComponent \r\n} from './utils/styleUtils.js'\r\n\r\n// 手动导出常用的 Element Plus 函数(只导出函数,不导出组件)\r\nexport const MMessageBox = ElementPlusComponents.ElMessageBox\r\n\r\n// 导出自定义组件的静态方法\r\nexport { Message, NotifiMessage }\r\n\r\n// 导出转换后的 Element Plus 组件\r\nexport const mComponents = { ...convertedComponents }\r\n\r\n// 导出常用的 Element Plus 组件\r\nexport const MButtonGroup = convertedComponents.MButtonGroup\r\nexport const MCarousel = convertedComponents.MCarousel\r\nexport const MCarouselItem = convertedComponents.MCarouselItem\r\nexport const MCascader = convertedComponents.MCascader\r\nexport const MCascaderPanel = convertedComponents.MCascaderPanel\r\nexport const MCheckTag = convertedComponents.MCheckTag\r\nexport const MCalendar = convertedComponents.MCalendar\r\nexport const MTimePicker = convertedComponents.MTimePicker\r\nexport const MDateTimePicker = convertedComponents.MDateTimePicker\r\nexport const MColorPicker = convertedComponents.MColorPicker\r\nexport const MTransfer = convertedComponents.MTransfer\r\nexport const MTree = convertedComponents.MTree\r\nexport const MTreeSelect = convertedComponents.MTreeSelect\r\nexport const MUpload = convertedComponents.MUpload\r\nexport const MImage = convertedComponents.MImage\r\nexport const MImageViewer = convertedComponents.MImageViewer\r\nexport const MBacktop = convertedComponents.MBacktop\r\nexport const MInfiniteScroll = convertedComponents.MInfiniteScroll\r\nexport const MAffix = convertedComponents.MAffix\r\nexport const MScrollbar = convertedComponents.MScrollbar\r\nexport const MResult = convertedComponents.MResult\r\nexport const MSkeleton = convertedComponents.MSkeleton\r\nexport const MLoading = convertedComponents.MLoading\r\nexport const MSpinner = convertedComponents.MSpinner\r\nexport const MProgress = convertedComponents.MProgress\r\nexport const MBadge = convertedComponents.MBadge\r\nexport const MAvatar = convertedComponents.MAvatar\r\nexport const MImagePreview = convertedComponents.MImagePreview\r\nexport const MTeleport = convertedComponents.MTeleport\r\nexport const MConfigProvider = convertedComponents.MConfigProvider\r\n"],"names":["props","__props","emit","__emit","iconClass","computed","classes","iconStyle","style","handleClick","event","_openBlock","_createElementBlock","_mergeProps","useExposeRef","refName","options","compatibilityKeys","innerRef","ref","exposedProxy","_target","key","value","getterMethodName","method","args","_b","_a","target","val","buttonRef","__expose","_createBlock","_component_el_button","_renderSlot","_ctx","name","inputRef","_component_el_input","formRef","_unref","ElForm","formItemRef","classNames","excludeAttrs","attrs","excludeKeys","result","__spreadValues","useClassName","defaultClass","excludeKey","useAttrs","mergedAttrs","className","popperClass","tooltipRef","_component_el_tooltip","selectRef","_component_el_select","optionRef","_component_el_option","optionGroupRef","_component_el_option_group","paginationRef","_component_el_pagination","radioRef","_component_el_radio","computedPopperClass","defaultPopperClass","__objRest","radioGroupRef","_component_el_radio_group","radioButtonRef","_component_el_radio_button","switchRef","_component_el_switch","computedType","computedLoading","computedPrefixIcon","computedSuffixIcon","tagRef","_component_el_tag","_hoisted_1","_createElementVNode","_hoisted_2","availableTypes","__default__","useCustomIcon","rest","__spreadProps","iconUrl","_component_el_alert","_createSlots","dialogVisible","_useModel","dialogRef","_createVNode","_component_el_dialog","$slots","_withCtx","close","titleId","titleClass","_normalizeProps","_guardReactiveProps","_sfc_main","_component_el_notification","messages","messageId","Message","config","existingIndex","id","message","index","closeMessage","_hoisted_6","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_9","_toDisplayString","$event","$setup","notifications","notificationId","NotifiMessage","closeNotification","notification","datePickerRef","_component_el_date_picker","availableImages","image","imageUrl","emptyRef","_component_el_empty","innerTableRef","_component_el_table_column","slotProps","slots","useSlots","internalVisible","watch","newVal","bannerStyle","defaultIcons","handleClose","_normalizeClass","_normalizeStyle","addOverrideClass","element","addComponentOverride","componentInstance","applyGlobalOverride","mutations","mutation","node","parent","el","enableH5Override","mode","breakpoint","root","isMobileUA","isNarrow","apply","enable","compute","onResize","forceRefreshStyles","selector","isH5","createOverrideComponent","componentConfig","CONSTANTS","navRef","tabs","activeTab","internalKey","previousTabsCount","previousTabsNames","sortTimer","scrollTimeout","isResetting","resizeObserver","activeBarStyle","getActiveItemPosition","activeItem","itemLeft","actualNavPaddingLeft","navRect","resetActiveBarStyle","activeIndex","tab","centerLeft","shouldScroll","scrollToActiveTab","headerRef","headerWidth","header","headerScrollLeft","itemWidth","itemRight","itemCenter","navWidth","targetScrollLeft","maxScrollLeft","itemVisibleLeft","isItemInView","itemVisibleRight","isInLeftEdge","edgeThreshold","isInRightEdge","handleTabClick","tabName","oldValue","handleTabRemove","sortTabsByDOMOrder","updateUIState","paneElements","contentRef","domOrder","currentOrder","sortedTabs","tabMap","t","unregisterTab","newValue","detectTabsChange","newTabs","newNames","isCountChanged","isOrderChanged","handleTabsListChange","updateArrowVisibility","nav","currentScrollLeft","scrollWidth","clientWidth","showLeftArrow","showRightArrow","rafId","isManualScroll","clearScrollTimers","performScroll","direction","scrollAmount","initDefaultActiveTab","onMounted","onUnmounted","handleScrollLeft","handleScrollRight","_cache","_Fragment","_renderList","tabsContext","inject","tabInfo","doRegisterTab","oldVal","isActive","tabCardContext","option","isDisabled","provide","handleItemClick","item","path","noop","extend","inBrowser","isObject","isDef","isFunction","isPromise","isNumeric","isIOS","get","object","keys","unknownProp","numericProp","truthProp","makeStringProp","defaultVal","onMountedOrActivated","hook","mounted","nextTick","onActivated2","useEventListener","type","listener","passive","capture","cleaned","attached","add","target2","unref2","remove","onUnmounted2","onDeactivated2","stopWatch","isRef","width","height","useWindowSize","ref4","update","overflowScrollReg","defaultRoot","isElement","getScrollParent","overflowY","checkIsIOS","stopPropagation","preventDefault","isStopPropagation","addUnit","getZIndexStyle","zIndex","camelizeRE","camelize","str","_","c","kebabCase","hasOwnProperty","assignKey","to","from","deepAssign","stdin_default","year","month","maxRange","discount","condition","count","lang","reactive","defaultMessages","Locale","newLang","newMessages","createTranslate","prefix","locale","genBem","mods","ret","createBEM","createNamespace","prefixedName","HAPTICS_FEEDBACK","TAP_OFFSET","callInterceptor","interceptor","done","canceled","error","returnVal","withInstall","app","POPUP_TOGGLE_KEY","useExpose","apis","instance","getCurrentInstance","bem","badgeProps","defineComponent","hasContent","content","showZero","renderContent","dot","max","getOffsetWithMinusString","style2","x","y","position","offsetY","offsetX","renderBadge","tag","Badge","_Badge","globalZIndex","useGlobalZIndex","setGlobalZIndex","CONFIG_PROVIDER_KEY","configProviderProps","insertDash","mapThemeVarsToCSSVars","themeVars","cssVars","formattedKey","syncThemeVarsOnRoot","newStyle","oldStyle","addTheme","removeTheme","theme","onActivated","onDeactivated","onBeforeUnmount","newScope","oldScope","watchEffect","isImage","name2","iconProps","classPrefix","size","badge","color","isImageIcon","Icon","_Icon","popupSharedProps","getDirection","useTouch","startX","startY","deltaX","deltaY","isTap","isVertical","isHorizontal","reset","touch","LOCK_DIRECTION_DISTANCE","totalLockCount","BODY_LOCK_CLASS","useLockScroll","rootRef","shouldLock","DIRECTION_UP","DIRECTION_DOWN","onTouchMove","scrollHeight","offsetHeight","scrollTop","status","lock","unlock","init","destroy","useLazyRender","show","inited","render","useScopeId","scopeId","overlayProps","lazyRender","renderOverlay","_withDirectives","_vShow","Content","Transition","Teleport","Overlay","_Overlay","popupProps","opened","shouldReopen","popupRef","open","onClickOverlay","onClickCloseIcon","renderCloseIcon","timer","onOpened","onClosed","onKeydown","renderPopup","destroyOnClose","round","safeAreaInsetTop","safeAreaInsetBottom","renderTransition","transition","transitionAppear","Popup","_Popup","model","pickerConfirm","bindClosePopup","_hoisted_7","components","MIcon","MButton","MInput","MForm","MFormItem","MTooltip","MSelect","MOption","MOptionGroup","MPagination","MRadio","MRadioGroup","MRadioButton","MSwitch","MTag","MAlert","MDialog","MNotification","MMessage","MNotifiMessage","MDatePicker","MEmpty","MTable","MTableColumn","MBanner","MTabs","MTabPane","MTabCard","MTabCardItem","MBreadcrumb","MPicker","convertComponentName","componentName","globalInstanceComponents","createGlobalComponent","_0","__async","component","createApp","h","container","createGlobalComponents","promises","convertedComponents","registerElementPlus","customComponentNames","comp","ElementPlusComponents","mName","exportName","install","styleUtils","convertName","originalName","MMessageBox","mComponents","MButtonGroup","MCarousel","MCarouselItem","MCascader","MCascaderPanel","MCheckTag","MCalendar","MTimePicker","MDateTimePicker","MColorPicker","MTransfer","MTree","MTreeSelect","MUpload","MImage","MImageViewer","MBacktop","MInfiniteScroll","MAffix","MScrollbar","MResult","MSkeleton","MLoading","MSpinner","MProgress","MBadge","MAvatar","MImagePreview","MTeleport","MConfigProvider"],"mappings":"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","x_google_ignoreList":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}