bootstrap 4.6.0 → 5.0.0.beta2

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 (145) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -1
  3. data/README.md +7 -4
  4. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  5. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  6. data/assets/javascripts/bootstrap-sprockets.js +14 -8
  7. data/assets/javascripts/bootstrap.js +2152 -1633
  8. data/assets/javascripts/bootstrap.min.js +2 -2
  9. data/assets/javascripts/bootstrap/alert.js +179 -64
  10. data/assets/javascripts/bootstrap/base-component.js +75 -0
  11. data/assets/javascripts/bootstrap/button.js +94 -143
  12. data/assets/javascripts/bootstrap/carousel.js +386 -202
  13. data/assets/javascripts/bootstrap/collapse.js +349 -132
  14. data/assets/javascripts/bootstrap/dom/data.js +81 -0
  15. data/assets/javascripts/bootstrap/dom/event-handler.js +310 -0
  16. data/assets/javascripts/bootstrap/dom/manipulator.js +86 -0
  17. data/assets/javascripts/bootstrap/dom/selector-engine.js +93 -0
  18. data/assets/javascripts/bootstrap/dropdown.js +387 -224
  19. data/assets/javascripts/bootstrap/modal.js +391 -220
  20. data/assets/javascripts/bootstrap/popover.js +94 -49
  21. data/assets/javascripts/bootstrap/scrollspy.js +212 -80
  22. data/assets/javascripts/bootstrap/tab.js +198 -79
  23. data/assets/javascripts/bootstrap/toast.js +211 -78
  24. data/assets/javascripts/bootstrap/tooltip.js +558 -300
  25. data/assets/stylesheets/_bootstrap-grid.scss +51 -16
  26. data/assets/stylesheets/_bootstrap-reboot.scss +4 -1
  27. data/assets/stylesheets/_bootstrap.scss +15 -8
  28. data/assets/stylesheets/bootstrap/_accordion.scss +126 -0
  29. data/assets/stylesheets/bootstrap/_alert.scss +15 -10
  30. data/assets/stylesheets/bootstrap/_badge.scss +2 -27
  31. data/assets/stylesheets/bootstrap/_breadcrumb.scss +3 -17
  32. data/assets/stylesheets/bootstrap/_button-group.scss +21 -45
  33. data/assets/stylesheets/bootstrap/_buttons.scss +27 -60
  34. data/assets/stylesheets/bootstrap/_card.scss +21 -92
  35. data/assets/stylesheets/bootstrap/_carousel.scss +65 -33
  36. data/assets/stylesheets/bootstrap/_close.scss +30 -30
  37. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  38. data/assets/stylesheets/bootstrap/_dropdown.scss +95 -38
  39. data/assets/stylesheets/bootstrap/_forms.scss +9 -347
  40. data/assets/stylesheets/bootstrap/_functions.scss +84 -23
  41. data/assets/stylesheets/bootstrap/_grid.scss +3 -54
  42. data/assets/stylesheets/bootstrap/_helpers.scss +7 -0
  43. data/assets/stylesheets/bootstrap/_list-group.scss +17 -8
  44. data/assets/stylesheets/bootstrap/_mixins.scss +7 -13
  45. data/assets/stylesheets/bootstrap/_modal.scss +41 -46
  46. data/assets/stylesheets/bootstrap/_nav.scss +16 -4
  47. data/assets/stylesheets/bootstrap/_navbar.scss +43 -71
  48. data/assets/stylesheets/bootstrap/_pagination.scss +10 -20
  49. data/assets/stylesheets/bootstrap/_popover.scss +15 -27
  50. data/assets/stylesheets/bootstrap/_progress.scss +2 -4
  51. data/assets/stylesheets/bootstrap/_reboot.scss +314 -163
  52. data/assets/stylesheets/bootstrap/_root.scss +5 -8
  53. data/assets/stylesheets/bootstrap/_spinners.scss +5 -5
  54. data/assets/stylesheets/bootstrap/_tables.scss +79 -114
  55. data/assets/stylesheets/bootstrap/_toasts.scss +20 -15
  56. data/assets/stylesheets/bootstrap/_tooltip.scss +17 -17
  57. data/assets/stylesheets/bootstrap/_transitions.scss +0 -1
  58. data/assets/stylesheets/bootstrap/_type.scss +38 -59
  59. data/assets/stylesheets/bootstrap/_utilities.scss +566 -18
  60. data/assets/stylesheets/bootstrap/_variables.scss +673 -463
  61. data/assets/stylesheets/bootstrap/bootstrap-utilities.scss +18 -0
  62. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +61 -0
  63. data/assets/stylesheets/bootstrap/forms/_form-check.scss +152 -0
  64. data/assets/stylesheets/bootstrap/forms/_form-control.scss +223 -0
  65. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  66. data/assets/stylesheets/bootstrap/forms/_form-select.scss +67 -0
  67. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  68. data/assets/stylesheets/bootstrap/forms/_input-group.scss +121 -0
  69. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  70. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  71. data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
  72. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +12 -0
  73. data/assets/stylesheets/bootstrap/helpers/_position.scss +30 -0
  74. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  75. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  76. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  77. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  78. data/assets/stylesheets/bootstrap/mixins/_alert.scss +1 -5
  79. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +8 -8
  80. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
  81. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +14 -10
  82. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +65 -47
  83. data/assets/stylesheets/bootstrap/mixins/_caret.scss +8 -8
  84. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  85. data/assets/stylesheets/bootstrap/mixins/_container.scss +9 -0
  86. data/assets/stylesheets/bootstrap/mixins/_forms.scss +27 -88
  87. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  88. data/assets/stylesheets/bootstrap/mixins/_grid.scss +83 -32
  89. data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -21
  90. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +3 -2
  91. data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
  92. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +15 -8
  93. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
  94. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +21 -0
  95. data/assets/stylesheets/bootstrap/mixins/_transition.scss +1 -1
  96. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +68 -0
  97. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +29 -0
  98. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  99. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +234 -126
  100. data/bootstrap.gemspec +1 -3
  101. data/lib/bootstrap/version.rb +2 -2
  102. data/tasks/updater/js.rb +20 -5
  103. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  104. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  105. data/test/dummy_rails/app/views/pages/root.html +89 -0
  106. data/test/dummy_rails/config/application.rb +0 -3
  107. data/test/gemfiles/rails_6_1.gemfile +7 -0
  108. metadata +44 -75
  109. data/assets/javascripts/bootstrap/util.js +0 -192
  110. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  111. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -526
  112. data/assets/stylesheets/bootstrap/_input-group.scss +0 -208
  113. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
  114. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  115. data/assets/stylesheets/bootstrap/_print.scss +0 -141
  116. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -23
  117. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
  118. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
  119. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -80
  120. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  121. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -11
  122. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -34
  123. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
  124. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
  125. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -17
  126. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
  127. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
  128. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  129. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  130. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
  131. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
  132. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
  133. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  134. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
  135. data/assets/stylesheets/bootstrap/utilities/_interactions.scss +0 -5
  136. data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
  137. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
  138. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  139. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  140. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
  141. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
  142. data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
  143. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
  144. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
  145. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
@@ -0,0 +1,93 @@
1
+ /*!
2
+ * Bootstrap selector-engine.js v5.0.0-beta2 (https://getbootstrap.com/)
3
+ * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ */
6
+ (function (global, factory) {
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
8
+ typeof define === 'function' && define.amd ? define(factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SelectorEngine = factory());
10
+ }(this, (function () { 'use strict';
11
+
12
+ /**
13
+ * --------------------------------------------------------------------------
14
+ * Bootstrap (v5.0.0-beta2): dom/selector-engine.js
15
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
16
+ * --------------------------------------------------------------------------
17
+ */
18
+
19
+ /**
20
+ * ------------------------------------------------------------------------
21
+ * Constants
22
+ * ------------------------------------------------------------------------
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));
34
+ },
35
+ findOne: function findOne(selector, element) {
36
+ if (element === void 0) {
37
+ element = document.documentElement;
38
+ }
39
+
40
+ return Element.prototype.querySelector.call(element, selector);
41
+ },
42
+ children: function children(element, selector) {
43
+ var _ref2;
44
+
45
+ return (_ref2 = []).concat.apply(_ref2, element.children).filter(function (child) {
46
+ return child.matches(selector);
47
+ });
48
+ },
49
+ parents: function parents(element, selector) {
50
+ var parents = [];
51
+ var ancestor = element.parentNode;
52
+
53
+ while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
54
+ if (ancestor.matches(selector)) {
55
+ parents.push(ancestor);
56
+ }
57
+
58
+ ancestor = ancestor.parentNode;
59
+ }
60
+
61
+ return parents;
62
+ },
63
+ prev: function prev(element, selector) {
64
+ var previous = element.previousElementSibling;
65
+
66
+ while (previous) {
67
+ if (previous.matches(selector)) {
68
+ return [previous];
69
+ }
70
+
71
+ previous = previous.previousElementSibling;
72
+ }
73
+
74
+ return [];
75
+ },
76
+ next: function next(element, selector) {
77
+ var next = element.nextElementSibling;
78
+
79
+ while (next) {
80
+ if (next.matches(selector)) {
81
+ return [next];
82
+ }
83
+
84
+ next = next.nextElementSibling;
85
+ }
86
+
87
+ return [];
88
+ }
89
+ };
90
+
91
+ return SelectorEngine;
92
+
93
+ })));
@@ -1,19 +1,42 @@
1
1
  /*!
2
- * Bootstrap dropdown.js v4.6.0 (https://getbootstrap.com/)
2
+ * Bootstrap dropdown.js v5.0.0-beta2 (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('jquery'), require('popper.js'), require('./util.js')) :
8
- typeof define === 'function' && define.amd ? define(['jquery', 'popper.js', './util'], factory) :
9
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dropdown = factory(global.jQuery, global.Popper, global.Util));
10
- }(this, (function ($, Popper, Util) { 'use strict';
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';
11
11
 
12
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
13
 
14
- var $__default = /*#__PURE__*/_interopDefaultLegacy($);
15
- var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper);
16
- var Util__default = /*#__PURE__*/_interopDefaultLegacy(Util);
14
+ function _interopNamespace(e) {
15
+ if (e && e.__esModule) return e;
16
+ var n = Object.create(null);
17
+ if (e) {
18
+ Object.keys(e).forEach(function (k) {
19
+ if (k !== 'default') {
20
+ var d = Object.getOwnPropertyDescriptor(e, k);
21
+ Object.defineProperty(n, k, d.get ? d : {
22
+ enumerable: true,
23
+ get: function () {
24
+ return e[k];
25
+ }
26
+ });
27
+ }
28
+ });
29
+ }
30
+ n['default'] = e;
31
+ return Object.freeze(n);
32
+ }
33
+
34
+ var Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
35
+ var Data__default = /*#__PURE__*/_interopDefaultLegacy(Data);
36
+ var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
37
+ var Manipulator__default = /*#__PURE__*/_interopDefaultLegacy(Manipulator);
38
+ var SelectorEngine__default = /*#__PURE__*/_interopDefaultLegacy(SelectorEngine);
39
+ var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
17
40
 
18
41
  function _defineProperties(target, props) {
19
42
  for (var i = 0; i < props.length; i++) {
@@ -49,6 +72,139 @@
49
72
  return _extends.apply(this, arguments);
50
73
  }
51
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) {
99
+ if (obj === null || obj === undefined) {
100
+ return "" + obj;
101
+ }
102
+
103
+ return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
104
+ };
105
+
106
+ var getSelector = function getSelector(element) {
107
+ var selector = element.getAttribute('data-bs-target');
108
+
109
+ if (!selector || selector === '#') {
110
+ var hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
111
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
112
+ // `document.querySelector` will rightfully complain it is invalid.
113
+ // See https://github.com/twbs/bootstrap/issues/32273
114
+
115
+ if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
116
+ return null;
117
+ } // Just in case some CMS puts out a full URL with the anchor appended
118
+
119
+
120
+ if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
121
+ hrefAttr = '#' + hrefAttr.split('#')[1];
122
+ }
123
+
124
+ selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
125
+ }
126
+
127
+ return selector;
128
+ };
129
+
130
+ var getElementFromSelector = function getElementFromSelector(element) {
131
+ var selector = getSelector(element);
132
+ return selector ? document.querySelector(selector) : null;
133
+ };
134
+
135
+ var isElement = function isElement(obj) {
136
+ return (obj[0] || obj).nodeType;
137
+ };
138
+
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);
144
+
145
+ if (!new RegExp(expectedTypes).test(valueType)) {
146
+ throw new TypeError(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
147
+ }
148
+ });
149
+ };
150
+
151
+ var isVisible = function isVisible(element) {
152
+ if (!element) {
153
+ return false;
154
+ }
155
+
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';
160
+ }
161
+
162
+ return false;
163
+ };
164
+
165
+ var noop = function noop() {
166
+ return function () {};
167
+ };
168
+
169
+ var getjQuery = function getjQuery() {
170
+ var _window = window,
171
+ jQuery = _window.jQuery;
172
+
173
+ if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
174
+ return jQuery;
175
+ }
176
+
177
+ return null;
178
+ };
179
+
180
+ var onDOMContentLoaded = function onDOMContentLoaded(callback) {
181
+ if (document.readyState === 'loading') {
182
+ document.addEventListener('DOMContentLoaded', callback);
183
+ } else {
184
+ callback();
185
+ }
186
+ };
187
+
188
+ var isRTL = document.documentElement.dir === 'rtl';
189
+
190
+ var defineJQueryPlugin = function defineJQueryPlugin(name, plugin) {
191
+ onDOMContentLoaded(function () {
192
+ var $ = getjQuery();
193
+ /* istanbul ignore if */
194
+
195
+ if ($) {
196
+ var JQUERY_NO_CONFLICT = $.fn[name];
197
+ $.fn[name] = plugin.jQueryInterface;
198
+ $.fn[name].Constructor = plugin;
199
+
200
+ $.fn[name].noConflict = function () {
201
+ $.fn[name] = JQUERY_NO_CONFLICT;
202
+ return plugin.jQueryInterface;
203
+ };
204
+ }
205
+ });
206
+ };
207
+
52
208
  /**
53
209
  * ------------------------------------------------------------------------
54
210
  * Constants
@@ -56,24 +212,17 @@
56
212
  */
57
213
 
58
214
  var NAME = 'dropdown';
59
- var VERSION = '4.6.0';
60
215
  var DATA_KEY = 'bs.dropdown';
61
216
  var EVENT_KEY = "." + DATA_KEY;
62
217
  var DATA_API_KEY = '.data-api';
63
- var JQUERY_NO_CONFLICT = $__default['default'].fn[NAME];
64
- var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
65
-
66
- var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
67
-
68
- var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
69
-
70
- var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
71
-
72
- var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
73
-
74
- var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
75
-
76
- var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
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);
77
226
  var EVENT_HIDE = "hide" + EVENT_KEY;
78
227
  var EVENT_HIDDEN = "hidden" + EVENT_KEY;
79
228
  var EVENT_SHOW = "show" + EVENT_KEY;
@@ -85,36 +234,35 @@
85
234
  var CLASS_NAME_DISABLED = 'disabled';
86
235
  var CLASS_NAME_SHOW = 'show';
87
236
  var CLASS_NAME_DROPUP = 'dropup';
88
- var CLASS_NAME_DROPRIGHT = 'dropright';
89
- var CLASS_NAME_DROPLEFT = 'dropleft';
90
- var CLASS_NAME_MENURIGHT = 'dropdown-menu-right';
91
- var CLASS_NAME_POSITION_STATIC = 'position-static';
92
- var SELECTOR_DATA_TOGGLE = '[data-toggle="dropdown"]';
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"]';
93
241
  var SELECTOR_FORM_CHILD = '.dropdown form';
94
242
  var SELECTOR_MENU = '.dropdown-menu';
95
243
  var SELECTOR_NAVBAR_NAV = '.navbar-nav';
96
244
  var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
97
- var PLACEMENT_TOP = 'top-start';
98
- var PLACEMENT_TOPEND = 'top-end';
99
- var PLACEMENT_BOTTOM = 'bottom-start';
100
- var PLACEMENT_BOTTOMEND = 'bottom-end';
101
- var PLACEMENT_RIGHT = 'right-start';
102
- var PLACEMENT_LEFT = 'left-start';
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';
103
251
  var Default = {
104
- offset: 0,
252
+ offset: [0, 2],
105
253
  flip: true,
106
- boundary: 'scrollParent',
254
+ boundary: 'clippingParents',
107
255
  reference: 'toggle',
108
256
  display: 'dynamic',
109
257
  popperConfig: null
110
258
  };
111
259
  var DefaultType = {
112
- offset: '(number|string|function)',
260
+ offset: '(array|string|function)',
113
261
  flip: 'boolean',
114
262
  boundary: '(string|element)',
115
- reference: '(string|element)',
263
+ reference: '(string|element|object)',
116
264
  display: 'string',
117
- popperConfig: '(null|object)'
265
+ popperConfig: '(null|object|function)'
118
266
  };
119
267
  /**
120
268
  * ------------------------------------------------------------------------
@@ -122,15 +270,21 @@
122
270
  * ------------------------------------------------------------------------
123
271
  */
124
272
 
125
- var Dropdown = /*#__PURE__*/function () {
273
+ var Dropdown = /*#__PURE__*/function (_BaseComponent) {
274
+ _inheritsLoose(Dropdown, _BaseComponent);
275
+
126
276
  function Dropdown(element, config) {
127
- this._element = element;
128
- this._popper = null;
129
- this._config = this._getConfig(config);
130
- this._menu = this._getMenuElement();
131
- this._inNavbar = this._detectNavbar();
277
+ var _this;
278
+
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();
132
284
 
133
- this._addEventListeners();
285
+ _this._addEventListeners();
286
+
287
+ return _this;
134
288
  } // Getters
135
289
 
136
290
 
@@ -138,50 +292,41 @@
138
292
 
139
293
  // Public
140
294
  _proto.toggle = function toggle() {
141
- if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED)) {
295
+ if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED)) {
142
296
  return;
143
297
  }
144
298
 
145
- var isActive = $__default['default'](this._menu).hasClass(CLASS_NAME_SHOW);
299
+ var isActive = this._element.classList.contains(CLASS_NAME_SHOW);
146
300
 
147
- Dropdown._clearMenus();
301
+ Dropdown.clearMenus();
148
302
 
149
303
  if (isActive) {
150
304
  return;
151
305
  }
152
306
 
153
- this.show(true);
307
+ this.show();
154
308
  };
155
309
 
156
- _proto.show = function show(usePopper) {
157
- if (usePopper === void 0) {
158
- usePopper = false;
159
- }
160
-
161
- if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED) || $__default['default'](this._menu).hasClass(CLASS_NAME_SHOW)) {
310
+ _proto.show = function show() {
311
+ if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || this._menu.classList.contains(CLASS_NAME_SHOW)) {
162
312
  return;
163
313
  }
164
314
 
315
+ var parent = Dropdown.getParentFromElement(this._element);
165
316
  var relatedTarget = {
166
317
  relatedTarget: this._element
167
318
  };
168
- var showEvent = $__default['default'].Event(EVENT_SHOW, relatedTarget);
169
-
170
- var parent = Dropdown._getParentFromElement(this._element);
319
+ var showEvent = EventHandler__default['default'].trigger(this._element, EVENT_SHOW, relatedTarget);
171
320
 
172
- $__default['default'](parent).trigger(showEvent);
173
-
174
- if (showEvent.isDefaultPrevented()) {
321
+ if (showEvent.defaultPrevented) {
175
322
  return;
176
323
  } // Totally disable Popper for Dropdowns in Navbar
177
324
 
178
325
 
179
- if (!this._inNavbar && usePopper) {
180
- /**
181
- * Check for Popper dependency
182
- * Popper - https://popper.js.org
183
- */
184
- if (typeof Popper__default['default'] === 'undefined') {
326
+ if (this._inNavbar) {
327
+ Manipulator__default['default'].setDataAttribute(this._menu, 'popper', 'none');
328
+ } else {
329
+ if (typeof Popper__namespace === 'undefined') {
185
330
  throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
186
331
  }
187
332
 
@@ -189,55 +334,62 @@
189
334
 
190
335
  if (this._config.reference === 'parent') {
191
336
  referenceElement = parent;
192
- } else if (Util__default['default'].isElement(this._config.reference)) {
337
+ } else if (isElement(this._config.reference)) {
193
338
  referenceElement = this._config.reference; // Check if it's jQuery element
194
339
 
195
340
  if (typeof this._config.reference.jquery !== 'undefined') {
196
341
  referenceElement = this._config.reference[0];
197
342
  }
198
- } // If boundary is not `scrollParent`, then set position to `static`
199
- // to allow the menu to "escape" the scroll parent's boundaries
200
- // https://github.com/twbs/bootstrap/issues/24251
343
+ } else if (typeof this._config.reference === 'object') {
344
+ referenceElement = this._config.reference;
345
+ }
201
346
 
347
+ var popperConfig = this._getPopperConfig();
202
348
 
203
- if (this._config.boundary !== 'scrollParent') {
204
- $__default['default'](parent).addClass(CLASS_NAME_POSITION_STATIC);
205
- }
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);
206
353
 
207
- this._popper = new Popper__default['default'](referenceElement, this._menu, this._getPopperConfig());
354
+ if (isDisplayStatic) {
355
+ Manipulator__default['default'].setDataAttribute(this._menu, 'popper', 'static');
356
+ }
208
357
  } // If this is a touch-enabled device we add extra
209
358
  // empty mouseover listeners to the body's immediate children;
210
359
  // only needed because of broken event delegation on iOS
211
360
  // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
212
361
 
213
362
 
214
- if ('ontouchstart' in document.documentElement && $__default['default'](parent).closest(SELECTOR_NAVBAR_NAV).length === 0) {
215
- $__default['default'](document.body).children().on('mouseover', null, $__default['default'].noop);
363
+ 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
+ });
216
369
  }
217
370
 
218
371
  this._element.focus();
219
372
 
220
373
  this._element.setAttribute('aria-expanded', true);
221
374
 
222
- $__default['default'](this._menu).toggleClass(CLASS_NAME_SHOW);
223
- $__default['default'](parent).toggleClass(CLASS_NAME_SHOW).trigger($__default['default'].Event(EVENT_SHOWN, relatedTarget));
375
+ this._menu.classList.toggle(CLASS_NAME_SHOW);
376
+
377
+ this._element.classList.toggle(CLASS_NAME_SHOW);
378
+
379
+ EventHandler__default['default'].trigger(this._element, EVENT_SHOWN, relatedTarget);
224
380
  };
225
381
 
226
382
  _proto.hide = function hide() {
227
- if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED) || !$__default['default'](this._menu).hasClass(CLASS_NAME_SHOW)) {
383
+ if (this._element.disabled || this._element.classList.contains(CLASS_NAME_DISABLED) || !this._menu.classList.contains(CLASS_NAME_SHOW)) {
228
384
  return;
229
385
  }
230
386
 
231
387
  var relatedTarget = {
232
388
  relatedTarget: this._element
233
389
  };
234
- var hideEvent = $__default['default'].Event(EVENT_HIDE, relatedTarget);
235
-
236
- var parent = Dropdown._getParentFromElement(this._element);
237
-
238
- $__default['default'](parent).trigger(hideEvent);
390
+ var hideEvent = EventHandler__default['default'].trigger(this._element, EVENT_HIDE, relatedTarget);
239
391
 
240
- if (hideEvent.isDefaultPrevented()) {
392
+ if (hideEvent.defaultPrevented) {
241
393
  return;
242
394
  }
243
395
 
@@ -245,17 +397,21 @@
245
397
  this._popper.destroy();
246
398
  }
247
399
 
248
- $__default['default'](this._menu).toggleClass(CLASS_NAME_SHOW);
249
- $__default['default'](parent).toggleClass(CLASS_NAME_SHOW).trigger($__default['default'].Event(EVENT_HIDDEN, relatedTarget));
400
+ this._menu.classList.toggle(CLASS_NAME_SHOW);
401
+
402
+ this._element.classList.toggle(CLASS_NAME_SHOW);
403
+
404
+ Manipulator__default['default'].removeDataAttribute(this._menu, 'popper');
405
+ EventHandler__default['default'].trigger(this._element, EVENT_HIDDEN, relatedTarget);
250
406
  };
251
407
 
252
408
  _proto.dispose = function dispose() {
253
- $__default['default'].removeData(this._element, DATA_KEY);
254
- $__default['default'](this._element).off(EVENT_KEY);
255
- this._element = null;
409
+ _BaseComponent.prototype.dispose.call(this);
410
+
411
+ EventHandler__default['default'].off(this._element, EVENT_KEY);
256
412
  this._menu = null;
257
413
 
258
- if (this._popper !== null) {
414
+ if (this._popper) {
259
415
  this._popper.destroy();
260
416
 
261
417
  this._popper = null;
@@ -265,135 +421,145 @@
265
421
  _proto.update = function update() {
266
422
  this._inNavbar = this._detectNavbar();
267
423
 
268
- if (this._popper !== null) {
269
- this._popper.scheduleUpdate();
424
+ if (this._popper) {
425
+ this._popper.update();
270
426
  }
271
427
  } // Private
272
428
  ;
273
429
 
274
430
  _proto._addEventListeners = function _addEventListeners() {
275
- var _this = this;
431
+ var _this2 = this;
276
432
 
277
- $__default['default'](this._element).on(EVENT_CLICK, function (event) {
433
+ EventHandler__default['default'].on(this._element, EVENT_CLICK, function (event) {
278
434
  event.preventDefault();
279
435
  event.stopPropagation();
280
436
 
281
- _this.toggle();
437
+ _this2.toggle();
282
438
  });
283
439
  };
284
440
 
285
441
  _proto._getConfig = function _getConfig(config) {
286
- config = _extends({}, this.constructor.Default, $__default['default'](this._element).data(), config);
287
- Util__default['default'].typeCheckConfig(NAME, config, this.constructor.DefaultType);
442
+ config = _extends({}, this.constructor.Default, Manipulator__default['default'].getDataAttributes(this._element), config);
443
+ typeCheckConfig(NAME, config, this.constructor.DefaultType);
444
+
445
+ if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
446
+ // Popper virtual elements require a getBoundingClientRect method
447
+ throw new TypeError(NAME.toUpperCase() + ": Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.");
448
+ }
449
+
288
450
  return config;
289
451
  };
290
452
 
291
453
  _proto._getMenuElement = function _getMenuElement() {
292
- if (!this._menu) {
293
- var parent = Dropdown._getParentFromElement(this._element);
454
+ return SelectorEngine__default['default'].next(this._element, SELECTOR_MENU)[0];
455
+ };
294
456
 
295
- if (parent) {
296
- this._menu = parent.querySelector(SELECTOR_MENU);
297
- }
457
+ _proto._getPlacement = function _getPlacement() {
458
+ var parentDropdown = this._element.parentNode;
459
+
460
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
461
+ return PLACEMENT_RIGHT;
298
462
  }
299
463
 
300
- return this._menu;
301
- };
464
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
465
+ return PLACEMENT_LEFT;
466
+ } // We need to trim the value because custom properties can also include spaces
302
467
 
303
- _proto._getPlacement = function _getPlacement() {
304
- var $parentDropdown = $__default['default'](this._element.parentNode);
305
- var placement = PLACEMENT_BOTTOM; // Handle dropup
306
468
 
307
- if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) {
308
- placement = $__default['default'](this._menu).hasClass(CLASS_NAME_MENURIGHT) ? PLACEMENT_TOPEND : PLACEMENT_TOP;
309
- } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {
310
- placement = PLACEMENT_RIGHT;
311
- } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {
312
- placement = PLACEMENT_LEFT;
313
- } else if ($__default['default'](this._menu).hasClass(CLASS_NAME_MENURIGHT)) {
314
- placement = PLACEMENT_BOTTOMEND;
469
+ var isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
470
+
471
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
472
+ return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
315
473
  }
316
474
 
317
- return placement;
475
+ return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
318
476
  };
319
477
 
320
478
  _proto._detectNavbar = function _detectNavbar() {
321
- return $__default['default'](this._element).closest('.navbar').length > 0;
479
+ return this._element.closest("." + CLASS_NAME_NAVBAR) !== null;
322
480
  };
323
481
 
324
482
  _proto._getOffset = function _getOffset() {
325
- var _this2 = this;
483
+ var _this3 = this;
484
+
485
+ var offset = this._config.offset;
326
486
 
327
- var offset = {};
487
+ if (typeof offset === 'string') {
488
+ return offset.split(',').map(function (val) {
489
+ return Number.parseInt(val, 10);
490
+ });
491
+ }
328
492
 
329
- if (typeof this._config.offset === 'function') {
330
- offset.fn = function (data) {
331
- data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});
332
- return data;
493
+ if (typeof offset === 'function') {
494
+ return function (popperData) {
495
+ return offset(popperData, _this3._element);
333
496
  };
334
- } else {
335
- offset.offset = this._config.offset;
336
497
  }
337
498
 
338
499
  return offset;
339
500
  };
340
501
 
341
502
  _proto._getPopperConfig = function _getPopperConfig() {
342
- var popperConfig = {
503
+ var defaultBsPopperConfig = {
343
504
  placement: this._getPlacement(),
344
- modifiers: {
345
- offset: this._getOffset(),
346
- flip: {
347
- enabled: this._config.flip
348
- },
349
- preventOverflow: {
350
- boundariesElement: this._config.boundary
505
+ modifiers: [{
506
+ name: 'preventOverflow',
507
+ options: {
508
+ altBoundary: this._config.flip,
509
+ boundary: this._config.boundary
351
510
  }
352
- }
511
+ }, {
512
+ name: 'offset',
513
+ options: {
514
+ offset: this._getOffset()
515
+ }
516
+ }]
353
517
  }; // Disable Popper if we have a static display
354
518
 
355
519
  if (this._config.display === 'static') {
356
- popperConfig.modifiers.applyStyle = {
520
+ defaultBsPopperConfig.modifiers = [{
521
+ name: 'applyStyles',
357
522
  enabled: false
358
- };
523
+ }];
359
524
  }
360
525
 
361
- return _extends({}, popperConfig, this._config.popperConfig);
526
+ return _extends({}, defaultBsPopperConfig, typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig);
362
527
  } // Static
363
528
  ;
364
529
 
365
- Dropdown._jQueryInterface = function _jQueryInterface(config) {
366
- return this.each(function () {
367
- var data = $__default['default'](this).data(DATA_KEY);
530
+ Dropdown.dropdownInterface = function dropdownInterface(element, config) {
531
+ var data = Data__default['default'].getData(element, DATA_KEY);
532
+
533
+ var _config = typeof config === 'object' ? config : null;
368
534
 
369
- var _config = typeof config === 'object' ? config : null;
535
+ if (!data) {
536
+ data = new Dropdown(element, _config);
537
+ }
370
538
 
371
- if (!data) {
372
- data = new Dropdown(this, _config);
373
- $__default['default'](this).data(DATA_KEY, data);
539
+ if (typeof config === 'string') {
540
+ if (typeof data[config] === 'undefined') {
541
+ throw new TypeError("No method named \"" + config + "\"");
374
542
  }
375
543
 
376
- if (typeof config === 'string') {
377
- if (typeof data[config] === 'undefined') {
378
- throw new TypeError("No method named \"" + config + "\"");
379
- }
544
+ data[config]();
545
+ }
546
+ };
380
547
 
381
- data[config]();
382
- }
548
+ Dropdown.jQueryInterface = function jQueryInterface(config) {
549
+ return this.each(function () {
550
+ Dropdown.dropdownInterface(this, config);
383
551
  });
384
552
  };
385
553
 
386
- Dropdown._clearMenus = function _clearMenus(event) {
387
- if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
554
+ Dropdown.clearMenus = function clearMenus(event) {
555
+ if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY)) {
388
556
  return;
389
557
  }
390
558
 
391
- var toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE));
559
+ var toggles = SelectorEngine__default['default'].find(SELECTOR_DATA_TOGGLE);
392
560
 
393
561
  for (var i = 0, len = toggles.length; i < len; i++) {
394
- var parent = Dropdown._getParentFromElement(toggles[i]);
395
-
396
- var context = $__default['default'](toggles[i]).data(DATA_KEY);
562
+ var context = Data__default['default'].getData(toggles[i], DATA_KEY);
397
563
  var relatedTarget = {
398
564
  relatedTarget: toggles[i]
399
565
  };
@@ -408,25 +574,28 @@
408
574
 
409
575
  var dropdownMenu = context._menu;
410
576
 
411
- if (!$__default['default'](parent).hasClass(CLASS_NAME_SHOW)) {
577
+ if (!toggles[i].classList.contains(CLASS_NAME_SHOW)) {
412
578
  continue;
413
579
  }
414
580
 
415
- if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $__default['default'].contains(parent, event.target)) {
581
+ if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.key === TAB_KEY) && dropdownMenu.contains(event.target)) {
416
582
  continue;
417
583
  }
418
584
 
419
- var hideEvent = $__default['default'].Event(EVENT_HIDE, relatedTarget);
420
- $__default['default'](parent).trigger(hideEvent);
585
+ var hideEvent = EventHandler__default['default'].trigger(toggles[i], EVENT_HIDE, relatedTarget);
421
586
 
422
- if (hideEvent.isDefaultPrevented()) {
587
+ if (hideEvent.defaultPrevented) {
423
588
  continue;
424
589
  } // If this is a touch-enabled device we remove the extra
425
590
  // empty mouseover listeners we added for iOS support
426
591
 
427
592
 
428
593
  if ('ontouchstart' in document.documentElement) {
429
- $__default['default'](document.body).children().off('mouseover', null, $__default['default'].noop);
594
+ var _ref2;
595
+
596
+ (_ref2 = []).concat.apply(_ref2, document.body.children).forEach(function (elem) {
597
+ return EventHandler__default['default'].off(elem, 'mouseover', null, noop());
598
+ });
430
599
  }
431
600
 
432
601
  toggles[i].setAttribute('aria-expanded', 'false');
@@ -435,24 +604,18 @@
435
604
  context._popper.destroy();
436
605
  }
437
606
 
438
- $__default['default'](dropdownMenu).removeClass(CLASS_NAME_SHOW);
439
- $__default['default'](parent).removeClass(CLASS_NAME_SHOW).trigger($__default['default'].Event(EVENT_HIDDEN, relatedTarget));
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);
440
611
  }
441
612
  };
442
613
 
443
- Dropdown._getParentFromElement = function _getParentFromElement(element) {
444
- var parent;
445
- var selector = Util__default['default'].getSelectorFromElement(element);
446
-
447
- if (selector) {
448
- parent = document.querySelector(selector);
449
- }
450
-
451
- return parent || element.parentNode;
452
- } // eslint-disable-next-line complexity
453
- ;
614
+ Dropdown.getParentFromElement = function getParentFromElement(element) {
615
+ return getElementFromSelector(element) || element.parentNode;
616
+ };
454
617
 
455
- Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
618
+ Dropdown.dataApiKeydownHandler = function dataApiKeydownHandler(event) {
456
619
  // If not input/textarea:
457
620
  // - And not a key in REGEXP_KEYDOWN => not a dropdown command
458
621
  // If input/textarea:
@@ -460,67 +623,63 @@
460
623
  // - If key is other than escape
461
624
  // - If key is not up or down => not a dropdown command
462
625
  // - If trigger inside the menu => not a dropdown command
463
- if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $__default['default'](event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
626
+ if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) {
464
627
  return;
465
628
  }
466
629
 
467
- if (this.disabled || $__default['default'](this).hasClass(CLASS_NAME_DISABLED)) {
630
+ event.preventDefault();
631
+ event.stopPropagation();
632
+
633
+ if (this.disabled || this.classList.contains(CLASS_NAME_DISABLED)) {
468
634
  return;
469
635
  }
470
636
 
471
- var parent = Dropdown._getParentFromElement(this);
637
+ var parent = Dropdown.getParentFromElement(this);
638
+ var isActive = this.classList.contains(CLASS_NAME_SHOW);
472
639
 
473
- var isActive = $__default['default'](parent).hasClass(CLASS_NAME_SHOW);
474
-
475
- if (!isActive && event.which === ESCAPE_KEYCODE) {
640
+ 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();
643
+ Dropdown.clearMenus();
476
644
  return;
477
645
  }
478
646
 
479
- event.preventDefault();
480
- event.stopPropagation();
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];
481
649
 
482
- if (!isActive || event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE) {
483
- if (event.which === ESCAPE_KEYCODE) {
484
- $__default['default'](parent.querySelector(SELECTOR_DATA_TOGGLE)).trigger('focus');
485
- }
650
+ _button.click();
486
651
 
487
- $__default['default'](this).trigger('click');
488
652
  return;
489
653
  }
490
654
 
491
- var items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)).filter(function (item) {
492
- return $__default['default'](item).is(':visible');
493
- });
655
+ if (!isActive || event.key === SPACE_KEY) {
656
+ Dropdown.clearMenus();
657
+ return;
658
+ }
494
659
 
495
- if (items.length === 0) {
660
+ var items = SelectorEngine__default['default'].find(SELECTOR_VISIBLE_ITEMS, parent).filter(isVisible);
661
+
662
+ if (!items.length) {
496
663
  return;
497
664
  }
498
665
 
499
- var index = items.indexOf(event.target);
666
+ var index = items.indexOf(event.target); // Up
500
667
 
501
- if (event.which === ARROW_UP_KEYCODE && index > 0) {
502
- // Up
668
+ if (event.key === ARROW_UP_KEY && index > 0) {
503
669
  index--;
504
- }
670
+ } // Down
505
671
 
506
- if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
507
- // Down
672
+
673
+ if (event.key === ARROW_DOWN_KEY && index < items.length - 1) {
508
674
  index++;
509
- }
675
+ } // index is -1 if the first keydown is an ArrowUp
510
676
 
511
- if (index < 0) {
512
- index = 0;
513
- }
514
677
 
678
+ index = index === -1 ? 0 : index;
515
679
  items[index].focus();
516
680
  };
517
681
 
518
682
  _createClass(Dropdown, null, [{
519
- key: "VERSION",
520
- get: function get() {
521
- return VERSION;
522
- }
523
- }, {
524
683
  key: "Default",
525
684
  get: function get() {
526
685
  return Default;
@@ -530,10 +689,15 @@
530
689
  get: function get() {
531
690
  return DefaultType;
532
691
  }
692
+ }, {
693
+ key: "DATA_KEY",
694
+ get: function get() {
695
+ return DATA_KEY;
696
+ }
533
697
  }]);
534
698
 
535
699
  return Dropdown;
536
- }();
700
+ }(BaseComponent__default['default']);
537
701
  /**
538
702
  * ------------------------------------------------------------------------
539
703
  * Data Api implementation
@@ -541,27 +705,26 @@
541
705
  */
542
706
 
543
707
 
544
- $__default['default'](document).on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler).on(EVENT_CLICK_DATA_API + " " + EVENT_KEYUP_DATA_API, Dropdown._clearMenus).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
708
+ EventHandler__default['default'].on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler);
709
+ EventHandler__default['default'].on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
710
+ EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus);
711
+ EventHandler__default['default'].on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
712
+ EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
545
713
  event.preventDefault();
546
714
  event.stopPropagation();
547
-
548
- Dropdown._jQueryInterface.call($__default['default'](this), 'toggle');
549
- }).on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, function (e) {
550
- e.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();
551
719
  });
552
720
  /**
553
721
  * ------------------------------------------------------------------------
554
722
  * jQuery
555
723
  * ------------------------------------------------------------------------
724
+ * add .Dropdown to jQuery only if jQuery is present
556
725
  */
557
726
 
558
- $__default['default'].fn[NAME] = Dropdown._jQueryInterface;
559
- $__default['default'].fn[NAME].Constructor = Dropdown;
560
-
561
- $__default['default'].fn[NAME].noConflict = function () {
562
- $__default['default'].fn[NAME] = JQUERY_NO_CONFLICT;
563
- return Dropdown._jQueryInterface;
564
- };
727
+ defineJQueryPlugin(NAME, Dropdown);
565
728
 
566
729
  return Dropdown;
567
730