UNPKG

@extclp/vexip-ui

Version:

A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good

1 lines 9.96 kB
{"version":3,"file":"alert.vue2.mjs","sources":["../../../components/alert/alert.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { CollapseTransition } from '@/components/collapse-transition'\nimport { Icon } from '@/components/icon'\nimport { Renderer } from '@/components/renderer'\n\nimport { computed, onMounted, ref, watch } from 'vue'\n\nimport { emitEvent, useIcons, useNameHelper, useProps } from '@vexip-ui/config'\nimport { adjustAlpha, getRangeWidth, isClient, mixColor, parseColorToRgba } from '@vexip-ui/utils'\nimport { alertProps } from './props'\nimport { alertTypes } from './symbol'\n\nimport type { AlertSlots } from './symbol'\n\ndefineOptions({ name: 'Alert' })\n\nconst _props = defineProps(alertProps)\nconst props = useProps('alert', _props, {\n type: {\n default: 'primary',\n validator: value => alertTypes.includes(value)\n },\n title: '',\n colorfulText: false,\n icon: {\n isFunc: true,\n default: false\n },\n closable: false,\n iconColor: '',\n noBorder: false,\n banner: false,\n manual: false,\n scroll: false,\n scrollSpeed: 1,\n color: null,\n slots: () => ({})\n})\n\nconst slots = defineSlots<AlertSlots>()\n\nconst nh = useNameHelper('alert')\nconst icons = useIcons()\n\nconst predefinedIcons = computed(() => ({\n default: icons.value.alert,\n primary: icons.value.info,\n info: icons.value.info,\n success: icons.value.success,\n warning: icons.value.warning,\n error: icons.value.error\n}))\n\nconst closed = ref(false)\nconst hidden = ref(false)\nconst scrollDuration = ref(0)\nconst scrollOffset = ref(0)\nconst scrollWidth = ref(0)\n\nconst content = ref<HTMLElement>()\nconst scrollEl = ref<HTMLElement>()\n\nconst hasTitle = computed(() => {\n return !!(props.title || slots.title)\n})\nconst hasIcon = computed(() => {\n return !!(props.icon || slots.icon)\n})\nconst className = computed(() => {\n return {\n [nh.b()]: true,\n [nh.bs('vars')]: true,\n [nh.bm('inherit')]: props.inherit,\n [nh.bm(props.type)]: props.type,\n [nh.bm('colorful-text')]: props.colorfulText,\n [nh.bm('has-title')]: hasTitle.value,\n [nh.bm('has-icon')]: hasIcon.value,\n [nh.bm('closable')]: props.closable,\n [nh.bm('no-border')]: !props.banner && props.noBorder,\n [nh.bm('banner')]: props.banner\n }\n})\nconst style = computed(() => {\n if (!props.color) return undefined\n\n const rootStyle = isClient ? getComputedStyle(document.documentElement) : null\n const black = parseColorToRgba(rootStyle?.getPropertyValue(nh.nv('color-black')) || '#000')\n const baseColor = parseColorToRgba(props.color)\n\n return nh.cvm({\n 'bg-color': adjustAlpha(baseColor, 0.2).toString(),\n 'b-color': adjustAlpha(baseColor, 0.5).toString(),\n 'icon-color': mixColor(black, baseColor, 0.2).toString(),\n ...(props.colorfulText\n ? {\n 'text-color': mixColor(black, baseColor, 0.2).toString(),\n 'title-color': mixColor(black, baseColor, 0.2).toString()\n }\n : {})\n })\n})\nconst iconComp = computed(() => {\n if (typeof props.icon === 'boolean') {\n return predefinedIcons.value[props.type] ?? {}\n }\n\n return { icon: props.icon }\n})\nconst scrollStyle = computed(() => {\n return {\n width: `${scrollWidth.value}px`,\n transitionDuration: `${scrollDuration.value}ms`,\n transform: `translateX(${scrollOffset.value}px)`\n }\n})\n\nwatch(\n () => props.scroll,\n value => {\n value && startScroll()\n }\n)\n\nonMounted(() => {\n props.scroll && startScroll()\n})\n\nfunction handleClose() {\n if (!props.manual) {\n closed.value = true\n }\n\n emitEvent(props.onClose)\n}\n\nfunction handleAfterLeave() {\n emitEvent(props.onHide)\n hidden.value = true\n}\n\nfunction startScroll() {\n if (content.value && scrollEl.value) {\n const contentRect = content.value.getBoundingClientRect()\n const rangeWidth = getRangeWidth(scrollEl.value)\n const duration = ((contentRect.width + rangeWidth) * 12) / (Math.max(props.scrollSpeed, 0) || 1)\n\n scrollDuration.value = 0\n scrollOffset.value = contentRect.width\n scrollWidth.value = rangeWidth\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n scrollDuration.value = duration\n scrollOffset.value = -rangeWidth\n })\n })\n }\n}\n\nfunction handleScrollEnd() {\n emitEvent(props.onScrollEnd)\n requestAnimationFrame(startScroll)\n}\n</script>\n\n<template>\n <CollapseTransition v-if=\"!hidden\" fade-effect @after-leave=\"handleAfterLeave\">\n <div\n v-if=\"!closed\"\n :class=\"className\"\n role=\"alert\"\n :style=\"style\"\n >\n <div :class=\"nh.be('wrapper')\">\n <div v-if=\"hasTitle\" :class=\"nh.be('title')\">\n <slot name=\"title\">\n <Renderer :renderer=\"props.slots.title\">\n {{ title }}\n </Renderer>\n </slot>\n </div>\n <div ref=\"content\" :class=\"[nh.be('content'), props.scroll && nh.bem('content', 'scroll')]\">\n <span\n v-if=\"props.scroll\"\n ref=\"scrollEl\"\n :class=\"nh.be('scroll')\"\n :style=\"scrollStyle\"\n @transitionend=\"handleScrollEnd\"\n >\n <slot>\n <Renderer :renderer=\"props.slots.default\"></Renderer>\n </slot>\n </span>\n <slot v-else>\n <Renderer :renderer=\"props.slots.default\"></Renderer>\n </slot>\n </div>\n </div>\n <button\n v-if=\"props.closable\"\n type=\"button\"\n :class=\"nh.be('close')\"\n @click=\"handleClose\"\n >\n <slot name=\"close\">\n <Renderer :renderer=\"props.slots.close\">\n <Icon v-bind=\"icons.close\" label=\"close\"></Icon>\n </Renderer>\n </slot>\n </button>\n <div v-if=\"hasIcon\" :class=\"nh.be('icon')\">\n <slot name=\"icon\">\n <Renderer :renderer=\"props.slots.icon\">\n <Icon\n v-bind=\"iconComp\"\n :scale=\"hasTitle ? 2 : 1\"\n :style=\"{ color: props.iconColor }\"\n ></Icon>\n </Renderer>\n </slot>\n </div>\n </div>\n </CollapseTransition>\n</template>\n"],"names":["props","useProps","__props","value","alertTypes","slots","_useSlots","nh","useNameHelper","icons","useIcons","predefinedIcons","computed","closed","ref","hidden","scrollDuration","scrollOffset","scrollWidth","content","scrollEl","hasTitle","hasIcon","className","style","rootStyle","isClient","black","parseColorToRgba","baseColor","adjustAlpha","mixColor","iconComp","scrollStyle","watch","startScroll","onMounted","handleClose","emitEvent","handleAfterLeave","contentRect","rangeWidth","getRangeWidth","duration","handleScrollEnd"],"mappings":"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"}