vgapp 1.5.8 → 1.5.9

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.
@@ -456,10 +456,13 @@ class VGAlert {
456
456
  : VGModal.getOrCreateInstance(containerWrap);
457
457
  const container = Selectors.find('.vg-modal-content', containerWrap) || containerWrap;
458
458
 
459
- const overlay = document.createElement('div');
460
-
461
- overlay.className = `${CLASS_NAME_ALERT}-overlay`;
462
- this._applySizeClass(overlay);
459
+ const overlay = document.createElement('div');
460
+
461
+ overlay.className = `${CLASS_NAME_ALERT}-overlay`;
462
+ if (containerWrap.classList.contains('vg-modal')) {
463
+ overlay.classList.add(`${CLASS_NAME_ALERT}-overlay--modal`);
464
+ }
465
+ this._applySizeClass(overlay);
463
466
  overlay.append(this._buildContent());
464
467
 
465
468
  container.append(overlay);
@@ -55,17 +55,24 @@
55
55
  }
56
56
  }
57
57
 
58
- .vg-alert-wrapper {
59
- background-color: var(--vg-alert-overlay-wrapper-bg);
60
- width: var(--vg-alert-overlay-wrapper-width);
58
+ .vg-alert-wrapper {
59
+ background-color: var(--vg-alert-overlay-wrapper-bg);
60
+ width: var(--vg-alert-overlay-wrapper-width);
61
61
  position: absolute;
62
62
  left: var(--vg-alert-overlay-wrapper-start);
63
63
  z-index: 1;
64
64
  transform: var(--vg-alert-overlay-wrapper-transform);
65
65
  top: var(--vg-alert-overlay-wrapper-top);
66
- transition: var(--vg-alert-overlay-wrapper-transition);
67
- }
68
- }
66
+ transition: var(--vg-alert-overlay-wrapper-transition);
67
+ }
68
+
69
+ &--modal {
70
+ .vg-alert-wrapper {
71
+ position: sticky;
72
+ top: calc(var(--vg-alert-overlay-wrapper-top) + 1rem);
73
+ }
74
+ }
75
+ }
69
76
 
70
77
  &-dropdown {
71
78
  width: 360px;
@@ -5,8 +5,9 @@
5
5
  import BaseModule from "../../base-module";
6
6
  import Selectors from "../../../utils/js/dom/selectors";
7
7
  import {
8
- execute,
9
- isDisabled,
8
+ execute,
9
+ getTransitionDurationFromElement,
10
+ isDisabled,
10
11
  isMobileDevice,
11
12
  isVisible,
12
13
  mergeDeepObject,
@@ -127,8 +128,9 @@ class VGNav extends BaseModule {
127
128
  this._params.animation.timeout = 10;
128
129
  }
129
130
 
130
- this._openDrops = new Map();
131
- this._pointerPosition = null;
131
+ this._openDrops = new Map();
132
+ this._pointerPosition = null;
133
+ this._smoothSwitch = null;
132
134
  this._handleScroll = this._handleScroll.bind(this);
133
135
  this._handleResize = this._handleResize.bind(this);
134
136
  }
@@ -397,7 +399,7 @@ class VGNav extends BaseModule {
397
399
  return drop.previousElementSibling === relatedDrop || drop.nextElementSibling === relatedDrop;
398
400
  }
399
401
 
400
- _canSmoothSwitchFirstLevel(event, currentDrop, relatedDrop) {
402
+ _canSmoothSwitchFirstLevel(event, currentDrop, relatedDrop) {
401
403
  const smoothParams = this._params.hoversmoothfirstlevel || {};
402
404
  if (!smoothParams.enable) return false;
403
405
  if (!currentDrop || !relatedDrop || currentDrop === relatedDrop) return false;
@@ -406,8 +408,52 @@ class VGNav extends BaseModule {
406
408
  if (!this._isAdjacentDropdown(currentDrop, relatedDrop)) return false;
407
409
  if (smoothParams.horizontalOnly && !this._isHorizontalPointerMove(event)) return false;
408
410
 
409
- return true;
410
- }
411
+ return true;
412
+ }
413
+
414
+ _scheduleSmoothSwitchCompletion(dropContent, callback) {
415
+ const duration = getTransitionDurationFromElement(dropContent);
416
+ if (!duration) {
417
+ callback();
418
+ return;
419
+ }
420
+
421
+ window.setTimeout(callback, duration);
422
+ }
423
+
424
+ _startSmoothSwitch(currentDrop, previousDrop, dropContent) {
425
+ const staleSwitch = this._smoothSwitch;
426
+ const transfer = { currentDrop, previousDrop };
427
+ this._smoothSwitch = transfer;
428
+
429
+ if (
430
+ staleSwitch?.previousDrop
431
+ && staleSwitch.previousDrop !== currentDrop
432
+ && staleSwitch.previousDrop !== previousDrop
433
+ && staleSwitch.previousDrop.classList.contains(CLASS_NAME_ACTIVE)
434
+ ) {
435
+ this.hide({ relatedTarget: staleSwitch.previousDrop });
436
+ }
437
+
438
+ this._scheduleSmoothSwitchCompletion(dropContent, () => {
439
+ if (this._smoothSwitch !== transfer) return;
440
+ this._smoothSwitch = null;
441
+ if (!currentDrop.isConnected || !previousDrop.isConnected) return;
442
+ if (!currentDrop.classList.contains(CLASS_NAME_ACTIVE)) return;
443
+ if (previousDrop.classList.contains(CLASS_NAME_ACTIVE)) {
444
+ this.hide({ relatedTarget: previousDrop });
445
+ }
446
+ });
447
+ }
448
+
449
+ _cancelSmoothSwitch(exceptDrop = null) {
450
+ const transfer = this._smoothSwitch;
451
+ this._smoothSwitch = null;
452
+ if (!transfer?.previousDrop || transfer.previousDrop === exceptDrop) return;
453
+ if (transfer.previousDrop.classList.contains(CLASS_NAME_ACTIVE)) {
454
+ this.hide({ relatedTarget: transfer.previousDrop });
455
+ }
456
+ }
411
457
 
412
458
  static init(element, params = {}) {
413
459
  const instance = VGNav.getOrCreateInstance(element, params);
@@ -435,19 +481,24 @@ class VGNav extends BaseModule {
435
481
  const previousDrop = event.relatedTarget?.closest('.dropdown');
436
482
  const useSmoothSwitch = instance._canSmoothSwitchFirstLevel(event, target, previousDrop);
437
483
 
438
- if (!useSmoothSwitch) {
439
- VGNav.hideOpenDrops(event);
484
+ if (!useSmoothSwitch) {
485
+ instance._cancelSmoothSwitch(target);
486
+ VGNav.hideOpenDrops(event);
440
487
  }
441
488
 
442
489
  let relatedTarget = {
443
490
  relatedTarget: target
444
491
  };
445
492
 
446
- instance.show(relatedTarget);
447
-
448
- if (useSmoothSwitch && previousDrop && previousDrop.classList.contains(CLASS_NAME_ACTIVE)) {
449
- instance.hide({ relatedTarget: previousDrop });
450
- }
493
+ instance.show(relatedTarget);
494
+
495
+ if (useSmoothSwitch && previousDrop && previousDrop.classList.contains(CLASS_NAME_ACTIVE)) {
496
+ const nextDropContent = Selectors.find(':scope > .dropdown-content', target);
497
+ if (nextDropContent) {
498
+ nextDropContent.classList.add(CLASS_NAME_FADE);
499
+ instance._startSmoothSwitch(target, previousDrop, nextDropContent);
500
+ }
501
+ }
451
502
 
452
503
  instance._updatePointerPosition(event);
453
504
  });
@@ -464,14 +515,16 @@ class VGNav extends BaseModule {
464
515
  relatedTarget = relatedTarget.parentNode;
465
516
  }
466
517
 
467
- if (instance._canSmoothSwitchFirstLevel(event, elm, nextDrop)) {
468
- currentElem = null;
469
- instance._updatePointerPosition(event);
470
- return;
471
- }
472
-
473
- currentElem = null;
474
- instance.hide({ relatedTarget: relatedTarget, elm: elm });
518
+ if (instance._canSmoothSwitchFirstLevel(event, elm, nextDrop)) {
519
+ currentElem = null;
520
+ // Сохраняем предыдущую точку до mouseover соседнего пункта:
521
+ // она нужна повторной проверке направления и передаче открытого состояния.
522
+ return;
523
+ }
524
+
525
+ currentElem = null;
526
+ instance._cancelSmoothSwitch(elm);
527
+ instance.hide({ relatedTarget: relatedTarget, elm: elm });
475
528
  instance._updatePointerPosition(event);
476
529
  });
477
530
  });
@@ -54,31 +54,29 @@
54
54
  inset-inline-end: var(--vg-table-fixed-offset);
55
55
  }
56
56
 
57
- tbody tr > [data-vg-table-fixed-side],
58
- tfoot tr > [data-vg-table-fixed-side] {
59
- background-color: var(--vg-table-fixed-cell-bg);
60
- background-image: none;
61
- }
62
-
63
- .vg-table-striped tbody tr:nth-child(even) > [data-vg-table-fixed-side] {
64
- background-color: var(--vg-table-fixed-cell-bg);
65
- background-image: linear-gradient(var(--vg-table-tbody-bg-striped), var(--vg-table-tbody-bg-striped));
66
- }
67
-
68
- .vg-table-hovered tbody tr:hover > [data-vg-table-fixed-side] {
69
- background-color: var(--vg-table-fixed-cell-bg);
70
- background-image: linear-gradient(var(--vg-table-tbody-bg-hovered), var(--vg-table-tbody-bg-hovered));
71
- }
72
-
73
- tbody tr.vg-table-row-selected > [data-vg-table-fixed-side] {
74
- background-color: var(--vg-table-fixed-cell-bg);
75
- background-image: linear-gradient(var(--vg-table-selection-row-background), var(--vg-table-selection-row-background));
76
- }
77
-
78
- tbody tr.vg-table-row-selected:hover > [data-vg-table-fixed-side] {
79
- background-color: var(--vg-table-fixed-cell-bg);
80
- background-image: linear-gradient(var(--vg-table-selection-row-background-hovered), var(--vg-table-selection-row-background-hovered));
81
- }
57
+ tbody tr > [data-vg-table-fixed-side],
58
+ tfoot tr > [data-vg-table-fixed-side] {
59
+ background-color: var(--vg-table-fixed-cell-bg);
60
+ background-image: none;
61
+ box-shadow: inset 0 0 0 100vmax transparent;
62
+ transition: box-shadow var(--vg-table-transition);
63
+ }
64
+
65
+ .vg-table-striped tbody tr:nth-child(even) > [data-vg-table-fixed-side] {
66
+ box-shadow: inset 0 0 0 100vmax var(--vg-table-tbody-bg-striped);
67
+ }
68
+
69
+ .vg-table-hovered tbody tr:hover > [data-vg-table-fixed-side] {
70
+ box-shadow: inset 0 0 0 100vmax var(--vg-table-tbody-bg-hovered);
71
+ }
72
+
73
+ tbody tr.vg-table-row-selected > [data-vg-table-fixed-side] {
74
+ box-shadow: inset 0 0 0 100vmax var(--vg-table-selection-row-background);
75
+ }
76
+
77
+ tbody tr.vg-table-row-selected:hover > [data-vg-table-fixed-side] {
78
+ box-shadow: inset 0 0 0 100vmax var(--vg-table-selection-row-background-hovered);
79
+ }
82
80
 
83
81
  [data-vg-table-fixed-edge]::after {
84
82
  content: "";