bootstrap 4.6.0 → 5.3.2

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 (184) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +61 -0
  3. data/Gemfile +1 -0
  4. data/README.md +33 -6
  5. data/Rakefile +10 -1
  6. data/assets/javascripts/bootstrap/alert.js +53 -155
  7. data/assets/javascripts/bootstrap/base-component.js +83 -0
  8. data/assets/javascripts/bootstrap/button.js +43 -198
  9. data/assets/javascripts/bootstrap/carousel.js +285 -550
  10. data/assets/javascripts/bootstrap/collapse.js +169 -323
  11. data/assets/javascripts/bootstrap/dom/data.js +62 -0
  12. data/assets/javascripts/bootstrap/dom/event-handler.js +236 -0
  13. data/assets/javascripts/bootstrap/dom/manipulator.js +71 -0
  14. data/assets/javascripts/bootstrap/dom/selector-engine.js +103 -0
  15. data/assets/javascripts/bootstrap/dropdown.js +300 -467
  16. data/assets/javascripts/bootstrap/modal.js +226 -575
  17. data/assets/javascripts/bootstrap/offcanvas.js +245 -0
  18. data/assets/javascripts/bootstrap/popover.js +61 -205
  19. data/assets/javascripts/bootstrap/scrollspy.js +216 -287
  20. data/assets/javascripts/bootstrap/tab.js +226 -203
  21. data/assets/javascripts/bootstrap/toast.js +136 -209
  22. data/assets/javascripts/bootstrap/tooltip.js +411 -757
  23. data/assets/javascripts/bootstrap/util/backdrop.js +139 -0
  24. data/assets/javascripts/bootstrap/util/component-functions.js +41 -0
  25. data/assets/javascripts/bootstrap/util/config.js +67 -0
  26. data/assets/javascripts/bootstrap/util/focustrap.js +113 -0
  27. data/assets/javascripts/bootstrap/util/index.js +281 -0
  28. data/assets/javascripts/bootstrap/util/sanitizer.js +110 -0
  29. data/assets/javascripts/bootstrap/util/scrollbar.js +112 -0
  30. data/assets/javascripts/bootstrap/util/swipe.js +134 -0
  31. data/assets/javascripts/bootstrap/util/template-factory.js +150 -0
  32. data/assets/javascripts/bootstrap-global-this-define.js +6 -0
  33. data/assets/javascripts/bootstrap-global-this-undefine.js +2 -0
  34. data/assets/javascripts/bootstrap-sprockets.js +23 -7
  35. data/assets/javascripts/bootstrap.js +3649 -3587
  36. data/assets/javascripts/bootstrap.min.js +3 -3
  37. data/assets/stylesheets/_bootstrap-grid.scss +53 -21
  38. data/assets/stylesheets/_bootstrap-reboot.scss +5 -7
  39. data/assets/stylesheets/_bootstrap-utilities.scss +19 -0
  40. data/assets/stylesheets/_bootstrap.scss +21 -13
  41. data/assets/stylesheets/bootstrap/_accordion.scss +158 -0
  42. data/assets/stylesheets/bootstrap/_alert.scss +32 -16
  43. data/assets/stylesheets/bootstrap/_badge.scss +15 -31
  44. data/assets/stylesheets/bootstrap/_breadcrumb.scss +22 -24
  45. data/assets/stylesheets/bootstrap/_button-group.scss +27 -48
  46. data/assets/stylesheets/bootstrap/_buttons.scss +136 -71
  47. data/assets/stylesheets/bootstrap/_card.scss +66 -113
  48. data/assets/stylesheets/bootstrap/_carousel.scss +83 -36
  49. data/assets/stylesheets/bootstrap/_close.scss +51 -28
  50. data/assets/stylesheets/bootstrap/_containers.scss +41 -0
  51. data/assets/stylesheets/bootstrap/_dropdown.scss +129 -71
  52. data/assets/stylesheets/bootstrap/_forms.scss +9 -347
  53. data/assets/stylesheets/bootstrap/_functions.scss +181 -23
  54. data/assets/stylesheets/bootstrap/_grid.scss +18 -52
  55. data/assets/stylesheets/bootstrap/_helpers.scss +12 -0
  56. data/assets/stylesheets/bootstrap/_images.scss +1 -1
  57. data/assets/stylesheets/bootstrap/_list-group.scss +77 -34
  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 +107 -110
  61. data/assets/stylesheets/bootstrap/_nav.scss +102 -25
  62. data/assets/stylesheets/bootstrap/_navbar.scss +129 -172
  63. data/assets/stylesheets/bootstrap/_offcanvas.scss +146 -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 +44 -24
  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 +8 -1
  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 +87 -0
  78. data/assets/stylesheets/bootstrap/_variables.scss +1216 -615
  79. data/assets/stylesheets/bootstrap/forms/_floating-labels.scss +95 -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 +53 -85
  112. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +13 -11
  113. data/assets/stylesheets/bootstrap/mixins/_grid.scss +119 -37
  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 +3 -3
  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 +276 -132
  125. data/bootstrap.gemspec +6 -7
  126. data/lib/bootstrap/engine.rb +7 -1
  127. data/lib/bootstrap/version.rb +2 -2
  128. data/tasks/updater/js.rb +31 -7
  129. data/tasks/updater/network.rb +9 -3
  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 -3
  136. data/test/gemfiles/rails_4_2.gemfile +1 -1
  137. data/test/gemfiles/rails_5_0.gemfile +1 -1
  138. data/test/gemfiles/rails_5_1.gemfile +1 -1
  139. data/test/gemfiles/rails_5_2.gemfile +8 -0
  140. data/test/gemfiles/rails_6_0.gemfile +1 -0
  141. data/test/gemfiles/rails_6_1.gemfile +8 -0
  142. data/test/gemfiles/rails_7_0_dartsass.gemfile +8 -0
  143. data/test/gemfiles/rails_7_0_sassc.gemfile +8 -0
  144. data/test/test_helper.rb +3 -2
  145. metadata +97 -85
  146. data/.travis.yml +0 -31
  147. data/assets/javascripts/bootstrap/util.js +0 -192
  148. data/assets/stylesheets/bootstrap/_code.scss +0 -48
  149. data/assets/stylesheets/bootstrap/_custom-forms.scss +0 -526
  150. data/assets/stylesheets/bootstrap/_input-group.scss +0 -208
  151. data/assets/stylesheets/bootstrap/_jumbotron.scss +0 -17
  152. data/assets/stylesheets/bootstrap/_media.scss +0 -8
  153. data/assets/stylesheets/bootstrap/_print.scss +0 -141
  154. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -23
  155. data/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -17
  156. data/assets/stylesheets/bootstrap/mixins/_float.scss +0 -14
  157. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -80
  158. data/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -37
  159. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -11
  160. data/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -34
  161. data/assets/stylesheets/bootstrap/mixins/_size.scss +0 -7
  162. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -39
  163. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -17
  164. data/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -11
  165. data/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -8
  166. data/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  167. data/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  168. data/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -75
  169. data/assets/stylesheets/bootstrap/utilities/_display.scss +0 -26
  170. data/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -39
  171. data/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -51
  172. data/assets/stylesheets/bootstrap/utilities/_float.scss +0 -11
  173. data/assets/stylesheets/bootstrap/utilities/_interactions.scss +0 -5
  174. data/assets/stylesheets/bootstrap/utilities/_overflow.scss +0 -5
  175. data/assets/stylesheets/bootstrap/utilities/_position.scss +0 -32
  176. data/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  177. data/assets/stylesheets/bootstrap/utilities/_shadows.scss +0 -6
  178. data/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -20
  179. data/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -73
  180. data/assets/stylesheets/bootstrap/utilities/_stretched-link.scss +0 -19
  181. data/assets/stylesheets/bootstrap/utilities/_text.scss +0 -72
  182. data/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -13
  183. data/test/dummy_rails/app/views/pages/root.html.slim +0 -58
  184. /data/assets/stylesheets/bootstrap/{utilities → helpers}/_clearfix.scss +0 -0
@@ -1,568 +1,401 @@
1
1
  /*!
2
- * Bootstrap dropdown.js v4.6.0 (https://getbootstrap.com/)
3
- * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
2
+ * Bootstrap dropdown.js v5.3.2 (https://getbootstrap.com/)
3
+ * Copyright 2011-2023 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
- return Constructor;
32
- }
33
-
34
- function _extends() {
35
- _extends = Object.assign || function (target) {
36
- for (var i = 1; i < arguments.length; i++) {
37
- var source = arguments[i];
29
+ const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper);
38
30
 
39
- for (var key in source) {
40
- if (Object.prototype.hasOwnProperty.call(source, key)) {
41
- target[key] = source[key];
42
- }
43
- }
44
- }
31
+ /**
32
+ * --------------------------------------------------------------------------
33
+ * Bootstrap dropdown.js
34
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
35
+ * --------------------------------------------------------------------------
36
+ */
45
37
 
46
- return target;
47
- };
48
-
49
- return _extends.apply(this, arguments);
50
- }
51
38
 
52
39
  /**
53
- * ------------------------------------------------------------------------
54
40
  * Constants
55
- * ------------------------------------------------------------------------
56
41
  */
57
42
 
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',
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
- * ------------------------------------------------------------------------
121
- * Class Definition
122
- * ------------------------------------------------------------------------
98
+ * Class definition
123
99
  */
124
100
 
125
- var Dropdown = /*#__PURE__*/function () {
126
- function Dropdown(element, config) {
127
- this._element = element;
101
+ class Dropdown extends BaseComponent {
102
+ constructor(element, config) {
103
+ super(element, config);
128
104
  this._popper = null;
129
- this._config = this._getConfig(config);
130
- 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);
131
108
  this._inNavbar = this._detectNavbar();
109
+ }
132
110
 
133
- this._addEventListeners();
134
- } // Getters
135
-
136
-
137
- 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
+ }
138
121
 
139
122
  // Public
140
- _proto.toggle = function toggle() {
141
- if (this._element.disabled || $__default['default'](this._element).hasClass(CLASS_NAME_DISABLED)) {
142
- return;
143
- }
144
-
145
- var isActive = $__default['default'](this._menu).hasClass(CLASS_NAME_SHOW);
146
-
147
- Dropdown._clearMenus();
148
-
149
- if (isActive) {
150
- return;
151
- }
152
-
153
- this.show(true);
154
- };
155
-
156
- _proto.show = function show(usePopper) {
157
- if (usePopper === void 0) {
158
- usePopper = false;
159
- }
160
-
161
- 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()) {
162
128
  return;
163
129
  }
164
-
165
- var relatedTarget = {
130
+ const relatedTarget = {
166
131
  relatedTarget: this._element
167
132
  };
168
- var showEvent = $__default['default'].Event(EVENT_SHOW, relatedTarget);
169
-
170
- var parent = Dropdown._getParentFromElement(this._element);
171
-
172
- $__default['default'](parent).trigger(showEvent);
173
-
174
- if (showEvent.isDefaultPrevented()) {
133
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget);
134
+ if (showEvent.defaultPrevented) {
175
135
  return;
176
- } // Totally disable Popper for Dropdowns in Navbar
177
-
178
-
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') {
185
- throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
186
- }
187
-
188
- var referenceElement = this._element;
189
-
190
- if (this._config.reference === 'parent') {
191
- referenceElement = parent;
192
- } else if (Util__default['default'].isElement(this._config.reference)) {
193
- referenceElement = this._config.reference; // Check if it's jQuery element
194
-
195
- if (typeof this._config.reference.jquery !== 'undefined') {
196
- referenceElement = this._config.reference[0];
197
- }
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
201
-
202
-
203
- if (this._config.boundary !== 'scrollParent') {
204
- $__default['default'](parent).addClass(CLASS_NAME_POSITION_STATIC);
205
- }
136
+ }
137
+ this._createPopper();
206
138
 
207
- this._popper = new Popper__default['default'](referenceElement, this._menu, this._getPopperConfig());
208
- } // If this is a touch-enabled device we add extra
139
+ // If this is a touch-enabled device we add extra
209
140
  // empty mouseover listeners to the body's immediate children;
210
141
  // only needed because of broken event delegation on iOS
211
142
  // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
212
-
213
-
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);
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
+ }
216
147
  }
217
-
218
148
  this._element.focus();
219
-
220
149
  this._element.setAttribute('aria-expanded', true);
221
-
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
- };
225
-
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)) {
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()) {
228
156
  return;
229
157
  }
230
-
231
- var relatedTarget = {
158
+ const relatedTarget = {
232
159
  relatedTarget: this._element
233
160
  };
234
- var hideEvent = $__default['default'].Event(EVENT_HIDE, relatedTarget);
235
-
236
- var parent = Dropdown._getParentFromElement(this._element);
237
-
238
- $__default['default'](parent).trigger(hideEvent);
239
-
240
- if (hideEvent.isDefaultPrevented()) {
241
- return;
242
- }
243
-
161
+ this._completeHide(relatedTarget);
162
+ }
163
+ dispose() {
244
164
  if (this._popper) {
245
165
  this._popper.destroy();
246
166
  }
167
+ super.dispose();
168
+ }
169
+ update() {
170
+ this._inNavbar = this._detectNavbar();
171
+ if (this._popper) {
172
+ this._popper.update();
173
+ }
174
+ }
247
175
 
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
- };
251
-
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;
256
- 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
+ }
257
182
 
258
- 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) {
259
191
  this._popper.destroy();
260
-
261
- this._popper = null;
262
192
  }
263
- };
264
-
265
- _proto.update = function update() {
266
- this._inNavbar = this._detectNavbar();
267
-
268
- if (this._popper !== null) {
269
- 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.`);
270
204
  }
271
- } // Private
272
- ;
273
-
274
- _proto._addEventListeners = function _addEventListeners() {
275
- var _this = this;
276
-
277
- $__default['default'](this._element).on(EVENT_CLICK, function (event) {
278
- event.preventDefault();
279
- event.stopPropagation();
280
-
281
- _this.toggle();
282
- });
283
- };
284
-
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
205
  return config;
289
- };
290
-
291
- _proto._getMenuElement = function _getMenuElement() {
292
- if (!this._menu) {
293
- var parent = Dropdown._getParentFromElement(this._element);
294
-
295
- if (parent) {
296
- this._menu = parent.querySelector(SELECTOR_MENU);
297
- }
206
+ }
207
+ _createPopper() {
208
+ if (typeof Popper__namespace === 'undefined') {
209
+ throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
298
210
  }
299
-
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;
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;
315
218
  }
316
-
317
- return placement;
318
- };
319
-
320
- _proto._detectNavbar = function _detectNavbar() {
321
- return $__default['default'](this._element).closest('.navbar').length > 0;
322
- };
323
-
324
- _proto._getOffset = function _getOffset() {
325
- var _this2 = this;
326
-
327
- var offset = {};
328
-
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;
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;
336
238
  }
337
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
+ }
338
260
  return offset;
339
- };
340
-
341
- _proto._getPopperConfig = function _getPopperConfig() {
342
- var popperConfig = {
261
+ }
262
+ _getPopperConfig() {
263
+ const defaultBsPopperConfig = {
343
264
  placement: this._getPlacement(),
344
- modifiers: {
345
- offset: this._getOffset(),
346
- flip: {
347
- enabled: this._config.flip
348
- },
349
- preventOverflow: {
350
- boundariesElement: this._config.boundary
265
+ modifiers: [{
266
+ name: 'preventOverflow',
267
+ options: {
268
+ boundary: this._config.boundary
351
269
  }
352
- }
353
- }; // Disable Popper if we have a static display
270
+ }, {
271
+ name: 'offset',
272
+ options: {
273
+ offset: this._getOffset()
274
+ }
275
+ }]
276
+ };
354
277
 
355
- if (this._config.display === 'static') {
356
- 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',
357
283
  enabled: false
358
- };
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;
359
298
  }
360
299
 
361
- return _extends({}, popperConfig, this._config.popperConfig);
362
- } // Static
363
- ;
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
+ }
364
304
 
365
- Dropdown._jQueryInterface = function _jQueryInterface(config) {
305
+ // Static
306
+ static jQueryInterface(config) {
366
307
  return this.each(function () {
367
- var data = $__default['default'](this).data(DATA_KEY);
368
-
369
- var _config = typeof config === 'object' ? config : null;
370
-
371
- if (!data) {
372
- data = new Dropdown(this, _config);
373
- $__default['default'](this).data(DATA_KEY, data);
308
+ const data = Dropdown.getOrCreateInstance(this, config);
309
+ if (typeof config !== 'string') {
310
+ return;
374
311
  }
375
-
376
- if (typeof config === 'string') {
377
- if (typeof data[config] === 'undefined') {
378
- throw new TypeError("No method named \"" + config + "\"");
379
- }
380
-
381
- data[config]();
312
+ if (typeof data[config] === 'undefined') {
313
+ throw new TypeError(`No method named "${config}"`);
382
314
  }
315
+ data[config]();
383
316
  });
384
- };
385
-
386
- Dropdown._clearMenus = function _clearMenus(event) {
387
- 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) {
388
320
  return;
389
321
  }
390
-
391
- var toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE));
392
-
393
- for (var i = 0, len = toggles.length; i < len; i++) {
394
- var parent = Dropdown._getParentFromElement(toggles[i]);
395
-
396
- var context = $__default['default'](toggles[i]).data(DATA_KEY);
397
- var relatedTarget = {
398
- relatedTarget: toggles[i]
399
- };
400
-
401
- if (event && event.type === 'click') {
402
- relatedTarget.clickEvent = event;
403
- }
404
-
405
- 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) {
406
326
  continue;
407
327
  }
408
-
409
- var dropdownMenu = context._menu;
410
-
411
- if (!$__default['default'](parent).hasClass(CLASS_NAME_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) {
412
331
  continue;
413
332
  }
414
333
 
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)) {
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))) {
416
336
  continue;
417
337
  }
418
-
419
- var hideEvent = $__default['default'].Event(EVENT_HIDE, relatedTarget);
420
- $__default['default'](parent).trigger(hideEvent);
421
-
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
426
-
427
-
428
- if ('ontouchstart' in document.documentElement) {
429
- $__default['default'](document.body).children().off('mouseover', null, $__default['default'].noop);
430
- }
431
-
432
- toggles[i].setAttribute('aria-expanded', 'false');
433
-
434
- if (context._popper) {
435
- context._popper.destroy();
338
+ const relatedTarget = {
339
+ relatedTarget: context._element
340
+ };
341
+ if (event.type === 'click') {
342
+ relatedTarget.clickEvent = event;
436
343
  }
437
-
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);
449
- }
450
-
451
- return parent || element.parentNode;
452
- } // eslint-disable-next-line complexity
453
- ;
454
-
455
- Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
456
- // If not input/textarea:
457
- // - And not a key in REGEXP_KEYDOWN => not a dropdown command
458
- // If input/textarea:
459
- // - If space key => not a dropdown command
460
- // - If key is other than escape
461
- // - If key is not up or down => not a dropdown command
462
- // - 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)) {
464
- return;
344
+ context._completeHide(relatedTarget);
465
345
  }
466
-
467
- 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) {
468
355
  return;
469
356
  }
470
-
471
- var parent = Dropdown._getParentFromElement(this);
472
-
473
- var isActive = $__default['default'](parent).hasClass(CLASS_NAME_SHOW);
474
-
475
- if (!isActive && event.which === ESCAPE_KEYCODE) {
357
+ if (isInput && !isEscapeEvent) {
476
358
  return;
477
359
  }
478
-
479
360
  event.preventDefault();
480
- event.stopPropagation();
481
-
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');
488
- return;
489
- }
490
-
491
- var items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)).filter(function (item) {
492
- return $__default['default'](item).is(':visible');
493
- });
494
361
 
495
- 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);
496
369
  return;
497
370
  }
498
-
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++;
509
- }
510
-
511
- if (index < 0) {
512
- index = 0;
513
- }
514
-
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;
371
+ if (instance._isShown()) {
372
+ // else is escape and we check if it is shown
373
+ event.stopPropagation();
374
+ instance.hide();
375
+ getToggleButton.focus();
532
376
  }
533
- }]);
377
+ }
378
+ }
534
379
 
535
- return Dropdown;
536
- }();
537
380
  /**
538
- * ------------------------------------------------------------------------
539
- * Data Api implementation
540
- * ------------------------------------------------------------------------
381
+ * Data API implementation
541
382
  */
542
383
 
543
-
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) {
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) {
545
389
  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();
390
+ Dropdown.getOrCreateInstance(this).toggle();
551
391
  });
392
+
552
393
  /**
553
- * ------------------------------------------------------------------------
554
394
  * jQuery
555
- * ------------------------------------------------------------------------
556
395
  */
557
396
 
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
- };
397
+ index_js.defineJQueryPlugin(Dropdown);
565
398
 
566
399
  return Dropdown;
567
400
 
568
- })));
401
+ }));