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.
@@ -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 CLASS_NAME_SHOW = 'show';
19
- const CLASS_NAME_FADE = 'fade';
20
- const CLASS_NAME_ACTIVE = 'active';
21
- const SELECTOR_DATA_TOGGLE = '.vg-nav a';
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: false,
46
+ breakpoint: 'lg',
43
47
  placement: 'horizontal',
44
- classes: {
45
- hamburgerActive: 'vg-nav-hamburger-active',
46
- hamburgerAlways: 'vg-nav-hamburger-always',
47
- hamburger: 'vg-nav-hamburger',
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
- callback: noop,
75
- animation: true,
76
- timeoutAnimation: 300,
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._navigation = null;
88
- this.navigation = '.' + this._params.classes.wrapper;
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.movedLinks = [];
91
- this.$links = Selectors.findAll('.' + this._params.classes.wrapper + ' > li', this.navigation)
86
+ this._navigation = null;
87
+ this.navigation = '.' + this._classes.wrapper;
92
88
 
93
- if (this._params.animation === false) {
94
- this._params.timeoutAnimation = 10
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(params.classes.container);
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 || !params.expand) {
132
- this._element.classList.add(params.classes.expand);
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(params.classes.hamburgerAlways);
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.expand && !params.hamburger.body && params.hamburger.enable) {
151
- let isHamburger = Selectors.find('.' + params.classes.hamburger, this._element);
133
+ if (params.hamburger.enable) {
134
+ let isHamburger = !!Selectors.find('.' + classes.hamburger, this._element);
152
135
 
153
- if (isHamburger === null) {
154
- let mTitle = '',
155
- hamburger = '<span class="' + params.classes.hamburger + '--lines"><span></span><span></span><span></span></span>';
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
- mTitle = '<span class="' + params.classes.hamburger + '--title">'+ params.hamburger.title +'</span>';
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
- this._element.insertAdjacentHTML('afterbegin','<a href="#sidebar-nav" class="' + params.classes.hamburger + '" data-vg-toggle="sidebar">' + mTitle + hamburger +'</a>');
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-mega > a, .dropdown > a', this._element)],
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 (params.collapse && Responsive.check(this) && params.placement !== 'vertical') {
185
- setCollapse(this);
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
- setDropPosition(drop)
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, 50);
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._navigation)
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._params.classes.hamburger);
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._params.classes.hamburgerActive);
306
+ hamburger.classList.add(instance._classes.hamburgerActive);
465
307
  });
466
308
 
467
309
  vgNavSidebar.addEventListener('vg.sidebar.hide', function () {
468
- hamburger.classList.remove(instance._params.classes.hamburgerActive);
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
- const openToggles = Selectors.findAll('.dropdown:not(.disabled):not(:disabled).active');
324
+ [... Selectors.findAll('.dropdown:not(.disabled):not(:disabled).active')].forEach((el) => {
325
+ let target = event.target,
326
+ drop = target.closest('.dropdown');
483
327
 
484
- for (const toggle of openToggles) {
485
- const context = VGNav.getInstance(toggle.closest('.vg-nav'));
486
- if (!context) continue;
328
+ if (el !== drop) {
329
+ const nav = el.closest('.vg-nav');
330
+ const context = VGNav.getInstance(nav);
331
+ if (!context) return;
487
332
 
488
- if (event.target.closest('.first')) {
489
- return;
490
- }
333
+ let isFirst = !!nav.querySelector('.first'),
334
+ dropContent = !!target.closest('.dropdown-content');
335
+
336
+ if (isFirst && dropContent) {
337
+ return;
338
+ }
491
339
 
492
- const relatedTarget = { relatedTarget: toggle }
340
+ const relatedTarget = { relatedTarget: el }
493
341
 
494
- if (event.type === 'click') {
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(window, EVENT_RESIZE_DATA_API, function () {
504
- if (Selectors.find('.vg-nav')) {
505
- const instance = VGNav.getOrCreateInstance('.vg-nav', {});
506
- instance.build();
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;
@@ -3,7 +3,7 @@
3
3
  flex-direction: row;
4
4
 
5
5
  .dropdown {
6
- > ul {
6
+ > .dropdown-content {
7
7
  &.left, .left {
8
8
  left: 0;
9
9
  }
@@ -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
- /** set toggle **/
48
- @import "toggle";
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
- top: 120%;
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
- top: 100%;
80
+ transform: translateY(0);
78
81
  }
79
82
 
80
83
  .dropdown-content {
81
84
  &.fade {
82
- top: 0;
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
- }, 100);
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});