bootstrap 4.6.2.1 → 5.3.5

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 (186) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +61 -0
  3. data/CHANGELOG.md +7 -2
  4. data/Gemfile +1 -0
  5. data/README.md +33 -15
  6. data/Rakefile +1 -2
  7. data/assets/javascripts/bootstrap/alert.js +50 -147
  8. data/assets/javascripts/bootstrap/base-component.js +83 -0
  9. data/assets/javascripts/bootstrap/button.js +40 -190
  10. data/assets/javascripts/bootstrap/carousel.js +282 -537
  11. data/assets/javascripts/bootstrap/collapse.js +166 -314
  12. data/assets/javascripts/bootstrap/dom/data.js +62 -0
  13. data/assets/javascripts/bootstrap/dom/event-handler.js +236 -0
  14. data/assets/javascripts/bootstrap/dom/manipulator.js +71 -0
  15. data/assets/javascripts/bootstrap/dom/selector-engine.js +103 -0
  16. data/assets/javascripts/bootstrap/dropdown.js +297 -455
  17. data/assets/javascripts/bootstrap/modal.js +223 -566
  18. data/assets/javascripts/bootstrap/offcanvas.js +245 -0
  19. data/assets/javascripts/bootstrap/popover.js +59 -208
  20. data/assets/javascripts/bootstrap/scrollspy.js +213 -276
  21. data/assets/javascripts/bootstrap/tab.js +222 -200
  22. data/assets/javascripts/bootstrap/toast.js +137 -206
  23. data/assets/javascripts/bootstrap/tooltip.js +403 -747
  24. data/assets/javascripts/bootstrap/util/backdrop.js +138 -0
  25. data/assets/javascripts/bootstrap/util/component-functions.js +41 -0
  26. data/assets/javascripts/bootstrap/util/config.js +67 -0
  27. data/assets/javascripts/bootstrap/util/focustrap.js +112 -0
  28. data/assets/javascripts/bootstrap/util/index.js +280 -0
  29. data/assets/javascripts/bootstrap/util/sanitizer.js +113 -0
  30. data/assets/javascripts/bootstrap/util/scrollbar.js +112 -0
  31. data/assets/javascripts/bootstrap/util/swipe.js +134 -0
  32. data/assets/javascripts/bootstrap/util/template-factory.js +150 -0
  33. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  34. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  35. data/assets/javascripts/bootstrap-sprockets.js +21 -5
  36. data/assets/javascripts/bootstrap.js +3625 -3488
  37. data/assets/javascripts/bootstrap.min.js +3 -3
  38. data/assets/stylesheets/_bootstrap-grid.scss +53 -21
  39. data/assets/stylesheets/_bootstrap-reboot.scss +5 -7
  40. data/assets/stylesheets/_bootstrap-utilities.scss +19 -0
  41. data/assets/stylesheets/_bootstrap.scss +21 -13
  42. data/assets/stylesheets/bootstrap/_accordion.scss +153 -0
  43. data/assets/stylesheets/bootstrap/_alert.scss +32 -16
  44. data/assets/stylesheets/bootstrap/_badge.scss +15 -31
  45. data/assets/stylesheets/bootstrap/_breadcrumb.scss +22 -24
  46. data/assets/stylesheets/bootstrap/_button-group.scss +32 -48
  47. data/assets/stylesheets/bootstrap/_buttons.scss +145 -71
  48. data/assets/stylesheets/bootstrap/_card.scss +67 -115
  49. data/assets/stylesheets/bootstrap/_carousel.scss +63 -37
  50. data/assets/stylesheets/bootstrap/_close.scss +53 -27
  51. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  52. data/assets/stylesheets/bootstrap/_dropdown.scss +129 -71
  53. data/assets/stylesheets/bootstrap/_forms.scss +9 -347
  54. data/assets/stylesheets/bootstrap/_functions.scss +135 -23
  55. data/assets/stylesheets/bootstrap/_grid.scss +18 -52
  56. data/assets/stylesheets/bootstrap/_helpers.scss +12 -0
  57. data/assets/stylesheets/bootstrap/_list-group.scss +93 -48
  58. data/assets/stylesheets/bootstrap/_maps.scss +174 -0
  59. data/assets/stylesheets/bootstrap/_mixins.scss +10 -15
  60. data/assets/stylesheets/bootstrap/_modal.scss +112 -112
  61. data/assets/stylesheets/bootstrap/_nav.scss +100 -28
  62. data/assets/stylesheets/bootstrap/_navbar.scss +130 -173
  63. data/assets/stylesheets/bootstrap/_offcanvas.scss +147 -0
  64. data/assets/stylesheets/bootstrap/_pagination.scss +72 -37
  65. data/assets/stylesheets/bootstrap/_placeholders.scss +51 -0
  66. data/assets/stylesheets/bootstrap/_popover.scss +99 -73
  67. data/assets/stylesheets/bootstrap/_progress.scss +35 -14
  68. data/assets/stylesheets/bootstrap/_reboot.scss +319 -192
  69. data/assets/stylesheets/bootstrap/_root.scss +177 -9
  70. data/assets/stylesheets/bootstrap/_spinners.scss +43 -23
  71. data/assets/stylesheets/bootstrap/_tables.scss +101 -115
  72. data/assets/stylesheets/bootstrap/_toasts.scss +54 -27
  73. data/assets/stylesheets/bootstrap/_tooltip.scss +67 -63
  74. data/assets/stylesheets/bootstrap/_transitions.scss +3 -2
  75. data/assets/stylesheets/bootstrap/_type.scss +40 -59
  76. data/assets/stylesheets/bootstrap/_utilities.scss +806 -18
  77. data/assets/stylesheets/bootstrap/_variables-dark.scss +102 -0
  78. data/assets/stylesheets/bootstrap/_variables.scss +1210 -606
  79. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +97 -0
  80. data/assets/stylesheets/bootstrap/forms/_form-check.scss +189 -0
  81. data/assets/stylesheets/bootstrap/forms/_form-control.scss +214 -0
  82. data/assets/stylesheets/bootstrap/forms/_form-range.scss +91 -0
  83. data/assets/stylesheets/bootstrap/forms/_form-select.scss +80 -0
  84. data/assets/stylesheets/bootstrap/forms/_form-text.scss +11 -0
  85. data/assets/stylesheets/bootstrap/forms/_input-group.scss +132 -0
  86. data/assets/stylesheets/bootstrap/forms/_labels.scss +36 -0
  87. data/assets/stylesheets/bootstrap/forms/_validation.scss +12 -0
  88. data/assets/stylesheets/bootstrap/helpers/_color-bg.scss +7 -0
  89. data/assets/stylesheets/bootstrap/helpers/_colored-links.scss +30 -0
  90. data/assets/stylesheets/bootstrap/helpers/_focus-ring.scss +5 -0
  91. data/assets/stylesheets/bootstrap/helpers/_icon-link.scss +25 -0
  92. data/assets/stylesheets/bootstrap/helpers/_position.scss +36 -0
  93. data/assets/stylesheets/bootstrap/helpers/_ratio.scss +26 -0
  94. data/assets/stylesheets/bootstrap/helpers/_stacks.scss +15 -0
  95. data/assets/stylesheets/bootstrap/helpers/_stretched-link.scss +15 -0
  96. data/assets/stylesheets/bootstrap/helpers/_text-truncation.scss +7 -0
  97. data/assets/stylesheets/bootstrap/helpers/_visually-hidden.scss +8 -0
  98. data/assets/stylesheets/bootstrap/helpers/_vr.scss +8 -0
  99. data/assets/stylesheets/bootstrap/mixins/_alert.scss +11 -6
  100. data/assets/stylesheets/bootstrap/mixins/_backdrop.scss +14 -0
  101. data/assets/stylesheets/bootstrap/mixins/_banner.scss +7 -0
  102. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +10 -8
  103. data/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +7 -9
  104. data/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +20 -16
  105. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +60 -100
  106. data/assets/stylesheets/bootstrap/mixins/_caret.scss +34 -27
  107. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +2 -0
  108. data/assets/stylesheets/bootstrap/mixins/_color-mode.scss +21 -0
  109. data/assets/stylesheets/bootstrap/mixins/_color-scheme.scss +7 -0
  110. data/assets/stylesheets/bootstrap/mixins/_container.scss +11 -0
  111. data/assets/stylesheets/bootstrap/mixins/_forms.scss +64 -96
  112. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  113. data/assets/stylesheets/bootstrap/mixins/_grid.scss +118 -36
  114. data/assets/stylesheets/bootstrap/mixins/_image.scss +1 -21
  115. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +7 -2
  116. data/assets/stylesheets/bootstrap/mixins/_lists.scss +1 -1
  117. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +7 -19
  118. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +2 -2
  119. data/assets/stylesheets/bootstrap/mixins/_table-variants.scss +24 -0
  120. data/assets/stylesheets/bootstrap/mixins/_transition.scss +1 -1
  121. data/assets/stylesheets/bootstrap/mixins/_utilities.scss +97 -0
  122. data/assets/stylesheets/bootstrap/mixins/_visually-hidden.scss +33 -0
  123. data/assets/stylesheets/bootstrap/utilities/_api.scss +47 -0
  124. data/assets/stylesheets/bootstrap/vendor/_rfs.scss +211 -91
  125. data/bootstrap.gemspec +6 -6
  126. data/lib/bootstrap/engine.rb +0 -1
  127. data/lib/bootstrap/version.rb +2 -2
  128. data/tasks/updater/js.rb +17 -5
  129. data/tasks/updater/network.rb +2 -2
  130. data/tasks/updater/scss.rb +2 -2
  131. data/tasks/updater.rb +2 -2
  132. data/test/dummy_rails/app/assets/javascripts/application.js +4 -3
  133. data/test/dummy_rails/app/views/layouts/application.html.erb +3 -1
  134. data/test/dummy_rails/app/views/pages/root.html +89 -0
  135. data/test/dummy_rails/config/application.rb +0 -5
  136. data/test/dummy_rails/public/favicon.ico +0 -0
  137. data/test/gemfiles/rails_4_2.gemfile +2 -1
  138. data/test/gemfiles/rails_5_0.gemfile +1 -2
  139. data/test/gemfiles/rails_5_1.gemfile +1 -2
  140. data/test/gemfiles/rails_5_2.gemfile +7 -0
  141. data/test/gemfiles/rails_6_0.gemfile +1 -1
  142. data/test/gemfiles/rails_6_1.gemfile +7 -0
  143. data/test/gemfiles/rails_7_0_dartsass.gemfile +0 -1
  144. data/test/gemfiles/rails_7_0_sassc.gemfile +0 -1
  145. data/test/rails_test.rb +0 -5
  146. data/test/test_helper.rb +3 -2
  147. metadata +92 -86
  148. data/.travis.yml +0 -31
  149. data/assets/javascripts/bootstrap/util.js +0 -189
  150. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  151. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -526
  152. data/assets/stylesheets/bootstrap/_input-group.scss +0 -211
  153. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
  154. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  155. data/assets/stylesheets/bootstrap/_print.scss +0 -132
  156. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -23
  157. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
  158. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
  159. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -80
  160. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  161. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -11
  162. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -34
  163. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
  164. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
  165. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -17
  166. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
  167. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
  168. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  169. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  170. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
  171. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
  172. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
  173. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  174. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
  175. data/assets/stylesheets/bootstrap/utilities/_interactions.scss +0 -5
  176. data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
  177. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
  178. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  179. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  180. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
  181. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
  182. data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
  183. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
  184. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
  185. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
  186. /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
@@ -1,558 +1,400 @@
1
1
  /*!
2
- * Bootstrap dropdown.js v4.6.2 (https://getbootstrap.com/)
3
- * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap dropdown.js v5.3.5 (https://getbootstrap.com/)
3
+ * Copyright 2011-2025 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';
11
-
12
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
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);
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./util/index.js')) :
8
+ typeof define === 'function' && define.amd ? define(['@popperjs/core', './base-component', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './util/index'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dropdown = factory(global["@popperjs/core"], global.BaseComponent, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Index));
10
+ })(this, (function (Popper, BaseComponent, EventHandler, Manipulator, SelectorEngine, index_js) { 'use strict';
11
+
12
+ function _interopNamespaceDefault(e) {
13
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
14
+ if (e) {
15
+ for (const k in e) {
16
+ if (k !== 'default') {
17
+ const d = Object.getOwnPropertyDescriptor(e, k);
18
+ Object.defineProperty(n, k, d.get ? d : {
19
+ enumerable: true,
20
+ get: () => e[k]
21
+ });
22
+ }
23
+ }
25
24
  }
25
+ n.default = e;
26
+ return Object.freeze(n);
26
27
  }
27
28
 
28
- function _createClass(Constructor, protoProps, staticProps) {
29
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
30
- if (staticProps) _defineProperties(Constructor, staticProps);
31
- Object.defineProperty(Constructor, "prototype", {
32
- writable: false
33
- });
34
- return Constructor;
35
- }
36
-
37
- function _extends() {
38
- _extends = Object.assign ? Object.assign.bind() : function (target) {
39
- for (var i = 1; i < arguments.length; i++) {
40
- var source = arguments[i];
29
+ const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper);
41
30
 
42
- for (var key in source) {
43
- if (Object.prototype.hasOwnProperty.call(source, key)) {
44
- target[key] = source[key];
45
- }
46
- }
47
- }
31
+ /**
32
+ * --------------------------------------------------------------------------
33
+ * Bootstrap dropdown.js
34
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
35
+ * --------------------------------------------------------------------------
36
+ */
48
37
 
49
- return target;
50
- };
51
- return _extends.apply(this, arguments);
52
- }
53
38
 
54
39
  /**
55
40
  * Constants
56
41
  */
57
42
 
58
- var NAME = 'dropdown';
59
- var VERSION = '4.6.2';
60
- var DATA_KEY = 'bs.dropdown';
61
- var EVENT_KEY = "." + DATA_KEY;
62
- var DATA_API_KEY = '.data-api';
63
- var JQUERY_NO_CONFLICT = $__default["default"].fn[NAME];
64
- var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
65
-
66
- var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
67
-
68
- var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
69
-
70
- var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
71
-
72
- var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
73
-
74
- var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
75
-
76
- var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
77
- var CLASS_NAME_DISABLED = 'disabled';
78
- var CLASS_NAME_SHOW = 'show';
79
- var CLASS_NAME_DROPUP = 'dropup';
80
- var CLASS_NAME_DROPRIGHT = 'dropright';
81
- var CLASS_NAME_DROPLEFT = 'dropleft';
82
- var CLASS_NAME_MENURIGHT = 'dropdown-menu-right';
83
- var CLASS_NAME_POSITION_STATIC = 'position-static';
84
- var EVENT_HIDE = "hide" + EVENT_KEY;
85
- var EVENT_HIDDEN = "hidden" + EVENT_KEY;
86
- var EVENT_SHOW = "show" + EVENT_KEY;
87
- var EVENT_SHOWN = "shown" + EVENT_KEY;
88
- var EVENT_CLICK = "click" + EVENT_KEY;
89
- var EVENT_CLICK_DATA_API = "click" + EVENT_KEY + DATA_API_KEY;
90
- var EVENT_KEYDOWN_DATA_API = "keydown" + EVENT_KEY + DATA_API_KEY;
91
- var EVENT_KEYUP_DATA_API = "keyup" + EVENT_KEY + DATA_API_KEY;
92
- var SELECTOR_DATA_TOGGLE = '[data-toggle="dropdown"]';
93
- var SELECTOR_FORM_CHILD = '.dropdown form';
94
- var SELECTOR_MENU = '.dropdown-menu';
95
- var SELECTOR_NAVBAR_NAV = '.navbar-nav';
96
- var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
97
- var PLACEMENT_TOP = 'top-start';
98
- var PLACEMENT_TOPEND = 'top-end';
99
- var PLACEMENT_BOTTOM = 'bottom-start';
100
- var PLACEMENT_BOTTOMEND = 'bottom-end';
101
- var PLACEMENT_RIGHT = 'right-start';
102
- var PLACEMENT_LEFT = 'left-start';
103
- var Default = {
104
- offset: 0,
105
- flip: true,
106
- boundary: 'scrollParent',
107
- reference: 'toggle',
43
+ const NAME = 'dropdown';
44
+ const DATA_KEY = 'bs.dropdown';
45
+ const EVENT_KEY = `.${DATA_KEY}`;
46
+ const DATA_API_KEY = '.data-api';
47
+ const ESCAPE_KEY = 'Escape';
48
+ const TAB_KEY = 'Tab';
49
+ const ARROW_UP_KEY = 'ArrowUp';
50
+ const ARROW_DOWN_KEY = 'ArrowDown';
51
+ const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
52
+
53
+ const EVENT_HIDE = `hide${EVENT_KEY}`;
54
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
55
+ const EVENT_SHOW = `show${EVENT_KEY}`;
56
+ const EVENT_SHOWN = `shown${EVENT_KEY}`;
57
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
58
+ const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`;
59
+ const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`;
60
+ const CLASS_NAME_SHOW = 'show';
61
+ const CLASS_NAME_DROPUP = 'dropup';
62
+ const CLASS_NAME_DROPEND = 'dropend';
63
+ const CLASS_NAME_DROPSTART = 'dropstart';
64
+ const CLASS_NAME_DROPUP_CENTER = 'dropup-center';
65
+ const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';
66
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)';
67
+ const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`;
68
+ const SELECTOR_MENU = '.dropdown-menu';
69
+ const SELECTOR_NAVBAR = '.navbar';
70
+ const SELECTOR_NAVBAR_NAV = '.navbar-nav';
71
+ const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
72
+ const PLACEMENT_TOP = index_js.isRTL() ? 'top-end' : 'top-start';
73
+ const PLACEMENT_TOPEND = index_js.isRTL() ? 'top-start' : 'top-end';
74
+ const PLACEMENT_BOTTOM = index_js.isRTL() ? 'bottom-end' : 'bottom-start';
75
+ const PLACEMENT_BOTTOMEND = index_js.isRTL() ? 'bottom-start' : 'bottom-end';
76
+ const PLACEMENT_RIGHT = index_js.isRTL() ? 'left-start' : 'right-start';
77
+ const PLACEMENT_LEFT = index_js.isRTL() ? 'right-start' : 'left-start';
78
+ const PLACEMENT_TOPCENTER = 'top';
79
+ const PLACEMENT_BOTTOMCENTER = 'bottom';
80
+ const Default = {
81
+ autoClose: true,
82
+ boundary: 'clippingParents',
108
83
  display: 'dynamic',
109
- popperConfig: null
84
+ offset: [0, 2],
85
+ popperConfig: null,
86
+ reference: 'toggle'
110
87
  };
111
- var DefaultType = {
112
- offset: '(number|string|function)',
113
- flip: 'boolean',
88
+ const DefaultType = {
89
+ autoClose: '(boolean|string)',
114
90
  boundary: '(string|element)',
115
- reference: '(string|element)',
116
91
  display: 'string',
117
- popperConfig: '(null|object)'
92
+ offset: '(array|string|function)',
93
+ popperConfig: '(null|object|function)',
94
+ reference: '(string|element|object)'
118
95
  };
96
+
119
97
  /**
120
98
  * Class definition
121
99
  */
122
100
 
123
- var Dropdown = /*#__PURE__*/function () {
124
- function Dropdown(element, config) {
125
- this._element = element;
101
+ class Dropdown extends BaseComponent {
102
+ constructor(element, config) {
103
+ super(element, config);
126
104
  this._popper = null;
127
- this._config = this._getConfig(config);
128
- this._menu = this._getMenuElement();
105
+ this._parent = this._element.parentNode; // dropdown wrapper
106
+ // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
107
+ this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);
129
108
  this._inNavbar = this._detectNavbar();
109
+ }
130
110
 
131
- this._addEventListeners();
132
- } // Getters
133
-
134
-
135
- var _proto = Dropdown.prototype;
111
+ // Getters
112
+ static get Default() {
113
+ return Default;
114
+ }
115
+ static get DefaultType() {
116
+ return DefaultType;
117
+ }
118
+ static get NAME() {
119
+ return NAME;
120
+ }
136
121
 
137
122
  // Public
138
- _proto.toggle = function toggle() {
139
- if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED)) {
140
- return;
141
- }
142
-
143
- var isActive = $__default["default"](this._menu).hasClass(CLASS_NAME_SHOW);
144
-
145
- Dropdown._clearMenus();
146
-
147
- if (isActive) {
148
- return;
149
- }
150
-
151
- this.show(true);
152
- };
153
-
154
- _proto.show = function show(usePopper) {
155
- if (usePopper === void 0) {
156
- usePopper = false;
157
- }
158
-
159
- if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED) || $__default["default"](this._menu).hasClass(CLASS_NAME_SHOW)) {
123
+ toggle() {
124
+ return this._isShown() ? this.hide() : this.show();
125
+ }
126
+ show() {
127
+ if (index_js.isDisabled(this._element) || this._isShown()) {
160
128
  return;
161
129
  }
162
-
163
- var relatedTarget = {
130
+ const relatedTarget = {
164
131
  relatedTarget: this._element
165
132
  };
166
- var showEvent = $__default["default"].Event(EVENT_SHOW, relatedTarget);
167
-
168
- var parent = Dropdown._getParentFromElement(this._element);
169
-
170
- $__default["default"](parent).trigger(showEvent);
171
-
172
- if (showEvent.isDefaultPrevented()) {
133
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget);
134
+ if (showEvent.defaultPrevented) {
173
135
  return;
174
- } // Totally disable Popper for Dropdowns in Navbar
175
-
176
-
177
- if (!this._inNavbar && usePopper) {
178
- // Check for Popper dependency
179
- if (typeof Popper__default["default"] === 'undefined') {
180
- throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
181
- }
182
-
183
- var referenceElement = this._element;
184
-
185
- if (this._config.reference === 'parent') {
186
- referenceElement = parent;
187
- } else if (Util__default["default"].isElement(this._config.reference)) {
188
- referenceElement = this._config.reference; // Check if it's jQuery element
189
-
190
- if (typeof this._config.reference.jquery !== 'undefined') {
191
- referenceElement = this._config.reference[0];
192
- }
193
- } // If boundary is not `scrollParent`, then set position to `static`
194
- // to allow the menu to "escape" the scroll parent's boundaries
195
- // https://github.com/twbs/bootstrap/issues/24251
196
-
197
-
198
- if (this._config.boundary !== 'scrollParent') {
199
- $__default["default"](parent).addClass(CLASS_NAME_POSITION_STATIC);
200
- }
136
+ }
137
+ this._createPopper();
201
138
 
202
- this._popper = new Popper__default["default"](referenceElement, this._menu, this._getPopperConfig());
203
- } // If this is a touch-enabled device we add extra
139
+ // If this is a touch-enabled device we add extra
204
140
  // empty mouseover listeners to the body's immediate children;
205
141
  // only needed because of broken event delegation on iOS
206
142
  // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
207
-
208
-
209
- if ('ontouchstart' in document.documentElement && $__default["default"](parent).closest(SELECTOR_NAVBAR_NAV).length === 0) {
210
- $__default["default"](document.body).children().on('mouseover', null, $__default["default"].noop);
143
+ if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {
144
+ for (const element of [].concat(...document.body.children)) {
145
+ EventHandler.on(element, 'mouseover', index_js.noop);
146
+ }
211
147
  }
212
-
213
148
  this._element.focus();
214
-
215
149
  this._element.setAttribute('aria-expanded', true);
216
-
217
- $__default["default"](this._menu).toggleClass(CLASS_NAME_SHOW);
218
- $__default["default"](parent).toggleClass(CLASS_NAME_SHOW).trigger($__default["default"].Event(EVENT_SHOWN, relatedTarget));
219
- };
220
-
221
- _proto.hide = function hide() {
222
- if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED) || !$__default["default"](this._menu).hasClass(CLASS_NAME_SHOW)) {
150
+ this._menu.classList.add(CLASS_NAME_SHOW);
151
+ this._element.classList.add(CLASS_NAME_SHOW);
152
+ EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget);
153
+ }
154
+ hide() {
155
+ if (index_js.isDisabled(this._element) || !this._isShown()) {
223
156
  return;
224
157
  }
225
-
226
- var relatedTarget = {
158
+ const relatedTarget = {
227
159
  relatedTarget: this._element
228
160
  };
229
- var hideEvent = $__default["default"].Event(EVENT_HIDE, relatedTarget);
230
-
231
- var parent = Dropdown._getParentFromElement(this._element);
232
-
233
- $__default["default"](parent).trigger(hideEvent);
234
-
235
- if (hideEvent.isDefaultPrevented()) {
236
- return;
237
- }
238
-
161
+ this._completeHide(relatedTarget);
162
+ }
163
+ dispose() {
239
164
  if (this._popper) {
240
165
  this._popper.destroy();
241
166
  }
167
+ super.dispose();
168
+ }
169
+ update() {
170
+ this._inNavbar = this._detectNavbar();
171
+ if (this._popper) {
172
+ this._popper.update();
173
+ }
174
+ }
242
175
 
243
- $__default["default"](this._menu).toggleClass(CLASS_NAME_SHOW);
244
- $__default["default"](parent).toggleClass(CLASS_NAME_SHOW).trigger($__default["default"].Event(EVENT_HIDDEN, relatedTarget));
245
- };
246
-
247
- _proto.dispose = function dispose() {
248
- $__default["default"].removeData(this._element, DATA_KEY);
249
- $__default["default"](this._element).off(EVENT_KEY);
250
- this._element = null;
251
- this._menu = null;
176
+ // Private
177
+ _completeHide(relatedTarget) {
178
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget);
179
+ if (hideEvent.defaultPrevented) {
180
+ return;
181
+ }
252
182
 
253
- if (this._popper !== null) {
183
+ // If this is a touch-enabled device we remove the extra
184
+ // empty mouseover listeners we added for iOS support
185
+ if ('ontouchstart' in document.documentElement) {
186
+ for (const element of [].concat(...document.body.children)) {
187
+ EventHandler.off(element, 'mouseover', index_js.noop);
188
+ }
189
+ }
190
+ if (this._popper) {
254
191
  this._popper.destroy();
255
-
256
- this._popper = null;
257
192
  }
258
- };
259
-
260
- _proto.update = function update() {
261
- this._inNavbar = this._detectNavbar();
262
-
263
- if (this._popper !== null) {
264
- this._popper.scheduleUpdate();
193
+ this._menu.classList.remove(CLASS_NAME_SHOW);
194
+ this._element.classList.remove(CLASS_NAME_SHOW);
195
+ this._element.setAttribute('aria-expanded', 'false');
196
+ Manipulator.removeDataAttribute(this._menu, 'popper');
197
+ EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget);
198
+ }
199
+ _getConfig(config) {
200
+ config = super._getConfig(config);
201
+ if (typeof config.reference === 'object' && !index_js.isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
202
+ // Popper virtual elements require a getBoundingClientRect method
203
+ throw new TypeError(`${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
265
204
  }
266
- } // Private
267
- ;
268
-
269
- _proto._addEventListeners = function _addEventListeners() {
270
- var _this = this;
271
-
272
- $__default["default"](this._element).on(EVENT_CLICK, function (event) {
273
- event.preventDefault();
274
- event.stopPropagation();
275
-
276
- _this.toggle();
277
- });
278
- };
279
-
280
- _proto._getConfig = function _getConfig(config) {
281
- config = _extends({}, this.constructor.Default, $__default["default"](this._element).data(), config);
282
- Util__default["default"].typeCheckConfig(NAME, config, this.constructor.DefaultType);
283
205
  return config;
284
- };
285
-
286
- _proto._getMenuElement = function _getMenuElement() {
287
- if (!this._menu) {
288
- var parent = Dropdown._getParentFromElement(this._element);
289
-
290
- if (parent) {
291
- this._menu = parent.querySelector(SELECTOR_MENU);
292
- }
206
+ }
207
+ _createPopper() {
208
+ if (typeof Popper__namespace === 'undefined') {
209
+ throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org/docs/v2/)');
293
210
  }
294
-
295
- return this._menu;
296
- };
297
-
298
- _proto._getPlacement = function _getPlacement() {
299
- var $parentDropdown = $__default["default"](this._element.parentNode);
300
- var placement = PLACEMENT_BOTTOM; // Handle dropup
301
-
302
- if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) {
303
- placement = $__default["default"](this._menu).hasClass(CLASS_NAME_MENURIGHT) ? PLACEMENT_TOPEND : PLACEMENT_TOP;
304
- } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {
305
- placement = PLACEMENT_RIGHT;
306
- } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {
307
- placement = PLACEMENT_LEFT;
308
- } else if ($__default["default"](this._menu).hasClass(CLASS_NAME_MENURIGHT)) {
309
- placement = PLACEMENT_BOTTOMEND;
211
+ let referenceElement = this._element;
212
+ if (this._config.reference === 'parent') {
213
+ referenceElement = this._parent;
214
+ } else if (index_js.isElement(this._config.reference)) {
215
+ referenceElement = index_js.getElement(this._config.reference);
216
+ } else if (typeof this._config.reference === 'object') {
217
+ referenceElement = this._config.reference;
310
218
  }
311
-
312
- return placement;
313
- };
314
-
315
- _proto._detectNavbar = function _detectNavbar() {
316
- return $__default["default"](this._element).closest('.navbar').length > 0;
317
- };
318
-
319
- _proto._getOffset = function _getOffset() {
320
- var _this2 = this;
321
-
322
- var offset = {};
323
-
324
- if (typeof this._config.offset === 'function') {
325
- offset.fn = function (data) {
326
- data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element));
327
- return data;
328
- };
329
- } else {
330
- offset.offset = this._config.offset;
219
+ const popperConfig = this._getPopperConfig();
220
+ this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
221
+ }
222
+ _isShown() {
223
+ return this._menu.classList.contains(CLASS_NAME_SHOW);
224
+ }
225
+ _getPlacement() {
226
+ const parentDropdown = this._parent;
227
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
228
+ return PLACEMENT_RIGHT;
229
+ }
230
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
231
+ return PLACEMENT_LEFT;
232
+ }
233
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {
234
+ return PLACEMENT_TOPCENTER;
235
+ }
236
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {
237
+ return PLACEMENT_BOTTOMCENTER;
331
238
  }
332
239
 
240
+ // We need to trim the value because custom properties can also include spaces
241
+ const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
242
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
243
+ return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
244
+ }
245
+ return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
246
+ }
247
+ _detectNavbar() {
248
+ return this._element.closest(SELECTOR_NAVBAR) !== null;
249
+ }
250
+ _getOffset() {
251
+ const {
252
+ offset
253
+ } = this._config;
254
+ if (typeof offset === 'string') {
255
+ return offset.split(',').map(value => Number.parseInt(value, 10));
256
+ }
257
+ if (typeof offset === 'function') {
258
+ return popperData => offset(popperData, this._element);
259
+ }
333
260
  return offset;
334
- };
335
-
336
- _proto._getPopperConfig = function _getPopperConfig() {
337
- var popperConfig = {
261
+ }
262
+ _getPopperConfig() {
263
+ const defaultBsPopperConfig = {
338
264
  placement: this._getPlacement(),
339
- modifiers: {
340
- offset: this._getOffset(),
341
- flip: {
342
- enabled: this._config.flip
343
- },
344
- preventOverflow: {
345
- boundariesElement: this._config.boundary
265
+ modifiers: [{
266
+ name: 'preventOverflow',
267
+ options: {
268
+ boundary: this._config.boundary
346
269
  }
347
- }
348
- }; // Disable Popper if we have a static display
270
+ }, {
271
+ name: 'offset',
272
+ options: {
273
+ offset: this._getOffset()
274
+ }
275
+ }]
276
+ };
349
277
 
350
- if (this._config.display === 'static') {
351
- popperConfig.modifiers.applyStyle = {
278
+ // Disable Popper if we have a static display or Dropdown is in Navbar
279
+ if (this._inNavbar || this._config.display === 'static') {
280
+ Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove
281
+ defaultBsPopperConfig.modifiers = [{
282
+ name: 'applyStyles',
352
283
  enabled: false
353
- };
284
+ }];
285
+ }
286
+ return {
287
+ ...defaultBsPopperConfig,
288
+ ...index_js.execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])
289
+ };
290
+ }
291
+ _selectMenuItem({
292
+ key,
293
+ target
294
+ }) {
295
+ const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => index_js.isVisible(element));
296
+ if (!items.length) {
297
+ return;
354
298
  }
355
299
 
356
- return _extends({}, popperConfig, this._config.popperConfig);
357
- } // Static
358
- ;
300
+ // if target isn't included in items (e.g. when expanding the dropdown)
301
+ // allow cycling to get the last item in case key equals ARROW_UP_KEY
302
+ index_js.getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();
303
+ }
359
304
 
360
- Dropdown._jQueryInterface = function _jQueryInterface(config) {
305
+ // Static
306
+ static jQueryInterface(config) {
361
307
  return this.each(function () {
362
- var data = $__default["default"](this).data(DATA_KEY);
363
-
364
- var _config = typeof config === 'object' ? config : null;
365
-
366
- if (!data) {
367
- data = new Dropdown(this, _config);
368
- $__default["default"](this).data(DATA_KEY, data);
308
+ const data = Dropdown.getOrCreateInstance(this, config);
309
+ if (typeof config !== 'string') {
310
+ return;
369
311
  }
370
-
371
- if (typeof config === 'string') {
372
- if (typeof data[config] === 'undefined') {
373
- throw new TypeError("No method named \"" + config + "\"");
374
- }
375
-
376
- data[config]();
312
+ if (typeof data[config] === 'undefined') {
313
+ throw new TypeError(`No method named "${config}"`);
377
314
  }
315
+ data[config]();
378
316
  });
379
- };
380
-
381
- Dropdown._clearMenus = function _clearMenus(event) {
382
- if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
317
+ }
318
+ static clearMenus(event) {
319
+ if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY) {
383
320
  return;
384
321
  }
385
-
386
- var toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE));
387
-
388
- for (var i = 0, len = toggles.length; i < len; i++) {
389
- var parent = Dropdown._getParentFromElement(toggles[i]);
390
-
391
- var context = $__default["default"](toggles[i]).data(DATA_KEY);
392
- var relatedTarget = {
393
- relatedTarget: toggles[i]
394
- };
395
-
396
- if (event && event.type === 'click') {
397
- relatedTarget.clickEvent = event;
398
- }
399
-
400
- if (!context) {
401
- continue;
402
- }
403
-
404
- var dropdownMenu = context._menu;
405
-
406
- if (!$__default["default"](parent).hasClass(CLASS_NAME_SHOW)) {
322
+ const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);
323
+ for (const toggle of openToggles) {
324
+ const context = Dropdown.getInstance(toggle);
325
+ if (!context || context._config.autoClose === false) {
407
326
  continue;
408
327
  }
409
-
410
- if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $__default["default"].contains(parent, event.target)) {
328
+ const composedPath = event.composedPath();
329
+ const isMenuTarget = composedPath.includes(context._menu);
330
+ if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
411
331
  continue;
412
332
  }
413
333
 
414
- var hideEvent = $__default["default"].Event(EVENT_HIDE, relatedTarget);
415
- $__default["default"](parent).trigger(hideEvent);
416
-
417
- if (hideEvent.isDefaultPrevented()) {
334
+ // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
335
+ if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY || /input|select|option|textarea|form/i.test(event.target.tagName))) {
418
336
  continue;
419
- } // If this is a touch-enabled device we remove the extra
420
- // empty mouseover listeners we added for iOS support
421
-
422
-
423
- if ('ontouchstart' in document.documentElement) {
424
- $__default["default"](document.body).children().off('mouseover', null, $__default["default"].noop);
425
337
  }
426
-
427
- toggles[i].setAttribute('aria-expanded', 'false');
428
-
429
- if (context._popper) {
430
- context._popper.destroy();
338
+ const relatedTarget = {
339
+ relatedTarget: context._element
340
+ };
341
+ if (event.type === 'click') {
342
+ relatedTarget.clickEvent = event;
431
343
  }
432
-
433
- $__default["default"](dropdownMenu).removeClass(CLASS_NAME_SHOW);
434
- $__default["default"](parent).removeClass(CLASS_NAME_SHOW).trigger($__default["default"].Event(EVENT_HIDDEN, relatedTarget));
435
- }
436
- };
437
-
438
- Dropdown._getParentFromElement = function _getParentFromElement(element) {
439
- var parent;
440
- var selector = Util__default["default"].getSelectorFromElement(element);
441
-
442
- if (selector) {
443
- parent = document.querySelector(selector);
444
- }
445
-
446
- return parent || element.parentNode;
447
- } // eslint-disable-next-line complexity
448
- ;
449
-
450
- Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
451
- // If not input/textarea:
452
- // - And not a key in REGEXP_KEYDOWN => not a dropdown command
453
- // If input/textarea:
454
- // - If space key => not a dropdown command
455
- // - If key is other than escape
456
- // - If key is not up or down => not a dropdown command
457
- // - If trigger inside the menu => not a dropdown command
458
- if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $__default["default"](event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
459
- return;
344
+ context._completeHide(relatedTarget);
460
345
  }
461
-
462
- if (this.disabled || $__default["default"](this).hasClass(CLASS_NAME_DISABLED)) {
346
+ }
347
+ static dataApiKeydownHandler(event) {
348
+ // If not an UP | DOWN | ESCAPE key => not a dropdown command
349
+ // If input/textarea && if key is other than ESCAPE => not a dropdown command
350
+
351
+ const isInput = /input|textarea/i.test(event.target.tagName);
352
+ const isEscapeEvent = event.key === ESCAPE_KEY;
353
+ const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key);
354
+ if (!isUpOrDownEvent && !isEscapeEvent) {
463
355
  return;
464
356
  }
465
-
466
- var parent = Dropdown._getParentFromElement(this);
467
-
468
- var isActive = $__default["default"](parent).hasClass(CLASS_NAME_SHOW);
469
-
470
- if (!isActive && event.which === ESCAPE_KEYCODE) {
357
+ if (isInput && !isEscapeEvent) {
471
358
  return;
472
359
  }
473
-
474
360
  event.preventDefault();
475
- event.stopPropagation();
476
-
477
- if (!isActive || event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE) {
478
- if (event.which === ESCAPE_KEYCODE) {
479
- $__default["default"](parent.querySelector(SELECTOR_DATA_TOGGLE)).trigger('focus');
480
- }
481
-
482
- $__default["default"](this).trigger('click');
483
- return;
484
- }
485
-
486
- var items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)).filter(function (item) {
487
- return $__default["default"](item).is(':visible');
488
- });
489
361
 
490
- if (items.length === 0) {
362
+ // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
363
+ const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode);
364
+ const instance = Dropdown.getOrCreateInstance(getToggleButton);
365
+ if (isUpOrDownEvent) {
366
+ event.stopPropagation();
367
+ instance.show();
368
+ instance._selectMenuItem(event);
491
369
  return;
492
370
  }
493
-
494
- var index = items.indexOf(event.target);
495
-
496
- if (event.which === ARROW_UP_KEYCODE && index > 0) {
497
- // Up
498
- index--;
499
- }
500
-
501
- if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
502
- // Down
503
- index++;
504
- }
505
-
506
- if (index < 0) {
507
- index = 0;
508
- }
509
-
510
- items[index].focus();
511
- };
512
-
513
- _createClass(Dropdown, null, [{
514
- key: "VERSION",
515
- get: function get() {
516
- return VERSION;
517
- }
518
- }, {
519
- key: "Default",
520
- get: function get() {
521
- return Default;
522
- }
523
- }, {
524
- key: "DefaultType",
525
- get: function get() {
526
- return DefaultType;
371
+ if (instance._isShown()) {
372
+ // else is escape and we check if it is shown
373
+ event.stopPropagation();
374
+ instance.hide();
375
+ getToggleButton.focus();
527
376
  }
528
- }]);
377
+ }
378
+ }
529
379
 
530
- return Dropdown;
531
- }();
532
380
  /**
533
381
  * Data API implementation
534
382
  */
535
383
 
536
-
537
- $__default["default"](document).on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler).on(EVENT_CLICK_DATA_API + " " + EVENT_KEYUP_DATA_API, Dropdown._clearMenus).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
384
+ EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler);
385
+ EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
386
+ EventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus);
387
+ EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
388
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
538
389
  event.preventDefault();
539
- event.stopPropagation();
540
-
541
- Dropdown._jQueryInterface.call($__default["default"](this), 'toggle');
542
- }).on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, function (e) {
543
- e.stopPropagation();
390
+ Dropdown.getOrCreateInstance(this).toggle();
544
391
  });
392
+
545
393
  /**
546
394
  * jQuery
547
395
  */
548
396
 
549
- $__default["default"].fn[NAME] = Dropdown._jQueryInterface;
550
- $__default["default"].fn[NAME].Constructor = Dropdown;
551
-
552
- $__default["default"].fn[NAME].noConflict = function () {
553
- $__default["default"].fn[NAME] = JQUERY_NO_CONFLICT;
554
- return Dropdown._jQueryInterface;
555
- };
397
+ index_js.defineJQueryPlugin(Dropdown);
556
398
 
557
399
  return Dropdown;
558
400