bootstrap 4.1.3 → 5.0.0

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