bootstrap 4.6.2 → 5.0.0

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