vgapp 1.1.6 → 1.1.8
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/CHANGELOG.md +11 -2
- package/app/modules/vgformsender/js/vgformsender.js +1 -1
- package/app/modules/vgrollup/js/vgrollup.js +14 -9
- package/app/modules/vgtoast/js/vgtoast.js +121 -76
- package/app/modules/vgtoast/readme.md +12 -1
- package/app/modules/vgtoast/scss/vgtoast.scss +42 -1
- package/build/vgapp.css +1 -1
- package/build/vgapp.css.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
|
-
# VEGAS-APP 1.1.
|
|
2
|
-
## Новые фичи
|
|
1
|
+
# VEGAS-APP 1.1.7 (Апрель, 13, 2026)
|
|
2
|
+
## Новые фичи
|
|
3
|
+
* В VGFilePreview добавлена поддержка атрибута `data-name` для явной установки отображаемого имени файла (в приоритете над `data-vg-filepreview-display-name`).
|
|
4
|
+
|
|
5
|
+
## Изменения
|
|
6
|
+
* Обновлена версия пакета в `package.json`: `1.1.6` -> `1.1.7`.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# VEGAS-APP 1.1.6 (Апрель, 10, 2026)
|
|
11
|
+
## Новые фичи
|
|
3
12
|
* **VGToast**: добавлены встроенные модули VGToastDrag и VGToastResize с поддержкой параметров drag/resize (enable, threshold, edgeSize, minWidth/minHeight, debug).
|
|
4
13
|
|
|
5
14
|
## Изменения
|
|
@@ -621,7 +621,7 @@ class VGFormSender extends BaseModule {
|
|
|
621
621
|
response = data.response.view
|
|
622
622
|
} else if (typeof response !== 'string') {
|
|
623
623
|
if (status === 'danger') {
|
|
624
|
-
response.title = lang_titles(this._params.lang, 'errors').title;
|
|
624
|
+
response.title = ('title' in response) ? response.title : lang_titles(this._params.lang, 'errors').title;
|
|
625
625
|
|
|
626
626
|
if ('code' in data && data.code !== 200) {
|
|
627
627
|
const messages = {
|
|
@@ -73,7 +73,7 @@ class VGRollup extends BaseModule {
|
|
|
73
73
|
constructor(element, params = {}) {
|
|
74
74
|
super(element, params);
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
const defaultParams = {
|
|
77
77
|
lang: document.documentElement.lang || 'ru',
|
|
78
78
|
content: 'text',
|
|
79
79
|
cnt: 0,
|
|
@@ -87,8 +87,8 @@ class VGRollup extends BaseModule {
|
|
|
87
87
|
more: ' еще ',
|
|
88
88
|
button: {
|
|
89
89
|
enabled: true,
|
|
90
|
-
more:
|
|
91
|
-
less:
|
|
90
|
+
more: 'Показать',
|
|
91
|
+
less: 'Свернуть',
|
|
92
92
|
classes: ''
|
|
93
93
|
},
|
|
94
94
|
callbacks: {
|
|
@@ -96,7 +96,17 @@ class VGRollup extends BaseModule {
|
|
|
96
96
|
expand: () => {},
|
|
97
97
|
collapse: () => {}
|
|
98
98
|
}
|
|
99
|
-
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
let lang = Manipulator.get(element, 'data-lang') || ('lang' in params) ? params.lang : defaultParams.lang;
|
|
102
|
+
|
|
103
|
+
// Локализация текстов кнопок
|
|
104
|
+
defaultParams.button.more = lang_buttons(lang, NAME)['show'];
|
|
105
|
+
defaultParams.button.less = lang_buttons(lang, NAME)['less'];
|
|
106
|
+
defaultParams.more = lang_buttons(lang, NAME)['more'];
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
this._params = this._getParams(element, mergeDeepObject(defaultParams, params));
|
|
100
110
|
|
|
101
111
|
/**
|
|
102
112
|
* CSS-классы, используемые модулем.
|
|
@@ -141,11 +151,6 @@ class VGRollup extends BaseModule {
|
|
|
141
151
|
*/
|
|
142
152
|
this.isOffset = false;
|
|
143
153
|
|
|
144
|
-
// Локализация текстов кнопок
|
|
145
|
-
this._params.button.more = lang_buttons(this._params.lang, NAME)['show'];
|
|
146
|
-
this._params.button.less = lang_buttons(this._params.lang, NAME)['less'];
|
|
147
|
-
this._params.more = lang_buttons(this._params.lang, NAME)['more'];
|
|
148
|
-
|
|
149
154
|
this.build();
|
|
150
155
|
}
|
|
151
156
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import BaseModule from "../../base-module";
|
|
1
|
+
import BaseModule from "../../base-module";
|
|
2
2
|
import EventHandler from "../../../utils/js/dom/event";
|
|
3
3
|
import {dismissTrigger} from "../../module-fn";
|
|
4
4
|
import {execute, isDisabled, makeRandomString, mergeDeepObject} from "../../../utils/js/functions";
|
|
@@ -7,36 +7,45 @@ import VGToastDrag from "./vgtoast.drag";
|
|
|
7
7
|
import VGToastResize from "./vgtoast.resize";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* @constant {string} NAME -
|
|
10
|
+
* @constant {string} NAME - Имя модуля.
|
|
11
11
|
*/
|
|
12
12
|
const NAME = 'toast';
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
* @constant {string} NAME_KEY -
|
|
15
|
+
* @constant {string} NAME_KEY - Пространство имён для событий.
|
|
16
16
|
*/
|
|
17
17
|
const NAME_KEY = 'vg.toast';
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
-
* @constant {string} SELECTOR_DATA_TOGGLE -
|
|
20
|
+
* @constant {string} SELECTOR_DATA_TOGGLE - Селектор для активации через data-атрибут.
|
|
21
21
|
*/
|
|
22
22
|
const SELECTOR_DATA_TOGGLE = '[data-vg-toggle="toast"]';
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
|
-
* @constant {string} CLASS_NAME_OPEN -
|
|
25
|
+
* @constant {string} CLASS_NAME_OPEN - Класс, добавляемый к body при открытии любого тоста.
|
|
26
26
|
*/
|
|
27
27
|
const CLASS_NAME_OPEN = 'vg-toast-open';
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
|
-
* @constant {string} CLASS_NAME_SHOW -
|
|
30
|
+
* @constant {string} CLASS_NAME_SHOW - Класс, показывающий, что тост видим.
|
|
31
31
|
*/
|
|
32
32
|
const CLASS_NAME_SHOW = 'show';
|
|
33
33
|
|
|
34
34
|
/**
|
|
35
|
-
* @constant {string} CLASS_NAME_SHOWN -
|
|
35
|
+
* @constant {string} CLASS_NAME_SHOWN - Класс, добавляемый после завершения анимации появления.
|
|
36
36
|
*/
|
|
37
37
|
const CLASS_NAME_SHOWN = 'shown';
|
|
38
|
+
const EFFECT_CLASS_PREFIX = 'vg-toast-effect-';
|
|
39
|
+
const EFFECT_PRESET_MAP = {
|
|
40
|
+
none: '',
|
|
41
|
+
fade: `${EFFECT_CLASS_PREFIX}fade`,
|
|
42
|
+
zoom: `${EFFECT_CLASS_PREFIX}zoom`,
|
|
43
|
+
blur: `${EFFECT_CLASS_PREFIX}blur`,
|
|
44
|
+
'slide-up': `${EFFECT_CLASS_PREFIX}slide-up`,
|
|
45
|
+
'slide-down': `${EFFECT_CLASS_PREFIX}slide-down`,
|
|
46
|
+
};
|
|
38
47
|
|
|
39
|
-
//
|
|
48
|
+
// События
|
|
40
49
|
const EVENT_KEY_HIDE = `${NAME_KEY}.hide`;
|
|
41
50
|
const EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;
|
|
42
51
|
const EVENT_KEY_SHOW = `${NAME_KEY}.show`;
|
|
@@ -51,33 +60,34 @@ const EVENT_KEY_POINTERCANCEL_INTERACTION = `pointercancel.interaction.${NAME_KE
|
|
|
51
60
|
|
|
52
61
|
/**
|
|
53
62
|
* @typedef {Object} ToastParams
|
|
54
|
-
* @property {boolean} static -
|
|
55
|
-
* @property {string} placement -
|
|
56
|
-
* @property {boolean} autohide -
|
|
57
|
-
* @property {number} delay -
|
|
58
|
-
* @property {boolean} enableClickToast -
|
|
59
|
-
* @property {boolean} enableButtonClose -
|
|
60
|
-
* @property {boolean} keyboard -
|
|
61
|
-
* @property {string} theme -
|
|
62
|
-
* @property {Object} stack -
|
|
63
|
-
* @property {boolean} stack.enable -
|
|
64
|
-
* @property {number} stack.max -
|
|
65
|
-
* @property {Object} animation -
|
|
66
|
-
* @property {boolean} animation.enable -
|
|
67
|
-
* @property {string} animation.in -
|
|
68
|
-
* @property {string} animation.out -
|
|
69
|
-
* @property {number} animation.delay -
|
|
70
|
-
* @property {
|
|
71
|
-
* @property {
|
|
72
|
-
* @property {string} ajax.
|
|
73
|
-
* @property {string} ajax.
|
|
74
|
-
* @property {
|
|
75
|
-
* @property {boolean} ajax.
|
|
76
|
-
* @property {boolean} ajax.
|
|
63
|
+
* @property {boolean} static - Сохранять ли тост в DOM после скрытия.
|
|
64
|
+
* @property {string} placement - Расположение: 'top left', 'bottom center' и т.д.
|
|
65
|
+
* @property {boolean} autohide - Автоматически скрывать.
|
|
66
|
+
* @property {number} delay - Задержка перед авто-скрытием (мс).
|
|
67
|
+
* @property {boolean} enableClickToast - Закрывать по клику на тост.
|
|
68
|
+
* @property {boolean} enableButtonClose - Добавить кнопку закрытия.
|
|
69
|
+
* @property {boolean} keyboard - Закрывать по Esc.
|
|
70
|
+
* @property {string} theme - Тема: 'dark', 'light' и т.д.
|
|
71
|
+
* @property {Object} stack - Настройки стека уведомлений.
|
|
72
|
+
* @property {boolean} stack.enable - Разрешить стек.
|
|
73
|
+
* @property {number} stack.max - Макс. количество тостов одновременно.
|
|
74
|
+
* @property {Object} animation - Анимация.
|
|
75
|
+
* @property {boolean} animation.enable - Включить анимацию.
|
|
76
|
+
* @property {string} animation.in - Анимация входа (Animate.css).
|
|
77
|
+
* @property {string} animation.out - Анимация выхода.
|
|
78
|
+
* @property {number} animation.delay - Длительность анимации.
|
|
79
|
+
* @property {string|string[]} animation.effect - Доп. визуальный эффект (preset или css-класс).
|
|
80
|
+
* @property {Object} ajax - Настройки AJAX.
|
|
81
|
+
* @property {string} ajax.route - URL для загрузки.
|
|
82
|
+
* @property {string} ajax.target - Селектор контейнера.
|
|
83
|
+
* @property {string} ajax.method - HTTP-метод.
|
|
84
|
+
* @property {boolean} ajax.loader - Показывать лоадер.
|
|
85
|
+
* @property {boolean} ajax.once - Загружать один раз.
|
|
86
|
+
* @property {boolean} ajax.output - Выводить результат.
|
|
77
87
|
*/
|
|
78
88
|
|
|
79
89
|
/**
|
|
80
|
-
*
|
|
90
|
+
* Параметры по умолчанию
|
|
81
91
|
* @type {ToastParams}
|
|
82
92
|
*/
|
|
83
93
|
const defaultParams = {
|
|
@@ -112,6 +122,7 @@ const defaultParams = {
|
|
|
112
122
|
in: 'animate__backInUp',
|
|
113
123
|
out: 'animate__backOutDown',
|
|
114
124
|
delay: 300,
|
|
125
|
+
effect: 'none',
|
|
115
126
|
},
|
|
116
127
|
ajax: {
|
|
117
128
|
route: '',
|
|
@@ -124,14 +135,14 @@ const defaultParams = {
|
|
|
124
135
|
};
|
|
125
136
|
|
|
126
137
|
/**
|
|
127
|
-
*
|
|
128
|
-
*
|
|
138
|
+
* Класс VGToast — модуль уведомлений (тосты)
|
|
139
|
+
* Поддерживает стек, анимации, авто-скрытие, AJAX-контент, горячие клавиши.
|
|
129
140
|
*/
|
|
130
141
|
class VGToast extends BaseModule {
|
|
131
142
|
/**
|
|
132
|
-
*
|
|
133
|
-
* @param {Element} element - HTML
|
|
134
|
-
* @param {Partial<ToastParams>} params -
|
|
143
|
+
* Создаёт экземпляр VGToast
|
|
144
|
+
* @param {Element} element - HTML-элемент тоста.
|
|
145
|
+
* @param {Partial<ToastParams>} params - Пользовательские параметры.
|
|
135
146
|
*/
|
|
136
147
|
constructor(element, params = {}) {
|
|
137
148
|
super(element, params);
|
|
@@ -160,6 +171,7 @@ class VGToast extends BaseModule {
|
|
|
160
171
|
this._dragHandler.setOptions(this._interactionConfig.drag);
|
|
161
172
|
this._resizeHandler.setOptions(this._interactionConfig.resize);
|
|
162
173
|
this._animation(this._element, VGToast.NAME_KEY, this._params.animation);
|
|
174
|
+
this._applyAnimationEffects();
|
|
163
175
|
this._dismissElement();
|
|
164
176
|
this._addEventListeners();
|
|
165
177
|
|
|
@@ -168,7 +180,7 @@ class VGToast extends BaseModule {
|
|
|
168
180
|
}
|
|
169
181
|
|
|
170
182
|
/**
|
|
171
|
-
*
|
|
183
|
+
* Имя модуля
|
|
172
184
|
* @returns {string}
|
|
173
185
|
*/
|
|
174
186
|
static get NAME() {
|
|
@@ -176,7 +188,7 @@ class VGToast extends BaseModule {
|
|
|
176
188
|
}
|
|
177
189
|
|
|
178
190
|
/**
|
|
179
|
-
*
|
|
191
|
+
* Пространство имён событий
|
|
180
192
|
* @returns {string}
|
|
181
193
|
*/
|
|
182
194
|
static get NAME_KEY() {
|
|
@@ -184,10 +196,10 @@ class VGToast extends BaseModule {
|
|
|
184
196
|
}
|
|
185
197
|
|
|
186
198
|
/**
|
|
187
|
-
*
|
|
188
|
-
* @param {string|Array<string>} text -
|
|
189
|
-
* @param {Partial<ToastParams>} [params] -
|
|
190
|
-
* @param {Function} [callback] -
|
|
199
|
+
* Глобальный метод для быстрого создания тоста
|
|
200
|
+
* @param {string|Array<string>} text - Текст или [заголовок, тело].
|
|
201
|
+
* @param {Partial<ToastParams>} [params] - Параметры.
|
|
202
|
+
* @param {Function} [callback] - Вызывается после создания.
|
|
191
203
|
* @returns {VGToast}
|
|
192
204
|
*/
|
|
193
205
|
static run(text, params = {}, callback) {
|
|
@@ -195,10 +207,10 @@ class VGToast extends BaseModule {
|
|
|
195
207
|
}
|
|
196
208
|
|
|
197
209
|
/**
|
|
198
|
-
*
|
|
199
|
-
* @param {string|Array<string>} text -
|
|
200
|
-
* @param {Partial<ToastParams>} [params] -
|
|
201
|
-
* @param {Function} [callback] -
|
|
210
|
+
* Создаёт и показывает новый тост
|
|
211
|
+
* @param {string|Array<string>} text - Текст уведомления.
|
|
212
|
+
* @param {Partial<ToastParams>} [params] - Параметры.
|
|
213
|
+
* @param {Function} [callback] - Вызывается после появления.
|
|
202
214
|
* @returns {VGToast}
|
|
203
215
|
*/
|
|
204
216
|
static build(text, params, callback) {
|
|
@@ -214,12 +226,12 @@ class VGToast extends BaseModule {
|
|
|
214
226
|
target.classList.add('vg-toast');
|
|
215
227
|
target.id = id;
|
|
216
228
|
|
|
217
|
-
//
|
|
229
|
+
// Тема
|
|
218
230
|
if (params.theme) {
|
|
219
231
|
target.classList.add(`vg-toast-${params.theme}`);
|
|
220
232
|
}
|
|
221
233
|
|
|
222
|
-
//
|
|
234
|
+
// Позиция
|
|
223
235
|
if (params.placement) {
|
|
224
236
|
params.placement.split(' ').forEach(cls => target.classList.add(cls));
|
|
225
237
|
}
|
|
@@ -227,7 +239,7 @@ class VGToast extends BaseModule {
|
|
|
227
239
|
const wrapper = document.createElement('div');
|
|
228
240
|
wrapper.classList.add('vg-toast-wrapper');
|
|
229
241
|
|
|
230
|
-
//
|
|
242
|
+
// Иконка (если задан тип)
|
|
231
243
|
if (params.type) {
|
|
232
244
|
const icon = document.createElement('div');
|
|
233
245
|
icon.classList.add('vg-toast-icon');
|
|
@@ -256,7 +268,7 @@ class VGToast extends BaseModule {
|
|
|
256
268
|
|
|
257
269
|
wrapper.append(content);
|
|
258
270
|
|
|
259
|
-
//
|
|
271
|
+
// Кнопка закрытия
|
|
260
272
|
if (params.enableButtonClose) {
|
|
261
273
|
const button = document.createElement('div');
|
|
262
274
|
button.classList.add('vg-toast-button');
|
|
@@ -270,6 +282,7 @@ class VGToast extends BaseModule {
|
|
|
270
282
|
const instance = VGToast.getOrCreateInstance(target, params);
|
|
271
283
|
if (params.animation) {
|
|
272
284
|
instance._animation(target, VGToast.NAME_KEY, params.animation);
|
|
285
|
+
instance._applyAnimationEffects();
|
|
273
286
|
}
|
|
274
287
|
|
|
275
288
|
execute(callback, [instance]);
|
|
@@ -279,8 +292,8 @@ class VGToast extends BaseModule {
|
|
|
279
292
|
}
|
|
280
293
|
|
|
281
294
|
/**
|
|
282
|
-
*
|
|
283
|
-
* @param {Element} [relatedTarget] -
|
|
295
|
+
* Переключает состояние (показать/скрыть)
|
|
296
|
+
* @param {Element} [relatedTarget] - Элемент, вызвавший тост.
|
|
284
297
|
* @returns {VGToast}
|
|
285
298
|
*/
|
|
286
299
|
toggle(relatedTarget) {
|
|
@@ -288,8 +301,8 @@ class VGToast extends BaseModule {
|
|
|
288
301
|
}
|
|
289
302
|
|
|
290
303
|
/**
|
|
291
|
-
*
|
|
292
|
-
* @param {Element} [relatedTarget] -
|
|
304
|
+
* Показывает тост
|
|
305
|
+
* @param {Element} [relatedTarget] - Элемент, инициировавший показ.
|
|
293
306
|
* @returns {void}
|
|
294
307
|
*/
|
|
295
308
|
show(relatedTarget) {
|
|
@@ -324,7 +337,7 @@ class VGToast extends BaseModule {
|
|
|
324
337
|
}
|
|
325
338
|
|
|
326
339
|
/**
|
|
327
|
-
*
|
|
340
|
+
* Скрывает тост
|
|
328
341
|
* @returns {void}
|
|
329
342
|
*/
|
|
330
343
|
hide() {
|
|
@@ -359,7 +372,7 @@ class VGToast extends BaseModule {
|
|
|
359
372
|
}
|
|
360
373
|
|
|
361
374
|
/**
|
|
362
|
-
*
|
|
375
|
+
* Удаляет тост из DOM и снимает обработчики
|
|
363
376
|
* @override
|
|
364
377
|
*/
|
|
365
378
|
dispose() {
|
|
@@ -372,7 +385,7 @@ class VGToast extends BaseModule {
|
|
|
372
385
|
}
|
|
373
386
|
|
|
374
387
|
/**
|
|
375
|
-
*
|
|
388
|
+
* Устанавливает таймер на скрытие
|
|
376
389
|
* @private
|
|
377
390
|
*/
|
|
378
391
|
_scheduleHide() {
|
|
@@ -383,7 +396,7 @@ class VGToast extends BaseModule {
|
|
|
383
396
|
}
|
|
384
397
|
|
|
385
398
|
/**
|
|
386
|
-
*
|
|
399
|
+
* Проверяет, показан ли тост
|
|
387
400
|
* @private
|
|
388
401
|
* @returns {boolean}
|
|
389
402
|
*/
|
|
@@ -392,17 +405,17 @@ class VGToast extends BaseModule {
|
|
|
392
405
|
}
|
|
393
406
|
|
|
394
407
|
/**
|
|
395
|
-
*
|
|
396
|
-
*
|
|
408
|
+
* Возвращает список активных тостов с вертикальными смещениями
|
|
409
|
+
* Учитывает стек и максимальное количество
|
|
397
410
|
* @private
|
|
398
411
|
* @returns {Array<{el: Element, top: number}>}
|
|
399
412
|
*/
|
|
400
413
|
_enableStack() {
|
|
401
414
|
const placement = this._params.placement;
|
|
402
415
|
const isTop = placement.includes('top');
|
|
403
|
-
const isBottom = !isTop; //
|
|
416
|
+
const isBottom = !isTop; // по умолчанию снизу
|
|
404
417
|
|
|
405
|
-
//
|
|
418
|
+
// Фильтруем тосты с таким же направлением (top или bottom)
|
|
406
419
|
const stackClass = isTop ? 'top' : 'bottom';
|
|
407
420
|
const elmsShown = Selectors.findAll(`.vg-toast.show.${stackClass}`)
|
|
408
421
|
.filter(el => {
|
|
@@ -411,20 +424,20 @@ class VGToast extends BaseModule {
|
|
|
411
424
|
});
|
|
412
425
|
|
|
413
426
|
if (!this._params.stack.enable) {
|
|
414
|
-
//
|
|
427
|
+
// Скрываем другие тосты, если стек выключен
|
|
415
428
|
elmsShown
|
|
416
429
|
.filter(el => el !== this._element)
|
|
417
430
|
.forEach(el => VGToast.getInstance(el).hide());
|
|
418
431
|
return [{ el: this._element, top: 0 }];
|
|
419
432
|
}
|
|
420
433
|
|
|
421
|
-
//
|
|
434
|
+
// Ограничиваем по max
|
|
422
435
|
if (elmsShown.length >= this._params.stack.max) {
|
|
423
436
|
const excess = elmsShown.slice(0, elmsShown.length - this._params.stack.max + 1);
|
|
424
437
|
excess.forEach(el => VGToast.getInstance(el).hide());
|
|
425
438
|
}
|
|
426
439
|
|
|
427
|
-
//
|
|
440
|
+
// Вычисляем смещение (по высоте)
|
|
428
441
|
const prevEls = elmsShown.filter(el => el !== this._element);
|
|
429
442
|
const offset = prevEls.reduce((sum, el) => sum + el.clientHeight, 0);
|
|
430
443
|
|
|
@@ -437,7 +450,7 @@ class VGToast extends BaseModule {
|
|
|
437
450
|
}
|
|
438
451
|
|
|
439
452
|
/**
|
|
440
|
-
*
|
|
453
|
+
* Устанавливает позицию тостов с учётом стека
|
|
441
454
|
* @private
|
|
442
455
|
*/
|
|
443
456
|
_setPlacement() {
|
|
@@ -465,17 +478,17 @@ class VGToast extends BaseModule {
|
|
|
465
478
|
style.top = '';
|
|
466
479
|
style.bottom = '';
|
|
467
480
|
style.transform = '';
|
|
468
|
-
style.translate = ''; // <--
|
|
481
|
+
style.translate = ''; // <-- важно: сбрасываем translate отдельно
|
|
469
482
|
|
|
470
483
|
if (isCenter) {
|
|
471
484
|
style.left = '50%';
|
|
472
|
-
style.translate = '-50% 0'; // <--
|
|
485
|
+
style.translate = '-50% 0'; // <-- вместо transform: translateX(-50%)
|
|
473
486
|
} else if (isLeft) {
|
|
474
487
|
style.left = '0';
|
|
475
488
|
} else if (isRight) {
|
|
476
489
|
style.right = '0';
|
|
477
490
|
} else {
|
|
478
|
-
//
|
|
491
|
+
// по умолчанию: центрирование
|
|
479
492
|
style.left = '50%';
|
|
480
493
|
style.translate = '-50% 0';
|
|
481
494
|
}
|
|
@@ -491,7 +504,7 @@ class VGToast extends BaseModule {
|
|
|
491
504
|
}
|
|
492
505
|
|
|
493
506
|
/**
|
|
494
|
-
*
|
|
507
|
+
* Очищает таймер
|
|
495
508
|
* @private
|
|
496
509
|
*/
|
|
497
510
|
_toggleInteractionHandlers() {
|
|
@@ -551,6 +564,37 @@ class VGToast extends BaseModule {
|
|
|
551
564
|
return {...defaults};
|
|
552
565
|
}
|
|
553
566
|
|
|
567
|
+
_applyAnimationEffects() {
|
|
568
|
+
const classList = this._element.classList;
|
|
569
|
+
const effectClasses = [...classList].filter(className => className.startsWith(EFFECT_CLASS_PREFIX));
|
|
570
|
+
effectClasses.forEach(className => classList.remove(className));
|
|
571
|
+
|
|
572
|
+
const nextClasses = this._resolveAnimationEffectClasses(this._params.animation?.effect);
|
|
573
|
+
nextClasses.forEach(className => classList.add(className));
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
_resolveAnimationEffectClasses(effectValue) {
|
|
577
|
+
const values = Array.isArray(effectValue) ? effectValue : [effectValue];
|
|
578
|
+
const normalized = values
|
|
579
|
+
.filter(Boolean)
|
|
580
|
+
.map(effect => this._resolveAnimationEffectClass(effect))
|
|
581
|
+
.filter(Boolean);
|
|
582
|
+
|
|
583
|
+
return Array.from(new Set(normalized));
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
_resolveAnimationEffectClass(effectValue) {
|
|
587
|
+
if (typeof effectValue !== 'string') return '';
|
|
588
|
+
const key = effectValue.trim().toLowerCase();
|
|
589
|
+
if (!key) return '';
|
|
590
|
+
|
|
591
|
+
if (Object.prototype.hasOwnProperty.call(EFFECT_PRESET_MAP, key)) {
|
|
592
|
+
return EFFECT_PRESET_MAP[key];
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
return effectValue.trim();
|
|
596
|
+
}
|
|
597
|
+
|
|
554
598
|
_clearTimeout() {
|
|
555
599
|
if (this._timeout) {
|
|
556
600
|
clearTimeout(this._timeout);
|
|
@@ -559,11 +603,11 @@ class VGToast extends BaseModule {
|
|
|
559
603
|
}
|
|
560
604
|
|
|
561
605
|
/**
|
|
562
|
-
*
|
|
606
|
+
* Назначает обработчики событий
|
|
563
607
|
* @private
|
|
564
608
|
*/
|
|
565
609
|
_addEventListeners() {
|
|
566
|
-
//
|
|
610
|
+
// Закрытие по Esc
|
|
567
611
|
if (this._params.keyboard) {
|
|
568
612
|
EventHandler.on(document, EVENT_KEY_KEYDOWN_DISMISS, event => {
|
|
569
613
|
if (event.key === 'Escape' && this._isShown()) {
|
|
@@ -572,7 +616,7 @@ class VGToast extends BaseModule {
|
|
|
572
616
|
});
|
|
573
617
|
}
|
|
574
618
|
|
|
575
|
-
//
|
|
619
|
+
// Закрытие по клику на тост
|
|
576
620
|
if (this._params.enableClickToast) {
|
|
577
621
|
this._element.classList.add('vg-toast-pointer');
|
|
578
622
|
EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, `#${this._element.id}`, () => {
|
|
@@ -595,11 +639,11 @@ class VGToast extends BaseModule {
|
|
|
595
639
|
}
|
|
596
640
|
}
|
|
597
641
|
|
|
598
|
-
//
|
|
642
|
+
// Автоматическое закрытие по data-vg-dismiss
|
|
599
643
|
dismissTrigger(VGToast);
|
|
600
644
|
|
|
601
645
|
/**
|
|
602
|
-
*
|
|
646
|
+
* Реализация Data API
|
|
603
647
|
*/
|
|
604
648
|
EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
605
649
|
const target = Selectors.getElementFromSelector(this);
|
|
@@ -619,3 +663,4 @@ EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, functi
|
|
|
619
663
|
|
|
620
664
|
export default VGToast;
|
|
621
665
|
|
|
666
|
+
|
|
@@ -67,6 +67,7 @@ VGToast.run('Ошибка подключения', {
|
|
|
67
67
|
| `animation.in` | `string` | `'animate__backInUp'` | Анимация появления |
|
|
68
68
|
| `animation.out` | `string` | `'animate__backOutDown'` | Анимация исчезновения |
|
|
69
69
|
| `animation.delay` | `number` | `300` | Длительность анимации (мс) |
|
|
70
|
+
| `animation.effect` | `string \| string[]` | `'none'` | Доп. CSS-эффект отображения: `none`, `fade`, `zoom`, `blur`, `slide-up`, `slide-down` или кастомный класс |
|
|
70
71
|
| `ajax.route` | `string` | `''` | URL для загрузки |
|
|
71
72
|
| `ajax.target` | `string` | `''` | Селектор контейнера (если используется) |
|
|
72
73
|
| `ajax.method` | `string` | `'get'` | HTTP-метод |
|
|
@@ -90,6 +91,16 @@ VGToast.run('Появилось!', {
|
|
|
90
91
|
```
|
|
91
92
|
|
|
92
93
|
### 2. AJAX-уведомление
|
|
94
|
+
### 2.1. Дополнительные эффекты отображения
|
|
95
|
+
```js
|
|
96
|
+
VGToast.run('Сообщение', {
|
|
97
|
+
animation: {
|
|
98
|
+
in: 'animate__fadeIn',
|
|
99
|
+
out: 'animate__fadeOut',
|
|
100
|
+
effect: ['zoom', 'blur']
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
```
|
|
93
104
|
|
|
94
105
|
```js
|
|
95
106
|
VGToast.run('Загрузка...', {
|
|
@@ -142,4 +153,4 @@ MIT. Свободно использовать и модифицировать.
|
|
|
142
153
|
|
|
143
154
|
📌 *Разработано в рамках фронтенд-системы VG Modules.*
|
|
144
155
|
> 🚀 Автор: VEGAS STUDIO (vegas-dev.com)
|
|
145
|
-
> 📍 Поддерживается в проектах VEGAS
|
|
156
|
+
> 📍 Поддерживается в проектах VEGAS
|
|
@@ -68,6 +68,47 @@
|
|
|
68
68
|
cursor: pointer;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
&[class*='vg-toast-effect-'] {
|
|
72
|
+
.vg-toast-wrapper {
|
|
73
|
+
transition: opacity .25s ease, transform .25s ease, filter .25s ease;
|
|
74
|
+
will-change: opacity, transform, filter;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
&.vg-toast-effect-fade {
|
|
79
|
+
&:not(.shown) .vg-toast-wrapper {
|
|
80
|
+
opacity: 0;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
&.vg-toast-effect-zoom {
|
|
85
|
+
&:not(.shown) .vg-toast-wrapper {
|
|
86
|
+
opacity: 0;
|
|
87
|
+
transform: scale(.92);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
&.vg-toast-effect-blur {
|
|
92
|
+
&:not(.shown) .vg-toast-wrapper {
|
|
93
|
+
opacity: 0;
|
|
94
|
+
filter: blur(6px);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
&.vg-toast-effect-slide-up {
|
|
99
|
+
&:not(.shown) .vg-toast-wrapper {
|
|
100
|
+
opacity: 0;
|
|
101
|
+
transform: translateY(14px);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
&.vg-toast-effect-slide-down {
|
|
106
|
+
&:not(.shown) .vg-toast-wrapper {
|
|
107
|
+
opacity: 0;
|
|
108
|
+
transform: translateY(-14px);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
71
112
|
&-button {
|
|
72
113
|
width: auto;
|
|
73
114
|
height: 100%;
|
|
@@ -95,4 +136,4 @@
|
|
|
95
136
|
}
|
|
96
137
|
}
|
|
97
138
|
}
|
|
98
|
-
}
|
|
139
|
+
}
|