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