@mc-markets/ui 1.1.37 → 1.1.38

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.mjs","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","../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.iconfont {\r\n display: inline-block;\r\n font-style: normal;\r\n vertical-align: baseline;\r\n text-align: center;\r\n text-transform: none;\r\n line-height: 1;\r\n text-rendering: optimizeLegibility;\r\n -webkit-font-smoothing: antialiased;\r\n -moz-osx-font-smoothing: grayscale;\r\n}\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 { 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","/**\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.37\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\n\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]\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 name = convertComponentName(component?.name)\r\n if (name) {\r\n // 强制注册自定义组件,确保覆盖任何已存在的组件\r\n app.component(name, 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 }\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","_component_el_form","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","_unref","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","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","convertComponentName","componentName","globalInstanceComponents","createGlobalComponent","_0","__async","component","createApp","h","container","error","createGlobalComponents","promises","convertedComponents","registerElementPlus","app","customComponentNames","comp","ElementPlusComponents","mName","exportName","install","styleUtils","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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"}
1
+ {"version":3,"file":"index.mjs","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","../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.iconfont {\r\n display: inline-block;\r\n font-style: normal;\r\n vertical-align: baseline;\r\n text-align: center;\r\n text-transform: none;\r\n line-height: 1;\r\n text-rendering: optimizeLegibility;\r\n -webkit-font-smoothing: antialiased;\r\n -moz-osx-font-smoothing: grayscale;\r\n}\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 { 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 font-size: 0;\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 height: 20px;\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","/**\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.38\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\n\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]\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 name = convertComponentName(component?.name)\r\n if (name) {\r\n // 强制注册自定义组件,确保覆盖任何已存在的组件\r\n app.component(name, 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 }\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","_component_el_form","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","_unref","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","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","convertComponentName","componentName","globalInstanceComponents","createGlobalComponent","_0","__async","component","createApp","h","container","error","createGlobalComponents","promises","convertedComponents","registerElementPlus","app","customComponentNames","comp","ElementPlusComponents","mName","exportName","install","styleUtils","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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"}