vgapp 0.5.9 → 0.6.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.
- package/CHANGELOG.md +3 -0
- package/app/modules/base-module.js +10 -0
- package/app/modules/vgdropdown/js/vgdropdown.js +11 -10
- package/app/modules/vgnav/!old/!vgnav.js +510 -0
- package/app/modules/vgnav/!old/scss/_breakpoints.scss +127 -0
- package/app/modules/vgnav/!old/scss/_hamburger.scss +62 -0
- package/app/modules/vgnav/!old/scss/_placement.scss +70 -0
- package/app/modules/vgnav/!old/scss/_toggle.scss +20 -0
- package/app/modules/vgnav/!old/scss/_variables.scss +70 -0
- package/app/modules/vgnav/!old/scss/vgnav.scss +164 -0
- package/app/modules/vgnav/js/vgnav.js +136 -254
- package/app/modules/vgnav/scss/_placement.scss +1 -1
- package/app/modules/vgnav/scss/_variables.scss +18 -18
- package/app/modules/vgnav/scss/vgnav.scss +13 -10
- package/app/modules/vgselect/js/vgselect.js +9 -1
- package/app/utils/js/components/placement.js +58 -1
- package/build/vgapp.css +1507 -2
- package/build/vgapp.css.map +1 -1
- package/build/vgapp.js +30 -2
- package/package.json +1 -1
- package/app/utils/js/components/responsive.js +0 -83
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import BaseModule from "../../base-module";
|
|
2
2
|
import Selectors from "../../../utils/js/dom/selectors";
|
|
3
|
-
import Responsive from "../../../utils/js/components/responsive";
|
|
4
3
|
import {getSVG} from "../../module-fn";
|
|
5
4
|
import {execute, isDisabled, isVisible, mergeDeepObject, noop, normalizeData} from "../../../utils/js/functions";
|
|
6
5
|
import EventHandler from "../../../utils/js/dom/event";
|
|
7
6
|
import {Manipulator} from "../../../utils/js/dom/manipulator";
|
|
7
|
+
import Placement from "../../../utils/js/components/placement";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Constants
|
|
@@ -15,10 +15,15 @@ const NAME_KEY = 'vg.nav';
|
|
|
15
15
|
/**
|
|
16
16
|
* Constants Classes
|
|
17
17
|
*/
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
18
|
+
const CLASS_NAME = 'vg-nav';
|
|
19
|
+
const CLASS_NAME_SHOW = 'show';
|
|
20
|
+
const CLASS_NAME_FADE = 'fade';
|
|
21
|
+
const CLASS_NAME_ACTIVE = 'active';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Constants toggle
|
|
25
|
+
*/
|
|
26
|
+
const SELECTOR_DATA_TOGGLE = '.'+ CLASS_NAME +' a';
|
|
22
27
|
|
|
23
28
|
/**
|
|
24
29
|
* Constants Events
|
|
@@ -32,38 +37,19 @@ const EVENT_MOUSEOVER_DATA_API = `mouseover.${NAME_KEY}.data.api`;
|
|
|
32
37
|
const EVENT_MOUSEOUT_DATA_API = `mouseout.${NAME_KEY}.data.api`;
|
|
33
38
|
const EVENT_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;
|
|
34
39
|
const EVENT_KEYUP_DATA_API = `keyup.${NAME_KEY}.data.api`;
|
|
35
|
-
const EVENT_RESIZE_DATA_API = `resize.${NAME_KEY}.data.api`;
|
|
36
40
|
|
|
37
41
|
class VGNav extends BaseModule {
|
|
38
42
|
constructor(element, params = {}) {
|
|
39
43
|
super(element);
|
|
40
44
|
|
|
41
45
|
this._params = this._getParams(element, mergeDeepObject({
|
|
42
|
-
breakpoint:
|
|
46
|
+
breakpoint: 'lg',
|
|
43
47
|
placement: 'horizontal',
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
container: 'vg-nav-container',
|
|
49
|
-
wrapper: 'vg-nav-wrapper',
|
|
50
|
-
active: 'vg-nav-active',
|
|
51
|
-
expand: 'vg-nav-expand',
|
|
52
|
-
cloned: 'vg-nav-cloned',
|
|
53
|
-
hover: 'vg-nav-hover',
|
|
54
|
-
flip: 'vg-nav-flip',
|
|
55
|
-
XXXL: 'vg-nav-xxxl',
|
|
56
|
-
XXL: 'vg-nav-xxl',
|
|
57
|
-
XL: 'vg-nav-xl',
|
|
58
|
-
LG: 'vg-nav-lg',
|
|
59
|
-
MD: 'vg-nav-md',
|
|
60
|
-
SM: 'vg-nav-sm',
|
|
61
|
-
XS: 'vg-nav-xs'
|
|
48
|
+
hover: true,
|
|
49
|
+
animation: {
|
|
50
|
+
enable: true,
|
|
51
|
+
timeout: 700
|
|
62
52
|
},
|
|
63
|
-
expand: true,
|
|
64
|
-
hover: false,
|
|
65
|
-
position: true,
|
|
66
|
-
collapse: true,
|
|
67
53
|
toggle: '<span class="default"></span>',
|
|
68
54
|
hamburger: {
|
|
69
55
|
enable: true,
|
|
@@ -71,27 +57,37 @@ class VGNav extends BaseModule {
|
|
|
71
57
|
title: '',
|
|
72
58
|
body: null
|
|
73
59
|
},
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
ajax: {
|
|
78
|
-
route: '',
|
|
79
|
-
target: '',
|
|
80
|
-
method: 'get',
|
|
81
|
-
loader: false,
|
|
82
|
-
once: false,
|
|
83
|
-
output: true,
|
|
60
|
+
callbacks: {
|
|
61
|
+
afterInit: noop,
|
|
62
|
+
afterClick: noop,
|
|
84
63
|
}
|
|
85
64
|
}, params));
|
|
86
65
|
|
|
87
|
-
this.
|
|
88
|
-
|
|
66
|
+
this._classes = {
|
|
67
|
+
hamburgerActive: 'vg-nav-hamburger-active',
|
|
68
|
+
hamburgerAlways: 'vg-nav-hamburger-always',
|
|
69
|
+
hamburger: 'vg-nav-hamburger',
|
|
70
|
+
container: 'vg-nav-container',
|
|
71
|
+
wrapper: 'vg-nav-wrapper',
|
|
72
|
+
active: 'vg-nav-active',
|
|
73
|
+
expand: 'vg-nav-expand',
|
|
74
|
+
cloned: 'vg-nav-cloned',
|
|
75
|
+
hover: 'vg-nav-hover',
|
|
76
|
+
flip: 'vg-nav-flip',
|
|
77
|
+
XXXL: 'vg-nav-xxxl',
|
|
78
|
+
XXL: 'vg-nav-xxl',
|
|
79
|
+
XL: 'vg-nav-xl',
|
|
80
|
+
LG: 'vg-nav-lg',
|
|
81
|
+
MD: 'vg-nav-md',
|
|
82
|
+
SM: 'vg-nav-sm',
|
|
83
|
+
XS: 'vg-nav-xs'
|
|
84
|
+
};
|
|
89
85
|
|
|
90
|
-
this.
|
|
91
|
-
this
|
|
86
|
+
this._navigation = null;
|
|
87
|
+
this.navigation = '.' + this._classes.wrapper;
|
|
92
88
|
|
|
93
|
-
if (this._params.animation === false) {
|
|
94
|
-
this._params.
|
|
89
|
+
if (this._params.animation.enable === false) {
|
|
90
|
+
this._params.animation.timeout = 10
|
|
95
91
|
}
|
|
96
92
|
}
|
|
97
93
|
|
|
@@ -116,59 +112,52 @@ class VGNav extends BaseModule {
|
|
|
116
112
|
build() {
|
|
117
113
|
if (!this.navigation) return;
|
|
118
114
|
|
|
119
|
-
let params = this._params
|
|
115
|
+
let params = this._params,
|
|
116
|
+
classes = this._classes;
|
|
120
117
|
|
|
121
118
|
// Вешаем основные классы
|
|
122
|
-
this._element.classList.add(
|
|
119
|
+
this._element.classList.add(classes.container);
|
|
123
120
|
this._element.classList.add('vg-nav-' + params.placement);
|
|
124
121
|
|
|
125
|
-
// Если нужно оставить список меню или установить медиа точку
|
|
126
|
-
if (!params.breakpoint) {
|
|
127
|
-
params.expand = false;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
122
|
if (!params.hamburger.always) {
|
|
131
|
-
if (!params.breakpoint
|
|
132
|
-
this._element.classList.add(
|
|
123
|
+
if (!params.breakpoint) {
|
|
124
|
+
this._element.classList.add(classes.expand);
|
|
133
125
|
} else if (params.breakpoint !== false) {
|
|
134
126
|
this._element.classList.add('vg-nav-' + params.breakpoint);
|
|
135
127
|
}
|
|
136
128
|
} else {
|
|
137
|
-
this._element.classList.add(
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Меню срабатывает при наведении, если это не мобильное устройство
|
|
141
|
-
if (params.hover) {
|
|
142
|
-
this._element.classList.add(params.classes.hover);
|
|
143
|
-
|
|
144
|
-
if (Responsive.checkMobileOrTablet()) {
|
|
145
|
-
this._element.classList.remove(params.classes.hover);
|
|
146
|
-
}
|
|
129
|
+
this._element.classList.add(classes.hamburgerAlways);
|
|
147
130
|
}
|
|
148
131
|
|
|
149
132
|
// Устанавливаем гамбургер, если его нет в разметке
|
|
150
|
-
if (params.
|
|
151
|
-
let isHamburger = Selectors.find('.' +
|
|
133
|
+
if (params.hamburger.enable) {
|
|
134
|
+
let isHamburger = !!Selectors.find('.' + classes.hamburger, this._element);
|
|
152
135
|
|
|
153
|
-
if (isHamburger
|
|
154
|
-
let
|
|
155
|
-
hamburger = '<span class="' +
|
|
136
|
+
if (!isHamburger) {
|
|
137
|
+
let mobileNavTitle = '',
|
|
138
|
+
hamburger = '<span class="' + classes.hamburger + '--lines"><span></span><span></span><span></span></span>';
|
|
156
139
|
|
|
157
140
|
if (params.hamburger.title) {
|
|
158
|
-
|
|
141
|
+
mobileNavTitle = '<span class="' + classes.hamburger + '--title">'+ params.hamburger.title +'</span>';
|
|
159
142
|
}
|
|
160
143
|
|
|
161
144
|
if (params.hamburger.body !== null) {
|
|
162
145
|
hamburger = params.hamburger.body;
|
|
163
146
|
}
|
|
164
147
|
|
|
165
|
-
|
|
148
|
+
let a = document.createElement('a');
|
|
149
|
+
a.classList.add(classes.hamburger);
|
|
150
|
+
Manipulator.set(a, 'data-vg-toggle', 'sidebar');
|
|
151
|
+
Manipulator.set(a, 'href', '#sidebar-nav');
|
|
152
|
+
a.innerHTML = mobileNavTitle + hamburger;
|
|
153
|
+
|
|
154
|
+
this._element.append(a);
|
|
166
155
|
}
|
|
167
156
|
}
|
|
168
157
|
|
|
169
|
-
// Устанавливаем указатель
|
|
158
|
+
// Устанавливаем указатель дропа
|
|
170
159
|
if (params.toggle) {
|
|
171
|
-
let $dropdown_a = [...Selectors.findAll('.dropdown
|
|
160
|
+
let $dropdown_a = [...Selectors.findAll('.dropdown > a', this._element)],
|
|
172
161
|
toggle = '<span class="toggle">' + params.toggle + '</span>';
|
|
173
162
|
|
|
174
163
|
if ($dropdown_a.length) {
|
|
@@ -181,97 +170,15 @@ class VGNav extends BaseModule {
|
|
|
181
170
|
}
|
|
182
171
|
}
|
|
183
172
|
|
|
184
|
-
if (
|
|
185
|
-
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
if ('afterInit' in this._params.callback) {
|
|
189
|
-
execute(this._params.callback.afterInit, [this]);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Функция сворачивания
|
|
194
|
-
* TODO Придумать что то с мега меню, которое уходит в подменю
|
|
195
|
-
* TODO Так же есть косяки при ресайзе
|
|
196
|
-
*/
|
|
197
|
-
function setCollapse(_this) {
|
|
198
|
-
let width_navigation_responsive = _this.navigation.clientWidth,
|
|
199
|
-
width_all_links_responsive = 0,
|
|
200
|
-
$dots = Selectors.find('.dots', _this.navigation),
|
|
201
|
-
_dots = getSVG('dots');
|
|
202
|
-
|
|
203
|
-
if (_this.$links.length) {
|
|
204
|
-
if ($dots) {
|
|
205
|
-
width_all_links_responsive = $dots.clientWidth
|
|
206
|
-
} else {
|
|
207
|
-
let $a = Selectors.find('a', _this.$links[0]),
|
|
208
|
-
$linkStyle = getComputedStyle($a),
|
|
209
|
-
paddingLeft = normalizeData($linkStyle.paddingLeft.slice(0, -2)),
|
|
210
|
-
paddingRight = normalizeData($linkStyle.paddingRight.slice(0, -2)),
|
|
211
|
-
padding = paddingLeft + paddingRight;
|
|
212
|
-
|
|
213
|
-
// TODO не совсем верно, но мы точно знаем ширину точек в svg - 16px
|
|
214
|
-
width_all_links_responsive = padding + 16;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
for (let $link of _this.$links) {
|
|
218
|
-
let width = $link.getBoundingClientRect().width;
|
|
219
|
-
width_all_links_responsive = width_all_links_responsive + width;
|
|
220
|
-
|
|
221
|
-
if ((width_navigation_responsive) < width_all_links_responsive) {
|
|
222
|
-
_this.movedLinks.push($link);
|
|
223
|
-
$link.remove();
|
|
224
|
-
} else {
|
|
225
|
-
if (_this.movedLinks.length) {
|
|
226
|
-
if ($dots) {
|
|
227
|
-
_this.navigation.insertBefore(_this.movedLinks[0], $dots)
|
|
228
|
-
} else {
|
|
229
|
-
_this.navigation.appendChild(_this.movedLinks[0])
|
|
230
|
-
}
|
|
231
|
-
_this.movedLinks.splice(0, 1);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
if (_this.movedLinks.length) {
|
|
237
|
-
if (!$dots) {
|
|
238
|
-
_this.navigation.insertAdjacentHTML('beforeend','<li class="dropdown dots">' + '<a href="#" aria-expanded="false">'+ _dots +'</a></li>');
|
|
239
|
-
}
|
|
240
|
-
} else {
|
|
241
|
-
if ($dots) {
|
|
242
|
-
$dots.remove();
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
let $d = _this.navigation.querySelector('.dots');
|
|
247
|
-
if ($d && _this.movedLinks.length) {
|
|
248
|
-
let $dropdown = $d.querySelector('ul');
|
|
249
|
-
if ($dropdown) {
|
|
250
|
-
for (let link of _this.movedLinks) {
|
|
251
|
-
$dropdown.prepend(link);
|
|
252
|
-
}
|
|
253
|
-
} else {
|
|
254
|
-
let $dropdown = document.createElement('ul');
|
|
255
|
-
$dropdown.classList.add('dropdown-content');
|
|
256
|
-
$dropdown.classList.add('right');
|
|
257
|
-
|
|
258
|
-
for (let link of _this.movedLinks) {
|
|
259
|
-
$dropdown.prepend(link);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
$d.appendChild($dropdown);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
173
|
+
if ('afterInit' in this._params.callbacks) {
|
|
174
|
+
execute(this._params.callbacks.afterInit, [this]);
|
|
266
175
|
}
|
|
267
176
|
}
|
|
268
177
|
|
|
269
178
|
show(relatedTarget) {
|
|
270
179
|
let target = relatedTarget.relatedTarget;
|
|
271
180
|
|
|
272
|
-
if (!target || isDisabled(target))
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
181
|
+
if (!target || isDisabled(target)) return;
|
|
275
182
|
|
|
276
183
|
if (!target.closest('.dropdown-content')) {
|
|
277
184
|
target.classList.add('first');
|
|
@@ -287,40 +194,17 @@ class VGNav extends BaseModule {
|
|
|
287
194
|
drop.classList.add(CLASS_NAME_SHOW);
|
|
288
195
|
target.classList.add(CLASS_NAME_ACTIVE);
|
|
289
196
|
|
|
290
|
-
|
|
197
|
+
const $placement = new Placement({
|
|
198
|
+
drop: drop
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
$placement._setPlacement();
|
|
291
202
|
|
|
292
203
|
const completeCallBack = () => {
|
|
293
204
|
drop.classList.add(CLASS_NAME_FADE);
|
|
294
205
|
EventHandler.trigger(target, EVENT_KEY_SHOWN, relatedTarget)
|
|
295
206
|
}
|
|
296
|
-
this._queueCallback(completeCallBack, drop, true,
|
|
297
|
-
|
|
298
|
-
/**
|
|
299
|
-
*
|
|
300
|
-
* @param $drop
|
|
301
|
-
*/
|
|
302
|
-
function setDropPosition($drop) {
|
|
303
|
-
let {width, right} = $drop.getBoundingClientRect(),
|
|
304
|
-
window_width = window.innerWidth;
|
|
305
|
-
|
|
306
|
-
let N_right = window_width - right - width;
|
|
307
|
-
|
|
308
|
-
$drop.classList.remove('right');
|
|
309
|
-
$drop.classList.remove('left');
|
|
310
|
-
|
|
311
|
-
let $parent = $drop.closest('li'),
|
|
312
|
-
$ul = $parent.querySelectorAll('ul');
|
|
313
|
-
|
|
314
|
-
if (N_right > width) {
|
|
315
|
-
for (const $el of $ul) {
|
|
316
|
-
$el.classList.add('left');
|
|
317
|
-
}
|
|
318
|
-
} else {
|
|
319
|
-
for (const $el of $ul) {
|
|
320
|
-
$el.classList.add('right');
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
}
|
|
207
|
+
this._queueCallback(completeCallBack, drop, true, 10);
|
|
324
208
|
}
|
|
325
209
|
|
|
326
210
|
hide(relatedTarget) {
|
|
@@ -370,20 +254,16 @@ class VGNav extends BaseModule {
|
|
|
370
254
|
}
|
|
371
255
|
}
|
|
372
256
|
|
|
373
|
-
/**
|
|
374
|
-
* TODO если на странице несколько навигаций, то есть косяки
|
|
375
|
-
* @param element
|
|
376
|
-
* @param params
|
|
377
|
-
*/
|
|
378
257
|
static init(element, params = {}) {
|
|
379
258
|
const instance = VGNav.getOrCreateInstance(element, params);
|
|
380
259
|
instance.build();
|
|
381
260
|
|
|
382
|
-
let drops = Selectors.findAll('.dropdown', instance.
|
|
261
|
+
let drops = Selectors.findAll('.dropdown', instance.navigation);
|
|
383
262
|
|
|
384
|
-
if (instance._params.hover) {
|
|
263
|
+
if (instance._params.hover && !instance.isMobileDevice()) {
|
|
385
264
|
[...drops].forEach(function (el) {
|
|
386
265
|
let currentElem = null;
|
|
266
|
+
|
|
387
267
|
EventHandler.on(el, EVENT_MOUSEOVER_DATA_API, function (event) {
|
|
388
268
|
if (currentElem) return;
|
|
389
269
|
VGNav.hideOpenDrops(event);
|
|
@@ -400,6 +280,7 @@ class VGNav extends BaseModule {
|
|
|
400
280
|
|
|
401
281
|
instance.show(relatedTarget);
|
|
402
282
|
});
|
|
283
|
+
|
|
403
284
|
EventHandler.on(el, EVENT_MOUSEOUT_DATA_API, function (event) {
|
|
404
285
|
if (!currentElem) return;
|
|
405
286
|
|
|
@@ -415,57 +296,18 @@ class VGNav extends BaseModule {
|
|
|
415
296
|
instance.hide({relatedTarget: relatedTarget, elm: elm});
|
|
416
297
|
})
|
|
417
298
|
})
|
|
418
|
-
} else {
|
|
419
|
-
EventHandler.on(document, EVENT_KEYUP_DATA_API, VGNav.clearDrops);
|
|
420
|
-
EventHandler.on(document, EVENT_CLICK_DATA_API, VGNav.clearDrops);
|
|
421
|
-
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
422
|
-
if (!Manipulator.has(this, 'aria-expanded')) {
|
|
423
|
-
return;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
if ('click' in instance._params.callback) {
|
|
427
|
-
execute(instance._params.callback.click, [this]);
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
event.preventDefault();
|
|
431
|
-
|
|
432
|
-
let self = this.closest('.vg-nav'),
|
|
433
|
-
isFirst = self.querySelector('.first');
|
|
434
|
-
|
|
435
|
-
let target = this.closest('.dropdown');
|
|
436
|
-
if (!target) return;
|
|
437
|
-
|
|
438
|
-
if (isDisabled(target) && !isVisible(target)) {
|
|
439
|
-
return;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
if (isFirst && this.closest('.first')) {
|
|
443
|
-
if (target.classList.contains('active')) {
|
|
444
|
-
instance.hide({relatedTarget: target});
|
|
445
|
-
return;
|
|
446
|
-
}
|
|
447
|
-
} else {
|
|
448
|
-
[...Selectors.findAll('.active', self)].forEach(function (el) {
|
|
449
|
-
if (el && el !== target) {
|
|
450
|
-
instance.hide({relatedTarget: el})
|
|
451
|
-
}
|
|
452
|
-
});
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
instance.show({relatedTarget: target});
|
|
456
|
-
});
|
|
457
299
|
}
|
|
458
300
|
|
|
459
301
|
const vgNavSidebar = document.getElementById('sidebar-nav');
|
|
460
|
-
let hamburger = instance._element.querySelector('.' + instance.
|
|
302
|
+
let hamburger = instance._element.querySelector('.' + instance._classes.hamburger);
|
|
461
303
|
|
|
462
304
|
if (vgNavSidebar && hamburger) {
|
|
463
305
|
vgNavSidebar.addEventListener('vg.sidebar.show', function () {
|
|
464
|
-
hamburger.classList.add(instance.
|
|
306
|
+
hamburger.classList.add(instance._classes.hamburgerActive);
|
|
465
307
|
});
|
|
466
308
|
|
|
467
309
|
vgNavSidebar.addEventListener('vg.sidebar.hide', function () {
|
|
468
|
-
hamburger.classList.remove(instance.
|
|
310
|
+
hamburger.classList.remove(instance._classes.hamburgerActive);
|
|
469
311
|
});
|
|
470
312
|
}
|
|
471
313
|
}
|
|
@@ -479,32 +321,72 @@ class VGNav extends BaseModule {
|
|
|
479
321
|
}
|
|
480
322
|
|
|
481
323
|
static hideOpenDrops(event) {
|
|
482
|
-
|
|
324
|
+
[... Selectors.findAll('.dropdown:not(.disabled):not(:disabled).active')].forEach((el) => {
|
|
325
|
+
let target = event.target,
|
|
326
|
+
drop = target.closest('.dropdown');
|
|
483
327
|
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
328
|
+
if (el !== drop) {
|
|
329
|
+
const nav = el.closest('.vg-nav');
|
|
330
|
+
const context = VGNav.getInstance(nav);
|
|
331
|
+
if (!context) return;
|
|
487
332
|
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
333
|
+
let isFirst = !!nav.querySelector('.first'),
|
|
334
|
+
dropContent = !!target.closest('.dropdown-content');
|
|
335
|
+
|
|
336
|
+
if (isFirst && dropContent) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
491
339
|
|
|
492
|
-
|
|
340
|
+
const relatedTarget = { relatedTarget: el }
|
|
493
341
|
|
|
494
|
-
|
|
495
|
-
relatedTarget.clickEvent = event
|
|
342
|
+
context.hide(relatedTarget)
|
|
496
343
|
}
|
|
497
|
-
|
|
498
|
-
context.hide(relatedTarget)
|
|
499
|
-
}
|
|
344
|
+
});
|
|
500
345
|
}
|
|
501
346
|
}
|
|
502
347
|
|
|
503
|
-
EventHandler.on(
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
348
|
+
EventHandler.on(document, EVENT_KEYUP_DATA_API, VGNav.clearDrops);
|
|
349
|
+
EventHandler.on(document, EVENT_CLICK_DATA_API, VGNav.clearDrops);
|
|
350
|
+
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
351
|
+
if (!Manipulator.has(this, 'aria-expanded')) {
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
let nav = this.closest('.vg-nav');
|
|
356
|
+
const instance = VGNav.getOrCreateInstance(nav);
|
|
357
|
+
|
|
358
|
+
if ('afterClick' in instance._params.callbacks) {
|
|
359
|
+
execute(instance._params.callbacks.afterClick, [instance, event, this]);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
if (instance._params.hover) {
|
|
363
|
+
return;
|
|
507
364
|
}
|
|
508
|
-
|
|
365
|
+
|
|
366
|
+
event.preventDefault();
|
|
367
|
+
|
|
368
|
+
let drop = this.parentNode;
|
|
369
|
+
if (!drop) return;
|
|
370
|
+
|
|
371
|
+
if (isDisabled(drop) && !isVisible(drop)) {
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
let isFirst = !!nav.querySelector('.first'),
|
|
376
|
+
dropContent = !!this.closest('.dropdown-content');
|
|
377
|
+
|
|
378
|
+
if (dropContent && isFirst) {
|
|
379
|
+
if (drop.classList.contains('active')) {
|
|
380
|
+
instance.hide({relatedTarget: drop});
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
} else {
|
|
384
|
+
[...Selectors.findAll('.active', nav)].forEach(function (el) {
|
|
385
|
+
instance.hide({relatedTarget: el})
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
instance.show({relatedTarget: drop});
|
|
390
|
+
});
|
|
509
391
|
|
|
510
392
|
export default VGNav;
|
|
@@ -2,16 +2,6 @@ $nav-map: (
|
|
|
2
2
|
transition: all .2s ease-in-out,
|
|
3
3
|
);
|
|
4
4
|
|
|
5
|
-
$grid-breakpoints: (
|
|
6
|
-
xs: 576px,
|
|
7
|
-
sm: 768px,
|
|
8
|
-
md: 992px,
|
|
9
|
-
lg: 1200px,
|
|
10
|
-
xl: 1400px,
|
|
11
|
-
xxl: 1600px,
|
|
12
|
-
xxxl: 1800px
|
|
13
|
-
);
|
|
14
|
-
|
|
15
5
|
$nav-item-map: (
|
|
16
6
|
margin: 0,
|
|
17
7
|
padding: 23px 25px,
|
|
@@ -27,14 +17,6 @@ $nav-item-map: (
|
|
|
27
17
|
position: relative,
|
|
28
18
|
);
|
|
29
19
|
|
|
30
|
-
$hamburger-map: (
|
|
31
|
-
height: 27px,
|
|
32
|
-
line-width: 35px,
|
|
33
|
-
line-color: #333333,
|
|
34
|
-
line-height: 3px,
|
|
35
|
-
line-indent-top: 7px
|
|
36
|
-
);
|
|
37
|
-
|
|
38
20
|
$nav-drop-map: (
|
|
39
21
|
z-index: 10,
|
|
40
22
|
transition: map-get($nav-map, transition),
|
|
@@ -67,4 +49,22 @@ $nav-drop-item-map: (
|
|
|
67
49
|
color: inherit,
|
|
68
50
|
color-hover: inherit,
|
|
69
51
|
transition: map-get($nav-map, transition),
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
$hamburger-map: (
|
|
55
|
+
height: 27px,
|
|
56
|
+
line-width: 35px,
|
|
57
|
+
line-color: #333333,
|
|
58
|
+
line-height: 3px,
|
|
59
|
+
line-indent-top: 7px
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
$grid-breakpoints: (
|
|
63
|
+
xs: 576px,
|
|
64
|
+
sm: 768px,
|
|
65
|
+
md: 992px,
|
|
66
|
+
lg: 1200px,
|
|
67
|
+
xl: 1400px,
|
|
68
|
+
xxl: 1600px,
|
|
69
|
+
xxxl: 1800px
|
|
70
70
|
);
|
|
@@ -43,29 +43,32 @@
|
|
|
43
43
|
border: var(--vg-nav-item-border);
|
|
44
44
|
border-radius: var(--vg-nav-item-border-radius);
|
|
45
45
|
}
|
|
46
|
+
}
|
|
46
47
|
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
li {
|
|
49
|
+
a {
|
|
50
|
+
/** set toggle **/
|
|
51
|
+
@import "toggle";
|
|
52
|
+
}
|
|
49
53
|
}
|
|
50
54
|
|
|
51
55
|
.dropdown {
|
|
52
56
|
position: relative;
|
|
53
57
|
|
|
54
58
|
.dropdown-content {
|
|
55
|
-
transition: var(--vg-nav-drop-transition);
|
|
56
|
-
list-style: none;
|
|
57
|
-
z-index: var(--vg-nav-drop-z-index);
|
|
58
59
|
position: absolute;
|
|
59
|
-
|
|
60
|
+
transform: translateY(20%);
|
|
60
61
|
opacity: 0;
|
|
61
62
|
visibility: hidden;
|
|
63
|
+
list-style: none;
|
|
64
|
+
transition: var(--vg-nav-drop-transition);
|
|
65
|
+
z-index: var(--vg-nav-drop-z-index);
|
|
62
66
|
width: var(--vg-nav-drop-width);
|
|
63
67
|
padding: var(--vg-nav-drop-padding);
|
|
64
68
|
border: 1px solid var(--vg-nav-drop-border-color);
|
|
65
69
|
border-radius: var(--vg-nav-drop-border-radius);
|
|
66
70
|
background-color: var(--vg-nav-drop-bg);
|
|
67
71
|
max-height: var(--vg-nav-drop-max-height);
|
|
68
|
-
overflow: auto;
|
|
69
72
|
|
|
70
73
|
&:not(.show) {
|
|
71
74
|
display: none;
|
|
@@ -74,12 +77,12 @@
|
|
|
74
77
|
&.fade {
|
|
75
78
|
visibility: visible;
|
|
76
79
|
opacity: 1;
|
|
77
|
-
|
|
80
|
+
transform: translateY(0);
|
|
78
81
|
}
|
|
79
82
|
|
|
80
83
|
.dropdown-content {
|
|
81
84
|
&.fade {
|
|
82
|
-
|
|
85
|
+
transform: translateY(0);
|
|
83
86
|
}
|
|
84
87
|
}
|
|
85
88
|
|
|
@@ -111,9 +114,9 @@
|
|
|
111
114
|
position: static;
|
|
112
115
|
|
|
113
116
|
.dropdown-content {
|
|
114
|
-
transition: var(--vg-nav-drop-mega-transition);
|
|
115
117
|
position: absolute;
|
|
116
118
|
left: 0;
|
|
119
|
+
transition: var(--vg-nav-drop-mega-transition);
|
|
117
120
|
width: var(--vg-nav-drop-mega-width);
|
|
118
121
|
min-height: var(--vg-nav-drop-mega-min-height);
|
|
119
122
|
padding: var(--vg-nav-drop-mega-padding);
|
|
@@ -309,7 +309,7 @@ class VGSelect extends BaseModule {
|
|
|
309
309
|
clearTimeout(observerTimout);
|
|
310
310
|
observerTimout = setTimeout(() => {
|
|
311
311
|
VGSelect.build(select, true);
|
|
312
|
-
},
|
|
312
|
+
}, 10);
|
|
313
313
|
});
|
|
314
314
|
|
|
315
315
|
observer.observe(select, {
|
|
@@ -379,6 +379,14 @@ class VGSelect extends BaseModule {
|
|
|
379
379
|
static changeSelector(select, value, data = {}) {
|
|
380
380
|
if (!isObject(data) && isEmptyObj(data)) return;
|
|
381
381
|
|
|
382
|
+
[... select.options].forEach(el => {
|
|
383
|
+
Manipulator.remove(el, 'selected');
|
|
384
|
+
|
|
385
|
+
if (el.value === value) {
|
|
386
|
+
Manipulator.set(el, 'selected', true);
|
|
387
|
+
}
|
|
388
|
+
})
|
|
389
|
+
|
|
382
390
|
select.value = normalizeData(value);
|
|
383
391
|
EventHandler.trigger(select, EVENT_KEY_CHANGE, {data: data});
|
|
384
392
|
EventHandler.trigger(select, 'change', {data: data});
|