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