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.
Files changed (93) hide show
  1. package/dist/assets/0e28e37419c99ac65b12.png +0 -0
  2. package/dist/assets/264165b2b0e8a6840eb0.png +0 -0
  3. package/dist/components/BaseBadge/BaseBadge.vue.d.ts +2 -2
  4. package/dist/components/BaseButton/BaseButton.vue.d.ts +1 -1
  5. package/dist/components/BaseCalendar/BaseCalendar.vue.d.ts +10 -1
  6. package/dist/components/BaseCheckbox/BaseCheckbox.vue.d.ts +2 -2
  7. package/dist/components/{DataTable/DataTable.vue.d.ts → BaseDefaultPages/BaseDefaultPages.vue.d.ts} +8 -6
  8. package/dist/components/BaseDropdown/BaseDropdown.vue.d.ts +1 -1
  9. package/dist/components/BaseInput/BaseInput.vue.d.ts +4 -4
  10. package/dist/components/BaseInputCalendar/BaseInputCalendar.vue.d.ts +11 -4
  11. package/dist/components/BaseInputCurrency/BaseInputCurrency.vue.d.ts +3 -3
  12. package/dist/components/BaseInputEmail/BaseInputEmail.vue.d.ts +2 -2
  13. package/dist/components/BaseInputPhone/BaseInputPhone.vue.d.ts +2 -2
  14. package/dist/components/{Tooltip/Tooltip.vue.d.ts → BasePageLoader/BasePageLoader.vue.d.ts} +24 -11
  15. package/dist/components/BasePagination/BasePagination.vue.d.ts +1 -1
  16. package/dist/components/BaseRadio/BaseRadio.vue.d.ts +2 -2
  17. package/dist/components/BaseSegmentedButtons/BaseSegmentedButtons.vue.d.ts +1 -1
  18. package/dist/components/BaseSelect/BaseSelect.vue.d.ts +2 -2
  19. package/dist/components/BaseTable/BaseTable.vue.d.ts +44 -0
  20. package/dist/components/BaseTag/BaseTag.vue.d.ts +1 -1
  21. package/dist/components/BaseTextarea/BaseTextarea.vue.d.ts +2 -2
  22. package/dist/components/BaseToast/BaseToast.vue.d.ts +69 -0
  23. package/dist/components/BaseToggle/BaseToggle.vue.d.ts +2 -2
  24. package/dist/composables/useToast.d.ts +2 -0
  25. package/dist/index.d.ts +6 -5
  26. package/dist/index.js +1 -1
  27. package/dist/plugins/toastPlugin.d.ts +4 -0
  28. package/dist/sprite.svg +1 -1
  29. package/dist/store/toast.d.ts +8 -0
  30. package/example/App.vue +12 -38
  31. package/package.json +1 -1
  32. package/src/assets/404.png +0 -0
  33. package/src/assets/icons/arrow-down-stick.svg +4 -0
  34. package/src/assets/icons/edit-table.svg +5 -0
  35. package/src/assets/icons/ellipsis.svg +5 -0
  36. package/src/assets/icons/loading-page-default.svg +4 -0
  37. package/src/assets/icons/loading-page-error.svg +6 -0
  38. package/src/assets/icons/loading-page-success.svg +5 -0
  39. package/src/assets/icons/loading-page-warning.svg +6 -0
  40. package/src/assets/icons/more-dots.svg +5 -0
  41. package/src/assets/icons/time-table.svg +7 -0
  42. package/src/assets/icons/toast-error.svg +3 -0
  43. package/src/assets/icons/toast-info.svg +3 -0
  44. package/src/assets/icons/toast-success.svg +3 -0
  45. package/src/assets/icons/toast-warning.svg +3 -0
  46. package/src/assets/icons/trash-table.svg +7 -0
  47. package/src/assets/tech-work.png +0 -0
  48. package/src/components/BaseCalendar/BaseCalendar.vue +2 -0
  49. package/src/components/BaseChips/BaseChips.vue +3 -1
  50. package/src/components/BaseDefaultPages/BaseDefaultPages.vue +140 -0
  51. package/src/components/BaseDefaultPages/README.md +128 -0
  52. package/src/components/BaseOpenedListItem/BaseOpenedListItem.vue +3 -3
  53. package/src/components/BasePageLoader/BasePageLoader.vue +211 -0
  54. package/src/components/BasePageLoader/README.md +80 -0
  55. package/src/components/BaseSelect/BaseSelect.vue +8 -3
  56. package/src/components/BaseTable/BaseTable.vue +411 -0
  57. package/src/components/BaseTable/README.md +294 -0
  58. package/src/components/BaseToast/BaseToast.vue +200 -0
  59. package/src/components/BaseToast/README.md +103 -0
  60. package/src/components/BaseTooltip/BaseTooltip.vue +1 -0
  61. package/src/components/BaseUpload/BaseUpload.vue +1 -1
  62. package/src/composables/useToast.ts +10 -0
  63. package/src/index.ts +17 -13
  64. package/src/plugins/toastPlugin.ts +100 -0
  65. package/src/store/toast.ts +59 -0
  66. package/src/styles/root.scss +2 -0
  67. package/src/styles/toast.scss +36 -0
  68. package/src/types/calendar.d.ts +1 -0
  69. package/src/types/default-pages.d.ts +6 -0
  70. package/src/types/loading-page.d.ts +12 -0
  71. package/src/types/pagination.d.ts +1 -0
  72. package/src/types/table.d.ts +33 -0
  73. package/src/types/toast.d.ts +25 -0
  74. package/webpack.config.js +12 -0
  75. package/dist/components/Spinner/Spinner.vue.d.ts +0 -20
  76. package/dist/components/Toaster/Toaster.vue.d.ts +0 -80
  77. package/dist/components/Toaster/timer.d.ts +0 -12
  78. package/dist/plugins/toasterPlugin.d.ts +0 -26
  79. package/src/components/DataTable/DataTable.vue +0 -169
  80. package/src/components/DataTable/README.md +0 -57
  81. package/src/components/Spinner/README.md +0 -35
  82. package/src/components/Spinner/Spinner.vue +0 -60
  83. package/src/components/Toaster/README.md +0 -70
  84. package/src/components/Toaster/Toaster.vue +0 -235
  85. package/src/components/Toaster/timer.ts +0 -45
  86. package/src/components/Tooltip/README.md +0 -37
  87. package/src/components/Tooltip/Tooltip.vue +0 -96
  88. package/src/components/icons/CloseIcon.vue +0 -5
  89. package/src/components/icons/ErrorIcon.vue +0 -7
  90. package/src/components/icons/InfoIcon.vue +0 -7
  91. package/src/components/icons/SuccessIcon.vue +0 -6
  92. package/src/components/icons/WarningIcon.vue +0 -7
  93. package/src/plugins/toasterPlugin.ts +0 -179
@@ -1,169 +0,0 @@
1
- <template>
2
- <div class="table-container">
3
- <div class="search-container">
4
- <input
5
- type="text"
6
- placeholder="Поиск..."
7
- :value="searchQuery"
8
- @input="handleSearchInput"
9
- />
10
- <p v-if="!searchExists">Ничего не найдено</p>
11
- </div>
12
-
13
- <table v-if="searchExists">
14
- <thead>
15
- <tr>
16
- <th v-for="column in props.columns" :key="column.key">
17
- {{ column.label }}
18
- </th>
19
- </tr>
20
- </thead>
21
- <tbody>
22
- <tr v-for="(row, rowIndex) in paginatedRows" :key="rowIndex">
23
- <td v-for="column in props.columns" :key="column.key">
24
- {{ row[column.key] }}
25
- </td>
26
- </tr>
27
- </tbody>
28
- </table>
29
-
30
- <div v-if="searchExists" class="pagination">
31
- <button @click="goToPreviousPage" :disabled="currentPage === 1">
32
- Предыдущая
33
- </button>
34
- <span>Страница {{ currentPage }} из {{ totalPages }}</span>
35
- <button @click="goToNextPage" :disabled="currentPage === totalPages">
36
- Следующая
37
- </button>
38
- </div>
39
- </div>
40
- </template>
41
-
42
- <script setup lang="ts">
43
- import {ref, computed} from 'vue';
44
-
45
- interface TableColumn {
46
- key: string;
47
- label: string;
48
- }
49
-
50
- interface TableProps {
51
- columns: TableColumn[];
52
- rows: Record<string, any>[];
53
- pageSize?: number;
54
- }
55
-
56
- const props = defineProps<TableProps>();
57
-
58
- // states
59
- const searchQuery = ref<string>('');
60
- const currentPage = ref<number>(1);
61
- const rowsPerPage = ref<number>(props.pageSize ?? 5);
62
-
63
- // computed properties
64
- const filteredRows = computed(() => {
65
- if (!searchQuery.value) {
66
- return props.rows;
67
- }
68
- const query = searchQuery.value.toLowerCase();
69
- return props.rows.filter((row: string | any) =>
70
- Object.values(row).some((val) =>
71
- String(val).toLowerCase().includes(query)
72
- )
73
- );
74
- });
75
- const searchExists = computed(() => filteredRows.value.length > 0);
76
- const totalPages = computed(() =>
77
- Math.ceil(filteredRows.value.length / rowsPerPage.value)
78
- );
79
- const startIndex = computed(() => (currentPage.value - 1) * rowsPerPage.value);
80
- const endIndex = computed(() => currentPage.value * rowsPerPage.value);
81
- const paginatedRows = computed(() =>
82
- filteredRows.value.slice(startIndex.value, endIndex.value)
83
- );
84
-
85
- // functions
86
- const goToPreviousPage = (): void => {
87
- if (currentPage.value > 1) {
88
- currentPage.value--;
89
- }
90
- }
91
- const goToNextPage = (): void => {
92
- if (currentPage.value < totalPages.value) {
93
- currentPage.value++;
94
- }
95
- }
96
- const handleSearchInput = (event: Event): void => {
97
- searchQuery.value = (event.target as HTMLInputElement).value;
98
- currentPage.value = 1;
99
- }
100
- </script>
101
-
102
- <style scoped lang="scss">
103
- .table-container {
104
- max-width: 100%;
105
- overflow-x: auto;
106
- padding: 1rem;
107
-
108
- .search-container {
109
- margin-bottom: 1rem;
110
-
111
- input {
112
- padding: 0.5rem;
113
- border: 1px solid #ccc;
114
- border-radius: 4px;
115
-
116
- &:focus {
117
- outline: none;
118
- border-color: #90caf9;
119
- }
120
- }
121
- }
122
-
123
- table {
124
- width: 100%;
125
- border-collapse: collapse;
126
- margin-bottom: 1rem;
127
-
128
- thead {
129
- background-color: #e3f2fd;
130
- }
131
-
132
- th, td {
133
- padding: 0.75rem 1rem;
134
- border: 1px solid #ccc;
135
- text-align: left;
136
- }
137
- }
138
-
139
- .pagination {
140
- display: flex;
141
- align-items: center;
142
- justify-content: flex-end;
143
-
144
- button {
145
- background-color: #90caf9;
146
- color: #fff;
147
- border: none;
148
- padding: 0.5rem 1rem;
149
- margin: 0 0.25rem;
150
- border-radius: 4px;
151
- cursor: pointer;
152
- transition: background-color 0.2s ease;
153
-
154
- &:hover:not(:disabled) {
155
- background-color: #64b5f6;
156
- }
157
-
158
- &:disabled {
159
- background-color: #ccc;
160
- cursor: not-allowed;
161
- }
162
- }
163
-
164
- span {
165
- margin: 0 0.5rem;
166
- }
167
- }
168
- }
169
- </style>
@@ -1,57 +0,0 @@
1
- # Документация компонента DataTable
2
-
3
- ## Обзор
4
- Компонент `DataTable` предназначен для отображения табличных данных с поддержкой поиска и постраничной навигации. Он позволяет передавать список колонок и строк, а также управлять размером страницы.
5
-
6
- ## Свойства (Props)
7
-
8
- - `columns` (массив объектов) – список колонок, каждая из которых содержит ключ `key` (для доступа к данным) и `label` (отображаемое название).
9
- - `rows` (массив объектов) – массив данных, где каждый объект представляет строку таблицы.
10
- - `pageSize` (число, необязательно) – количество строк, отображаемых на одной странице. По умолчанию `5`.
11
-
12
- ## Вычисляемые свойства (Computed)
13
-
14
- - `filteredRows` – список строк, отфильтрованный по поисковому запросу.
15
- - `searchExists` – определяет, есть ли в таблице совпадающие результаты поиска.
16
- - `totalPages` – вычисляет общее количество страниц на основе размера страницы и количества строк.
17
- - `startIndex` – индекс начала текущей страницы.
18
- - `endIndex` – индекс конца текущей страницы.
19
- - `paginatedRows` – список строк, отображаемых на текущей странице.
20
-
21
- ## Методы
22
-
23
- ### `goToPreviousPage()`
24
- Переходит на предыдущую страницу, если это возможно.
25
-
26
- ### `goToNextPage()`
27
- Переходит на следующую страницу, если это возможно.
28
-
29
- ### `handleSearchInput(event: Event)`
30
- Обновляет поисковый запрос при вводе текста в поле поиска и сбрасывает текущую страницу на первую.
31
-
32
- ## Использование
33
-
34
- ```vue
35
- <DataTable
36
- :columns="[
37
- { key: 'name', label: 'Имя' },
38
- { key: 'age', label: 'Возраст' },
39
- { key: 'email', label: 'Email' }
40
- ]"
41
- :rows="[
42
- { name: 'Иван', age: 25, email: 'ivan@example.com' },
43
- { name: 'Мария', age: 30, email: 'maria@example.com' },
44
- { name: 'Алексей', age: 28, email: 'alex@example.com' }
45
- ]"
46
- :pageSize="2"
47
- />
48
- ```
49
-
50
- ## Функциональность
51
-
52
- - Поддержка поиска по всем значениям строк.
53
- - Автоматическая фильтрация результатов.
54
- - Пагинация с кнопками "Предыдущая" и "Следующая".
55
- - Отображение сообщения, если совпадений не найдено.
56
-
57
-
@@ -1,35 +0,0 @@
1
- # Документация компонента Spinner
2
-
3
- ## Обзор
4
- Компонент `Spinner` используется для отображения индикатора загрузки. Он поддерживает кастомизацию размеров, цвета и толщины границ.
5
-
6
- ## Свойства (Props)
7
-
8
- - `show` (булево) – определяет, отображать ли спиннер. Обязательное свойство.
9
- - `size` (строка, необязательно) – задаёт размер спиннера (ширину и высоту). Например, `'40px'`.
10
- - `color` (строка, необязательно) – определяет основной цвет границы спиннера.
11
- - `thickness` (строка, необязательно) – задаёт толщину границы спиннера.
12
-
13
- ## Вычисляемые свойства (Computed)
14
-
15
- ### `spinnerStyle`
16
- Возвращает объект со стилями для спиннера:
17
-
18
- - `width` и `height` – задают размер спиннера.
19
- - `borderWidth` – регулирует толщину границы.
20
- - `borderStyle` – устанавливает стиль границы (всегда `solid`).
21
- - `borderColor` – определяет цвет границы, оставляя прозрачные части.
22
- - `borderRadius` – устанавливает форму круга.
23
-
24
- ## Использование
25
-
26
- ```vue
27
- <Spinner :show="true" size="50px" color="#3498db" thickness="5px" />
28
- ```
29
-
30
- ## Функциональность
31
-
32
- - Отображает или скрывает индикатор загрузки в зависимости от `show`.
33
- - Позволяет изменять размер, цвет и толщину границы.
34
- - Использует `computed` для динамического применения стилей.
35
-
@@ -1,60 +0,0 @@
1
- <template>
2
- <div v-if="show" class="spinner-overlay">
3
- <div class="spinner" :style="spinnerStyle"></div>
4
- </div>
5
- </template>
6
-
7
- <script setup lang="ts">
8
-
9
- import {computed} from "vue";
10
-
11
- interface SpinnerProps {
12
- show: boolean
13
- size?: string
14
- color?: string
15
- thickness?: string
16
- }
17
-
18
- const props = defineProps<SpinnerProps>()
19
-
20
- // computed properties
21
- const spinnerStyle = computed(() => ({
22
- width: props.size,
23
- height: props.size,
24
- borderWidth: props.thickness,
25
- borderStyle: 'solid',
26
- borderColor: `${props.color} transparent transparent transparent`,
27
- borderRadius: '50%'
28
- }))
29
- </script>
30
-
31
- <style scoped lang="scss">
32
- .spinner-overlay {
33
- position: fixed;
34
- top: 0;
35
- left: 0;
36
- width: 100%;
37
- height: 100%;
38
- background-color: rgba(255, 255, 255, 0.7);
39
- display: flex;
40
- align-items: center;
41
- justify-content: center;
42
- z-index: 9999;
43
- }
44
-
45
- .spinner {
46
- border: var(--spinner-thickness, 4px) solid transparent;
47
- border-top: var(--spinner-thickness, 4px) solid var(--spinner-color, #4285f4);
48
- border-radius: 50%;
49
- animation: spin 1s linear infinite;
50
- }
51
-
52
- @keyframes spin {
53
- 0% {
54
- transform: rotate(0deg);
55
- }
56
- 100% {
57
- transform: rotate(360deg);
58
- }
59
- }
60
- </style>
@@ -1,70 +0,0 @@
1
- # Документация компонента Toaster
2
-
3
- ## Обзор
4
- Компонент `Toaster` предназначен для отображения уведомлений на экране. Он поддерживает разные типы сообщений, настраиваемые позиции и функцию автоматического скрытия.
5
-
6
- ## Свойства (Props)
7
-
8
- - `message` (строка) – текст сообщения, отображаемый в уведомлении.
9
- - `type` (success, error, info, warning) – определяет тип сообщения, который влияет на его внешний вид. По умолчанию `success`.
10
- - `position` (top-left, top-right, bottom-left, bottom-right) – задаёт расположение уведомления на экране. По умолчанию `top-right`.
11
- - `dismissible` (булево) – определяет, можно ли закрыть уведомление вручную. По умолчанию `true`.
12
- - `onDismiss` (функция) – вызывается при закрытии уведомления.
13
- - `onClick` (функция, необязательная) – вызывается при клике на уведомление.
14
- - `pauseOnHover` (булево) – при наведении мыши приостанавливает таймер скрытия. По умолчанию `true`.
15
- - `duration` (число) – продолжительность показа в миллисекундах. Если `0`, то уведомление не исчезает автоматически. По умолчанию `5000`.
16
- - `onHeightUpdate` (функция) – вызывается при изменении высоты уведомления.
17
-
18
- ## События
19
-
20
- - `onDismiss` – срабатывает при закрытии уведомления.
21
- - `onClick` – срабатывает при клике на уведомление.
22
- - `onHeightUpdate` – вызывается при изменении высоты уведомления.
23
-
24
- ## Использование
25
-
26
- ```vue
27
-
28
- <script setup>
29
- import {useToast} from "../../plugins/toasterPlugin";
30
-
31
- const toast = useToast();
32
-
33
- const showSuccessToast = () => {
34
- toast?.success("Toast on top", {
35
- position: "top-left",
36
- duration: 4000,
37
- pauseOnHover: false,
38
- });
39
- };
40
- </script>
41
- ```
42
-
43
- ## Стилизация
44
- Компонент применяет разные стили в зависимости от переданных свойств `type` и `position`.
45
-
46
- - `.toast__item--success` – зелёный фон для успешных сообщений.
47
- - `.toast__item--error` – красный фон для ошибок.
48
- - `.toast__item--info` – синий фон для информационных сообщений.
49
- - `.toast__item--warning` – оранжевый фон для предупреждений.
50
- - `.toast__item--top-left`, `.toast__item--top-right`, `.toast__item--bottom-left`, `.toast__item--bottom-right` – стили позиционирования.
51
-
52
- ### Анимации
53
- - `.toast--fade-in-down` – анимация появления для уведомлений сверху.
54
- - `.toast--fade-in-up` – анимация появления для уведомлений снизу.
55
- - `.toast--fade-out` – анимация исчезновения.
56
-
57
- ## Жизненный цикл
58
- - **onMounted** – запускает таймер автоудаления и регистрирует наблюдателя за изменением размера.
59
- - **onUnmounted** – очищает таймер и отключает наблюдателя за изменением размера.
60
-
61
- ## Методы
62
-
63
- ### `startTimer()`
64
- Запускает таймер автоматического скрытия, если `duration` больше 0.
65
-
66
- ### `toggleTimer(state: boolean)`
67
- Приостанавливает или возобновляет таймер при наведении курсора.
68
-
69
- ### `dismissToast()`
70
- Закрывает уведомление вручную и вызывает `onDismiss`.
@@ -1,235 +0,0 @@
1
- <template>
2
- <Transition
3
- :enter-active-class="transition.enter"
4
- :leave-active-class="transition.leave"
5
- >
6
- <div
7
- v-if="isActive"
8
- ref="toastRef"
9
- class="toast__item"
10
- :class="[`toast__item--${type}`, `toast__item--${position}`]"
11
- @mouseover="toggleTimer(true)"
12
- @mouseleave="toggleTimer(false)"
13
- >
14
- <div class="v-toast__icon"></div>
15
- <p class="v-toast__text" v-html="message"></p>
16
- <button v-if="dismissible" class="toast__close" @click="dismissToast">
17
- ×
18
- </button>
19
- </div>
20
- </Transition>
21
- </template>
22
-
23
- <script setup lang="ts">
24
- import { ref, computed, onMounted, onUnmounted, nextTick } from "vue";
25
- import Timer from "./timer";
26
-
27
- interface IProps {
28
- message: string;
29
- type: "success" | "error" | "info" | "warning";
30
- position: "top-left" | "top-right" | "bottom-left" | "bottom-right";
31
- dismissible: boolean;
32
- onDismiss: () => void;
33
- onClick?: () => void;
34
- pauseOnHover: boolean;
35
- duration: number;
36
- onHeightUpdate?: (height: number) => void;
37
- }
38
-
39
- const props = withDefaults(defineProps<IProps>(), {
40
- message: "",
41
- type: "success",
42
- position: "top-right",
43
- dismissible: true,
44
- pauseOnHover: true,
45
- duration: 5000,
46
- onDismiss: () => {},
47
- onClick: () => {},
48
- onHeightUpdate: () => {},
49
- });
50
-
51
- const isActive = ref<boolean>(true);
52
- const toastRef = ref<HTMLElement | null>(null);
53
- let timer: Timer | null = null;
54
- let resizeObserver: ResizeObserver | null = null;
55
-
56
- const transition = computed(() => {
57
- return ["top-left", "top-right"].includes(props.position)
58
- ? { enter: "toast--fade-in-down", leave: "toast--fade-out" }
59
- : { enter: "toast--fade-in-up", leave: "toast--fade-out" };
60
- });
61
-
62
- const updateHeight = async () => {
63
- await nextTick();
64
- if (toastRef.value) {
65
- const height = toastRef.value.offsetHeight;
66
- props.onHeightUpdate(height);
67
- }
68
- };
69
-
70
- onMounted(async () => {
71
- startTimer();
72
- await updateHeight();
73
-
74
- if (toastRef.value) {
75
- resizeObserver = new ResizeObserver(async () => {
76
- await updateHeight();
77
- });
78
- resizeObserver.observe(toastRef.value);
79
- }
80
- });
81
-
82
- onUnmounted(() => {
83
- if (timer) {
84
- timer.clear();
85
- }
86
- if (resizeObserver) {
87
- resizeObserver.disconnect();
88
- }
89
- });
90
-
91
- const startTimer = () => {
92
- if (props.duration > 0) {
93
- timer = new Timer(() => {
94
- dismissToast();
95
- }, props.duration);
96
- timer.resume();
97
- }
98
- };
99
-
100
- const toggleTimer = (state: boolean) => {
101
- if (props.pauseOnHover && timer) {
102
- state ? timer.pause() : timer.resume();
103
- }
104
- };
105
-
106
- const dismissToast = () => {
107
- if (isActive.value) {
108
- isActive.value = false;
109
- if (timer) {
110
- timer.clear();
111
- }
112
- props.onDismiss();
113
- }
114
- };
115
-
116
- // const whenClicked = () => {
117
- // props.onClick();
118
- // };
119
- </script>
120
-
121
- <style scoped lang="scss">
122
- .toast__item--top-left {
123
- top: 10px;
124
- left: 10px;
125
- align-items: flex-start;
126
- }
127
-
128
- .toast__item--top-right {
129
- top: 10px;
130
- right: 10px;
131
- align-items: flex-end;
132
- }
133
-
134
- .toast__item--bottom-left {
135
- bottom: 10px;
136
- left: 10px;
137
- align-items: flex-start;
138
- }
139
-
140
- .toast__item--bottom-right {
141
- bottom: 10px;
142
- right: 10px;
143
- align-items: flex-end;
144
- }
145
-
146
- .toast__item {
147
- width: 300px;
148
- padding: 15px;
149
- position: fixed;
150
- z-index: 9999;
151
- border-radius: 8px;
152
- display: flex;
153
- align-items: center;
154
- box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
155
- background-color: white;
156
- font-weight: 500;
157
- color: #333;
158
- pointer-events: auto;
159
- transition: all 0.3s ease-in-out;
160
- }
161
-
162
- .toast__item--success {
163
- background-color: #4caf50;
164
- color: #fff;
165
- }
166
-
167
- .toast__item--error {
168
- background-color: #f44336;
169
- color: #fff;
170
- }
171
-
172
- .toast__item--info {
173
- background-color: #2196f3;
174
- color: #fff;
175
- }
176
-
177
- .toast__item--warning {
178
- background-color: #ff9800;
179
- color: #fff;
180
- }
181
-
182
- .toast__close {
183
- position: absolute;
184
- top: 10px;
185
- right: 10px;
186
- background: none;
187
- border: none;
188
- font-size: 18px;
189
- cursor: pointer;
190
- color: #fff;
191
- }
192
-
193
- .toast--fade-in-down {
194
- animation: fadeInDown 0.3s ease-out;
195
- }
196
-
197
- .toast--fade-in-up {
198
- animation: fadeInUp 0.3s ease-out;
199
- }
200
-
201
- .toast--fade-out {
202
- animation: fadeOut 0.3s ease-in forwards;
203
- }
204
-
205
- @keyframes fadeInDown {
206
- from {
207
- opacity: 0;
208
- transform: translateY(-10px);
209
- }
210
- to {
211
- opacity: 1;
212
- transform: translateY(0);
213
- }
214
- }
215
-
216
- @keyframes fadeInUp {
217
- from {
218
- opacity: 0;
219
- transform: translateY(10px);
220
- }
221
- to {
222
- opacity: 1;
223
- transform: translateY(0);
224
- }
225
- }
226
-
227
- @keyframes fadeOut {
228
- from {
229
- opacity: 1;
230
- }
231
- to {
232
- opacity: 0;
233
- }
234
- }
235
- </style>
@@ -1,45 +0,0 @@
1
- class Timer {
2
- private timerId: number | null = null;
3
- private start: number = 0;
4
- private remaining: number;
5
- private callback: () => void;
6
-
7
- constructor(callback: () => void, delay: number) {
8
- this.callback = callback;
9
- this.remaining = delay;
10
- this.resume();
11
- }
12
-
13
- pause(): void {
14
- if (this.timerId !== null) {
15
- window.clearTimeout(this.timerId);
16
- this.remaining -= Date.now() - this.start;
17
- this.timerId = null;
18
- }
19
- }
20
-
21
- resume(): void {
22
- if (this.timerId === null && this.remaining > 0) {
23
- this.start = Date.now();
24
- this.timerId = window.setTimeout(() => {
25
- this.callback();
26
- this.timerId = null;
27
- }, this.remaining);
28
- }
29
- }
30
-
31
- clear(): void {
32
- if (this.timerId !== null) {
33
- window.clearTimeout(this.timerId);
34
- this.timerId = null;
35
- }
36
- }
37
-
38
- reset(delay: number): void {
39
- this.clear();
40
- this.remaining = delay;
41
- this.resume();
42
- }
43
- }
44
-
45
- export default Timer;