vgapp 0.7.9 → 0.8.0

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 (47) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/app/langs/en/buttons.json +10 -0
  3. package/app/langs/en/messages.json +32 -0
  4. package/app/langs/en/titles.json +6 -0
  5. package/app/langs/ru/buttons.json +10 -0
  6. package/app/langs/ru/messages.json +32 -0
  7. package/app/langs/ru/titles.json +6 -0
  8. package/app/modules/base-module.js +12 -1
  9. package/app/modules/module-fn.js +20 -9
  10. package/app/modules/vgalert/js/vgalert.js +12 -6
  11. package/app/modules/vgalert/readme.md +1 -1
  12. package/app/modules/vgcollapse/readme.md +1 -1
  13. package/app/modules/vgdropdown/js/vgdropdown.js +140 -38
  14. package/app/modules/vgdropdown/readme.md +225 -0
  15. package/app/modules/vgfiles/js/base.js +499 -0
  16. package/app/modules/vgfiles/js/droppable.js +159 -0
  17. package/app/modules/vgfiles/js/loader.js +389 -0
  18. package/app/modules/vgfiles/js/render.js +83 -0
  19. package/app/modules/vgfiles/js/sortable.js +155 -0
  20. package/app/modules/vgfiles/js/vgfiles.js +796 -280
  21. package/app/modules/vgfiles/readme.md +193 -0
  22. package/app/modules/vgfiles/scss/_animations.scss +18 -0
  23. package/app/modules/vgfiles/scss/_mixins.scss +73 -0
  24. package/app/modules/vgfiles/scss/_variables.scss +103 -26
  25. package/app/modules/vgfiles/scss/vgfiles.scss +573 -60
  26. package/app/modules/vgformsender/js/vgformsender.js +5 -1
  27. package/app/modules/vgformsender/readme.md +1 -1
  28. package/app/modules/vglawcookie/js/vglawcookie.js +96 -62
  29. package/app/modules/vglawcookie/readme.md +102 -0
  30. package/app/modules/vgsidebar/js/vgsidebar.js +6 -4
  31. package/app/utils/js/components/ajax.js +172 -122
  32. package/app/utils/js/components/animation.js +124 -39
  33. package/app/utils/js/components/backdrop.js +54 -31
  34. package/app/utils/js/components/lang.js +69 -88
  35. package/app/utils/js/components/params.js +34 -31
  36. package/app/utils/js/components/scrollbar.js +118 -67
  37. package/app/utils/js/components/templater.js +14 -4
  38. package/app/utils/js/dom/cookie.js +107 -64
  39. package/app/utils/js/dom/data.js +68 -20
  40. package/app/utils/js/dom/event.js +272 -239
  41. package/app/utils/js/dom/manipulator.js +135 -62
  42. package/app/utils/js/dom/selectors.js +134 -59
  43. package/app/utils/js/functions.js +183 -349
  44. package/build/vgapp.css +1 -1
  45. package/build/vgapp.css.map +1 -1
  46. package/package.json +1 -1
  47. package/app/utils/js/components/overflow.js +0 -28
@@ -0,0 +1,225 @@
1
+ # VGDropdown — Модуль выпадающего списка
2
+
3
+ **VGDropdown** — это универсальный и гибко настраиваемый JavaScript-компонент для создания интерактивных
4
+ выпадающих меню (dropdown) в веб-интерфейсах. Поддерживает позиционирование, анимации, AJAX-загрузку контента,
5
+ работу с hover/кликами, клавиатурную навигацию и доступность.
6
+
7
+ ---
8
+
9
+ ## 📌 Основные возможности
10
+
11
+ - Открытие/закрытие по клику или наведению (`hover`)
12
+ - Поддержка **автоматического позиционирования** (с учётом границ экрана и overflow)
13
+ - Полная **клавиатурная навигация** (стрелки, Esc, Tab)
14
+ - **AJAX-загрузка контента** динамически
15
+ - **CSS-анимации** (вход/выход) с использованием Animate.css
16
+ - Поддержка **fade-эффектов** и кастомных задержек
17
+ - Автоматическое закрытие других открытых dropdown'ов
18
+ - Полная **доступность (a11y)**: `aria-expanded`
19
+ - Совместимость с **мобильными устройствами**
20
+ - Гибкая инициализация: через JS или `data-*` атрибуты
21
+
22
+ ---
23
+
24
+ ## 🧩 Структура HTML
25
+
26
+ ```bladehtml
27
+ <div class="vg-dropdown">
28
+ <a href="#" data-vg-toggle="dropdown" data-params='{"hover": "true"}' ( или data-hover="true") class="btn btn-primary" aria-expanded="false">Open</a>
29
+ <div class="vg-dropdown-content">
30
+ <div class="vg-dropdown-container">
31
+ <ul class="list-group">
32
+ <li class="list-group-item"><a href="#">Home</a></li>
33
+ <li class="list-group-item"><a href="#">Services</a></li>
34
+ <li class="list-group-item"><a href="#">About</a></li>
35
+ <li class="list-group-item"><a href="#">Contacts</a></li>
36
+ </ul>
37
+ </div>
38
+ </div>
39
+ </div>
40
+ ```
41
+
42
+ > 💡 Убедитесь, что `.vg-dropdown-content` находится внутри `.vg-dropdown`, либо укажите селектор явно через `data-vg-target`.
43
+
44
+ ---
45
+
46
+ ## ⚙️ Параметры инициализации
47
+
48
+ | Параметр | Тип | По умолчанию | Описание |
49
+ |--------|------|-------------|-------------------------------------------------------------------------------|
50
+ | `placement` | `string` | `'auto'` | Позиция меню: `'top-start'`, `'bottom-start'`, `'left-start'`, `'right-start'`, `'auto'` и т.д. |
51
+ | `hover` | `boolean` | `false` | Открывать при наведении мыши (на десктопе) |
52
+ | `animation.fade` | `boolean` | `true` | Добавить класс `fade` при показе |
53
+ | `animation.enable` | `boolean` | `false` | Включить CSS-анимации |
54
+ | `animation.in` | `string` | `'animate__flipInY'` | Класс анимации входа (например, Animate.css) |
55
+ | `animation.out` | `string` | `'animate__flipOutY'` | Класс анимации выхода |
56
+ | `animation.delay` | `number` | `300` | Задержка перед удалением `.show` (в мс) |
57
+ | `ajax.route` | `string` | `''` | URL для загрузки контента |
58
+ | `ajax.target` | `string` | `''` | Селектор внутри `.vg-dropdown-content` для вставки данных |
59
+ | `ajax.method` | `string` | `'get'` | HTTP-метод запроса |
60
+ | `ajax.loader` | `boolean` | `false` | Показывать лоадер при загрузке |
61
+ | `ajax.once` | `boolean` | `false` | Загружать контент только один раз |
62
+ | `ajax.output` | `boolean` | `true` | Вставлять ответ в DOM |
63
+
64
+ ---
65
+
66
+ ## 🚀 Инициализация
67
+
68
+ ### Через JavaScript
69
+ ```js
70
+ import VGDropdown from 'app/modules/vgdropdown/js/vgdropdown';
71
+
72
+ const dropdown = new VGDropdown(document.querySelector('[data-vg-toggle="dropdown"]'), {
73
+ placement: 'bottom-start',
74
+ hover: true,
75
+ animation: {
76
+ enable: true,
77
+ in: 'animate__fadeInDown',
78
+ out: 'animate__fadeOutUp',
79
+ delay: 200
80
+ },
81
+ ajax: {
82
+ route: '',
83
+ target: '',
84
+ method: 'get',
85
+ once: true
86
+ }
87
+ });
88
+ ```
89
+
90
+ > Атрибуты автоматически преобразуются в параметры:
91
+ > `data-placement` → `placement`
92
+ > `data-ajax-route` → `ajax.route`
93
+
94
+ ---
95
+
96
+ ## 🔁 Методы
97
+
98
+ | Метод | Описание |
99
+ |------|--------|
100
+ | `.toggle()` | Переключает состояние (открыть/закрыть) |
101
+ | `.show()` | Открывает меню |
102
+ | `.hide()` | Закрывает меню |
103
+ | `.dispose()` | Удаляет экземпляр и обработчики событий |
104
+ | `.getInstance(element)` | Получить существующий экземпляр |
105
+ | `.getOrCreateInstance(element, params)` | Получить или создать экземпляр |
106
+
107
+ ```js
108
+ VGDropdown.getOrCreateInstance().hide(); // Закрыть drop
109
+ ```
110
+ ---
111
+
112
+ ## 📣 События
113
+
114
+ VGDropdown генерирует пользовательские события.
115
+
116
+ | Событие | Срабатывает | Детали (`event.detail`) |
117
+ |--------|-------------|-------------------------|
118
+ | `vg.dropdown.show` | Перед открытием | `relatedTarget` — кнопка |
119
+ | `vg.dropdown.shown` | После открытия | `relatedTarget` |
120
+ | `vg.dropdown.hide` | Перед закрытием | `relatedTarget` |
121
+ | `vg.dropdown.hidden` | После закрытия | `relatedTarget` |
122
+ | `vg.dropdown.loaded` | После AJAX-загрузки | `stats`, `data` |
123
+
124
+ ```js
125
+ dropdown._drop.addEventListener('vg.dropdown.shown', (e) => {
126
+ console.log('Дроп открыт', e.detail.relatedTarget);
127
+ });
128
+ ```
129
+
130
+ ---
131
+
132
+ ## 🖱️ Поведение при наведении (`hover`)
133
+
134
+ ```js
135
+ hover: true
136
+ ```
137
+
138
+ - Работает только на десктопах (`!isMobileDevice()`)
139
+ - Автоматически закрывается при уходе курсора
140
+ - Не конфликтует с другими открытыми меню
141
+
142
+ ---
143
+
144
+ ## 🔁 AJAX-загрузка контента
145
+
146
+ ```js
147
+ ajax: {
148
+ route: '/menu',
149
+ target: '#drop-content', // Целевой селектор внутри .vg-dropdown-container
150
+ method: 'get',
151
+ once: true,
152
+ loader: false,
153
+ output: true
154
+ }
155
+ ```
156
+ - Контент загружается при первом открытии (если `once: true`)
157
+ - Ответ вставляется в указанный селектор
158
+ - Генерируется событие `vg.dropdown.loaded`
159
+
160
+ ---
161
+
162
+ ## 🎨 Анимации
163
+
164
+ Поддерживается два режима:
165
+
166
+ ### 1. Fade (CSS)
167
+ ### 2. CSS-анимации (через Animate.css)
168
+ ```js
169
+ animation: { enable: true, in: 'animate__fadeInUp', out: 'animate__fadeOutDown' }
170
+ ```
171
+ > Убедитесь, что подключили animate.css или свои классы анимаций.
172
+
173
+ ---
174
+
175
+ ## 📱 Адаптивность и мобильные устройства
176
+
177
+ - На мобильных устройствах `hover` отключается
178
+ - При открытии временно блокируются `mouseover` события на других элементах (для стабильности)
179
+ - Поддерживает тач-события корректно
180
+
181
+ ---
182
+
183
+ ## 🔐 Доступность (a11y)
184
+
185
+ - `aria-expanded` автоматически обновляется
186
+ - Поддержка клавиатуры: **Enter**, **Space**, **Esc**, **↑↓**
187
+ - Закрытие при клике вне или нажатии `Tab`
188
+
189
+ ---
190
+ ## 🧰 Статические методы
191
+
192
+ | Метод | Описание |
193
+ |------|--------|
194
+ | `VGDropdown.hideOpenToggles(event)` | Закрывает все открытые меню |
195
+ | `VGDropdown.keydownHandler(event)` | Обработчик клавиш |
196
+ | `VGDropdown.clearDrops(event)` | Обработчик кликов вне и Tab |
197
+
198
+ ---
199
+
200
+ ## 📦 CSS-классы
201
+
202
+ | Класс | Назначение |
203
+ |------|----------|
204
+ | `.vg-dropdown` | Родительский контейнер |
205
+ | `.vg-dropdown-content` | Выпадающее меню |
206
+ | `.show` | Показывает элемент |
207
+ | `.fade` | Эффект затухания |
208
+ | `.open` | Альтернатива fade (без анимации) |
209
+ | `[data-vg-toggle="dropdown"]` | Кнопка-переключатель |
210
+
211
+ ---
212
+
213
+ ## 📄 Лицензия
214
+
215
+ MIT — свободное использование и модификация.
216
+
217
+ ---
218
+
219
+ 🛠 Разработано с использованием современных паттернов и лучших практик.
220
+ Создано для масштабируемых, доступных и красивых интерфейсов.
221
+
222
+ ---
223
+
224
+ > 🚀 Автор: VEGAS STUDIO (vegas-dev.com)
225
+ > 📍 Поддерживается в проектах VEGAS