vgapp 1.3.4 → 1.3.5
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/app/langs/en/buttons.json +17 -17
- package/app/langs/en/messages.json +36 -36
- package/app/langs/ru/buttons.json +17 -17
- package/app/langs/ru/messages.json +36 -36
- package/app/modules/base-module.js +111 -111
- package/app/modules/vgalert/js/vgalert.js +52 -52
- package/app/modules/vgalert/readme.md +105 -105
- package/app/modules/vgdynamictable/index.js +5 -5
- package/app/modules/vgdynamictable/js/editable.js +19 -19
- package/app/modules/vgdynamictable/js/filters.js +21 -21
- package/app/modules/vgdynamictable/js/fixed.js +179 -179
- package/app/modules/vgdynamictable/js/pagination.js +1 -1
- package/app/modules/vgdynamictable/js/search.js +12 -12
- package/app/modules/vgdynamictable/js/sortable.js +71 -71
- package/app/modules/vgdynamictable/js/summary-footer.js +28 -28
- package/app/modules/vgdynamictable/js/table-remote.js +79 -79
- package/app/modules/vgdynamictable/js/table-url-state.js +31 -31
- package/app/modules/vgdynamictable/js/utils/common.js +48 -48
- package/app/modules/vgdynamictable/js/vgdynamictable.js +268 -268
- package/app/modules/vgdynamictable/readme.md +250 -250
- package/app/modules/vgdynamictable/scss/_skeleton.scss +6 -6
- package/app/modules/vgdynamictable/scss/_sortable.scss +24 -24
- package/app/modules/vgdynamictable/scss/_table.scss +4 -4
- package/app/modules/vgdynamictable/scss/_variables.scss +79 -79
- package/app/modules/vgdynamictable/scss/vgdynamictable.scss +27 -27
- package/app/modules/vgfilepreview/js/i18n.js +56 -56
- package/app/modules/vgfilepreview/js/renderers/image-modal.js +145 -145
- package/app/modules/vgfilepreview/js/renderers/image.js +92 -92
- package/app/modules/vgfilepreview/js/renderers/index.js +19 -19
- package/app/modules/vgfilepreview/js/renderers/office-modal.js +168 -168
- package/app/modules/vgfilepreview/js/renderers/office.js +79 -79
- package/app/modules/vgfilepreview/js/renderers/pdf-modal.js +260 -260
- package/app/modules/vgfilepreview/js/renderers/pdf.js +76 -76
- package/app/modules/vgfilepreview/js/renderers/playlist.js +71 -71
- package/app/modules/vgfilepreview/js/renderers/text-modal.js +343 -343
- package/app/modules/vgfilepreview/js/renderers/text.js +83 -83
- package/app/modules/vgfilepreview/js/renderers/video-modal.js +272 -272
- package/app/modules/vgfilepreview/js/renderers/video.js +80 -80
- package/app/modules/vgfilepreview/js/renderers/zip-modal.js +522 -522
- package/app/modules/vgfilepreview/js/renderers/zip.js +89 -89
- package/app/modules/vgfilepreview/js/vgfilepreview.js +7 -7
- package/app/modules/vgfilepreview/readme.md +68 -68
- package/app/modules/vgfilepreview/scss/_variables.scss +113 -113
- package/app/modules/vgfilepreview/scss/vgfilepreview.scss +464 -464
- package/app/modules/vgfiles/js/base.js +26 -26
- package/app/modules/vgfiles/js/droppable.js +260 -260
- package/app/modules/vgfiles/js/render.js +153 -153
- package/app/modules/vgfiles/js/vgfiles.js +104 -104
- package/app/modules/vgfiles/readme.md +123 -123
- package/app/modules/vgfiles/scss/_variables.scss +18 -18
- package/app/modules/vgfiles/scss/vgfiles.scss +148 -148
- package/app/modules/vgformsender/js/hideshowpass.js +16 -16
- package/app/modules/vgformsender/scss/vgformsender.scss +34 -34
- package/app/modules/vgmodal/js/vgmodal.drag.js +332 -332
- package/app/modules/vgmodal/js/vgmodal.js +188 -188
- package/app/modules/vgmodal/js/vgmodal.resize.js +27 -27
- package/app/modules/vgmodal/scss/vgmodal.scss +14 -14
- package/app/modules/vgnav/js/vgnav.js +135 -135
- package/app/modules/vgnav/readme.md +67 -67
- package/app/modules/vgnestable/README.md +307 -307
- package/app/modules/vgnestable/scss/_variables.scss +60 -60
- package/app/modules/vgnestable/scss/vgnestable.scss +163 -163
- package/app/modules/vgrangeslider/js/skins.js +222 -222
- package/app/modules/vgrangeslider/js/vgrangeslider.js +704 -704
- package/app/modules/vgrangeslider/readme.md +523 -523
- package/app/modules/vgrangeslider/scss/_variables.scss +53 -53
- package/app/modules/vgrangeslider/scss/vgrangeslider.scss +240 -240
- package/app/modules/vgselect/js/vgselect.js +39 -39
- package/app/modules/vgselect/scss/vgselect.scss +22 -22
- package/app/modules/vgspy/readme.md +28 -28
- package/app/modules/vgtoast/readme.md +18 -18
- package/app/modules/vgtoast/scss/vgtoast.scss +48 -48
- package/app/modules/vgtooltip/js/vgtooltip.js +89 -89
- package/app/modules/vgtooltip/readme.md +181 -181
- package/app/utils/js/components/ajax.js +117 -117
- package/app/utils/js/components/audio-metadata.js +240 -240
- package/app/utils/js/components/backdrop.js +17 -17
- package/app/utils/js/components/file-icon.js +109 -109
- package/app/utils/js/components/file-preview.js +304 -304
- package/app/utils/js/components/sanitize.js +150 -150
- package/app/utils/js/components/video-metadata.js +140 -140
- package/app/vgapp.js +46 -46
- package/build/vgapp.css +1 -1
- package/build/vgapp.css.map +1 -1
- package/build/vgapp.js +1 -1
- package/build/vgapp.js.map +1 -1
- package/index.js +14 -14
- package/package.json +3 -2
|
@@ -52,7 +52,7 @@ const SELECTOR_DROPDOWN = `.${CLASS_NAME_DROPDOWN}`;
|
|
|
52
52
|
const SELECTOR_SEARCH_INPUT = `.${CLASS_NAME_SEARCH} input`;
|
|
53
53
|
const SELECTOR_LIST = `.${CLASS_NAME_LIST}`;
|
|
54
54
|
const SELECTOR_LOAD_MORE_BTN = `.${CLASS_NAME_LOAD_MORE}`;
|
|
55
|
-
const DATA_ATTR_COPY_EXCLUDE_DEFAULT = ['inited', 'updating', 'exclude'];
|
|
55
|
+
const DATA_ATTR_COPY_EXCLUDE_DEFAULT = ['inited', 'updating', 'exclude'];
|
|
56
56
|
|
|
57
57
|
/**
|
|
58
58
|
* Класс VGSelect
|
|
@@ -90,7 +90,7 @@ class VGSelect extends BaseModule {
|
|
|
90
90
|
},
|
|
91
91
|
close: true,
|
|
92
92
|
tree: false,
|
|
93
|
-
exclude: 'data-filter-param',
|
|
93
|
+
exclude: 'data-filter-param',
|
|
94
94
|
placeholder: '',
|
|
95
95
|
onInit: null,
|
|
96
96
|
onShow: null,
|
|
@@ -275,12 +275,12 @@ class VGSelect extends BaseModule {
|
|
|
275
275
|
return new Set([...DATA_ATTR_COPY_EXCLUDE_DEFAULT, ...customExcluded]);
|
|
276
276
|
}
|
|
277
277
|
|
|
278
|
-
static _normalizeDataAttrKey(value) {
|
|
279
|
-
return String(value || '')
|
|
280
|
-
.trim()
|
|
281
|
-
.replace(/^data-/, '')
|
|
282
|
-
.toLowerCase();
|
|
283
|
-
}
|
|
278
|
+
static _normalizeDataAttrKey(value) {
|
|
279
|
+
return String(value || '')
|
|
280
|
+
.trim()
|
|
281
|
+
.replace(/^data-/, '')
|
|
282
|
+
.toLowerCase();
|
|
283
|
+
}
|
|
284
284
|
|
|
285
285
|
/**
|
|
286
286
|
* Проверяет, является ли значение "пустым" (соответствует placeholder)
|
|
@@ -788,28 +788,28 @@ class VGSelect extends BaseModule {
|
|
|
788
788
|
* @param {string} value - Значение для выбора
|
|
789
789
|
* @param {Object} [data] - Дополнительные данные
|
|
790
790
|
*/
|
|
791
|
-
static changeSelector(select, value, data = {}) {
|
|
792
|
-
const container = select.nextElementSibling;
|
|
793
|
-
const instance = container ? VGSelect.getInstance(container) : null;
|
|
794
|
-
|
|
795
|
-
select.setAttribute('data-updating', 'true');
|
|
796
|
-
try {
|
|
797
|
-
const opt = select.querySelector(`option[value="${CSS.escape(normalizeData(value))}"]`);
|
|
791
|
+
static changeSelector(select, value, data = {}) {
|
|
792
|
+
const container = select.nextElementSibling;
|
|
793
|
+
const instance = container ? VGSelect.getInstance(container) : null;
|
|
794
|
+
|
|
795
|
+
select.setAttribute('data-updating', 'true');
|
|
796
|
+
try {
|
|
797
|
+
const opt = select.querySelector(`option[value="${CSS.escape(normalizeData(value))}"]`);
|
|
798
798
|
if (!opt) {
|
|
799
799
|
instance?._triggerEvent(EVENT_KEY_ERROR, { error: 'Option not found', value });
|
|
800
800
|
return;
|
|
801
801
|
}
|
|
802
802
|
|
|
803
|
-
const wasSelected = opt.selected;
|
|
804
|
-
const selectedText = opt.textContent.trim();
|
|
805
|
-
|
|
806
|
-
if (select.multiple) {
|
|
807
|
-
opt.selected = data?.selected === false ? false : true;
|
|
808
|
-
} else {
|
|
809
|
-
[...select.options].forEach(o => o.selected = false);
|
|
810
|
-
opt.selected = true;
|
|
811
|
-
select.value = opt.value;
|
|
812
|
-
}
|
|
803
|
+
const wasSelected = opt.selected;
|
|
804
|
+
const selectedText = opt.textContent.trim();
|
|
805
|
+
|
|
806
|
+
if (select.multiple) {
|
|
807
|
+
opt.selected = data?.selected === false ? false : true;
|
|
808
|
+
} else {
|
|
809
|
+
[...select.options].forEach(o => o.selected = false);
|
|
810
|
+
opt.selected = true;
|
|
811
|
+
select.value = opt.value;
|
|
812
|
+
}
|
|
813
813
|
|
|
814
814
|
this.updateUI(select);
|
|
815
815
|
|
|
@@ -832,9 +832,9 @@ class VGSelect extends BaseModule {
|
|
|
832
832
|
* @param {number} index
|
|
833
833
|
* @param {Object} [data]
|
|
834
834
|
*/
|
|
835
|
-
static changeSelectorByIndex(select, index, data = {}) {
|
|
836
|
-
const container = select.nextElementSibling;
|
|
837
|
-
const instance = container ? VGSelect.getInstance(container) : null;
|
|
835
|
+
static changeSelectorByIndex(select, index, data = {}) {
|
|
836
|
+
const container = select.nextElementSibling;
|
|
837
|
+
const instance = container ? VGSelect.getInstance(container) : null;
|
|
838
838
|
|
|
839
839
|
select.setAttribute('data-updating', 'true');
|
|
840
840
|
try {
|
|
@@ -844,17 +844,17 @@ class VGSelect extends BaseModule {
|
|
|
844
844
|
return;
|
|
845
845
|
}
|
|
846
846
|
|
|
847
|
-
const wasSelected = opt.selected;
|
|
848
|
-
const selectedText = opt.textContent.trim();
|
|
849
|
-
const value = opt.value;
|
|
850
|
-
|
|
851
|
-
if (select.multiple) {
|
|
852
|
-
opt.selected = data?.selected === false ? false : true;
|
|
853
|
-
} else {
|
|
854
|
-
[...select.options].forEach(o => o.selected = false);
|
|
855
|
-
opt.selected = true;
|
|
856
|
-
select.value = opt.value;
|
|
857
|
-
}
|
|
847
|
+
const wasSelected = opt.selected;
|
|
848
|
+
const selectedText = opt.textContent.trim();
|
|
849
|
+
const value = opt.value;
|
|
850
|
+
|
|
851
|
+
if (select.multiple) {
|
|
852
|
+
opt.selected = data?.selected === false ? false : true;
|
|
853
|
+
} else {
|
|
854
|
+
[...select.options].forEach(o => o.selected = false);
|
|
855
|
+
opt.selected = true;
|
|
856
|
+
select.value = opt.value;
|
|
857
|
+
}
|
|
858
858
|
|
|
859
859
|
this.updateUI(select);
|
|
860
860
|
|
|
@@ -25,7 +25,7 @@ select {
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
.vg-select {
|
|
28
|
+
.vg-select {
|
|
29
29
|
@include mix-vars('select-current', $select-current-map);
|
|
30
30
|
@include mix-vars('select-current', $select-placeholder-map);
|
|
31
31
|
@include mix-vars('select-dropdown', $select-dropdown-map);
|
|
@@ -117,7 +117,7 @@ select {
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
&-dropdown {
|
|
120
|
+
&-dropdown {
|
|
121
121
|
@each $key, $value in $select-dropdown-map {
|
|
122
122
|
#{$key}: var(--vg-select-dropdown-#{$key})
|
|
123
123
|
}
|
|
@@ -135,25 +135,25 @@ select {
|
|
|
135
135
|
transform: scale(0.75) translateY(-11px);
|
|
136
136
|
transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out;
|
|
137
137
|
z-index: var(--vg-select-dropdown-z-index);
|
|
138
|
-
margin-top: .25rem;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
&.drop-up {
|
|
142
|
-
.vg-select-dropdown {
|
|
143
|
-
top: auto;
|
|
144
|
-
bottom: 100%;
|
|
145
|
-
margin-top: 0;
|
|
146
|
-
margin-bottom: .25rem;
|
|
147
|
-
transform-origin: 50% 100%;
|
|
148
|
-
transform: scale(0.75) translateY(11px);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
&-list {
|
|
153
|
-
margin: 0;
|
|
154
|
-
padding: 0;
|
|
155
|
-
list-style: none;
|
|
156
|
-
display: flex;
|
|
138
|
+
margin-top: .25rem;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
&.drop-up {
|
|
142
|
+
.vg-select-dropdown {
|
|
143
|
+
top: auto;
|
|
144
|
+
bottom: 100%;
|
|
145
|
+
margin-top: 0;
|
|
146
|
+
margin-bottom: .25rem;
|
|
147
|
+
transform-origin: 50% 100%;
|
|
148
|
+
transform: scale(0.75) translateY(11px);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
&-list {
|
|
153
|
+
margin: 0;
|
|
154
|
+
padding: 0;
|
|
155
|
+
list-style: none;
|
|
156
|
+
display: flex;
|
|
157
157
|
flex-direction: column;
|
|
158
158
|
max-height: var(--vg-select-list-max-height);
|
|
159
159
|
overflow-y: auto;
|
|
@@ -281,4 +281,4 @@ select {
|
|
|
281
281
|
opacity: .75;
|
|
282
282
|
}
|
|
283
283
|
}
|
|
284
|
-
}
|
|
284
|
+
}
|
|
@@ -47,10 +47,10 @@
|
|
|
47
47
|
|--------|------|-------------|----------|
|
|
48
48
|
| `offset` | `number` | `null` | *(устарело)* Смещение активации (в пикселях). Используйте `rootMargin` вместо этого. |
|
|
49
49
|
| `rootMargin` | `string` | `'0px 0px -25%'` | Отступы для `IntersectionObserver`. Управляет, насколько "внутрь" должна зайти секция, чтобы стать активной. |
|
|
50
|
-
| `smoothScroll` | `boolean` | `true` | Включить плавную прокрутку при клике на якорные ссылки. |
|
|
51
|
-
| `target` | `HTMLElement \| string` | элемент с `data-vg-toggle="spy"` | Контейнер, внутри которого происходит прокрутка. Если не указан — используется `window`. |
|
|
52
|
-
| `scrollbar` | `Object \| null` | `null` | Инстанс `smooth-scrollbar` или Scrollbar API (если `smooth-scrollbar` импортирован как модуль и не лежит в `window.Scrollbar`). |
|
|
53
|
-
| `threshold` | `number[] \| string` | `[0.1, 0.5, 1]` | Пороги видимости (от 0 до 1), при которых срабатывает активация. Можно передать строку: `'0.1, 0.5, 1'`. |
|
|
50
|
+
| `smoothScroll` | `boolean` | `true` | Включить плавную прокрутку при клике на якорные ссылки. |
|
|
51
|
+
| `target` | `HTMLElement \| string` | элемент с `data-vg-toggle="spy"` | Контейнер, внутри которого происходит прокрутка. Если не указан — используется `window`. |
|
|
52
|
+
| `scrollbar` | `Object \| null` | `null` | Инстанс `smooth-scrollbar` или Scrollbar API (если `smooth-scrollbar` импортирован как модуль и не лежит в `window.Scrollbar`). |
|
|
53
|
+
| `threshold` | `number[] \| string` | `[0.1, 0.5, 1]` | Пороги видимости (от 0 до 1), при которых срабатывает активация. Можно передать строку: `'0.1, 0.5, 1'`. |
|
|
54
54
|
|
|
55
55
|
---
|
|
56
56
|
|
|
@@ -86,29 +86,29 @@
|
|
|
86
86
|
|
|
87
87
|
---
|
|
88
88
|
|
|
89
|
-
## 📚 Заметки
|
|
90
|
-
|
|
91
|
-
- Убедитесь, что все целевые секции имеют `id`, соответствующий `href` ссылки.
|
|
92
|
-
- Секции должны быть видимы (`display: block`, `visibility: visible`).
|
|
93
|
-
- Работает с динамически добавленным контентом, но требует вызова `refresh()` после вставки.
|
|
94
|
-
- Если прокрутка виртуальная (например, `smooth-scrollbar`), передайте `target` как контейнер, на который был инициализирован `smooth-scrollbar`, и при модульном импорте также передайте `scrollbar`.
|
|
95
|
-
|
|
96
|
-
Пример (модульный импорт `smooth-scrollbar`):
|
|
97
|
-
|
|
98
|
-
```js
|
|
99
|
-
import Scrollbar from 'smooth-scrollbar';
|
|
100
|
-
import VGSpy from './app/modules/vgspy';
|
|
101
|
-
|
|
102
|
-
const scrollRoot = document.querySelector('.my-scroll-root');
|
|
103
|
-
Scrollbar.init(scrollRoot);
|
|
104
|
-
|
|
105
|
-
VGSpy.getOrCreateInstance(document.querySelector('[data-vg-toggle="spy"]'), {
|
|
106
|
-
target: scrollRoot,
|
|
107
|
-
scrollbar: Scrollbar,
|
|
108
|
-
});
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
---
|
|
89
|
+
## 📚 Заметки
|
|
90
|
+
|
|
91
|
+
- Убедитесь, что все целевые секции имеют `id`, соответствующий `href` ссылки.
|
|
92
|
+
- Секции должны быть видимы (`display: block`, `visibility: visible`).
|
|
93
|
+
- Работает с динамически добавленным контентом, но требует вызова `refresh()` после вставки.
|
|
94
|
+
- Если прокрутка виртуальная (например, `smooth-scrollbar`), передайте `target` как контейнер, на который был инициализирован `smooth-scrollbar`, и при модульном импорте также передайте `scrollbar`.
|
|
95
|
+
|
|
96
|
+
Пример (модульный импорт `smooth-scrollbar`):
|
|
97
|
+
|
|
98
|
+
```js
|
|
99
|
+
import Scrollbar from 'smooth-scrollbar';
|
|
100
|
+
import VGSpy from './app/modules/vgspy';
|
|
101
|
+
|
|
102
|
+
const scrollRoot = document.querySelector('.my-scroll-root');
|
|
103
|
+
Scrollbar.init(scrollRoot);
|
|
104
|
+
|
|
105
|
+
VGSpy.getOrCreateInstance(document.querySelector('[data-vg-toggle="spy"]'), {
|
|
106
|
+
target: scrollRoot,
|
|
107
|
+
scrollbar: Scrollbar,
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
112
|
|
|
113
113
|
|
|
114
114
|
## 📝 Лицензия
|
|
@@ -119,4 +119,4 @@ MIT. Свободно использовать и модифицировать.
|
|
|
119
119
|
|
|
120
120
|
📌 *Разработано в рамках фронтенд-системы VG Modules.*
|
|
121
121
|
> 🚀 Автор: VEGAS STUDIO (vegas-dev.com)
|
|
122
|
-
> 📍 Поддерживается в проектах VEGAS
|
|
122
|
+
> 📍 Поддерживается в проектах VEGAS
|
|
@@ -66,9 +66,9 @@ VGToast.run('Ошибка подключения', {
|
|
|
66
66
|
| `animation.enable` | `boolean` | `true` | Включить анимации |
|
|
67
67
|
| `animation.in` | `string` | `'animate__backInUp'` | Анимация появления |
|
|
68
68
|
| `animation.out` | `string` | `'animate__backOutDown'` | Анимация исчезновения |
|
|
69
|
-
| `animation.delay` | `number` | `300` | Длительность анимации (мс) |
|
|
70
|
-
| `animation.effect` | `string \| string[]` | `'none'` | Доп. CSS-эффект отображения: `none`, `fade`, `zoom`, `blur`, `slide-up`, `slide-down` или кастомный класс |
|
|
71
|
-
| `ajax.route` | `string` | `''` | URL для загрузки |
|
|
69
|
+
| `animation.delay` | `number` | `300` | Длительность анимации (мс) |
|
|
70
|
+
| `animation.effect` | `string \| string[]` | `'none'` | Доп. CSS-эффект отображения: `none`, `fade`, `zoom`, `blur`, `slide-up`, `slide-down` или кастомный класс |
|
|
71
|
+
| `ajax.route` | `string` | `''` | URL для загрузки |
|
|
72
72
|
| `ajax.target` | `string` | `''` | Селектор контейнера (если используется) |
|
|
73
73
|
| `ajax.method` | `string` | `'get'` | HTTP-метод |
|
|
74
74
|
| `ajax.loader` | `boolean` | `false` | Показывать лоадер |
|
|
@@ -90,20 +90,20 @@ VGToast.run('Появилось!', {
|
|
|
90
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
|
-
```
|
|
104
|
-
|
|
105
|
-
```js
|
|
106
|
-
VGToast.run('Загрузка...', {
|
|
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
|
+
```
|
|
104
|
+
|
|
105
|
+
```js
|
|
106
|
+
VGToast.run('Загрузка...', {
|
|
107
107
|
ajax: {
|
|
108
108
|
route: '/api/notify',
|
|
109
109
|
method: 'post',
|
|
@@ -153,4 +153,4 @@ MIT. Свободно использовать и модифицировать.
|
|
|
153
153
|
|
|
154
154
|
📌 *Разработано в рамках фронтенд-системы VG Modules.*
|
|
155
155
|
> 🚀 Автор: VEGAS STUDIO (vegas-dev.com)
|
|
156
|
-
> 📍 Поддерживается в проектах VEGAS
|
|
156
|
+
> 📍 Поддерживается в проектах VEGAS
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
@import "../../../utils/scss/variables";
|
|
12
12
|
@import "variables";
|
|
13
13
|
|
|
14
|
-
.vg-toast {
|
|
14
|
+
.vg-toast {
|
|
15
15
|
@include mix-vars('toast', $toast-map);
|
|
16
16
|
@include mix-alert-color-mode($class: vg-toast);
|
|
17
17
|
position: fixed;
|
|
@@ -64,52 +64,52 @@
|
|
|
64
64
|
font-weight: var(--vg-toast-body-font-weight);
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
&-pointer {
|
|
68
|
-
cursor: pointer;
|
|
69
|
-
}
|
|
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
|
-
|
|
112
|
-
&-button {
|
|
67
|
+
&-pointer {
|
|
68
|
+
cursor: pointer;
|
|
69
|
+
}
|
|
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
|
+
|
|
112
|
+
&-button {
|
|
113
113
|
width: auto;
|
|
114
114
|
height: 100%;
|
|
115
115
|
display: flex;
|
|
@@ -136,4 +136,4 @@
|
|
|
136
136
|
}
|
|
137
137
|
}
|
|
138
138
|
}
|
|
139
|
-
}
|
|
139
|
+
}
|
|
@@ -7,14 +7,14 @@ import Placement from "../../../utils/js/components/placement";
|
|
|
7
7
|
const NAME = 'tooltip';
|
|
8
8
|
const NAME_KEY = 'vg.tooltip';
|
|
9
9
|
|
|
10
|
-
const SELECTOR_DATA_TOGGLE = '[data-vg-toggle="tooltip"]';
|
|
11
|
-
const SELECTOR_DATA_TOGGLE_POPOVER = '[data-vg-toggle="popover"]';
|
|
12
|
-
|
|
13
|
-
const CLASS_NAME_OPEN = 'vg-tooltip-open';
|
|
14
|
-
const CLASS_NAME_SHOW = 'show';
|
|
15
|
-
const CLASS_NAME_SHOWN = 'shown';
|
|
16
|
-
|
|
17
|
-
const SELECTOR_OPEN_TRIGGER = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}, ${SELECTOR_DATA_TOGGLE_POPOVER}.${CLASS_NAME_SHOW}`;
|
|
10
|
+
const SELECTOR_DATA_TOGGLE = '[data-vg-toggle="tooltip"]';
|
|
11
|
+
const SELECTOR_DATA_TOGGLE_POPOVER = '[data-vg-toggle="popover"]';
|
|
12
|
+
|
|
13
|
+
const CLASS_NAME_OPEN = 'vg-tooltip-open';
|
|
14
|
+
const CLASS_NAME_SHOW = 'show';
|
|
15
|
+
const CLASS_NAME_SHOWN = 'shown';
|
|
16
|
+
|
|
17
|
+
const SELECTOR_OPEN_TRIGGER = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}, ${SELECTOR_DATA_TOGGLE_POPOVER}.${CLASS_NAME_SHOW}`;
|
|
18
18
|
|
|
19
19
|
const EVENT_KEY_HIDE = `${NAME_KEY}.hide`;
|
|
20
20
|
const EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;
|
|
@@ -24,23 +24,23 @@ const EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;
|
|
|
24
24
|
const EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
|
|
25
25
|
const EVENT_KEY_MOUSEENTER = `mouseenter.${NAME_KEY}`;
|
|
26
26
|
const EVENT_KEY_MOUSELEAVE = `mouseleave.${NAME_KEY}`;
|
|
27
|
-
const EVENT_KEY_CLICK_DISMISS = `click.dismiss.${NAME_KEY}`;
|
|
28
|
-
const EVENT_KEY_KEYDOWN = `keydown.dismiss.${NAME_KEY}`;
|
|
29
|
-
|
|
30
|
-
const PLACEMENT_CLASSES = [
|
|
31
|
-
'top',
|
|
32
|
-
'top-start',
|
|
33
|
-
'top-end',
|
|
34
|
-
'bottom',
|
|
35
|
-
'bottom-start',
|
|
36
|
-
'bottom-end',
|
|
37
|
-
'left',
|
|
38
|
-
'left-start',
|
|
39
|
-
'left-end',
|
|
40
|
-
'right',
|
|
41
|
-
'right-start',
|
|
42
|
-
'right-end'
|
|
43
|
-
];
|
|
27
|
+
const EVENT_KEY_CLICK_DISMISS = `click.dismiss.${NAME_KEY}`;
|
|
28
|
+
const EVENT_KEY_KEYDOWN = `keydown.dismiss.${NAME_KEY}`;
|
|
29
|
+
|
|
30
|
+
const PLACEMENT_CLASSES = [
|
|
31
|
+
'top',
|
|
32
|
+
'top-start',
|
|
33
|
+
'top-end',
|
|
34
|
+
'bottom',
|
|
35
|
+
'bottom-start',
|
|
36
|
+
'bottom-end',
|
|
37
|
+
'left',
|
|
38
|
+
'left-start',
|
|
39
|
+
'left-end',
|
|
40
|
+
'right',
|
|
41
|
+
'right-start',
|
|
42
|
+
'right-end'
|
|
43
|
+
];
|
|
44
44
|
|
|
45
45
|
const defaultParams = {
|
|
46
46
|
title: '',
|
|
@@ -86,14 +86,14 @@ class VGTooltip extends BaseModule {
|
|
|
86
86
|
this._showTimeout = null;
|
|
87
87
|
this._hideTimeout = null;
|
|
88
88
|
|
|
89
|
-
this._fixTitle();
|
|
89
|
+
this._fixTitle();
|
|
90
90
|
|
|
91
|
-
this._handleUpdate = () => {
|
|
92
|
-
if (this._isShown()) {
|
|
93
|
-
this._setPlacement();
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
}
|
|
91
|
+
this._handleUpdate = () => {
|
|
92
|
+
if (this._isShown()) {
|
|
93
|
+
this._setPlacement();
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
97
|
|
|
98
98
|
static get NAME() {
|
|
99
99
|
return NAME;
|
|
@@ -370,17 +370,17 @@ class VGTooltip extends BaseModule {
|
|
|
370
370
|
}
|
|
371
371
|
}
|
|
372
372
|
|
|
373
|
-
_syncPlacementClass() {
|
|
374
|
-
if (!this._tooltip) return;
|
|
375
|
-
|
|
376
|
-
const placement = this._tooltip.getAttribute('data-vg-placement');
|
|
377
|
-
|
|
378
|
-
this._tooltip.classList.remove(...PLACEMENT_CLASSES);
|
|
379
|
-
|
|
380
|
-
if (placement) {
|
|
381
|
-
this._tooltip.classList.add(placement);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
373
|
+
_syncPlacementClass() {
|
|
374
|
+
if (!this._tooltip) return;
|
|
375
|
+
|
|
376
|
+
const placement = this._tooltip.getAttribute('data-vg-placement');
|
|
377
|
+
|
|
378
|
+
this._tooltip.classList.remove(...PLACEMENT_CLASSES);
|
|
379
|
+
|
|
380
|
+
if (placement) {
|
|
381
|
+
this._tooltip.classList.add(placement);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
384
|
|
|
385
385
|
_hideOpenedTooltips() {
|
|
386
386
|
Selectors.findAll('.vg-tooltip.show').forEach(tooltip => {
|
|
@@ -404,54 +404,54 @@ class VGTooltip extends BaseModule {
|
|
|
404
404
|
window.removeEventListener('scroll', this._handleUpdate, true);
|
|
405
405
|
}
|
|
406
406
|
|
|
407
|
-
_clearTimeouts() {
|
|
408
|
-
if (this._showTimeout) {
|
|
409
|
-
clearTimeout(this._showTimeout);
|
|
410
|
-
this._showTimeout = null;
|
|
407
|
+
_clearTimeouts() {
|
|
408
|
+
if (this._showTimeout) {
|
|
409
|
+
clearTimeout(this._showTimeout);
|
|
410
|
+
this._showTimeout = null;
|
|
411
411
|
}
|
|
412
412
|
|
|
413
413
|
if (this._hideTimeout) {
|
|
414
|
-
clearTimeout(this._hideTimeout);
|
|
415
|
-
this._hideTimeout = null;
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
const getShownInstances = () => {
|
|
421
|
-
return Selectors.findAll(SELECTOR_OPEN_TRIGGER)
|
|
422
|
-
.map(element => VGTooltip.getInstance(element))
|
|
423
|
-
.filter(Boolean);
|
|
424
|
-
};
|
|
425
|
-
|
|
426
|
-
EventHandler.on(document, EVENT_KEY_KEYDOWN, event => {
|
|
427
|
-
if (event.key !== 'Escape') return;
|
|
428
|
-
|
|
429
|
-
getShownInstances().forEach(instance => {
|
|
430
|
-
if (!instance._params.keyboard || !instance._isShown()) return;
|
|
431
|
-
|
|
432
|
-
instance.hide();
|
|
433
|
-
});
|
|
434
|
-
});
|
|
435
|
-
|
|
436
|
-
EventHandler.on(document, EVENT_KEY_CLICK_DISMISS, event => {
|
|
437
|
-
getShownInstances().forEach(instance => {
|
|
438
|
-
if (!instance._params.closeOnOutsideClick) return;
|
|
439
|
-
if (!instance._params.trigger.includes('click') && !instance._params.popover) return;
|
|
440
|
-
if (!instance._isShown()) return;
|
|
441
|
-
|
|
442
|
-
if (
|
|
443
|
-
instance._tooltip?.contains(event.target) ||
|
|
444
|
-
instance._element.contains(event.target)
|
|
445
|
-
) {
|
|
446
|
-
return;
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
instance.hide();
|
|
450
|
-
});
|
|
451
|
-
});
|
|
452
|
-
|
|
453
|
-
EventHandler.on(document, EVENT_KEY_MOUSEENTER, SELECTOR_DATA_TOGGLE, function () {
|
|
454
|
-
const instance = VGTooltip.getOrCreateInstance(this);
|
|
414
|
+
clearTimeout(this._hideTimeout);
|
|
415
|
+
this._hideTimeout = null;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
const getShownInstances = () => {
|
|
421
|
+
return Selectors.findAll(SELECTOR_OPEN_TRIGGER)
|
|
422
|
+
.map(element => VGTooltip.getInstance(element))
|
|
423
|
+
.filter(Boolean);
|
|
424
|
+
};
|
|
425
|
+
|
|
426
|
+
EventHandler.on(document, EVENT_KEY_KEYDOWN, event => {
|
|
427
|
+
if (event.key !== 'Escape') return;
|
|
428
|
+
|
|
429
|
+
getShownInstances().forEach(instance => {
|
|
430
|
+
if (!instance._params.keyboard || !instance._isShown()) return;
|
|
431
|
+
|
|
432
|
+
instance.hide();
|
|
433
|
+
});
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
EventHandler.on(document, EVENT_KEY_CLICK_DISMISS, event => {
|
|
437
|
+
getShownInstances().forEach(instance => {
|
|
438
|
+
if (!instance._params.closeOnOutsideClick) return;
|
|
439
|
+
if (!instance._params.trigger.includes('click') && !instance._params.popover) return;
|
|
440
|
+
if (!instance._isShown()) return;
|
|
441
|
+
|
|
442
|
+
if (
|
|
443
|
+
instance._tooltip?.contains(event.target) ||
|
|
444
|
+
instance._element.contains(event.target)
|
|
445
|
+
) {
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
instance.hide();
|
|
450
|
+
});
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
EventHandler.on(document, EVENT_KEY_MOUSEENTER, SELECTOR_DATA_TOGGLE, function () {
|
|
454
|
+
const instance = VGTooltip.getOrCreateInstance(this);
|
|
455
455
|
|
|
456
456
|
if (instance._params.trigger.includes('hover')) {
|
|
457
457
|
instance.show(this);
|
|
@@ -490,4 +490,4 @@ EventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_POPOVER
|
|
|
490
490
|
instance.toggle(this);
|
|
491
491
|
});
|
|
492
492
|
|
|
493
|
-
export default VGTooltip;
|
|
493
|
+
export default VGTooltip;
|