bootstrap 5.0.0.beta2 → 5.0.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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/assets/javascripts/bootstrap-sprockets.js +8 -7
  4. data/assets/javascripts/bootstrap.js +2525 -2460
  5. data/assets/javascripts/bootstrap.min.js +2 -2
  6. data/assets/javascripts/bootstrap/alert.js +77 -179
  7. data/assets/javascripts/bootstrap/base-component.js +140 -38
  8. data/assets/javascripts/bootstrap/button.js +54 -100
  9. data/assets/javascripts/bootstrap/carousel.js +335 -451
  10. data/assets/javascripts/bootstrap/collapse.js +195 -303
  11. data/assets/javascripts/bootstrap/dom/data.js +34 -47
  12. data/assets/javascripts/bootstrap/dom/event-handler.js +95 -90
  13. data/assets/javascripts/bootstrap/dom/manipulator.js +23 -21
  14. data/assets/javascripts/bootstrap/dom/selector-engine.js +20 -28
  15. data/assets/javascripts/bootstrap/dropdown.js +323 -358
  16. data/assets/javascripts/bootstrap/modal.js +537 -489
  17. data/assets/javascripts/bootstrap/offcanvas.js +720 -0
  18. data/assets/javascripts/bootstrap/popover.js +112 -180
  19. data/assets/javascripts/bootstrap/scrollspy.js +167 -235
  20. data/assets/javascripts/bootstrap/tab.js +121 -188
  21. data/assets/javascripts/bootstrap/toast.js +166 -243
  22. data/assets/javascripts/bootstrap/tooltip.js +333 -495
  23. data/assets/stylesheets/_bootstrap-grid.scss +1 -1
  24. data/assets/stylesheets/_bootstrap-reboot.scss +1 -1
  25. data/assets/stylesheets/_bootstrap.scss +2 -1
  26. data/assets/stylesheets/bootstrap/_accordion.scss +24 -32
  27. data/assets/stylesheets/bootstrap/_buttons.scss +2 -0
  28. data/assets/stylesheets/bootstrap/_card.scss +6 -6
  29. data/assets/stylesheets/bootstrap/_carousel.scss +2 -2
  30. data/assets/stylesheets/bootstrap/_dropdown.scss +14 -23
  31. data/assets/stylesheets/bootstrap/_functions.scss +61 -3
  32. data/assets/stylesheets/bootstrap/_images.scss +1 -1
  33. data/assets/stylesheets/bootstrap/_list-group.scss +16 -5
  34. data/assets/stylesheets/bootstrap/_mixins.scss +1 -0
  35. data/assets/stylesheets/bootstrap/_modal.scss +8 -24
  36. data/assets/stylesheets/bootstrap/_nav.scss +7 -0
  37. data/assets/stylesheets/bootstrap/_navbar.scss +2 -0
  38. data/assets/stylesheets/bootstrap/_offcanvas.scss +79 -0
  39. data/assets/stylesheets/bootstrap/_popover.scss +10 -10
  40. data/assets/stylesheets/bootstrap/_progress.scss +3 -0
  41. data/assets/stylesheets/bootstrap/_reboot.scss +7 -21
  42. data/assets/stylesheets/bootstrap/_spinners.scss +6 -2
  43. data/assets/stylesheets/bootstrap/_tables.scss +1 -0
  44. data/assets/stylesheets/bootstrap/_toasts.scss +1 -1
  45. data/assets/stylesheets/bootstrap/_tooltip.scss +4 -4
  46. data/assets/stylesheets/bootstrap/_transitions.scss +2 -0
  47. data/assets/stylesheets/bootstrap/_utilities.scss +65 -37
  48. data/assets/stylesheets/bootstrap/_variables.scss +162 -50
  49. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +1 -1
  50. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +3 -1
  51. data/assets/stylesheets/bootstrap/forms/_form-check.scss +1 -1
  52. data/assets/stylesheets/bootstrap/forms/_form-control.scss +0 -4
  53. data/assets/stylesheets/bootstrap/forms/_form-range.scss +1 -1
  54. data/assets/stylesheets/bootstrap/forms/_form-select.scss +3 -0
  55. data/assets/stylesheets/bootstrap/mixins/_alert.scss +2 -0
  56. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +2 -0
  57. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +7 -2
  58. data/assets/stylesheets/bootstrap/mixins/_caret.scss +2 -0
  59. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  60. data/assets/stylesheets/bootstrap/mixins/_forms.scss +25 -5
  61. data/assets/stylesheets/bootstrap/mixins/_grid.scss +23 -11
  62. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +2 -0
  63. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +2 -0
  64. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +55 -13
  65. data/bootstrap.gemspec +1 -1
  66. data/lib/bootstrap/version.rb +2 -2
  67. data/tasks/updater/js.rb +1 -1
  68. data/tasks/updater/network.rb +7 -1
  69. metadata +9 -6
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Bootstrap selector-engine.js v5.0.0-beta2 (https://getbootstrap.com/)
2
+ * Bootstrap selector-engine.js v5.0.2 (https://getbootstrap.com/)
3
3
  * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  */
@@ -11,7 +11,7 @@
11
11
 
12
12
  /**
13
13
  * --------------------------------------------------------------------------
14
- * Bootstrap (v5.0.0-beta2): dom/selector-engine.js
14
+ * Bootstrap (v5.0.2): dom/selector-engine.js
15
15
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
16
  * --------------------------------------------------------------------------
17
17
  */
@@ -21,34 +21,23 @@
21
21
  * Constants
22
22
  * ------------------------------------------------------------------------
23
23
  */
24
- var NODE_TEXT = 3;
25
- var SelectorEngine = {
26
- find: function find(selector, element) {
27
- var _ref;
28
-
29
- if (element === void 0) {
30
- element = document.documentElement;
31
- }
32
-
33
- return (_ref = []).concat.apply(_ref, Element.prototype.querySelectorAll.call(element, selector));
24
+ const NODE_TEXT = 3;
25
+ const SelectorEngine = {
26
+ find(selector, element = document.documentElement) {
27
+ return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
34
28
  },
35
- findOne: function findOne(selector, element) {
36
- if (element === void 0) {
37
- element = document.documentElement;
38
- }
39
29
 
30
+ findOne(selector, element = document.documentElement) {
40
31
  return Element.prototype.querySelector.call(element, selector);
41
32
  },
42
- children: function children(element, selector) {
43
- var _ref2;
44
33
 
45
- return (_ref2 = []).concat.apply(_ref2, element.children).filter(function (child) {
46
- return child.matches(selector);
47
- });
34
+ children(element, selector) {
35
+ return [].concat(...element.children).filter(child => child.matches(selector));
48
36
  },
49
- parents: function parents(element, selector) {
50
- var parents = [];
51
- var ancestor = element.parentNode;
37
+
38
+ parents(element, selector) {
39
+ const parents = [];
40
+ let ancestor = element.parentNode;
52
41
 
53
42
  while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
54
43
  if (ancestor.matches(selector)) {
@@ -60,8 +49,9 @@
60
49
 
61
50
  return parents;
62
51
  },
63
- prev: function prev(element, selector) {
64
- var previous = element.previousElementSibling;
52
+
53
+ prev(element, selector) {
54
+ let previous = element.previousElementSibling;
65
55
 
66
56
  while (previous) {
67
57
  if (previous.matches(selector)) {
@@ -73,8 +63,9 @@
73
63
 
74
64
  return [];
75
65
  },
76
- next: function next(element, selector) {
77
- var next = element.nextElementSibling;
66
+
67
+ next(element, selector) {
68
+ let next = element.nextElementSibling;
78
69
 
79
70
  while (next) {
80
71
  if (next.matches(selector)) {
@@ -86,6 +77,7 @@
86
77
 
87
78
  return [];
88
79
  }
80
+
89
81
  };
90
82
 
91
83
  return SelectorEngine;
@@ -1,13 +1,13 @@
1
1
  /*!
2
- * Bootstrap dropdown.js v5.0.0-beta2 (https://getbootstrap.com/)
2
+ * Bootstrap dropdown.js v5.0.2 (https://getbootstrap.com/)
3
3
  * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  */
6
6
  (function (global, factory) {
7
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./dom/data.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./base-component.js')) :
8
- typeof define === 'function' && define.amd ? define(['@popperjs/core', './dom/data', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './base-component'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dropdown = factory(global.Popper, global.Data, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Base));
10
- }(this, (function (Popper, Data, EventHandler, Manipulator, SelectorEngine, BaseComponent) { 'use strict';
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./dom/selector-engine.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./base-component.js')) :
8
+ typeof define === 'function' && define.amd ? define(['@popperjs/core', './dom/selector-engine', './dom/event-handler', './dom/manipulator', './base-component'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dropdown = factory(global.Popper, global.SelectorEngine, global.EventHandler, global.Manipulator, global.Base));
10
+ }(this, (function (Popper, SelectorEngine, EventHandler, Manipulator, BaseComponent) { 'use strict';
11
11
 
12
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
13
 
@@ -32,82 +32,24 @@
32
32
  }
33
33
 
34
34
  var Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
35
- var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
35
+ var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
36
36
  var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
37
37
  var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
38
- var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
39
38
  var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
40
39
 
41
- function _defineProperties(target, props) {
42
- for (var i = 0; i < props.length; i++) {
43
- var descriptor = props[i];
44
- descriptor.enumerable = descriptor.enumerable || false;
45
- descriptor.configurable = true;
46
- if ("value" in descriptor) descriptor.writable = true;
47
- Object.defineProperty(target, descriptor.key, descriptor);
48
- }
49
- }
50
-
51
- function _createClass(Constructor, protoProps, staticProps) {
52
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
53
- if (staticProps) _defineProperties(Constructor, staticProps);
54
- return Constructor;
55
- }
56
-
57
- function _extends() {
58
- _extends = Object.assign || function (target) {
59
- for (var i = 1; i < arguments.length; i++) {
60
- var source = arguments[i];
61
-
62
- for (var key in source) {
63
- if (Object.prototype.hasOwnProperty.call(source, key)) {
64
- target[key] = source[key];
65
- }
66
- }
67
- }
68
-
69
- return target;
70
- };
71
-
72
- return _extends.apply(this, arguments);
73
- }
74
-
75
- function _inheritsLoose(subClass, superClass) {
76
- subClass.prototype = Object.create(superClass.prototype);
77
- subClass.prototype.constructor = subClass;
78
-
79
- _setPrototypeOf(subClass, superClass);
80
- }
81
-
82
- function _setPrototypeOf(o, p) {
83
- _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
84
- o.__proto__ = p;
85
- return o;
86
- };
87
-
88
- return _setPrototypeOf(o, p);
89
- }
90
-
91
- /**
92
- * --------------------------------------------------------------------------
93
- * Bootstrap (v5.0.0-beta2): util/index.js
94
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
95
- * --------------------------------------------------------------------------
96
- */
97
-
98
- var toType = function toType(obj) {
40
+ const toType = obj => {
99
41
  if (obj === null || obj === undefined) {
100
- return "" + obj;
42
+ return `${obj}`;
101
43
  }
102
44
 
103
45
  return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
104
46
  };
105
47
 
106
- var getSelector = function getSelector(element) {
107
- var selector = element.getAttribute('data-bs-target');
48
+ const getSelector = element => {
49
+ let selector = element.getAttribute('data-bs-target');
108
50
 
109
51
  if (!selector || selector === '#') {
110
- var hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
52
+ let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
111
53
  // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
112
54
  // `document.querySelector` will rightfully complain it is invalid.
113
55
  // See https://github.com/twbs/bootstrap/issues/32273
@@ -118,7 +60,7 @@
118
60
 
119
61
 
120
62
  if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
121
- hrefAttr = '#' + hrefAttr.split('#')[1];
63
+ hrefAttr = `#${hrefAttr.split('#')[1]}`;
122
64
  }
123
65
 
124
66
  selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
@@ -127,48 +69,78 @@
127
69
  return selector;
128
70
  };
129
71
 
130
- var getElementFromSelector = function getElementFromSelector(element) {
131
- var selector = getSelector(element);
72
+ const getElementFromSelector = element => {
73
+ const selector = getSelector(element);
132
74
  return selector ? document.querySelector(selector) : null;
133
75
  };
134
76
 
135
- var isElement = function isElement(obj) {
136
- return (obj[0] || obj).nodeType;
77
+ const isElement = obj => {
78
+ if (!obj || typeof obj !== 'object') {
79
+ return false;
80
+ }
81
+
82
+ if (typeof obj.jquery !== 'undefined') {
83
+ obj = obj[0];
84
+ }
85
+
86
+ return typeof obj.nodeType !== 'undefined';
87
+ };
88
+
89
+ const getElement = obj => {
90
+ if (isElement(obj)) {
91
+ // it's a jQuery object or a node element
92
+ return obj.jquery ? obj[0] : obj;
93
+ }
94
+
95
+ if (typeof obj === 'string' && obj.length > 0) {
96
+ return SelectorEngine__default['default'].findOne(obj);
97
+ }
98
+
99
+ return null;
137
100
  };
138
101
 
139
- var typeCheckConfig = function typeCheckConfig(componentName, config, configTypes) {
140
- Object.keys(configTypes).forEach(function (property) {
141
- var expectedTypes = configTypes[property];
142
- var value = config[property];
143
- var valueType = value && isElement(value) ? 'element' : toType(value);
102
+ const typeCheckConfig = (componentName, config, configTypes) => {
103
+ Object.keys(configTypes).forEach(property => {
104
+ const expectedTypes = configTypes[property];
105
+ const value = config[property];
106
+ const valueType = value && isElement(value) ? 'element' : toType(value);
144
107
 
145
108
  if (!new RegExp(expectedTypes).test(valueType)) {
146
- throw new TypeError(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
109
+ throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
147
110
  }
148
111
  });
149
112
  };
150
113
 
151
- var isVisible = function isVisible(element) {
152
- if (!element) {
114
+ const isVisible = element => {
115
+ if (!isElement(element) || element.getClientRects().length === 0) {
153
116
  return false;
154
117
  }
155
118
 
156
- if (element.style && element.parentNode && element.parentNode.style) {
157
- var elementStyle = getComputedStyle(element);
158
- var parentNodeStyle = getComputedStyle(element.parentNode);
159
- return elementStyle.display !== 'none' && parentNodeStyle.display !== 'none' && elementStyle.visibility !== 'hidden';
119
+ return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
120
+ };
121
+
122
+ const isDisabled = element => {
123
+ if (!element || element.nodeType !== Node.ELEMENT_NODE) {
124
+ return true;
160
125
  }
161
126
 
162
- return false;
163
- };
127
+ if (element.classList.contains('disabled')) {
128
+ return true;
129
+ }
164
130
 
165
- var noop = function noop() {
166
- return function () {};
131
+ if (typeof element.disabled !== 'undefined') {
132
+ return element.disabled;
133
+ }
134
+
135
+ return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
167
136
  };
168
137
 
169
- var getjQuery = function getjQuery() {
170
- var _window = window,
171
- jQuery = _window.jQuery;
138
+ const noop = () => {};
139
+
140
+ const getjQuery = () => {
141
+ const {
142
+ jQuery
143
+ } = window;
172
144
 
173
145
  if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
174
146
  return jQuery;
@@ -177,92 +149,133 @@
177
149
  return null;
178
150
  };
179
151
 
180
- var onDOMContentLoaded = function onDOMContentLoaded(callback) {
152
+ const DOMContentLoadedCallbacks = [];
153
+
154
+ const onDOMContentLoaded = callback => {
181
155
  if (document.readyState === 'loading') {
182
- document.addEventListener('DOMContentLoaded', callback);
156
+ // add listener on the first call when the document is in loading state
157
+ if (!DOMContentLoadedCallbacks.length) {
158
+ document.addEventListener('DOMContentLoaded', () => {
159
+ DOMContentLoadedCallbacks.forEach(callback => callback());
160
+ });
161
+ }
162
+
163
+ DOMContentLoadedCallbacks.push(callback);
183
164
  } else {
184
165
  callback();
185
166
  }
186
167
  };
187
168
 
188
- var isRTL = document.documentElement.dir === 'rtl';
169
+ const isRTL = () => document.documentElement.dir === 'rtl';
189
170
 
190
- var defineJQueryPlugin = function defineJQueryPlugin(name, plugin) {
191
- onDOMContentLoaded(function () {
192
- var $ = getjQuery();
171
+ const defineJQueryPlugin = plugin => {
172
+ onDOMContentLoaded(() => {
173
+ const $ = getjQuery();
193
174
  /* istanbul ignore if */
194
175
 
195
176
  if ($) {
196
- var JQUERY_NO_CONFLICT = $.fn[name];
177
+ const name = plugin.NAME;
178
+ const JQUERY_NO_CONFLICT = $.fn[name];
197
179
  $.fn[name] = plugin.jQueryInterface;
198
180
  $.fn[name].Constructor = plugin;
199
181
 
200
- $.fn[name].noConflict = function () {
182
+ $.fn[name].noConflict = () => {
201
183
  $.fn[name] = JQUERY_NO_CONFLICT;
202
184
  return plugin.jQueryInterface;
203
185
  };
204
186
  }
205
187
  });
206
188
  };
189
+ /**
190
+ * Return the previous/next element of a list.
191
+ *
192
+ * @param {array} list The list of elements
193
+ * @param activeElement The active element
194
+ * @param shouldGetNext Choose to get next or previous element
195
+ * @param isCycleAllowed
196
+ * @return {Element|elem} The proper element
197
+ */
198
+
199
+
200
+ const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
201
+ let index = list.indexOf(activeElement); // if the element does not exist in the list return an element depending on the direction and if cycle is allowed
202
+
203
+ if (index === -1) {
204
+ return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0];
205
+ }
206
+
207
+ const listLength = list.length;
208
+ index += shouldGetNext ? 1 : -1;
209
+
210
+ if (isCycleAllowed) {
211
+ index = (index + listLength) % listLength;
212
+ }
213
+
214
+ return list[Math.max(0, Math.min(index, listLength - 1))];
215
+ };
207
216
 
217
+ /**
218
+ * --------------------------------------------------------------------------
219
+ * Bootstrap (v5.0.2): dropdown.js
220
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
221
+ * --------------------------------------------------------------------------
222
+ */
208
223
  /**
209
224
  * ------------------------------------------------------------------------
210
225
  * Constants
211
226
  * ------------------------------------------------------------------------
212
227
  */
213
228
 
214
- var NAME = 'dropdown';
215
- var DATA_KEY = 'bs.dropdown';
216
- var EVENT_KEY = "." + DATA_KEY;
217
- var DATA_API_KEY = '.data-api';
218
- var ESCAPE_KEY = 'Escape';
219
- var SPACE_KEY = 'Space';
220
- var TAB_KEY = 'Tab';
221
- var ARROW_UP_KEY = 'ArrowUp';
222
- var ARROW_DOWN_KEY = 'ArrowDown';
223
- var RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
224
-
225
- var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEY + "|" + ARROW_DOWN_KEY + "|" + ESCAPE_KEY);
226
- var EVENT_HIDE = "hide" + EVENT_KEY;
227
- var EVENT_HIDDEN = "hidden" + EVENT_KEY;
228
- var EVENT_SHOW = "show" + EVENT_KEY;
229
- var EVENT_SHOWN = "shown" + EVENT_KEY;
230
- var EVENT_CLICK = "click" + EVENT_KEY;
231
- var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
232
- var EVENT_KEYDOWN_DATA_API = "keydown" + EVENT_KEY + DATA_API_KEY;
233
- var EVENT_KEYUP_DATA_API = "keyup" + EVENT_KEY + DATA_API_KEY;
234
- var CLASS_NAME_DISABLED = 'disabled';
235
- var CLASS_NAME_SHOW = 'show';
236
- var CLASS_NAME_DROPUP = 'dropup';
237
- var CLASS_NAME_DROPEND = 'dropend';
238
- var CLASS_NAME_DROPSTART = 'dropstart';
239
- var CLASS_NAME_NAVBAR = 'navbar';
240
- var SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]';
241
- var SELECTOR_FORM_CHILD = '.dropdown form';
242
- var SELECTOR_MENU = '.dropdown-menu';
243
- var SELECTOR_NAVBAR_NAV = '.navbar-nav';
244
- var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
245
- var PLACEMENT_TOP = isRTL ? 'top-end' : 'top-start';
246
- var PLACEMENT_TOPEND = isRTL ? 'top-start' : 'top-end';
247
- var PLACEMENT_BOTTOM = isRTL ? 'bottom-end' : 'bottom-start';
248
- var PLACEMENT_BOTTOMEND = isRTL ? 'bottom-start' : 'bottom-end';
249
- var PLACEMENT_RIGHT = isRTL ? 'left-start' : 'right-start';
250
- var PLACEMENT_LEFT = isRTL ? 'right-start' : 'left-start';
251
- var Default = {
229
+ const NAME = 'dropdown';
230
+ const DATA_KEY = 'bs.dropdown';
231
+ const EVENT_KEY = `.${DATA_KEY}`;
232
+ const DATA_API_KEY = '.data-api';
233
+ const ESCAPE_KEY = 'Escape';
234
+ const SPACE_KEY = 'Space';
235
+ const TAB_KEY = 'Tab';
236
+ const ARROW_UP_KEY = 'ArrowUp';
237
+ const ARROW_DOWN_KEY = 'ArrowDown';
238
+ const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
239
+
240
+ const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY}`);
241
+ const EVENT_HIDE = `hide${EVENT_KEY}`;
242
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
243
+ const EVENT_SHOW = `show${EVENT_KEY}`;
244
+ const EVENT_SHOWN = `shown${EVENT_KEY}`;
245
+ const EVENT_CLICK = `click${EVENT_KEY}`;
246
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
247
+ const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`;
248
+ const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`;
249
+ const CLASS_NAME_SHOW = 'show';
250
+ const CLASS_NAME_DROPUP = 'dropup';
251
+ const CLASS_NAME_DROPEND = 'dropend';
252
+ const CLASS_NAME_DROPSTART = 'dropstart';
253
+ const CLASS_NAME_NAVBAR = 'navbar';
254
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]';
255
+ const SELECTOR_MENU = '.dropdown-menu';
256
+ const SELECTOR_NAVBAR_NAV = '.navbar-nav';
257
+ const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
258
+ const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
259
+ const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
260
+ const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
261
+ const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
262
+ const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
263
+ const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
264
+ const Default = {
252
265
  offset: [0, 2],
253
- flip: true,
254
266
  boundary: 'clippingParents',
255
267
  reference: 'toggle',
256
268
  display: 'dynamic',
257
- popperConfig: null
269
+ popperConfig: null,
270
+ autoClose: true
258
271
  };
259
- var DefaultType = {
272
+ const DefaultType = {
260
273
  offset: '(array|string|function)',
261
- flip: 'boolean',
262
274
  boundary: '(string|element)',
263
275
  reference: '(string|element|object)',
264
276
  display: 'string',
265
- popperConfig: '(null|object|function)'
277
+ popperConfig: '(null|object|function)',
278
+ autoClose: '(boolean|string)'
266
279
  };
267
280
  /**
268
281
  * ------------------------------------------------------------------------
@@ -270,53 +283,56 @@
270
283
  * ------------------------------------------------------------------------
271
284
  */
272
285
 
273
- var Dropdown = /*#__PURE__*/function (_BaseComponent) {
274
- _inheritsLoose(Dropdown, _BaseComponent);
286
+ class Dropdown extends BaseComponent__default['default'] {
287
+ constructor(element, config) {
288
+ super(element);
289
+ this._popper = null;
290
+ this._config = this._getConfig(config);
291
+ this._menu = this._getMenuElement();
292
+ this._inNavbar = this._detectNavbar();
275
293
 
276
- function Dropdown(element, config) {
277
- var _this;
294
+ this._addEventListeners();
295
+ } // Getters
278
296
 
279
- _this = _BaseComponent.call(this, element) || this;
280
- _this._popper = null;
281
- _this._config = _this._getConfig(config);
282
- _this._menu = _this._getMenuElement();
283
- _this._inNavbar = _this._detectNavbar();
284
297
 
285
- _this._addEventListeners();
298
+ static get Default() {
299
+ return Default;
300
+ }
286
301
 
287
- return _this;
288
- } // Getters
302
+ static get DefaultType() {
303
+ return DefaultType;
304
+ }
289
305
 
306
+ static get NAME() {
307
+ return NAME;
308
+ } // Public
290
309
 
291
- var _proto = Dropdown.prototype;
292
310
 
293
- // Public
294
- _proto.toggle = function toggle() {
295
- if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED)) {
311
+ toggle() {
312
+ if (isDisabled(this._element)) {
296
313
  return;
297
314
  }
298
315
 
299
- var isActive = this._element.classList.contains(CLASS_NAME_SHOW);
300
-
301
- Dropdown.clearMenus();
316
+ const isActive = this._element.classList.contains(CLASS_NAME_SHOW);
302
317
 
303
318
  if (isActive) {
319
+ this.hide();
304
320
  return;
305
321
  }
306
322
 
307
323
  this.show();
308
- };
324
+ }
309
325
 
310
- _proto.show = function show() {
311
- if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || this._menu.classList.contains(CLASS_NAME_SHOW)) {
326
+ show() {
327
+ if (isDisabled(this._element) || this._menu.classList.contains(CLASS_NAME_SHOW)) {
312
328
  return;
313
329
  }
314
330
 
315
- var parent = Dropdown.getParentFromElement(this._element);
316
- var relatedTarget = {
331
+ const parent = Dropdown.getParentFromElement(this._element);
332
+ const relatedTarget = {
317
333
  relatedTarget: this._element
318
334
  };
319
- var showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, relatedTarget);
335
+ const showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, relatedTarget);
320
336
 
321
337
  if (showEvent.defaultPrevented) {
322
338
  return;
@@ -330,26 +346,20 @@
330
346
  throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
331
347
  }
332
348
 
333
- var referenceElement = this._element;
349
+ let referenceElement = this._element;
334
350
 
335
351
  if (this._config.reference === 'parent') {
336
352
  referenceElement = parent;
337
353
  } else if (isElement(this._config.reference)) {
338
- referenceElement = this._config.reference; // Check if it's jQuery element
339
-
340
- if (typeof this._config.reference.jquery !== 'undefined') {
341
- referenceElement = this._config.reference[0];
342
- }
354
+ referenceElement = getElement(this._config.reference);
343
355
  } else if (typeof this._config.reference === 'object') {
344
356
  referenceElement = this._config.reference;
345
357
  }
346
358
 
347
- var popperConfig = this._getPopperConfig();
359
+ const popperConfig = this._getPopperConfig();
348
360
 
349
- var isDisplayStatic = popperConfig.modifiers.find(function (modifier) {
350
- return modifier.name === 'applyStyles' && modifier.enabled === false;
351
- });
352
- this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);
361
+ const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);
362
+ this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
353
363
 
354
364
  if (isDisplayStatic) {
355
365
  Manipulator__default['default'].setDataAttribute(this._menu, 'popper', 'static');
@@ -361,11 +371,7 @@
361
371
 
362
372
 
363
373
  if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {
364
- var _ref;
365
-
366
- (_ref = []).concat.apply(_ref, document.body.children).forEach(function (elem) {
367
- return EventHandler__default['default'].on(elem, 'mouseover', null, noop());
368
- });
374
+ [].concat(...document.body.children).forEach(elem => EventHandler__default['default'].on(elem, 'mouseover', noop));
369
375
  }
370
376
 
371
377
  this._element.focus();
@@ -377,85 +383,92 @@
377
383
  this._element.classList.toggle(CLASS_NAME_SHOW);
378
384
 
379
385
  EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, relatedTarget);
380
- };
386
+ }
381
387
 
382
- _proto.hide = function hide() {
383
- if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {
388
+ hide() {
389
+ if (isDisabled(this._element) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {
384
390
  return;
385
391
  }
386
392
 
387
- var relatedTarget = {
393
+ const relatedTarget = {
388
394
  relatedTarget: this._element
389
395
  };
390
- var hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE, relatedTarget);
391
396
 
392
- if (hideEvent.defaultPrevented) {
393
- return;
394
- }
397
+ this._completeHide(relatedTarget);
398
+ }
395
399
 
400
+ dispose() {
396
401
  if (this._popper) {
397
402
  this._popper.destroy();
398
403
  }
399
404
 
400
- this._menu.classList.toggle(CLASS_NAME_SHOW);
405
+ super.dispose();
406
+ }
401
407
 
402
- this._element.classList.toggle(CLASS_NAME_SHOW);
408
+ update() {
409
+ this._inNavbar = this._detectNavbar();
403
410
 
404
- Manipulator__default['default'].removeDataAttribute(this._menu, 'popper');
405
- EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN, relatedTarget);
406
- };
411
+ if (this._popper) {
412
+ this._popper.update();
413
+ }
414
+ } // Private
407
415
 
408
- _proto.dispose = function dispose() {
409
- _BaseComponent.prototype.dispose.call(this);
410
416
 
411
- EventHandler__default['default'].off(this._element, EVENT_KEY);
412
- this._menu = null;
417
+ _addEventListeners() {
418
+ EventHandler__default['default'].on(this._element, EVENT_CLICK, event => {
419
+ event.preventDefault();
420
+ this.toggle();
421
+ });
422
+ }
413
423
 
414
- if (this._popper) {
415
- this._popper.destroy();
424
+ _completeHide(relatedTarget) {
425
+ const hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE, relatedTarget);
416
426
 
417
- this._popper = null;
418
- }
419
- };
427
+ if (hideEvent.defaultPrevented) {
428
+ return;
429
+ } // If this is a touch-enabled device we remove the extra
430
+ // empty mouseover listeners we added for iOS support
420
431
 
421
- _proto.update = function update() {
422
- this._inNavbar = this._detectNavbar();
432
+
433
+ if ('ontouchstart' in document.documentElement) {
434
+ [].concat(...document.body.children).forEach(elem => EventHandler__default['default'].off(elem, 'mouseover', noop));
435
+ }
423
436
 
424
437
  if (this._popper) {
425
- this._popper.update();
438
+ this._popper.destroy();
426
439
  }
427
- } // Private
428
- ;
429
440
 
430
- _proto._addEventListeners = function _addEventListeners() {
431
- var _this2 = this;
441
+ this._menu.classList.remove(CLASS_NAME_SHOW);
432
442
 
433
- EventHandler__default['default'].on(this._element, EVENT_CLICK, function (event) {
434
- event.preventDefault();
435
- event.stopPropagation();
443
+ this._element.classList.remove(CLASS_NAME_SHOW);
436
444
 
437
- _this2.toggle();
438
- });
439
- };
445
+ this._element.setAttribute('aria-expanded', 'false');
440
446
 
441
- _proto._getConfig = function _getConfig(config) {
442
- config = _extends({}, this.constructor.Default, Manipulator__default['default'].getDataAttributes(this._element), config);
447
+ Manipulator__default['default'].removeDataAttribute(this._menu, 'popper');
448
+ EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN, relatedTarget);
449
+ }
450
+
451
+ _getConfig(config) {
452
+ config = { ...this.constructor.Default,
453
+ ...Manipulator__default['default'].getDataAttributes(this._element),
454
+ ...config
455
+ };
443
456
  typeCheckConfig(NAME, config, this.constructor.DefaultType);
444
457
 
445
458
  if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
446
459
  // Popper virtual elements require a getBoundingClientRect method
447
- throw new TypeError(NAME.toUpperCase() + ": Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.");
460
+ throw new TypeError(`${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
448
461
  }
449
462
 
450
463
  return config;
451
- };
464
+ }
452
465
 
453
- _proto._getMenuElement = function _getMenuElement() {
466
+ _getMenuElement() {
454
467
  return SelectorEngine__default['default'].next(this._element, SELECTOR_MENU)[0];
455
- };
468
+ }
456
469
 
457
- _proto._getPlacement = function _getPlacement() {
458
- var parentDropdown = this._element.parentNode;
470
+ _getPlacement() {
471
+ const parentDropdown = this._element.parentNode;
459
472
 
460
473
  if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
461
474
  return PLACEMENT_RIGHT;
@@ -466,46 +479,41 @@
466
479
  } // We need to trim the value because custom properties can also include spaces
467
480
 
468
481
 
469
- var isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
482
+ const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
470
483
 
471
484
  if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
472
485
  return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
473
486
  }
474
487
 
475
488
  return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
476
- };
477
-
478
- _proto._detectNavbar = function _detectNavbar() {
479
- return this._element.closest("." + CLASS_NAME_NAVBAR) !== null;
480
- };
489
+ }
481
490
 
482
- _proto._getOffset = function _getOffset() {
483
- var _this3 = this;
491
+ _detectNavbar() {
492
+ return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;
493
+ }
484
494
 
485
- var offset = this._config.offset;
495
+ _getOffset() {
496
+ const {
497
+ offset
498
+ } = this._config;
486
499
 
487
500
  if (typeof offset === 'string') {
488
- return offset.split(',').map(function (val) {
489
- return Number.parseInt(val, 10);
490
- });
501
+ return offset.split(',').map(val => Number.parseInt(val, 10));
491
502
  }
492
503
 
493
504
  if (typeof offset === 'function') {
494
- return function (popperData) {
495
- return offset(popperData, _this3._element);
496
- };
505
+ return popperData => offset(popperData, this._element);
497
506
  }
498
507
 
499
508
  return offset;
500
- };
509
+ }
501
510
 
502
- _proto._getPopperConfig = function _getPopperConfig() {
503
- var defaultBsPopperConfig = {
511
+ _getPopperConfig() {
512
+ const defaultBsPopperConfig = {
504
513
  placement: this._getPlacement(),
505
514
  modifiers: [{
506
515
  name: 'preventOverflow',
507
516
  options: {
508
- altBoundary: this._config.flip,
509
517
  boundary: this._config.boundary
510
518
  }
511
519
  }, {
@@ -523,99 +531,94 @@
523
531
  }];
524
532
  }
525
533
 
526
- return _extends({}, defaultBsPopperConfig, typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig);
527
- } // Static
528
- ;
534
+ return { ...defaultBsPopperConfig,
535
+ ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
536
+ };
537
+ }
529
538
 
530
- Dropdown.dropdownInterface = function dropdownInterface(element, config) {
531
- var data = Data__default['default'].getData(element, DATA_KEY);
539
+ _selectMenuItem({
540
+ key,
541
+ target
542
+ }) {
543
+ const items = SelectorEngine__default['default'].find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);
532
544
 
533
- var _config = typeof config === 'object' ? config : null;
545
+ if (!items.length) {
546
+ return;
547
+ } // if target isn't included in items (e.g. when expanding the dropdown)
548
+ // allow cycling to get the last item in case key equals ARROW_UP_KEY
549
+
550
+
551
+ getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();
552
+ } // Static
534
553
 
535
- if (!data) {
536
- data = new Dropdown(element, _config);
537
- }
554
+
555
+ static dropdownInterface(element, config) {
556
+ const data = Dropdown.getOrCreateInstance(element, config);
538
557
 
539
558
  if (typeof config === 'string') {
540
559
  if (typeof data[config] === 'undefined') {
541
- throw new TypeError("No method named \"" + config + "\"");
560
+ throw new TypeError(`No method named "${config}"`);
542
561
  }
543
562
 
544
563
  data[config]();
545
564
  }
546
- };
565
+ }
547
566
 
548
- Dropdown.jQueryInterface = function jQueryInterface(config) {
567
+ static jQueryInterface(config) {
549
568
  return this.each(function () {
550
569
  Dropdown.dropdownInterface(this, config);
551
570
  });
552
- };
571
+ }
553
572
 
554
- Dropdown.clearMenus = function clearMenus(event) {
573
+ static clearMenus(event) {
555
574
  if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY)) {
556
575
  return;
557
576
  }
558
577
 
559
- var toggles = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
578
+ const toggles = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
560
579
 
561
- for (var i = 0, len = toggles.length; i < len; i++) {
562
- var context = Data__default['default'].getData(toggles[i], DATA_KEY);
563
- var relatedTarget = {
564
- relatedTarget: toggles[i]
565
- };
566
-
567
- if (event && event.type === 'click') {
568
- relatedTarget.clickEvent = event;
569
- }
580
+ for (let i = 0, len = toggles.length; i < len; i++) {
581
+ const context = Dropdown.getInstance(toggles[i]);
570
582
 
571
- if (!context) {
583
+ if (!context || context._config.autoClose === false) {
572
584
  continue;
573
585
  }
574
586
 
575
- var dropdownMenu = context._menu;
576
-
577
- if (!toggles[i].classList.contains(CLASS_NAME_SHOW)) {
587
+ if (!context._element.classList.contains(CLASS_NAME_SHOW)) {
578
588
  continue;
579
589
  }
580
590
 
581
- if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.key === TAB_KEY) && dropdownMenu.contains(event.target)) {
582
- continue;
583
- }
584
-
585
- var hideEvent = EventHandler__default['default'].trigger(toggles[i], EVENT_HIDE, relatedTarget);
586
-
587
- if (hideEvent.defaultPrevented) {
588
- continue;
589
- } // If this is a touch-enabled device we remove the extra
590
- // empty mouseover listeners we added for iOS support
591
+ const relatedTarget = {
592
+ relatedTarget: context._element
593
+ };
591
594
 
595
+ if (event) {
596
+ const composedPath = event.composedPath();
597
+ const isMenuTarget = composedPath.includes(context._menu);
592
598
 
593
- if ('ontouchstart' in document.documentElement) {
594
- var _ref2;
599
+ if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
600
+ continue;
601
+ } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
595
602
 
596
- (_ref2 = []).concat.apply(_ref2, document.body.children).forEach(function (elem) {
597
- return EventHandler__default['default'].off(elem, 'mouseover', null, noop());
598
- });
599
- }
600
603
 
601
- toggles[i].setAttribute('aria-expanded', 'false');
604
+ if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY || /input|select|option|textarea|form/i.test(event.target.tagName))) {
605
+ continue;
606
+ }
602
607
 
603
- if (context._popper) {
604
- context._popper.destroy();
608
+ if (event.type === 'click') {
609
+ relatedTarget.clickEvent = event;
610
+ }
605
611
  }
606
612
 
607
- dropdownMenu.classList.remove(CLASS_NAME_SHOW);
608
- toggles[i].classList.remove(CLASS_NAME_SHOW);
609
- Manipulator__default['default'].removeDataAttribute(dropdownMenu, 'popper');
610
- EventHandler__default['default'].trigger(toggles[i], EVENT_HIDDEN, relatedTarget);
613
+ context._completeHide(relatedTarget);
611
614
  }
612
- };
615
+ }
613
616
 
614
- Dropdown.getParentFromElement = function getParentFromElement(element) {
617
+ static getParentFromElement(element) {
615
618
  return getElementFromSelector(element) || element.parentNode;
616
- };
619
+ }
617
620
 
618
- Dropdown.dataApiKeydownHandler = function dataApiKeydownHandler(event) {
621
+ static dataApiKeydownHandler(event) {
619
622
  // If not input/textarea:
620
623
  // - And not a key in REGEXP_KEYDOWN => not a dropdown command
621
624
  // If input/textarea:
@@ -627,77 +630,43 @@
627
630
  return;
628
631
  }
629
632
 
633
+ const isActive = this.classList.contains(CLASS_NAME_SHOW);
634
+
635
+ if (!isActive && event.key === ESCAPE_KEY) {
636
+ return;
637
+ }
638
+
630
639
  event.preventDefault();
631
640
  event.stopPropagation();
632
641
 
633
- if (this.disabled || this.classList.contains(CLASS_NAME_DISABLED)) {
642
+ if (isDisabled(this)) {
634
643
  return;
635
644
  }
636
645
 
637
- var parent = Dropdown.getParentFromElement(this);
638
- var isActive = this.classList.contains(CLASS_NAME_SHOW);
646
+ const getToggleButton = () => this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine__default['default'].prev(this, SELECTOR_DATA_TOGGLE)[0];
639
647
 
640
648
  if (event.key === ESCAPE_KEY) {
641
- var button = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine__default['default'].prev(this, SELECTOR_DATA_TOGGLE)[0];
642
- button.focus();
649
+ getToggleButton().focus();
643
650
  Dropdown.clearMenus();
644
651
  return;
645
652
  }
646
653
 
647
- if (!isActive && (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY)) {
648
- var _button = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine__default['default'].prev(this, SELECTOR_DATA_TOGGLE)[0];
654
+ if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {
655
+ if (!isActive) {
656
+ getToggleButton().click();
657
+ }
649
658
 
650
- _button.click();
659
+ Dropdown.getInstance(getToggleButton())._selectMenuItem(event);
651
660
 
652
661
  return;
653
662
  }
654
663
 
655
664
  if (!isActive || event.key === SPACE_KEY) {
656
665
  Dropdown.clearMenus();
657
- return;
658
666
  }
667
+ }
659
668
 
660
- var items = SelectorEngine__default['default'].find(SELECTOR_VISIBLE_ITEMS, parent).filter(isVisible);
661
-
662
- if (!items.length) {
663
- return;
664
- }
665
-
666
- var index = items.indexOf(event.target); // Up
667
-
668
- if (event.key === ARROW_UP_KEY && index > 0) {
669
- index--;
670
- } // Down
671
-
672
-
673
- if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {
674
- index++;
675
- } // index is -1 if the first keydown is an ArrowUp
676
-
677
-
678
- index = index === -1 ? 0 : index;
679
- items[index].focus();
680
- };
681
-
682
- _createClass(Dropdown, null, [{
683
- key: "Default",
684
- get: function get() {
685
- return Default;
686
- }
687
- }, {
688
- key: "DefaultType",
689
- get: function get() {
690
- return DefaultType;
691
- }
692
- }, {
693
- key: "DATA_KEY",
694
- get: function get() {
695
- return DATA_KEY;
696
- }
697
- }]);
698
-
699
- return Dropdown;
700
- }(BaseComponent__default['default']);
669
+ }
701
670
  /**
702
671
  * ------------------------------------------------------------------------
703
672
  * Data Api implementation
@@ -711,11 +680,7 @@
711
680
  EventHandler__default['default'].on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
712
681
  EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
713
682
  event.preventDefault();
714
- event.stopPropagation();
715
- Dropdown.dropdownInterface(this, 'toggle');
716
- });
717
- EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, function (e) {
718
- return e.stopPropagation();
683
+ Dropdown.dropdownInterface(this);
719
684
  });
720
685
  /**
721
686
  * ------------------------------------------------------------------------
@@ -724,7 +689,7 @@
724
689
  * add .Dropdown to jQuery only if jQuery is present
725
690
  */
726
691
 
727
- defineJQueryPlugin(NAME, Dropdown);
692
+ defineJQueryPlugin(Dropdown);
728
693
 
729
694
  return Dropdown;
730
695