{"version":3,"file":"progress4.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 :percentage=\"percentage\">\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=\"`var(${ns.cssVarName('fill-color-light')}, #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          :opacity=\"percentage ? 1 : 0\"\n          :stroke-linecap=\"strokeLinecap\"\n          :stroke-width=\"relativeStrokeWidth\"\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 :percentage=\"percentage\">\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\" setup>\nimport { computed } from 'vue'\nimport { ElIcon } from '@element-plus/components/icon'\nimport {\n  Check,\n  CircleCheck,\n  CircleClose,\n  Close,\n  WarningFilled,\n} from '@element-plus/icons-vue'\nimport { useNamespace } from '@element-plus/hooks'\nimport { isFunction, isString } from '@element-plus/utils'\nimport { progressProps } from './progress'\nimport type { CSSProperties } from 'vue'\nimport type { ProgressColor } from './progress'\n\ndefineOptions({\n  name: 'ElProgress',\n})\n\nconst STATUS_COLOR_MAP = {\n  success: '#13ce66',\n  exception: '#ff4949',\n  warning: '#e6a23c',\n  default: '#20a0ff',\n}\n\nconst props = defineProps(progressProps)\n\nconst ns = useNamespace('progress')\n\nconst barStyle = computed<CSSProperties>(() => ({\n  width: `${props.percentage}%`,\n  animationDuration: `${props.duration}s`,\n  backgroundColor: getCurrentColor(props.percentage),\n}))\n\nconst relativeStrokeWidth = computed(() =>\n  ((props.strokeWidth / props.width) * 100).toFixed(1)\n)\n\nconst radius = computed(() => {\n  if (['circle', 'dashboard'].includes(props.type)) {\n    return Number.parseInt(\n      `${50 - Number.parseFloat(relativeStrokeWidth.value) / 2}`,\n      10\n    )\n  }\n  return 0\n})\n\nconst 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\nconst perimeter = computed(() => 2 * Math.PI * radius.value)\n\nconst rate = computed(() => (props.type === 'dashboard' ? 0.75 : 1))\n\nconst strokeDashoffset = computed(() => {\n  const offset = (-1 * perimeter.value * (1 - rate.value)) / 2\n  return `${offset}px`\n})\n\nconst trailPathStyle = computed<CSSProperties>(() => ({\n  strokeDasharray: `${perimeter.value * rate.value}px, ${perimeter.value}px`,\n  strokeDashoffset: strokeDashoffset.value,\n}))\n\nconst circlePathStyle = computed<CSSProperties>(() => ({\n  strokeDasharray: `${\n    perimeter.value * rate.value * (props.percentage / 100)\n  }px, ${perimeter.value}px`,\n  strokeDashoffset: strokeDashoffset.value,\n  transition:\n    'stroke-dasharray 0.6s ease 0s, stroke 0.6s ease, opacity ease 0.6s',\n}))\n\nconst stroke = computed(() => {\n  let ret: string\n  if (props.color) {\n    ret = getCurrentColor(props.percentage)\n  } else {\n    ret = STATUS_COLOR_MAP[props.status] || STATUS_COLOR_MAP.default\n  }\n  return ret\n})\n\nconst 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\nconst progressTextSize = computed(() => {\n  return props.type === 'line'\n    ? 12 + props.strokeWidth * 0.4\n    : props.width * 0.111111 + 2\n})\n\nconst content = computed(() => props.format(props.percentage))\n\nfunction getColors(color: ProgressColor[]) {\n  const span = 100 / color.length\n  const seriesColors = color.map((seriesColor, index) => {\n    if (isString(seriesColor)) {\n      return {\n        color: seriesColor,\n        percentage: (index + 1) * span,\n      }\n    }\n    return seriesColor\n  })\n  return seriesColors.sort((a, b) => a.percentage - b.percentage)\n}\n\nconst getCurrentColor = (percentage: number) => {\n  const { color } = props\n  if (isFunction(color)) {\n    return color(percentage)\n  } else if (isString(color)) {\n    return color\n  } else {\n    const colors = getColors(color)\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</script>\n"],"names":[],"mappings":"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"}