plugin-ui-for-kzt 0.0.23 → 0.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/0e28e37419c99ac65b12.png +0 -0
- package/dist/assets/264165b2b0e8a6840eb0.png +0 -0
- package/dist/components/BaseBadge/BaseBadge.vue.d.ts +2 -2
- package/dist/components/BaseButton/BaseButton.vue.d.ts +1 -1
- package/dist/components/BaseCalendar/BaseCalendar.vue.d.ts +10 -1
- package/dist/components/BaseCheckbox/BaseCheckbox.vue.d.ts +2 -2
- package/dist/components/{DataTable/DataTable.vue.d.ts → BaseDefaultPages/BaseDefaultPages.vue.d.ts} +8 -6
- package/dist/components/BaseDropdown/BaseDropdown.vue.d.ts +1 -1
- package/dist/components/BaseInput/BaseInput.vue.d.ts +4 -4
- package/dist/components/BaseInputCalendar/BaseInputCalendar.vue.d.ts +11 -4
- package/dist/components/BaseInputCurrency/BaseInputCurrency.vue.d.ts +3 -3
- package/dist/components/BaseInputEmail/BaseInputEmail.vue.d.ts +2 -2
- package/dist/components/BaseInputPhone/BaseInputPhone.vue.d.ts +2 -2
- package/dist/components/{Tooltip/Tooltip.vue.d.ts → BasePageLoader/BasePageLoader.vue.d.ts} +24 -11
- package/dist/components/BasePagination/BasePagination.vue.d.ts +1 -1
- package/dist/components/BaseRadio/BaseRadio.vue.d.ts +2 -2
- package/dist/components/BaseSegmentedButtons/BaseSegmentedButtons.vue.d.ts +1 -1
- package/dist/components/BaseSelect/BaseSelect.vue.d.ts +2 -2
- package/dist/components/BaseTable/BaseTable.vue.d.ts +44 -0
- package/dist/components/BaseTag/BaseTag.vue.d.ts +1 -1
- package/dist/components/BaseTextarea/BaseTextarea.vue.d.ts +2 -2
- package/dist/components/BaseToast/BaseToast.vue.d.ts +69 -0
- package/dist/components/BaseToggle/BaseToggle.vue.d.ts +2 -2
- package/dist/composables/useToast.d.ts +2 -0
- package/dist/index.d.ts +6 -5
- package/dist/index.js +1 -1
- package/dist/plugins/toastPlugin.d.ts +4 -0
- package/dist/sprite.svg +1 -1
- package/dist/store/toast.d.ts +8 -0
- package/example/App.vue +12 -38
- package/package.json +1 -1
- package/src/assets/404.png +0 -0
- package/src/assets/icons/arrow-down-stick.svg +4 -0
- package/src/assets/icons/edit-table.svg +5 -0
- package/src/assets/icons/ellipsis.svg +5 -0
- package/src/assets/icons/loading-page-default.svg +4 -0
- package/src/assets/icons/loading-page-error.svg +6 -0
- package/src/assets/icons/loading-page-success.svg +5 -0
- package/src/assets/icons/loading-page-warning.svg +6 -0
- package/src/assets/icons/more-dots.svg +5 -0
- package/src/assets/icons/time-table.svg +7 -0
- package/src/assets/icons/toast-error.svg +3 -0
- package/src/assets/icons/toast-info.svg +3 -0
- package/src/assets/icons/toast-success.svg +3 -0
- package/src/assets/icons/toast-warning.svg +3 -0
- package/src/assets/icons/trash-table.svg +7 -0
- package/src/assets/tech-work.png +0 -0
- package/src/components/BaseCalendar/BaseCalendar.vue +2 -0
- package/src/components/BaseChips/BaseChips.vue +3 -1
- package/src/components/BaseDefaultPages/BaseDefaultPages.vue +140 -0
- package/src/components/BaseDefaultPages/README.md +128 -0
- package/src/components/BaseOpenedListItem/BaseOpenedListItem.vue +3 -3
- package/src/components/BasePageLoader/BasePageLoader.vue +211 -0
- package/src/components/BasePageLoader/README.md +80 -0
- package/src/components/BaseSelect/BaseSelect.vue +8 -3
- package/src/components/BaseTable/BaseTable.vue +411 -0
- package/src/components/BaseTable/README.md +294 -0
- package/src/components/BaseToast/BaseToast.vue +200 -0
- package/src/components/BaseToast/README.md +103 -0
- package/src/components/BaseTooltip/BaseTooltip.vue +1 -0
- package/src/components/BaseUpload/BaseUpload.vue +1 -1
- package/src/composables/useToast.ts +10 -0
- package/src/index.ts +17 -13
- package/src/plugins/toastPlugin.ts +100 -0
- package/src/store/toast.ts +59 -0
- package/src/styles/root.scss +2 -0
- package/src/styles/toast.scss +36 -0
- package/src/types/calendar.d.ts +1 -0
- package/src/types/default-pages.d.ts +6 -0
- package/src/types/loading-page.d.ts +12 -0
- package/src/types/pagination.d.ts +1 -0
- package/src/types/table.d.ts +33 -0
- package/src/types/toast.d.ts +25 -0
- package/webpack.config.js +12 -0
- package/dist/components/Spinner/Spinner.vue.d.ts +0 -20
- package/dist/components/Toaster/Toaster.vue.d.ts +0 -80
- package/dist/components/Toaster/timer.d.ts +0 -12
- package/dist/plugins/toasterPlugin.d.ts +0 -26
- package/src/components/DataTable/DataTable.vue +0 -169
- package/src/components/DataTable/README.md +0 -57
- package/src/components/Spinner/README.md +0 -35
- package/src/components/Spinner/Spinner.vue +0 -60
- package/src/components/Toaster/README.md +0 -70
- package/src/components/Toaster/Toaster.vue +0 -235
- package/src/components/Toaster/timer.ts +0 -45
- package/src/components/Tooltip/README.md +0 -37
- package/src/components/Tooltip/Tooltip.vue +0 -96
- package/src/components/icons/CloseIcon.vue +0 -5
- package/src/components/icons/ErrorIcon.vue +0 -7
- package/src/components/icons/InfoIcon.vue +0 -7
- package/src/components/icons/SuccessIcon.vue +0 -6
- package/src/components/icons/WarningIcon.vue +0 -7
- package/src/plugins/toasterPlugin.ts +0 -179
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="base-default-pages">
|
|
3
|
+
<div class="base-default-pages__wrapper">
|
|
4
|
+
<div
|
|
5
|
+
class="base-default-pages__image-container"
|
|
6
|
+
:class="imageContainer"
|
|
7
|
+
>
|
|
8
|
+
<img
|
|
9
|
+
:src="imagePath"
|
|
10
|
+
alt="image"
|
|
11
|
+
class="base-default-pages__image"
|
|
12
|
+
/>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="base-default-pages__content">
|
|
15
|
+
<div class="base-default-pages__text-wrapper">
|
|
16
|
+
<h1 class="base-default-pages__title">{{ title }}</h1>
|
|
17
|
+
<p class="base-default-pages__description">{{ description }}</p>
|
|
18
|
+
</div>
|
|
19
|
+
<base-button
|
|
20
|
+
size="medium"
|
|
21
|
+
color="primary"
|
|
22
|
+
class="base-default-pages__button"
|
|
23
|
+
@click="$emit('click-button')"
|
|
24
|
+
>
|
|
25
|
+
{{ buttonText }}
|
|
26
|
+
</base-button>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</template>
|
|
31
|
+
|
|
32
|
+
<script setup lang="ts">
|
|
33
|
+
import { computed } from 'vue';
|
|
34
|
+
import BaseButton from '../BaseButton/BaseButton.vue';
|
|
35
|
+
import type { IDefaultPagesProps } from '../../types/default-pages';
|
|
36
|
+
|
|
37
|
+
const props = defineProps<IDefaultPagesProps>();
|
|
38
|
+
|
|
39
|
+
const imagePath = computed(()=> require(`@/assets/${props.type}.png`))
|
|
40
|
+
const imageContainer = computed<string[]>(()=> [
|
|
41
|
+
`base-default-pages__image-container--${props.type}`
|
|
42
|
+
])
|
|
43
|
+
</script>
|
|
44
|
+
|
|
45
|
+
<style scoped lang="scss">
|
|
46
|
+
@import '../../styles/variables';
|
|
47
|
+
@import '../../styles/root';
|
|
48
|
+
|
|
49
|
+
.base-default-pages {
|
|
50
|
+
&,
|
|
51
|
+
&__wrapper,
|
|
52
|
+
&__text-wrapper,
|
|
53
|
+
&__content {
|
|
54
|
+
display: flex;
|
|
55
|
+
flex-direction: column;
|
|
56
|
+
align-items: center;
|
|
57
|
+
text-align: center;
|
|
58
|
+
width: 100%;
|
|
59
|
+
height: 100%;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&__wrapper {
|
|
63
|
+
align-items: center;
|
|
64
|
+
justify-content: center;
|
|
65
|
+
gap: var(--spacing-l);
|
|
66
|
+
max-width: 996px;
|
|
67
|
+
background: var(--bg-light);
|
|
68
|
+
padding: var(--spacing-l) 0;
|
|
69
|
+
|
|
70
|
+
@media #{$tablet} {
|
|
71
|
+
gap: 0;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
&__title {
|
|
76
|
+
font: var(--typography-h3-medium);
|
|
77
|
+
color: var(--primary-text-primary);
|
|
78
|
+
|
|
79
|
+
@media #{$tablet} {
|
|
80
|
+
font: var(--typography-h1-medium);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
&__description {
|
|
85
|
+
font: var(--typography-text-m-regular);
|
|
86
|
+
color: var(--primary-text-tertiary);
|
|
87
|
+
|
|
88
|
+
@media #{$tablet} {
|
|
89
|
+
font: var(--typography-h4-regular);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
&__text-wrapper {
|
|
94
|
+
gap: var(--spacing-s);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
&__content {
|
|
98
|
+
gap: var(--spacing-2xl);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
&__image {
|
|
102
|
+
width: 100%;
|
|
103
|
+
height: 100%;
|
|
104
|
+
object-fit: cover;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
&__image-container {
|
|
108
|
+
width: 100%;
|
|
109
|
+
height: 100%;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
&__image-container--tech-work {
|
|
113
|
+
max-width: 334px;
|
|
114
|
+
max-height: 345px;
|
|
115
|
+
|
|
116
|
+
@media #{$tablet} {
|
|
117
|
+
max-width: 595px;
|
|
118
|
+
max-height: 614px;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
&__image-container--404 {
|
|
123
|
+
max-width: 335px;
|
|
124
|
+
max-height: 249px;
|
|
125
|
+
|
|
126
|
+
@media #{$tablet} {
|
|
127
|
+
max-width: 996px;
|
|
128
|
+
max-height: 614px;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
&__button {
|
|
133
|
+
width: 100%;
|
|
134
|
+
|
|
135
|
+
@media #{$tablet} {
|
|
136
|
+
max-width: 335px;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
</style>
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# 📚 Документация компонента **BaseDefaultPages.vue**
|
|
2
|
+
|
|
3
|
+
> **Назначение** – единый «шаблон страниц» (404, технические работы и т.п.), который выводит заголовок, описание, кнопку и сопутствующую иллюстрацию.
|
|
4
|
+
> Компонент полностью стилизован через BEM‑классы, использует переменные CSS (см. `variables.scss` и `root.scss`) и поддерживает адаптивную разметку.
|
|
5
|
+
|
|
6
|
+
## <a name="api-компонента"></a>API компонента
|
|
7
|
+
|
|
8
|
+
### <a name="пропсы"></a>Пропсы
|
|
9
|
+
|
|
10
|
+
| Prop | Тип | Обязательность | Описание | Пример значения |
|
|
11
|
+
|--------------|--------------------------------------|----------------|------------------------------------------------------------------------------------------------|-----------------|
|
|
12
|
+
| `title` | `string` | **да** | Текст заголовка ( `<h1>` ). | `"Ошибка 404"` |
|
|
13
|
+
| `description`| `string` | **да** | Текст описания под заголовком ( `<p>` ). | `"Неправильно набранный адрес..."` |
|
|
14
|
+
| `buttonText` | `string` | **да** | Текст кнопки **BaseButton**. | `"На главную"` |
|
|
15
|
+
| `type` | `'tech-work' \| '404'` | **да** | Ключ, который определяет: <br>· Какой PNG‑файл будет подгружен (`tech-work.png` / `404.png`).<br>· Какой BEM‑модификатор будет добавлен к контейнеру изображения (`base-default-pages__image-container--tech-work` / `...--404`). | `'404'` |
|
|
16
|
+
|
|
17
|
+
> **Тип `type`** жестко ограничен перечислением. При добавлении нового типа необходимо расширить тип и добавить соответствующие стили/изображения (см. раздел **[Как добавить новый тип страницы]**).
|
|
18
|
+
|
|
19
|
+
### <a name="тип-iddefaultpagesprops"></a>Тип `IDefaultPagesProps`
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
/**
|
|
23
|
+
* Параметры компонента BaseDefaultPages.
|
|
24
|
+
*
|
|
25
|
+
* @property {string} title Заголовок страницы.
|
|
26
|
+
* @property {string} description Описание (подзаголовок).
|
|
27
|
+
* @property {string} buttonText Текст кнопки.
|
|
28
|
+
* @property {'tech-work'|'404'} type Тип страницы, определяющий изображение и размеры.
|
|
29
|
+
*/
|
|
30
|
+
export interface IDefaultPagesProps {
|
|
31
|
+
title: string;
|
|
32
|
+
description: string;
|
|
33
|
+
buttonText: string;
|
|
34
|
+
type: 'tech-work' | '404';
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### <a name="вычисляемые-свойства"></a>Внутренние вычисляемые свойства
|
|
39
|
+
|
|
40
|
+
| Свойство | Тип | Описание |
|
|
41
|
+
|----------|------|----------|
|
|
42
|
+
| `imagePath` | `ComputedRef<string>` | Генерирует путь к изображению: `require('@/assets/${props.type}.png')`. При смене `type` автоматически меняет изображение. |
|
|
43
|
+
| `imageContainer` | `ComputedRef<string[]>` | Возвращает массив CSS‑классов, включающий модификатор: `['base-default-pages__image-container--${props.type}']`. Позволяет менять размеры контейнера в зависимости от типа. |
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## <a name="пример-использования"></a>Пример использования
|
|
48
|
+
|
|
49
|
+
```vue
|
|
50
|
+
<!-- DemoPage.vue -->
|
|
51
|
+
<template>
|
|
52
|
+
<div class="demo-page">
|
|
53
|
+
<h1>Plugin UI KZT – Компоненты</h1>
|
|
54
|
+
|
|
55
|
+
<section class="pages-list">
|
|
56
|
+
<!-- 404 -->
|
|
57
|
+
<BaseDefaultPages v-bind="data404" @click-button="goHome" />
|
|
58
|
+
|
|
59
|
+
<!-- Технические работы -->
|
|
60
|
+
<BaseDefaultPages v-bind="dataTechWork" @click-button="goHome" />
|
|
61
|
+
</section>
|
|
62
|
+
</div>
|
|
63
|
+
</template>
|
|
64
|
+
|
|
65
|
+
<script setup lang="ts">
|
|
66
|
+
import { ref } from 'vue';
|
|
67
|
+
import BaseDefaultPages from '@/components/BaseDefaultPages/BaseDefaultPages.vue';
|
|
68
|
+
|
|
69
|
+
const data404 = ref({
|
|
70
|
+
title: 'Ошибка 404',
|
|
71
|
+
description:
|
|
72
|
+
'Неправильно набранный адрес, или такой страницы больше не существует',
|
|
73
|
+
buttonText: 'На главную',
|
|
74
|
+
type: '404',
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const dataTechWork = ref({
|
|
78
|
+
title: 'Технические работы',
|
|
79
|
+
description: 'Приносим свои извинения, попробуйте зайти позже',
|
|
80
|
+
buttonText: 'На главную',
|
|
81
|
+
type: 'tech-work',
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// Пример простого навигационного обратного вызова
|
|
85
|
+
const goHome = () => {
|
|
86
|
+
// например, router.push('/')
|
|
87
|
+
console.log('Перенаправление на главную');
|
|
88
|
+
};
|
|
89
|
+
</script>
|
|
90
|
+
|
|
91
|
+
<style scoped lang="scss">
|
|
92
|
+
.demo-page {
|
|
93
|
+
padding: var(--spacing-l);
|
|
94
|
+
}
|
|
95
|
+
.pages-list {
|
|
96
|
+
display: flex;
|
|
97
|
+
flex-direction: column;
|
|
98
|
+
gap: var(--spacing-2xl);
|
|
99
|
+
}
|
|
100
|
+
</style>
|
|
101
|
+
|
|
102
|
+
## <a name="как-добавить-новый-тип-страницы"></a>Как добавить новый тип страницы
|
|
103
|
+
|
|
104
|
+
1. **Добавьте PNG‑файл** в каталог `src/assets/` с именем `<new-type>.png` (например, `maintenance.png`).
|
|
105
|
+
2. **Обновите тип пропса** в `IDefaultPagesProps`:
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
export interface IDefaultPagesProps {
|
|
109
|
+
// …
|
|
110
|
+
type: 'tech-work' | '404' | 'maintenance';
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
3. **Создайте/добавьте модификатор** в SCSS:
|
|
115
|
+
|
|
116
|
+
```scss
|
|
117
|
+
.base-default-pages__image-container--maintenance {
|
|
118
|
+
max-width: 400px;
|
|
119
|
+
max-height: 300px;
|
|
120
|
+
|
|
121
|
+
@media #{$tablet} {
|
|
122
|
+
max-width: 800px;
|
|
123
|
+
max-height: 600px;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
4. **(Опционально) Добавьте адаптивные стили** для заголовка/описания, если требуется особый дизайн.
|
|
@@ -157,7 +157,7 @@ const actualComponent = computed(() => {
|
|
|
157
157
|
#{$item} {
|
|
158
158
|
&__wrapper {
|
|
159
159
|
gap: var(--spacing-s);
|
|
160
|
-
height: 40px;
|
|
160
|
+
min-height: 40px;
|
|
161
161
|
padding: var(--spacing-s) var(--spacing-2l);
|
|
162
162
|
}
|
|
163
163
|
|
|
@@ -177,7 +177,7 @@ const actualComponent = computed(() => {
|
|
|
177
177
|
#{$item} {
|
|
178
178
|
&__wrapper {
|
|
179
179
|
gap: var(--spacing-m);
|
|
180
|
-
height: 48px;
|
|
180
|
+
min-height: 48px;
|
|
181
181
|
padding: var(--spacing-m) var(--spacing-2l);
|
|
182
182
|
}
|
|
183
183
|
|
|
@@ -197,7 +197,7 @@ const actualComponent = computed(() => {
|
|
|
197
197
|
#{$item} {
|
|
198
198
|
&__wrapper {
|
|
199
199
|
gap: var(--spacing-l);
|
|
200
|
-
height: 60px;
|
|
200
|
+
min-height: 60px;
|
|
201
201
|
padding: var(--spacing-2l) var(--spacing-l);
|
|
202
202
|
}
|
|
203
203
|
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="base-page-loader" :class="classList" :aria-busy="loading">
|
|
3
|
+
<div class="base-page-loader__overlay" :class="{ 'base-page-loader__overlay--modal': modal }"></div>
|
|
4
|
+
<div class="base-page-loader__wrapper">
|
|
5
|
+
<div class="base-page-loader__icon-container">
|
|
6
|
+
<transition-group name="icon-fade" tag="div">
|
|
7
|
+
<base-icon
|
|
8
|
+
v-if="loading"
|
|
9
|
+
key="loading"
|
|
10
|
+
class="base-page-loader__icon base-page-loader__icon--animation"
|
|
11
|
+
size="custom"
|
|
12
|
+
name="loading-page-default"
|
|
13
|
+
/>
|
|
14
|
+
<base-icon
|
|
15
|
+
v-else-if="iconType"
|
|
16
|
+
key="status"
|
|
17
|
+
class="base-page-loader__icon base-page-loader__icon--after-loading"
|
|
18
|
+
size="custom"
|
|
19
|
+
:name="iconName"
|
|
20
|
+
/>
|
|
21
|
+
</transition-group>
|
|
22
|
+
</div>
|
|
23
|
+
<transition name="icon-fade">
|
|
24
|
+
<div v-if="message" class="base-page-loader__message">
|
|
25
|
+
{{ message }}
|
|
26
|
+
</div>
|
|
27
|
+
</transition>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</template>
|
|
31
|
+
|
|
32
|
+
<script setup lang="ts">
|
|
33
|
+
import { computed } from 'vue';
|
|
34
|
+
import BaseIcon from '../BaseIcon/BaseIcon.vue';
|
|
35
|
+
import { useKitSize } from '../../composables/kit/size';
|
|
36
|
+
import type { TPageLoaderProps } from '../../types/loading-page';
|
|
37
|
+
|
|
38
|
+
const props = withDefaults(defineProps<TPageLoaderProps>(), {
|
|
39
|
+
size: 'medium',
|
|
40
|
+
loading: true,
|
|
41
|
+
message: '',
|
|
42
|
+
modal: false,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const { sizeClassList } = useKitSize(props);
|
|
46
|
+
|
|
47
|
+
const classList = computed(() => [
|
|
48
|
+
...sizeClassList.value,
|
|
49
|
+
'base-page-loader',
|
|
50
|
+
{ '--modal': props.modal },
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
const iconName = computed(() => {
|
|
54
|
+
switch (props.iconType) {
|
|
55
|
+
case 'success':
|
|
56
|
+
return 'loading-page-success';
|
|
57
|
+
case 'warning':
|
|
58
|
+
return 'loading-page-warning';
|
|
59
|
+
case 'error':
|
|
60
|
+
return 'loading-page-error';
|
|
61
|
+
default:
|
|
62
|
+
return 'loading-page-success';
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
</script>
|
|
66
|
+
|
|
67
|
+
<style scoped lang="scss">
|
|
68
|
+
@import '../../styles/variables';
|
|
69
|
+
@import '../../styles/root';
|
|
70
|
+
|
|
71
|
+
.base-page-loader {
|
|
72
|
+
$loader: &;
|
|
73
|
+
|
|
74
|
+
position: relative;
|
|
75
|
+
width: 100%;
|
|
76
|
+
height: 100%;
|
|
77
|
+
display: flex;
|
|
78
|
+
align-items: center;
|
|
79
|
+
justify-content: center;
|
|
80
|
+
z-index: 1000;
|
|
81
|
+
|
|
82
|
+
&__overlay {
|
|
83
|
+
position: absolute;
|
|
84
|
+
top: 0;
|
|
85
|
+
left: 0;
|
|
86
|
+
width: 100%;
|
|
87
|
+
height: 100%;
|
|
88
|
+
background: rgba(0, 0, 0, 0.5);
|
|
89
|
+
z-index: 1;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
&__wrapper {
|
|
93
|
+
position: relative;
|
|
94
|
+
z-index: 2;
|
|
95
|
+
display: flex;
|
|
96
|
+
flex-direction: column;
|
|
97
|
+
align-items: center;
|
|
98
|
+
justify-content: center;
|
|
99
|
+
gap: 12px;
|
|
100
|
+
width: auto;
|
|
101
|
+
min-width: 120px;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
&__icon-container {
|
|
105
|
+
position: relative;
|
|
106
|
+
width: 56px;
|
|
107
|
+
height: 56px;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
&__icon {
|
|
111
|
+
position: absolute;
|
|
112
|
+
top: 0;
|
|
113
|
+
left: 0;
|
|
114
|
+
|
|
115
|
+
&--animation {
|
|
116
|
+
animation: loader-circle 1s linear infinite;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
&__message {
|
|
121
|
+
font: var(--typography-text-m-regular);
|
|
122
|
+
color: var(--primary-text-primary);
|
|
123
|
+
text-align: center;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
&.--small-size {
|
|
127
|
+
#{$loader}__icon-container {
|
|
128
|
+
width: 32px;
|
|
129
|
+
height: 32px;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
#{$loader}__icon {
|
|
133
|
+
width: 32px;
|
|
134
|
+
height: 32px;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
#{$loader}__message {
|
|
138
|
+
font: var(--typography-text-s-regular);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
&.--medium-size {
|
|
143
|
+
#{$loader}__icon-container {
|
|
144
|
+
width: 48px;
|
|
145
|
+
height: 48px;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
#{$loader}__icon {
|
|
149
|
+
width: 48px;
|
|
150
|
+
height: 48px;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
#{$loader}__message {
|
|
154
|
+
font: var(--typography-text-m-regular);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
&.--large-size {
|
|
159
|
+
#{$loader}__icon-container {
|
|
160
|
+
width: 56px;
|
|
161
|
+
height: 56px;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
#{$loader}__icon {
|
|
165
|
+
width: 56px;
|
|
166
|
+
height: 56px;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
#{$loader}__message {
|
|
170
|
+
font: var(--typography-text-l-regular);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
&.--modal {
|
|
175
|
+
#{$loader}__overlay {
|
|
176
|
+
background: rgba(0, 0, 0, 0.7);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
#{$loader}__wrapper {
|
|
180
|
+
background: var(--bg-light);
|
|
181
|
+
border-radius: 20px;
|
|
182
|
+
padding: 48px 120px;
|
|
183
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
@keyframes loader-circle {
|
|
189
|
+
0% {
|
|
190
|
+
transform: rotate(0deg);
|
|
191
|
+
}
|
|
192
|
+
100% {
|
|
193
|
+
transform: rotate(360deg);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.icon-fade-enter-active,
|
|
198
|
+
.icon-fade-leave-active {
|
|
199
|
+
transition: opacity 0.3s ease;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.icon-fade-enter-from,
|
|
203
|
+
.icon-fade-leave-to {
|
|
204
|
+
opacity: 0;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.icon-fade-enter-to,
|
|
208
|
+
.icon-fade-leave-from {
|
|
209
|
+
opacity: 1;
|
|
210
|
+
}
|
|
211
|
+
</style>
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
BasePageLoader — это переиспользуемый Vue 3 компонент для отображения индикатора загрузки с опциональным оверлеем, текстом и иконками состояния. Компонент предназначен для показа процесса загрузки и результатов (успех, предупреждение, ошибка) с плавными анимациями.
|
|
2
|
+
|
|
3
|
+
Оверлей: Полупрозрачный фон, покрывающий всё пространство компонента, с возможностью настройки для модального режима.
|
|
4
|
+
Иконки: Показывает анимированную иконку загрузки во время loading: true и иконку состояния (success, warning, error) при loading: false.
|
|
5
|
+
Анимации: Плавное переключение иконок с использованием opacity для избежания "прыжков".
|
|
6
|
+
Сообщение: Опциональный текст, отображаемый под иконкой, с плавным появлением/исчезновением.
|
|
7
|
+
Модальный режим: Поддержка отображения контента в виде модального окна с белым фоном и тенью.
|
|
8
|
+
Размеры: Поддержка трех размеров (small, medium, large) для иконок.
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
Пропсы
|
|
12
|
+
|
|
13
|
+
size - string - medium
|
|
14
|
+
Размер компонента: small, medium, large. Влияет на размер иконки и текста.
|
|
15
|
+
|
|
16
|
+
loading - boolean - true
|
|
17
|
+
Показывает иконку загрузки, если true, или иконку состояния, если false.
|
|
18
|
+
|
|
19
|
+
iconType - TIconType ( success | error | warning ) - success
|
|
20
|
+
Тип иконки состояния, отображаемой после загрузки.
|
|
21
|
+
|
|
22
|
+
message - string - ''
|
|
23
|
+
Опциональный текст сообщения, отображаемый под иконкой.
|
|
24
|
+
|
|
25
|
+
modal - boolean - false
|
|
26
|
+
Включает модальный режим с белым фоном и тенью для контента.
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
Использование
|
|
30
|
+
Базовый пример
|
|
31
|
+
<template>
|
|
32
|
+
<div style="width: 100%; height: 400px;">
|
|
33
|
+
<BasePageLoader
|
|
34
|
+
:loading="isLoading"
|
|
35
|
+
iconType="success"
|
|
36
|
+
message="Processing your request..."
|
|
37
|
+
size="large"
|
|
38
|
+
/>
|
|
39
|
+
</div>
|
|
40
|
+
</template>
|
|
41
|
+
|
|
42
|
+
<script setup lang="ts">
|
|
43
|
+
import { ref } from 'vue';
|
|
44
|
+
import BasePageLoader from './BasePageLoader.vue';
|
|
45
|
+
|
|
46
|
+
const isLoading = ref(true);
|
|
47
|
+
|
|
48
|
+
// Симуляция завершения загрузки
|
|
49
|
+
setTimeout(() => {
|
|
50
|
+
isLoading.value = false;
|
|
51
|
+
}, 3000);
|
|
52
|
+
</script>
|
|
53
|
+
|
|
54
|
+
Модальный режим
|
|
55
|
+
<template>
|
|
56
|
+
<div style="width: 100%; height: 400px;">
|
|
57
|
+
<BasePageLoader
|
|
58
|
+
:loading="isLoading"
|
|
59
|
+
iconType="error"
|
|
60
|
+
message="An error occurred"
|
|
61
|
+
size="medium"
|
|
62
|
+
:modal="true"
|
|
63
|
+
/>
|
|
64
|
+
</div>
|
|
65
|
+
</template>
|
|
66
|
+
|
|
67
|
+
<script setup lang="ts">
|
|
68
|
+
import { ref } from 'vue';
|
|
69
|
+
import BasePageLoader from './BasePageLoader.vue';
|
|
70
|
+
|
|
71
|
+
const isLoading = ref(true);
|
|
72
|
+
|
|
73
|
+
setTimeout(() => {
|
|
74
|
+
isLoading.value = false;
|
|
75
|
+
}, 3000);
|
|
76
|
+
</script>
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
Модальный режим
|
|
80
|
+
В модальном режиме (modal: true):
|
|
@@ -98,6 +98,7 @@ import 'vue-virtual-scroller/dist/vue-virtual-scroller.css';
|
|
|
98
98
|
import { DynamicScroller, DynamicScrollerItem } from 'vue-virtual-scroller';
|
|
99
99
|
import type { ICoreSelectProps, TSelectValue, ICoreSelectBaseProps, ICoreSelectOption, ISelectSlotProps } from '../../types/input';
|
|
100
100
|
import BaseDropdown from '../BaseDropdown/BaseDropdown.vue';
|
|
101
|
+
import BaseIcon from '../BaseIcon/BaseIcon.vue';
|
|
101
102
|
import BaseOpenedListItem from '../BaseOpenedListItem/BaseOpenedListItem.vue';
|
|
102
103
|
import { useKitSize } from '../../composables/kit/size';
|
|
103
104
|
import { useKitState } from '../../composables/kit/state';
|
|
@@ -222,6 +223,10 @@ defineSlots<{
|
|
|
222
223
|
border-radius: var(--corner-radius-m);
|
|
223
224
|
}
|
|
224
225
|
|
|
226
|
+
&__header_value {
|
|
227
|
+
color: var(--primary-text-primary);
|
|
228
|
+
}
|
|
229
|
+
|
|
225
230
|
&__placeholder {
|
|
226
231
|
@include text-clamp(1);
|
|
227
232
|
|
|
@@ -257,7 +262,7 @@ defineSlots<{
|
|
|
257
262
|
|
|
258
263
|
&.--small-size {
|
|
259
264
|
#{$select} {
|
|
260
|
-
&__header_value {
|
|
265
|
+
&__header_value, &__placeholder {
|
|
261
266
|
font: var(--typography-text-m-regular);
|
|
262
267
|
}
|
|
263
268
|
|
|
@@ -280,7 +285,7 @@ defineSlots<{
|
|
|
280
285
|
|
|
281
286
|
&.--medium-size {
|
|
282
287
|
#{$select} {
|
|
283
|
-
&__header_value {
|
|
288
|
+
&__header_value, &__placeholder {
|
|
284
289
|
font: var(--typography-text-m-regular);
|
|
285
290
|
}
|
|
286
291
|
|
|
@@ -298,7 +303,7 @@ defineSlots<{
|
|
|
298
303
|
|
|
299
304
|
&.--large-size {
|
|
300
305
|
#{$select} {
|
|
301
|
-
&__header_value {
|
|
306
|
+
&__header_value, &__placeholder {
|
|
302
307
|
font: var(--typography-text-l-regular);
|
|
303
308
|
}
|
|
304
309
|
|