UNPKG

@extclp/vexip-ui

Version:

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

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