182 lines
6.5 KiB
JavaScript
182 lines
6.5 KiB
JavaScript
import { createVNode as _createVNode } from "vue";
|
|
// Styles
|
|
import "./VProgressLinear.css";
|
|
|
|
// Composables
|
|
import { useBackgroundColor, useTextColor } from "../../composables/color.mjs";
|
|
import { makeComponentProps } from "../../composables/component.mjs";
|
|
import { useIntersectionObserver } from "../../composables/intersectionObserver.mjs";
|
|
import { useRtl } from "../../composables/locale.mjs";
|
|
import { makeLocationProps, useLocation } from "../../composables/location.mjs";
|
|
import { useProxiedModel } from "../../composables/proxiedModel.mjs";
|
|
import { makeRoundedProps, useRounded } from "../../composables/rounded.mjs";
|
|
import { makeTagProps } from "../../composables/tag.mjs";
|
|
import { makeThemeProps, provideTheme } from "../../composables/theme.mjs"; // Utilities
|
|
import { computed, Transition } from 'vue';
|
|
import { convertToUnit, genericComponent, propsFactory, useRender } from "../../util/index.mjs";
|
|
export const makeVProgressLinearProps = propsFactory({
|
|
absolute: Boolean,
|
|
active: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
bgColor: String,
|
|
bgOpacity: [Number, String],
|
|
bufferValue: {
|
|
type: [Number, String],
|
|
default: 0
|
|
},
|
|
clickable: Boolean,
|
|
color: String,
|
|
height: {
|
|
type: [Number, String],
|
|
default: 4
|
|
},
|
|
indeterminate: Boolean,
|
|
max: {
|
|
type: [Number, String],
|
|
default: 100
|
|
},
|
|
modelValue: {
|
|
type: [Number, String],
|
|
default: 0
|
|
},
|
|
reverse: Boolean,
|
|
stream: Boolean,
|
|
striped: Boolean,
|
|
roundedBar: Boolean,
|
|
...makeComponentProps(),
|
|
...makeLocationProps({
|
|
location: 'top'
|
|
}),
|
|
...makeRoundedProps(),
|
|
...makeTagProps(),
|
|
...makeThemeProps()
|
|
}, 'VProgressLinear');
|
|
export const VProgressLinear = genericComponent()({
|
|
name: 'VProgressLinear',
|
|
props: makeVProgressLinearProps(),
|
|
emits: {
|
|
'update:modelValue': value => true
|
|
},
|
|
setup(props, _ref) {
|
|
let {
|
|
slots
|
|
} = _ref;
|
|
const progress = useProxiedModel(props, 'modelValue');
|
|
const {
|
|
isRtl,
|
|
rtlClasses
|
|
} = useRtl();
|
|
const {
|
|
themeClasses
|
|
} = provideTheme(props);
|
|
const {
|
|
locationStyles
|
|
} = useLocation(props);
|
|
const {
|
|
textColorClasses,
|
|
textColorStyles
|
|
} = useTextColor(props, 'color');
|
|
const {
|
|
backgroundColorClasses,
|
|
backgroundColorStyles
|
|
} = useBackgroundColor(computed(() => props.bgColor || props.color));
|
|
const {
|
|
backgroundColorClasses: barColorClasses,
|
|
backgroundColorStyles: barColorStyles
|
|
} = useBackgroundColor(props, 'color');
|
|
const {
|
|
roundedClasses
|
|
} = useRounded(props);
|
|
const {
|
|
intersectionRef,
|
|
isIntersecting
|
|
} = useIntersectionObserver();
|
|
const max = computed(() => parseInt(props.max, 10));
|
|
const height = computed(() => parseInt(props.height, 10));
|
|
const normalizedBuffer = computed(() => parseFloat(props.bufferValue) / max.value * 100);
|
|
const normalizedValue = computed(() => parseFloat(progress.value) / max.value * 100);
|
|
const isReversed = computed(() => isRtl.value !== props.reverse);
|
|
const transition = computed(() => props.indeterminate ? 'fade-transition' : 'slide-x-transition');
|
|
const opacity = computed(() => {
|
|
return props.bgOpacity == null ? props.bgOpacity : parseFloat(props.bgOpacity);
|
|
});
|
|
function handleClick(e) {
|
|
if (!intersectionRef.value) return;
|
|
const {
|
|
left,
|
|
right,
|
|
width
|
|
} = intersectionRef.value.getBoundingClientRect();
|
|
const value = isReversed.value ? width - e.clientX + (right - width) : e.clientX - left;
|
|
progress.value = Math.round(value / width * max.value);
|
|
}
|
|
useRender(() => _createVNode(props.tag, {
|
|
"ref": intersectionRef,
|
|
"class": ['v-progress-linear', {
|
|
'v-progress-linear--absolute': props.absolute,
|
|
'v-progress-linear--active': props.active && isIntersecting.value,
|
|
'v-progress-linear--reverse': isReversed.value,
|
|
'v-progress-linear--rounded': props.rounded,
|
|
'v-progress-linear--rounded-bar': props.roundedBar,
|
|
'v-progress-linear--striped': props.striped
|
|
}, roundedClasses.value, themeClasses.value, rtlClasses.value, props.class],
|
|
"style": [{
|
|
bottom: props.location === 'bottom' ? 0 : undefined,
|
|
top: props.location === 'top' ? 0 : undefined,
|
|
height: props.active ? convertToUnit(height.value) : 0,
|
|
'--v-progress-linear-height': convertToUnit(height.value),
|
|
...locationStyles.value
|
|
}, props.style],
|
|
"role": "progressbar",
|
|
"aria-hidden": props.active ? 'false' : 'true',
|
|
"aria-valuemin": "0",
|
|
"aria-valuemax": props.max,
|
|
"aria-valuenow": props.indeterminate ? undefined : normalizedValue.value,
|
|
"onClick": props.clickable && handleClick
|
|
}, {
|
|
default: () => [props.stream && _createVNode("div", {
|
|
"key": "stream",
|
|
"class": ['v-progress-linear__stream', textColorClasses.value],
|
|
"style": {
|
|
...textColorStyles.value,
|
|
[isReversed.value ? 'left' : 'right']: convertToUnit(-height.value),
|
|
borderTop: `${convertToUnit(height.value / 2)} dotted`,
|
|
opacity: opacity.value,
|
|
top: `calc(50% - ${convertToUnit(height.value / 4)})`,
|
|
width: convertToUnit(100 - normalizedBuffer.value, '%'),
|
|
'--v-progress-linear-stream-to': convertToUnit(height.value * (isReversed.value ? 1 : -1))
|
|
}
|
|
}, null), _createVNode("div", {
|
|
"class": ['v-progress-linear__background', backgroundColorClasses.value],
|
|
"style": [backgroundColorStyles.value, {
|
|
opacity: opacity.value,
|
|
width: convertToUnit(!props.stream ? 100 : normalizedBuffer.value, '%')
|
|
}]
|
|
}, null), _createVNode(Transition, {
|
|
"name": transition.value
|
|
}, {
|
|
default: () => [!props.indeterminate ? _createVNode("div", {
|
|
"class": ['v-progress-linear__determinate', barColorClasses.value],
|
|
"style": [barColorStyles.value, {
|
|
width: convertToUnit(normalizedValue.value, '%')
|
|
}]
|
|
}, null) : _createVNode("div", {
|
|
"class": "v-progress-linear__indeterminate"
|
|
}, [['long', 'short'].map(bar => _createVNode("div", {
|
|
"key": bar,
|
|
"class": ['v-progress-linear__indeterminate', bar, barColorClasses.value],
|
|
"style": barColorStyles.value
|
|
}, null))])]
|
|
}), slots.default && _createVNode("div", {
|
|
"class": "v-progress-linear__content"
|
|
}, [slots.default({
|
|
value: normalizedValue.value,
|
|
buffer: normalizedBuffer.value
|
|
})])]
|
|
}));
|
|
return {};
|
|
}
|
|
});
|
|
//# sourceMappingURL=VProgressLinear.mjs.map
|