uikit 3.11.2-dev.fb043abc2 → 3.12.2

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 (228) hide show
  1. package/.eslintrc.json +4 -49
  2. package/.prettierignore +14 -0
  3. package/.prettierrc.json +13 -0
  4. package/.webstorm.js +3 -3
  5. package/CHANGELOG.md +63 -20
  6. package/build/.eslintrc.json +1 -3
  7. package/build/build.js +26 -28
  8. package/build/icons.js +7 -11
  9. package/build/less.js +48 -36
  10. package/build/package.json +2 -2
  11. package/build/prefix.js +21 -18
  12. package/build/publishDev.js +6 -8
  13. package/build/release.js +20 -17
  14. package/build/scope.js +21 -11
  15. package/build/scss.js +72 -39
  16. package/build/util.js +71 -62
  17. package/build/wrapper/icons.js +0 -2
  18. package/dist/css/uikit-core-rtl.css +144 -202
  19. package/dist/css/uikit-core-rtl.min.css +1 -1
  20. package/dist/css/uikit-core.css +144 -202
  21. package/dist/css/uikit-core.min.css +1 -1
  22. package/dist/css/uikit-rtl.css +146 -208
  23. package/dist/css/uikit-rtl.min.css +1 -1
  24. package/dist/css/uikit.css +146 -208
  25. package/dist/css/uikit.min.css +1 -1
  26. package/dist/js/components/countdown.js +66 -138
  27. package/dist/js/components/countdown.min.js +1 -1
  28. package/dist/js/components/filter.js +408 -439
  29. package/dist/js/components/filter.min.js +1 -1
  30. package/dist/js/components/lightbox-panel.js +1091 -1319
  31. package/dist/js/components/lightbox-panel.min.js +1 -1
  32. package/dist/js/components/lightbox.js +1137 -1396
  33. package/dist/js/components/lightbox.min.js +1 -1
  34. package/dist/js/components/notification.js +94 -114
  35. package/dist/js/components/notification.min.js +1 -1
  36. package/dist/js/components/parallax.js +347 -361
  37. package/dist/js/components/parallax.min.js +1 -1
  38. package/dist/js/components/slider-parallax.js +345 -360
  39. package/dist/js/components/slider-parallax.min.js +1 -1
  40. package/dist/js/components/slider.js +749 -843
  41. package/dist/js/components/slider.min.js +1 -1
  42. package/dist/js/components/slideshow-parallax.js +345 -360
  43. package/dist/js/components/slideshow-parallax.min.js +1 -1
  44. package/dist/js/components/slideshow.js +628 -798
  45. package/dist/js/components/slideshow.min.js +1 -1
  46. package/dist/js/components/sortable.js +587 -620
  47. package/dist/js/components/sortable.min.js +1 -1
  48. package/dist/js/components/tooltip.js +324 -356
  49. package/dist/js/components/tooltip.min.js +1 -1
  50. package/dist/js/components/upload.js +156 -167
  51. package/dist/js/components/upload.min.js +1 -1
  52. package/dist/js/uikit-core.js +5317 -6554
  53. package/dist/js/uikit-core.min.js +1 -1
  54. package/dist/js/uikit-icons.js +7 -9
  55. package/dist/js/uikit-icons.min.js +1 -1
  56. package/dist/js/uikit.js +8018 -9698
  57. package/dist/js/uikit.min.js +1 -1
  58. package/jsconfig.json +1 -1
  59. package/package.json +64 -60
  60. package/src/js/api/boot.js +25 -32
  61. package/src/js/api/component.js +15 -28
  62. package/src/js/api/global.js +6 -12
  63. package/src/js/api/hooks.js +14 -33
  64. package/src/js/api/instance.js +7 -15
  65. package/src/js/api/state.js +199 -187
  66. package/src/js/components/countdown.js +32 -85
  67. package/src/js/components/filter.js +70 -66
  68. package/src/js/components/index.js +13 -13
  69. package/src/js/components/internal/lightbox-animations.js +14 -25
  70. package/src/js/components/internal/slider-preload.js +9 -0
  71. package/src/js/components/internal/slider-transitioner.js +66 -45
  72. package/src/js/components/internal/slideshow-animations.js +46 -64
  73. package/src/js/components/lightbox-panel.js +107 -105
  74. package/src/js/components/lightbox.js +17 -39
  75. package/src/js/components/notification.js +49 -43
  76. package/src/js/components/parallax.js +16 -30
  77. package/src/js/components/slider-parallax.js +13 -23
  78. package/src/js/components/slider.js +117 -89
  79. package/src/js/components/slideshow-parallax.js +1 -1
  80. package/src/js/components/slideshow.js +15 -13
  81. package/src/js/components/sortable.js +125 -106
  82. package/src/js/components/tooltip.js +41 -31
  83. package/src/js/components/upload.js +53 -63
  84. package/src/js/core/accordion.js +58 -48
  85. package/src/js/core/alert.js +9 -17
  86. package/src/js/core/core.js +17 -69
  87. package/src/js/core/cover.js +15 -15
  88. package/src/js/core/drop.js +110 -94
  89. package/src/js/core/form-custom.js +22 -27
  90. package/src/js/core/gif.js +3 -7
  91. package/src/js/core/grid.js +57 -58
  92. package/src/js/core/height-match.js +16 -29
  93. package/src/js/core/height-viewport.js +30 -34
  94. package/src/js/core/icon.js +47 -52
  95. package/src/js/core/img.js +153 -143
  96. package/src/js/core/index.js +39 -39
  97. package/src/js/core/leader.js +9 -18
  98. package/src/js/core/margin.js +21 -37
  99. package/src/js/core/modal.js +49 -36
  100. package/src/js/core/nav.js +2 -4
  101. package/src/js/core/navbar.js +113 -85
  102. package/src/js/core/offcanvas.js +51 -54
  103. package/src/js/core/overflow-auto.js +13 -17
  104. package/src/js/core/responsive.js +14 -12
  105. package/src/js/core/scroll.js +10 -20
  106. package/src/js/core/scrollspy-nav.js +34 -31
  107. package/src/js/core/scrollspy.js +37 -54
  108. package/src/js/core/sticky.js +161 -128
  109. package/src/js/core/svg.js +68 -83
  110. package/src/js/core/switcher.js +56 -47
  111. package/src/js/core/tab.js +7 -10
  112. package/src/js/core/toggle.js +69 -68
  113. package/src/js/core/video.js +22 -21
  114. package/src/js/mixin/animate.js +19 -20
  115. package/src/js/mixin/class.js +2 -4
  116. package/src/js/mixin/container.js +7 -11
  117. package/src/js/mixin/internal/animate-fade.js +73 -30
  118. package/src/js/mixin/internal/animate-slide.js +58 -41
  119. package/src/js/mixin/internal/slideshow-animations.js +7 -14
  120. package/src/js/mixin/internal/slideshow-transitioner.js +10 -17
  121. package/src/js/mixin/lazyload.js +20 -0
  122. package/src/js/mixin/media.js +5 -10
  123. package/src/js/mixin/modal.js +89 -66
  124. package/src/js/mixin/parallax.js +149 -107
  125. package/src/js/mixin/position.js +26 -20
  126. package/src/js/mixin/slider-autoplay.js +12 -21
  127. package/src/js/mixin/slider-drag.js +64 -65
  128. package/src/js/mixin/slider-nav.js +26 -35
  129. package/src/js/mixin/slider-reactive.js +2 -8
  130. package/src/js/mixin/slider.js +47 -60
  131. package/src/js/mixin/slideshow.js +12 -22
  132. package/src/js/mixin/swipe.js +72 -0
  133. package/src/js/mixin/togglable.js +89 -63
  134. package/src/js/uikit-core.js +2 -4
  135. package/src/js/uikit.js +2 -4
  136. package/src/js/util/ajax.js +25 -40
  137. package/src/js/util/animation.js +77 -75
  138. package/src/js/util/attr.js +17 -21
  139. package/src/js/util/class.js +14 -52
  140. package/src/js/util/dimensions.js +58 -45
  141. package/src/js/util/dom.js +37 -66
  142. package/src/js/util/env.js +7 -12
  143. package/src/js/util/event.js +60 -59
  144. package/src/js/util/fastdom.js +1 -6
  145. package/src/js/util/filter.js +18 -36
  146. package/src/js/util/index.js +1 -1
  147. package/src/js/util/lang.js +82 -121
  148. package/src/js/util/mouse.js +19 -17
  149. package/src/js/util/observer.js +36 -0
  150. package/src/js/util/options.js +35 -49
  151. package/src/js/util/player.js +41 -36
  152. package/src/js/util/position.js +54 -46
  153. package/src/js/util/selector.js +43 -58
  154. package/src/js/util/style.js +39 -49
  155. package/src/js/util/viewport.js +75 -64
  156. package/src/less/components/base.less +10 -33
  157. package/src/less/components/flex.less +0 -9
  158. package/src/less/components/form-range.less +48 -95
  159. package/src/less/components/form.less +0 -1
  160. package/src/less/components/height.less +3 -0
  161. package/src/less/components/leader.less +0 -1
  162. package/src/less/components/lightbox.less +0 -1
  163. package/src/less/components/list.less +5 -1
  164. package/src/less/components/modal.less +3 -7
  165. package/src/less/components/navbar.less +0 -7
  166. package/src/less/components/progress.less +14 -36
  167. package/src/less/components/slider.less +3 -3
  168. package/src/less/components/slideshow.less +3 -3
  169. package/src/less/components/text.less +16 -32
  170. package/src/less/components/utility.less +25 -0
  171. package/src/scss/components/base.scss +10 -33
  172. package/src/scss/components/flex.scss +0 -9
  173. package/src/scss/components/form-range.scss +48 -95
  174. package/src/scss/components/form.scss +3 -4
  175. package/src/scss/components/height.scss +3 -0
  176. package/src/scss/components/icon.scss +2 -2
  177. package/src/scss/components/leader.scss +0 -1
  178. package/src/scss/components/lightbox.scss +0 -1
  179. package/src/scss/components/list.scss +5 -1
  180. package/src/scss/components/modal.scss +3 -7
  181. package/src/scss/components/navbar.scss +0 -7
  182. package/src/scss/components/progress.scss +14 -36
  183. package/src/scss/components/search.scss +1 -1
  184. package/src/scss/components/slider.scss +3 -3
  185. package/src/scss/components/slideshow.scss +3 -3
  186. package/src/scss/components/text.scss +16 -32
  187. package/src/scss/components/utility.scss +25 -0
  188. package/src/scss/mixins-theme.scss +1 -1
  189. package/src/scss/mixins.scss +1 -1
  190. package/src/scss/variables-theme.scss +9 -9
  191. package/src/scss/variables.scss +9 -9
  192. package/tests/align.html +10 -10
  193. package/tests/animation.html +2 -2
  194. package/tests/article.html +2 -2
  195. package/tests/base.html +3 -3
  196. package/tests/card.html +10 -10
  197. package/tests/column.html +3 -3
  198. package/tests/comment.html +9 -9
  199. package/tests/countdown.html +10 -8
  200. package/tests/dotnav.html +3 -3
  201. package/tests/image.html +296 -64
  202. package/tests/images/image-type.avif +0 -0
  203. package/tests/images/image-type.jpeg +0 -0
  204. package/tests/images/image-type.webp +0 -0
  205. package/tests/index.html +8 -8
  206. package/tests/js/index.js +114 -85
  207. package/tests/lightbox.html +10 -10
  208. package/tests/marker.html +2 -2
  209. package/tests/modal.html +8 -9
  210. package/tests/navbar.html +2 -2
  211. package/tests/overlay.html +7 -7
  212. package/tests/parallax.html +16 -7
  213. package/tests/position.html +12 -12
  214. package/tests/slidenav.html +12 -12
  215. package/tests/slider.html +20 -20
  216. package/tests/sortable.html +1 -1
  217. package/tests/sticky-parallax.html +57 -72
  218. package/tests/sticky.html +14 -3
  219. package/tests/svg.html +6 -6
  220. package/tests/table.html +11 -11
  221. package/tests/thumbnav.html +12 -12
  222. package/tests/transition.html +30 -30
  223. package/tests/utility.html +50 -33
  224. package/tests/video.html +1 -1
  225. package/tests/width.html +1 -1
  226. package/src/js/mixin/flex-bug.js +0 -56
  227. package/src/js/util/promise.js +0 -191
  228. package/tests/images/animated.gif +0 -0
@@ -1,8 +1,18 @@
1
1
  import Modal from '../mixin/modal';
2
- import {$, addClass, assign, css, Deferred, hasClass, height, html, isString, on, Promise, removeClass} from 'uikit-util';
2
+ import {
3
+ $,
4
+ addClass,
5
+ css,
6
+ Deferred,
7
+ hasClass,
8
+ height,
9
+ html,
10
+ isString,
11
+ on,
12
+ removeClass,
13
+ } from 'uikit-util';
3
14
 
4
15
  export default {
5
-
6
16
  install,
7
17
 
8
18
  mixins: [Modal],
@@ -10,18 +20,17 @@ export default {
10
20
  data: {
11
21
  clsPage: 'uk-modal-page',
12
22
  selPanel: '.uk-modal-dialog',
13
- selClose: '.uk-modal-close, .uk-modal-close-default, .uk-modal-close-outside, .uk-modal-close-full'
23
+ selClose:
24
+ '.uk-modal-close, .uk-modal-close-default, .uk-modal-close-outside, .uk-modal-close-full',
14
25
  },
15
26
 
16
27
  events: [
17
-
18
28
  {
19
29
  name: 'show',
20
30
 
21
31
  self: true,
22
32
 
23
33
  handler() {
24
-
25
34
  if (hasClass(this.panel, 'uk-margin-auto-vertical')) {
26
35
  addClass(this.$el, 'uk-flex');
27
36
  } else {
@@ -29,7 +38,7 @@ export default {
29
38
  }
30
39
 
31
40
  height(this.$el); // force reflow
32
- }
41
+ },
33
42
  },
34
43
 
35
44
  {
@@ -38,21 +47,15 @@ export default {
38
47
  self: true,
39
48
 
40
49
  handler() {
41
-
42
50
  css(this.$el, 'display', '');
43
51
  removeClass(this.$el, 'uk-flex');
44
-
45
- }
46
- }
47
-
48
- ]
49
-
52
+ },
53
+ },
54
+ ],
50
55
  };
51
56
 
52
- function install({modal}) {
53
-
57
+ function install({ modal }) {
54
58
  modal.dialog = function (content, options) {
55
-
56
59
  const dialog = modal(
57
60
  `<div class="uk-modal">
58
61
  <div class="uk-modal-dialog">${content}</div>
@@ -62,10 +65,14 @@ function install({modal}) {
62
65
 
63
66
  dialog.show();
64
67
 
65
- on(dialog.$el, 'hidden', () =>
66
- Promise.resolve().then(() =>
67
- dialog.$destroy(true)
68
- ), {self: true}
68
+ on(
69
+ dialog.$el,
70
+ 'hidden',
71
+ async () => {
72
+ await Promise.resolve();
73
+ dialog.$destroy(true);
74
+ },
75
+ { self: true }
69
76
  );
70
77
 
71
78
  return dialog;
@@ -73,64 +80,71 @@ function install({modal}) {
73
80
 
74
81
  modal.alert = function (message, options) {
75
82
  return openDialog(
76
- ({labels}) => `<div class="uk-modal-body">${isString(message) ? message : html(message)}</div>
83
+ ({ labels }) => `<div class="uk-modal-body">${
84
+ isString(message) ? message : html(message)
85
+ }</div>
77
86
  <div class="uk-modal-footer uk-text-right">
78
- <button class="uk-button uk-button-primary uk-modal-close" autofocus>${labels.ok}</button>
87
+ <button class="uk-button uk-button-primary uk-modal-close" autofocus>${
88
+ labels.ok
89
+ }</button>
79
90
  </div>`,
80
91
  options,
81
- deferred => deferred.resolve()
92
+ (deferred) => deferred.resolve()
82
93
  );
83
94
  };
84
95
 
85
96
  modal.confirm = function (message, options) {
86
97
  return openDialog(
87
- ({labels}) => `<form>
98
+ ({ labels }) => `<form>
88
99
  <div class="uk-modal-body">${isString(message) ? message : html(message)}</div>
89
100
  <div class="uk-modal-footer uk-text-right">
90
- <button class="uk-button uk-button-default uk-modal-close" type="button">${labels.cancel}</button>
101
+ <button class="uk-button uk-button-default uk-modal-close" type="button">${
102
+ labels.cancel
103
+ }</button>
91
104
  <button class="uk-button uk-button-primary" autofocus>${labels.ok}</button>
92
105
  </div>
93
106
  </form>`,
94
107
  options,
95
- deferred => deferred.reject()
108
+ (deferred) => deferred.reject()
96
109
  );
97
110
  };
98
111
 
99
112
  modal.prompt = function (message, value, options) {
100
113
  return openDialog(
101
- ({labels}) => `<form class="uk-form-stacked">
114
+ ({ labels }) => `<form class="uk-form-stacked">
102
115
  <div class="uk-modal-body">
103
116
  <label>${isString(message) ? message : html(message)}</label>
104
117
  <input class="uk-input" value="${value || ''}" autofocus>
105
118
  </div>
106
119
  <div class="uk-modal-footer uk-text-right">
107
- <button class="uk-button uk-button-default uk-modal-close" type="button">${labels.cancel}</button>
120
+ <button class="uk-button uk-button-default uk-modal-close" type="button">${
121
+ labels.cancel
122
+ }</button>
108
123
  <button class="uk-button uk-button-primary">${labels.ok}</button>
109
124
  </div>
110
125
  </form>`,
111
126
  options,
112
- deferred => deferred.resolve(null),
113
- dialog => $('input', dialog.$el).value
127
+ (deferred) => deferred.resolve(null),
128
+ (dialog) => $('input', dialog.$el).value
114
129
  );
115
130
  };
116
131
 
117
132
  modal.labels = {
118
133
  ok: 'Ok',
119
- cancel: 'Cancel'
134
+ cancel: 'Cancel',
120
135
  };
121
136
 
122
137
  function openDialog(tmpl, options, hideFn, submitFn) {
123
-
124
- options = assign({bgClose: false, escClose: true, labels: modal.labels}, options);
138
+ options = { bgClose: false, escClose: true, labels: modal.labels, ...options };
125
139
 
126
140
  const dialog = modal.dialog(tmpl(options), options);
127
141
  const deferred = new Deferred();
128
142
 
129
143
  let resolved = false;
130
144
 
131
- on(dialog.$el, 'submit', 'form', e => {
145
+ on(dialog.$el, 'submit', 'form', (e) => {
132
146
  e.preventDefault();
133
- deferred.resolve(submitFn && submitFn(dialog));
147
+ deferred.resolve(submitFn?.(dialog));
134
148
  resolved = true;
135
149
  dialog.hide();
136
150
  });
@@ -141,5 +155,4 @@ function install({modal}) {
141
155
 
142
156
  return deferred.promise;
143
157
  }
144
-
145
158
  }
@@ -1,13 +1,11 @@
1
1
  import Accordion from './accordion';
2
2
 
3
3
  export default {
4
-
5
4
  extends: Accordion,
6
5
 
7
6
  data: {
8
7
  targets: '> .uk-parent',
9
8
  toggle: '> a',
10
- content: '> ul'
11
- }
12
-
9
+ content: '> ul',
10
+ },
13
11
  };
@@ -1,14 +1,35 @@
1
- import {active} from './drop';
1
+ import { active } from './drop';
2
2
  import Class from '../mixin/class';
3
- import FlexBug from '../mixin/flex-bug';
4
3
  import Container from '../mixin/container';
5
- import {$, $$, addClass, after, assign, css, findIndex, hasAttr, hasClass, height, includes, isRtl, isVisible, matches, noop, once, parent, Promise, query, remove, selFocusable, toFloat, Transition, within} from 'uikit-util';
4
+ import {
5
+ $,
6
+ $$,
7
+ addClass,
8
+ after,
9
+ css,
10
+ findIndex,
11
+ hasAttr,
12
+ hasClass,
13
+ height,
14
+ includes,
15
+ isRtl,
16
+ isVisible,
17
+ matches,
18
+ noop,
19
+ once,
20
+ parent,
21
+ query,
22
+ remove,
23
+ selFocusable,
24
+ toFloat,
25
+ Transition,
26
+ within,
27
+ } from 'uikit-util';
6
28
 
7
29
  const navItem = '.uk-navbar-nav > li > a, .uk-navbar-item, .uk-navbar-toggle';
8
30
 
9
31
  export default {
10
-
11
- mixins: [Class, Container, FlexBug],
32
+ mixins: [Class, Container],
12
33
 
13
34
  props: {
14
35
  dropdown: String,
@@ -23,7 +44,7 @@ export default {
23
44
  dropbar: Boolean,
24
45
  dropbarMode: String,
25
46
  dropbarAnchor: Boolean,
26
- duration: Number
47
+ duration: Number,
27
48
  },
28
49
 
29
50
  data: {
@@ -43,43 +64,41 @@ export default {
43
64
  duration: 200,
44
65
  forceHeight: true,
45
66
  selMinHeight: navItem,
46
- container: false
67
+ container: false,
47
68
  },
48
69
 
49
70
  computed: {
50
-
51
- boundary({boundary, boundaryAlign}, $el) {
71
+ boundary({ boundary, boundaryAlign }, $el) {
52
72
  return boundary === true || boundaryAlign ? $el : boundary;
53
73
  },
54
74
 
55
- dropbarAnchor({dropbarAnchor}, $el) {
75
+ dropbarAnchor({ dropbarAnchor }, $el) {
56
76
  return query(dropbarAnchor, $el);
57
77
  },
58
78
 
59
- pos({align}) {
79
+ pos({ align }) {
60
80
  return `bottom-${align}`;
61
81
  },
62
82
 
63
83
  dropbar: {
64
-
65
- get({dropbar}) {
66
-
84
+ get({ dropbar }) {
67
85
  if (!dropbar) {
68
86
  return null;
69
87
  }
70
88
 
71
- dropbar = this._dropbar || query(dropbar, this.$el) || $('+ .uk-navbar-dropbar', this.$el);
89
+ dropbar =
90
+ this._dropbar ||
91
+ query(dropbar, this.$el) ||
92
+ $('+ .uk-navbar-dropbar', this.$el);
72
93
 
73
94
  return dropbar ? dropbar : (this._dropbar = $('<div></div>'));
74
-
75
95
  },
76
96
 
77
97
  watch(dropbar) {
78
98
  addClass(dropbar, 'uk-navbar-dropbar');
79
99
  },
80
100
 
81
- immediate: true
82
-
101
+ immediate: true,
83
102
  },
84
103
 
85
104
  dropContainer(_, $el) {
@@ -87,17 +106,16 @@ export default {
87
106
  },
88
107
 
89
108
  dropdowns: {
90
-
91
- get({clsDrop}, $el) {
109
+ get({ clsDrop }, $el) {
92
110
  const dropdowns = $$(`.${clsDrop}`, $el);
93
111
 
94
112
  if (this.dropContainer !== $el) {
95
- $$(`.${clsDrop}`, this.dropContainer).forEach(el => {
96
- const dropdown = this.getDropdown(el);
97
- if (!includes(dropdowns, el) && dropdown && dropdown.target && within(dropdown.target, this.$el)) {
113
+ for (const el of $$(`.${clsDrop}`, this.dropContainer)) {
114
+ const target = this.getDropdown(el)?.target;
115
+ if (!includes(dropdowns, el) && target && within(target, this.$el)) {
98
116
  dropdowns.push(el);
99
117
  }
100
- });
118
+ }
101
119
  }
102
120
 
103
121
  return dropdowns;
@@ -106,19 +124,22 @@ export default {
106
124
  watch(dropdowns) {
107
125
  this.$create(
108
126
  'drop',
109
- dropdowns.filter(el => !this.getDropdown(el)),
110
- assign({}, this.$props, {boundary: this.boundary, pos: this.pos, offset: this.dropbar || this.offset})
127
+ dropdowns.filter((el) => !this.getDropdown(el)),
128
+ {
129
+ ...this.$props,
130
+ boundary: this.boundary,
131
+ pos: this.pos,
132
+ offset: this.dropbar || this.offset,
133
+ }
111
134
  );
112
135
  },
113
136
 
114
- immediate: true
115
-
137
+ immediate: true,
116
138
  },
117
139
 
118
- toggles({dropdown}, $el) {
140
+ toggles({ dropdown }, $el) {
119
141
  return $$(dropdown, $el);
120
- }
121
-
142
+ },
122
143
  },
123
144
 
124
145
  disconnected() {
@@ -127,7 +148,6 @@ export default {
127
148
  },
128
149
 
129
150
  events: [
130
-
131
151
  {
132
152
  name: 'mouseover focusin',
133
153
 
@@ -135,13 +155,18 @@ export default {
135
155
  return this.dropdown;
136
156
  },
137
157
 
138
- handler({current}) {
158
+ handler({ current }) {
139
159
  const active = this.getActive();
140
- if (active && includes(active.mode, 'hover') && active.target && !within(active.target, current) && !active.tracker.movesTo(active.$el)) {
160
+ if (
161
+ active &&
162
+ includes(active.mode, 'hover') &&
163
+ active.target &&
164
+ !within(active.target, current) &&
165
+ !active.isDelaying
166
+ ) {
141
167
  active.hide(false);
142
168
  }
143
- }
144
-
169
+ },
145
170
  },
146
171
 
147
172
  {
@@ -152,25 +177,24 @@ export default {
152
177
  },
153
178
 
154
179
  handler(e) {
155
-
156
- const {current, keyCode} = e;
180
+ const { current, keyCode } = e;
157
181
  const active = this.getActive();
158
182
 
159
183
  if (keyCode === keyMap.DOWN && hasAttr(current, 'aria-expanded')) {
160
-
161
184
  e.preventDefault();
162
185
 
163
186
  if (!active || active.target !== current) {
164
187
  current.click();
165
- once(this.dropContainer, 'show', ({target}) => focusFirstFocusableElement(target));
188
+ once(this.dropContainer, 'show', ({ target }) =>
189
+ focusFirstFocusableElement(target)
190
+ );
166
191
  } else {
167
192
  focusFirstFocusableElement(active.$el);
168
193
  }
169
-
170
194
  }
171
195
 
172
196
  handleNavItemNavigation(e, this.toggles, active);
173
- }
197
+ },
174
198
  },
175
199
 
176
200
  {
@@ -185,8 +209,7 @@ export default {
185
209
  },
186
210
 
187
211
  handler(e) {
188
-
189
- const {current, keyCode} = e;
212
+ const { current, keyCode } = e;
190
213
 
191
214
  if (!includes(this.dropdowns, current)) {
192
215
  return;
@@ -194,7 +217,7 @@ export default {
194
217
 
195
218
  const active = this.getActive();
196
219
  const elements = $$(selFocusable, current);
197
- const i = findIndex(elements, el => matches(el, ':focus'));
220
+ const i = findIndex(elements, (el) => matches(el, ':focus'));
198
221
 
199
222
  if (keyCode === keyMap.UP) {
200
223
  e.preventDefault();
@@ -211,11 +234,11 @@ export default {
211
234
  }
212
235
 
213
236
  if (keyCode === keyMap.ESC) {
214
- active && active.target && active.target.focus();
237
+ active?.target?.focus();
215
238
  }
216
239
 
217
240
  handleNavItemNavigation(e, this.toggles, active);
218
- }
241
+ },
219
242
  },
220
243
 
221
244
  {
@@ -232,10 +255,14 @@ export default {
232
255
  handler() {
233
256
  const active = this.getActive();
234
257
 
235
- if (active && includes(active.mode, 'hover') && !this.dropdowns.some(el => matches(el, ':hover'))) {
258
+ if (
259
+ active &&
260
+ includes(active.mode, 'hover') &&
261
+ !this.dropdowns.some((el) => matches(el, ':hover'))
262
+ ) {
236
263
  active.hide();
237
264
  }
238
- }
265
+ },
239
266
  },
240
267
 
241
268
  {
@@ -250,12 +277,10 @@ export default {
250
277
  },
251
278
 
252
279
  handler() {
253
-
254
280
  if (!parent(this.dropbar)) {
255
281
  after(this.dropbarAnchor || this.$el, this.dropbar);
256
282
  }
257
-
258
- }
283
+ },
259
284
  },
260
285
 
261
286
  {
@@ -269,7 +294,7 @@ export default {
269
294
  return this.dropbar;
270
295
  },
271
296
 
272
- handler(_, {$el, dir}) {
297
+ handler(_, { $el, dir }) {
273
298
  if (!hasClass($el, this.clsDrop)) {
274
299
  return;
275
300
  }
@@ -281,9 +306,14 @@ export default {
281
306
  this.clsDrop && addClass($el, `${this.clsDrop}-dropbar`);
282
307
 
283
308
  if (dir === 'bottom') {
284
- this.transitionTo($el.offsetHeight + toFloat(css($el, 'marginTop')) + toFloat(css($el, 'marginBottom')), $el);
309
+ this.transitionTo(
310
+ $el.offsetHeight +
311
+ toFloat(css($el, 'marginTop')) +
312
+ toFloat(css($el, 'marginBottom')),
313
+ $el
314
+ );
285
315
  }
286
- }
316
+ },
287
317
  },
288
318
 
289
319
  {
@@ -297,14 +327,17 @@ export default {
297
327
  return this.dropbar;
298
328
  },
299
329
 
300
- handler(e, {$el}) {
301
-
330
+ handler(e, { $el }) {
302
331
  const active = this.getActive();
303
332
 
304
- if (matches(this.dropbar, ':hover') && active && active.$el === $el) {
333
+ if (
334
+ matches(this.dropbar, ':hover') &&
335
+ active?.$el === $el &&
336
+ !this.toggles.some((el) => active.target !== el && matches(el, ':focus'))
337
+ ) {
305
338
  e.preventDefault();
306
339
  }
307
- }
340
+ },
308
341
  },
309
342
 
310
343
  {
@@ -318,30 +351,27 @@ export default {
318
351
  return this.dropbar;
319
352
  },
320
353
 
321
- handler(_, {$el}) {
354
+ handler(_, { $el }) {
322
355
  if (!hasClass($el, this.clsDrop)) {
323
356
  return;
324
357
  }
325
358
 
326
359
  const active = this.getActive();
327
360
 
328
- if (!active || active && active.$el === $el) {
361
+ if (!active || active?.$el === $el) {
329
362
  this.transitionTo(0);
330
363
  }
331
- }
332
- }
333
-
364
+ },
365
+ },
334
366
  ],
335
367
 
336
368
  methods: {
337
-
338
369
  getActive() {
339
370
  return active && within(active.target, this.$el) && active;
340
371
  },
341
372
 
342
373
  transitionTo(newHeight, el) {
343
-
344
- const {dropbar} = this;
374
+ const { dropbar } = this;
345
375
  const oldHeight = isVisible(dropbar) ? height(dropbar) : 0;
346
376
 
347
377
  el = oldHeight < newHeight && el;
@@ -352,54 +382,52 @@ export default {
352
382
 
353
383
  Transition.cancel([el, dropbar]);
354
384
  return Promise.all([
355
- Transition.start(dropbar, {height: newHeight}, this.duration),
356
- Transition.start(el, {clip: `rect(0,${el.offsetWidth}px,${newHeight}px,0)`}, this.duration)
385
+ Transition.start(dropbar, { height: newHeight }, this.duration),
386
+ Transition.start(
387
+ el,
388
+ { clip: `rect(0,${el.offsetWidth}px,${newHeight}px,0)` },
389
+ this.duration
390
+ ),
357
391
  ])
358
392
  .catch(noop)
359
393
  .then(() => {
360
- css(el, {clip: ''});
394
+ css(el, { clip: '' });
361
395
  this.$update(dropbar);
362
396
  });
363
397
  },
364
398
 
365
399
  getDropdown(el) {
366
400
  return this.$getComponent(el, 'drop') || this.$getComponent(el, 'dropdown');
367
- }
368
-
369
- }
370
-
401
+ },
402
+ },
371
403
  };
372
404
 
373
405
  function handleNavItemNavigation(e, toggles, active) {
374
-
375
- const {current, keyCode} = e;
376
- const target = active && active.target || current;
406
+ const { current, keyCode } = e;
407
+ const target = active?.target || current;
377
408
  const i = toggles.indexOf(target);
378
409
 
379
410
  // Left
380
411
  if (keyCode === keyMap.LEFT && i > 0) {
381
- active && active.hide(false);
412
+ active?.hide(false);
382
413
  toggles[i - 1].focus();
383
414
  }
384
415
 
385
416
  // Right
386
417
  if (keyCode === keyMap.RIGHT && i < toggles.length - 1) {
387
- active && active.hide(false);
418
+ active?.hide(false);
388
419
  toggles[i + 1].focus();
389
420
  }
390
421
 
391
422
  if (keyCode === keyMap.TAB) {
392
423
  target.focus();
393
- active && active.hide(false);
424
+ active?.hide(false);
394
425
  }
395
426
  }
396
427
 
397
428
  function focusFirstFocusableElement(el) {
398
429
  if (!$(':focus', el)) {
399
- const focusEl = $(selFocusable, el);
400
- if (focusEl) {
401
- focusEl.focus();
402
- }
430
+ $(selFocusable, el)?.focus();
403
431
  }
404
432
  }
405
433
 
@@ -409,5 +437,5 @@ const keyMap = {
409
437
  LEFT: 37,
410
438
  UP: 38,
411
439
  RIGHT: 39,
412
- DOWN: 40
440
+ DOWN: 40,
413
441
  };