bootstrap 4.3.1 → 5.1.3

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