# ZeenProgressBar
Компонент прогресс-бара
# Примеры:
- Дефолтная тема прогресс-бара(numberOfDone=25, numberOfTotal=50, progressBarPercentTime=10):
- Темная тема прогресс-бара(numberOfDone=25, numberOfTotal=50):
- Кастомная тема прогресс-бара(numberOfDone=14, numberOfTotal=50, progressBardBorderRadius=0, progressBarPercentBorderRadius=0, progressBarHeight='10', progressBarPercentTime='5', progressBarBackground: '#E2E1ED', progressBarPercentBackground: '#AAA2F5', progressBarPercentColor: '#A921A8', progressBarTotalColor: '#16123B'):
# props
Название | Тип | Обязательный | По умолчанию | Описание |
---|---|---|---|---|
progressBardBorderRadius | string | - | 10 | задает радиус скругления прогресс-бара |
progressBarPercentBorderRadius | string | - | 15 | задает радиус скругления процента прогресс-бара |
numberOfDone | number | - | 0 | количество выполненных заданий |
numberOfTotal | number | - | 100 | общее количество заданий |
progressBarHeight | string | - | 4 | высота прогресс-бара |
progressBarPercentTime | string | - | 2 | время для анимации загрузки индикатора прогресс-бара |
color | object | - | {} | объект с кастомными цветами (подробнее см.ниже) |
theme | string | - | light | доступны темы light и dark |
# Кастомные цвета в объекте color
Название | Тип | Обязательный | По умолчанию |
---|---|---|---|
progressBarBackground | background-color прогресс-бара | - | берет значение из темы ($progress-bar-background-color) |
progressBarPercentBackground | background-color процента прогресс-бара | - | берет значение из темы ($progress-bar-percent-background-color) |
progressBarPercentColor | color выполненных заданий и процента | - | берет значение из темы ($progress-bar-percent-color) |
progressBarTotalColor | color общего количества заданий | - | берет значение из темы ($progress-bar-total-color) |
# Source Code - исходный код компонента
<template>
<div class="zeen-progress-bar" :id="`zeen-progress-bar-${componentId}`">
<div class="zeen-progress-bar__wrapper">
<div class="zeen-progress-bar__width" :style="styleObjectProgressBarWidth"></div>
</div>
</div>
</template>
<script>
export default {
name: 'ZeenProgressBar',
props: {
theme: {
type: String,
default: 'light',
validator: (theme) => ['light', 'dark'].includes(theme),
},
color: {
type: Object,
default: () => {
return {}
},
},
numberOfDone: {
type: Number,
default: 0,
},
numberOfTotal: {
type: Number,
default: 100,
},
progressBarPercentTime: {
type: String,
default: '2',
},
progressPercent: {
type: Number,
default: 0,
},
},
computed: {
componentId() {
return this._uid
},
isDarkTheme() {
return this.theme === 'dark'
},
styleObjectProgressBarWidth() {
return {
'width': this.progressPercent + '%',
'--time': this.progressBarPercentTime + 's',
}
},
},
}
</script>
<style lang="scss">
:root {
/* Размеры */
--progress-bar-border-radius: var(--main-input-radius);
--progress-bar-height: 4px;
--progress-bar-percent-border-radius: 15px;
--progress-bar-text-offset: 12px;
--progress-bar-persent-font-size: var(--main-larger-size);
/* Цвета */
--progress-bar-background: var(--main-light-color);
--progress-bar-percent-background: var(--main-color);
--progress-bar-color: var(--text-color);
--progress-bar-total-color: var(--progress-bar-color);
}
</style>
<style lang="scss" scoped>
// todo удалить лишнее
.zeen-progress-bar {
&__text {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: var(--progress-bar-text-offset);
}
&__percent,
&__how {
font-weight: 600;
font-size: var(--progress-bar-persent-font-size);
line-height: 1.3;
}
&__percent,
&__done {
color: var(--progress-bar-color);
}
&__total {
color: var(--progress-bar-total-color);
}
&__wrapper {
width: 100%;
overflow: hidden;
position: relative;
border-radius: var(--progress-bar-border-radius);
background: var(--progress-bar-background);
height: var(--progress-bar-height);
}
&__width {
height: 100%;
transform-origin: left top;
transform: scaleX(0);
animation: scale var(--time) forwards;
border-radius: var(--progress-bar-percent-border-radius);
background: var(--progress-bar-percent-background);
}
}
@keyframes scale {
0% {
transform: scaleX(0);
}
100% {
transform: scaleX(1);
}
}
</style>