UNPKG

quasar

Version:

Build high-performance VueJS user interfaces (SPA, PWA, SSR, Mobile and Desktop) in record time

130 lines (107 loc) 3.8 kB
import { h, computed, getCurrentInstance } from 'vue' import useDark, { useDarkProps } from '../../composables/private/use-dark.js' import useSize, { useSizeProps } from '../../composables/private/use-size.js' import { createComponent } from '../../utils/private/create.js' import { hMergeSlot } from '../../utils/private/render.js' const defaultSizes = { xs: 2, sm: 4, md: 6, lg: 10, xl: 14 } function width (val, reverse, $q) { return { transform: reverse === true ? `translateX(${ $q.lang.rtl === true ? '-' : '' }100%) scale3d(${ -val },1,1)` : `scale3d(${ val },1,1)` } } export default createComponent({ name: 'QLinearProgress', props: { ...useDarkProps, ...useSizeProps, value: { type: Number, default: 0 }, buffer: Number, color: String, trackColor: String, reverse: Boolean, stripe: Boolean, indeterminate: Boolean, query: Boolean, rounded: Boolean, animationSpeed: { type: [ String, Number ], default: 2100 }, instantFeedback: Boolean }, setup (props, { slots }) { const { proxy } = getCurrentInstance() const isDark = useDark(props, proxy.$q) const sizeStyle = useSize(props, defaultSizes) const motion = computed(() => props.indeterminate === true || props.query === true) const widthReverse = computed(() => props.reverse !== props.query) const style = computed(() => ({ ...(sizeStyle.value !== null ? sizeStyle.value : {}), '--q-linear-progress-speed': `${ props.animationSpeed }ms` })) const classes = computed(() => 'q-linear-progress' + (props.color !== void 0 ? ` text-${ props.color }` : '') + (props.reverse === true || props.query === true ? ' q-linear-progress--reverse' : '') + (props.rounded === true ? ' rounded-borders' : '') ) const trackStyle = computed(() => width(props.buffer !== void 0 ? props.buffer : 1, widthReverse.value, proxy.$q)) const transitionSuffix = computed(() => `with${ props.instantFeedback === true ? 'out' : '' }-transition`) const trackClass = computed(() => 'q-linear-progress__track absolute-full' + ` q-linear-progress__track--${ transitionSuffix.value }` + ` q-linear-progress__track--${ isDark.value === true ? 'dark' : 'light' }` + (props.trackColor !== void 0 ? ` bg-${ props.trackColor }` : '') ) const modelStyle = computed(() => width(motion.value === true ? 1 : props.value, widthReverse.value, proxy.$q)) const modelClass = computed(() => 'q-linear-progress__model absolute-full' + ` q-linear-progress__model--${ transitionSuffix.value }` + ` q-linear-progress__model--${ motion.value === true ? 'in' : '' }determinate` ) const stripeStyle = computed(() => ({ width: `${ props.value * 100 }%` })) const stripeClass = computed(() => `q-linear-progress__stripe absolute-${ props.reverse === true ? 'right' : 'left' }` + ` q-linear-progress__stripe--${ transitionSuffix.value }` ) return () => { const child = [ h('div', { class: trackClass.value, style: trackStyle.value }), h('div', { class: modelClass.value, style: modelStyle.value }) ] props.stripe === true && motion.value === false && child.push( h('div', { class: stripeClass.value, style: stripeStyle.value }) ) return h('div', { class: classes.value, style: style.value, role: 'progressbar', 'aria-valuemin': 0, 'aria-valuemax': 1, 'aria-valuenow': props.indeterminate === true ? void 0 : props.value }, hMergeSlot(slots.default, child)) } } })