@rft-rc/recycle-ui 0.0.1-rc.6 → 0.0.1-rc.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/components/button/index.vue","../src/components/button/index.ts","../src/components/descriptions/item.vue","../src/components/descriptions/index.vue","../src/components/descriptions/index.ts","../src/components/card/index.vue","../src/components/card/index.ts","../src/components/toast/index.vue","../src/components/toast/index.ts","../src/components/message/index.vue","../src/components/message/index.ts","../src/components/icon/index.vue","../src/components/icon/index.ts","../src/index.ts"],"sourcesContent":["<template>\r\n <button\r\n class=\"rc-button\"\r\n :class=\"[`rc-button--${type}`, `rc-button--${size}`, { 'is-plain': plain, 'is-block': block, 'is-disabled': disabled, 'is-loading': loading }]\"\r\n :style=\"{ borderRadius: radius }\"\r\n :disabled=\"disabled || loading\"\r\n @click=\"onClick\"\r\n >\r\n <span v-if=\"loading\" class=\"rc-button__spinner\" />\r\n <slot>{{ label }}</slot>\r\n </button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from 'vue';\r\ntype ButtonType = 'default' | 'primary' | 'success' | 'warning' | 'danger';\r\ntype ButtonSize = 'mini' | 'small' | 'medium' | 'large';\r\n\r\ninterface Props {\r\n type?: ButtonType;\r\n size?: ButtonSize;\r\n plain?: boolean;\r\n block?: boolean;\r\n /** 按钮文本,提供时可不写默认插槽 */\r\n label?: string;\r\n /** 圆角;number 代表 px,string 支持百分比等写法(如 '50%')。也兼容 boolean,true 表示大圆角。 */\r\n round?: number | string | boolean;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n type: 'default',\r\n size: 'medium',\r\n plain: false,\r\n block: false,\r\n label: '',\r\n round: 6,\r\n disabled: false,\r\n loading: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n (e: 'click', ev: MouseEvent): void\r\n}>();\r\n\r\nconst onClick = (ev: MouseEvent) => {\r\n if (!props.disabled && !props.loading) emit('click', ev);\r\n};\r\n\r\nconst radius = computed(() => {\r\n const v = props.round;\r\n if (typeof v === 'boolean') return v ? '999px' : '6px';\r\n if (typeof v === 'number') return `${v}px`;\r\n return String(v);\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.rc-button {\r\n --rc-primary: #1677ff;\r\n --rc-success: #00b578;\r\n --rc-warning: #ff8f1f;\r\n --rc-danger: #ff3141;\r\n --rc-text: #323233;\r\n --rc-border: #dcdee0;\r\n --rc-white: #ffffff;\r\n\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 36px;\r\n padding: 0 16px;\r\n border: 1px solid var(--rc-border);\r\n border-radius: 6px;\r\n background: var(--rc-white);\r\n color: var(--rc-text);\r\n cursor: pointer;\r\n user-select: none;\r\n transition: all .2s ease;\r\n\r\n &.is-disabled { cursor: not-allowed; opacity: .6; }\r\n &.is-block { display: flex; width: 100%; }\r\n &.is-plain { background: var(--rc-white); }\r\n &.is-loading { opacity: .85; }\r\n\r\n &__spinner {\r\n width: 14px;\r\n height: 14px;\r\n margin-right: 6px;\r\n border: 2px solid currentColor;\r\n border-top-color: transparent;\r\n border-radius: 50%;\r\n animation: rc-spin 0.8s linear infinite;\r\n }\r\n\r\n &--primary { background: var(--rc-primary); color: var(--rc-white); border-color: var(--rc-primary); }\r\n &--success { background: var(--rc-success); color: var(--rc-white); border-color: var(--rc-success); }\r\n &--warning { background: var(--rc-warning); color: var(--rc-white); border-color: var(--rc-warning); }\r\n &--danger { background: var(--rc-danger); color: var(--rc-white); border-color: var(--rc-danger); }\r\n\r\n &--mini { height: 24px; padding: 0 8px; font-size: 12px; }\r\n &--small { height: 28px; padding: 0 10px; font-size: 13px; }\r\n &--medium { height: 36px; padding: 0 16px; font-size: 14px; }\r\n &--large { height: 44px; padding: 0 20px; font-size: 16px; }\r\n}\r\n\r\n@keyframes rc-spin { to { transform: rotate(360deg) } }\r\n</style>\r\n\r\n\r\n\r\n","import type { App } from 'vue';\r\nimport Button from './index.vue';\r\n\r\n// 组件名使用全小写,以 <rc-button> 形式在模板中使用\r\n(Button as any).name = 'rc-button';\r\n\r\nexport function install(app: App) {\r\n app.component((Button as any).name, Button);\r\n return app;\r\n}\r\n\r\n\r\nexport default Button;\r\n","<template>\n <div class=\"rc-desc-item\" :style=\"{ width: computedWidth, flex: `0 0 ${computedWidth}` }\">\n <div class=\"rc-desc-item__label\" :style=\"labelStyle\">\n <slot name=\"label\">\n {{ label }}\n </slot>\n </div>\n <div class=\"rc-desc-item__value\">\n <slot>\n {{ value }}\n </slot>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject, Ref } from 'vue';\n\ndefineOptions({ name: 'rc-descriptions-item' });\n\nconst props = withDefaults(defineProps<{\n label?: string | number;\n value?: any;\n labelWidth?: string | number;\n /** 跨越的列数,默认 1,可传字符串数字 */\n span?: number | string;\n}>(), {\n label: '',\n value: '',\n labelWidth: '',\n span: 1,\n});\n\nconst providedWidth = inject<Ref<string>>('rcDescItemWidth', undefined as unknown as Ref<string>);\nconst providedSingleWidth = inject<Ref<string> | string>('rcDescSingleWidth', '' as unknown as Ref<string>);\nconst providedGap = inject<string>('rcDescGap', '0px');\nconst providedGapPx = inject<Ref<number> | number>('rcDescGapPx', 0 as unknown as Ref<number>);\nconst providedColCount = inject<Ref<number> | number>('rcDescColCount', 1 as unknown as Ref<number>);\nconst providedLabelWidth = inject<Ref<string> | string>('rcDescLabelWidth', '' as unknown as Ref<string>);\n\nconst spanNum = computed(() => {\n const n = typeof props.span === 'string' ? parseInt(props.span, 10) : props.span;\n const max = typeof (providedColCount as any)?.value === 'number' ? (providedColCount as any).value : (providedColCount as any);\n const safe = !Number.isNaN(n as number) && (n as number) > 0 ? (n as number) : 1;\n return Math.min(safe, max || 1);\n});\n\nconst computedWidth = computed(() => {\n const n = typeof (providedColCount as any)?.value === 'number' ? (providedColCount as any).value : (providedColCount as any);\n const gapPx = typeof (providedGapPx as any)?.value === 'number' ? (providedGapPx as any).value : (providedGapPx as any);\n const k = spanNum.value;\n if (!n || n <= 1) return '100%';\n if (k >= n) return '100%';\n // 展开为单层 calc:((100% - (n-1)*gap) * k / n + (k-1)*gap)\n const totalGap = (n - 1) * gapPx;\n const interGap = (k - 1) * gapPx;\n return `calc((100% - ${totalGap}px) * ${k} / ${n} + ${interGap}px)`;\n});\n\nconst labelStyle = computed(() => {\n const injected = typeof (providedLabelWidth as any)?.value === 'string'\n ? (providedLabelWidth as any).value\n : (providedLabelWidth as any);\n const w = props.labelWidth !== '' ? props.labelWidth : (injected || '');\n return w ? { width: typeof w === 'number' ? `${w}px` : String(w), flex: '0 0 auto' } : {};\n});\n</script>\n\n<style scoped>\n.rc-desc-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 6px 0;\n flex: 0 0 auto;\n}\n.rc-desc-item__label {\n color: #666;\n font-size: 14px;\n line-height: 22px;\n /* 不强制最小宽度,交由 label-width 控制 */\n min-width: 0;\n}\n.rc-desc-item__value {\n flex: 1 1 auto;\n font-size: 14px;\n line-height: 22px;\n}\n\n</style>\n\n\n","<template>\n <div class=\"rc-descriptions\">\n <div v-if=\"$slots.title || title\" class=\"rc-descriptions__title\">\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n <div class=\"rc-descriptions__body\" :style=\"{ gap: gapStyle }\" ref=\"wrapEl\">\n <template v-if=\"normalizedData.length\">\n <rcDescriptionsItem\n v-for=\"(it, idx) in normalizedData\"\n :key=\"idx\"\n :label=\"it.label\"\n :value=\"it.value\"\n :label-width=\"labelWidth\"\n />\n </template>\n <slot v-else />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, provide, ref, watchEffect } from 'vue';\nimport rcDescriptionsItem from './item.vue';\n\ndefineOptions({ name: 'rc-descriptions' });\n\ntype KeyMap = { key: string; value: string };\n\nconst props = withDefaults(defineProps<{\n title?: string;\n /** 每行展示的列数,支持数字或字符串数字 */\n column?: number | string;\n /** 列间距,支持数字(px)或字符串值,例如 '12px' */\n gap?: number | string;\n /** label 固定宽度,数字代表 px,也可直接传入 '120px' */\n labelWidth?: number | string | '';\n /** 直接通过数据渲染 */\n data?: Array<Record<string, any>>;\n /** data 的字段映射,如 { key: 'label', value: 'value' } */\n keyMap?: KeyMap;\n}>(), {\n column: 2,\n gap: 4,\n labelWidth: '',\n data: () => [],\n});\n\nconst wrapEl = ref<HTMLElement | null>(null);\nconst gapStyle = computed(() => (typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap)));\nconst colCount = computed(() => {\n const n = typeof props.column === 'string' ? Number.parseInt(props.column as string, 10) : (props.column ?? 1);\n return !Number.isNaN(n) && n > 0 ? n : 1;\n});\n\n// compute child item width as percentage string or 'auto'\nconst itemWidth = ref<string>('100%');\nconst singleWidth = ref<string>('100%');\nwatchEffect(() => {\n const n = colCount.value;\n if (n <= 1) {\n itemWidth.value = '100%';\n singleWidth.value = '100%';\n } else {\n // subtract total horizontal gaps from 100%\n const gapPx = typeof props.gap === 'number' ? props.gap : parseFloat(String(props.gap)) || 0;\n const totalGap = (n - 1) * gapPx;\n const base = `calc((100% - ${totalGap}px) / ${n})`;\n singleWidth.value = base;\n itemWidth.value = base;\n }\n});\n\nprovide('rcDescItemWidth', itemWidth);\nprovide('rcDescSingleWidth', singleWidth);\nprovide('rcDescColCount', colCount);\nprovide('rcDescGapPx', computed(() => (typeof props.gap === 'number' ? props.gap : parseFloat(String(props.gap)) || 0)));\nconst labelWidthCss = computed(() => {\n if (props.labelWidth === '' || props.labelWidth === undefined) return '';\n return typeof props.labelWidth === 'number' ? `${props.labelWidth}px` : String(props.labelWidth);\n});\nprovide('rcDescLabelWidth', labelWidthCss);\nprovide('rcDescGap', computed(() => (typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap))));\n\nconst normalizedData = computed(() => {\n const keyK = (props.keyMap?.key ?? 'label') as string;\n const keyV = (props.keyMap?.value ?? 'value') as string;\n if (!props.data?.length) return [];\n return props.data.map((it) => ({\n label: it?.[keyK],\n value: it?.[keyV],\n }));\n});\n\n</script>\n\n<style scoped>\n.rc-descriptions {\n width: 100%;\n}\n.rc-descriptions__title {\n font-weight: 600;\n font-size: 16px;\n margin: 0 0 12px 0;\n}\n.rc-description__row {\n display: contents;\n}\n.rc-descriptions__body {\n display: flex;\n flex-wrap: wrap;\n}\n\n</style>\n\n\n","import type { App } from 'vue';\r\nimport Descriptions from './index.vue';\r\nimport DescriptionsItem from './item.vue';\r\n\r\n(Descriptions as any).name = 'rc-descriptions';\r\n(DescriptionsItem as any).name = 'rc-descriptions-item';\r\n\r\nexport function install(app: App) {\r\n // 同时注册 kebab 与 PascalCase 名称,便于 <rc-descriptions>/<RcDescriptions> 使用\r\n app.component((Descriptions as any).name, Descriptions);\r\n app.component('RcDescriptions', Descriptions);\r\n app.component((DescriptionsItem as any).name, DescriptionsItem);\r\n app.component('RcDescriptionsItem', DescriptionsItem);\r\n return app;\r\n}\r\n\r\nexport const RcDescriptions = Descriptions;\r\nexport const RcDescriptionsItem = DescriptionsItem;\r\n\r\nexport default Descriptions;\r\n\r\n\r\n\r\n","<template>\n <div\n class=\"rc-card\"\n :class=\"[{ 'rc-card--bordered': bordered }]\"\n :style=\"wrapperStyle\"\n >\n <div\n v-if=\"$slots.title || title || $slots.status || status\"\n class=\"rc-card__top\"\n :style=\"{ backgroundColor: topBgColor || 'rgba(29, 133, 252, 0.05)' }\"\n >\n <div class=\"rc-card__title\">\n <slot name=\"title\">\n <span class=\"rc-card__title-text\">{{ title }}</span>\n </slot>\n </div>\n <div class=\"rc-card__status\" v-if=\"$slots.status || status\">\n <slot name=\"status\">\n <span class=\"rc-card__status-text\" :style=\"{ color: statusColor || 'var(--rc-primary)' }\">\n {{ status }}\n </span>\n </slot>\n </div>\n </div>\n\n <div class=\"rc-card__body\" :style=\"{ padding: bodyPadding, gap: bodyGap }\">\n <slot name=\"content\">\n <slot />\n </slot>\n </div>\n\n <div v-if=\"$slots.action\" class=\"rc-card__divider\" />\n\n <div v-if=\"$slots.action\" class=\"rc-card__action\">\n <slot name=\"action\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'rc-card' });\n\ninterface Props {\n /** 卡片整体背景色,默认白色 */\n color?: string;\n /** 顶部色块背景色 */\n topBgColor?: string;\n /** 标题文本(可用 slot=\"title\" 自定义) */\n title?: string;\n /** 右侧状态文案(可用 slot=\"status\" 自定义) */\n status?: string;\n /** 状态文本颜色 */\n statusColor?: string;\n /** 圆角:数值代表 px,字符串可用百分比 */\n round?: number | string;\n /** 是否描边 */\n bordered?: boolean;\n /** 阴影强度:0/1/2/3... -> 转换为不同阴影强度 */\n elevation?: number;\n /** 内边距(CSS 值,如 '16px 12px') */\n padding?: string;\n /** 主体内容的垂直间距(px 或 CSS 字符串) */\n gap?: number | string;\n /** 宽度(px/百分比) */\n width?: string | number;\n /** 高度(px/百分比) */\n height?: string | number;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n color: 'var(--rc-white)',\n topBgColor: 'rgba(29, 133, 252, 0.05)',\n title: '',\n status: '',\n statusColor: 'var(--rc-primary)',\n round: 8,\n bordered: false,\n elevation: 2,\n padding: '16px',\n gap: 12,\n width: '100%',\n height: '',\n});\n\nconst wrapperStyle = computed(() => {\n const radius =\n typeof props.round === 'boolean'\n ? props.round\n ? '12px'\n : '0'\n : typeof props.round === 'number'\n ? `${props.round}px`\n : String(props.round);\n\n return {\n backgroundColor: props.color || 'var(--rc-white)',\n borderRadius: radius,\n boxShadow: shadowByLevel(props.elevation),\n width: toCssSize(props.width),\n height: toCssSize(props.height),\n } as Record<string, string>;\n});\n\nconst bodyPadding = computed(() => props.padding || '16px');\nconst bodyGap = computed(() =>\n typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap)\n);\n\nfunction toCssSize(v?: string | number) {\n if (v === undefined || v === null || v === '') return '';\n return typeof v === 'number' ? `${v}px` : String(v);\n}\n\nfunction shadowByLevel(level: number) {\n if (!level || level <= 0) return 'none';\n // 简单的多层阴影(可按需微调)\n const base = 4 * level;\n return `0 ${Math.round(base / 2)}px ${base}px rgba(0,0,0,0.06), 0 ${Math.round(\n base / 4\n )}px ${Math.round(base / 2)}px rgba(0,0,0,0.04)`;\n}\n</script>\n\n<style scoped>\n.rc-card {\n --rc-white: #ffffff;\n --rc-border: #e5e6eb;\n --rc-primary: #1677ff;\n\n display: flex;\n flex-direction: column;\n width: 100%;\n border: 1px solid transparent;\n background: var(.rc-white);\n}\n.rc-card--bordered {\n border-color: var(--rc-border);\n}\n\n.rc-card__top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n.rc-card__title {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.rc-card__title-text {\n font-weight: 600;\n font-size: 16px;\n color: #1d2129;\n}\n.rc-card__status-text {\n font-size: 14px;\n}\n.rc-card__body {\n display: flex;\n flex-direction: column;\n}\n.rc-card__divider {\n height: 1px;\n background: var(--rc-border);\n}\n.rc-card__action {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n}\n</style>\n\n\n","import type { App } from 'vue';\r\nimport Card from './index.vue';\r\n\r\n// 同时注册小写与驼峰,便于 <rc-card> / <RcCard> 两种写法\r\n(Card as any).name = 'rc-card';\r\nconst PascalName = 'RcCard';\r\n\r\nexport function install(app: App) {\r\n app.component((Card as any).name, Card);\r\n app.component(PascalName, Card);\r\n return app;\r\n}\r\n\r\nexport default Card;\r\n\r\n\r\n","<template>\r\n <teleport to=\"body\">\r\n <transition name=\"rc-toast-fade\" @after-leave=\"onAfterLeave\">\r\n <div v-if=\"visible\" class=\"rc-toast\" :class=\"[`rc-toast--${type}`]\">\r\n <div v-if=\"mask\" class=\"rc-toast__mask\" />\r\n <div class=\"rc-toast__content\">\r\n <div v-if=\"type === 'loading'\" class=\"rc-toast__spinner\" />\r\n <div v-else-if=\"type === 'success'\" class=\"rc-toast__icon rc-toast__icon--success\" />\r\n <div v-else-if=\"type === 'fail'\" class=\"rc-toast__icon rc-toast__icon--fail\" />\r\n <div class=\"rc-toast__text\">{{ message }}</div>\r\n </div>\r\n </div>\r\n </transition>\r\n </teleport>\r\n <slot />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch, defineExpose } from 'vue';\r\n\r\nexport type ToastType = 'text' | 'success' | 'fail' | 'loading';\r\nexport interface ToastProps {\r\n message?: string;\r\n type?: ToastType;\r\n duration?: number;\r\n mask?: boolean;\r\n /** 服务端关闭回调,用于卸载容器 */\r\n onAfterLeave?: () => void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<ToastProps>(), {\r\n message: '',\r\n type: 'text',\r\n duration: 2000,\r\n mask: false,\r\n});\r\n\r\nconst visible = ref(true);\r\nlet timer: any;\r\n\r\nfunction clearTimer() {\r\n if (timer) {\r\n clearTimeout(timer);\r\n timer = null;\r\n }\r\n}\r\n\r\nfunction close() {\r\n clearTimer();\r\n visible.value = false;\r\n}\r\n\r\ndefineExpose({ close });\r\n\r\nonMounted(() => {\r\n if (props.duration && props.duration > 0) {\r\n timer = setTimeout(() => {\r\n close();\r\n }, props.duration);\r\n }\r\n});\r\n\r\nonUnmounted(() => {\r\n clearTimer();\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.rc-toast {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 9999;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n.rc-toast__mask {\r\n position: absolute;\r\n inset: 0;\r\n background: rgba(0, 0, 0, 0.35);\r\n pointer-events: auto;\r\n backdrop-filter: blur(1px);\r\n}\r\n.rc-toast__content {\r\n position: relative;\r\n max-width: 80%;\r\n background: rgba(0, 0, 0, 0.75);\r\n color: #fff;\r\n border-radius: 12px;\r\n padding: 12px 14px;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 8px;\r\n box-shadow: 0 6px 16px rgba(0,0,0,0.2);\r\n}\r\n.rc-toast__text {\r\n font-size: 14px;\r\n line-height: 1.4;\r\n}\r\n.rc-toast__spinner {\r\n width: 18px;\r\n height: 18px;\r\n border: 2px solid rgba(255,255,255,0.35);\r\n border-top-color: #fff;\r\n border-radius: 50%;\r\n animation: rc-toast-spin 0.8s linear infinite;\r\n}\r\n.rc-toast__icon {\r\n width: 18px;\r\n height: 18px;\r\n border-radius: 50%;\r\n position: relative;\r\n flex: 0 0 18px;\r\n}\r\n.rc-toast__icon--success::before {\r\n content: '';\r\n position: absolute;\r\n left: 3px;\r\n top: 3px;\r\n width: 10px;\r\n height: 10px;\r\n border-right: 2px solid #fff;\r\n border-bottom: 2px solid #fff;\r\n transform: rotate(45deg);\r\n}\r\n.rc-toast__icon--fail::before,\r\n.rc-toast__icon--fail::after {\r\n content: '';\r\n position: absolute;\r\n left: 3px;\r\n right: 3px;\r\n top: 8px;\r\n height: 2px;\r\n background: #fff;\r\n}\r\n.rc-toast__icon--fail::before {\r\n transform: rotate(45deg);\r\n}\r\n.rc-toast__icon--fail::after {\r\n transform: rotate(-45deg);\r\n}\r\n\r\n.rc-toast-fade-enter-active,\r\n.rc-toast-fade-leave-active {\r\n transition: opacity .2s ease;\r\n}\r\n.rc-toast-fade-enter-from,\r\n.rc-toast-fade-leave-to {\r\n opacity: 0;\r\n}\r\n@keyframes rc-toast-spin {\r\n to { transform: rotate(360deg); }\r\n}\r\n</style>\r\n\r\n\r\n","import { App, createApp } from 'vue';\r\nimport Toast, { type ToastProps } from './index.vue';\r\n\r\nexport type { ToastProps };\r\nexport interface ShowToastOptions {\r\n message?: string;\r\n type?: 'text' | 'success' | 'fail' | 'loading';\r\n duration?: number;\r\n mask?: boolean;\r\n /** 关闭时回调(仅服务方式有效) */\r\n onClose?: () => void;\r\n}\r\n\r\nlet app: App<Element> | null = null;\r\nlet host: HTMLDivElement | null = null;\r\n\r\nfunction unmount() {\r\n if (app) {\r\n app.unmount();\r\n app = null;\r\n }\r\n if (host) {\r\n document.body.removeChild(host);\r\n host = null;\r\n }\r\n}\r\n\r\nexport function showToast(options: string | ShowToastOptions) {\r\n const opt: ShowToastOptions =\r\n typeof options === 'string' ? { message: options } : (options || {});\r\n unmount();\r\n host = document.createElement('div');\r\n document.body.appendChild(host);\r\n const toastProps: ToastProps = {\r\n message: opt.message,\r\n type: (opt as any).type ?? 'text',\r\n duration: (opt as any).duration ?? 2000,\r\n mask: (opt as any).mask ?? false,\r\n onAfterLeave: () => {\r\n unmount();\r\n opt.onClose?.();\r\n },\r\n };\r\n app = createApp(Toast, toastProps as any);\r\n app.mount(host);\r\n return {\r\n close: hideToast,\r\n };\r\n}\r\n\r\nexport function hideToast() {\r\n if (!app) return;\r\n // 调用暴露的 close 方法\r\n // @ts-ignore\r\n app._instance?.exposed?.close?.();\r\n}\r\n\r\n// 组件注册(可选,提供 rc-toast 用于手动放置 Portal)\r\n(Toast as any).name = 'rc-toast';\r\nexport function install(app: App) {\r\n app.component((Toast as any).name, Toast);\r\n return app;\r\n}\r\n\r\nexport default Toast;\r\n\r\n\r\n","<template>\r\n <div class=\"rc-message\" role=\"alert\" aria-live=\"polite\">\r\n <transition-group name=\"rc-message-fade\" tag=\"div\">\r\n <div\r\n v-for=\"m in messages\"\r\n :key=\"m.id\"\r\n class=\"rc-message__item\"\r\n :class=\"`rc-message--${m.type}`\"\r\n >\r\n <span class=\"rc-message__content\">{{ m.content }}</span>\r\n </div>\r\n </transition-group>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { reactive } from 'vue';\r\n\r\nexport type MessageType = 'info' | 'success' | 'warning' | 'error' | 'loading';\r\nexport interface MessageItem {\r\n id: number;\r\n type: MessageType;\r\n content: string;\r\n duration: number; // ms; 0 = persistent (except loading default)\r\n}\r\n\r\nconst messages = reactive<MessageItem[]>([]);\r\nlet uid = 1;\r\n\r\nfunction remove(id: number) {\r\n const idx = messages.findIndex((x) => x.id === id);\r\n if (idx >= 0) messages.splice(idx, 1);\r\n}\r\n\r\nfunction add(type: MessageType, content: string, duration: number) {\r\n const id = uid++;\r\n messages.push({ id, type, content, duration });\r\n if (duration > 0) {\r\n window.setTimeout(() => remove(id), duration);\r\n }\r\n return id;\r\n}\r\n\r\ndefineExpose({ add, remove });\r\n</script>\r\n\r\n<style scoped>\r\n.rc-message {\r\n position: fixed;\r\n top: 16px;\r\n left: 0;\r\n right: 0;\r\n z-index: 10000;\r\n pointer-events: none;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n.rc-message__item {\r\n pointer-events: auto;\r\n min-width: 120px;\r\n max-width: 80%;\r\n padding: 8px 12px;\r\n border-radius: 6px;\r\n color: #fff;\r\n background: rgba(0, 0, 0, 0.78);\r\n box-shadow: 0 6px 16px rgba(0,0,0,0.2);\r\n font-size: 14px;\r\n}\r\n.rc-message--success { background: rgba(22,119,255,0.9); }\r\n.rc-message--warning { background: rgba(250,173,20,0.95); }\r\n.rc-message--error { background: rgba(245,63,63,0.95); }\r\n.rc-message--info { background: rgba(0,0,0,0.78); }\r\n.rc-message--loading { background: rgba(0,0,0,0.78); }\r\n\r\n.rc-message-fade-enter-active,\r\n.rc-message-fade-leave-active {\r\n transition: all .2s ease;\r\n}\r\n.rc-message-fade-enter-from,\r\n.rc-message-fade-leave-to {\r\n opacity: 0;\r\n transform: translateY(-6px);\r\n}\r\n</style>\r\n\r\n\r\n","import { createVNode, render, type App } from 'vue';\r\nimport MessageHost from './index.vue';\r\n\r\ntype MessageType = 'info' | 'success' | 'warning' | 'error' | 'loading';\r\n\r\nexport interface MessageOptions {\r\n content: string;\r\n duration?: number; // ms; default 2000, loading 默认 0\r\n type?: MessageType;\r\n}\r\n\r\nlet container: HTMLElement | null = null;\r\nlet hostExposed: any = null;\r\n\r\nfunction ensureHost() {\r\n if (container && hostExposed) return;\r\n container = document.createElement('div');\r\n document.body.appendChild(container);\r\n const vnode = createVNode(MessageHost, {});\r\n render(vnode, container);\r\n hostExposed = (vnode.component as any)?.exposed;\r\n}\r\n\r\nfunction open(type: MessageType, content: string, duration?: number) {\r\n ensureHost();\r\n const d = typeof duration === 'number'\r\n ? duration\r\n : (type === 'loading' ? 0 : 2000);\r\n return hostExposed?.add?.(type, content, d);\r\n}\r\n\r\nexport const message = {\r\n open(opts: MessageOptions) {\r\n return open(opts.type || 'info', opts.content, opts.duration);\r\n },\r\n info(content: string, duration?: number) {\r\n return open('info', content, duration);\r\n },\r\n success(content: string, duration?: number) {\r\n return open('success', content, duration);\r\n },\r\n warning(content: string, duration?: number) {\r\n return open('warning', content, duration);\r\n },\r\n error(content: string, duration?: number) {\r\n return open('error', content, duration);\r\n },\r\n loading(content: string, duration?: number) {\r\n return open('loading', content, duration);\r\n },\r\n destroy() {\r\n if (container) {\r\n render(null, container);\r\n container.remove();\r\n container = null;\r\n hostExposed = null;\r\n }\r\n },\r\n};\r\n\r\nexport default message;\r\n\r\n// 可选:提供 install,注入到 app.config.globalProperties 以便 this.$message 使用\r\nexport function install(app: App) {\r\n (app.config.globalProperties as any).$message = message;\r\n return app;\r\n}\r\n\r\n\r\n","<template>\r\n <i\r\n class=\"rc-icon\"\r\n :class=\"[baseClass, iconClassName, { 'rc-icon--spin': spin }]\"\r\n :style=\"iconStyle\"\r\n aria-hidden=\"true\"\r\n >\r\n <span v-if=\"char\" class=\"rc-icon__unicode\">{{ char }}</span>\r\n </i>\r\n </template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, inject, onMounted } from 'vue';\r\nimport type { RecycleUIOptions } from '../../types';\r\nimport { RECYCLE_UI_SYMBOL, defaultRecycleUIConfig } from '../../index';\r\n\r\ndefineOptions({ name: 'rc-icon' });\r\n\r\nconst props = withDefaults(defineProps<{\r\n /** 图标名,例如 'icon_a_in_store',也可直接传完整类名 */\r\n name: string;\r\n /** 尺寸,数字按 px 处理,也可传 '1.2em' 等 */\r\n size?: number | string;\r\n /** 颜色 */\r\n color?: string;\r\n /** 是否旋转(用于 loading 类图标) */\r\n spin?: boolean;\r\n /** Unicode 码点(不带 \\\\u,十六进制,如 'e609' 或 0xe609),用于无类名时渲染 */\r\n code?: string | number;\r\n}>(), {\r\n size: 16,\r\n color: '',\r\n spin: false,\r\n code: '',\r\n});\r\n\r\nconst cfg = inject<RecycleUIOptions>(RECYCLE_UI_SYMBOL, {} as RecycleUIOptions);\r\n\r\nconst baseClass = computed(() => cfg?.iconClass || 'iconfont');\r\nconst iconClassName = computed(() => props.name || '');\r\n\r\nconst sizeCss = computed(() => (typeof props.size === 'number' ? `${props.size}px` : (props.size || '16px')));\r\nconst iconStyle = computed(() => ({\r\n fontSize: sizeCss.value,\r\n color: props.color || undefined,\r\n lineHeight: 1,\r\n fontFamily: cfg?.iconClass || 'iconfont',\r\n}));\r\n\r\n// 将 code 转为字符\r\nconst char = computed(() => {\r\n const c = props.code as any;\r\n if (c === undefined || c === null || c === '' || c === 0) return '';\r\n if (typeof c === 'number') {\r\n return String.fromCharCode(c);\r\n }\r\n const hex = String(c).replace(/^0x/i, '');\r\n const num = parseInt(hex, 16);\r\n if (Number.isNaN(num)) return '';\r\n return String.fromCharCode(num);\r\n});\r\n\r\n// 兜底:若未通过 app.use 安装插件,则在组件挂载时尝试注入默认的 iconfont 样式\r\nonMounted(() => {\r\n if (typeof window === 'undefined') return;\r\n const url = (cfg && cfg.iconCssUrl) || defaultRecycleUIConfig.iconCssUrl;\r\n if (!url) return;\r\n const selector = `link[rel=\"stylesheet\"][data-rcui-icon=\"true\"][href=\"${url}\"]`;\r\n const exists = document.head.querySelector(selector);\r\n if (!exists) {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = url as string;\r\n link.setAttribute('data-rcui-icon', 'true');\r\n document.head.appendChild(link);\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.rc-icon {\r\n display: inline-block;\r\n vertical-align: -0.125em;\r\n}\r\n.rc-icon__unicode {\r\n /* 让 Unicode 文本走同一字体,确保显示 */\r\n font-family: inherit;\r\n line-height: 1;\r\n}\r\n.rc-icon--spin {\r\n animation: rc-icon-rot 1s linear infinite;\r\n}\r\n@keyframes rc-icon-rot {\r\n to { transform: rotate(360deg); }\r\n}\r\n</style>\r\n\r\n\r\n","import type { App } from 'vue';\r\nimport Icon from './index.vue';\r\n\r\n(Icon as any).name = 'rc-icon';\r\n\r\nexport function install(app: App) {\r\n app.component((Icon as any).name, Icon);\r\n app.component('RcIcon', Icon);\r\n return app;\r\n}\r\n\r\nexport const RcIcon = Icon;\r\nexport default Icon;\r\n\r\n\r\n","// library entry\r\nimport type { App, Plugin } from 'vue';\r\nimport { install as installButton } from './components/button';\r\nimport { install as installDescriptions } from './components/descriptions';\r\nimport { install as installCard } from './components/card';\r\nimport { install as installToast } from './components/toast';\r\nimport { install as installMessage } from './components/message';\r\nimport { install as installIcon } from './components/icon/index';\r\nimport type { RecycleUIOptions } from './types';\r\n\r\nexport const RECYCLE_UI_SYMBOL = Symbol('RECYCLE_UI_CONFIG');\r\n\r\nexport const defaultRecycleUIConfig: RecycleUIOptions = {\r\n prefix: 'rc',\r\n autoRegister: true,\r\n provideKey: RECYCLE_UI_SYMBOL,\r\n // 预留主题/其他全局配置\r\n theme: {},\r\n // IconFont 默认配置(可在 app.use 时覆盖)\r\n iconCssUrl: '//at.alicdn.com/t/c/font_4252799_9vcnw0pnmkh.css',\r\n iconClass: 'iconfont',\r\n};\r\n\r\n// 统一导出所有类型的命名空间\r\nexport namespace RecycleUi {\r\n // 核心配置类型\r\n export type Options = RecycleUIOptions;\r\n export type DefaultConfig = typeof defaultRecycleUIConfig;\r\n \r\n // Message 相关类型\r\n export type MessageOptions = import('./components/message').MessageOptions;\r\n export type MessageType = import('./components/message/index.vue').MessageType;\r\n export type MessageItem = import('./components/message/index.vue').MessageItem;\r\n \r\n // Toast 相关类型\r\n export type ToastProps = import('./components/toast/index.vue').ToastProps;\r\n export type ToastType = import('./components/toast/index.vue').ToastType;\r\n export type ShowToastOptions = import('./components/toast').ShowToastOptions;\r\n}\r\n\r\nfunction doAutoRegister(app: App, opts: RecycleUIOptions) {\r\n if (opts.autoRegister === false) return;\r\n if (typeof installButton === 'function') installButton(app);\r\n if (typeof installDescriptions === 'function') installDescriptions(app);\r\n if (typeof installCard === 'function') installCard(app);\r\n if (typeof installToast === 'function') installToast(app);\r\n if (typeof installIcon === 'function') installIcon(app);\r\n if (typeof installMessage === 'function') installMessage(app);\r\n}\r\n\r\nexport const install = (app: App, options?: RecycleUIOptions) => {\r\n const cfg: RecycleUIOptions = { ...defaultRecycleUIConfig, ...(options || {}) };\r\n // 提供全局配置\r\n app.provide(cfg.provideKey ?? RECYCLE_UI_SYMBOL, cfg);\r\n // 供模板/实例访问:this.$recycleUI\r\n (app.config.globalProperties as any).$recycleUI = cfg;\r\n // 注入 IconFont 样式链接(浏览器环境)\r\n if (typeof window !== 'undefined' && cfg.iconCssUrl) {\r\n const selector = `link[rel=\"stylesheet\"][data-rcui-icon=\"true\"][href=\"${cfg.iconCssUrl}\"]`;\r\n const exists = document.head.querySelector(selector);\r\n if (!exists) {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = cfg.iconCssUrl;\r\n link.setAttribute('data-rcui-icon', 'true');\r\n document.head.appendChild(link);\r\n }\r\n }\r\n // 自动注册内置组件(可通过 autoRegister 关闭)\r\n doAutoRegister(app, cfg);\r\n return app;\r\n};\r\n\r\n// 默认导出为插件,支持 app.use(recycleUi, options)\r\nconst plugin: Plugin = { install };\r\nexport default plugin;\r\n\r\n// 也导出命名组件安装器与默认配置(defaultRecycleUIConfig 已在上方以常量形式导出)\r\n\r\n// 可选:工厂方法,便于创建带预设配置的插件\r\nexport function createRecycleUI(options?: RecycleUIOptions): Plugin {\r\n return {\r\n install(app: App) {\r\n install(app, options);\r\n },\r\n };\r\n}\r\n\r\n// 按需导出组件与其安装器(供文档与业务直接使用)\r\nexport { default as RcButton } from './components/button';\r\nexport { RcDescriptions, RcDescriptionsItem } from './components/descriptions';\r\nexport { install as installButton } from './components/button';\r\nexport { install as installDescriptions } from './components/descriptions';\r\nexport { default as RcCard } from './components/card';\r\nexport { install as installCard } from './components/card';\r\n// 兼容别名导出(文档示例中的 rcXxx)\r\nexport { RcDescriptions as rcDescriptions, RcDescriptionsItem as rcDescriptionsItem } from './components/descriptions';\r\n// Toast 服务导出\r\nexport { default as RcToast, showToast, hideToast } from './components/toast';\r\n// Icon 组件导出\r\nexport { default as RcIcon } from './components/icon/index';\r\nexport { install as installIcon } from './components/icon/index';\r\n// Message 服务(对标 antd 的 message)\r\nexport { default as message } from './components/message';\r\nexport { install as installMessage } from './components/message';\r\n"],"names":["props","__props","emit","__emit","onClick","ev","radius","computed","v","_createElementBlock","_normalizeClass","_openBlock","_hoisted_2","_renderSlot","_ctx","Button","install","app","inject","providedGapPx","providedColCount","providedLabelWidth","spanNum","n","max","safe","computedWidth","gapPx","k","totalGap","interGap","labelStyle","injected","w","_normalizeStyle","_createElementVNode","_hoisted_1","wrapEl","ref","gapStyle","colCount","itemWidth","singleWidth","watchEffect","base","provide","labelWidthCss","normalizedData","keyK","_a","keyV","_b","_c","it","$slots","_Fragment","_renderList","idx","_createBlock","rcDescriptionsItem","Descriptions","DescriptionsItem","RcDescriptions","RcDescriptionsItem","wrapperStyle","shadowByLevel","toCssSize","bodyPadding","bodyGap","level","_toDisplayString","_hoisted_3","_hoisted_4","_hoisted_5","Card","PascalName","visible","timer","clearTimer","close","__expose","onMounted","onUnmounted","_Teleport","_createVNode","_Transition","_hoisted_6","host","unmount","showToast","options","opt","toastProps","createApp","Toast","hideToast","messages","reactive","uid","remove","id","x","add","type","content","duration","_TransitionGroup","m","container","hostExposed","ensureHost","vnode","createVNode","MessageHost","render","open","d","message","opts","cfg","RECYCLE_UI_SYMBOL","baseClass","iconClassName","sizeCss","iconStyle","char","hex","num","url","defaultRecycleUIConfig","selector","link","Icon","doAutoRegister","installButton","installDescriptions","installCard","installToast","installIcon","installMessage","plugin","createRecycleUI"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/components/button/index.vue","../src/components/button/index.ts","../src/components/descriptions/item.vue","../src/components/descriptions/index.vue","../src/components/descriptions/index.ts","../src/components/card/index.vue","../src/components/card/index.ts","../src/components/toast/index.vue","../src/components/toast/index.ts","../src/components/message/index.vue","../src/components/message/index.ts","../src/components/icon/index.vue","../src/components/icon/index.ts","../src/index.ts"],"sourcesContent":["<template>\r\n <button\r\n class=\"rc-button\"\r\n :class=\"[`rc-button--${type}`, `rc-button--${size}`, { 'is-plain': plain, 'is-block': block, 'is-disabled': disabled, 'is-loading': loading }]\"\r\n :style=\"{ borderRadius: radius }\"\r\n :disabled=\"disabled || loading\"\r\n @click=\"onClick\"\r\n >\r\n <span v-if=\"loading\" class=\"rc-button__spinner\" />\r\n <slot>{{ label }}</slot>\r\n </button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from 'vue';\r\ntype ButtonType = 'default' | 'primary' | 'success' | 'warning' | 'danger';\r\ntype ButtonSize = 'mini' | 'small' | 'medium' | 'large';\r\n\r\ninterface Props {\r\n type?: ButtonType;\r\n size?: ButtonSize;\r\n plain?: boolean;\r\n block?: boolean;\r\n /** 按钮文本,提供时可不写默认插槽 */\r\n label?: string;\r\n /** 圆角;number 代表 px,string 支持百分比等写法(如 '50%')。也兼容 boolean,true 表示大圆角。 */\r\n round?: number | string | boolean;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n type: 'default',\r\n size: 'medium',\r\n plain: false,\r\n block: false,\r\n label: '',\r\n round: 6,\r\n disabled: false,\r\n loading: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n (e: 'click', ev: MouseEvent): void\r\n}>();\r\n\r\nconst onClick = (ev: MouseEvent) => {\r\n if (!props.disabled && !props.loading) emit('click', ev);\r\n};\r\n\r\nconst radius = computed(() => {\r\n const v = props.round;\r\n if (typeof v === 'boolean') return v ? '999px' : '6px';\r\n if (typeof v === 'number') return `${v}px`;\r\n return String(v);\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.rc-button {\r\n --rc-primary: #1677ff;\r\n --rc-success: #00b578;\r\n --rc-warning: #ff8f1f;\r\n --rc-danger: #ff3141;\r\n --rc-text: #323233;\r\n --rc-border: #dcdee0;\r\n --rc-white: #ffffff;\r\n\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 36px;\r\n padding: 0 16px;\r\n border: 1px solid var(--rc-border);\r\n border-radius: 6px;\r\n background: var(--rc-white);\r\n color: var(--rc-text);\r\n cursor: pointer;\r\n user-select: none;\r\n transition: all .2s ease;\r\n\r\n &.is-disabled { cursor: not-allowed; opacity: .6; }\r\n &.is-block { display: flex; width: 100%; }\r\n &.is-plain { background: var(--rc-white); }\r\n &.is-loading { opacity: .85; }\r\n\r\n &__spinner {\r\n width: 14px;\r\n height: 14px;\r\n margin-right: 6px;\r\n border: 2px solid currentColor;\r\n border-top-color: transparent;\r\n border-radius: 50%;\r\n animation: rc-spin 0.8s linear infinite;\r\n }\r\n\r\n &--primary { background: var(--rc-primary); color: var(--rc-white); border-color: var(--rc-primary); }\r\n &--success { background: var(--rc-success); color: var(--rc-white); border-color: var(--rc-success); }\r\n &--warning { background: var(--rc-warning); color: var(--rc-white); border-color: var(--rc-warning); }\r\n &--danger { background: var(--rc-danger); color: var(--rc-white); border-color: var(--rc-danger); }\r\n\r\n &--mini { height: 24px; padding: 0 8px; font-size: 12px; }\r\n &--small { height: 28px; padding: 0 10px; font-size: 13px; }\r\n &--medium { height: 36px; padding: 0 16px; font-size: 14px; }\r\n &--large { height: 44px; padding: 0 20px; font-size: 16px; }\r\n}\r\n\r\n@keyframes rc-spin { to { transform: rotate(360deg) } }\r\n</style>\r\n\r\n\r\n\r\n","import type { App } from 'vue';\r\nimport Button from './index.vue';\r\n\r\n// 组件名使用全小写,以 <rc-button> 形式在模板中使用\r\n(Button as any).name = 'rc-button';\r\n\r\nexport function install(app: App) {\r\n app.component((Button as any).name, Button);\r\n return app;\r\n}\r\n\r\n\r\nexport default Button;\r\n","<template>\n <div class=\"rc-desc-item\" :style=\"{ width: computedWidth, flex: `0 0 ${computedWidth}` }\">\n <div class=\"rc-desc-item__label\" :style=\"labelStyle\">\n <slot name=\"label\">\n {{ label }}\n </slot>\n </div>\n <div class=\"rc-desc-item__value\">\n <slot>\n {{ value }}\n </slot>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject, Ref } from 'vue';\n\ndefineOptions({ name: 'rc-descriptions-item' });\n\nconst props = withDefaults(defineProps<{\n label?: string | number;\n value?: any;\n labelWidth?: string | number;\n /** 跨越的列数,默认 1,可传字符串数字 */\n span?: number | string;\n}>(), {\n label: '',\n value: '',\n labelWidth: '',\n span: 1,\n});\n\nconst providedWidth = inject<Ref<string>>('rcDescItemWidth', undefined as unknown as Ref<string>);\nconst providedSingleWidth = inject<Ref<string> | string>('rcDescSingleWidth', '' as unknown as Ref<string>);\nconst providedGap = inject<string>('rcDescGap', '0px');\nconst providedGapPx = inject<Ref<number> | number>('rcDescGapPx', 0 as unknown as Ref<number>);\nconst providedColCount = inject<Ref<number> | number>('rcDescColCount', 1 as unknown as Ref<number>);\nconst providedLabelWidth = inject<Ref<string> | string>('rcDescLabelWidth', '' as unknown as Ref<string>);\n\nconst spanNum = computed(() => {\n const n = typeof props.span === 'string' ? parseInt(props.span, 10) : props.span;\n const max = typeof (providedColCount as any)?.value === 'number' ? (providedColCount as any).value : (providedColCount as any);\n const safe = !Number.isNaN(n as number) && (n as number) > 0 ? (n as number) : 1;\n return Math.min(safe, max || 1);\n});\n\nconst computedWidth = computed(() => {\n const n = typeof (providedColCount as any)?.value === 'number' ? (providedColCount as any).value : (providedColCount as any);\n const gapPx = typeof (providedGapPx as any)?.value === 'number' ? (providedGapPx as any).value : (providedGapPx as any);\n const k = spanNum.value;\n if (!n || n <= 1) return '100%';\n if (k >= n) return '100%';\n // 展开为单层 calc:((100% - (n-1)*gap) * k / n + (k-1)*gap)\n const totalGap = (n - 1) * gapPx;\n const interGap = (k - 1) * gapPx;\n return `calc((100% - ${totalGap}px) * ${k} / ${n} + ${interGap}px)`;\n});\n\nconst labelStyle = computed(() => {\n const injected = typeof (providedLabelWidth as any)?.value === 'string'\n ? (providedLabelWidth as any).value\n : (providedLabelWidth as any);\n const w = props.labelWidth !== '' ? props.labelWidth : (injected || '');\n return w ? { width: typeof w === 'number' ? `${w}px` : String(w), flex: '0 0 auto' } : {};\n});\n</script>\n\n<style scoped>\n.rc-desc-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 6px 0;\n flex: 0 0 auto;\n}\n.rc-desc-item__label {\n color: #666;\n font-size: 14px;\n line-height: 22px;\n /* 不强制最小宽度,交由 label-width 控制 */\n min-width: 0;\n}\n.rc-desc-item__value {\n flex: 1 1 auto;\n font-size: 14px;\n line-height: 22px;\n}\n\n</style>\n\n\n","<template>\n <div class=\"rc-descriptions\">\n <div v-if=\"$slots.title || title\" class=\"rc-descriptions__title\">\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n <div class=\"rc-descriptions__body\" :style=\"{ gap: gapStyle }\" ref=\"wrapEl\">\n <template v-if=\"normalizedData.length\">\n <rcDescriptionsItem\n v-for=\"(it, idx) in normalizedData\"\n :key=\"idx\"\n :label=\"it.label\"\n :value=\"it.value\"\n :label-width=\"labelWidth\"\n />\n </template>\n <slot v-else />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, provide, ref, watchEffect } from 'vue';\nimport rcDescriptionsItem from './item.vue';\n\ndefineOptions({ name: 'rc-descriptions' });\n\ntype KeyMap = { key: string; value: string };\n\nconst props = withDefaults(defineProps<{\n title?: string;\n /** 每行展示的列数,支持数字或字符串数字 */\n column?: number | string;\n /** 列间距,支持数字(px)或字符串值,例如 '12px' */\n gap?: number | string;\n /** label 固定宽度,数字代表 px,也可直接传入 '120px' */\n labelWidth?: number | string | '';\n /** 直接通过数据渲染 */\n data?: Array<Record<string, any>>;\n /** data 的字段映射,如 { key: 'label', value: 'value' } */\n keyMap?: KeyMap;\n}>(), {\n column: 2,\n gap: 4,\n labelWidth: '',\n data: () => [],\n});\n\nconst wrapEl = ref<HTMLElement | null>(null);\nconst gapStyle = computed(() => (typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap)));\nconst colCount = computed(() => {\n const n = typeof props.column === 'string' ? Number.parseInt(props.column as string, 10) : (props.column ?? 1);\n return !Number.isNaN(n) && n > 0 ? n : 1;\n});\n\n// compute child item width as percentage string or 'auto'\nconst itemWidth = ref<string>('100%');\nconst singleWidth = ref<string>('100%');\nwatchEffect(() => {\n const n = colCount.value;\n if (n <= 1) {\n itemWidth.value = '100%';\n singleWidth.value = '100%';\n } else {\n // subtract total horizontal gaps from 100%\n const gapPx = typeof props.gap === 'number' ? props.gap : parseFloat(String(props.gap)) || 0;\n const totalGap = (n - 1) * gapPx;\n const base = `calc((100% - ${totalGap}px) / ${n})`;\n singleWidth.value = base;\n itemWidth.value = base;\n }\n});\n\nprovide('rcDescItemWidth', itemWidth);\nprovide('rcDescSingleWidth', singleWidth);\nprovide('rcDescColCount', colCount);\nprovide('rcDescGapPx', computed(() => (typeof props.gap === 'number' ? props.gap : parseFloat(String(props.gap)) || 0)));\nconst labelWidthCss = computed(() => {\n if (props.labelWidth === '' || props.labelWidth === undefined) return '';\n return typeof props.labelWidth === 'number' ? `${props.labelWidth}px` : String(props.labelWidth);\n});\nprovide('rcDescLabelWidth', labelWidthCss);\nprovide('rcDescGap', computed(() => (typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap))));\n\nconst normalizedData = computed(() => {\n const keyK = (props.keyMap?.key ?? 'label') as string;\n const keyV = (props.keyMap?.value ?? 'value') as string;\n if (!props.data?.length) return [];\n return props.data.map((it) => ({\n label: it?.[keyK],\n value: it?.[keyV],\n }));\n});\n\n</script>\n\n<style scoped>\n.rc-descriptions {\n width: 100%;\n}\n.rc-descriptions__title {\n font-weight: 600;\n font-size: 16px;\n margin: 0 0 12px 0;\n}\n.rc-description__row {\n display: contents;\n}\n.rc-descriptions__body {\n display: flex;\n flex-wrap: wrap;\n}\n\n</style>\n\n\n","import type { App } from 'vue';\r\nimport Descriptions from './index.vue';\r\nimport DescriptionsItem from './item.vue';\r\n\r\n(Descriptions as any).name = 'rc-descriptions';\r\n(DescriptionsItem as any).name = 'rc-descriptions-item';\r\n\r\nexport function install(app: App) {\r\n // 同时注册 kebab 与 PascalCase 名称,便于 <rc-descriptions>/<RcDescriptions> 使用\r\n app.component((Descriptions as any).name, Descriptions);\r\n app.component('RcDescriptions', Descriptions);\r\n app.component((DescriptionsItem as any).name, DescriptionsItem);\r\n app.component('RcDescriptionsItem', DescriptionsItem);\r\n return app;\r\n}\r\n\r\nexport const RcDescriptions = Descriptions;\r\nexport const RcDescriptionsItem = DescriptionsItem;\r\n\r\nexport default Descriptions;\r\n\r\n\r\n\r\n","<template>\n <div\n class=\"rc-card\"\n :class=\"[{ 'rc-card--bordered': bordered }]\"\n :style=\"wrapperStyle\"\n >\n <div\n v-if=\"$slots.title || title || $slots.status || status\"\n class=\"rc-card__top\"\n :style=\"{ backgroundColor: topBgColor || 'rgba(29, 133, 252, 0.05)' }\"\n >\n <div class=\"rc-card__title\">\n <slot name=\"title\">\n <span class=\"rc-card__title-text\">{{ title }}</span>\n </slot>\n </div>\n <div class=\"rc-card__status\" v-if=\"$slots.status || status\">\n <slot name=\"status\">\n <span class=\"rc-card__status-text\" :style=\"{ color: statusColor || 'var(--rc-primary)' }\">\n {{ status }}\n </span>\n </slot>\n </div>\n </div>\n\n <div class=\"rc-card__body\" :style=\"{ padding: bodyPadding, gap: bodyGap }\">\n <slot name=\"content\">\n <slot />\n </slot>\n </div>\n\n <div v-if=\"$slots.action\" class=\"rc-card__divider\" />\n\n <div v-if=\"$slots.action\" class=\"rc-card__action\">\n <slot name=\"action\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'rc-card' });\n\ninterface Props {\n /** 卡片整体背景色,默认白色 */\n color?: string;\n /** 顶部色块背景色 */\n topBgColor?: string;\n /** 标题文本(可用 slot=\"title\" 自定义) */\n title?: string;\n /** 右侧状态文案(可用 slot=\"status\" 自定义) */\n status?: string;\n /** 状态文本颜色 */\n statusColor?: string;\n /** 圆角:数值代表 px,字符串可用百分比 */\n round?: number | string;\n /** 是否描边 */\n bordered?: boolean;\n /** 阴影强度:0/1/2/3... -> 转换为不同阴影强度 */\n elevation?: number;\n /** 内边距(CSS 值,如 '16px 12px') */\n padding?: string;\n /** 主体内容的垂直间距(px 或 CSS 字符串) */\n gap?: number | string;\n /** 宽度(px/百分比) */\n width?: string | number;\n /** 高度(px/百分比) */\n height?: string | number;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n color: 'var(--rc-white)',\n topBgColor: 'rgba(29, 133, 252, 0.05)',\n title: '',\n status: '',\n statusColor: 'var(--rc-primary)',\n round: 8,\n bordered: false,\n elevation: 2,\n padding: '16px',\n gap: 12,\n width: '100%',\n height: '',\n});\n\nconst wrapperStyle = computed(() => {\n const radius =\n typeof props.round === 'boolean'\n ? props.round\n ? '12px'\n : '0'\n : typeof props.round === 'number'\n ? `${props.round}px`\n : String(props.round);\n\n return {\n backgroundColor: props.color || 'var(--rc-white)',\n borderRadius: radius,\n boxShadow: shadowByLevel(props.elevation),\n width: toCssSize(props.width),\n height: toCssSize(props.height),\n } as Record<string, string>;\n});\n\nconst bodyPadding = computed(() => props.padding || '16px');\nconst bodyGap = computed(() =>\n typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap)\n);\n\nfunction toCssSize(v?: string | number) {\n if (v === undefined || v === null || v === '') return '';\n return typeof v === 'number' ? `${v}px` : String(v);\n}\n\nfunction shadowByLevel(level: number) {\n if (!level || level <= 0) return 'none';\n // 简单的多层阴影(可按需微调)\n const base = 4 * level;\n return `0 ${Math.round(base / 2)}px ${base}px rgba(0,0,0,0.06), 0 ${Math.round(\n base / 4\n )}px ${Math.round(base / 2)}px rgba(0,0,0,0.04)`;\n}\n</script>\n\n<style scoped>\n.rc-card {\n --rc-white: #ffffff;\n --rc-border: #e5e6eb;\n --rc-primary: #1677ff;\n\n display: flex;\n flex-direction: column;\n width: 100%;\n border: 1px solid transparent;\n background: var(.rc-white);\n}\n.rc-card--bordered {\n border-color: var(--rc-border);\n}\n\n.rc-card__top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n.rc-card__title {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.rc-card__title-text {\n font-weight: 600;\n font-size: 16px;\n color: #1d2129;\n}\n.rc-card__status-text {\n font-size: 14px;\n}\n.rc-card__body {\n display: flex;\n flex-direction: column;\n}\n.rc-card__divider {\n height: 1px;\n background: var(--rc-border);\n}\n.rc-card__action {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n}\n</style>\n\n\n","import type { App } from 'vue';\r\nimport Card from './index.vue';\r\n\r\n// 同时注册小写与驼峰,便于 <rc-card> / <RcCard> 两种写法\r\n(Card as any).name = 'rc-card';\r\nconst PascalName = 'RcCard';\r\n\r\nexport function install(app: App) {\r\n app.component((Card as any).name, Card);\r\n app.component(PascalName, Card);\r\n return app;\r\n}\r\n\r\nexport default Card;\r\n\r\n\r\n","<template>\r\n <teleport to=\"body\">\r\n <transition name=\"rc-toast-fade\" @after-leave=\"onAfterLeave\">\r\n <div v-if=\"visible\" class=\"rc-toast\" :class=\"[`rc-toast--${type}`]\">\r\n <div v-if=\"mask\" class=\"rc-toast__mask\" />\r\n <div class=\"rc-toast__content\">\r\n <div v-if=\"type === 'loading'\" class=\"rc-toast__spinner\" />\r\n <div v-else-if=\"type === 'success'\" class=\"rc-toast__icon rc-toast__icon--success\" />\r\n <div v-else-if=\"type === 'fail'\" class=\"rc-toast__icon rc-toast__icon--fail\" />\r\n <div class=\"rc-toast__text\">{{ message }}</div>\r\n </div>\r\n </div>\r\n </transition>\r\n </teleport>\r\n <slot />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch, defineExpose } from 'vue';\r\n\r\nexport type ToastType = 'text' | 'success' | 'fail' | 'loading';\r\nexport interface ToastProps {\r\n message?: string;\r\n type?: ToastType;\r\n duration?: number;\r\n mask?: boolean;\r\n /** 服务端关闭回调,用于卸载容器 */\r\n onAfterLeave?: () => void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<ToastProps>(), {\r\n message: '',\r\n type: 'text',\r\n duration: 2000,\r\n mask: false,\r\n});\r\n\r\nconst visible = ref(true);\r\nlet timer: any;\r\n\r\nfunction clearTimer() {\r\n if (timer) {\r\n clearTimeout(timer);\r\n timer = null;\r\n }\r\n}\r\n\r\nfunction close() {\r\n clearTimer();\r\n visible.value = false;\r\n}\r\n\r\ndefineExpose({ close });\r\n\r\nonMounted(() => {\r\n if (props.duration && props.duration > 0) {\r\n timer = setTimeout(() => {\r\n close();\r\n }, props.duration);\r\n }\r\n});\r\n\r\nonUnmounted(() => {\r\n clearTimer();\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.rc-toast {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 9999;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n.rc-toast__mask {\r\n position: absolute;\r\n inset: 0;\r\n background: rgba(0, 0, 0, 0.35);\r\n pointer-events: auto;\r\n backdrop-filter: blur(1px);\r\n}\r\n.rc-toast__content {\r\n position: relative;\r\n max-width: 80%;\r\n background: rgba(0, 0, 0, 0.75);\r\n color: #fff;\r\n border-radius: 12px;\r\n padding: 12px 14px;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 8px;\r\n box-shadow: 0 6px 16px rgba(0,0,0,0.2);\r\n}\r\n.rc-toast__text {\r\n font-size: 14px;\r\n line-height: 1.4;\r\n}\r\n.rc-toast__spinner {\r\n width: 18px;\r\n height: 18px;\r\n border: 2px solid rgba(255,255,255,0.35);\r\n border-top-color: #fff;\r\n border-radius: 50%;\r\n animation: rc-toast-spin 0.8s linear infinite;\r\n}\r\n.rc-toast__icon {\r\n width: 18px;\r\n height: 18px;\r\n border-radius: 50%;\r\n position: relative;\r\n flex: 0 0 18px;\r\n}\r\n.rc-toast__icon--success::before {\r\n content: '';\r\n position: absolute;\r\n left: 3px;\r\n top: 3px;\r\n width: 10px;\r\n height: 10px;\r\n border-right: 2px solid #fff;\r\n border-bottom: 2px solid #fff;\r\n transform: rotate(45deg);\r\n}\r\n.rc-toast__icon--fail::before,\r\n.rc-toast__icon--fail::after {\r\n content: '';\r\n position: absolute;\r\n left: 3px;\r\n right: 3px;\r\n top: 8px;\r\n height: 2px;\r\n background: #fff;\r\n}\r\n.rc-toast__icon--fail::before {\r\n transform: rotate(45deg);\r\n}\r\n.rc-toast__icon--fail::after {\r\n transform: rotate(-45deg);\r\n}\r\n\r\n.rc-toast-fade-enter-active,\r\n.rc-toast-fade-leave-active {\r\n transition: opacity .2s ease;\r\n}\r\n.rc-toast-fade-enter-from,\r\n.rc-toast-fade-leave-to {\r\n opacity: 0;\r\n}\r\n@keyframes rc-toast-spin {\r\n to { transform: rotate(360deg); }\r\n}\r\n</style>\r\n\r\n\r\n","import { App, createApp } from 'vue';\r\nimport Toast, { type ToastProps } from './index.vue';\r\n\r\nexport type { ToastProps };\r\nexport interface ShowToastOptions {\r\n message?: string;\r\n type?: 'text' | 'success' | 'fail' | 'loading';\r\n duration?: number;\r\n mask?: boolean;\r\n /** 关闭时回调(仅服务方式有效) */\r\n onClose?: () => void;\r\n}\r\n\r\nlet app: App<Element> | null = null;\r\nlet host: HTMLDivElement | null = null;\r\n\r\nfunction unmount() {\r\n if (app) {\r\n app.unmount();\r\n app = null;\r\n }\r\n if (host) {\r\n document.body.removeChild(host);\r\n host = null;\r\n }\r\n}\r\n\r\nexport function showToast(options: string | ShowToastOptions) {\r\n const opt: ShowToastOptions =\r\n typeof options === 'string' ? { message: options } : (options || {});\r\n unmount();\r\n host = document.createElement('div');\r\n document.body.appendChild(host);\r\n const toastProps: ToastProps = {\r\n message: opt.message,\r\n type: (opt as any).type ?? 'text',\r\n duration: (opt as any).duration ?? 2000,\r\n mask: (opt as any).mask ?? false,\r\n onAfterLeave: () => {\r\n unmount();\r\n opt.onClose?.();\r\n },\r\n };\r\n app = createApp(Toast, toastProps as any);\r\n app.mount(host);\r\n return {\r\n close: hideToast,\r\n };\r\n}\r\n\r\nexport function hideToast() {\r\n if (!app) return;\r\n // 调用暴露的 close 方法\r\n // @ts-ignore\r\n app._instance?.exposed?.close?.();\r\n}\r\n\r\n// 组件注册(可选,提供 rc-toast 用于手动放置 Portal)\r\n(Toast as any).name = 'rc-toast';\r\nexport function install(app: App) {\r\n app.component((Toast as any).name, Toast);\r\n return app;\r\n}\r\n\r\nexport default Toast;\r\n\r\n\r\n","<template>\r\n <div class=\"rc-message\" role=\"alert\" aria-live=\"polite\">\r\n <transition-group name=\"rc-message-fade\" tag=\"div\">\r\n <div\r\n v-for=\"m in messages\"\r\n :key=\"m.id\"\r\n class=\"rc-message__item\"\r\n :class=\"`rc-message--${m.type}`\"\r\n >\r\n <span class=\"rc-message__content\">{{ m.content }}</span>\r\n </div>\r\n </transition-group>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { reactive } from 'vue';\r\n\r\nexport type MessageType = 'info' | 'success' | 'warning' | 'error' | 'loading';\r\nexport interface MessageItem {\r\n id: number;\r\n type: MessageType;\r\n content: string;\r\n duration: number; // ms; 0 = persistent (except loading default)\r\n}\r\n\r\nconst messages = reactive<MessageItem[]>([]);\r\nlet uid = 1;\r\n\r\nfunction remove(id: number) {\r\n const idx = messages.findIndex((x) => x.id === id);\r\n if (idx >= 0) messages.splice(idx, 1);\r\n}\r\n\r\nfunction add(type: MessageType, content: string, duration: number) {\r\n const id = uid++;\r\n messages.push({ id, type, content, duration });\r\n if (duration > 0) {\r\n window.setTimeout(() => remove(id), duration);\r\n }\r\n return id;\r\n}\r\n\r\ndefineExpose({ add, remove });\r\n</script>\r\n\r\n<style scoped>\r\n.rc-message {\r\n position: fixed;\r\n top: 16px;\r\n left: 0;\r\n right: 0;\r\n z-index: 10000;\r\n pointer-events: none;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n.rc-message__item {\r\n pointer-events: auto;\r\n min-width: 120px;\r\n max-width: 80%;\r\n padding: 8px 12px;\r\n border-radius: 6px;\r\n color: #fff;\r\n background: rgba(0, 0, 0, 0.78);\r\n box-shadow: 0 6px 16px rgba(0,0,0,0.2);\r\n font-size: 14px;\r\n}\r\n.rc-message--success { background: rgba(22,119,255,0.9); }\r\n.rc-message--warning { background: rgba(250,173,20,0.95); }\r\n.rc-message--error { background: rgba(245,63,63,0.95); }\r\n.rc-message--info { background: rgba(0,0,0,0.78); }\r\n.rc-message--loading { background: rgba(0,0,0,0.78); }\r\n\r\n.rc-message-fade-enter-active,\r\n.rc-message-fade-leave-active {\r\n transition: all .2s ease;\r\n}\r\n.rc-message-fade-enter-from,\r\n.rc-message-fade-leave-to {\r\n opacity: 0;\r\n transform: translateY(-6px);\r\n}\r\n</style>\r\n\r\n\r\n","import { createVNode, render, type App } from 'vue';\r\nimport MessageHost from './index.vue';\r\n\r\ntype MessageType = 'info' | 'success' | 'warning' | 'error' | 'loading';\r\n\r\nexport interface MessageOptions {\r\n content: string;\r\n duration?: number; // ms; default 2000, loading 默认 0\r\n type?: MessageType;\r\n}\r\n\r\nlet container: HTMLElement | null = null;\r\nlet hostExposed: any = null;\r\n\r\nfunction ensureHost() {\r\n if (container && hostExposed) return;\r\n container = document.createElement('div');\r\n document.body.appendChild(container);\r\n const vnode = createVNode(MessageHost, {});\r\n render(vnode, container);\r\n hostExposed = (vnode.component as any)?.exposed;\r\n}\r\n\r\nfunction open(type: MessageType, content: string, duration?: number) {\r\n ensureHost();\r\n const d = typeof duration === 'number'\r\n ? duration\r\n : (type === 'loading' ? 0 : 2000);\r\n return hostExposed?.add?.(type, content, d);\r\n}\r\n\r\nexport const message = {\r\n open(opts: MessageOptions) {\r\n return open(opts.type || 'info', opts.content, opts.duration);\r\n },\r\n info(content: string, duration?: number) {\r\n return open('info', content, duration);\r\n },\r\n success(content: string, duration?: number) {\r\n return open('success', content, duration);\r\n },\r\n warning(content: string, duration?: number) {\r\n return open('warning', content, duration);\r\n },\r\n error(content: string, duration?: number) {\r\n return open('error', content, duration);\r\n },\r\n loading(content: string, duration?: number) {\r\n return open('loading', content, duration);\r\n },\r\n destroy() {\r\n if (container) {\r\n render(null, container);\r\n container.remove();\r\n container = null;\r\n hostExposed = null;\r\n }\r\n },\r\n};\r\n\r\nexport default message;\r\n\r\n// 可选:提供 install,注入到 app.config.globalProperties 以便 this.$message 使用\r\nexport function install(app: App) {\r\n (app.config.globalProperties as any).$message = message;\r\n return app;\r\n}\r\n\r\n\r\n","<template>\r\n <i\r\n class=\"rc-icon\"\r\n :class=\"[baseClass, iconClassName, { 'rc-icon--spin': spin }]\"\r\n :style=\"iconStyle\"\r\n aria-hidden=\"true\"\r\n >\r\n <span v-if=\"char\" class=\"rc-icon__unicode\">{{ char }}</span>\r\n </i>\r\n </template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, inject, onMounted } from 'vue';\r\nimport type { RecycleUIOptions } from '../../types';\r\nimport { RECYCLE_UI_SYMBOL, defaultRecycleUIConfig } from '../../index';\r\n\r\ndefineOptions({ name: 'rc-icon' });\r\n\r\nconst props = withDefaults(defineProps<{\r\n /** 图标名,例如 'icon_a_in_store',也可直接传完整类名 */\r\n name: string;\r\n /** 尺寸,数字按 px 处理,也可传 '1.2em' 等 */\r\n size?: number | string;\r\n /** 颜色 */\r\n color?: string;\r\n /** 是否旋转(用于 loading 类图标) */\r\n spin?: boolean;\r\n /** Unicode 码点(不带 \\\\u,十六进制,如 'e609' 或 0xe609),用于无类名时渲染 */\r\n code?: string | number;\r\n}>(), {\r\n size: 16,\r\n color: '',\r\n spin: false,\r\n code: '',\r\n});\r\n\r\nconst cfg = inject<RecycleUIOptions>(RECYCLE_UI_SYMBOL, {} as RecycleUIOptions);\r\n\r\nconst baseClass = computed(() => cfg?.iconClass || 'iconfont');\r\nconst iconClassName = computed(() => props.name || '');\r\n\r\nconst sizeCss = computed(() => (typeof props.size === 'number' ? `${props.size}px` : (props.size || '16px')));\r\nconst iconStyle = computed(() => ({\r\n fontSize: sizeCss.value,\r\n color: props.color || undefined,\r\n lineHeight: 1,\r\n fontFamily: cfg?.iconClass || 'iconfont',\r\n}));\r\n\r\n// 将 code 转为字符\r\nconst char = computed(() => {\r\n const c = props.code as any;\r\n if (c === undefined || c === null || c === '' || c === 0) return '';\r\n if (typeof c === 'number') {\r\n return String.fromCharCode(c);\r\n }\r\n const hex = String(c).replace(/^0x/i, '');\r\n const num = parseInt(hex, 16);\r\n if (Number.isNaN(num)) return '';\r\n return String.fromCharCode(num);\r\n});\r\n\r\n// 兜底:若未通过 app.use 安装插件,则在组件挂载时尝试注入默认的 iconfont 样式\r\nonMounted(() => {\r\n if (typeof window === 'undefined') return;\r\n const url = (cfg && cfg.iconCssUrl) || defaultRecycleUIConfig.iconCssUrl;\r\n if (!url) return;\r\n const selector = `link[rel=\"stylesheet\"][data-rcui-icon=\"true\"][href=\"${url}\"]`;\r\n const exists = document.head.querySelector(selector);\r\n if (!exists) {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = url as string;\r\n link.setAttribute('data-rcui-icon', 'true');\r\n document.head.appendChild(link);\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.rc-icon {\r\n display: inline-block;\r\n vertical-align: -0.125em;\r\n}\r\n.rc-icon__unicode {\r\n /* 让 Unicode 文本走同一字体,确保显示 */\r\n font-family: inherit;\r\n line-height: 1;\r\n}\r\n.rc-icon--spin {\r\n animation: rc-icon-rot 1s linear infinite;\r\n}\r\n@keyframes rc-icon-rot {\r\n to { transform: rotate(360deg); }\r\n}\r\n</style>\r\n\r\n\r\n","import type { App } from 'vue';\r\nimport Icon from './index.vue';\r\n\r\n(Icon as any).name = 'rc-icon';\r\n\r\nexport function install(app: App) {\r\n app.component((Icon as any).name, Icon);\r\n app.component('RcIcon', Icon);\r\n return app;\r\n}\r\n\r\nexport const RcIcon = Icon;\r\nexport default Icon;\r\n\r\n\r\n","// library entry\r\nimport type { App, Plugin } from 'vue';\r\nimport { install as installButton } from './components/button';\r\nimport { install as installDescriptions } from './components/descriptions';\r\nimport { install as installCard } from './components/card';\r\nimport { install as installToast } from './components/toast';\r\nimport { install as installMessage } from './components/message';\r\nimport { install as installIcon } from './components/icon/index';\r\nimport type { RecycleUIOptions } from './types';\r\n\r\nexport const RECYCLE_UI_SYMBOL = Symbol('RECYCLE_UI_CONFIG');\r\n\r\nexport const defaultRecycleUIConfig: RecycleUIOptions = {\r\n prefix: 'rc',\r\n autoRegister: true,\r\n provideKey: RECYCLE_UI_SYMBOL,\r\n // 预留主题/其他全局配置\r\n theme: {},\r\n // IconFont 默认配置(可在 app.use 时覆盖)\r\n iconCssUrl: '//at.alicdn.com/t/c/font_4252799_9vcnw0pnmkh.css',\r\n iconClass: 'iconfont',\r\n};\r\n\r\n// 统一导出所有类型的命名空间\r\nexport namespace RecycleUiTypes {\r\n // 核心配置类型\r\n export type Options = RecycleUIOptions;\r\n export type DefaultConfig = typeof defaultRecycleUIConfig;\r\n \r\n // Message 相关类型\r\n export type MessageOptions = import('./components/message').MessageOptions;\r\n export type MessageType = import('./components/message/index.vue').MessageType;\r\n export type MessageItem = import('./components/message/index.vue').MessageItem;\r\n \r\n // Toast 相关类型\r\n export type ToastProps = import('./components/toast/index.vue').ToastProps;\r\n export type ToastType = import('./components/toast/index.vue').ToastType;\r\n export type ShowToastOptions = import('./components/toast').ShowToastOptions;\r\n}\r\n\r\nfunction doAutoRegister(app: App, opts: RecycleUIOptions) {\r\n if (opts.autoRegister === false) return;\r\n if (typeof installButton === 'function') installButton(app);\r\n if (typeof installDescriptions === 'function') installDescriptions(app);\r\n if (typeof installCard === 'function') installCard(app);\r\n if (typeof installToast === 'function') installToast(app);\r\n if (typeof installIcon === 'function') installIcon(app);\r\n if (typeof installMessage === 'function') installMessage(app);\r\n}\r\n\r\nexport const install = (app: App, options?: RecycleUIOptions) => {\r\n const cfg: RecycleUIOptions = { ...defaultRecycleUIConfig, ...(options || {}) };\r\n // 提供全局配置\r\n app.provide(cfg.provideKey ?? RECYCLE_UI_SYMBOL, cfg);\r\n // 供模板/实例访问:this.$recycleUI\r\n (app.config.globalProperties as any).$recycleUI = cfg;\r\n // 注入 IconFont 样式链接(浏览器环境)\r\n if (typeof window !== 'undefined' && cfg.iconCssUrl) {\r\n const selector = `link[rel=\"stylesheet\"][data-rcui-icon=\"true\"][href=\"${cfg.iconCssUrl}\"]`;\r\n const exists = document.head.querySelector(selector);\r\n if (!exists) {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = cfg.iconCssUrl;\r\n link.setAttribute('data-rcui-icon', 'true');\r\n document.head.appendChild(link);\r\n }\r\n }\r\n // 自动注册内置组件(可通过 autoRegister 关闭)\r\n doAutoRegister(app, cfg);\r\n return app;\r\n};\r\n\r\n// 默认导出为插件,支持 app.use(recycleUi, options)\r\nconst plugin: Plugin = { install };\r\nexport default plugin;\r\n\r\n// 也导出命名组件安装器与默认配置(defaultRecycleUIConfig 已在上方以常量形式导出)\r\n\r\n// 可选:工厂方法,便于创建带预设配置的插件\r\nexport function createRecycleUI(options?: RecycleUIOptions): Plugin {\r\n return {\r\n install(app: App) {\r\n install(app, options);\r\n },\r\n };\r\n}\r\n\r\n// 按需导出组件与其安装器(供文档与业务直接使用)\r\nexport { default as RcButton } from './components/button';\r\nexport { RcDescriptions, RcDescriptionsItem } from './components/descriptions';\r\nexport { install as installButton } from './components/button';\r\nexport { install as installDescriptions } from './components/descriptions';\r\nexport { default as RcCard } from './components/card';\r\nexport { install as installCard } from './components/card';\r\n// 兼容别名导出(文档示例中的 rcXxx)\r\nexport { RcDescriptions as rcDescriptions, RcDescriptionsItem as rcDescriptionsItem } from './components/descriptions';\r\n// Toast 服务导出\r\nexport { default as RcToast, showToast, hideToast } from './components/toast';\r\n// Icon 组件导出\r\nexport { default as RcIcon } from './components/icon/index';\r\nexport { install as installIcon } from './components/icon/index';\r\n// Message 服务(对标 antd 的 message)\r\nexport { default as message } from './components/message';\r\nexport { install as installMessage } from './components/message';\r\n"],"names":["props","__props","emit","__emit","onClick","ev","radius","computed","v","_createElementBlock","_normalizeClass","_openBlock","_hoisted_2","_renderSlot","_ctx","Button","install","app","inject","providedGapPx","providedColCount","providedLabelWidth","spanNum","n","max","safe","computedWidth","gapPx","k","totalGap","interGap","labelStyle","injected","w","_normalizeStyle","_createElementVNode","_hoisted_1","wrapEl","ref","gapStyle","colCount","itemWidth","singleWidth","watchEffect","base","provide","labelWidthCss","normalizedData","keyK","_a","keyV","_b","_c","it","$slots","_Fragment","_renderList","idx","_createBlock","rcDescriptionsItem","Descriptions","DescriptionsItem","RcDescriptions","RcDescriptionsItem","wrapperStyle","shadowByLevel","toCssSize","bodyPadding","bodyGap","level","_toDisplayString","_hoisted_3","_hoisted_4","_hoisted_5","Card","PascalName","visible","timer","clearTimer","close","__expose","onMounted","onUnmounted","_Teleport","_createVNode","_Transition","_hoisted_6","host","unmount","showToast","options","opt","toastProps","createApp","Toast","hideToast","messages","reactive","uid","remove","id","x","add","type","content","duration","_TransitionGroup","m","container","hostExposed","ensureHost","vnode","createVNode","MessageHost","render","open","d","message","opts","cfg","RECYCLE_UI_SYMBOL","baseClass","iconClassName","sizeCss","iconStyle","char","hex","num","url","defaultRecycleUIConfig","selector","link","Icon","doAutoRegister","installButton","installDescriptions","installCard","installToast","installIcon","installMessage","plugin","createRecycleUI"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import type { App, Plugin } from 'vue';
2
2
  import type { RecycleUIOptions } from './types';
3
3
  export declare const RECYCLE_UI_SYMBOL: unique symbol;
4
4
  export declare const defaultRecycleUIConfig: RecycleUIOptions;
5
- export declare namespace RecycleUi {
5
+ export declare namespace RecycleUiTypes {
6
6
  type Options = RecycleUIOptions;
7
7
  type DefaultConfig = typeof defaultRecycleUIConfig;
8
8
  type MessageOptions = import('./components/message').MessageOptions;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAOvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,eAAO,MAAM,iBAAiB,eAA8B,CAAC;AAE7D,eAAO,MAAM,sBAAsB,EAAE,gBASpC,CAAC;AAGF,yBAAiB,SAAS,CAAC;IAEzB,KAAY,OAAO,GAAG,gBAAgB,CAAC;IACvC,KAAY,aAAa,GAAG,OAAO,sBAAsB,CAAC;IAG1D,KAAY,cAAc,GAAG,OAAO,sBAAsB,EAAE,cAAc,CAAC;IAC3E,KAAY,WAAW,GAAG,OAAO,gCAAgC,EAAE,WAAW,CAAC;IAC/E,KAAY,WAAW,GAAG,OAAO,gCAAgC,EAAE,WAAW,CAAC;IAG/E,KAAY,UAAU,GAAG,OAAO,8BAA8B,EAAE,UAAU,CAAC;IAC3E,KAAY,SAAS,GAAG,OAAO,8BAA8B,EAAE,SAAS,CAAC;IACzE,KAAY,gBAAgB,GAAG,OAAO,oBAAoB,EAAE,gBAAgB,CAAC;CAC9E;AAYD,eAAO,MAAM,OAAO,GAAI,KAAK,GAAG,EAAE,UAAU,gBAAgB,aAqB3D,CAAC;AAGF,QAAA,MAAM,MAAM,EAAE,MAAoB,CAAC;AACnC,eAAe,MAAM,CAAC;AAKtB,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAMlE;AAGD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,cAAc,IAAI,cAAc,EAAE,kBAAkB,IAAI,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEvH,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAOvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,eAAO,MAAM,iBAAiB,eAA8B,CAAC;AAE7D,eAAO,MAAM,sBAAsB,EAAE,gBASpC,CAAC;AAGF,yBAAiB,cAAc,CAAC;IAE9B,KAAY,OAAO,GAAG,gBAAgB,CAAC;IACvC,KAAY,aAAa,GAAG,OAAO,sBAAsB,CAAC;IAG1D,KAAY,cAAc,GAAG,OAAO,sBAAsB,EAAE,cAAc,CAAC;IAC3E,KAAY,WAAW,GAAG,OAAO,gCAAgC,EAAE,WAAW,CAAC;IAC/E,KAAY,WAAW,GAAG,OAAO,gCAAgC,EAAE,WAAW,CAAC;IAG/E,KAAY,UAAU,GAAG,OAAO,8BAA8B,EAAE,UAAU,CAAC;IAC3E,KAAY,SAAS,GAAG,OAAO,8BAA8B,EAAE,SAAS,CAAC;IACzE,KAAY,gBAAgB,GAAG,OAAO,oBAAoB,EAAE,gBAAgB,CAAC;CAC9E;AAYD,eAAO,MAAM,OAAO,GAAI,KAAK,GAAG,EAAE,UAAU,gBAAgB,aAqB3D,CAAC;AAGF,QAAA,MAAM,MAAM,EAAE,MAAoB,CAAC;AACnC,eAAe,MAAM,CAAC;AAKtB,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAMlE;AAGD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,cAAc,IAAI,cAAc,EAAE,kBAAkB,IAAI,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEvH,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/components/button/index.vue","../src/components/button/index.ts","../src/components/descriptions/item.vue","../src/components/descriptions/index.vue","../src/components/descriptions/index.ts","../src/components/card/index.vue","../src/components/card/index.ts","../src/components/toast/index.vue","../src/components/toast/index.ts","../src/components/message/index.vue","../src/components/message/index.ts","../src/components/icon/index.vue","../src/components/icon/index.ts","../src/index.ts"],"sourcesContent":["<template>\r\n <button\r\n class=\"rc-button\"\r\n :class=\"[`rc-button--${type}`, `rc-button--${size}`, { 'is-plain': plain, 'is-block': block, 'is-disabled': disabled, 'is-loading': loading }]\"\r\n :style=\"{ borderRadius: radius }\"\r\n :disabled=\"disabled || loading\"\r\n @click=\"onClick\"\r\n >\r\n <span v-if=\"loading\" class=\"rc-button__spinner\" />\r\n <slot>{{ label }}</slot>\r\n </button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from 'vue';\r\ntype ButtonType = 'default' | 'primary' | 'success' | 'warning' | 'danger';\r\ntype ButtonSize = 'mini' | 'small' | 'medium' | 'large';\r\n\r\ninterface Props {\r\n type?: ButtonType;\r\n size?: ButtonSize;\r\n plain?: boolean;\r\n block?: boolean;\r\n /** 按钮文本,提供时可不写默认插槽 */\r\n label?: string;\r\n /** 圆角;number 代表 px,string 支持百分比等写法(如 '50%')。也兼容 boolean,true 表示大圆角。 */\r\n round?: number | string | boolean;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n type: 'default',\r\n size: 'medium',\r\n plain: false,\r\n block: false,\r\n label: '',\r\n round: 6,\r\n disabled: false,\r\n loading: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n (e: 'click', ev: MouseEvent): void\r\n}>();\r\n\r\nconst onClick = (ev: MouseEvent) => {\r\n if (!props.disabled && !props.loading) emit('click', ev);\r\n};\r\n\r\nconst radius = computed(() => {\r\n const v = props.round;\r\n if (typeof v === 'boolean') return v ? '999px' : '6px';\r\n if (typeof v === 'number') return `${v}px`;\r\n return String(v);\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.rc-button {\r\n --rc-primary: #1677ff;\r\n --rc-success: #00b578;\r\n --rc-warning: #ff8f1f;\r\n --rc-danger: #ff3141;\r\n --rc-text: #323233;\r\n --rc-border: #dcdee0;\r\n --rc-white: #ffffff;\r\n\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 36px;\r\n padding: 0 16px;\r\n border: 1px solid var(--rc-border);\r\n border-radius: 6px;\r\n background: var(--rc-white);\r\n color: var(--rc-text);\r\n cursor: pointer;\r\n user-select: none;\r\n transition: all .2s ease;\r\n\r\n &.is-disabled { cursor: not-allowed; opacity: .6; }\r\n &.is-block { display: flex; width: 100%; }\r\n &.is-plain { background: var(--rc-white); }\r\n &.is-loading { opacity: .85; }\r\n\r\n &__spinner {\r\n width: 14px;\r\n height: 14px;\r\n margin-right: 6px;\r\n border: 2px solid currentColor;\r\n border-top-color: transparent;\r\n border-radius: 50%;\r\n animation: rc-spin 0.8s linear infinite;\r\n }\r\n\r\n &--primary { background: var(--rc-primary); color: var(--rc-white); border-color: var(--rc-primary); }\r\n &--success { background: var(--rc-success); color: var(--rc-white); border-color: var(--rc-success); }\r\n &--warning { background: var(--rc-warning); color: var(--rc-white); border-color: var(--rc-warning); }\r\n &--danger { background: var(--rc-danger); color: var(--rc-white); border-color: var(--rc-danger); }\r\n\r\n &--mini { height: 24px; padding: 0 8px; font-size: 12px; }\r\n &--small { height: 28px; padding: 0 10px; font-size: 13px; }\r\n &--medium { height: 36px; padding: 0 16px; font-size: 14px; }\r\n &--large { height: 44px; padding: 0 20px; font-size: 16px; }\r\n}\r\n\r\n@keyframes rc-spin { to { transform: rotate(360deg) } }\r\n</style>\r\n\r\n\r\n\r\n","import type { App } from 'vue';\r\nimport Button from './index.vue';\r\n\r\n// 组件名使用全小写,以 <rc-button> 形式在模板中使用\r\n(Button as any).name = 'rc-button';\r\n\r\nexport function install(app: App) {\r\n app.component((Button as any).name, Button);\r\n return app;\r\n}\r\n\r\n\r\nexport default Button;\r\n","<template>\n <div class=\"rc-desc-item\" :style=\"{ width: computedWidth, flex: `0 0 ${computedWidth}` }\">\n <div class=\"rc-desc-item__label\" :style=\"labelStyle\">\n <slot name=\"label\">\n {{ label }}\n </slot>\n </div>\n <div class=\"rc-desc-item__value\">\n <slot>\n {{ value }}\n </slot>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject, Ref } from 'vue';\n\ndefineOptions({ name: 'rc-descriptions-item' });\n\nconst props = withDefaults(defineProps<{\n label?: string | number;\n value?: any;\n labelWidth?: string | number;\n /** 跨越的列数,默认 1,可传字符串数字 */\n span?: number | string;\n}>(), {\n label: '',\n value: '',\n labelWidth: '',\n span: 1,\n});\n\nconst providedWidth = inject<Ref<string>>('rcDescItemWidth', undefined as unknown as Ref<string>);\nconst providedSingleWidth = inject<Ref<string> | string>('rcDescSingleWidth', '' as unknown as Ref<string>);\nconst providedGap = inject<string>('rcDescGap', '0px');\nconst providedGapPx = inject<Ref<number> | number>('rcDescGapPx', 0 as unknown as Ref<number>);\nconst providedColCount = inject<Ref<number> | number>('rcDescColCount', 1 as unknown as Ref<number>);\nconst providedLabelWidth = inject<Ref<string> | string>('rcDescLabelWidth', '' as unknown as Ref<string>);\n\nconst spanNum = computed(() => {\n const n = typeof props.span === 'string' ? parseInt(props.span, 10) : props.span;\n const max = typeof (providedColCount as any)?.value === 'number' ? (providedColCount as any).value : (providedColCount as any);\n const safe = !Number.isNaN(n as number) && (n as number) > 0 ? (n as number) : 1;\n return Math.min(safe, max || 1);\n});\n\nconst computedWidth = computed(() => {\n const n = typeof (providedColCount as any)?.value === 'number' ? (providedColCount as any).value : (providedColCount as any);\n const gapPx = typeof (providedGapPx as any)?.value === 'number' ? (providedGapPx as any).value : (providedGapPx as any);\n const k = spanNum.value;\n if (!n || n <= 1) return '100%';\n if (k >= n) return '100%';\n // 展开为单层 calc:((100% - (n-1)*gap) * k / n + (k-1)*gap)\n const totalGap = (n - 1) * gapPx;\n const interGap = (k - 1) * gapPx;\n return `calc((100% - ${totalGap}px) * ${k} / ${n} + ${interGap}px)`;\n});\n\nconst labelStyle = computed(() => {\n const injected = typeof (providedLabelWidth as any)?.value === 'string'\n ? (providedLabelWidth as any).value\n : (providedLabelWidth as any);\n const w = props.labelWidth !== '' ? props.labelWidth : (injected || '');\n return w ? { width: typeof w === 'number' ? `${w}px` : String(w), flex: '0 0 auto' } : {};\n});\n</script>\n\n<style scoped>\n.rc-desc-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 6px 0;\n flex: 0 0 auto;\n}\n.rc-desc-item__label {\n color: #666;\n font-size: 14px;\n line-height: 22px;\n /* 不强制最小宽度,交由 label-width 控制 */\n min-width: 0;\n}\n.rc-desc-item__value {\n flex: 1 1 auto;\n font-size: 14px;\n line-height: 22px;\n}\n\n</style>\n\n\n","<template>\n <div class=\"rc-descriptions\">\n <div v-if=\"$slots.title || title\" class=\"rc-descriptions__title\">\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n <div class=\"rc-descriptions__body\" :style=\"{ gap: gapStyle }\" ref=\"wrapEl\">\n <template v-if=\"normalizedData.length\">\n <rcDescriptionsItem\n v-for=\"(it, idx) in normalizedData\"\n :key=\"idx\"\n :label=\"it.label\"\n :value=\"it.value\"\n :label-width=\"labelWidth\"\n />\n </template>\n <slot v-else />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, provide, ref, watchEffect } from 'vue';\nimport rcDescriptionsItem from './item.vue';\n\ndefineOptions({ name: 'rc-descriptions' });\n\ntype KeyMap = { key: string; value: string };\n\nconst props = withDefaults(defineProps<{\n title?: string;\n /** 每行展示的列数,支持数字或字符串数字 */\n column?: number | string;\n /** 列间距,支持数字(px)或字符串值,例如 '12px' */\n gap?: number | string;\n /** label 固定宽度,数字代表 px,也可直接传入 '120px' */\n labelWidth?: number | string | '';\n /** 直接通过数据渲染 */\n data?: Array<Record<string, any>>;\n /** data 的字段映射,如 { key: 'label', value: 'value' } */\n keyMap?: KeyMap;\n}>(), {\n column: 2,\n gap: 4,\n labelWidth: '',\n data: () => [],\n});\n\nconst wrapEl = ref<HTMLElement | null>(null);\nconst gapStyle = computed(() => (typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap)));\nconst colCount = computed(() => {\n const n = typeof props.column === 'string' ? Number.parseInt(props.column as string, 10) : (props.column ?? 1);\n return !Number.isNaN(n) && n > 0 ? n : 1;\n});\n\n// compute child item width as percentage string or 'auto'\nconst itemWidth = ref<string>('100%');\nconst singleWidth = ref<string>('100%');\nwatchEffect(() => {\n const n = colCount.value;\n if (n <= 1) {\n itemWidth.value = '100%';\n singleWidth.value = '100%';\n } else {\n // subtract total horizontal gaps from 100%\n const gapPx = typeof props.gap === 'number' ? props.gap : parseFloat(String(props.gap)) || 0;\n const totalGap = (n - 1) * gapPx;\n const base = `calc((100% - ${totalGap}px) / ${n})`;\n singleWidth.value = base;\n itemWidth.value = base;\n }\n});\n\nprovide('rcDescItemWidth', itemWidth);\nprovide('rcDescSingleWidth', singleWidth);\nprovide('rcDescColCount', colCount);\nprovide('rcDescGapPx', computed(() => (typeof props.gap === 'number' ? props.gap : parseFloat(String(props.gap)) || 0)));\nconst labelWidthCss = computed(() => {\n if (props.labelWidth === '' || props.labelWidth === undefined) return '';\n return typeof props.labelWidth === 'number' ? `${props.labelWidth}px` : String(props.labelWidth);\n});\nprovide('rcDescLabelWidth', labelWidthCss);\nprovide('rcDescGap', computed(() => (typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap))));\n\nconst normalizedData = computed(() => {\n const keyK = (props.keyMap?.key ?? 'label') as string;\n const keyV = (props.keyMap?.value ?? 'value') as string;\n if (!props.data?.length) return [];\n return props.data.map((it) => ({\n label: it?.[keyK],\n value: it?.[keyV],\n }));\n});\n\n</script>\n\n<style scoped>\n.rc-descriptions {\n width: 100%;\n}\n.rc-descriptions__title {\n font-weight: 600;\n font-size: 16px;\n margin: 0 0 12px 0;\n}\n.rc-description__row {\n display: contents;\n}\n.rc-descriptions__body {\n display: flex;\n flex-wrap: wrap;\n}\n\n</style>\n\n\n","import type { App } from 'vue';\r\nimport Descriptions from './index.vue';\r\nimport DescriptionsItem from './item.vue';\r\n\r\n(Descriptions as any).name = 'rc-descriptions';\r\n(DescriptionsItem as any).name = 'rc-descriptions-item';\r\n\r\nexport function install(app: App) {\r\n // 同时注册 kebab 与 PascalCase 名称,便于 <rc-descriptions>/<RcDescriptions> 使用\r\n app.component((Descriptions as any).name, Descriptions);\r\n app.component('RcDescriptions', Descriptions);\r\n app.component((DescriptionsItem as any).name, DescriptionsItem);\r\n app.component('RcDescriptionsItem', DescriptionsItem);\r\n return app;\r\n}\r\n\r\nexport const RcDescriptions = Descriptions;\r\nexport const RcDescriptionsItem = DescriptionsItem;\r\n\r\nexport default Descriptions;\r\n\r\n\r\n\r\n","<template>\n <div\n class=\"rc-card\"\n :class=\"[{ 'rc-card--bordered': bordered }]\"\n :style=\"wrapperStyle\"\n >\n <div\n v-if=\"$slots.title || title || $slots.status || status\"\n class=\"rc-card__top\"\n :style=\"{ backgroundColor: topBgColor || 'rgba(29, 133, 252, 0.05)' }\"\n >\n <div class=\"rc-card__title\">\n <slot name=\"title\">\n <span class=\"rc-card__title-text\">{{ title }}</span>\n </slot>\n </div>\n <div class=\"rc-card__status\" v-if=\"$slots.status || status\">\n <slot name=\"status\">\n <span class=\"rc-card__status-text\" :style=\"{ color: statusColor || 'var(--rc-primary)' }\">\n {{ status }}\n </span>\n </slot>\n </div>\n </div>\n\n <div class=\"rc-card__body\" :style=\"{ padding: bodyPadding, gap: bodyGap }\">\n <slot name=\"content\">\n <slot />\n </slot>\n </div>\n\n <div v-if=\"$slots.action\" class=\"rc-card__divider\" />\n\n <div v-if=\"$slots.action\" class=\"rc-card__action\">\n <slot name=\"action\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'rc-card' });\n\ninterface Props {\n /** 卡片整体背景色,默认白色 */\n color?: string;\n /** 顶部色块背景色 */\n topBgColor?: string;\n /** 标题文本(可用 slot=\"title\" 自定义) */\n title?: string;\n /** 右侧状态文案(可用 slot=\"status\" 自定义) */\n status?: string;\n /** 状态文本颜色 */\n statusColor?: string;\n /** 圆角:数值代表 px,字符串可用百分比 */\n round?: number | string;\n /** 是否描边 */\n bordered?: boolean;\n /** 阴影强度:0/1/2/3... -> 转换为不同阴影强度 */\n elevation?: number;\n /** 内边距(CSS 值,如 '16px 12px') */\n padding?: string;\n /** 主体内容的垂直间距(px 或 CSS 字符串) */\n gap?: number | string;\n /** 宽度(px/百分比) */\n width?: string | number;\n /** 高度(px/百分比) */\n height?: string | number;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n color: 'var(--rc-white)',\n topBgColor: 'rgba(29, 133, 252, 0.05)',\n title: '',\n status: '',\n statusColor: 'var(--rc-primary)',\n round: 8,\n bordered: false,\n elevation: 2,\n padding: '16px',\n gap: 12,\n width: '100%',\n height: '',\n});\n\nconst wrapperStyle = computed(() => {\n const radius =\n typeof props.round === 'boolean'\n ? props.round\n ? '12px'\n : '0'\n : typeof props.round === 'number'\n ? `${props.round}px`\n : String(props.round);\n\n return {\n backgroundColor: props.color || 'var(--rc-white)',\n borderRadius: radius,\n boxShadow: shadowByLevel(props.elevation),\n width: toCssSize(props.width),\n height: toCssSize(props.height),\n } as Record<string, string>;\n});\n\nconst bodyPadding = computed(() => props.padding || '16px');\nconst bodyGap = computed(() =>\n typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap)\n);\n\nfunction toCssSize(v?: string | number) {\n if (v === undefined || v === null || v === '') return '';\n return typeof v === 'number' ? `${v}px` : String(v);\n}\n\nfunction shadowByLevel(level: number) {\n if (!level || level <= 0) return 'none';\n // 简单的多层阴影(可按需微调)\n const base = 4 * level;\n return `0 ${Math.round(base / 2)}px ${base}px rgba(0,0,0,0.06), 0 ${Math.round(\n base / 4\n )}px ${Math.round(base / 2)}px rgba(0,0,0,0.04)`;\n}\n</script>\n\n<style scoped>\n.rc-card {\n --rc-white: #ffffff;\n --rc-border: #e5e6eb;\n --rc-primary: #1677ff;\n\n display: flex;\n flex-direction: column;\n width: 100%;\n border: 1px solid transparent;\n background: var(.rc-white);\n}\n.rc-card--bordered {\n border-color: var(--rc-border);\n}\n\n.rc-card__top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n.rc-card__title {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.rc-card__title-text {\n font-weight: 600;\n font-size: 16px;\n color: #1d2129;\n}\n.rc-card__status-text {\n font-size: 14px;\n}\n.rc-card__body {\n display: flex;\n flex-direction: column;\n}\n.rc-card__divider {\n height: 1px;\n background: var(--rc-border);\n}\n.rc-card__action {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n}\n</style>\n\n\n","import type { App } from 'vue';\r\nimport Card from './index.vue';\r\n\r\n// 同时注册小写与驼峰,便于 <rc-card> / <RcCard> 两种写法\r\n(Card as any).name = 'rc-card';\r\nconst PascalName = 'RcCard';\r\n\r\nexport function install(app: App) {\r\n app.component((Card as any).name, Card);\r\n app.component(PascalName, Card);\r\n return app;\r\n}\r\n\r\nexport default Card;\r\n\r\n\r\n","<template>\r\n <teleport to=\"body\">\r\n <transition name=\"rc-toast-fade\" @after-leave=\"onAfterLeave\">\r\n <div v-if=\"visible\" class=\"rc-toast\" :class=\"[`rc-toast--${type}`]\">\r\n <div v-if=\"mask\" class=\"rc-toast__mask\" />\r\n <div class=\"rc-toast__content\">\r\n <div v-if=\"type === 'loading'\" class=\"rc-toast__spinner\" />\r\n <div v-else-if=\"type === 'success'\" class=\"rc-toast__icon rc-toast__icon--success\" />\r\n <div v-else-if=\"type === 'fail'\" class=\"rc-toast__icon rc-toast__icon--fail\" />\r\n <div class=\"rc-toast__text\">{{ message }}</div>\r\n </div>\r\n </div>\r\n </transition>\r\n </teleport>\r\n <slot />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch, defineExpose } from 'vue';\r\n\r\nexport type ToastType = 'text' | 'success' | 'fail' | 'loading';\r\nexport interface ToastProps {\r\n message?: string;\r\n type?: ToastType;\r\n duration?: number;\r\n mask?: boolean;\r\n /** 服务端关闭回调,用于卸载容器 */\r\n onAfterLeave?: () => void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<ToastProps>(), {\r\n message: '',\r\n type: 'text',\r\n duration: 2000,\r\n mask: false,\r\n});\r\n\r\nconst visible = ref(true);\r\nlet timer: any;\r\n\r\nfunction clearTimer() {\r\n if (timer) {\r\n clearTimeout(timer);\r\n timer = null;\r\n }\r\n}\r\n\r\nfunction close() {\r\n clearTimer();\r\n visible.value = false;\r\n}\r\n\r\ndefineExpose({ close });\r\n\r\nonMounted(() => {\r\n if (props.duration && props.duration > 0) {\r\n timer = setTimeout(() => {\r\n close();\r\n }, props.duration);\r\n }\r\n});\r\n\r\nonUnmounted(() => {\r\n clearTimer();\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.rc-toast {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 9999;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n.rc-toast__mask {\r\n position: absolute;\r\n inset: 0;\r\n background: rgba(0, 0, 0, 0.35);\r\n pointer-events: auto;\r\n backdrop-filter: blur(1px);\r\n}\r\n.rc-toast__content {\r\n position: relative;\r\n max-width: 80%;\r\n background: rgba(0, 0, 0, 0.75);\r\n color: #fff;\r\n border-radius: 12px;\r\n padding: 12px 14px;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 8px;\r\n box-shadow: 0 6px 16px rgba(0,0,0,0.2);\r\n}\r\n.rc-toast__text {\r\n font-size: 14px;\r\n line-height: 1.4;\r\n}\r\n.rc-toast__spinner {\r\n width: 18px;\r\n height: 18px;\r\n border: 2px solid rgba(255,255,255,0.35);\r\n border-top-color: #fff;\r\n border-radius: 50%;\r\n animation: rc-toast-spin 0.8s linear infinite;\r\n}\r\n.rc-toast__icon {\r\n width: 18px;\r\n height: 18px;\r\n border-radius: 50%;\r\n position: relative;\r\n flex: 0 0 18px;\r\n}\r\n.rc-toast__icon--success::before {\r\n content: '';\r\n position: absolute;\r\n left: 3px;\r\n top: 3px;\r\n width: 10px;\r\n height: 10px;\r\n border-right: 2px solid #fff;\r\n border-bottom: 2px solid #fff;\r\n transform: rotate(45deg);\r\n}\r\n.rc-toast__icon--fail::before,\r\n.rc-toast__icon--fail::after {\r\n content: '';\r\n position: absolute;\r\n left: 3px;\r\n right: 3px;\r\n top: 8px;\r\n height: 2px;\r\n background: #fff;\r\n}\r\n.rc-toast__icon--fail::before {\r\n transform: rotate(45deg);\r\n}\r\n.rc-toast__icon--fail::after {\r\n transform: rotate(-45deg);\r\n}\r\n\r\n.rc-toast-fade-enter-active,\r\n.rc-toast-fade-leave-active {\r\n transition: opacity .2s ease;\r\n}\r\n.rc-toast-fade-enter-from,\r\n.rc-toast-fade-leave-to {\r\n opacity: 0;\r\n}\r\n@keyframes rc-toast-spin {\r\n to { transform: rotate(360deg); }\r\n}\r\n</style>\r\n\r\n\r\n","import { App, createApp } from 'vue';\r\nimport Toast, { type ToastProps } from './index.vue';\r\n\r\nexport type { ToastProps };\r\nexport interface ShowToastOptions {\r\n message?: string;\r\n type?: 'text' | 'success' | 'fail' | 'loading';\r\n duration?: number;\r\n mask?: boolean;\r\n /** 关闭时回调(仅服务方式有效) */\r\n onClose?: () => void;\r\n}\r\n\r\nlet app: App<Element> | null = null;\r\nlet host: HTMLDivElement | null = null;\r\n\r\nfunction unmount() {\r\n if (app) {\r\n app.unmount();\r\n app = null;\r\n }\r\n if (host) {\r\n document.body.removeChild(host);\r\n host = null;\r\n }\r\n}\r\n\r\nexport function showToast(options: string | ShowToastOptions) {\r\n const opt: ShowToastOptions =\r\n typeof options === 'string' ? { message: options } : (options || {});\r\n unmount();\r\n host = document.createElement('div');\r\n document.body.appendChild(host);\r\n const toastProps: ToastProps = {\r\n message: opt.message,\r\n type: (opt as any).type ?? 'text',\r\n duration: (opt as any).duration ?? 2000,\r\n mask: (opt as any).mask ?? false,\r\n onAfterLeave: () => {\r\n unmount();\r\n opt.onClose?.();\r\n },\r\n };\r\n app = createApp(Toast, toastProps as any);\r\n app.mount(host);\r\n return {\r\n close: hideToast,\r\n };\r\n}\r\n\r\nexport function hideToast() {\r\n if (!app) return;\r\n // 调用暴露的 close 方法\r\n // @ts-ignore\r\n app._instance?.exposed?.close?.();\r\n}\r\n\r\n// 组件注册(可选,提供 rc-toast 用于手动放置 Portal)\r\n(Toast as any).name = 'rc-toast';\r\nexport function install(app: App) {\r\n app.component((Toast as any).name, Toast);\r\n return app;\r\n}\r\n\r\nexport default Toast;\r\n\r\n\r\n","<template>\r\n <div class=\"rc-message\" role=\"alert\" aria-live=\"polite\">\r\n <transition-group name=\"rc-message-fade\" tag=\"div\">\r\n <div\r\n v-for=\"m in messages\"\r\n :key=\"m.id\"\r\n class=\"rc-message__item\"\r\n :class=\"`rc-message--${m.type}`\"\r\n >\r\n <span class=\"rc-message__content\">{{ m.content }}</span>\r\n </div>\r\n </transition-group>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { reactive } from 'vue';\r\n\r\nexport type MessageType = 'info' | 'success' | 'warning' | 'error' | 'loading';\r\nexport interface MessageItem {\r\n id: number;\r\n type: MessageType;\r\n content: string;\r\n duration: number; // ms; 0 = persistent (except loading default)\r\n}\r\n\r\nconst messages = reactive<MessageItem[]>([]);\r\nlet uid = 1;\r\n\r\nfunction remove(id: number) {\r\n const idx = messages.findIndex((x) => x.id === id);\r\n if (idx >= 0) messages.splice(idx, 1);\r\n}\r\n\r\nfunction add(type: MessageType, content: string, duration: number) {\r\n const id = uid++;\r\n messages.push({ id, type, content, duration });\r\n if (duration > 0) {\r\n window.setTimeout(() => remove(id), duration);\r\n }\r\n return id;\r\n}\r\n\r\ndefineExpose({ add, remove });\r\n</script>\r\n\r\n<style scoped>\r\n.rc-message {\r\n position: fixed;\r\n top: 16px;\r\n left: 0;\r\n right: 0;\r\n z-index: 10000;\r\n pointer-events: none;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n.rc-message__item {\r\n pointer-events: auto;\r\n min-width: 120px;\r\n max-width: 80%;\r\n padding: 8px 12px;\r\n border-radius: 6px;\r\n color: #fff;\r\n background: rgba(0, 0, 0, 0.78);\r\n box-shadow: 0 6px 16px rgba(0,0,0,0.2);\r\n font-size: 14px;\r\n}\r\n.rc-message--success { background: rgba(22,119,255,0.9); }\r\n.rc-message--warning { background: rgba(250,173,20,0.95); }\r\n.rc-message--error { background: rgba(245,63,63,0.95); }\r\n.rc-message--info { background: rgba(0,0,0,0.78); }\r\n.rc-message--loading { background: rgba(0,0,0,0.78); }\r\n\r\n.rc-message-fade-enter-active,\r\n.rc-message-fade-leave-active {\r\n transition: all .2s ease;\r\n}\r\n.rc-message-fade-enter-from,\r\n.rc-message-fade-leave-to {\r\n opacity: 0;\r\n transform: translateY(-6px);\r\n}\r\n</style>\r\n\r\n\r\n","import { createVNode, render, type App } from 'vue';\r\nimport MessageHost from './index.vue';\r\n\r\ntype MessageType = 'info' | 'success' | 'warning' | 'error' | 'loading';\r\n\r\nexport interface MessageOptions {\r\n content: string;\r\n duration?: number; // ms; default 2000, loading 默认 0\r\n type?: MessageType;\r\n}\r\n\r\nlet container: HTMLElement | null = null;\r\nlet hostExposed: any = null;\r\n\r\nfunction ensureHost() {\r\n if (container && hostExposed) return;\r\n container = document.createElement('div');\r\n document.body.appendChild(container);\r\n const vnode = createVNode(MessageHost, {});\r\n render(vnode, container);\r\n hostExposed = (vnode.component as any)?.exposed;\r\n}\r\n\r\nfunction open(type: MessageType, content: string, duration?: number) {\r\n ensureHost();\r\n const d = typeof duration === 'number'\r\n ? duration\r\n : (type === 'loading' ? 0 : 2000);\r\n return hostExposed?.add?.(type, content, d);\r\n}\r\n\r\nexport const message = {\r\n open(opts: MessageOptions) {\r\n return open(opts.type || 'info', opts.content, opts.duration);\r\n },\r\n info(content: string, duration?: number) {\r\n return open('info', content, duration);\r\n },\r\n success(content: string, duration?: number) {\r\n return open('success', content, duration);\r\n },\r\n warning(content: string, duration?: number) {\r\n return open('warning', content, duration);\r\n },\r\n error(content: string, duration?: number) {\r\n return open('error', content, duration);\r\n },\r\n loading(content: string, duration?: number) {\r\n return open('loading', content, duration);\r\n },\r\n destroy() {\r\n if (container) {\r\n render(null, container);\r\n container.remove();\r\n container = null;\r\n hostExposed = null;\r\n }\r\n },\r\n};\r\n\r\nexport default message;\r\n\r\n// 可选:提供 install,注入到 app.config.globalProperties 以便 this.$message 使用\r\nexport function install(app: App) {\r\n (app.config.globalProperties as any).$message = message;\r\n return app;\r\n}\r\n\r\n\r\n","<template>\r\n <i\r\n class=\"rc-icon\"\r\n :class=\"[baseClass, iconClassName, { 'rc-icon--spin': spin }]\"\r\n :style=\"iconStyle\"\r\n aria-hidden=\"true\"\r\n >\r\n <span v-if=\"char\" class=\"rc-icon__unicode\">{{ char }}</span>\r\n </i>\r\n </template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, inject, onMounted } from 'vue';\r\nimport type { RecycleUIOptions } from '../../types';\r\nimport { RECYCLE_UI_SYMBOL, defaultRecycleUIConfig } from '../../index';\r\n\r\ndefineOptions({ name: 'rc-icon' });\r\n\r\nconst props = withDefaults(defineProps<{\r\n /** 图标名,例如 'icon_a_in_store',也可直接传完整类名 */\r\n name: string;\r\n /** 尺寸,数字按 px 处理,也可传 '1.2em' 等 */\r\n size?: number | string;\r\n /** 颜色 */\r\n color?: string;\r\n /** 是否旋转(用于 loading 类图标) */\r\n spin?: boolean;\r\n /** Unicode 码点(不带 \\\\u,十六进制,如 'e609' 或 0xe609),用于无类名时渲染 */\r\n code?: string | number;\r\n}>(), {\r\n size: 16,\r\n color: '',\r\n spin: false,\r\n code: '',\r\n});\r\n\r\nconst cfg = inject<RecycleUIOptions>(RECYCLE_UI_SYMBOL, {} as RecycleUIOptions);\r\n\r\nconst baseClass = computed(() => cfg?.iconClass || 'iconfont');\r\nconst iconClassName = computed(() => props.name || '');\r\n\r\nconst sizeCss = computed(() => (typeof props.size === 'number' ? `${props.size}px` : (props.size || '16px')));\r\nconst iconStyle = computed(() => ({\r\n fontSize: sizeCss.value,\r\n color: props.color || undefined,\r\n lineHeight: 1,\r\n fontFamily: cfg?.iconClass || 'iconfont',\r\n}));\r\n\r\n// 将 code 转为字符\r\nconst char = computed(() => {\r\n const c = props.code as any;\r\n if (c === undefined || c === null || c === '' || c === 0) return '';\r\n if (typeof c === 'number') {\r\n return String.fromCharCode(c);\r\n }\r\n const hex = String(c).replace(/^0x/i, '');\r\n const num = parseInt(hex, 16);\r\n if (Number.isNaN(num)) return '';\r\n return String.fromCharCode(num);\r\n});\r\n\r\n// 兜底:若未通过 app.use 安装插件,则在组件挂载时尝试注入默认的 iconfont 样式\r\nonMounted(() => {\r\n if (typeof window === 'undefined') return;\r\n const url = (cfg && cfg.iconCssUrl) || defaultRecycleUIConfig.iconCssUrl;\r\n if (!url) return;\r\n const selector = `link[rel=\"stylesheet\"][data-rcui-icon=\"true\"][href=\"${url}\"]`;\r\n const exists = document.head.querySelector(selector);\r\n if (!exists) {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = url as string;\r\n link.setAttribute('data-rcui-icon', 'true');\r\n document.head.appendChild(link);\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.rc-icon {\r\n display: inline-block;\r\n vertical-align: -0.125em;\r\n}\r\n.rc-icon__unicode {\r\n /* 让 Unicode 文本走同一字体,确保显示 */\r\n font-family: inherit;\r\n line-height: 1;\r\n}\r\n.rc-icon--spin {\r\n animation: rc-icon-rot 1s linear infinite;\r\n}\r\n@keyframes rc-icon-rot {\r\n to { transform: rotate(360deg); }\r\n}\r\n</style>\r\n\r\n\r\n","import type { App } from 'vue';\r\nimport Icon from './index.vue';\r\n\r\n(Icon as any).name = 'rc-icon';\r\n\r\nexport function install(app: App) {\r\n app.component((Icon as any).name, Icon);\r\n app.component('RcIcon', Icon);\r\n return app;\r\n}\r\n\r\nexport const RcIcon = Icon;\r\nexport default Icon;\r\n\r\n\r\n","// library entry\r\nimport type { App, Plugin } from 'vue';\r\nimport { install as installButton } from './components/button';\r\nimport { install as installDescriptions } from './components/descriptions';\r\nimport { install as installCard } from './components/card';\r\nimport { install as installToast } from './components/toast';\r\nimport { install as installMessage } from './components/message';\r\nimport { install as installIcon } from './components/icon/index';\r\nimport type { RecycleUIOptions } from './types';\r\n\r\nexport const RECYCLE_UI_SYMBOL = Symbol('RECYCLE_UI_CONFIG');\r\n\r\nexport const defaultRecycleUIConfig: RecycleUIOptions = {\r\n prefix: 'rc',\r\n autoRegister: true,\r\n provideKey: RECYCLE_UI_SYMBOL,\r\n // 预留主题/其他全局配置\r\n theme: {},\r\n // IconFont 默认配置(可在 app.use 时覆盖)\r\n iconCssUrl: '//at.alicdn.com/t/c/font_4252799_9vcnw0pnmkh.css',\r\n iconClass: 'iconfont',\r\n};\r\n\r\n// 统一导出所有类型的命名空间\r\nexport namespace RecycleUi {\r\n // 核心配置类型\r\n export type Options = RecycleUIOptions;\r\n export type DefaultConfig = typeof defaultRecycleUIConfig;\r\n \r\n // Message 相关类型\r\n export type MessageOptions = import('./components/message').MessageOptions;\r\n export type MessageType = import('./components/message/index.vue').MessageType;\r\n export type MessageItem = import('./components/message/index.vue').MessageItem;\r\n \r\n // Toast 相关类型\r\n export type ToastProps = import('./components/toast/index.vue').ToastProps;\r\n export type ToastType = import('./components/toast/index.vue').ToastType;\r\n export type ShowToastOptions = import('./components/toast').ShowToastOptions;\r\n}\r\n\r\nfunction doAutoRegister(app: App, opts: RecycleUIOptions) {\r\n if (opts.autoRegister === false) return;\r\n if (typeof installButton === 'function') installButton(app);\r\n if (typeof installDescriptions === 'function') installDescriptions(app);\r\n if (typeof installCard === 'function') installCard(app);\r\n if (typeof installToast === 'function') installToast(app);\r\n if (typeof installIcon === 'function') installIcon(app);\r\n if (typeof installMessage === 'function') installMessage(app);\r\n}\r\n\r\nexport const install = (app: App, options?: RecycleUIOptions) => {\r\n const cfg: RecycleUIOptions = { ...defaultRecycleUIConfig, ...(options || {}) };\r\n // 提供全局配置\r\n app.provide(cfg.provideKey ?? RECYCLE_UI_SYMBOL, cfg);\r\n // 供模板/实例访问:this.$recycleUI\r\n (app.config.globalProperties as any).$recycleUI = cfg;\r\n // 注入 IconFont 样式链接(浏览器环境)\r\n if (typeof window !== 'undefined' && cfg.iconCssUrl) {\r\n const selector = `link[rel=\"stylesheet\"][data-rcui-icon=\"true\"][href=\"${cfg.iconCssUrl}\"]`;\r\n const exists = document.head.querySelector(selector);\r\n if (!exists) {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = cfg.iconCssUrl;\r\n link.setAttribute('data-rcui-icon', 'true');\r\n document.head.appendChild(link);\r\n }\r\n }\r\n // 自动注册内置组件(可通过 autoRegister 关闭)\r\n doAutoRegister(app, cfg);\r\n return app;\r\n};\r\n\r\n// 默认导出为插件,支持 app.use(recycleUi, options)\r\nconst plugin: Plugin = { install };\r\nexport default plugin;\r\n\r\n// 也导出命名组件安装器与默认配置(defaultRecycleUIConfig 已在上方以常量形式导出)\r\n\r\n// 可选:工厂方法,便于创建带预设配置的插件\r\nexport function createRecycleUI(options?: RecycleUIOptions): Plugin {\r\n return {\r\n install(app: App) {\r\n install(app, options);\r\n },\r\n };\r\n}\r\n\r\n// 按需导出组件与其安装器(供文档与业务直接使用)\r\nexport { default as RcButton } from './components/button';\r\nexport { RcDescriptions, RcDescriptionsItem } from './components/descriptions';\r\nexport { install as installButton } from './components/button';\r\nexport { install as installDescriptions } from './components/descriptions';\r\nexport { default as RcCard } from './components/card';\r\nexport { install as installCard } from './components/card';\r\n// 兼容别名导出(文档示例中的 rcXxx)\r\nexport { RcDescriptions as rcDescriptions, RcDescriptionsItem as rcDescriptionsItem } from './components/descriptions';\r\n// Toast 服务导出\r\nexport { default as RcToast, showToast, hideToast } from './components/toast';\r\n// Icon 组件导出\r\nexport { default as RcIcon } from './components/icon/index';\r\nexport { install as installIcon } from './components/icon/index';\r\n// Message 服务(对标 antd 的 message)\r\nexport { default as message } from './components/message';\r\nexport { install as installMessage } from './components/message';\r\n"],"names":["props","__props","emit","__emit","onClick","ev","radius","computed","v","_createElementBlock","_normalizeClass","_openBlock","_hoisted_2","_renderSlot","_ctx","Button","install","app","inject","providedGapPx","providedColCount","providedLabelWidth","spanNum","n","max","safe","computedWidth","gapPx","k","totalGap","interGap","labelStyle","injected","w","_normalizeStyle","_createElementVNode","_hoisted_1","wrapEl","ref","gapStyle","colCount","itemWidth","singleWidth","watchEffect","base","provide","labelWidthCss","normalizedData","keyK","_a","keyV","_b","_c","it","$slots","_Fragment","_renderList","idx","_createBlock","rcDescriptionsItem","Descriptions","DescriptionsItem","RcDescriptions","RcDescriptionsItem","wrapperStyle","shadowByLevel","toCssSize","bodyPadding","bodyGap","level","_toDisplayString","_hoisted_3","_hoisted_4","_hoisted_5","Card","PascalName","visible","timer","clearTimer","close","__expose","onMounted","onUnmounted","_Teleport","_createVNode","_Transition","_hoisted_6","host","unmount","showToast","options","opt","toastProps","createApp","Toast","hideToast","messages","reactive","uid","remove","id","x","add","type","content","duration","_TransitionGroup","m","container","hostExposed","ensureHost","vnode","createVNode","MessageHost","render","open","d","message","opts","cfg","RECYCLE_UI_SYMBOL","baseClass","iconClassName","sizeCss","iconStyle","char","c","hex","num","url","defaultRecycleUIConfig","selector","link","Icon","doAutoRegister","installButton","installDescriptions","installCard","installToast","installIcon","installMessage","plugin","createRecycleUI"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/components/button/index.vue","../src/components/button/index.ts","../src/components/descriptions/item.vue","../src/components/descriptions/index.vue","../src/components/descriptions/index.ts","../src/components/card/index.vue","../src/components/card/index.ts","../src/components/toast/index.vue","../src/components/toast/index.ts","../src/components/message/index.vue","../src/components/message/index.ts","../src/components/icon/index.vue","../src/components/icon/index.ts","../src/index.ts"],"sourcesContent":["<template>\r\n <button\r\n class=\"rc-button\"\r\n :class=\"[`rc-button--${type}`, `rc-button--${size}`, { 'is-plain': plain, 'is-block': block, 'is-disabled': disabled, 'is-loading': loading }]\"\r\n :style=\"{ borderRadius: radius }\"\r\n :disabled=\"disabled || loading\"\r\n @click=\"onClick\"\r\n >\r\n <span v-if=\"loading\" class=\"rc-button__spinner\" />\r\n <slot>{{ label }}</slot>\r\n </button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from 'vue';\r\ntype ButtonType = 'default' | 'primary' | 'success' | 'warning' | 'danger';\r\ntype ButtonSize = 'mini' | 'small' | 'medium' | 'large';\r\n\r\ninterface Props {\r\n type?: ButtonType;\r\n size?: ButtonSize;\r\n plain?: boolean;\r\n block?: boolean;\r\n /** 按钮文本,提供时可不写默认插槽 */\r\n label?: string;\r\n /** 圆角;number 代表 px,string 支持百分比等写法(如 '50%')。也兼容 boolean,true 表示大圆角。 */\r\n round?: number | string | boolean;\r\n disabled?: boolean;\r\n loading?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n type: 'default',\r\n size: 'medium',\r\n plain: false,\r\n block: false,\r\n label: '',\r\n round: 6,\r\n disabled: false,\r\n loading: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n (e: 'click', ev: MouseEvent): void\r\n}>();\r\n\r\nconst onClick = (ev: MouseEvent) => {\r\n if (!props.disabled && !props.loading) emit('click', ev);\r\n};\r\n\r\nconst radius = computed(() => {\r\n const v = props.round;\r\n if (typeof v === 'boolean') return v ? '999px' : '6px';\r\n if (typeof v === 'number') return `${v}px`;\r\n return String(v);\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.rc-button {\r\n --rc-primary: #1677ff;\r\n --rc-success: #00b578;\r\n --rc-warning: #ff8f1f;\r\n --rc-danger: #ff3141;\r\n --rc-text: #323233;\r\n --rc-border: #dcdee0;\r\n --rc-white: #ffffff;\r\n\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: 36px;\r\n padding: 0 16px;\r\n border: 1px solid var(--rc-border);\r\n border-radius: 6px;\r\n background: var(--rc-white);\r\n color: var(--rc-text);\r\n cursor: pointer;\r\n user-select: none;\r\n transition: all .2s ease;\r\n\r\n &.is-disabled { cursor: not-allowed; opacity: .6; }\r\n &.is-block { display: flex; width: 100%; }\r\n &.is-plain { background: var(--rc-white); }\r\n &.is-loading { opacity: .85; }\r\n\r\n &__spinner {\r\n width: 14px;\r\n height: 14px;\r\n margin-right: 6px;\r\n border: 2px solid currentColor;\r\n border-top-color: transparent;\r\n border-radius: 50%;\r\n animation: rc-spin 0.8s linear infinite;\r\n }\r\n\r\n &--primary { background: var(--rc-primary); color: var(--rc-white); border-color: var(--rc-primary); }\r\n &--success { background: var(--rc-success); color: var(--rc-white); border-color: var(--rc-success); }\r\n &--warning { background: var(--rc-warning); color: var(--rc-white); border-color: var(--rc-warning); }\r\n &--danger { background: var(--rc-danger); color: var(--rc-white); border-color: var(--rc-danger); }\r\n\r\n &--mini { height: 24px; padding: 0 8px; font-size: 12px; }\r\n &--small { height: 28px; padding: 0 10px; font-size: 13px; }\r\n &--medium { height: 36px; padding: 0 16px; font-size: 14px; }\r\n &--large { height: 44px; padding: 0 20px; font-size: 16px; }\r\n}\r\n\r\n@keyframes rc-spin { to { transform: rotate(360deg) } }\r\n</style>\r\n\r\n\r\n\r\n","import type { App } from 'vue';\r\nimport Button from './index.vue';\r\n\r\n// 组件名使用全小写,以 <rc-button> 形式在模板中使用\r\n(Button as any).name = 'rc-button';\r\n\r\nexport function install(app: App) {\r\n app.component((Button as any).name, Button);\r\n return app;\r\n}\r\n\r\n\r\nexport default Button;\r\n","<template>\n <div class=\"rc-desc-item\" :style=\"{ width: computedWidth, flex: `0 0 ${computedWidth}` }\">\n <div class=\"rc-desc-item__label\" :style=\"labelStyle\">\n <slot name=\"label\">\n {{ label }}\n </slot>\n </div>\n <div class=\"rc-desc-item__value\">\n <slot>\n {{ value }}\n </slot>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, inject, Ref } from 'vue';\n\ndefineOptions({ name: 'rc-descriptions-item' });\n\nconst props = withDefaults(defineProps<{\n label?: string | number;\n value?: any;\n labelWidth?: string | number;\n /** 跨越的列数,默认 1,可传字符串数字 */\n span?: number | string;\n}>(), {\n label: '',\n value: '',\n labelWidth: '',\n span: 1,\n});\n\nconst providedWidth = inject<Ref<string>>('rcDescItemWidth', undefined as unknown as Ref<string>);\nconst providedSingleWidth = inject<Ref<string> | string>('rcDescSingleWidth', '' as unknown as Ref<string>);\nconst providedGap = inject<string>('rcDescGap', '0px');\nconst providedGapPx = inject<Ref<number> | number>('rcDescGapPx', 0 as unknown as Ref<number>);\nconst providedColCount = inject<Ref<number> | number>('rcDescColCount', 1 as unknown as Ref<number>);\nconst providedLabelWidth = inject<Ref<string> | string>('rcDescLabelWidth', '' as unknown as Ref<string>);\n\nconst spanNum = computed(() => {\n const n = typeof props.span === 'string' ? parseInt(props.span, 10) : props.span;\n const max = typeof (providedColCount as any)?.value === 'number' ? (providedColCount as any).value : (providedColCount as any);\n const safe = !Number.isNaN(n as number) && (n as number) > 0 ? (n as number) : 1;\n return Math.min(safe, max || 1);\n});\n\nconst computedWidth = computed(() => {\n const n = typeof (providedColCount as any)?.value === 'number' ? (providedColCount as any).value : (providedColCount as any);\n const gapPx = typeof (providedGapPx as any)?.value === 'number' ? (providedGapPx as any).value : (providedGapPx as any);\n const k = spanNum.value;\n if (!n || n <= 1) return '100%';\n if (k >= n) return '100%';\n // 展开为单层 calc:((100% - (n-1)*gap) * k / n + (k-1)*gap)\n const totalGap = (n - 1) * gapPx;\n const interGap = (k - 1) * gapPx;\n return `calc((100% - ${totalGap}px) * ${k} / ${n} + ${interGap}px)`;\n});\n\nconst labelStyle = computed(() => {\n const injected = typeof (providedLabelWidth as any)?.value === 'string'\n ? (providedLabelWidth as any).value\n : (providedLabelWidth as any);\n const w = props.labelWidth !== '' ? props.labelWidth : (injected || '');\n return w ? { width: typeof w === 'number' ? `${w}px` : String(w), flex: '0 0 auto' } : {};\n});\n</script>\n\n<style scoped>\n.rc-desc-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 6px 0;\n flex: 0 0 auto;\n}\n.rc-desc-item__label {\n color: #666;\n font-size: 14px;\n line-height: 22px;\n /* 不强制最小宽度,交由 label-width 控制 */\n min-width: 0;\n}\n.rc-desc-item__value {\n flex: 1 1 auto;\n font-size: 14px;\n line-height: 22px;\n}\n\n</style>\n\n\n","<template>\n <div class=\"rc-descriptions\">\n <div v-if=\"$slots.title || title\" class=\"rc-descriptions__title\">\n <slot name=\"title\">\n {{ title }}\n </slot>\n </div>\n <div class=\"rc-descriptions__body\" :style=\"{ gap: gapStyle }\" ref=\"wrapEl\">\n <template v-if=\"normalizedData.length\">\n <rcDescriptionsItem\n v-for=\"(it, idx) in normalizedData\"\n :key=\"idx\"\n :label=\"it.label\"\n :value=\"it.value\"\n :label-width=\"labelWidth\"\n />\n </template>\n <slot v-else />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, provide, ref, watchEffect } from 'vue';\nimport rcDescriptionsItem from './item.vue';\n\ndefineOptions({ name: 'rc-descriptions' });\n\ntype KeyMap = { key: string; value: string };\n\nconst props = withDefaults(defineProps<{\n title?: string;\n /** 每行展示的列数,支持数字或字符串数字 */\n column?: number | string;\n /** 列间距,支持数字(px)或字符串值,例如 '12px' */\n gap?: number | string;\n /** label 固定宽度,数字代表 px,也可直接传入 '120px' */\n labelWidth?: number | string | '';\n /** 直接通过数据渲染 */\n data?: Array<Record<string, any>>;\n /** data 的字段映射,如 { key: 'label', value: 'value' } */\n keyMap?: KeyMap;\n}>(), {\n column: 2,\n gap: 4,\n labelWidth: '',\n data: () => [],\n});\n\nconst wrapEl = ref<HTMLElement | null>(null);\nconst gapStyle = computed(() => (typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap)));\nconst colCount = computed(() => {\n const n = typeof props.column === 'string' ? Number.parseInt(props.column as string, 10) : (props.column ?? 1);\n return !Number.isNaN(n) && n > 0 ? n : 1;\n});\n\n// compute child item width as percentage string or 'auto'\nconst itemWidth = ref<string>('100%');\nconst singleWidth = ref<string>('100%');\nwatchEffect(() => {\n const n = colCount.value;\n if (n <= 1) {\n itemWidth.value = '100%';\n singleWidth.value = '100%';\n } else {\n // subtract total horizontal gaps from 100%\n const gapPx = typeof props.gap === 'number' ? props.gap : parseFloat(String(props.gap)) || 0;\n const totalGap = (n - 1) * gapPx;\n const base = `calc((100% - ${totalGap}px) / ${n})`;\n singleWidth.value = base;\n itemWidth.value = base;\n }\n});\n\nprovide('rcDescItemWidth', itemWidth);\nprovide('rcDescSingleWidth', singleWidth);\nprovide('rcDescColCount', colCount);\nprovide('rcDescGapPx', computed(() => (typeof props.gap === 'number' ? props.gap : parseFloat(String(props.gap)) || 0)));\nconst labelWidthCss = computed(() => {\n if (props.labelWidth === '' || props.labelWidth === undefined) return '';\n return typeof props.labelWidth === 'number' ? `${props.labelWidth}px` : String(props.labelWidth);\n});\nprovide('rcDescLabelWidth', labelWidthCss);\nprovide('rcDescGap', computed(() => (typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap))));\n\nconst normalizedData = computed(() => {\n const keyK = (props.keyMap?.key ?? 'label') as string;\n const keyV = (props.keyMap?.value ?? 'value') as string;\n if (!props.data?.length) return [];\n return props.data.map((it) => ({\n label: it?.[keyK],\n value: it?.[keyV],\n }));\n});\n\n</script>\n\n<style scoped>\n.rc-descriptions {\n width: 100%;\n}\n.rc-descriptions__title {\n font-weight: 600;\n font-size: 16px;\n margin: 0 0 12px 0;\n}\n.rc-description__row {\n display: contents;\n}\n.rc-descriptions__body {\n display: flex;\n flex-wrap: wrap;\n}\n\n</style>\n\n\n","import type { App } from 'vue';\r\nimport Descriptions from './index.vue';\r\nimport DescriptionsItem from './item.vue';\r\n\r\n(Descriptions as any).name = 'rc-descriptions';\r\n(DescriptionsItem as any).name = 'rc-descriptions-item';\r\n\r\nexport function install(app: App) {\r\n // 同时注册 kebab 与 PascalCase 名称,便于 <rc-descriptions>/<RcDescriptions> 使用\r\n app.component((Descriptions as any).name, Descriptions);\r\n app.component('RcDescriptions', Descriptions);\r\n app.component((DescriptionsItem as any).name, DescriptionsItem);\r\n app.component('RcDescriptionsItem', DescriptionsItem);\r\n return app;\r\n}\r\n\r\nexport const RcDescriptions = Descriptions;\r\nexport const RcDescriptionsItem = DescriptionsItem;\r\n\r\nexport default Descriptions;\r\n\r\n\r\n\r\n","<template>\n <div\n class=\"rc-card\"\n :class=\"[{ 'rc-card--bordered': bordered }]\"\n :style=\"wrapperStyle\"\n >\n <div\n v-if=\"$slots.title || title || $slots.status || status\"\n class=\"rc-card__top\"\n :style=\"{ backgroundColor: topBgColor || 'rgba(29, 133, 252, 0.05)' }\"\n >\n <div class=\"rc-card__title\">\n <slot name=\"title\">\n <span class=\"rc-card__title-text\">{{ title }}</span>\n </slot>\n </div>\n <div class=\"rc-card__status\" v-if=\"$slots.status || status\">\n <slot name=\"status\">\n <span class=\"rc-card__status-text\" :style=\"{ color: statusColor || 'var(--rc-primary)' }\">\n {{ status }}\n </span>\n </slot>\n </div>\n </div>\n\n <div class=\"rc-card__body\" :style=\"{ padding: bodyPadding, gap: bodyGap }\">\n <slot name=\"content\">\n <slot />\n </slot>\n </div>\n\n <div v-if=\"$slots.action\" class=\"rc-card__divider\" />\n\n <div v-if=\"$slots.action\" class=\"rc-card__action\">\n <slot name=\"action\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\ndefineOptions({ name: 'rc-card' });\n\ninterface Props {\n /** 卡片整体背景色,默认白色 */\n color?: string;\n /** 顶部色块背景色 */\n topBgColor?: string;\n /** 标题文本(可用 slot=\"title\" 自定义) */\n title?: string;\n /** 右侧状态文案(可用 slot=\"status\" 自定义) */\n status?: string;\n /** 状态文本颜色 */\n statusColor?: string;\n /** 圆角:数值代表 px,字符串可用百分比 */\n round?: number | string;\n /** 是否描边 */\n bordered?: boolean;\n /** 阴影强度:0/1/2/3... -> 转换为不同阴影强度 */\n elevation?: number;\n /** 内边距(CSS 值,如 '16px 12px') */\n padding?: string;\n /** 主体内容的垂直间距(px 或 CSS 字符串) */\n gap?: number | string;\n /** 宽度(px/百分比) */\n width?: string | number;\n /** 高度(px/百分比) */\n height?: string | number;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n color: 'var(--rc-white)',\n topBgColor: 'rgba(29, 133, 252, 0.05)',\n title: '',\n status: '',\n statusColor: 'var(--rc-primary)',\n round: 8,\n bordered: false,\n elevation: 2,\n padding: '16px',\n gap: 12,\n width: '100%',\n height: '',\n});\n\nconst wrapperStyle = computed(() => {\n const radius =\n typeof props.round === 'boolean'\n ? props.round\n ? '12px'\n : '0'\n : typeof props.round === 'number'\n ? `${props.round}px`\n : String(props.round);\n\n return {\n backgroundColor: props.color || 'var(--rc-white)',\n borderRadius: radius,\n boxShadow: shadowByLevel(props.elevation),\n width: toCssSize(props.width),\n height: toCssSize(props.height),\n } as Record<string, string>;\n});\n\nconst bodyPadding = computed(() => props.padding || '16px');\nconst bodyGap = computed(() =>\n typeof props.gap === 'number' ? `${props.gap}px` : String(props.gap)\n);\n\nfunction toCssSize(v?: string | number) {\n if (v === undefined || v === null || v === '') return '';\n return typeof v === 'number' ? `${v}px` : String(v);\n}\n\nfunction shadowByLevel(level: number) {\n if (!level || level <= 0) return 'none';\n // 简单的多层阴影(可按需微调)\n const base = 4 * level;\n return `0 ${Math.round(base / 2)}px ${base}px rgba(0,0,0,0.06), 0 ${Math.round(\n base / 4\n )}px ${Math.round(base / 2)}px rgba(0,0,0,0.04)`;\n}\n</script>\n\n<style scoped>\n.rc-card {\n --rc-white: #ffffff;\n --rc-border: #e5e6eb;\n --rc-primary: #1677ff;\n\n display: flex;\n flex-direction: column;\n width: 100%;\n border: 1px solid transparent;\n background: var(.rc-white);\n}\n.rc-card--bordered {\n border-color: var(--rc-border);\n}\n\n.rc-card__top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px;\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n.rc-card__title {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.rc-card__title-text {\n font-weight: 600;\n font-size: 16px;\n color: #1d2129;\n}\n.rc-card__status-text {\n font-size: 14px;\n}\n.rc-card__body {\n display: flex;\n flex-direction: column;\n}\n.rc-card__divider {\n height: 1px;\n background: var(--rc-border);\n}\n.rc-card__action {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n}\n</style>\n\n\n","import type { App } from 'vue';\r\nimport Card from './index.vue';\r\n\r\n// 同时注册小写与驼峰,便于 <rc-card> / <RcCard> 两种写法\r\n(Card as any).name = 'rc-card';\r\nconst PascalName = 'RcCard';\r\n\r\nexport function install(app: App) {\r\n app.component((Card as any).name, Card);\r\n app.component(PascalName, Card);\r\n return app;\r\n}\r\n\r\nexport default Card;\r\n\r\n\r\n","<template>\r\n <teleport to=\"body\">\r\n <transition name=\"rc-toast-fade\" @after-leave=\"onAfterLeave\">\r\n <div v-if=\"visible\" class=\"rc-toast\" :class=\"[`rc-toast--${type}`]\">\r\n <div v-if=\"mask\" class=\"rc-toast__mask\" />\r\n <div class=\"rc-toast__content\">\r\n <div v-if=\"type === 'loading'\" class=\"rc-toast__spinner\" />\r\n <div v-else-if=\"type === 'success'\" class=\"rc-toast__icon rc-toast__icon--success\" />\r\n <div v-else-if=\"type === 'fail'\" class=\"rc-toast__icon rc-toast__icon--fail\" />\r\n <div class=\"rc-toast__text\">{{ message }}</div>\r\n </div>\r\n </div>\r\n </transition>\r\n </teleport>\r\n <slot />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { onMounted, onUnmounted, ref, watch, defineExpose } from 'vue';\r\n\r\nexport type ToastType = 'text' | 'success' | 'fail' | 'loading';\r\nexport interface ToastProps {\r\n message?: string;\r\n type?: ToastType;\r\n duration?: number;\r\n mask?: boolean;\r\n /** 服务端关闭回调,用于卸载容器 */\r\n onAfterLeave?: () => void;\r\n}\r\n\r\nconst props = withDefaults(defineProps<ToastProps>(), {\r\n message: '',\r\n type: 'text',\r\n duration: 2000,\r\n mask: false,\r\n});\r\n\r\nconst visible = ref(true);\r\nlet timer: any;\r\n\r\nfunction clearTimer() {\r\n if (timer) {\r\n clearTimeout(timer);\r\n timer = null;\r\n }\r\n}\r\n\r\nfunction close() {\r\n clearTimer();\r\n visible.value = false;\r\n}\r\n\r\ndefineExpose({ close });\r\n\r\nonMounted(() => {\r\n if (props.duration && props.duration > 0) {\r\n timer = setTimeout(() => {\r\n close();\r\n }, props.duration);\r\n }\r\n});\r\n\r\nonUnmounted(() => {\r\n clearTimer();\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.rc-toast {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 9999;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n.rc-toast__mask {\r\n position: absolute;\r\n inset: 0;\r\n background: rgba(0, 0, 0, 0.35);\r\n pointer-events: auto;\r\n backdrop-filter: blur(1px);\r\n}\r\n.rc-toast__content {\r\n position: relative;\r\n max-width: 80%;\r\n background: rgba(0, 0, 0, 0.75);\r\n color: #fff;\r\n border-radius: 12px;\r\n padding: 12px 14px;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 8px;\r\n box-shadow: 0 6px 16px rgba(0,0,0,0.2);\r\n}\r\n.rc-toast__text {\r\n font-size: 14px;\r\n line-height: 1.4;\r\n}\r\n.rc-toast__spinner {\r\n width: 18px;\r\n height: 18px;\r\n border: 2px solid rgba(255,255,255,0.35);\r\n border-top-color: #fff;\r\n border-radius: 50%;\r\n animation: rc-toast-spin 0.8s linear infinite;\r\n}\r\n.rc-toast__icon {\r\n width: 18px;\r\n height: 18px;\r\n border-radius: 50%;\r\n position: relative;\r\n flex: 0 0 18px;\r\n}\r\n.rc-toast__icon--success::before {\r\n content: '';\r\n position: absolute;\r\n left: 3px;\r\n top: 3px;\r\n width: 10px;\r\n height: 10px;\r\n border-right: 2px solid #fff;\r\n border-bottom: 2px solid #fff;\r\n transform: rotate(45deg);\r\n}\r\n.rc-toast__icon--fail::before,\r\n.rc-toast__icon--fail::after {\r\n content: '';\r\n position: absolute;\r\n left: 3px;\r\n right: 3px;\r\n top: 8px;\r\n height: 2px;\r\n background: #fff;\r\n}\r\n.rc-toast__icon--fail::before {\r\n transform: rotate(45deg);\r\n}\r\n.rc-toast__icon--fail::after {\r\n transform: rotate(-45deg);\r\n}\r\n\r\n.rc-toast-fade-enter-active,\r\n.rc-toast-fade-leave-active {\r\n transition: opacity .2s ease;\r\n}\r\n.rc-toast-fade-enter-from,\r\n.rc-toast-fade-leave-to {\r\n opacity: 0;\r\n}\r\n@keyframes rc-toast-spin {\r\n to { transform: rotate(360deg); }\r\n}\r\n</style>\r\n\r\n\r\n","import { App, createApp } from 'vue';\r\nimport Toast, { type ToastProps } from './index.vue';\r\n\r\nexport type { ToastProps };\r\nexport interface ShowToastOptions {\r\n message?: string;\r\n type?: 'text' | 'success' | 'fail' | 'loading';\r\n duration?: number;\r\n mask?: boolean;\r\n /** 关闭时回调(仅服务方式有效) */\r\n onClose?: () => void;\r\n}\r\n\r\nlet app: App<Element> | null = null;\r\nlet host: HTMLDivElement | null = null;\r\n\r\nfunction unmount() {\r\n if (app) {\r\n app.unmount();\r\n app = null;\r\n }\r\n if (host) {\r\n document.body.removeChild(host);\r\n host = null;\r\n }\r\n}\r\n\r\nexport function showToast(options: string | ShowToastOptions) {\r\n const opt: ShowToastOptions =\r\n typeof options === 'string' ? { message: options } : (options || {});\r\n unmount();\r\n host = document.createElement('div');\r\n document.body.appendChild(host);\r\n const toastProps: ToastProps = {\r\n message: opt.message,\r\n type: (opt as any).type ?? 'text',\r\n duration: (opt as any).duration ?? 2000,\r\n mask: (opt as any).mask ?? false,\r\n onAfterLeave: () => {\r\n unmount();\r\n opt.onClose?.();\r\n },\r\n };\r\n app = createApp(Toast, toastProps as any);\r\n app.mount(host);\r\n return {\r\n close: hideToast,\r\n };\r\n}\r\n\r\nexport function hideToast() {\r\n if (!app) return;\r\n // 调用暴露的 close 方法\r\n // @ts-ignore\r\n app._instance?.exposed?.close?.();\r\n}\r\n\r\n// 组件注册(可选,提供 rc-toast 用于手动放置 Portal)\r\n(Toast as any).name = 'rc-toast';\r\nexport function install(app: App) {\r\n app.component((Toast as any).name, Toast);\r\n return app;\r\n}\r\n\r\nexport default Toast;\r\n\r\n\r\n","<template>\r\n <div class=\"rc-message\" role=\"alert\" aria-live=\"polite\">\r\n <transition-group name=\"rc-message-fade\" tag=\"div\">\r\n <div\r\n v-for=\"m in messages\"\r\n :key=\"m.id\"\r\n class=\"rc-message__item\"\r\n :class=\"`rc-message--${m.type}`\"\r\n >\r\n <span class=\"rc-message__content\">{{ m.content }}</span>\r\n </div>\r\n </transition-group>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { reactive } from 'vue';\r\n\r\nexport type MessageType = 'info' | 'success' | 'warning' | 'error' | 'loading';\r\nexport interface MessageItem {\r\n id: number;\r\n type: MessageType;\r\n content: string;\r\n duration: number; // ms; 0 = persistent (except loading default)\r\n}\r\n\r\nconst messages = reactive<MessageItem[]>([]);\r\nlet uid = 1;\r\n\r\nfunction remove(id: number) {\r\n const idx = messages.findIndex((x) => x.id === id);\r\n if (idx >= 0) messages.splice(idx, 1);\r\n}\r\n\r\nfunction add(type: MessageType, content: string, duration: number) {\r\n const id = uid++;\r\n messages.push({ id, type, content, duration });\r\n if (duration > 0) {\r\n window.setTimeout(() => remove(id), duration);\r\n }\r\n return id;\r\n}\r\n\r\ndefineExpose({ add, remove });\r\n</script>\r\n\r\n<style scoped>\r\n.rc-message {\r\n position: fixed;\r\n top: 16px;\r\n left: 0;\r\n right: 0;\r\n z-index: 10000;\r\n pointer-events: none;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n.rc-message__item {\r\n pointer-events: auto;\r\n min-width: 120px;\r\n max-width: 80%;\r\n padding: 8px 12px;\r\n border-radius: 6px;\r\n color: #fff;\r\n background: rgba(0, 0, 0, 0.78);\r\n box-shadow: 0 6px 16px rgba(0,0,0,0.2);\r\n font-size: 14px;\r\n}\r\n.rc-message--success { background: rgba(22,119,255,0.9); }\r\n.rc-message--warning { background: rgba(250,173,20,0.95); }\r\n.rc-message--error { background: rgba(245,63,63,0.95); }\r\n.rc-message--info { background: rgba(0,0,0,0.78); }\r\n.rc-message--loading { background: rgba(0,0,0,0.78); }\r\n\r\n.rc-message-fade-enter-active,\r\n.rc-message-fade-leave-active {\r\n transition: all .2s ease;\r\n}\r\n.rc-message-fade-enter-from,\r\n.rc-message-fade-leave-to {\r\n opacity: 0;\r\n transform: translateY(-6px);\r\n}\r\n</style>\r\n\r\n\r\n","import { createVNode, render, type App } from 'vue';\r\nimport MessageHost from './index.vue';\r\n\r\ntype MessageType = 'info' | 'success' | 'warning' | 'error' | 'loading';\r\n\r\nexport interface MessageOptions {\r\n content: string;\r\n duration?: number; // ms; default 2000, loading 默认 0\r\n type?: MessageType;\r\n}\r\n\r\nlet container: HTMLElement | null = null;\r\nlet hostExposed: any = null;\r\n\r\nfunction ensureHost() {\r\n if (container && hostExposed) return;\r\n container = document.createElement('div');\r\n document.body.appendChild(container);\r\n const vnode = createVNode(MessageHost, {});\r\n render(vnode, container);\r\n hostExposed = (vnode.component as any)?.exposed;\r\n}\r\n\r\nfunction open(type: MessageType, content: string, duration?: number) {\r\n ensureHost();\r\n const d = typeof duration === 'number'\r\n ? duration\r\n : (type === 'loading' ? 0 : 2000);\r\n return hostExposed?.add?.(type, content, d);\r\n}\r\n\r\nexport const message = {\r\n open(opts: MessageOptions) {\r\n return open(opts.type || 'info', opts.content, opts.duration);\r\n },\r\n info(content: string, duration?: number) {\r\n return open('info', content, duration);\r\n },\r\n success(content: string, duration?: number) {\r\n return open('success', content, duration);\r\n },\r\n warning(content: string, duration?: number) {\r\n return open('warning', content, duration);\r\n },\r\n error(content: string, duration?: number) {\r\n return open('error', content, duration);\r\n },\r\n loading(content: string, duration?: number) {\r\n return open('loading', content, duration);\r\n },\r\n destroy() {\r\n if (container) {\r\n render(null, container);\r\n container.remove();\r\n container = null;\r\n hostExposed = null;\r\n }\r\n },\r\n};\r\n\r\nexport default message;\r\n\r\n// 可选:提供 install,注入到 app.config.globalProperties 以便 this.$message 使用\r\nexport function install(app: App) {\r\n (app.config.globalProperties as any).$message = message;\r\n return app;\r\n}\r\n\r\n\r\n","<template>\r\n <i\r\n class=\"rc-icon\"\r\n :class=\"[baseClass, iconClassName, { 'rc-icon--spin': spin }]\"\r\n :style=\"iconStyle\"\r\n aria-hidden=\"true\"\r\n >\r\n <span v-if=\"char\" class=\"rc-icon__unicode\">{{ char }}</span>\r\n </i>\r\n </template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, inject, onMounted } from 'vue';\r\nimport type { RecycleUIOptions } from '../../types';\r\nimport { RECYCLE_UI_SYMBOL, defaultRecycleUIConfig } from '../../index';\r\n\r\ndefineOptions({ name: 'rc-icon' });\r\n\r\nconst props = withDefaults(defineProps<{\r\n /** 图标名,例如 'icon_a_in_store',也可直接传完整类名 */\r\n name: string;\r\n /** 尺寸,数字按 px 处理,也可传 '1.2em' 等 */\r\n size?: number | string;\r\n /** 颜色 */\r\n color?: string;\r\n /** 是否旋转(用于 loading 类图标) */\r\n spin?: boolean;\r\n /** Unicode 码点(不带 \\\\u,十六进制,如 'e609' 或 0xe609),用于无类名时渲染 */\r\n code?: string | number;\r\n}>(), {\r\n size: 16,\r\n color: '',\r\n spin: false,\r\n code: '',\r\n});\r\n\r\nconst cfg = inject<RecycleUIOptions>(RECYCLE_UI_SYMBOL, {} as RecycleUIOptions);\r\n\r\nconst baseClass = computed(() => cfg?.iconClass || 'iconfont');\r\nconst iconClassName = computed(() => props.name || '');\r\n\r\nconst sizeCss = computed(() => (typeof props.size === 'number' ? `${props.size}px` : (props.size || '16px')));\r\nconst iconStyle = computed(() => ({\r\n fontSize: sizeCss.value,\r\n color: props.color || undefined,\r\n lineHeight: 1,\r\n fontFamily: cfg?.iconClass || 'iconfont',\r\n}));\r\n\r\n// 将 code 转为字符\r\nconst char = computed(() => {\r\n const c = props.code as any;\r\n if (c === undefined || c === null || c === '' || c === 0) return '';\r\n if (typeof c === 'number') {\r\n return String.fromCharCode(c);\r\n }\r\n const hex = String(c).replace(/^0x/i, '');\r\n const num = parseInt(hex, 16);\r\n if (Number.isNaN(num)) return '';\r\n return String.fromCharCode(num);\r\n});\r\n\r\n// 兜底:若未通过 app.use 安装插件,则在组件挂载时尝试注入默认的 iconfont 样式\r\nonMounted(() => {\r\n if (typeof window === 'undefined') return;\r\n const url = (cfg && cfg.iconCssUrl) || defaultRecycleUIConfig.iconCssUrl;\r\n if (!url) return;\r\n const selector = `link[rel=\"stylesheet\"][data-rcui-icon=\"true\"][href=\"${url}\"]`;\r\n const exists = document.head.querySelector(selector);\r\n if (!exists) {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = url as string;\r\n link.setAttribute('data-rcui-icon', 'true');\r\n document.head.appendChild(link);\r\n }\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n.rc-icon {\r\n display: inline-block;\r\n vertical-align: -0.125em;\r\n}\r\n.rc-icon__unicode {\r\n /* 让 Unicode 文本走同一字体,确保显示 */\r\n font-family: inherit;\r\n line-height: 1;\r\n}\r\n.rc-icon--spin {\r\n animation: rc-icon-rot 1s linear infinite;\r\n}\r\n@keyframes rc-icon-rot {\r\n to { transform: rotate(360deg); }\r\n}\r\n</style>\r\n\r\n\r\n","import type { App } from 'vue';\r\nimport Icon from './index.vue';\r\n\r\n(Icon as any).name = 'rc-icon';\r\n\r\nexport function install(app: App) {\r\n app.component((Icon as any).name, Icon);\r\n app.component('RcIcon', Icon);\r\n return app;\r\n}\r\n\r\nexport const RcIcon = Icon;\r\nexport default Icon;\r\n\r\n\r\n","// library entry\r\nimport type { App, Plugin } from 'vue';\r\nimport { install as installButton } from './components/button';\r\nimport { install as installDescriptions } from './components/descriptions';\r\nimport { install as installCard } from './components/card';\r\nimport { install as installToast } from './components/toast';\r\nimport { install as installMessage } from './components/message';\r\nimport { install as installIcon } from './components/icon/index';\r\nimport type { RecycleUIOptions } from './types';\r\n\r\nexport const RECYCLE_UI_SYMBOL = Symbol('RECYCLE_UI_CONFIG');\r\n\r\nexport const defaultRecycleUIConfig: RecycleUIOptions = {\r\n prefix: 'rc',\r\n autoRegister: true,\r\n provideKey: RECYCLE_UI_SYMBOL,\r\n // 预留主题/其他全局配置\r\n theme: {},\r\n // IconFont 默认配置(可在 app.use 时覆盖)\r\n iconCssUrl: '//at.alicdn.com/t/c/font_4252799_9vcnw0pnmkh.css',\r\n iconClass: 'iconfont',\r\n};\r\n\r\n// 统一导出所有类型的命名空间\r\nexport namespace RecycleUiTypes {\r\n // 核心配置类型\r\n export type Options = RecycleUIOptions;\r\n export type DefaultConfig = typeof defaultRecycleUIConfig;\r\n \r\n // Message 相关类型\r\n export type MessageOptions = import('./components/message').MessageOptions;\r\n export type MessageType = import('./components/message/index.vue').MessageType;\r\n export type MessageItem = import('./components/message/index.vue').MessageItem;\r\n \r\n // Toast 相关类型\r\n export type ToastProps = import('./components/toast/index.vue').ToastProps;\r\n export type ToastType = import('./components/toast/index.vue').ToastType;\r\n export type ShowToastOptions = import('./components/toast').ShowToastOptions;\r\n}\r\n\r\nfunction doAutoRegister(app: App, opts: RecycleUIOptions) {\r\n if (opts.autoRegister === false) return;\r\n if (typeof installButton === 'function') installButton(app);\r\n if (typeof installDescriptions === 'function') installDescriptions(app);\r\n if (typeof installCard === 'function') installCard(app);\r\n if (typeof installToast === 'function') installToast(app);\r\n if (typeof installIcon === 'function') installIcon(app);\r\n if (typeof installMessage === 'function') installMessage(app);\r\n}\r\n\r\nexport const install = (app: App, options?: RecycleUIOptions) => {\r\n const cfg: RecycleUIOptions = { ...defaultRecycleUIConfig, ...(options || {}) };\r\n // 提供全局配置\r\n app.provide(cfg.provideKey ?? RECYCLE_UI_SYMBOL, cfg);\r\n // 供模板/实例访问:this.$recycleUI\r\n (app.config.globalProperties as any).$recycleUI = cfg;\r\n // 注入 IconFont 样式链接(浏览器环境)\r\n if (typeof window !== 'undefined' && cfg.iconCssUrl) {\r\n const selector = `link[rel=\"stylesheet\"][data-rcui-icon=\"true\"][href=\"${cfg.iconCssUrl}\"]`;\r\n const exists = document.head.querySelector(selector);\r\n if (!exists) {\r\n const link = document.createElement('link');\r\n link.rel = 'stylesheet';\r\n link.href = cfg.iconCssUrl;\r\n link.setAttribute('data-rcui-icon', 'true');\r\n document.head.appendChild(link);\r\n }\r\n }\r\n // 自动注册内置组件(可通过 autoRegister 关闭)\r\n doAutoRegister(app, cfg);\r\n return app;\r\n};\r\n\r\n// 默认导出为插件,支持 app.use(recycleUi, options)\r\nconst plugin: Plugin = { install };\r\nexport default plugin;\r\n\r\n// 也导出命名组件安装器与默认配置(defaultRecycleUIConfig 已在上方以常量形式导出)\r\n\r\n// 可选:工厂方法,便于创建带预设配置的插件\r\nexport function createRecycleUI(options?: RecycleUIOptions): Plugin {\r\n return {\r\n install(app: App) {\r\n install(app, options);\r\n },\r\n };\r\n}\r\n\r\n// 按需导出组件与其安装器(供文档与业务直接使用)\r\nexport { default as RcButton } from './components/button';\r\nexport { RcDescriptions, RcDescriptionsItem } from './components/descriptions';\r\nexport { install as installButton } from './components/button';\r\nexport { install as installDescriptions } from './components/descriptions';\r\nexport { default as RcCard } from './components/card';\r\nexport { install as installCard } from './components/card';\r\n// 兼容别名导出(文档示例中的 rcXxx)\r\nexport { RcDescriptions as rcDescriptions, RcDescriptionsItem as rcDescriptionsItem } from './components/descriptions';\r\n// Toast 服务导出\r\nexport { default as RcToast, showToast, hideToast } from './components/toast';\r\n// Icon 组件导出\r\nexport { default as RcIcon } from './components/icon/index';\r\nexport { install as installIcon } from './components/icon/index';\r\n// Message 服务(对标 antd 的 message)\r\nexport { default as message } from './components/message';\r\nexport { install as installMessage } from './components/message';\r\n"],"names":["props","__props","emit","__emit","onClick","ev","radius","computed","v","_createElementBlock","_normalizeClass","_openBlock","_hoisted_2","_renderSlot","_ctx","Button","install","app","inject","providedGapPx","providedColCount","providedLabelWidth","spanNum","n","max","safe","computedWidth","gapPx","k","totalGap","interGap","labelStyle","injected","w","_normalizeStyle","_createElementVNode","_hoisted_1","wrapEl","ref","gapStyle","colCount","itemWidth","singleWidth","watchEffect","base","provide","labelWidthCss","normalizedData","keyK","_a","keyV","_b","_c","it","$slots","_Fragment","_renderList","idx","_createBlock","rcDescriptionsItem","Descriptions","DescriptionsItem","RcDescriptions","RcDescriptionsItem","wrapperStyle","shadowByLevel","toCssSize","bodyPadding","bodyGap","level","_toDisplayString","_hoisted_3","_hoisted_4","_hoisted_5","Card","PascalName","visible","timer","clearTimer","close","__expose","onMounted","onUnmounted","_Teleport","_createVNode","_Transition","_hoisted_6","host","unmount","showToast","options","opt","toastProps","createApp","Toast","hideToast","messages","reactive","uid","remove","id","x","add","type","content","duration","_TransitionGroup","m","container","hostExposed","ensureHost","vnode","createVNode","MessageHost","render","open","d","message","opts","cfg","RECYCLE_UI_SYMBOL","baseClass","iconClassName","sizeCss","iconStyle","char","c","hex","num","url","defaultRecycleUIConfig","selector","link","Icon","doAutoRegister","installButton","installDescriptions","installCard","installToast","installIcon","installMessage","plugin","createRecycleUI"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rft-rc/recycle-ui",
3
- "version": "0.0.1-rc.6",
3
+ "version": "0.0.1-rc.7",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "A Vue 3 component library with dumi-powered docs.",