UNPKG

vuetify

Version:

Vue Material Component Framework

1 lines 9.29 kB
{"version":3,"file":"VProgressCircular.mjs","names":["makeSizeProps","useSize","makeTagProps","makeThemeProps","provideTheme","useIntersectionObserver","useResizeObserver","useTextColor","computed","ref","toRef","watchEffect","convertToUnit","genericComponent","useRender","VProgressCircular","name","props","bgColor","String","color","indeterminate","Boolean","modelValue","type","Number","default","rotate","width","tag","setup","slots","MAGIC_RADIUS_CONSTANT","CIRCUMFERENCE","Math","PI","root","themeClasses","sizeClasses","sizeStyles","textColorClasses","textColorStyles","underlayColorClasses","underlayColorStyles","intersectionRef","isIntersecting","resizeRef","contentRect","normalizedValue","max","min","parseFloat","size","value","diameter","strokeWidth","strokeDashOffset","undefined","transform"],"sources":["../../../src/components/VProgressCircular/VProgressCircular.tsx"],"sourcesContent":["// Styles\nimport './VProgressCircular.sass'\n\n// Composables\nimport { makeSizeProps, useSize } from '@/composables/size'\nimport { makeTagProps } from '@/composables/tag'\nimport { makeThemeProps, provideTheme } from '@/composables/theme'\nimport { useIntersectionObserver } from '@/composables/intersectionObserver'\nimport { useResizeObserver } from '@/composables/resizeObserver'\nimport { useTextColor } from '@/composables/color'\n\n// Utilities\nimport { computed, ref, toRef, watchEffect } from 'vue'\nimport { convertToUnit, genericComponent, useRender } from '@/util'\n\n// Types\nimport type { PropType } from 'vue'\n\nexport const VProgressCircular = genericComponent()({\n name: 'VProgressCircular',\n\n props: {\n bgColor: String,\n color: String,\n indeterminate: [Boolean, String] as PropType<boolean | 'disable-shrink'>,\n modelValue: {\n type: [Number, String],\n default: 0,\n },\n rotate: {\n type: [Number, String],\n default: 0,\n },\n width: {\n type: [Number, String],\n default: 4,\n },\n\n ...makeSizeProps(),\n ...makeTagProps({ tag: 'div' }),\n ...makeThemeProps(),\n },\n\n setup (props, { slots }) {\n const MAGIC_RADIUS_CONSTANT = 20\n const CIRCUMFERENCE = 2 * Math.PI * MAGIC_RADIUS_CONSTANT\n\n const root = ref<HTMLElement>()\n\n const { themeClasses } = provideTheme(props)\n const { sizeClasses, sizeStyles } = useSize(props)\n const { textColorClasses, textColorStyles } = useTextColor(toRef(props, 'color'))\n const { textColorClasses: underlayColorClasses, textColorStyles: underlayColorStyles } = useTextColor(toRef(props, 'bgColor'))\n const { intersectionRef, isIntersecting } = useIntersectionObserver()\n const { resizeRef, contentRect } = useResizeObserver()\n\n const normalizedValue = computed(() => Math.max(0, Math.min(100, parseFloat(props.modelValue))))\n const width = computed(() => Number(props.width))\n const size = computed(() => {\n // Get size from element if size prop value is small, large etc\n return sizeStyles.value\n ? Number(props.size)\n : contentRect.value\n ? contentRect.value.width\n : Math.max(width.value, 32)\n })\n const diameter = computed(() => (MAGIC_RADIUS_CONSTANT / (1 - width.value / size.value)) * 2)\n const strokeWidth = computed(() => width.value / size.value * diameter.value)\n const strokeDashOffset = computed(() => convertToUnit(((100 - normalizedValue.value) / 100) * CIRCUMFERENCE))\n\n watchEffect(() => {\n intersectionRef.value = root.value\n resizeRef.value = root.value\n })\n\n useRender(() => (\n <props.tag\n ref={ root }\n class={[\n 'v-progress-circular',\n {\n 'v-progress-circular--indeterminate': !!props.indeterminate,\n 'v-progress-circular--visible': isIntersecting.value,\n 'v-progress-circular--disable-shrink': props.indeterminate === 'disable-shrink',\n },\n themeClasses.value,\n sizeClasses.value,\n textColorClasses.value,\n ]}\n style={[\n sizeStyles.value,\n textColorStyles.value,\n ]}\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n aria-valuenow={ props.indeterminate ? undefined : normalizedValue.value }\n >\n <svg\n style={{\n transform: `rotate(calc(-90deg + ${Number(props.rotate)}deg))`,\n }}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={ `0 0 ${diameter.value} ${diameter.value}` }\n >\n <circle\n class={[\n 'v-progress-circular__underlay',\n underlayColorClasses.value,\n ]}\n style={ underlayColorStyles.value }\n fill=\"transparent\"\n cx=\"50%\"\n cy=\"50%\"\n r={ MAGIC_RADIUS_CONSTANT }\n stroke-width={ strokeWidth.value }\n stroke-dasharray={ CIRCUMFERENCE }\n stroke-dashoffset={ 0 }\n />\n\n <circle\n class=\"v-progress-circular__overlay\"\n fill=\"transparent\"\n cx=\"50%\"\n cy=\"50%\"\n r={ MAGIC_RADIUS_CONSTANT }\n stroke-width={ strokeWidth.value }\n stroke-dasharray={ CIRCUMFERENCE }\n stroke-dashoffset={ strokeDashOffset.value }\n />\n </svg>\n\n { slots.default && (\n <div class=\"v-progress-circular__content\">\n { slots.default({ value: normalizedValue.value }) }\n </div>\n ) }\n </props.tag>\n ))\n\n return {}\n },\n})\n\nexport type VProgressCircular = InstanceType<typeof VProgressCircular>\n"],"mappings":"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"}