UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 9.59 kB
{"version":3,"file":"progress2.mjs","sources":["../../../../../../packages/components/progress/src/progress.vue"],"sourcesContent":["<template>\n <div\n :class=\"[\n ns.b(),\n ns.m(type),\n ns.is(status),\n {\n [ns.m('without-text')]: !showText,\n [ns.m('text-inside')]: textInside,\n },\n ]\"\n role=\"progressbar\"\n :aria-valuenow=\"percentage\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <div v-if=\"type === 'line'\" :class=\"ns.b('bar')\">\n <div\n :class=\"ns.be('bar', 'outer')\"\n :style=\"{ height: `${strokeWidth}px` }\"\n >\n <div\n :class=\"[\n ns.be('bar', 'inner'),\n { [ns.bem('bar', 'inner', 'indeterminate')]: indeterminate },\n ]\"\n :style=\"barStyle\"\n >\n <div\n v-if=\"(showText || $slots.default) && textInside\"\n :class=\"ns.be('bar', 'innerText')\"\n >\n <slot v-bind=\"slotData\">\n <span>{{ content }}</span>\n </slot>\n </div>\n </div>\n </div>\n </div>\n <div\n v-else\n :class=\"ns.b('circle')\"\n :style=\"{ height: `${width}px`, width: `${width}px` }\"\n >\n <svg viewBox=\"0 0 100 100\">\n <path\n :class=\"ns.be('circle', 'track')\"\n :d=\"trackPath\"\n stroke=\"#e5e9f2\"\n :stroke-width=\"relativeStrokeWidth\"\n fill=\"none\"\n :style=\"trailPathStyle\"\n />\n <path\n :class=\"ns.be('circle', 'path')\"\n :d=\"trackPath\"\n :stroke=\"stroke\"\n fill=\"none\"\n :stroke-linecap=\"strokeLinecap\"\n :stroke-width=\"percentage ? relativeStrokeWidth : 0\"\n :style=\"circlePathStyle\"\n />\n </svg>\n </div>\n <div\n v-if=\"(showText || $slots.default) && !textInside\"\n :class=\"ns.e('text')\"\n :style=\"{ fontSize: `${progressTextSize}px` }\"\n >\n <slot v-bind=\"slotData\">\n <span v-if=\"!status\">{{ content }}</span>\n <el-icon v-else><component :is=\"statusIcon\" /></el-icon>\n </slot>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent } from 'vue'\nimport { ElIcon } from '@element-plus/components/icon'\nimport {\n WarningFilled,\n CircleCheck,\n CircleClose,\n Check,\n Close,\n} from '@element-plus/icons-vue'\nimport { useNamespace } from '@element-plus/hooks'\nimport { progressProps } from './progress'\nimport type { CSSProperties } from 'vue'\n\nexport default defineComponent({\n name: 'ElProgress',\n components: {\n ElIcon,\n CircleCheck,\n CircleClose,\n Check,\n Close,\n WarningFilled,\n },\n props: progressProps,\n\n setup(props) {\n const ns = useNamespace('progress')\n\n const barStyle = computed(\n (): CSSProperties => ({\n width: `${props.percentage}%`,\n animationDuration: `${props.duration}s`,\n backgroundColor: getCurrentColor(props.percentage),\n })\n )\n\n const relativeStrokeWidth = computed(() =>\n ((props.strokeWidth / props.width) * 100).toFixed(1)\n )\n\n const radius = computed(() => {\n if (props.type === 'circle' || props.type === 'dashboard') {\n return parseInt(`${50 - parseFloat(relativeStrokeWidth.value) / 2}`, 10)\n } else {\n return 0\n }\n })\n\n const trackPath = computed(() => {\n const r = radius.value\n const isDashboard = props.type === 'dashboard'\n return `\n M 50 50\n m 0 ${isDashboard ? '' : '-'}${r}\n a ${r} ${r} 0 1 1 0 ${isDashboard ? '-' : ''}${r * 2}\n a ${r} ${r} 0 1 1 0 ${isDashboard ? '' : '-'}${r * 2}\n `\n })\n\n const perimeter = computed(() => 2 * Math.PI * radius.value)\n\n const rate = computed(() => (props.type === 'dashboard' ? 0.75 : 1))\n\n const strokeDashoffset = computed(() => {\n const offset = (-1 * perimeter.value * (1 - rate.value)) / 2\n return `${offset}px`\n })\n\n const trailPathStyle = computed(\n (): CSSProperties => ({\n strokeDasharray: `${perimeter.value * rate.value}px, ${\n perimeter.value\n }px`,\n strokeDashoffset: strokeDashoffset.value,\n })\n )\n\n const circlePathStyle = computed(\n (): CSSProperties => ({\n strokeDasharray: `${\n perimeter.value * rate.value * (props.percentage / 100)\n }px, ${perimeter.value}px`,\n strokeDashoffset: strokeDashoffset.value,\n transition: 'stroke-dasharray 0.6s ease 0s, stroke 0.6s ease',\n })\n )\n\n const stroke = computed(() => {\n let ret: string\n if (props.color) {\n ret = getCurrentColor(props.percentage)\n } else {\n switch (props.status) {\n case 'success':\n ret = '#13ce66'\n break\n case 'exception':\n ret = '#ff4949'\n break\n case 'warning':\n ret = '#e6a23c'\n break\n default:\n ret = '#20a0ff'\n }\n }\n return ret\n })\n\n const statusIcon = computed(() => {\n if (props.status === 'warning') {\n return WarningFilled\n }\n if (props.type === 'line') {\n return props.status === 'success' ? CircleCheck : CircleClose\n } else {\n return props.status === 'success' ? Check : Close\n }\n })\n\n const progressTextSize = computed(() => {\n return props.type === 'line'\n ? 12 + props.strokeWidth * 0.4\n : props.width * 0.111111 + 2\n })\n\n const content = computed(() => props.format(props.percentage))\n\n const getCurrentColor = (percentage: number) => {\n const { color } = props\n if (typeof color === 'function') {\n return color(percentage)\n } else if (typeof color === 'string') {\n return color\n } else {\n const span = 100 / color.length\n const seriesColors = color.map((seriesColor, index) => {\n if (typeof seriesColor === 'string') {\n return {\n color: seriesColor,\n percentage: (index + 1) * span,\n }\n }\n return seriesColor\n })\n const colors = seriesColors.sort((a, b) => a.percentage - b.percentage)\n\n for (const color of colors) {\n if (color.percentage > percentage) return color.color\n }\n return colors[colors.length - 1]?.color\n }\n }\n\n const slotData = computed(() => {\n return {\n percentage: props.percentage,\n }\n })\n\n return {\n ns,\n barStyle,\n relativeStrokeWidth,\n radius,\n trackPath,\n perimeter,\n rate,\n strokeDashoffset,\n trailPathStyle,\n circlePathStyle,\n stroke,\n statusIcon,\n progressTextSize,\n content,\n slotData,\n }\n },\n})\n</script>\n"],"names":["_normalizeClass","_guardReactiveProps"],"mappings":"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"}