@mc-markets/ui 1.0.74 → 1.0.75

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/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/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/components/Tabs/Tabs.vue","../packages/components/Tabs/TabPane.vue","../packages/utils/styleUtils.js","../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","<template>\r\n <el-button 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\ndefineOptions({\r\n name: 'MButton'\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n// Button 组件样式 - 使用高优先级选择器确保不被全局样式覆盖\r\n\r\n</style>","<template>\r\n <el-input 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\ndefineOptions({\r\n name: 'MInput'\r\n})\r\n</script>\r\n<style lang=\"scss\">\r\n// Input 组件样式 - 使用更具体的选择器确保样式优先级\r\n.m-input.el-input {\r\n &.solid {\r\n --el-border-color: var(--bg-tertiary-hover);\r\n \r\n .el-input__wrapper {\r\n background: var(--all-alphe-white-6);\r\n }\r\n }\r\n}\r\n</style>","<template>\r\n <el-form 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\ndefineOptions({\r\n name: 'MForm'\r\n})\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\">\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</script>\r\n\r\n<style lang=\"scss\">\r\n// FormItem 组件样式 - 使用 m-form-item 类名隔离样式\r\n.m-form-item {\r\n // 自定义样式可以在这里添加\r\n}\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 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\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</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 class=\"m-select2\"\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\ndefineOptions({\r\n name: \"MSelect\",\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\r\n</style>\r\n","<template>\r\n <el-option 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\ndefineOptions({\r\n name: 'MOption'\r\n})\r\n</script>\r\n","<template>\r\n <el-option-group 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\ndefineOptions({\r\n name: 'MOptionGroup'\r\n})\r\n</script>\r\n","\r\n<template>\r\n <el-pagination 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\ndefineOptions({\r\n name: 'MPagination'\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.m-pagination {\r\n &.is-background .el-pager li.is-active{\r\n color: var(--text-quaternary) !important;\r\n }\r\n}\r\n</style>\r\n\r\n","<template>\r\n <el-radio 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\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</script>\r\n\r\n<style lang=\"scss\">\r\n// Radio popper-class 样式\r\n// .mc-radio-popper {\r\n// 自定义单选框样式可以在这里添加\r\n// }\r\n\r\n// 自定义主题示例\r\n.mc-radio-custom {\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.mc-radio-success {\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.mc-radio-warning {\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.mc-radio-danger {\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</style>\r\n","<template>\r\n <el-radio-group 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\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</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 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\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</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 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\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 } = useClassName('mc-switch-popper')\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n// Switch popper-class 样式\r\n// .mc-switch-popper {\r\n// 自定义开关样式可以在这里添加\r\n// }\r\n\r\n// 自定义主题示例\r\n.mc-switch-custom {\r\n .el-switch__core {\r\n background: linear-gradient(45deg, #667eea, #764ba2);\r\n border-color: #667eea;\r\n \r\n &:after {\r\n background: white;\r\n }\r\n }\r\n \r\n &.is-checked .el-switch__core {\r\n background: linear-gradient(45deg, #4c63d2, #5d3a7e);\r\n border-color: #4c63d2;\r\n }\r\n}\r\n\r\n.mc-switch-success {\r\n .el-switch__core {\r\n background-color: #67c23a;\r\n border-color: #67c23a;\r\n \r\n &:after {\r\n background: white;\r\n }\r\n }\r\n \r\n &.is-checked .el-switch__core {\r\n background-color: #529b2e;\r\n border-color: #529b2e;\r\n }\r\n}\r\n\r\n.mc-switch-warning {\r\n .el-switch__core {\r\n background-color: #e6a23c;\r\n border-color: #e6a23c;\r\n \r\n &:after {\r\n background: white;\r\n }\r\n }\r\n \r\n &.is-checked .el-switch__core {\r\n background-color: #c8951f;\r\n border-color: #c8951f;\r\n }\r\n}\r\n\r\n.mc-switch-danger {\r\n .el-switch__core {\r\n background-color: #f56c6c;\r\n border-color: #f56c6c;\r\n \r\n &:after {\r\n background: white;\r\n }\r\n }\r\n \r\n &.is-checked .el-switch__core {\r\n background-color: #f24545;\r\n border-color: #f24545;\r\n }\r\n}\r\n\r\n// 特殊样式变体\r\n.mc-switch-gradient {\r\n .el-switch__core {\r\n background: linear-gradient(90deg, #ff6b6b, #4ecdc4);\r\n border: none;\r\n \r\n &:after {\r\n background: white;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n }\r\n }\r\n \r\n &.is-checked .el-switch__core {\r\n background: linear-gradient(90deg, #4ecdc4, #45b7d1);\r\n }\r\n}\r\n\r\n.mc-switch-neon {\r\n .el-switch__core {\r\n background-color: #1a1a1a;\r\n border: 2px solid #00ffff;\r\n box-shadow: 0 0 10px #00ffff;\r\n \r\n &:after {\r\n background: #00ffff;\r\n box-shadow: 0 0 5px #00ffff;\r\n }\r\n }\r\n \r\n &.is-checked .el-switch__core {\r\n background-color: #00ffff;\r\n border-color: #00ffff;\r\n box-shadow: 0 0 15px #00ffff;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-tag v-bind=\"$attrs\" class=\"m-tag\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-tag>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n name: 'MTag'\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n// Tag 组件样式 - 使用 m-tag 类名隔离样式\r\n.m-tag.el-tag {\r\n // 自定义样式可以在这里添加\r\n font-size: var(--font-size-text-sm);\r\n --el-tag-border-radius: 8px;\r\n\r\n &.el-tag--primary {\r\n --el-tag-bg-color: color-mix(in srgb, var(--text-warning-primary) 10%, transparent);\r\n --el-tag-border-color: color-mix(in srgb, var(--text-warning-primary) 20%, transparent);\r\n --el-tag-text-color: var(--text-warning-primary);\r\n }\r\n &.el-tag--success {\r\n --el-tag-bg-color: color-mix(in srgb, var(--text-success-primary) 10%, transparent);\r\n --el-tag-border-color: color-mix(in srgb, var(--text-success-primary) 20%, transparent);\r\n --el-tag-text-color: var(--text-success-primary);\r\n }\r\n &.el-tag--danger {\r\n --el-tag-bg-color: color-mix(in srgb, var(--text-error-primary) 10%, transparent);\r\n --el-tag-border-color: color-mix(in srgb, var(--text-error-primary) 20%, transparent);\r\n --el-tag-text-color: var(--text-error-primary);\r\n }\r\n &.el-tag--info {\r\n --el-tag-bg-color: color-mix(in srgb, var(--text-primary) 10%, transparent);\r\n --el-tag-border-color: color-mix(in srgb, var(--text-primary) 20%, transparent);\r\n --el-tag-text-color: var(--text-primary);\r\n }\r\n &.el-tag--dark{\r\n &.el-tag--warning {\r\n --el-tag-bg-color: color-mix(in srgb, var(--text-warning-primary) 10%, transparent);\r\n --el-tag-border-color: transparent;\r\n }\r\n &.el-tag--success {\r\n --el-tag-bg-color: color-mix(in srgb, var(--text-success-primary) 10%, transparent);\r\n --el-tag-border-color: transparent;\r\n }\r\n &.el-tag--danger {\r\n --el-tag-bg-color: color-mix(in srgb, var(--text-error-primary) 10%, transparent);\r\n --el-tag-border-color: transparent;\r\n }\r\n &.el-tag--info {\r\n --el-tag-bg-color: var(--bg-tertiary-hover);\r\n --el-tag-border-color: transparent;\r\n }\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 `/images/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 }\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 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 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\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\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=\"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: 24px;\r\n height: 24px;\r\n border: none;\r\n background: rgba(255, 255, 255, 0.1);\r\n color: rgba(255, 255, 255, 0.6);\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: 16px;\r\n line-height: 1;\r\n transition: all 0.2s ease;\r\n \r\n &:hover {\r\n background: rgba(255, 255, 255, 0.2);\r\n color: rgba(255, 255, 255, 0.9);\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 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-date-picker>\r\n</template>\r\n\r\n<script setup>\r\nimport { useClassName } from \"@packages/hooks/useClassName.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});\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</script>\r\n<style lang=\"scss\">\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 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\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 `/images/empty/${image}.png`\r\n})\r\n</script>\r\n","<template>\r\n <el-table 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-table>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n name: \"MTable\",\r\n});\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]>\r\n <slot :name=\"name\" />\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","<template>\r\n <div class=\"m-tabs\" :class=\"[`m-tabs--${type}`, `m-tabs--${tabPosition}`]\">\r\n <div class=\"m-tabs__header\">\r\n <div class=\"m-tabs__nav\">\r\n <div\r\n v-for=\"(tab, index) in tabs\"\r\n :key=\"tab.name || index\"\r\n :class=\"[\r\n 'm-tabs__item',\r\n {\r\n 'm-tabs__item--active': activeName === (tab.name || index),\r\n 'm-tabs__item--disabled': tab.disabled,\r\n 'm-tabs__item--closable': tab.closable\r\n }\r\n ]\"\r\n @click=\"handleTabClick(tab, index)\"\r\n >\r\n <span class=\"m-tabs__item-text\">\r\n <slot v-if=\"tab.$slots?.label\" :name=\"`tab-${tab.name || index}`\" />\r\n <span v-else>{{ tab.label }}</span>\r\n </span>\r\n <span\r\n v-if=\"tab.closable\"\r\n class=\"m-tabs__item-close\"\r\n @click.stop=\"handleTabClose(tab, index)\"\r\n >\r\n <m-icon name=\"lucide-x\" :size=\"12\" />\r\n </span>\r\n </div>\r\n \r\n <!-- 添加按钮 -->\r\n <div\r\n v-if=\"addable || editable\"\r\n class=\"m-tabs__item m-tabs__item--add\"\r\n @click=\"handleTabAdd\"\r\n >\r\n <m-icon name=\"plus\" :size=\"12\" />\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"m-tabs__content\">\r\n <slot />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, provide, computed, useSlots, watch, nextTick } from 'vue'\r\nimport MIcon from '../Icon/Icon.vue'\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 当前激活的标签页\r\n modelValue: {\r\n type: [String, Number],\r\n default: ''\r\n },\r\n // 标签页类型\r\n type: {\r\n type: String,\r\n default: '',\r\n validator: (value) => ['', 'card', 'border-card'].includes(value)\r\n },\r\n // 标签位置\r\n tabPosition: {\r\n type: String,\r\n default: 'top',\r\n validator: (value) => ['top', 'right', 'bottom', 'left'].includes(value)\r\n },\r\n // 是否可关闭\r\n closable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 是否可添加\r\n addable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 是否可编辑(同时可添加和关闭)\r\n editable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 标签宽度是否自撑开\r\n stretch: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 切换前的钩子函数\r\n beforeLeave: {\r\n type: Function,\r\n default: null\r\n }\r\n})\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['update:modelValue', 'tab-click', 'tab-change', 'tab-remove', 'tab-add', 'edit'])\r\n\r\n// 获取插槽\r\nconst slots = useSlots()\r\n\r\n// 响应式数据\r\nconst tabs = ref([])\r\nconst activeName = ref(props.modelValue)\r\n\r\n// 监听 modelValue 变化\r\nwatch(() => props.modelValue, (newVal) => {\r\n activeName.value = newVal\r\n})\r\n\r\n// 监听 activeName 变化\r\nwatch(activeName, (newVal) => {\r\n emit('update:modelValue', newVal)\r\n emit('tab-change', newVal)\r\n})\r\n\r\n// 提供上下文给子组件\r\nprovide('tabsContext', {\r\n registerTab: (tab) => {\r\n const index = tabs.value.findIndex(t => t.name === tab.name)\r\n if (index >= 0) {\r\n tabs.value[index] = tab\r\n } else {\r\n tabs.value.push(tab)\r\n }\r\n \r\n // 如果没有指定 activeName,默认选中第一个\r\n if (!activeName.value && tabs.value.length > 0) {\r\n activeName.value = tabs.value[0].name || 0\r\n }\r\n },\r\n unregisterTab: (name) => {\r\n const index = tabs.value.findIndex(tab => tab.name === name)\r\n if (index >= 0) {\r\n tabs.value.splice(index, 1)\r\n }\r\n }\r\n})\r\n\r\n// 处理标签点击\r\nconst handleTabClick = async (tab, index) => {\r\n if (tab.disabled) return\r\n \r\n const tabName = tab.name || index\r\n \r\n // 如果点击的是当前激活的标签,直接返回\r\n if (activeName.value === tabName) return\r\n \r\n // 执行 beforeLeave 钩子\r\n if (props.beforeLeave) {\r\n try {\r\n const result = await props.beforeLeave(activeName.value, tabName)\r\n if (result === false) return\r\n } catch (error) {\r\n return\r\n }\r\n }\r\n \r\n activeName.value = tabName\r\n emit('tab-click', { name: tabName, index, disabled: tab.disabled })\r\n}\r\n\r\n// 处理标签关闭\r\nconst handleTabClose = (tab, index) => {\r\n const tabName = tab.name || index\r\n emit('tab-remove', tabName)\r\n emit('edit', tabName, 'remove')\r\n}\r\n\r\n// 处理添加标签\r\nconst handleTabAdd = () => {\r\n emit('tab-add')\r\n emit('edit', '', 'add')\r\n}\r\n\r\n// 暴露方法给父组件\r\ndefineExpose({\r\n activeName: computed(() => activeName.value)\r\n})\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.m-tabs {\r\n display: flex;\r\n flex-direction: column;\r\n \r\n &--left {\r\n flex-direction: row;\r\n }\r\n \r\n &--right {\r\n flex-direction: row-reverse;\r\n }\r\n \r\n &--bottom {\r\n flex-direction: column-reverse;\r\n }\r\n\r\n &__header {\r\n flex-shrink: 0;\r\n }\r\n\r\n &__nav {\r\n display: flex;\r\n border-bottom: 1px solid var(--el-border-color);\r\n position: relative;\r\n \r\n .m-tabs--card &,\r\n .m-tabs--border-card & {\r\n border-bottom: none;\r\n }\r\n \r\n .m-tabs--left &,\r\n .m-tabs--right & {\r\n flex-direction: column;\r\n border-bottom: none;\r\n border-right: 1px solid var(--el-border-color);\r\n width: 120px;\r\n }\r\n \r\n .m-tabs--right & {\r\n border-right: none;\r\n border-left: 1px solid var(--el-border-color);\r\n }\r\n }\r\n\r\n &__item {\r\n display: flex;\r\n align-items: center;\r\n padding: 8px 16px;\r\n cursor: pointer;\r\n border: 1px solid transparent;\r\n border-bottom: none;\r\n background: transparent;\r\n color: var(--el-text-color-regular);\r\n font-size: 14px;\r\n transition: all 0.3s ease;\r\n position: relative;\r\n flex-shrink: 0;\r\n \r\n &:hover {\r\n color: var(--el-color-primary);\r\n }\r\n \r\n &--active {\r\n color: var(--el-color-primary);\r\n border-color: var(--el-border-color);\r\n border-bottom-color: var(--el-bg-color);\r\n background: var(--el-bg-color);\r\n \r\n &::after {\r\n content: '';\r\n position: absolute;\r\n bottom: -1px;\r\n left: 0;\r\n right: 0;\r\n height: 2px;\r\n background: var(--el-color-primary);\r\n }\r\n }\r\n \r\n &--disabled {\r\n color: var(--el-text-color-disabled);\r\n cursor: not-allowed;\r\n \r\n &:hover {\r\n color: var(--el-text-color-disabled);\r\n }\r\n }\r\n \r\n &--closable {\r\n padding-right: 24px;\r\n }\r\n \r\n &--add {\r\n padding: 8px 12px;\r\n border: 1px dashed var(--el-border-color);\r\n color: var(--el-text-color-regular);\r\n \r\n &:hover {\r\n color: var(--el-color-primary);\r\n border-color: var(--el-color-primary);\r\n }\r\n }\r\n \r\n // 卡片风格\r\n .m-tabs--card & {\r\n border: 1px solid var(--el-border-color);\r\n border-bottom: none;\r\n margin-right: 2px;\r\n \r\n &--active {\r\n border-bottom-color: var(--el-bg-color);\r\n background: var(--el-bg-color);\r\n \r\n &::after {\r\n display: none;\r\n }\r\n }\r\n }\r\n \r\n // 边框卡片风格\r\n .m-tabs--border-card & {\r\n border: 1px solid var(--el-border-color);\r\n border-bottom: none;\r\n margin-right: -1px;\r\n background: var(--el-fill-color-light);\r\n \r\n &--active {\r\n background: var(--el-bg-color);\r\n border-bottom-color: var(--el-bg-color);\r\n \r\n &::after {\r\n display: none;\r\n }\r\n }\r\n }\r\n \r\n // 左侧和右侧位置\r\n .m-tabs--left &,\r\n .m-tabs--right & {\r\n border-bottom: 1px solid var(--el-border-color);\r\n border-right: none;\r\n \r\n &--active {\r\n border-bottom-color: var(--el-border-color);\r\n border-right-color: var(--el-bg-color);\r\n \r\n &::after {\r\n display: none;\r\n }\r\n }\r\n }\r\n \r\n .m-tabs--right & {\r\n border-bottom: 1px solid var(--el-border-color);\r\n border-left: none;\r\n \r\n &--active {\r\n border-bottom-color: var(--el-border-color);\r\n border-left-color: var(--el-bg-color);\r\n }\r\n }\r\n }\r\n\r\n &__item-text {\r\n flex: 1;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n &__item-close {\r\n position: absolute;\r\n right: 8px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 16px;\r\n height: 16px;\r\n border-radius: 50%;\r\n transition: background-color 0.2s ease;\r\n \r\n &:hover {\r\n background-color: var(--el-fill-color);\r\n }\r\n }\r\n\r\n &__content {\r\n flex: 1;\r\n padding: 16px 0;\r\n \r\n .m-tabs--card &,\r\n .m-tabs--border-card & {\r\n padding: 16px;\r\n border: 1px solid var(--el-border-color);\r\n border-top: none;\r\n }\r\n \r\n .m-tabs--border-card & {\r\n background: var(--el-bg-color);\r\n }\r\n \r\n .m-tabs--left &,\r\n .m-tabs--right & {\r\n flex: 1;\r\n padding: 0 0 0 16px;\r\n }\r\n \r\n .m-tabs--right & {\r\n padding: 0 16px 0 0;\r\n }\r\n }\r\n}\r\n\r\n// 响应式设计\r\n@media (max-width: 768px) {\r\n .m-tabs {\r\n &__item {\r\n padding: 6px 12px;\r\n font-size: 13px;\r\n }\r\n \r\n &--left &__nav,\r\n &--right &__nav {\r\n width: 100px;\r\n }\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <div\r\n v-show=\"active\"\r\n class=\"m-tab-pane\"\r\n :class=\"{\r\n 'm-tab-pane--active': active,\r\n 'm-tab-pane--disabled': disabled\r\n }\"\r\n >\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { inject, computed, onMounted, onUnmounted, useSlots } from 'vue'\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 选项卡标题\r\n label: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否禁用\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 选项卡名称,用于标识\r\n name: {\r\n type: [String, Number],\r\n default: ''\r\n },\r\n // 是否可关闭\r\n closable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 是否延迟渲染\r\n lazy: {\r\n type: Boolean,\r\n default: false\r\n }\r\n})\r\n\r\n// 获取插槽\r\nconst slots = useSlots()\r\n\r\n// 注入父组件上下文\r\nconst tabsContext = inject('tabsContext')\r\n\r\n// 计算是否激活\r\nconst active = computed(() => {\r\n if (!tabsContext) return false\r\n return tabsContext.activeName === (props.name || tabsContext.tabIndex)\r\n})\r\n\r\n// 组件挂载时注册到父组件\r\nonMounted(() => {\r\n if (tabsContext) {\r\n const tabData = {\r\n name: props.name,\r\n label: props.label,\r\n disabled: props.disabled,\r\n closable: props.closable,\r\n $slots: slots\r\n }\r\n tabsContext.registerTab(tabData)\r\n }\r\n})\r\n\r\n// 组件卸载时从父组件中移除\r\nonUnmounted(() => {\r\n if (tabsContext) {\r\n tabsContext.unregisterTab(props.name)\r\n }\r\n})\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: 'MTabPane'\r\n})\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.m-tab-pane {\r\n display: none;\r\n \r\n &--active {\r\n display: block;\r\n }\r\n \r\n &--disabled {\r\n opacity: 0.6;\r\n pointer-events: none;\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 && 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 * 强制刷新组件样式\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 * 创建带有样式覆盖的 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","/**\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.0.74\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 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\n\r\nconst components = [MIcon, MButton, MInput, MForm, MFormItem, MTooltip, MSelect, MOption, MOptionGroup, MPagination, MRadio, MRadioGroup, MRadioButton, MSwitch, MTag, MAlert, MDialog, MNotification, MNotifiMessage, MDatePicker, MEmpty, MTable, MTableColumn, MBanner, MTabs, MTabPane]\r\n\r\n// 存储转换后的 Element Plus 组件\r\nconst convertedComponents = {}\r\n\r\nfunction registerElementPlus(app) {\r\n // 获取已注册的自定义组件名称\r\n const customComponentNames = components.map(comp => {\r\n if (comp && comp.name && typeof comp.name === 'string') {\r\n let name = comp.name.toLowerCase()\r\n const nameMap = {\r\n 'mradiogroup': 'm-radio-group',\r\n 'mradiobutton': 'm-radio-button',\r\n 'mformitem': 'm-form-item',\r\n 'moptiongroup': 'm-option-group',\r\n 'mtabs': 'm-tabs',\r\n 'mtabpane': 'm-tab-pane'\r\n }\r\n return nameMap[name] || name.replace(/^m/, 'm-')\r\n }\r\n return null\r\n }).filter(Boolean)\r\n \r\n console.log('🔧 自定义组件列表:', customComponentNames)\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 console.log(`✅ 注册 Element Plus 组件: ${mName}`)\r\n } else {\r\n console.log(`⚠️ 组件 ${mName} 已存在,跳过注册`)\r\n }\r\n } else {\r\n console.log(`🎯 自定义组件覆盖: ${mName} (使用自定义组件)`)\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 }) => {\r\n applyGlobalOverride();\r\n });\r\n }\r\n \r\n console.log('🚀 开始安装 @mc-markets/ui 组件库...')\r\n \r\n // 先注册自定义组件 - 确保优先级\r\n components.forEach(component => {\r\n if (component && component.name && typeof component.name === 'string') {\r\n let name = component.name.toLowerCase()\r\n // 处理特定的组件名称映射\r\n const nameMap = {\r\n 'mradiogroup': 'm-radio-group',\r\n 'mradiobutton': 'm-radio-button',\r\n 'mformitem': 'm-form-item',\r\n 'moptiongroup': 'm-option-group',\r\n 'mtabs': 'm-tabs',\r\n 'mtabpane': 'm-tab-pane'\r\n }\r\n name = nameMap[name] || name.replace(/^m/, 'm-')\r\n \r\n // 强制注册自定义组件,确保覆盖任何已存在的组件\r\n app.component(name, component)\r\n console.log(`🎯 注册自定义组件: ${name} (${component.name})`)\r\n }\r\n })\r\n \r\n // 然后注册转换后的 Element Plus 组件(只注册没有自定义组件覆盖的)\r\n registerElementPlus(app)\r\n \r\n console.log('✅ @mc-markets/ui 组件库安装完成!')\r\n}\r\n\r\n// 工具函数:检查组件注册状态\r\nexport function checkComponentRegistration(app) {\r\n const registeredComponents = Object.keys(app._context.components || {})\r\n const customComponents = components.map(comp => {\r\n if (comp && comp.name && typeof comp.name === 'string') {\r\n let name = comp.name.toLowerCase()\r\n const nameMap = {\r\n 'mradiogroup': 'm-radio-group',\r\n 'mradiobutton': 'm-radio-button',\r\n 'mformitem': 'm-form-item',\r\n 'moptiongroup': 'm-option-group',\r\n 'mtabs': 'm-tabs',\r\n 'mtabpane': 'm-tab-pane'\r\n }\r\n return nameMap[name] || name.replace(/^m/, 'm-')\r\n }\r\n return null\r\n }).filter(Boolean)\r\n \r\n console.log('📊 组件注册状态报告:')\r\n console.log('已注册的组件:', registeredComponents.filter(name => name.startsWith('m-')))\r\n console.log('自定义组件:', customComponents)\r\n \r\n return {\r\n registered: registeredComponents,\r\n custom: customComponents,\r\n conflicts: registeredComponents.filter(name => \r\n name.startsWith('m-') && customComponents.includes(name)\r\n )\r\n }\r\n}\r\n\r\nexport default { install }\r\nexport { MIcon, MButton, MInput, MForm, MFormItem, MTooltip, MSelect, MPagination, MRadio, MRadioGroup, MRadioButton, MSwitch, MTag, MAlert, MDialog, MNotification, MNotifiMessage, MDatePicker, MEmpty, MTable, MTableColumn, MBanner, MTabs, MTabPane }\r\n\r\n// 导出样式工具函数\r\nexport { \r\n addOverrideClass, \r\n addComponentOverride, \r\n applyGlobalOverride, \r\n forceRefreshStyles,\r\n createOverrideComponent \r\n} from './utils/styleUtils.js'\r\n\r\n// 手动导出常用的 Element Plus 函数(只导出函数,不导出组件)\r\nexport const MMessage = ElementPlusComponents.ElMessage\r\nexport const MMessageBox = ElementPlusComponents.ElMessageBox\r\n\r\n// 导出 NotifiMessage 类\r\nexport { 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 MBreadcrumb = convertedComponents.MBreadcrumb\r\nexport const MBreadcrumbItem = convertedComponents.MBreadcrumbItem\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","_createBlock","_component_el_button","_ctx","_createSlots","_renderSlot","name","_component_el_form","_component_el_form_item","classNames","excludeAttrs","attrs","excludeKeys","result","__spreadValues","key","useClassName","defaultClass","excludeKey","useAttrs","mergedAttrs","className","popperClass","_component_el_tooltip","_unref","_component_el_select","_component_el_option","_normalizeProps","_guardReactiveProps","_component_el_option_group","_component_el_pagination","_component_el_radio","computedPopperClass","defaultPopperClass","_a","__objRest","_component_el_radio_button","_component_el_tag","availableTypes","__default__","useCustomIcon","rest","__spreadProps","iconUrl","_component_el_alert","dialogVisible","_useModel","_createVNode","_component_el_dialog","$slots","_withCtx","close","titleId","titleClass","_sfc_main","_component_el_notification","notifications","ref","notificationId","NotifiMessage","options","config","id","index","closeNotification","_hoisted_1","_hoisted_2","_hoisted_3","notification","_createElementVNode","_toDisplayString","_hoisted_4","$event","$setup","_component_el_date_picker","availableImages","image","imageUrl","_component_el_empty","_component_el_table","_component_el_table_column","slots","useSlots","internalVisible","watch","newVal","bannerStyle","defaultIcons","handleClose","__expose","_normalizeClass","_normalizeStyle","tabs","activeName","provide","tab","t","handleTabClick","__async","tabName","error","handleTabClose","handleTabAdd","_Fragment","_renderList","_withModifiers","_hoisted_7","tabsContext","inject","active","onMounted","tabData","onUnmounted","addOverrideClass","element","addComponentOverride","componentInstance","applyGlobalOverride","mutations","mutation","node","parent","el","forceRefreshStyles","selector","createOverrideComponent","componentConfig","components","MIcon","MButton","MInput","MForm","MFormItem","MTooltip","MSelect","MOption","MOptionGroup","MPagination","MRadio","MRadioGroup","MRadioButton","MSwitch","MTag","MAlert","MDialog","MNotification","MNotifiMessage","MDatePicker","MEmpty","MTable","MTableColumn","MBanner","MTabs","MTabPane","convertedComponents","registerElementPlus","app","customComponentNames","comp","ElementPlusComponents","mName","exportName","install","styleUtils","component","checkComponentRegistration","registeredComponents","customComponents","MMessage","MMessageBox","mComponents","MButtonGroup","MBreadcrumb","MBreadcrumbItem","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/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/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/components/Tabs/Tabs.vue","../packages/components/Tabs/TabPane.vue","../packages/utils/styleUtils.js","../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","<template>\r\n <el-button 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\ndefineOptions({\r\n name: 'MButton'\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n// Button 组件样式 - 使用高优先级选择器确保不被全局样式覆盖\r\n\r\n</style>","<template>\r\n <el-input 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\ndefineOptions({\r\n name: 'MInput'\r\n})\r\n</script>\r\n<style lang=\"scss\">\r\n\r\n</style>","<template>\r\n <el-form 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\ndefineOptions({\r\n name: 'MForm'\r\n})\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\">\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</script>\r\n\r\n<style lang=\"scss\">\r\n// FormItem 组件样式 - 使用 m-form-item 类名隔离样式\r\n.m-form-item {\r\n // 自定义样式可以在这里添加\r\n}\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 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\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</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 class=\"m-select2\"\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\ndefineOptions({\r\n name: \"MSelect\",\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n\r\n</style>\r\n","<template>\r\n <el-option 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\ndefineOptions({\r\n name: 'MOption'\r\n})\r\n</script>\r\n","<template>\r\n <el-option-group 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\ndefineOptions({\r\n name: 'MOptionGroup'\r\n})\r\n</script>\r\n","\r\n<template>\r\n <el-pagination 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\ndefineOptions({\r\n name: 'MPagination'\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.m-pagination {\r\n &.is-background .el-pager li.is-active{\r\n color: var(--text-quaternary) !important;\r\n }\r\n}\r\n</style>\r\n\r\n","<template>\r\n <el-radio 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\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</script>\r\n\r\n<style lang=\"scss\">\r\n// Radio popper-class 样式\r\n// .mc-radio-popper {\r\n// 自定义单选框样式可以在这里添加\r\n// }\r\n\r\n// 自定义主题示例\r\n.mc-radio-custom {\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.mc-radio-success {\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.mc-radio-warning {\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.mc-radio-danger {\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</style>\r\n","<template>\r\n <el-radio-group 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\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</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 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\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</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 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\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 } = useClassName('mc-switch-popper')\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n// Switch popper-class 样式\r\n// .mc-switch-popper {\r\n// 自定义开关样式可以在这里添加\r\n// }\r\n\r\n// 自定义主题示例\r\n.mc-switch-custom {\r\n .el-switch__core {\r\n background: linear-gradient(45deg, #667eea, #764ba2);\r\n border-color: #667eea;\r\n \r\n &:after {\r\n background: white;\r\n }\r\n }\r\n \r\n &.is-checked .el-switch__core {\r\n background: linear-gradient(45deg, #4c63d2, #5d3a7e);\r\n border-color: #4c63d2;\r\n }\r\n}\r\n\r\n.mc-switch-success {\r\n .el-switch__core {\r\n background-color: #67c23a;\r\n border-color: #67c23a;\r\n \r\n &:after {\r\n background: white;\r\n }\r\n }\r\n \r\n &.is-checked .el-switch__core {\r\n background-color: #529b2e;\r\n border-color: #529b2e;\r\n }\r\n}\r\n\r\n.mc-switch-warning {\r\n .el-switch__core {\r\n background-color: #e6a23c;\r\n border-color: #e6a23c;\r\n \r\n &:after {\r\n background: white;\r\n }\r\n }\r\n \r\n &.is-checked .el-switch__core {\r\n background-color: #c8951f;\r\n border-color: #c8951f;\r\n }\r\n}\r\n\r\n.mc-switch-danger {\r\n .el-switch__core {\r\n background-color: #f56c6c;\r\n border-color: #f56c6c;\r\n \r\n &:after {\r\n background: white;\r\n }\r\n }\r\n \r\n &.is-checked .el-switch__core {\r\n background-color: #f24545;\r\n border-color: #f24545;\r\n }\r\n}\r\n\r\n// 特殊样式变体\r\n.mc-switch-gradient {\r\n .el-switch__core {\r\n background: linear-gradient(90deg, #ff6b6b, #4ecdc4);\r\n border: none;\r\n \r\n &:after {\r\n background: white;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\r\n }\r\n }\r\n \r\n &.is-checked .el-switch__core {\r\n background: linear-gradient(90deg, #4ecdc4, #45b7d1);\r\n }\r\n}\r\n\r\n.mc-switch-neon {\r\n .el-switch__core {\r\n background-color: #1a1a1a;\r\n border: 2px solid #00ffff;\r\n box-shadow: 0 0 10px #00ffff;\r\n \r\n &:after {\r\n background: #00ffff;\r\n box-shadow: 0 0 5px #00ffff;\r\n }\r\n }\r\n \r\n &.is-checked .el-switch__core {\r\n background-color: #00ffff;\r\n border-color: #00ffff;\r\n box-shadow: 0 0 15px #00ffff;\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <el-tag v-bind=\"$attrs\" class=\"m-tag\">\r\n <template v-for=\"(_, name) in $slots\" :key=\"name\" #[name]>\r\n <slot :name=\"name\" />\r\n </template>\r\n </el-tag>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n name: 'MTag'\r\n})\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n// Tag 组件样式 - 使用 m-tag 类名隔离样式\r\n.m-tag.el-tag {\r\n // 自定义样式可以在这里添加\r\n font-size: var(--font-size-text-sm);\r\n --el-tag-border-radius: 8px;\r\n\r\n &.el-tag--primary {\r\n --el-tag-bg-color: color-mix(in srgb, var(--text-warning-primary) 10%, transparent);\r\n --el-tag-border-color: color-mix(in srgb, var(--text-warning-primary) 20%, transparent);\r\n --el-tag-text-color: var(--text-warning-primary);\r\n }\r\n &.el-tag--success {\r\n --el-tag-bg-color: color-mix(in srgb, var(--text-success-primary) 10%, transparent);\r\n --el-tag-border-color: color-mix(in srgb, var(--text-success-primary) 20%, transparent);\r\n --el-tag-text-color: var(--text-success-primary);\r\n }\r\n &.el-tag--danger {\r\n --el-tag-bg-color: color-mix(in srgb, var(--text-error-primary) 10%, transparent);\r\n --el-tag-border-color: color-mix(in srgb, var(--text-error-primary) 20%, transparent);\r\n --el-tag-text-color: var(--text-error-primary);\r\n }\r\n &.el-tag--info {\r\n --el-tag-bg-color: color-mix(in srgb, var(--text-primary) 10%, transparent);\r\n --el-tag-border-color: color-mix(in srgb, var(--text-primary) 20%, transparent);\r\n --el-tag-text-color: var(--text-primary);\r\n }\r\n &.el-tag--dark{\r\n &.el-tag--warning {\r\n --el-tag-bg-color: color-mix(in srgb, var(--text-warning-primary) 10%, transparent);\r\n --el-tag-border-color: transparent;\r\n }\r\n &.el-tag--success {\r\n --el-tag-bg-color: color-mix(in srgb, var(--text-success-primary) 10%, transparent);\r\n --el-tag-border-color: transparent;\r\n }\r\n &.el-tag--danger {\r\n --el-tag-bg-color: color-mix(in srgb, var(--text-error-primary) 10%, transparent);\r\n --el-tag-border-color: transparent;\r\n }\r\n &.el-tag--info {\r\n --el-tag-bg-color: var(--bg-tertiary-hover);\r\n --el-tag-border-color: transparent;\r\n }\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 `/images/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 }\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 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 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\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\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=\"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: 24px;\r\n height: 24px;\r\n border: none;\r\n background: rgba(255, 255, 255, 0.1);\r\n color: rgba(255, 255, 255, 0.6);\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: 16px;\r\n line-height: 1;\r\n transition: all 0.2s ease;\r\n \r\n &:hover {\r\n background: rgba(255, 255, 255, 0.2);\r\n color: rgba(255, 255, 255, 0.9);\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 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-date-picker>\r\n</template>\r\n\r\n<script setup>\r\nimport { useClassName } from \"@packages/hooks/useClassName.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});\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</script>\r\n<style lang=\"scss\">\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 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\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 `/images/empty/${image}.png`\r\n})\r\n</script>\r\n","<template>\r\n <el-table 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-table>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n name: \"MTable\",\r\n});\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]>\r\n <slot :name=\"name\" />\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","<template>\r\n <div class=\"m-tabs\" :class=\"[`m-tabs--${type}`, `m-tabs--${tabPosition}`]\">\r\n <div class=\"m-tabs__header\">\r\n <div class=\"m-tabs__nav\">\r\n <div\r\n v-for=\"(tab, index) in tabs\"\r\n :key=\"tab.name || index\"\r\n :class=\"[\r\n 'm-tabs__item',\r\n {\r\n 'm-tabs__item--active': activeName === (tab.name || index),\r\n 'm-tabs__item--disabled': tab.disabled,\r\n 'm-tabs__item--closable': tab.closable\r\n }\r\n ]\"\r\n @click=\"handleTabClick(tab, index)\"\r\n >\r\n <span class=\"m-tabs__item-text\">\r\n <slot v-if=\"tab.$slots?.label\" :name=\"`tab-${tab.name || index}`\" />\r\n <span v-else>{{ tab.label }}</span>\r\n </span>\r\n <span\r\n v-if=\"tab.closable\"\r\n class=\"m-tabs__item-close\"\r\n @click.stop=\"handleTabClose(tab, index)\"\r\n >\r\n <m-icon name=\"lucide-x\" :size=\"12\" />\r\n </span>\r\n </div>\r\n \r\n <!-- 添加按钮 -->\r\n <div\r\n v-if=\"addable || editable\"\r\n class=\"m-tabs__item m-tabs__item--add\"\r\n @click=\"handleTabAdd\"\r\n >\r\n <m-icon name=\"plus\" :size=\"12\" />\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"m-tabs__content\">\r\n <slot />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { ref, provide, computed, useSlots, watch, nextTick } from 'vue'\r\nimport MIcon from '../Icon/Icon.vue'\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 当前激活的标签页\r\n modelValue: {\r\n type: [String, Number],\r\n default: ''\r\n },\r\n // 标签页类型\r\n type: {\r\n type: String,\r\n default: '',\r\n validator: (value) => ['', 'card', 'border-card'].includes(value)\r\n },\r\n // 标签位置\r\n tabPosition: {\r\n type: String,\r\n default: 'top',\r\n validator: (value) => ['top', 'right', 'bottom', 'left'].includes(value)\r\n },\r\n // 是否可关闭\r\n closable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 是否可添加\r\n addable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 是否可编辑(同时可添加和关闭)\r\n editable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 标签宽度是否自撑开\r\n stretch: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 切换前的钩子函数\r\n beforeLeave: {\r\n type: Function,\r\n default: null\r\n }\r\n})\r\n\r\n// 定义 emits\r\nconst emit = defineEmits(['update:modelValue', 'tab-click', 'tab-change', 'tab-remove', 'tab-add', 'edit'])\r\n\r\n// 获取插槽\r\nconst slots = useSlots()\r\n\r\n// 响应式数据\r\nconst tabs = ref([])\r\nconst activeName = ref(props.modelValue)\r\n\r\n// 监听 modelValue 变化\r\nwatch(() => props.modelValue, (newVal) => {\r\n activeName.value = newVal\r\n})\r\n\r\n// 监听 activeName 变化\r\nwatch(activeName, (newVal) => {\r\n emit('update:modelValue', newVal)\r\n emit('tab-change', newVal)\r\n})\r\n\r\n// 提供上下文给子组件\r\nprovide('tabsContext', {\r\n registerTab: (tab) => {\r\n const index = tabs.value.findIndex(t => t.name === tab.name)\r\n if (index >= 0) {\r\n tabs.value[index] = tab\r\n } else {\r\n tabs.value.push(tab)\r\n }\r\n \r\n // 如果没有指定 activeName,默认选中第一个\r\n if (!activeName.value && tabs.value.length > 0) {\r\n activeName.value = tabs.value[0].name || 0\r\n }\r\n },\r\n unregisterTab: (name) => {\r\n const index = tabs.value.findIndex(tab => tab.name === name)\r\n if (index >= 0) {\r\n tabs.value.splice(index, 1)\r\n }\r\n }\r\n})\r\n\r\n// 处理标签点击\r\nconst handleTabClick = async (tab, index) => {\r\n if (tab.disabled) return\r\n \r\n const tabName = tab.name || index\r\n \r\n // 如果点击的是当前激活的标签,直接返回\r\n if (activeName.value === tabName) return\r\n \r\n // 执行 beforeLeave 钩子\r\n if (props.beforeLeave) {\r\n try {\r\n const result = await props.beforeLeave(activeName.value, tabName)\r\n if (result === false) return\r\n } catch (error) {\r\n return\r\n }\r\n }\r\n \r\n activeName.value = tabName\r\n emit('tab-click', { name: tabName, index, disabled: tab.disabled })\r\n}\r\n\r\n// 处理标签关闭\r\nconst handleTabClose = (tab, index) => {\r\n const tabName = tab.name || index\r\n emit('tab-remove', tabName)\r\n emit('edit', tabName, 'remove')\r\n}\r\n\r\n// 处理添加标签\r\nconst handleTabAdd = () => {\r\n emit('tab-add')\r\n emit('edit', '', 'add')\r\n}\r\n\r\n// 暴露方法给父组件\r\ndefineExpose({\r\n activeName: computed(() => activeName.value)\r\n})\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.m-tabs {\r\n display: flex;\r\n flex-direction: column;\r\n \r\n &--left {\r\n flex-direction: row;\r\n }\r\n \r\n &--right {\r\n flex-direction: row-reverse;\r\n }\r\n \r\n &--bottom {\r\n flex-direction: column-reverse;\r\n }\r\n\r\n &__header {\r\n flex-shrink: 0;\r\n }\r\n\r\n &__nav {\r\n display: flex;\r\n border-bottom: 1px solid var(--el-border-color);\r\n position: relative;\r\n \r\n .m-tabs--card &,\r\n .m-tabs--border-card & {\r\n border-bottom: none;\r\n }\r\n \r\n .m-tabs--left &,\r\n .m-tabs--right & {\r\n flex-direction: column;\r\n border-bottom: none;\r\n border-right: 1px solid var(--el-border-color);\r\n width: 120px;\r\n }\r\n \r\n .m-tabs--right & {\r\n border-right: none;\r\n border-left: 1px solid var(--el-border-color);\r\n }\r\n }\r\n\r\n &__item {\r\n display: flex;\r\n align-items: center;\r\n padding: 8px 16px;\r\n cursor: pointer;\r\n border: 1px solid transparent;\r\n border-bottom: none;\r\n background: transparent;\r\n color: var(--el-text-color-regular);\r\n font-size: 14px;\r\n transition: all 0.3s ease;\r\n position: relative;\r\n flex-shrink: 0;\r\n \r\n &:hover {\r\n color: var(--el-color-primary);\r\n }\r\n \r\n &--active {\r\n color: var(--el-color-primary);\r\n border-color: var(--el-border-color);\r\n border-bottom-color: var(--el-bg-color);\r\n background: var(--el-bg-color);\r\n \r\n &::after {\r\n content: '';\r\n position: absolute;\r\n bottom: -1px;\r\n left: 0;\r\n right: 0;\r\n height: 2px;\r\n background: var(--el-color-primary);\r\n }\r\n }\r\n \r\n &--disabled {\r\n color: var(--el-text-color-disabled);\r\n cursor: not-allowed;\r\n \r\n &:hover {\r\n color: var(--el-text-color-disabled);\r\n }\r\n }\r\n \r\n &--closable {\r\n padding-right: 24px;\r\n }\r\n \r\n &--add {\r\n padding: 8px 12px;\r\n border: 1px dashed var(--el-border-color);\r\n color: var(--el-text-color-regular);\r\n \r\n &:hover {\r\n color: var(--el-color-primary);\r\n border-color: var(--el-color-primary);\r\n }\r\n }\r\n \r\n // 卡片风格\r\n .m-tabs--card & {\r\n border: 1px solid var(--el-border-color);\r\n border-bottom: none;\r\n margin-right: 2px;\r\n \r\n &--active {\r\n border-bottom-color: var(--el-bg-color);\r\n background: var(--el-bg-color);\r\n \r\n &::after {\r\n display: none;\r\n }\r\n }\r\n }\r\n \r\n // 边框卡片风格\r\n .m-tabs--border-card & {\r\n border: 1px solid var(--el-border-color);\r\n border-bottom: none;\r\n margin-right: -1px;\r\n background: var(--el-fill-color-light);\r\n \r\n &--active {\r\n background: var(--el-bg-color);\r\n border-bottom-color: var(--el-bg-color);\r\n \r\n &::after {\r\n display: none;\r\n }\r\n }\r\n }\r\n \r\n // 左侧和右侧位置\r\n .m-tabs--left &,\r\n .m-tabs--right & {\r\n border-bottom: 1px solid var(--el-border-color);\r\n border-right: none;\r\n \r\n &--active {\r\n border-bottom-color: var(--el-border-color);\r\n border-right-color: var(--el-bg-color);\r\n \r\n &::after {\r\n display: none;\r\n }\r\n }\r\n }\r\n \r\n .m-tabs--right & {\r\n border-bottom: 1px solid var(--el-border-color);\r\n border-left: none;\r\n \r\n &--active {\r\n border-bottom-color: var(--el-border-color);\r\n border-left-color: var(--el-bg-color);\r\n }\r\n }\r\n }\r\n\r\n &__item-text {\r\n flex: 1;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n &__item-close {\r\n position: absolute;\r\n right: 8px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 16px;\r\n height: 16px;\r\n border-radius: 50%;\r\n transition: background-color 0.2s ease;\r\n \r\n &:hover {\r\n background-color: var(--el-fill-color);\r\n }\r\n }\r\n\r\n &__content {\r\n flex: 1;\r\n padding: 16px 0;\r\n \r\n .m-tabs--card &,\r\n .m-tabs--border-card & {\r\n padding: 16px;\r\n border: 1px solid var(--el-border-color);\r\n border-top: none;\r\n }\r\n \r\n .m-tabs--border-card & {\r\n background: var(--el-bg-color);\r\n }\r\n \r\n .m-tabs--left &,\r\n .m-tabs--right & {\r\n flex: 1;\r\n padding: 0 0 0 16px;\r\n }\r\n \r\n .m-tabs--right & {\r\n padding: 0 16px 0 0;\r\n }\r\n }\r\n}\r\n\r\n// 响应式设计\r\n@media (max-width: 768px) {\r\n .m-tabs {\r\n &__item {\r\n padding: 6px 12px;\r\n font-size: 13px;\r\n }\r\n \r\n &--left &__nav,\r\n &--right &__nav {\r\n width: 100px;\r\n }\r\n }\r\n}\r\n</style>\r\n","<template>\r\n <div\r\n v-show=\"active\"\r\n class=\"m-tab-pane\"\r\n :class=\"{\r\n 'm-tab-pane--active': active,\r\n 'm-tab-pane--disabled': disabled\r\n }\"\r\n >\r\n <slot />\r\n </div>\r\n</template>\r\n\r\n<script setup>\r\nimport { inject, computed, onMounted, onUnmounted, useSlots } from 'vue'\r\n\r\n// 定义 props\r\nconst props = defineProps({\r\n // 选项卡标题\r\n label: {\r\n type: String,\r\n default: ''\r\n },\r\n // 是否禁用\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 选项卡名称,用于标识\r\n name: {\r\n type: [String, Number],\r\n default: ''\r\n },\r\n // 是否可关闭\r\n closable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n // 是否延迟渲染\r\n lazy: {\r\n type: Boolean,\r\n default: false\r\n }\r\n})\r\n\r\n// 获取插槽\r\nconst slots = useSlots()\r\n\r\n// 注入父组件上下文\r\nconst tabsContext = inject('tabsContext')\r\n\r\n// 计算是否激活\r\nconst active = computed(() => {\r\n if (!tabsContext) return false\r\n return tabsContext.activeName === (props.name || tabsContext.tabIndex)\r\n})\r\n\r\n// 组件挂载时注册到父组件\r\nonMounted(() => {\r\n if (tabsContext) {\r\n const tabData = {\r\n name: props.name,\r\n label: props.label,\r\n disabled: props.disabled,\r\n closable: props.closable,\r\n $slots: slots\r\n }\r\n tabsContext.registerTab(tabData)\r\n }\r\n})\r\n\r\n// 组件卸载时从父组件中移除\r\nonUnmounted(() => {\r\n if (tabsContext) {\r\n tabsContext.unregisterTab(props.name)\r\n }\r\n})\r\n\r\n// 定义组件名称\r\ndefineOptions({\r\n name: 'MTabPane'\r\n})\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.m-tab-pane {\r\n display: none;\r\n \r\n &--active {\r\n display: block;\r\n }\r\n \r\n &--disabled {\r\n opacity: 0.6;\r\n pointer-events: none;\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 && 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 * 强制刷新组件样式\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 * 创建带有样式覆盖的 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","/**\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.0.75\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 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\n\r\nconst components = [MIcon, MButton, MInput, MForm, MFormItem, MTooltip, MSelect, MOption, MOptionGroup, MPagination, MRadio, MRadioGroup, MRadioButton, MSwitch, MTag, MAlert, MDialog, MNotification, MNotifiMessage, MDatePicker, MEmpty, MTable, MTableColumn, MBanner, MTabs, MTabPane]\r\n\r\n// 存储转换后的 Element Plus 组件\r\nconst convertedComponents = {}\r\n\r\nfunction registerElementPlus(app) {\r\n // 获取已注册的自定义组件名称\r\n const customComponentNames = components.map(comp => {\r\n if (comp && comp.name && typeof comp.name === 'string') {\r\n let name = comp.name.toLowerCase()\r\n const nameMap = {\r\n 'mradiogroup': 'm-radio-group',\r\n 'mradiobutton': 'm-radio-button',\r\n 'mformitem': 'm-form-item',\r\n 'moptiongroup': 'm-option-group',\r\n 'mtabs': 'm-tabs',\r\n 'mtabpane': 'm-tab-pane'\r\n }\r\n return nameMap[name] || name.replace(/^m/, 'm-')\r\n }\r\n return null\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 }) => {\r\n applyGlobalOverride();\r\n });\r\n }\r\n \r\n console.log('🚀 开始安装 @mc-markets/ui 组件库...')\r\n \r\n // 先注册自定义组件 - 确保优先级\r\n components.forEach(component => {\r\n if (component && component.name && typeof component.name === 'string') {\r\n let name = component.name.toLowerCase()\r\n // 处理特定的组件名称映射\r\n const nameMap = {\r\n 'mradiogroup': 'm-radio-group',\r\n 'mradiobutton': 'm-radio-button',\r\n 'mformitem': 'm-form-item',\r\n 'moptiongroup': 'm-option-group',\r\n 'mtabs': 'm-tabs',\r\n 'mtabpane': 'm-tab-pane'\r\n }\r\n name = nameMap[name] || name.replace(/^m/, 'm-')\r\n \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// 工具函数:检查组件注册状态\r\nexport function checkComponentRegistration(app) {\r\n const registeredComponents = Object.keys(app._context.components || {})\r\n const customComponents = components.map(comp => {\r\n if (comp && comp.name && typeof comp.name === 'string') {\r\n let name = comp.name.toLowerCase()\r\n const nameMap = {\r\n 'mradiogroup': 'm-radio-group',\r\n 'mradiobutton': 'm-radio-button',\r\n 'mformitem': 'm-form-item',\r\n 'moptiongroup': 'm-option-group',\r\n 'mtabs': 'm-tabs',\r\n 'mtabpane': 'm-tab-pane'\r\n }\r\n return nameMap[name] || name.replace(/^m/, 'm-')\r\n }\r\n return null\r\n }).filter(Boolean)\r\n \r\n console.log('📊 组件注册状态报告:')\r\n console.log('已注册的组件:', registeredComponents.filter(name => name.startsWith('m-')))\r\n console.log('自定义组件:', customComponents)\r\n \r\n return {\r\n registered: registeredComponents,\r\n custom: customComponents,\r\n conflicts: registeredComponents.filter(name => \r\n name.startsWith('m-') && customComponents.includes(name)\r\n )\r\n }\r\n}\r\n\r\nexport default { install }\r\nexport { MIcon, MButton, MInput, MForm, MFormItem, MTooltip, MSelect, MPagination, MRadio, MRadioGroup, MRadioButton, MSwitch, MTag, MAlert, MDialog, MNotification, MNotifiMessage, MDatePicker, MEmpty, MTable, MTableColumn, MBanner, MTabs, MTabPane }\r\n\r\n// 导出样式工具函数\r\nexport { \r\n addOverrideClass, \r\n addComponentOverride, \r\n applyGlobalOverride, \r\n forceRefreshStyles,\r\n createOverrideComponent \r\n} from './utils/styleUtils.js'\r\n\r\n// 手动导出常用的 Element Plus 函数(只导出函数,不导出组件)\r\nexport const MMessage = ElementPlusComponents.ElMessage\r\nexport const MMessageBox = ElementPlusComponents.ElMessageBox\r\n\r\n// 导出 NotifiMessage 类\r\nexport { 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 MBreadcrumb = convertedComponents.MBreadcrumb\r\nexport const MBreadcrumbItem = convertedComponents.MBreadcrumbItem\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","_createBlock","_component_el_button","_ctx","_createSlots","_renderSlot","name","_component_el_form","_component_el_form_item","classNames","excludeAttrs","attrs","excludeKeys","result","__spreadValues","key","useClassName","defaultClass","excludeKey","useAttrs","mergedAttrs","className","popperClass","_component_el_tooltip","_unref","_component_el_select","_component_el_option","_normalizeProps","_guardReactiveProps","_component_el_option_group","_component_el_pagination","_component_el_radio","computedPopperClass","defaultPopperClass","_a","__objRest","_component_el_radio_button","_component_el_tag","availableTypes","__default__","useCustomIcon","rest","__spreadProps","iconUrl","_component_el_alert","dialogVisible","_useModel","_createVNode","_component_el_dialog","$slots","_withCtx","close","titleId","titleClass","_sfc_main","_component_el_notification","notifications","ref","notificationId","NotifiMessage","options","config","id","index","closeNotification","_hoisted_1","_hoisted_2","_hoisted_3","notification","_createElementVNode","_toDisplayString","_hoisted_4","$event","$setup","_component_el_date_picker","availableImages","image","imageUrl","_component_el_empty","_component_el_table","_component_el_table_column","slots","useSlots","internalVisible","watch","newVal","bannerStyle","defaultIcons","handleClose","__expose","_normalizeClass","_normalizeStyle","tabs","activeName","provide","tab","t","handleTabClick","__async","tabName","error","handleTabClose","handleTabAdd","_Fragment","_renderList","_withModifiers","_hoisted_7","tabsContext","inject","active","onMounted","tabData","onUnmounted","addOverrideClass","element","addComponentOverride","componentInstance","applyGlobalOverride","mutations","mutation","node","parent","el","forceRefreshStyles","selector","createOverrideComponent","componentConfig","components","MIcon","MButton","MInput","MForm","MFormItem","MTooltip","MSelect","MOption","MOptionGroup","MPagination","MRadio","MRadioGroup","MRadioButton","MSwitch","MTag","MAlert","MDialog","MNotification","MNotifiMessage","MDatePicker","MEmpty","MTable","MTableColumn","MBanner","MTabs","MTabPane","convertedComponents","registerElementPlus","app","customComponentNames","comp","ElementPlusComponents","mName","exportName","install","styleUtils","component","checkComponentRegistration","registeredComponents","customComponents","MMessage","MMessageBox","mComponents","MButtonGroup","MBreadcrumb","MBreadcrumbItem","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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"}
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- @charset "UTF-8";.iconfont[data-v-90f84c9e]{display:inline-block;font-style:normal;vertical-align:baseline;text-align:center;text-transform:none;line-height:1;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-spin[data-v-90f84c9e]{animation:icon-spin-90f84c9e 1s linear infinite}@keyframes icon-spin-90f84c9e{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.icon-pulse[data-v-90f84c9e]{animation:icon-pulse-90f84c9e 1s ease-in-out infinite}@keyframes icon-pulse-90f84c9e{0%{transform:scale(1)}50%{transform:scale(1.1)}to{transform:scale(1)}}.icon-flip-horizontal[data-v-90f84c9e]{transform:scaleX(-1)}.icon-flip-vertical[data-v-90f84c9e]{transform:scaleY(-1)}.icon-flip-both[data-v-90f84c9e]{transform:scale(-1)}.icon-spin.icon-flip-horizontal[data-v-90f84c9e]{animation:icon-spin-flip-horizontal-90f84c9e 1s linear infinite}.icon-spin.icon-flip-vertical[data-v-90f84c9e]{animation:icon-spin-flip-vertical-90f84c9e 1s linear infinite}.icon-spin.icon-flip-both[data-v-90f84c9e]{animation:icon-spin-flip-both-90f84c9e 1s linear infinite}@keyframes icon-spin-flip-horizontal-90f84c9e{0%{transform:rotate(0) scaleX(-1)}to{transform:rotate(360deg) scaleX(-1)}}@keyframes icon-spin-flip-vertical-90f84c9e{0%{transform:rotate(0) scaleY(-1)}to{transform:rotate(360deg) scaleY(-1)}}@keyframes icon-spin-flip-both-90f84c9e{0%{transform:rotate(0) scale(-1)}to{transform:rotate(360deg) scale(-1)}}.m-input.el-input.solid{--el-border-color: var(--bg-tertiary-hover)}.m-input.el-input.solid .el-input__wrapper{background:var(--all-alphe-white-6)}.mc-tooltip-popper.is-dark{color:#fff!important;background-color:var(--all-gray-6)!important;border-color:var(--all-gray-6)!important}.mc-tooltip-popper.is-dark .el-popper__arrow:before{background-color:var(--all-gray-6)!important;border-color:var(--all-gray-6)!important}.mc-tooltip-popper.is-light{color:#606266!important;background-color:#fff!important;border:1px solid #e4e7ed!important}.mc-tooltip-popper.is-light .el-popper__arrow:before{background-color:#fff!important;border-color:#fff!important}:deep(.el-popper).is-light{background:var(--bg-tertiary-hover);border-color:var(--border-primary)}.m-pagination.is-background .el-pager li.is-active{color:var(--text-quaternary)!important}.mc-radio-custom .el-radio__input .el-radio__inner{background:linear-gradient(45deg,#667eea,#764ba2);border-color:#667eea}.mc-radio-custom .el-radio__input .el-radio__inner:hover{background:linear-gradient(45deg,#5a6fd8,#6a4190);border-color:#5a6fd8}.mc-radio-custom .el-radio__input.is-checked .el-radio__inner{background:linear-gradient(45deg,#4c63d2,#5d3a7e);border-color:#4c63d2}.mc-radio-custom .el-radio__label{color:#667eea;font-weight:500}.mc-radio-success .el-radio__input .el-radio__inner{background-color:#67c23a;border-color:#67c23a}.mc-radio-success .el-radio__input .el-radio__inner:hover{background-color:#5daf34;border-color:#5daf34}.mc-radio-success .el-radio__input.is-checked .el-radio__inner{background-color:#529b2e;border-color:#529b2e}.mc-radio-success .el-radio__label{color:#67c23a;font-weight:500}.mc-radio-warning .el-radio__input .el-radio__inner{background-color:#e6a23c;border-color:#e6a23c}.mc-radio-warning .el-radio__input .el-radio__inner:hover{background-color:#d4922b;border-color:#d4922b}.mc-radio-warning .el-radio__input.is-checked .el-radio__inner{background-color:#c8951f;border-color:#c8951f}.mc-radio-warning .el-radio__label{color:#e6a23c;font-weight:500}.mc-radio-danger .el-radio__input .el-radio__inner{background-color:#f56c6c;border-color:#f56c6c}.mc-radio-danger .el-radio__input .el-radio__inner:hover{background-color:#f45454;border-color:#f45454}.mc-radio-danger .el-radio__input.is-checked .el-radio__inner{background-color:#f24545;border-color:#f24545}.mc-radio-danger .el-radio__label{color:#f56c6c;font-weight:500}.mc-radio-group-custom .el-radio .el-radio__input .el-radio__inner{background:linear-gradient(45deg,#667eea,#764ba2);border-color:#667eea}.mc-radio-group-custom .el-radio .el-radio__input .el-radio__inner:hover{background:linear-gradient(45deg,#5a6fd8,#6a4190);border-color:#5a6fd8}.mc-radio-group-custom .el-radio .el-radio__input.is-checked .el-radio__inner{background:linear-gradient(45deg,#4c63d2,#5d3a7e);border-color:#4c63d2}.mc-radio-group-custom .el-radio .el-radio__label{color:#667eea;font-weight:500}.mc-radio-group-success .el-radio .el-radio__input .el-radio__inner{background-color:#67c23a;border-color:#67c23a}.mc-radio-group-success .el-radio .el-radio__input .el-radio__inner:hover{background-color:#5daf34;border-color:#5daf34}.mc-radio-group-success .el-radio .el-radio__input.is-checked .el-radio__inner{background-color:#529b2e;border-color:#529b2e}.mc-radio-group-success .el-radio .el-radio__label{color:#67c23a;font-weight:500}.mc-radio-group-warning .el-radio .el-radio__input .el-radio__inner{background-color:#e6a23c;border-color:#e6a23c}.mc-radio-group-warning .el-radio .el-radio__input .el-radio__inner:hover{background-color:#d4922b;border-color:#d4922b}.mc-radio-group-warning .el-radio .el-radio__input.is-checked .el-radio__inner{background-color:#c8951f;border-color:#c8951f}.mc-radio-group-warning .el-radio .el-radio__label{color:#e6a23c;font-weight:500}.mc-radio-group-danger .el-radio .el-radio__input .el-radio__inner{background-color:#f56c6c;border-color:#f56c6c}.mc-radio-group-danger .el-radio .el-radio__input .el-radio__inner:hover{background-color:#f45454;border-color:#f45454}.mc-radio-group-danger .el-radio .el-radio__input.is-checked .el-radio__inner{background-color:#f24545;border-color:#f24545}.mc-radio-group-danger .el-radio .el-radio__label{color:#f56c6c;font-weight:500}.mc-radio-button-custom .el-radio-button__inner{background:linear-gradient(45deg,#667eea,#764ba2);border-color:#667eea;color:#fff}.mc-radio-button-custom .el-radio-button__inner:hover{background:linear-gradient(45deg,#5a6fd8,#6a4190);border-color:#5a6fd8}.mc-radio-button-custom .el-radio-button__original-radio:checked+.el-radio-button__inner{background:linear-gradient(45deg,#4c63d2,#5d3a7e);border-color:#4c63d2;box-shadow:-1px 0 #4c63d2}.mc-radio-button-success .el-radio-button__inner{background-color:#67c23a;border-color:#67c23a;color:#fff}.mc-radio-button-success .el-radio-button__inner:hover{background-color:#5daf34;border-color:#5daf34}.mc-radio-button-success .el-radio-button__original-radio:checked+.el-radio-button__inner{background-color:#529b2e;border-color:#529b2e;box-shadow:-1px 0 #529b2e}.mc-radio-button-warning .el-radio-button__inner{background-color:#e6a23c;border-color:#e6a23c;color:#fff}.mc-radio-button-warning .el-radio-button__inner:hover{background-color:#d4922b;border-color:#d4922b}.mc-radio-button-warning .el-radio-button__original-radio:checked+.el-radio-button__inner{background-color:#c8951f;border-color:#c8951f;box-shadow:-1px 0 #c8951f}.mc-radio-button-danger .el-radio-button__inner{background-color:#f56c6c;border-color:#f56c6c;color:#fff}.mc-radio-button-danger .el-radio-button__inner:hover{background-color:#f45454;border-color:#f45454}.mc-radio-button-danger .el-radio-button__original-radio:checked+.el-radio-button__inner{background-color:#f24545;border-color:#f24545;box-shadow:-1px 0 #f24545}.mc-switch-custom .el-switch__core{background:linear-gradient(45deg,#667eea,#764ba2);border-color:#667eea}.mc-switch-custom .el-switch__core:after{background:#fff}.mc-switch-custom.is-checked .el-switch__core{background:linear-gradient(45deg,#4c63d2,#5d3a7e);border-color:#4c63d2}.mc-switch-success .el-switch__core{background-color:#67c23a;border-color:#67c23a}.mc-switch-success .el-switch__core:after{background:#fff}.mc-switch-success.is-checked .el-switch__core{background-color:#529b2e;border-color:#529b2e}.mc-switch-warning .el-switch__core{background-color:#e6a23c;border-color:#e6a23c}.mc-switch-warning .el-switch__core:after{background:#fff}.mc-switch-warning.is-checked .el-switch__core{background-color:#c8951f;border-color:#c8951f}.mc-switch-danger .el-switch__core{background-color:#f56c6c;border-color:#f56c6c}.mc-switch-danger .el-switch__core:after{background:#fff}.mc-switch-danger.is-checked .el-switch__core{background-color:#f24545;border-color:#f24545}.mc-switch-gradient .el-switch__core{background:linear-gradient(90deg,#ff6b6b,#4ecdc4);border:none}.mc-switch-gradient .el-switch__core:after{background:#fff;box-shadow:0 2px 4px #0003}.mc-switch-gradient.is-checked .el-switch__core{background:linear-gradient(90deg,#4ecdc4,#45b7d1)}.mc-switch-neon .el-switch__core{background-color:#1a1a1a;border:2px solid #00ffff;box-shadow:0 0 10px #0ff}.mc-switch-neon .el-switch__core:after{background:#0ff;box-shadow:0 0 5px #0ff}.mc-switch-neon.is-checked .el-switch__core{background-color:#0ff;border-color:#0ff;box-shadow:0 0 15px #0ff}.m-tag.el-tag{font-size:var(--font-size-text-sm);--el-tag-border-radius: 8px}.m-tag.el-tag.el-tag--primary{--el-tag-bg-color: color-mix(in srgb, var(--text-warning-primary) 10%, transparent);--el-tag-border-color: color-mix(in srgb, var(--text-warning-primary) 20%, transparent);--el-tag-text-color: var(--text-warning-primary)}.m-tag.el-tag.el-tag--success{--el-tag-bg-color: color-mix(in srgb, var(--text-success-primary) 10%, transparent);--el-tag-border-color: color-mix(in srgb, var(--text-success-primary) 20%, transparent);--el-tag-text-color: var(--text-success-primary)}.m-tag.el-tag.el-tag--danger{--el-tag-bg-color: color-mix(in srgb, var(--text-error-primary) 10%, transparent);--el-tag-border-color: color-mix(in srgb, var(--text-error-primary) 20%, transparent);--el-tag-text-color: var(--text-error-primary)}.m-tag.el-tag.el-tag--info{--el-tag-bg-color: color-mix(in srgb, var(--text-primary) 10%, transparent);--el-tag-border-color: color-mix(in srgb, var(--text-primary) 20%, transparent);--el-tag-text-color: var(--text-primary)}.m-tag.el-tag.el-tag--dark.el-tag--warning{--el-tag-bg-color: color-mix(in srgb, var(--text-warning-primary) 10%, transparent);--el-tag-border-color: transparent}.m-tag.el-tag.el-tag--dark.el-tag--success{--el-tag-bg-color: color-mix(in srgb, var(--text-success-primary) 10%, transparent);--el-tag-border-color: transparent}.m-tag.el-tag.el-tag--dark.el-tag--danger{--el-tag-bg-color: color-mix(in srgb, var(--text-error-primary) 10%, transparent);--el-tag-border-color: transparent}.m-tag.el-tag.el-tag--dark.el-tag--info{--el-tag-bg-color: var(--bg-tertiary-hover);--el-tag-border-color: transparent}.mc-alert.el-alert{--el-alert-padding: 14px 16px}.mc-alert.el-alert .mc-alert-icon{width:16px;height:16px;object-fit:contain}.mc-alert.el-alert .el-alert__close-btn{top:50%;transform:translateY(-50%)}.mc-alert.el-alert.el-alert--error.is-light{background-color:var(--all-red-10);color:var(--text-error-primary);border-color:var(--all-red-10)}.mc-alert.el-alert.el-alert--error.is-light .el-alert__title,.mc-alert.el-alert.el-alert--error.is-light .el-alert__description,.mc-alert.el-alert.el-alert--error.is-light .el-alert__close-btn{color:var(--text-error-primary)}.mc-alert.el-alert.el-alert--error.is-light .el-alert__icon{display:flex;align-items:center}.mc-alert.el-alert.el-alert--warning.is-light{background-color:var(--all-orange-10);color:var(--text-warning-primary);border-color:var(--all-orange-10)}.mc-alert.el-alert.el-alert--warning.is-light .el-alert__title,.mc-alert.el-alert.el-alert--warning.is-light .el-alert__description,.mc-alert.el-alert.el-alert--warning.is-light .el-alert__close-btn{color:var(--text-warning-primary)}.mc-alert.el-alert.el-alert--warning.is-light .el-alert__icon{display:flex;align-items:center}.mc-alert.el-alert.el-alert--success.is-light{background-color:var(--all-green-10);color:var(--all-green-4);border-color:var(--all-green-10)}.mc-alert.el-alert.el-alert--success.is-light .el-alert__title,.mc-alert.el-alert.el-alert--success.is-light .el-alert__description,.mc-alert.el-alert.el-alert--success.is-light .el-alert__close-btn{color:var(--all-green-4)}.mc-alert.el-alert.el-alert--success.is-light .el-alert__icon{display:flex;align-items:center}.notification-container{position:fixed;z-index:9999;pointer-events:none}.custom-notification{position:fixed;top:20px;right:20px;width:400px;background:#201f24;border-radius:12px;padding:16px;display:flex;align-items:flex-start;gap:4px;box-shadow:0 8px 32px #0000004d;pointer-events:auto;z-index:9999}.custom-notification:nth-child(2){top:100px}.custom-notification:nth-child(3){top:180px}.custom-notification:nth-child(4){top:260px}.custom-notification:nth-child(5){top:340px}.custom-notification .notification-icon{flex-shrink:0;width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;transform:translate(-9px,-8px)}.custom-notification .notification-icon img{width:100%;height:100%;object-fit:contain}.custom-notification .notification-content{flex:1}.custom-notification .notification-content .notification-title{color:#fff;font-size:16px;font-weight:600;margin-bottom:8px}.custom-notification .notification-content .notification-message{color:#fffc;font-size:14px;line-height:1.5;margin-bottom:16px}.custom-notification .notification-content .notification-action .custom-action-link{color:#ffd905;font-size:14px;font-weight:500;cursor:pointer;display:flex;align-items:center;gap:6px;transition:all .2s ease}.custom-notification .notification-content .notification-action .custom-action-link:hover{color:#fff}.custom-notification .notification-content .notification-action .custom-action-link span{line-height:1}.custom-notification .notification-content .notification-action .custom-action-link .arrow{transition:transform .2s ease;display:flex;align-items:center;line-height:1}.custom-notification .notification-content .notification-action .custom-action-link:hover .arrow{transform:translate(2px)}.custom-notification .notification-close{position:absolute;top:12px;right:12px;width:24px;height:24px;border:none;background:#ffffff1a;color:#fff9;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:16px;line-height:1;transition:all .2s ease}.custom-notification .notification-close:hover{background:#fff3;color:#ffffffe6}.notification-enter-active,.notification-leave-active{transition:all .3s ease}.notification-enter-from,.notification-leave-to{opacity:0;transform:translate(100%)}.notification-move{transition:transform .3s ease}@media (max-width: 480px){.custom-notification{width:calc(100vw - 40px);left:20px!important;right:20px!important}}.mc-datepicker-popper .el-picker-panel{border:1px solid var(--border-primary);border-radius:6px;box-shadow:0 4px 12px #0000001a}.mc-datepicker-popper .el-picker-panel .current .el-date-table-cell .el-date-table-cell__text,.mc-datepicker-popper .el-picker-panel .start-date .el-date-table-cell .el-date-table-cell__text,.mc-datepicker-popper .el-picker-panel .end-date .el-date-table-cell .el-date-table-cell__text{color:var(--text-quaternary);border-radius:3px}.mc-datepicker-popper .el-picker-panel .start-date .el-date-table-cell{border-top-left-radius:3px;border-bottom-left-radius:3px}.mc-datepicker-popper .el-picker-panel .end-date .el-date-table-cell{border-top-right-radius:3px;border-bottom-right-radius:3px}.mc-datepicker-popper .el-picker-panel .el-button.is-text{color:var(--text-brand)}.mc-datepicker-popper .el-picker-panel .el-button.is-plain{background:var(--bg-brand);color:var(--text-quaternary)}.m-banner[data-v-00c80323]{position:relative;display:flex;align-items:center;min-height:40px;border-radius:4px;border:1px solid;font-size:14px;line-height:1.5;padding:10px;transition:all .3s ease}.m-banner__content[data-v-00c80323]{display:flex;align-items:center;width:100%;flex:1}.m-banner__icon[data-v-00c80323]{display:flex;align-items:center;margin-right:8px;flex-shrink:0}.m-banner__text[data-v-00c80323]{flex:1;word-break:break-word}.m-banner__close[data-v-00c80323]{display:flex;align-items:center;justify-content:center;margin-left:8px;cursor:pointer;padding:4px;border-radius:3px;transition:background-color .2s ease;flex-shrink:0;min-width:20px;min-height:20px;opacity:.7}.m-banner__close[data-v-00c80323]:hover{background-color:#0000001a;opacity:1}.m-banner--info[data-v-00c80323]{background-color:#e1f3ff;border-color:#b3d8ff;color:#06c}.m-banner--info .m-banner__close[data-v-00c80323]:hover{background-color:#0066cc1a}.m-banner--success[data-v-00c80323]{background-color:#f0f9ff;border-color:#b3e5b3;color:#00a854}.m-banner--success .m-banner__close[data-v-00c80323]:hover{background-color:#00a8541a}.m-banner--warning[data-v-00c80323]{background-color:#fff7e6;border-color:#ffd591;color:#fa8c16}.m-banner--warning .m-banner__close[data-v-00c80323]:hover{background-color:#fa8c161a}.m-banner--error[data-v-00c80323]{background-color:#fff2f0;border-color:#ffccc7;color:#ff4d4f}.m-banner--error .m-banner__close[data-v-00c80323]:hover{background-color:#ff4d4f1a}.m-banner.m-banner-leave-active[data-v-00c80323]{opacity:0;transform:translateY(-10px);transition:opacity .3s ease,transform .3s ease}@media (prefers-color-scheme: dark){.m-banner--info[data-v-00c80323]{background-color:#1890ff1a;border-color:#1890ff4d;color:#69c0ff}.m-banner--success[data-v-00c80323]{background-color:#52c41a1a;border-color:#52c41a4d;color:#95de64}.m-banner--warning[data-v-00c80323]{background-color:#faad141a;border-color:#faad144d;color:#ffd666}.m-banner--error[data-v-00c80323]{background-color:#ff4d4f1a;border-color:#ff4d4f4d;color:#ff7875}}.m-tabs[data-v-23508d30]{display:flex;flex-direction:column}.m-tabs--left[data-v-23508d30]{flex-direction:row}.m-tabs--right[data-v-23508d30]{flex-direction:row-reverse}.m-tabs--bottom[data-v-23508d30]{flex-direction:column-reverse}.m-tabs__header[data-v-23508d30]{flex-shrink:0}.m-tabs__nav[data-v-23508d30]{display:flex;border-bottom:1px solid var(--el-border-color);position:relative}.m-tabs--card .m-tabs__nav[data-v-23508d30],.m-tabs--border-card .m-tabs__nav[data-v-23508d30]{border-bottom:none}.m-tabs--left .m-tabs__nav[data-v-23508d30],.m-tabs--right .m-tabs__nav[data-v-23508d30]{flex-direction:column;border-bottom:none;border-right:1px solid var(--el-border-color);width:120px}.m-tabs--right .m-tabs__nav[data-v-23508d30]{border-right:none;border-left:1px solid var(--el-border-color)}.m-tabs__item[data-v-23508d30]{display:flex;align-items:center;padding:8px 16px;cursor:pointer;border:1px solid transparent;border-bottom:none;background:transparent;color:var(--el-text-color-regular);font-size:14px;transition:all .3s ease;position:relative;flex-shrink:0}.m-tabs__item[data-v-23508d30]:hover{color:var(--el-color-primary)}.m-tabs__item--active[data-v-23508d30]{color:var(--el-color-primary);border-color:var(--el-border-color);border-bottom-color:var(--el-bg-color);background:var(--el-bg-color)}.m-tabs__item--active[data-v-23508d30]:after{content:"";position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--el-color-primary)}.m-tabs__item--disabled[data-v-23508d30]{color:var(--el-text-color-disabled);cursor:not-allowed}.m-tabs__item--disabled[data-v-23508d30]:hover{color:var(--el-text-color-disabled)}.m-tabs__item--closable[data-v-23508d30]{padding-right:24px}.m-tabs__item--add[data-v-23508d30]{padding:8px 12px;border:1px dashed var(--el-border-color);color:var(--el-text-color-regular)}.m-tabs__item--add[data-v-23508d30]:hover{color:var(--el-color-primary);border-color:var(--el-color-primary)}.m-tabs--card .m-tabs__item[data-v-23508d30]{border:1px solid var(--el-border-color);border-bottom:none;margin-right:2px}.m-tabs--card .m-tabs__item--active[data-v-23508d30]{border-bottom-color:var(--el-bg-color);background:var(--el-bg-color)}.m-tabs--card .m-tabs__item--active[data-v-23508d30]:after{display:none}.m-tabs--border-card .m-tabs__item[data-v-23508d30]{border:1px solid var(--el-border-color);border-bottom:none;margin-right:-1px;background:var(--el-fill-color-light)}.m-tabs--border-card .m-tabs__item--active[data-v-23508d30]{background:var(--el-bg-color);border-bottom-color:var(--el-bg-color)}.m-tabs--border-card .m-tabs__item--active[data-v-23508d30]:after{display:none}.m-tabs--left .m-tabs__item[data-v-23508d30],.m-tabs--right .m-tabs__item[data-v-23508d30]{border-bottom:1px solid var(--el-border-color);border-right:none}.m-tabs--left .m-tabs__item--active[data-v-23508d30],.m-tabs--right .m-tabs__item--active[data-v-23508d30]{border-bottom-color:var(--el-border-color);border-right-color:var(--el-bg-color)}.m-tabs--left .m-tabs__item--active[data-v-23508d30]:after,.m-tabs--right .m-tabs__item--active[data-v-23508d30]:after{display:none}.m-tabs--right .m-tabs__item[data-v-23508d30]{border-bottom:1px solid var(--el-border-color);border-left:none}.m-tabs--right .m-tabs__item--active[data-v-23508d30]{border-bottom-color:var(--el-border-color);border-left-color:var(--el-bg-color)}.m-tabs__item-text[data-v-23508d30]{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.m-tabs__item-close[data-v-23508d30]{position:absolute;right:8px;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:50%;transition:background-color .2s ease}.m-tabs__item-close[data-v-23508d30]:hover{background-color:var(--el-fill-color)}.m-tabs__content[data-v-23508d30]{flex:1;padding:16px 0}.m-tabs--card .m-tabs__content[data-v-23508d30],.m-tabs--border-card .m-tabs__content[data-v-23508d30]{padding:16px;border:1px solid var(--el-border-color);border-top:none}.m-tabs--border-card .m-tabs__content[data-v-23508d30]{background:var(--el-bg-color)}.m-tabs--left .m-tabs__content[data-v-23508d30],.m-tabs--right .m-tabs__content[data-v-23508d30]{flex:1;padding:0 0 0 16px}.m-tabs--right .m-tabs__content[data-v-23508d30]{padding:0 16px 0 0}@media (max-width: 768px){.m-tabs__item[data-v-23508d30]{padding:6px 12px;font-size:13px}.m-tabs--left .m-tabs__nav[data-v-23508d30],.m-tabs--right .m-tabs__nav[data-v-23508d30]{width:100px}}.m-tab-pane[data-v-722bb248]{display:none}.m-tab-pane--active[data-v-722bb248]{display:block}.m-tab-pane--disabled[data-v-722bb248]{opacity:.6;pointer-events:none}
1
+ @charset "UTF-8";.iconfont[data-v-90f84c9e]{display:inline-block;font-style:normal;vertical-align:baseline;text-align:center;text-transform:none;line-height:1;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-spin[data-v-90f84c9e]{animation:icon-spin-90f84c9e 1s linear infinite}@keyframes icon-spin-90f84c9e{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.icon-pulse[data-v-90f84c9e]{animation:icon-pulse-90f84c9e 1s ease-in-out infinite}@keyframes icon-pulse-90f84c9e{0%{transform:scale(1)}50%{transform:scale(1.1)}to{transform:scale(1)}}.icon-flip-horizontal[data-v-90f84c9e]{transform:scaleX(-1)}.icon-flip-vertical[data-v-90f84c9e]{transform:scaleY(-1)}.icon-flip-both[data-v-90f84c9e]{transform:scale(-1)}.icon-spin.icon-flip-horizontal[data-v-90f84c9e]{animation:icon-spin-flip-horizontal-90f84c9e 1s linear infinite}.icon-spin.icon-flip-vertical[data-v-90f84c9e]{animation:icon-spin-flip-vertical-90f84c9e 1s linear infinite}.icon-spin.icon-flip-both[data-v-90f84c9e]{animation:icon-spin-flip-both-90f84c9e 1s linear infinite}@keyframes icon-spin-flip-horizontal-90f84c9e{0%{transform:rotate(0) scaleX(-1)}to{transform:rotate(360deg) scaleX(-1)}}@keyframes icon-spin-flip-vertical-90f84c9e{0%{transform:rotate(0) scaleY(-1)}to{transform:rotate(360deg) scaleY(-1)}}@keyframes icon-spin-flip-both-90f84c9e{0%{transform:rotate(0) scale(-1)}to{transform:rotate(360deg) scale(-1)}}.mc-tooltip-popper.is-dark{color:#fff!important;background-color:var(--all-gray-6)!important;border-color:var(--all-gray-6)!important}.mc-tooltip-popper.is-dark .el-popper__arrow:before{background-color:var(--all-gray-6)!important;border-color:var(--all-gray-6)!important}.mc-tooltip-popper.is-light{color:#606266!important;background-color:#fff!important;border:1px solid #e4e7ed!important}.mc-tooltip-popper.is-light .el-popper__arrow:before{background-color:#fff!important;border-color:#fff!important}:deep(.el-popper).is-light{background:var(--bg-tertiary-hover);border-color:var(--border-primary)}.m-pagination.is-background .el-pager li.is-active{color:var(--text-quaternary)!important}.mc-radio-custom .el-radio__input .el-radio__inner{background:linear-gradient(45deg,#667eea,#764ba2);border-color:#667eea}.mc-radio-custom .el-radio__input .el-radio__inner:hover{background:linear-gradient(45deg,#5a6fd8,#6a4190);border-color:#5a6fd8}.mc-radio-custom .el-radio__input.is-checked .el-radio__inner{background:linear-gradient(45deg,#4c63d2,#5d3a7e);border-color:#4c63d2}.mc-radio-custom .el-radio__label{color:#667eea;font-weight:500}.mc-radio-success .el-radio__input .el-radio__inner{background-color:#67c23a;border-color:#67c23a}.mc-radio-success .el-radio__input .el-radio__inner:hover{background-color:#5daf34;border-color:#5daf34}.mc-radio-success .el-radio__input.is-checked .el-radio__inner{background-color:#529b2e;border-color:#529b2e}.mc-radio-success .el-radio__label{color:#67c23a;font-weight:500}.mc-radio-warning .el-radio__input .el-radio__inner{background-color:#e6a23c;border-color:#e6a23c}.mc-radio-warning .el-radio__input .el-radio__inner:hover{background-color:#d4922b;border-color:#d4922b}.mc-radio-warning .el-radio__input.is-checked .el-radio__inner{background-color:#c8951f;border-color:#c8951f}.mc-radio-warning .el-radio__label{color:#e6a23c;font-weight:500}.mc-radio-danger .el-radio__input .el-radio__inner{background-color:#f56c6c;border-color:#f56c6c}.mc-radio-danger .el-radio__input .el-radio__inner:hover{background-color:#f45454;border-color:#f45454}.mc-radio-danger .el-radio__input.is-checked .el-radio__inner{background-color:#f24545;border-color:#f24545}.mc-radio-danger .el-radio__label{color:#f56c6c;font-weight:500}.mc-radio-group-custom .el-radio .el-radio__input .el-radio__inner{background:linear-gradient(45deg,#667eea,#764ba2);border-color:#667eea}.mc-radio-group-custom .el-radio .el-radio__input .el-radio__inner:hover{background:linear-gradient(45deg,#5a6fd8,#6a4190);border-color:#5a6fd8}.mc-radio-group-custom .el-radio .el-radio__input.is-checked .el-radio__inner{background:linear-gradient(45deg,#4c63d2,#5d3a7e);border-color:#4c63d2}.mc-radio-group-custom .el-radio .el-radio__label{color:#667eea;font-weight:500}.mc-radio-group-success .el-radio .el-radio__input .el-radio__inner{background-color:#67c23a;border-color:#67c23a}.mc-radio-group-success .el-radio .el-radio__input .el-radio__inner:hover{background-color:#5daf34;border-color:#5daf34}.mc-radio-group-success .el-radio .el-radio__input.is-checked .el-radio__inner{background-color:#529b2e;border-color:#529b2e}.mc-radio-group-success .el-radio .el-radio__label{color:#67c23a;font-weight:500}.mc-radio-group-warning .el-radio .el-radio__input .el-radio__inner{background-color:#e6a23c;border-color:#e6a23c}.mc-radio-group-warning .el-radio .el-radio__input .el-radio__inner:hover{background-color:#d4922b;border-color:#d4922b}.mc-radio-group-warning .el-radio .el-radio__input.is-checked .el-radio__inner{background-color:#c8951f;border-color:#c8951f}.mc-radio-group-warning .el-radio .el-radio__label{color:#e6a23c;font-weight:500}.mc-radio-group-danger .el-radio .el-radio__input .el-radio__inner{background-color:#f56c6c;border-color:#f56c6c}.mc-radio-group-danger .el-radio .el-radio__input .el-radio__inner:hover{background-color:#f45454;border-color:#f45454}.mc-radio-group-danger .el-radio .el-radio__input.is-checked .el-radio__inner{background-color:#f24545;border-color:#f24545}.mc-radio-group-danger .el-radio .el-radio__label{color:#f56c6c;font-weight:500}.mc-radio-button-custom .el-radio-button__inner{background:linear-gradient(45deg,#667eea,#764ba2);border-color:#667eea;color:#fff}.mc-radio-button-custom .el-radio-button__inner:hover{background:linear-gradient(45deg,#5a6fd8,#6a4190);border-color:#5a6fd8}.mc-radio-button-custom .el-radio-button__original-radio:checked+.el-radio-button__inner{background:linear-gradient(45deg,#4c63d2,#5d3a7e);border-color:#4c63d2;box-shadow:-1px 0 #4c63d2}.mc-radio-button-success .el-radio-button__inner{background-color:#67c23a;border-color:#67c23a;color:#fff}.mc-radio-button-success .el-radio-button__inner:hover{background-color:#5daf34;border-color:#5daf34}.mc-radio-button-success .el-radio-button__original-radio:checked+.el-radio-button__inner{background-color:#529b2e;border-color:#529b2e;box-shadow:-1px 0 #529b2e}.mc-radio-button-warning .el-radio-button__inner{background-color:#e6a23c;border-color:#e6a23c;color:#fff}.mc-radio-button-warning .el-radio-button__inner:hover{background-color:#d4922b;border-color:#d4922b}.mc-radio-button-warning .el-radio-button__original-radio:checked+.el-radio-button__inner{background-color:#c8951f;border-color:#c8951f;box-shadow:-1px 0 #c8951f}.mc-radio-button-danger .el-radio-button__inner{background-color:#f56c6c;border-color:#f56c6c;color:#fff}.mc-radio-button-danger .el-radio-button__inner:hover{background-color:#f45454;border-color:#f45454}.mc-radio-button-danger .el-radio-button__original-radio:checked+.el-radio-button__inner{background-color:#f24545;border-color:#f24545;box-shadow:-1px 0 #f24545}.mc-switch-custom .el-switch__core{background:linear-gradient(45deg,#667eea,#764ba2);border-color:#667eea}.mc-switch-custom .el-switch__core:after{background:#fff}.mc-switch-custom.is-checked .el-switch__core{background:linear-gradient(45deg,#4c63d2,#5d3a7e);border-color:#4c63d2}.mc-switch-success .el-switch__core{background-color:#67c23a;border-color:#67c23a}.mc-switch-success .el-switch__core:after{background:#fff}.mc-switch-success.is-checked .el-switch__core{background-color:#529b2e;border-color:#529b2e}.mc-switch-warning .el-switch__core{background-color:#e6a23c;border-color:#e6a23c}.mc-switch-warning .el-switch__core:after{background:#fff}.mc-switch-warning.is-checked .el-switch__core{background-color:#c8951f;border-color:#c8951f}.mc-switch-danger .el-switch__core{background-color:#f56c6c;border-color:#f56c6c}.mc-switch-danger .el-switch__core:after{background:#fff}.mc-switch-danger.is-checked .el-switch__core{background-color:#f24545;border-color:#f24545}.mc-switch-gradient .el-switch__core{background:linear-gradient(90deg,#ff6b6b,#4ecdc4);border:none}.mc-switch-gradient .el-switch__core:after{background:#fff;box-shadow:0 2px 4px #0003}.mc-switch-gradient.is-checked .el-switch__core{background:linear-gradient(90deg,#4ecdc4,#45b7d1)}.mc-switch-neon .el-switch__core{background-color:#1a1a1a;border:2px solid #00ffff;box-shadow:0 0 10px #0ff}.mc-switch-neon .el-switch__core:after{background:#0ff;box-shadow:0 0 5px #0ff}.mc-switch-neon.is-checked .el-switch__core{background-color:#0ff;border-color:#0ff;box-shadow:0 0 15px #0ff}.m-tag.el-tag{font-size:var(--font-size-text-sm);--el-tag-border-radius: 8px}.m-tag.el-tag.el-tag--primary{--el-tag-bg-color: color-mix(in srgb, var(--text-warning-primary) 10%, transparent);--el-tag-border-color: color-mix(in srgb, var(--text-warning-primary) 20%, transparent);--el-tag-text-color: var(--text-warning-primary)}.m-tag.el-tag.el-tag--success{--el-tag-bg-color: color-mix(in srgb, var(--text-success-primary) 10%, transparent);--el-tag-border-color: color-mix(in srgb, var(--text-success-primary) 20%, transparent);--el-tag-text-color: var(--text-success-primary)}.m-tag.el-tag.el-tag--danger{--el-tag-bg-color: color-mix(in srgb, var(--text-error-primary) 10%, transparent);--el-tag-border-color: color-mix(in srgb, var(--text-error-primary) 20%, transparent);--el-tag-text-color: var(--text-error-primary)}.m-tag.el-tag.el-tag--info{--el-tag-bg-color: color-mix(in srgb, var(--text-primary) 10%, transparent);--el-tag-border-color: color-mix(in srgb, var(--text-primary) 20%, transparent);--el-tag-text-color: var(--text-primary)}.m-tag.el-tag.el-tag--dark.el-tag--warning{--el-tag-bg-color: color-mix(in srgb, var(--text-warning-primary) 10%, transparent);--el-tag-border-color: transparent}.m-tag.el-tag.el-tag--dark.el-tag--success{--el-tag-bg-color: color-mix(in srgb, var(--text-success-primary) 10%, transparent);--el-tag-border-color: transparent}.m-tag.el-tag.el-tag--dark.el-tag--danger{--el-tag-bg-color: color-mix(in srgb, var(--text-error-primary) 10%, transparent);--el-tag-border-color: transparent}.m-tag.el-tag.el-tag--dark.el-tag--info{--el-tag-bg-color: var(--bg-tertiary-hover);--el-tag-border-color: transparent}.mc-alert.el-alert{--el-alert-padding: 14px 16px}.mc-alert.el-alert .mc-alert-icon{width:16px;height:16px;object-fit:contain}.mc-alert.el-alert .el-alert__close-btn{top:50%;transform:translateY(-50%)}.mc-alert.el-alert.el-alert--error.is-light{background-color:var(--all-red-10);color:var(--text-error-primary);border-color:var(--all-red-10)}.mc-alert.el-alert.el-alert--error.is-light .el-alert__title,.mc-alert.el-alert.el-alert--error.is-light .el-alert__description,.mc-alert.el-alert.el-alert--error.is-light .el-alert__close-btn{color:var(--text-error-primary)}.mc-alert.el-alert.el-alert--error.is-light .el-alert__icon{display:flex;align-items:center}.mc-alert.el-alert.el-alert--warning.is-light{background-color:var(--all-orange-10);color:var(--text-warning-primary);border-color:var(--all-orange-10)}.mc-alert.el-alert.el-alert--warning.is-light .el-alert__title,.mc-alert.el-alert.el-alert--warning.is-light .el-alert__description,.mc-alert.el-alert.el-alert--warning.is-light .el-alert__close-btn{color:var(--text-warning-primary)}.mc-alert.el-alert.el-alert--warning.is-light .el-alert__icon{display:flex;align-items:center}.mc-alert.el-alert.el-alert--success.is-light{background-color:var(--all-green-10);color:var(--all-green-4);border-color:var(--all-green-10)}.mc-alert.el-alert.el-alert--success.is-light .el-alert__title,.mc-alert.el-alert.el-alert--success.is-light .el-alert__description,.mc-alert.el-alert.el-alert--success.is-light .el-alert__close-btn{color:var(--all-green-4)}.mc-alert.el-alert.el-alert--success.is-light .el-alert__icon{display:flex;align-items:center}.notification-container{position:fixed;z-index:9999;pointer-events:none}.custom-notification{position:fixed;top:20px;right:20px;width:400px;background:#201f24;border-radius:12px;padding:16px;display:flex;align-items:flex-start;gap:4px;box-shadow:0 8px 32px #0000004d;pointer-events:auto;z-index:9999}.custom-notification:nth-child(2){top:100px}.custom-notification:nth-child(3){top:180px}.custom-notification:nth-child(4){top:260px}.custom-notification:nth-child(5){top:340px}.custom-notification .notification-icon{flex-shrink:0;width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;position:relative;transform:translate(-9px,-8px)}.custom-notification .notification-icon img{width:100%;height:100%;object-fit:contain}.custom-notification .notification-content{flex:1}.custom-notification .notification-content .notification-title{color:#fff;font-size:16px;font-weight:600;margin-bottom:8px}.custom-notification .notification-content .notification-message{color:#fffc;font-size:14px;line-height:1.5;margin-bottom:16px}.custom-notification .notification-content .notification-action .custom-action-link{color:#ffd905;font-size:14px;font-weight:500;cursor:pointer;display:flex;align-items:center;gap:6px;transition:all .2s ease}.custom-notification .notification-content .notification-action .custom-action-link:hover{color:#fff}.custom-notification .notification-content .notification-action .custom-action-link span{line-height:1}.custom-notification .notification-content .notification-action .custom-action-link .arrow{transition:transform .2s ease;display:flex;align-items:center;line-height:1}.custom-notification .notification-content .notification-action .custom-action-link:hover .arrow{transform:translate(2px)}.custom-notification .notification-close{position:absolute;top:12px;right:12px;width:24px;height:24px;border:none;background:#ffffff1a;color:#fff9;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:16px;line-height:1;transition:all .2s ease}.custom-notification .notification-close:hover{background:#fff3;color:#ffffffe6}.notification-enter-active,.notification-leave-active{transition:all .3s ease}.notification-enter-from,.notification-leave-to{opacity:0;transform:translate(100%)}.notification-move{transition:transform .3s ease}@media (max-width: 480px){.custom-notification{width:calc(100vw - 40px);left:20px!important;right:20px!important}}.mc-datepicker-popper .el-picker-panel{border:1px solid var(--border-primary);border-radius:6px;box-shadow:0 4px 12px #0000001a}.mc-datepicker-popper .el-picker-panel .current .el-date-table-cell .el-date-table-cell__text,.mc-datepicker-popper .el-picker-panel .start-date .el-date-table-cell .el-date-table-cell__text,.mc-datepicker-popper .el-picker-panel .end-date .el-date-table-cell .el-date-table-cell__text{color:var(--text-quaternary);border-radius:3px}.mc-datepicker-popper .el-picker-panel .start-date .el-date-table-cell{border-top-left-radius:3px;border-bottom-left-radius:3px}.mc-datepicker-popper .el-picker-panel .end-date .el-date-table-cell{border-top-right-radius:3px;border-bottom-right-radius:3px}.mc-datepicker-popper .el-picker-panel .el-button.is-text{color:var(--text-brand)}.mc-datepicker-popper .el-picker-panel .el-button.is-plain{background:var(--bg-brand);color:var(--text-quaternary)}.m-banner[data-v-00c80323]{position:relative;display:flex;align-items:center;min-height:40px;border-radius:4px;border:1px solid;font-size:14px;line-height:1.5;padding:10px;transition:all .3s ease}.m-banner__content[data-v-00c80323]{display:flex;align-items:center;width:100%;flex:1}.m-banner__icon[data-v-00c80323]{display:flex;align-items:center;margin-right:8px;flex-shrink:0}.m-banner__text[data-v-00c80323]{flex:1;word-break:break-word}.m-banner__close[data-v-00c80323]{display:flex;align-items:center;justify-content:center;margin-left:8px;cursor:pointer;padding:4px;border-radius:3px;transition:background-color .2s ease;flex-shrink:0;min-width:20px;min-height:20px;opacity:.7}.m-banner__close[data-v-00c80323]:hover{background-color:#0000001a;opacity:1}.m-banner--info[data-v-00c80323]{background-color:#e1f3ff;border-color:#b3d8ff;color:#06c}.m-banner--info .m-banner__close[data-v-00c80323]:hover{background-color:#0066cc1a}.m-banner--success[data-v-00c80323]{background-color:#f0f9ff;border-color:#b3e5b3;color:#00a854}.m-banner--success .m-banner__close[data-v-00c80323]:hover{background-color:#00a8541a}.m-banner--warning[data-v-00c80323]{background-color:#fff7e6;border-color:#ffd591;color:#fa8c16}.m-banner--warning .m-banner__close[data-v-00c80323]:hover{background-color:#fa8c161a}.m-banner--error[data-v-00c80323]{background-color:#fff2f0;border-color:#ffccc7;color:#ff4d4f}.m-banner--error .m-banner__close[data-v-00c80323]:hover{background-color:#ff4d4f1a}.m-banner.m-banner-leave-active[data-v-00c80323]{opacity:0;transform:translateY(-10px);transition:opacity .3s ease,transform .3s ease}@media (prefers-color-scheme: dark){.m-banner--info[data-v-00c80323]{background-color:#1890ff1a;border-color:#1890ff4d;color:#69c0ff}.m-banner--success[data-v-00c80323]{background-color:#52c41a1a;border-color:#52c41a4d;color:#95de64}.m-banner--warning[data-v-00c80323]{background-color:#faad141a;border-color:#faad144d;color:#ffd666}.m-banner--error[data-v-00c80323]{background-color:#ff4d4f1a;border-color:#ff4d4f4d;color:#ff7875}}.m-tabs[data-v-23508d30]{display:flex;flex-direction:column}.m-tabs--left[data-v-23508d30]{flex-direction:row}.m-tabs--right[data-v-23508d30]{flex-direction:row-reverse}.m-tabs--bottom[data-v-23508d30]{flex-direction:column-reverse}.m-tabs__header[data-v-23508d30]{flex-shrink:0}.m-tabs__nav[data-v-23508d30]{display:flex;border-bottom:1px solid var(--el-border-color);position:relative}.m-tabs--card .m-tabs__nav[data-v-23508d30],.m-tabs--border-card .m-tabs__nav[data-v-23508d30]{border-bottom:none}.m-tabs--left .m-tabs__nav[data-v-23508d30],.m-tabs--right .m-tabs__nav[data-v-23508d30]{flex-direction:column;border-bottom:none;border-right:1px solid var(--el-border-color);width:120px}.m-tabs--right .m-tabs__nav[data-v-23508d30]{border-right:none;border-left:1px solid var(--el-border-color)}.m-tabs__item[data-v-23508d30]{display:flex;align-items:center;padding:8px 16px;cursor:pointer;border:1px solid transparent;border-bottom:none;background:transparent;color:var(--el-text-color-regular);font-size:14px;transition:all .3s ease;position:relative;flex-shrink:0}.m-tabs__item[data-v-23508d30]:hover{color:var(--el-color-primary)}.m-tabs__item--active[data-v-23508d30]{color:var(--el-color-primary);border-color:var(--el-border-color);border-bottom-color:var(--el-bg-color);background:var(--el-bg-color)}.m-tabs__item--active[data-v-23508d30]:after{content:"";position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--el-color-primary)}.m-tabs__item--disabled[data-v-23508d30]{color:var(--el-text-color-disabled);cursor:not-allowed}.m-tabs__item--disabled[data-v-23508d30]:hover{color:var(--el-text-color-disabled)}.m-tabs__item--closable[data-v-23508d30]{padding-right:24px}.m-tabs__item--add[data-v-23508d30]{padding:8px 12px;border:1px dashed var(--el-border-color);color:var(--el-text-color-regular)}.m-tabs__item--add[data-v-23508d30]:hover{color:var(--el-color-primary);border-color:var(--el-color-primary)}.m-tabs--card .m-tabs__item[data-v-23508d30]{border:1px solid var(--el-border-color);border-bottom:none;margin-right:2px}.m-tabs--card .m-tabs__item--active[data-v-23508d30]{border-bottom-color:var(--el-bg-color);background:var(--el-bg-color)}.m-tabs--card .m-tabs__item--active[data-v-23508d30]:after{display:none}.m-tabs--border-card .m-tabs__item[data-v-23508d30]{border:1px solid var(--el-border-color);border-bottom:none;margin-right:-1px;background:var(--el-fill-color-light)}.m-tabs--border-card .m-tabs__item--active[data-v-23508d30]{background:var(--el-bg-color);border-bottom-color:var(--el-bg-color)}.m-tabs--border-card .m-tabs__item--active[data-v-23508d30]:after{display:none}.m-tabs--left .m-tabs__item[data-v-23508d30],.m-tabs--right .m-tabs__item[data-v-23508d30]{border-bottom:1px solid var(--el-border-color);border-right:none}.m-tabs--left .m-tabs__item--active[data-v-23508d30],.m-tabs--right .m-tabs__item--active[data-v-23508d30]{border-bottom-color:var(--el-border-color);border-right-color:var(--el-bg-color)}.m-tabs--left .m-tabs__item--active[data-v-23508d30]:after,.m-tabs--right .m-tabs__item--active[data-v-23508d30]:after{display:none}.m-tabs--right .m-tabs__item[data-v-23508d30]{border-bottom:1px solid var(--el-border-color);border-left:none}.m-tabs--right .m-tabs__item--active[data-v-23508d30]{border-bottom-color:var(--el-border-color);border-left-color:var(--el-bg-color)}.m-tabs__item-text[data-v-23508d30]{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.m-tabs__item-close[data-v-23508d30]{position:absolute;right:8px;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:50%;transition:background-color .2s ease}.m-tabs__item-close[data-v-23508d30]:hover{background-color:var(--el-fill-color)}.m-tabs__content[data-v-23508d30]{flex:1;padding:16px 0}.m-tabs--card .m-tabs__content[data-v-23508d30],.m-tabs--border-card .m-tabs__content[data-v-23508d30]{padding:16px;border:1px solid var(--el-border-color);border-top:none}.m-tabs--border-card .m-tabs__content[data-v-23508d30]{background:var(--el-bg-color)}.m-tabs--left .m-tabs__content[data-v-23508d30],.m-tabs--right .m-tabs__content[data-v-23508d30]{flex:1;padding:0 0 0 16px}.m-tabs--right .m-tabs__content[data-v-23508d30]{padding:0 16px 0 0}@media (max-width: 768px){.m-tabs__item[data-v-23508d30]{padding:6px 12px;font-size:13px}.m-tabs--left .m-tabs__nav[data-v-23508d30],.m-tabs--right .m-tabs__nav[data-v-23508d30]{width:100px}}.m-tab-pane[data-v-722bb248]{display:none}.m-tab-pane--active[data-v-722bb248]{display:block}.m-tab-pane--disabled[data-v-722bb248]{opacity:.6;pointer-events:none}