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