bootstrap 4.6.0 → 5.0.0

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